From 9c46febcac01b9f1831f5f3e2a68dd1f1612a01f Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Tue, 7 Oct 2025 12:47:40 +0000 Subject: [PATCH 001/561] 8245234: Still seeing missing mixed stack traces, even after JDK-8234624 Reviewed-by: kevinw, cjplummer --- .../linux/amd64/LinuxAMD64CFrame.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java index 5f3c9786d6e..3dfb83c9f5a 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -145,17 +145,12 @@ public final class LinuxAMD64CFrame extends BasicCFrame { } DwarfParser nextDwarf = null; - - if ((dwarf != null) && dwarf.isIn(nextPC)) { - nextDwarf = dwarf; - } else { - Address libptr = dbg.findLibPtrByAddress(nextPC); - if (libptr != null) { - try { - nextDwarf = new DwarfParser(libptr); - } catch (DebuggerException e) { - // Bail out to Java frame - } + Address libptr = dbg.findLibPtrByAddress(nextPC); + if (libptr != null) { + try { + nextDwarf = new DwarfParser(libptr); + } catch (DebuggerException e) { + // Bail out to Java frame } } From 4b4d0cd35a32448e4b056109c502af2765766432 Mon Sep 17 00:00:00 2001 From: Johny Jose Date: Tue, 7 Oct 2025 13:13:42 +0000 Subject: [PATCH 002/561] 8365398: TEST_BUG: java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java failing intermittently Reviewed-by: msheppar, smarks, jpai --- test/jdk/ProblemList.txt | 1 - .../checkLeaseInfoLeak/CheckLeaseLeak.java | 25 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 8d13670805f..48a495bc238 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -608,7 +608,6 @@ java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java 7146541 linux-al java/rmi/registry/readTest/CodebaseTest.java 8173324 windows-all java/rmi/registry/multipleRegistries/MultipleRegistries.java 8268182 macosx-all -java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java 8365398 generic-all java/rmi/Naming/DefaultRegistryPort.java 8005619 windows-all java/rmi/Naming/legalRegistryNames/LegalRegistryNames.java 8005619 windows-all diff --git a/test/jdk/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java b/test/jdk/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java index 4de6598a0f4..f40502601d2 100644 --- a/test/jdk/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java +++ b/test/jdk/java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java @@ -59,10 +59,13 @@ import java.io.*; import java.lang.reflect.*; import java.rmi.registry.*; import sun.rmi.transport.*; +import java.util.concurrent.CountDownLatch; public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak { public CheckLeaseLeak() throws RemoteException { } - public void ping () throws RemoteException { } + public void ping () throws RemoteException { + remoteCallsComplete.countDown(); + } /** * Id to fake the DGC_ID, so we can later get a reference to the @@ -74,6 +77,9 @@ public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak { private final static int numberPingCalls = 0; private final static int CHECK_INTERVAL = 400; private final static int LEASE_VALUE = 20; + private static final int NO_OF_CLIENTS = ITERATIONS; + private static final int GOOD_LUCK_FACTOR = 2; + private static CountDownLatch remoteCallsComplete = new CountDownLatch(NO_OF_CLIENTS); public static void main (String[] args) { CheckLeaseLeak leakServer = null; @@ -113,8 +119,14 @@ public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak { jvm.destroy(); } } + try { + remoteCallsComplete.await(); + System.out.println("remoteCallsComplete . . . "); + } catch (InterruptedException intEx) { + System.out.println("remoteCallsComplete.await interrupted . . . "); + } + Thread.sleep(NO_OF_CLIENTS * LEASE_VALUE * GOOD_LUCK_FACTOR); numLeft = getDGCLeaseTableSize(); - Thread.sleep(3000); } catch(Exception e) { TestLibrary.bomb("CheckLeaseLeak Error: ", e); @@ -125,8 +137,8 @@ public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak { } } - /* numLeft should be 4 - if 11 there is a problem. */ - if (numLeft > 4) { + /* numLeft should not be greater than 2 - if 11 there is a problem. */ + if (numLeft > 2) { TestLibrary.bomb("Too many objects in DGCImpl.leaseTable: "+ numLeft); } else { @@ -204,8 +216,9 @@ public class CheckLeaseLeak extends UnicastRemoteObject implements LeaseLeak { * objects if the LeaseInfo memory leak is not fixed. */ leaseTable = (Map) f.get(dgcImpl[0]); - - numLeaseInfosLeft = leaseTable.size(); + synchronized (leaseTable) { + numLeaseInfosLeft = leaseTable.size(); + } } catch(Exception e) { TestLibrary.bomb(e); From a9c93f865bb5438420bc4df278d211ff3af9a0ad Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 7 Oct 2025 13:40:19 +0000 Subject: [PATCH 003/561] 8369263: Parallel: Inline PSPromotionManager::push_depth Reviewed-by: iwalulya, shade, fandreuzzi --- src/hotspot/share/gc/parallel/psPromotionManager.hpp | 2 -- src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp | 6 +----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.hpp index 7d3a1682519..9808a55335d 100644 --- a/src/hotspot/share/gc/parallel/psPromotionManager.hpp +++ b/src/hotspot/share/gc/parallel/psPromotionManager.hpp @@ -102,8 +102,6 @@ class PSPromotionManager { void process_array_chunk(PartialArrayState* state, bool stolen); void push_objArray(oop old_obj, oop new_obj); - void push_depth(ScannerTask task); - inline void promotion_trace_event(oop new_obj, Klass* klass, size_t obj_size, uint age, bool tenured, const PSPromotionLAB* lab); diff --git a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp index 4c12a4c357f..fb58c22cf29 100644 --- a/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psPromotionManager.inline.hpp @@ -50,10 +50,6 @@ inline PSPromotionManager* PSPromotionManager::manager_array(uint index) { return &_manager_array[index]; } -inline void PSPromotionManager::push_depth(ScannerTask task) { - claimed_stack_depth()->push(task); -} - template inline void PSPromotionManager::claim_or_forward_depth(T* p) { assert(ParallelScavengeHeap::heap()->is_in(p), "pointer outside heap"); @@ -62,7 +58,7 @@ inline void PSPromotionManager::claim_or_forward_depth(T* p) { oop obj = CompressedOops::decode_not_null(heap_oop); assert(!PSScavenge::is_obj_in_to_space(obj), "revisiting object?"); Prefetch::write(obj->base_addr(), oopDesc::mark_offset_in_bytes()); - push_depth(ScannerTask(p)); + claimed_stack_depth()->push(ScannerTask(p)); } } From 0f2a95c15d7c1e3796660d786c9a72497dab5ab1 Mon Sep 17 00:00:00 2001 From: jonghoonpark Date: Tue, 7 Oct 2025 15:13:23 +0000 Subject: [PATCH 004/561] 8365782: Remove unnecessary inclusion of in jfrOSInterface.cpp Reviewed-by: ayang, tschatzl --- src/hotspot/share/jfr/periodic/jfrOSInterface.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp b/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp index 2d4b99d59ab..18b2d7c5785 100644 --- a/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp +++ b/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp @@ -32,8 +32,6 @@ #include "runtime/vm_version.hpp" #include "utilities/ostream.hpp" -#include // for environment variables - static JfrOSInterface* _instance = nullptr; JfrOSInterface& JfrOSInterface::instance() { @@ -81,10 +79,7 @@ class JfrOSInterface::JfrOSInterfaceImpl : public JfrCHeapObj { // os information int os_version(char** os_version) const; - // environment information - void generate_environment_variables_events(); - - // system processes information + // system processes information int system_processes(SystemProcess** system_processes, int* no_of_sys_processes); int network_utilization(NetworkInterface** network_interfaces); From 8a20656ed03aa26806c7b4a4e361999dea62aa79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Tue, 7 Oct 2025 15:16:08 +0000 Subject: [PATCH 005/561] 8367321: Fix CSS bugs in dark theme 8366942: Dark mode pages briefly blink before going dark Reviewed-by: nbenalla, liach --- .../doclets/formats/html/markup/Head.java | 3 +- .../formats/html/resources/script.js.template | 60 +++++++++++-------- .../formats/html/resources/stylesheet.css | 58 +++++++++--------- .../javadoc/doclet/testSearch/TestSearch.java | 3 +- 4 files changed, 69 insertions(+), 55 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java index 2b6bfa77951..cda4bc9a5be 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Head.java @@ -378,7 +378,8 @@ public class Head extends Content { mainBodyScript.append("const pathtoroot = ") .appendStringLiteral(ptrPath + "/") .append(";\n") - .append("loadScripts(document, 'script');"); + .append("loadScripts();\n") + .append("initTheme();\n"); } addScriptElement(head, DocPaths.JQUERY_JS); addScriptElement(head, DocPaths.JQUERY_UI_JS); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template index b275323b2f5..b91f99b2c42 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template @@ -11,12 +11,13 @@ var typeSearchIndex; var memberSearchIndex; var tagSearchIndex; -var oddRowColor = "odd-row-color"; -var evenRowColor = "even-row-color"; -var sortAsc = "sort-asc"; -var sortDesc = "sort-desc"; -var tableTab = "table-tab"; -var activeTableTab = "active-table-tab"; +const oddRowColor = "odd-row-color"; +const evenRowColor = "even-row-color"; +const sortAsc = "sort-asc"; +const sortDesc = "sort-desc"; +const tableTab = "table-tab"; +const activeTableTab = "active-table-tab"; +const THEMES = Object.freeze(["theme-light", "theme-dark", "theme-os"]); const linkIcon = "##REPLACE:doclet.Link_icon##"; const linkToSection = "##REPLACE:doclet.Link_to_section##"; @@ -30,21 +31,20 @@ if (typeof hljs !== "undefined") { } } -function loadScripts(doc, tag) { - createElem(doc, tag, 'script-files/search.js'); - - createElem(doc, tag, 'module-search-index.js'); - createElem(doc, tag, 'package-search-index.js'); - createElem(doc, tag, 'type-search-index.js'); - createElem(doc, tag, 'member-search-index.js'); - createElem(doc, tag, 'tag-search-index.js'); +function loadScripts() { + createScript('script-files/search.js'); + createScript('module-search-index.js'); + createScript('package-search-index.js'); + createScript('type-search-index.js'); + createScript('member-search-index.js'); + createScript('tag-search-index.js'); } -function createElem(doc, tag, path) { - var script = doc.createElement(tag); - var scriptElement = doc.getElementsByTagName(tag)[0]; +function createScript(path) { + var script = document.createElement("script"); script.src = pathtoroot + path; - scriptElement.parentNode.insertBefore(script, scriptElement); + var firstScript = document.getElementsByTagName("script")[0]; + firstScript.parentNode.insertBefore(script, firstScript); } // Helper for making content containing release names comparable lexicographically @@ -312,21 +312,31 @@ function makeFilterWidget(sidebar, updateToc) { return sidebar; } +function getTheme() { + return localStorage.getItem('theme') || THEMES[0]; +} + +function initTheme() { + document.body.classList.add(getTheme()); +} + function setTopMargin() { // Dynamically set scroll margin to accomodate for draft header var headerHeight = Math.ceil(document.querySelector("header").offsetHeight); document.querySelector(":root") .style.setProperty("--nav-height", headerHeight + "px"); } + document.addEventListener("readystatechange", (e) => { if (document.readyState === "interactive") { setTopMargin(); - } - if (sessionStorage.getItem("sidebar") === "hidden") { - const sidebar = document.querySelector(".main-grid nav.toc"); - if (sidebar) sidebar.classList.add("hide-sidebar"); + if (sessionStorage.getItem("sidebar") === "hidden") { + const sidebar = document.querySelector(".main-grid nav.toc"); + if (sidebar) sidebar.classList.add("hide-sidebar"); + } } }); + document.addEventListener("DOMContentLoaded", function(e) { setTopMargin(); const subnav = document.querySelector("ol.sub-nav-list"); @@ -375,13 +385,16 @@ document.addEventListener("DOMContentLoaded", function(e) { themePanelVisible = false; } } + var currentTheme = getTheme(); themePanel.querySelectorAll("input").forEach(input => { input.removeAttribute("disabled"); + if (input.id === currentTheme) { + input.checked = true; + } input.addEventListener("change", e => { setTheme(e.target.value); }) }); - const THEMES = ["theme-light", "theme-dark", "theme-os"]; function setTheme(theme) { THEMES.forEach(t => { if (t !== theme) document.body.classList.remove(t); @@ -390,7 +403,6 @@ document.addEventListener("DOMContentLoaded", function(e) { localStorage.setItem("theme", theme); document.getElementById(theme).checked = true; } - setTheme(localStorage.getItem("theme") || THEMES[0]); makeFilterWidget(sidebar, updateToc); if (tocMenu) { navbar.appendChild(tocMenu); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css index d61283dc677..4bb0fad4306 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css @@ -73,7 +73,7 @@ body { --selected-link-color: #4a698a; /* Background colors for generated tables */ --table-header-color: #ebeff4; - --even-row-color: #ffffff; + --even-row-color: #fdfdfe; --odd-row-color: #f0f0f2; /* Text color for page title */ --title-color: #2c4557; @@ -109,17 +109,19 @@ body { /* Colors for invalid tag notifications */ --invalid-tag-background-color: #ffe6e6; --invalid-tag-text-color: #000000; + --icon-filter: none; + --caption-link-color: var(--subnav-link-color); } body.theme-dark { --body-text-color: #e8e8e8; --block-text-color: #e8e8e8; - --body-background-color: #222528; + --body-background-color: #1f2124; --section-background-color: var(--body-background-color); --detail-background-color: var(--body-background-color); --code-background-color: #303940; --mark-background-color: #313131; - --detail-block-color: #f4f4f4; + --detail-block-color: #31363c; --navbar-background-color: #395A6F; --navbar-text-color: #ffffff; --subnav-background-color: #3d454d; @@ -133,11 +135,11 @@ body.theme-dark { --odd-row-color: #2d3135; --title-color: #fff; --link-color: #94badb; - --link-color-active: #ffb45b; - --toc-background-color: #31363c; + --link-color-active: #e8a351; + --toc-background-color: #2f3439; --toc-highlight-color: var(--subnav-background-color); --toc-hover-color: #3f4146; - --snippet-background-color: #2d363c; + --snippet-background-color: #2c353b; --snippet-text-color: var(--block-text-color); --snippet-highlight-color: #f7c590; --pre-background-color: var(--snippet-background-color); @@ -155,10 +157,8 @@ body.theme-dark { --button-focus-filter: brightness(104%); --invalid-tag-background-color: #ffe6e6; --invalid-tag-text-color: #000000; - div.main-grid img, - .inherited-list h3 > button { - filter: invert(100%) brightness(160%); - } + --icon-filter: invert(100%) brightness(160%); + --caption-link-color: var(--link-color); } /* @@ -168,12 +168,12 @@ body.theme-dark { body { --body-text-color: #e8e8e8; --block-text-color: #e8e8e8; - --body-background-color: #222528; + --body-background-color: #1f2124; --section-background-color: var(--body-background-color); --detail-background-color: var(--body-background-color); --code-background-color: #303940; --mark-background-color: #313131; - --detail-block-color: #f4f4f4; + --detail-block-color: #31363c; --navbar-background-color: #395A6F; --navbar-text-color: #ffffff; --subnav-background-color: #3d454d; @@ -187,11 +187,11 @@ body.theme-dark { --odd-row-color: #2d3135; --title-color: #fff; --link-color: #94badb; - --link-color-active: #ffb45b; - --toc-background-color: #31363c; + --link-color-active: #e8a351; + --toc-background-color: #2f3439; --toc-highlight-color: var(--subnav-background-color); --toc-hover-color: #3f4146; - --snippet-background-color: #2d363c; + --snippet-background-color: #2c353b; --snippet-text-color: var(--block-text-color); --snippet-highlight-color: #f7c590; --pre-background-color: var(--snippet-background-color); @@ -209,15 +209,13 @@ body.theme-dark { --button-focus-filter: brightness(104%); --invalid-tag-background-color: #ffe6e6; --invalid-tag-text-color: #000000; - div.main-grid img, - .inherited-list h3 > button { - filter: invert(100%) brightness(160%); - } + --icon-filter: invert(100%) brightness(160%); + --caption-link-color: var(--link-color); } body.theme-light { - --body-text-color: #282828; - --block-text-color: #282828; + --body-text-color: #181818; + --block-text-color: #181818; --body-background-color: #ffffff; --section-background-color: var(--body-background-color); --detail-background-color: var(--body-background-color); @@ -233,7 +231,7 @@ body.theme-dark { --selected-text-color: #253441; --selected-link-color: #4a698a; --table-header-color: #ebeff4; - --even-row-color: #ffffff; + --even-row-color: #fdfdfe; --odd-row-color: #f0f0f2; --title-color: #2c4557; --link-color: #437291; @@ -259,10 +257,8 @@ body.theme-dark { --button-focus-filter: brightness(104%); --invalid-tag-background-color: #ffe6e6; --invalid-tag-text-color: #000000; - div.main-grid img, - .inherited-list h3 > button { - filter: none; - } + --icon-filter: none; + --caption-link-color: var(--subnav-link-color); } } /* @@ -288,6 +284,9 @@ div.main-grid { max-width: var(--max-content-width); margin: var(--content-margin); } +div.main-grid img { + filter: var(--icon-filter); +} a:link, a:visited { text-decoration:none; color:var(--link-color); @@ -909,12 +908,12 @@ ul.preview-feature-list input { .caption a:visited, .inherited-list h3 a:link, .inherited-list h3 a:visited { - color:var(--subnav-link-color); + color:var(--caption-link-color); } .caption a:hover, .caption a:active, -.inherited-list.expanded h3 a:hover, -.inherited-list.expanded h3 a:active { +.inherited-list h3 a:hover, +.inherited-list h3 a:active { color: var(--link-color-active); } div.table-tabs { @@ -1539,6 +1538,7 @@ section[class$="-details"] .detail > div { height: 1.6em; vertical-align: middle; top: -2px; + filter: var(--icon-filter); } .inherited-list h3:has(button) { padding-left: 2px; diff --git a/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java b/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java index 8615d9f1e64..00c2f017909 100644 --- a/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java +++ b/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java @@ -427,7 +427,8 @@ public class TestSearch extends JavadocTester { """, """ const pathtoroot = "./"; - loadScripts(document, 'script');""", + loadScripts(); + initTheme();""", "
", """
  • Search
  • """, From eb729f0aaa2297c3b3dbadadf40a502d2d9ed124 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Tue, 7 Oct 2025 15:38:58 +0000 Subject: [PATCH 006/561] 8247776: JFR: TestThreadContextSwitches.java failed "RuntimeException: No events: expected false, was true" Reviewed-by: mgronlun --- .../event/os/TestThreadContextSwitches.java | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/test/jdk/jdk/jfr/event/os/TestThreadContextSwitches.java b/test/jdk/jdk/jfr/event/os/TestThreadContextSwitches.java index 7b3dfc79ce9..acfaecdde7d 100644 --- a/test/jdk/jdk/jfr/event/os/TestThreadContextSwitches.java +++ b/test/jdk/jdk/jfr/event/os/TestThreadContextSwitches.java @@ -28,6 +28,7 @@ import jdk.jfr.Recording; import jdk.jfr.consumer.RecordedEvent; import jdk.test.lib.jfr.EventNames; import jdk.test.lib.jfr.Events; +import jdk.test.lib.Platform; /** * @test @@ -40,15 +41,25 @@ public class TestThreadContextSwitches { private final static String EVENT_NAME = EventNames.ThreadContextSwitchRate; public static void main(String[] args) throws Throwable { - Recording recording = new Recording(); - recording.enable(EVENT_NAME); - recording.start(); - recording.stop(); - List events = Events.fromRecording(recording); - Events.hasEvents(events); - for (RecordedEvent event : events) { - System.out.println("Event: " + event); - Events.assertField(event, "switchRate").atLeast(0.0f); + while (true) { + try (Recording recording = new Recording()) { + recording.enable(EVENT_NAME); + recording.start(); + recording.stop(); + List events = Events.fromRecording(recording); + if (!events.isEmpty()) { + for (RecordedEvent event : events) { + System.out.println("Event: " + event); + Events.assertField(event, "switchRate").atLeast(0.0f); + } + return; + } + // Thread context switch rate is unreliable on Windows because + // the way processes are identified with performance counters. + if (!Platform.isWindows()) { + Events.hasEvents(events); + } + } } } } From eb835e05f9cf8a65d804b733b382ecfba5b12907 Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Tue, 7 Oct 2025 15:57:31 +0000 Subject: [PATCH 007/561] 8366040: Change URL.lookupViaProviders to use ScopedValue to detect recursive lookup Reviewed-by: alanb, dfuchs --- src/java.base/share/classes/java/net/URL.java | 22 ++------- .../spi/URLStreamHandlerProvider/Basic.java | 18 ++++++- .../circular.provider.template | 48 +++++++++++++++++++ 3 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 test/jdk/java/net/spi/URLStreamHandlerProvider/circular.provider.template diff --git a/src/java.base/share/classes/java/net/URL.java b/src/java.base/share/classes/java/net/URL.java index 1435d851f41..c82236b5b85 100644 --- a/src/java.base/share/classes/java/net/URL.java +++ b/src/java.base/share/classes/java/net/URL.java @@ -41,7 +41,6 @@ import java.util.ServiceLoader; import jdk.internal.access.JavaNetURLAccess; import jdk.internal.access.SharedSecrets; -import jdk.internal.misc.ThreadTracker; import jdk.internal.misc.VM; import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; @@ -1394,24 +1393,13 @@ public final class URL implements java.io.Serializable { return handler; } - private static class ThreadTrackHolder { - static final ThreadTracker TRACKER = new ThreadTracker(); - } - - private static Object tryBeginLookup() { - return ThreadTrackHolder.TRACKER.tryBegin(); - } - - private static void endLookup(Object key) { - ThreadTrackHolder.TRACKER.end(key); - } + private static final ScopedValue IN_LOOKUP = ScopedValue.newInstance(); private static URLStreamHandler lookupViaProviders(final String protocol) { - Object key = tryBeginLookup(); - if (key == null) { + if (IN_LOOKUP.isBound()) { throw new Error("Circular loading of URL stream handler providers detected"); } - try { + return ScopedValue.where(IN_LOOKUP, true).call(() -> { final ClassLoader cl = ClassLoader.getSystemClassLoader(); final ServiceLoader sl = ServiceLoader.load(URLStreamHandlerProvider.class, cl); @@ -1423,9 +1411,7 @@ public final class URL implements java.io.Serializable { return h; } return null; - } finally { - endLookup(key); - } + }); } /** diff --git a/test/jdk/java/net/spi/URLStreamHandlerProvider/Basic.java b/test/jdk/java/net/spi/URLStreamHandlerProvider/Basic.java index 9f8381a92c8..a98bf8e129e 100644 --- a/test/jdk/java/net/spi/URLStreamHandlerProvider/Basic.java +++ b/test/jdk/java/net/spi/URLStreamHandlerProvider/Basic.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -77,6 +77,7 @@ public class Basic { viaProvider("bert", KNOWN); viaBadProvider("tom", SCE); viaBadProvider("jerry", SCE); + viaCircularProvider("circular", CIRCULAR); } private static String withoutWarning(String in) { @@ -99,6 +100,12 @@ public class Basic { throw new RuntimeException("exitValue: "+ r.exitValue + ", output:[" +r.output +"]"); } }; + static final Consumer CIRCULAR = r -> { + if (r.exitValue == 0 || + !r.output.contains("Circular loading of URL stream handler providers detected")) { + throw new RuntimeException("exitValue: " + r.exitValue + ", output:[" + r.output + "]"); + } + }; static void unknownProtocol(String protocol, Consumer resultChecker) { System.out.println("\nTesting " + protocol); @@ -125,6 +132,15 @@ public class Basic { sysProps); } + static void viaCircularProvider(String protocol, Consumer resultChecker, + String... sysProps) + throws Exception + { + viaProviderWithTemplate(protocol, resultChecker, + TEST_SRC.resolve("circular.provider.template"), + sysProps); + } + static void viaProviderWithTemplate(String protocol, Consumer resultChecker, Path template, String... sysProps) diff --git a/test/jdk/java/net/spi/URLStreamHandlerProvider/circular.provider.template b/test/jdk/java/net/spi/URLStreamHandlerProvider/circular.provider.template new file mode 100644 index 00000000000..b846cc4fec6 --- /dev/null +++ b/test/jdk/java/net/spi/URLStreamHandlerProvider/circular.provider.template @@ -0,0 +1,48 @@ +/* + * 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. + * + * 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 $package; + +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; +import java.net.spi.URLStreamHandlerProvider; + +public final class Provider extends URLStreamHandlerProvider { + + private static final String PROTOCOL = "$protocol"; + + @Override + public URLStreamHandler createURLStreamHandler(String protocol) { + try { + // Trigger circular lookup + URI.create("bogus://path/to/nothing").toURL(); + } catch (Exception exception) { + throw new RuntimeException(exception); + } + throw new AssertionError("Should not have reached here!"); + } + +} From 4ca3ab62759b366fd3e0b2267925f1fa70f057b7 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Tue, 7 Oct 2025 16:41:45 +0000 Subject: [PATCH 008/561] 8369123: Still more small Float16 refactorings Reviewed-by: rgiulietti --- .../classes/jdk/incubator/vector/Float16.java | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java index a564cdfed0f..fe2a6bf5580 100644 --- a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java +++ b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float16.java @@ -35,6 +35,8 @@ import static jdk.incubator.vector.Float16Consts.SIGN_BIT_MASK; import static jdk.incubator.vector.Float16Consts.EXP_BIT_MASK; import static jdk.incubator.vector.Float16Consts.SIGNIF_BIT_MASK; import static jdk.incubator.vector.Float16Consts.MAG_BIT_MASK; +import static jdk.incubator.vector.Float16Consts.EXP_BIAS; +import static jdk.incubator.vector.Float16Consts.SIGNIFICAND_WIDTH; import static java.lang.Float.float16ToFloat; import static java.lang.Float.floatToFloat16; @@ -95,19 +97,26 @@ import jdk.internal.vm.vector.Float16Math; * IEEE Standard for Floating-Point Arithmetic */ -// Currently Float16 is a value-based class and in future it is +// Currently Float16 is a value-based class and in the future it is // expected to be aligned with Value Classes and Object as described in // JEP-401 (https://openjdk.org/jeps/401). @jdk.internal.ValueBased public final class Float16 extends Number implements Comparable { - /** @serial */ + + /** + * Primitive {@code short} field to hold the bits of the {@code Float16}. + * @serial + */ private final short value; + private static final long serialVersionUID = 16; // May not be needed when a value class? // Functionality for future consideration: - // IEEEremainder / remainder operator remainder + // IEEEremainder and separate % operator remainder (which are + // defined to use different rounding modes, see JLS sections 15.4 + // and 15.17.3). // Do *not* define any public constructors /** @@ -147,8 +156,14 @@ public final class Float16 */ public static final Float16 NaN = valueOf(Float.NaN); + /** + * A constant holding a zero (0.0) of type {@code Float16}. + */ private static final Float16 ZERO = valueOf(0); + /** + * A constant holding a one (1.0) of type {@code Float16}. + */ private static final Float16 ONE = valueOf(1); /** @@ -316,10 +331,10 @@ public final class Float16 * @param value a {@code long} value. */ public static Float16 valueOf(long value) { - if (value <= -65_520L) { // -(Float16.MAX_VALUE + Float16.ulp(Float16.MAX_VALUE) / 2) + if (value <= -65_520L) { // -(MAX_VALUE + ulp(MAX_VALUE) / 2) return NEGATIVE_INFINITY; } else { - if (value >= 65_520L) { // Float16.MAX_VALUE + Float16.ulp(Float16.MAX_VALUE) / 2 + if (value >= 65_520L) { // MAX_VALUE + ulp(MAX_VALUE) / 2 return POSITIVE_INFINITY; } // Remaining range of long, the integers in approx. +/- @@ -427,9 +442,8 @@ public final class Float16 // to implement a carry out from rounding the significand. assert (0xf800 & signif_bits) == 0x0; - // Exponent bias adjust in the representation is equal to MAX_EXPONENT. return new Float16((short)(sign_bit | - ( ((exp + MAX_EXPONENT) << (PRECISION - 1)) + signif_bits ) )); + ( ((exp + EXP_BIAS) << (PRECISION - 1)) + signif_bits) )); } /** @@ -468,7 +482,7 @@ public final class Float16 // characters rather than codepoints. if (trialResult == 0.0 // handles signed zeros - || Math.abs(trialResult) > (65504.0 + 32.0) || // Float.MAX_VALUE + ulp(MAX_VALUE), + || Math.abs(trialResult) > (65504.0 + 32.0) || // MAX_VALUE + ulp(MAX_VALUE), // handles infinities too Double.isNaN(trialResult) || noDoubleRoundingToFloat16(trialResult)) { @@ -899,7 +913,7 @@ public final class Float16 */ public static int hashCode(Float16 value) { // Use bit-pattern of canonical NaN for hashing. - Float16 f16 = isNaN(value) ? Float16.NaN : value; + Float16 f16 = isNaN(value) ? NaN : value; return (int)float16ToRawShortBits(f16); } @@ -946,7 +960,7 @@ public final class Float16 */ public static short float16ToShortBits(Float16 f16) { if (isNaN(f16)) { - return Float16.NaN.value; + return NaN.value; } return f16.value; } @@ -1531,8 +1545,8 @@ public final class Float16 */ /*package*/ static int getExponent0(short bits) { // package private to be usable in java.lang.Float. - int bin16ExpBits = 0x0000_7c00 & bits; // Five exponent bits. - return (bin16ExpBits >> (PRECISION - 1)) - 15; + int bin16ExpBits = EXP_BIT_MASK & bits; // Five exponent bits. + return (bin16ExpBits >> (PRECISION - 1)) - EXP_BIAS; } /** @@ -1563,10 +1577,10 @@ public final class Float16 int exp = getExponent(f16); return switch(exp) { - case MAX_EXPONENT + 1 -> abs(f16); // NaN or infinity - case MIN_EXPONENT - 1 -> Float16.MIN_VALUE; // zero or subnormal + case MAX_EXPONENT + 1 -> abs(f16); // NaN or infinity + case MIN_EXPONENT - 1 -> MIN_VALUE; // zero or subnormal default -> { - assert exp <= MAX_EXPONENT && exp >= MIN_EXPONENT; + assert exp <= MAX_EXPONENT && exp >= MIN_EXPONENT: "Out of range exponent"; // ulp(x) is usually 2^(SIGNIFICAND_WIDTH-1)*(2^ilogb(x)) // Let float -> float16 conversion handle encoding issues. yield scalb(ONE, exp - (PRECISION - 1)); @@ -1687,8 +1701,7 @@ public final class Float16 // nonzero value by it would be guaranteed to over or // underflow; due to rounding, scaling down takes an // additional power of two which is reflected here - final int MAX_SCALE = Float16.MAX_EXPONENT + -Float16.MIN_EXPONENT + - Float16Consts.SIGNIFICAND_WIDTH + 1; + final int MAX_SCALE = MAX_EXPONENT + -MIN_EXPONENT + SIGNIFICAND_WIDTH + 1; // Make sure scaling factor is in a reasonable range scaleFactor = Math.clamp(scaleFactor, -MAX_SCALE, MAX_SCALE); @@ -1725,9 +1738,8 @@ public final class Float16 * @see Math#copySign(double, double) */ public static Float16 copySign(Float16 magnitude, Float16 sign) { - return shortBitsToFloat16((short) ((float16ToRawShortBits(sign) & SIGN_BIT_MASK) | - (float16ToRawShortBits(magnitude) & - (EXP_BIT_MASK | SIGNIF_BIT_MASK) ))); + return shortBitsToFloat16((short)((float16ToRawShortBits(sign) & SIGN_BIT_MASK) | + (float16ToRawShortBits(magnitude) & MAG_BIT_MASK))); } /** From ebeb77baaeb6d9098d7462f5ddf61d8583b1e493 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 7 Oct 2025 16:47:43 +0000 Subject: [PATCH 009/561] 8358058: sun/java2d/OpenGL/DrawImageBg.java Test fails intermittently Reviewed-by: azvegint, serb, psadhukhan --- test/jdk/ProblemList.txt | 1 + .../sun/java2d/OpenGL/DrawBitmaskImage.java | 173 ++++++ test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java | 514 ++++++++++++++++++ test/jdk/sun/java2d/OpenGL/DrawImageBg.java | 145 +++++ test/jdk/sun/java2d/OpenGL/LargeOps.java | 138 +++++ test/jdk/sun/java2d/OpenGL/OpaqueDest.java | 180 ++++++ .../jdk/sun/java2d/OpenGL/ScaleParamsOOB.java | 198 +++++++ test/jdk/sun/java2d/OpenGL/ShapeClip.java | 140 +++++ test/jdk/sun/java2d/OpenGL/SrcMaskOps.java | 188 +++++++ .../sun/java2d/OpenGL/VolatileSubRegion.java | 166 ++++++ test/jdk/sun/java2d/OpenGL/XformVolatile.java | 146 +++++ 11 files changed, 1989 insertions(+) create mode 100644 test/jdk/sun/java2d/OpenGL/DrawBitmaskImage.java create mode 100644 test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java create mode 100644 test/jdk/sun/java2d/OpenGL/DrawImageBg.java create mode 100644 test/jdk/sun/java2d/OpenGL/LargeOps.java create mode 100644 test/jdk/sun/java2d/OpenGL/OpaqueDest.java create mode 100644 test/jdk/sun/java2d/OpenGL/ScaleParamsOOB.java create mode 100644 test/jdk/sun/java2d/OpenGL/ShapeClip.java create mode 100644 test/jdk/sun/java2d/OpenGL/SrcMaskOps.java create mode 100644 test/jdk/sun/java2d/OpenGL/VolatileSubRegion.java create mode 100644 test/jdk/sun/java2d/OpenGL/XformVolatile.java diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 48a495bc238..fce7fe85069 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -248,6 +248,7 @@ sun/awt/datatransfer/SuplementaryCharactersTransferTest.java 8011371 generic-all sun/awt/shell/ShellFolderMemoryLeak.java 8197794 windows-all sun/java2d/DirectX/OverriddenInsetsTest/OverriddenInsetsTest.java 8196102 generic-all sun/java2d/DirectX/RenderingToCachedGraphicsTest/RenderingToCachedGraphicsTest.java 8196180 windows-all,macosx-all +sun/java2d/OpenGL/OpaqueDest.java#id1 8367574 macosx-all sun/java2d/SunGraphics2D/EmptyClipRenderingTest.java 8144029 macosx-all,linux-all sun/java2d/SunGraphics2D/DrawImageBilinear.java 8297175 linux-all sun/java2d/SunGraphics2D/PolyVertTest.java 6986565 generic-all diff --git a/test/jdk/sun/java2d/OpenGL/DrawBitmaskImage.java b/test/jdk/sun/java2d/OpenGL/DrawBitmaskImage.java new file mode 100644 index 00000000000..d2730593b5b --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/DrawBitmaskImage.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 6248561 6264014 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that bitmask image copies work properly with the + * OGL pipeline when a SrcOver composite with extra alpha is involved. + * @run main/othervm -Dsun.java2d.opengl=True DrawBitmaskImage + * @run main/othervm DrawBitmaskImage + */ + +/* + * @test + * @bug 6248561 6264014 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that bitmask image copies work properly with the + * OGL pipeline when a SrcOver composite with extra alpha is involved. + * @run main/othervm -Dsun.java2d.opengl=True DrawBitmaskImage + * @run main/othervm DrawBitmaskImage + */ + +import java.awt.AlphaComposite; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Transparency; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.awt.image.IndexColorModel; +import java.io.File; +import javax.imageio.ImageIO; + +public class DrawBitmaskImage extends Panel { + + static final int TESTW = 200, TESTH = 200; + private static volatile DrawBitmaskImage test; + private static volatile Frame frame; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + g2d.setColor(Color.black); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(AlphaComposite.SrcOver.derive(0.50f)); + + BufferedImage img = getGraphicsConfiguration().createCompatibleImage(50, 50, + Transparency.BITMASK); + Graphics2D gimg = img.createGraphics(); + gimg.setComposite(AlphaComposite.Src); + gimg.setColor(new Color(0, 0, 0, 0)); + gimg.fillRect(0, 0, 50, 50); + gimg.setColor(Color.red); + gimg.fillRect(10, 10, 30, 30); + gimg.dispose(); + + + g2d.drawImage(img, 10, 10, null); + + // draw a second time to ensure that the cached copy is used + g2d.drawImage(img, 80, 10, null); + } + + public Dimension getPreferredSize() { + return new Dimension(TESTW, TESTH); + } + + static void createUI() { + test = new DrawBitmaskImage(); + frame = new Frame("OpenGL DrawBitmaskImage Test"); + Panel p = new Panel(); + p.add(test); + frame.add(p); + frame.setSize(TESTW+100, TESTH+100); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + + EventQueue.invokeAndWait(DrawBitmaskImage::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + BufferedImage capture = null; + try { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + if (gc.getColorModel() instanceof IndexColorModel) { + System.out.println("IndexColorModel detected: " + + "test considered PASSED"); + return; + } + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, TESTW, TESTH); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test background color + int pixel = capture.getRGB(5, 10); + if (pixel != 0xff000000) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "background (actual=" + + Integer.toHexString(pixel) + ")"); + } + + // Test pixels (allow for small error in the actual red value) + pixel = capture.getRGB(25, 25); + System.out.println("pixel1 is " + Integer.toHexString(pixel)); + + if ((pixel < 0xff7e0000) || (pixel > 0xff900000)) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "first pixel (actual=" + + Integer.toHexString(pixel) + ")"); + } + + pixel = capture.getRGB(95, 25); + System.out.println("pixel2 is " + Integer.toHexString(pixel)); + if ((pixel < 0xff7e0000) || (pixel > 0xff900000)) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "second pixel (actual=" + + Integer.toHexString(pixel) + ")"); + } + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java b/test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java new file mode 100644 index 00000000000..5d60eb7e792 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/DrawBufImgOp.java @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 6514990 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that calling + * Graphics2D.drawImage(BufferedImage, BufferedImageOp, x, y) to an + * OpenGL-accelerated destination produces the same results when performed + * in software via BufferedImageOp.filter(). + * @run main/othervm -Dsun.java2d.opengl=True DrawBufImgOp -ignore + */ + +/* + * @test + * @bug 6514990 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that calling + * Graphics2D.drawImage(BufferedImage, BufferedImageOp, x, y) to an + * OpenGL-accelerated destination produces the same results when performed + * in software via BufferedImageOp.filter(). + * @run main/othervm -Dsun.java2d.opengl=True DrawBufImgOp -ignore + */ + +import java.awt.AlphaComposite; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.awt.image.ByteLookupTable; +import java.awt.image.ColorModel; +import java.awt.image.ConvolveOp; +import java.awt.image.IndexColorModel; +import java.awt.image.Kernel; +import java.awt.image.LookupOp; +import java.awt.image.RescaleOp; +import java.awt.image.ShortLookupTable; +import java.awt.image.VolatileImage; +import java.io.File; +import javax.imageio.ImageIO; + +/** + * REMIND: This testcase was originally intended to automatically compare + * the results of the software BufferedImageOp implementations against + * the OGL-accelerated codepaths. However, there are just too many open + * bugs in the mediaLib-based codepaths (see below), which means that + * creating the reference image may cause crashes or exceptions, + * and even if we work around those cases using the "-ignore" flag, + * the visual results of the reference image are often buggy as well + * (so the comparison will fail even though the OGL results are correct). + * Therefore, for now we will run the testcase with the "-ignore" flag + * but without the "-compare" flag, so at least it will be checking for + * any exceptions/crashes in the OGL code. When we fix all of the + * outstanding bugs with the software codepaths, we can remove the + * "-ignore" flag and maybe even restore the "-compare" flag. In the + * meantime, it also functions well as a manual testcase (with either + * the "-show" or "-dump" options). + */ +public class DrawBufImgOp extends Canvas { + + private static final int TESTW = 600; + private static final int TESTH = 500; + + private static volatile DrawBufImgOp test; + private static volatile Frame frame; + + /* + * If true, skips tests that are known to trigger bugs (which in + * turn may cause crashes, exceptions, or other artifacts). + */ + private static boolean ignore; + + // Test both pow2 and non-pow2 sized images + private static final int[] srcSizes = { 32, 17 }; + private static final int[] srcTypes = { + BufferedImage.TYPE_INT_RGB, + BufferedImage.TYPE_INT_ARGB, + BufferedImage.TYPE_INT_ARGB_PRE, + BufferedImage.TYPE_INT_BGR, + BufferedImage.TYPE_3BYTE_BGR, + BufferedImage.TYPE_4BYTE_ABGR, + BufferedImage.TYPE_USHORT_565_RGB, + BufferedImage.TYPE_BYTE_GRAY, + BufferedImage.TYPE_USHORT_GRAY, + }; + + private static final RescaleOp + rescale1band, rescale3band, rescale4band; + private static final LookupOp + lookup1bandbyte, lookup3bandbyte, lookup4bandbyte; + private static final LookupOp + lookup1bandshort, lookup3bandshort, lookup4bandshort; + private static final ConvolveOp + convolve3x3zero, convolve5x5zero, convolve7x7zero; + private static final ConvolveOp + convolve3x3noop, convolve5x5noop, convolve7x7noop; + + static { + rescale1band = new RescaleOp(0.5f, 10.0f, null); + rescale3band = new RescaleOp( + new float[] { 0.6f, 0.4f, 0.6f }, + new float[] { 10.0f, -3.0f, 5.0f }, + null); + rescale4band = new RescaleOp( + new float[] { 0.6f, 0.4f, 0.6f, 0.9f }, + new float[] { -1.0f, 5.0f, 3.0f, 1.0f }, + null); + + // REMIND: we should probably test non-zero offsets, but that + // would require massaging the source image data to avoid going + // outside the lookup table array bounds + int offset = 0; + { + byte invert[] = new byte[256]; + byte halved[] = new byte[256]; + for (int j = 0; j < 256 ; j++) { + invert[j] = (byte) (255-j); + halved[j] = (byte) (j / 2); + } + ByteLookupTable lut1 = new ByteLookupTable(offset, invert); + lookup1bandbyte = new LookupOp(lut1, null); + ByteLookupTable lut3 = + new ByteLookupTable(offset, + new byte[][] {invert, halved, invert}); + lookup3bandbyte = new LookupOp(lut3, null); + ByteLookupTable lut4 = + new ByteLookupTable(offset, + new byte[][] {invert, halved, invert, halved}); + lookup4bandbyte = new LookupOp(lut4, null); + } + + { + short invert[] = new short[256]; + short halved[] = new short[256]; + for (int j = 0; j < 256 ; j++) { + invert[j] = (short) ((255-j) * 255); + halved[j] = (short) ((j / 2) * 255); + } + ShortLookupTable lut1 = new ShortLookupTable(offset, invert); + lookup1bandshort = new LookupOp(lut1, null); + ShortLookupTable lut3 = + new ShortLookupTable(offset, + new short[][] {invert, halved, invert}); + lookup3bandshort = new LookupOp(lut3, null); + ShortLookupTable lut4 = + new ShortLookupTable(offset, + new short[][] {invert, halved, invert, halved}); + lookup4bandshort = new LookupOp(lut4, null); + } + + // 3x3 blur + float[] data3 = { + 0.1f, 0.1f, 0.1f, + 0.1f, 0.2f, 0.1f, + 0.1f, 0.1f, 0.1f, + }; + Kernel k3 = new Kernel(3, 3, data3); + + // 5x5 edge + float[] data5 = { + -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 24.0f, -1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, + }; + Kernel k5 = new Kernel(5, 5, data5); + + // 7x7 blur + float[] data7 = { + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, 0.02f, + }; + Kernel k7 = new Kernel(7, 7, data7); + + convolve3x3zero = new ConvolveOp(k3, ConvolveOp.EDGE_ZERO_FILL, null); + convolve5x5zero = new ConvolveOp(k5, ConvolveOp.EDGE_ZERO_FILL, null); + convolve7x7zero = new ConvolveOp(k7, ConvolveOp.EDGE_ZERO_FILL, null); + + convolve3x3noop = new ConvolveOp(k3, ConvolveOp.EDGE_NO_OP, null); + convolve5x5noop = new ConvolveOp(k5, ConvolveOp.EDGE_NO_OP, null); + convolve7x7noop = new ConvolveOp(k7, ConvolveOp.EDGE_NO_OP, null); + } + + public void paint(Graphics g) { + + VolatileImage vimg = createVolatileImage(TESTW, TESTH); + vimg.validate(getGraphicsConfiguration()); + + Graphics2D g2d = vimg.createGraphics(); + renderTest(g2d); + g2d.dispose(); + + g.drawImage(vimg, 0, 0, null); + } + + /* + * foreach source image size (once with pow2, once with non-pow2) + * + * foreach BufferedImage type + * + * RescaleOp (1 band) + * RescaleOp (3 bands, if src has 3 bands) + * RescaleOp (4 bands, if src has 4 bands) + * + * foreach LookupTable type (once with ByteLUT, once with ShortLUT) + * LookupOp (1 band) + * LookupOp (3 bands, if src has 3 bands) + * LookupOp (4 bands, if src has 4 bands) + * + * foreach edge condition (once with ZERO_FILL, once with EDGE_NO_OP) + * ConvolveOp (3x3) + * ConvolveOp (5x5) + * ConvolveOp (7x7) + */ + private void renderTest(Graphics2D g2d) { + g2d.setColor(Color.white); + g2d.fillRect(0, 0, TESTW, TESTH); + + int yorig = 2; + int xinc = 34; + int yinc = srcSizes[0] + srcSizes[1] + 2 + 2; + + for (int srcType : srcTypes) { + int y = yorig; + + for (int srcSize : srcSizes) { + int x = 2; + System.out.printf("type=%d size=%d\n", srcType, srcSize); + + BufferedImage srcImg = makeSourceImage(srcSize, srcType); + ColorModel srcCM = srcImg.getColorModel(); + + // RescaleOp + g2d.drawImage(srcImg, rescale1band, x, y); + x += xinc; + // REMIND: 3-band RescaleOp.filter() throws IAE for images + // that contain an alpha channel (bug to be filed) + if (srcCM.getNumColorComponents() == 3 && + !(ignore && srcCM.hasAlpha())) + { + g2d.drawImage(srcImg, rescale3band, x, y); + } + x += xinc; + if (srcCM.getNumComponents() == 4) { + g2d.drawImage(srcImg, rescale4band, x, y); + } + x += xinc; + + // LookupOp + // REMIND: Our LUTs are only 256 elements long, so won't + // currently work with USHORT_GRAY data + if (srcType != BufferedImage.TYPE_USHORT_GRAY) { + g2d.drawImage(srcImg, lookup1bandbyte, x, y); + x += xinc; + if (srcCM.getNumColorComponents() == 3) { + g2d.drawImage(srcImg, lookup3bandbyte, x, y); + } + x += xinc; + if (srcCM.getNumComponents() == 4) { + g2d.drawImage(srcImg, lookup4bandbyte, x, y); + } + x += xinc; + + // REMIND: LookupOp.createCompatibleDestImage() throws + // IAE for 3BYTE_BGR/4BYTE_ABGR (bug to be filed) + if (!(ignore && + (srcType == BufferedImage.TYPE_3BYTE_BGR || + srcType == BufferedImage.TYPE_4BYTE_ABGR))) + { + g2d.drawImage(srcImg, lookup1bandshort, x, y); + x += xinc; + // REMIND: 3-band LookupOp.filter() throws IAE for + // images that contain an alpha channel + // (bug to be filed) + if (srcCM.getNumColorComponents() == 3 && + !(ignore && srcCM.hasAlpha())) + { + g2d.drawImage(srcImg, lookup3bandshort, x, y); + } + x += xinc; + if (srcCM.getNumComponents() == 4) { + g2d.drawImage(srcImg, lookup4bandshort, x, y); + } + x += xinc; + } else { + x += 3*xinc; + } + } else { + x += 6*xinc; + } + + // ConvolveOp + // REMIND: ConvolveOp.filter() throws ImagingOpException + // for 3BYTE_BGR (see 4957775) + if (srcType != BufferedImage.TYPE_3BYTE_BGR) { + g2d.drawImage(srcImg, convolve3x3zero, x, y); + x += xinc; + g2d.drawImage(srcImg, convolve5x5zero, x, y); + x += xinc; + g2d.drawImage(srcImg, convolve7x7zero, x, y); + x += xinc; + + g2d.drawImage(srcImg, convolve3x3noop, x, y); + x += xinc; + g2d.drawImage(srcImg, convolve5x5noop, x, y); + x += xinc; + g2d.drawImage(srcImg, convolve7x7noop, x, y); + x += xinc; + } else { + x += 6*xinc; + } + + y += srcSize + 2; + } + + yorig += yinc; + } + } + + private BufferedImage makeSourceImage(int size, int type) { + int s2 = size/2; + BufferedImage img = new BufferedImage(size, size, type); + Graphics2D g2d = img.createGraphics(); + g2d.setComposite(AlphaComposite.Src); + g2d.setColor(Color.orange); + g2d.fillRect(0, 0, size, size); + g2d.setColor(Color.red); + g2d.fillRect(0, 0, s2, s2); + g2d.setColor(Color.green); + g2d.fillRect(s2, 0, s2, s2); + g2d.setColor(Color.blue); + g2d.fillRect(0, s2, s2, s2); + g2d.setColor(new Color(255, 255, 0, 128)); + g2d.fillRect(s2, s2, s2, s2); + g2d.setColor(Color.pink); + g2d.fillOval(s2-3, s2-3, 6, 6); + g2d.dispose(); + return img; + } + + public BufferedImage makeReferenceImage() { + BufferedImage img = new BufferedImage(TESTW, TESTH, + BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = img.createGraphics(); + renderTest(g2d); + g2d.dispose(); + return img; + } + + public Dimension getPreferredSize() { + return new Dimension(TESTW, TESTH); + } + + private static void compareImages(BufferedImage refImg, + BufferedImage testImg, + int tolerance) + { + int x1 = 0; + int y1 = 0; + int x2 = refImg.getWidth(); + int y2 = refImg.getHeight(); + + for (int y = y1; y < y2; y++) { + for (int x = x1; x < x2; x++) { + Color expected = new Color(refImg.getRGB(x, y)); + Color actual = new Color(testImg.getRGB(x, y)); + if (!isSameColor(expected, actual, tolerance)) { + saveImage("referenceimage", refImg); + saveImage("testimage", testImg); + throw new RuntimeException("Test failed at x="+x+" y="+y+ + " (expected="+expected+ + " actual="+actual+ + ")"); + } + } + } + } + + private static boolean isSameColor(Color c1, Color c2, int e) { + int r1 = c1.getRed(); + int g1 = c1.getGreen(); + int b1 = c1.getBlue(); + int r2 = c2.getRed(); + int g2 = c2.getGreen(); + int b2 = c2.getBlue(); + int rmin = Math.max(r2-e, 0); + int gmin = Math.max(g2-e, 0); + int bmin = Math.max(b2-e, 0); + int rmax = Math.min(r2+e, 255); + int gmax = Math.min(g2+e, 255); + int bmax = Math.min(b2+e, 255); + if (r1 >= rmin && r1 <= rmax && + g1 >= gmin && g1 <= gmax && + b1 >= bmin && b1 <= bmax) + { + return true; + } + return false; + } + + + static void createUI() { + test = new DrawBufImgOp(); + Panel panel = new Panel(); + panel.add(test); + frame = new Frame("OpenGL DrawBufImgOp Test"); + frame.add(panel); + frame.setSize(TESTW+100, TESTH+100); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + + boolean show = false; + boolean dump = false; + boolean compare = false; + + for (String arg : args) { + if (arg.equals("-show")) { + show = true; + } else if (arg.equals("-dump")) { + dump = true; + } else if (arg.equals("-compare")) { + compare = true; + } else if (arg.equals("-ignore")) { + ignore = true; + } + } + + Robot robot = new Robot(); + + EventQueue.invokeAndWait(DrawBufImgOp::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + BufferedImage capture = null; + try { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + if (gc.getColorModel() instanceof IndexColorModel) { + System.out.println("IndexColorModel detected: " + + "test considered PASSED"); + return; + } + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, TESTW, TESTH); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Compare the images (allow for +/- 1 bit differences in color comps) + if (dump || compare) { + BufferedImage ref = test.makeReferenceImage(); + if (dump) { + saveImage("DrawBufImgOp_ref", ref); + saveImage("DrawBufImgOp_cap", capture); + } + if (compare) { + test.compareImages(ref, capture, 1); + } + } + } + + static void saveImage(String name, BufferedImage img) { + try { + File file = new File(name + ".png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/DrawImageBg.java b/test/jdk/sun/java2d/OpenGL/DrawImageBg.java new file mode 100644 index 00000000000..7fc38d91b06 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/DrawImageBg.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 4993274 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that managed image copies and transforms work properly + * with the OGL pipeline when a background color is specified. + * @run main/othervm -Dsun.java2d.opengl=True DrawImageBg + * @run main/othervm DrawImageBg + */ + +/* + * @test + * @bug 4993274 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that managed image copies and transforms work properly + * with the OGL pipeline when a background color is specified. + * @run main/othervm -Dsun.java2d.opengl=True DrawImageBg + * @run main/othervm DrawImageBg + */ + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Transparency; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class DrawImageBg extends Panel { + + static volatile Frame frame; + static volatile DrawImageBg test; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + g2d.setColor(Color.black); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + BufferedImage img = getGraphicsConfiguration().createCompatibleImage(50, 50, + Transparency.BITMASK); + Graphics2D gimg = img.createGraphics(); + gimg.setComposite(AlphaComposite.Src); + gimg.setColor(new Color(0, 0, 0, 0)); + gimg.fillRect(0, 0, 50, 50); + gimg.setColor(Color.red); + gimg.fillRect(10, 10, 30, 30); + gimg.dispose(); + + g2d.drawImage(img, 10, 10, Color.blue, null); + + // draw a second time to ensure that the cached copy is used + g2d.drawImage(img, 80, 10, Color.blue, null); + } + + static void createUI() { + frame = new Frame("OpenGL DrawImageBg Test"); + test = new DrawImageBg(); + frame.add(test); + frame.setSize(300, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + + BufferedImage capture = null; + Robot robot = new Robot(); + try { + EventQueue.invokeAndWait(DrawImageBg::createUI); + robot.waitForIdle(); + robot.delay(3000); + + // Grab the screen region + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x+80, pt1.y, 80, 80); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + if (capture == null) { + throw new RuntimeException("Screen capture is null"); + } + + // Test inner and outer pixels + int pixel1 = capture.getRGB(5, 10); + if (pixel1 != 0xff0000ff) { + saveImage(capture); + throw new RuntimeException(getMsg("outer", pixel1)); + } + int pixel2 = capture.getRGB(25, 25); + if (pixel2 != 0xffff0000) { + saveImage(capture); + throw new RuntimeException(getMsg("inner", pixel2)); + } + } + + static String getMsg(String r, int p1) { + return "Failed: Incorrect color for " + r + " pixel: got " + Integer.toHexString(p1); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/LargeOps.java b/test/jdk/sun/java2d/OpenGL/LargeOps.java new file mode 100644 index 00000000000..ace60b7a3c4 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/LargeOps.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 6219284 6358147 6274813 6578452 + * @key headful + * @summary Verifies that OGLRenderer.drawPoly(), + * OGLTextRenderer.drawGlyphList(), and OGLMaskFill work properly when the + * operation parameters exceed the capacity of the render queue. With the + * single-threaded OpenGL pipeline, there are some operations that require + * a separate buffer to be spawned if the parameters cannot fit entirely on + * the standard buffer. This test exercises this special case. + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.lcdshader=true LargeOps + */ + +import java.awt.Canvas; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Robot; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class LargeOps extends Canvas { + + private static final int NUM_POINTS = 8000; + private int[] xPoints, yPoints; + private String str; + + public LargeOps() { + xPoints = new int[NUM_POINTS]; + yPoints = new int[NUM_POINTS]; + for (int i = 0; i < NUM_POINTS; i++) { + xPoints[i] = (i % 2 == 0) ? 10 : 400; + yPoints[i] = (i % 2 == 1) ? i+3 : i; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < NUM_POINTS; i+=11) { + sb.append("ThisIsATest"); + } + str = sb.toString(); + } + + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D)g; + g2d.setColor(Color.white); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + // draw large polyline + g2d.setColor(Color.green); + g2d.drawPolyline(xPoints, yPoints, NUM_POINTS); + + // draw long string + g2d.setColor(Color.blue); + g2d.drawString(str, 10, 100); + + // draw long string with larger pt size + Font font = g2d.getFont(); + g2d.setFont(font.deriveFont(40.0f)); + g2d.drawString(str, 10, 150); + + // do the same with LCD hints enabled + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); + g2d.setFont(font); + g2d.drawString(str, 10, 200); + g2d.setFont(font.deriveFont(43.0f)); + g2d.drawString(str, 10, 250); + + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR); + g2d.setFont(font); + g2d.drawString(str, 10, 300); + g2d.setFont(font.deriveFont(37.0f)); + g2d.drawString(str, 10, 350); + } + + static volatile Frame frame; + static volatile LargeOps test; + + static void createUI() { + frame = new Frame("OpenGL LargeOps Test"); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + frame.dispose(); + } + }); + test = new LargeOps(); + frame.add(test); + frame.setSize(600, 600); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + try { + Robot robot = new Robot(); + EventQueue.invokeAndWait(LargeOps::createUI); + robot.waitForIdle(); + robot.delay(6000); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/OpaqueDest.java b/test/jdk/sun/java2d/OpenGL/OpaqueDest.java new file mode 100644 index 00000000000..50896316109 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/OpaqueDest.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 6277977 6319663 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that blending operations do not inadvertantly leave + * non-opaque alpha values in the framebuffer. Note that this test is + * intended to run on GraphicsConfigs that support a stored alpha channel + * (to verify the bug at hand), but it is also a useful for testing the + * compositing results on any configuration. + * @run main/othervm -Dsun.java2d.opengl=True OpaqueDest + * @run main/othervm OpaqueDest + */ + +/* + * @test + * @bug 6277977 6319663 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that blending operations do not inadvertantly leave + * non-opaque alpha values in the framebuffer. Note that this test is + * intended to run on GraphicsConfigs that support a stored alpha channel + * (to verify the bug at hand), but it is also a useful for testing the + * compositing results on any configuration. + * @run main/othervm -Dsun.java2d.opengl=True OpaqueDest + * @run main/othervm OpaqueDest + */ + +import java.awt.AlphaComposite; +import java.awt.Canvas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.awt.image.IndexColorModel; +import java.io.File; +import javax.imageio.ImageIO; + +public class OpaqueDest extends Canvas { + + private static volatile Frame frame; + private static volatile OpaqueDest test; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + + g2d.setColor(Color.red); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + // This will clear the rectangle to black + g2d.setComposite(AlphaComposite.Clear); + g2d.fillRect(10, 10, 80, 80); + + // If everything is working properly, then this will fill the + // rectangle with red again. Before this bug was fixed, the previous + // Clear operation would leave zero values in the destination's + // alpha channel (if present), and therefore a SrcIn operation + // would result in all-black. + g2d.setComposite(AlphaComposite.SrcIn); + g2d.fillRect(10, 10, 80, 80); + } + + public Dimension getPreferredSize() { + return new Dimension(100, 100); + } + + static void createUI() { + test = new OpaqueDest(); + frame = new Frame("OpenGL OpaqueDest Test"); + Panel p = new Panel(); + p.add(test); + frame.add(p); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + + EventQueue.invokeAndWait(OpaqueDest::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + BufferedImage capture = null; + try { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + if (gc.getColorModel() instanceof IndexColorModel) { + System.out.println("IndexColorModel detected: " + + "test considered PASSED"); + return; + } + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 100, 100); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + + // Test all pixels (every one should be red) + for (int y = 0; y < 100; y++) { + for (int x = 0; x < 100; x++) { + int actual = capture.getRGB(x, y); + int expected = 0xffff0000; + if (!similar(actual, expected)) { + saveImage(capture); + throw new RuntimeException("Test failed at x="+x+" y="+y+ + " (expected="+ + Integer.toHexString(expected) + + " actual="+ + Integer.toHexString(actual) + + ")"); + } + } + } + } + + static boolean similar(int p1, int p2) { + int a1 = (p1 >> 24) & 0xff; + int r1 = (p1 >> 16) & 0xff; + int g1 = (p1 >> 8) & 0xff; + int b1 = p1 & 0xff; + int a2 = (p2 >> 24) & 0xff; + int r2 = (p2 >> 16) & 0xff; + int g2 = (p2 >> 8) & 0xff; + int b2 = p2 & 0xff; + + int allowedDiff = 0x01; // tiny rounding error allowed. + return + (Math.abs(a1 - a2) <= allowedDiff) && + (Math.abs(r1 - r2) <= allowedDiff) && + (Math.abs(g1 - g2) <= allowedDiff) && + (Math.abs(b1 - b2) <= allowedDiff); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/ScaleParamsOOB.java b/test/jdk/sun/java2d/OpenGL/ScaleParamsOOB.java new file mode 100644 index 00000000000..b3d866cfd75 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/ScaleParamsOOB.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 5104584 8237244 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that scaling an image works properly when the + * source parameters are outside the source bounds. + * @run main/othervm -Dsun.java2d.opengl=True ScaleParamsOOB + * @run main/othervm ScaleParamsOOB + */ + +/* + * @test + * @bug 5104584 8237244 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that scaling an image works properly when the + * source parameters are outside the source bounds. + * @run main/othervm -Dsun.java2d.opengl=True ScaleParamsOOB + * @run main/othervm ScaleParamsOOB + */ + + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class ScaleParamsOOB extends Panel { + + private static final int TOLERANCE = 12; + + private static volatile ScaleParamsOOB test; + private static volatile Frame frame; + + private BufferedImage img; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + g2d.setColor(Color.black); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + BufferedImage img = getGraphicsConfiguration().createCompatibleImage(40, 40); + Graphics2D gimg = img.createGraphics(); + gimg.setColor(Color.red); + gimg.fillRect(0, 0, 40, 40); + gimg.dispose(); + + // first time will be a sw->surface blit + g2d.drawImage(img, + 10, 10, 90, 90, + -60, -60, 100, 100, + null); + + // second time will be a texture->surface blit + g2d.drawImage(img, + 110, 10, 190, 90, + -60, -60, 100, 100, + null); + } + + public Dimension getPreferredSize() { + return new Dimension(300, 200); + } + + private static void testRegion(BufferedImage bi, + Rectangle wholeRegion, + Rectangle affectedRegion) + { + int x1 = wholeRegion.x; + int y1 = wholeRegion.y; + int x2 = x1 + wholeRegion.width; + int y2 = y1 + wholeRegion.height; + + for (int y = y1; y < y2; y++) { + for (int x = x1; x < x2; x++) { + int actual = bi.getRGB(x, y); + int expected = 0; + if (affectedRegion.contains(x, y)) { + expected = Color.red.getRGB(); + } else { + expected = Color.black.getRGB(); + } + int alpha = (actual >> 24) & 0xFF; + int red = (actual >> 16) & 0xFF; + int green = (actual >> 8) & 0xFF; + int blue = (actual) & 0xFF; + + int standardAlpha = (expected >> 24) & 0xFF; + int standardRed = (expected >> 16) & 0xFF; + int standardGreen = (expected >> 8) & 0xFF; + int standardBlue = (expected) & 0xFF; + + if ((Math.abs(alpha - standardAlpha) > TOLERANCE) || + (Math.abs(red - standardRed) > TOLERANCE) || + (Math.abs(green - standardGreen) > TOLERANCE) || + (Math.abs(blue - standardBlue) > TOLERANCE)) { + saveImage(bi); + throw new RuntimeException("Test failed at x="+x+" y="+y+ + " (expected="+ + Integer.toHexString(expected) + + " actual="+ + Integer.toHexString(actual) + + ")"); + } + } + } + } + + private static void createAndShowGUI() { + test = new ScaleParamsOOB(); + frame = new Frame("OpenGL ScaleParamsOOB Test"); + frame.setAlwaysOnTop(true); + frame.add(test); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + + EventQueue.invokeAndWait(() -> createAndShowGUI()); + + robot.waitForIdle(); + robot.delay(2000); + + // Grab the screen region + BufferedImage capture = null; + try { + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 200, 200); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test background color + int pixel = capture.getRGB(5, 5); + if (pixel != 0xff000000) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "background: " + Integer.toHexString(pixel)); + } + + // Test pixels + testRegion(capture, + new Rectangle(5, 5, 90, 90), + new Rectangle(40, 40, 20, 20)); + testRegion(capture, + new Rectangle(105, 5, 90, 90), + new Rectangle(140, 40, 20, 20)); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/ShapeClip.java b/test/jdk/sun/java2d/OpenGL/ShapeClip.java new file mode 100644 index 00000000000..f50b7aff5a6 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/ShapeClip.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 5002133 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that the OpenGL pipeline does not affect the color + * buffer when setting up a complex (shape) clip region. The test fails if + * the circular clip region is filled with a green color (the green region + * should not be visible at all). + * @run main/othervm -Dsun.java2d.opengl=True ShapeClip + * @run main/othervm ShapeClip + */ + +/* + * @test + * @bug 5002133 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that the OpenGL pipeline does not affect the color + * buffer when setting up a complex (shape) clip region. The test fails if + * the circular clip region is filled with a green color (the green region + * should not be visible at all). + * @run main/othervm -Dsun.java2d.opengl=True ShapeClip + * @run main/othervm ShapeClip + */ + +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.geom.Ellipse2D; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class ShapeClip extends Panel { + + private static volatile Frame frame; + private static volatile ShapeClip test; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + + int width = getWidth(); + int height = getHeight(); + + g2d.setColor(Color.black); + g2d.fillRect(0, 0, width, height); + + g2d.setColor(Color.green); + g2d.fillRect(0, 0, 1, 1); + g2d.setClip(new Ellipse2D.Double(10, 10, 100, 100)); + g2d.setColor(Color.blue); + g2d.fillRect(30, 30, 20, 20); + } + + static void createUI() { + test = new ShapeClip(); + frame = new Frame("OpenGL ShapeClip Test"); + frame.add(test); + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + + EventQueue.invokeAndWait(ShapeClip::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + // Grab the screen region + BufferedImage capture = null; + try { + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 80, 80); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test blue rectangle + int pixel1 = capture.getRGB(40, 40); + if (pixel1 != 0xff0000ff) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "rectangle " + Integer.toHexString(pixel1)); + } + + // Test clip region (should be same color as background) + int pixel2 = capture.getRGB(60, 40); + if (pixel2 != 0xff000000) { + saveImage(capture); + throw new RuntimeException("Failed: Incorrect color for " + + "clip region " + Integer.toHexString(pixel2)); + } + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/SrcMaskOps.java b/test/jdk/sun/java2d/OpenGL/SrcMaskOps.java new file mode 100644 index 00000000000..9908cffdefb --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/SrcMaskOps.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 4942939 4970674 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that OGLMaskFill, OGLMaskBlit, and OGLTextRenderer + * operations work properly for non-SrcOver composites. + * @run main/othervm -Dsun.java2d.opengl=True SrcMaskOps + * @run main/othervm SrcMaskOps + */ + +/* + * @test + * @bug 4942939 4970674 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that OGLMaskFill, OGLMaskBlit, and OGLTextRenderer + * operations work properly for non-SrcOver composites. + * @run main/othervm -Dsun.java2d.opengl=True SrcMaskOps + * @run main/othervm SrcMaskOps + */ + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.Frame; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class SrcMaskOps extends Panel { + + static volatile Frame frame; + static volatile SrcMaskOps test; + + static final int SRX = 50; + static final int SRY = 50; + static final int GPX = 90; + static final int GPY = 50; + static final int DTX = 120; + static final int DTY = 70; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + + g2d.setColor(Color.white); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setComposite(AlphaComposite.Src); + + g2d.setColor(Color.blue); + g2d.drawRect(SRX, SRY, 20, 20); + + g2d.setPaint(new GradientPaint(0.0f, 0.0f, Color.red, + 100.0f, 100.f, Color.red, true)); + g2d.drawRect(GPX, GPY, 20, 20); + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF); + + g2d.setColor(Color.red); + Font font = new Font(Font.DIALOG, Font.PLAIN, 20); + g2d.setFont(font); + g2d.drawString("HELLO", DTX, DTY); + } + + static void createUI() { + frame = new Frame("OpenGL SrcMaskOps Test"); + test = new SrcMaskOps(); + frame.add(test); + frame.setSize(300, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + + Robot robot = new Robot(); + BufferedImage capture = null; + try { + EventQueue.invokeAndWait(SrcMaskOps::createUI); + robot.waitForIdle(); + robot.delay(3000); + + // Grab the screen region + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 300, 300); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test solid rectangle + int pixel1, pixel2; + pixel1 = capture.getRGB(SRX, SRY); + pixel2 = capture.getRGB(SRX+2, SRY+2); + if (!similar(pixel1, 0xff0000ff) || !similar(pixel2, 0xffffffff)) { + saveImage(capture); + throw new RuntimeException(getMsg("solid rectangle", pixel1, pixel2)); + } + + // Test GradientPaint rectangle + pixel1 = capture.getRGB(GPX, GPY); + pixel2 = capture.getRGB(GPX+2, GPY+2); + if (!similar(pixel1, 0xffff0000) || !similar(pixel2, 0xffffffff)) { + saveImage(capture); + throw new RuntimeException(getMsg("GradientPaint rectangle", pixel1, pixel2)); + } + + // Test solid text + pixel1 = capture.getRGB(DTX+2, DTY-5); + pixel2 = capture.getRGB(DTX+5, DTY-5); + if (!similar(pixel1, 0xffff0000) || !similar(pixel2, 0xffffffff)) { + saveImage(capture); + throw new RuntimeException(getMsg("solid text", pixel1, pixel2)); + } + + } + + static boolean similar(int p1, int p2) { + int a1 = (p1 >> 24) & 0xff; + int r1 = (p1 >> 16) & 0xff; + int g1 = (p1 >> 8) & 0xff; + int b1 = p1 & 0xff; + int a2 = (p2 >> 24) & 0xff; + int r2 = (p2 >> 16) & 0xff; + int g2 = (p2 >> 8) & 0xff; + int b2 = p2 & 0xff; + + int allowedDiff = 0x10; + return + (Math.abs(a1 - a2) <= allowedDiff) && + (Math.abs(r1 - r2) <= allowedDiff) && + (Math.abs(g1 - g2) <= allowedDiff) && + (Math.abs(b1 - b2) <= allowedDiff); + } + + static String getMsg(String r, int p1, int p2) { + return "Failed: Incorrect color[s] for " + r + " got " + + Integer.toHexString(p1) + " and " + Integer.toHexString(p2); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/test/jdk/sun/java2d/OpenGL/VolatileSubRegion.java b/test/jdk/sun/java2d/OpenGL/VolatileSubRegion.java new file mode 100644 index 00000000000..7ec350bc958 --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/VolatileSubRegion.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 6244071 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that copying a subregion from a VolatileImage works + * properly with the OGL pipeline. + * @run main/othervm VolatileSubRegion + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=true VolatileSubRegion + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=false VolatileSubRegion + */ + +/* + * @test + * @bug 6244071 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that copying a subregion from a VolatileImage works + * properly with the OGL pipeline. + * @run main/othervm VolatileSubRegion + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=true VolatileSubRegion + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=false VolatileSubRegion + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.awt.image.IndexColorModel; +import java.awt.image.VolatileImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class VolatileSubRegion extends Panel { + + private VolatileImage img; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + + if (img == null) { + img = createVolatileImage(200, 200); + Graphics2D goff = img.createGraphics(); + goff.setColor(Color.green); + goff.fillRect(50, 0, 100, 50); + goff.setColor(Color.blue); + goff.fillRect(0, 0, 200, 200); + goff.setColor(Color.red); + goff.fillRect(50, 50, 100, 100); + goff.setColor(Color.yellow); + goff.fillRect(50, 150, 100, 50); + goff.dispose(); + } + + g2d.setColor(Color.white); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + g2d.drawImage(img, + 50, 50, 200, 200, + 50, 50, 200, 200, + null); + + } + + + private static volatile VolatileSubRegion test; + private static volatile Frame frame; + + static void createUI() { + test = new VolatileSubRegion(); + frame = new Frame("OpenGL VolatileSubRegion Test"); + frame.add(test); + frame.setSize(300, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + Robot robot = new Robot(); + + EventQueue.invokeAndWait(VolatileSubRegion::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + BufferedImage capture = null; + try { + GraphicsConfiguration gc = frame.getGraphicsConfiguration(); + if (gc.getColorModel() instanceof IndexColorModel) { + System.out.println("IndexColorModel detected: " + + "test considered PASSED"); + return; + } + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 200, 200); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test pixels + int pixel1 = capture.getRGB(49, 50); + if (pixel1 != 0xffffffff) { + saveImage(capture); + throw new RuntimeException(getMsg("background pixel", pixel1)); + } + int pixel2 = capture.getRGB(50, 50); + if (pixel2 != 0xffff0000) { + saveImage(capture); + throw new RuntimeException(getMsg("red region", pixel2)); + } + int pixel3 = capture.getRGB(50, 150); + if (pixel3 != 0xffffff00) { + saveImage(capture); + throw new RuntimeException(getMsg("yellow region", pixel3)); + } + } + + static String getMsg(String r, int p1) { + return "Failed: Incorrect color for " + r + " : got " + Integer.toHexString(p1); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/test/jdk/sun/java2d/OpenGL/XformVolatile.java b/test/jdk/sun/java2d/OpenGL/XformVolatile.java new file mode 100644 index 00000000000..44e7c7ee8ba --- /dev/null +++ b/test/jdk/sun/java2d/OpenGL/XformVolatile.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2004, 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. + * + * 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. + */ + +/* + * @test + * @bug 4970836 + * @key headful + * @requires (os.family != "mac") + * @summary Verifies that transformed VolatileImage copies work properly with + * the OGL pipeline. + * @run main/othervm XformVolatile + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=true XformVolatile + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=false XformVolatile + */ + +/* + * @test + * @bug 4970836 + * @key headful + * @requires (os.family == "mac") + * @summary Verifies that transformed VolatileImage copies work properly with + * the OGL pipeline. + * @run main/othervm XformVolatile + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=true XformVolatile + * @run main/othervm -Dsun.java2d.opengl=True -Dsun.java2d.opengl.fbobject=false XformVolatile + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.image.BufferedImage; +import java.awt.image.VolatileImage; +import java.io.File; +import javax.imageio.ImageIO; + +public class XformVolatile extends Panel { + + private static volatile Frame frame; + private static volatile XformVolatile test; + private volatile VolatileImage img; + + public void paint(Graphics g) { + + Graphics2D g2d = (Graphics2D)g; + + if (img == null) { + img = createVolatileImage(200, 200); + Graphics2D goff = img.createGraphics(); + goff.setColor(Color.blue); + goff.fillRect(0, 0, 200, 200); + goff.setColor(Color.red); + goff.fillPolygon(new int[] {10, 100, 190}, + new int[] {190, 10, 190}, 3); + goff.dispose(); + } + + g2d.setColor(Color.black); + g2d.fillRect(0, 0, getWidth(), getHeight()); + + g2d.rotate(Math.toRadians(3.0)); + g2d.drawImage(img, 0, 0, null); + } + + static void createUI() { + test = new XformVolatile(); + frame = new Frame("OpenGL XformVolatile Test"); + frame.add(test); + frame.setSize(300, 300); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + + public static void main(String[] args) throws Exception { + + Robot robot = new Robot(); + + EventQueue.invokeAndWait(XformVolatile::createUI); + + robot.waitForIdle(); + robot.delay(2000); + + // Grab the screen region + BufferedImage capture = null; + try { + Point pt1 = test.getLocationOnScreen(); + Rectangle rect = new Rectangle(pt1.x, pt1.y, 200, 200); + capture = robot.createScreenCapture(rect); + } finally { + if (frame != null) { + EventQueue.invokeAndWait(frame::dispose); + } + } + + // Test inner and outer pixels + int pixel1 = capture.getRGB(5, 175); + if (pixel1 != 0xff0000ff) { + saveImage(capture); + throw new RuntimeException(getMsg("inner", pixel1)); + } + int pixel2 = capture.getRGB(5, 188); + if (pixel2 != 0xffff0000) { + saveImage(capture); + throw new RuntimeException(getMsg("inner", pixel2)); + } + } + + static String getMsg(String r, int p1) { + return "Failed: Incorrect color for " + r + " pixel: got " + Integer.toHexString(p1); + } + + static void saveImage(BufferedImage img) { + try { + File file = new File("capture.png"); + ImageIO.write(img, "png", file); + } catch (Exception e) { + e.printStackTrace(); + } + } +} From 1ea8cfa6dc8e6f96fd87553331abaae17ec173ea Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Tue, 7 Oct 2025 16:54:36 +0000 Subject: [PATCH 010/561] 8369226: GHA: Switch to MacOS 15 Reviewed-by: erikj, ayang, sgehwolf --- .github/workflows/main.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0d8663fab1a..4d1e8a8be3d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -327,8 +327,8 @@ jobs: uses: ./.github/workflows/build-macos.yml with: platform: macos-x64 - runs-on: 'macos-13' - xcode-toolset-version: '14.3.1' + runs-on: 'macos-15-intel' + xcode-toolset-version: '16.4' configure-arguments: ${{ github.event.inputs.configure-arguments }} make-arguments: ${{ github.event.inputs.make-arguments }} dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }} @@ -340,8 +340,8 @@ jobs: uses: ./.github/workflows/build-macos.yml with: platform: macos-aarch64 - runs-on: 'macos-14' - xcode-toolset-version: '15.4' + runs-on: 'macos-15' + xcode-toolset-version: '16.4' configure-arguments: ${{ github.event.inputs.configure-arguments }} make-arguments: ${{ github.event.inputs.make-arguments }} dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }} @@ -432,9 +432,9 @@ jobs: with: platform: macos-aarch64 bootjdk-platform: macos-aarch64 - runs-on: macos-14 + runs-on: macos-15 dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }} - xcode-toolset-version: '15.4' + xcode-toolset-version: '16.4' debug-suffix: -debug test-windows-x64: From 6b3162620bd808227ec7b4331ae6fc32ceb909e8 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Tue, 7 Oct 2025 17:21:13 +0000 Subject: [PATCH 011/561] 8368845: x-IBM930 uses incorrect character for Hex 42 60 Reviewed-by: sherman, rriggs, iris --- make/data/charsetmapping/IBM930.c2b | 5 ----- make/data/charsetmapping/IBM930.map | 10 +--------- test/jdk/sun/nio/cs/mapping/CoderTest.java | 4 ++-- test/jdk/sun/nio/cs/mapping/ConverterTest.java | 5 +++-- test/jdk/sun/nio/cs/mapping/Cp930.b2c | 2 +- test/jdk/sun/nio/cs/mapping/TestConv.java | 4 ++-- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/make/data/charsetmapping/IBM930.c2b b/make/data/charsetmapping/IBM930.c2b index 88754763fe3..72107424104 100644 --- a/make/data/charsetmapping/IBM930.c2b +++ b/make/data/charsetmapping/IBM930.c2b @@ -32,11 +32,6 @@ 547d 92ca 53da 9b7e 446e f86f -# -# we should use this one instead of the 4260<-ff0d -#4260 2212 -4260 ff0d -# 426A 00A6 43A1 301C 444A 2014 diff --git a/make/data/charsetmapping/IBM930.map b/make/data/charsetmapping/IBM930.map index 4b9dad9526b..7939e795bdf 100644 --- a/make/data/charsetmapping/IBM930.map +++ b/make/data/charsetmapping/IBM930.map @@ -25,13 +25,6 @@ # 4260 <--> 2212 # 426A <--> 00A6 # -# Warning: -# "our old" implementation seems agree with above "new" mappings -# except the entries 4260 <-> 2212. To keep the "compatbility" -# with the "old" implementation, I changed the entries "temporarily" -# 4260 <-> 2212 -# 4260 <- ff0d -# 00 0000 01 0001 02 0002 @@ -407,8 +400,7 @@ FF 009F 425D FF09 425E FF1B 425F FFE2 -#4260 FF0D -4260 2212 +4260 FF0D 4261 FF0F 426A FFE4 426B FF0C diff --git a/test/jdk/sun/nio/cs/mapping/CoderTest.java b/test/jdk/sun/nio/cs/mapping/CoderTest.java index 05913a40535..2f766736743 100644 --- a/test/jdk/sun/nio/cs/mapping/CoderTest.java +++ b/test/jdk/sun/nio/cs/mapping/CoderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -22,7 +22,7 @@ */ /* @test - @bug 4691554 6221056 6380723 6404504 6419565 6529796 8301119 + @bug 4691554 6221056 6380723 6404504 6419565 6529796 8301119 8368845 @summary Test the supported New I/O coders @modules jdk.charsets @run main CoderTest diff --git a/test/jdk/sun/nio/cs/mapping/ConverterTest.java b/test/jdk/sun/nio/cs/mapping/ConverterTest.java index be8df03230c..8d33670b0a5 100644 --- a/test/jdk/sun/nio/cs/mapping/ConverterTest.java +++ b/test/jdk/sun/nio/cs/mapping/ConverterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -26,7 +26,8 @@ * @summary test Bug 4199484 * @modules jdk.charsets * @run main ConverterTest - * @bug 4199484 4199599 4199601 4199602 4159519 4201529 4199604 4201532 4947038 6217210 + * @bug 4199484 4199599 4199601 4199602 4159519 4201529 4199604 4201532 4947038 + * 6217210 8368845 */ import java.util.*; diff --git a/test/jdk/sun/nio/cs/mapping/Cp930.b2c b/test/jdk/sun/nio/cs/mapping/Cp930.b2c index 67cc93fd628..3cd45375e2d 100644 --- a/test/jdk/sun/nio/cs/mapping/Cp930.b2c +++ b/test/jdk/sun/nio/cs/mapping/Cp930.b2c @@ -340,7 +340,7 @@ F9 0039 0E425D0F FF09 0E425E0F FF1B 0E425F0F FFE2 -0E42600F 2212 +0E42600F FF0D 0E42610F FF0F 0E426A0F FFE4 0E426B0F FF0C diff --git a/test/jdk/sun/nio/cs/mapping/TestConv.java b/test/jdk/sun/nio/cs/mapping/TestConv.java index 2f4ea424f6c..3bd0b15a7d3 100644 --- a/test/jdk/sun/nio/cs/mapping/TestConv.java +++ b/test/jdk/sun/nio/cs/mapping/TestConv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -22,7 +22,7 @@ */ /* @test - @bug 4179153 4652234 6529796 + @bug 4179153 4652234 6529796 8368845 @summary Read code mapping table and check code conversion @modules jdk.charsets */ From 7f070d356c479ae30fe84fcf4d322c0b693fa15a Mon Sep 17 00:00:00 2001 From: Mikael Vidstedt Date: Tue, 7 Oct 2025 17:37:31 +0000 Subject: [PATCH 012/561] 8369246: Use https in make/devkit scripts Reviewed-by: ayang, erikj --- make/devkit/Tools.gmk | 10 +++++----- make/devkit/createAutoconfBundle.sh | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/make/devkit/Tools.gmk b/make/devkit/Tools.gmk index 6241674071c..f6ea6749f48 100644 --- a/make/devkit/Tools.gmk +++ b/make/devkit/Tools.gmk @@ -117,13 +117,13 @@ dependencies := gcc binutils ccache mpfr gmp mpc gdb $(foreach dep,$(dependencies),$(eval $(dep)_ver := $(dep)-$($(dep)_ver_only))) -GCC_URL := http://ftp.gnu.org/pub/gnu/gcc/$(gcc_ver)/$(gcc_ver).tar.xz -BINUTILS_URL := http://ftp.gnu.org/pub/gnu/binutils/$(binutils_ver).tar.gz +GCC_URL := https://ftp.gnu.org/pub/gnu/gcc/$(gcc_ver)/$(gcc_ver).tar.xz +BINUTILS_URL := https://ftp.gnu.org/pub/gnu/binutils/$(binutils_ver).tar.gz CCACHE_URL := https://github.com/ccache/ccache/releases/download/v$(ccache_ver_only)/$(ccache_ver).tar.xz MPFR_URL := https://www.mpfr.org/$(mpfr_ver)/$(mpfr_ver).tar.bz2 -GMP_URL := http://ftp.gnu.org/pub/gnu/gmp/$(gmp_ver).tar.bz2 -MPC_URL := http://ftp.gnu.org/pub/gnu/mpc/$(mpc_ver).tar.gz -GDB_URL := http://ftp.gnu.org/gnu/gdb/$(gdb_ver).tar.xz +GMP_URL := https://ftp.gnu.org/pub/gnu/gmp/$(gmp_ver).tar.bz2 +MPC_URL := https://ftp.gnu.org/pub/gnu/mpc/$(mpc_ver).tar.gz +GDB_URL := https://ftp.gnu.org/gnu/gdb/$(gdb_ver).tar.xz REQUIRED_MIN_MAKE_MAJOR_VERSION := 4 ifneq ($(REQUIRED_MIN_MAKE_MAJOR_VERSION),) diff --git a/make/devkit/createAutoconfBundle.sh b/make/devkit/createAutoconfBundle.sh index ebe9c427f76..4697e4eb1e3 100644 --- a/make/devkit/createAutoconfBundle.sh +++ b/make/devkit/createAutoconfBundle.sh @@ -93,7 +93,7 @@ elif test "x$TARGET_PLATFORM" = xlinux_x64; then rpm2cpio $OUTPUT_ROOT/m4-$M4_VERSION.el6.x86_64.rpm | cpio -d -i elif test "x$TARGET_PLATFORM" = xlinux_x86; then M4_VERSION=1.4.13-5 - wget http://yum.oracle.com/repo/OracleLinux/OL6/latest/i386/getPackage/m4-$M4_VERSION.el6.i686.rpm + wget https://yum.oracle.com/repo/OracleLinux/OL6/latest/i386/getPackage/m4-$M4_VERSION.el6.i686.rpm cd $IMAGE_DIR rpm2cpio $OUTPUT_ROOT/m4-$M4_VERSION.el6.i686.rpm | cpio -d -i else From 6bfd018beaf187940ebafc71885045b4aabca673 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 7 Oct 2025 19:08:22 +0000 Subject: [PATCH 013/561] 8366002: Beans.instantiate needs to describe the lookup procedure Reviewed-by: serb, aivanov --- .../share/classes/java/beans/Beans.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/java.desktop/share/classes/java/beans/Beans.java b/src/java.desktop/share/classes/java/beans/Beans.java index 313bfe98515..a95aeb45cbb 100644 --- a/src/java.desktop/share/classes/java/beans/Beans.java +++ b/src/java.desktop/share/classes/java/beans/Beans.java @@ -64,6 +64,22 @@ public class Beans { *

    * Instantiate a JavaBean. *

    + * The bean is created based on a name relative to a class-loader. + * This name should be a {@linkplain ClassLoader##binary-name binary name} of a class such as "a.b.C". + *

    + * The given name can indicate either a serialized object or a class. + * We first try to treat the {@code beanName} as a serialized object + * name then as a class name. + *

    + * When using the {@code beanName} as a serialized object name we convert the + * given {@code beanName} to a resource pathname and add a trailing ".ser" suffix. + * We then try to load a serialized object from that resource. + *

    + * For example, given a {@code beanName} of "x.y", {@code Beans.instantiate} would first + * try to read a serialized object from the resource "x/y.ser" and if + * that failed it would try to load the class "x.y" and create an + * instance of that class. + * * @return a JavaBean * @param cls the class-loader from which we should create * the bean. If this is null, then the system @@ -84,6 +100,22 @@ public class Beans { *

    * Instantiate a JavaBean. *

    + * The bean is created based on a name relative to a class-loader. + * This name should be a {@linkplain ClassLoader##binary-name binary name} of a class such as "a.b.C". + *

    + * The given name can indicate either a serialized object or a class. + * We first try to treat the {@code beanName} as a serialized object + * name then as a class name. + *

    + * When using the {@code beanName} as a serialized object name we convert the + * given {@code beanName} to a resource pathname and add a trailing ".ser" suffix. + * We then try to load a serialized object from that resource. + *

    + * For example, given a {@code beanName} of "x.y", {@code Beans.instantiate} would first + * try to read a serialized object from the resource "x/y.ser" and if + * that failed it would try to load the class "x.y" and create an + * instance of that class. + * * @return a JavaBean * * @param cls the class-loader from which we should create From 910bb68e5191f830ff6f3dff5753e4e5f6214a7b Mon Sep 17 00:00:00 2001 From: Archie Cobbs Date: Tue, 7 Oct 2025 19:32:08 +0000 Subject: [PATCH 014/561] 8349847: Support configuring individual lint categories as errors Reviewed-by: vromero --- .../com/sun/tools/javac/code/Lint.java | 29 +---- .../sun/tools/javac/main/JavaCompiler.java | 23 +++- .../com/sun/tools/javac/main/Option.java | 18 +++ .../JavacProcessingEnvironment.java | 2 +- .../tools/javac/resources/javac.properties | 10 +- .../classes/com/sun/tools/javac/util/Log.java | 30 ++++- .../com/sun/tools/javac/util/Options.java | 113 ++++++++++++++---- src/jdk.compiler/share/man/javac.md | 13 +- .../tools/javac/warnings/WerrorLint.e1.out | 4 + .../tools/javac/warnings/WerrorLint.e2.out | 5 + .../tools/javac/warnings/WerrorLint.java | 23 ++++ .../tools/javac/warnings/WerrorLint.w1.out | 2 + .../tools/javac/warnings/WerrorLint.w2.out | 3 + 13 files changed, 214 insertions(+), 61 deletions(-) create mode 100644 test/langtools/tools/javac/warnings/WerrorLint.e1.out create mode 100644 test/langtools/tools/javac/warnings/WerrorLint.e2.out create mode 100644 test/langtools/tools/javac/warnings/WerrorLint.java create mode 100644 test/langtools/tools/javac/warnings/WerrorLint.w1.out create mode 100644 test/langtools/tools/javac/warnings/WerrorLint.w2.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Lint.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Lint.java index 88c9da5d9e8..3a8b4e5dbea 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Lint.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Lint.java @@ -147,33 +147,10 @@ public class Lint { // Process command line options on demand to allow use of root Lint early during startup private void initializeRootIfNeeded() { - - // Already initialized? - if (values != null) - return; - - // Initialize enabled categories based on "-Xlint" flags - if (options.isSet(Option.XLINT) || options.isSet(Option.XLINT_CUSTOM, Option.LINT_CUSTOM_ALL)) { - // If -Xlint or -Xlint:all is given, enable all categories by default - values = EnumSet.allOf(LintCategory.class); - } else if (options.isSet(Option.XLINT_CUSTOM, Option.LINT_CUSTOM_NONE)) { - // if -Xlint:none is given, disable all categories by default - values = LintCategory.newEmptySet(); - } else { - // otherwise, enable on-by-default categories - values = getDefaults(); + if (values == null) { + values = options.getLintCategoriesOf(Option.XLINT, this::getDefaults); + suppressedValues = LintCategory.newEmptySet(); } - - // Look for specific overrides - for (LintCategory lc : LintCategory.values()) { - if (options.isLintExplicitlyEnabled(lc)) { - values.add(lc); - } else if (options.isLintExplicitlyDisabled(lc)) { - values.remove(lc); - } - } - - suppressedValues = LintCategory.newEmptySet(); } // Obtain the set of on-by-default categories. Note that for a few categories, diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java index ee11304dce9..2469dc9e031 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -31,6 +31,7 @@ import java.nio.file.InvalidPathException; import java.nio.file.ReadOnlyFileSystemException; import java.util.Collection; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -55,6 +56,7 @@ import javax.tools.StandardLocation; import com.sun.source.util.TaskEvent; import com.sun.tools.javac.api.MultiTaskListener; import com.sun.tools.javac.code.*; +import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Source.Feature; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.CompletionFailure; @@ -440,7 +442,8 @@ public class JavaCompiler { context.get(DiagnosticListener.class) != null; devVerbose = options.isSet("dev"); processPcks = options.isSet("process.packages"); - werror = options.isSet(WERROR); + werrorAny = options.isSet(WERROR) || options.isSet(WERROR_CUSTOM, Option.LINT_CUSTOM_ALL); + werrorLint = options.getLintCategoriesOf(WERROR, LintCategory::newEmptySet); verboseCompilePolicy = options.isSet("verboseCompilePolicy"); @@ -513,9 +516,13 @@ public class JavaCompiler { */ protected boolean processPcks; - /** Switch: treat warnings as errors + /** Switch: treat any kind of warning (lint or non-lint) as an error. */ - protected boolean werror; + protected boolean werrorAny; + + /** Switch: treat lint warnings in the specified {@link LintCategory}s as errors. + */ + protected EnumSet werrorLint; /** Switch: is annotation processing requested explicitly via * CompilationTask.setProcessors? @@ -581,12 +588,20 @@ public class JavaCompiler { */ public int errorCount() { log.reportOutstandingWarnings(); - if (werror && log.nerrors == 0 && log.nwarnings > 0) { + if (log.nerrors == 0 && log.nwarnings > 0 && + (werrorAny || werrorLint.clone().removeAll(log.lintWarnings))) { log.error(Errors.WarningsAndWerror); } return log.nerrors; } + /** + * Should warnings in the given lint category be treated as errors due to a {@code -Werror} flag? + */ + public boolean isWerror(LintCategory lc) { + return werrorAny || werrorLint.contains(lc); + } + protected final Queue stopIfError(CompileState cs, Queue queue) { return shouldStop(cs) ? new ListBuffer() : queue; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java index 8d5ad4c4d78..c14767a7a8c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java @@ -563,6 +563,8 @@ public enum Option { // treat warnings as errors WERROR("-Werror", "opt.Werror", STANDARD, BASIC), + WERROR_CUSTOM("-Werror:", "opt.arg.Werror", "opt.Werror.custom", STANDARD, BASIC, ANYOF, getXLintChoices()), + // prompt after each error // new Option("-prompt", "opt.prompt"), PROMPT("-prompt", null, HIDDEN, BASIC), @@ -1132,6 +1134,22 @@ public enum Option { return Option.valueOf(name() + "_CUSTOM"); } + /** + * Like {@link #getCustom} but also requires that the custom option supports lint categories. + * + *

    + * In practice, that means {@code option} must be {@link Option#LINT} or {@link Option#WERROR}. + * + * @param option regular option + * @return corresponding lint custom option + * @throws IllegalArgumentException if no such option exists + */ + public Option getLintCustom() { + if (this == XLINT || this == WERROR) + return getCustom(); + throw new IllegalArgumentException(); + } + public boolean isInBasicOptionGroup() { return group == BASIC; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index b28f19bd3af..74d082d4b64 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -211,7 +211,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea } fatalErrors = options.isSet("fatalEnterError"); showResolveErrors = options.isSet("showResolveErrors"); - werror = options.isSet(Option.WERROR); + werror = compiler.isWerror(PROCESSING); fileManager = context.get(JavaFileManager.class); platformAnnotations = initPlatformAnnotations(); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties index 15a63da06eb..6d4276c794b 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties @@ -95,7 +95,13 @@ javac.opt.source=\ Provide source compatibility with the specified Java SE release.\n\ Supported releases: \n {0} javac.opt.Werror=\ - Terminate compilation if warnings occur + Terminate compilation if any warnings occur +javac.opt.arg.Werror=\ + (,)* +javac.opt.Werror.custom=\ + Specify lint categories for which warnings should terminate compilation,\n\ + separated by comma. Precede a key by ''-'' to exclude the specified category.\n\ + Use --help-lint to see the supported keys. javac.opt.A=\ Options to pass to annotation processors javac.opt.implicit=\ @@ -330,7 +336,7 @@ javac.opt.X=\ javac.opt.help=\ Print this help message javac.opt.help.lint=\ - Print the supported keys for -Xlint + Print the supported keys for -Xlint and -Werror javac.opt.help.lint.header=\ The supported keys for -Xlint are: javac.opt.help.lint.enabled.by.default=\ diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java index 95458f339a1..24a77a751fd 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java @@ -171,7 +171,7 @@ public class Log extends AbstractLog { lint.isEnabled(category) : // then emit if the category is enabled category.annotationSuppression ? // else emit if the category is not suppressed, where !lint.isSuppressed(category) : // ...suppression happens via @SuppressWarnings - !options.isLintDisabled(category); // ...suppression happens via -Xlint:-category + !options.isDisabled(Option.XLINT, category); // ...suppression happens via -Xlint:-category if (!emit) return; } @@ -553,10 +553,14 @@ public class Log extends AbstractLog { */ public int nerrors = 0; - /** The number of warnings encountered so far. + /** The total number of warnings encountered so far. */ public int nwarnings = 0; + /** Tracks whether any warnings have been encountered in each {@link LintCategory}. + */ + public final EnumSet lintWarnings = LintCategory.newEmptySet(); + /** The number of errors encountered after MaxErrors was reached. */ public int nsuppressederrors = 0; @@ -885,6 +889,7 @@ public class Log extends AbstractLog { public void clear() { recorded.clear(); sourceMap.clear(); + lintWarnings.clear(); nerrors = 0; nwarnings = 0; nsuppressederrors = 0; @@ -940,7 +945,6 @@ public class Log extends AbstractLog { // Strict warnings are always emitted if (diagnostic.isFlagSet(STRICT)) { writeDiagnostic(diagnostic); - nwarnings++; return; } @@ -948,7 +952,6 @@ public class Log extends AbstractLog { if (emitWarnings || diagnostic.isMandatory()) { if (nwarnings < MaxWarnings) { writeDiagnostic(diagnostic); - nwarnings++; } else { nsuppressedwarns++; } @@ -959,7 +962,6 @@ public class Log extends AbstractLog { if (diagnostic.isFlagSet(API) || shouldReport(diagnostic)) { if (nerrors < MaxErrors) { writeDiagnostic(diagnostic); - nerrors++; } else { nsuppressederrors++; } @@ -973,9 +975,25 @@ public class Log extends AbstractLog { } /** - * Write out a diagnostic. + * Write out a diagnostic and bump the warning and error counters as needed. */ protected void writeDiagnostic(JCDiagnostic diag) { + + // Increment counter(s) + switch (diag.getType()) { + case WARNING: + nwarnings++; + Optional.of(diag) + .map(JCDiagnostic::getLintCategory) + .ifPresent(lintWarnings::add); + break; + case ERROR: + nerrors++; + break; + default: + break; + } + if (diagListener != null) { diagListener.report(diag); return; diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Options.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Options.java index 32a31028b68..030e5b21758 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Options.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Options.java @@ -173,66 +173,139 @@ public class Options { /** * Determine if a specific {@link LintCategory} is enabled via a custom - * option flag of the form {@code -Xlint}, {@code -Xlint:all}, or {@code -Xlint:key}. + * option flag of the form {@code -Flag}, {@code -Flag:all}, or {@code -Flag:key}. + * + *

    + * The given {@code option} must have a custom lint variant (available via {@link Option#getLintCustom}). * *

    * Note: It's possible the category was also disabled; this method does not check that. * + * @param option the plain (non-custom) version of the option (e.g., {@link Option#XLINT}) * @param lc the {@link LintCategory} in question - * @return true if {@code lc} has been enabled + * @return true if {@code lc} is enabled via {@code option}'s lint custom variant (e.g., {@link Option#XLINT_CUSTOM}) + * @throws IllegalArgumentException if there is no lint custom variant of {@code option} */ - public boolean isLintEnabled(LintCategory lc) { - return isLintExplicitlyEnabled(lc) || - isSet(Option.XLINT_CUSTOM) || - isSet(Option.XLINT_CUSTOM, Option.LINT_CUSTOM_ALL); + public boolean isEnabled(Option option, LintCategory lc) { + Option custom = option.getLintCustom(); + return isExplicitlyEnabled(option, lc) || isSet(custom) || isSet(custom, Option.LINT_CUSTOM_ALL); } /** * Determine if a specific {@link LintCategory} is disabled via a custom - * option flag of the form {@code -Xlint:none} or {@code -Xlint:-key}. + * option flag of the form {@code -Flag:none} or {@code -Flag:-key}. + * + *

    + * The given {@code option} must have a custom lint variant (available via {@link Option#getLintCustom}). * *

    * Note: It's possible the category was also enabled; this method does not check that. * + * @param option the plain (non-custom) version of the option (e.g., {@link Option#XLINT}) * @param lc the {@link LintCategory} in question - * @return true if {@code lc} has been disabled + * @return true if {@code lc} is disabled via {@code option}'s lint custom variant (e.g., {@link Option#XLINT_CUSTOM}) + * @throws IllegalArgumentException if there is no lint custom variant of {@code option} */ - public boolean isLintDisabled(LintCategory lc) { - return isLintExplicitlyDisabled(lc) || isSet(Option.XLINT_CUSTOM, Option.LINT_CUSTOM_NONE); + public boolean isDisabled(Option option, LintCategory lc) { + return isExplicitlyDisabled(option, lc) || isSet(option.getLintCustom(), Option.LINT_CUSTOM_NONE); } /** * Determine if a specific {@link LintCategory} is explicitly enabled via a custom - * option flag of the form {@code -Xlint:key}. + * option flag of the form {@code -Flag:key}. * *

    - * Note: This does not check for option flags of the form {@code -Xlint} or {@code -Xlint:all}. + * The given {@code option} must have a custom lint variant (available via {@link Option#getLintCustom}). + * + *

    + * Note: This does not check for option flags of the form {@code -Flag} or {@code -Flag:all}. * *

    * Note: It's possible the category was also disabled; this method does not check that. * + * @param option the plain (non-custom) version of the option (e.g., {@link Option#XLINT}) * @param lc the {@link LintCategory} in question - * @return true if {@code lc} has been explicitly enabled + * @return true if {@code lc} is explicitly enabled via {@code option}'s lint custom variant (e.g., {@link Option#XLINT_CUSTOM}) + * @throws IllegalArgumentException if there is no lint custom variant of {@code option} */ - public boolean isLintExplicitlyEnabled(LintCategory lc) { - return lc.optionList.stream().anyMatch(alias -> isSet(Option.XLINT_CUSTOM, alias)); + public boolean isExplicitlyEnabled(Option option, LintCategory lc) { + Option customOption = option.getLintCustom(); + return lc.optionList.stream().anyMatch(alias -> isSet(customOption, alias)); } /** * Determine if a specific {@link LintCategory} is explicitly disabled via a custom - * option flag of the form {@code -Xlint:-key}. + * option flag of the form {@code -Flag:-key}. * *

    - * Note: This does not check for an option flag of the form {@code -Xlint:none}. + * The given {@code option} must have a custom lint variant (available via {@link Option#getLintCustom}). + * + *

    + * Note: This does not check for an option flag of the form {@code -Flag:none}. * *

    * Note: It's possible the category was also enabled; this method does not check that. * + * @param option the plain (non-custom) version of the option (e.g., {@link Option#XLINT}) * @param lc the {@link LintCategory} in question - * @return true if {@code lc} has been explicitly disabled + * @return true if {@code lc} is explicitly disabled via {@code option}'s lint custom variant (e.g., {@link Option#XLINT_CUSTOM}) + * @throws IllegalArgumentException if there is no lint custom variant of {@code option} */ - public boolean isLintExplicitlyDisabled(LintCategory lc) { - return lc.optionList.stream().anyMatch(alias -> isSet(Option.XLINT_CUSTOM, "-" + alias)); + public boolean isExplicitlyDisabled(Option option, LintCategory lc) { + Option customOption = option.getLintCustom(); + return lc.optionList.stream().anyMatch(alias -> isSet(customOption, "-" + alias)); + } + + /** + * Collect the set of {@link LintCategory}s specified by option flag(s) of the form + * {@code -Flag} and/or {@code -Flag:[-]key,[-]key,...}. + * + *

    + * The given {@code option} must have a custom lint variant (available via {@link Option#getLintCustom}). + * + *

    + * The set of categories is calculated as follows. First, an initial set is created: + *

      + *
    • If {@code -Flag} or {@code -Flag:all} appears, the initial set contains all categories; otherwise, + *
    • If {@code -Flag:none} appears, the initial set is empty; otherwise, + *
    • The {@code defaults} parameter is invoked to construct an initial set. + *
    + * Next, for each lint category key {@code key}: + *
      + *
    • If {@code -Flag:key} flag appears, the corresponding category is added to the set; otherwise + *
    • If {@code -Flag:-key} flag appears, the corresponding category is removed to the set + *
    + * Unrecognized {@code key}s are ignored. + * + * @param option the plain (non-custom) version of the option (e.g., {@link Option#XLINT}) + * @param defaults populates the default set, or null for an empty default set + * @return the specified set of categories + * @throws IllegalArgumentException if there is no lint custom variant of {@code option} + */ + public EnumSet getLintCategoriesOf(Option option, Supplier> defaults) { + + // Create the initial set + EnumSet categories; + Option customOption = option.getLintCustom(); + if (isSet(option) || isSet(customOption, Option.LINT_CUSTOM_ALL)) { + categories = EnumSet.allOf(LintCategory.class); + } else if (isSet(customOption, Option.LINT_CUSTOM_NONE)) { + categories = EnumSet.noneOf(LintCategory.class); + } else { + categories = defaults.get(); + } + + // Apply specific overrides + for (LintCategory category : LintCategory.values()) { + if (isExplicitlyEnabled(option, category)) { + categories.add(category); + } else if (isExplicitlyDisabled(option, category)) { + categories.remove(category); + } + } + + // Done + return categories; } public void put(String name, String value) { diff --git a/src/jdk.compiler/share/man/javac.md b/src/jdk.compiler/share/man/javac.md index b8243cc78fb..46246624e53 100644 --- a/src/jdk.compiler/share/man/javac.md +++ b/src/jdk.compiler/share/man/javac.md @@ -1,5 +1,5 @@ --- -# Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1994, 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 @@ -448,7 +448,16 @@ file system locations may be directories, JAR files or JMOD files. : Prints version information. `-Werror` -: Terminates compilation when warnings occur. +: Terminates compilation when any warnings occur; this includes warnings in all lint + categories, as well as non-lint warnings. + +`-Werror:`\[`-`\]*key*(`,`\[`-`\]*key*)\* +: Specify lint categories for which warnings should terminate compilation. The keys + `all` and `none` include or exclude all categories (respectively); other keys include + the corresponding category, or exclude it if preceded by a hyphen (`-`). By default, + no categories are included. In order to terminate compilation, the category must also + be enabled (via [`-Xlint`](#option-Xlint-custom), if necessary). + See [`-Xlint`](#option-Xlint-custom) below for the list of lint category keys. ### Extra Options diff --git a/test/langtools/tools/javac/warnings/WerrorLint.e1.out b/test/langtools/tools/javac/warnings/WerrorLint.e1.out new file mode 100644 index 00000000000..ae99cfa5056 --- /dev/null +++ b/test/langtools/tools/javac/warnings/WerrorLint.e1.out @@ -0,0 +1,4 @@ +WerrorLint.java:20:19: compiler.warn.strictfp +- compiler.err.warnings.and.werror +1 error +1 warning diff --git a/test/langtools/tools/javac/warnings/WerrorLint.e2.out b/test/langtools/tools/javac/warnings/WerrorLint.e2.out new file mode 100644 index 00000000000..1c9bd4d54f8 --- /dev/null +++ b/test/langtools/tools/javac/warnings/WerrorLint.e2.out @@ -0,0 +1,5 @@ +WerrorLint.java:20:19: compiler.warn.strictfp +WerrorLint.java:21:30: compiler.warn.empty.if +- compiler.err.warnings.and.werror +1 error +2 warnings diff --git a/test/langtools/tools/javac/warnings/WerrorLint.java b/test/langtools/tools/javac/warnings/WerrorLint.java new file mode 100644 index 00000000000..3331a664d55 --- /dev/null +++ b/test/langtools/tools/javac/warnings/WerrorLint.java @@ -0,0 +1,23 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8349847 + * + * @compile -XDrawDiagnostics -Xlint:none WerrorLint.java + * @compile -XDrawDiagnostics -Xlint:none -Werror WerrorLint.java + * @compile -XDrawDiagnostics -Xlint:none -Werror:empty WerrorLint.java + * @compile -XDrawDiagnostics -Xlint:none -Werror:strictfp WerrorLint.java + * @compile/ref=WerrorLint.w2.out -XDrawDiagnostics -Xlint:all WerrorLint.java + * @compile/fail/ref=WerrorLint.e2.out -XDrawDiagnostics -Xlint:all -Werror WerrorLint.java + * @compile/fail/ref=WerrorLint.e2.out -XDrawDiagnostics -Xlint:all -Werror:empty WerrorLint.java + * @compile/fail/ref=WerrorLint.e2.out -XDrawDiagnostics -Xlint:all -Werror:strictfp WerrorLint.java + * @compile/ref=WerrorLint.w1.out -XDrawDiagnostics WerrorLint.java + * @compile/fail/ref=WerrorLint.e1.out -XDrawDiagnostics -Werror WerrorLint.java + * @compile/ref=WerrorLint.w1.out -XDrawDiagnostics -Werror:empty WerrorLint.java + * @compile/fail/ref=WerrorLint.e1.out -XDrawDiagnostics -Werror:strictfp WerrorLint.java + */ + +class WerrorLint { + strictfp void m() { // [strictfp] - this category is enabled by default + if (hashCode() == 1) ; // [empty] - this category is disabled by default + } +} diff --git a/test/langtools/tools/javac/warnings/WerrorLint.w1.out b/test/langtools/tools/javac/warnings/WerrorLint.w1.out new file mode 100644 index 00000000000..3e19de51033 --- /dev/null +++ b/test/langtools/tools/javac/warnings/WerrorLint.w1.out @@ -0,0 +1,2 @@ +WerrorLint.java:20:19: compiler.warn.strictfp +1 warning diff --git a/test/langtools/tools/javac/warnings/WerrorLint.w2.out b/test/langtools/tools/javac/warnings/WerrorLint.w2.out new file mode 100644 index 00000000000..bac258706a6 --- /dev/null +++ b/test/langtools/tools/javac/warnings/WerrorLint.w2.out @@ -0,0 +1,3 @@ +WerrorLint.java:20:19: compiler.warn.strictfp +WerrorLint.java:21:30: compiler.warn.empty.if +2 warnings From 4ee6079b11034e7de8be72cd2832fb717c2f140d Mon Sep 17 00:00:00 2001 From: Mikael Vidstedt Date: Wed, 8 Oct 2025 02:05:20 +0000 Subject: [PATCH 015/561] 8369328: Use uppercase variable names in the devkit makefiles Reviewed-by: erikj --- make/devkit/Makefile | 50 +++++++-------- make/devkit/Tools.gmk | 146 +++++++++++++++++++++--------------------- 2 files changed, 98 insertions(+), 98 deletions(-) diff --git a/make/devkit/Makefile b/make/devkit/Makefile index ffa23508a13..30e0dce0839 100644 --- a/make/devkit/Makefile +++ b/make/devkit/Makefile @@ -57,61 +57,61 @@ COMMA := , -os := $(shell uname -o) -cpu := $(shell uname -m) +OS := $(shell uname -o) +CPU := $(shell uname -m) # Figure out what platform this is building on. -me := $(cpu)-$(if $(findstring Linux,$(os)),linux-gnu) +ME := $(CPU)-$(if $(findstring Linux,$(OS)),linux-gnu) -$(info Building on platform $(me)) +$(info Building on platform $(ME)) # # By default just build for the current platform, which is assumed to be Linux # ifeq ($(TARGETS), ) - platforms := $(me) - host_platforms := $(platforms) + PLATFORMS := $(ME) + HOST_PLATFORMS := $(PLATFORMS) else - platforms := $(subst $(COMMA), , $(TARGETS)) - host_platforms := $(me) + PLATFORMS := $(subst $(COMMA), , $(TARGETS)) + HOST_PLATFORMS := $(ME) endif -target_platforms := $(platforms) -$(info host_platforms $(host_platforms)) -$(info target_platforms $(target_platforms)) +TARGET_PLATFORMS := $(PLATFORMS) +$(info HOST_PLATFORMS $(HOST_PLATFORMS)) +$(info TARGET_PLATFORMS $(TARGET_PLATFORMS)) -all compile : $(platforms) +all compile : $(PLATFORMS) ifeq ($(SKIP_ME), ) - $(foreach p,$(filter-out $(me),$(platforms)),$(eval $(p) : $$(me))) + $(foreach p,$(filter-out $(ME),$(PLATFORMS)),$(eval $(p) : $$(ME))) endif OUTPUT_ROOT = $(abspath ../../build/devkit) RESULT = $(OUTPUT_ROOT)/result -submakevars = HOST=$@ BUILD=$(me) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT) +SUBMAKEVARS = HOST=$@ BUILD=$(ME) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT) -$(host_platforms) : +$(HOST_PLATFORMS) : @echo 'Building compilers for $@' - @echo 'Targets: $(target_platforms)' - for p in $(filter $@, $(target_platforms)) $(filter-out $@, $(target_platforms)); do \ - $(MAKE) -f Tools.gmk download-rpms $(submakevars) \ + @echo 'Targets: $(TARGET_PLATFORMS)' + for p in $(filter $@, $(TARGET_PLATFORMS)) $(filter-out $@, $(TARGET_PLATFORMS)); do \ + $(MAKE) -f Tools.gmk download-rpms $(SUBMAKEVARS) \ TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \ - $(MAKE) -f Tools.gmk all $(submakevars) \ + $(MAKE) -f Tools.gmk all $(SUBMAKEVARS) \ TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \ - $(MAKE) -f Tools.gmk ccache $(submakevars) \ + $(MAKE) -f Tools.gmk ccache $(SUBMAKEVARS) \ TARGET=$@ PREFIX=$(RESULT)/$@-to-$$p || exit 1 ; \ done @echo 'All done"' -today := $(shell date +%Y%m%d) +TODAY := $(shell date +%Y%m%d) define Mktar - $(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(today).tar.gz + $(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(TODAY).tar.gz $$($(1)-to-$(2)_tar) : PLATFORM = $(1)-to-$(2) TARFILES += $$($(1)-to-$(2)_tar) endef -$(foreach p,$(host_platforms),$(foreach t,$(target_platforms),$(eval $(call Mktar,$(p),$(t))))) +$(foreach p,$(HOST_PLATFORMS),$(foreach t,$(TARGET_PLATFORMS),$(eval $(call Mktar,$(p),$(t))))) tars : all $(TARFILES) onlytars : $(TARFILES) @@ -119,9 +119,9 @@ onlytars : $(TARFILES) $(MAKE) -r -f Tars.gmk SRC_DIR=$(RESULT)/$(PLATFORM) TAR_FILE=$@ clean : - rm -rf $(addprefix ../../build/devkit/, result $(host_platforms)) + rm -rf $(addprefix ../../build/devkit/, result $(HOST_PLATFORMS)) dist-clean: clean rm -rf $(addprefix ../../build/devkit/, src download) FORCE : -.PHONY : all compile tars $(configs) $(host_platforms) clean dist-clean +.PHONY : all compile tars $(HOST_PLATFORMS) clean dist-clean diff --git a/make/devkit/Tools.gmk b/make/devkit/Tools.gmk index f6ea6749f48..77a201d0c38 100644 --- a/make/devkit/Tools.gmk +++ b/make/devkit/Tools.gmk @@ -39,7 +39,7 @@ # Fix this... # -uppercase = $(shell echo $1 | tr a-z A-Z) +lowercase = $(shell echo $1 | tr A-Z a-z) $(info TARGET=$(TARGET)) $(info HOST=$(HOST)) @@ -104,26 +104,26 @@ endif ################################################################################ # Define external dependencies -gcc_ver_only := 14.2.0 -binutils_ver_only := 2.43 -ccache_ver_only := 4.10.2 +GCC_VER_ONLY := 14.2.0 +BINUTILS_VER_ONLY := 2.43 +CCACHE_VER_ONLY := 4.10.2 CCACHE_CMAKE_BASED := 1 -mpfr_ver_only := 4.2.1 -gmp_ver_only := 6.3.0 -mpc_ver_only := 1.3.1 -gdb_ver_only := 15.2 +MPFR_VER_ONLY := 4.2.1 +GMP_VER_ONLY := 6.3.0 +MPC_VER_ONLY := 1.3.1 +GDB_VER_ONLY := 15.2 -dependencies := gcc binutils ccache mpfr gmp mpc gdb +DEPENDENCIES := GCC BINUTILS CCACHE MPFR GMP MPC GDB -$(foreach dep,$(dependencies),$(eval $(dep)_ver := $(dep)-$($(dep)_ver_only))) +$(foreach dep,$(DEPENDENCIES),$(eval $(dep)_VER := $(call lowercase,$(dep)-$($(dep)_VER_ONLY)))) -GCC_URL := https://ftp.gnu.org/pub/gnu/gcc/$(gcc_ver)/$(gcc_ver).tar.xz -BINUTILS_URL := https://ftp.gnu.org/pub/gnu/binutils/$(binutils_ver).tar.gz -CCACHE_URL := https://github.com/ccache/ccache/releases/download/v$(ccache_ver_only)/$(ccache_ver).tar.xz -MPFR_URL := https://www.mpfr.org/$(mpfr_ver)/$(mpfr_ver).tar.bz2 -GMP_URL := https://ftp.gnu.org/pub/gnu/gmp/$(gmp_ver).tar.bz2 -MPC_URL := https://ftp.gnu.org/pub/gnu/mpc/$(mpc_ver).tar.gz -GDB_URL := https://ftp.gnu.org/gnu/gdb/$(gdb_ver).tar.xz +GCC_URL := https://ftp.gnu.org/pub/gnu/gcc/$(GCC_VER)/$(GCC_VER).tar.xz +BINUTILS_URL := https://ftp.gnu.org/pub/gnu/binutils/$(BINUTILS_VER).tar.gz +CCACHE_URL := https://github.com/ccache/ccache/releases/download/v$(CCACHE_VER_ONLY)/$(CCACHE_VER).tar.xz +MPFR_URL := https://www.mpfr.org/$(MPFR_VER)/$(MPFR_VER).tar.bz2 +GMP_URL := https://ftp.gnu.org/pub/gnu/gmp/$(GMP_VER).tar.bz2 +MPC_URL := https://ftp.gnu.org/pub/gnu/mpc/$(MPC_VER).tar.gz +GDB_URL := https://ftp.gnu.org/gnu/gdb/$(GDB_VER).tar.xz REQUIRED_MIN_MAKE_MAJOR_VERSION := 4 ifneq ($(REQUIRED_MIN_MAKE_MAJOR_VERSION),) @@ -180,10 +180,10 @@ DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(LINUX_VERSION) SRCDIR := $(OUTPUT_ROOT)/src # Marker file for unpacking rpms -rpms := $(SYSROOT)/rpms_unpacked +RPMS := $(SYSROOT)/rpms_unpacked # Need to patch libs that are linker scripts to use non-absolute paths -libs := $(SYSROOT)/libs_patched +LIBS := $(SYSROOT)/libs_patched ################################################################################ # Download RPMs @@ -228,7 +228,7 @@ define Download endef # Download and unpack all source packages -$(foreach dep,$(dependencies),$(eval $(call Download,$(call uppercase,$(dep))))) +$(foreach dep,$(DEPENDENCIES),$(eval $(call Download,$(dep)))) ################################################################################ # Unpack RPMS @@ -250,7 +250,7 @@ RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \ # Note. For building linux you should install rpm2cpio. define unrpm $(SYSROOT)/$(notdir $(1)).unpacked : $(1) - $$(rpms) : $(SYSROOT)/$(notdir $(1)).unpacked + $$(RPMS) : $(SYSROOT)/$(notdir $(1)).unpacked endef %.unpacked : @@ -277,7 +277,7 @@ $(foreach p,$(RPM_FILE_LIST),$(eval $(call unrpm,$(p)))) # have it anyway, but just to make sure... # Patch libc.so and libpthread.so to force linking against libraries in sysroot # and not the ones installed on the build machine. -$(libs) : $(rpms) +$(LIBS) : $(RPMS) @echo Patching libc and pthreads @(for f in `find $(SYSROOT) -name libc.so -o -name libpthread.so`; do \ (cat $$f | sed -e 's|/usr/lib64/||g' \ @@ -293,10 +293,10 @@ $(libs) : $(rpms) # Create links for ffi header files so that they become visible by default when using the # devkit. ifeq ($(ARCH), x86_64) - $(SYSROOT)/usr/include/ffi.h: $(rpms) + $(SYSROOT)/usr/include/ffi.h: $(RPMS) cd $(@D) && rm -f $(@F) && ln -s ../lib/libffi-*/include/$(@F) . - $(SYSROOT)/usr/include/ffitarget.h: $(rpms) + $(SYSROOT)/usr/include/ffitarget.h: $(RPMS) cd $(@D) && rm -f $(@F) && ln -s ../lib/libffi-*/include/$(@F) . SYSROOT_LINKS += $(SYSROOT)/usr/include/ffi.h $(SYSROOT)/usr/include/ffitarget.h @@ -305,7 +305,7 @@ endif ################################################################################ # Define marker files for each source package to be compiled -$(foreach dep,$(dependencies),$(eval $(dep) = $(TARGETDIR)/$($(dep)_ver).done)) +$(foreach dep,$(DEPENDENCIES),$(eval $(dep) = $(TARGETDIR)/$($(dep)_VER).done)) ################################################################################ @@ -345,48 +345,48 @@ TOOLS ?= $(call declare_tools,_FOR_TARGET,$(TARGET)-) # CFLAG_ to most likely -m32. define mk_bfd $$(info Libs for $(1)) - $$(BUILDDIR)/$$(binutils_ver)-$(subst /,-,$(1))/Makefile \ + $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile \ : CFLAGS += $$(CFLAGS_$(1)) - $$(BUILDDIR)/$$(binutils_ver)-$(subst /,-,$(1))/Makefile \ + $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile \ : LIBDIRS = --libdir=$(TARGETDIR)/$(1) - bfdlib += $$(TARGETDIR)/$$(binutils_ver)-$(subst /,-,$(1)).done - bfdmakes += $$(BUILDDIR)/$$(binutils_ver)-$(subst /,-,$(1))/Makefile + BFDLIB += $$(TARGETDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1)).done + BFDMAKES += $$(BUILDDIR)/$$(BINUTILS_VER)-$(subst /,-,$(1))/Makefile endef # Create one set of bfds etc for each multilib arch $(foreach l,$(LIBDIRS),$(eval $(call mk_bfd,$(l)))) # Only build these two libs. -$(bfdlib) : MAKECMD = all-libiberty all-bfd -$(bfdlib) : INSTALLCMD = install-libiberty install-bfd +$(BFDLIB) : MAKECMD = all-libiberty all-bfd +$(BFDLIB) : INSTALLCMD = install-libiberty install-bfd # Building targets libbfd + libiberty. HOST==TARGET, i.e not # for a cross env. -$(bfdmakes) : CONFIG = --target=$(TARGET) \ +$(BFDMAKES) : CONFIG = --target=$(TARGET) \ --host=$(TARGET) --build=$(BUILD) \ --prefix=$(TARGETDIR) \ --with-sysroot=$(SYSROOT) \ $(LIBDIRS) -$(bfdmakes) : TOOLS = $(call declare_tools,_FOR_TARGET,$(TARGET)-) $(call declare_tools,,$(TARGET)-) +$(BFDMAKES) : TOOLS = $(call declare_tools,_FOR_TARGET,$(TARGET)-) $(call declare_tools,,$(TARGET)-) ################################################################################ -$(gcc) \ - $(binutils) \ - $(gmp) \ - $(mpfr) \ - $(mpc) \ - $(bfdmakes) \ - $(ccache) : ENVS += $(TOOLS) +$(GCC) \ + $(BINUTILS) \ + $(GMP) \ + $(MPFR) \ + $(MPC) \ + $(BFDMAKES) \ + $(CCACHE) : ENVS += $(TOOLS) # libdir to work around hateful bfd stuff installing into wrong dirs... # ensure we have 64 bit bfd support in the HOST library. I.e our # compiler on i686 will know 64 bit symbols, BUT later # we build just the libs again for TARGET, then with whatever the arch # wants. -$(BUILDDIR)/$(binutils_ver)/Makefile : CONFIG += --enable-64-bit-bfd --libdir=$(PREFIX)/$(word 1,$(LIBDIRS)) +$(BUILDDIR)/$(BINUTILS_VER)/Makefile : CONFIG += --enable-64-bit-bfd --libdir=$(PREFIX)/$(word 1,$(LIBDIRS)) ifeq ($(filter $(ARCH), s390x riscv64 ppc64le), ) # gold compiles but cannot link properly on s390x @ gcc 13.2 and Fedore 41 @@ -397,8 +397,8 @@ endif # Makefile creation. Simply run configure in build dir. # Setting CFLAGS to -O2 generates a much faster ld. -$(bfdmakes) \ -$(BUILDDIR)/$(binutils_ver)/Makefile \ +$(BFDMAKES) \ +$(BUILDDIR)/$(BINUTILS_VER)/Makefile \ : $(BINUTILS_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @@ -417,7 +417,7 @@ $(BUILDDIR)/$(binutils_ver)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(mpfr_ver)/Makefile \ +$(BUILDDIR)/$(MPFR_VER)/Makefile \ : $(MPFR_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @@ -432,7 +432,7 @@ $(BUILDDIR)/$(mpfr_ver)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(gmp_ver)/Makefile \ +$(BUILDDIR)/$(GMP_VER)/Makefile \ : $(GMP_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @@ -449,7 +449,7 @@ $(BUILDDIR)/$(gmp_ver)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -$(BUILDDIR)/$(mpc_ver)/Makefile \ +$(BUILDDIR)/$(MPC_VER)/Makefile \ : $(MPC_CFG) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @@ -468,11 +468,11 @@ $(BUILDDIR)/$(mpc_ver)/Makefile \ # Only valid if glibc target -> linux # proper destructor handling for c++ ifneq (,$(findstring linux,$(TARGET))) - $(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --enable-__cxa_atexit + $(BUILDDIR)/$(GCC_VER)/Makefile : CONFIG += --enable-__cxa_atexit endif ifeq ($(ARCH), armhfp) - $(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard + $(BUILDDIR)/$(GCC_VER)/Makefile : CONFIG += --with-float=hard endif ifneq ($(filter riscv64 ppc64le s390x, $(ARCH)), ) @@ -487,7 +487,7 @@ endif # skip native language. # and link and assemble with the binutils we created # earlier, so --with-gnu* -$(BUILDDIR)/$(gcc_ver)/Makefile \ +$(BUILDDIR)/$(GCC_VER)/Makefile \ : $(GCC_CFG) $(info Configuring $@. Log in $(@D)/log.config) mkdir -p $(@D) @@ -509,17 +509,17 @@ $(BUILDDIR)/$(gcc_ver)/Makefile \ @echo 'done' # need binutils for gcc -$(gcc) : $(binutils) +$(GCC) : $(BINUTILS) # as of 4.3 or so need these for doing config -$(BUILDDIR)/$(gcc_ver)/Makefile : $(gmp) $(mpfr) $(mpc) -$(mpfr) : $(gmp) -$(mpc) : $(gmp) $(mpfr) +$(BUILDDIR)/$(GCC_VER)/Makefile : $(GMP) $(MPFR) $(MPC) +$(MPFR) : $(GMP) +$(MPC) : $(GMP) $(MPFR) ################################################################################ # Build gdb but only where host and target match ifeq ($(HOST), $(TARGET)) - $(BUILDDIR)/$(gdb_ver)/Makefile: $(GDB_CFG) + $(BUILDDIR)/$(GDB_VER)/Makefile: $(GDB_CFG) $(info Configuring $@. Log in $(@D)/log.config) mkdir -p $(@D) ( \ @@ -532,9 +532,9 @@ ifeq ($(HOST), $(TARGET)) ) > $(@D)/log.config 2>&1 @echo 'done' - $(gdb): $(gcc) + $(GDB): $(GCC) else - $(BUILDDIR)/$(gdb_ver)/Makefile: + $(BUILDDIR)/$(GDB_VER)/Makefile: $(info Faking $@, not used when cross-compiling) mkdir -p $(@D) echo "install:" > $@ @@ -543,7 +543,7 @@ endif ################################################################################ # very straightforward. just build a ccache. it is only for host. -$(BUILDDIR)/$(ccache_ver)/Makefile \ +$(BUILDDIR)/$(CCACHE_VER)/Makefile \ : $(CCACHE_SRC_MARKER) $(info Configuring $@. Log in $(@D)/log.config) @mkdir -p $(@D) @@ -554,12 +554,12 @@ $(BUILDDIR)/$(ccache_ver)/Makefile \ ) > $(@D)/log.config 2>&1 @echo 'done' -gccpatch = $(TARGETDIR)/gcc-patched +GCC_PATCHED = $(TARGETDIR)/gcc-patched ################################################################################ # For some reason cpp is not created as a target-compiler ifeq ($(HOST),$(TARGET)) - $(gccpatch) : $(gcc) link_libs + $(GCC_PATCHED) : $(GCC) link_libs @echo -n 'Creating compiler symlinks...' @for f in cpp; do \ if [ ! -e $(PREFIX)/bin/$(TARGET)-$$f ]; \ @@ -587,7 +587,7 @@ ifeq ($(HOST),$(TARGET)) done;) @echo 'done' else - $(gccpatch) : + $(GCC_PATCHED) : @echo 'done' endif @@ -615,7 +615,7 @@ $(PREFIX)/devkit.info: echo '# This file describes to configure how to interpret the contents of this' >> $@ echo '# devkit' >> $@ echo '' >> $@ - echo 'DEVKIT_NAME="$(gcc_ver) - $(LINUX_VERSION)"' >> $@ + echo 'DEVKIT_NAME="$(GCC_VER) - $(LINUX_VERSION)"' >> $@ echo 'DEVKIT_TOOLCHAIN_PATH="$$DEVKIT_ROOT/bin"' >> $@ echo 'DEVKIT_SYSROOT="$$DEVKIT_ROOT/$(TARGET)/sysroot"' >> $@ echo 'DEVKIT_EXTRA_PATH="$$DEVKIT_ROOT/bin"' >> $@ @@ -651,32 +651,32 @@ ifeq ($(TARGET), $(HOST)) @echo 'Creating missing $* soft link' ln -s $(TARGET)-$* $@ - missing-links := $(addprefix $(PREFIX)/bin/, \ - addr2line ar as c++ c++filt dwp elfedit g++ gcc gcc-$(gcc_ver_only) gprof ld ld.bfd \ + MISSING_LINKS := $(addprefix $(PREFIX)/bin/, \ + addr2line ar as c++ c++filt dwp elfedit g++ gcc gcc-$(GCC_VER_ONLY) gprof ld ld.bfd \ ld.gold nm objcopy objdump ranlib readelf size strings strip) endif # Add link to work around "plugin needed to handle lto object" (JDK-8344272) -$(PREFIX)/lib/bfd-plugins/liblto_plugin.so: $(PREFIX)/libexec/gcc/$(TARGET)/$(gcc_ver_only)/liblto_plugin.so +$(PREFIX)/lib/bfd-plugins/liblto_plugin.so: $(PREFIX)/libexec/gcc/$(TARGET)/$(GCC_VER_ONLY)/liblto_plugin.so @echo 'Creating missing $(@F) soft link' @mkdir -p $(@D) ln -s $$(realpath -s --relative-to=$(@D) $<) $@ -missing-links += $(PREFIX)/lib/bfd-plugins/liblto_plugin.so +MISSING_LINKS += $(PREFIX)/lib/bfd-plugins/liblto_plugin.so ################################################################################ -bfdlib : $(bfdlib) -binutils : $(binutils) -rpms : $(rpms) -libs : $(libs) +bfdlib : $(BFDLIB) +binutils : $(BINUTILS) +rpms : $(RPMS) +libs : $(LIBS) sysroot : rpms libs -gcc : sysroot $(gcc) $(gccpatch) -gdb : $(gdb) -all : binutils gcc bfdlib $(PREFIX)/devkit.info $(missing-links) $(SYSROOT_LINKS) \ +gcc : sysroot $(GCC) $(GCC_PATCHED) +gdb : $(GDB) +all : binutils gcc bfdlib $(PREFIX)/devkit.info $(MISSING_LINKS) $(SYSROOT_LINKS) \ $(THESE_MAKEFILES) gdb # this is only built for host. so separate. -ccache : $(ccache) +ccache : $(CCACHE) .PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot From 650fd35b3b30bf16e8caad968bd335d423c87b7d Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Wed, 8 Oct 2025 03:00:30 +0000 Subject: [PATCH 016/561] 8335646: Nimbus : JLabel not painted with LAF defined foreground color on Ubuntu 24.04 Reviewed-by: aivanov, dnguyen, serb --- test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java b/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java index fddfbb28384..54f7744ee90 100644 --- a/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java +++ b/test/jdk/javax/swing/plaf/basic/BasicHTML/bug4248210.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -71,7 +71,7 @@ public class bug4248210 { UIManager.getDefaults().put("Label.foreground", labelColor); } - JLabel label = new JLabel("Can You Read This?"); + JLabel label = new JLabel("\u2588 \u2588 \u2588 \u2588"); label.setSize(150, 30); BufferedImage img = paintToImage(label); From 2ac24bf1bac9c32704ebd72b93a75819b9404063 Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Wed, 8 Oct 2025 03:06:29 +0000 Subject: [PATCH 017/561] 8367389: C2 SuperWord: refactor VTransform to model the whole loop instead of just the basic block Reviewed-by: roland, mhaessig --- src/hotspot/share/opto/phasetype.hpp | 7 +- src/hotspot/share/opto/superword.cpp | 220 +++++------------- src/hotspot/share/opto/superword.hpp | 6 +- .../share/opto/superwordVTransformBuilder.cpp | 60 +++-- .../share/opto/superwordVTransformBuilder.hpp | 2 + src/hotspot/share/opto/vectorization.cpp | 74 +++++- src/hotspot/share/opto/vectorization.hpp | 102 +++++--- src/hotspot/share/opto/vtransform.cpp | 149 ++++++++---- src/hotspot/share/opto/vtransform.hpp | 147 +++++++----- .../lib/ir_framework/CompilePhase.java | 6 +- 10 files changed, 447 insertions(+), 326 deletions(-) diff --git a/src/hotspot/share/opto/phasetype.hpp b/src/hotspot/share/opto/phasetype.hpp index 5c733c7dc0a..f24938b51c1 100644 --- a/src/hotspot/share/opto/phasetype.hpp +++ b/src/hotspot/share/opto/phasetype.hpp @@ -89,10 +89,9 @@ flags(PHASEIDEALLOOP2, "PhaseIdealLoop 2") \ flags(PHASEIDEALLOOP3, "PhaseIdealLoop 3") \ flags(AUTO_VECTORIZATION1_BEFORE_APPLY, "AutoVectorization 1, before Apply") \ - flags(AUTO_VECTORIZATION2_AFTER_REORDER, "AutoVectorization 2, after Apply Memop Reordering") \ - flags(AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, "AutoVectorization 3, after Adjusting Pre-loop Limit") \ - flags(AUTO_VECTORIZATION4_AFTER_SPECULATIVE_RUNTIME_CHECKS, "AutoVectorization 4, after Adding Speculative Runtime Checks") \ - flags(AUTO_VECTORIZATION5_AFTER_APPLY, "AutoVectorization 5, after Apply") \ + flags(AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, "AutoVectorization 2, after Adjusting Pre-loop Limit") \ + flags(AUTO_VECTORIZATION4_AFTER_SPECULATIVE_RUNTIME_CHECKS, "AutoVectorization 3, after Adding Speculative Runtime Checks") \ + flags(AUTO_VECTORIZATION5_AFTER_APPLY, "AutoVectorization 4, after Apply") \ flags(BEFORE_CCP1, "Before PhaseCCP 1") \ flags(CCP1, "PhaseCCP 1") \ flags(ITER_GVN2, "Iter GVN 2") \ diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index 2b3928781b8..41a4339e4c9 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -40,7 +40,7 @@ SuperWord::SuperWord(const VLoopAnalyzer &vloop_analyzer) : NOT_PRODUCT(COMMA is_trace_superword_packset()) NOT_PRODUCT(COMMA is_trace_superword_rejections()) ), - _mem_ref_for_main_loop_alignment(nullptr), + _vpointer_for_main_loop_alignment(nullptr), _aw_for_main_loop_alignment(0), _do_vector_loop(phase()->C->do_vector_loop()), // whether to do vectorization/simd style _num_work_vecs(0), // amount of vector work we have @@ -455,11 +455,16 @@ bool SuperWord::transform_loop() { // // 8) The pairs are combined into vector sized packs. // -// 9) Reorder the memory slices to co-locate members of the memory packs. +// 9) The packs are split and filtered, to ensure correctness and that +// all packs have corresponding vector nodes implemented in the backend. // -// 10) Generate ideal vector nodes for the final set of packs and where necessary, -// inserting scalar promotion, vector creation from multiple scalars, and -// extraction of scalar values from vectors. +// 10) VTransform (see vtransform.hpp) +// - construct from PackSet +// - schedule (detect circles) +// - apply +// - align main loop +// - add runtime checks (aliasing and alignment) +// - build new loop with vector C2 nodes // // Runtime Checks: // Some required properties cannot be proven statically, and require a @@ -498,7 +503,7 @@ bool SuperWord::SLP_extract() { DEBUG_ONLY(verify_packs();) DEBUG_ONLY(verify_no_extract()); - return schedule_and_apply(); + return do_vtransform(); } int SuperWord::MemOp::cmp_by_group(MemOp* a, MemOp* b) { @@ -660,39 +665,9 @@ void SuperWord::create_adjacent_memop_pairs_in_one_group(const GrowableArrayfast_outs(imax); i < imax; i++) { - PhiNode* phi = cl->fast_out(i)->isa_Phi(); - if (phi != nullptr && _vloop.in_bb(phi) && phi->is_memory_phi()) { - Node* phi_tail = phi->in(LoopNode::LoopBackControl); - if (phi_tail != phi->in(LoopNode::EntryControl)) { - _heads.push(phi); - _tails.push(phi_tail->as_Mem()); - } - } - } - - NOT_PRODUCT( if (_vloop.is_trace_memory_slices()) { print(); } ) -} - -#ifndef PRODUCT -void VLoopMemorySlices::print() const { - tty->print_cr("\nVLoopMemorySlices::print: %s", - heads().length() > 0 ? "" : "NONE"); - for (int m = 0; m < heads().length(); m++) { - tty->print("%6d ", m); heads().at(m)->dump(); - tty->print(" "); tails().at(m)->dump(); - } -} -#endif - // Get all memory nodes of a slice, in reverse order void VLoopMemorySlices::get_slice_in_reverse_order(PhiNode* head, MemNode* tail, GrowableArray &slice) const { + assert(head != nullptr && tail != nullptr, "must be slice with memory state loop"); assert(slice.is_empty(), "start empty"); Node* n = tail; Node* prev = nullptr; @@ -1576,7 +1551,7 @@ void SuperWord::filter_packs_for_alignment() { MemNode const* mem = current->as_constrained()->mem_ref(); Node_List* pack = get_pack(mem); assert(pack != nullptr, "memop of final solution must still be packed"); - _mem_ref_for_main_loop_alignment = mem; + _vpointer_for_main_loop_alignment = &vpointer(mem); _aw_for_main_loop_alignment = pack->size() * mem->memory_size(); } } @@ -1946,7 +1921,9 @@ void PackSet::verify() const { } #endif -bool SuperWord::schedule_and_apply() const { +// Build VTransform from SuperWord Packset, and eventually apply it (create new vectorized C2 loop). +// See description at top of "vtransform.hpp". +bool SuperWord::do_vtransform() const { if (_packset.is_empty()) { return false; } // Make an empty transform. @@ -1959,7 +1936,7 @@ bool SuperWord::schedule_and_apply() const { is_trace_superword_info()); #endif VTransform vtransform(_vloop_analyzer, - _mem_ref_for_main_loop_alignment, + _vpointer_for_main_loop_alignment, _aw_for_main_loop_alignment NOT_PRODUCT(COMMA trace) ); @@ -1988,6 +1965,7 @@ bool SuperWord::schedule_and_apply() const { // Apply the vectorization, i.e. we irreversibly edit the C2 graph. At this point, all // correctness and profitability checks have passed, and the graph was successfully scheduled. +// See description at top of "vtransform.hpp". void VTransform::apply() { #ifndef PRODUCT if (_trace._info || TraceLoopOpts) { @@ -2002,9 +1980,6 @@ void VTransform::apply() { Compile* C = phase()->C; C->print_method(PHASE_AUTO_VECTORIZATION1_BEFORE_APPLY, 4, cl()); - _graph.apply_memops_reordering_with_schedule(); - C->print_method(PHASE_AUTO_VECTORIZATION2_AFTER_REORDER, 4, cl()); - adjust_pre_loop_limit_to_align_main_loop_vectors(); C->print_method(PHASE_AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT, 4, cl()); @@ -2016,102 +1991,11 @@ void VTransform::apply() { C->print_method(PHASE_AUTO_VECTORIZATION5_AFTER_APPLY, 4, cl()); } -// We prepare the memory graph for the replacement of scalar memops with vector memops. -// We reorder all slices in parallel, ensuring that the memops inside each slice are -// ordered according to the _schedule. This means that all packed memops are consecutive -// in the memory graph after the reordering. -void VTransformGraph::apply_memops_reordering_with_schedule() const { -#ifndef PRODUCT - assert(is_scheduled(), "must be already scheduled"); - if (_trace._info) { - print_memops_schedule(); - } -#endif - - ResourceMark rm; - int max_slices = phase()->C->num_alias_types(); - // When iterating over the schedule, we keep track of the current memory state, - // which is the Phi or a store in the loop. - GrowableArray current_state_in_slice(max_slices, max_slices, nullptr); - // The memory state after the loop is the last store inside the loop. If we reorder the - // loop we may have a different last store, and we need to adjust the uses accordingly. - GrowableArray old_last_store_in_slice(max_slices, max_slices, nullptr); - - const GrowableArray& mem_slice_head = _vloop_analyzer.memory_slices().heads(); - - // (1) Set up the initial memory state from Phi. And find the old last store. - for (int i = 0; i < mem_slice_head.length(); i++) { - Node* phi = mem_slice_head.at(i); - assert(phi->is_Phi(), "must be phi"); - int alias_idx = phase()->C->get_alias_index(phi->adr_type()); - current_state_in_slice.at_put(alias_idx, phi); - - // If we have a memory phi, we have a last store in the loop, find it over backedge. - StoreNode* last_store = phi->in(2)->as_Store(); - old_last_store_in_slice.at_put(alias_idx, last_store); - } - - // (2) Walk over schedule, append memops to the current state - // of that slice. If it is a Store, we take it as the new state. - for_each_memop_in_schedule([&] (MemNode* n) { - assert(n->is_Load() || n->is_Store(), "only loads or stores"); - int alias_idx = phase()->C->get_alias_index(n->adr_type()); - Node* current_state = current_state_in_slice.at(alias_idx); - if (current_state == nullptr) { - // If there are only loads in a slice, we never update the memory - // state in the loop, hence there is no phi for the memory state. - // We just keep the old memory state that was outside the loop. - assert(n->is_Load() && !in_bb(n->in(MemNode::Memory)), - "only loads can have memory state from outside loop"); - } else { - igvn().replace_input_of(n, MemNode::Memory, current_state); - if (n->is_Store()) { - current_state_in_slice.at_put(alias_idx, n); - } - } - }); - - // (3) For each slice, we add the current state to the backedge - // in the Phi. Further, we replace uses of the old last store - // with uses of the new last store (current_state). - GrowableArray uses_after_loop; - for (int i = 0; i < mem_slice_head.length(); i++) { - Node* phi = mem_slice_head.at(i); - int alias_idx = phase()->C->get_alias_index(phi->adr_type()); - Node* current_state = current_state_in_slice.at(alias_idx); - assert(current_state != nullptr, "slice is mapped"); - assert(current_state != phi, "did some work in between"); - assert(current_state->is_Store(), "sanity"); - igvn().replace_input_of(phi, 2, current_state); - - // Replace uses of old last store with current_state (new last store) - // Do it in two loops: first find all the uses, and change the graph - // in as second loop so that we do not break the iterator. - Node* last_store = old_last_store_in_slice.at(alias_idx); - assert(last_store != nullptr, "we have a old last store"); - uses_after_loop.clear(); - for (DUIterator_Fast kmax, k = last_store->fast_outs(kmax); k < kmax; k++) { - Node* use = last_store->fast_out(k); - if (!in_bb(use)) { - uses_after_loop.push(use); - } - } - for (int k = 0; k < uses_after_loop.length(); k++) { - Node* use = uses_after_loop.at(k); - for (uint j = 0; j < use->req(); j++) { - Node* def = use->in(j); - if (def == last_store) { - igvn().replace_input_of(use, j, current_state); - } - } - } - } -} - void VTransformGraph::apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const { ResourceMark rm; VTransformApplyState apply_state(_vloop_analyzer, _vtnodes.length()); + // Apply: transform the node and connect with inputs (no backedges). for (int i = 0; i < _schedule.length(); i++) { VTransformNode* vtn = _schedule.at(i); VTransformApplyResult result = vtn->apply(apply_state); @@ -2121,6 +2005,16 @@ void VTransformGraph::apply_vectorization_for_each_vtnode(uint& max_vector_lengt max_vector_length = MAX2(max_vector_length, result.vector_length()); max_vector_width = MAX2(max_vector_width, result.vector_width()); } + + // Cleanup: connect backedges + for (int i = 0; i < _schedule.length(); i++) { + VTransformNode* vtn = _schedule.at(i); + vtn->apply_backedge(apply_state); + } + + // Memory uses after the loop: used to connect to old last store, + // now need to connect to new last store. + apply_state.fix_memory_state_uses_after_loop(); } // We call "apply" on every VTransformNode, which replaces the packed scalar nodes with vector nodes. @@ -2774,10 +2668,10 @@ bool VLoopMemorySlices::same_memory_slice(MemNode* m1, MemNode* m2) const { _vloop.phase()->C->get_alias_index(m2->adr_type()); } -LoadNode::ControlDependency VTransformLoadVectorNode::control_dependency() const { +LoadNode::ControlDependency SuperWordVTransformBuilder::load_control_dependency(const Node_List* pack) const { LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest; - for (int i = 0; i < nodes().length(); i++) { - Node* n = nodes().at(i); + for (uint i = 0; i < pack->size(); i++) { + Node* n = pack->at(i); assert(n->is_Load(), "only meaningful for loads"); if (!n->depends_only_on_test()) { if (n->as_Load()->has_unknown_control_dependency() && @@ -2795,22 +2689,24 @@ LoadNode::ControlDependency VTransformLoadVectorNode::control_dependency() const // Find the memop pack with the maximum vector width, unless they were already // determined (e.g. by SuperWord::filter_packs_for_alignment()). -void VTransform::determine_mem_ref_and_aw_for_main_loop_alignment() { - if (_mem_ref_for_main_loop_alignment != nullptr) { - assert(VLoop::vectors_should_be_aligned(), "mem_ref only set if filtered for alignment"); +void VTransform::determine_vpointer_and_aw_for_main_loop_alignment() { + if (_vpointer_for_main_loop_alignment != nullptr) { + assert(VLoop::vectors_should_be_aligned(), "vpointer_for_main_loop_alignment only set if filtered for alignment"); return; } - MemNode const* mem_ref = nullptr; + VPointer const* vpointer = nullptr; int max_aw = 0; + bool vpointer_is_load = false; const GrowableArray& vtnodes = _graph.vtnodes(); for (int i = 0; i < vtnodes.length(); i++) { VTransformMemVectorNode* vtn = vtnodes.at(i)->isa_MemVector(); if (vtn == nullptr) { continue; } - MemNode* p0 = vtn->nodes().at(0)->as_Mem(); - int vw = p0->memory_size() * vtn->nodes().length(); + int vw = vtn->vpointer().size(); + bool vtn_is_load = vtn->is_load_in_loop(); + // Generally, we prefer to align with the largest memory op (load or store). // If there are multiple, then SuperWordAutomaticAlignment determines if we // prefer loads or stores. @@ -2820,15 +2716,16 @@ void VTransform::determine_mem_ref_and_aw_for_main_loop_alignment() { // it is worse if a store is split, and less bad if a load is split. // By default, we have SuperWordAutomaticAlignment=1, i.e. we align with a // store if possible, to avoid splitting that store. - bool prefer_store = mem_ref != nullptr && SuperWordAutomaticAlignment == 1 && mem_ref->is_Load() && p0->is_Store(); - bool prefer_load = mem_ref != nullptr && SuperWordAutomaticAlignment == 2 && mem_ref->is_Store() && p0->is_Load(); + bool prefer_store = SuperWordAutomaticAlignment == 1 && vpointer_is_load && !vtn_is_load; + bool prefer_load = SuperWordAutomaticAlignment == 2 && !vpointer_is_load && vtn_is_load; if (vw > max_aw || (vw == max_aw && (prefer_load || prefer_store))) { + vpointer = &vtn->vpointer(); max_aw = vw; - mem_ref = p0; + vpointer_is_load = vtn_is_load; } } - assert(mem_ref != nullptr && max_aw > 0, "found mem_ref and aw"); - _mem_ref_for_main_loop_alignment = mem_ref; + assert(vpointer != nullptr && max_aw > 0, "found vpointer and aw"); + _vpointer_for_main_loop_alignment = vpointer; _aw_for_main_loop_alignment = max_aw; } @@ -2842,13 +2739,17 @@ void VTransform::determine_mem_ref_and_aw_for_main_loop_alignment() { } \ // Ensure that the main loop vectors are aligned by adjusting the pre loop limit. We memory-align -// the address of "_mem_ref_for_main_loop_alignment" to "_aw_for_main_loop_alignment", which is a +// the address of "_vpointer_for_main_loop_alignment" to "_aw_for_main_loop_alignment", which is a // sufficiently large alignment width. We adjust the pre-loop iteration count by adjusting the // pre-loop limit. void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() { - determine_mem_ref_and_aw_for_main_loop_alignment(); - const MemNode* align_to_ref = _mem_ref_for_main_loop_alignment; - const int aw = _aw_for_main_loop_alignment; + determine_vpointer_and_aw_for_main_loop_alignment(); + + assert(cl()->is_main_loop(), "can only do alignment for main loop"); + assert(_vpointer_for_main_loop_alignment != nullptr && + _vpointer_for_main_loop_alignment->is_valid() && + _aw_for_main_loop_alignment > 0, + "must have alignment reference and aw"); if (!VLoop::vectors_should_be_aligned() && SuperWordAutomaticAlignment == 0) { #ifdef ASSERT @@ -2859,8 +2760,8 @@ void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() { return; } - assert(align_to_ref != nullptr && aw > 0, "must have alignment reference and aw"); - assert(cl()->is_main_loop(), "can only do alignment for main loop"); + const VPointer& p = *_vpointer_for_main_loop_alignment; + const int aw = _aw_for_main_loop_alignment; // The opaque node for the limit, where we adjust the input Opaque1Node* pre_opaq = _vloop.pre_loop_end()->limit()->as_Opaque1(); @@ -2875,10 +2776,7 @@ void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() { Node* orig_limit = pre_opaq->original_loop_limit(); assert(orig_limit != nullptr && igvn().type(orig_limit) != Type::TOP, ""); - const VPointer& p = vpointer(align_to_ref); - assert(p.is_valid(), "sanity"); - - // For the main-loop, we want the address of align_to_ref to be memory aligned + // For the main-loop, we want the address of vpointer p to be memory aligned // with some alignment width (aw, a power of 2). When we enter the main-loop, // we know that iv is equal to the pre-loop limit. If we adjust the pre-loop // limit by executing adjust_pre_iter many extra iterations, we can change the @@ -3013,9 +2911,7 @@ void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() { #ifdef ASSERT if (_trace._align_vector) { tty->print_cr("\nVTransform::adjust_pre_loop_limit_to_align_main_loop_vectors:"); - tty->print(" align_to_ref:"); - align_to_ref->dump(); - tty->print(" "); + tty->print(" vpointer_for_main_loop_alignment"); p.print_on(tty); tty->print_cr(" aw: %d", aw); tty->print_cr(" iv_stride: %d", iv_stride); diff --git a/src/hotspot/share/opto/superword.hpp b/src/hotspot/share/opto/superword.hpp index 0940e752f85..118e0aa042c 100644 --- a/src/hotspot/share/opto/superword.hpp +++ b/src/hotspot/share/opto/superword.hpp @@ -410,9 +410,9 @@ class SuperWord : public ResourceObj { PairSet _pairset; PackSet _packset; - // Memory reference, and the alignment width (aw) for which we align the main-loop, + // VPointer, and the alignment width (aw) for which we align the main-loop, // by adjusting the pre-loop limit. - MemNode const* _mem_ref_for_main_loop_alignment; + VPointer const* _vpointer_for_main_loop_alignment; int _aw_for_main_loop_alignment; public: @@ -657,7 +657,7 @@ private: bool is_velt_basic_type_compatible_use_def(Node* use, Node* def) const; - bool schedule_and_apply() const; + bool do_vtransform() const; }; #endif // SHARE_OPTO_SUPERWORD_HPP diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.cpp b/src/hotspot/share/opto/superwordVTransformBuilder.cpp index dbc96c234a9..45c919ccffa 100644 --- a/src/hotspot/share/opto/superwordVTransformBuilder.cpp +++ b/src/hotspot/share/opto/superwordVTransformBuilder.cpp @@ -37,6 +37,10 @@ void SuperWordVTransformBuilder::build() { VectorSet vtn_memory_dependencies; // Shared, but cleared for every vtnode. build_inputs_for_vector_vtnodes(vtn_memory_dependencies); build_inputs_for_scalar_vtnodes(vtn_memory_dependencies); + + // Build vtnodes for all uses of nodes from the loop, and connect them + // as outputs to the nodes in the loop. + build_uses_after_loop(); } void SuperWordVTransformBuilder::build_vector_vtnodes_for_packed_nodes() { @@ -50,8 +54,8 @@ void SuperWordVTransformBuilder::build_vector_vtnodes_for_packed_nodes() { } void SuperWordVTransformBuilder::build_scalar_vtnodes_for_non_packed_nodes() { - for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) { - Node* n = _vloop_analyzer.body().body().at(i); + for (uint i = 0; i < _vloop.lpt()->_body.size(); i++) { + Node* n = _vloop.lpt()->_body.at(i); if (_packset.get_pack(n) != nullptr) { continue; } VTransformNode* vtn = nullptr; @@ -61,6 +65,8 @@ void SuperWordVTransformBuilder::build_scalar_vtnodes_for_non_packed_nodes() { vtn = new (_vtransform.arena()) VTransformMemopScalarNode(_vtransform, mem, mem_p); } else if (n->is_Phi()) { vtn = new (_vtransform.arena()) VTransformLoopPhiNode(_vtransform, n->as_Phi()); + } else if (n->is_CountedLoop()) { + vtn = new (_vtransform.arena()) VTransformCountedLoopNode(_vtransform, n->as_CountedLoop()); } else if (n->is_CFG()) { vtn = new (_vtransform.arena()) VTransformCFGNode(_vtransform, n); } else { @@ -121,8 +127,8 @@ void SuperWordVTransformBuilder::build_inputs_for_vector_vtnodes(VectorSet& vtn_ } void SuperWordVTransformBuilder::build_inputs_for_scalar_vtnodes(VectorSet& vtn_memory_dependencies) { - for (int i = 0; i < _vloop_analyzer.body().body().length(); i++) { - Node* n = _vloop_analyzer.body().body().at(i); + for (uint i = 0; i < _vloop.lpt()->_body.size(); i++) { + Node* n = _vloop.lpt()->_body.at(i); VTransformNode* vtn = get_vtnode(n); if (vtn->isa_Vector() != nullptr) { continue; } vtn_memory_dependencies.clear(); // Add every dependency only once per vtn. @@ -135,18 +141,41 @@ void SuperWordVTransformBuilder::build_inputs_for_scalar_vtnodes(VectorSet& vtn_ init_req_with_scalar(n, vtn, MemNode::ValueIn); add_memory_dependencies_of_node_to_vtnode(n, vtn, vtn_memory_dependencies); } else if (n->is_CountedLoop()) { - continue; // Is "root", has no dependency. - } else if (n->is_Phi()) { - // CountedLoop Phi's: ignore backedge (and entry value). - assert(n->in(0) == _vloop.cl(), "only Phi's from the CountedLoop allowed"); - init_req_with_scalar(n, vtn, 0); - continue; + // Avoid self-loop, it only creates unnecessary issues in scheduling. + init_req_with_scalar(n, vtn, LoopNode::EntryControl); + init_req_with_scalar(n, vtn, LoopNode::LoopBackControl); } else { init_all_req_with_scalars(n, vtn); } } } +// Build vtnodes for all uses of nodes from the loop, and connect them +// as outputs to the nodes in the loop. +void SuperWordVTransformBuilder::build_uses_after_loop() { + for (uint i = 0; i < _vloop.lpt()->_body.size(); i++) { + Node* n = _vloop.lpt()->_body.at(i); + VTransformNode* vtn = get_vtnode(n); + + for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { + Node* use = n->fast_out(i); + + if (!_vloop.in_bb(use)) { + VTransformNode* vtn_use = get_vtnode_or_wrap_as_outer(use); + + // Set all edges + for (uint j = 0; j < use->req(); j++) { + Node* def = use->in(j); + if (n == def && vtn_use->in_req(j) != vtn) { + assert(vtn_use->in_req(j) == nullptr, "should not yet be set"); + vtn_use->init_req(j, vtn); + } + } + } + } + } +} + // Create a vtnode for each pack. No in/out edges set yet. VTransformVectorNode* SuperWordVTransformBuilder::make_vector_vtnode_for_pack(const Node_List* pack) const { Node* p0 = pack->at(0); @@ -159,7 +188,8 @@ VTransformVectorNode* SuperWordVTransformBuilder::make_vector_vtnode_for_pack(co if (p0->is_Load()) { const VPointer& scalar_p = _vloop_analyzer.vpointers().vpointer(p0->as_Load()); const VPointer vector_p(scalar_p.make_with_size(scalar_p.size() * vlen)); - vtn = new (_vtransform.arena()) VTransformLoadVectorNode(_vtransform, properties, vector_p, p0->adr_type()); + const LoadNode::ControlDependency control_dependency = load_control_dependency(pack); + vtn = new (_vtransform.arena()) VTransformLoadVectorNode(_vtransform, properties, vector_p, p0->adr_type(), control_dependency); } else if (p0->is_Store()) { const VPointer& scalar_p = _vloop_analyzer.vpointers().vpointer(p0->as_Store()); const VPointer vector_p(scalar_p.make_with_size(scalar_p.size() * vlen)); @@ -209,7 +239,6 @@ VTransformVectorNode* SuperWordVTransformBuilder::make_vector_vtnode_for_pack(co int vopc = VectorNode::opcode(sopc, bt); vtn = new (_vtransform.arena()) VTransformElementWiseVectorNode(_vtransform, p0->req(), properties, vopc); } - vtn->set_nodes(pack); return vtn; } @@ -276,15 +305,15 @@ VTransformNode* SuperWordVTransformBuilder::get_or_make_vtnode_vector_input_at_i // case of a ConvL2I, it can be int or some narrower type such // as short etc. But given we replicate the input of the Convert // node, we have to use the input type instead. - BasicType element_type = p0->is_Convert() ? p0->in(1)->bottom_type()->basic_type() : _vloop_analyzer.types().velt_basic_type(p0); - if (index == 2 && VectorNode::is_scalar_rotate(p0) && element_type == T_LONG) { + BasicType element_bt = p0->is_Convert() ? p0->in(1)->bottom_type()->basic_type() : _vloop_analyzer.types().velt_basic_type(p0); + if (index == 2 && VectorNode::is_scalar_rotate(p0) && element_bt == T_LONG) { // Scalar rotate has int rotation value, but the scalar rotate expects longs. assert(same_input->bottom_type()->isa_int(), "scalar rotate expects int rotation"); VTransformNode* conv = new (_vtransform.arena()) VTransformConvI2LNode(_vtransform); conv->init_req(1, same_input_vtn); same_input_vtn = conv; } - VTransformNode* replicate = new (_vtransform.arena()) VTransformReplicateNode(_vtransform, pack->size(), element_type); + VTransformNode* replicate = new (_vtransform.arena()) VTransformReplicateNode(_vtransform, pack->size(), element_bt); replicate->init_req(1, same_input_vtn); return replicate; } @@ -307,6 +336,7 @@ VTransformNode* SuperWordVTransformBuilder::get_vtnode_or_wrap_as_outer(Node* n) assert(!_vloop.in_bb(n), "only nodes outside the loop can be input nodes to the loop"); vtn = new (_vtransform.arena()) VTransformOuterNode(_vtransform, n); map_node_to_vtnode(n, vtn); + assert(vtn == get_vtnode_or_null(n), "consistency"); return vtn; } diff --git a/src/hotspot/share/opto/superwordVTransformBuilder.hpp b/src/hotspot/share/opto/superwordVTransformBuilder.hpp index 6ed8480209a..cc9dd225f01 100644 --- a/src/hotspot/share/opto/superwordVTransformBuilder.hpp +++ b/src/hotspot/share/opto/superwordVTransformBuilder.hpp @@ -56,6 +56,7 @@ private: void build_scalar_vtnodes_for_non_packed_nodes(); void build_inputs_for_vector_vtnodes(VectorSet& vtn_memory_dependencies); void build_inputs_for_scalar_vtnodes(VectorSet& vtn_memory_dependencies); + void build_uses_after_loop(); // Helper methods for building VTransform. VTransformNode* get_vtnode_or_null(Node* n) const { @@ -82,6 +83,7 @@ private: void init_all_req_with_scalars(Node* n, VTransformNode* vtn); void init_all_req_with_vectors(const Node_List* pack, VTransformNode* vtn); void add_memory_dependencies_of_node_to_vtnode(Node* n, VTransformNode* vtn, VectorSet& vtn_memory_dependencies); + LoadNode::ControlDependency load_control_dependency(const Node_List* pack) const; }; #endif // SHARE_OPTO_SUPERWORD_VTRANSFORM_BUILDER_HPP diff --git a/src/hotspot/share/opto/vectorization.cpp b/src/hotspot/share/opto/vectorization.cpp index 8e0f0980ff7..5c4e15fdbb9 100644 --- a/src/hotspot/share/opto/vectorization.cpp +++ b/src/hotspot/share/opto/vectorization.cpp @@ -182,6 +182,11 @@ VStatus VLoopAnalyzer::setup_submodules_helper() { _reductions.mark_reductions(); } + VStatus body_status = _body.construct(); + if (!body_status.is_success()) { + return body_status; + } + _memory_slices.find_memory_slices(); // If there is no memory slice detected, it means there is no store. @@ -192,11 +197,6 @@ VStatus VLoopAnalyzer::setup_submodules_helper() { return VStatus::make_failure(VLoopAnalyzer::FAILURE_NO_REDUCTION_OR_STORE); } - VStatus body_status = _body.construct(); - if (!body_status.is_success()) { - return body_status; - } - _types.compute_vector_element_type(); _vpointers.compute_vpointers(); @@ -206,6 +206,64 @@ VStatus VLoopAnalyzer::setup_submodules_helper() { return VStatus::make_success(); } +// There are 2 kinds of slices: +// - No memory phi: only loads. All have the same input memory state from before the loop. +// - With memory phi. Chain of memory operations inside the loop. +void VLoopMemorySlices::find_memory_slices() { + Compile* C = _vloop.phase()->C; + // We iterate over the body, which is topologically sorted. Hence, if there is a phi + // in a slice, we will find it first, and the loads and stores afterwards. + for (int i = 0; i < _body.body().length(); i++) { + Node* n = _body.body().at(i); + if (n->is_memory_phi()) { + // Memory slice with stores (and maybe loads) + PhiNode* phi = n->as_Phi(); + int alias_idx = C->get_alias_index(phi->adr_type()); + assert(_inputs.at(alias_idx) == nullptr, "did not yet touch this slice"); + _inputs.at_put(alias_idx, phi->in(1)); + _heads.at_put(alias_idx, phi); + } else if (n->is_Load()) { + LoadNode* load = n->as_Load(); + int alias_idx = C->get_alias_index(load->adr_type()); + PhiNode* head = _heads.at(alias_idx); + if (head == nullptr) { + // We did not find a phi on this slice yet -> must be a slice with only loads. + assert(_inputs.at(alias_idx) == nullptr || _inputs.at(alias_idx) == load->in(1), + "not yet touched or the same input"); + _inputs.at_put(alias_idx, load->in(1)); + } // else: the load belongs to a slice with a phi that already set heads and inputs. +#ifdef ASSERT + } else if (n->is_Store()) { + // Found a store. Make sure it is in a slice with a Phi. + StoreNode* store = n->as_Store(); + int alias_idx = C->get_alias_index(store->adr_type()); + PhiNode* head = _heads.at(alias_idx); + assert(head != nullptr, "should have found a mem phi for this slice"); +#endif + } + } + NOT_PRODUCT( if (_vloop.is_trace_memory_slices()) { print(); } ) +} + +#ifndef PRODUCT +void VLoopMemorySlices::print() const { + tty->print_cr("\nVLoopMemorySlices::print: %s", + heads().length() > 0 ? "" : "NONE"); + for (int i = 0; i < _inputs.length(); i++) { + Node* input = _inputs.at(i); + PhiNode* head = _heads.at(i); + if (input != nullptr) { + tty->print("%3d input", i); input->dump(); + if (head == nullptr) { + tty->print_cr(" load only"); + } else { + tty->print(" head "); head->dump(); + } + } + } +} +#endif + void VLoopVPointers::compute_vpointers() { count_vpointers(); allocate_vpointers_array(); @@ -267,7 +325,6 @@ void VLoopVPointers::print() const { // the edge, i.e. spaw the order. void VLoopDependencyGraph::construct() { const GrowableArray& mem_slice_heads = _memory_slices.heads(); - const GrowableArray& mem_slice_tails = _memory_slices.tails(); ResourceMark rm; GrowableArray slice_nodes; @@ -277,7 +334,10 @@ void VLoopDependencyGraph::construct() { // For each memory slice, create the memory subgraph for (int i = 0; i < mem_slice_heads.length(); i++) { PhiNode* head = mem_slice_heads.at(i); - MemNode* tail = mem_slice_tails.at(i); + // If there is no head (memory-phi) for this slice, then we have either no memops + // in the loop, or only loads. We do not need to add any memory edges in that case. + if (head == nullptr) { continue; } + MemNode* tail = head->in(2)->as_Mem(); _memory_slices.get_slice_in_reverse_order(head, tail, slice_nodes); diff --git a/src/hotspot/share/opto/vectorization.hpp b/src/hotspot/share/opto/vectorization.hpp index b39e46cbf35..e006589cce9 100644 --- a/src/hotspot/share/opto/vectorization.hpp +++ b/src/hotspot/share/opto/vectorization.hpp @@ -379,37 +379,6 @@ private: static Node* original_input(const Node* n, uint i); }; -// Submodule of VLoopAnalyzer. -// Find the memory slices in the loop. -class VLoopMemorySlices : public StackObj { -private: - const VLoop& _vloop; - - GrowableArray _heads; - GrowableArray _tails; - -public: - VLoopMemorySlices(Arena* arena, const VLoop& vloop) : - _vloop(vloop), - _heads(arena, 8, 0, nullptr), - _tails(arena, 8, 0, nullptr) {}; - NONCOPYABLE(VLoopMemorySlices); - - void find_memory_slices(); - - const GrowableArray& heads() const { return _heads; } - const GrowableArray& tails() const { return _tails; } - - // Get all memory nodes of a slice, in reverse order - void get_slice_in_reverse_order(PhiNode* head, MemNode* tail, GrowableArray& slice) const; - - bool same_memory_slice(MemNode* m1, MemNode* m2) const; - -#ifndef PRODUCT - void print() const; -#endif -}; - // Submodule of VLoopAnalyzer. // Finds all nodes in the body, and creates a mapping node->_idx to a body_idx. // This mapping is used so that subsequent datastructures sizes only grow with @@ -461,6 +430,73 @@ private: } }; +// Submodule of VLoopAnalyzer. +// Find the memory slices in the loop. There are 3 kinds of slices: +// 1. no use in loop: inputs(i) = nullptr, heads(i) = nullptr +// 2. stores in loop: inputs(i) = entry_mem, heads(i) = phi_mem +// +// = entry_mem +// | +// CountedLoop | +-----------------------+ +// | v v | +// phi_mem | +// | | +// | +// | | +// +---------------------------+ +// | +// +// +// Note: the mem uses after the loop are dependent on the last store in the loop. +// Once we vectorize, we may reorder the loads and stores, and replace +// scalar mem ops with vector mem ops. We will have to make sure that all +// uses after the loop use the new last store. +// See: VTransformApplyState::fix_memory_state_uses_after_loop +// +// 3. only loads but no stores in loop: inputs(i) = entry_mem, heads(i) = nullptr +// +// = entry_mem +// | | +// | CountedLoop | +// | | | +// | +// | +// +// +// Note: the mem uses after the loop are NOT dependent any mem ops in the loop, +// since there are no stores. +// +class VLoopMemorySlices : public StackObj { +private: + const VLoop& _vloop; + const VLoopBody& _body; + + GrowableArray _inputs; + GrowableArray _heads; + +public: + VLoopMemorySlices(Arena* arena, const VLoop& vloop, const VLoopBody& body) : + _vloop(vloop), + _body(body), + _inputs(arena, num_slices(), num_slices(), nullptr), + _heads(arena, num_slices(), num_slices(), nullptr) {}; + NONCOPYABLE(VLoopMemorySlices); + + const GrowableArray& inputs() const { return _inputs; } + const GrowableArray& heads() const { return _heads; } + + void find_memory_slices(); + void get_slice_in_reverse_order(PhiNode* head, MemNode* tail, GrowableArray& slice) const; + bool same_memory_slice(MemNode* m1, MemNode* m2) const; + +private: +#ifndef PRODUCT + void print() const; +#endif + + int num_slices() const { return _vloop.phase()->C->num_alias_types(); } +}; + // Submodule of VLoopAnalyzer. // Compute the vector element type for every node in the loop body. // We need to do this to be able to vectorize the narrower integer @@ -737,8 +773,8 @@ private: // Submodules VLoopReductions _reductions; - VLoopMemorySlices _memory_slices; VLoopBody _body; + VLoopMemorySlices _memory_slices; VLoopTypes _types; VLoopVPointers _vpointers; VLoopDependencyGraph _dependency_graph; @@ -749,8 +785,8 @@ public: _arena(mtCompiler, Arena::Tag::tag_superword), _success(false), _reductions (&_arena, vloop), - _memory_slices (&_arena, vloop), _body (&_arena, vloop, vshared), + _memory_slices (&_arena, vloop, _body), _types (&_arena, vloop, _body), _vpointers (&_arena, vloop, _body), _dependency_graph(&_arena, vloop, _body, _memory_slices, _vpointers) diff --git a/src/hotspot/share/opto/vtransform.cpp b/src/hotspot/share/opto/vtransform.cpp index 8c1210a5a09..27c541c2732 100644 --- a/src/hotspot/share/opto/vtransform.cpp +++ b/src/hotspot/share/opto/vtransform.cpp @@ -78,6 +78,10 @@ bool VTransformGraph::schedule() { // runtime check, see VTransform::apply_speculative_aliasing_runtime_checks. for (uint i = 0; i < vtn->out_strong_edges(); i++) { VTransformNode* use = vtn->out_strong_edge(i); + + // Skip LoopPhi backedge. + if ((use->isa_LoopPhi() != nullptr || use->isa_CountedLoop() != nullptr) && use->in_req(2) == vtn) { continue; } + if (post_visited.test(use->_idx)) { continue; } if (pre_visited.test(use->_idx)) { // Cycle detected! @@ -120,6 +124,11 @@ void VTransformGraph::collect_nodes_without_strong_in_edges(GrowableArrayhas_strong_in_edge()) { stack.push(vtn); } + // If an Outer node has both inputs and outputs, we will most likely have cycles in the final graph. + // This is not a correctness problem, but it just will prevent vectorization. If this ever happens + // try to find a way to avoid the cycle somehow. + assert(vtn->isa_Outer() == nullptr || (vtn->has_strong_in_edge() != (vtn->out_strong_edges() > 0)), + "Outer nodes should either be inputs or outputs, but not both, otherwise we may get cycles"); } } @@ -717,28 +726,111 @@ Node* VTransformApplyState::transformed_node(const VTransformNode* vtn) const { return n; } +void VTransformApplyState::init_memory_states_and_uses_after_loop() { + const GrowableArray& inputs = _vloop_analyzer.memory_slices().inputs(); + const GrowableArray& heads = _vloop_analyzer.memory_slices().heads(); + for (int i = 0; i < inputs.length(); i++) { + PhiNode* head = heads.at(i); + if (head != nullptr) { + // Slice with Phi (i.e. with stores) -> start with the phi (phi_mem) + _memory_states.at_put(i, head); + + // Remember uses outside the loop of the last memory state (store). + StoreNode* last_store = head->in(2)->as_Store(); + assert(vloop().in_bb(last_store), "backedge store should be in the loop"); + for (DUIterator_Fast jmax, j = last_store->fast_outs(jmax); j < jmax; j++) { + Node* use = last_store->fast_out(j); + if (!vloop().in_bb(use)) { + for (uint k = 0; k < use->req(); k++) { + if (use->in(k) == last_store) { + _memory_state_uses_after_loop.push(MemoryStateUseAfterLoop(use, k, i)); + } + } + } + } + } else { + // Slice without Phi (i.e. only loads) -> use the input state (entry_mem) + _memory_states.at_put(i, inputs.at(i)); + } + } +} + +// We may have reordered the scalar stores, or replaced them with vectors. Now +// the last memory state in the loop may have changed. Thus, we need to change +// the uses of the old last memory state the new last memory state. +void VTransformApplyState::fix_memory_state_uses_after_loop() { + for (int i = 0; i < _memory_state_uses_after_loop.length(); i++) { + MemoryStateUseAfterLoop& use = _memory_state_uses_after_loop.at(i); + Node* last_state = memory_state(use._alias_idx); + phase()->igvn().replace_input_of(use._use, use._in_idx, last_state); + } +} + +void VTransformNode::apply_vtn_inputs_to_node(Node* n, VTransformApplyState& apply_state) const { + PhaseIdealLoop* phase = apply_state.phase(); + for (uint i = 0; i < req(); i++) { + VTransformNode* vtn_def = in_req(i); + if (vtn_def != nullptr) { + Node* def = apply_state.transformed_node(vtn_def); + phase->igvn().replace_input_of(n, i, def); + } + } +} + VTransformApplyResult VTransformMemopScalarNode::apply(VTransformApplyState& apply_state) const { - // This was just wrapped. Now we simply unwrap without touching the inputs. + apply_vtn_inputs_to_node(_node, apply_state); + // The memory state has to be applied separately: the vtn does not hold it. This allows reordering. + Node* mem = apply_state.memory_state(_node->adr_type()); + apply_state.phase()->igvn().replace_input_of(_node, 1, mem); + if (_node->is_Store()) { + apply_state.set_memory_state(_node->adr_type(), _node); + } + return VTransformApplyResult::make_scalar(_node); } VTransformApplyResult VTransformDataScalarNode::apply(VTransformApplyState& apply_state) const { - // This was just wrapped. Now we simply unwrap without touching the inputs. + apply_vtn_inputs_to_node(_node, apply_state); return VTransformApplyResult::make_scalar(_node); } VTransformApplyResult VTransformLoopPhiNode::apply(VTransformApplyState& apply_state) const { - // This was just wrapped. Now we simply unwrap without touching the inputs. + PhaseIdealLoop* phase = apply_state.phase(); + Node* in0 = apply_state.transformed_node(in_req(0)); + Node* in1 = apply_state.transformed_node(in_req(1)); + phase->igvn().replace_input_of(_node, 0, in0); + phase->igvn().replace_input_of(_node, 1, in1); + // Note: the backedge is hooked up later. return VTransformApplyResult::make_scalar(_node); } +// Cleanup backedges. In the schedule, the backedges come after their phis. Hence, +// we only have the transformed backedges after the phis are already transformed. +// We hook the backedges into the phis now, during cleanup. +void VTransformLoopPhiNode::apply_backedge(VTransformApplyState& apply_state) const { + PhaseIdealLoop* phase = apply_state.phase(); + if (_node->is_memory_phi()) { + // Memory phi/backedge + // The last memory state of that slice is the backedge. + Node* last_state = apply_state.memory_state(_node->adr_type()); + phase->igvn().replace_input_of(_node, 2, last_state); + } else { + // Data phi/backedge + Node* in2 = apply_state.transformed_node(in_req(2)); + phase->igvn().replace_input_of(_node, 2, in2); + } +} + VTransformApplyResult VTransformCFGNode::apply(VTransformApplyState& apply_state) const { - // This was just wrapped. Now we simply unwrap without touching the inputs. + // We do not modify the inputs of the CountedLoop (and certainly not its backedge) + if (!_node->is_CountedLoop()) { + apply_vtn_inputs_to_node(_node, apply_state); + } return VTransformApplyResult::make_scalar(_node); } VTransformApplyResult VTransformOuterNode::apply(VTransformApplyState& apply_state) const { - // This was just wrapped. Now we simply unwrap without touching the inputs. + apply_vtn_inputs_to_node(_node, apply_state); return VTransformApplyResult::make_scalar(_node); } @@ -797,7 +889,7 @@ VTransformApplyResult VTransformElementWiseVectorNode::apply(VTransformApplyStat vn = VectorNode::make(_vector_opcode, in1, in2, in3, vt); // ternary } - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn); } @@ -812,7 +904,7 @@ VTransformApplyResult VTransformElementWiseLongOpWithCastToIntVectorNode::apply( register_new_node_from_vectorization(apply_state, long_vn); // Cast long -> int, to mimic the scalar long -> int operation. VectorNode* vn = VectorCastNode::make(Op_VectorCastL2X, long_vn, T_INT, vlen); - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn); } @@ -824,7 +916,7 @@ VTransformApplyResult VTransformReinterpretVectorNode::apply(VTransformApplyStat Node* in1 = apply_state.transformed_node(in_req(1)); VectorNode* vn = new VectorReinterpretNode(in1, src_vt, dst_vt); - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn); } @@ -843,7 +935,7 @@ VTransformApplyResult VTransformBoolVectorNode::apply(VTransformApplyState& appl PhaseIdealLoop* phase = apply_state.phase(); ConINode* mask_node = phase->intcon((int)mask); VectorNode* vn = new VectorMaskCmpNode(mask, cmp_in1, cmp_in2, mask_node, vt); - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn); } @@ -852,7 +944,7 @@ VTransformApplyResult VTransformReductionVectorNode::apply(VTransformApplyState& Node* vec = apply_state.transformed_node(in_req(2)); ReductionNode* vn = ReductionNode::make(scalar_opcode(), nullptr, init, vec, element_basic_type()); - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn, vn->vect_type()); } @@ -861,10 +953,9 @@ VTransformApplyResult VTransformLoadVectorNode::apply(VTransformApplyState& appl uint vlen = vector_length(); BasicType bt = element_basic_type(); - LoadNode* first = nodes().at(0)->as_Load(); + // The memory state has to be applied separately: the vtn does not hold it. This allows reordering. Node* ctrl = apply_state.transformed_node(in_req(MemNode::Control)); - // first has the correct memory state, determined by VTransformGraph::apply_memops_reordering_with_schedule - Node* mem = first->in(MemNode::Memory); + Node* mem = apply_state.memory_state(_adr_type); Node* adr = apply_state.transformed_node(in_req(MemNode::Address)); // Set the memory dependency of the LoadVector as early as possible. @@ -880,10 +971,9 @@ VTransformApplyResult VTransformLoadVectorNode::apply(VTransformApplyState& appl } } - LoadVectorNode* vn = LoadVectorNode::make(sopc, ctrl, mem, adr, _adr_type, vlen, bt, - control_dependency()); + LoadVectorNode* vn = LoadVectorNode::make(sopc, ctrl, mem, adr, _adr_type, vlen, bt, _control_dependency); DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } ) - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); + register_new_node_from_vectorization(apply_state, vn); return VTransformApplyResult::make_vector(vn, vn->vect_type()); } @@ -891,27 +981,17 @@ VTransformApplyResult VTransformStoreVectorNode::apply(VTransformApplyState& app int sopc = scalar_opcode(); uint vlen = vector_length(); - StoreNode* first = nodes().at(0)->as_Store(); + // The memory state has to be applied separately: the vtn does not hold it. This allows reordering. Node* ctrl = apply_state.transformed_node(in_req(MemNode::Control)); - // first has the correct memory state, determined by VTransformGraph::apply_memops_reordering_with_schedule - Node* mem = first->in(MemNode::Memory); + Node* mem = apply_state.memory_state(_adr_type); Node* adr = apply_state.transformed_node(in_req(MemNode::Address)); Node* value = apply_state.transformed_node(in_req(MemNode::ValueIn)); StoreVectorNode* vn = StoreVectorNode::make(sopc, ctrl, mem, adr, _adr_type, value, vlen); DEBUG_ONLY( if (VerifyAlignVector) { vn->set_must_verify_alignment(); } ) - register_new_node_from_vectorization_and_replace_scalar_nodes(apply_state, vn); - return VTransformApplyResult::make_vector(vn, vn->vect_type()); -} - -void VTransformVectorNode::register_new_node_from_vectorization_and_replace_scalar_nodes(VTransformApplyState& apply_state, Node* vn) const { - PhaseIdealLoop* phase = apply_state.phase(); register_new_node_from_vectorization(apply_state, vn); - - for (int i = 0; i < _nodes.length(); i++) { - Node* n = _nodes.at(i); - phase->igvn().replace_node(n, vn); - } + apply_state.set_memory_state(_adr_type, vn); + return VTransformApplyResult::make_vector(vn, vn->vect_type()); } void VTransformNode::register_new_node_from_vectorization(VTransformApplyState& apply_state, Node* vn) const { @@ -944,15 +1024,6 @@ void VTransformGraph::print_schedule() const { } } -void VTransformGraph::print_memops_schedule() const { - tty->print_cr("\nVTransformGraph::print_memops_schedule:"); - int i = 0; - for_each_memop_in_schedule([&] (MemNode* mem) { - tty->print(" %3d: ", i++); - mem->dump(); - }); -} - void VTransformNode::print() const { tty->print("%3d %s (", _idx, name()); for (uint i = 0; i < _req; i++) { diff --git a/src/hotspot/share/opto/vtransform.hpp b/src/hotspot/share/opto/vtransform.hpp index 9a4e4de01a2..a004962eea7 100644 --- a/src/hotspot/share/opto/vtransform.hpp +++ b/src/hotspot/share/opto/vtransform.hpp @@ -39,7 +39,7 @@ // // This is the life-cycle of a VTransform: // - Construction: -// - From SuperWord, with the SuperWordVTransformBuilder. +// - From SuperWord PackSet, with the SuperWordVTransformBuilder. // // - Future Plans: optimize, if-conversion, etc. // @@ -49,8 +49,16 @@ // // - Apply: // - Changes to the C2 IR are only made once the "apply" method is called. +// - Align the main loop, by adjusting pre loop limit. +// - Add speculative runtime checks (alignment and aliasing). // - Each vtnode generates its corresponding scalar and vector C2 nodes, -// possibly replacing old scalar C2 nodes. +// possibly replacing old scalar C2 nodes. We apply each vtnode in order +// of the schedule, so that all input vtnodes are already applied, i.e. +// all input vtnodes have already generated the transformed C2 nodes. +// - We also build the new memory graph on the fly. The schedule may have +// reordered the memory operations, and so we cannot use the old memory +// graph, but must build it from the scheduled order. We keep track of +// the current memory state in VTransformApplyState. // // Future Plans with VTransform: // - Cost model: estimate if vectorization is profitable. @@ -65,6 +73,7 @@ class VTransformMemopScalarNode; class VTransformDataScalarNode; class VTransformLoopPhiNode; class VTransformCFGNode; +class VTransformCountedLoopNode; class VTransformOuterNode; class VTransformVectorNode; class VTransformElementWiseVectorNode; @@ -176,7 +185,6 @@ public: bool schedule(); bool has_store_to_load_forwarding_failure(const VLoopAnalyzer& vloop_analyzer) const; - void apply_memops_reordering_with_schedule() const; void apply_vectorization_for_each_vtnode(uint& max_vector_length, uint& max_vector_width) const; private: @@ -187,13 +195,9 @@ private: void collect_nodes_without_strong_in_edges(GrowableArray& stack) const; - template - void for_each_memop_in_schedule(Callback callback) const; - #ifndef PRODUCT void print_vtnodes() const; void print_schedule() const; - void print_memops_schedule() const; void trace_schedule_cycle(const GrowableArray& stack, const VectorSet& pre_visited, const VectorSet& post_visited) const; @@ -215,14 +219,14 @@ private: VTransformGraph _graph; - // Memory reference, and the alignment width (aw) for which we align the main-loop, + // VPointer, and the alignment width (aw) for which we align the main-loop, // by adjusting the pre-loop limit. - MemNode const* _mem_ref_for_main_loop_alignment; + VPointer const* _vpointer_for_main_loop_alignment; int _aw_for_main_loop_alignment; public: VTransform(const VLoopAnalyzer& vloop_analyzer, - MemNode const* mem_ref_for_main_loop_alignment, + VPointer const* vpointer_for_main_loop_alignment, int aw_for_main_loop_alignment NOT_PRODUCT( COMMA const VTransformTrace trace) ) : @@ -231,7 +235,7 @@ public: NOT_PRODUCT(_trace(trace) COMMA) _arena(mtCompiler, Arena::Tag::tag_superword), _graph(_vloop_analyzer, _arena NOT_PRODUCT(COMMA _trace)), - _mem_ref_for_main_loop_alignment(mem_ref_for_main_loop_alignment), + _vpointer_for_main_loop_alignment(vpointer_for_main_loop_alignment), _aw_for_main_loop_alignment(aw_for_main_loop_alignment) {} const VLoopAnalyzer& vloop_analyzer() const { return _vloop_analyzer; } @@ -257,7 +261,7 @@ private: } // Ensure that the main loop vectors are aligned by adjusting the pre loop limit. - void determine_mem_ref_and_aw_for_main_loop_alignment(); + void determine_vpointer_and_aw_for_main_loop_alignment(); void adjust_pre_loop_limit_to_align_main_loop_vectors(); void apply_speculative_alignment_runtime_checks(); @@ -271,7 +275,7 @@ private: }; // Keeps track of the state during "VTransform::apply" -// -> keep track of the already transformed nodes +// -> keep track of the already transformed nodes and the memory state. class VTransformApplyState : public StackObj { private: const VLoopAnalyzer& _vloop_analyzer; @@ -281,11 +285,35 @@ private: // generated def (input) nodes when we are generating the use nodes in "apply". GrowableArray _vtnode_idx_to_transformed_node; + // We keep track of the current memory state in each slice. If the slice has only + // loads (and no phi), then this is always the input memory state from before the + // loop. If there is a memory phi, this is initially the memory phi, and each time + // a store is processed, it is updated to that store. + GrowableArray _memory_states; + + // We need to keep track of the memory uses after the loop, for the slices that + // have a memory phi. + // use->in(in_idx) = + class MemoryStateUseAfterLoop : public StackObj { + public: + Node* _use; + int _in_idx; + int _alias_idx; + + MemoryStateUseAfterLoop(Node* use, int in_idx, int alias_idx) : + _use(use), _in_idx(in_idx), _alias_idx(alias_idx) {} + MemoryStateUseAfterLoop() : MemoryStateUseAfterLoop(nullptr, 0, 0) {} + }; + + GrowableArray _memory_state_uses_after_loop; + public: VTransformApplyState(const VLoopAnalyzer& vloop_analyzer, int num_vtnodes) : _vloop_analyzer(vloop_analyzer), - _vtnode_idx_to_transformed_node(num_vtnodes, num_vtnodes, nullptr) + _vtnode_idx_to_transformed_node(num_vtnodes, num_vtnodes, nullptr), + _memory_states(num_slices(), num_slices(), nullptr) { + init_memory_states_and_uses_after_loop(); } const VLoop& vloop() const { return _vloop_analyzer.vloop(); } @@ -294,6 +322,25 @@ public: void set_transformed_node(VTransformNode* vtn, Node* n); Node* transformed_node(const VTransformNode* vtn) const; + + Node* memory_state(int alias_idx) const { return _memory_states.at(alias_idx); } + void set_memory_state(int alias_idx, Node* n) { _memory_states.at_put(alias_idx, n); } + + Node* memory_state(const TypePtr* adr_type) const { + int alias_idx = phase()->C->get_alias_index(adr_type); + return memory_state(alias_idx); + } + + void set_memory_state(const TypePtr* adr_type, Node* n) { + int alias_idx = phase()->C->get_alias_index(adr_type); + return set_memory_state(alias_idx, n); + } + + void fix_memory_state_uses_after_loop(); + +private: + int num_slices() const { return _vloop_analyzer.memory_slices().heads().length(); } + void init_memory_states_and_uses_after_loop(); }; // The vtnodes (VTransformNode) resemble the C2 IR Nodes, and model a part of the @@ -433,6 +480,8 @@ public: } virtual VTransformMemopScalarNode* isa_MemopScalar() { return nullptr; } + virtual VTransformLoopPhiNode* isa_LoopPhi() { return nullptr; } + virtual VTransformCountedLoopNode* isa_CountedLoop() { return nullptr; } virtual VTransformOuterNode* isa_Outer() { return nullptr; } virtual VTransformVectorNode* isa_Vector() { return nullptr; } virtual VTransformElementWiseVectorNode* isa_ElementWiseVector() { return nullptr; } @@ -448,9 +497,8 @@ public: virtual const VPointer& vpointer() const { ShouldNotReachHere(); } virtual VTransformApplyResult apply(VTransformApplyState& apply_state) const = 0; - - Node* find_transformed_input(int i, const GrowableArray& vnode_idx_to_transformed_node) const; - + virtual void apply_backedge(VTransformApplyState& apply_state) const {}; + void apply_vtn_inputs_to_node(Node* n, VTransformApplyState& apply_state) const; void register_new_node_from_vectorization(VTransformApplyState& apply_state, Node* vn) const; NOT_PRODUCT(virtual const char* name() const = 0;) @@ -510,7 +558,9 @@ public: assert(_node->in(0)->is_Loop(), "phi ctrl must be Loop: %s", _node->in(0)->Name()); } + virtual VTransformLoopPhiNode* isa_LoopPhi() override { return this; } virtual VTransformApplyResult apply(VTransformApplyState& apply_state) const override; + virtual void apply_backedge(VTransformApplyState& apply_state) const override; NOT_PRODUCT(virtual const char* name() const override { return "LoopPhi"; };) NOT_PRODUCT(virtual void print_spec() const override;) }; @@ -531,6 +581,16 @@ public: NOT_PRODUCT(virtual void print_spec() const override;) }; +// Identity transform for CountedLoop, the only CFG node with a backedge. +class VTransformCountedLoopNode : public VTransformCFGNode { +public: + VTransformCountedLoopNode(VTransform& vtransform, CountedLoopNode* n) : + VTransformCFGNode(vtransform, n) {} + + virtual VTransformCountedLoopNode* isa_CountedLoop() override { return this; } + NOT_PRODUCT(virtual const char* name() const override { return "CountedLoop"; };) +}; + // Wrapper node for nodes outside the loop that are inputs to nodes in the loop. // Since we want the loop-internal nodes to be able to reference all inputs as vtnodes, // we must wrap the inputs that are outside the loop into special vtnodes, too. @@ -632,22 +692,9 @@ public: class VTransformVectorNode : public VTransformNode { private: const VTransformVectorNodeProperties _properties; -protected: - GrowableArray _nodes; public: VTransformVectorNode(VTransform& vtransform, const uint req, const VTransformVectorNodeProperties properties) : - VTransformNode(vtransform, req), - _properties(properties), - _nodes(vtransform.arena(), - properties.vector_length(), - properties.vector_length(), - nullptr) {} - - void set_nodes(const Node_List* pack) { - for (uint k = 0; k < pack->size(); k++) { - _nodes.at_put(k, pack->at(k)); - } - } + VTransformNode(vtransform, req), _properties(properties) {} virtual VTransformVectorNode* isa_Vector() override { return this; } void register_new_node_from_vectorization_and_replace_scalar_nodes(VTransformApplyState& apply_state, Node* vn) const; @@ -749,17 +796,23 @@ public: _vpointer(vpointer), _adr_type(adr_type) {} - const GrowableArray& nodes() const { return _nodes; } virtual VTransformMemVectorNode* isa_MemVector() override { return this; } virtual bool is_load_or_store_in_loop() const override { return true; } virtual const VPointer& vpointer() const override { return _vpointer; } }; class VTransformLoadVectorNode : public VTransformMemVectorNode { +private: + const LoadNode::ControlDependency _control_dependency; + public: // req = 3 -> [ctrl, mem, adr] - VTransformLoadVectorNode(VTransform& vtransform, const VTransformVectorNodeProperties properties, const VPointer& vpointer, const TypePtr* adr_type) : - VTransformMemVectorNode(vtransform, 3, properties, vpointer, adr_type) {} + VTransformLoadVectorNode(VTransform& vtransform, + const VTransformVectorNodeProperties properties, + const VPointer& vpointer, + const TypePtr* adr_type, + const LoadNode::ControlDependency control_dependency) : + VTransformMemVectorNode(vtransform, 3, properties, vpointer, adr_type), _control_dependency(control_dependency) {} LoadNode::ControlDependency control_dependency() const; virtual VTransformLoadVectorNode* isa_LoadVector() override { return this; } virtual bool is_load_in_loop() const override { return true; } @@ -777,30 +830,4 @@ public: virtual VTransformApplyResult apply(VTransformApplyState& apply_state) const override; NOT_PRODUCT(virtual const char* name() const override { return "StoreVector"; };) }; - -// Invoke callback on all memops, in the order of the schedule. -template -void VTransformGraph::for_each_memop_in_schedule(Callback callback) const { - assert(_schedule.length() == _vtnodes.length(), "schedule was computed"); - - for (int i = 0; i < _schedule.length(); i++) { - VTransformNode* vtn = _schedule.at(i); - - // We must ignore nodes outside the loop. - if (vtn->isa_Outer() != nullptr) { continue; } - - VTransformMemopScalarNode* scalar = vtn->isa_MemopScalar(); - if (scalar != nullptr) { - callback(scalar->node()); - } - - VTransformMemVectorNode* vector = vtn->isa_MemVector(); - if (vector != nullptr) { - for (int j = 0; j < vector->nodes().length(); j++) { - callback(vector->nodes().at(j)->as_Mem()); - } - } - } -} - #endif // SHARE_OPTO_VTRANSFORM_HPP diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/CompilePhase.java b/test/hotspot/jtreg/compiler/lib/ir_framework/CompilePhase.java index 8b794e13e3f..06b2afa8a67 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/CompilePhase.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/CompilePhase.java @@ -98,9 +98,9 @@ public enum CompilePhase { PHASEIDEALLOOP2( "PhaseIdealLoop 2"), PHASEIDEALLOOP3( "PhaseIdealLoop 3"), AUTO_VECTORIZATION1_BEFORE_APPLY( "AutoVectorization 1, before Apply"), - AUTO_VECTORIZATION2_AFTER_REORDER( "AutoVectorization 2, after Apply Memop Reordering"), - AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT( "AutoVectorization 3, after Adjusting Pre-loop Limit"), - AUTO_VECTORIZATION4_AFTER_SPECULATIVE_RUNTIME_CHECKS("AutoVectorization 4, after Adding Speculative Runtime Checks"), + AUTO_VECTORIZATION3_AFTER_ADJUST_LIMIT( "AutoVectorization 2, after Adjusting Pre-loop Limit"), + AUTO_VECTORIZATION4_AFTER_SPECULATIVE_RUNTIME_CHECKS("AutoVectorization 3, after Adding Speculative Runtime Checks"), + AUTO_VECTORIZATION5_AFTER_APPLY( "AutoVectorization 4, after Apply"), BEFORE_CCP1( "Before PhaseCCP 1"), CCP1( "PhaseCCP 1"), ITER_GVN2( "Iter GVN 2"), From 862119565db311fe0e02e383fd3493601ed23ea8 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 8 Oct 2025 05:32:51 +0000 Subject: [PATCH 018/561] 8363917: SwitchBootstraps.enumSwitch() args not checked as documented Reviewed-by: liach --- .../java/lang/runtime/SwitchBootstraps.java | 37 ++++++++------ .../lang/runtime/SwitchBootstrapsTest.java | 49 +++++++++++++++++-- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java index f4d82595842..99716baf439 100644 --- a/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java +++ b/src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java @@ -165,22 +165,22 @@ public final class SwitchBootstraps { * @param lookup Represents a lookup context with the accessibility * privileges of the caller. When used with {@code invokedynamic}, * this is stacked automatically by the VM. - * @param invocationName unused + * @param invocationName unused, {@code null} is permitted * @param invocationType The invocation type of the {@code CallSite} with two parameters, * a reference type, an {@code int}, and {@code int} as a return type. * @param labels case labels - {@code String} and {@code Integer} constants * and {@code Class} and {@code EnumDesc} instances, in any combination * @return a {@code CallSite} returning the first matching element as described above * - * @throws NullPointerException if any argument is {@code null} + * @throws NullPointerException if any argument is {@code null}, unless noted otherwise * @throws IllegalArgumentException if any element in the labels array is null * @throws IllegalArgumentException if the invocation type is not a method type of first parameter of a reference type, - * second parameter of type {@code int} and with {@code int} as its return type, + * second parameter of type {@code int} and with {@code int} as its return type * @throws IllegalArgumentException if {@code labels} contains an element that is not of type {@code String}, * {@code Integer}, {@code Long}, {@code Float}, {@code Double}, {@code Boolean}, - * {@code Class} or {@code EnumDesc}. + * {@code Class} or {@code EnumDesc} * @throws IllegalArgumentException if {@code labels} contains an element that is not of type {@code Boolean} - * when {@code target} is a {@code Boolean.class}. + * when {@code target} is a {@code Boolean.class} * @jvms 4.4.6 The CONSTANT_NameAndType_info Structure * @jvms 4.4.10 The CONSTANT_Dynamic_info and CONSTANT_InvokeDynamic_info Structures */ @@ -255,29 +255,36 @@ public final class SwitchBootstraps { * enum constant's {@link Enum#name()}. * *

    - * If no element in the {@code labels} array matches the target, then - * the method of the call site return the length of the {@code labels} array. + * If for a given {@code target} there is no element in the {@code labels} + * fulfilling one of the above conditions, then the method of the call + * site returns the length of the {@code labels} array. *

    * The value of the {@code restart} index must be between {@code 0} (inclusive) and * the length of the {@code labels} array (inclusive), - * both or an {@link IndexOutOfBoundsException} is thrown. + * or an {@link IndexOutOfBoundsException} is thrown. + * + * @apiNote It is permissible for the {@code labels} array to contain {@code String} + * values that do not represent any enum constants at runtime. * * @param lookup Represents a lookup context with the accessibility * privileges of the caller. When used with {@code invokedynamic}, * this is stacked automatically by the VM. - * @param invocationName unused + * @param invocationName unused, {@code null} is permitted * @param invocationType The invocation type of the {@code CallSite} with two parameters, * an enum type, an {@code int}, and {@code int} as a return type. * @param labels case labels - {@code String} constants and {@code Class} instances, * in any combination * @return a {@code CallSite} returning the first matching element as described above * - * @throws NullPointerException if any argument is {@code null} - * @throws IllegalArgumentException if any element in the labels array is null, if the - * invocation type is not a method type whose first parameter type is an enum type, - * second parameter of type {@code int} and whose return type is {@code int}, - * or if {@code labels} contains an element that is not of type {@code String} or - * {@code Class} of the target enum type. + * @throws NullPointerException if any argument is {@code null}, unless noted otherwise + * @throws IllegalArgumentException if any element in the labels array is null + * @throws IllegalArgumentException if any element in the labels array is an empty {@code String} + * @throws IllegalArgumentException if the invocation type is not a method type + * whose first parameter type is an enum type, + * second parameter of type {@code int} and + * whose return type is {@code int} + * @throws IllegalArgumentException if {@code labels} contains an element that is not of type {@code String} or + * {@code Class} equal to the target enum type * @jvms 4.4.6 The CONSTANT_NameAndType_info Structure * @jvms 4.4.10 The CONSTANT_Dynamic_info and CONSTANT_InvokeDynamic_info Structures */ diff --git a/test/jdk/java/lang/runtime/SwitchBootstrapsTest.java b/test/jdk/java/lang/runtime/SwitchBootstrapsTest.java index a231501894f..8c6132b2815 100644 --- a/test/jdk/java/lang/runtime/SwitchBootstrapsTest.java +++ b/test/jdk/java/lang/runtime/SwitchBootstrapsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -155,23 +155,60 @@ public class SwitchBootstrapsTest { testEnum(E1.B, 0, 0, "B", "C", "A", E1.class); testEnum(E1.B, 1, 3, "B", "C", "A", E1.class); try { - testEnum(E1.B, 1, 3, "B", "C", "A", E2.class); + testEnum(E1.B, 0, -1, E2.class); fail("Didn't get the expected exception."); } catch (IllegalArgumentException ex) { //OK } try { - testEnum(E1.B, 1, 3, "B", "C", "A", String.class); + testEnum(E1.B, 0, -1, String.class); fail("Didn't get the expected exception."); } catch (IllegalArgumentException ex) { //OK } + try { + testEnum(E1.B, 0, -1, 10); + fail("Didn't get the expected exception."); + } catch (IllegalArgumentException ex) { + //OK + } + try { + testEnum(E1.B, 0, -1, new Object()); + fail("Didn't get the expected exception."); + } catch (IllegalArgumentException ex) { + //OK + } + try { + testEnum(E1.B, 0, -1, new Object[] { null }); + fail("Didn't get the expected exception."); + } catch (IllegalArgumentException ex) { + //OK + } + try { + testEnum(E1.B, 0, -1, ""); + fail("Didn't get the expected exception."); + } catch (IllegalArgumentException ex) { + //OK + } + try { + testEnum(E1.B, 0, -1, (Object[]) null); + fail("Didn't get the expected exception."); + } catch (NullPointerException ex) { + //OK + } testEnum(E1.B, 0, 0, "B", "A"); testEnum(E1.A, 0, 1, "B", "A"); testEnum(E1.A, 0, 0, "A", "A", "B"); testEnum(E1.A, 1, 1, "A", "A", "B"); testEnum(E1.A, 2, 3, "A", "A", "B"); testEnum(E1.A, 0, 0); + testEnum(E1.B, 0, 2, "A", "OLD_REMOVED_CONSTANT", "B", E1.class); + testEnum(E1.B, 1, 2, "A", "OLD_REMOVED_CONSTANT", "B", E1.class); + + //null invocation name: + MethodType switchType = MethodType.methodType(int.class, E1.class, int.class); + MethodHandle indy = ((CallSite) BSM_ENUM_SWITCH.invoke(MethodHandles.lookup(), null, switchType)).dynamicInvoker(); + assertEquals((int) indy.invoke(E1.A, 0), 0); } public void testEnumsWithConstants() throws Throwable { @@ -197,6 +234,9 @@ public class SwitchBootstrapsTest { testEnum(E.class, E.A, 0, 0, "A", "B", "C"); testEnum(E.class, E.B, 0, 1, "A", "B", "C"); testEnum(E.class, E.C, 0, 2, "A", "B", "C"); + testEnum(E.class, E.C, 0, 2, "A", "B"); + testEnum(E.class, E.C, 1, 2, "A", "B"); + testEnum(E.class, E.C, 2, 2, "A", "B"); } public void testWrongSwitchTypes() throws Throwable { @@ -279,6 +319,9 @@ public class SwitchBootstrapsTest { } catch (IllegalArgumentException ex) { //OK } + //null invocationName is OK: + BSM_TYPE_SWITCH.invoke(MethodHandles.lookup(), null, switchType, + new Object[] {Object.class}); } private static AtomicBoolean enumInitialized = new AtomicBoolean(); From bd25db1fb8573fc908f7a8a96bca417b1d44689a Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 8 Oct 2025 07:02:34 +0000 Subject: [PATCH 019/561] 8368960: Adjust java UL logging in the build Reviewed-by: erikj, dholmes --- make/ToolsJdk.gmk | 2 +- make/autoconf/boot-jdk.m4 | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/make/ToolsJdk.gmk b/make/ToolsJdk.gmk index ae0dd069c80..629cadbf83a 100644 --- a/make/ToolsJdk.gmk +++ b/make/ToolsJdk.gmk @@ -63,7 +63,7 @@ TOOL_GENERATECURRENCYDATA = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_ TOOL_TZDB = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ build.tools.tzdb.TzdbZoneRulesCompiler -TOOL_BLOCKED_CERTS = $(JAVA_SMALL) -Xlog:disable -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ +TOOL_BLOCKED_CERTS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ --add-exports java.base/sun.security.util=ALL-UNNAMED \ build.tools.blockedcertsconverter.BlockedCertsConverter diff --git a/make/autoconf/boot-jdk.m4 b/make/autoconf/boot-jdk.m4 index 1dd768b2ae1..adc9afc349d 100644 --- a/make/autoconf/boot-jdk.m4 +++ b/make/autoconf/boot-jdk.m4 @@ -444,6 +444,9 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS], # Force en-US environment UTIL_ADD_JVM_ARG_IF_OK([-Duser.language=en -Duser.country=US],boot_jdk_jvmargs,[$JAVA]) + UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=off:stdout],boot_jdk_jvmargs,[$JAVA]) + UTIL_ADD_JVM_ARG_IF_OK([-Xlog:all=warning:stderr],boot_jdk_jvmargs,[$JAVA]) + if test "x$BOOTJDK_USE_LOCAL_CDS" = xtrue; then # Use our own CDS archive UTIL_ADD_JVM_ARG_IF_OK([$boot_jdk_cds_args -Xshare:auto],boot_jdk_jvmargs,[$JAVA]) From d27649fe22a5bed9db72ac6c2595ac91f1fa28f8 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Wed, 8 Oct 2025 08:03:32 +0000 Subject: [PATCH 020/561] 8367302: New test jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java from JDK-8366082 is failing Reviewed-by: dholmes, apangin --- .../sampling/jfrCPUTimeThreadSampler.cpp | 23 +-- .../sampling/jfrCPUTimeThreadSampler.hpp | 7 +- src/hotspot/share/prims/whitebox.cpp | 16 +-- test/jdk/ProblemList-Xcomp.txt | 1 - .../TestCPUTimeSampleQueueAutoSizes.java | 131 +++++++++++------- test/lib/jdk/test/whitebox/WhiteBox.java | 5 +- 6 files changed, 92 insertions(+), 91 deletions(-) diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp index 2ce1a93455b..7507b9c994e 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp @@ -230,8 +230,7 @@ class JfrCPUSamplerThread : public NonJavaThread { volatile bool _is_async_processing_of_cpu_time_jfr_requests_triggered; volatile bool _warned_about_timer_creation_failure; volatile bool _signal_handler_installed; - DEBUG_ONLY(volatile bool _out_of_stack_walking_enabled;) - DEBUG_ONLY(volatile u8 _out_of_stack_walking_iterations;) + DEBUG_ONLY(volatile bool _out_of_stack_walking_enabled = true;) static const u4 STOP_SIGNAL_BIT = 0x80000000; @@ -283,10 +282,6 @@ public: void set_out_of_stack_walking_enabled(bool runnable) { AtomicAccess::release_store(&_out_of_stack_walking_enabled, runnable); } - - u8 out_of_stack_walking_iterations() const { - return AtomicAccess::load(&_out_of_stack_walking_iterations); - } #endif }; @@ -394,7 +389,6 @@ void JfrCPUSamplerThread::run() { } DEBUG_ONLY(if (AtomicAccess::load_acquire(&_out_of_stack_walking_enabled)) {) if (AtomicAccess::cmpxchg(&_is_async_processing_of_cpu_time_jfr_requests_triggered, true, false)) { - DEBUG_ONLY(AtomicAccess::inc(&_out_of_stack_walking_iterations);) stackwalk_threads_in_native(); } DEBUG_ONLY(}) @@ -588,18 +582,14 @@ void JfrCPUTimeThreadSampling::handle_timer_signal(siginfo_t* info, void* contex } #ifdef ASSERT -void JfrCPUTimeThreadSampling::set_out_of_stack_walking_enabled(bool runnable) { +bool JfrCPUTimeThreadSampling::set_out_of_stack_walking_enabled(bool runnable) { if (_instance != nullptr && _instance->_sampler != nullptr) { _instance->_sampler->set_out_of_stack_walking_enabled(runnable); + return true; + } else { + return false; } } - -u8 JfrCPUTimeThreadSampling::out_of_stack_walking_iterations() { - if (_instance != nullptr && _instance->_sampler != nullptr) { - return _instance->_sampler->out_of_stack_walking_iterations(); - } - return 0; -} #endif void JfrCPUSamplerThread::sample_thread(JfrSampleRequest& request, void* ucontext, JavaThread* jt, JfrThreadLocal* tl, JfrTicks& now) { @@ -872,8 +862,9 @@ void JfrCPUTimeThreadSampling::on_javathread_terminate(JavaThread* thread) { } #ifdef ASSERT -static void set_out_of_stack_walking_enabled(bool runnable) { +bool JfrCPUTimeThreadSampling::set_out_of_stack_walking_enabled(bool runnable) { warn(); + return false; } #endif diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp index e17e63fc3ed..e7c915fc8be 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp @@ -139,9 +139,7 @@ class JfrCPUTimeThreadSampling : public JfrCHeapObj { static void trigger_async_processing_of_cpu_time_jfr_requests(); - DEBUG_ONLY(static void set_out_of_stack_walking_enabled(bool runnable);) - - DEBUG_ONLY(static u8 out_of_stack_walking_iterations();) + DEBUG_ONLY(static bool set_out_of_stack_walking_enabled(bool runnable);) }; #else @@ -162,8 +160,7 @@ private: static void on_javathread_create(JavaThread* thread); static void on_javathread_terminate(JavaThread* thread); - DEBUG_ONLY(static void set_out_of_stack_walking_enabled(bool runnable)); - DEBUG_ONLY(static u8 out_of_stack_walking_iterations();) + DEBUG_ONLY(static bool set_out_of_stack_walking_enabled(bool runnable)); }; #endif // defined(LINUX) diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index 1ecd105f218..b4d100341e0 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -2710,7 +2710,7 @@ WB_ENTRY(void, WB_WaitUnsafe(JNIEnv* env, jobject wb, jint time)) os::naked_short_sleep(time); WB_END -WB_ENTRY(void, WB_BusyWait(JNIEnv* env, jobject wb, jint time)) +WB_ENTRY(void, WB_BusyWaitCPUTime(JNIEnv* env, jobject wb, jint time)) ThreadToNativeFromVM ttn(thread); u8 start = os::current_thread_cpu_time(); u8 target_duration = time * (u8)1000000; @@ -2721,21 +2721,12 @@ WB_END WB_ENTRY(jboolean, WB_CPUSamplerSetOutOfStackWalking(JNIEnv* env, jobject wb, jboolean enable)) #if defined(ASSERT) && INCLUDE_JFR && defined(LINUX) - JfrCPUTimeThreadSampling::set_out_of_stack_walking_enabled(enable == JNI_TRUE); - return JNI_TRUE; + return JfrCPUTimeThreadSampling::set_out_of_stack_walking_enabled(enable == JNI_TRUE) ? JNI_TRUE : JNI_FALSE; #else return JNI_FALSE; #endif WB_END -WB_ENTRY(jlong, WB_CPUSamplerOutOfStackWalkingIterations(JNIEnv* env, jobject wb)) - #if defined(ASSERT) && INCLUDE_JFR && defined(LINUX) - return (jlong)JfrCPUTimeThreadSampling::out_of_stack_walking_iterations(); - #else - return 0; - #endif -WB_END - WB_ENTRY(jstring, WB_GetLibcName(JNIEnv* env, jobject o)) ThreadToNativeFromVM ttn(thread); jstring info_string = env->NewStringUTF(XSTR(LIBC)); @@ -3092,9 +3083,8 @@ static JNINativeMethod methods[] = { {CC"isJVMTIIncluded", CC"()Z", (void*)&WB_IsJVMTIIncluded}, {CC"waitUnsafe", CC"(I)V", (void*)&WB_WaitUnsafe}, - {CC"busyWait", CC"(I)V", (void*)&WB_BusyWait}, + {CC"busyWaitCPUTime", CC"(I)V", (void*)&WB_BusyWaitCPUTime}, {CC"cpuSamplerSetOutOfStackWalking", CC"(Z)Z", (void*)&WB_CPUSamplerSetOutOfStackWalking}, - {CC"cpuSamplerOutOfStackWalkingIterations", CC"()J",(void*)&WB_CPUSamplerOutOfStackWalkingIterations}, {CC"getLibcName", CC"()Ljava/lang/String;", (void*)&WB_GetLibcName}, {CC"pinObject", CC"(Ljava/lang/Object;)V", (void*)&WB_PinObject}, diff --git a/test/jdk/ProblemList-Xcomp.txt b/test/jdk/ProblemList-Xcomp.txt index 8e37e6e15d0..5ed171a1fea 100644 --- a/test/jdk/ProblemList-Xcomp.txt +++ b/test/jdk/ProblemList-Xcomp.txt @@ -29,4 +29,3 @@ java/lang/invoke/MethodHandles/CatchExceptionTest.java 8146623 generic-all java/lang/reflect/callerCache/ReflectionCallerCacheTest.java 8332028 generic-all -jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java 8367302 linux-all diff --git a/test/jdk/jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java b/test/jdk/jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java index 1ea96e3bad3..819329aabf5 100644 --- a/test/jdk/jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java +++ b/test/jdk/jdk/jfr/event/profiling/TestCPUTimeSampleQueueAutoSizes.java @@ -24,6 +24,7 @@ package jdk.jfr.event.profiling; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.Comparator; import java.util.stream.Collectors; @@ -41,8 +42,15 @@ import jdk.test.whitebox.WhiteBox; /* * Tests the sample queues increase in size as needed, when loss is recorded. + * + * The test starts CPU time sampling with a short interval (1ms), disabling + * out-of-stack sample processing for the duration of the test. + * It now runs in native for one second, to cause queue overflows, + * then it comes back into Java to trigger the queue walking. + * Repeats the cycle 5 times and verifies that the loss decreases from the first + * to the last iteration. * @test - * @requires vm.hasJFR & os.family == "linux" & vm.debug + * @requires vm.hasJFR & os.family == "linux" & vm.debug & vm.flagless * @library /test/lib * @modules jdk.jfr/jdk.jfr.internal * @build jdk.test.whitebox.WhiteBox @@ -54,15 +62,13 @@ public class TestCPUTimeSampleQueueAutoSizes { private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); - private static final String BURST_THREAD_NAME = "Burst-Thread-1"; - - static volatile boolean alive = true; - record LossEvent(long relativeTimeMillis, long lostSamples) {} /** A data collection from the CPUTimeSampleLost events for the burst thread */ static class LossEventCollection { private final List events = new ArrayList<>(); + private final List sampleEventsInTimeBox = new ArrayList<>(); + private final List timeBoxEnds = new ArrayList<>(); public synchronized void addEvent(LossEvent event) { events.add(event); @@ -74,81 +80,100 @@ public class TestCPUTimeSampleQueueAutoSizes { .collect(Collectors.toList()); } - public List getEventsPerInterval(long widthMillis, long stopTimeMillis) { + public synchronized List getEventsPerTimeBox() { List ret = new ArrayList<>(); - for (long start = 0; start < stopTimeMillis; start += widthMillis) { - long actualStart = Math.min(start, stopTimeMillis - widthMillis); + AtomicLong previousEnd = new AtomicLong(0); + for (Long timeBoxEnd : timeBoxEnds) { long lostSamples = events.stream() - .filter(e -> e.relativeTimeMillis >= actualStart && e.relativeTimeMillis < actualStart + widthMillis) + .filter(e -> e.relativeTimeMillis >= previousEnd.get() && e.relativeTimeMillis <= timeBoxEnd) .mapToLong(e -> e.lostSamples) .sum(); - ret.add(new LossEvent(actualStart, lostSamples)); + ret.add(new LossEvent(previousEnd.get(), lostSamples)); + previousEnd.set(timeBoxEnd); } return ret; } + public synchronized void addTimeBoxEnd(long timeBoxEnd, long sampleEvents) { + timeBoxEnds.add(timeBoxEnd); + sampleEventsInTimeBox.add(sampleEvents); + } + + public synchronized void print() { + System.out.println("Loss event information:"); + for (int i = 0; i < timeBoxEnds.size(); i++) { + System.out.println(" Time box end: " + timeBoxEnds.get(i) + ", sample events: " + sampleEventsInTimeBox.get(i)); + } + for (LossEvent e : events) { + System.out.println(" Lost samples event: " + e.lostSamples + " at " + e.relativeTimeMillis); + } + for (LossEvent e : getEventsPerTimeBox()) { + System.out.println(" Lost samples in time box ending at " + e.relativeTimeMillis + ": " + e.lostSamples); + } + } } public static void main(String[] args) throws Exception { try (RecordingStream rs = new RecordingStream()) { // setup recording - AtomicLong firstSampleTimeMillis = new AtomicLong(0); - AtomicLong lastSampleTimeMillis = new AtomicLong(0); + long burstThreadId = Thread.currentThread().threadId(); + final long startTimeMillis = Instant.now().toEpochMilli(); LossEventCollection lossEvents = new LossEventCollection(); + AtomicLong sampleEventCountInTimeBox = new AtomicLong(0); rs.enable(EventNames.CPUTimeSample).with("throttle", "1ms"); - rs.onEvent(EventNames.CPUTimeSample, e -> { - if (firstSampleTimeMillis.get() == 0 && e.getThread("eventThread").getJavaName().equals(BURST_THREAD_NAME)) { - firstSampleTimeMillis.set(e.getStartTime().toEpochMilli()); - } - if (e.getThread("eventThread").getJavaName().equals(BURST_THREAD_NAME)) { - lastSampleTimeMillis.set(e.getStartTime().toEpochMilli()); - } - }); rs.enable(EventNames.CPUTimeSamplesLost); rs.onEvent(EventNames.CPUTimeSamplesLost, e -> { - if (e.getThread("eventThread").getJavaName().equals(BURST_THREAD_NAME)) { + if (e.getThread("eventThread").getJavaThreadId() == burstThreadId) { long eventTime = e.getStartTime().toEpochMilli(); - long relativeTime = firstSampleTimeMillis.get() > 0 ? (eventTime - firstSampleTimeMillis.get()) : eventTime; - System.out.println("Lost samples: " + e.getLong("lostSamples") + " at " + relativeTime); + long relativeTime = eventTime - startTimeMillis; + System.out.println("Lost samples: " + e.getLong("lostSamples") + " at " + relativeTime + " start time " + startTimeMillis); lossEvents.addEvent(new LossEvent(relativeTime, e.getLong("lostSamples"))); } }); - WHITE_BOX.cpuSamplerSetOutOfStackWalking(false); + rs.onEvent(EventNames.CPUTimeSample, e -> { + if (e.getThread("eventThread").getJavaThreadId() == burstThreadId) { + sampleEventCountInTimeBox.incrementAndGet(); + } + }); rs.startAsync(); - // this thread runs all along - Thread burstThread = new Thread(() -> WHITE_BOX.busyWait(11000)); - burstThread.setName(BURST_THREAD_NAME); - burstThread.start(); - // now we toggle out-of-stack-walking off, wait 1 second and then turn it on for 500ms a few times + // we disable the out-of-stack walking so that the queue fills up and overflows + // while we are in native code + disableOutOfStackWalking(); + + for (int i = 0; i < 5; i++) { - boolean supported = WHITE_BOX.cpuSamplerSetOutOfStackWalking(false); - if (!supported) { - System.out.println("Out-of-stack-walking not supported, skipping test"); - Asserts.assertFalse(true); - return; - } - Thread.sleep(700); - long iterations = WHITE_BOX.cpuSamplerOutOfStackWalkingIterations(); - WHITE_BOX.cpuSamplerSetOutOfStackWalking(true); - Thread.sleep(300); - while (WHITE_BOX.cpuSamplerOutOfStackWalkingIterations() == iterations) { - Thread.sleep(50); // just to make sure the stack walking really ran - } + // run in native for one second + WHITE_BOX.busyWaitCPUTime(1000); + // going out-of-native at the end of the previous call should have triggered + // the safepoint handler, thereby also triggering the stack walking and creation + // of the loss event + WHITE_BOX.forceSafepoint(); // just to be sure + lossEvents.addTimeBoxEnd(Instant.now().toEpochMilli() - startTimeMillis, sampleEventCountInTimeBox.get()); + sampleEventCountInTimeBox.set(0); } + + rs.stop(); rs.close(); - checkThatLossDecreased(lossEvents, lastSampleTimeMillis.get() - firstSampleTimeMillis.get()); + + enableOutOfStackWalking(); + + checkThatLossDecreased(lossEvents); } } - static void checkThatLossDecreased(LossEventCollection lossEvents, long lastSampleTimeMillis) { - List intervalLosses = lossEvents.getEventsPerInterval(1000, lastSampleTimeMillis); - for (LossEvent interval : intervalLosses) { - System.out.println("Lost samples in interval " + interval.relativeTimeMillis + ": " + interval.lostSamples); - } - // check that there are at least 3 intervals - Asserts.assertTrue(intervalLosses.size() > 2); - // check that the second to last interval has far fewer lost samples than the first - Asserts.assertTrue(intervalLosses.get(intervalLosses.size() - 2).lostSamples < - intervalLosses.get(0).lostSamples / 2); + static void disableOutOfStackWalking() { + Asserts.assertTrue(WHITE_BOX.cpuSamplerSetOutOfStackWalking(false), "Out-of-stack-walking not supported"); + } + + static void enableOutOfStackWalking() { + WHITE_BOX.cpuSamplerSetOutOfStackWalking(true); + } + + static void checkThatLossDecreased(LossEventCollection lossEvents) { + lossEvents.print(); + List timeBoxedLosses = lossEvents.getEventsPerTimeBox(); + // check that the last time box has far fewer lost samples than the first + Asserts.assertTrue(timeBoxedLosses.get(timeBoxedLosses.size() - 1).lostSamples <= + timeBoxedLosses.get(0).lostSamples / 2); } } diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index 669ec48b619..d07dedd2a8c 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -847,13 +847,12 @@ public class WhiteBox { public native void waitUnsafe(int time_ms); - public native void busyWait(int cpuTimeMs); + public native void busyWaitCPUTime(int cpuTimeMs); + // returns true if supported, false if not public native boolean cpuSamplerSetOutOfStackWalking(boolean enable); - public native long cpuSamplerOutOfStackWalkingIterations(); - public native void pinObject(Object o); public native void unpinObject(Object o); From f58e17fd27e868e4a8816befc4c4bb8946c1f7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3n=20Seoane=20Ampudia?= Date: Wed, 8 Oct 2025 08:58:58 +0000 Subject: [PATCH 021/561] 8368780: IGV: Upgrade to Netbeans Platform 27 Reviewed-by: rcastanedalo, chagedorn --- src/utils/IdealGraphVisualizer/Filter/pom.xml | 4 ++-- src/utils/IdealGraphVisualizer/README.md | 2 +- src/utils/IdealGraphVisualizer/pom.xml | 12 ++++++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/utils/IdealGraphVisualizer/Filter/pom.xml b/src/utils/IdealGraphVisualizer/Filter/pom.xml index 176f7a80180..c22ce274493 100644 --- a/src/utils/IdealGraphVisualizer/Filter/pom.xml +++ b/src/utils/IdealGraphVisualizer/Filter/pom.xml @@ -1,6 +1,6 @@ x << 64 = x << 0 = x (!= 2x << 63, for example for x = 1) + // According to the Java spec, chapter 15.19, we only consider the six lowest-order bits of the right-hand operand + // (i.e. "right-hand operand" & 0b111111). Therefore, x << 64 is the same as x << 0 (64 = 0b10000000 & 0b0111111 = 0). + return LShiftNode::make(add1->in(1), phase->intcon(con + 1), bt); } // Left input is an add of a constant? - const TypeInt *t12 = phase->type(add1->in(2))->isa_int(); - if( t12 && t12->is_con() ){ // Left input is an add of a con? + const TypeInteger* t12 = phase->type(add1->in(2))->isa_integer(bt); + if (t12 != nullptr && t12->is_con()) { // Left input is an add of a con? // Compute X << con0 - Node *lsh = phase->transform( new LShiftINode( add1->in(1), in(2) ) ); + Node* lsh = phase->transform(LShiftNode::make(add1->in(1), in(2), bt)); // Compute X<intcon(t12->get_con() << con)); + return AddNode::make(lsh, phase->integercon(java_shift_left(t12->get_con_as_long(bt), con, bt), bt), bt); } } } // Check for "(x >> C1) << C2" - if (add1_op == Op_RShiftI || add1_op == Op_URShiftI) { + if (add1_op == Op_RShift(bt) || add1_op == Op_URShift(bt)) { int add1Con = 0; const_shift_count(phase, add1, &add1Con); // Special case C1 == C2, which just masks off low bits - if (add1Con > 0 && con == add1Con) { + if (add1Con > 0 && con == (uint)add1Con) { // Convert to "(x & -(1 << C2))" - return new AndINode(add1->in(1), phase->intcon(java_negate(jint(1 << con)))); + return MulNode::make_and(add1->in(1), phase->integercon(java_negate(java_shift_left(1, con, bt), bt), bt), bt); } else { // Wait until the right shift has been sharpened to the correct count - if (add1Con > 0 && add1Con < BitsPerJavaInteger) { + if (add1Con > 0 && (uint)add1Con < bits_per_java_integer(bt)) { // As loop parsing can produce LShiftI nodes, we should wait until the graph is fully formed // to apply optimizations, otherwise we can inadvertently stop vectorization opportunities. if (phase->is_IterGVN()) { - if (con > add1Con) { + if (con > (uint)add1Con) { // Creates "(x << (C2 - C1)) & -(1 << C2)" - Node* lshift = phase->transform(new LShiftINode(add1->in(1), phase->intcon(con - add1Con))); - return new AndINode(lshift, phase->intcon(java_negate(jint(1 << con)))); + Node* lshift = phase->transform(LShiftNode::make(add1->in(1), phase->intcon(con - add1Con), bt)); + return MulNode::make_and(lshift, phase->integercon(java_negate(java_shift_left(1, con, bt), bt), bt), bt); } else { - assert(con < add1Con, "must be (%d < %d)", con, add1Con); + assert(con < (uint)add1Con, "must be (%d < %d)", con, add1Con); // Creates "(x >> (C1 - C2)) & -(1 << C2)" // Handle logical and arithmetic shifts Node* rshift; - if (add1_op == Op_RShiftI) { - rshift = phase->transform(new RShiftINode(add1->in(1), phase->intcon(add1Con - con))); + if (add1_op == Op_RShift(bt)) { + rshift = phase->transform(RShiftNode::make(add1->in(1), phase->intcon(add1Con - con), bt)); } else { - rshift = phase->transform(new URShiftINode(add1->in(1), phase->intcon(add1Con - con))); + rshift = phase->transform(URShiftNode::make(add1->in(1), phase->intcon(add1Con - con), bt)); } - return new AndINode(rshift, phase->intcon(java_negate(jint(1 << con)))); + return MulNode::make_and(rshift, phase->integercon(java_negate(java_shift_left(1, con, bt)), bt), bt); } } else { phase->record_for_igvn(this); @@ -1135,29 +1130,29 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { } // Check for "((x >> C1) & Y) << C2" - if (add1_op == Op_AndI) { - Node *add2 = add1->in(1); + if (add1_op == Op_And(bt)) { + Node* add2 = add1->in(1); int add2_op = add2->Opcode(); - if (add2_op == Op_RShiftI || add2_op == Op_URShiftI) { + if (add2_op == Op_RShift(bt) || add2_op == Op_URShift(bt)) { // Special case C1 == C2, which just masks off low bits if (add2->in(2) == in(2)) { // Convert to "(x & (Y << C2))" - Node* y_sh = phase->transform(new LShiftINode(add1->in(2), phase->intcon(con))); - return new AndINode(add2->in(1), y_sh); + Node* y_sh = phase->transform(LShiftNode::make(add1->in(2), phase->intcon(con), bt)); + return MulNode::make_and(add2->in(1), y_sh, bt); } int add2Con = 0; const_shift_count(phase, add2, &add2Con); - if (add2Con > 0 && add2Con < BitsPerJavaInteger) { + if (add2Con > 0 && (uint)add2Con < bits_per_java_integer(bt)) { if (phase->is_IterGVN()) { // Convert to "((x >> C1) << C2) & (Y << C2)" // Make "(x >> C1) << C2", which will get folded away by the rule above - Node* x_sh = phase->transform(new LShiftINode(add2, phase->intcon(con))); + Node* x_sh = phase->transform(LShiftNode::make(add2, phase->intcon(con), bt)); // Make "Y << C2", which will simplify when Y is a constant - Node* y_sh = phase->transform(new LShiftINode(add1->in(2), phase->intcon(con))); + Node* y_sh = phase->transform(LShiftNode::make(add1->in(2), phase->intcon(con), bt)); - return new AndINode(x_sh, y_sh); + return MulNode::make_and(x_sh, y_sh, bt); } else { phase->record_for_igvn(this); } @@ -1167,14 +1162,16 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { // Check for ((x & ((1<<(32-c0))-1)) << c0) which ANDs off high bits // before shifting them away. - const jint bits_mask = right_n_bits(BitsPerJavaInteger-con); - if( add1_op == Op_AndI && - phase->type(add1->in(2)) == TypeInt::make( bits_mask ) ) - return new LShiftINode( add1->in(1), in(2) ); + const jlong bits_mask = max_unsigned_integer(bt) >> con; + assert(bt != T_INT || bits_mask == right_n_bits(bits_per_java_integer(bt)-con), "inconsistent"); + if (add1_op == Op_And(bt) && + phase->type(add1->in(2)) == TypeInteger::make(bits_mask, bt)) { + return LShiftNode::make(add1->in(1), in(2), bt); + } - // Performs: + // Collapse nested left-shifts with constant rhs: // (X << con1) << con2 ==> X << (con1 + con2) - Node* doubleShift = collapse_nested_shift_left(phase, this, con, T_INT); + Node* doubleShift = collapse_nested_shift_left(phase, this, con, bt); if (doubleShift != nullptr) { return doubleShift; } @@ -1182,237 +1179,103 @@ Node *LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { return nullptr; } -//------------------------------Value------------------------------------------ -// A LShiftINode shifts its input2 left by input1 amount. -const Type* LShiftINode::Value(PhaseGVN* phase) const { - const Type *t1 = phase->type( in(1) ); - const Type *t2 = phase->type( in(2) ); +//------------------------------Ideal------------------------------------------ +Node* LShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { + return IdealIL(phase, can_reshape, T_INT); +} + +const Type* LShiftNode::ValueIL(PhaseGVN* phase, BasicType bt) const { + const Type* t1 = phase->type(in(1)); + const Type* t2 = phase->type(in(2)); // Either input is TOP ==> the result is TOP - if( t1 == Type::TOP ) return Type::TOP; - if( t2 == Type::TOP ) return Type::TOP; + if (t1 == Type::TOP) { + return Type::TOP; + } + if (t2 == Type::TOP) { + return Type::TOP; + } // Left input is ZERO ==> the result is ZERO. - if( t1 == TypeInt::ZERO ) return TypeInt::ZERO; + if (t1 == TypeInteger::zero(bt)) { + return TypeInteger::zero(bt); + } // Shift by zero does nothing - if( t2 == TypeInt::ZERO ) return t1; + if (t2 == TypeInt::ZERO) { + return t1; + } // Either input is BOTTOM ==> the result is BOTTOM - if( (t1 == TypeInt::INT) || (t2 == TypeInt::INT) || - (t1 == Type::BOTTOM) || (t2 == Type::BOTTOM) ) - return TypeInt::INT; + if ((t1 == TypeInteger::bottom(bt)) || (t2 == TypeInt::INT) || + (t1 == Type::BOTTOM) || (t2 == Type::BOTTOM)) { + return TypeInteger::bottom(bt); + } - const TypeInt *r1 = t1->is_int(); // Handy access - const TypeInt *r2 = t2->is_int(); // Handy access + const TypeInteger* r1 = t1->is_integer(bt); // Handy access + const TypeInt* r2 = t2->is_int(); // Handy access - if (!r2->is_con()) - return TypeInt::INT; + if (!r2->is_con()) { + return TypeInteger::bottom(bt); + } uint shift = r2->get_con(); - shift &= BitsPerJavaInteger-1; // semantics of Java shifts - // Shift by a multiple of 32 does nothing: - if (shift == 0) return t1; + shift &= bits_per_java_integer(bt) - 1; // semantics of Java shifts + // Shift by a multiple of 32/64 does nothing: + if (shift == 0) { + return t1; + } // If the shift is a constant, shift the bounds of the type, // unless this could lead to an overflow. if (!r1->is_con()) { - jint lo = r1->_lo, hi = r1->_hi; - if (((lo << shift) >> shift) == lo && - ((hi << shift) >> shift) == hi) { - // No overflow. The range shifts up cleanly. - return TypeInt::make((jint)lo << (jint)shift, - (jint)hi << (jint)shift, - MAX2(r1->_widen,r2->_widen)); + jlong lo = r1->lo_as_long(), hi = r1->hi_as_long(); +#ifdef ASSERT + if (bt == T_INT) { + jint lo_int = r1->is_int()->_lo, hi_int = r1->is_int()->_hi; + assert((java_shift_right(java_shift_left(lo, shift, bt), shift, bt) == lo) == (((lo_int << shift) >> shift) == lo_int), "inconsistent"); + assert((java_shift_right(java_shift_left(hi, shift, bt), shift, bt) == hi) == (((hi_int << shift) >> shift) == hi_int), "inconsistent"); } - return TypeInt::INT; +#endif + if (java_shift_right(java_shift_left(lo, shift, bt), shift, bt) == lo && + java_shift_right(java_shift_left(hi, shift, bt), shift, bt) == hi) { + // No overflow. The range shifts up cleanly. + return TypeInteger::make(java_shift_left(lo, shift, bt), + java_shift_left(hi, shift, bt), + MAX2(r1->_widen, r2->_widen), bt); + } + return TypeInteger::bottom(bt); } - return TypeInt::make( (jint)r1->get_con() << (jint)shift ); + return TypeInteger::make(java_shift_left(r1->get_con_as_long(bt), shift, bt), bt); } -//============================================================================= -//------------------------------Identity--------------------------------------- -Node* LShiftLNode::Identity(PhaseGVN* phase) { +//------------------------------Value------------------------------------------ +const Type* LShiftINode::Value(PhaseGVN* phase) const { + return ValueIL(phase, T_INT); +} + +Node* LShiftNode::IdentityIL(PhaseGVN* phase, BasicType bt) { int count = 0; - if (const_shift_count(phase, this, &count) && (count & (BitsPerJavaLong - 1)) == 0) { - // Shift by a multiple of 64 does nothing + if (const_shift_count(phase, this, &count) && (count & (bits_per_java_integer(bt) - 1)) == 0) { + // Shift by a multiple of 32/64 does nothing return in(1); } return this; } +//============================================================================= +//------------------------------Identity--------------------------------------- +Node* LShiftLNode::Identity(PhaseGVN* phase) { + return IdentityIL(phase, T_LONG); +} + //------------------------------Ideal------------------------------------------ -// If the right input is a constant, and the left input is an add of a -// constant, flatten the tree: (X+con1)< X< X << (con1 + con2) -Node *LShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) { - int con = mask_and_replace_shift_amount(phase, this, BitsPerJavaLong); - if (con == 0) { - return nullptr; - } - - // Left input is an add? - Node *add1 = in(1); - int add1_op = add1->Opcode(); - if( add1_op == Op_AddL ) { // Left input is an add? - // Avoid dead data cycles from dead loops - assert( add1 != add1->in(1), "dead loop in LShiftLNode::Ideal" ); - - // Left input is an add of the same number? - if (con != (BitsPerJavaLong - 1) && add1->in(1) == add1->in(2)) { - // Convert "(x + x) << c0" into "x << (c0 + 1)" - // Can only be applied if c0 != 63 because: - // (x + x) << 63 = 2x << 63, while - // (x + x) << 63 --transform--> x << 64 = x << 0 = x (!= 2x << 63, for example for x = 1) - // According to the Java spec, chapter 15.19, we only consider the six lowest-order bits of the right-hand operand - // (i.e. "right-hand operand" & 0b111111). Therefore, x << 64 is the same as x << 0 (64 = 0b10000000 & 0b0111111 = 0). - return new LShiftLNode(add1->in(1), phase->intcon(con + 1)); - } - - // Left input is an add of a constant? - const TypeLong *t12 = phase->type(add1->in(2))->isa_long(); - if( t12 && t12->is_con() ){ // Left input is an add of a con? - // Compute X << con0 - Node *lsh = phase->transform( new LShiftLNode( add1->in(1), in(2) ) ); - // Compute X<longcon(t12->get_con() << con)); - } - } - - // Check for "(x >> C1) << C2" - if (add1_op == Op_RShiftL || add1_op == Op_URShiftL) { - int add1Con = 0; - const_shift_count(phase, add1, &add1Con); - - // Special case C1 == C2, which just masks off low bits - if (add1Con > 0 && con == add1Con) { - // Convert to "(x & -(1 << C2))" - return new AndLNode(add1->in(1), phase->longcon(java_negate(jlong(CONST64(1) << con)))); - } else { - // Wait until the right shift has been sharpened to the correct count - if (add1Con > 0 && add1Con < BitsPerJavaLong) { - // As loop parsing can produce LShiftI nodes, we should wait until the graph is fully formed - // to apply optimizations, otherwise we can inadvertently stop vectorization opportunities. - if (phase->is_IterGVN()) { - if (con > add1Con) { - // Creates "(x << (C2 - C1)) & -(1 << C2)" - Node* lshift = phase->transform(new LShiftLNode(add1->in(1), phase->intcon(con - add1Con))); - return new AndLNode(lshift, phase->longcon(java_negate(jlong(CONST64(1) << con)))); - } else { - assert(con < add1Con, "must be (%d < %d)", con, add1Con); - // Creates "(x >> (C1 - C2)) & -(1 << C2)" - - // Handle logical and arithmetic shifts - Node* rshift; - if (add1_op == Op_RShiftL) { - rshift = phase->transform(new RShiftLNode(add1->in(1), phase->intcon(add1Con - con))); - } else { - rshift = phase->transform(new URShiftLNode(add1->in(1), phase->intcon(add1Con - con))); - } - - return new AndLNode(rshift, phase->longcon(java_negate(jlong(CONST64(1) << con)))); - } - } else { - phase->record_for_igvn(this); - } - } - } - } - - // Check for "((x >> C1) & Y) << C2" - if (add1_op == Op_AndL) { - Node* add2 = add1->in(1); - int add2_op = add2->Opcode(); - if (add2_op == Op_RShiftL || add2_op == Op_URShiftL) { - // Special case C1 == C2, which just masks off low bits - if (add2->in(2) == in(2)) { - // Convert to "(x & (Y << C2))" - Node* y_sh = phase->transform(new LShiftLNode(add1->in(2), phase->intcon(con))); - return new AndLNode(add2->in(1), y_sh); - } - - int add2Con = 0; - const_shift_count(phase, add2, &add2Con); - if (add2Con > 0 && add2Con < BitsPerJavaLong) { - if (phase->is_IterGVN()) { - // Convert to "((x >> C1) << C2) & (Y << C2)" - - // Make "(x >> C1) << C2", which will get folded away by the rule above - Node* x_sh = phase->transform(new LShiftLNode(add2, phase->intcon(con))); - // Make "Y << C2", which will simplify when Y is a constant - Node* y_sh = phase->transform(new LShiftLNode(add1->in(2), phase->intcon(con))); - - return new AndLNode(x_sh, y_sh); - } else { - phase->record_for_igvn(this); - } - } - } - } - - // Check for ((x & ((CONST64(1)<<(64-c0))-1)) << c0) which ANDs off high bits - // before shifting them away. - const jlong bits_mask = jlong(max_julong >> con); - if( add1_op == Op_AndL && - phase->type(add1->in(2)) == TypeLong::make( bits_mask ) ) - return new LShiftLNode( add1->in(1), in(2) ); - - // Performs: - // (X << con1) << con2 ==> X << (con1 + con2) - Node* doubleShift = collapse_nested_shift_left(phase, this, con, T_LONG); - if (doubleShift != nullptr) { - return doubleShift; - } - - return nullptr; +Node* LShiftLNode::Ideal(PhaseGVN* phase, bool can_reshape) { + return IdealIL(phase, can_reshape, T_LONG); } //------------------------------Value------------------------------------------ -// A LShiftLNode shifts its input2 left by input1 amount. const Type* LShiftLNode::Value(PhaseGVN* phase) const { - const Type *t1 = phase->type( in(1) ); - const Type *t2 = phase->type( in(2) ); - // Either input is TOP ==> the result is TOP - if( t1 == Type::TOP ) return Type::TOP; - if( t2 == Type::TOP ) return Type::TOP; - - // Left input is ZERO ==> the result is ZERO. - if( t1 == TypeLong::ZERO ) return TypeLong::ZERO; - // Shift by zero does nothing - if( t2 == TypeInt::ZERO ) return t1; - - // Either input is BOTTOM ==> the result is BOTTOM - if( (t1 == TypeLong::LONG) || (t2 == TypeInt::INT) || - (t1 == Type::BOTTOM) || (t2 == Type::BOTTOM) ) - return TypeLong::LONG; - - const TypeLong *r1 = t1->is_long(); // Handy access - const TypeInt *r2 = t2->is_int(); // Handy access - - if (!r2->is_con()) - return TypeLong::LONG; - - uint shift = r2->get_con(); - shift &= BitsPerJavaLong - 1; // semantics of Java shifts - // Shift by a multiple of 64 does nothing: - if (shift == 0) return t1; - - // If the shift is a constant, shift the bounds of the type, - // unless this could lead to an overflow. - if (!r1->is_con()) { - jlong lo = r1->_lo, hi = r1->_hi; - if (((lo << shift) >> shift) == lo && - ((hi << shift) >> shift) == hi) { - // No overflow. The range shifts up cleanly. - return TypeLong::make((jlong)lo << (jint)shift, - (jlong)hi << (jint)shift, - MAX2(r1->_widen,r2->_widen)); - } - return TypeLong::LONG; - } - - return TypeLong::make( (jlong)r1->get_con() << (jint)shift ); + return ValueIL(phase, T_LONG); } RShiftNode* RShiftNode::make(Node* in1, Node* in2, BasicType bt) { @@ -1649,6 +1512,18 @@ const Type* RShiftLNode::Value(PhaseGVN* phase) const { return ValueIL(phase, T_LONG); } +URShiftNode* URShiftNode::make(Node* in1, Node* in2, BasicType bt) { + switch (bt) { + case T_INT: + return new URShiftINode(in1, in2); + case T_LONG: + return new URShiftLNode(in1, in2); + default: + fatal("Not implemented for %s", type2name(bt)); + } + return nullptr; +} + //============================================================================= //------------------------------Identity--------------------------------------- Node* URShiftINode::Identity(PhaseGVN* phase) { @@ -1684,7 +1559,7 @@ Node* URShiftINode::Identity(PhaseGVN* phase) { } //------------------------------Ideal------------------------------------------ -Node *URShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { +Node* URShiftINode::Ideal(PhaseGVN* phase, bool can_reshape) { int con = mask_and_replace_shift_amount(phase, this, BitsPerJavaInteger); if (con == 0) { return nullptr; @@ -1848,7 +1723,7 @@ Node* URShiftLNode::Identity(PhaseGVN* phase) { } //------------------------------Ideal------------------------------------------ -Node *URShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) { +Node* URShiftLNode::Ideal(PhaseGVN* phase, bool can_reshape) { int con = mask_and_replace_shift_amount(phase, this, BitsPerJavaLong); if (con == 0) { return nullptr; diff --git a/src/hotspot/share/opto/mulnode.hpp b/src/hotspot/share/opto/mulnode.hpp index b736c17b300..1e19e8ec5cd 100644 --- a/src/hotspot/share/opto/mulnode.hpp +++ b/src/hotspot/share/opto/mulnode.hpp @@ -260,10 +260,14 @@ inline Node* make_and(Node* a, Node* b) { class LShiftNode : public Node { public: - LShiftNode(Node *in1, Node *in2) : Node(nullptr,in1,in2) { + LShiftNode(Node* in1, Node* in2) : Node(nullptr,in1,in2) { init_class_id(Class_LShift); } + const Type* ValueIL(PhaseGVN* phase, BasicType bt) const; + Node* IdentityIL(PhaseGVN* phase, BasicType bt); + Node* IdealIL(PhaseGVN* phase, bool can_reshape, BasicType bt); + static LShiftNode* make(Node* in1, Node* in2, BasicType bt); }; @@ -271,12 +275,12 @@ public: // Logical shift left class LShiftINode : public LShiftNode { public: - LShiftINode(Node *in1, Node *in2) : LShiftNode(in1,in2) {} + LShiftINode(Node* in1, Node* in2) : LShiftNode(in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); - virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual Node* Ideal(PhaseGVN *phase, bool can_reshape); virtual const Type* Value(PhaseGVN* phase) const; - const Type *bottom_type() const { return TypeInt::INT; } + const Type* bottom_type() const { return TypeInt::INT; } virtual uint ideal_reg() const { return Op_RegI; } }; @@ -287,9 +291,9 @@ public: LShiftLNode(Node *in1, Node *in2) : LShiftNode(in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); - virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual Node* Ideal(PhaseGVN *phase, bool can_reshape); virtual const Type* Value(PhaseGVN* phase) const; - const Type *bottom_type() const { return TypeLong::LONG; } + const Type* bottom_type() const { return TypeLong::LONG; } virtual uint ideal_reg() const { return Op_RegL; } }; @@ -358,11 +362,17 @@ public: virtual uint ideal_reg() const { return Op_RegL; } }; +class URShiftNode : public Node { +public: + URShiftNode(Node* in1, Node* in2) : Node(nullptr, in1, in2) {} + static URShiftNode* make(Node* in1, Node* in2, BasicType bt); +}; + //------------------------------URShiftBNode----------------------------------- // Logical shift right -class URShiftBNode : public Node { +class URShiftBNode : public URShiftNode { public: - URShiftBNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { + URShiftBNode(Node* in1, Node* in2) : URShiftNode(in1,in2) { ShouldNotReachHere(); // only vector variant is used } virtual int Opcode() const; @@ -370,9 +380,9 @@ public: //------------------------------URShiftSNode----------------------------------- // Logical shift right -class URShiftSNode : public Node { +class URShiftSNode : public URShiftNode { public: - URShiftSNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) { + URShiftSNode(Node* in1, Node* in2) : URShiftNode(in1,in2) { ShouldNotReachHere(); // only vector variant is used } virtual int Opcode() const; @@ -380,27 +390,27 @@ public: //------------------------------URShiftINode----------------------------------- // Logical shift right -class URShiftINode : public Node { +class URShiftINode : public URShiftNode { public: - URShiftINode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} + URShiftINode(Node* in1, Node* in2) : URShiftNode(in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); - virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); virtual const Type* Value(PhaseGVN* phase) const; - const Type *bottom_type() const { return TypeInt::INT; } + const Type* bottom_type() const { return TypeInt::INT; } virtual uint ideal_reg() const { return Op_RegI; } }; //------------------------------URShiftLNode----------------------------------- // Logical shift right -class URShiftLNode : public Node { +class URShiftLNode : public URShiftNode { public: - URShiftLNode( Node *in1, Node *in2 ) : Node(nullptr,in1,in2) {} + URShiftLNode(Node* in1, Node* in2) : URShiftNode(in1,in2) {} virtual int Opcode() const; virtual Node* Identity(PhaseGVN* phase); - virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); virtual const Type* Value(PhaseGVN* phase) const; - const Type *bottom_type() const { return TypeLong::LONG; } + const Type* bottom_type() const { return TypeLong::LONG; } virtual uint ideal_reg() const { return Op_RegL; } }; diff --git a/src/hotspot/share/opto/node.hpp b/src/hotspot/share/opto/node.hpp index c2b3c4fb0ad..9ce9e705eec 100644 --- a/src/hotspot/share/opto/node.hpp +++ b/src/hotspot/share/opto/node.hpp @@ -2086,6 +2086,7 @@ Op_IL(Sub) Op_IL(Mul) Op_IL(URShift) Op_IL(LShift) +Op_IL(RShift) Op_IL(Xor) Op_IL(Cmp) Op_IL(Div) diff --git a/src/hotspot/share/utilities/globalDefinitions.hpp b/src/hotspot/share/utilities/globalDefinitions.hpp index 51ea80a0150..68900f8bc86 100644 --- a/src/hotspot/share/utilities/globalDefinitions.hpp +++ b/src/hotspot/share/utilities/globalDefinitions.hpp @@ -26,6 +26,7 @@ #define SHARE_UTILITIES_GLOBALDEFINITIONS_HPP #include "classfile_constants.h" +#include "utilities/checkedCast.hpp" #include "utilities/compilerWarnings.hpp" #include "utilities/debug.hpp" #include "utilities/forbiddenFunctions.hpp" @@ -1253,13 +1254,21 @@ JAVA_INTEGER_SHIFT_OP(>>, java_shift_right_unsigned, jlong, julong) #undef JAVA_INTEGER_SHIFT_OP +inline jlong java_negate(jlong v, BasicType bt) { + if (bt == T_INT) { + return java_negate(checked_cast(v)); + } + assert(bt == T_LONG, "int or long only"); + return java_negate(v); +} + // Some convenient bit shift operations that accepts a BasicType as the last // argument. These avoid potential mistakes with overloaded functions only // distinguished by lhs argument type. #define JAVA_INTEGER_SHIFT_BASIC_TYPE(FUNC) \ inline jlong FUNC(jlong lhs, jint rhs, BasicType bt) { \ if (bt == T_INT) { \ - return FUNC((jint) lhs, rhs); \ + return FUNC(checked_cast(lhs), rhs); \ } \ assert(bt == T_LONG, "unsupported basic type"); \ return FUNC(lhs, rhs); \ diff --git a/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java index 0b2a87fb2c5..7db56e2a878 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java @@ -54,6 +54,17 @@ public class LShiftINodeIdealizationTests { "testDoubleShift9", "testDoubleShiftSliceAndStore", "testRandom", + "testShiftValue", + "testShiftValueOverflow", + "testShiftMultiple32", + "testShiftOfAddSameInput", + "testLargeShiftOfAddSameInput", + "testShiftOfAddConstant", + "testLShiftOfAndOfRShiftSameCon", + "testLShiftOfAndOfURShiftSameCon", + "testLShiftOfAndOfRShift", + "testLShiftOfAndOfURShift", + "testLShiftOfAndOfCon", }) public void runMethod() { int a = RunInfo.getRandom().nextInt(); @@ -71,6 +82,29 @@ public class LShiftINodeIdealizationTests { assertResult(d); assertResult(min); assertResult(max); + + Asserts.assertEQ(42 << 1, testShiftValue(42)); + Asserts.assertEQ(Integer.MAX_VALUE << 1, testShiftValueOverflow(Integer.MAX_VALUE)); + Asserts.assertEQ((Integer.MAX_VALUE-1) << 1, testShiftValueOverflow(Integer.MAX_VALUE-1)); + + assertResult(a, b); + assertResult(c, d); + assertResult(a, min); + assertResult(a, max); + assertResult(min, a); + assertResult(max, a); + assertResult(min, max); + assertResult(max, min); + assertResult(min, min); + assertResult(max, max); + } + + private void assertResult(int a, int b) { + otherInput = b; + Asserts.assertEQ(((a >> 4) & b) << 4, testLShiftOfAndOfRShiftSameCon(a)); + Asserts.assertEQ(((a >>> 4) & b) << 4, testLShiftOfAndOfURShiftSameCon(a)); + Asserts.assertEQ(((a >> 4) & b) << 8, testLShiftOfAndOfRShift(a)); + Asserts.assertEQ(((a >>> 4) & b) << 8, testLShiftOfAndOfURShift(a)); } @DontCompile @@ -83,6 +117,11 @@ public class LShiftINodeIdealizationTests { Asserts.assertEQ((a >>> 8) << 4, test6(a)); Asserts.assertEQ(((a >> 4) & 0xFF) << 8, test7(a)); Asserts.assertEQ(((a >>> 4) & 0xFF) << 8, test8(a)); + Asserts.assertEQ(a, testShiftMultiple32(a)); + Asserts.assertEQ((a + a) << 1, testShiftOfAddSameInput(a)); + Asserts.assertEQ((a + a) << 31, testLargeShiftOfAddSameInput(a)); + Asserts.assertEQ(((a + 1) << 1) + 1, testShiftOfAddConstant(a)); + Asserts.assertEQ((a & ((1 << (32 - 10)) -1)) << 10, testLShiftOfAndOfCon(a)); assertDoubleShiftResult(a); } @@ -267,4 +306,107 @@ public class LShiftINodeIdealizationTests { public int testRandom(int x) { return (x << CON0) << CON1; } + + @Test + @IR(counts = {IRNode.LSHIFT, "1"}, failOn = { IRNode.IF } ) + public int testShiftValue(int x) { + x = Integer.min(Integer.max(x, 10), 100); + int shift = x << 1; + if (shift > 200 || shift < 20) { + throw new RuntimeException("never taken"); + } + return shift; + } + + @Test + @IR(counts = {IRNode.LSHIFT, "1", IRNode.IF, "2" } ) + public int testShiftValueOverflow(int x) { + x = Integer.max(x, Integer.MAX_VALUE - 1); + int shift = x << 1; + if (shift != -2 && shift != -4) { + throw new RuntimeException("never taken"); + } + return shift; + } + + @Test + @IR(failOn = { IRNode.LSHIFT_I } ) + public int testShiftMultiple32(int x) { + return x << 128; + } + + @Test + @IR(counts = { IRNode.LSHIFT_I, "1" }, failOn = { IRNode.ADD_I } ) + public int testShiftOfAddSameInput(int x) { + return (x + x) << 1; + } + + @Test + @IR(counts = { IRNode.LSHIFT_I, "1", IRNode.ADD_I, "1" } ) + public int testLargeShiftOfAddSameInput(int x) { + return (x + x) << 31; + } + + @Test + @IR(counts = { IRNode.LSHIFT_I, "1", IRNode.ADD_I, "1" } ) + public int testShiftOfAddConstant(int x) { + return ((x + 1) << 1) + 1; + } + + static short shortField; + static byte byteField; + + @Test + @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreShort(int x) { + shortField = (short)(x + x); + } + + @Test + @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreByte(int x) { + byteField = (byte)(x + x); + } + + static int otherInput; + + @Test + @IR(counts = { IRNode.AND_I, "1", IRNode.LSHIFT_I, "1" } , failOn = { IRNode.RSHIFT_I } ) + public int testLShiftOfAndOfRShiftSameCon(int x) { + int shift = x >> 4; + int y = otherInput; + return (shift & y) << 4; + } + + @Test + @IR(counts = { IRNode.AND_I, "1", IRNode.LSHIFT_I, "1" } , failOn = { IRNode.URSHIFT_I } ) + public int testLShiftOfAndOfURShiftSameCon(int x) { + int shift = x >>> 4; + int y = otherInput; + return (shift & y) << 4; + } + + @Test + @IR(counts = { IRNode.AND_I, "2", IRNode.LSHIFT_I, "2" } , failOn = { IRNode.RSHIFT_I } ) + public int testLShiftOfAndOfRShift(int x) { + int shift = x >> 4; + int y = otherInput; + return (shift & y) << 8; + } + + @Test + @IR(counts = { IRNode.AND_I, "2", IRNode.LSHIFT_I, "2" } , failOn = { IRNode.URSHIFT_I } ) + public int testLShiftOfAndOfURShift(int x) { + int shift = x >>> 4; + int y = otherInput; + return (shift & y) << 8; + } + + @Test + @IR(counts = { IRNode.LSHIFT_I, "1" } , failOn = { IRNode.AND_I } ) + public int testLShiftOfAndOfCon(int x) { + return (x & ((1 << (32 - 10)) -1)) << 10; + } } diff --git a/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java index 11eb928d564..f489a348eef 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java @@ -52,6 +52,17 @@ public class LShiftLNodeIdealizationTests { "testDoubleShift8", "testDoubleShift9", "testRandom", + "testShiftValue", + "testShiftValueOverflow", + "testShiftMultiple64", + "testShiftOfAddSameInput", + "testLargeShiftOfAddSameInput", + "testShiftOfAddConstant", + "testLShiftOfAndOfRShiftSameCon", + "testLShiftOfAndOfURShiftSameCon", + "testLShiftOfAndOfRShift", + "testLShiftOfAndOfURShift", + "testLShiftOfAndOfCon", }) public void runMethod() { long a = RunInfo.getRandom().nextLong(); @@ -69,6 +80,29 @@ public class LShiftLNodeIdealizationTests { assertResult(d); assertResult(min); assertResult(max); + + Asserts.assertEQ(42L << 1, testShiftValue(42)); + Asserts.assertEQ(Long.MAX_VALUE << 1, testShiftValueOverflow(Long.MAX_VALUE)); + Asserts.assertEQ((Long.MAX_VALUE-1) << 1, testShiftValueOverflow(Long.MAX_VALUE-1)); + + assertResult(a, b); + assertResult(c, d); + assertResult(a, min); + assertResult(a, max); + assertResult(min, a); + assertResult(max, a); + assertResult(min, max); + assertResult(max, min); + assertResult(min, min); + assertResult(max, max); + } + + private void assertResult(long a, long b) { + otherInput = b; + Asserts.assertEQ(((a >> 4) & b) << 4, testLShiftOfAndOfRShiftSameCon(a)); + Asserts.assertEQ(((a >>> 4) & b) << 4, testLShiftOfAndOfURShiftSameCon(a)); + Asserts.assertEQ(((a >> 4) & b) << 8, testLShiftOfAndOfRShift(a)); + Asserts.assertEQ(((a >>> 4) & b) << 8, testLShiftOfAndOfURShift(a)); } @DontCompile @@ -79,6 +113,11 @@ public class LShiftLNodeIdealizationTests { Asserts.assertEQ((a >>> 8L) << 4L, test6(a)); Asserts.assertEQ(((a >> 4L) & 0xFFL) << 8L, test7(a)); Asserts.assertEQ(((a >>> 4L) & 0xFFL) << 8L, test8(a)); + Asserts.assertEQ(a, testShiftMultiple64(a)); + Asserts.assertEQ((a + a) << 1, testShiftOfAddSameInput(a)); + Asserts.assertEQ((a + a) << 63, testLargeShiftOfAddSameInput(a)); + Asserts.assertEQ(((a + 1) << 1) + 1, testShiftOfAddConstant(a)); + Asserts.assertEQ((a & ((1L << (64 - 10)) -1)) << 10, testLShiftOfAndOfCon(a)); assertDoubleShiftResult(a); } @@ -233,4 +272,90 @@ public class LShiftLNodeIdealizationTests { public long testRandom(long x) { return (x << CON0) << CON1; } + + @Test + @IR(counts = {IRNode.LSHIFT, "1"}, failOn = { IRNode.IF } ) + public long testShiftValue(long x) { + x = Long.min(Long.max(x, 10), 100); + long shift = x << 1; + if (shift > 200 || shift < 20) { + throw new RuntimeException("never taken"); + } + return shift; + } + + @Test + @IR(counts = {IRNode.LSHIFT, "1", IRNode.IF, "2" } ) + public long testShiftValueOverflow(long x) { + x = Long.max(x, Long.MAX_VALUE - 1); + long shift = x << 1; + if (shift != -2 && shift != -4) { + throw new RuntimeException("never taken"); + } + return shift; + } + + @Test + @IR(failOn = { IRNode.LSHIFT_L } ) + public long testShiftMultiple64(long x) { + return x << 128; + } + + @Test + @IR(counts = { IRNode.LSHIFT_L, "1" }, failOn = { IRNode.ADD_L } ) + public long testShiftOfAddSameInput(long x) { + return (x + x) << 1; + } + + @Test + @IR(counts = { IRNode.LSHIFT_L, "1", IRNode.ADD_L, "1" } ) + public long testLargeShiftOfAddSameInput(long x) { + return (x + x) << 63; + } + + @Test + @IR(counts = { IRNode.LSHIFT_L, "1", IRNode.ADD_L, "1" } ) + public long testShiftOfAddConstant(long x) { + return ((x + 1) << 1) + 1; + } + + static long otherInput; + + @Test + @IR(counts = { IRNode.AND_L, "1", IRNode.LSHIFT_L, "1" } , failOn = { IRNode.RSHIFT_L } ) + public long testLShiftOfAndOfRShiftSameCon(long x) { + long shift = x >> 4; + long y = otherInput; + return (shift & y) << 4; + } + + @Test + @IR(counts = { IRNode.AND_L, "1", IRNode.LSHIFT_L, "1" } , failOn = { IRNode.URSHIFT_L } ) + public long testLShiftOfAndOfURShiftSameCon(long x) { + long shift = x >>> 4; + long y = otherInput; + return (shift & y) << 4; + } + + @Test + @IR(counts = { IRNode.AND_L, "2", IRNode.LSHIFT_L, "2" } , failOn = { IRNode.RSHIFT_L } ) + public long testLShiftOfAndOfRShift(long x) { + long shift = x >> 4; + long y = otherInput; + return (shift & y) << 8; + } + + @Test + @IR(counts = { IRNode.AND_L, "2", IRNode.LSHIFT_L, "2" } , failOn = { IRNode.URSHIFT_L } ) + public long testLShiftOfAndOfURShift(long x) { + long shift = x >>> 4; + long y = otherInput; + return (shift & y) << 8; + } + + @Test + @IR(counts = { IRNode.LSHIFT_L, "1" } , failOn = { IRNode.AND_L } ) + public long testLShiftOfAndOfCon(long x) { + return (x & ((1L << (64 - 10)) -1)) << 10; + } } From aed42a16bacb24753a536d07fedd736d64cde3be Mon Sep 17 00:00:00 2001 From: Artem Semenov Date: Thu, 16 Oct 2025 07:28:13 +0000 Subject: [PATCH 144/561] 8365609: Fix several potential NULL native pointer dereferences in the desktop module Found by Linux Verification Center (linuxtesting.org) with SVACE. Signed-off-by: Artem Semenov Artem Semenov Reviewed-by: azvegint, prr, serb --- .../share/native/libsplashscreen/splashscreen_gif.c | 4 +++- .../unix/native/libawt_xawt/awt/gtk3_interface.c | 5 +---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c b/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c index cbdad61f78e..4f2cfca8dd0 100644 --- a/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c +++ b/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c @@ -279,7 +279,9 @@ SplashDecodeGif(Splash * splash, GifFileType * gif) ImageRect dstRect; rgbquad_t fillColor = 0; // 0 is transparent - if (transparentColor < 0) { + if (colorMap && + colorMap->Colors && + transparentColor < 0) { fillColor= MAKE_QUAD_GIF( colorMap->Colors[gif->SBackGroundColor], 0xff); } diff --git a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c index 916880873c6..e5b2dfa6db9 100644 --- a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c +++ b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c @@ -276,10 +276,7 @@ GtkApi* gtk3_load(JNIEnv *env, const char* lib_name) fp_gtk_check_version = dl_symbol("gtk_check_version"); /* GLib */ - fp_glib_check_version = dlsym(gtk3_libhandle, "glib_check_version"); - if (!fp_glib_check_version) { - dlerror(); - } + fp_glib_check_version = dl_symbol("glib_check_version"); fp_g_free = dl_symbol("g_free"); fp_g_object_unref = dl_symbol("g_object_unref"); From ff6a0170f0ab5cfb4af6d6a4a779451823c486d6 Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Thu, 16 Oct 2025 07:35:41 +0000 Subject: [PATCH 145/561] 8369258: C2: enable ReassociateInvariants for all loop types Reviewed-by: epeter, qamai --- src/hotspot/share/opto/loopnode.cpp | 15 ++- .../loopopts/TestReassociateInvariants.java | 93 +++++++++++++++++++ ...MemorySegment_ReassociateInvariants1.java} | 15 +-- ...MemorySegment_ReassociateInvariants2.java} | 16 +--- 4 files changed, 108 insertions(+), 31 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/TestReassociateInvariants.java rename test/hotspot/jtreg/compiler/loopopts/superword/{TestMemorySegment_8360204.java => TestMemorySegment_ReassociateInvariants1.java} (83%) rename test/hotspot/jtreg/compiler/loopopts/superword/{TestMemorySegment_8365982.java => TestMemorySegment_ReassociateInvariants2.java} (82%) diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index 4cb1862cbb9..e8058edb4e5 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -5176,21 +5176,20 @@ void PhaseIdealLoop::build_and_optimize() { continue; } Node* head = lpt->_head; - if (!head->is_BaseCountedLoop() || !lpt->is_innermost()) continue; + if (!lpt->is_innermost()) continue; // check for vectorized loops, any reassociation of invariants was already done - if (head->is_CountedLoop()) { - if (head->as_CountedLoop()->is_unroll_only()) { - continue; - } else { - AutoNodeBudget node_budget(this); - lpt->reassociate_invariants(this); - } + if (head->is_CountedLoop() && head->as_CountedLoop()->is_unroll_only()) { + continue; + } else { + AutoNodeBudget node_budget(this); + lpt->reassociate_invariants(this); } // Because RCE opportunities can be masked by split_thru_phi, // look for RCE candidates and inhibit split_thru_phi // on just their loop-phi's for this pass of loop opts if (SplitIfBlocks && do_split_ifs && + head->is_BaseCountedLoop() && head->as_BaseCountedLoop()->is_valid_counted_loop(head->as_BaseCountedLoop()->bt()) && (lpt->policy_range_check(this, true, T_LONG) || (head->is_CountedLoop() && lpt->policy_range_check(this, true, T_INT)))) { diff --git a/test/hotspot/jtreg/compiler/loopopts/TestReassociateInvariants.java b/test/hotspot/jtreg/compiler/loopopts/TestReassociateInvariants.java new file mode 100644 index 00000000000..d03cb4e8567 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TestReassociateInvariants.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025 IBM Corporation. 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. + */ + +/** + * @test + * @bug 8369258 + * @summary C2: enable ReassociateInvariants for all loop types + * @library /test/lib / + * @run driver compiler.loopopts.TestReassociateInvariants + */ + +package compiler.loopopts; + + +import compiler.lib.ir_framework.*; + +import java.util.Objects; + +public class TestReassociateInvariants { + private static long longStart = 0; + private static long longStop = 1000; + private static int intStart = 0; + private static int intStop = 1000; + + public static void main(String[] args) { + TestFramework.runWithFlags("-XX:-ShortRunningLongLoop"); + } + + // The IR framework is not powerful enough to directly check + // wether invariants are moved out of a loop so tests below rely on + // some side effect that can be observed by the IR framework. + + // Once a + (b + i) is transformed into i + (a + b), the a + b + // before the loop and the one from inside the loop common and one + // Add is removed. + @Test + @IR(counts = {IRNode.ADD_I, "3"}) + @Arguments(values = { Argument.NUMBER_42, Argument.NUMBER_42 }) + public int test1(int a, int b) { + int v = a + b; + for (int i = 1; i < 100; i *= 2) { + v += a + (b + i); + } + return v; + } + + // Range Check Elimination only happens once a + (b + i) is + // transformed into i + (a + b). With the range check eliminated, + // the loop can be removed. At this point, C2 doesn't support + // removal of long counted loop. The long counted loop is + // transformed into a loop nest with an inner int counted + // loop. That one is empty and is removed. + @Test + @IR(failOn = { IRNode.COUNTED_LOOP, IRNode.LONG_COUNTED_LOOP }) + @IR(counts = { IRNode.LOOP, "1" }) + @Arguments(values = { Argument.NUMBER_42, Argument.NUMBER_42 }) + public void test2(long a, long b) { + for (long i = longStart; i < longStop; i++) { + Objects.checkIndex(a + (b + i), Long.MAX_VALUE); + } + } + + // Same here for an int counted loop with long range checks + @Test + @IR(failOn = { IRNode.COUNTED_LOOP }) + @IR(counts = { IRNode.LOOP, "1" }) + @Arguments(values = { Argument.NUMBER_42, Argument.NUMBER_42 }) + public void test3(long a, long b) { + for (int i = intStart; i < intStop; i++) { + Objects.checkIndex(a + (b + i), Long.MAX_VALUE); + } + } +} diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8360204.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants1.java similarity index 83% rename from test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8360204.java rename to test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants1.java index ecefcec8afa..57864a09d69 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8360204.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants1.java @@ -31,16 +31,16 @@ import compiler.lib.ir_framework.*; /* * @test - * @bug 8324751 + * @bug 8324751 8369258 * @summary Reported issue: JDK-8360204: C2 SuperWord: missing RCE with MemorySegment.getAtIndex * The examples are generated from TestAliasingFuzzer.java * So if you see something change here, you may want to investigate if we * can also tighten up the IR rules there. * @library /test/lib / - * @run driver compiler.loopopts.superword.TestMemorySegment_8360204 + * @run driver compiler.loopopts.superword.TestMemorySegment_ReassociateInvariants1 */ -public class TestMemorySegment_8360204 { +public class TestMemorySegment_ReassociateInvariants1 { public static MemorySegment a = Arena.ofAuto().allocate(10_000); public static MemorySegment b = Arena.ofAuto().allocate(10_000); @@ -67,20 +67,13 @@ public class TestMemorySegment_8360204 { @Arguments(setup = "setup") @IR(counts = {IRNode.LOAD_VECTOR_I, "= 0", IRNode.STORE_VECTOR, "= 0", - ".*multiversion.*", "> 0"}, // Sadly, we now multiversion + ".*multiversion.*", "= 0"}, phase = CompilePhase.PRINT_IDEAL, applyIfPlatform = {"64-bit", "true"}, applyIf = {"AlignVector", "false"}, applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) - // There is no aliasing, so we should compile without multiversioning. - // But currently, there seems to be some issue with RCE, we peel and lose the predicate. - // Then we multiversion. // We could imagine that this would eventually vectorize, but since one counts up, and the other down, // we would have to implement shuffle first. - // - // If you see this IR rule fail: investigate JDK-8360204, possibly close it and fix this IR rule! - // Also: consider renaming the file to something more descriptive: what have you fixed with this? - // And: you may now be able to tighten IR rules in TestAliasingFuzzer.java public static void test(MemorySegment container_0, long invar0_0, MemorySegment container_1, long invar0_1, long ivLo, long ivHi) { for (long i = ivLo; i < ivHi; i+=1) { var v = container_0.getAtIndex(ValueLayout.JAVA_INT_UNALIGNED, 19125L + 1L * i + 1L * invar0_0 + 0L * invar0_1159 + 1L * invar1_1159); diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8365982.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants2.java similarity index 82% rename from test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8365982.java rename to test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants2.java index 65fd3861174..6f1590f5e19 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8365982.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_ReassociateInvariants2.java @@ -31,16 +31,16 @@ import compiler.lib.ir_framework.*; /* * @test - * @bug 8324751 + * @bug 8324751 8369258 * @summary Reported issue: JDK-8365982: C2 SuperWord: missing RCE / strange Multiversioning with MemorySegment.set * The examples are generated from TestAliasingFuzzer.java * So if you see something change here, you may want to investigate if we * can also tighten up the IR rules there. * @library /test/lib / - * @run driver compiler.loopopts.superword.TestMemorySegment_8365982 + * @run driver compiler.loopopts.superword.TestMemorySegment_ReassociateInvariants2 */ -public class TestMemorySegment_8365982 { +public class TestMemorySegment_ReassociateInvariants2 { public static MemorySegment a = MemorySegment.ofArray(new short[100_000]); public static MemorySegment b = MemorySegment.ofArray(new short[100_000]); @@ -76,19 +76,11 @@ public class TestMemorySegment_8365982 { // @IR(counts = {IRNode.STORE_VECTOR, "> 0", IRNode.REPLICATE_S, "> 0", - ".*multiversion.*", "> 0"}, // Bad: Sadly, we now multiversion + ".*multiversion.*", "= 0"}, phase = CompilePhase.PRINT_IDEAL, applyIfPlatform = {"64-bit", "true"}, applyIfAnd = {"AlignVector", "false", "ShortRunningLongLoop", "true"}, applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) - // Some but not all predicates are RCE'd at the beginning. After unrolling, we multiversion (why?). - // After PreMainPost, we can do more RangeCheck. Now the main-loop of the multiversion_fast loop - // does not have any range checks any more. - // Now it vectorizes. That's good, but we should be able to vectorize without multiversioning. - // - // If you see this IR rule fail: investigate JDK-8365982, possibly close it and fix this IR rule! - // Also: consider renaming the file to something more descriptive: what have you fixed with this? - // And: you may now be able to tighten IR rules in TestAliasingFuzzer.java public static void test(MemorySegment container_0, long invar0_0, MemorySegment container_1, long invar0_1, long ivLo, long ivHi) { for (long i = ivHi-1; i >= ivLo; i-=1) { container_0.set(ValueLayout.JAVA_CHAR_UNALIGNED, -47143L + -2L * i + -2L * invar0_0 + -1L * invar0_853 + -1L * invar1_853 + 0L * invar2_853, (char)0x0102030405060708L); From 17c13e53aff16b294c7c0286ccb6ea3054b1de91 Mon Sep 17 00:00:00 2001 From: Christoph Langer Date: Thu, 16 Oct 2025 07:54:23 +0000 Subject: [PATCH 146/561] 8369683: Exclude runtime/Monitor/MonitorWithDeadObjectTest.java#DumpThreadsBeforeDetach on Alpine Linux debug Reviewed-by: mbaesken, dholmes --- .../jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java b/test/hotspot/jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java index 7f9b44a4a76..b1e6d0aa8c7 100644 --- a/test/hotspot/jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java +++ b/test/hotspot/jtreg/runtime/Monitor/MonitorWithDeadObjectTest.java @@ -39,7 +39,8 @@ /* * @test id=DumpThreadsBeforeDetach - * @requires os.family != "windows" & os.family != "aix" + * @comment Temporarily exclude on Musl-C debug until JDK-8366133 is fixed. + * @requires os.family != "windows" & os.family != "aix" & (!vm.musl | !vm.debug) * @run main/othervm/native MonitorWithDeadObjectTest 1 */ From b5b83247da9caea30c88b69543e350783663bc46 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 16 Oct 2025 08:28:22 +0000 Subject: [PATCH 147/561] 8369656: Calling CompletableFuture.join() could execute task in common pool Reviewed-by: alanb, dl --- .../util/concurrent/CompletableFuture.java | 8 ++-- .../concurrent/tck/CompletableFutureTest.java | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java index 7503c154ddb..1338f2fd804 100644 --- a/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java +++ b/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java @@ -1904,8 +1904,8 @@ public class CompletableFuture implements Future, CompletionStage { while ((r = result) == null) { if (q == null) { q = new Signaller(interruptible, 0L, 0L); - if (Thread.currentThread() instanceof ForkJoinWorkerThread) - ForkJoinPool.helpAsyncBlocker(defaultExecutor(), q); + if (Thread.currentThread() instanceof ForkJoinWorkerThread wt) + ForkJoinPool.helpAsyncBlocker(wt.pool, q); } else if (!queued) queued = tryPushStack(q); @@ -1950,8 +1950,8 @@ public class CompletableFuture implements Future, CompletionStage { break; else if (q == null) { q = new Signaller(true, nanos, deadline); - if (Thread.currentThread() instanceof ForkJoinWorkerThread) - ForkJoinPool.helpAsyncBlocker(defaultExecutor(), q); + if (Thread.currentThread() instanceof ForkJoinWorkerThread wt) + ForkJoinPool.helpAsyncBlocker(wt.pool, q); } else if (!queued) queued = tryPushStack(q); diff --git a/test/jdk/java/util/concurrent/tck/CompletableFutureTest.java b/test/jdk/java/util/concurrent/tck/CompletableFutureTest.java index de3d1dd1050..fc86936d5da 100644 --- a/test/jdk/java/util/concurrent/tck/CompletableFutureTest.java +++ b/test/jdk/java/util/concurrent/tck/CompletableFutureTest.java @@ -58,6 +58,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.ForkJoinWorkerThread; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; @@ -5133,4 +5134,46 @@ public class CompletableFutureTest extends JSR166TestCase { checkCompletedWithWrappedException(g.toCompletableFuture(), r.ex); r.assertInvoked(); }} + + public void testOnlyHelpsIfInTheSamePool() throws Exception { + class Logic { + interface Extractor { ForkJoinPool pool(CompletableFuture cf) throws Exception; } + static final List executeInnerOuter( + ForkJoinPool outer, ForkJoinPool inner, Logic.Extractor extractor + ) throws Exception { + return CompletableFuture.supplyAsync(() -> + Stream.iterate(1, i -> i + 1) + .limit(64) + .map(i -> CompletableFuture.supplyAsync( + () -> Thread.currentThread() instanceof ForkJoinWorkerThread wt ? wt.getPool() : null, inner) + ) + .map(cf -> { + try { + return extractor.pool(cf); + } catch (Exception ex) { + throw new AssertionError("Unexpected", ex); + } + }) + .toList() + , outer).join(); + } + } + + List extractors = + List.of( + c -> c.get(60, SECONDS), + CompletableFuture::get, + CompletableFuture::join + ); + + try (var pool = new ForkJoinPool(2)) { + for (var extractor : extractors) { + for (var p : Logic.executeInnerOuter(pool, ForkJoinPool.commonPool(), extractor)) + assertTrue(p != pool); // The inners should have all been executed by commonPool + + for (var p : Logic.executeInnerOuter(pool, pool, extractor)) + assertTrue(p == pool); // The inners could have been helped by the outer + } + } + } } From 6e911d819efa0f14ab1f9009b5bf325d99edb26c Mon Sep 17 00:00:00 2001 From: Martin Doerr Date: Thu, 16 Oct 2025 09:40:55 +0000 Subject: [PATCH 148/561] 8368205: [TESTBUG] VectorMaskCompareNotTest.java crashes when MaxVectorSize=8 Reviewed-by: dzhang, epeter, rrich --- .../vectorapi/VectorMaskCompareNotTest.java | 2 +- test/jtreg-ext/requires/VMProps.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorMaskCompareNotTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorMaskCompareNotTest.java index 235093cceed..09185f63c69 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/VectorMaskCompareNotTest.java +++ b/test/hotspot/jtreg/compiler/vectorapi/VectorMaskCompareNotTest.java @@ -35,7 +35,7 @@ import jdk.test.lib.Asserts; * @library /test/lib / * @summary test combining vector not operation with compare * @modules jdk.incubator.vector - * @requires (os.arch != "riscv64" | (os.arch == "riscv64" & vm.cpu.features ~= ".*rvv.*")) + * @requires vm.opt.final.MaxVectorSize == "null" | vm.opt.final.MaxVectorSize >= 16 * * @run driver compiler.vectorapi.VectorMaskCompareNotTest */ diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index 29057f24d3b..3c06c97b37a 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -149,6 +149,7 @@ public class VMProps implements Callable> { vmGC(map); // vm.gc.X = true/false vmGCforCDS(map); // may set vm.gc vmOptFinalFlags(map); + vmOptFinalIntxFlags(map); dump(map.map); log("Leaving call()"); @@ -389,6 +390,26 @@ public class VMProps implements Callable> { vmOptFinalFlag(map, "UseVectorizedMismatchIntrinsic"); } + /** + * Selected final flag of type intx. + * + * @param map - property-value pairs + * @param flagName - flag name + */ + private void vmOptFinalIntxFlag(SafeMap map, String flagName) { + map.put("vm.opt.final." + flagName, + () -> String.valueOf(WB.getIntxVMFlag(flagName))); + } + + /** + * Selected sets of final flags of type intx. + * + * @param map - property-value pairs + */ + protected void vmOptFinalIntxFlags(SafeMap map) { + vmOptFinalIntxFlag(map, "MaxVectorSize"); + } + /** * @return "true" if VM has a serviceability agent. */ From d6c122b3ff1ccd559ba9c310976a77eefaf09ece Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Thu, 16 Oct 2025 09:57:11 +0000 Subject: [PATCH 149/561] 8369982: ProblemList jdk/jfr/jvm/TestWaste.java Reviewed-by: tschatzl, dholmes --- test/jdk/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index c305bc0bbeb..0e69446ae35 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -750,6 +750,7 @@ jdk/incubator/vector/LoadJsvmlTest.java 8305390 windows- jdk/jfr/event/compiler/TestCodeSweeper.java 8338127 generic-all jdk/jfr/event/oldobject/TestShenandoah.java 8342951 generic-all jdk/jfr/event/runtime/TestResidentSetSizeEvent.java 8309846 aix-ppc64 +jdk/jfr/jvm/TestWaste.java 8369949 generic-all ############################################################################ From ead35a754bf3a545a1b68f28d3d939750f11af39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Jeli=C5=84ski?= Date: Thu, 16 Oct 2025 11:05:13 +0000 Subject: [PATCH 150/561] 8358942: HttpClient adds Content-Length: 0 for a GET request with a BodyPublishers.noBody() Reviewed-by: dfuchs, vyazici --- .../jdk/internal/net/http/Http1Request.java | 11 +- .../httpclient/ContentLengthHeaderTest.java | 154 +++++++++++++++--- 2 files changed, 136 insertions(+), 29 deletions(-) diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java b/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java index 815b6bad20c..8d28b664036 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/Http1Request.java @@ -290,7 +290,8 @@ class Http1Request { } String uriString = requestURI(); StringBuilder sb = new StringBuilder(64); - sb.append(request.method()) + String method = request.method(); + sb.append(method) .append(' ') .append(uriString) .append(" HTTP/1.1\r\n"); @@ -300,11 +301,15 @@ class Http1Request { systemHeadersBuilder.setHeader("Host", hostString()); } - // GET, HEAD and DELETE with no request body should not set the Content-Length header if (requestPublisher != null) { contentLength = requestPublisher.contentLength(); if (contentLength == 0) { - systemHeadersBuilder.setHeader("Content-Length", "0"); + // PUT and POST with no request body should set the Content-Length header + // even when the content is empty. + // Other methods defined in RFC 9110 should not send the header in that case. + if ("POST".equals(method) || "PUT".equals(method)) { + systemHeadersBuilder.setHeader("Content-Length", "0"); + } } else if (contentLength > 0) { systemHeadersBuilder.setHeader("Content-Length", Long.toString(contentLength)); streaming = false; diff --git a/test/jdk/java/net/httpclient/ContentLengthHeaderTest.java b/test/jdk/java/net/httpclient/ContentLengthHeaderTest.java index f302de4ee48..d7c77d0690a 100644 --- a/test/jdk/java/net/httpclient/ContentLengthHeaderTest.java +++ b/test/jdk/java/net/httpclient/ContentLengthHeaderTest.java @@ -29,8 +29,9 @@ * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext * jdk.httpclient.test.lib.common.HttpServerAdapters - * @bug 8283544 + * @bug 8283544 8358942 * @run testng/othervm + * -Djdk.httpclient.allowRestrictedHeaders=content-length * -Djdk.internal.httpclient.debug=true * ContentLengthHeaderTest */ @@ -95,8 +96,8 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { testContentLengthServerH2.addHandler(new NoContentLengthHandler(), NO_BODY_PATH); testContentLengthServerH3.addHandler(new NoContentLengthHandler(), NO_BODY_PATH); testContentLengthServerH1.addHandler(new ContentLengthHandler(), BODY_PATH); - testContentLengthServerH2.addHandler(new OptionalContentLengthHandler(), BODY_PATH); - testContentLengthServerH3.addHandler(new OptionalContentLengthHandler(), BODY_PATH); + testContentLengthServerH2.addHandler(new ContentLengthHandler(), BODY_PATH); + testContentLengthServerH3.addHandler(new ContentLengthHandler(), BODY_PATH); testContentLengthURIH1 = URIBuilder.newBuilder() .scheme("http") .loopback() @@ -163,6 +164,13 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { }; } + @DataProvider(name = "h1body") + Object[][] h1body() { + return new Object[][]{ + {HTTP_1_1, URI.create(testContentLengthURIH1 + BODY_PATH)} + }; + } + @DataProvider(name = "nobodies") Object[][] nobodies() { return new Object[][]{ @@ -186,6 +194,35 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { assertEquals(resp.version(), version); } + @Test(dataProvider = "nobodies") + // A GET request with empty request body should have no Content-length header + public void getWithEmptyBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking GET with no request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("GET", HttpRequest.BodyPublishers.noBody()) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + + @Test(dataProvider = "bodies") + // A GET request with empty request body and explicitly added Content-length header + public void getWithZeroContentLength(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking GET with no request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("GET", HttpRequest.BodyPublishers.noBody()) + .header("Content-length", "0") + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + @Test(dataProvider = "bodies") // A GET request with a request body should have a Content-length header // in HTTP/1.1 @@ -215,6 +252,20 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { assertEquals(resp.version(), version); } + @Test(dataProvider = "nobodies") + // A DELETE request with empty request body should have no Content-length header + public void deleteWithEmptyBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking DELETE with no request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("DELETE", HttpRequest.BodyPublishers.noBody()) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + @Test(dataProvider = "bodies") // A DELETE request with a request body should have a Content-length header // in HTTP/1.1 @@ -244,6 +295,20 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { assertEquals(resp.version(), version); } + @Test(dataProvider = "nobodies") + // A HEAD request with empty request body should have no Content-length header + public void headWithEmptyBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking HEAD with no request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("HEAD", HttpRequest.BodyPublishers.noBody()) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + @Test(dataProvider = "bodies") // A HEAD request with a request body should have a Content-length header // in HTTP/1.1 @@ -261,6 +326,66 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { assertEquals(resp.version(), version); } + @Test(dataProvider = "h1body") + // A POST request with empty request body should have a Content-length header + // in HTTP/1.1 + public void postWithEmptyBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking POST with request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("POST", HttpRequest.BodyPublishers.noBody()) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + + @Test(dataProvider = "bodies") + // A POST request with a request body should have a Content-length header + // in HTTP/1.1 + public void postWithBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking POST with request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .POST(HttpRequest.BodyPublishers.ofString("POST Body")) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + + @Test(dataProvider = "h1body") + // A PUT request with empty request body should have a Content-length header + // in HTTP/1.1 + public void putWithEmptyBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking PUT with request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .method("PUT", HttpRequest.BodyPublishers.noBody()) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + + @Test(dataProvider = "bodies") + // A PUT request with a request body should have a Content-length header + // in HTTP/1.1 + public void putWithBody(Version version, URI uri) throws IOException, InterruptedException { + testLog.println(version + " Checking PUT with request body"); + HttpRequest req = HttpRequest.newBuilder() + .version(version) + .PUT(HttpRequest.BodyPublishers.ofString("PUT Body")) + .uri(uri) + .build(); + HttpResponse resp = hc.send(req, HttpResponse.BodyHandlers.ofString(UTF_8)); + assertEquals(resp.statusCode(), 200, resp.body()); + assertEquals(resp.version(), version); + } + public static void handleResponse(long expected, HttpTestExchange ex, String body, int rCode) throws IOException { try (InputStream is = ex.getRequestBody()) { byte[] reqBody = is.readAllBytes(); @@ -324,27 +449,4 @@ public class ContentLengthHeaderTest implements HttpServerAdapters { } } } - - /** - * A handler used for cases where the presence of a Content-Length - * header is optional. If present, its value must match the number of - * bytes sent in the request body. - */ - static class OptionalContentLengthHandler implements HttpTestHandler { - - @Override - public void handle(HttpTestExchange exchange) throws IOException { - testLog.println("OptionalContentLengthHandler: Received Headers " - + exchange.getRequestHeaders().entrySet() + - " from " + exchange.getRequestMethod() + " request."); - Optional contentLength = exchange.getRequestHeaders().firstValue("Content-Length"); - - // Check Content-length header was set - if (contentLength.isPresent()) { - handleResponse(Long.parseLong(contentLength.get()), exchange, "Request completed", 200); - } else { - handleResponse(-1, exchange, "Request completed, no content length", 200); - } - } - } } From 5fc3904bfe290625ed6cf9b41773b35b52bf72b7 Mon Sep 17 00:00:00 2001 From: Stefan Karlsson Date: Thu, 16 Oct 2025 11:16:05 +0000 Subject: [PATCH 151/561] 8369491: Temporarily revert default TIMEOUT_FACTOR back to 4 Reviewed-by: lkorinth, cstein, jpai, syan, serb, prr --- doc/testing.html | 2 +- doc/testing.md | 2 +- make/RunTests.gmk | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/testing.html b/doc/testing.html index 89a9b1b23b7..b9838735e4f 100644 --- a/doc/testing.html +++ b/doc/testing.html @@ -450,7 +450,7 @@ itself (-timeoutFactor). Also, some test cases that programmatically wait a certain amount of time will apply this factor. If we run in forced compilation mode (-Xcomp), the build system will automatically adjust this factor to compensate for less -performance. Defaults to 1.

    +performance. Defaults to 4.

    FAILURE_HANDLER_TIMEOUT

    Sets the argument -timeoutHandlerTimeout for JTReg. The default value is 0. This is only valid if the failure handler is diff --git a/doc/testing.md b/doc/testing.md index 324f9645c27..0144610a5bf 100644 --- a/doc/testing.md +++ b/doc/testing.md @@ -387,7 +387,7 @@ The `TIMEOUT_FACTOR` is forwarded to JTReg framework itself (`-timeoutFactor`). Also, some test cases that programmatically wait a certain amount of time will apply this factor. If we run in forced compilation mode (`-Xcomp`), the build system will automatically -adjust this factor to compensate for less performance. Defaults to 1. +adjust this factor to compensate for less performance. Defaults to 4. #### FAILURE_HANDLER_TIMEOUT diff --git a/make/RunTests.gmk b/make/RunTests.gmk index 7b05a0ba12f..947389f64f9 100644 --- a/make/RunTests.gmk +++ b/make/RunTests.gmk @@ -946,8 +946,8 @@ define SetupRunJtregTestBody JTREG_ALL_OPTIONS := $$(JTREG_JAVA_OPTIONS) $$(JTREG_VM_OPTIONS) JTREG_AUTO_PROBLEM_LISTS := - # Please reach consensus before changing this. It was not easy changing it to a `1`. - JTREG_AUTO_TIMEOUT_FACTOR := 1 + # Please reach consensus before changing this. + JTREG_AUTO_TIMEOUT_FACTOR := 4 ifneq ($$(findstring -Xcomp, $$(JTREG_ALL_OPTIONS)), ) JTREG_AUTO_PROBLEM_LISTS += ProblemList-Xcomp.txt From 1653999871c8d7b1e61b44f8525e09b2cd0bdb6b Mon Sep 17 00:00:00 2001 From: Yasumasa Suenaga Date: Thu, 16 Oct 2025 12:45:05 +0000 Subject: [PATCH 152/561] 8369505: jhsdb jstack cannot handle continuation stub Reviewed-by: cjplummer, pchilanomate --- .../share/runtime/continuationEntry.hpp | 1 + src/hotspot/share/runtime/vmStructs.cpp | 5 +- .../sun/jvm/hotspot/code/CodeBlob.java | 2 + .../hotspot/runtime/ContinuationEntry.java | 63 ++++++++++++++ .../sun/jvm/hotspot/runtime/JavaThread.java | 6 ++ .../hotspot/runtime/aarch64/AARCH64Frame.java | 18 +++- .../hotspot/runtime/riscv64/RISCV64Frame.java | 18 +++- .../sun/jvm/hotspot/runtime/x86/X86Frame.java | 18 +++- .../sa/LingeredAppWithVirtualThread.java | 87 +++++++++++++++++++ .../sa/TestJhsdbJstackWithVirtualThread.java | 83 ++++++++++++++++++ 10 files changed, 297 insertions(+), 4 deletions(-) create mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ContinuationEntry.java create mode 100644 test/hotspot/jtreg/serviceability/sa/LingeredAppWithVirtualThread.java create mode 100644 test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java diff --git a/src/hotspot/share/runtime/continuationEntry.hpp b/src/hotspot/share/runtime/continuationEntry.hpp index 8361f2f912b..490293f5b11 100644 --- a/src/hotspot/share/runtime/continuationEntry.hpp +++ b/src/hotspot/share/runtime/continuationEntry.hpp @@ -39,6 +39,7 @@ class RegisterMap; // Metadata stored in the continuation entry frame class ContinuationEntry { + friend class VMStructs; friend class JVMCIVMStructs; ContinuationEntryPD _pd; #ifdef ASSERT diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index dee0a5d4eb7..8dc4b660f91 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -616,6 +616,7 @@ nonstatic_field(JavaThread, _active_handles, JNIHandleBlock*) \ nonstatic_field(JavaThread, _monitor_owner_id, int64_t) \ volatile_nonstatic_field(JavaThread, _terminated, JavaThread::TerminatedTypes) \ + nonstatic_field(JavaThread, _cont_entry, ContinuationEntry*) \ nonstatic_field(Thread, _osthread, OSThread*) \ \ /************/ \ @@ -796,7 +797,8 @@ nonstatic_field(Mutex, _name, const char*) \ static_field(Mutex, _mutex_array, Mutex**) \ static_field(Mutex, _num_mutex, int) \ - volatile_nonstatic_field(Mutex, _owner, Thread*) + volatile_nonstatic_field(Mutex, _owner, Thread*) \ + static_field(ContinuationEntry, _return_pc, address) //-------------------------------------------------------------------------------- // VM_TYPES @@ -1270,6 +1272,7 @@ declare_toplevel_type(FileMapHeader) \ declare_toplevel_type(CDSFileMapRegion) \ declare_toplevel_type(UpcallStub::FrameData) \ + declare_toplevel_type(ContinuationEntry) \ \ /************/ \ /* GC types */ \ diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/CodeBlob.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/CodeBlob.java index 20c5fabf8bc..12469efc67e 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/CodeBlob.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/CodeBlob.java @@ -180,6 +180,8 @@ public class CodeBlob extends VMObject { public boolean isUpcallStub() { return getKind() == UpcallKind; } + public boolean isContinuationStub() { return getName().equals("StubRoutines (continuation stubs)"); } + public boolean isJavaMethod() { return false; } public boolean isNativeMethod() { return false; } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ContinuationEntry.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ContinuationEntry.java new file mode 100644 index 00000000000..73152bdee84 --- /dev/null +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ContinuationEntry.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, NTT DATA. + * 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. + * + */ + +package sun.jvm.hotspot.runtime; + +import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.runtime.*; +import sun.jvm.hotspot.types.*; + + +public class ContinuationEntry extends VMObject { + private static long size; + private static Address returnPC; + + static { + VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase())); + } + + private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { + Type type = db.lookupType("ContinuationEntry"); + size = type.getSize(); + returnPC = type.getAddressField("_return_pc").getValue(); + } + + public ContinuationEntry(Address addr) { + super(addr); + } + + public Address getEntryPC() { + return returnPC; + } + + public Address getEntrySP(){ + return this.getAddress(); + } + + public Address getEntryFP(){ + return this.getAddress().addOffsetTo(size); + } + +} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaThread.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaThread.java index d92f464f0d2..826b5cecfd5 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaThread.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/JavaThread.java @@ -47,6 +47,7 @@ public class JavaThread extends Thread { private static AddressField stackBaseField; private static CIntegerField stackSizeField; private static CIntegerField terminatedField; + private static AddressField contEntryField; private static AddressField activeHandlesField; private static CIntegerField monitorOwnerIDField; private static long oopPtrSize; @@ -95,6 +96,7 @@ public class JavaThread extends Thread { stackBaseField = type.getAddressField("_stack_base"); stackSizeField = type.getCIntegerField("_stack_size"); terminatedField = type.getCIntegerField("_terminated"); + contEntryField = type.getAddressField("_cont_entry"); activeHandlesField = type.getAddressField("_active_handles"); monitorOwnerIDField = type.getCIntegerField("_monitor_owner_id"); @@ -340,6 +342,10 @@ public class JavaThread extends Thread { return (int) terminatedField.getValue(addr); } + public ContinuationEntry getContEntry() { + return VMObjectFactory.newObject(ContinuationEntry.class, contEntryField.getValue(addr)); + } + /** Gets the Java-side thread object for this JavaThread */ public Oop getThreadObj() { Oop obj = null; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/aarch64/AARCH64Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/aarch64/AARCH64Frame.java index a5aa7ce4405..5ae4cb703b3 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/aarch64/AARCH64Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/aarch64/AARCH64Frame.java @@ -270,7 +270,13 @@ public class AARCH64Frame extends Frame { } if (cb != null) { - return cb.isUpcallStub() ? senderForUpcallStub(map, (UpcallStub)cb) : senderForCompiledFrame(map, cb); + if (cb.isUpcallStub()) { + return senderForUpcallStub(map, (UpcallStub)cb); + } else if (cb.isContinuationStub()) { + return senderForContinuationStub(map, cb); + } else { + return senderForCompiledFrame(map, cb); + } } // Must be native-compiled frame, i.e. the marshaling code for native @@ -356,6 +362,16 @@ public class AARCH64Frame extends Frame { map.setLocation(fp, savedFPAddr); } + private Frame senderForContinuationStub(AARCH64RegisterMap map, CodeBlob cb) { + var contEntry = map.getThread().getContEntry(); + + Address senderSP = contEntry.getEntrySP(); + Address senderPC = contEntry.getEntryPC(); + Address senderFP = contEntry.getEntryFP(); + + return new AARCH64Frame(senderSP, senderFP, senderPC); + } + private Frame senderForCompiledFrame(AARCH64RegisterMap map, CodeBlob cb) { if (DEBUG) { System.out.println("senderForCompiledFrame"); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java index e02e056f028..44c8f4c679c 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/riscv64/RISCV64Frame.java @@ -262,7 +262,13 @@ public class RISCV64Frame extends Frame { } if (cb != null) { - return cb.isUpcallStub() ? senderForUpcallStub(map, (UpcallStub)cb) : senderForCompiledFrame(map, cb); + if (cb.isUpcallStub()) { + return senderForUpcallStub(map, (UpcallStub)cb); + } else if (cb.isContinuationStub()) { + return senderForContinuationStub(map, cb); + } else { + return senderForCompiledFrame(map, cb); + } } // Must be native-compiled frame, i.e. the marshaling code for native @@ -348,6 +354,16 @@ public class RISCV64Frame extends Frame { map.setLocation(fp, savedFPAddr); } + private Frame senderForContinuationStub(RISCV64RegisterMap map, CodeBlob cb) { + var contEntry = map.getThread().getContEntry(); + + Address senderSP = contEntry.getEntrySP(); + Address senderPC = contEntry.getEntryPC(); + Address senderFP = contEntry.getEntryFP(); + + return new RISCV64Frame(senderSP, senderFP, senderPC); + } + private Frame senderForCompiledFrame(RISCV64RegisterMap map, CodeBlob cb) { if (DEBUG) { System.out.println("senderForCompiledFrame"); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java index 3ee4f0a8158..2d972d3df17 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java @@ -270,7 +270,13 @@ public class X86Frame extends Frame { } if (cb != null) { - return cb.isUpcallStub() ? senderForUpcallStub(map, (UpcallStub)cb) : senderForCompiledFrame(map, cb); + if (cb.isUpcallStub()) { + return senderForUpcallStub(map, (UpcallStub)cb); + } else if (cb.isContinuationStub()) { + return senderForContinuationStub(map, cb); + } else { + return senderForCompiledFrame(map, cb); + } } // Must be native-compiled frame, i.e. the marshaling code for native @@ -356,6 +362,16 @@ public class X86Frame extends Frame { map.setLocation(rbp, savedFPAddr); } + private Frame senderForContinuationStub(X86RegisterMap map, CodeBlob cb) { + var contEntry = map.getThread().getContEntry(); + + Address senderSP = contEntry.getEntrySP(); + Address senderPC = contEntry.getEntryPC(); + Address senderFP = contEntry.getEntryFP(); + + return new X86Frame(senderSP, senderFP, senderPC); + } + private Frame senderForCompiledFrame(X86RegisterMap map, CodeBlob cb) { if (DEBUG) { System.out.println("senderForCompiledFrame"); diff --git a/test/hotspot/jtreg/serviceability/sa/LingeredAppWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithVirtualThread.java new file mode 100644 index 00000000000..ca98506e133 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/sa/LingeredAppWithVirtualThread.java @@ -0,0 +1,87 @@ + +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, NTT DATA + * 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. + */ + +import java.lang.invoke.MethodHandle; +import java.lang.foreign.Arena; +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.Linker; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.SymbolLookup; +import java.lang.foreign.ValueLayout; +import java.util.concurrent.CountDownLatch; + +import jdk.test.lib.apps.LingeredApp; + +public class LingeredAppWithVirtualThread extends LingeredApp implements Runnable { + + private static final String THREAD_NAME = "target thread"; + + private static final MethodHandle hndSleep; + + private static final int sleepArg; + + private static final CountDownLatch signal = new CountDownLatch(1); + + static { + MemorySegment func; + if (System.getProperty("os.name").startsWith("Windows")) { + func = SymbolLookup.libraryLookup("Kernel32", Arena.global()) + .findOrThrow("Sleep"); + sleepArg = 3600_000; // 1h in milliseconds + } else { + func = Linker.nativeLinker() + .defaultLookup() + .findOrThrow("sleep"); + sleepArg = 3600; // 1h in seconds + } + + var desc = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT); + hndSleep = Linker.nativeLinker().downcallHandle(func, desc); + } + + @Override + public void run() { + Thread.yield(); + signal.countDown(); + try { + hndSleep.invoke(sleepArg); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + public static void main(String[] args) { + try { + Thread.ofVirtual() + .name(THREAD_NAME) + .start(new LingeredAppWithVirtualThread()); + + signal.await(); + LingeredApp.main(args); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java new file mode 100644 index 00000000000..fce9906ca94 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, NTT DATA + * 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. + */ + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import jdk.test.lib.JDKToolLauncher; +import jdk.test.lib.SA.SATestUtils; +import jdk.test.lib.Utils; +import jdk.test.lib.apps.LingeredApp; +import jdk.test.lib.process.OutputAnalyzer; + +/** + * @test + * @bug 8369505 + * @requires vm.hasSA + * @requires (os.arch == "amd64" | os.arch == "x86_64" | os.arch == "aarch64" | os.arch == "riscv64") + * @library /test/lib + * @run driver TestJhsdbJstackWithVirtualThread + */ +public class TestJhsdbJstackWithVirtualThread { + + private static void runJstack(LingeredApp app) throws Exception { + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb"); + launcher.addVMArgs(Utils.getTestJavaOpts()); + launcher.addToolArg("jstack"); + launcher.addToolArg("--pid"); + launcher.addToolArg(Long.toString(app.getPid())); + + ProcessBuilder pb = SATestUtils.createProcessBuilder(launcher); + Process jhsdb = pb.start(); + OutputAnalyzer out = new OutputAnalyzer(jhsdb); + + jhsdb.waitFor(); + + System.out.println(out.getStdout()); + System.err.println(out.getStderr()); + + out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.shouldNotContain("must have non-zero frame size"); + } + + public static void main(String... args) throws Exception { + SATestUtils.skipIfCannotAttach(); // throws SkippedException if attach not expected to work. + LingeredApp app = null; + + try { + app = new LingeredAppWithVirtualThread(); + LingeredApp.startApp(app); + System.out.println("Started LingeredApp with pid " + app.getPid()); + runJstack(app); + System.out.println("Test Completed"); + } catch (Throwable e) { + e.printStackTrace(); + throw e; + } finally { + LingeredApp.stopApp(app); + } + } +} From f475eb8ee7c9a3e360b2f1210ed71b629243cd2a Mon Sep 17 00:00:00 2001 From: Hamlin Li Date: Thu, 16 Oct 2025 14:04:45 +0000 Subject: [PATCH 153/561] 8368950: RISC-V: fail to catch out of order declarations among dependent cpu extensions/flags Reviewed-by: fyang, luhenry --- src/hotspot/cpu/riscv/vm_version_riscv.hpp | 100 +++++++++++------- .../os_cpu/linux_riscv/riscv_hwprobe.cpp | 87 +++++++-------- 2 files changed, 108 insertions(+), 79 deletions(-) diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp index 346ca35dc1e..3d555d47e9f 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp @@ -64,41 +64,12 @@ class VM_Version : public Abstract_VM_Version { virtual void disable_feature() { _value = -1; } - const char* pretty() { return _pretty; } - uint64_t feature_bit() { return _linux_feature_bit; } - bool feature_string() { return _feature_string; } - int64_t value() { return _value; } + const char* pretty() { return _pretty; } + uint64_t feature_bit() { return _linux_feature_bit; } + bool feature_string() { return _feature_string; } + int64_t value() { return _value; } virtual bool enabled() = 0; virtual void update_flag() = 0; - - protected: - bool deps_all_enabled(RVFeatureValue* dep0, ...) { - assert(dep0 != nullptr, "must not"); - - va_list va; - va_start(va, dep0); - RVFeatureValue* next = dep0; - bool enabled = true; - while (next != nullptr && enabled) { - enabled = next->enabled(); - next = va_arg(va, RVFeatureValue*); - } - va_end(va); - return enabled; - } - - void deps_string(stringStream& ss, RVFeatureValue* dep0, ...) { - assert(dep0 != nullptr, "must not"); - ss.print("%s (%s)", dep0->pretty(), dep0->enabled() ? "enabled" : "disabled"); - - va_list va; - va_start(va, dep0); - RVFeatureValue* next = nullptr; - while ((next = va_arg(va, RVFeatureValue*)) != nullptr) { - ss.print(", %s (%s)", next->pretty(), next->enabled() ? "enabled" : "disabled"); - } - va_end(va); - } }; #define UPDATE_DEFAULT(flag) \ @@ -117,8 +88,9 @@ class VM_Version : public Abstract_VM_Version { #define UPDATE_DEFAULT_DEP(flag, dep0, ...) \ void update_flag() { \ assert(enabled(), "Must be."); \ + DEBUG_ONLY(verify_deps(dep0, ##__VA_ARGS__)); \ if (FLAG_IS_DEFAULT(flag)) { \ - if (this->deps_all_enabled(dep0, ##__VA_ARGS__)) { \ + if (deps_all_enabled(dep0, ##__VA_ARGS__)) { \ FLAG_SET_DEFAULT(flag, true); \ } else { \ FLAG_SET_DEFAULT(flag, false); \ @@ -149,11 +121,16 @@ class VM_Version : public Abstract_VM_Version { class RVExtFeatureValue : public RVFeatureValue { const uint32_t _cpu_feature_index; + public: RVExtFeatureValue(const char* pretty, int linux_bit_num, uint32_t cpu_feature_index, bool fstring) : RVFeatureValue(pretty, linux_bit_num, fstring), _cpu_feature_index(cpu_feature_index) { } + int cpu_feature_index() { + // Can be used to check, for example, v is declared before Zvfh in RV_EXT_FEATURE_FLAGS. + return _cpu_feature_index; + } bool enabled() { return RVExtFeatures::current()->support_feature(_cpu_feature_index); } @@ -165,6 +142,57 @@ class VM_Version : public Abstract_VM_Version { RVFeatureValue::disable_feature(); RVExtFeatures::current()->clear_feature(_cpu_feature_index); } + + protected: + bool deps_all_enabled(RVExtFeatureValue* dep0, ...) { + assert(dep0 != nullptr, "must not"); + + va_list va; + va_start(va, dep0); + RVExtFeatureValue* next = dep0; + bool enabled = true; + while (next != nullptr && enabled) { + enabled = next->enabled(); + next = va_arg(va, RVExtFeatureValue*); + } + va_end(va); + return enabled; + } + + void deps_string(stringStream& ss, RVExtFeatureValue* dep0, ...) { + assert(dep0 != nullptr, "must not"); + ss.print("%s (%s)", dep0->pretty(), dep0->enabled() ? "enabled" : "disabled"); + + va_list va; + va_start(va, dep0); + RVExtFeatureValue* next = nullptr; + while ((next = va_arg(va, RVExtFeatureValue*)) != nullptr) { + ss.print(", %s (%s)", next->pretty(), next->enabled() ? "enabled" : "disabled"); + } + va_end(va); + } + +#ifdef ASSERT + void verify_deps(RVExtFeatureValue* dep0, ...) { + assert(dep0 != nullptr, "must not"); + assert(cpu_feature_index() >= 0, "must"); + + va_list va; + va_start(va, dep0); + RVExtFeatureValue* next = dep0; + while (next != nullptr) { + assert(next->cpu_feature_index() >= 0, "must"); + // We only need to check depenency relationship for extension flags. + // The dependant ones must be declared before this, for example, v must be declared + // before Zvfh in RV_EXT_FEATURE_FLAGS. The reason is in setup_cpu_available_features + // we need to make sure v is `update_flag`ed before Zvfh, so Zvfh is `update_flag`ed + // based on v. + assert(cpu_feature_index() > next->cpu_feature_index(), "Invalid"); + next = va_arg(va, RVExtFeatureValue*); + } + va_end(va); + } +#endif // ASSERT }; class RVNonExtFeatureValue : public RVFeatureValue { @@ -282,14 +310,14 @@ class VM_Version : public Abstract_VM_Version { decl(marchid , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ /* A unique encoding of the version of the processor implementation. */ \ decl(mimpid , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ + /* Manufactory JEDEC id encoded, ISA vol 2 3.1.2.. */ \ + decl(mvendorid , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ /* SATP bits (number of virtual addr bits) mbare, sv39, sv48, sv57, sv64 */ \ decl(satp_mode , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ /* Performance of misaligned scalar accesses (unknown, emulated, slow, fast, unsupported) */ \ decl(unaligned_scalar , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ /* Performance of misaligned vector accesses (unknown, unspported, slow, fast) */ \ decl(unaligned_vector , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ - /* Manufactory JEDEC id encoded, ISA vol 2 3.1.2.. */ \ - decl(mvendorid , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ decl(zicboz_block_size , RV_NO_FLAG_BIT, false, NO_UPDATE_DEFAULT) \ #define DECLARE_RV_NON_EXT_FEATURE(PRETTY, LINUX_BIT, FSTRING, FLAGF) \ diff --git a/src/hotspot/os_cpu/linux_riscv/riscv_hwprobe.cpp b/src/hotspot/os_cpu/linux_riscv/riscv_hwprobe.cpp index 017d8a43666..ec756c44fe6 100644 --- a/src/hotspot/os_cpu/linux_riscv/riscv_hwprobe.cpp +++ b/src/hotspot/os_cpu/linux_riscv/riscv_hwprobe.cpp @@ -167,27 +167,20 @@ static bool is_set(int64_t key, uint64_t value_mask) { void RiscvHwprobe::add_features_from_query_result() { assert(rw_hwprobe_completed, "hwprobe not init yet."); - if (is_valid(RISCV_HWPROBE_KEY_MVENDORID)) { - VM_Version::mvendorid.enable_feature(query[RISCV_HWPROBE_KEY_MVENDORID].value); - } - if (is_valid(RISCV_HWPROBE_KEY_MARCHID)) { - VM_Version::marchid.enable_feature(query[RISCV_HWPROBE_KEY_MARCHID].value); - } - if (is_valid(RISCV_HWPROBE_KEY_MIMPID)) { - VM_Version::mimpid.enable_feature(query[RISCV_HWPROBE_KEY_MIMPID].value); - } + // ====== extensions ====== + // if (is_set(RISCV_HWPROBE_KEY_BASE_BEHAVIOR, RISCV_HWPROBE_BASE_BEHAVIOR_IMA)) { + VM_Version::ext_a.enable_feature(); VM_Version::ext_i.enable_feature(); VM_Version::ext_m.enable_feature(); - VM_Version::ext_a.enable_feature(); - } - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_IMA_FD)) { - VM_Version::ext_f.enable_feature(); - VM_Version::ext_d.enable_feature(); } if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_IMA_C)) { VM_Version::ext_c.enable_feature(); } + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_IMA_FD)) { + VM_Version::ext_d.enable_feature(); + VM_Version::ext_f.enable_feature(); + } if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_IMA_V)) { // Linux signal return bug when using vector with vlen > 128b in pre 6.8.5. long major, minor, patch; @@ -202,21 +195,29 @@ void RiscvHwprobe::add_features_from_query_result() { VM_Version::ext_v.enable_feature(); } } + +#ifndef PRODUCT + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZACAS)) { + VM_Version::ext_Zacas.enable_feature(); + } +#endif if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZBA)) { VM_Version::ext_Zba.enable_feature(); } if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZBB)) { VM_Version::ext_Zbb.enable_feature(); } +#ifndef PRODUCT + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZBKB)) { + VM_Version::ext_Zbkb.enable_feature(); + } +#endif if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZBS)) { VM_Version::ext_Zbs.enable_feature(); } #ifndef PRODUCT - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZICBOZ)) { - VM_Version::ext_Zicboz.enable_feature(); - } - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZBKB)) { - VM_Version::ext_Zbkb.enable_feature(); + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZFA)) { + VM_Version::ext_Zfa.enable_feature(); } #endif if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZFH)) { @@ -226,15 +227,28 @@ void RiscvHwprobe::add_features_from_query_result() { VM_Version::ext_Zfhmin.enable_feature(); } #ifndef PRODUCT + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZICBOZ)) { + VM_Version::ext_Zicboz.enable_feature(); + } + // Currently tests shows that cmove using Zicond instructions will bring + // performance regression, but to get a test coverage all the time, will + // still prefer to enabling it in debug version. + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZICOND)) { + VM_Version::ext_Zicond.enable_feature(); + } + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZTSO)) { + VM_Version::ext_Ztso.enable_feature(); + } if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVBB)) { VM_Version::ext_Zvbb.enable_feature(); } -#endif -#ifndef PRODUCT if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVBC)) { VM_Version::ext_Zvbc.enable_feature(); } #endif + if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVFH)) { + VM_Version::ext_Zvfh.enable_feature(); + } #ifndef PRODUCT if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVKNED) && is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVKNHB) && @@ -243,30 +257,18 @@ void RiscvHwprobe::add_features_from_query_result() { VM_Version::ext_Zvkn.enable_feature(); } #endif - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZVFH)) { - VM_Version::ext_Zvfh.enable_feature(); + + // ====== non-extensions ====== + // + if (is_valid(RISCV_HWPROBE_KEY_MARCHID)) { + VM_Version::marchid.enable_feature(query[RISCV_HWPROBE_KEY_MARCHID].value); } -#ifndef PRODUCT - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZFA)) { - VM_Version::ext_Zfa.enable_feature(); + if (is_valid(RISCV_HWPROBE_KEY_MIMPID)) { + VM_Version::mimpid.enable_feature(query[RISCV_HWPROBE_KEY_MIMPID].value); } -#endif -#ifndef PRODUCT - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZTSO)) { - VM_Version::ext_Ztso.enable_feature(); + if (is_valid(RISCV_HWPROBE_KEY_MVENDORID)) { + VM_Version::mvendorid.enable_feature(query[RISCV_HWPROBE_KEY_MVENDORID].value); } -#endif -#ifndef PRODUCT - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZACAS)) { - VM_Version::ext_Zacas.enable_feature(); - } - // Currently tests shows that cmove using Zicond instructions will bring - // performance regression, but to get a test coverage all the time, will - // still prefer to enabling it in debug version. - if (is_set(RISCV_HWPROBE_KEY_IMA_EXT_0, RISCV_HWPROBE_EXT_ZICOND)) { - VM_Version::ext_Zicond.enable_feature(); - } -#endif // RISCV_HWPROBE_KEY_CPUPERF_0 is deprecated and returns similar values // to RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF. Keep it there for backward // compatibility with old kernels. @@ -277,7 +279,6 @@ void RiscvHwprobe::add_features_from_query_result() { VM_Version::unaligned_scalar.enable_feature( query[RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF].value); } - if (is_valid(RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF)) { VM_Version::unaligned_vector.enable_feature( query[RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF].value); From 5dfe115ce1fbcff67777518a3c23a7560ebec423 Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Thu, 16 Oct 2025 14:10:14 +0000 Subject: [PATCH 154/561] 8369912: [TESTBUG] testlibrary_tests/template_framework/examples/TestExpressions.java fails with ArithmeticException: / by zero - forgot to respect Expression.info Reviewed-by: kvn, mhaessig --- .../examples/TestExpressions.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/test/hotspot/jtreg/testlibrary_tests/template_framework/examples/TestExpressions.java b/test/hotspot/jtreg/testlibrary_tests/template_framework/examples/TestExpressions.java index 6e11a705054..c21d2492fc7 100644 --- a/test/hotspot/jtreg/testlibrary_tests/template_framework/examples/TestExpressions.java +++ b/test/hotspot/jtreg/testlibrary_tests/template_framework/examples/TestExpressions.java @@ -70,29 +70,52 @@ public class TestExpressions { var withConstantsTemplate = Template.make("expression", (Expression expression) -> { // Create a token: fill the expression with a fixed set of constants. // We then use the same token with the same constants, once compiled and once not compiled. + // + // Some expressions can throw Exceptions. We have to catch them. In such a case, we return + // the Exception instead of the value from the expression, and compare the Exceptions. + // + // Some Expressions do not have a deterministic result. For example, different NaN or + // precision results from some operators. We only compare the results if we know that the + // result is deterministically the same. TemplateToken expressionToken = expression.asToken(expression.argumentTypes.stream().map(t -> t.con()).toList()); return body( let("returnType", expression.returnType), """ @Test public static void $primitiveConTest() { - #returnType v0 = ${primitiveConTest}_compiled(); - #returnType v1 = ${primitiveConTest}_reference(); - Verify.checkEQ(v0, v1); + Object v0 = ${primitiveConTest}_compiled(); + Object v1 = ${primitiveConTest}_reference(); + """, + expression.info.isResultDeterministic ? "Verify.checkEQ(v0, v1);\n" : "", + """ } @DontInline - public static #returnType ${primitiveConTest}_compiled() { + public static Object ${primitiveConTest}_compiled() { + try { """, - "return ", expressionToken, ";\n", + "return ", expressionToken, ";\n", + expression.info.exceptions.stream().map(exception -> + "} catch (" + exception + " e) { return e;\n" + ).toList(), """ + } finally { + // Just so that javac is happy if there are no exceptions to catch. + } } @DontCompile - public static #returnType ${primitiveConTest}_reference() { + public static Object ${primitiveConTest}_reference() { + try { """, - "return ", expressionToken, ";\n", + "return ", expressionToken, ";\n", + expression.info.exceptions.stream().map(exception -> + "} catch (" + exception + " e) { return e;\n" + ).toList(), """ + } finally { + // Just so that javac is happy if there are no exceptions to catch. + } } """ ); From f2a998326a6bebd4a7d2d0a39f785b2e6dac68c4 Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Thu, 16 Oct 2025 14:22:15 +0000 Subject: [PATCH 155/561] 8369804: TestGenerators.java fails with IllegalArgumentException: bound must be greater than origin Reviewed-by: chagedorn, thartmann --- .../generators/UniformDoubleGenerator.java | 3 +++ .../lib/generators/UniformFloatGenerator.java | 3 +++ .../generators/tests/TestGenerators.java | 22 ++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/test/hotspot/jtreg/compiler/lib/generators/UniformDoubleGenerator.java b/test/hotspot/jtreg/compiler/lib/generators/UniformDoubleGenerator.java index d160bf319d8..b5729aeec7d 100644 --- a/test/hotspot/jtreg/compiler/lib/generators/UniformDoubleGenerator.java +++ b/test/hotspot/jtreg/compiler/lib/generators/UniformDoubleGenerator.java @@ -35,6 +35,9 @@ final class UniformDoubleGenerator extends UniformIntersectionRestrictableGenera */ public UniformDoubleGenerator(Generators g, double lo, double hi) { super(g, lo, hi); + if (Double.compare(lo, hi) >= 0) { + throw new EmptyGeneratorException(); + } } @Override diff --git a/test/hotspot/jtreg/compiler/lib/generators/UniformFloatGenerator.java b/test/hotspot/jtreg/compiler/lib/generators/UniformFloatGenerator.java index 1b72ad5adc9..4405b120619 100644 --- a/test/hotspot/jtreg/compiler/lib/generators/UniformFloatGenerator.java +++ b/test/hotspot/jtreg/compiler/lib/generators/UniformFloatGenerator.java @@ -35,6 +35,9 @@ final class UniformFloatGenerator extends UniformIntersectionRestrictableGenerat */ public UniformFloatGenerator(Generators g, float lo, float hi) { super(g, lo, hi); + if (Float.compare(lo, hi) >= 0) { + throw new EmptyGeneratorException(); + } } @Override diff --git a/test/hotspot/jtreg/testlibrary_tests/generators/tests/TestGenerators.java b/test/hotspot/jtreg/testlibrary_tests/generators/tests/TestGenerators.java index 8ad0c17ba98..f949f99c035 100644 --- a/test/hotspot/jtreg/testlibrary_tests/generators/tests/TestGenerators.java +++ b/test/hotspot/jtreg/testlibrary_tests/generators/tests/TestGenerators.java @@ -391,13 +391,13 @@ public class TestGenerators { Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformDoubles(1, 0)); Asserts.assertNotNull(G.uniformDoubles(0, 1)); - Asserts.assertNotNull(G.uniformDoubles(0, 0)); + Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformDoubles(0, 0)); Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformDoubles(0, 1).restricted(1.1d, 2.4d)); Asserts.assertNotNull(G.uniformDoubles(0, 1).restricted(0.9d, 2.4d)); Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformFloats(1, 0)); Asserts.assertNotNull(G.uniformFloats(0, 1)); - Asserts.assertNotNull(G.uniformFloats(0, 0)); + Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformFloats(0, 0)); Asserts.assertThrows(EmptyGeneratorException.class, () -> G.uniformFloats(0, 1).restricted(1.1f, 2.4f)); Asserts.assertNotNull(G.uniformFloats(0, 1).restricted(0.9f, 2.4f)); @@ -592,8 +592,13 @@ public class TestGenerators { var floatBoundGen = G.uniformFloats(); for (int j = 0; j < 500; j++) { - float a = floatBoundGen.next(), b = floatBoundGen.next(); - float lo = Math.min(a, b), hi = Math.max(a, b); + float lo = 1, hi = 0; + // Failure of a single round is very rare, repeated failure even rarer. + while (lo >= hi) { + float a = floatBoundGen.next(), b = floatBoundGen.next(); + lo = Math.min(a, b); + hi = Math.max(a, b); + } var gb = G.uniformFloats(lo, hi); for (int i = 0; i < 10_000; i++) { float x = gb.next(); @@ -604,8 +609,13 @@ public class TestGenerators { var doubleBoundGen = G.uniformDoubles(); for (int j = 0; j < 500; j++) { - double a = doubleBoundGen.next(), b = doubleBoundGen.next(); - double lo = Math.min(a, b), hi = Math.max(a, b); + double lo = 1, hi = 0; + // Failure of a single round is very rare, repeated failure even rarer. + while (lo >= hi) { + double a = doubleBoundGen.next(), b = doubleBoundGen.next(); + lo = Math.min(a, b); + hi = Math.max(a, b); + } var gb = G.uniformDoubles(lo, hi); for (int i = 0; i < 10_000; i++) { double x = gb.next(); From 303eb1096ccaf06106aa080b9ea0553c0f6912dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lund=C3=A9n?= Date: Thu, 16 Oct 2025 15:02:32 +0000 Subject: [PATCH 156/561] 8369573: Add missing compile commands help documentation for the signature part of method patterns Reviewed-by: rcastanedalo, aseoane, thartmann --- src/hotspot/share/compiler/compilerOracle.cpp | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/compiler/compilerOracle.cpp b/src/hotspot/share/compiler/compilerOracle.cpp index 868ae8bfa41..23bb754f432 100644 --- a/src/hotspot/share/compiler/compilerOracle.cpp +++ b/src/hotspot/share/compiler/compilerOracle.cpp @@ -617,18 +617,44 @@ static void usage() { tty->cr(); print_commands(); tty->cr(); - tty->print_cr("Method patterns has the format:"); - tty->print_cr(" package/Class.method()"); + tty->print_cr("The has the format '.'."); + tty->cr(); + tty->print_cr("For example, the "); + tty->cr(); + tty->print_cr(" package/Class.method(Lpackage/Parameter;)Lpackage/Return;"); + tty->cr(); + tty->print_cr("matches the 'method' in 'package/Class' with "); + tty->print_cr("'(Lpackage/Parameter;)Lpackage/Return;'"); tty->cr(); tty->print_cr("For backward compatibility this form is also allowed:"); - tty->print_cr(" package.Class::method()"); tty->cr(); - tty->print_cr("The signature can be separated by an optional whitespace or comma:"); - tty->print_cr(" package/Class.method ()"); + tty->print_cr(" package.Class::method(Lpackage.Parameter;)Lpackage.Return;"); tty->cr(); - tty->print_cr("The class and method identifier can be used together with leading or"); - tty->print_cr("trailing *'s for wildcard matching:"); - tty->print_cr(" *ackage/Clas*.*etho*()"); + tty->print_cr("A whitespace or comma can optionally separate the from the"); + tty->print_cr(":"); + tty->cr(); + tty->print_cr(" package/Class.method (Lpackage/Parameter;)Lpackage/Return;"); + tty->print_cr(" package/Class.method,(Lpackage/Parameter;)Lpackage/Return;"); + tty->cr(); + tty->print_cr("The and accept leading and trailing '*' wildcards"); + tty->print_cr("matching:"); + tty->cr(); + tty->print_cr(" *ackage/Clas*.*etho*(Lpackage/Parameter;)Lpackage/Return;"); + tty->cr(); + tty->print_cr("The does not support explicit wildcards and"); + tty->print_cr("always has an implicit trailing wildcard. Therefore,"); + tty->cr(); + tty->print_cr(" package/Class.method(Lpackage/Parameter;)Lpackage/Return;"); + tty->cr(); + tty->print_cr("matches a subset of"); + tty->cr(); + tty->print_cr(" package/Class.method(Lpackage/Parameter;)"); + tty->cr(); + tty->print_cr("which matches a subset of"); + tty->cr(); + tty->print_cr(" package/Class.method"); + tty->cr(); + tty->print_cr("which matches all possible descriptors."); tty->cr(); tty->print_cr("It is possible to use more than one CompileCommand on the command line:"); tty->print_cr(" -XX:CompileCommand=exclude,java/*.* -XX:CompileCommand=log,java*.*"); From 87092ef1d97e00ddb6674b0e309f2f904d307604 Mon Sep 17 00:00:00 2001 From: Arno Zeller Date: Thu, 16 Oct 2025 15:15:19 +0000 Subject: [PATCH 157/561] 8183336: Better cleanup for jdk/test/java/lang/module/customfs/ModulesInCustomFileSystem.java Reviewed-by: alanb, syan --- .../java/lang/module/customfs/ModulesInCustomFileSystem.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/lang/module/customfs/ModulesInCustomFileSystem.java b/test/jdk/java/lang/module/customfs/ModulesInCustomFileSystem.java index 801f2e5fca6..e023a3a5839 100644 --- a/test/jdk/java/lang/module/customfs/ModulesInCustomFileSystem.java +++ b/test/jdk/java/lang/module/customfs/ModulesInCustomFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ * @library /test/lib * @build ModulesInCustomFileSystem m1/* m2/* * jdk.test.lib.util.JarUtils - * @run testng/othervm ModulesInCustomFileSystem + * @run testng/othervm -Djava.io.tmpdir=. ModulesInCustomFileSystem * @summary Test ModuleFinder to find modules in a custom file system */ From 95380e1ea5c3f531f82fb7c4b2f75726f3cd2fc2 Mon Sep 17 00:00:00 2001 From: Roger Riggs Date: Thu, 16 Oct 2025 15:54:22 +0000 Subject: [PATCH 158/561] 8362637: Convert java.nio.ByteOrder to an enum Reviewed-by: alanb, liach, bpb --- .../share/classes/java/nio/ByteOrder.java | 41 ++++--------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/src/java.base/share/classes/java/nio/ByteOrder.java b/src/java.base/share/classes/java/nio/ByteOrder.java index 96f2317b956..ab6876448be 100644 --- a/src/java.base/share/classes/java/nio/ByteOrder.java +++ b/src/java.base/share/classes/java/nio/ByteOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -35,28 +35,19 @@ import jdk.internal.misc.Unsafe; * @since 1.4 */ -public final class ByteOrder { - - private final String name; - - private ByteOrder(String name) { - this.name = name; - } - - /** - * Constant denoting big-endian byte order. In this order, the bytes of a - * multibyte value are ordered from most significant to least significant. - */ - public static final ByteOrder BIG_ENDIAN - = new ByteOrder("BIG_ENDIAN"); - +public enum ByteOrder { /** * Constant denoting little-endian byte order. In this order, the bytes of * a multibyte value are ordered from least significant to most * significant. */ - public static final ByteOrder LITTLE_ENDIAN - = new ByteOrder("LITTLE_ENDIAN"); + LITTLE_ENDIAN, + /** + * Constant denoting big-endian byte order. In this order, the bytes of a + * multibyte value are ordered from most significant to least significant. + */ + BIG_ENDIAN; + // Retrieve the native byte order. It's used early during bootstrap, and // must be initialized after BIG_ENDIAN and LITTLE_ENDIAN. @@ -78,18 +69,4 @@ public final class ByteOrder { public static ByteOrder nativeOrder() { return NATIVE_ORDER; } - - /** - * Constructs a string describing this object. - * - *

    This method returns the string - * {@code "BIG_ENDIAN"} for {@link #BIG_ENDIAN} and - * {@code "LITTLE_ENDIAN"} for {@link #LITTLE_ENDIAN}. - * - * @return The specified string - */ - public String toString() { - return name; - } - } From e56db37734aa7cbc0f20ba3fc469f51224f288fa Mon Sep 17 00:00:00 2001 From: Christian Hagedorn Date: Thu, 16 Oct 2025 16:02:26 +0000 Subject: [PATCH 159/561] 8369232: testlibrary_tests/ir_framework/tests/TestScenariosCrossProduct.java timed out Reviewed-by: dfenacci, epeter --- .../lib/ir_framework/TestFramework.java | 27 +- .../tests/TestScenariosCrossProduct.java | 384 +++++++++++++----- 2 files changed, 305 insertions(+), 106 deletions(-) diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/TestFramework.java b/test/hotspot/jtreg/compiler/lib/ir_framework/TestFramework.java index 85c52ef33da..09e291ce5a4 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/TestFramework.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/TestFramework.java @@ -327,8 +327,10 @@ public class TestFramework { for (Scenario scenario : scenarios) { int scenarioIndex = scenario.getIndex(); - TestFormat.checkNoThrow(scenarioIndices.add(scenarioIndex), - "Cannot define two scenarios with the same index " + scenarioIndex); + if (!scenarioIndices.add(scenarioIndex)) { + TestFormat.failNoThrow("Cannot define two scenarios with the same index " + scenarioIndex); + continue; + } this.scenarios.add(scenario); } TestFormat.throwIfAnyFailures(); @@ -336,9 +338,12 @@ public class TestFramework { } /** - * Add the cross-product (cartesian product) of sets of flags as Scenarios. Unlike when when constructing + * Add the cross-product (cartesian product) of sets of flags as Scenarios. Unlike when constructing * scenarios directly a string can contain multiple flags separated with a space. This allows grouping - * flags that have to be specified togeher. Further, an empty string in a set stands in for "no flag". + * flags that have to be specified together. Further, an empty string in a set stands in for "no flag". + *

    + * Passing a single set will create a scenario for each of the provided flags in the set (i.e. the same as + * passing an additional set with an empty string only). *

    * Example: *

    @@ -355,7 +360,7 @@ public class TestFramework {
          *     Scenario(5, "-Xbatch -XX:-TieredCompilation", "-XX:+UseNewCode2")
          * 
    * - * @param sets sets of flags to generate the cross product for. + * @param flagSets sets of flags to generate the cross product for. * @return the same framework instance. */ @SafeVarargs @@ -376,7 +381,7 @@ public class TestFramework { Stream> crossProduct = Arrays.stream(flagSets) .reduce( - Stream.of(Collections.emptyList()), // Initialize Stream> acc with a Stream containing an empty list of Strings. + Stream.of(Collections.emptyList()), // Initialize Stream> acc with a Stream containing an empty list of Strings. (Stream> acc, Set set) -> acc.flatMap(lAcc -> // For each List> lAcc in acc... set.stream().map(flag -> { // ...and each flag in the current set... @@ -384,19 +389,19 @@ public class TestFramework { newList.add(flag); // ...and append the flag. return newList; }) // This results in one List> for each lAcc... - ), // ...that get flattend into one big List>. - (a, b) -> Stream.concat(a, b)); // combiner; if any reduction steps are executed in parallel, just concat two streams. + ), // ...that get flattened into one big List>. + Stream::concat); // combiner; if any reduction steps are executed in parallel, just concat two streams. Scenario[] newScenarios = crossProduct .map(flags -> new Scenario( // For each List flags in crossProduct create a new Scenario. idx.getAndIncrement(), flags.stream() // Process flags - .map(s -> Set.of(s.split("[ ]"))) // Split muliple flags in the same string into separate strings. + .map(s -> Set.of(s.split("[ ]"))) // Split multiple flags in the same string into separate strings. .flatMap(Collection::stream) // Flatten the Stream> into Stream>. .filter(s -> !s.isEmpty()) // Remove empty string flags. - .collect(Collectors.toList()) + .toList() .toArray(new String[0]))) - .collect(Collectors.toList()).toArray(new Scenario[0]); + .toList().toArray(new Scenario[0]); return addScenarios(newScenarios); } diff --git a/test/hotspot/jtreg/testlibrary_tests/ir_framework/tests/TestScenariosCrossProduct.java b/test/hotspot/jtreg/testlibrary_tests/ir_framework/tests/TestScenariosCrossProduct.java index 496fcbddb0f..46813bbff78 100644 --- a/test/hotspot/jtreg/testlibrary_tests/ir_framework/tests/TestScenariosCrossProduct.java +++ b/test/hotspot/jtreg/testlibrary_tests/ir_framework/tests/TestScenariosCrossProduct.java @@ -23,15 +23,22 @@ package ir_framework.tests; -import java.util.Set; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.lang.reflect.Field; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import compiler.lib.ir_framework.*; -import compiler.lib.ir_framework.shared.TestRunException; import compiler.lib.ir_framework.shared.TestFormatException; +import compiler.lib.ir_framework.shared.TestRunException; import jdk.test.lib.Asserts; /* * @test + * @bug 8365262 8369232 * @requires vm.debug == true & vm.compMode != "Xint" & vm.compiler2.enabled & vm.flagless * @summary Test cross product scenarios with the framework. * @library /test/lib /testlibrary_tests / @@ -39,29 +46,20 @@ import jdk.test.lib.Asserts; */ public class TestScenariosCrossProduct { - static void hasNFailures(String s, int count) { - if (!s.matches("The following scenarios have failed: (#[0-9](, )?){" + count + "}. Please check stderr for more information.")) { - throw new RuntimeException("Expected " + count + " failures in \"" + s + "\""); - } - } public static void main(String[] args) { - // Test argument handling - try { - TestFramework t = new TestFramework(); - t.addCrossProductScenarios((Set[]) null); - Asserts.fail("Should have thrown exception"); - } catch (TestFormatException e) {} - try { - TestFramework t = new TestFramework(); - t.addCrossProductScenarios(Set.of("foo", "bar"), null); - Asserts.fail("Should have thrown exception"); - } catch (TestFormatException e) {} + expectFormatFailure((Set[]) null); + expectFormatFailure(Set.of("foo", "bar"), null); + try { TestFramework t = new TestFramework(); t.addCrossProductScenarios(Set.of("blub"), Set.of("foo", null)); - Asserts.fail("Should have thrown exception"); - } catch (NullPointerException e) {} // Set.of prevents null elements + shouldHaveThrown(); + } catch (NullPointerException _) { + // Expected: Set.of prevents null elements + } + + try { TestFramework t = new TestFramework(); t.addCrossProductScenarios(); @@ -70,95 +68,291 @@ public class TestScenariosCrossProduct { } // Single set should test all flags in the set by themselves. - try { - TestFramework t1 = new TestFramework(); - t1.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=51", - "-XX:TLABRefillWasteFraction=53", - "-XX:TLABRefillWasteFraction=64")); - t1.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 3); - } + new TestCase() + .inputFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=51", + "-XX:TLABRefillWasteFraction=53", + "-XX:TLABRefillWasteFraction=64") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=51"), + Set.of("-XX:TLABRefillWasteFraction=53"), + Set.of("-XX:TLABRefillWasteFraction=64") + )) + .run(); // The cross product of a set with one element and a set with three elements is three sets. - try { - TestFramework t2 = new TestFramework(); - t2.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=53"), - Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2", "-XX:+UseNewCode3")); - t2.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 3); - } + new TestCase() + .inputFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=53"), + Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2", "-XX:+UseNewCode3") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode3") + )) + .run(); + // The cross product of two sets with two elements is four sets. - try { - TestFramework t3 = new TestFramework(); - t3.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=53", "-XX:TLABRefillWasteFraction=64"), - Set.of("-XX:+UseNewCode", "-XX:-UseNewCode")); - t3.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 4); - } + new TestCase() + .inputFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:TLABRefillWasteFraction=64"), + Set.of("-XX:+UseNewCode", "-XX:-UseNewCode") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:-UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=64", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=64", "-XX:-UseNewCode") + )) + .run(); + // Test with a pair of flags. - try { - TestFramework t4 = new TestFramework(); - t4.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=50 -XX:+UseNewCode", "-XX:TLABRefillWasteFraction=40"), - Set.of("-XX:+UseNewCode2")); - t4.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 1); - } + new TestCase() + .inputFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=50 -XX:+UseNewCode", "-XX:TLABRefillWasteFraction=40"), + Set.of("-XX:+UseNewCode2") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=50", "-XX:+UseNewCode", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=40", "-XX:+UseNewCode2") + )) + .run(); - // Test with an empty string. All 6 scenarios fail because 64 is the default value for TLABRefillWasteFraction. - try { - TestFramework t5 = new TestFramework(); - t5.addCrossProductScenarios(Set.of("", "-XX:TLABRefillWasteFraction=51", "-XX:TLABRefillWasteFraction=53"), - Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2")); - t5.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 6); - } + // Test with an empty string, resulting in 6 scenarios. + new TestCase() + .inputFlags(Set.of( + Set.of("", "-XX:TLABRefillWasteFraction=51", "-XX:TLABRefillWasteFraction=53"), + Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:+UseNewCode"), + Set.of("-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode2") + )) + .run(); + // Test with 3 input sets which equals to 2x2x2 = 8 scenarios. + new TestCase() + .inputFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=51", + "-XX:TLABRefillWasteFraction=53"), + Set.of("-XX:+UseNewCode", + "-XX:-UseNewCode"), + Set.of("-XX:+UseNewCode2", + "-XX:-UseNewCode2") + ) + ) + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:-UseNewCode", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:-UseNewCode", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode", "-XX:-UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode", "-XX:-UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:-UseNewCode", "-XX:-UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:-UseNewCode", "-XX:-UseNewCode2") + )) + .run(); + + TestFramework testFramework = new TestFramework(); + testFramework.addScenarios(new Scenario(0, "-XX:TLABRefillWasteFraction=50", "-XX:+UseNewCode")); + testFramework.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=51", "-XX:TLABRefillWasteFraction=53"), + Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2")); try { - TestFramework t6 = new TestFramework(); - t6.addScenarios(new Scenario(0, "-XX:TLABRefillWasteFraction=50", "-XX:+UseNewCode")); // failPair - t6.addCrossProductScenarios(Set.of("-XX:TLABRefillWasteFraction=51", "-XX:TLABRefillWasteFraction=53"), - Set.of("-XX:+UseNewCode", "-XX:+UseNewCode2")); - try { - t6.addScenarios(new Scenario(4, "-XX:+UseNewCode3")); // fails because index 4 is already used - Asserts.fail("Should have thrown exception"); - } catch (TestFormatException e) {} - t6.addScenarios(new Scenario(5, "-XX:+UseNewCode3")); // fail default - t6.start(); - Asserts.fail("Should have thrown exception"); - } catch (TestRunException e) { - hasNFailures(e.getMessage(), 6); + testFramework.addScenarios(new Scenario(4, "-XX:+UseNewCode3")); // fails because index 4 is already used + shouldHaveThrown(); + } catch (TestFormatException _) { + // Expected. + } + testFramework.addScenarios(new Scenario(5, "-XX:+UseNewCode3")); + + new TestCase() + .expectedScenariosWithFlags(Set.of( + Set.of("-XX:TLABRefillWasteFraction=50", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=51", "-XX:+UseNewCode2"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode"), + Set.of("-XX:TLABRefillWasteFraction=53", "-XX:+UseNewCode2"), + Set.of("-XX:+UseNewCode3") + )) + .runWithPreAddedScenarios(testFramework); + + runEndToEndTest(); + } + + private static void expectFormatFailure(Set... flagSets) { + TestFramework testFramework = new TestFramework(); + try { + testFramework.addCrossProductScenarios(flagSets); + shouldHaveThrown(); + } catch (TestFormatException _) { + // Expected. } } - @Test - @IR(applyIf = {"TLABRefillWasteFraction", "64"}, counts = {IRNode.CALL, "1"}) - public void failDefault() { + private static void shouldHaveThrown() { + Asserts.fail("Should have thrown exception"); + } + + static class TestCase { + private Set> inputFlags; + private Set> expectedScenariosWithFlags; + + public TestCase inputFlags(Set> inputFlags) { + this.inputFlags = inputFlags; + return this; + } + + public TestCase expectedScenariosWithFlags(Set> expectedScenariosWithFlags) { + this.expectedScenariosWithFlags = expectedScenariosWithFlags; + return this; + } + + public void run() { + TestFramework testFramework = new TestFramework(); + testFramework.addCrossProductScenarios(inputFlags.toArray(new Set[0])); + runWithPreAddedScenarios(testFramework); + } + + public void runWithPreAddedScenarios(TestFramework testFramework) { + List scenariosFromCrossProduct = getScenarios(testFramework); + assertScenarioCount(expectedScenariosWithFlags.size(), scenariosFromCrossProduct); + assertScenariosWithFlags(scenariosFromCrossProduct, expectedScenariosWithFlags); + assertSameResultWhenManuallyAdding(scenariosFromCrossProduct, expectedScenariosWithFlags); + } + + private static void assertScenarioCount(int expectedCount, List scenarios) { + Asserts.assertEQ(expectedCount, scenarios.size(), "Scenario count is off"); + } + + /** + * Check that the added scenarios to the IR framework with TestFramework.addCrossProductScenarios() + * (i.e. 'scenariosFromCrossProduct') match the expected flag combos (i.e. 'expectedScenariosWithFlags'). + */ + private static void assertScenariosWithFlags(List scenariosFromCrossProduct, + Set> expectedScenariosWithFlags) { + for (Set expectedScenarioFlags : expectedScenariosWithFlags) { + if (scenariosFromCrossProduct.stream() + .map(Scenario::getFlags) + .map(Set::copyOf) + .anyMatch(flags -> flags.equals(expectedScenarioFlags))) { + continue; + } + System.err.println("Scenarios from cross product:"); + for (Scenario s : scenariosFromCrossProduct) { + System.err.println(Arrays.toString(s.getFlags().toArray())); + } + throw new RuntimeException("Could not find a scenario with the provided flags: " + Arrays.toString(expectedScenarioFlags.toArray())); + } + } + + /** + * Add scenarios for the provided flag sets in 'expectedScenariosWithFlags' by using TestFramework.addScenarios(). + * We should end up with the same scenarios as if we added them with TestFramework.addCrossProductScenarios(). + * This is verified by this method by comparing the flags of the scenarios, ignoring scenario indices. + */ + private static void assertSameResultWhenManuallyAdding(List scenariosFromCrossProduct, + Set> expectedScenariosWithFlags) { + List expectedScenarios = getScenariosWithFlags(expectedScenariosWithFlags); + List fetchedScenarios = addScenariosAndFetchFromFramework(expectedScenarios); + assertSameScenarios(scenariosFromCrossProduct, fetchedScenarios); + } + + private static List getScenariosWithFlags(Set> expectedScenariosWithFlags) { + List expecedScenarioList = new ArrayList<>(); + int index = -1; // Use some different indices - should not matter what we choose. + for (Set expectedScenarioFlags : expectedScenariosWithFlags) { + expecedScenarioList.add(new Scenario(index--, expectedScenarioFlags.toArray(new String[0]))); + } + return expecedScenarioList; + } + + private static List addScenariosAndFetchFromFramework(List expecedScenarioList) { + TestFramework testFramework = new TestFramework(); + testFramework.addScenarios(expecedScenarioList.toArray(new Scenario[0])); + return getScenarios(testFramework); + } + + private static void assertSameScenarios(List scenariosFromCrossProduct, + List expectedScenarios) { + assertScenariosWithFlags(scenariosFromCrossProduct, fetchFlags(expectedScenarios)); + } + + private static Set> fetchFlags(List scenarios) { + return scenarios.stream() + .map(scenario -> new HashSet<>(scenario.getFlags())) + .collect(Collectors.toSet()); + } + } + + private static List getScenarios(TestFramework testFramework) { + Field field; + try { + field = TestFramework.class.getDeclaredField("scenarios"); + field.setAccessible(true); + return (List)field.get(testFramework); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + /** + * Also run a simple end-to-end test to sanity check the API method. We capture the stderr to fetch the + * scenario flags. + */ + private static void runEndToEndTest() { + TestFramework testFramework = new TestFramework(); + + // Capture stderr + PrintStream originalErr = System.err; + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream printStream = new PrintStream(outputStream); + System.setErr(printStream); + + try { + testFramework + .addCrossProductScenarios(Set.of("-XX:+UseNewCode", "-XX:-UseNewCode"), + Set.of("-XX:+UseNewCode2", "-XX:-UseNewCode2")) + .addFlags() + .start(); + shouldHaveThrown(); + } catch (TestRunException e) { + // Expected. + System.setErr(originalErr); + Asserts.assertTrue(e.getMessage().contains("The following scenarios have failed: #0, #1, #2, #3.")); + String stdErr = outputStream.toString(); + Asserts.assertTrue(stdErr.contains("Scenario flags: [-XX:+UseNewCode, -XX:+UseNewCode2]")); + Asserts.assertTrue(stdErr.contains("Scenario flags: [-XX:-UseNewCode, -XX:-UseNewCode2]")); + Asserts.assertTrue(stdErr.contains("Scenario flags: [-XX:+UseNewCode, -XX:-UseNewCode2]")); + Asserts.assertTrue(stdErr.contains("Scenario flags: [-XX:-UseNewCode, -XX:+UseNewCode2]")); + Asserts.assertEQ(4, scenarioCount(stdErr)); + } + } + + public static int scenarioCount(String stdErr) { + Pattern pattern = Pattern.compile("Scenario flags"); + Matcher matcher = pattern.matcher(stdErr); + int count = 0; + while (matcher.find()) { + count++; + } + return count; } @Test - @IR(applyIf = {"TLABRefillWasteFraction", "51"}, counts = {IRNode.CALL, "1"}) - public void fail1() { - } - - @Test - @IR(applyIf = {"TLABRefillWasteFraction", "53"}, counts = {IRNode.CALL, "1"}) - public void fail2() { - } - - @Test - @IR(applyIfAnd = {"TLABRefillWasteFraction", "50", "UseNewCode", "true"}, counts = {IRNode.CALL, "1"}) - public void failPair() { + public void endToEndTest() { + throw new RuntimeException("executed test"); } } From 7e03240974cd66c471f5d02e14fd77971fe6d173 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Thu, 16 Oct 2025 16:38:18 +0000 Subject: [PATCH 160/561] 8369858: Remove darcy author tags from jdk tests Reviewed-by: rriggs, iris, lancea --- test/jdk/java/io/Serializable/cloneArray/CloneArray.java | 3 +-- test/jdk/java/lang/Byte/Decode.java | 4 +--- test/jdk/java/lang/Class/IsAnnotationType.java | 3 +-- test/jdk/java/lang/Class/IsEnum.java | 3 +-- test/jdk/java/lang/Class/IsSynthetic.java | 3 +-- .../getEnclosingConstructor/EnclosingConstructorTests.java | 3 +-- .../lang/Class/getEnclosingMethod/EnclosingMethodTests.java | 3 +-- test/jdk/java/lang/Double/BitwiseConversion.java | 3 +-- test/jdk/java/lang/Double/Constants.java | 3 +-- test/jdk/java/lang/Double/Extrema.java | 3 +-- test/jdk/java/lang/Double/NaNInfinityParsing.java | 3 +-- test/jdk/java/lang/Double/ParseHexFloatingPoint.java | 3 +-- test/jdk/java/lang/Double/ToHexString.java | 3 +-- test/jdk/java/lang/Float/BitwiseConversion.java | 3 +-- test/jdk/java/lang/Float/Constants.java | 3 +-- test/jdk/java/lang/Float/Extrema.java | 3 +-- test/jdk/java/lang/Float/NaNInfinityParsing.java | 3 +-- test/jdk/java/lang/Integer/Decode.java | 4 +--- test/jdk/java/lang/Integer/ParsingTest.java | 3 +-- test/jdk/java/lang/Integer/Unsigned.java | 3 +-- test/jdk/java/lang/Long/Decode.java | 4 +--- test/jdk/java/lang/Long/ParsingTest.java | 3 +-- test/jdk/java/lang/Long/Unsigned.java | 3 +-- test/jdk/java/lang/Short/Decode.java | 4 +--- test/jdk/java/lang/Throwable/SuppressedExceptions.java | 3 +-- test/jdk/java/lang/annotation/Missing/MissingTest.java | 3 +-- .../lang/annotation/TestIncompleteAnnotationExceptionNPE.java | 3 +-- .../AnnotatedElement/TestAnnotatedElementDefaults.java | 3 +-- test/jdk/java/lang/reflect/Constructor/GenericStringTest.java | 3 +-- .../lang/reflect/Constructor/TestParameterAnnotations.java | 3 +-- test/jdk/java/lang/reflect/DefaultAccessibility.java | 3 +-- test/jdk/java/lang/reflect/Field/GenericStringTest.java | 3 +-- test/jdk/java/lang/reflect/Generics/HashCodeTest.java | 3 +-- test/jdk/java/lang/reflect/Generics/Probe.java | 3 +-- test/jdk/java/lang/reflect/Generics/StringsAndBounds.java | 3 +-- .../jdk/java/lang/reflect/Generics/TestParameterizedType.java | 3 +-- test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java | 3 +-- test/jdk/java/lang/reflect/Generics/getAnnotationTest.java | 3 +-- test/jdk/java/lang/reflect/Method/GenericStringTest.java | 3 +-- test/jdk/java/lang/reflect/Method/IsDefaultTest.java | 3 +-- .../Method/defaultMethodModeling/DefaultMethodModeling.java | 3 +-- .../java/lang/reflect/TypeVariable/TestAnnotatedElement.java | 3 +-- test/jdk/java/math/BigDecimal/AddTests.java | 3 +-- test/jdk/java/math/BigDecimal/CompareToTests.java | 3 +-- test/jdk/java/math/BigDecimal/DivideTests.java | 3 +-- test/jdk/java/math/BigDecimal/IntegralDivisionTests.java | 3 +-- test/jdk/java/math/BigDecimal/NegateTests.java | 3 +-- test/jdk/java/math/BigDecimal/PowTests.java | 3 +-- test/jdk/java/math/BigDecimal/PrecisionTests.java | 3 +-- test/jdk/java/math/BigDecimal/RoundingTests.java | 3 +-- test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java | 3 +-- test/jdk/java/math/BigDecimal/StrippingZerosTest.java | 3 +-- test/jdk/java/math/BigDecimal/ToPlainStringTests.java | 3 +-- test/jdk/java/math/BigDecimal/ZeroScalingTests.java | 3 +-- test/jdk/java/math/BigInteger/CompareToTests.java | 3 +-- test/jdk/java/math/BigInteger/ExtremeShiftingTests.java | 3 +-- test/jdk/java/math/BigInteger/OperatorNpeTests.java | 3 +-- test/jdk/java/math/BigInteger/StringConstructor.java | 3 +-- test/jdk/java/math/BigInteger/TestValueExact.java | 3 +-- test/jdk/java/math/RoundingMode/RoundingModeTests.java | 3 +-- test/jdk/tools/launcher/ChangeDataModel.java | 3 +-- test/jdk/tools/launcher/I18NTest.java | 3 +-- test/jdk/tools/launcher/UnresolvedExceptions.java | 3 +-- 63 files changed, 63 insertions(+), 130 deletions(-) diff --git a/test/jdk/java/io/Serializable/cloneArray/CloneArray.java b/test/jdk/java/io/Serializable/cloneArray/CloneArray.java index a8de4407912..0a427e29da5 100644 --- a/test/jdk/java/io/Serializable/cloneArray/CloneArray.java +++ b/test/jdk/java/io/Serializable/cloneArray/CloneArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -25,7 +25,6 @@ /* @test * @bug 6990094 * @summary Verify ObjectInputStream.cloneArray works on many kinds of arrays - * @author Stuart Marks, Joseph D. Darcy */ import java.io.ByteArrayInputStream; diff --git a/test/jdk/java/lang/Byte/Decode.java b/test/jdk/java/lang/Byte/Decode.java index b4ef798cb7e..590c35989f7 100644 --- a/test/jdk/java/lang/Byte/Decode.java +++ b/test/jdk/java/lang/Byte/Decode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -25,8 +25,6 @@ * @test * @bug 4242173 5017980 6576055 * @summary Test Byte.decode method - * @author madbot - * @author Joseph D. Darcy */ /** diff --git a/test/jdk/java/lang/Class/IsAnnotationType.java b/test/jdk/java/lang/Class/IsAnnotationType.java index 2189e1c5715..e007201d95c 100644 --- a/test/jdk/java/lang/Class/IsAnnotationType.java +++ b/test/jdk/java/lang/Class/IsAnnotationType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4891872 4988155 * @summary Check isAnnotation() method - * @author Joseph D. Darcy */ import java.lang.annotation.*; diff --git a/test/jdk/java/lang/Class/IsEnum.java b/test/jdk/java/lang/Class/IsEnum.java index fc0b0f7632b..3d2d9103ddb 100644 --- a/test/jdk/java/lang/Class/IsEnum.java +++ b/test/jdk/java/lang/Class/IsEnum.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4891872 4989735 4990789 5020490 * @summary Check isEnum() method - * @author Joseph D. Darcy */ import java.lang.annotation.*; diff --git a/test/jdk/java/lang/Class/IsSynthetic.java b/test/jdk/java/lang/Class/IsSynthetic.java index d594f6303e1..1775b6bc11d 100644 --- a/test/jdk/java/lang/Class/IsSynthetic.java +++ b/test/jdk/java/lang/Class/IsSynthetic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5012133 * @summary Check Class.isSynthetic method - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java b/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java index ca128021e0c..c08f33af1e6 100644 --- a/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java +++ b/test/jdk/java/lang/Class/getEnclosingConstructor/EnclosingConstructorTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 4962341 6832557 * @summary Check getEnclosingMethod method - * @author Joseph D. Darcy */ import java.lang.reflect.Constructor; diff --git a/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java b/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java index 3a2a0910fc7..e890bb75d1e 100644 --- a/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java +++ b/test/jdk/java/lang/Class/getEnclosingMethod/EnclosingMethodTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 4962341 * @summary Check getEnclosingMethod method - * @author Joseph D. Darcy */ import java.lang.reflect.Method; diff --git a/test/jdk/java/lang/Double/BitwiseConversion.java b/test/jdk/java/lang/Double/BitwiseConversion.java index 381a7e9aed6..06e15d95575 100644 --- a/test/jdk/java/lang/Double/BitwiseConversion.java +++ b/test/jdk/java/lang/Double/BitwiseConversion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -28,7 +28,6 @@ * @library ../Math * @build DoubleConsts * @run main BitwiseConversion - * @author Joseph D. Darcy */ import static java.lang.Double.*; diff --git a/test/jdk/java/lang/Double/Constants.java b/test/jdk/java/lang/Double/Constants.java index 676630e12b9..e7aa5cbceb9 100644 --- a/test/jdk/java/lang/Double/Constants.java +++ b/test/jdk/java/lang/Double/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -26,7 +26,6 @@ * @compile Constants.java * @bug 4397405 4826652 * @summary Testing constant-ness of Double.{MIN_VALUE, MAX_VALUE}, etc. - * @author Joseph D. Darcy */ public class Constants { diff --git a/test/jdk/java/lang/Double/Extrema.java b/test/jdk/java/lang/Double/Extrema.java index fef17100e0a..db9a10fb279 100644 --- a/test/jdk/java/lang/Double/Extrema.java +++ b/test/jdk/java/lang/Double/Extrema.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,6 @@ * @test * @bug 4408489 4826652 * @summary Testing values of Double.{MIN_VALUE, MIN_NORMAL, MAX_VALUE} - * @author Joseph D. Darcy */ public class Extrema { diff --git a/test/jdk/java/lang/Double/NaNInfinityParsing.java b/test/jdk/java/lang/Double/NaNInfinityParsing.java index 846dcecd3b9..8b5d0e4888f 100644 --- a/test/jdk/java/lang/Double/NaNInfinityParsing.java +++ b/test/jdk/java/lang/Double/NaNInfinityParsing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,6 @@ * @test * @bug 4428772 * @summary Testing recognition of "NaN" and "Infinity" strings - * @author Joseph D. Darcy */ diff --git a/test/jdk/java/lang/Double/ParseHexFloatingPoint.java b/test/jdk/java/lang/Double/ParseHexFloatingPoint.java index a26a8b7a756..60fa13df75b 100644 --- a/test/jdk/java/lang/Double/ParseHexFloatingPoint.java +++ b/test/jdk/java/lang/Double/ParseHexFloatingPoint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -28,7 +28,6 @@ * @run main ParseHexFloatingPoint * @bug 4826774 8078672 * @summary Numerical tests for hexadecimal inputs to parse{Double, Float} (use -Dseed=X to set PRNG seed) - * @author Joseph D. Darcy * @key randomness */ diff --git a/test/jdk/java/lang/Double/ToHexString.java b/test/jdk/java/lang/Double/ToHexString.java index a9f07bba508..912835b7aeb 100644 --- a/test/jdk/java/lang/Double/ToHexString.java +++ b/test/jdk/java/lang/Double/ToHexString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -28,7 +28,6 @@ * @library ../Math * @build DoubleConsts * @run main ToHexString - * @author Joseph D. Darcy */ import java.util.regex.*; diff --git a/test/jdk/java/lang/Float/BitwiseConversion.java b/test/jdk/java/lang/Float/BitwiseConversion.java index 973e00e7008..9bb4a34a55b 100644 --- a/test/jdk/java/lang/Float/BitwiseConversion.java +++ b/test/jdk/java/lang/Float/BitwiseConversion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -28,7 +28,6 @@ * @library ../Math * @build FloatConsts * @run main BitwiseConversion - * @author Joseph D. Darcy */ import static java.lang.Float.*; diff --git a/test/jdk/java/lang/Float/Constants.java b/test/jdk/java/lang/Float/Constants.java index b6ad85ca0c2..47463fc5916 100644 --- a/test/jdk/java/lang/Float/Constants.java +++ b/test/jdk/java/lang/Float/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -26,7 +26,6 @@ * @compile Constants.java * @bug 4397405 4826652 * @summary Testing constant-ness of Float.{MIN_VALUE, MAX_VALUE}, etc. - * @author Joseph D. Darcy */ public class Constants { diff --git a/test/jdk/java/lang/Float/Extrema.java b/test/jdk/java/lang/Float/Extrema.java index 869f22072e7..46447bfcb2f 100644 --- a/test/jdk/java/lang/Float/Extrema.java +++ b/test/jdk/java/lang/Float/Extrema.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,6 @@ * @test * @bug 4408489 4826652 * @summary Testing values of Float.{MIN_VALUE, MIN_NORMAL, MAX_VALUE} - * @author Joseph D. Darcy */ public class Extrema { diff --git a/test/jdk/java/lang/Float/NaNInfinityParsing.java b/test/jdk/java/lang/Float/NaNInfinityParsing.java index 38a402a9775..6df42b376a5 100644 --- a/test/jdk/java/lang/Float/NaNInfinityParsing.java +++ b/test/jdk/java/lang/Float/NaNInfinityParsing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,6 @@ * @test * @bug 4428772 * @summary Testing recognition of "NaN" and "Infinity" strings - * @author Joseph D. Darcy */ diff --git a/test/jdk/java/lang/Integer/Decode.java b/test/jdk/java/lang/Integer/Decode.java index 42493221fe4..b5f881a0e9f 100644 --- a/test/jdk/java/lang/Integer/Decode.java +++ b/test/jdk/java/lang/Integer/Decode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,8 +25,6 @@ * @test * @bug 4136371 5017980 6576055 * @summary Test Integer.decode method - * @author madbot - * @author Joseph D. Darcy */ /** diff --git a/test/jdk/java/lang/Integer/ParsingTest.java b/test/jdk/java/lang/Integer/ParsingTest.java index f5f64f70c84..24e1dd6f3aa 100644 --- a/test/jdk/java/lang/Integer/ParsingTest.java +++ b/test/jdk/java/lang/Integer/ParsingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 5017980 6576055 8041972 8055251 * @summary Test parsing methods - * @author Joseph D. Darcy */ import java.lang.IndexOutOfBoundsException; diff --git a/test/jdk/java/lang/Integer/Unsigned.java b/test/jdk/java/lang/Integer/Unsigned.java index 6c3aecc70c1..911f3f8fe8f 100644 --- a/test/jdk/java/lang/Integer/Unsigned.java +++ b/test/jdk/java/lang/Integer/Unsigned.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,7 +25,6 @@ * @test * @bug 4504839 4215269 6322074 * @summary Basic tests for unsigned operations. - * @author Joseph D. Darcy */ public class Unsigned { public static void main(String... args) { diff --git a/test/jdk/java/lang/Long/Decode.java b/test/jdk/java/lang/Long/Decode.java index d47f976e6fc..fc2762b1bc2 100644 --- a/test/jdk/java/lang/Long/Decode.java +++ b/test/jdk/java/lang/Long/Decode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -25,8 +25,6 @@ * @test * @bug 4136371 5017980 6576055 * @summary Test Long.decode method - * @author madbot - * @author Joseph D. Darcy */ import java.math.BigInteger; diff --git a/test/jdk/java/lang/Long/ParsingTest.java b/test/jdk/java/lang/Long/ParsingTest.java index cbf83415d36..23d007dfd26 100644 --- a/test/jdk/java/lang/Long/ParsingTest.java +++ b/test/jdk/java/lang/Long/ParsingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 5017980 6576055 8041972 8055251 * @summary Test parsing methods - * @author Joseph D. Darcy */ /** diff --git a/test/jdk/java/lang/Long/Unsigned.java b/test/jdk/java/lang/Long/Unsigned.java index f6eeed534b8..aba66c72a92 100644 --- a/test/jdk/java/lang/Long/Unsigned.java +++ b/test/jdk/java/lang/Long/Unsigned.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,7 +25,6 @@ * @test * @bug 4504839 4215269 6322074 8030814 * @summary Basic tests for unsigned operations - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/lang/Short/Decode.java b/test/jdk/java/lang/Short/Decode.java index 8f76751b589..d63e911b710 100644 --- a/test/jdk/java/lang/Short/Decode.java +++ b/test/jdk/java/lang/Short/Decode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -25,8 +25,6 @@ * @test * @bug 4136371 5017980 6576055 * @summary Test Short.decode method - * @author madbot - * @author Joseph D. Darcy */ /** diff --git a/test/jdk/java/lang/Throwable/SuppressedExceptions.java b/test/jdk/java/lang/Throwable/SuppressedExceptions.java index f6fe09df4ef..157a4ffa99b 100644 --- a/test/jdk/java/lang/Throwable/SuppressedExceptions.java +++ b/test/jdk/java/lang/Throwable/SuppressedExceptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -28,7 +28,6 @@ import java.util.*; * @test * @bug 6911258 6962571 6963622 6991528 7005628 8012044 * @summary Basic tests of suppressed exceptions - * @author Joseph D. Darcy */ public class SuppressedExceptions { diff --git a/test/jdk/java/lang/annotation/Missing/MissingTest.java b/test/jdk/java/lang/annotation/Missing/MissingTest.java index d8a1c44e7ee..10e3b436d12 100644 --- a/test/jdk/java/lang/annotation/Missing/MissingTest.java +++ b/test/jdk/java/lang/annotation/Missing/MissingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -25,7 +25,6 @@ * @test * @bug 6322301 5041778 * @summary Verify when missing annotation classes cause exceptions - * @author Joseph D. Darcy * @compile MissingTest.java A.java B.java C.java D.java Marker.java Missing.java MissingWrapper.java MissingDefault.java * @clean Missing * @run main MissingTest diff --git a/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java b/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java index 9e9e7a7a60a..390f0fc96bd 100644 --- a/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java +++ b/test/jdk/java/lang/annotation/TestIncompleteAnnotationExceptionNPE.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ * @test * @bug 7021922 * @summary Test null handling of IncompleteAnnotationException constructor - * @author Joseph D. Darcy */ import java.lang.annotation.*; diff --git a/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java b/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java index 97e9a79e14b..34c4f840241 100644 --- a/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java +++ b/test/jdk/java/lang/reflect/AnnotatedElement/TestAnnotatedElementDefaults.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -25,7 +25,6 @@ * @test * @bug 8005294 * @summary Check behavior of default methods of AnnotatedElement - * @author Joseph D. Darcy */ import java.lang.annotation.*; diff --git a/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java b/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java index 56a781fce18..a8c6c671d86 100644 --- a/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java +++ b/test/jdk/java/lang/reflect/Constructor/GenericStringTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5033583 6316717 6470106 8161500 8162539 6304578 * @summary Check toGenericString() and toString() methods - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java b/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java index 5773825a8e2..7512d36cb42 100644 --- a/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java +++ b/test/jdk/java/lang/reflect/Constructor/TestParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -25,7 +25,6 @@ * @test * @bug 6332964 * @summary Verify getParameterAnnotations doesn't throw spurious errors - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/DefaultAccessibility.java b/test/jdk/java/lang/reflect/DefaultAccessibility.java index 6dce3e249c2..69f8946e617 100644 --- a/test/jdk/java/lang/reflect/DefaultAccessibility.java +++ b/test/jdk/java/lang/reflect/DefaultAccessibility.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,7 +25,6 @@ * @test * @bug 6648344 * @summary Test that default accessibility is false - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Field/GenericStringTest.java b/test/jdk/java/lang/reflect/Field/GenericStringTest.java index 65fbbc43381..5b5c321a3e1 100644 --- a/test/jdk/java/lang/reflect/Field/GenericStringTest.java +++ b/test/jdk/java/lang/reflect/Field/GenericStringTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5033583 8161500 * @summary Check toGenericString() method - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Generics/HashCodeTest.java b/test/jdk/java/lang/reflect/Generics/HashCodeTest.java index 53fbad758d0..00e1494d04a 100644 --- a/test/jdk/java/lang/reflect/Generics/HashCodeTest.java +++ b/test/jdk/java/lang/reflect/Generics/HashCodeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5097856 * @summary Computing hashCode of objects modeling generics shouldn't blow stack - * @author Joseph D. Darcy */ import java.util.*; diff --git a/test/jdk/java/lang/reflect/Generics/Probe.java b/test/jdk/java/lang/reflect/Generics/Probe.java index cbe94aef7a4..e14ed54f863 100644 --- a/test/jdk/java/lang/reflect/Generics/Probe.java +++ b/test/jdk/java/lang/reflect/Generics/Probe.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5003916 6704655 6873951 6476261 8004928 * @summary Testing parsing of signatures attributes of nested classes - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java b/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java index 6d7756b2163..5c44207bcc5 100644 --- a/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java +++ b/test/jdk/java/lang/reflect/Generics/StringsAndBounds.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5015676 4987888 4997464 * @summary Testing upper bounds and availability of toString methods - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java b/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java index 6bb3aa47aef..99fc3db0c97 100644 --- a/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java +++ b/test/jdk/java/lang/reflect/Generics/TestParameterizedType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5061485 * @summary Test sematics of ParameterizedType.equals - * @author Joseph D. Darcy */ import java.util.*; diff --git a/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java b/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java index dc8397aded6..485e8d3c51e 100644 --- a/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java +++ b/test/jdk/java/lang/reflect/Generics/exceptionCauseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 4981727 * @summary - * @author Joseph D. Darcy */ import java.io.PrintStream; diff --git a/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java b/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java index 0e1317e8d2d..766543863d0 100644 --- a/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java +++ b/test/jdk/java/lang/reflect/Generics/getAnnotationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 4979440 * @summary Test for signature parsing corner case - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Method/GenericStringTest.java b/test/jdk/java/lang/reflect/Method/GenericStringTest.java index c1c8e141f79..e7fe873d3cc 100644 --- a/test/jdk/java/lang/reflect/Method/GenericStringTest.java +++ b/test/jdk/java/lang/reflect/Method/GenericStringTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -25,7 +25,6 @@ * @test * @bug 5033583 6316717 6470106 8004979 8161500 8162539 6304578 * @summary Check toGenericString() and toString() methods - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Method/IsDefaultTest.java b/test/jdk/java/lang/reflect/Method/IsDefaultTest.java index c48ebaf9e96..0c983a8b0ba 100644 --- a/test/jdk/java/lang/reflect/Method/IsDefaultTest.java +++ b/test/jdk/java/lang/reflect/Method/IsDefaultTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ * @test * @bug 8005042 * @summary Check behavior of Method.isDefault - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java b/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java index 30eca409cea..b91f73ee845 100644 --- a/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java +++ b/test/jdk/java/lang/reflect/Method/defaultMethodModeling/DefaultMethodModeling.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -25,7 +25,6 @@ * @test * @bug 8011590 * @summary Check modeling of default methods - * @author Joseph D. Darcy */ import java.util.Objects; diff --git a/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java b/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java index 94f8d459cf0..9788eab3060 100644 --- a/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java +++ b/test/jdk/java/lang/reflect/TypeVariable/TestAnnotatedElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ * @test * @bug 7086192 * @summary Verify functionality of AnnotatedElement methods on type variables - * @author Joseph D. Darcy */ import java.lang.reflect.*; diff --git a/test/jdk/java/math/BigDecimal/AddTests.java b/test/jdk/java/math/BigDecimal/AddTests.java index 8045e280435..d6f57366d2a 100644 --- a/test/jdk/java/math/BigDecimal/AddTests.java +++ b/test/jdk/java/math/BigDecimal/AddTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 6362557 8200698 * @summary Some tests of add(BigDecimal, mc) - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/CompareToTests.java b/test/jdk/java/math/BigDecimal/CompareToTests.java index baefcc5b499..b6ae31bca80 100644 --- a/test/jdk/java/math/BigDecimal/CompareToTests.java +++ b/test/jdk/java/math/BigDecimal/CompareToTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 6473768 * @summary Tests of BigDecimal.compareTo - * @author Joseph D. Darcy */ import java.math.*; import static java.math.BigDecimal.*; diff --git a/test/jdk/java/math/BigDecimal/DivideTests.java b/test/jdk/java/math/BigDecimal/DivideTests.java index fe0fea73ff6..140271dc000 100644 --- a/test/jdk/java/math/BigDecimal/DivideTests.java +++ b/test/jdk/java/math/BigDecimal/DivideTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4851776 4907265 6177836 6876282 8066842 * @summary Some tests for the divide methods. - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java b/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java index 9fab5bb28ae..7df63b6329f 100644 --- a/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java +++ b/test/jdk/java/math/BigDecimal/IntegralDivisionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -24,7 +24,6 @@ * @test * @bug 4904082 4917089 6337226 6378503 * @summary Tests that integral division and related methods return the proper result and scale. - * @author Joseph D. Darcy */ import java.math.*; public class IntegralDivisionTests { diff --git a/test/jdk/java/math/BigDecimal/NegateTests.java b/test/jdk/java/math/BigDecimal/NegateTests.java index 5b570325e90..fc4ce82e286 100644 --- a/test/jdk/java/math/BigDecimal/NegateTests.java +++ b/test/jdk/java/math/BigDecimal/NegateTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -25,7 +25,6 @@ * @test * @bug 6325535 * @summary Test for the rounding behavior of negate(MathContext) - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/PowTests.java b/test/jdk/java/math/BigDecimal/PowTests.java index 49fc74c8791..a552e981c2e 100644 --- a/test/jdk/java/math/BigDecimal/PowTests.java +++ b/test/jdk/java/math/BigDecimal/PowTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4916097 * @summary Some exponent over/undeflow tests for the pow method - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/PrecisionTests.java b/test/jdk/java/math/BigDecimal/PrecisionTests.java index 43df43e16bc..88d9843c724 100644 --- a/test/jdk/java/math/BigDecimal/PrecisionTests.java +++ b/test/jdk/java/math/BigDecimal/PrecisionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,7 +25,6 @@ * @test * @bug 1234567 * @summary Test that precision() is computed properly. - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/RoundingTests.java b/test/jdk/java/math/BigDecimal/RoundingTests.java index 95d579e791a..6a12124fd62 100644 --- a/test/jdk/java/math/BigDecimal/RoundingTests.java +++ b/test/jdk/java/math/BigDecimal/RoundingTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -25,7 +25,6 @@ * @test * @bug 6334849 * @summary Tests of dropping digits near the scale threshold - * @author Joseph D. Darcy */ import java.math.*; public class RoundingTests { diff --git a/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java b/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java index 638fce9ed54..93131b77be2 100644 --- a/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java +++ b/test/jdk/java/math/BigDecimal/ScaleByPowerOfTenTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4899722 * @summary Basic tests of scaleByPowerOfTen - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/StrippingZerosTest.java b/test/jdk/java/math/BigDecimal/StrippingZerosTest.java index 083b4eabbf1..c79c26c0ce5 100644 --- a/test/jdk/java/math/BigDecimal/StrippingZerosTest.java +++ b/test/jdk/java/math/BigDecimal/StrippingZerosTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -27,7 +27,6 @@ * @summary A few tests of stripTrailingZeros * @run main StrippingZerosTest * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox -XX:AutoBoxCacheMax=20000 StrippingZerosTest - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/ToPlainStringTests.java b/test/jdk/java/math/BigDecimal/ToPlainStringTests.java index 0a1f617c0e5..28d5cdcd89d 100644 --- a/test/jdk/java/math/BigDecimal/ToPlainStringTests.java +++ b/test/jdk/java/math/BigDecimal/ToPlainStringTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -27,7 +27,6 @@ * @summary Basic tests of toPlainString method * @run main ToPlainStringTests * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+EliminateAutoBox -XX:AutoBoxCacheMax=20000 ToPlainStringTests - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigDecimal/ZeroScalingTests.java b/test/jdk/java/math/BigDecimal/ZeroScalingTests.java index 05a59150b13..908487d68ef 100644 --- a/test/jdk/java/math/BigDecimal/ZeroScalingTests.java +++ b/test/jdk/java/math/BigDecimal/ZeroScalingTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -27,7 +27,6 @@ * @summary Tests that the scale of zero is propagated properly and has the * proper effect and that setting the scale to zero does not mutate the * BigDecimal. - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigInteger/CompareToTests.java b/test/jdk/java/math/BigInteger/CompareToTests.java index 4e549fa2a53..3d9ff40ce56 100644 --- a/test/jdk/java/math/BigInteger/CompareToTests.java +++ b/test/jdk/java/math/BigInteger/CompareToTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 6473768 * @summary Tests of BigInteger.compareTo - * @author Joseph D. Darcy */ import java.math.*; import static java.math.BigInteger.*; diff --git a/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java b/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java index 853b88668a2..a173d1cf6dd 100644 --- a/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java +++ b/test/jdk/java/math/BigInteger/ExtremeShiftingTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -27,7 +27,6 @@ * @summary Tests of shiftLeft and shiftRight on Integer.MIN_VALUE * @requires os.maxMemory >= 1g * @run main/othervm -Xmx512m ExtremeShiftingTests - * @author Joseph D. Darcy */ import java.math.BigInteger; import static java.math.BigInteger.*; diff --git a/test/jdk/java/math/BigInteger/OperatorNpeTests.java b/test/jdk/java/math/BigInteger/OperatorNpeTests.java index 2985ae00c8e..593e15445d5 100644 --- a/test/jdk/java/math/BigInteger/OperatorNpeTests.java +++ b/test/jdk/java/math/BigInteger/OperatorNpeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -25,7 +25,6 @@ * @test * @bug 6365176 * @summary Get NullPointerExceptions when expected - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigInteger/StringConstructor.java b/test/jdk/java/math/BigInteger/StringConstructor.java index c8fd9f83c6b..aa95fd4e346 100644 --- a/test/jdk/java/math/BigInteger/StringConstructor.java +++ b/test/jdk/java/math/BigInteger/StringConstructor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,7 +25,6 @@ * @test * @bug 4489146 5017980 * @summary tests String constructors of BigInteger - * @author Joseph D. Darcy */ import java.math.*; diff --git a/test/jdk/java/math/BigInteger/TestValueExact.java b/test/jdk/java/math/BigInteger/TestValueExact.java index 63ee1583527..fcd934653be 100644 --- a/test/jdk/java/math/BigInteger/TestValueExact.java +++ b/test/jdk/java/math/BigInteger/TestValueExact.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ * @test * @bug 6371401 * @summary Tests of fooValueExact methods - * @author Joseph D. Darcy */ import java.math.BigInteger; diff --git a/test/jdk/java/math/RoundingMode/RoundingModeTests.java b/test/jdk/java/math/RoundingMode/RoundingModeTests.java index 87ecad945b6..6edccb9277d 100644 --- a/test/jdk/java/math/RoundingMode/RoundingModeTests.java +++ b/test/jdk/java/math/RoundingMode/RoundingModeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,7 +25,6 @@ * @test * @bug 4851776 4891522 4905335 * @summary Basic tests for the RoundingMode class. - * @author Joseph D. Darcy */ import java.math.RoundingMode; diff --git a/test/jdk/tools/launcher/ChangeDataModel.java b/test/jdk/tools/launcher/ChangeDataModel.java index e6bc281ad62..14945045435 100644 --- a/test/jdk/tools/launcher/ChangeDataModel.java +++ b/test/jdk/tools/launcher/ChangeDataModel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2017, 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ * @compile -XDignore.symbol.file ChangeDataModel.java * @run main ChangeDataModel * @summary Verify -d32, -d64 and -J prefixed data-model options are rejected on all platforms - * @author Joseph D. Darcy, ksrini */ import java.util.Arrays; diff --git a/test/jdk/tools/launcher/I18NTest.java b/test/jdk/tools/launcher/I18NTest.java index aa1ce24e798..83d90f56327 100644 --- a/test/jdk/tools/launcher/I18NTest.java +++ b/test/jdk/tools/launcher/I18NTest.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ * @compile -XDignore.symbol.file I18NTest.java * @run main I18NTest * @summary Test to see if class files with non-ASCII characters can be run - * @author Joseph D. Darcy, Kumar Srinivasan */ diff --git a/test/jdk/tools/launcher/UnresolvedExceptions.java b/test/jdk/tools/launcher/UnresolvedExceptions.java index ce14f405aed..6faa306c34c 100644 --- a/test/jdk/tools/launcher/UnresolvedExceptions.java +++ b/test/jdk/tools/launcher/UnresolvedExceptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -29,7 +29,6 @@ * @compile -XDignore.symbol.file UnresolvedExceptions.java * @run main UnresolvedExceptions * @summary Verifying jvm won't segv if exception not available - * @author Joseph D. Darcy, ksrini */ import java.io.File; From 873666d157340b3b953ad869576afd30d4304610 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Thu, 16 Oct 2025 16:53:47 +0000 Subject: [PATCH 161/561] 8369451: Debug agent support for USE_ITERATE_THROUGH_HEAP is broken and should be removed Reviewed-by: sspitsyn, amenkov --- .../share/native/libjdwp/debugInit.c | 11 +- .../share/native/libjdwp/util.c | 102 ++++-------------- .../share/native/libjdwp/util.h | 8 +- 3 files changed, 22 insertions(+), 99 deletions(-) diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c b/src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c index 73ea9a295e6..2bed6b6bb28 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/debugInit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -890,8 +890,6 @@ printUsage(void) " everything = 0xfff")); TTY_MESSAGE(( - "debugflags=flags debug flags (bitmask) none\n" - " USE_ITERATE_THROUGH_HEAP 0x01\n" "\n" "Environment Variables\n" "---------------------\n" @@ -1192,13 +1190,6 @@ parseOptions(char *options) } /*LINTED*/ logflags = (unsigned)strtol(current, NULL, 0); - } else if (strcmp(buf, "debugflags") == 0) { - /*LINTED*/ - if (!get_tok(&str, current, (int)(end - current), ',')) { - goto syntax_error; - } - /*LINTED*/ - gdata->debugflags = (unsigned)strtol(current, NULL, 0); } else if ( strcmp(buf, "suspend")==0 ) { if ( !get_boolean(&str, &suspendOnInit) ) { goto syntax_error; diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.c b/src/jdk.jdwp.agent/share/native/libjdwp/util.c index 45de2ba7b7a..980c622cc48 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/util.c +++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -2730,10 +2730,6 @@ typedef struct ClassCountData { jvmtiError error; } ClassCountData; -/* Two different cbObjectCounter's, one for FollowReferences, one for - * IterateThroughHeap. Pick a card, any card. - */ - /* Callback for object count heap traversal (heap_reference_callback) */ static jint JNICALL cbObjectCounterFromRef(jvmtiHeapReferenceKind reference_kind, @@ -2795,38 +2791,6 @@ cbObjectCounterFromRef(jvmtiHeapReferenceKind reference_kind, return JVMTI_VISIT_OBJECTS; } -/* Callback for instance count heap traversal (heap_iteration_callback) */ -static jint JNICALL -cbObjectCounter(jlong class_tag, jlong size, jlong* tag_ptr, jint length, - void* user_data) -{ - ClassCountData *data; - int index; - - /* Check data structure */ - data = (ClassCountData*)user_data; - if (data == NULL) { - return JVMTI_VISIT_ABORT; - } - - /* Classes with no tag should be filtered out. */ - if ( class_tag == (jlong)0 ) { - data->error = AGENT_ERROR_INTERNAL; - return JVMTI_VISIT_ABORT; - } - - /* Class tag is actually an index into data arrays */ - index = CLASSTAG2INDEX(class_tag); - if (index < 0 || index >= data->classCount) { - data->error = AGENT_ERROR_ILLEGAL_ARGUMENT; - return JVMTI_VISIT_ABORT; - } - - /* Bump instance count on this class */ - data->counts[index]++; - return JVMTI_VISIT_OBJECTS; -} - /* Get instance counts for a set of classes */ jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts) @@ -2879,53 +2843,27 @@ classInstanceCounts(jint classCount, jclass *classes, jlong *counts) /* Clear out callbacks structure */ (void)memset(&heap_callbacks,0,sizeof(heap_callbacks)); - /* Check debug flags to see how to do this. */ - if ( (gdata->debugflags & USE_ITERATE_THROUGH_HEAP) == 0 ) { + /* Using FollowReferences only gives us live objects, but we + * need to tag the objects to avoid counting them twice since + * the callback is per reference. + * The jclass objects have been tagged with their index in the + * supplied list, and that tag may flip to negative if it + * is also an object of interest. + * All other objects being counted that weren't in the + * supplied classes list will have a negative classCount + * tag value. So all objects counted will have negative tags. + * If the absolute tag value is an index in the supplied + * list, then it's one of the supplied classes. + */ + data.negObjTag = -INDEX2CLASSTAG(classCount); - /* Using FollowReferences only gives us live objects, but we - * need to tag the objects to avoid counting them twice since - * the callback is per reference. - * The jclass objects have been tagged with their index in the - * supplied list, and that tag may flip to negative if it - * is also an object of interest. - * All other objects being counted that weren't in the - * supplied classes list will have a negative classCount - * tag value. So all objects counted will have negative tags. - * If the absolute tag value is an index in the supplied - * list, then it's one of the supplied classes. - */ - data.negObjTag = -INDEX2CLASSTAG(classCount); + /* Setup callbacks, only using object reference callback */ + heap_callbacks.heap_reference_callback = &cbObjectCounterFromRef; - /* Setup callbacks, only using object reference callback */ - heap_callbacks.heap_reference_callback = &cbObjectCounterFromRef; - - /* Follow references, no initiating object, tagged classes only */ - error = JVMTI_FUNC_PTR(jvmti,FollowReferences) - (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED, - NULL, NULL, &heap_callbacks, &data); - - } else { - - /* Using IterateThroughHeap means that we will visit each object - * once, so no special tag tricks here. Just simple counting. - * However in this case the object might not be live, so we do - * a GC beforehand to make sure we minimize this. - */ - - /* FIXUP: Need some kind of trigger here to avoid excessive GC's? */ - error = JVMTI_FUNC_PTR(jvmti,ForceGarbageCollection)(jvmti); - if ( error != JVMTI_ERROR_NONE ) { - - /* Setup callbacks, just need object callback */ - heap_callbacks.heap_iteration_callback = &cbObjectCounter; - - /* Iterate through entire heap, tagged classes only */ - error = JVMTI_FUNC_PTR(jvmti,IterateThroughHeap) - (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED, - NULL, &heap_callbacks, &data); - - } - } + /* Follow references, no initiating object, tagged classes only */ + error = JVMTI_FUNC_PTR(jvmti,FollowReferences) + (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED, + NULL, NULL, &heap_callbacks, &data); /* Use data error if needed */ if ( error == JVMTI_ERROR_NONE ) { diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.h b/src/jdk.jdwp.agent/share/native/libjdwp/util.h index 3d499d7d569..a48c8ba2c09 100644 --- a/src/jdk.jdwp.agent/share/native/libjdwp/util.h +++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -92,12 +92,6 @@ typedef struct { jboolean quiet; jboolean jvmti_data_dump; /* If true, then support JVMTI DATA_DUMP_REQUEST events. */ - /* Debug flags (bit mask) */ - int debugflags; - - /* Possible debug flags */ - #define USE_ITERATE_THROUGH_HEAP 0X001 - char * options; jclass classClass; From d7b525ab9980743cf0cab3e3daaa4ccb725bfea8 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Thu, 16 Oct 2025 16:58:38 +0000 Subject: [PATCH 162/561] 8364673: Remove duplicate font mapping for itcavantgarde in psfontj2d.properties Reviewed-by: azvegint, kizune --- src/java.desktop/share/conf/psfontj2d.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java.desktop/share/conf/psfontj2d.properties b/src/java.desktop/share/conf/psfontj2d.properties index 9efe8864428..8030a82bc4f 100644 --- a/src/java.desktop/share/conf/psfontj2d.properties +++ b/src/java.desktop/share/conf/psfontj2d.properties @@ -59,7 +59,6 @@ avantgarde_book_oblique=avantgarde_book_oblique avantgarde_demi_oblique=avantgarde_demi_oblique # itcavantgarde=avantgarde_book -itcavantgarde=avantgarde_book itcavantgarde_demi=avantgarde_demi itcavantgarde_oblique=avantgarde_book_oblique itcavantgarde_demi_oblique=avantgarde_demi_oblique From 844118a9d854459778f88d299b148c2288131344 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Thu, 16 Oct 2025 16:58:56 +0000 Subject: [PATCH 163/561] 8369146: java/awt/PrintJob/GetGraphicsTest.java: Parse Exception: Invalid or unrecognized bugid: 50510568367702 Reviewed-by: syan, azvegint, kizune, jdv --- test/jdk/java/awt/PrintJob/GetGraphicsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/java/awt/PrintJob/GetGraphicsTest.java b/test/jdk/java/awt/PrintJob/GetGraphicsTest.java index 61abe37b66b..2fe82e57c5a 100644 --- a/test/jdk/java/awt/PrintJob/GetGraphicsTest.java +++ b/test/jdk/java/awt/PrintJob/GetGraphicsTest.java @@ -23,7 +23,7 @@ /* @test - @bug 50510568367702 + @bug 5051056 8367702 @key headful printer @summary PrintJob.getGraphics() should return null after PrintJob.end() is called. @run main GetGraphicsTest From d4472979c43d9825ed2d008dbaed26dbf6d36180 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 16 Oct 2025 17:49:08 +0000 Subject: [PATCH 164/561] 8367709: GenShen: Dirty cards for objects that get promoted by safepoint that intervenes between allocation and stores Reviewed-by: ysr --- .../share/gc/shenandoah/shenandoahBarrierSet.cpp | 15 +++++++++++++-- .../gc/shenandoah/shenandoahMarkingContext.cpp | 8 ++++---- .../shenandoahMarkingContext.inline.hpp | 4 ++-- .../gc/shenandoah/shenandoahScanRemembered.cpp | 6 +++--- .../shenandoahScanRemembered.inline.hpp | 6 +++--- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp index 5d19a6a34e3..f6733d4a923 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp @@ -89,8 +89,19 @@ bool ShenandoahBarrierSet::need_keep_alive_barrier(DecoratorSet decorators, Basi void ShenandoahBarrierSet::on_slowpath_allocation_exit(JavaThread* thread, oop new_obj) { #if COMPILER2_OR_JVMCI - assert(!ReduceInitialCardMarks || !ShenandoahCardBarrier || ShenandoahGenerationalHeap::heap()->is_in_young(new_obj), - "Allocating new object outside of young generation: " INTPTR_FORMAT, p2i(new_obj)); + if (ReduceInitialCardMarks && ShenandoahCardBarrier && !ShenandoahHeap::heap()->is_in_young(new_obj)) { + log_debug(gc)("Newly allocated object (" PTR_FORMAT ") is not in the young generation", p2i(new_obj)); + // This can happen when an object is newly allocated, but we come to a safepoint before returning + // the object. If the safepoint runs a degenerated cycle that is upgraded to a full GC, this object + // will have survived two GC cycles. If the tenuring age is very low (1), this object may be promoted. + // In this case, we have an allocated object, but it has received no stores yet. If card marking barriers + // have been elided, we could end up with an object in old holding pointers to young that won't be in + // the remembered set. The solution here is conservative, but this problem should be rare, and it will + // correct itself on subsequent cycles when the remembered set is updated. + ShenandoahGenerationalHeap::heap()->old_generation()->card_scan()->mark_range_as_dirty( + cast_from_oop(new_obj), new_obj->size() + ); + } #endif // COMPILER2_OR_JVMCI assert(thread->deferred_card_mark().is_empty(), "We don't use this"); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp index 0babeaffd3e..40eee8c342b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.cpp @@ -74,8 +74,8 @@ void ShenandoahMarkingContext::initialize_top_at_mark_start(ShenandoahHeapRegion _top_at_mark_starts_base[idx] = bottom; _top_bitmaps[idx] = bottom; - log_debug(gc)("SMC:initialize_top_at_mark_start for Region %zu, TAMS: " PTR_FORMAT ", TopOfBitMap: " PTR_FORMAT, - r->index(), p2i(bottom), p2i(r->end())); + log_debug(gc, mark)("SMC:initialize_top_at_mark_start for Region %zu, TAMS: " PTR_FORMAT ", TopOfBitMap: " PTR_FORMAT, + r->index(), p2i(bottom), p2i(r->end())); } HeapWord* ShenandoahMarkingContext::top_bitmap(ShenandoahHeapRegion* r) { @@ -86,8 +86,8 @@ void ShenandoahMarkingContext::clear_bitmap(ShenandoahHeapRegion* r) { HeapWord* bottom = r->bottom(); HeapWord* top_bitmap = _top_bitmaps[r->index()]; - log_debug(gc)("SMC:clear_bitmap for %s Region %zu, top_bitmap: " PTR_FORMAT, - r->affiliation_name(), r->index(), p2i(top_bitmap)); + log_debug(gc, mark)("SMC:clear_bitmap for %s Region %zu, top_bitmap: " PTR_FORMAT, + r->affiliation_name(), r->index(), p2i(top_bitmap)); if (top_bitmap > bottom) { _mark_bit_map.clear_range_large(MemRegion(bottom, top_bitmap)); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp index e3ba774283c..bff4afc9ce9 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.inline.hpp @@ -104,8 +104,8 @@ inline void ShenandoahMarkingContext::capture_top_at_mark_start(ShenandoahHeapRe "Region %zu, bitmap should be clear while adjusting TAMS: " PTR_FORMAT " -> " PTR_FORMAT, idx, p2i(old_tams), p2i(new_tams)); - log_debug(gc)("Capturing TAMS for %s Region %zu, was: " PTR_FORMAT ", now: " PTR_FORMAT, - r->affiliation_name(), idx, p2i(old_tams), p2i(new_tams)); + log_debug(gc, mark)("Capturing TAMS for %s Region %zu, was: " PTR_FORMAT ", now: " PTR_FORMAT, + r->affiliation_name(), idx, p2i(old_tams), p2i(new_tams)); _top_at_mark_starts_base[idx] = new_tams; _top_bitmaps[idx] = new_tams; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp index 23c705348c4..4a0215f15f1 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp @@ -683,9 +683,9 @@ void ShenandoahScanRememberedTask::do_work(uint worker_id) { struct ShenandoahRegionChunk assignment; while (_work_list->next(&assignment)) { ShenandoahHeapRegion* region = assignment._r; - log_debug(gc)("ShenandoahScanRememberedTask::do_work(%u), processing slice of region " - "%zu at offset %zu, size: %zu", - worker_id, region->index(), assignment._chunk_offset, assignment._chunk_size); + log_debug(gc, remset)("ShenandoahScanRememberedTask::do_work(%u), processing slice of region " + "%zu at offset %zu, size: %zu", + worker_id, region->index(), assignment._chunk_offset, assignment._chunk_size); if (region->is_old()) { size_t cluster_size = CardTable::card_size_in_words() * ShenandoahCardCluster::CardsPerCluster; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp index ce7cda98412..919cc4f6fd7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.inline.hpp @@ -343,9 +343,9 @@ ShenandoahScanRemembered::process_region_slice(ShenandoahHeapRegion *region, siz } } - log_debug(gc)("Remembered set scan processing Region %zu, from " PTR_FORMAT " to " PTR_FORMAT ", using %s table", - region->index(), p2i(start_of_range), p2i(end_of_range), - use_write_table? "read/write (updating)": "read (marking)"); + log_debug(gc, remset)("Remembered set scan processing Region %zu, from " PTR_FORMAT " to " PTR_FORMAT ", using %s table", + region->index(), p2i(start_of_range), p2i(end_of_range), + use_write_table? "read/write (updating)": "read (marking)"); // Note that end_of_range may point to the middle of a cluster because we limit scanning to // region->top() or region->get_update_watermark(). We avoid processing past end_of_range. From 9589a29d2515888b437d382204df22d01d4266ff Mon Sep 17 00:00:00 2001 From: Mikael Vidstedt Date: Thu, 16 Oct 2025 19:43:44 +0000 Subject: [PATCH 165/561] 8355752: Bump minimum boot jdk to JDK 25 Reviewed-by: darcy, shade, ihse, iris --- make/conf/github-actions.conf | 20 ++++++++++---------- make/conf/jib-profiles.js | 4 ++-- make/conf/version-numbers.conf | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/make/conf/github-actions.conf b/make/conf/github-actions.conf index 74a830cbcc2..bd73e909062 100644 --- a/make/conf/github-actions.conf +++ b/make/conf/github-actions.conf @@ -29,21 +29,21 @@ GTEST_VERSION=1.14.0 JTREG_VERSION=8.1+1 LINUX_X64_BOOT_JDK_EXT=tar.gz -LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_linux-x64_bin.tar.gz -LINUX_X64_BOOT_JDK_SHA256=88b090fa80c6c1d084ec9a755233967458788e2c0777ae2e172230c5c692d7ef +LINUX_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk25/bd75d5f9689641da8e1daabeccb5528b/36/GPL/openjdk-25_linux-x64_bin.tar.gz +LINUX_X64_BOOT_JDK_SHA256=59cdcaf255add4721de38eb411d4ecfe779356b61fb671aee63c7dec78054c2b ALPINE_LINUX_X64_BOOT_JDK_EXT=tar.gz -ALPINE_LINUX_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin24-binaries/releases/download/jdk-24%2B36/OpenJDK24U-jdk_x64_alpine-linux_hotspot_24_36.tar.gz -ALPINE_LINUX_X64_BOOT_JDK_SHA256=a642608f0da78344ee6812fb1490b8bc1d7ad5a18064c70994d6f330568c51cb +ALPINE_LINUX_X64_BOOT_JDK_URL=https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25%2B36/OpenJDK25U-jdk_x64_alpine-linux_hotspot_25_36.tar.gz +ALPINE_LINUX_X64_BOOT_JDK_SHA256=637e47474d411ed86134f413af7d5fef4180ddb0bf556347b7e74a88cf8904c8 MACOS_AARCH64_BOOT_JDK_EXT=tar.gz -MACOS_AARCH64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_macos-aarch64_bin.tar.gz -MACOS_AARCH64_BOOT_JDK_SHA256=f7133238a12714a62c5ad2bd4da6741130be1a82512065da9ca23dee26b2d3d3 +MACOS_AARCH64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk25/bd75d5f9689641da8e1daabeccb5528b/36/GPL/openjdk-25_macos-aarch64_bin.tar.gz +MACOS_AARCH64_BOOT_JDK_SHA256=2006337bf326fdfdf6117081751ba38c1c8706d63419ecac7ff102ff7c776876 MACOS_X64_BOOT_JDK_EXT=tar.gz -MACOS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_macos-x64_bin.tar.gz -MACOS_X64_BOOT_JDK_SHA256=6bbfb1d01741cbe55ab90299cb91464b695de9a3ace85c15131aa2f50292f321 +MACOS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk25/bd75d5f9689641da8e1daabeccb5528b/36/GPL/openjdk-25_macos-x64_bin.tar.gz +MACOS_X64_BOOT_JDK_SHA256=47482ad9888991ecac9b2bcc131e2b53ff78aff275104cef85f66252308e8a09 WINDOWS_X64_BOOT_JDK_EXT=zip -WINDOWS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk24/1f9ff9062db4449d8ca828c504ffae90/36/GPL/openjdk-24_windows-x64_bin.zip -WINDOWS_X64_BOOT_JDK_SHA256=11d1d9f6ac272d5361c8a0bef01894364081c7fb1a6914c2ad2fc312ae83d63b +WINDOWS_X64_BOOT_JDK_URL=https://download.java.net/java/GA/jdk25/bd75d5f9689641da8e1daabeccb5528b/36/GPL/openjdk-25_windows-x64_bin.zip +WINDOWS_X64_BOOT_JDK_SHA256=85bcc178461e2cb3c549ab9ca9dfa73afd54c09a175d6510d0884071867137d3 diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js index 9706321d7b6..795335d7c3c 100644 --- a/make/conf/jib-profiles.js +++ b/make/conf/jib-profiles.js @@ -387,8 +387,8 @@ var getJibProfilesCommon = function (input, data) { }; }; - common.boot_jdk_version = "24"; - common.boot_jdk_build_number = "36"; + common.boot_jdk_version = "25"; + common.boot_jdk_build_number = "37"; common.boot_jdk_home = input.get("boot_jdk", "install_path") + "/jdk-" + common.boot_jdk_version + (input.build_os == "macosx" ? ".jdk/Contents/Home" : ""); diff --git a/make/conf/version-numbers.conf b/make/conf/version-numbers.conf index 38d6e42dff9..977809535ba 100644 --- a/make/conf/version-numbers.conf +++ b/make/conf/version-numbers.conf @@ -37,6 +37,6 @@ DEFAULT_VERSION_DATE=2026-03-17 DEFAULT_VERSION_CLASSFILE_MAJOR=70 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`" DEFAULT_VERSION_CLASSFILE_MINOR=0 DEFAULT_VERSION_DOCS_API_SINCE=11 -DEFAULT_ACCEPTABLE_BOOT_VERSIONS="24 25 26" +DEFAULT_ACCEPTABLE_BOOT_VERSIONS="25 26" DEFAULT_JDK_SOURCE_TARGET_VERSION=26 DEFAULT_PROMOTED_VERSION_PRE=ea From 3248aaf3c4f6784d5176e2a2c5bac0fbda47ee6b Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Thu, 16 Oct 2025 19:45:57 +0000 Subject: [PATCH 166/561] 8356548: Use ClassFile API instead of ASM to transform classes in tests Reviewed-by: sspitsyn, lmesnik, coleenp, iklam --- .../calls/common/InvokeDynamicPatcher.java | 215 ++++++++---------- .../CompiledInvokeDynamic2CompiledTest.java | 2 +- ...CompiledInvokeDynamic2InterpretedTest.java | 2 +- .../CompiledInvokeDynamic2NativeTest.java | 2 +- ...InterpretedInvokeDynamic2CompiledTest.java | 2 +- ...erpretedInvokeDynamic2InterpretedTest.java | 2 +- .../InterpretedInvokeDynamic2NativeTest.java | 2 +- ...fineMethodUsedByMultipleMethodHandles.java | 42 ++-- .../compiler/jvmci/common/CTVMUtilities.java | 125 +++++----- .../jtreg/runtime/MirrorFrame/Asmator.java | 47 ++-- .../runtime/MirrorFrame/Test8003720.java | 1 - .../MissedStackMapFrames.java | 45 ++-- .../RedefineClasses/RedefineAnnotations.java | 75 ++---- .../RedefineGenericSignatureTest.java | 30 ++- .../jvmti/RedefineClasses/RedefineObject.java | 46 +--- .../RedefineRetransform.java | 86 +++---- .../gc/g1/unloading/GenClassPoolJar.java | 35 +-- .../TestDescription.java | 1 - .../TestDescription.java | 1 - .../TestDescription.java | 1 - .../TestDescription.java | 1 - .../TestDescription.java | 1 - .../TestDescription.java | 1 - .../nsk/jvmti/GetClassFields/getclfld007.java | 57 ++--- 24 files changed, 306 insertions(+), 516 deletions(-) diff --git a/test/hotspot/jtreg/compiler/calls/common/InvokeDynamicPatcher.java b/test/hotspot/jtreg/compiler/calls/common/InvokeDynamicPatcher.java index b82e06317d2..d5c93ebaf5e 100644 --- a/test/hotspot/jtreg/compiler/calls/common/InvokeDynamicPatcher.java +++ b/test/hotspot/jtreg/compiler/calls/common/InvokeDynamicPatcher.java @@ -23,150 +23,121 @@ package compiler.calls.common; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Handle; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -import java.io.FileInputStream; import java.io.IOException; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.CodeBuilder; +import java.lang.classfile.CodeElement; +import java.lang.classfile.CodeTransform; +import java.lang.classfile.Label; +import java.lang.constant.ClassDesc; +import java.lang.constant.DirectMethodHandleDesc; +import java.lang.constant.DynamicCallSiteDesc; +import java.lang.constant.MethodHandleDesc; +import java.lang.constant.MethodTypeDesc; import java.lang.invoke.CallSite; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import static java.lang.constant.ConstantDescs.*; + /** * A class which patch InvokeDynamic class bytecode with invokydynamic instruction, rewriting "caller" method to call "callee" method using invokedynamic */ -public class InvokeDynamicPatcher extends ClassVisitor { +public final class InvokeDynamicPatcher { - private static final String CLASS = InvokeDynamic.class.getName() - .replace('.', '/'); + private static final ClassDesc CLASS = InvokeDynamic.class.describeConstable().orElseThrow(); private static final String CALLER_METHOD_NAME = "caller"; private static final String CALLEE_METHOD_NAME = "callee"; private static final String NATIVE_CALLEE_METHOD_NAME = "calleeNative"; private static final String BOOTSTRAP_METHOD_NAME = "bootstrapMethod"; private static final String CALL_NATIVE_FIELD = "nativeCallee"; - private static final String CALL_NATIVE_FIELD_DESC = "Z"; - private static final String CALLEE_METHOD_DESC - = "(L" + CLASS + ";IJFDLjava/lang/String;)Z"; - private static final String ASSERTTRUE_METHOD_DESC - = "(ZLjava/lang/String;)V"; - private static final String ASSERTS_CLASS = "jdk/test/lib/Asserts"; + private static final ClassDesc CALL_NATIVE_FIELD_DESC = CD_boolean; + private static final MethodTypeDesc CALLEE_METHOD_DESC = MethodTypeDesc.of( + CD_boolean, CLASS, CD_int, CD_long, CD_float, CD_double, CD_String); + private static final MethodTypeDesc ASSERTTRUE_METHOD_DESC = MethodTypeDesc.of( + CD_void, CD_boolean, CD_String); + private static final ClassDesc ASSERTS_CLASS = ClassDesc.ofInternalName("jdk/test/lib/Asserts"); private static final String ASSERTTRUE_METHOD_NAME = "assertTrue"; - public static void main(String args[]) { - ClassReader cr; - Path filePath; - try { - filePath = Paths.get(InvokeDynamic.class.getProtectionDomain().getCodeSource() - .getLocation().toURI()).resolve(CLASS + ".class"); - } catch (URISyntaxException ex) { - throw new Error("TESTBUG: Can't get code source" + ex, ex); - } - try (FileInputStream fis = new FileInputStream(filePath.toFile())) { - cr = new ClassReader(fis); - } catch (IOException e) { - throw new Error("Error reading file", e); - } - ClassWriter cw = new ClassWriter(cr, - ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); - cr.accept(new InvokeDynamicPatcher(Opcodes.ASM5, cw), 0); - try { - Files.write(filePath, cw.toByteArray(), - StandardOpenOption.WRITE); - } catch (IOException e) { - throw new Error(e); - } - } + public static void main(String args[]) throws IOException, URISyntaxException { + Path filePath = Path.of(InvokeDynamic.class.getProtectionDomain().getCodeSource() + .getLocation().toURI()).resolve(InvokeDynamic.class.getName().replace('.', '/') +".class"); + var bytes = ClassFile.of().transformClass(ClassFile.of().parse(filePath), + ClassTransform.transformingMethodBodies(m -> m.methodName().equalsString(CALLER_METHOD_NAME), new CodeTransform() { + @Override + public void accept(CodeBuilder builder, CodeElement element) { + // discard + } - public InvokeDynamicPatcher(int api, ClassWriter cw) { - super(api, cw); - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, - final String[] exceptions) { - /* a code generate looks like - * 0: aload_0 - * 1: ldc #125 // int 1 - * 3: ldc2_w #126 // long 2l - * 6: ldc #128 // float 3.0f - * 8: ldc2_w #129 // double 4.0d - * 11: ldc #132 // String 5 - * 13: aload_0 - * 14: getfield #135 // Field nativeCallee:Z - * 17: ifeq 28 - * 20: invokedynamic #181, 0 // InvokeDynamic #1:calleeNative:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z - * 25: goto 33 - * 28: invokedynamic #183, 0 // InvokeDynamic #1:callee:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z - * 33: ldc #185 // String Call insuccessfull - * 35: invokestatic #191 // Method jdk/test/lib/Asserts.assertTrue:(ZLjava/lang/String;)V - * 38: return - * - * or, using java-like pseudo-code - * if (this.nativeCallee == false) { - * invokedynamic-call-return-value = invokedynamic-of-callee - * } else { - * invokedynamic-call-return-value = invokedynamic-of-nativeCallee - * } - * Asserts.assertTrue(invokedynamic-call-return-value, error-message); - * return; - */ - if (name.equals(CALLER_METHOD_NAME)) { - MethodVisitor mv = cv.visitMethod(access, name, desc, - signature, exceptions); - Label nonNativeLabel = new Label(); - Label checkLabel = new Label(); - MethodType mtype = MethodType.methodType(CallSite.class, - MethodHandles.Lookup.class, String.class, MethodType.class); - Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, CLASS, - BOOTSTRAP_METHOD_NAME, mtype.toMethodDescriptorString()); - mv.visitCode(); - // push callee parameters onto stack - mv.visitVarInsn(Opcodes.ALOAD, 0);//push "this" - mv.visitLdcInsn(1); - mv.visitLdcInsn(2L); - mv.visitLdcInsn(3.0f); - mv.visitLdcInsn(4.0d); - mv.visitLdcInsn("5"); - // params loaded. let's decide what method to call - mv.visitVarInsn(Opcodes.ALOAD, 0); // push "this" - // get nativeCallee field - mv.visitFieldInsn(Opcodes.GETFIELD, CLASS, CALL_NATIVE_FIELD, - CALL_NATIVE_FIELD_DESC); - // if nativeCallee == false goto nonNativeLabel - mv.visitJumpInsn(Opcodes.IFEQ, nonNativeLabel); - // invokedynamic nativeCalleeMethod using bootstrap method - mv.visitInvokeDynamicInsn(NATIVE_CALLEE_METHOD_NAME, - CALLEE_METHOD_DESC, bootstrap); - // goto checkLabel - mv.visitJumpInsn(Opcodes.GOTO, checkLabel); - // label: nonNativeLabel - mv.visitLabel(nonNativeLabel); - // invokedynamic calleeMethod using bootstrap method - mv.visitInvokeDynamicInsn(CALLEE_METHOD_NAME, CALLEE_METHOD_DESC, - bootstrap); - mv.visitLabel(checkLabel); - mv.visitLdcInsn(CallsBase.CALL_ERR_MSG); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, ASSERTS_CLASS, - ASSERTTRUE_METHOD_NAME, ASSERTTRUE_METHOD_DESC, false); - // label: return - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - return null; - } - return super.visitMethod(access, name, desc, signature, exceptions); + /* the code generated looks like + * 0: aload_0 + * 1: ldc #125 // int 1 + * 3: ldc2_w #126 // long 2l + * 6: ldc #128 // float 3.0f + * 8: ldc2_w #129 // double 4.0d + * 11: ldc #132 // String 5 + * 13: aload_0 + * 14: getfield #135 // Field nativeCallee:Z + * 17: ifeq 28 + * 20: invokedynamic #181, 0 // InvokeDynamic #1:calleeNative:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z + * 25: goto 33 + * 28: invokedynamic #183, 0 // InvokeDynamic #1:callee:(Lcompiler/calls/common/InvokeDynamic;IJFDLjava/lang/String;)Z + * 33: ldc #185 // String Call insuccessfull + * 35: invokestatic #191 // Method jdk/test/lib/Asserts.assertTrue:(ZLjava/lang/String;)V + * 38: return + * + * or, using java-like pseudo-code + * if (this.nativeCallee == false) { + * invokedynamic-call-return-value = invokedynamic-of-callee + * } else { + * invokedynamic-call-return-value = invokedynamic-of-nativeCallee + * } + * Asserts.assertTrue(invokedynamic-call-return-value, error-message); + * return; + */ + @Override + public void atEnd(CodeBuilder builder) { + Label nonNativeLabel = builder.newLabel(); + Label checkLabel = builder.newLabel(); + MethodType mtype = MethodType.methodType(CallSite.class, + MethodHandles.Lookup.class, String.class, MethodType.class); + DirectMethodHandleDesc dmh = MethodHandleDesc.of(DirectMethodHandleDesc.Kind.STATIC, + CLASS, BOOTSTRAP_METHOD_NAME, mtype.descriptorString()); + // push callee parameters onto stack + builder.aload(builder.receiverSlot()) + .ldc(1) + .ldc(2L) + .ldc(3.0f) + .ldc(4.0d) + .ldc("5") + // params loaded. let's decide what method to call + .aload(builder.receiverSlot()) + // get nativeCallee field + .getfield(CLASS, CALL_NATIVE_FIELD, CALL_NATIVE_FIELD_DESC) + // if nativeCallee == false goto nonNativeLabel + .ifeq(nonNativeLabel) + // invokedynamic nativeCalleeMethod using bootstrap method + .invokedynamic(DynamicCallSiteDesc.of(dmh, NATIVE_CALLEE_METHOD_NAME, CALLEE_METHOD_DESC)) + // goto checkLabel + .goto_(checkLabel) + // label: nonNativeLabel + .labelBinding(nonNativeLabel) + // invokedynamic calleeMethod using bootstrap method + .invokedynamic(DynamicCallSiteDesc.of(dmh, CALLEE_METHOD_NAME, CALLEE_METHOD_DESC)) + .labelBinding(checkLabel) + .ldc(CallsBase.CALL_ERR_MSG) + .invokestatic(ASSERTS_CLASS, ASSERTTRUE_METHOD_NAME, ASSERTTRUE_METHOD_DESC) + // label: return + .return_(); + } + })); + Files.write(filePath, bytes, StandardOpenOption.WRITE); } } diff --git a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java index 914500a25d4..c20f8f44822 100644 --- a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2CompiledTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from compiled to compiled using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java index b6f8520a90a..ee497d10707 100644 --- a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2InterpretedTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from compiled to interpreted using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java index e334f6a15f0..7dc2b423587 100644 --- a/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromCompiled/CompiledInvokeDynamic2NativeTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from compiled to native using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java index ca626fd3b01..0ba1dd1a496 100644 --- a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2CompiledTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from interpreted to compiled using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java index d8d877977d4..7ed8c683629 100644 --- a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2InterpretedTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from interpreted to interpreted using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java index 38bca4939d4..20f94db80b1 100644 --- a/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java +++ b/test/hotspot/jtreg/compiler/calls/fromInterpreted/InterpretedInvokeDynamic2NativeTest.java @@ -25,10 +25,10 @@ * @test * @summary check calls from interpreted to native using InvokeDynamic * @library /test/lib / - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * * @build jdk.test.whitebox.WhiteBox + * @build compiler.calls.common.InvokeDynamic * @run driver compiler.calls.common.InvokeDynamicPatcher * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/native -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. diff --git a/test/hotspot/jtreg/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java b/test/hotspot/jtreg/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java index 769863880f2..9a74806e621 100644 --- a/test/hotspot/jtreg/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java +++ b/test/hotspot/jtreg/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java @@ -21,12 +21,11 @@ * questions. */ -/** +/* * @test * @bug 8042235 * @summary redefining method used by multiple MethodHandles crashes VM * @library / - * @library /testlibrary/asm * @modules java.compiler * java.instrument * jdk.attach @@ -37,15 +36,13 @@ package compiler.jsr292; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassHierarchyResolver; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.instruction.ConstantInstruction; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; @@ -159,28 +156,15 @@ public class RedefineMethodUsedByMultipleMethodHandles { public byte[] transform(ClassLoader cl, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (Foo.class.equals(classBeingRedefined)) { System.out.println("redefining " + classBeingRedefined); - ClassReader cr = new ClassReader(classfileBuffer); - ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES); - ClassVisitor adapter = new ClassVisitor(Opcodes.ASM5, cw) { - @Override - public MethodVisitor visitMethod(int access, String base, String desc, String signature, String[] exceptions) { - MethodVisitor mv = cv.visitMethod(access, base, desc, signature, exceptions); - if (mv != null) { - mv = new MethodVisitor(Opcodes.ASM5, mv) { - @Override - public void visitLdcInsn(Object cst) { - System.out.println("replacing \"" + cst + "\" with \"bar\""); - mv.visitLdcInsn("bar"); - } - }; - } - return mv; + var context = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(ClassHierarchyResolver.ofResourceParsing(cl))); + return context.transformClass(context.parse(classfileBuffer), ClassTransform.transformingMethodBodies((codeBuilder, codeElement) -> { + if (codeElement instanceof ConstantInstruction.LoadConstantInstruction ldc) { + System.out.println("replacing \"" + ldc.constantEntry().constantValue() + "\" with \"bar\""); + codeBuilder.ldc("bar"); + } else { + codeBuilder.with(codeElement); } - }; - - cr.accept(adapter, ClassReader.SKIP_FRAMES); - cw.visitEnd(); - return cw.toByteArray(); + })); } return classfileBuffer; } diff --git a/test/hotspot/jtreg/compiler/jvmci/common/CTVMUtilities.java b/test/hotspot/jtreg/compiler/jvmci/common/CTVMUtilities.java index 95917f6d943..c98d9944c80 100644 --- a/test/hotspot/jtreg/compiler/jvmci/common/CTVMUtilities.java +++ b/test/hotspot/jtreg/compiler/jvmci/common/CTVMUtilities.java @@ -23,28 +23,26 @@ package compiler.jvmci.common; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; -import jdk.test.lib.Utils; import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.hotspot.CompilerToVMHelper; -import jdk.vm.ci.hotspot.HotSpotNmethod; import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod; import java.io.IOException; +import java.lang.classfile.Attributes; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.classfile.MethodModel; +import java.lang.constant.ClassDesc; +import java.lang.constant.ConstantDescs; +import java.lang.constant.MethodTypeDesc; +import java.lang.invoke.MethodType; import java.lang.reflect.Constructor; import java.lang.reflect.Executable; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.lang.reflect.Parameter; -import java.util.HashMap; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -71,76 +69,55 @@ public class CTVMUtilities { } public static Map getBciToLineNumber(Executable method) { - Map lineNumbers = new TreeMap<>(); - Class aClass = method.getDeclaringClass(); - ClassReader cr; - try { - Module aModule = aClass.getModule(); - String name = aClass.getName(); - cr = new ClassReader(aModule.getResourceAsStream( - name.replace('.', '/') + ".class")); - } catch (IOException e) { - throw new Error("TEST BUG: can read " + aClass.getName() + " : " + e, e); - } - ClassNode cn = new ClassNode(); - cr.accept(cn, ClassReader.EXPAND_FRAMES); + ClassModel classModel = findClassBytes(method.getDeclaringClass()); + MethodModel methodModel = findMethod(classModel, method); + if (methodModel == null) + return Map.of(); - Map labels = new HashMap<>(); - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); - ClassVisitor cv = new ClassVisitorForLabels(cw, labels, method); - cr.accept(cv, ClassReader.EXPAND_FRAMES); - labels.forEach((k, v) -> lineNumbers.put(k.getOffset(), v)); - boolean isEmptyMethod = Modifier.isAbstract(method.getModifiers()) - || Modifier.isNative(method.getModifiers()); - if (lineNumbers.isEmpty() && !isEmptyMethod) { - throw new Error(method + " doesn't contains the line numbers table " - +"(the method marked neither abstract nor native)"); + var foundLineNumberTable = methodModel.code().flatMap(code -> + code.findAttribute(Attributes.lineNumberTable())); + if (foundLineNumberTable.isEmpty()) { + boolean isEmptyMethod = Modifier.isAbstract(method.getModifiers()) + || Modifier.isNative(method.getModifiers()); + if (!isEmptyMethod) { + throw new Error(method + " doesn't contains the line numbers table " + + "(the method marked neither abstract nor native)"); + } + return Map.of(); } + + Map lineNumbers = new TreeMap<>(); + foundLineNumberTable.get().lineNumbers().forEach(ln -> + lineNumbers.put(ln.startPc(), ln.lineNumber())); return lineNumbers; } - private static class ClassVisitorForLabels extends ClassVisitor { - private final Map lineNumbers; - private final String targetName; - private final String targetDesc; - - public ClassVisitorForLabels(ClassWriter cw, Map lines, - Executable target) { - super(Opcodes.ASM7, cw); - this.lineNumbers = lines; - - StringBuilder builder = new StringBuilder("("); - for (Parameter parameter : target.getParameters()) { - builder.append(Utils.toJVMTypeSignature(parameter.getType())); - } - builder.append(")"); - if (target instanceof Constructor) { - targetName = ""; - builder.append("V"); - } else { - targetName = target.getName(); - builder.append(Utils.toJVMTypeSignature( - ((Method) target).getReturnType())); - } - targetDesc = builder.toString(); + // Finds the ClassFile API model of a given class, or fail with an Error. + public static ClassModel findClassBytes(Class clazz) { + String binaryName = clazz.getName(); + byte[] fileBytes; + try (var inputStream = clazz.getModule().getResourceAsStream( + binaryName.replace('.', '/') + ".class")) { + fileBytes = inputStream.readAllBytes(); + } catch (IOException e) { + throw new Error("TEST BUG: cannot read " + binaryName, e); } + return ClassFile.of().parse(fileBytes); + } - @Override - public final MethodVisitor visitMethod(int access, String name, - String desc, String signature, - String[] exceptions) { - MethodVisitor mv = cv.visitMethod(access, name, desc, signature, - exceptions); - if (targetDesc.equals(desc) && targetName.equals(name)) { - return new MethodVisitor(Opcodes.ASM7, mv) { - @Override - public void visitLineNumber(int i, Label label) { - super.visitLineNumber(i, label); - lineNumbers.put(label, i); - } - }; + // Finds a matching method in a class model, or null if none match. + public static MethodModel findMethod(ClassModel classModel, Executable method) { + MethodTypeDesc methodType = MethodType.methodType( + method instanceof Method m ? m.getReturnType() : void.class, + method.getParameterTypes()).describeConstable().orElseThrow(); + String methodName = method instanceof Method m ? m.getName() : ConstantDescs.INIT_NAME; + + for (var methodModel : classModel.methods()) { + if (methodModel.methodName().equalsString(methodName) + && methodModel.methodType().isMethodType(methodType)) { + return methodModel; } - return mv; } + return null; } } diff --git a/test/hotspot/jtreg/runtime/MirrorFrame/Asmator.java b/test/hotspot/jtreg/runtime/MirrorFrame/Asmator.java index c5d9a4cb595..d8165d80196 100644 --- a/test/hotspot/jtreg/runtime/MirrorFrame/Asmator.java +++ b/test/hotspot/jtreg/runtime/MirrorFrame/Asmator.java @@ -21,35 +21,28 @@ * questions. */ -import org.objectweb.asm.*; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.CodeBuilder; +import java.lang.classfile.CodeElement; +import java.lang.classfile.CodeTransform; class Asmator { - static byte[] fixup(byte[] buf) throws java.io.IOException { - ClassReader cr = new ClassReader(buf); - ClassWriter cw = new ClassWriter(0); - ClassVisitor cv = new ClassVisitor(Opcodes.ASM4, cw) { - public MethodVisitor visitMethod( - final int access, - final String name, - final String desc, - final String signature, - final String[] exceptions) - { - MethodVisitor mv = super.visitMethod(access, - name, - desc, - signature, - exceptions); - if (mv == null) return null; - if (name.equals("callme")) { - // make receiver go dead! - mv.visitInsn(Opcodes.ACONST_NULL); - mv.visitVarInsn(Opcodes.ASTORE, 0); + static byte[] fixup(byte[] buf) { + return ClassFile.of().transformClass(ClassFile.of().parse(buf), ClassTransform.transformingMethodBodies( + m -> m.methodName().equalsString("callme"), + new CodeTransform() { + @Override + public void atStart(CodeBuilder builder) { + // make receiver go dead! + builder.aconst_null().astore(0); + } + + @Override + public void accept(CodeBuilder builder, CodeElement element) { + builder.with(element); // pass through + } } - return mv; - } - }; - cr.accept(cv, 0); - return cw.toByteArray(); + )); } } diff --git a/test/hotspot/jtreg/runtime/MirrorFrame/Test8003720.java b/test/hotspot/jtreg/runtime/MirrorFrame/Test8003720.java index 43c8fefacd2..5bcae8e45d1 100644 --- a/test/hotspot/jtreg/runtime/MirrorFrame/Test8003720.java +++ b/test/hotspot/jtreg/runtime/MirrorFrame/Test8003720.java @@ -25,7 +25,6 @@ * @test * @bug 8003720 * @summary Method in interpreter stack frame can be deallocated - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * @compile -XDignore.symbol.file Victim.java * @run main/othervm -Xverify:all -Xint Test8003720 diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/MissedStackMapFrames.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/MissedStackMapFrames.java index 534f077eaf4..941c6e79bb8 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/MissedStackMapFrames.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/MissedStackMapFrames/MissedStackMapFrames.java @@ -27,17 +27,15 @@ * @bug 8228604 * * @requires vm.jvmti - * @library /testlibrary/asm * @library /test/lib * * @run main/othervm/native -agentlib:MissedStackMapFrames MissedStackMapFrames */ -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - +import java.lang.classfile.Attributes; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.classfile.MethodModel; public class MissedStackMapFrames { static { @@ -58,30 +56,19 @@ public class MissedStackMapFrames { private static native byte[] retransformBytes(int idx); private static int getStackMapFrameCount(byte[] classfileBuffer) { - ClassReader reader = new ClassReader(classfileBuffer); - final int[] frameCount = {0}; - ClassVisitor cv = new ClassVisitor(Opcodes.ASM9) { - @Override - public MethodVisitor visitMethod(int access, String name, - String descriptor, String signature, - String[] exceptions) { - return new MethodVisitor(Opcodes.ASM9) { - private int methodFrames = 0; - @Override - public void visitFrame(int type, int numLocal, Object[] local, - int numStack, Object[] stack) { - methodFrames++; - } - @Override - public void visitEnd() { - log(" method " + name + " - " + methodFrames + " frames"); - frameCount[0] += methodFrames; - } - }; + ClassModel clazz = ClassFile.of().parse(classfileBuffer); + int count = 0; + for (MethodModel method : clazz.methods()) { + var foundStackMapTable = method.code().flatMap(code -> code.findAttribute(Attributes.stackMapTable())); + if (foundStackMapTable.isPresent()) { + int methodFrames = foundStackMapTable.get().entries().size(); + log(" method " + method.methodName() + " - " + methodFrames + " frames"); + count += methodFrames; + } else { + log(" method " + method.methodName() + " - No StackMapTable"); } - }; - reader.accept(cv, 0); - return frameCount[0]; + } + return count; } private static int checkStackMapFrames(String mode, byte[] classfileBuffer) { diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineAnnotations.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineAnnotations.java index aad876d7181..320531148d4 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineAnnotations.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineAnnotations.java @@ -24,7 +24,6 @@ /* * @test * @library /test/lib - * @library /testlibrary/asm * @summary Test that type annotations are retained after a retransform * @requires vm.jvmti * @modules java.base/jdk.internal.misc @@ -46,6 +45,11 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.lang.classfile.ClassBuilder; +import java.lang.classfile.ClassElement; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.FieldModel; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; @@ -55,17 +59,10 @@ import java.lang.reflect.AnnotatedParameterizedType; import java.lang.reflect.AnnotatedType; import java.lang.reflect.AnnotatedWildcardType; import java.lang.reflect.Executable; -import java.lang.reflect.TypeVariable; import java.security.ProtectionDomain; -import java.util.Arrays; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import static org.objectweb.asm.Opcodes.ASM7; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) @@ -86,53 +83,27 @@ public class RedefineAnnotations { ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { - ClassWriter cw = new ClassWriter(0); - ClassVisitor cv = new ReAddDummyFieldsClassVisitor(ASM7, cw) { }; - ClassReader cr = new ClassReader(classfileBuffer); - cr.accept(cv, 0); - return cw.toByteArray(); - } + // Shuffle constant pool + ClassFile context = ClassFile.of(ClassFile.ConstantPoolSharingOption.NEW_POOL); + return context.transformClass(context.parse(classfileBuffer), new ClassTransform() { + final List dummyFields = new ArrayList<>(); - public class ReAddDummyFieldsClassVisitor extends ClassVisitor { - - LinkedList fields = new LinkedList<>(); - - public ReAddDummyFieldsClassVisitor(int api, ClassVisitor cv) { - super(api, cv); - } - - @Override public FieldVisitor visitField(int access, String name, - String desc, String signature, Object value) { - if (name.startsWith("dummy")) { - // Remove dummy field - fields.addLast(new F(access, name, desc, signature, value)); - return null; + @Override + public void accept(ClassBuilder builder, ClassElement element) { + if (element instanceof FieldModel field && field.fieldName().stringValue().startsWith("dummy")) { + // Hold on to the associated constant pool entries too + dummyFields.addLast(field); + } else { + builder.with(element); + } } - return cv.visitField(access, name, desc, signature, value); - } - @Override public void visitEnd() { - F f; - while ((f = fields.pollFirst()) != null) { - // Re-add dummy fields - cv.visitField(f.access, f.name, f.desc, f.signature, f.value); + @Override + public void atEnd(ClassBuilder builder) { + // Add the associated constant pool entries to the end of the CP + dummyFields.forEach(builder); } - } - - private class F { - private int access; - private String name; - private String desc; - private String signature; - private Object value; - F(int access, String name, String desc, String signature, Object value) { - this.access = access; - this.name = name; - this.desc = desc; - this.signature = signature; - this.value = value; - } - } + }); } @Override public byte[] transform(ClassLoader loader, String className, diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineGenericSignatureTest.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineGenericSignatureTest.java index f220a93f187..923253e8051 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineGenericSignatureTest.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineGenericSignatureTest.java @@ -35,6 +35,11 @@ import java.io.File; import java.io.FileOutputStream; +import java.lang.classfile.ClassBuilder; +import java.lang.classfile.ClassElement; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.attribute.SourceFileAttribute; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; @@ -141,27 +146,28 @@ public class RedefineGenericSignatureTest { private byte[] getNewClassBytes() { byte[] bytecode = InMemoryJavaCompiler.compile(GenericSignatureTarget.class.getName(), newTargetClassSource); - ClassWriter cw = new ClassWriter(0); - ClassReader cr = new ClassReader(bytecode); - cr.accept(new ClassVisitor(Opcodes.ASM7, cw) { + ClassFile context = ClassFile.of(); + return context.transformClass(context.parse(bytecode), new ClassTransform() { private boolean sourceSet = false; @Override - public void visitSource(String source, String debug) { - sourceSet = true; - log("Changing source: \"" + source + "\" -> \"" + sourceFileNameNew + "\""); - super.visitSource(sourceFileNameNew, debug); + public void accept(ClassBuilder builder, ClassElement element) { + if (element instanceof SourceFileAttribute src) { + sourceSet = true; + log("Changing source: \"" + src.sourceFile() + "\" -> \"" + sourceFileNameNew + "\""); + builder.with(SourceFileAttribute.of(sourceFileNameNew)); + } else { + builder.with(element); + } } @Override - public void visitEnd() { + public void atEnd(ClassBuilder builder) { if (!sourceSet) { log("Set source: \"" + sourceFileNameNew + "\""); - super.visitSource(sourceFileNameNew, null); + builder.with(SourceFileAttribute.of(sourceFileNameNew)); } - super.visitEnd(); } - }, 0); - return cw.toByteArray(); + }); } private void runTest() throws Throwable { diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineObject.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineObject.java index de90c15b5a5..d3349282410 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineObject.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineObject.java @@ -27,7 +27,6 @@ * @summary Ensure Object natives stay registered after redefinition * @requires vm.jvmti * @library /test/lib - * @library /testlibrary/asm * @modules java.base/jdk.internal.misc * java.compiler * java.instrument @@ -41,19 +40,15 @@ import jdk.test.lib.helpers.ClassFileInstaller; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.lang.RuntimeException; +import java.lang.classfile.ClassBuilder; +import java.lang.classfile.ClassElement; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassFileVersion; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.security.ProtectionDomain; -import java.util.Arrays; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; - -import static org.objectweb.asm.Opcodes.ASM6; -import static org.objectweb.asm.Opcodes.V1_8; public class RedefineObject { @@ -69,31 +64,14 @@ public class RedefineObject { Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { - ClassWriter cw = new ClassWriter(0); - // Force an older ASM to force a bytecode update - ClassVisitor cv = new DummyClassVisitor(ASM6, cw) { }; - ClassReader cr = new ClassReader(classfileBuffer); - cr.accept(cv, 0); - byte[] bytes = cw.toByteArray(); - return bytes; - } - - public class DummyClassVisitor extends ClassVisitor { - - public DummyClassVisitor(int api, ClassVisitor cv) { - super(api, cv); - } - - public void visit( - final int version, - final int access, - final String name, - final String signature, - final String superName, - final String[] interfaces) { - // Artificially lower to JDK 8 version to force a redefine - cv.visit(V1_8, access, name, signature, superName, interfaces); - } + return ClassFile.of().transformClass(ClassFile.of().parse(classfileBuffer), (classBuilder, classElement) -> { + if (classElement instanceof ClassFileVersion cfv) { + // Force a redefine with different class file versions + classBuilder.with(ClassFileVersion.of(cfv.majorVersion() - 1, 0)); + } else { + classBuilder.with(classElement); + } + }); } @Override public byte[] transform(ClassLoader loader, String className, diff --git a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/RedefineRetransform.java b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/RedefineRetransform.java index a09d1dc318e..167b546ac9d 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/RedefineRetransform.java +++ b/test/hotspot/jtreg/serviceability/jvmti/RedefineClasses/RedefineRetransform/RedefineRetransform.java @@ -27,7 +27,6 @@ * @bug 7124710 * * @requires vm.jvmti - * @library /testlibrary/asm * @library /test/lib * * @comment main/othervm/native -Xlog:redefine*=trace -agentlib:RedefineRetransform RedefineRetransform @@ -42,13 +41,17 @@ import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; - -import org.objectweb.asm.AnnotationVisitor; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; +import java.lang.classfile.Annotation; +import java.lang.classfile.AnnotationElement; +import java.lang.classfile.AnnotationValue; +import java.lang.classfile.Attributes; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.classfile.ClassTransform; +import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute; +import java.lang.constant.ClassDesc; +import java.util.List; +import java.util.NoSuchElementException; /* * The test verifies that after interleaved RedefineClasses/RetransformClasses calls @@ -81,67 +84,32 @@ public class RedefineRetransform { // Class bytes for initial TestClass (ClassVersion == 0). private static byte[] initialClassBytes; - private static class VersionScanner extends ClassVisitor { - private Integer detectedVersion; - private Integer versionToSet; - // to get version - public VersionScanner() { - super(Opcodes.ASM7); - } - // to set version - public VersionScanner(int verToSet, ClassVisitor classVisitor) { - super(Opcodes.ASM7, classVisitor); - versionToSet = verToSet; - } - - public int detectedVersion() { - if (detectedVersion == null) { - throw new RuntimeException("Version not detected"); - } - return detectedVersion; - } - - @Override - public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - //log("visitAnnotation: descr = '" + descriptor + "', visible = " + visible); - if (Type.getDescriptor(ClassVersion.class).equals(descriptor)) { - return new AnnotationVisitor(Opcodes.ASM7, super.visitAnnotation(descriptor, visible)) { - @Override - public void visit(String name, Object value) { - //log("visit: name = '" + name + "', value = " + value - // + " (" + (value == null ? "N/A" : value.getClass()) + ")"); - if ("value".equals(name) && value instanceof Integer intValue) { - detectedVersion = intValue; - if (versionToSet != null) { - //log("replace with " + versionToSet); - value = versionToSet; - } - } - super.visit(name, value); - } - }; - } - return super.visitAnnotation(descriptor, visible); - } - } + private static final ClassDesc CD_ClassVersion = ClassVersion.class.describeConstable().orElseThrow(); // Generates TestClass class bytes with the specified ClassVersion value. private static byte[] getClassBytes(int ver) { if (ver < 0) { return null; } - ClassWriter cw = new ClassWriter(0); - ClassReader cr = new ClassReader(initialClassBytes); - cr.accept(new VersionScanner(ver, cw), 0); - return cw.toByteArray(); + return ClassFile.of().transformClass(ClassFile.of().parse(initialClassBytes), + // overwrites previously passed RVAA + ClassTransform.endHandler(classBuilder -> classBuilder.with(RuntimeVisibleAnnotationsAttribute + .of(Annotation.of(CD_ClassVersion, AnnotationElement.ofInt("value", ver)))))); } // Extracts ClassVersion values from the provided class bytes. private static int getClassBytesVersion(byte[] classBytes) { - ClassReader cr = new ClassReader(classBytes); - VersionScanner scanner = new VersionScanner(); - cr.accept(scanner, 0); - return scanner.detectedVersion(); + ClassModel classModel = ClassFile.of().parse(classBytes); + RuntimeVisibleAnnotationsAttribute rvaa = classModel.findAttribute(Attributes.runtimeVisibleAnnotations()).orElseThrow(); + List classVersionElementValuePairs = rvaa.annotations().stream() + .filter(anno -> anno.className().isFieldType(CD_ClassVersion)) + .findFirst().orElseThrow().elements(); + if (classVersionElementValuePairs.size() != 1) + throw new NoSuchElementException(); + AnnotationElement elementValuePair = classVersionElementValuePairs.getFirst(); + if (!elementValuePair.name().equalsString("value") || !(elementValuePair.value() instanceof AnnotationValue.OfInt intVal)) + throw new NoSuchElementException(); + return intVal.intValue(); } static void init() { diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/GenClassPoolJar.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/GenClassPoolJar.java index cea00fc2efc..511db8b8ed1 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/GenClassPoolJar.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/GenClassPoolJar.java @@ -26,6 +26,9 @@ package gc.g1.unloading; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassTransform; +import java.lang.constant.ClassDesc; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; @@ -42,11 +45,6 @@ import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Opcodes; - /** * Class that imitates shell script to produce jar file with many similar * classes inside. @@ -261,28 +259,9 @@ public class GenClassPoolJar { * @return new class file to write into class */ byte[] morphClass(byte[] classToMorph, String newName) { - ClassReader cr = new ClassReader(classToMorph); - ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); - ClassVisitor cv = new ClassRenamer(cw, newName); - cr.accept(cv, 0); - return cw.toByteArray(); + var context = ClassFile.of(); + return context.transformClass(context.parse(classToMorph), + ClassDesc.ofInternalName(newName), + ClassTransform.ACCEPT_ALL); } - - /** - * Visitor to rename class. - */ - static class ClassRenamer extends ClassVisitor implements Opcodes { - private final String newName; - - public ClassRenamer(ClassVisitor cv, String newName) { - super(ASM4, cv); - this.newName = newName; - } - - @Override - public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - cv.visit(version, access, newName, signature, superName, interfaces); - } - - } } diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_cl/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_cl/TestDescription.java index 19b2a940788..5337aa73d2e 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_cl/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_cl/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_class/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_class/TestDescription.java index b84411234a5..75d45dda2fe 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_class/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_class/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_obj/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_obj/TestDescription.java index f0cc45744c4..aceade65a66 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_obj/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_inMemoryCompilation_keep_obj/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_cl/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_cl/TestDescription.java index 48f1680897f..a2547a7556f 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_cl/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_cl/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_class/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_class/TestDescription.java index 68263db73ac..d822f65034d 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_class/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_class/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_obj/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_obj/TestDescription.java index 4ee02a649d3..e875b964f0f 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_obj/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/g1/unloading/tests/unloading_keepRef_rootClass_keep_obj/TestDescription.java @@ -30,7 +30,6 @@ * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent, javac] * * @modules java.base/jdk.internal.misc - * @library /testlibrary/asm * @library /vmTestbase * /test/lib * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007.java index 6d79e479b97..300966c04dd 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassFields/getclfld007.java @@ -25,14 +25,12 @@ package nsk.jvmti.GetClassFields; import java.io.PrintStream; import java.io.InputStream; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassModel; +import java.lang.classfile.FieldModel; import java.util.List; import java.util.ArrayList; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.Opcodes; - public class getclfld007 { @@ -79,44 +77,29 @@ public class getclfld007 { static void check(Class cls) throws Exception { - FieldExplorer explorer = new FieldExplorer(cls); - List fields = explorer.get(); + List fields = getFields(cls); check(cls, fields.toArray(new String[0])); } - // helper class to get list of the class fields - // in the order they appear in the class file - static class FieldExplorer extends ClassVisitor { - private final Class cls; - private List fieldNameAndSig = new ArrayList<>(); - private FieldExplorer(Class cls) { - super(Opcodes.ASM7); - this.cls = cls; - } + private static InputStream getClassBytes(Class cls) throws Exception { + String clsName = cls.getName(); + String clsPath = clsName.replace('.', '/') + ".class"; + return cls.getClassLoader().getResourceAsStream(clsPath); + } - @Override - public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { - System.out.println(" field '" + name + "', type = " + descriptor); - fieldNameAndSig.add(name); - fieldNameAndSig.add(descriptor); - return super.visitField(access, name, descriptor, signature, value); - } - - private InputStream getClassBytes() throws Exception { - String clsName = cls.getName(); - String clsPath = clsName.replace('.', '/') + ".class"; - return cls.getClassLoader().getResourceAsStream(clsPath); - } - - // each field is represented by 2 Strings in the list: name and type descriptor - public List get() throws Exception { - System.out.println("Class " + cls.getName()); - try (InputStream classBytes = getClassBytes()) { - ClassReader classReader = new ClassReader(classBytes); - classReader.accept(this, 0); + // get list of the class fields in the order they appear in the class file + // each field is represented by 2 Strings in the list: name and type descriptor + public static List getFields(Class cls) throws Exception { + System.out.println("Class " + cls.getName()); + List fieldNameAndSig = new ArrayList<>(); + try (InputStream classBytes = getClassBytes(cls)) { + ClassModel classModel = ClassFile.of().parse(classBytes.readAllBytes()); + for (FieldModel field : classModel.fields()) { + fieldNameAndSig.add(field.fieldName().stringValue()); + fieldNameAndSig.add(field.fieldType().stringValue()); } - return fieldNameAndSig; } + return fieldNameAndSig; } static class InnerClass1 { From 1392a0b4608f6196f207fcebbab75b2d79fdc758 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Thu, 16 Oct 2025 19:55:07 +0000 Subject: [PATCH 167/561] 8368740: Serial: Swap eden and survivor spaces position in young generation Reviewed-by: gli, fandreuzzi --- .../share/gc/serial/defNewGeneration.cpp | 271 +++++++++--------- .../share/gc/serial/defNewGeneration.hpp | 24 +- src/hotspot/share/gc/serial/serialHeap.cpp | 9 +- src/hotspot/share/gc/serial/serialHeap.hpp | 8 +- src/hotspot/share/gc/shared/space.cpp | 5 +- 5 files changed, 165 insertions(+), 152 deletions(-) diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index 5b7bc744236..aef896182c0 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -225,16 +225,12 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs, _promo_failure_drain_in_progress(false), _string_dedup_requests() { - MemRegion cmr((HeapWord*)_virtual_space.low(), - (HeapWord*)_virtual_space.high()); - SerialHeap* gch = SerialHeap::heap(); - - gch->rem_set()->resize_covered_region(cmr); - _eden_space = new ContiguousSpace(); _from_space = new ContiguousSpace(); _to_space = new ContiguousSpace(); + init_spaces(); + // Compute the maximum eden and survivor space sizes. These sizes // are computed assuming the entire reserved space is committed. // These values are exported as performance counters. @@ -256,7 +252,6 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs, _to_counters = new CSpaceCounters("s1", 2, _max_survivor_size, _to_space, _gen_counters); - compute_space_boundaries(0, SpaceDecorator::Clear, SpaceDecorator::Mangle); update_counters(); _old_gen = nullptr; _tenuring_threshold = MaxTenuringThreshold; @@ -268,74 +263,51 @@ DefNewGeneration::DefNewGeneration(ReservedSpace rs, _gc_tracer = new DefNewTracer(); } -void DefNewGeneration::compute_space_boundaries(uintx minimum_eden_size, - bool clear_space, - bool mangle_space) { - // If the spaces are being cleared (only done at heap initialization - // currently), the survivor spaces need not be empty. - // Otherwise, no care is taken for used areas in the survivor spaces - // so check. - assert(clear_space || (to()->is_empty() && from()->is_empty()), - "Initialization of the survivor spaces assumes these are empty"); +void DefNewGeneration::init_spaces() { + // Using layout: from, to, eden, so only from can be non-empty. + assert(eden()->is_empty(), "precondition"); + assert(to()->is_empty(), "precondition"); + + if (!from()->is_empty()) { + assert((char*) from()->bottom() == _virtual_space.low(), "inv"); + } // Compute sizes - uintx size = _virtual_space.committed_size(); - uintx survivor_size = compute_survivor_size(size, SpaceAlignment); - uintx eden_size = size - (2*survivor_size); - if (eden_size > max_eden_size()) { - // Need to reduce eden_size to satisfy the max constraint. The delta needs - // to be 2*SpaceAlignment aligned so that both survivors are properly - // aligned. - uintx eden_delta = align_up(eden_size - max_eden_size(), 2*SpaceAlignment); - eden_size -= eden_delta; - survivor_size += eden_delta/2; - } + size_t size = _virtual_space.committed_size(); + size_t survivor_size = compute_survivor_size(size, SpaceAlignment); + assert(survivor_size >= from()->used(), "inv"); + assert(size > 2 * survivor_size, "inv"); + size_t eden_size = size - (2 * survivor_size); assert(eden_size > 0 && survivor_size <= eden_size, "just checking"); - if (eden_size < minimum_eden_size) { - // May happen due to 64Kb rounding, if so adjust eden size back up - minimum_eden_size = align_up(minimum_eden_size, SpaceAlignment); - uintx maximum_survivor_size = (size - minimum_eden_size) / 2; - uintx unaligned_survivor_size = - align_down(maximum_survivor_size, SpaceAlignment); - survivor_size = MAX2(unaligned_survivor_size, SpaceAlignment); - eden_size = size - (2*survivor_size); - assert(eden_size > 0 && survivor_size <= eden_size, "just checking"); - assert(eden_size >= minimum_eden_size, "just checking"); - } + // layout: from, to, eden + char* from_start = _virtual_space.low(); + char* to_start = from_start + survivor_size; + char* eden_start = to_start + survivor_size; + char* eden_end = eden_start + eden_size; - char *eden_start = _virtual_space.low(); - char *from_start = eden_start + eden_size; - char *to_start = from_start + survivor_size; - char *to_end = to_start + survivor_size; - - assert(to_end == _virtual_space.high(), "just checking"); - assert(is_aligned(eden_start, SpaceAlignment), "checking alignment"); + assert(eden_end == _virtual_space.high(), "just checking"); assert(is_aligned(from_start, SpaceAlignment), "checking alignment"); assert(is_aligned(to_start, SpaceAlignment), "checking alignment"); + assert(is_aligned(eden_start, SpaceAlignment), "checking alignment"); + assert(is_aligned(eden_end, SpaceAlignment), "checking alignment"); - MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)from_start); MemRegion fromMR((HeapWord*)from_start, (HeapWord*)to_start); - MemRegion toMR ((HeapWord*)to_start, (HeapWord*)to_end); - - // A minimum eden size implies that there is a part of eden that - // is being used and that affects the initialization of any - // newly formed eden. - bool live_in_eden = minimum_eden_size > 0; + MemRegion toMR ((HeapWord*)to_start, (HeapWord*)eden_start); + MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)eden_end); // Reset the spaces for their new regions. - eden()->initialize(edenMR, - clear_space && !live_in_eden, - SpaceDecorator::Mangle); - // If clear_space and live_in_eden, we will not have cleared any - // portion of eden above its top. This can cause newly - // expanded space not to be mangled if using ZapUnusedHeapArea. - // We explicitly do such mangling here. - if (ZapUnusedHeapArea && clear_space && live_in_eden && mangle_space) { - eden()->mangle_unused_area(); - } - from()->initialize(fromMR, clear_space, mangle_space); - to()->initialize(toMR, clear_space, mangle_space); + from()->initialize(fromMR, from()->is_empty(), SpaceDecorator::Mangle); + to()->initialize(toMR, true, SpaceDecorator::Mangle); + eden()->initialize(edenMR, true, SpaceDecorator::Mangle); + + post_resize(); +} + +void DefNewGeneration::post_resize() { + MemRegion cmr((HeapWord*)_virtual_space.low(), + (HeapWord*)_virtual_space.high()); + SerialHeap::heap()->rem_set()->resize_covered_region(cmr); } void DefNewGeneration::swap_spaces() { @@ -351,20 +323,28 @@ void DefNewGeneration::swap_spaces() { } bool DefNewGeneration::expand(size_t bytes) { - HeapWord* prev_high = (HeapWord*) _virtual_space.high(); + assert(bytes != 0, "precondition"); + assert(is_aligned(bytes, SpaceAlignment), "precondition"); + bool success = _virtual_space.expand_by(bytes); - if (success && ZapUnusedHeapArea) { - // Mangle newly committed space immediately because it - // can be done here more simply that after the new - // spaces have been computed. - HeapWord* new_high = (HeapWord*) _virtual_space.high(); - MemRegion mangle_region(prev_high, new_high); - SpaceMangler::mangle_region(mangle_region); + if (!success) { + log_info(gc)("Failed to expand young-gen by %zu bytes", bytes); } return success; } +void DefNewGeneration::expand_eden_by(size_t delta_bytes) { + if (!expand(delta_bytes)) { + return; + } + + MemRegion eden_mr{eden()->bottom(), (HeapWord*)_virtual_space.high()}; + eden()->initialize(eden_mr, eden()->is_empty(), SpaceDecorator::Mangle); + + post_resize(); +} + size_t DefNewGeneration::calculate_thread_increase_size(int threads_count) const { size_t thread_increase_size = 0; // Check an overflow at 'threads_count * NewSizeThreadIncrease'. @@ -397,18 +377,8 @@ size_t DefNewGeneration::adjust_for_thread_increase(size_t new_size_candidate, return desired_new_size; } -void DefNewGeneration::compute_new_size() { - // This is called after a GC that includes the old generation, so from-space - // will normally be empty. - // Note that we check both spaces, since if scavenge failed they revert roles. - // If not we bail out (otherwise we would have to relocate the objects). - if (!from()->is_empty() || !to()->is_empty()) { - return; - } - - SerialHeap* gch = SerialHeap::heap(); - - size_t old_size = gch->old_gen()->capacity(); +size_t DefNewGeneration::calculate_desired_young_gen_bytes() const { + size_t old_size = SerialHeap::heap()->old_gen()->capacity(); size_t new_size_before = _virtual_space.committed_size(); size_t min_new_size = NewSize; size_t max_new_size = reserved().byte_size(); @@ -429,46 +399,82 @@ void DefNewGeneration::compute_new_size() { // Adjust new generation size desired_new_size = clamp(desired_new_size, min_new_size, max_new_size); - assert(desired_new_size <= max_new_size, "just checking"); + if (!from()->is_empty()) { + // Mininum constraint to hold all live objs inside from-space. + size_t min_survivor_size = align_up(from()->used(), alignment); - bool changed = false; - if (desired_new_size > new_size_before) { - size_t change = desired_new_size - new_size_before; - assert(change % alignment == 0, "just checking"); - if (expand(change)) { - changed = true; + // SurvivorRatio := eden_size / survivor_size + // young-gen-size = eden_size + 2 * survivor_size + // = SurvivorRatio * survivor_size + 2 * survivor_size + // = (SurvivorRatio + 2) * survivor_size + size_t min_young_gen_size = min_survivor_size * (SurvivorRatio + 2); + + desired_new_size = MAX2(min_young_gen_size, desired_new_size); + } + assert(is_aligned(desired_new_size, alignment), "postcondition"); + + return desired_new_size; +} + +void DefNewGeneration::resize_inner() { + assert(eden()->is_empty(), "precondition"); + assert(to()->is_empty(), "precondition"); + + size_t current_young_gen_size_bytes = _virtual_space.committed_size(); + size_t desired_young_gen_size_bytes = calculate_desired_young_gen_bytes(); + if (current_young_gen_size_bytes == desired_young_gen_size_bytes) { + return; + } + + // Commit/uncommit + if (desired_young_gen_size_bytes > current_young_gen_size_bytes) { + size_t delta_bytes = desired_young_gen_size_bytes - current_young_gen_size_bytes; + if (!expand(delta_bytes)) { + return; } - // If the heap failed to expand to the desired size, - // "changed" will be false. If the expansion failed - // (and at this point it was expected to succeed), - // ignore the failure (leaving "changed" as false). + } else { + size_t delta_bytes = current_young_gen_size_bytes - desired_young_gen_size_bytes; + _virtual_space.shrink_by(delta_bytes); } - if (desired_new_size < new_size_before && eden()->is_empty()) { - // bail out of shrinking if objects in eden - size_t change = new_size_before - desired_new_size; - assert(change % alignment == 0, "just checking"); - _virtual_space.shrink_by(change); - changed = true; - } - if (changed) { - // The spaces have already been mangled at this point but - // may not have been cleared (set top = bottom) and should be. - // Mangling was done when the heap was being expanded. - compute_space_boundaries(eden()->used(), - SpaceDecorator::Clear, - SpaceDecorator::DontMangle); - MemRegion cmr((HeapWord*)_virtual_space.low(), - (HeapWord*)_virtual_space.high()); - gch->rem_set()->resize_covered_region(cmr); - log_debug(gc, ergo, heap)( - "New generation size %zuK->%zuK [eden=%zuK,survivor=%zuK]", - new_size_before/K, _virtual_space.committed_size()/K, - eden()->capacity()/K, from()->capacity()/K); - log_trace(gc, ergo, heap)( - " [allowed %zuK extra for %d threads]", - thread_increase_size/K, threads_count); - } + assert(desired_young_gen_size_bytes == _virtual_space.committed_size(), "inv"); + + init_spaces(); + + log_debug(gc, ergo, heap)("New generation size %zuK->%zuK [eden=%zuK,survivor=%zuK]", + current_young_gen_size_bytes/K, _virtual_space.committed_size()/K, + eden()->capacity()/K, from()->capacity()/K); +} + +void DefNewGeneration::resize_after_young_gc() { + // Called only after successful young-gc. + assert(eden()->is_empty(), "precondition"); + assert(to()->is_empty(), "precondition"); + + if ((char*)to()->bottom() == _virtual_space.low()) { + // layout: to, from, eden; can't resize. + return; + } + + assert((char*)from()->bottom() == _virtual_space.low(), "inv"); + resize_inner(); +} + +void DefNewGeneration::resize_after_full_gc() { + if (eden()->is_empty() && from()->is_empty() && to()->is_empty()) { + resize_inner(); + return; + } + + // Usually the young-gen is empty after full-gc. + // This is the extreme case; expand young-gen to its max size. + if (_virtual_space.uncommitted_size() == 0) { + // Already at its max size. + return; + } + + // Keep from/to and expand eden. + expand_eden_by(_virtual_space.uncommitted_size()); } void DefNewGeneration::ref_processor_init() { @@ -483,13 +489,11 @@ size_t DefNewGeneration::capacity() const { + from()->capacity(); // to() is only used during scavenge } - size_t DefNewGeneration::used() const { return eden()->used() + from()->used(); // to() is only used during scavenge } - size_t DefNewGeneration::free() const { return eden()->free() + from()->free(); // to() is only used during scavenge @@ -497,7 +501,8 @@ size_t DefNewGeneration::free() const { size_t DefNewGeneration::max_capacity() const { const size_t reserved_bytes = reserved().byte_size(); - return reserved_bytes - compute_survivor_size(reserved_bytes, SpaceAlignment); + const size_t min_survivor_bytes = SpaceAlignment; + return reserved_bytes - min_survivor_bytes; } bool DefNewGeneration::is_in(const void* p) const { @@ -589,7 +594,6 @@ bool DefNewGeneration::collect(bool clear_all_soft_refs) { IsAliveClosure is_alive(this); age_table()->clear(); - to()->clear(SpaceDecorator::Mangle); YoungGenScanClosure young_gen_cl(this); OldGenScanClosure old_gen_cl(this); @@ -839,13 +843,18 @@ void DefNewGeneration::print_on(outputStream* st) const { to()->print_on(st, "to "); } -HeapWord* DefNewGeneration::allocate(size_t word_size) { - // This is the slow-path allocation for the DefNewGeneration. - // Most allocations are fast-path in compiled code. - // We try to allocate from the eden. If that works, we are happy. - // Note that since DefNewGeneration supports lock-free allocation, we - // have to use it here, as well. - HeapWord* result = eden()->par_allocate(word_size); +HeapWord* DefNewGeneration::expand_and_allocate(size_t word_size) { + assert(SafepointSynchronize::is_at_safepoint(), "precondition"); + assert(Thread::current()->is_VM_thread(), "precondition"); + + size_t eden_free_bytes = eden()->free(); + size_t requested_bytes = word_size * HeapWordSize; + if (eden_free_bytes < requested_bytes) { + size_t expand_bytes = requested_bytes - eden_free_bytes; + expand_eden_by(align_up(expand_bytes, SpaceAlignment)); + } + + HeapWord* result = eden()->allocate(word_size); return result; } diff --git a/src/hotspot/share/gc/serial/defNewGeneration.hpp b/src/hotspot/share/gc/serial/defNewGeneration.hpp index 32b6b32f42f..40d2116cb58 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.hpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.hpp @@ -131,6 +131,13 @@ class DefNewGeneration: public Generation { return n > alignment ? align_down(n, alignment) : alignment; } + size_t calculate_desired_young_gen_bytes() const; + + void expand_eden_by(size_t delta_bytes); + + void resize_inner(); + void post_resize(); + public: DefNewGeneration(ReservedSpace rs, size_t initial_byte_size, @@ -183,9 +190,8 @@ class DefNewGeneration: public Generation { HeapWord* block_start(const void* p) const; - // Allocate requested size or return null; single-threaded and lock-free versions. - HeapWord* allocate(size_t word_size); HeapWord* par_allocate(size_t word_size); + HeapWord* expand_and_allocate(size_t word_size); void gc_epilogue(); @@ -196,8 +202,8 @@ class DefNewGeneration: public Generation { // Reset for contribution of "to-space". void reset_scratch(); - // GC support - void compute_new_size(); + void resize_after_young_gc(); + void resize_after_full_gc(); bool collect(bool clear_all_soft_refs); @@ -220,13 +226,9 @@ class DefNewGeneration: public Generation { DefNewTracer* gc_tracer() const { return _gc_tracer; } - protected: - // If clear_space is true, clear the survivor spaces. Eden is - // cleared if the minimum size of eden is 0. If mangle_space - // is true, also mangle the space in debug mode. - void compute_space_boundaries(uintx minimum_eden_size, - bool clear_space, - bool mangle_space); + private: + // Initialize eden/from/to spaces. + void init_spaces(); // Return adjusted new size for NewSizeThreadIncrease. // If any overflow happens, revert to previous new size. diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index 3ab88da4633..3511318e169 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -269,9 +269,9 @@ size_t SerialHeap::max_capacity() const { } HeapWord* SerialHeap::expand_heap_and_allocate(size_t size, bool is_tlab) { - HeapWord* result = _young_gen->allocate(size); + HeapWord* result = _young_gen->expand_and_allocate(size); - if (result == nullptr) { + if (result == nullptr && !is_tlab) { result = _old_gen->expand_and_allocate(size); } @@ -388,14 +388,13 @@ bool SerialHeap::do_young_collection(bool clear_soft_refs) { // Only update stats for successful young-gc if (result) { _old_gen->update_promote_stats(); + _young_gen->resize_after_young_gc(); } if (should_verify && VerifyAfterGC) { Universe::verify("After GC"); } - _young_gen->compute_new_size(); - print_heap_change(pre_gc_values); // Track memory usage and detect low memory after GC finishes @@ -581,7 +580,7 @@ void SerialHeap::do_full_collection(bool clear_all_soft_refs) { // Adjust generation sizes. _old_gen->compute_new_size(); - _young_gen->compute_new_size(); + _young_gen->resize_after_full_gc(); _old_gen->update_promote_stats(); diff --git a/src/hotspot/share/gc/serial/serialHeap.hpp b/src/hotspot/share/gc/serial/serialHeap.hpp index 27053b4cc81..3915f8c4af9 100644 --- a/src/hotspot/share/gc/serial/serialHeap.hpp +++ b/src/hotspot/share/gc/serial/serialHeap.hpp @@ -55,10 +55,10 @@ class TenuredGeneration; // +-- generation boundary (fixed after startup) // | // |<- young gen (reserved MaxNewSize) ->|<- old gen (reserved MaxOldSize) ->| -// +-----------------+--------+--------+--------+---------------+-------------------+ -// | eden | from | to | | old | | -// | | (to) | (from) | | | | -// +-----------------+--------+--------+--------+---------------+-------------------+ +// +--------+--------+-----------------+--------+---------------+-------------------+ +// | from | to | eden | | old | | +// | (to) | (from) | | | | | +// +--------+--------+-----------------+--------+---------------+-------------------+ // |<- committed ->| |<- committed ->| // class SerialHeap : public CollectedHeap { diff --git a/src/hotspot/share/gc/shared/space.cpp b/src/hotspot/share/gc/shared/space.cpp index 08476cb2a3a..1d15fbc3fa9 100644 --- a/src/hotspot/share/gc/shared/space.cpp +++ b/src/hotspot/share/gc/shared/space.cpp @@ -53,7 +53,10 @@ void ContiguousSpace::initialize(MemRegion mr, set_bottom(bottom); set_end(end); if (clear_space) { - clear(mangle_space); + clear(SpaceDecorator::DontMangle); + } + if (ZapUnusedHeapArea && mangle_space) { + mangle_unused_area(); } } From 18fd04770294e27011bd576b5ea5fe43fa03e5e3 Mon Sep 17 00:00:00 2001 From: Justin King Date: Thu, 16 Oct 2025 19:59:13 +0000 Subject: [PATCH 168/561] 8369506: Bytecode rewriting causes Java heap corruption on AArch64 Co-authored-by: Man Cao Co-authored-by: Chuck Rasbold Reviewed-by: shade, aph, manc --- src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp | 11 +++++++++++ src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp | 2 ++ src/hotspot/cpu/aarch64/templateTable_aarch64.cpp | 15 ++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp index 607912e6e49..6f8795494a2 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp @@ -1704,3 +1704,14 @@ void InterpreterMacroAssembler::load_method_entry(Register cache, Register index add(cache, cache, Array::base_offset_in_bytes()); lea(cache, Address(cache, index)); } + +#ifdef ASSERT +void InterpreterMacroAssembler::verify_field_offset(Register reg) { + // Verify the field offset is not in the header, implicitly checks for 0 + Label L; + subs(zr, reg, oopDesc::base_offset_in_bytes()); + br(Assembler::GE, L); + stop("bad field offset"); + bind(L); +} +#endif diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp index e896a2a9430..e07e6e49f53 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp @@ -319,6 +319,8 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_resolved_indy_entry(Register cache, Register index); void load_field_entry(Register cache, Register index, int bcp_offset = 1); void load_method_entry(Register cache, Register index, int bcp_offset = 1); + + void verify_field_offset(Register reg) NOT_DEBUG_RETURN; }; #endif // CPU_AARCH64_INTERP_MASM_AARCH64_HPP diff --git a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp index 5195432f54e..f4774f31bbd 100644 --- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp @@ -168,6 +168,7 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, Register temp_reg, bool load_bc_into_bc_reg/*=true*/, int byte_no) { + assert_different_registers(bc_reg, temp_reg); if (!RewriteBytecodes) return; Label L_patch_done; @@ -231,9 +232,12 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ stop("patching the wrong bytecode"); __ bind(L_okay); #endif - - // patch bytecode - __ strb(bc_reg, at_bcp(0)); + // Patch bytecode with release store to coordinate with ResolvedFieldEntry loads + // in fast bytecode codelets. load_field_entry has a memory barrier that gains + // the needed ordering, together with control dependency on entering the fast codelet + // itself. + __ lea(temp_reg, at_bcp(0)); + __ stlrb(bc_reg, temp_reg); __ bind(L_patch_done); } @@ -3094,6 +3098,7 @@ void TemplateTable::fast_storefield(TosState state) // R1: field offset, R2: field holder, R5: flags load_resolved_field_entry(r2, r2, noreg, r1, r5); + __ verify_field_offset(r1); { Label notVolatile; @@ -3183,6 +3188,8 @@ void TemplateTable::fast_accessfield(TosState state) __ load_field_entry(r2, r1); __ load_sized_value(r1, Address(r2, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/); + __ verify_field_offset(r1); + __ load_unsigned_byte(r3, Address(r2, in_bytes(ResolvedFieldEntry::flags_offset()))); // r0: object @@ -3249,7 +3256,9 @@ void TemplateTable::fast_xaccess(TosState state) __ ldr(r0, aaddress(0)); // access constant pool cache __ load_field_entry(r2, r3, 2); + __ load_sized_value(r1, Address(r2, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/); + __ verify_field_offset(r1); // 8179954: We need to make sure that the code generated for // volatile accesses forms a sequentially-consistent set of From 0c1c86e68efcc140cefbde89b4d1d8708e931528 Mon Sep 17 00:00:00 2001 From: Patricio Chilano Mateo Date: Thu, 16 Oct 2025 21:20:42 +0000 Subject: [PATCH 169/561] 8370036: TestJhsdbJstackWithVirtualThread.java fails when run with -showversion Reviewed-by: ayang, cjplummer --- .../serviceability/sa/TestJhsdbJstackWithVirtualThread.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java index fce9906ca94..acea00a190b 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java @@ -45,7 +45,7 @@ public class TestJhsdbJstackWithVirtualThread { private static void runJstack(LingeredApp app) throws Exception { JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb"); - launcher.addVMArgs(Utils.getTestJavaOpts()); + launcher.addVMArgs(Utils.getFilteredTestJavaOpts("-showversion")); launcher.addToolArg("jstack"); launcher.addToolArg("--pid"); launcher.addToolArg(Long.toString(app.getPid())); From 0bdd6f0640fc25667f911228eed6a0fa118e8ff8 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Thu, 16 Oct 2025 22:04:40 +0000 Subject: [PATCH 170/561] 8369734: JvmtiExport::post_class_file_load_hook return value is never used Reviewed-by: dholmes, sspitsyn --- src/hotspot/share/prims/jvmtiExport.cpp | 12 +++--------- src/hotspot/share/prims/jvmtiExport.hpp | 5 ++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index fa6ede86cd9..0884fce2ff7 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -879,7 +879,6 @@ class JvmtiClassFileLoadHookPoster : public StackObj { JvmtiThreadState * _state; Klass* _class_being_redefined; JvmtiClassLoadKind _load_kind; - bool _has_been_modified; public: inline JvmtiClassFileLoadHookPoster(Symbol* h_name, Handle class_loader, @@ -896,7 +895,6 @@ class JvmtiClassFileLoadHookPoster : public StackObj { _curr_data = *data_ptr; _curr_env = nullptr; _cached_class_file_ptr = cache_ptr; - _has_been_modified = false; _state = JvmtiExport::get_jvmti_thread_state(_thread); if (_state != nullptr) { @@ -935,8 +933,6 @@ class JvmtiClassFileLoadHookPoster : public StackObj { copy_modified_data(); } - bool has_been_modified() { return _has_been_modified; } - private: void post_all_envs() { if (_load_kind != jvmti_class_load_kind_retransform) { @@ -983,7 +979,6 @@ class JvmtiClassFileLoadHookPoster : public StackObj { } if (new_data != nullptr) { // this agent has modified class data. - _has_been_modified = true; if (caching_needed && *_cached_class_file_ptr == nullptr) { // data has been changed by the new retransformable agent // and it hasn't already been cached, cache it @@ -1058,18 +1053,18 @@ bool JvmtiExport::_should_post_class_file_load_hook = false; int JvmtiExport::_should_notify_object_alloc = 0; // this entry is for class file load hook on class load, redefine and retransform -bool JvmtiExport::post_class_file_load_hook(Symbol* h_name, +void JvmtiExport::post_class_file_load_hook(Symbol* h_name, Handle class_loader, Handle h_protection_domain, unsigned char **data_ptr, unsigned char **end_ptr, JvmtiCachedClassFileData **cache_ptr) { if (JvmtiEnv::get_phase() < JVMTI_PHASE_PRIMORDIAL) { - return false; + return; } if (JavaThread::current()->should_hide_jvmti_events()) { - return false; + return; } JvmtiClassFileLoadHookPoster poster(h_name, class_loader, @@ -1077,7 +1072,6 @@ bool JvmtiExport::post_class_file_load_hook(Symbol* h_name, data_ptr, end_ptr, cache_ptr); poster.post(); - return poster.has_been_modified(); } void JvmtiExport::report_unsupported(bool on) { diff --git a/src/hotspot/share/prims/jvmtiExport.hpp b/src/hotspot/share/prims/jvmtiExport.hpp index 062057c70ab..8906d6b81df 100644 --- a/src/hotspot/share/prims/jvmtiExport.hpp +++ b/src/hotspot/share/prims/jvmtiExport.hpp @@ -377,11 +377,10 @@ class JvmtiExport : public AllStatic { static bool is_early_phase() NOT_JVMTI_RETURN_(false); static bool has_early_class_hook_env() NOT_JVMTI_RETURN_(false); static bool has_early_vmstart_env() NOT_JVMTI_RETURN_(false); - // Return true if the class was modified by the hook. - static bool post_class_file_load_hook(Symbol* h_name, Handle class_loader, + static void post_class_file_load_hook(Symbol* h_name, Handle class_loader, Handle h_protection_domain, unsigned char **data_ptr, unsigned char **end_ptr, - JvmtiCachedClassFileData **cache_ptr) NOT_JVMTI_RETURN_(false); + JvmtiCachedClassFileData **cache_ptr) NOT_JVMTI_RETURN; static void post_native_method_bind(Method* method, address* function_ptr) NOT_JVMTI_RETURN; static void post_compiled_method_load(JvmtiEnv* env, nmethod *nm) NOT_JVMTI_RETURN; static void post_compiled_method_load(nmethod *nm) NOT_JVMTI_RETURN; From 4d20f7696c015bc0e59544ff064fe0c640d61edf Mon Sep 17 00:00:00 2001 From: William Kemper Date: Fri, 17 Oct 2025 00:15:37 +0000 Subject: [PATCH 171/561] 8370050: Shenandoah: Obsolete ShenandoahPacing option Reviewed-by: ysr --- src/hotspot/share/runtime/arguments.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 8b703cb442a..0d9973a1b09 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -548,6 +548,7 @@ static SpecialFlag const special_jvm_flags[] = { { "ZGenerational", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::undefined() }, { "ZMarkStackSpaceLimit", JDK_Version::undefined(), JDK_Version::jdk(25), JDK_Version::undefined() }, { "G1UpdateBufferSize", JDK_Version::undefined(), JDK_Version::jdk(26), JDK_Version::jdk(27) }, + { "ShenandoahPacing", JDK_Version::jdk(25), JDK_Version::jdk(26), JDK_Version::jdk(27) }, #if defined(AARCH64) { "NearCpool", JDK_Version::undefined(), JDK_Version::jdk(25), JDK_Version::undefined() }, #endif From bd7315648f2bb18cba9cfbeca00e6132b8eb95ef Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Fri, 17 Oct 2025 00:36:54 +0000 Subject: [PATCH 172/561] 8369856: AOT map does not include unregistered classes Co-authored-by: Ashutosh Mehra Reviewed-by: kvn, matsaave --- .../classfile/systemDictionaryShared.cpp | 4 + .../{CDSMapReader.java => AOTMapReader.java} | 77 +++++++++++++++++-- .../cds/{CDSMapTest.java => AOTMapTest.java} | 12 +-- .../cds/appcds/aotCache/AOTMapTest.java | 55 +++++++++---- 4 files changed, 120 insertions(+), 28 deletions(-) rename test/hotspot/jtreg/runtime/cds/{CDSMapReader.java => AOTMapReader.java} (81%) rename test/hotspot/jtreg/runtime/cds/{CDSMapTest.java => AOTMapTest.java} (92%) diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index b092e71f4e7..2d31a7c49f6 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -1420,6 +1420,10 @@ void SystemDictionaryShared::get_all_archived_classes(bool is_static_archive, Gr get_archive(is_static_archive)->_builtin_dictionary.iterate([&] (const RunTimeClassInfo* record) { classes->append(record->klass()); }); + + get_archive(is_static_archive)->_unregistered_dictionary.iterate([&] (const RunTimeClassInfo* record) { + classes->append(record->klass()); + }); } class SharedDictionaryPrinter : StackObj { diff --git a/test/hotspot/jtreg/runtime/cds/CDSMapReader.java b/test/hotspot/jtreg/runtime/cds/AOTMapReader.java similarity index 81% rename from test/hotspot/jtreg/runtime/cds/CDSMapReader.java rename to test/hotspot/jtreg/runtime/cds/AOTMapReader.java index f25455b2f03..e407d4e2ecc 100644 --- a/test/hotspot/jtreg/runtime/cds/CDSMapReader.java +++ b/test/hotspot/jtreg/runtime/cds/AOTMapReader.java @@ -26,6 +26,7 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -33,7 +34,7 @@ import java.util.regex.Pattern; This is a simple parser for parsing the output of - java -Xshare:dump -Xlog:aot+map=debug,aot+map+oops=trace:file=cds.map:none:filesize=0 + java -Xshare:dump -Xlog:aot+map=debug,aot+map+oops=trace:file=aot.map:none:filesize=0 The map file contains patterns like this for the heap objects: @@ -59,8 +60,9 @@ more analysis on the HeapObjects. */ -public class CDSMapReader { +public class AOTMapReader { public static class MapFile { + HashSet classes = new HashSet<>(); ArrayList heapObjects = new ArrayList<>(); HashMap oopToObject = new HashMap<>(); HashMap narrowOopToObject = new HashMap<>(); @@ -80,6 +82,20 @@ public class CDSMapReader { public int heapObjectCount() { return heapObjects.size(); } + + void addClass(String className) { + classes.add(className); + } + + public boolean hasClass(String className) { + return classes.contains(className); + } + + public void shouldHaveClass(String className) { + if (!hasClass(className)) { + throw new RuntimeException("AOT map file is missing class " + className); + } + } } public static class HeapAddress { @@ -140,13 +156,17 @@ public class CDSMapReader { this.name = name; this.offset = Integer.parseInt(offset); this.referentAddress = new HeapAddress(oopStr, narrowOopStr); - this.lineCount = CDSMapReader.lineCount; + this.lineCount = AOTMapReader.lineCount; } } // 0x00000007ffc00000: 4a5b8701 00000063 00010290 00000000 00010100 fff80003 static Pattern rawDataPattern = Pattern.compile("^0x([0-9a-f]+): *( [0-9a-f]+)+ *$"); + // ------------------------------------------------------------------------------- + // Patterns for heap objects + // ------------------------------------------------------------------------------- + // (one address) // 0x00000007ffc00000: @@ Object java.lang.String static Pattern objPattern1 = Pattern.compile("^0x([0-9a-f]+): @@ Object ([^ ]*)"); @@ -179,6 +199,15 @@ public class CDSMapReader { // - injected 'module_entry' 'J' @16 0 (0x0000000000000000) static Pattern moduleEntryPattern = Pattern.compile("- injected 'module_entry' 'J' @[0-9]+[ ]+([0-9]+)"); + // ------------------------------------------------------------------------------- + // Patterns for metaspace objects + // ------------------------------------------------------------------------------- + + // 0x00000008000d1698: @@ Class 512 [Ljdk.internal.vm.FillerElement; + // 0x00000008000d18a0: @@ Class 520 java.lang.Cloneable + static Pattern classPattern = Pattern.compile("^0x([0-9a-f]+): @@ Class [ ]*([0-9]+) (.*)"); + + private static Matcher match(String line, Pattern pattern) { Matcher m = pattern.matcher(line); if (m.find()) { @@ -253,6 +282,11 @@ public class CDSMapReader { } } + private static void parseClassObject(String className, String addr, String size) throws IOException { + mapFile.addClass(className); + nextLine(); + } + static MapFile mapFile; static BufferedReader reader; static String line = null; // current line being parsed @@ -277,6 +311,8 @@ public class CDSMapReader { parseHeapObject(m.group(3), m.group(1), m.group(2)); } else if ((m = match(line, objPattern1)) != null) { parseHeapObject(m.group(2), m.group(1), null); + } else if ((m = match(line, classPattern)) != null) { + parseClassObject(m.group(3), m.group(1), m.group(2)); // name, addr, size } else { nextLine(); } @@ -303,8 +339,15 @@ public class CDSMapReader { } } + public static void validate(MapFile mapFile, String classLoadLogFile) throws IOException { + validateOops(mapFile); + if (classLoadLogFile != null) { + validateClasses(mapFile, classLoadLogFile); + } + } + // Check that each oop fields in the HeapObjects must point to a valid HeapObject. - public static void validate(MapFile mapFile) { + static void validateOops(MapFile mapFile) { int count1 = 0; int count2 = 0; for (HeapObject heapObject : mapFile.heapObjects) { @@ -333,10 +376,10 @@ public class CDSMapReader { if (mapFile.heapObjectCount() > 0) { // heapObjectCount() may be zero if the selected GC doesn't support heap object archiving. if (mapFile.stringCount <= 0) { - throw new RuntimeException("CDS map file should contain at least one string"); + throw new RuntimeException("AOT map file should contain at least one string"); } if (count1 < mapFile.stringCount) { - throw new RuntimeException("CDS map file seems incorrect: " + mapFile.heapObjectCount() + + throw new RuntimeException("AOT map file seems incorrect: " + mapFile.heapObjectCount() + " objects (" + mapFile.stringCount + " strings). Each string should" + " have one non-null oop field but we found only " + count1 + " non-null oop field references"); @@ -344,8 +387,26 @@ public class CDSMapReader { } } - public static void main(String args[]) { + // classLoadLogFile should be generated with -Xlog:class+load:file=:none:filesize=0 + // Check that every class loaded from "source: shared objects file" have an entry inside the mapFile. + static void validateClasses(MapFile mapFile, String classLoadLogFile) throws IOException { + try (BufferedReader r = new BufferedReader(new FileReader(classLoadLogFile))) { + String line; + String suffix = " source: shared objects file"; + int suffixLen = suffix.length(); + while ((line = r.readLine()) != null) { + if (line.endsWith(suffix)) { + String className = line.substring(0, line.length() - suffixLen); + if (!mapFile.hasClass(className)) { + throw new RuntimeException("AOT map file is missing class " + className); + } + } + } + } + } + + public static void main(String args[]) throws IOException { MapFile mapFile = read(args[0]); - validate(mapFile); + validate(mapFile, null); } } diff --git a/test/hotspot/jtreg/runtime/cds/CDSMapTest.java b/test/hotspot/jtreg/runtime/cds/AOTMapTest.java similarity index 92% rename from test/hotspot/jtreg/runtime/cds/CDSMapTest.java rename to test/hotspot/jtreg/runtime/cds/AOTMapTest.java index 5a9fa82552b..dff98090859 100644 --- a/test/hotspot/jtreg/runtime/cds/CDSMapTest.java +++ b/test/hotspot/jtreg/runtime/cds/AOTMapTest.java @@ -27,7 +27,7 @@ * @summary Test the contents of -Xlog:aot+map * @requires vm.cds * @library /test/lib - * @run driver/timeout=240 CDSMapTest + * @run driver/timeout=240 AOTMapTest */ import jdk.test.lib.cds.CDSOptions; @@ -37,7 +37,7 @@ import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; import java.util.ArrayList; -public class CDSMapTest { +public class AOTMapTest { public static void main(String[] args) throws Exception { doTest(false); @@ -79,8 +79,8 @@ public class CDSMapTest { .addSuffix(args); CDSTestUtils.createArchiveAndCheck(opts); - CDSMapReader.MapFile mapFile = CDSMapReader.read(mapName); - CDSMapReader.validate(mapFile); + AOTMapReader.MapFile mapFile = AOTMapReader.read(mapName); + AOTMapReader.validate(mapFile, null); return archiveName; } @@ -98,7 +98,7 @@ public class CDSMapTest { OutputAnalyzer out = CDSTestUtils.executeAndLog(pb, "exec"); out.shouldHaveExitValue(0); - CDSMapReader.MapFile mapFile = CDSMapReader.read(mapName); - CDSMapReader.validate(mapFile); + AOTMapReader.MapFile mapFile = AOTMapReader.read(mapName); + AOTMapReader.validate(mapFile, null); } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/AOTMapTest.java b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/AOTMapTest.java index bcd2c71fea0..6cbfcbbd3c3 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/AOTMapTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/AOTMapTest.java @@ -26,9 +26,10 @@ * @bug 8362566 * @summary Test the contents of -Xlog:aot+map with AOT workflow * @requires vm.cds.supports.aot.class.linking - * @library /test/lib /test/hotspot/jtreg/runtime/cds - * @build AOTMapTest + * @library /test/lib /test/hotspot/jtreg/runtime/cds /test/hotspot/jtreg/runtime/cds/appcds/test-classes + * @build AOTMapTest Hello * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar AOTMapTestApp + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar cust.jar Hello * @run driver/timeout=240 AOTMapTest AOT --two-step-training */ @@ -37,15 +38,18 @@ * @bug 8362566 * @summary Test the contents of -Xlog:aot+map with dynamic CDS archive * @requires vm.cds.supports.aot.class.linking - * @library /test/lib /test/hotspot/jtreg/runtime/cds + * @library /test/lib /test/hotspot/jtreg/runtime/cds /test/hotspot/jtreg/runtime/cds/appcds/test-classes * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @build AOTMapTest + * @build AOTMapTest Hello * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar AOTMapTestApp + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar cust.jar Hello * @run main/othervm/timeout=240 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. AOTMapTest DYNAMIC */ - +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import jdk.test.lib.cds.CDSAppTester; import jdk.test.lib.helpers.ClassFileInstaller; @@ -54,6 +58,7 @@ import jdk.test.lib.Platform; public class AOTMapTest { static final String appJar = ClassFileInstaller.getJarPath("app.jar"); static final String mainClass = "AOTMapTestApp"; + static final String classLoadLogFile = "production.class.load.log"; public static void main(String[] args) throws Exception { doTest(args); @@ -63,13 +68,25 @@ public class AOTMapTest { Tester tester = new Tester(); tester.run(args); - validate(tester.dumpMapFile); - validate(tester.runMapFile); + if (tester.isDynamicWorkflow()) { + // For dynamic workflow, the AOT map file doesn't include classes in the base archive, so + // AOTMapReader.validateClasses() will fail. + validate(tester.dumpMapFile, false); + } else { + validate(tester.dumpMapFile, true); + } + validate(tester.runMapFile, true); } - static void validate(String mapFileName) { - CDSMapReader.MapFile mapFile = CDSMapReader.read(mapFileName); - CDSMapReader.validate(mapFile); + static void validate(String mapFileName, boolean checkClases) throws Exception { + AOTMapReader.MapFile mapFile = AOTMapReader.read(mapFileName); + if (checkClases) { + AOTMapReader.validate(mapFile, classLoadLogFile); + } else { + AOTMapReader.validate(mapFile, null); + } + mapFile.shouldHaveClass("AOTMapTestApp"); // built-in class + mapFile.shouldHaveClass("Hello"); // unregistered class } static class Tester extends CDSAppTester { @@ -97,12 +114,13 @@ public class AOTMapTest { // filesize=0 ensures that a large map file not broken up in multiple files. String logMapPrefix = "-Xlog:aot+map=debug,aot+map+oops=trace:file="; - String logMapSuffix = ":none:filesize=0"; + String logSuffix = ":none:filesize=0"; if (runMode == RunMode.ASSEMBLY || runMode == RunMode.DUMP_DYNAMIC) { - vmArgs.add(logMapPrefix + dumpMapFile + logMapSuffix); + vmArgs.add(logMapPrefix + dumpMapFile + logSuffix); } else if (runMode == RunMode.PRODUCTION) { - vmArgs.add(logMapPrefix + runMapFile + logMapSuffix); + vmArgs.add(logMapPrefix + runMapFile + logSuffix); + vmArgs.add("-Xlog:class+load:file=" + classLoadLogFile + logSuffix); } return vmArgs.toArray(new String[vmArgs.size()]); @@ -118,7 +136,16 @@ public class AOTMapTest { } class AOTMapTestApp { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { System.out.println("Hello AOTMapTestApp"); + testCustomLoader(); + } + + static void testCustomLoader() throws Exception { + File custJar = new File("cust.jar"); + URL[] urls = new URL[] {custJar.toURI().toURL()}; + URLClassLoader loader = new URLClassLoader(urls, AOTMapTestApp.class.getClassLoader()); + Class c = loader.loadClass("Hello"); + System.out.println(c); } } From 55787fe5f52544ea902cac35f1f552e26d954167 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Fri, 17 Oct 2025 01:31:39 +0000 Subject: [PATCH 173/561] 8342401: [TESTBUG] javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java test fails in ubuntu 22.04 on SBR Hosts Reviewed-by: honkar, serb --- .../8223788/JSpinnerButtonFocusTest.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/test/jdk/javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java b/test/jdk/javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java index 4060042ca4f..994a03959b2 100644 --- a/test/jdk/javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java +++ b/test/jdk/javax/swing/JSpinner/8223788/JSpinnerButtonFocusTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -63,7 +63,7 @@ public class JSpinnerButtonFocusTest { robot.setAutoDelay(50); SwingUtilities.invokeAndWait(() -> { - frame = new JFrame(); + frame = new JFrame("JSpinnerButtonFocusTest"); spinner1 = new JSpinner(); spinner2 = new JSpinner(); @@ -72,6 +72,15 @@ public class JSpinnerButtonFocusTest { frame.getContentPane().add(spinner2, BorderLayout.SOUTH); editor1 = ((DefaultEditor)spinner1.getEditor()); + editor1.getTextField().addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + super.focusGained(e); + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + latch1.countDown(); + } + }); editor1.setFocusable(false); spinner1.setFocusable(false); @@ -84,26 +93,18 @@ public class JSpinnerButtonFocusTest { frame.setFocusTraversalPolicyProvider(true); frame.setAlwaysOnTop(true); - frame.pack(); + frame.setSize(100, 100); + frame.setLocationRelativeTo(null); frame.setVisible(true); }); robot.waitForIdle(); - - editor1.getTextField().addFocusListener(new FocusAdapter() { - @Override - public void focusGained(FocusEvent e) { - super.focusGained(e); - robot.keyPress(KeyEvent.VK_TAB); - robot.keyRelease(KeyEvent.VK_TAB); - latch1.countDown(); - } - }); + robot.delay(1000); SwingUtilities.invokeAndWait(() -> { editor1.getTextField().requestFocusInWindow(); }); - if (!latch1.await(15, TimeUnit.MINUTES)) { + if (!latch1.await(1, TimeUnit.MINUTES)) { throw new RuntimeException(LF.getClassName() + ": Timeout waiting for editor1 to gain focus."); } From 31beb7d3b34c3516c326c9d29a267f6becb38805 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Fri, 17 Oct 2025 01:33:30 +0000 Subject: [PATCH 174/561] 8068310: [TEST_BUG] Test javax/swing/JColorChooser/Test4234761.java fails with GTKL&F Reviewed-by: serb --- .../jdk/javax/swing/JColorChooser/Test4234761.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/jdk/javax/swing/JColorChooser/Test4234761.java b/test/jdk/javax/swing/JColorChooser/Test4234761.java index c2b2d9ed7b9..fb55ca37feb 100644 --- a/test/jdk/javax/swing/JColorChooser/Test4234761.java +++ b/test/jdk/javax/swing/JColorChooser/Test4234761.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -23,10 +23,12 @@ /* * @test - * @key headful * @bug 4234761 + * @key headful * @summary RGB values sholdn't be changed in transition to HSB tab - * @author Oleg Mokhovikov + * @library /test/lib + * @build jtreg.SkippedException + * @run main Test4234761 */ import java.awt.Color; @@ -35,11 +37,17 @@ import java.beans.PropertyChangeListener; import javax.swing.JColorChooser; import javax.swing.JDialog; import javax.swing.JTabbedPane; +import javax.swing.UIManager; + +import jtreg.SkippedException; public class Test4234761 implements PropertyChangeListener { private static final Color COLOR = new Color(51, 51, 51); public static void main(String[] args) { + if (UIManager.getLookAndFeel().getName().contains("GTK")) { + throw new SkippedException("Test skipped for GTK"); + } JColorChooser chooser = new JColorChooser(COLOR); JDialog dialog = Test4177735.show(chooser); From 46c23bb1a252916096876c2ae3a72f4a525dd6f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Bourg=C3=A8s?= Date: Fri, 17 Oct 2025 05:43:10 +0000 Subject: [PATCH 175/561] 8341381: Random lines appear in graphic causing by the fix of JDK-8297230 Reviewed-by: prr --- .../classes/sun/java2d/marlin/Curve.java | 53 +- .../java2d/marlin/DMarlinRenderingEngine.java | 2 +- .../classes/sun/java2d/marlin/Helpers.java | 23 +- .../classes/sun/java2d/marlin/Stroker.java | 14 +- test/jdk/sun/java2d/marlin/Bug8341381.java | 601 ++++++++++++++++++ 5 files changed, 656 insertions(+), 37 deletions(-) create mode 100644 test/jdk/sun/java2d/marlin/Bug8341381.java diff --git a/src/java.desktop/share/classes/sun/java2d/marlin/Curve.java b/src/java.desktop/share/classes/sun/java2d/marlin/Curve.java index 2ce0cd4672c..9d2c8dc2a72 100644 --- a/src/java.desktop/share/classes/sun/java2d/marlin/Curve.java +++ b/src/java.desktop/share/classes/sun/java2d/marlin/Curve.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -144,7 +144,9 @@ final class Curve { // finds points where the first and second derivative are // perpendicular. This happens when g(t) = f'(t)*f''(t) == 0 (where // * is a dot product). Unfortunately, we have to solve a cubic. - private int perpendiculardfddf(final double[] pts, final int off) { + private int perpendiculardfddf(final double[] pts, final int off, + final double A, final double B) + { assert pts.length >= off + 4; // these are the coefficients of some multiple of g(t) (not g(t), @@ -155,7 +157,7 @@ final class Curve { final double c = 2.0d * (dax * cx + day * cy) + dbx * dbx + dby * dby; final double d = dbx * cx + dby * cy; - return Helpers.cubicRootsInAB(a, b, c, d, pts, off, 0.0d, 1.0d); + return Helpers.cubicRootsInAB(a, b, c, d, pts, off, A, B); } // Tries to find the roots of the function ROC(t)-w in [0, 1). It uses @@ -171,35 +173,43 @@ final class Curve { // at most 4 sub-intervals of (0,1). ROC has asymptotes at inflection // points, so roc-w can have at least 6 roots. This shouldn't be a // problem for what we're trying to do (draw a nice looking curve). - int rootsOfROCMinusW(final double[] roots, final int off, final double w2, final double err) { + int rootsOfROCMinusW(final double[] roots, final int off, final double w2, + final double A, final double B) + { // no OOB exception, because by now off<=6, and roots.length >= 10 assert off <= 6 && roots.length >= 10; int ret = off; - final int end = off + perpendiculardfddf(roots, off); + final int end = off + perpendiculardfddf(roots, off, A, B); + Helpers.isort(roots, off, end); roots[end] = 1.0d; // always check interval end points - double t0 = 0.0d, ft0 = ROCsq(t0) - w2; + double t0 = 0.0d; + double ft0 = eliminateInf(ROCsq(t0) - w2); + double t1, ft1; for (int i = off; i <= end; i++) { - double t1 = roots[i], ft1 = ROCsq(t1) - w2; + t1 = roots[i]; + ft1 = eliminateInf(ROCsq(t1) - w2); if (ft0 == 0.0d) { roots[ret++] = t0; } else if (ft1 * ft0 < 0.0d) { // have opposite signs // (ROC(t)^2 == w^2) == (ROC(t) == w) is true because // ROC(t) >= 0 for all t. - roots[ret++] = falsePositionROCsqMinusX(t0, t1, w2, err); + roots[ret++] = falsePositionROCsqMinusX(t0, t1, ft0, ft1, w2, A); // A = err } t0 = t1; ft0 = ft1; } - return ret - off; } - private static double eliminateInf(final double x) { - return (x == Double.POSITIVE_INFINITY ? Double.MAX_VALUE : - (x == Double.NEGATIVE_INFINITY ? Double.MIN_VALUE : x)); + private final static double MAX_ROC_SQ = 1e20; + + private static double eliminateInf(final double x2) { + // limit the value of x to avoid numerical problems (smaller step): + // must handle NaN and +Infinity: + return (x2 <= MAX_ROC_SQ) ? x2 : MAX_ROC_SQ; } // A slight modification of the false position algorithm on wikipedia. @@ -210,17 +220,18 @@ final class Curve { // and turn out. Same goes for the newton's method // algorithm in Helpers.java private double falsePositionROCsqMinusX(final double t0, final double t1, + final double ft0, final double ft1, final double w2, final double err) { final int iterLimit = 100; int side = 0; - double t = t1, ft = eliminateInf(ROCsq(t) - w2); - double s = t0, fs = eliminateInf(ROCsq(s) - w2); + double s = t0, fs = eliminateInf(ft0); + double t = t1, ft = eliminateInf(ft1); double r = s, fr; - for (int i = 0; i < iterLimit && Math.abs(t - s) > err * Math.abs(t + s); i++) { + for (int i = 0; i < iterLimit && Math.abs(t - s) > err; i++) { r = (fs * t - ft * s) / (fs - ft); - fr = ROCsq(r) - w2; + fr = eliminateInf(ROCsq(r) - w2); if (sameSign(fr, ft)) { ft = fr; t = r; if (side < 0) { @@ -241,7 +252,7 @@ final class Curve { break; } } - return r; + return (Math.abs(ft) <= Math.abs(fs)) ? t : s; } private static boolean sameSign(final double x, final double y) { @@ -256,9 +267,9 @@ final class Curve { final double dy = t * (t * day + dby) + cy; final double ddx = 2.0d * dax * t + dbx; final double ddy = 2.0d * day * t + dby; - final double dx2dy2 = dx * dx + dy * dy; - final double ddx2ddy2 = ddx * ddx + ddy * ddy; - final double ddxdxddydy = ddx * dx + ddy * dy; - return dx2dy2 * ((dx2dy2 * dx2dy2) / (dx2dy2 * ddx2ddy2 - ddxdxddydy * ddxdxddydy)); + final double dx2dy2 = dx * dx + dy * dy; // positive + final double dxddyddxdy = dx * ddy - dy * ddx; + // may return +Infinity if dxddyddxdy = 0 or NaN if 0/0: + return (dx2dy2 * dx2dy2 * dx2dy2) / (dxddyddxdy * dxddyddxdy); // both positive } } diff --git a/src/java.desktop/share/classes/sun/java2d/marlin/DMarlinRenderingEngine.java b/src/java.desktop/share/classes/sun/java2d/marlin/DMarlinRenderingEngine.java index 66eb9334e86..f829872a8a8 100644 --- a/src/java.desktop/share/classes/sun/java2d/marlin/DMarlinRenderingEngine.java +++ b/src/java.desktop/share/classes/sun/java2d/marlin/DMarlinRenderingEngine.java @@ -564,7 +564,7 @@ public final class DMarlinRenderingEngine extends RenderingEngine } private static boolean nearZero(final double num) { - return Math.abs(num) < 2.0d * Math.ulp(num); + return Math.abs(num) < 2.0d * Helpers.ulp(num); } abstract static class NormalizingPathIterator implements PathIterator { diff --git a/src/java.desktop/share/classes/sun/java2d/marlin/Helpers.java b/src/java.desktop/share/classes/sun/java2d/marlin/Helpers.java index 0aed05ab506..926533cdb2b 100644 --- a/src/java.desktop/share/classes/sun/java2d/marlin/Helpers.java +++ b/src/java.desktop/share/classes/sun/java2d/marlin/Helpers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -31,12 +31,19 @@ import sun.java2d.marlin.stats.StatLong; final class Helpers implements MarlinConst { + private final static double T_ERR = 1e-4; + private final static double T_A = T_ERR; + private final static double T_B = 1.0 - T_ERR; + private static final double EPS = 1e-9d; private Helpers() { throw new Error("This is a non instantiable class"); } + /** use lower precision like former Pisces and Marlin (float-precision) */ + static double ulp(final double value) { return Math.ulp((float)value); } + static boolean within(final double x, final double y) { return within(x, y, EPS); } @@ -322,10 +329,10 @@ final class Helpers implements MarlinConst { // now we must subdivide at points where one of the offset curves will have // a cusp. This happens at ts where the radius of curvature is equal to w. - ret += c.rootsOfROCMinusW(ts, ret, w2, 0.0001d); + ret += c.rootsOfROCMinusW(ts, ret, w2, T_A, T_B); - ret = filterOutNotInAB(ts, 0, ret, 0.0001d, 0.9999d); - isort(ts, ret); + ret = filterOutNotInAB(ts, 0, ret, T_A, T_B); + isort(ts, 0, ret); return ret; } @@ -354,7 +361,7 @@ final class Helpers implements MarlinConst { if ((outCodeOR & OUTCODE_BOTTOM) != 0) { ret += curve.yPoints(ts, ret, clipRect[1]); } - isort(ts, ret); + isort(ts, 0, ret); return ret; } @@ -374,11 +381,11 @@ final class Helpers implements MarlinConst { } } - static void isort(final double[] a, final int len) { - for (int i = 1, j; i < len; i++) { + static void isort(final double[] a, final int off, final int len) { + for (int i = off + 1, j; i < len; i++) { final double ai = a[i]; j = i - 1; - for (; j >= 0 && a[j] > ai; j--) { + for (; j >= off && a[j] > ai; j--) { a[j + 1] = a[j]; } a[j + 1] = ai; diff --git a/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java b/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java index 59f93ed7d6d..1c257bc13d9 100644 --- a/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java +++ b/src/java.desktop/share/classes/sun/java2d/marlin/Stroker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -886,8 +886,8 @@ final class Stroker implements StartFlagPathConsumer2D, MarlinConst { // if p1 == p2 && p3 == p4: draw line from p1->p4, unless p1 == p4, // in which case ignore if p1 == p2 - final boolean p1eqp2 = Helpers.withinD(dx1, dy1, 6.0d * Math.ulp(y2)); - final boolean p3eqp4 = Helpers.withinD(dx4, dy4, 6.0d * Math.ulp(y4)); + final boolean p1eqp2 = Helpers.withinD(dx1, dy1, 6.0d * Helpers.ulp(y2)); + final boolean p3eqp4 = Helpers.withinD(dx4, dy4, 6.0d * Helpers.ulp(y4)); if (p1eqp2 && p3eqp4) { return getLineOffsets(x1, y1, x4, y4, leftOff, rightOff); @@ -905,7 +905,7 @@ final class Stroker implements StartFlagPathConsumer2D, MarlinConst { final double l1sq = dx1 * dx1 + dy1 * dy1; final double l4sq = dx4 * dx4 + dy4 * dy4; - if (Helpers.within(dotsq, l1sq * l4sq, 4.0d * Math.ulp(dotsq))) { + if (Helpers.within(dotsq, l1sq * l4sq, 4.0d * Helpers.ulp(dotsq))) { return getLineOffsets(x1, y1, x4, y4, leftOff, rightOff); } @@ -1078,8 +1078,8 @@ final class Stroker implements StartFlagPathConsumer2D, MarlinConst { // equal if they're very close to each other. // if p1 == p2 or p2 == p3: draw line from p1->p3 - final boolean p1eqp2 = Helpers.withinD(dx12, dy12, 6.0d * Math.ulp(y2)); - final boolean p2eqp3 = Helpers.withinD(dx23, dy23, 6.0d * Math.ulp(y3)); + final boolean p1eqp2 = Helpers.withinD(dx12, dy12, 6.0d * Helpers.ulp(y2)); + final boolean p2eqp3 = Helpers.withinD(dx23, dy23, 6.0d * Helpers.ulp(y3)); if (p1eqp2 || p2eqp3) { return getLineOffsets(x1, y1, x3, y3, leftOff, rightOff); @@ -1091,7 +1091,7 @@ final class Stroker implements StartFlagPathConsumer2D, MarlinConst { final double l1sq = dx12 * dx12 + dy12 * dy12; final double l3sq = dx23 * dx23 + dy23 * dy23; - if (Helpers.within(dotsq, l1sq * l3sq, 4.0d * Math.ulp(dotsq))) { + if (Helpers.within(dotsq, l1sq * l3sq, 4.0d * Helpers.ulp(dotsq))) { return getLineOffsets(x1, y1, x3, y3, leftOff, rightOff); } diff --git a/test/jdk/sun/java2d/marlin/Bug8341381.java b/test/jdk/sun/java2d/marlin/Bug8341381.java new file mode 100644 index 00000000000..b469ac49313 --- /dev/null +++ b/test/jdk/sun/java2d/marlin/Bug8341381.java @@ -0,0 +1,601 @@ +/* + * 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. + * + * 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. + */ + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Stroke; +import java.awt.geom.AffineTransform; +import java.awt.geom.CubicCurve2D; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Handler; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.Timer; + +import static java.lang.System.out; + +/** + * @test + * @bug 8341381 + * @summary fix cubic offsetting issue (numerical accuracy) + * @run main/othervm/timeout=20 Bug8341381 + * @modules java.desktop/sun.java2d.marlin + */ +public final class Bug8341381 { + + static final boolean SHOW_GUI = false; + + static final boolean CHECK_PIXELS = true; + static final boolean TRACE_ALL = false; + static final boolean TRACE_CHECK_PIXELS = false; + + static final boolean SAVE_IMAGE = false; + + static final boolean INTENSIVE = false; + + static final double DPI = 96; + static final float STROKE_WIDTH = 15f; + + // delay is 1 frame at 60hz + static final int DELAY = 16; + // off-screen test step (1.0 by default) + static final double STEP = (INTENSIVE) ? 1.0 / 117 : 1.0; + + // stats: + static int N_TEST = 0; + static int N_FAIL = 0; + + static final AtomicBoolean isMarlin = new AtomicBoolean(); + static final CountDownLatch latch = new CountDownLatch(1); + + public static void main(final String[] args) { + Locale.setDefault(Locale.US); + + // FIRST: Get Marlin runtime state from its log: + + // initialize j.u.l Logger: + final Logger log = Logger.getLogger("sun.java2d.marlin"); + log.addHandler(new Handler() { + @Override + public void publish(LogRecord record) { + final String msg = record.getMessage(); + if (msg != null) { + // last space to avoid matching other settings: + if (msg.startsWith("sun.java2d.renderer ")) { + isMarlin.set(msg.contains("DMarlinRenderingEngine")); + } + } + + final Throwable th = record.getThrown(); + // detect any Throwable: + if (th != null) { + out.println("Test failed:\n" + record.getMessage()); + th.printStackTrace(out); + throw new RuntimeException("Test failed: ", th); + } + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + }); + + out.println("Bug8341381: start"); + final long startTime = System.currentTimeMillis(); + + // enable Marlin logging & internal checks: + System.setProperty("sun.java2d.renderer.log", "true"); + System.setProperty("sun.java2d.renderer.useLogger", "true"); + + try { + startTest(); + + out.println("WAITING ..."); + latch.await(15, TimeUnit.SECONDS); // 2s typically + + if (isMarlin.get()) { + out.println("Marlin renderer used at runtime."); + } else { + throw new RuntimeException("Marlin renderer NOT used at runtime !"); + } + + // show test report: + out.println("TESTS: " + N_TEST + " FAILS: " + N_FAIL); + + if (N_FAIL > 0) { + throw new RuntimeException("Bug8341381: " + N_FAIL + " / " + N_TEST + " test(s) failed !"); + } + + } catch (InterruptedException ie) { + throw new RuntimeException(ie); + } catch (InvocationTargetException ite) { + throw new RuntimeException(ite); + } finally { + final double elapsed = (System.currentTimeMillis() - startTime) / 1000.0; + out.println("Bug8341381: end (" + elapsed + " s)"); + } + } + + private static void startTest() throws InterruptedException, InvocationTargetException { + if (SHOW_GUI) { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + final JFrame viewer = new JFrame(); + viewer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + viewer.setContentPane(new CanvasPanel(viewer)); + viewer.pack(); + viewer.setVisible(true); + } + }); + return; + } else { + out.println("STEP: " + STEP); + new Thread(new Runnable() { + @Override + public void run() { + final Context ctx = new Context(); + final Dimension initialDim = ctx.bugDisplay.getSize(DPI); + + double w = initialDim.width; + double h = initialDim.height; + do { + ctx.shouldScale(w, h); + ctx.paintImage(); + + // resize component: + w -= STEP; + h -= STEP; + + } while (ctx.iterate()); + } + }).start(); + } + } + + static final class Context { + + final BugDisplay bugDisplay = new BugDisplay(); + double width = 0.0, height = 0.0; + + BufferedImage bimg = null; + + boolean shouldScale(final double w, final double h) { + if ((w != width) || (h != height) || !bugDisplay.isScaled) { + width = w; + height = h; + bugDisplay.scale(width, height); + N_TEST++; + return true; + } + return false; + } + + void paintImage() { + final int w = bugDisplay.canvasWidth; + final int h = bugDisplay.canvasHeight; + + if ((bimg == null) || (w > bimg.getWidth()) || (h > bimg.getHeight())) { + bimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE); + } + final Graphics gi = bimg.getGraphics(); + try { + bugDisplay.paint(gi); + } finally { + gi.dispose(); + } + if (!bugDisplay.checkImage(bimg)) { + N_FAIL++; + } + } + + boolean iterate() { + if ((bugDisplay.canvasWidth > 10) || (bugDisplay.canvasHeight > 10)) { + // continue: + return true; + } + out.println("Stop"); + latch.countDown(); + return false; + } + } + + static final class CanvasPanel extends JPanel { + private static final long serialVersionUID = 1L; + + private final Context ctx = new Context(); + private boolean resized = false; + private Timer timer = null; + + public CanvasPanel(final JFrame frame) { + timer = new Timer(DELAY, e -> { + if (resized) { + resized = false; + + if (ctx.iterate()) { + // resize component: + setSize((int) Math.round(ctx.width - 1), (int) Math.round(ctx.height - 1)); + } else { + timer.stop(); + if (frame != null) { + frame.setVisible(false); + } + } + } + }); + timer.setCoalesce(true); + timer.setRepeats(true); + timer.start(); + } + + @Override + public void paint(final Graphics g) { + final Dimension dim = getSize(); + if (ctx.shouldScale(dim.width, dim.height)) { + this.resized = true; + } + super.paint(g); + + // paint on buffered image: + if (CHECK_PIXELS) { + final int w = ctx.bugDisplay.canvasWidth; + final int h = ctx.bugDisplay.canvasHeight; + if (this.resized) { + ctx.paintImage(); + } + g.drawImage(ctx.bimg.getSubimage(0, 0, w, h), 0, 0, null); + } else { + ctx.bugDisplay.paint(g); + } + } + + @Override + public Dimension getPreferredSize() { + return ctx.bugDisplay.getSize(DPI); + } + } + + static final class BugDisplay { + + boolean isScaled = false; + int canvasWidth; + int canvasHeight; + + private final static java.util.List curves1 = Arrays.asList( + new CubicCurve2D.Double(2191.0, 7621.0, 2191.0, 7619.0, 2191.0, 7618.0, 2191.0, 7617.0), + new CubicCurve2D.Double(2191.0, 7617.0, 2191.0, 7617.0, 2191.0, 7616.0, 2191.0, 7615.0), + new CubicCurve2D.Double(2198.0, 7602.0, 2200.0, 7599.0, 2203.0, 7595.0, 2205.0, 7590.0), + new CubicCurve2D.Double(2205.0, 7590.0, 2212.0, 7580.0, 2220.0, 7571.0, 2228.0, 7563.0), + new CubicCurve2D.Double(2228.0, 7563.0, 2233.0, 7557.0, 2239.0, 7551.0, 2245.0, 7546.0), + new CubicCurve2D.Double(2245.0, 7546.0, 2252.0, 7540.0, 2260.0, 7534.0, 2267.0, 7528.0), + new CubicCurve2D.Double(2267.0, 7528.0, 2271.0, 7526.0, 2275.0, 7524.0, 2279.0, 7521.0), + new CubicCurve2D.Double(2279.0, 7521.0, 2279.0, 7520.0, 2280.0, 7520.0, 2281.0, 7519.0) + ); + private final static java.util.List curves2 = Arrays.asList( + new CubicCurve2D.Double(2281.0, 7519.0, 2282.0, 7518.0, 2282.0, 7517.0, 2283.0, 7516.0), + new CubicCurve2D.Double(2283.0, 7516.0, 2284.0, 7515.0, 2284.0, 7515.0, 2285.0, 7514.0), + new CubicCurve2D.Double(2291.0, 7496.0, 2292.0, 7495.0, 2292.0, 7494.0, 2291.0, 7493.0), + new CubicCurve2D.Double(2291.0, 7493.0, 2290.0, 7492.0, 2290.0, 7492.0, 2289.0, 7492.0), + new CubicCurve2D.Double(2289.0, 7492.0, 2288.0, 7491.0, 2286.0, 7492.0, 2285.0, 7492.0), + new CubicCurve2D.Double(2262.0, 7496.0, 2260.0, 7497.0, 2259.0, 7497.0, 2257.0, 7498.0), + new CubicCurve2D.Double(2257.0, 7498.0, 2254.0, 7498.0, 2251.0, 7499.0, 2248.0, 7501.0), + new CubicCurve2D.Double(2248.0, 7501.0, 2247.0, 7501.0, 2245.0, 7502.0, 2244.0, 7503.0), + new CubicCurve2D.Double(2207.0, 7523.0, 2203.0, 7525.0, 2199.0, 7528.0, 2195.0, 7530.0), + new CubicCurve2D.Double(2195.0, 7530.0, 2191.0, 7534.0, 2186.0, 7538.0, 2182.0, 7541.0) + ); + private final static java.util.List curves3 = Arrays.asList( + new CubicCurve2D.Double(2182.0, 7541.0, 2178.0, 7544.0, 2174.0, 7547.0, 2170.0, 7551.0), + new CubicCurve2D.Double(2170.0, 7551.0, 2164.0, 7556.0, 2158.0, 7563.0, 2152.0, 7569.0), + new CubicCurve2D.Double(2152.0, 7569.0, 2148.0, 7573.0, 2145.0, 7577.0, 2141.0, 7582.0), + new CubicCurve2D.Double(2141.0, 7582.0, 2138.0, 7588.0, 2134.0, 7595.0, 2132.0, 7602.0), + new CubicCurve2D.Double(2132.0, 7602.0, 2132.0, 7605.0, 2131.0, 7608.0, 2131.0, 7617.0), + new CubicCurve2D.Double(2131.0, 7617.0, 2131.0, 7620.0, 2131.0, 7622.0, 2131.0, 7624.0), + new CubicCurve2D.Double(2131.0, 7624.0, 2131.0, 7630.0, 2132.0, 7636.0, 2135.0, 7641.0), + new CubicCurve2D.Double(2135.0, 7641.0, 2136.0, 7644.0, 2137.0, 7647.0, 2139.0, 7650.0), + new CubicCurve2D.Double(2139.0, 7650.0, 2143.0, 7658.0, 2149.0, 7664.0, 2155.0, 7670.0), + new CubicCurve2D.Double(2155.0, 7670.0, 2160.0, 7676.0, 2165.0, 7681.0, 2171.0, 7686.0) + ); + private final static java.util.List curves4 = Arrays.asList( + new CubicCurve2D.Double(2171.0, 7686.0, 2174.0, 7689.0, 2177.0, 7692.0, 2180.0, 7694.0), + new CubicCurve2D.Double(2180.0, 7694.0, 2185.0, 7698.0, 2191.0, 7702.0, 2196.0, 7706.0), + new CubicCurve2D.Double(2196.0, 7706.0, 2199.0, 7708.0, 2203.0, 7711.0, 2207.0, 7713.0), + new CubicCurve2D.Double(2244.0, 7734.0, 2245.0, 7734.0, 2247.0, 7735.0, 2248.0, 7736.0), + new CubicCurve2D.Double(2248.0, 7736.0, 2251.0, 7738.0, 2254.0, 7739.0, 2257.0, 7739.0), + new CubicCurve2D.Double(2257.0, 7739.0, 2259.0, 7739.0, 2260.0, 7739.0, 2262.0, 7740.0), + new CubicCurve2D.Double(2285.0, 7745.0, 2286.0, 7745.0, 2288.0, 7745.0, 2289.0, 7745.0), + new CubicCurve2D.Double(2289.0, 7745.0, 2290.0, 7745.0, 2290.0, 7744.0, 2291.0, 7743.0), + new CubicCurve2D.Double(2291.0, 7743.0, 2292.0, 7742.0, 2292.0, 7741.0, 2291.0, 7740.0), + new CubicCurve2D.Double(2285.0, 7722.0, 2284.0, 7721.0, 2284.0, 7721.0, 2283.0, 7720.0), + new CubicCurve2D.Double(2283.0, 7720.0, 2282.0, 7719.0, 2282.0, 7719.0, 2281.0, 7718.0), + new CubicCurve2D.Double(2281.0, 7718.0, 2280.0, 7717.0, 2279.0, 7716.0, 2279.0, 7716.0), + new CubicCurve2D.Double(2279.0, 7716.0, 2275.0, 7712.0, 2271.0, 7710.0, 2267.0, 7708.0), + new CubicCurve2D.Double(2267.0, 7708.0, 2260.0, 7702.0, 2252.0, 7697.0, 2245.0, 7691.0), + new CubicCurve2D.Double(2245.0, 7691.0, 2239.0, 7685.0, 2233.0, 7679.0, 2228.0, 7673.0), + new CubicCurve2D.Double(2228.0, 7673.0, 2220.0, 7665.0, 2212.0, 7656.0, 2205.0, 7646.0), + new CubicCurve2D.Double(2205.0, 7646.0, 2203.0, 7641.0, 2200.0, 7637.0, 2198.0, 7634.0) + ); + + private final static Point2D.Double[] extent = {new Point2D.Double(0.0, 0.0), new Point2D.Double(7777.0, 10005.0)}; + + private final static Stroke STROKE = new BasicStroke(STROKE_WIDTH); + private final static Stroke STROKE_DASHED = new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, + 10.0f, new float[] {100f, 0f}, 0.0f); + + // members: + private final java.util.List allCurves = new ArrayList<>(); + private final Rectangle2D bboxAllCurves = new Rectangle2D.Double(); + + BugDisplay() { + allCurves.addAll(curves1); + allCurves.addAll(curves2); + allCurves.addAll(curves3); + allCurves.addAll(curves4); + + // initialize bounding box: + double x1 = Double.POSITIVE_INFINITY; + double y1 = Double.POSITIVE_INFINITY; + double x2 = Double.NEGATIVE_INFINITY; + double y2 = Double.NEGATIVE_INFINITY; + + for (final CubicCurve2D c : allCurves) { + final Rectangle2D r = c.getBounds2D(); + if (r.getMinX() < x1) { + x1 = r.getMinX(); + } + if (r.getMinY() < y1) { + y1 = r.getMinY(); + } + if (r.getMaxX() > x2) { + x2 = r.getMaxX(); + } + if (r.getMaxY() > y2) { + y2 = r.getMaxY(); + } + } + // add margin of 10%: + final double m = 1.1 * STROKE_WIDTH; + bboxAllCurves.setFrameFromDiagonal(x1 - m, y1 - m, x2 + m, y2 + m); + } + + public void paint(final Graphics g) { + final Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, this.canvasWidth, this.canvasHeight); + + // ------ scale + final AffineTransform tx_orig = g2d.getTransform(); + final AffineTransform tx = getDrawTransform(); + g2d.transform(tx); + + // draw bbox: + if (!CHECK_PIXELS) { + g2d.setColor(Color.RED); + g2d.setStroke(STROKE); + g2d.draw(bboxAllCurves); + } + // draw curves: + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); + g2d.setColor(Color.BLACK); + + // dasher + stroker: + g2d.setStroke(STROKE_DASHED); + this.allCurves.forEach(g2d::draw); + + // reset + g2d.setTransform(tx_orig); + } + + private AffineTransform getDrawTransform() { + // ------ scale + double minX = extent[0].x, maxX = extent[1].x; + double minY = extent[0].y, maxY = extent[1].y; + + // we're scaling and respecting the proportions, check which scale to use + double sx = this.canvasWidth / Math.abs(maxX - minX); + double sy = this.canvasHeight / Math.abs(maxY - minY); + double s = Math.min(sx, sy); + + double m00, m11, m02, m12; + if (minX < maxX) { + m00 = s; + m02 = -s * minX; + } else { + // inverted X axis + m00 = -s; + m02 = this.canvasWidth + s * maxX; + } + if (minY < maxY) { + m11 = s; + m12 = -s * minY; + } else { + // inverted Y axis + m11 = -s; + m12 = this.canvasHeight + s * maxY; + } + + // scale to the available view port + AffineTransform scaleTransform = new AffineTransform(m00, 0, 0, m11, m02, m12); + + // invert the Y axis since (0, 0) is at top left for AWT + AffineTransform invertY = new AffineTransform(1, 0, 0, -1, 0, this.canvasHeight); + invertY.concatenate(scaleTransform); + + return invertY; + } + + public Dimension getSize(double dpi) { + double metricScalingFactor = 0.02539999969303608; + // 1 inch = 25,4 millimeter + final double factor = dpi * metricScalingFactor / 25.4; + + int width = (int) Math.ceil(Math.abs(extent[1].x - extent[0].x) * factor); + int height = (int) Math.ceil(Math.abs(extent[1].y - extent[0].y) * factor); + + return new Dimension(width, height); + } + + public void scale(double w, double h) { + double extentWidth = Math.abs(extent[1].x - extent[0].x); + double extentHeight = Math.abs(extent[1].y - extent[0].y); + + double fx = w / extentWidth; + if (fx * extentHeight > h) { + fx = h / extentHeight; + } + this.canvasWidth = (int) Math.round(fx * extentWidth); + this.canvasHeight = (int) Math.round(fx * extentHeight); + + // out.println("canvas scaled (" + canvasWidth + " x " + canvasHeight + ")"); + + this.isScaled = true; + } + + protected boolean checkImage(BufferedImage image) { + final AffineTransform tx = getDrawTransform(); + + final Point2D pMin = new Point2D.Double(bboxAllCurves.getMinX(), bboxAllCurves.getMinY()); + final Point2D pMax = new Point2D.Double(bboxAllCurves.getMaxX(), bboxAllCurves.getMaxY()); + + final Point2D tMin = tx.transform(pMin, null); + final Point2D tMax = tx.transform(pMax, null); + + int xMin = (int) tMin.getX(); + int xMax = (int) tMax.getX(); + if (xMin > xMax) { + int t = xMin; + xMin = xMax; + xMax = t; + } + + int yMin = (int) tMin.getY(); + int yMax = (int) tMax.getY(); + if (yMin > yMax) { + int t = yMin; + yMin = yMax; + yMax = t; + } + // add pixel margin (AA): + xMin -= 3; + xMax += 4; + yMin -= 3; + yMax += 4; + + if (xMin < 0 || xMax > image.getWidth() + || yMin < 0 || yMax > image.getHeight()) { + return true; + } + + // out.println("Checking rectangle: " + tMin + " to " + tMax); + // out.println("X min: " + xMin + " - max: " + xMax); + // out.println("Y min: " + yMin + " - max: " + yMax); + + final Raster raster = image.getData(); + final int expected = Color.WHITE.getRGB(); + int nBadPixels = 0; + + // horizontal lines: + for (int x = xMin; x <= xMax; x++) { + if (!checkPixel(raster, x, yMin, expected)) { + nBadPixels++; + } + if (!checkPixel(raster, x, yMax, expected)) { + nBadPixels++; + } + } + + // vertical lines: + for (int y = yMin; y <= yMax; y++) { + if (!checkPixel(raster, xMin, y, expected)) { + nBadPixels++; + } + if (!checkPixel(raster, xMax, y, expected)) { + nBadPixels++; + } + } + + if (nBadPixels != 0) { + out.println("(" + canvasWidth + " x " + canvasHeight + ") BAD pixels = " + nBadPixels); + + if (SAVE_IMAGE) { + try { + final File file = new File("Bug8341381-" + canvasWidth + "-" + canvasHeight + ".png"); + + out.println("Writing file: " + file.getAbsolutePath()); + ImageIO.write(image.getSubimage(0, 0, canvasWidth, canvasHeight), "PNG", file); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + return false; + } else if (TRACE_ALL) { + out.println("(" + canvasWidth + " x " + canvasHeight + ") OK"); + } + return true; + } + + private final static int[] TMP_RGB = new int[1]; + + private static boolean checkPixel(final Raster raster, + final int x, final int y, + final int expected) { + + final int[] rgb = (int[]) raster.getDataElements(x, y, TMP_RGB); + + if (rgb[0] != expected) { + if (TRACE_CHECK_PIXELS) { + out.println("bad pixel at (" + x + ", " + y + ") = " + rgb[0] + + " expected = " + expected); + } + return false; + } + return true; + } + } +} From a22438ddc5949fcfb6f773bd8dc080cd8a1f2710 Mon Sep 17 00:00:00 2001 From: Kevin Walls Date: Fri, 17 Oct 2025 08:16:59 +0000 Subject: [PATCH 176/561] 8369924: Remove test/jdk/javax/management/remote/mandatory/loading/MissingClassTest.java from problemlist Reviewed-by: sspitsyn --- test/jdk/ProblemList-Virtual.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt index 37c2c447efa..dcd4dbac310 100644 --- a/test/jdk/ProblemList-Virtual.txt +++ b/test/jdk/ProblemList-Virtual.txt @@ -30,8 +30,6 @@ com/sun/jdi/EATests.java#id0 8264699 generic- com/sun/jdi/ExceptionEvents.java 8278470 generic-all com/sun/jdi/RedefineCrossStart.java 8278470 generic-all -javax/management/remote/mandatory/loading/MissingClassTest.java 8145413 windows-x64 - java/lang/ScopedValue/StressStackOverflow.java#default 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#no-TieredCompilation 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#TieredStopAtLevel1 8309646 generic-all From 9b9559a2e33827126e1aeab7bf6f4861acaae109 Mon Sep 17 00:00:00 2001 From: David Briemann Date: Fri, 17 Oct 2025 08:59:55 +0000 Subject: [PATCH 177/561] 8369979: Flag UsePopCountInstruction was accidentally disabled on PPC64 Reviewed-by: aph, mdoerr --- src/hotspot/cpu/ppc/vm_version_ppc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.cpp b/src/hotspot/cpu/ppc/vm_version_ppc.cpp index e2dfd4ecec9..8b1de754650 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp @@ -99,6 +99,10 @@ void VM_Version::initialize() { FLAG_SET_ERGO(TrapBasedRangeChecks, false); } + if (FLAG_IS_DEFAULT(UsePopCountInstruction)) { + FLAG_SET_ERGO(UsePopCountInstruction, true); + } + if (PowerArchitecturePPC64 >= 9) { // Performance is good since Power9. if (FLAG_IS_DEFAULT(SuperwordUseVSX)) { From e62a7fa3832bbba11e6d630015f85ae945fac824 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Fri, 17 Oct 2025 09:02:09 +0000 Subject: [PATCH 178/561] 8342659: Test vmTestbase/nsk/jdi/ObjectReference/referringObjects/referringObjects002/referringObjects002.java failed: Class nsk.share.jdi.TestClass1 was not unloaded Co-authored-by: Chris Plummer Reviewed-by: sspitsyn, cjplummer --- .../vmTestbase/nsk/share/ClassUnloader.java | 51 ++++++------------- .../nsk/share/jpda/AbstractDebuggeeTest.java | 12 +---- 2 files changed, 17 insertions(+), 46 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/ClassUnloader.java b/test/hotspot/jtreg/vmTestbase/nsk/share/ClassUnloader.java index 5ea01fb3af4..e3b6693657c 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/ClassUnloader.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/ClassUnloader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -28,7 +28,7 @@ package nsk.share; -import java.lang.ref.Cleaner; +import java.lang.ref.PhantomReference; import java.util.*; import nsk.share.gc.gp.*; import nsk.share.test.ExecutionController; @@ -77,19 +77,9 @@ public class ClassUnloader { public static final String INTERNAL_CLASS_LOADER_NAME = "nsk.share.CustomClassLoader"; /** - * Whole amount of time in milliseconds to wait for class loader to be reclaimed. + * Phantom reference to the class loader. */ - private static final int WAIT_TIMEOUT = 15000; - - /** - * Sleep time in milliseconds for the loop waiting for the class loader to be reclaimed. - */ - private static final int WAIT_DELTA = 1000; - - /** - * Has class loader been reclaimed or not. - */ - volatile boolean is_reclaimed = false; + private PhantomReference customClassLoaderPhantomRef = null; /** * Current class loader used for loading classes. @@ -101,6 +91,14 @@ public class ClassUnloader { */ private Vector> classObjects = new Vector>(); + /** + * Has class loader been reclaimed or not. + */ + private boolean isClassLoaderReclaimed() { + return customClassLoaderPhantomRef != null + && customClassLoaderPhantomRef.refersTo(null); + } + /** * Class object of the first class been loaded with current class loader. * To get the rest loaded classes use getLoadedClass(int). @@ -138,8 +136,7 @@ public class ClassUnloader { customClassLoader = new CustomClassLoader(); classObjects.removeAllElements(); - // Register a Cleaner to inform us when the class loader has been reclaimed. - Cleaner.create().register(customClassLoader, () -> { is_reclaimed = true; } ); + customClassLoaderPhantomRef = new PhantomReference<>(customClassLoader, null); return customClassLoader; } @@ -154,8 +151,7 @@ public class ClassUnloader { this.customClassLoader = customClassLoader; classObjects.removeAllElements(); - // Register a Cleaner to inform us when the class loader has been reclaimed. - Cleaner.create().register(customClassLoader, () -> { is_reclaimed = true; } ); + customClassLoaderPhantomRef = new PhantomReference<>(customClassLoader, null); } /** @@ -244,32 +240,15 @@ public class ClassUnloader { */ public boolean unloadClass(ExecutionController stresser) { - is_reclaimed = false; - // free references to class and class loader to be able for collecting by GC - long waitTimeout = (customClassLoader == null) ? 0 : WAIT_TIMEOUT; classObjects.removeAllElements(); customClassLoader = null; // force class unloading by eating memory pool eatMemory(stresser); - // give GC chance to run and wait for receiving reclaim notification - long timeToFinish = System.currentTimeMillis() + waitTimeout; - while (!is_reclaimed && System.currentTimeMillis() < timeToFinish) { - if (!stresser.continueExecution()) { - return false; - } - try { - // suspend thread for a while - Thread.sleep(WAIT_DELTA); - } catch (InterruptedException e) { - throw new Failure("Unexpected InterruptedException while class unloading: " + e); - } - } - // force GC to unload marked class loader and its classes - if (is_reclaimed) { + if (isClassLoaderReclaimed()) { Runtime.getRuntime().gc(); return true; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java index 0668297d211..86d5d7ecd24 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -149,19 +149,11 @@ public class AbstractDebuggeeTest { } } - public static final int MAX_UNLOAD_ATTEMPS = 5; - public void unloadTestClass(String className, boolean expectedUnloadingResult) { ClassUnloader classUnloader = loadedClasses.get(className); - int unloadAttemps = 0; - if (classUnloader != null) { - boolean wasUnloaded = false; - - while (!wasUnloaded && (unloadAttemps++ < MAX_UNLOAD_ATTEMPS)) { - wasUnloaded = classUnloader.unloadClass(); - } + boolean wasUnloaded = classUnloader.unloadClass(); if (wasUnloaded) loadedClasses.remove(className); From 0a97bef840f8799313a1a55a65d9334e09cc1cf4 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Fri, 17 Oct 2025 09:32:40 +0000 Subject: [PATCH 179/561] 8369814: G1: Relax card mark and store ordering Reviewed-by: tschatzl, fandreuzzi --- src/hotspot/share/gc/g1/g1BarrierSet.hpp | 4 - src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 1 - .../gc/parallel/parallelScavengeHeap.cpp | 1 - src/hotspot/share/gc/serial/serialHeap.cpp | 1 - .../share/gc/shared/cardTableBarrierSet.cpp | 73 +------------------ .../share/gc/shared/cardTableBarrierSet.hpp | 28 ------- src/hotspot/share/gc/shared/gc_globals.hpp | 4 - src/hotspot/share/gc/shared/vmStructs_gc.hpp | 1 - .../gc/shenandoah/shenandoahBarrierSet.cpp | 1 - src/hotspot/share/runtime/javaThread.cpp | 4 - src/hotspot/share/runtime/javaThread.hpp | 8 -- 11 files changed, 3 insertions(+), 123 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.hpp b/src/hotspot/share/gc/g1/g1BarrierSet.hpp index 20642cfc7e6..1e5c111a652 100644 --- a/src/hotspot/share/gc/g1/g1BarrierSet.hpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.hpp @@ -84,10 +84,6 @@ class G1BarrierSet: public CardTableBarrierSet { // Update the given thread's card table (byte map) base to the current card table's. void update_card_table_base(Thread* thread); - virtual bool card_mark_must_follow_store() const { - return true; - } - // Add "pre_val" to a set of objects that may have been disconnected from the // pre-marking object graph. Prefer the version that takes location, as it // can avoid touching the heap unnecessarily. diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index c1b18a71cfb..485caa9f6c0 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -1391,7 +1391,6 @@ jint G1CollectedHeap::initialize() { G1CardTable* refinement_table = new G1CardTable(_reserved); G1BarrierSet* bs = new G1BarrierSet(card_table, refinement_table); - bs->initialize(); assert(bs->is_a(BarrierSet::G1BarrierSet), "sanity"); // Create space mappers. diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index 18cbe2403d8..eb1552e3db6 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -79,7 +79,6 @@ jint ParallelScavengeHeap::initialize() { card_table->initialize(old_rs.base(), young_rs.base()); CardTableBarrierSet* const barrier_set = new CardTableBarrierSet(card_table); - barrier_set->initialize(); BarrierSet::set_barrier_set(barrier_set); // Set up WorkerThreads diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index 3511318e169..8022b317ca6 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -182,7 +182,6 @@ jint SerialHeap::initialize() { _rem_set->initialize(young_rs.base(), old_rs.base()); CardTableBarrierSet *bs = new CardTableBarrierSet(_rem_set); - bs->initialize(); BarrierSet::set_barrier_set(bs); _young_gen = new DefNewGeneration(young_rs, NewSize, MinNewSize, MaxNewSize); diff --git a/src/hotspot/share/gc/shared/cardTableBarrierSet.cpp b/src/hotspot/share/gc/shared/cardTableBarrierSet.cpp index dfa00636dec..de514f64be2 100644 --- a/src/hotspot/share/gc/shared/cardTableBarrierSet.cpp +++ b/src/hotspot/share/gc/shared/cardTableBarrierSet.cpp @@ -57,7 +57,6 @@ CardTableBarrierSet::CardTableBarrierSet(BarrierSetAssembler* barrier_set_assemb barrier_set_c1, barrier_set_c2, fake_rtti.add_tag(BarrierSet::CardTableBarrierSet)), - _defer_initial_card_mark(false), _card_table(card_table) {} @@ -66,14 +65,9 @@ CardTableBarrierSet::CardTableBarrierSet(CardTable* card_table) : make_barrier_set_c1(), make_barrier_set_c2(), BarrierSet::FakeRtti(BarrierSet::CardTableBarrierSet)), - _defer_initial_card_mark(false), _card_table(card_table) {} -void CardTableBarrierSet::initialize() { - initialize_deferred_card_mark_barriers(); -} - CardTableBarrierSet::~CardTableBarrierSet() { delete _card_table; } @@ -108,9 +102,7 @@ void CardTableBarrierSet::print_on(outputStream* st) const { // to the post-barrier, we note that G1 needs a RS update barrier // which simply enqueues a (sequence of) dirty cards which may // optionally be refined by the concurrent update threads. Note -// that this barrier need only be applied to a non-young write, -// but, because of the presence of concurrent refinement, -// must strictly follow the oop-store. +// that this barrier need only be applied to a non-young write. // // For any future collector, this code should be reexamined with // that specific collector in mind, and the documentation above suitably @@ -120,72 +112,13 @@ void CardTableBarrierSet::on_slowpath_allocation_exit(JavaThread* thread, oop ne if (!ReduceInitialCardMarks) { return; } - // If a previous card-mark was deferred, flush it now. - flush_deferred_card_mark_barrier(thread); if (new_obj->is_typeArray() || _card_table->is_in_young(new_obj)) { // Arrays of non-references don't need a post-barrier. - // The deferred_card_mark region should be empty - // following the flush above. - assert(thread->deferred_card_mark().is_empty(), "Error"); } else { MemRegion mr(cast_from_oop(new_obj), new_obj->size()); assert(!mr.is_empty(), "Error"); - if (_defer_initial_card_mark) { - // Defer the card mark - thread->set_deferred_card_mark(mr); - } else { - // Do the card mark - write_region(mr); - } + // Do the card mark + write_region(mr); } #endif // COMPILER2_OR_JVMCI } - -void CardTableBarrierSet::initialize_deferred_card_mark_barriers() { - // Used for ReduceInitialCardMarks (when COMPILER2 or JVMCI is used); - // otherwise remains unused. -#if COMPILER2_OR_JVMCI - _defer_initial_card_mark = CompilerConfig::is_c2_or_jvmci_compiler_enabled() && ReduceInitialCardMarks - && (DeferInitialCardMark || card_mark_must_follow_store()); -#else - assert(_defer_initial_card_mark == false, "Who would set it?"); -#endif -} - -void CardTableBarrierSet::flush_deferred_card_mark_barrier(JavaThread* thread) { -#if COMPILER2_OR_JVMCI - MemRegion deferred = thread->deferred_card_mark(); - if (!deferred.is_empty()) { - assert(_defer_initial_card_mark, "Otherwise should be empty"); - { - // Verify that the storage points to a parsable object in heap - DEBUG_ONLY(oop old_obj = cast_to_oop(deferred.start());) - assert(!_card_table->is_in_young(old_obj), - "Else should have been filtered in on_slowpath_allocation_exit()"); - assert(oopDesc::is_oop(old_obj), "Not an oop"); - assert(deferred.word_size() == old_obj->size(), - "Mismatch: multiple objects?"); - } - write_region(thread, deferred); - // "Clear" the deferred_card_mark field - thread->set_deferred_card_mark(MemRegion()); - } - assert(thread->deferred_card_mark().is_empty(), "invariant"); -#else - assert(!_defer_initial_card_mark, "Should be false"); - assert(thread->deferred_card_mark().is_empty(), "Should be empty"); -#endif -} - -void CardTableBarrierSet::on_thread_detach(Thread* thread) { - // The deferred store barriers must all have been flushed to the - // card-table (or other remembered set structure) before GC starts - // processing the card-table (or other remembered set). - if (thread->is_Java_thread()) { // Only relevant for Java threads. - flush_deferred_card_mark_barrier(JavaThread::cast(thread)); - } -} - -bool CardTableBarrierSet::card_mark_must_follow_store() const { - return false; -} diff --git a/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp b/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp index 13f3e0783a6..e97da234d16 100644 --- a/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp +++ b/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp @@ -47,9 +47,6 @@ class CardTableBarrierSet: public ModRefBarrierSet { protected: typedef CardTable::CardValue CardValue; - // Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 - // or INCLUDE_JVMCI is being used - bool _defer_initial_card_mark; CardTable* _card_table; CardTableBarrierSet(BarrierSetAssembler* barrier_set_assembler, @@ -64,13 +61,10 @@ public: CardTable* card_table() const { return _card_table; } - void initialize(); - void write_region(JavaThread* thread, MemRegion mr) { write_region(mr); } - public: // Record a reference update. Note that these versions are precise! // The scanning code has to handle the fact that the write barrier may be // either precise or imprecise. We make non-virtual inline variants of @@ -80,29 +74,7 @@ public: virtual void write_region(MemRegion mr); - // ReduceInitialCardMarks - void initialize_deferred_card_mark_barriers(); - - // If the CollectedHeap was asked to defer a store barrier above, - // this informs it to flush such a deferred store barrier to the - // remembered set. - void flush_deferred_card_mark_barrier(JavaThread* thread); - - // If a compiler is eliding store barriers for TLAB-allocated objects, - // we will be informed of a slow-path allocation by a call - // to on_slowpath_allocation_exit() below. Such a call precedes the - // initialization of the object itself, and no post-store-barriers will - // be issued. Some heap types require that the barrier strictly follows - // the initializing stores. (This is currently implemented by deferring the - // barrier until the next slow-path allocation or gc-related safepoint.) - // This interface answers whether a particular barrier type needs the card - // mark to be thus strictly sequenced after the stores. - virtual bool card_mark_must_follow_store() const; - virtual void on_slowpath_allocation_exit(JavaThread* thread, oop new_obj); - virtual void on_thread_detach(Thread* thread); - - virtual void make_parsable(JavaThread* thread) { flush_deferred_card_mark_barrier(thread); } virtual void print_on(outputStream* st) const; diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 0b245026d68..956bffde156 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -418,10 +418,6 @@ "dictionary, classloader_data_graph, metaspace, jni_handles, " \ "codecache_oops, resolved_method_table, stringdedup") \ \ - product(bool, DeferInitialCardMark, false, DIAGNOSTIC, \ - "When +ReduceInitialCardMarks, explicitly defer any that " \ - "may arise from new_pre_store_barrier") \ - \ product(bool, UseCondCardMark, false, \ "Check for already marked card before updating card table") \ \ diff --git a/src/hotspot/share/gc/shared/vmStructs_gc.hpp b/src/hotspot/share/gc/shared/vmStructs_gc.hpp index bba9c9e099f..9d84a56fbd7 100644 --- a/src/hotspot/share/gc/shared/vmStructs_gc.hpp +++ b/src/hotspot/share/gc/shared/vmStructs_gc.hpp @@ -88,7 +88,6 @@ nonstatic_field(CardTable, _byte_map_size, const size_t) \ nonstatic_field(CardTable, _byte_map, CardTable::CardValue*) \ nonstatic_field(CardTable, _byte_map_base, CardTable::CardValue*) \ - nonstatic_field(CardTableBarrierSet, _defer_initial_card_mark, bool) \ nonstatic_field(CardTableBarrierSet, _card_table, CardTable*) \ \ static_field(CollectedHeap, _lab_alignment_reserve, size_t) \ diff --git a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp index f6733d4a923..2aa37d7c575 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp @@ -103,7 +103,6 @@ void ShenandoahBarrierSet::on_slowpath_allocation_exit(JavaThread* thread, oop n ); } #endif // COMPILER2_OR_JVMCI - assert(thread->deferred_card_mark().is_empty(), "We don't use this"); } void ShenandoahBarrierSet::on_thread_create(Thread* thread) { diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 8bb8095878f..36544cf1118 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -535,7 +535,6 @@ JavaThread::JavaThread(MemTag mem_tag) : set_requires_cross_modify_fence(false); pd_initialize(); - assert(deferred_card_mark().is_empty(), "Default MemRegion ctor"); } JavaThread* JavaThread::create_attaching_thread() { @@ -1359,9 +1358,6 @@ void JavaThread::pop_jni_handle_block() { } void JavaThread::oops_do_no_frames(OopClosure* f, NMethodClosure* cf) { - // Verify that the deferred card marks have been flushed. - assert(deferred_card_mark().is_empty(), "Should be empty during GC"); - // Traverse the GCHandles Thread::oops_do_no_frames(f, cf); diff --git a/src/hotspot/share/runtime/javaThread.hpp b/src/hotspot/share/runtime/javaThread.hpp index c8be1594a69..a6a00bfbd03 100644 --- a/src/hotspot/share/runtime/javaThread.hpp +++ b/src/hotspot/share/runtime/javaThread.hpp @@ -149,11 +149,6 @@ class JavaThread: public Thread { oop _vm_result_oop; // oop result is GC-preserved Metadata* _vm_result_metadata; // non-oop result - // See ReduceInitialCardMarks: this holds the precise space interval of - // the most recent slow path allocation for which compiled code has - // elided card-marks for performance along the fast-path. - MemRegion _deferred_card_mark; - ObjectMonitor* volatile _current_pending_monitor; // ObjectMonitor this thread is waiting to lock bool _current_pending_monitor_is_from_java; // locking is from Java code ObjectMonitor* volatile _current_waiting_monitor; // ObjectMonitor on which this thread called Object.wait() @@ -776,9 +771,6 @@ public: void set_vm_result_metadata(Metadata* x) { _vm_result_metadata = x; } - MemRegion deferred_card_mark() const { return _deferred_card_mark; } - void set_deferred_card_mark(MemRegion mr) { _deferred_card_mark = mr; } - // Is thread in scope of an InternalOOMEMark? bool is_in_internal_oome_mark() const { return _is_in_internal_oome_mark; } void set_is_in_internal_oome_mark(bool b) { _is_in_internal_oome_mark = b; } From e8e2aadd9ea302b7b448d0fda9d069d3813f31c5 Mon Sep 17 00:00:00 2001 From: Hamlin Li Date: Fri, 17 Oct 2025 11:22:23 +0000 Subject: [PATCH 180/561] 8369685: RISC-V: refactor code related to RVFeatureValue::enabled Reviewed-by: fyang, rehn --- src/hotspot/cpu/riscv/vm_version_riscv.cpp | 13 +----- src/hotspot/cpu/riscv/vm_version_riscv.hpp | 45 +++++++++---------- .../linux_riscv/vm_version_linux_riscv.cpp | 13 ++++-- 3 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.cpp b/src/hotspot/cpu/riscv/vm_version_riscv.cpp index 9d6146a8389..6f4babc872f 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.cpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.cpp @@ -103,17 +103,6 @@ void VM_Version::common_initialize() { useRVA23U64Profile(); } - // Enable vendor specific features - - if (mvendorid.enabled()) { - // Rivos - if (mvendorid.value() == RIVOS) { - if (FLAG_IS_DEFAULT(UseConservativeFence)) { - FLAG_SET_DEFAULT(UseConservativeFence, false); - } - } - } - if (UseZic64b) { if (CacheLineSize != 64) { assert(!FLAG_IS_DEFAULT(CacheLineSize), "default cache line size should be 64 bytes"); @@ -199,7 +188,7 @@ void VM_Version::common_initialize() { FLAG_SET_DEFAULT(UsePopCountInstruction, false); } - if (UseZicboz && zicboz_block_size.enabled() && zicboz_block_size.value() > 0) { + if (UseZicboz && zicboz_block_size.value() > 0) { assert(is_power_of_2(zicboz_block_size.value()), "Sanity"); if (FLAG_IS_DEFAULT(UseBlockZeroing)) { FLAG_SET_DEFAULT(UseBlockZeroing, true); diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp index 3d555d47e9f..f74992cbc37 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp @@ -52,24 +52,19 @@ class VM_Version : public Abstract_VM_Version { const char* const _pretty; const bool _feature_string; const uint64_t _linux_feature_bit; - int64_t _value; + public: RVFeatureValue(const char* pretty, int linux_bit_num, bool fstring) : - _pretty(pretty), _feature_string(fstring), _linux_feature_bit(nth_bit(linux_bit_num)), - _value(-1) { + _pretty(pretty), _feature_string(fstring), _linux_feature_bit(nth_bit(linux_bit_num)) { } - virtual void enable_feature(int64_t value = 0) { - _value = value; - } - virtual void disable_feature() { - _value = -1; - } - const char* pretty() { return _pretty; } - uint64_t feature_bit() { return _linux_feature_bit; } - bool feature_string() { return _feature_string; } - int64_t value() { return _value; } + virtual void enable_feature(int64_t value = 0) = 0; + virtual void disable_feature() = 0; + const char* pretty() { return _pretty; } + uint64_t feature_bit() { return _linux_feature_bit; } + bool feature_string() { return _feature_string; } virtual bool enabled() = 0; virtual void update_flag() = 0; + virtual void log_enabled() = 0; }; #define UPDATE_DEFAULT(flag) \ @@ -135,13 +130,12 @@ class VM_Version : public Abstract_VM_Version { return RVExtFeatures::current()->support_feature(_cpu_feature_index); } void enable_feature(int64_t value = 0) { - RVFeatureValue::enable_feature(value); RVExtFeatures::current()->set_feature(_cpu_feature_index); } void disable_feature() { - RVFeatureValue::disable_feature(); RVExtFeatures::current()->clear_feature(_cpu_feature_index); } + void log_enabled(); protected: bool deps_all_enabled(RVExtFeatureValue* dep0, ...) { @@ -196,21 +190,22 @@ class VM_Version : public Abstract_VM_Version { }; class RVNonExtFeatureValue : public RVFeatureValue { - bool _enabled; + static const int64_t DEFAULT_VALUE = -1; + int64_t _value; + public: RVNonExtFeatureValue(const char* pretty, int linux_bit_num, bool fstring) : RVFeatureValue(pretty, linux_bit_num, fstring), - _enabled(false) { + _value(DEFAULT_VALUE) { } - bool enabled() { return _enabled; } - void enable_feature(int64_t value = 0) { - RVFeatureValue::enable_feature(value); - _enabled = true; - } - void disable_feature() { - RVFeatureValue::disable_feature(); - _enabled = false; + bool enabled() { return _value != DEFAULT_VALUE; } + void enable_feature(int64_t value) { + assert(value != DEFAULT_VALUE, "Sanity"); + _value = value; } + void disable_feature() { _value = DEFAULT_VALUE; } + int64_t value() { return _value; } + void log_enabled(); }; public: diff --git a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp index e414a3889c2..0799de014a9 100644 --- a/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp +++ b/src/hotspot/os_cpu/linux_riscv/vm_version_linux_riscv.cpp @@ -103,6 +103,14 @@ uint32_t VM_Version::cpu_vector_length() { return (uint32_t)read_csr(CSR_VLENB); } +void VM_Version::RVExtFeatureValue::log_enabled() { + log_debug(os, cpu)("Enabled RV64 feature \"%s\"", pretty()); +} + +void VM_Version::RVNonExtFeatureValue::log_enabled() { + log_debug(os, cpu)("Enabled RV64 feature \"%s\" (%ld)", pretty(), value()); +} + void VM_Version::setup_cpu_available_features() { assert(ext_i.feature_bit() == HWCAP_ISA_I, "Bit for I must follow Linux HWCAP"); @@ -144,9 +152,8 @@ void VM_Version::setup_cpu_available_features() { continue; } - log_debug(os, cpu)("Enabled RV64 feature \"%s\" (%ld)", - _feature_list[i]->pretty(), - _feature_list[i]->value()); + _feature_list[i]->log_enabled(); + // The feature string if (_feature_list[i]->feature_string()) { const char* tmp = _feature_list[i]->pretty(); From b159ca097a71407d0bc10f6c5d86d5f45c7d7642 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Fri, 17 Oct 2025 14:19:21 +0000 Subject: [PATCH 181/561] 8369980: Use ThreadsClaimTokenScope in ShenandoahThreadRoots Reviewed-by: ayang, wkemper --- .../share/gc/shenandoah/shenandoahRootProcessor.cpp | 10 +++------- .../share/gc/shenandoah/shenandoahRootProcessor.hpp | 5 +++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp index a56113868be..9e6b1960708 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.cpp @@ -58,9 +58,9 @@ void ShenandoahJavaThreadsIterator::threads_do(ThreadClosure* cl, uint worker_id } ShenandoahThreadRoots::ShenandoahThreadRoots(ShenandoahPhaseTimings::Phase phase, bool is_par) : - _phase(phase), _is_par(is_par) { - Threads::change_thread_claim_token(); -} + _phase(phase), + _is_par(is_par), + _threads_claim_token_scope() {} void ShenandoahThreadRoots::oops_do(OopClosure* oops_cl, NMethodClosure* code_cl, uint worker_id) { ShenandoahWorkerTimingsTracker timer(_phase, ShenandoahPhaseTimings::ThreadRoots, worker_id); @@ -74,10 +74,6 @@ void ShenandoahThreadRoots::threads_do(ThreadClosure* tc, uint worker_id) { Threads::possibly_parallel_threads_do(_is_par, tc); } -ShenandoahThreadRoots::~ShenandoahThreadRoots() { - Threads::assert_all_threads_claimed(); -} - ShenandoahCodeCacheRoots::ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase) : _phase(phase) { } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp index 40d4077256d..29d8c9fac2d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootProcessor.hpp @@ -33,6 +33,7 @@ #include "gc/shenandoah/shenandoahSharedVariables.hpp" #include "gc/shenandoah/shenandoahUtils.hpp" #include "memory/iterator.hpp" +#include "runtime/threads.hpp" template class ShenandoahVMWeakRoots { @@ -87,10 +88,10 @@ public: class ShenandoahThreadRoots { private: ShenandoahPhaseTimings::Phase _phase; - const bool _is_par; + const bool _is_par; + ThreadsClaimTokenScope _threads_claim_token_scope; public: ShenandoahThreadRoots(ShenandoahPhaseTimings::Phase phase, bool is_par); - ~ShenandoahThreadRoots(); void oops_do(OopClosure* oops_cl, NMethodClosure* code_cl, uint worker_id); void threads_do(ThreadClosure* tc, uint worker_id); From cc6f8f1307476886aa3c43a2b966fc7bff2be04e Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 17 Oct 2025 15:12:27 +0000 Subject: [PATCH 182/561] 8369997: Tests that use custom scheduler should use jdk.test.lib.thread.VThreadScheduler Reviewed-by: sspitsyn, alanb --- .../ThreadStateTest/ThreadStateTest.java | 30 +++++-------------- .../WriteToReleasesCarrier.java | 19 ++++-------- .../TestTerminatingThreadLocal.java | 27 +++-------------- 3 files changed, 16 insertions(+), 60 deletions(-) diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/ThreadStateTest/ThreadStateTest.java b/test/hotspot/jtreg/serviceability/jvmti/vthread/ThreadStateTest/ThreadStateTest.java index 4c8b9bb030f..c6a7debed1a 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/vthread/ThreadStateTest/ThreadStateTest.java +++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/ThreadStateTest/ThreadStateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,15 +27,17 @@ * @summary Exercise JvmtiThreadState creation concurrently with terminating vthreads * @requires vm.continuations * @modules java.base/java.lang:+open + * @library /test/lib * @run main/othervm/native -agentlib:ThreadStateTest ThreadStateTest */ -import java.util.concurrent.*; import java.util.Arrays; import java.util.ArrayList; import java.util.List; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.Executors; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadFactory; +import jdk.test.lib.thread.VThreadScheduler; public class ThreadStateTest { static final int VTHREAD_COUNT = 64; @@ -59,7 +61,7 @@ public class ThreadStateTest { while (tryCount-- > 0) { ExecutorService scheduler = Executors.newFixedThreadPool(8); - ThreadFactory factory = virtualThreadBuilder(scheduler).factory(); + ThreadFactory factory = VThreadScheduler.virtualThreadBuilder(scheduler).factory(); List virtualThreads = new ArrayList<>(); for (int i = 0; i < VTHREAD_COUNT; i++) { @@ -98,22 +100,4 @@ public class ThreadStateTest { ThreadStateTest obj = new ThreadStateTest(); obj.runTest(); } - - private static Thread.Builder.OfVirtual virtualThreadBuilder(Executor scheduler) { - Thread.Builder.OfVirtual builder = Thread.ofVirtual(); - try { - Class clazz = Class.forName("java.lang.ThreadBuilders$VirtualThreadBuilder"); - Constructor ctor = clazz.getDeclaredConstructor(Executor.class); - ctor.setAccessible(true); - return (Thread.Builder.OfVirtual) ctor.newInstance(scheduler); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - if (cause instanceof RuntimeException re) { - throw re; - } - throw new RuntimeException(e); - } catch (Exception e) { - throw new RuntimeException(e); - } - } } diff --git a/test/jdk/java/io/ByteArrayOutputStream/WriteToReleasesCarrier.java b/test/jdk/java/io/ByteArrayOutputStream/WriteToReleasesCarrier.java index c0607fd9494..a0c13f24c7c 100644 --- a/test/jdk/java/io/ByteArrayOutputStream/WriteToReleasesCarrier.java +++ b/test/jdk/java/io/ByteArrayOutputStream/WriteToReleasesCarrier.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @summary Test ByteArrayOutputStream.writeTo releases carrier thread * @requires vm.continuations * @modules java.base/java.lang:+open + * @library /test/lib * @run main WriteToReleasesCarrier */ @@ -34,14 +35,14 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; -import java.lang.reflect.Constructor; import java.util.Arrays; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.LockSupport; +import jdk.test.lib.thread.VThreadScheduler; public class WriteToReleasesCarrier { public static void main(String[] args) throws Exception { @@ -53,7 +54,7 @@ public class WriteToReleasesCarrier { var target = new ParkingOutputStream(); try (ExecutorService scheduler = Executors.newFixedThreadPool(1)) { - Thread.Builder builder = virtualThreadBuilder(scheduler); + Thread.Builder builder = VThreadScheduler.virtualThreadBuilder(scheduler); var started = new CountDownLatch(1); var vthread1 = builder.start(() -> { started.countDown(); @@ -118,14 +119,4 @@ public class WriteToReleasesCarrier { return baos.toByteArray(); } } - - /** - * Returns a builder to create virtual threads that use the given scheduler. - */ - static Thread.Builder.OfVirtual virtualThreadBuilder(Executor scheduler) throws Exception { - Class clazz = Class.forName("java.lang.ThreadBuilders$VirtualThreadBuilder"); - Constructor ctor = clazz.getDeclaredConstructor(Executor.class); - ctor.setAccessible(true); - return (Thread.Builder.OfVirtual) ctor.newInstance(scheduler); - } } diff --git a/test/jdk/jdk/internal/misc/TerminatingThreadLocal/TestTerminatingThreadLocal.java b/test/jdk/jdk/internal/misc/TerminatingThreadLocal/TestTerminatingThreadLocal.java index cf46c5b1d22..bbf2e99b950 100644 --- a/test/jdk/jdk/internal/misc/TerminatingThreadLocal/TestTerminatingThreadLocal.java +++ b/test/jdk/jdk/internal/misc/TerminatingThreadLocal/TestTerminatingThreadLocal.java @@ -23,9 +23,7 @@ import jdk.internal.misc.TerminatingThreadLocal; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -37,6 +35,8 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Stream; +import jdk.test.lib.thread.VThreadScheduler; + import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -46,6 +46,7 @@ import static org.testng.Assert.*; * @bug 8202788 8291897 8357637 * @summary TerminatingThreadLocal unit test * @modules java.base/java.lang:+open java.base/jdk.internal.misc + * @library /test/lib * @requires vm.continuations * @run testng/othervm TestTerminatingThreadLocal */ @@ -139,7 +140,7 @@ public class TestTerminatingThreadLocal { // capture carrier Thread carrier = pool.submit(Thread::currentThread).get(); - ThreadFactory factory = virtualThreadBuilder(pool) + ThreadFactory factory = VThreadScheduler.virtualThreadBuilder(pool) .name("ttl-test-virtual-", 0) .factory(); try (var executor = Executors.newThreadPerTaskExecutor(factory)) { @@ -202,24 +203,4 @@ public class TestTerminatingThreadLocal { assertEquals(terminatedValues, List.of(ttlValue)); } - - /** - * Returns a builder to create virtual threads that use the given scheduler. - */ - static Thread.Builder.OfVirtual virtualThreadBuilder(Executor scheduler) { - try { - Class clazz = Class.forName("java.lang.ThreadBuilders$VirtualThreadBuilder"); - Constructor ctor = clazz.getDeclaredConstructor(Executor.class); - ctor.setAccessible(true); - return (Thread.Builder.OfVirtual) ctor.newInstance(scheduler); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - if (cause instanceof RuntimeException re) { - throw re; - } - throw new RuntimeException(e); - } catch (Exception e) { - throw new RuntimeException(e); - } - } } From 28bf9176b8d460242bb7cedfb3bde5c6294c56fb Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Fri, 17 Oct 2025 16:03:24 +0000 Subject: [PATCH 183/561] 8348844: Remove remaining JVMTI tests from ProblemList-Virtual, use requires instead Reviewed-by: dholmes, alanb, syan, sspitsyn --- test/hotspot/jtreg/ProblemList-Virtual.txt | 16 -------------- .../arguments/TestNewSizeThreadIncrease.java | 3 ++- .../gc/g1/TestSkipRebuildRemsetPhase.java | 3 ++- .../MachCodeFramesInErrorFile.java | 3 ++- .../Thread/AsyncExceptionOnMonitorEnter.java | 1 + .../jtreg/runtime/Thread/StopAtExit.java | 3 ++- .../handshake/HandshakeWalkStackTest.java | 3 ++- .../curthrcputime001/TestDescription.java | 3 ++- .../thrcputime001/TestDescription.java | 3 ++- test/jdk/ProblemList-Virtual.txt | 21 ------------------- .../java/lang/StackWalker/CallerFromMain.java | 5 +++-- .../java/lang/StackWalker/DumpStackTest.java | 3 ++- .../java/lang/StackWalker/StackWalkTest.java | 3 ++- test/jdk/java/lang/Thread/MainThreadTest.java | 3 ++- .../lang/Thread/UncaughtExceptionsTest.java | 3 ++- .../java/lang/ref/OOMEInReferenceHandler.java | 3 ++- .../util/concurrent/locks/Lock/OOMEInAQS.java | 3 ++- .../jdk/internal/vm/Continuation/Scoped.java | 3 ++- 18 files changed, 32 insertions(+), 53 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList-Virtual.txt b/test/hotspot/jtreg/ProblemList-Virtual.txt index 3c74d7bf816..31684662194 100644 --- a/test/hotspot/jtreg/ProblemList-Virtual.txt +++ b/test/hotspot/jtreg/ProblemList-Virtual.txt @@ -33,11 +33,6 @@ vmTestbase/vm/mlvm/indy/func/jvmti/mergeCP_indy2manyDiff_a/TestDescription.java vmTestbase/nsk/jvmti/CompiledMethodUnload/compmethunload001/TestDescription.java 8300711 generic-all -#### -## Tests for functionality which currently is not supported for virtual threads - -vmTestbase/nsk/jvmti/GetCurrentThreadCpuTime/curthrcputime001/TestDescription.java 8348844 generic-all -vmTestbase/nsk/jvmti/GetThreadCpuTime/thrcputime001/TestDescription.java 8348844 generic-all #### ## Test fails because it expects to find vthreads in GetAllThreads @@ -82,14 +77,3 @@ vmTestbase/nsk/jdi/VMOutOfMemoryException/VMOutOfMemoryException001/VMOutOfMemor # to make progress when all other threads are currently suspended. vmTestbase/nsk/jdi/ThreadReference/isSuspended/issuspended002/TestDescription.java 8338713 generic-all -########## -## Tests incompatible with with virtual test thread factory. -## There is no goal to run all test with virtual test thread factory. -## So any test migth be added as incompatible, the bug is not required. - -gc/arguments/TestNewSizeThreadIncrease.java 0000000 generic-all -gc/g1/TestSkipRebuildRemsetPhase.java 0000000 generic-all -runtime/ErrorHandling/MachCodeFramesInErrorFile.java 0000000 generic-all -runtime/Thread/AsyncExceptionOnMonitorEnter.java 0000000 generic-all -runtime/Thread/StopAtExit.java 0000000 generic-all -runtime/handshake/HandshakeWalkStackTest.java 0000000 generic-all diff --git a/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java b/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java index efe703f9295..f885ef7e462 100644 --- a/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java +++ b/test/hotspot/jtreg/gc/arguments/TestNewSizeThreadIncrease.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ package gc.arguments; * @library /test/lib * @library / * @requires vm.gc.Serial + * @requires test.thread.factory == null * @modules java.base/jdk.internal.misc * java.management * @run driver gc.arguments.TestNewSizeThreadIncrease diff --git a/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java b/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java index d973e897fe1..28524869edb 100644 --- a/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java +++ b/test/hotspot/jtreg/gc/g1/TestSkipRebuildRemsetPhase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -29,6 +29,7 @@ package gc.g1; * Fill up a region to above the set G1MixedGCLiveThresholdPercent. * @requires vm.gc.G1 * @library /test/lib + * @requires test.thread.factory == null * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run driver gc.g1.TestSkipRebuildRemsetPhase diff --git a/test/hotspot/jtreg/runtime/ErrorHandling/MachCodeFramesInErrorFile.java b/test/hotspot/jtreg/runtime/ErrorHandling/MachCodeFramesInErrorFile.java index 5717a576e65..74cedae5f1a 100644 --- a/test/hotspot/jtreg/runtime/ErrorHandling/MachCodeFramesInErrorFile.java +++ b/test/hotspot/jtreg/runtime/ErrorHandling/MachCodeFramesInErrorFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -26,6 +26,7 @@ * @bug 8272586 * @requires vm.flagless * @requires vm.compiler2.enabled + * @requires test.thread.factory == null * @summary Test that abstract machine code is dumped for the top frames in a hs-err log * @library /test/lib * @modules java.base/jdk.internal.misc diff --git a/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java b/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java index 8446ffb20fe..a4aa0fe3797 100644 --- a/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java +++ b/test/hotspot/jtreg/runtime/Thread/AsyncExceptionOnMonitorEnter.java @@ -25,6 +25,7 @@ * @test * @bug 8283044 * @summary Stress delivery of asynchronous exceptions while target is at monitorenter + * @requires test.thread.factory == null * @library /test/hotspot/jtreg/testlibrary * @run main/othervm/native AsyncExceptionOnMonitorEnter 0 * @run main/othervm/native -agentlib:AsyncExceptionOnMonitorEnter AsyncExceptionOnMonitorEnter 1 diff --git a/test/hotspot/jtreg/runtime/Thread/StopAtExit.java b/test/hotspot/jtreg/runtime/Thread/StopAtExit.java index 3ceb955609b..68523c2c189 100644 --- a/test/hotspot/jtreg/runtime/Thread/StopAtExit.java +++ b/test/hotspot/jtreg/runtime/Thread/StopAtExit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @test * @bug 8167108 8266130 8283467 8284632 8286830 * @summary Stress test JVM/TI StopThread() at thread exit. + * @requires test.thread.factory == null * @requires vm.jvmti * @run main/othervm/native -agentlib:StopAtExit StopAtExit */ diff --git a/test/hotspot/jtreg/runtime/handshake/HandshakeWalkStackTest.java b/test/hotspot/jtreg/runtime/handshake/HandshakeWalkStackTest.java index 701e1ec6ec1..6644d14dbc8 100644 --- a/test/hotspot/jtreg/runtime/handshake/HandshakeWalkStackTest.java +++ b/test/hotspot/jtreg/runtime/handshake/HandshakeWalkStackTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -24,6 +24,7 @@ /* * @test HandshakeWalkStackTest + * @requires test.thread.factory == null * @library /testlibrary /test/lib * @build HandshakeWalkStackTest * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetCurrentThreadCpuTime/curthrcputime001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetCurrentThreadCpuTime/curthrcputime001/TestDescription.java index 0b7e1d2a89e..ba09ff735d8 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetCurrentThreadCpuTime/curthrcputime001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetCurrentThreadCpuTime/curthrcputime001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -71,6 +71,7 @@ * COMMENTS * Fixed the 4968019, 5006885 bugs. * + * @requires test.thread.factory == null * @library /vmTestbase * /test/lib * @build nsk.jvmti.GetCurrentThreadCpuTime.curthrcputime001 diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetThreadCpuTime/thrcputime001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetThreadCpuTime/thrcputime001/TestDescription.java index cf0fe3e5d2d..b935639e183 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetThreadCpuTime/thrcputime001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetThreadCpuTime/thrcputime001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -71,6 +71,7 @@ * COMMENTS * Fixed the 4968019, 5006885 bugs. * + * @requires test.thread.factory == null * @library /vmTestbase * /test/lib * @build nsk.jvmti.GetThreadCpuTime.thrcputime001 diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt index dcd4dbac310..dffbd4a952e 100644 --- a/test/jdk/ProblemList-Virtual.txt +++ b/test/jdk/ProblemList-Virtual.txt @@ -38,24 +38,3 @@ javax/management/remote/mandatory/connection/DeadLockTest.java 8309069 windows-x javax/management/remote/mandatory/connection/ConnectionTest.java 8308352 windows-x64 -########## -## Tests incompatible with virtual test thread factory. -## There is no goal to run all test with virtual test thread factory. -## So any test might be added as incompatible, the bug id is not required. - -# Incorrect stack/threadgroup/exception expectations for main thread -java/lang/StackWalker/DumpStackTest.java 0000000 generic-all -java/lang/StackWalker/StackWalkTest.java 0000000 generic-all -java/lang/StackWalker/CallerFromMain.java 0000000 generic-all -java/lang/Thread/MainThreadTest.java 0000000 generic-all -java/lang/Thread/UncaughtExceptionsTest.java 0000000 generic-all -java/lang/invoke/condy/CondyNestedResolutionTest.java 0000000 generic-all -java/lang/ref/OOMEInReferenceHandler.java 0000000 generic-all -java/util/concurrent/locks/Lock/OOMEInAQS.java 0000000 generic-all -jdk/internal/vm/Continuation/Scoped.java 0000000 generic-all - -# The problems with permissions -jdk/jfr/startupargs/TestDumpOnExit.java 0000000 generic-all -java/util/Properties/StoreReproducibilityTest.java 0000000 generic-all -javax/management/ImplementationVersion/ImplVersionTest.java 0000000 generic-all -javax/management/remote/mandatory/version/ImplVersionTest.java 0000000 generic-all diff --git a/test/jdk/java/lang/StackWalker/CallerFromMain.java b/test/jdk/java/lang/StackWalker/CallerFromMain.java index 86e7cfb7043..81456b02c36 100644 --- a/test/jdk/java/lang/StackWalker/CallerFromMain.java +++ b/test/jdk/java/lang/StackWalker/CallerFromMain.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -24,8 +24,9 @@ /* * @test * @bug 8140450 - * @library /test/lib * @summary Test if the getCallerClass method returns empty optional + * @requires test.thread.factory == null + * @library /test/lib * @run main CallerFromMain exec */ diff --git a/test/jdk/java/lang/StackWalker/DumpStackTest.java b/test/jdk/java/lang/StackWalker/DumpStackTest.java index c196b1c4ad3..1365e39ccfa 100644 --- a/test/jdk/java/lang/StackWalker/DumpStackTest.java +++ b/test/jdk/java/lang/StackWalker/DumpStackTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @summary Verify outputs of Thread.dumpStack() and Throwable.printStackTrace(). * This test should also been run against jdk9 successfully except of * VM option MemberNameInStackFrame. + * @requires test.thread.factory == null * @run main/othervm DumpStackTest */ diff --git a/test/jdk/java/lang/StackWalker/StackWalkTest.java b/test/jdk/java/lang/StackWalker/StackWalkTest.java index 80e934d477c..8848f323cab 100644 --- a/test/jdk/java/lang/StackWalker/StackWalkTest.java +++ b/test/jdk/java/lang/StackWalker/StackWalkTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,7 @@ import jdk.test.lib.RandomFactory; * @test * @bug 8140450 * @summary Stack Walk Test (use -Dseed=X to set PRNG seed) + * @requires test.thread.factory == null * @library /test/lib * @build jdk.test.lib.RandomFactory * @compile StackRecorderUtil.java diff --git a/test/jdk/java/lang/Thread/MainThreadTest.java b/test/jdk/java/lang/Thread/MainThreadTest.java index 2482a8aa6d2..7129170ad4e 100644 --- a/test/jdk/java/lang/Thread/MainThreadTest.java +++ b/test/jdk/java/lang/Thread/MainThreadTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -25,6 +25,7 @@ * @test * @bug 4533087 * @summary Test to see if the main thread is in its thread group + * @requires test.thread.factory == null */ public class MainThreadTest { diff --git a/test/jdk/java/lang/Thread/UncaughtExceptionsTest.java b/test/jdk/java/lang/Thread/UncaughtExceptionsTest.java index 915d1cb6b76..1bb810d372f 100644 --- a/test/jdk/java/lang/Thread/UncaughtExceptionsTest.java +++ b/test/jdk/java/lang/Thread/UncaughtExceptionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -36,6 +36,7 @@ import org.junit.jupiter.params.provider.MethodSource; * @bug 4833089 4992454 * @summary Check for proper handling of uncaught exceptions * @author Martin Buchholz + * @requires test.thread.factory == null * @library /test/lib * @build jdk.test.lib.process.* * @run junit UncaughtExceptionsTest diff --git a/test/jdk/java/lang/ref/OOMEInReferenceHandler.java b/test/jdk/java/lang/ref/OOMEInReferenceHandler.java index 2f80fa6178a..9f0a4ea378e 100644 --- a/test/jdk/java/lang/ref/OOMEInReferenceHandler.java +++ b/test/jdk/java/lang/ref/OOMEInReferenceHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -25,6 +25,7 @@ * @test * @bug 7038914 8016341 * @summary Verify that the reference handler does not die after an OOME allocating the InterruptedException object + * @requires test.thread.factory == null * @run main/othervm -XX:-UseGCOverheadLimit -Xmx24M -XX:-UseTLAB OOMEInReferenceHandler * @author peter.levart@gmail.com * @key intermittent diff --git a/test/jdk/java/util/concurrent/locks/Lock/OOMEInAQS.java b/test/jdk/java/util/concurrent/locks/Lock/OOMEInAQS.java index aee6c3617c8..0ed76f4b885 100644 --- a/test/jdk/java/util/concurrent/locks/Lock/OOMEInAQS.java +++ b/test/jdk/java/util/concurrent/locks/Lock/OOMEInAQS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -39,6 +39,7 @@ import java.util.stream.Stream; * @bug 8066859 * @summary Check that AQS-based locks, conditions, and CountDownLatches do not fail when encountering OOME * @requires vm.gc.G1 + * @requires test.thread.factory == null * @requires !(vm.graal.enabled & vm.compMode == "Xcomp") * @run main/othervm -XX:+UseG1GC -XX:-UseGCOverheadLimit -Xmx48M -XX:-UseTLAB OOMEInAQS */ diff --git a/test/jdk/jdk/internal/vm/Continuation/Scoped.java b/test/jdk/jdk/internal/vm/Continuation/Scoped.java index 908267792b8..448c2ab71a5 100644 --- a/test/jdk/jdk/internal/vm/Continuation/Scoped.java +++ b/test/jdk/jdk/internal/vm/Continuation/Scoped.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @test * @summary Nested continuations test * @requires vm.continuations + * @requires test.thread.factory == null * @modules java.base/jdk.internal.vm * @build java.base/java.lang.StackWalkerHelper * @run testng/othervm -XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames -Xint Scoped From 1e5e17a10a001c189f6ab19f61efca2d08cb0301 Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Fri, 17 Oct 2025 16:19:35 +0000 Subject: [PATCH 184/561] 8369590: LocaleEnhanceTest has incorrectly passing test case Reviewed-by: naoto --- .../java/util/Locale/LocaleEnhanceTest.java | 1077 ++++++++--------- 1 file changed, 482 insertions(+), 595 deletions(-) diff --git a/test/jdk/java/util/Locale/LocaleEnhanceTest.java b/test/jdk/java/util/Locale/LocaleEnhanceTest.java index 7ab8db4c9e2..8bcbe20d197 100644 --- a/test/jdk/java/util/Locale/LocaleEnhanceTest.java +++ b/test/jdk/java/util/Locale/LocaleEnhanceTest.java @@ -31,9 +31,8 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormatSymbols; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.IllformedLocaleException; import java.util.List; @@ -47,26 +46,24 @@ import org.junit.jupiter.params.provider.EmptySource; import org.junit.jupiter.params.provider.NullSource; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -/** +/* * @test * @bug 6875847 6992272 7002320 7015500 7023613 7032820 7033504 7004603 * 7044019 8008577 8176853 8255086 8263202 8287868 8174269 8369452 + * 8369590 * @summary test API changes to Locale * @modules jdk.localedata - * @compile LocaleEnhanceTest.java * @run junit/othervm -esa LocaleEnhanceTest */ public class LocaleEnhanceTest { - public LocaleEnhanceTest() { - } - - /// - /// Generic sanity tests - /// - /** A canonical language code. */ private static final String l = "en"; @@ -79,6 +76,10 @@ public class LocaleEnhanceTest { /** A canonical variant code. */ private static final String v = "NewYork"; + /// + /// Generic sanity tests + /// + /** * Ensure that Builder builds locales that have the expected * tag and java6 ID. Note the odd cases for the ID. @@ -124,12 +125,12 @@ public class LocaleEnhanceTest { .setRegion(idc) .setVariant(idv) .build(); - assertEquals(msg + "language", idl, l.getLanguage()); - assertEquals(msg + "script", ids, l.getScript()); - assertEquals(msg + "country", idc, l.getCountry()); - assertEquals(msg + "variant", idv, l.getVariant()); - assertEquals(msg + "tag", tag, l.toLanguageTag()); - assertEquals(msg + "id", id, l.toString()); + assertEquals(idl, l.getLanguage(), msg + "language"); + assertEquals(ids, l.getScript(), msg + "script"); + assertEquals(idc, l.getCountry(), msg + "country"); + assertEquals(idv, l.getVariant(), msg + "variant"); + assertEquals(tag, l.toLanguageTag(), msg + "tag"); + assertEquals(id, l.toString(), msg + "id"); } catch (IllegalArgumentException e) { fail(msg + e.getMessage()); @@ -181,13 +182,13 @@ public class LocaleEnhanceTest { .setVariant(idv) .build(); - assertEquals(msg + " language", idl, l.getLanguage()); - assertEquals(msg + " script", ids, l.getScript()); - assertEquals(msg + " country", idc, l.getCountry()); - assertEquals(msg + " variant", idv, l.getVariant()); + assertEquals(idl, l.getLanguage(), msg + " language"); + assertEquals(ids, l.getScript(), msg + " script"); + assertEquals(idc, l.getCountry(), msg + " country"); + assertEquals(idv, l.getVariant(), msg + " variant"); - assertEquals(msg + "tag", tag, l.toLanguageTag()); - assertEquals(msg + "id", id, l.toString()); + assertEquals(tag, l.toLanguageTag(), msg + "tag"); + assertEquals(id, l.toString(), msg + "id"); } catch (IllegalArgumentException e) { fail(msg + e.getMessage()); @@ -235,7 +236,7 @@ public class LocaleEnhanceTest { for (int i = 0; i < invalids.length; ++i) { String id = invalids[i]; Locale l = Locale.forLanguageTag(id); - assertEquals(id, "und", l.toLanguageTag()); + assertEquals("und", l.toLanguageTag(), id); } } @@ -255,14 +256,14 @@ public class LocaleEnhanceTest { // except no_NO_NY Locale tagResult = Locale.forLanguageTag(tag); if (!target.getVariant().equals("NY")) { - assertEquals("tagResult", target, tagResult); + assertEquals(target, tagResult, "tagResult"); } // the builder also recreates the original locale, // except ja_JP_JP, th_TH_TH and no_NO_NY Locale builderResult = builder.setLocale(target).build(); if (target.getVariant().length() != 2) { - assertEquals("builderResult", target, builderResult); + assertEquals(target, builderResult, "builderResult"); } } } @@ -275,11 +276,11 @@ public class LocaleEnhanceTest { BufferedReader br = new BufferedReader( new InputStreamReader( LocaleEnhanceTest.class.getResourceAsStream("icuLocales.txt"), - "UTF-8")); + StandardCharsets.UTF_8)); String id = null; while (null != (id = br.readLine())) { Locale result = Locale.forLanguageTag(id); - assertEquals("ulocale", id, result.toLanguageTag()); + assertEquals(id, result.toLanguageTag(), "ulocale"); } } @@ -291,163 +292,151 @@ public class LocaleEnhanceTest { public void testConstructor() { // all the old weirdness still holds, no new weirdness String[][] tests = { - // language to lower case, region to upper, variant unchanged - // short - { "X", "y", "z", "x", "Y" }, - // long - { "xXxXxXxXxXxX", "yYyYyYyYyYyYyYyY", "zZzZzZzZzZzZzZzZ", - "xxxxxxxxxxxx", "YYYYYYYYYYYYYYYY" }, - // mapped language ids - { "he", "IL", "", "he" }, - { "iw", "IL", "", "he" }, - { "yi", "DE", "", "yi" }, - { "ji", "DE", "", "yi" }, - { "id", "ID", "", "id" }, - { "in", "ID", "", "id" }, - // special variants - { "ja", "JP", "JP" }, - { "th", "TH", "TH" }, - { "no", "NO", "NY" }, - { "no", "NO", "NY" }, - // no canonicalization of 3-letter language codes - { "eng", "US", "" } + // language to lower case, region to upper, variant unchanged + // short + {"X", "y", "z", "x", "Y"}, + // long + {"xXxXxXxXxXxX", "yYyYyYyYyYyYyYyY", "zZzZzZzZzZzZzZzZ", + "xxxxxxxxxxxx", "YYYYYYYYYYYYYYYY"}, + // mapped language ids + {"he", "IL", "", "he"}, + {"iw", "IL", "", "he"}, + {"yi", "DE", "", "yi"}, + {"ji", "DE", "", "yi"}, + {"id", "ID", "", "id"}, + {"in", "ID", "", "id"}, + // special variants + {"ja", "JP", "JP"}, + {"th", "TH", "TH"}, + {"no", "NO", "NY"}, + {"no", "NO", "NY"}, + // no canonicalization of 3-letter language codes + {"eng", "US", ""} }; - for (int i = 0; i < tests.length; ++ i) { + for (int i = 0; i < tests.length; ++i) { String[] test = tests[i]; String id = String.valueOf(i); Locale locale = Locale.of(test[0], test[1], test[2]); - assertEquals(id + " lang", test.length > 3 ? test[3] : test[0], locale.getLanguage()); - assertEquals(id + " region", test.length > 4 ? test[4] : test[1], locale.getCountry()); - assertEquals(id + " variant", test.length > 5 ? test[5] : test[2], locale.getVariant()); + assertEquals(test.length > 3 ? test[3] : test[0], locale.getLanguage(), id + " lang"); + assertEquals(test.length > 4 ? test[4] : test[1], locale.getCountry(), id + " region"); + assertEquals(test.length > 5 ? test[5] : test[2], locale.getVariant(), id + " variant"); } } /// - /// Locale API tests. + /// Locale API Tests /// @Test public void testGetScript() { // forLanguageTag normalizes case Locale locale = Locale.forLanguageTag("und-latn"); - assertEquals("forLanguageTag", "Latn", locale.getScript()); + assertEquals("Latn", locale.getScript(), "forLanguageTag"); // Builder normalizes case locale = new Builder().setScript("LATN").build(); - assertEquals("builder", "Latn", locale.getScript()); + assertEquals("Latn", locale.getScript(), "builder"); // empty string is returned, not null, if there is no script locale = Locale.forLanguageTag("und"); - assertEquals("script is empty string", "", locale.getScript()); + assertEquals("", locale.getScript(), "script is empty string"); } @Test public void testGetExtension() { // forLanguageTag does NOT normalize to hyphen Locale locale = Locale.forLanguageTag("und-a-some_ex-tension"); - assertEquals("some_ex-tension", null, locale.getExtension('a')); + assertNull(locale.getExtension('a'), "some_ex-tension"); // regular extension locale = new Builder().setExtension('a', "some-ex-tension").build(); - assertEquals("builder", "some-ex-tension", locale.getExtension('a')); + assertEquals("some-ex-tension", locale.getExtension('a'), "builder"); // returns null if extension is not present - assertEquals("empty b", null, locale.getExtension('b')); + assertNull(locale.getExtension('b'), "empty b"); // throws exception if extension tag is illegal - new ExpectIAE() { public void call() { Locale.forLanguageTag("").getExtension('\uD800'); }}; + assertThrows(IllegalArgumentException.class, () -> Locale.forLanguageTag("").getExtension('\uD800')); // 'x' is not an extension, it's a private use tag, but it's accessed through this API locale = Locale.forLanguageTag("x-y-z-blork"); - assertEquals("x", "y-z-blork", locale.getExtension('x')); + assertEquals("y-z-blork", locale.getExtension('x'), "x"); } @Test public void testGetExtensionKeys() { Locale locale = Locale.forLanguageTag("und-a-xx-yy-b-zz-ww"); Set result = locale.getExtensionKeys(); - assertEquals("result size", 2, result.size()); - assertTrue("'a','b'", result.contains('a') && result.contains('b')); + assertEquals(2, result.size(), "result size"); + assertTrue(result.contains('a') && result.contains('b'), "'a','b'"); // result is not mutable - try { - result.add('x'); - fail("expected exception on add to extension key set"); - } - catch (UnsupportedOperationException e) { - // ok - } + assertThrows(UnsupportedOperationException.class, () -> result.add('x')); // returns empty set if no extensions locale = Locale.forLanguageTag("und"); - assertTrue("empty result", locale.getExtensionKeys().isEmpty()); + assertTrue(locale.getExtensionKeys().isEmpty(), "empty result"); } @Test public void testGetUnicodeLocaleAttributes() { Locale locale = Locale.forLanguageTag("en-US-u-abc-def"); Set attributes = locale.getUnicodeLocaleAttributes(); - assertEquals("number of attributes", 2, attributes.size()); - assertTrue("attribute abc", attributes.contains("abc")); - assertTrue("attribute def", attributes.contains("def")); + assertEquals(2, attributes.size(), "number of attributes"); + assertTrue(attributes.contains("abc"), "attribute abc"); + assertTrue(attributes.contains("def"), "attribute def"); locale = Locale.forLanguageTag("en-US-u-ca-gregory"); attributes = locale.getUnicodeLocaleAttributes(); - assertTrue("empty attributes", attributes.isEmpty()); + assertTrue(attributes.isEmpty(), "empty attributes"); } @Test public void testGetUnicodeLocaleType() { Locale locale = Locale.forLanguageTag("und-u-co-japanese-nu-thai"); - assertEquals("collation", "japanese", locale.getUnicodeLocaleType("co")); - assertEquals("numbers", "thai", locale.getUnicodeLocaleType("nu")); + assertEquals("japanese", locale.getUnicodeLocaleType("co"), "collation"); + assertEquals("thai", locale.getUnicodeLocaleType("nu"), "numbers"); // Unicode locale extension key is case insensitive - assertEquals("key case", "japanese", locale.getUnicodeLocaleType("Co")); + assertEquals("japanese", locale.getUnicodeLocaleType("Co"), "key case"); // if keyword is not present, returns null - assertEquals("locale keyword not present", null, locale.getUnicodeLocaleType("xx")); + assertNull(locale.getUnicodeLocaleType("xx"), "locale keyword not present"); // if no locale extension is set, returns null locale = Locale.forLanguageTag("und"); - assertEquals("locale extension not present", null, locale.getUnicodeLocaleType("co")); + assertNull(locale.getUnicodeLocaleType("co"), "locale extension not present"); // typeless keyword locale = Locale.forLanguageTag("und-u-kn"); - assertEquals("typeless keyword", "", locale.getUnicodeLocaleType("kn")); + assertEquals("", locale.getUnicodeLocaleType("kn"), "typeless keyword"); // invalid keys throw exception - new ExpectIAE() { public void call() { Locale.forLanguageTag("").getUnicodeLocaleType("q"); }}; - new ExpectIAE() { public void call() { Locale.forLanguageTag("").getUnicodeLocaleType("abcdefghi"); }}; + assertThrows(IllegalArgumentException.class, () -> Locale.forLanguageTag("").getUnicodeLocaleType("q")); + assertThrows(IllegalArgumentException.class, () -> Locale.forLanguageTag("").getUnicodeLocaleType("abcdefghi")); // null argument throws exception - new ExpectNPE() { public void call() { Locale.forLanguageTag("").getUnicodeLocaleType(null); }}; + assertThrows(NullPointerException.class, () -> Locale.forLanguageTag("").getUnicodeLocaleType(null)); } @Test public void testGetUnicodeLocaleKeys() { Locale locale = Locale.forLanguageTag("und-u-co-japanese-nu-thai"); Set result = locale.getUnicodeLocaleKeys(); - assertEquals("two keys", 2, result.size()); - assertTrue("co and nu", result.contains("co") && result.contains("nu")); + assertEquals(2, result.size(), "two keys"); + assertTrue(result.contains("co") && result.contains("nu"), "co and nu"); // result is not modifiable - try { - result.add("frobozz"); - fail("expected exception when add to locale key set"); - } - catch (UnsupportedOperationException e) { - // ok - } + assertThrows(UnsupportedOperationException.class, () -> result.add("frobozz")); } @Test public void testPrivateUseExtension() { Locale locale = Locale.forLanguageTag("x-y-x-blork-"); - assertEquals("blork", "y-x-blork", locale.getExtension(Locale.PRIVATE_USE_EXTENSION)); + assertEquals("y-x-blork", locale.getExtension(Locale.PRIVATE_USE_EXTENSION), "blork"); locale = Locale.forLanguageTag("und"); - assertEquals("no privateuse", null, locale.getExtension(Locale.PRIVATE_USE_EXTENSION)); + assertNull(locale.getExtension(Locale.PRIVATE_USE_EXTENSION), "no privateuse"); } @Test @@ -455,63 +444,63 @@ public class LocaleEnhanceTest { // lots of normalization to test here // test locales created using the constructor String[][] tests = { - // empty locale canonicalizes to 'und' - { "", "", "", "und" }, - // variant alone is not a valid Locale, but has a valid language tag - { "", "", "NewYork", "und-NewYork" }, - // standard valid locales - { "", "Us", "", "und-US" }, - { "", "US", "NewYork", "und-US-NewYork" }, - { "EN", "", "", "en" }, - { "EN", "", "NewYork", "en-NewYork" }, - { "EN", "US", "", "en-US" }, - { "EN", "US", "NewYork", "en-US-NewYork" }, - // underscore in variant will be emitted as multiple variant subtags - { "en", "US", "Newer_Yorker", "en-US-Newer-Yorker" }, - // invalid variant subtags are appended as private use - { "en", "US", "new_yorker", "en-US-x-lvariant-new-yorker" }, - // the first invalid variant subtags and following variant subtags are appended as private use - { "en", "US", "Windows_XP_Home", "en-US-Windows-x-lvariant-XP-Home" }, - // too long variant and following variant subtags disappear - { "en", "US", "WindowsVista_SP2", "en-US" }, - // invalid region subtag disappears - { "en", "USA", "", "en" }, - // invalid language tag disappears - { "e", "US", "", "und-US" }, - // three-letter language tags are not canonicalized - { "Eng", "", "", "eng" }, - // legacy languages canonicalize to modern equivalents - { "he", "IL", "", "he-IL" }, - { "iw", "IL", "", "he-IL" }, - { "yi", "DE", "", "yi-DE" }, - { "ji", "DE", "", "yi-DE" }, - { "id", "ID", "", "id-ID" }, - { "in", "ID", "", "id-ID" }, - // special values are converted on output - { "ja", "JP", "JP", "ja-JP-u-ca-japanese-x-lvariant-JP" }, - { "th", "TH", "TH", "th-TH-u-nu-thai-x-lvariant-TH" }, - { "no", "NO", "NY", "nn-NO" } + // empty locale canonicalizes to 'und' + {"", "", "", "und"}, + // variant alone is not a valid Locale, but has a valid language tag + {"", "", "NewYork", "und-NewYork"}, + // standard valid locales + {"", "Us", "", "und-US"}, + {"", "US", "NewYork", "und-US-NewYork"}, + {"EN", "", "", "en"}, + {"EN", "", "NewYork", "en-NewYork"}, + {"EN", "US", "", "en-US"}, + {"EN", "US", "NewYork", "en-US-NewYork"}, + // underscore in variant will be emitted as multiple variant subtags + {"en", "US", "Newer_Yorker", "en-US-Newer-Yorker"}, + // invalid variant subtags are appended as private use + {"en", "US", "new_yorker", "en-US-x-lvariant-new-yorker"}, + // the first invalid variant subtags and following variant subtags are appended as private use + {"en", "US", "Windows_XP_Home", "en-US-Windows-x-lvariant-XP-Home"}, + // too long variant and following variant subtags disappear + {"en", "US", "WindowsVista_SP2", "en-US"}, + // invalid region subtag disappears + {"en", "USA", "", "en"}, + // invalid language tag disappears + {"e", "US", "", "und-US"}, + // three-letter language tags are not canonicalized + {"Eng", "", "", "eng"}, + // legacy languages canonicalize to modern equivalents + {"he", "IL", "", "he-IL"}, + {"iw", "IL", "", "he-IL"}, + {"yi", "DE", "", "yi-DE"}, + {"ji", "DE", "", "yi-DE"}, + {"id", "ID", "", "id-ID"}, + {"in", "ID", "", "id-ID"}, + // special values are converted on output + {"ja", "JP", "JP", "ja-JP-u-ca-japanese-x-lvariant-JP"}, + {"th", "TH", "TH", "th-TH-u-nu-thai-x-lvariant-TH"}, + {"no", "NO", "NY", "nn-NO"} }; for (int i = 0; i < tests.length; ++i) { String[] test = tests[i]; Locale locale = Locale.of(test[0], test[1], test[2]); - assertEquals("case " + i, test[3], locale.toLanguageTag()); + assertEquals(test[3], locale.toLanguageTag(), "case " + i); } // test locales created from forLanguageTag String[][] tests1 = { - // case is normalized during the round trip - { "EN-us", "en-US" }, - { "en-Latn-US", "en-Latn-US" }, - // reordering Unicode locale extensions - { "de-u-co-phonebk-ca-gregory", "de-u-ca-gregory-co-phonebk" }, - // private use only language tag is preserved (no extra "und") - { "x-elmer", "x-elmer" }, - { "x-lvariant-JP", "x-lvariant-JP" }, + // case is normalized during the round trip + {"EN-us", "en-US"}, + {"en-Latn-US", "en-Latn-US"}, + // reordering Unicode locale extensions + {"de-u-co-phonebk-ca-gregory", "de-u-ca-gregory-co-phonebk"}, + // private use only language tag is preserved (no extra "und") + {"x-elmer", "x-elmer"}, + {"x-lvariant-JP", "x-lvariant-JP"}, }; for (String[] test : tests1) { Locale locale = Locale.forLanguageTag(test[0]); - assertEquals("case " + test[0], test[1], locale.toLanguageTag()); + assertEquals(test[1], locale.toLanguageTag(), "case " + test[0]); } } @@ -524,102 +513,101 @@ public class LocaleEnhanceTest { // sample private use tags) come from 4646bis Feb 29, 2009. String[][] tests = { - // private use tags only - { "x-abc", "x-abc" }, - { "x-a-b-c", "x-a-b-c" }, - { "x-a-12345678", "x-a-12345678" }, + // private use tags only + {"x-abc", "x-abc"}, + {"x-a-b-c", "x-a-b-c"}, + {"x-a-12345678", "x-a-12345678"}, - // legacy language tags with preferred mappings - { "i-ami", "ami" }, - { "i-bnn", "bnn" }, - { "i-hak", "hak" }, - { "i-klingon", "tlh" }, - { "i-lux", "lb" }, // two-letter tag - { "i-navajo", "nv" }, // two-letter tag - { "i-pwn", "pwn" }, - { "i-tao", "tao" }, - { "i-tay", "tay" }, - { "i-tsu", "tsu" }, - { "art-lojban", "jbo" }, - { "no-bok", "nb" }, - { "no-nyn", "nn" }, - { "sgn-BE-FR", "sfb" }, - { "sgn-BE-NL", "vgt" }, - { "sgn-CH-DE", "sgg" }, - { "zh-guoyu", "cmn" }, - { "zh-hakka", "hak" }, - { "zh-min-nan", "nan" }, - { "zh-xiang", "hsn" }, + // legacy language tags with preferred mappings + {"i-ami", "ami"}, + {"i-bnn", "bnn"}, + {"i-hak", "hak"}, + {"i-klingon", "tlh"}, + {"i-lux", "lb"}, // two-letter tag + {"i-navajo", "nv"}, // two-letter tag + {"i-pwn", "pwn"}, + {"i-tao", "tao"}, + {"i-tay", "tay"}, + {"i-tsu", "tsu"}, + {"art-lojban", "jbo"}, + {"no-bok", "nb"}, + {"no-nyn", "nn"}, + {"sgn-BE-FR", "sfb"}, + {"sgn-BE-NL", "vgt"}, + {"sgn-CH-DE", "sgg"}, + {"zh-guoyu", "cmn"}, + {"zh-hakka", "hak"}, + {"zh-min-nan", "nan"}, + {"zh-xiang", "hsn"}, - // irregular legacy language tags, no preferred mappings, drop illegal fields - // from end. If no subtag is mappable, fallback to 'und' - { "i-default", "en-x-i-default" }, - { "i-enochian", "x-i-enochian" }, - { "i-mingo", "see-x-i-mingo" }, - { "en-GB-oed", "en-GB-x-oed" }, - { "zh-min", "nan-x-zh-min" }, - { "cel-gaulish", "xtg-x-cel-gaulish" }, + // irregular legacy language tags, no preferred mappings, drop illegal fields + // from end. If no subtag is mappable, fallback to 'und' + {"i-default", "en-x-i-default"}, + {"i-enochian", "x-i-enochian"}, + {"i-mingo", "see-x-i-mingo"}, + {"en-GB-oed", "en-GB-x-oed"}, + {"zh-min", "nan-x-zh-min"}, + {"cel-gaulish", "xtg-x-cel-gaulish"}, }; for (int i = 0; i < tests.length; ++i) { String[] test = tests[i]; Locale locale = Locale.forLanguageTag(test[0]); - assertEquals("legacy language tag case " + i, test[1], locale.toLanguageTag()); + assertEquals(test[1], locale.toLanguageTag(), "legacy language tag case " + i); } // forLanguageTag ignores everything past the first place it encounters // a syntax error - tests = new String[][] { - { "valid", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-12345678-z" }, - { "segment of private use tag too long", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-123456789-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y" }, - { "segment of private use tag is empty", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y--12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y" }, - { "first segment of private use tag is empty", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x--y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def" }, - { "illegal extension tag", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-\uD800-y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def" }, - { "locale subtag with no value", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-x-y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-x-y-12345678-z" }, - { "locale key subtag invalid", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-123456789-def-x-y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc" }, - // locale key subtag invalid in earlier position, all following subtags - // dropped (and so the locale extension dropped as well) - { "locale key subtag invalid in earlier position", - "en-US-Newer-Yorker-a-bb-cc-dd-u-123456789-abc-bb-def-x-y-12345678-z", - "en-US-Newer-Yorker-a-bb-cc-dd" }, + tests = new String[][]{ + {"valid", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-12345678-z"}, + {"segment of private use tag too long", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y-123456789-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y"}, + {"segment of private use tag is empty", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y--12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x-y"}, + {"first segment of private use tag is empty", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-x--y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def"}, + {"illegal extension tag", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def-\uD800-y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-def"}, + {"locale subtag with no value", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-x-y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-bb-x-y-12345678-z"}, + {"locale key subtag invalid", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc-123456789-def-x-y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd-u-aa-abc"}, + // locale key subtag invalid in earlier position, all following subtags + // dropped (and so the locale extension dropped as well) + {"locale key subtag invalid in earlier position", + "en-US-Newer-Yorker-a-bb-cc-dd-u-123456789-abc-bb-def-x-y-12345678-z", + "en-US-Newer-Yorker-a-bb-cc-dd"}, }; for (int i = 0; i < tests.length; ++i) { String[] test = tests[i]; String msg = "syntax error case " + i + " " + test[0]; try { Locale locale = Locale.forLanguageTag(test[1]); - assertEquals(msg, test[2], locale.toLanguageTag()); - } - catch (IllegalArgumentException e) { + assertEquals(test[2], locale.toLanguageTag(), msg); + } catch (IllegalArgumentException e) { fail(msg + " caught exception: " + e); } } // duplicated extension are just ignored Locale locale = Locale.forLanguageTag("und-d-aa-00-bb-01-D-AA-10-cc-11-c-1234"); - assertEquals("extension", "aa-00-bb-01", locale.getExtension('d')); - assertEquals("extension c", "1234", locale.getExtension('c')); + assertEquals("aa-00-bb-01", locale.getExtension('d'), "extension"); + assertEquals("1234", locale.getExtension('c'), "extension c"); locale = Locale.forLanguageTag("und-U-ca-gregory-u-ca-japanese"); - assertEquals("Unicode extension", "ca-gregory", locale.getExtension(Locale.UNICODE_LOCALE_EXTENSION)); + assertEquals("ca-gregory", locale.getExtension(Locale.UNICODE_LOCALE_EXTENSION), "Unicode extension"); // redundant Unicode locale keys in an extension are ignored locale = Locale.forLanguageTag("und-u-aa-000-bb-001-bB-002-cc-003-c-1234"); - assertEquals("Unicode keywords", "aa-000-bb-001-cc-003", locale.getExtension(Locale.UNICODE_LOCALE_EXTENSION)); - assertEquals("Duplicated Unicode locake key followed by an extension", "1234", locale.getExtension('c')); + assertEquals("aa-000-bb-001-cc-003", locale.getExtension(Locale.UNICODE_LOCALE_EXTENSION), "Unicode keywords"); + assertEquals("1234", locale.getExtension('c'), "Duplicated Unicode locake key followed by an extension"); } @Test @@ -630,12 +618,12 @@ public class LocaleEnhanceTest { Locale oldLocale = Locale.getDefault(); Locale.setDefault(Locale.US); - assertEquals("latn US", "Latin", latnLocale.getDisplayScript()); - assertEquals("hans US", "Simplified", hansLocale.getDisplayScript()); + assertEquals("Latin", latnLocale.getDisplayScript(), "latn US"); + assertEquals("Simplified", hansLocale.getDisplayScript(), "hans US"); Locale.setDefault(Locale.GERMANY); - assertEquals("latn DE", "Lateinisch", latnLocale.getDisplayScript()); - assertEquals("hans DE", "Vereinfacht", hansLocale.getDisplayScript()); + assertEquals("Lateinisch", latnLocale.getDisplayScript(), "latn DE"); + assertEquals("Vereinfacht", hansLocale.getDisplayScript(), "hans DE"); Locale.setDefault(oldLocale); } @@ -645,11 +633,11 @@ public class LocaleEnhanceTest { Locale latnLocale = Locale.forLanguageTag("und-latn"); Locale hansLocale = Locale.forLanguageTag("und-hans"); - assertEquals("latn US", "Latin", latnLocale.getDisplayScript(Locale.US)); - assertEquals("hans US", "Simplified", hansLocale.getDisplayScript(Locale.US)); + assertEquals("Latin", latnLocale.getDisplayScript(Locale.US), "latn US"); + assertEquals("Simplified", hansLocale.getDisplayScript(Locale.US), "hans US"); - assertEquals("latn DE", "Lateinisch", latnLocale.getDisplayScript(Locale.GERMANY)); - assertEquals("hans DE", "Vereinfacht", hansLocale.getDisplayScript(Locale.GERMANY)); + assertEquals("Lateinisch", latnLocale.getDisplayScript(Locale.GERMANY), "latn DE"); + assertEquals("Vereinfacht", hansLocale.getDisplayScript(Locale.GERMANY), "hans DE"); } @Test @@ -695,10 +683,10 @@ public class LocaleEnhanceTest { for (int i = 0; i < testLocales.length; i++) { Locale loc = testLocales[i]; - assertEquals("English display name for " + loc.toLanguageTag(), - displayNameEnglish[i], loc.getDisplayName(Locale.ENGLISH)); - assertEquals("Simplified Chinese display name for " + loc.toLanguageTag(), - displayNameSimplifiedChinese[i], loc.getDisplayName(Locale.CHINA)); + assertEquals(displayNameEnglish[i], loc.getDisplayName(Locale.ENGLISH), + "English display name for " + loc.toLanguageTag()); + assertEquals(displayNameSimplifiedChinese[i], loc.getDisplayName(Locale.CHINA), + "Simplified Chinese display name for " + loc.toLanguageTag()); } } @@ -716,37 +704,33 @@ public class LocaleEnhanceTest { Locale locale = Locale.forLanguageTag(languageTag); Locale result = lenientBuilder - .setLocale(locale) - .build(); - assertEquals("long tag", target, result.toLanguageTag()); - assertEquals("long tag", locale, result); + .setLocale(locale) + .build(); + assertEquals(target, result.toLanguageTag(), "long tag"); + assertEquals(locale, result, "long tag"); // null is illegal - new BuilderNPE("locale") { - public void call() { b.setLocale(null); } - }; + assertThrows(NullPointerException.class, () -> builder.setLocale(null), + "Setting null locale should throw NPE"); // builder canonicalizes the three legacy locales: // ja_JP_JP, th_TH_TH, no_NY_NO. locale = builder.setLocale(Locale.of("ja", "JP", "JP")).build(); - assertEquals("ja_JP_JP languagetag", "ja-JP-u-ca-japanese", locale.toLanguageTag()); - assertEquals("ja_JP_JP variant", "", locale.getVariant()); + assertEquals("ja-JP-u-ca-japanese", locale.toLanguageTag(), "ja_JP_JP languagetag"); + assertEquals("", locale.getVariant(), "ja_JP_JP variant"); locale = builder.setLocale(Locale.of("th", "TH", "TH")).build(); - assertEquals("th_TH_TH languagetag", "th-TH-u-nu-thai", locale.toLanguageTag()); - assertEquals("th_TH_TH variant", "", locale.getVariant()); + assertEquals("th-TH-u-nu-thai", locale.toLanguageTag(), "th_TH_TH languagetag"); + assertEquals("", locale.getVariant(), "th_TH_TH variant"); locale = builder.setLocale(Locale.of("no", "NO", "NY")).build(); - assertEquals("no_NO_NY languagetag", "nn-NO", locale.toLanguageTag()); - assertEquals("no_NO_NY language", "nn", locale.getLanguage()); - assertEquals("no_NO_NY variant", "", locale.getVariant()); + assertEquals("nn-NO", locale.toLanguageTag(), "no_NO_NY languagetag"); + assertEquals("nn", locale.getLanguage(), "no_NO_NY language"); + assertEquals("", locale.getVariant(), "no_NO_NY variant"); // non-canonical, non-legacy locales are invalid - new BuilderILE("123_4567_89") { - public void call() { - b.setLocale(Locale.of("123", "4567", "89")); - } - }; + assertThrows(IllformedLocaleException.class, + () -> new Builder().setLocale(Locale.of("123", "4567", "89")), "123_4567_89"); } @Test @@ -755,16 +739,20 @@ public class LocaleEnhanceTest { String target = "en-Latn-US-NewYork-a-xx-b-yy-x-1-2-3"; Builder builder = new Builder(); String result = builder - .setLanguageTag(source) - .build() - .toLanguageTag(); - assertEquals("language", target, result); + .setLanguageTag(source) + .build() + .toLanguageTag(); + assertEquals(target, result, "language"); - // redundant extensions cause a failure - new BuilderILE() { public void call() { b.setLanguageTag("und-a-xx-yy-b-ww-A-00-11-c-vv"); }}; - - // redundant Unicode locale extension keys within an Unicode locale extension cause a failure - new BuilderILE() { public void call() { b.setLanguageTag("und-u-nu-thai-NU-chinese-xx-1234"); }}; + // redundant extensions are ignored + assertEquals("und-a-xx-yy-b-ww-c-vv", + new Builder().setLanguageTag("und-a-xx-yy-b-ww-A-00-11-c-vv").build().toLanguageTag()); + // redundant Unicode locale extension keys are ignored + assertEquals("und-u-cu-usd-nu-thai-xx-1234", + new Builder().setLanguageTag("und-u-nu-thai-cu-usd-NU-chinese-xx-1234").build().toLanguageTag()); + // redundant Unicode locale extension attributes are ignored + assertEquals("und-u-bar-foo", + new Builder().setLanguageTag("und-u-foo-bar-FOO").build().toLanguageTag()); } // Test the values that should clear the builder @@ -776,9 +764,9 @@ public class LocaleEnhanceTest { var bldr = new Builder(); bldr.setLanguageTag("en-US"); assertDoesNotThrow(() -> bldr.setLanguageTag(tag)); - assertEquals("Setting a %s language tag did not clear the builder" - .formatted(tag == null ? "null" : "empty"), - empty.build(), bldr.build()); + assertEquals(empty.build(), bldr.build(), + "Setting a %s language tag did not clear the builder" + .formatted(tag == null ? "null" : "empty")); } @Test @@ -789,18 +777,18 @@ public class LocaleEnhanceTest { String defaulted = ""; Builder builder = new Builder(); String result = builder - .setLanguage(source) - .build() - .getLanguage(); - assertEquals("en", target, result); + .setLanguage(source) + .build() + .getLanguage(); + assertEquals(target, result, "en"); // setting with empty resets result = builder - .setLanguage(target) - .setLanguage("") - .build() - .getLanguage(); - assertEquals("empty", defaulted, result); + .setLanguage(target) + .setLanguage("") + .build() + .getLanguage(); + assertEquals(defaulted, result, "empty"); // setting with null resets too result = builder @@ -808,23 +796,25 @@ public class LocaleEnhanceTest { .setLanguage(null) .build() .getLanguage(); - assertEquals("null", defaulted, result); + assertEquals(defaulted, result, "null"); // language codes must be 2-8 alpha // for forwards compatibility, 4-alpha and 5-8 alpha (registered) // languages are accepted syntax - new BuilderILE("q", "abcdefghi", "13") { public void call() { b.setLanguage(arg); }}; + for (String arg : List.of("q", "abcdefghi", "13")) { + assertThrows(IllformedLocaleException.class, () -> new Builder().setLanguage(arg)); + } // language code validation is NOT performed, any 2-8-alpha passes - assertNotNull("2alpha", builder.setLanguage("zz").build()); - assertNotNull("8alpha", builder.setLanguage("abcdefgh").build()); + assertNotNull(builder.setLanguage("zz").build(), "2alpha"); + assertNotNull(builder.setLanguage("abcdefgh").build(), "8alpha"); // three-letter language codes are NOT canonicalized to two-letter result = builder - .setLanguage("eng") - .build() - .getLanguage(); - assertEquals("eng", "eng", result); + .setLanguage("eng") + .build() + .getLanguage(); + assertEquals("eng", result, "eng"); } @Test @@ -835,18 +825,18 @@ public class LocaleEnhanceTest { String defaulted = ""; Builder builder = new Builder(); String result = builder - .setScript(source) - .build() - .getScript(); - assertEquals("script", target, result); + .setScript(source) + .build() + .getScript(); + assertEquals(target, result, "script"); // setting with empty resets result = builder - .setScript(target) - .setScript("") - .build() - .getScript(); - assertEquals("empty", defaulted, result); + .setScript(target) + .setScript("") + .build() + .getScript(); + assertEquals(defaulted, result, "empty"); // settting with null also resets result = builder @@ -854,14 +844,17 @@ public class LocaleEnhanceTest { .setScript(null) .build() .getScript(); - assertEquals("null", defaulted, result); + assertEquals(defaulted, result, "null"); // ill-formed script codes throw IAE // must be 4alpha - new BuilderILE("abc", "abcde", "l3tn") { public void call() { b.setScript(arg); }}; + for (String arg : List.of("abc", "abcde", "l3tn")) { + assertThrows(IllformedLocaleException.class, () -> new Builder().setScript(arg)); + } + // script code validation is NOT performed, any 4-alpha passes - assertEquals("4alpha", "Wxyz", builder.setScript("wxyz").build().getScript()); + assertEquals("Wxyz", builder.setScript("wxyz").build().getScript(), "4alpha"); } @Test @@ -872,18 +865,18 @@ public class LocaleEnhanceTest { String defaulted = ""; Builder builder = new Builder(); String result = builder - .setRegion(source) - .build() - .getCountry(); - assertEquals("us", target, result); + .setRegion(source) + .build() + .getCountry(); + assertEquals(target, result, "us"); // setting with empty resets result = builder - .setRegion(target) - .setRegion("") - .build() - .getCountry(); - assertEquals("empty", defaulted, result); + .setRegion(target) + .setRegion("") + .build() + .getCountry(); + assertEquals(defaulted, result, "empty"); // setting with null also resets result = builder @@ -891,15 +884,17 @@ public class LocaleEnhanceTest { .setRegion(null) .build() .getCountry(); - assertEquals("null", defaulted, result); + assertEquals(defaulted, result, "null"); // ill-formed region codes throw IAE // 2 alpha or 3 numeric - new BuilderILE("q", "abc", "12", "1234", "a3", "12a") { public void call() { b.setRegion(arg); }}; + for (String arg : List.of("q", "abc", "12", "1234", "a3", "12a")) { + assertThrows(IllformedLocaleException.class, () -> new Builder().setRegion(arg)); + } // region code validation is NOT performed, any 2-alpha or 3-digit passes - assertEquals("2alpha", "ZZ", builder.setRegion("ZZ").build().getCountry()); - assertEquals("3digit", "000", builder.setRegion("000").build().getCountry()); + assertEquals("ZZ", builder.setRegion("ZZ").build().getCountry(), "2alpha"); + assertEquals("000", builder.setRegion("000").build().getCountry(), "3digit"); } @Test @@ -910,31 +905,31 @@ public class LocaleEnhanceTest { String defaulted = ""; Builder builder = new Builder(); String result = builder - .setVariant(source) - .build() - .getVariant(); - assertEquals("NewYork", target, result); + .setVariant(source) + .build() + .getVariant(); + assertEquals(target, result, "NewYork"); result = builder - .setVariant("NeWeR_YoRkEr") - .build() - .toLanguageTag(); - assertEquals("newer yorker", "und-NeWeR-YoRkEr", result); + .setVariant("NeWeR_YoRkEr") + .build() + .toLanguageTag(); + assertEquals("und-NeWeR-YoRkEr", result, "newer yorker"); // subtags of variant are NOT reordered result = builder - .setVariant("zzzzz_yyyyy_xxxxx") - .build() - .getVariant(); - assertEquals("zyx", "zzzzz_yyyyy_xxxxx", result); + .setVariant("zzzzz_yyyyy_xxxxx") + .build() + .getVariant(); + assertEquals("zzzzz_yyyyy_xxxxx", result, "zyx"); // setting to empty resets result = builder - .setVariant(target) - .setVariant("") - .build() - .getVariant(); - assertEquals("empty", defaulted, result); + .setVariant(target) + .setVariant("") + .build() + .getVariant(); + assertEquals(defaulted, result, "empty"); // setting to null also resets result = builder @@ -942,17 +937,21 @@ public class LocaleEnhanceTest { .setVariant(null) .build() .getVariant(); - assertEquals("null", defaulted, result); + assertEquals(defaulted, result, "null"); // ill-formed variants throw IAE // digit followed by 3-7 characters, or alpha followed by 4-8 characters. - new BuilderILE("abcd", "abcdefghi", "1ab", "1abcdefgh") { public void call() { b.setVariant(arg); }}; + for (String arg : List.of("abcd", "abcdefghi", "1ab", "1abcdefgh")) { + assertThrows(IllformedLocaleException.class, () -> new Builder().setVariant(arg)); + } + // 4 characters is ok as long as the first is a digit - assertEquals("digit+3alpha", "1abc", builder.setVariant("1abc").build().getVariant()); + assertEquals("1abc", builder.setVariant("1abc").build().getVariant(), "digit+3alpha"); // all subfields must conform - new BuilderILE("abcde-fg") { public void call() { b.setVariant(arg); }}; + assertThrows(IllformedLocaleException.class, () -> new Builder().setVariant("abcde-fg")); + } @Test @@ -963,18 +962,18 @@ public class LocaleEnhanceTest { String target = "ab-abcdefgh-12-12345678"; Builder builder = new Builder(); String result = builder - .setExtension(sourceKey, sourceValue) - .build() - .getExtension(sourceKey); - assertEquals("extension", target, result); + .setExtension(sourceKey, sourceValue) + .build() + .getExtension(sourceKey); + assertEquals(target, result, "extension"); // setting with empty resets result = builder - .setExtension(sourceKey, sourceValue) - .setExtension(sourceKey, "") - .build() - .getExtension(sourceKey); - assertEquals("empty", null, result); + .setExtension(sourceKey, sourceValue) + .setExtension(sourceKey, "") + .build() + .getExtension(sourceKey); + assertNull(result, "empty"); // setting with null also resets result = builder @@ -982,100 +981,120 @@ public class LocaleEnhanceTest { .setExtension(sourceKey, null) .build() .getExtension(sourceKey); - assertEquals("null", null, result); + assertNull(result, "null"); // ill-formed extension keys throw IAE // must be in [0-9a-ZA-Z] - new BuilderILE("$") { public void call() { b.setExtension('$', sourceValue); }}; + assertThrows(IllformedLocaleException.class, + () -> new Builder().setExtension('$', sourceValue)); + // each segment of value must be 2-8 alphanum - new BuilderILE("ab-cd-123456789") { public void call() { b.setExtension(sourceKey, arg); }}; + assertThrows(IllformedLocaleException.class, + () -> new Builder().setExtension(sourceKey, "ab-cd-123456789")); + // no multiple hyphens. - new BuilderILE("ab--cd") { public void call() { b.setExtension(sourceKey, arg); }}; + assertThrows(IllformedLocaleException.class, + () -> new Builder().setExtension(sourceKey, "ab--cd")); + // locale extension key has special handling Locale locale = builder - .setExtension('u', "co-japanese") - .build(); - assertEquals("locale extension", "japanese", locale.getUnicodeLocaleType("co")); + .setExtension('u', "co-japanese") + .build(); + assertEquals("japanese", locale.getUnicodeLocaleType("co"), "locale extension"); // locale extension has same behavior with set locale keyword Locale locale2 = builder - .setUnicodeLocaleKeyword("co", "japanese") - .build(); - assertEquals("locales with extension", locale, locale2); + .setUnicodeLocaleKeyword("co", "japanese") + .build(); + assertEquals(locale, locale2, "locales with extension"); // setting locale extension overrides all previous calls to setLocaleKeyword Locale locale3 = builder - .setExtension('u', "xxx-nu-thai") - .build(); - assertEquals("remove co", null, locale3.getUnicodeLocaleType("co")); - assertEquals("override thai", "thai", locale3.getUnicodeLocaleType("nu")); - assertEquals("override attribute", 1, locale3.getUnicodeLocaleAttributes().size()); + .setExtension('u', "xxx-nu-thai") + .build(); + assertNull(locale3.getUnicodeLocaleType("co"), "remove co"); + assertEquals("thai", locale3.getUnicodeLocaleType("nu"), "override thai"); + assertEquals(1, locale3.getUnicodeLocaleAttributes().size(), "override attribute"); // setting locale keyword extends values already set by the locale extension Locale locale4 = builder - .setUnicodeLocaleKeyword("co", "japanese") - .build(); - assertEquals("extend", "japanese", locale4.getUnicodeLocaleType("co")); - assertEquals("extend", "thai", locale4.getUnicodeLocaleType("nu")); + .setUnicodeLocaleKeyword("co", "japanese") + .build(); + assertEquals("japanese", locale4.getUnicodeLocaleType("co"), "extend"); + assertEquals("thai", locale4.getUnicodeLocaleType("nu"), "extend"); // locale extension subtags are reordered result = builder - .clear() - .setExtension('u', "456-123-zz-123-yy-456-xx-789") - .build() - .toLanguageTag(); - assertEquals("reorder", "und-u-123-456-xx-789-yy-456-zz-123", result); + .clear() + .setExtension('u', "456-123-zz-123-yy-456-xx-789") + .build() + .toLanguageTag(); + assertEquals("und-u-123-456-xx-789-yy-456-zz-123", result, "reorder"); // multiple keyword types result = builder - .clear() - .setExtension('u', "nu-thai-foobar") - .build() - .getUnicodeLocaleType("nu"); - assertEquals("multiple types", "thai-foobar", result); + .clear() + .setExtension('u', "nu-thai-foobar") + .build() + .getUnicodeLocaleType("nu"); + assertEquals("thai-foobar", result, "multiple types"); // redundant locale extensions are ignored result = builder - .clear() - .setExtension('u', "nu-thai-NU-chinese-xx-1234") - .build() - .toLanguageTag(); - assertEquals("duplicate keys", "und-u-nu-thai-xx-1234", result); + .clear() + .setExtension('u', "nu-thai-NU-chinese-xx-1234") + .build() + .toLanguageTag(); + assertEquals("und-u-nu-thai-xx-1234", result, "duplicate keys"); + + // redundant locale attributes are ignored + result = builder + .clear() + .setExtension('u', "posix-posix") + .build() + .toLanguageTag(); + assertEquals("und-u-posix", result, "duplicate attributes"); } @Test public void testBuilderAddUnicodeLocaleAttribute() { Builder builder = new Builder(); Locale locale = builder - .addUnicodeLocaleAttribute("def") - .addUnicodeLocaleAttribute("abc") - .build(); + .addUnicodeLocaleAttribute("def") + .addUnicodeLocaleAttribute("abc") + .build(); Set uattrs = locale.getUnicodeLocaleAttributes(); - assertEquals("number of attributes", 2, uattrs.size()); - assertTrue("attribute abc", uattrs.contains("abc")); - assertTrue("attribute def", uattrs.contains("def")); + assertEquals(2, uattrs.size(), "number of attributes"); + assertTrue(uattrs.contains("abc"), "attribute abc"); + assertTrue(uattrs.contains("def"), "attribute def"); // remove attribute locale = builder.removeUnicodeLocaleAttribute("xxx") - .build(); + .build(); - assertEquals("remove bogus", 2, uattrs.size()); + uattrs = locale.getUnicodeLocaleAttributes(); + assertEquals(2, uattrs.size(), "remove bogus"); // add duplicate locale = builder.addUnicodeLocaleAttribute("abc") - .build(); - assertEquals("add duplicate", 2, uattrs.size()); + .build(); + uattrs = locale.getUnicodeLocaleAttributes(); + assertEquals(2, uattrs.size(), "add duplicate"); // null attribute throws NPE - new BuilderNPE("null attribute") { public void call() { b.addUnicodeLocaleAttribute(null); }}; - new BuilderNPE("null attribute removal") { public void call() { b.removeUnicodeLocaleAttribute(null); }}; + assertThrows(NullPointerException.class, + () -> new Builder().addUnicodeLocaleAttribute(null), "null attribute"); + + assertThrows(NullPointerException.class, + () -> new Builder().removeUnicodeLocaleAttribute(null), "null attribute removal"); // illformed attribute throws IllformedLocaleException - new BuilderILE("invalid attribute") { public void call() { b.addUnicodeLocaleAttribute("ca"); }}; + assertThrows(IllformedLocaleException.class, + () -> new Builder().addUnicodeLocaleAttribute("ca"), "invalid attribute"); } @Test @@ -1083,43 +1102,51 @@ public class LocaleEnhanceTest { // Note: most behavior is tested in testBuilderSetExtension Builder builder = new Builder(); Locale locale = builder - .setUnicodeLocaleKeyword("co", "japanese") - .setUnicodeLocaleKeyword("nu", "thai") - .build(); - assertEquals("co", "japanese", locale.getUnicodeLocaleType("co")); - assertEquals("nu", "thai", locale.getUnicodeLocaleType("nu")); - assertEquals("keys", 2, locale.getUnicodeLocaleKeys().size()); + .setUnicodeLocaleKeyword("co", "japanese") + .setUnicodeLocaleKeyword("nu", "thai") + .build(); + assertEquals("japanese", locale.getUnicodeLocaleType("co"), "co"); + assertEquals("thai", locale.getUnicodeLocaleType("nu"), "nu"); + assertEquals(2, locale.getUnicodeLocaleKeys().size(), "keys"); // can clear a keyword by setting to null, others remain String result = builder - .setUnicodeLocaleKeyword("co", null) - .build() - .toLanguageTag(); - assertEquals("empty co", "und-u-nu-thai", result); + .setUnicodeLocaleKeyword("co", null) + .build() + .toLanguageTag(); + assertEquals("und-u-nu-thai", result, "empty co"); // locale keyword extension goes when all keywords are gone result = builder - .setUnicodeLocaleKeyword("nu", null) - .build() - .toLanguageTag(); - assertEquals("empty nu", "und", result); + .setUnicodeLocaleKeyword("nu", null) + .build() + .toLanguageTag(); + assertEquals("und", result, "empty nu"); // locale keywords are ordered independent of order of addition result = builder - .setUnicodeLocaleKeyword("zz", "012") - .setUnicodeLocaleKeyword("aa", "345") - .build() - .toLanguageTag(); - assertEquals("reordered", "und-u-aa-345-zz-012", result); + .setUnicodeLocaleKeyword("zz", "012") + .setUnicodeLocaleKeyword("aa", "345") + .build() + .toLanguageTag(); + assertEquals("und-u-aa-345-zz-012", result, "reordered"); // null keyword throws NPE - new BuilderNPE("keyword") { public void call() { b.setUnicodeLocaleKeyword(null, "thai"); }}; + assertThrows(NullPointerException.class, + () -> new Builder().setUnicodeLocaleKeyword(null, "thai"), "keyword"); + // well-formed keywords are two alphanum - new BuilderILE("a", "abc") { public void call() { b.setUnicodeLocaleKeyword(arg, "value"); }}; + for (String arg : List.of("a", "abc")) { + assertThrows(IllformedLocaleException.class, + () -> new Builder().setUnicodeLocaleKeyword(arg, "value")); + } // well-formed values are 3-8 alphanum - new BuilderILE("ab", "abcdefghi") { public void call() { b.setUnicodeLocaleKeyword("ab", arg); }}; + for (String arg : List.of("ab", "abcdefghi")) { + assertThrows(IllformedLocaleException.class, + () -> new Builder().setUnicodeLocaleKeyword("ab", arg)); + } } @Test @@ -1129,13 +1156,15 @@ public class LocaleEnhanceTest { String target = "c-b-a"; Builder builder = new Builder(); String result = builder - .setExtension(Locale.PRIVATE_USE_EXTENSION, source) - .build() - .getExtension(Locale.PRIVATE_USE_EXTENSION); - assertEquals("abc", target, result); + .setExtension(Locale.PRIVATE_USE_EXTENSION, source) + .build() + .getExtension(Locale.PRIVATE_USE_EXTENSION); + assertEquals(target, result, "abc"); // multiple hyphens are ill-formed - new BuilderILE("a--b") { public void call() { b.setExtension(Locale.PRIVATE_USE_EXTENSION, arg); }}; + assertThrows(IllformedLocaleException.class, + () -> new Builder().setExtension(Locale.PRIVATE_USE_EXTENSION, "a--b"), + "multiple-hyphens should throw IAE"); } @Test @@ -1144,11 +1173,11 @@ public class LocaleEnhanceTest { Builder builder = new Builder(); Locale locale = Locale.forLanguageTag(monster); String result = builder - .setLocale(locale) - .clear() - .build() - .toLanguageTag(); - assertEquals("clear", "und", result); + .setLocale(locale) + .clear() + .build() + .toLanguageTag(); + assertEquals("und", result, "clear"); } @Test @@ -1164,33 +1193,33 @@ public class LocaleEnhanceTest { @Test public void testSerialize() { final Locale[] testLocales = { - Locale.ROOT, - Locale.ENGLISH, - Locale.US, - Locale.of("en", "US", "Win"), - Locale.of("en", "US", "Win_XP"), - Locale.JAPAN, - Locale.of("ja", "JP", "JP"), - Locale.of("th", "TH"), - Locale.of("th", "TH", "TH"), - Locale.of("no", "NO"), - Locale.of("nb", "NO"), - Locale.of("nn", "NO"), - Locale.of("no", "NO", "NY"), - Locale.of("nn", "NO", "NY"), - Locale.of("he", "IL"), - Locale.of("he", "IL", "var"), - Locale.of("Language", "Country", "Variant"), - Locale.of("", "US"), - Locale.of("", "", "Java"), - Locale.forLanguageTag("en-Latn-US"), - Locale.forLanguageTag("zh-Hans"), - Locale.forLanguageTag("zh-Hant-TW"), - Locale.forLanguageTag("ja-JP-u-ca-japanese"), - Locale.forLanguageTag("und-Hant"), - Locale.forLanguageTag("und-a-123-456"), - Locale.forLanguageTag("en-x-java"), - Locale.forLanguageTag("th-TH-u-ca-buddist-nu-thai-x-lvariant-TH"), + Locale.ROOT, + Locale.ENGLISH, + Locale.US, + Locale.of("en", "US", "Win"), + Locale.of("en", "US", "Win_XP"), + Locale.JAPAN, + Locale.of("ja", "JP", "JP"), + Locale.of("th", "TH"), + Locale.of("th", "TH", "TH"), + Locale.of("no", "NO"), + Locale.of("nb", "NO"), + Locale.of("nn", "NO"), + Locale.of("no", "NO", "NY"), + Locale.of("nn", "NO", "NY"), + Locale.of("he", "IL"), + Locale.of("he", "IL", "var"), + Locale.of("Language", "Country", "Variant"), + Locale.of("", "US"), + Locale.of("", "", "Java"), + Locale.forLanguageTag("en-Latn-US"), + Locale.forLanguageTag("zh-Hans"), + Locale.forLanguageTag("zh-Hant-TW"), + Locale.forLanguageTag("ja-JP-u-ca-japanese"), + Locale.forLanguageTag("und-Hant"), + Locale.forLanguageTag("und-a-123-456"), + Locale.forLanguageTag("en-x-java"), + Locale.forLanguageTag("th-TH-u-ca-buddist-nu-thai-x-lvariant-TH"), }; for (Locale locale : testLocales) { @@ -1205,7 +1234,7 @@ public class LocaleEnhanceTest { ObjectInputStream ois = new ObjectInputStream(bis); Object o = ois.readObject(); - assertEquals("roundtrip " + locale, locale, o); + assertEquals(locale, o, "roundtrip " + locale); } catch (Exception e) { fail(locale + " encountered exception:" + e.getLocalizedMessage()); } @@ -1231,11 +1260,9 @@ public class LocaleEnhanceTest { } if (dataDir == null) { - fail("'dataDir' is null. serialized.data.dir Property value is "+dataDirName); - return; + fail("'dataDir' is null. serialized.data.dir Property value is " + dataDirName); } else if (!dataDir.isDirectory()) { - fail("'dataDir' is not a directory. dataDir: "+dataDir.toString()); - return; + fail("'dataDir' is not a directory. dataDir: " + dataDir.toString()); } File[] files = dataDir.listFiles(); @@ -1261,10 +1288,9 @@ public class LocaleEnhanceTest { // deserialize try (FileInputStream fis = new FileInputStream(testfile); - ObjectInputStream ois = new ObjectInputStream(fis)) - { + ObjectInputStream ois = new ObjectInputStream(fis)) { Object o = ois.readObject(); - assertEquals("Deserialize Java 6 Locale " + locale, o, locale); + assertEquals(o, locale, "Deserialize Java 6 Locale " + locale); } catch (Exception e) { fail("Exception while reading " + testfile.getAbsolutePath() + " - " + e.getMessage()); } @@ -1284,15 +1310,15 @@ public class LocaleEnhanceTest { // extension "nu-thai". // String[][] testdata = { - {"ja-JP-x-lvariant-JP", "ja-JP-u-ca-japanese-x-lvariant-JP"}, // special case 1 - {"ja-JP-x-lvariant-JP-XXX"}, - {"ja-JP-u-ca-japanese-x-lvariant-JP"}, - {"ja-JP-u-ca-gregory-x-lvariant-JP"}, - {"ja-JP-u-cu-jpy-x-lvariant-JP"}, - {"ja-x-lvariant-JP"}, - {"th-TH-x-lvariant-TH", "th-TH-u-nu-thai-x-lvariant-TH"}, // special case 2 - {"th-TH-u-nu-thai-x-lvariant-TH"}, - {"en-US-x-lvariant-JP"}, + {"ja-JP-x-lvariant-JP", "ja-JP-u-ca-japanese-x-lvariant-JP"}, // special case 1 + {"ja-JP-x-lvariant-JP-XXX"}, + {"ja-JP-u-ca-japanese-x-lvariant-JP"}, + {"ja-JP-u-ca-gregory-x-lvariant-JP"}, + {"ja-JP-u-cu-jpy-x-lvariant-JP"}, + {"ja-x-lvariant-JP"}, + {"th-TH-x-lvariant-TH", "th-TH-u-nu-thai-x-lvariant-TH"}, // special case 2 + {"th-TH-u-nu-thai-x-lvariant-TH"}, + {"en-US-x-lvariant-JP"}, }; Builder bldr = new Builder(); @@ -1304,22 +1330,22 @@ public class LocaleEnhanceTest { // forLanguageTag Locale loc = Locale.forLanguageTag(in); String out = loc.toLanguageTag(); - assertEquals("Language tag roundtrip by forLanguageTag with input: " + in, expected, out); + assertEquals(expected, out, "Language tag roundtrip by forLanguageTag with input: " + in); // setLanguageTag bldr.clear(); bldr.setLanguageTag(in); loc = bldr.build(); out = loc.toLanguageTag(); - assertEquals("Language tag roundtrip by Builder.setLanguageTag with input: " + in, expected, out); + assertEquals(expected, out, "Language tag roundtrip by Builder.setLanguageTag with input: " + in); } } @Test public void testBug7023613() { String[][] testdata = { - {"en-Latn", "en__#Latn"}, - {"en-u-ca-japanese", "en__#u-ca-japanese"}, + {"en-Latn", "en__#Latn"}, + {"en-u-ca-japanese", "en__#u-ca-japanese"}, }; for (String[] data : testdata) { @@ -1328,7 +1354,7 @@ public class LocaleEnhanceTest { Locale loc = Locale.forLanguageTag(in); String out = loc.toString(); - assertEquals("Empty country field with non-empty script/extension with input: " + in, expected, out); + assertEquals(expected, out, "Empty country field with non-empty script/extension with input: " + in); } } @@ -1342,7 +1368,7 @@ public class LocaleEnhanceTest { checkCalendar(Locale.of("ja", "JP", "JP"), "java.util.JapaneseImperialCalendar"); checkCalendar(Locale.of("ja", "jp", "JP"), "java.util.JapaneseImperialCalendar"); checkCalendar(Locale.forLanguageTag("en-u-ca-japanese"), - "java.util.JapaneseImperialCalendar"); + "java.util.JapaneseImperialCalendar"); checkDigit(Locale.of("th", "TH", "th"), '0'); checkDigit(Locale.of("th", "th", "th"), '0'); @@ -1353,151 +1379,12 @@ public class LocaleEnhanceTest { private void checkCalendar(Locale loc, String expected) { Calendar cal = Calendar.getInstance(loc); - assertEquals("Wrong calendar", expected, cal.getClass().getName()); + assertEquals(expected, cal.getClass().getName(), "Wrong calendar"); } private void checkDigit(Locale loc, Character expected) { DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(loc); Character zero = dfs.getZeroDigit(); - assertEquals("Wrong digit zero char", expected, zero); - } - - /// - /// utility asserts - /// - - private void assertTrue(String msg, boolean v) { - if (!v) { - fail(msg + ": expected true"); - } - } - - private void assertFalse(String msg, boolean v) { - if (v) { - fail(msg + ": expected false"); - } - } - - private void assertEquals(String msg, Object e, Object v) { - if (e == null ? v != null : !e.equals(v)) { - if (e != null) { - e = "'" + e + "'"; - } - if (v != null) { - v = "'" + v + "'"; - } - fail(msg + ": expected " + e + " but got " + v); - } - } - - private void assertNotEquals(String msg, Object e, Object v) { - if (e == null ? v == null : e.equals(v)) { - if (e != null) { - e = "'" + e + "'"; - } - fail(msg + ": expected not equal " + e); - } - } - - private void assertNull(String msg, Object o) { - if (o != null) { - fail(msg + ": expected null but got '" + o + "'"); - } - } - - private void assertNotNull(String msg, Object o) { - if (o == null) { - fail(msg + ": expected non null"); - } - } - - // not currently used, might get rid of exceptions from the API - private abstract class ExceptionTest { - private final Class exceptionClass; - - ExceptionTest(Class exceptionClass) { - this.exceptionClass = exceptionClass; - } - - public void run() { - String failMsg = null; - try { - call(); - failMsg = "expected " + exceptionClass.getName() + " but no exception thrown."; - } - catch (Exception e) { - if (!exceptionClass.isAssignableFrom(e.getClass())) { - failMsg = "expected " + exceptionClass.getName() + " but caught " + e; - } - } - if (failMsg != null) { - String msg = message(); - msg = msg == null ? "" : msg + " "; - fail(msg + failMsg); - } - } - - public String message() { - return null; - } - - public abstract void call(); - } - - private abstract class ExpectNPE extends ExceptionTest { - ExpectNPE() { - super(NullPointerException.class); - run(); - } - } - - private abstract class BuilderNPE extends ExceptionTest { - protected final String msg; - protected final Builder b = new Builder(); - - BuilderNPE(String msg) { - super(NullPointerException.class); - - this.msg = msg; - - run(); - } - - public String message() { - return msg; - } - } - - private abstract class ExpectIAE extends ExceptionTest { - ExpectIAE() { - super(IllegalArgumentException.class); - run(); - } - } - - private abstract class BuilderILE extends ExceptionTest { - protected final String[] args; - protected final Builder b = new Builder(); - - protected String arg; // mutates during call - - BuilderILE(String... args) { - super(IllformedLocaleException.class); - - this.args = args; - - run(); - } - - public void run() { - for (String arg : args) { - this.arg = arg; - super.run(); - } - } - - public String message() { - return "arg: '" + arg + "'"; - } + assertEquals(expected, zero, "Wrong digit zero char"); } } From f84be36dd59ae6b00aea334944b8266ecf8f5cbd Mon Sep 17 00:00:00 2001 From: William Kemper Date: Fri, 17 Oct 2025 16:54:20 +0000 Subject: [PATCH 185/561] 8241066: Shenandoah: fix or cleanup SH::do_full_collection Reviewed-by: shade --- src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index b2fd32d2fd0..84f5c3362ac 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -1576,8 +1576,8 @@ void ShenandoahHeap::collect_as_vm_thread(GCCause::Cause cause) { // cycle. We _could_ cancel the concurrent cycle and then try to run a cycle directly // on the VM thread, but this would confuse the control thread mightily and doesn't // seem worth the trouble. Instead, we will have the caller thread run (and wait for) a - // concurrent cycle in the prologue of the heap inspect/dump operation. This is how - // other concurrent collectors in the JVM handle this scenario as well. + // concurrent cycle in the prologue of the heap inspect/dump operation (see VM_HeapDumper::doit_prologue). + // This is how other concurrent collectors in the JVM handle this scenario as well. assert(Thread::current()->is_VM_thread(), "Should be the VM thread"); guarantee(cause == GCCause::_heap_dump || cause == GCCause::_heap_inspection, "Invalid cause"); } @@ -1587,7 +1587,10 @@ void ShenandoahHeap::collect(GCCause::Cause cause) { } void ShenandoahHeap::do_full_collection(bool clear_all_soft_refs) { - //assert(false, "Shouldn't need to do full collections"); + // This method is only called by `CollectedHeap::collect_as_vm_thread`, which we have + // overridden to do nothing. See the comment there for an explanation of how heap inspections + // work for Shenandoah. + ShouldNotReachHere(); } HeapWord* ShenandoahHeap::block_start(const void* addr) const { From a3e41ea6c60eb278da93dbc2daf940f0dc9abd11 Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen Date: Fri, 17 Oct 2025 17:17:03 +0000 Subject: [PATCH 186/561] 8368681: Shenandoah: Add documentation comments for ShenandoahAllocationRate Reviewed-by: wkemper, xpeng --- .../shenandoahAdaptiveHeuristics.hpp | 39 +++++++++++++++++++ .../gc/shenandoah/shenandoahGeneration.hpp | 5 +++ 2 files changed, 44 insertions(+) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp index 014a4d99131..66bfc3375a3 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahAdaptiveHeuristics.hpp @@ -32,25 +32,62 @@ #include "memory/allocation.hpp" #include "utilities/numberSeq.hpp" +/** + * ShenanoahAllocationRate maintains a truncated history of recently sampled allocation rates for the purpose of providing + * informed estimates of current and future allocation rates based on weighted averages and standard deviations of the + * truncated history. More recently sampled allocations are weighted more heavily than older samples when computing + * averages and standard deviations. + */ class ShenandoahAllocationRate : public CHeapObj { public: explicit ShenandoahAllocationRate(); + + // Reset the _last_sample_value to zero, _last_sample_time to current time. void allocation_counter_reset(); + // Force an allocation rate sample to be taken, even if the time since last sample is not greater than + // 1s/ShenandoahAdaptiveSampleFrequencyHz, except when current_time - _last_sample_time < MinSampleTime (2 ms). + // The sampled allocation rate is computed from (allocated - _last_sample_value) / (current_time - _last_sample_time). + // Return the newly computed rate if the sample is taken, zero if it is not an appropriate time to add a sample. + // In the case that a new sample is not taken, overwrite unaccounted_bytes_allocated with bytes allocated since + // the previous sample was taken (allocated - _last_sample_value). Otherwise, overwrite unaccounted_bytes_allocated + // with 0. double force_sample(size_t allocated, size_t &unaccounted_bytes_allocated); + + // Add an allocation rate sample if the time since last sample is greater than 1s/ShenandoahAdaptiveSampleFrequencyHz. + // The sampled allocation rate is computed from (allocated - _last_sample_value) / (current_time - _last_sample_time). + // Return the newly computed rate if the sample is taken, zero if it is not an appropriate time to add a sample. double sample(size_t allocated); + // Return an estimate of the upper bound on allocation rate, with the upper bound computed as the weighted average + // of recently sampled instantaneous allocation rates added to sds times the standard deviation computed for the + // sequence of recently sampled average allocation rates. double upper_bound(double sds) const; + + // Test whether rate significantly diverges from the computed average allocation rate. If so, return true. + // Otherwise, return false. Significant divergence is recognized if (rate - _rate.avg()) / _rate.sd() > threshold. bool is_spiking(double rate, double threshold) const; private: + // Return the instantaneous rate calculated from (allocated - _last_sample_value) / (time - _last_sample_time). + // Return Sentinel value 0.0 if (time - _last_sample_time) == 0 or if (allocated <= _last_sample_value). double instantaneous_rate(double time, size_t allocated) const; + // Time at which previous allocation rate sample was collected. double _last_sample_time; + + // Bytes allocated as of the time at which previous allocation rate sample was collected. size_t _last_sample_value; + + // The desired interval of time between consecutive samples of the allocation rate. double _interval_sec; + + // Holds a sequence of the most recently sampled instantaneous allocation rates TruncatedSeq _rate; + + // Holds a sequence of the most recently computed weighted average of allocation rates, with each weighted average + // computed immediately after an instantaneous rate was sampled TruncatedSeq _rate_avg; }; @@ -154,6 +191,8 @@ protected: } public: + // Sample the allocation rate at GC trigger time if possible. Return the number of allocated bytes that were + // not accounted for in the sample. This must be called before resetting bytes allocated since gc start. virtual size_t force_alloc_rate_sample(size_t bytes_allocated) override { size_t unaccounted_bytes; _allocation_rate.force_sample(bytes_allocated, unaccounted_bytes); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp index e6597b3c1e4..76e4412cfed 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp @@ -142,6 +142,11 @@ private: size_t soft_available() const override; size_t bytes_allocated_since_gc_start() const override; + + // Reset the bytes allocated within this generation since the start of GC. The argument initial_bytes_allocated + // is normally zero. In the case that some memory was allocated following the last allocation rate sample that + // precedes the start of GC, the number of bytes allocated is supplied as the initial value of bytes_allocated_since_gc_start. + // We will behave as if these bytes were allocated after the start of GC. void reset_bytes_allocated_since_gc_start(size_t initial_bytes_allocated); void increase_allocated(size_t bytes); From 0103f21635f00d7b4ece0d667cc5c276613d41ff Mon Sep 17 00:00:00 2001 From: Phil Race Date: Fri, 17 Oct 2025 17:57:21 +0000 Subject: [PATCH 187/561] 8365077: java.awt.font.NumericShaper violates equals/hashCode contract Reviewed-by: kizune, psadhukhan --- .../classes/java/awt/font/NumericShaper.java | 28 ++++--- .../awt/font/NumericShaper/NSEqualsTest.java | 84 +++++++++++++++++++ 2 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java diff --git a/src/java.desktop/share/classes/java/awt/font/NumericShaper.java b/src/java.desktop/share/classes/java/awt/font/NumericShaper.java index ae507036112..99b59cc2e0e 100644 --- a/src/java.desktop/share/classes/java/awt/font/NumericShaper.java +++ b/src/java.desktop/share/classes/java/awt/font/NumericShaper.java @@ -346,6 +346,19 @@ public final class NumericShaper implements java.io.Serializable { return index < NUM_KEYS ? Range.values()[index] : null; } + private static int toRangeHash(Set ranges) { + int m = 0; + for (Range range : ranges) { + int index = range.ordinal(); + if (index < NUM_KEYS) { + m |= 1 << index; + } else { + m |= (1 << NUM_KEYS) + index; + } + } + return m; + } + private static int toRangeMask(Set ranges) { int m = 0; for (Range range : ranges) { @@ -576,7 +589,7 @@ public final class NumericShaper implements java.io.Serializable { // and a linear probe is ok. private static int ctCache = 0; - private static int ctCacheLimit = contexts.length - 2; + private static final int ctCacheLimit = contexts.length - 2; // warning, synchronize access to this as it modifies state private static int getContextKey(char c) { @@ -1510,6 +1523,9 @@ public final class NumericShaper implements java.io.Serializable { private NumericShaper(int key, int mask) { this.key = key; this.mask = mask; + if (((this.mask & ARABIC) != 0) && ((this.mask & EASTERN_ARABIC) != 0)) { + this.mask &= ~ARABIC; + } } private NumericShaper(Range defaultContext, Set ranges) { @@ -1795,15 +1811,7 @@ public final class NumericShaper implements java.io.Serializable { * @see java.lang.Object#hashCode */ public int hashCode() { - int hash = mask; - if (rangeSet != null) { - // Use the CONTEXTUAL_MASK bit only for the enum-based - // NumericShaper. A deserialized NumericShaper might have - // bit masks. - hash &= CONTEXTUAL_MASK; - hash ^= rangeSet.hashCode(); - } - return hash; + return (rangeSet != null) ? Range.toRangeHash(rangeSet) : (mask & ~CONTEXTUAL_MASK); } /** diff --git a/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java b/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java new file mode 100644 index 00000000000..6af73b7efa2 --- /dev/null +++ b/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java @@ -0,0 +1,84 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8365077 + * @summary confirm that an instance which is created with Enum ranges is + * equal to another instance which is created with equivalent traditional + * ranges, and that in such a case the hashCodes are also equal. + */ + +import java.awt.font.NumericShaper; +import java.awt.font.NumericShaper.Range; +import static java.awt.font.NumericShaper.Range.*; +import java.util.EnumSet; + +public class NSEqualsTest { + + public static void main(String[] args) { + + for (Range r1 : Range.values()) { + test(r1); + for (Range r2 : Range.values()) { + test(r1, r2); + } + } + } + + static void test(Range r) { + if (r.ordinal() > MONGOLIAN.ordinal()) { + return; + } + int o = 1 << r.ordinal(); + NumericShaper nsr = NumericShaper.getContextualShaper(EnumSet.of(r)); + NumericShaper nso = NumericShaper.getContextualShaper(o); + printAndCompare(nsr, nso); + } + + static void test(Range r1, Range r2) { + if (r1.ordinal() > MONGOLIAN.ordinal() || r2.ordinal() > MONGOLIAN.ordinal()) { + return; + } + int o1 = 1 << r1.ordinal(); + int o2 = 1 << r2.ordinal(); + + NumericShaper nsr = NumericShaper.getContextualShaper(EnumSet.of(r1, r2)); + NumericShaper nso = NumericShaper.getContextualShaper(o1 | o2); + printAndCompare(nsr, nso); + } + + static void printAndCompare(NumericShaper nsr, NumericShaper nso) { + System.err.println(nsr); + System.err.println(nso); + System.err.println(nsr.hashCode() + " vs " + nso.hashCode() + + " equal: " + nsr.equals(nso)); + if (!nsr.equals(nso)) { + throw new RuntimeException("Expected equal"); + } + if (nsr.hashCode() != nso.hashCode()) { + throw new RuntimeException("Different hash codes:"); + } + } +} + From 0cb8ccd89a659eaf1e245cfb7f8c32fb16bff4c7 Mon Sep 17 00:00:00 2001 From: Chad Rakoczy Date: Fri, 17 Oct 2025 18:03:01 +0000 Subject: [PATCH 188/561] 8369642: [ubsan] nmethod::nmethod null pointer passed as argument 2 to memcpy Reviewed-by: kvn, mbaesken --- src/hotspot/share/code/nmethod.cpp | 28 ++++++++++++++++------------ src/hotspot/share/code/nmethod.hpp | 8 ++++---- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 7274b627f3e..94e11b00e9a 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1147,7 +1147,7 @@ nmethod* nmethod::new_nmethod(const methodHandle& method, + align_up(speculations_len , oopSize) #endif + align_up(debug_info->data_size() , oopSize) - + align_up(ImmutableDataReferencesCounterSize, oopSize); + + ImmutableDataReferencesCounterSize; // First, allocate space for immutable data in C heap. address immutable_data = nullptr; @@ -1322,6 +1322,7 @@ nmethod::nmethod( #if INCLUDE_JVMCI _speculations_offset = 0; #endif + _immutable_data_reference_counter_offset = 0; code_buffer->copy_code_and_locs_to(this); code_buffer->copy_values_to(this); @@ -1420,15 +1421,6 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. _method = nm._method; _osr_link = nullptr; - // Increment number of references to immutable data to share it between nmethods - _immutable_data_size = nm._immutable_data_size; - if (_immutable_data_size > 0) { - _immutable_data = nm._immutable_data; - set_immutable_data_references_counter(get_immutable_data_references_counter() + 1); - } else { - _immutable_data = blob_end(); - } - _exception_cache = nullptr; _gc_data = nullptr; _oops_do_mark_nmethods = nullptr; @@ -1444,6 +1436,7 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. _entry_offset = nm._entry_offset; _verified_entry_offset = nm._verified_entry_offset; _entry_bci = nm._entry_bci; + _immutable_data_size = nm._immutable_data_size; _skipped_instructions_size = nm._skipped_instructions_size; _stub_offset = nm._stub_offset; @@ -1462,6 +1455,15 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. #if INCLUDE_JVMCI _speculations_offset = nm._speculations_offset; #endif + _immutable_data_reference_counter_offset = nm._immutable_data_reference_counter_offset; + + // Increment number of references to immutable data to share it between nmethods + if (_immutable_data_size > 0) { + _immutable_data = nm._immutable_data; + set_immutable_data_references_counter(get_immutable_data_references_counter() + 1); + } else { + _immutable_data = blob_end(); + } _orig_pc_offset = nm._orig_pc_offset; _compile_id = nm._compile_id; @@ -1751,9 +1753,11 @@ nmethod::nmethod( #if INCLUDE_JVMCI _speculations_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize); - DEBUG_ONLY( int immutable_data_end_offset = _speculations_offset + align_up(speculations_len, oopSize) + align_up(ImmutableDataReferencesCounterSize, oopSize); ) + _immutable_data_reference_counter_offset = _speculations_offset + align_up(speculations_len, oopSize); + DEBUG_ONLY( int immutable_data_end_offset = _immutable_data_reference_counter_offset + ImmutableDataReferencesCounterSize; ) #else - DEBUG_ONLY( int immutable_data_end_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize) + align_up(ImmutableDataReferencesCounterSize, oopSize); ) + _immutable_data_reference_counter_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize); + DEBUG_ONLY( int immutable_data_end_offset = _immutable_data_reference_counter_offset + ImmutableDataReferencesCounterSize; ) #endif assert(immutable_data_end_offset <= immutable_data_size, "wrong read-only data size: %d > %d", immutable_data_end_offset, immutable_data_size); diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 2332766a47c..883be718b59 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -250,6 +250,7 @@ class nmethod : public CodeBlob { #if INCLUDE_JVMCI int _speculations_offset; #endif + int _immutable_data_reference_counter_offset; // location in frame (offset for sp) that deopt can store the original // pc during a deopt. @@ -646,12 +647,11 @@ public: #if INCLUDE_JVMCI address scopes_data_end () const { return _immutable_data + _speculations_offset ; } address speculations_begin () const { return _immutable_data + _speculations_offset ; } - address speculations_end () const { return immutable_data_end() - ImmutableDataReferencesCounterSize ; } + address speculations_end () const { return _immutable_data + _immutable_data_reference_counter_offset ; } #else - address scopes_data_end () const { return immutable_data_end() - ImmutableDataReferencesCounterSize ; } + address scopes_data_end () const { return _immutable_data + _immutable_data_reference_counter_offset ; } #endif - - address immutable_data_references_counter_begin () const { return immutable_data_end() - ImmutableDataReferencesCounterSize ; } + address immutable_data_references_counter_begin () const { return _immutable_data + _immutable_data_reference_counter_offset ; } // Sizes int immutable_data_size() const { return _immutable_data_size; } From 6cd7f30d8d4118787401693b8628c72679d37a6a Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Fri, 17 Oct 2025 19:50:04 +0000 Subject: [PATCH 189/561] 8369742: Link AOT-linked classes at JVM bootstrap Reviewed-by: kvn, asmehra --- .../share/cds/aotLinkedClassBulkLoader.cpp | 79 +++++++++++++------ .../share/cds/aotLinkedClassBulkLoader.hpp | 16 ++-- src/hotspot/share/cds/cdsConfig.cpp | 3 +- src/hotspot/share/cds/runTimeClassInfo.cpp | 2 +- .../classfile/systemDictionaryShared.cpp | 48 +++++++---- .../classfile/systemDictionaryShared.hpp | 1 + src/hotspot/share/code/nmethod.cpp | 38 +++++++++ src/hotspot/share/code/nmethod.hpp | 5 ++ src/hotspot/share/runtime/serviceThread.cpp | 4 +- src/hotspot/share/runtime/serviceThread.hpp | 5 +- src/hotspot/share/runtime/threads.cpp | 13 ++- test/hotspot/jtreg/TEST.groups | 1 + .../resolvedConstants/ResolvedConstants.java | 7 +- 13 files changed, 159 insertions(+), 63 deletions(-) diff --git a/src/hotspot/share/cds/aotLinkedClassBulkLoader.cpp b/src/hotspot/share/cds/aotLinkedClassBulkLoader.cpp index e7145b25457..3653f9d518c 100644 --- a/src/hotspot/share/cds/aotLinkedClassBulkLoader.cpp +++ b/src/hotspot/share/cds/aotLinkedClassBulkLoader.cpp @@ -42,6 +42,8 @@ #include "oops/trainingData.hpp" #include "runtime/handles.inline.hpp" #include "runtime/java.hpp" +#include "runtime/serviceThread.hpp" +#include "utilities/growableArray.hpp" void AOTLinkedClassBulkLoader::serialize(SerializeClosure* soc) { AOTLinkedClassTable::get()->serialize(soc); @@ -53,6 +55,8 @@ void AOTLinkedClassBulkLoader::serialize(SerializeClosure* soc) { // step in restoring the JVM's state from the snapshot recorded in the AOT cache: other AOT optimizations // such as AOT compiled methods can make direct references to the preloaded classes, knowing that // these classes are guaranteed to be in at least the "loaded" state. +// +// Note: we can't link the classes yet because SharedRuntime is not yet ready to generate adapters. void AOTLinkedClassBulkLoader::preload_classes(JavaThread* current) { preload_classes_impl(current); if (current->has_pending_exception()) { @@ -112,6 +116,44 @@ void AOTLinkedClassBulkLoader::preload_classes_in_table(Array* c } } +// Some cached heap objects may hold references to methods in aot-linked +// classes (via MemberName). We need to make sure all classes are +// linked before executing any bytecode. +void AOTLinkedClassBulkLoader::link_classes(JavaThread* current) { + link_classes_impl(current); + if (current->has_pending_exception()) { + exit_on_exception(current); + } +} + +void AOTLinkedClassBulkLoader::link_classes_impl(TRAPS) { + precond(CDSConfig::is_using_aot_linked_classes()); + + AOTLinkedClassTable* table = AOTLinkedClassTable::get(); + + link_classes_in_table(table->boot1(), CHECK); + link_classes_in_table(table->boot2(), CHECK); + link_classes_in_table(table->platform(), CHECK); + link_classes_in_table(table->app(), CHECK); +} + +void AOTLinkedClassBulkLoader::link_classes_in_table(Array* classes, TRAPS) { + if (classes != nullptr) { + for (int i = 0; i < classes->length(); i++) { + // NOTE: CDSConfig::is_preserving_verification_constraints() is required + // when storing ik in the AOT cache. This means we don't have to verify + // ik at all. + // + // Without is_preserving_verification_constraints(), ik->link_class() may cause + // class loading, which may result in invocation of ClassLoader::loadClass() calls, + // which CANNOT happen because we are not ready to execute any Java byecodes yet + // at this point. + InstanceKlass* ik = classes->at(i); + ik->link_class(CHECK); + } + } +} + #ifdef ASSERT void AOTLinkedClassBulkLoader::validate_module_of_preloaded_classes() { oop javabase_module_oop = ModuleEntryTable::javabase_moduleEntry()->module_oop(); @@ -173,25 +215,21 @@ void AOTLinkedClassBulkLoader::validate_module(Klass* k, const char* category_na } #endif -// Link all java.base classes in the AOTLinkedClassTable. Of those classes, -// move the ones that have been AOT-initialized to the "initialized" state. -void AOTLinkedClassBulkLoader::link_or_init_javabase_classes(JavaThread* current) { - link_or_init_classes_for_loader(Handle(), AOTLinkedClassTable::get()->boot1(), current); +void AOTLinkedClassBulkLoader::init_javabase_classes(JavaThread* current) { + init_classes_for_loader(Handle(), AOTLinkedClassTable::get()->boot1(), current); if (current->has_pending_exception()) { exit_on_exception(current); } } -// Do the same thing as link_or_init_javabase_classes(), but for the classes that are not -// in the java.base module. -void AOTLinkedClassBulkLoader::link_or_init_non_javabase_classes(JavaThread* current) { - link_or_init_non_javabase_classes_impl(current); +void AOTLinkedClassBulkLoader::init_non_javabase_classes(JavaThread* current) { + init_non_javabase_classes_impl(current); if (current->has_pending_exception()) { exit_on_exception(current); } } -void AOTLinkedClassBulkLoader::link_or_init_non_javabase_classes_impl(TRAPS) { +void AOTLinkedClassBulkLoader::init_non_javabase_classes_impl(TRAPS) { assert(CDSConfig::is_using_aot_linked_classes(), "sanity"); DEBUG_ONLY(validate_module_of_preloaded_classes()); @@ -208,9 +246,9 @@ void AOTLinkedClassBulkLoader::link_or_init_non_javabase_classes_impl(TRAPS) { assert(h_system_loader() != nullptr, "must be"); AOTLinkedClassTable* table = AOTLinkedClassTable::get(); - link_or_init_classes_for_loader(Handle(), table->boot2(), CHECK); - link_or_init_classes_for_loader(h_platform_loader, table->platform(), CHECK); - link_or_init_classes_for_loader(h_system_loader, table->app(), CHECK); + init_classes_for_loader(Handle(), table->boot2(), CHECK); + init_classes_for_loader(h_platform_loader, table->platform(), CHECK); + init_classes_for_loader(h_system_loader, table->app(), CHECK); if (Universe::is_fully_initialized() && VerifyDuringStartup) { // Make sure we're still in a clean state. @@ -242,8 +280,9 @@ void AOTLinkedClassBulkLoader::exit_on_exception(JavaThread* current) { log_error(aot)("Out of memory. Please run with a larger Java heap, current MaxHeapSize = " "%zuM", MaxHeapSize/M); } else { + oop message = java_lang_Throwable::message(current->pending_exception()); log_error(aot)("%s: %s", current->pending_exception()->klass()->external_name(), - java_lang_String::as_utf8_string(java_lang_Throwable::message(current->pending_exception()))); + message == nullptr ? "(no message)" : java_lang_String::as_utf8_string(message)); } vm_exit_during_initialization("Unexpected exception when loading aot-linked classes."); } @@ -289,23 +328,13 @@ void AOTLinkedClassBulkLoader::initiate_loading(JavaThread* current, const char* // - classes that were AOT-initialized by AOTClassInitializer // - the classes of all objects that are reachable from the archived mirrors of // the AOT-linked classes for . -void AOTLinkedClassBulkLoader::link_or_init_classes_for_loader(Handle class_loader, Array* classes, TRAPS) { +void AOTLinkedClassBulkLoader::init_classes_for_loader(Handle class_loader, Array* classes, TRAPS) { if (classes != nullptr) { for (int i = 0; i < classes->length(); i++) { InstanceKlass* ik = classes->at(i); - if (ik->class_loader_data() == nullptr) { - // This class is not yet loaded. We will initialize it in a later phase. - // For example, we have loaded only AOTLinkedClassCategory::BOOT1 classes - // but k is part of AOTLinkedClassCategory::BOOT2. - continue; - } + assert(ik->class_loader_data() != nullptr, "must be"); if (ik->has_aot_initialized_mirror()) { ik->initialize_with_aot_initialized_mirror(CHECK); - } else { - // Some cached heap objects may hold references to methods in aot-linked - // classes (via MemberName). We need to make sure all classes are - // linked to allow such MemberNames to be invoked. - ik->link_class(CHECK); } } } diff --git a/src/hotspot/share/cds/aotLinkedClassBulkLoader.hpp b/src/hotspot/share/cds/aotLinkedClassBulkLoader.hpp index 77400a86104..31fdac386fe 100644 --- a/src/hotspot/share/cds/aotLinkedClassBulkLoader.hpp +++ b/src/hotspot/share/cds/aotLinkedClassBulkLoader.hpp @@ -52,10 +52,11 @@ class AOTLinkedClassBulkLoader : AllStatic { static void preload_classes_impl(TRAPS); static void preload_classes_in_table(Array* classes, const char* category_name, Handle loader, TRAPS); - static void initiate_loading(JavaThread* current, const char* category, Handle initiating_loader, - Array* classes); - static void link_or_init_non_javabase_classes_impl(TRAPS); - static void link_or_init_classes_for_loader(Handle class_loader, Array* classes, TRAPS); + static void initiate_loading(JavaThread* current, const char* category, Handle initiating_loader, Array* classes); + static void link_classes_impl(TRAPS); + static void link_classes_in_table(Array* classes, TRAPS); + static void init_non_javabase_classes_impl(TRAPS); + static void init_classes_for_loader(Handle class_loader, Array* classes, TRAPS); static void replay_training_at_init(Array* classes, TRAPS) NOT_CDS_RETURN; #ifdef ASSERT @@ -67,9 +68,10 @@ class AOTLinkedClassBulkLoader : AllStatic { public: static void serialize(SerializeClosure* soc) NOT_CDS_RETURN; - static void preload_classes(JavaThread* current); - static void link_or_init_javabase_classes(JavaThread* current) NOT_CDS_RETURN; - static void link_or_init_non_javabase_classes(JavaThread* current) NOT_CDS_RETURN; + static void preload_classes(JavaThread* current) NOT_CDS_RETURN; + static void link_classes(JavaThread* current) NOT_CDS_RETURN; + static void init_javabase_classes(JavaThread* current) NOT_CDS_RETURN; + static void init_non_javabase_classes(JavaThread* current) NOT_CDS_RETURN; static void exit_on_exception(JavaThread* current); static void replay_training_at_init_for_preloaded_classes(TRAPS) NOT_CDS_RETURN; diff --git a/src/hotspot/share/cds/cdsConfig.cpp b/src/hotspot/share/cds/cdsConfig.cpp index 7c6b925470a..a5d1f78b76f 100644 --- a/src/hotspot/share/cds/cdsConfig.cpp +++ b/src/hotspot/share/cds/cdsConfig.cpp @@ -943,8 +943,9 @@ bool CDSConfig::is_preserving_verification_constraints() { return AOTClassLinking; } else if (is_dumping_final_static_archive()) { // writing AOT cache return is_dumping_aot_linked_classes(); + } else if (is_dumping_classic_static_archive()) { + return is_dumping_aot_linked_classes(); } else { - // For simplicity, we don't support this optimization with the old CDS workflow. return false; } } diff --git a/src/hotspot/share/cds/runTimeClassInfo.cpp b/src/hotspot/share/cds/runTimeClassInfo.cpp index 832b0ce8932..fe940ca6c18 100644 --- a/src/hotspot/share/cds/runTimeClassInfo.cpp +++ b/src/hotspot/share/cds/runTimeClassInfo.cpp @@ -41,7 +41,7 @@ void RunTimeClassInfo::init(DumpTimeClassInfo& info) { _num_loader_constraints = info.num_loader_constraints(); int i; - if (CDSConfig::is_preserving_verification_constraints() && CDSConfig::is_dumping_final_static_archive()) { + if (CDSConfig::is_preserving_verification_constraints()) { // The production run doesn't need the verifier constraints, as we can guarantee that all classes checked by // the verifier during AOT training/assembly phases cannot be replaced in the production run. _num_verifier_constraints = 0; diff --git a/src/hotspot/share/classfile/systemDictionaryShared.cpp b/src/hotspot/share/classfile/systemDictionaryShared.cpp index 2d31a7c49f6..cb2ae96348e 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp @@ -855,6 +855,28 @@ public: } }; +void SystemDictionaryShared::link_all_exclusion_check_candidates(InstanceKlass* ik) { + bool need_to_link = false; + { + MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); + ExclusionCheckCandidates candidates(ik); + + candidates.iterate_all([&] (InstanceKlass* k, DumpTimeClassInfo* info) { + if (!k->is_linked()) { + need_to_link = true; + } + }); + } + if (need_to_link) { + JavaThread* THREAD = JavaThread::current(); + if (log_is_enabled(Info, aot, link)) { + ResourceMark rm(THREAD); + log_info(aot, link)("Link all loaded classes for %s", ik->external_name()); + } + AOTMetaspace::link_all_loaded_classes(THREAD); + } +} + // Returns true if the class should be excluded. This can be called by // AOTConstantPoolResolver before or after we enter the CDS safepoint. // When called before the safepoint, we need to link the class so that @@ -878,27 +900,19 @@ bool SystemDictionaryShared::should_be_excluded(Klass* k) { InstanceKlass* ik = InstanceKlass::cast(k); if (!SafepointSynchronize::is_at_safepoint()) { - if (!ik->is_linked()) { - // should_be_excluded_impl() below doesn't link unlinked classes. We come - // here only when we are trying to aot-link constant pool entries, so - // we'd better link the class. - JavaThread* THREAD = JavaThread::current(); - ik->link_class(THREAD); - if (HAS_PENDING_EXCEPTION) { - CLEAR_PENDING_EXCEPTION; - return true; // linking failed -- let's exclude it + { + // fast path + MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); + DumpTimeClassInfo* p = get_info_locked(ik); + if (p->has_checked_exclusion()) { + return p->is_excluded(); } - - // Also link any classes that were loaded for the verification of ik or its supertypes. - // Otherwise we might miss the verification constraints of those classes. - AOTMetaspace::link_all_loaded_classes(THREAD); } + link_all_exclusion_check_candidates(ik); + MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag); DumpTimeClassInfo* p = get_info_locked(ik); - if (p->is_excluded()) { - return true; - } return should_be_excluded_impl(ik, p); } else { // When called within the CDS safepoint, the correctness of this function @@ -912,7 +926,7 @@ bool SystemDictionaryShared::should_be_excluded(Klass* k) { // No need to check for is_linked() as all eligible classes should have // already been linked in AOTMetaspace::link_class_for_cds(). - // Can't take the lock as we are in safepoint. + // Don't take DumpTimeTable_lock as we are in safepoint. DumpTimeClassInfo* p = _dumptime_table->get(ik); if (p->is_excluded()) { return true; diff --git a/src/hotspot/share/classfile/systemDictionaryShared.hpp b/src/hotspot/share/classfile/systemDictionaryShared.hpp index 5ff57653dd0..2619a642fd1 100644 --- a/src/hotspot/share/classfile/systemDictionaryShared.hpp +++ b/src/hotspot/share/classfile/systemDictionaryShared.hpp @@ -175,6 +175,7 @@ private: static void write_dictionary(RunTimeSharedDictionary* dictionary, bool is_builtin); static bool is_jfr_event_class(InstanceKlass *k); + static void link_all_exclusion_check_candidates(InstanceKlass* ik); static bool should_be_excluded_impl(InstanceKlass* k, DumpTimeClassInfo* info); // exclusion checks diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 94e11b00e9a..a99e753180d 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -23,6 +23,7 @@ */ #include "asm/assembler.inline.hpp" +#include "cds/cdsConfig.hpp" #include "code/codeCache.hpp" #include "code/compiledIC.hpp" #include "code/dependencies.hpp" @@ -2504,11 +2505,48 @@ void nmethod::post_compiled_method(CompileTask* task) { maybe_print_nmethod(directive); } +#if INCLUDE_CDS +static GrowableArrayCHeap* _delayed_compiled_method_load_events = nullptr; + +void nmethod::add_delayed_compiled_method_load_event(nmethod* nm) { + precond(CDSConfig::is_using_aot_linked_classes()); + precond(!ServiceThread::has_started()); + + // We are still in single threaded stage of VM bootstrap. No need to lock. + if (_delayed_compiled_method_load_events == nullptr) { + _delayed_compiled_method_load_events = new GrowableArrayCHeap(); + } + _delayed_compiled_method_load_events->append(nm); +} + +void nmethod::post_delayed_compiled_method_load_events() { + precond(ServiceThread::has_started()); + if (_delayed_compiled_method_load_events != nullptr) { + for (int i = 0; i < _delayed_compiled_method_load_events->length(); i++) { + nmethod* nm = _delayed_compiled_method_load_events->at(i); + nm->post_compiled_method_load_event(); + } + delete _delayed_compiled_method_load_events; + _delayed_compiled_method_load_events = nullptr; + } +} +#endif + // ------------------------------------------------------------------ // post_compiled_method_load_event // new method for install_code() path // Transfer information from compilation to jvmti void nmethod::post_compiled_method_load_event(JvmtiThreadState* state) { +#if INCLUDE_CDS + if (!ServiceThread::has_started()) { + // With AOT-linked classes, we could compile wrappers for native methods before the + // ServiceThread has been started, so we must delay the events to be posted later. + assert(state == nullptr, "must be"); + add_delayed_compiled_method_load_event(this); + return; + } +#endif + // This is a bad time for a safepoint. We don't want // this nmethod to get unloaded while we're queueing the event. NoSafepointVerifier nsv; diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 883be718b59..3763b81f887 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -965,6 +965,8 @@ public: inline int get_immutable_data_references_counter() { return *((int*)immutable_data_references_counter_begin()); } inline void set_immutable_data_references_counter(int count) { *((int*)immutable_data_references_counter_begin()) = count; } + static void add_delayed_compiled_method_load_event(nmethod* nm) NOT_CDS_RETURN; + public: // ScopeDesc retrieval operation PcDesc* pc_desc_at(address pc) { return find_pc_desc(pc, false); } @@ -999,6 +1001,9 @@ public: // Avoid hiding of parent's 'decode(outputStream*)' method. void decode(outputStream* st) const { decode2(st); } // just delegate here. + // AOT cache support + static void post_delayed_compiled_method_load_events() NOT_CDS_RETURN; + // printing support void print_on_impl(outputStream* st) const; void print_code(); diff --git a/src/hotspot/share/runtime/serviceThread.cpp b/src/hotspot/share/runtime/serviceThread.cpp index 9a0bfe03ac3..03168842e36 100644 --- a/src/hotspot/share/runtime/serviceThread.cpp +++ b/src/hotspot/share/runtime/serviceThread.cpp @@ -45,7 +45,7 @@ #include "services/lowMemoryDetector.hpp" #include "services/threadIdTable.hpp" -DEBUG_ONLY(JavaThread* ServiceThread::_instance = nullptr;) +JavaThread* ServiceThread::_instance = nullptr; JvmtiDeferredEvent* ServiceThread::_jvmti_event = nullptr; // The service thread has it's own static deferred event queue. // Events can be posted before JVMTI vm_start, so it's too early to call JvmtiThreadState::state_for @@ -62,7 +62,7 @@ void ServiceThread::initialize() { JavaThread::vm_exit_on_osthread_failure(thread); JavaThread::start_internal_daemon(THREAD, thread, thread_oop, NearMaxPriority); - DEBUG_ONLY(_instance = thread;) + _instance = thread; } static void cleanup_oopstorages() { diff --git a/src/hotspot/share/runtime/serviceThread.hpp b/src/hotspot/share/runtime/serviceThread.hpp index f65847ece00..cfce8603cd5 100644 --- a/src/hotspot/share/runtime/serviceThread.hpp +++ b/src/hotspot/share/runtime/serviceThread.hpp @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ class JvmtiDeferredEvent; class ServiceThread : public JavaThread { private: - DEBUG_ONLY(static JavaThread* _instance;) + static JavaThread* _instance; static JvmtiDeferredEvent* _jvmti_event; static JvmtiDeferredEventQueue _jvmti_service_queue; @@ -44,6 +44,7 @@ class ServiceThread : public JavaThread { public: static void initialize(); + static bool has_started() { return _instance != nullptr; } // Hide this thread from external view. bool is_hidden_from_external_view() const { return true; } diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index ffe1a86cda5..52275049eae 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -343,6 +343,11 @@ static void call_initPhase3(TRAPS) { void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) { TraceTime timer("Initialize java.lang classes", TRACETIME_LOG(Info, startuptime)); + // This is before the execution of the very first Java bytecode. + if (CDSConfig::is_using_aot_linked_classes()) { + AOTLinkedClassBulkLoader::link_classes(THREAD); + } + initialize_class(vmSymbols::java_lang_String(), CHECK); // Inject CompactStrings value after the static initializers for String ran. @@ -742,6 +747,10 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // and other cleanups. Needs to start before the compilers start posting events. ServiceThread::initialize(); + if (CDSConfig::is_using_aot_linked_classes()) { + nmethod::post_delayed_compiled_method_load_events(); + } + // Start the monitor deflation thread: MonitorDeflationThread::initialize(); @@ -774,7 +783,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { if (CDSConfig::is_using_aot_linked_classes()) { SystemDictionary::restore_archived_method_handle_intrinsics(); - AOTLinkedClassBulkLoader::link_or_init_javabase_classes(THREAD); + AOTLinkedClassBulkLoader::init_javabase_classes(THREAD); } // Start string deduplication thread if requested. @@ -793,7 +802,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { call_initPhase2(CHECK_JNI_ERR); if (CDSConfig::is_using_aot_linked_classes()) { - AOTLinkedClassBulkLoader::link_or_init_non_javabase_classes(THREAD); + AOTLinkedClassBulkLoader::init_non_javabase_classes(THREAD); } #ifndef PRODUCT HeapShared::initialize_test_class_from_archive(THREAD); diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index fd9dd6eb4c0..18f27a96628 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -570,6 +570,7 @@ hotspot_aot_classlinking = \ -runtime/cds/appcds/TestSerialGCWithCDS.java \ -runtime/cds/appcds/TestZGCWithCDS.java \ -runtime/cds/appcds/TestWithProfiler.java \ + -runtime/cds/appcds/VerifyObjArrayCloneTest.java \ -runtime/cds/serviceability/ReplaceCriticalClassesForSubgraphs.java \ -runtime/cds/serviceability/ReplaceCriticalClasses.java \ -runtime/cds/serviceability/transformRelatedClasses/TransformInterfaceAndImplementor.java \ diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java index bc2ac9db2ab..621d6383ff4 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java @@ -174,14 +174,9 @@ public class ResolvedConstants { // Indy References --- if (aotClassLinking) { testGroup("Indy References", out) - .shouldContain("Cannot aot-resolve Lambda proxy because OldConsumer is excluded") - .shouldContain("Cannot aot-resolve Lambda proxy because OldProvider is excluded") - .shouldContain("Cannot aot-resolve Lambda proxy because OldClass is excluded") .shouldContain("Cannot aot-resolve Lambda proxy of interface type InterfaceWithClinit") .shouldMatch("klasses.* app *NormalClass[$][$]Lambda/.* hidden aot-linked inited") - .shouldNotMatch("klasses.* app *SubOfOldClass[$][$]Lambda/") - .shouldMatch("archived indy *CP entry.*StringConcatTest .* => java/lang/invoke/StringConcatFactory.makeConcatWithConstants") - .shouldNotMatch("archived indy *CP entry.*StringConcatTestOld .* => java/lang/invoke/StringConcatFactory.makeConcatWithConstants"); + .shouldMatch("archived indy *CP entry.*StringConcatTest .* => java/lang/invoke/StringConcatFactory.makeConcatWithConstants"); } } From 0cc88e4ad4ded970433eed25778a7290ddf9b0fa Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Fri, 17 Oct 2025 20:38:37 +0000 Subject: [PATCH 190/561] 8370028: Remove author tags from mathematical classes Reviewed-by: bpb, rriggs --- src/java.base/share/classes/java/lang/Byte.java | 2 -- src/java.base/share/classes/java/lang/Double.java | 4 ---- src/java.base/share/classes/java/lang/Float.java | 4 ---- src/java.base/share/classes/java/lang/Integer.java | 4 ---- src/java.base/share/classes/java/lang/Long.java | 4 ---- src/java.base/share/classes/java/lang/Math.java | 4 ---- src/java.base/share/classes/java/lang/Short.java | 2 -- src/java.base/share/classes/java/lang/StrictMath.java | 6 ------ src/java.base/share/classes/java/math/BigDecimal.java | 6 ------ src/java.base/share/classes/java/math/MathContext.java | 2 -- src/java.base/share/classes/java/math/RoundingMode.java | 3 --- .../share/classes/jdk/internal/math/DoubleConsts.java | 4 +--- .../share/classes/jdk/internal/math/FloatConsts.java | 4 +--- 13 files changed, 2 insertions(+), 47 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Byte.java b/src/java.base/share/classes/java/lang/Byte.java index accd448a0cd..d9913e354a4 100644 --- a/src/java.base/share/classes/java/lang/Byte.java +++ b/src/java.base/share/classes/java/lang/Byte.java @@ -55,8 +55,6 @@ import static java.lang.constant.ConstantDescs.DEFAULT_NAME; * use instances for synchronization, or unpredictable behavior may * occur. For example, in a future release, synchronization may fail. * - * @author Nakul Saraiya - * @author Joseph D. Darcy * @see java.lang.Number * @since 1.1 */ diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java index 661a0ceb42b..6cee75cea2b 100644 --- a/src/java.base/share/classes/java/lang/Double.java +++ b/src/java.base/share/classes/java/lang/Double.java @@ -352,9 +352,6 @@ import jdk.internal.vm.annotation.IntrinsicCandidate; * @spec https://standards.ieee.org/ieee/754/6210/ * IEEE Standard for Floating-Point Arithmetic * - * @author Lee Boynton - * @author Arthur van Hoff - * @author Joseph D. Darcy * @since 1.0 */ @jdk.internal.ValueBased @@ -695,7 +692,6 @@ public final class Double extends Number * @param d the {@code double} to be converted. * @return a hex string representation of the argument. * @since 1.5 - * @author Joseph D. Darcy */ public static String toHexString(double d) { /* diff --git a/src/java.base/share/classes/java/lang/Float.java b/src/java.base/share/classes/java/lang/Float.java index db694571567..c553dc41c2c 100644 --- a/src/java.base/share/classes/java/lang/Float.java +++ b/src/java.base/share/classes/java/lang/Float.java @@ -70,9 +70,6 @@ import jdk.internal.vm.annotation.IntrinsicCandidate; * @spec https://standards.ieee.org/ieee/754/6210/ * IEEE Standard for Floating-Point Arithmetic * - * @author Lee Boynton - * @author Arthur van Hoff - * @author Joseph D. Darcy * @since 1.0 */ @jdk.internal.ValueBased @@ -411,7 +408,6 @@ public final class Float extends Number * @param f the {@code float} to be converted. * @return a hex string representation of the argument. * @since 1.5 - * @author Joseph D. Darcy */ public static String toHexString(float f) { if (Math.abs(f) < Float.MIN_NORMAL diff --git a/src/java.base/share/classes/java/lang/Integer.java b/src/java.base/share/classes/java/lang/Integer.java index 41487a469b6..6e49f1983aa 100644 --- a/src/java.base/share/classes/java/lang/Integer.java +++ b/src/java.base/share/classes/java/lang/Integer.java @@ -68,10 +68,6 @@ import static java.lang.String.UTF16; * Delight, (Addison Wesley, 2002) and Hacker's * Delight, Second Edition, (Pearson Education, 2013). * - * @author Lee Boynton - * @author Arthur van Hoff - * @author Josh Bloch - * @author Joseph D. Darcy * @since 1.0 */ @jdk.internal.ValueBased diff --git a/src/java.base/share/classes/java/lang/Long.java b/src/java.base/share/classes/java/lang/Long.java index 2fb2d18a78c..90249cb1edb 100644 --- a/src/java.base/share/classes/java/lang/Long.java +++ b/src/java.base/share/classes/java/lang/Long.java @@ -68,10 +68,6 @@ import static java.lang.String.UTF16; * Delight, (Addison Wesley, 2002) and Hacker's * Delight, Second Edition, (Pearson Education, 2013). * - * @author Lee Boynton - * @author Arthur van Hoff - * @author Josh Bloch - * @author Joseph D. Darcy * @since 1.0 */ @jdk.internal.ValueBased diff --git a/src/java.base/share/classes/java/lang/Math.java b/src/java.base/share/classes/java/lang/Math.java index ef5d1214b11..0f39ecf0a8a 100644 --- a/src/java.base/share/classes/java/lang/Math.java +++ b/src/java.base/share/classes/java/lang/Math.java @@ -2529,7 +2529,6 @@ public final class Math { * * @param d the floating-point value whose ulp is to be returned * @return the size of an ulp of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static double ulp(double d) { @@ -2576,7 +2575,6 @@ public final class Math { * * @param f the floating-point value whose ulp is to be returned * @return the size of an ulp of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static float ulp(float f) { @@ -2617,7 +2615,6 @@ public final class Math { * * @param d the floating-point value whose signum is to be returned * @return the signum function of the argument - * @author Joseph D. Darcy * @since 1.5 */ @IntrinsicCandidate @@ -2639,7 +2636,6 @@ public final class Math { * * @param f the floating-point value whose signum is to be returned * @return the signum function of the argument - * @author Joseph D. Darcy * @since 1.5 */ @IntrinsicCandidate diff --git a/src/java.base/share/classes/java/lang/Short.java b/src/java.base/share/classes/java/lang/Short.java index f0ae8b28e45..4c64427b6df 100644 --- a/src/java.base/share/classes/java/lang/Short.java +++ b/src/java.base/share/classes/java/lang/Short.java @@ -55,8 +55,6 @@ import static java.lang.constant.ConstantDescs.DEFAULT_NAME; * use instances for synchronization, or unpredictable behavior may * occur. For example, in a future release, synchronization may fail. * - * @author Nakul Saraiya - * @author Joseph D. Darcy * @see java.lang.Number * @since 1.1 */ diff --git a/src/java.base/share/classes/java/lang/StrictMath.java b/src/java.base/share/classes/java/lang/StrictMath.java index 266d98e3947..499fce73aee 100644 --- a/src/java.base/share/classes/java/lang/StrictMath.java +++ b/src/java.base/share/classes/java/lang/StrictMath.java @@ -101,7 +101,6 @@ import jdk.internal.vm.annotation.IntrinsicCandidate; * @spec https://standards.ieee.org/ieee/754/6210/ * IEEE Standard for Floating-Point Arithmetic * - * @author Joseph D. Darcy * @since 1.3 */ public final class StrictMath { @@ -493,7 +492,6 @@ public final class StrictMath { * @param a a value. * @return the closest floating-point value to {@code a} that is * equal to a mathematical integer. - * @author Joseph D. Darcy */ public static double rint(double a) { /* @@ -2014,7 +2012,6 @@ public final class StrictMath { * * @param d the floating-point value whose ulp is to be returned * @return the size of an ulp of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static double ulp(double d) { @@ -2041,7 +2038,6 @@ public final class StrictMath { * * @param f the floating-point value whose ulp is to be returned * @return the size of an ulp of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static float ulp(float f) { @@ -2062,7 +2058,6 @@ public final class StrictMath { * * @param d the floating-point value whose signum is to be returned * @return the signum function of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static double signum(double d) { @@ -2083,7 +2078,6 @@ public final class StrictMath { * * @param f the floating-point value whose signum is to be returned * @return the signum function of the argument - * @author Joseph D. Darcy * @since 1.5 */ public static float signum(float f) { diff --git a/src/java.base/share/classes/java/math/BigDecimal.java b/src/java.base/share/classes/java/math/BigDecimal.java index c24998344c1..199b6648cdd 100644 --- a/src/java.base/share/classes/java/math/BigDecimal.java +++ b/src/java.base/share/classes/java/math/BigDecimal.java @@ -327,10 +327,6 @@ import jdk.internal.vm.annotation.Stable; * @spec https://standards.ieee.org/ieee/754/6210/ * IEEE Standard for Floating-Point Arithmetic * - * @author Josh Bloch - * @author Mike Cowlishaw - * @author Joseph D. Darcy - * @author Sergey V. Kuksenko * @since 1.1 */ public class BigDecimal extends Number implements Comparable { @@ -1779,7 +1775,6 @@ public class BigDecimal extends Number implements Comparable { * terminating decimal expansion, including dividing by zero * @return {@code this / divisor} * @since 1.5 - * @author Joseph D. Darcy */ public BigDecimal divide(BigDecimal divisor) { /* @@ -1948,7 +1943,6 @@ public class BigDecimal extends Number implements Comparable { * @throws ArithmeticException if {@code mc.precision} {@literal >} 0 and the result * requires a precision of more than {@code mc.precision} digits. * @since 1.5 - * @author Joseph D. Darcy */ public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) { if (mc.precision == 0 || // exact result diff --git a/src/java.base/share/classes/java/math/MathContext.java b/src/java.base/share/classes/java/math/MathContext.java index d0c1cb4a5a9..f80fcc3e076 100644 --- a/src/java.base/share/classes/java/math/MathContext.java +++ b/src/java.base/share/classes/java/math/MathContext.java @@ -51,8 +51,6 @@ import java.io.*; * @spec https://standards.ieee.org/ieee/754/6210/ * IEEE Standard for Floating-Point Arithmetic * - * @author Mike Cowlishaw - * @author Joseph D. Darcy * @since 1.5 */ diff --git a/src/java.base/share/classes/java/math/RoundingMode.java b/src/java.base/share/classes/java/math/RoundingMode.java index e66a64e143f..4188c781cab 100644 --- a/src/java.base/share/classes/java/math/RoundingMode.java +++ b/src/java.base/share/classes/java/math/RoundingMode.java @@ -115,9 +115,6 @@ package java.math; * IEEE Standard for Floating-Point Arithmetic * @jls 15.4 Floating-point Expressions * - * @author Josh Bloch - * @author Mike Cowlishaw - * @author Joseph D. Darcy * @since 1.5 */ @SuppressWarnings("deprecation") // Legacy rounding mode constants in BigDecimal diff --git a/src/java.base/share/classes/jdk/internal/math/DoubleConsts.java b/src/java.base/share/classes/jdk/internal/math/DoubleConsts.java index d3a271fdd07..168e99d4ef5 100644 --- a/src/java.base/share/classes/jdk/internal/math/DoubleConsts.java +++ b/src/java.base/share/classes/jdk/internal/math/DoubleConsts.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -32,8 +32,6 @@ import static java.lang.Double.SIZE; /** * This class contains additional constants documenting limits of the * {@code double} type. - * - * @author Joseph D. Darcy */ public class DoubleConsts { diff --git a/src/java.base/share/classes/jdk/internal/math/FloatConsts.java b/src/java.base/share/classes/jdk/internal/math/FloatConsts.java index fd304c7871a..2bd484e99f3 100644 --- a/src/java.base/share/classes/jdk/internal/math/FloatConsts.java +++ b/src/java.base/share/classes/jdk/internal/math/FloatConsts.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -32,8 +32,6 @@ import static java.lang.Float.SIZE; /** * This class contains additional constants documenting limits of the * {@code float} type. - * - * @author Joseph D. Darcy */ public class FloatConsts { From 49b17dd5c97bf967c01166542cfccf4b196cf8a9 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Fri, 17 Oct 2025 22:58:26 +0000 Subject: [PATCH 191/561] 8356575: Test order in which jpackage fills app image Reviewed-by: almatvee --- .../internal/ApplicationImageUtils.java | 4 +- .../jpackage/test/LauncherIconVerifier.java | 3 +- .../helpers/jdk/jpackage/test/TKit.java | 30 ++ .../jpackage/share/AppImageFillOrderTest.java | 359 ++++++++++++++++++ 4 files changed, 393 insertions(+), 3 deletions(-) create mode 100644 test/jdk/tools/jpackage/share/AppImageFillOrderTest.java diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java index 7d3250ff7b9..cda5b6c79ef 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java @@ -32,6 +32,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -148,6 +149,7 @@ final class ApplicationImageUtils { } } - FileUtils.copyRecursive(srcDir, dstDir.toAbsolutePath(), excludes, LinkOption.NOFOLLOW_LINKS); + FileUtils.copyRecursive(srcDir, dstDir.toAbsolutePath(), excludes, + LinkOption.NOFOLLOW_LINKS, StandardCopyOption.REPLACE_EXISTING); } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java index 6285d9d93a0..278cd569bac 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java @@ -24,7 +24,6 @@ package jdk.jpackage.test; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; public final class LauncherIconVerifier { @@ -77,7 +76,7 @@ public final class LauncherIconVerifier { } else { TKit.assertFileExists(iconPath); if (!verifyFileInAppImageOnly) { - TKit.assertTrue(-1 == Files.mismatch(expectedIcon, iconPath), + TKit.assertSameFileContent(expectedIcon, iconPath, String.format( "Check icon file [%s] of %s launcher is a copy of source icon file [%s]", iconPath, label, expectedIcon)); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index b3f188bb371..ed9c727abcc 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -25,6 +25,7 @@ package jdk.jpackage.test; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import static java.util.stream.Collectors.toSet; +import static jdk.jpackage.internal.util.function.ThrowingBiFunction.toBiFunction; import static jdk.jpackage.internal.util.function.ThrowingSupplier.toSupplier; import java.io.Closeable; @@ -797,6 +798,35 @@ public final class TKit { } } + public static void assertMismatchFileContent(Path a, Path b) { + assertFilesMismatch(a, b, true, Optional.empty()); + } + + public static void assertMismatchFileContent(Path a, Path b, String msg) { + assertFilesMismatch(a, b, true, Optional.of(msg)); + } + + public static void assertSameFileContent(Path a, Path b) { + assertFilesMismatch(a, b, false, Optional.empty()); + } + + public static void assertSameFileContent(Path a, Path b, String msg) { + assertFilesMismatch(a, b, false, Optional.of(msg)); + } + + public static void assertFilesMismatch(Path a, Path b, boolean expectMismatch, Optional msg) { + var mismatch = toBiFunction(Files::mismatch).apply(a, b) != -1; + if (expectMismatch) { + assertTrue(mismatch, msg.orElseGet(() -> { + return String.format("Check the content of [%s] and [%s] files mismatch", a, b); + })); + } else { + assertTrue(!mismatch, msg.orElseGet(() -> { + return String.format("Check the content of [%s] and [%s] files is the same", a, b); + })); + } + } + public static void assertDirectoryNotEmpty(Path path) { assertDirectoryExists(path, Optional.of(false)); } diff --git a/test/jdk/tools/jpackage/share/AppImageFillOrderTest.java b/test/jdk/tools/jpackage/share/AppImageFillOrderTest.java new file mode 100644 index 00000000000..75c0ddfc16f --- /dev/null +++ b/test/jdk/tools/jpackage/share/AppImageFillOrderTest.java @@ -0,0 +1,359 @@ +/* + * 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. + * + * 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. + */ + +import static java.util.stream.Collectors.toMap; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.TreeMap; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.AppImageFile; +import jdk.jpackage.test.ApplicationLayout; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.TKit; + +/* + * @test + * @summary test order in which jpackage fills app image + * @library /test/jdk/tools/jpackage/helpers + * @build jdk.jpackage.test.* + * @compile -Xlint:all -Werror AppImageFillOrderTest.java + * @run main/othervm/timeout=1440 -Xmx512m + * jdk.jpackage.test.Main + * --jpt-run=AppImageFillOrderTest + */ + +/** + * Test order in which overlapping items are added to the app image. jpackage + * defaults should go first to let user-provided content override them. + * + *

    + * Custom content comes from: + *

      + *
    • input directory (--input) + *
    • app content (--app-content) + *
        + */ +public class AppImageFillOrderTest { + + @Test + @ParameterSupplier + public void test(AppImageOverlay overlays[]) { + test(createJPackage().setFakeRuntime(), overlays); + } + + /** + * Test they can override a file in the runtime. + * @param jlink + */ + @Test + @Parameter("true") + @Parameter("false") + public void testRuntime(boolean jlink) { + var cmd = createJPackage(); + if (jlink) { + cmd.ignoreDefaultRuntime(true); + } else { + // Configure fake runtime and create it. + cmd.setFakeRuntime().executePrerequisiteActions(); + + var runtimeDir = Path.of(cmd.getArgumentValue("--runtime-image")); + if (!runtimeDir.toAbsolutePath().normalize().startsWith(TKit.workDir().toAbsolutePath().normalize())) { + throw new IllegalStateException(String.format( + "Fake runtime [%s] created outside of the test work directory [%s]", + runtimeDir, TKit.workDir())); + } + + TKit.createTextFile(runtimeDir.resolve(RUNTIME_RELEASE_FILE), List.of("Foo release")); + } + + test(cmd, AppImageAppContentOverlay.APP_CONTENT_RUNTIME_RELEASE_FILE); + } + + /** + * Test they can not override .jpackage.xml file. + * @throws IOException + */ + @Test + public void testAppImageFile() throws IOException { + + var cmd = createJPackage().setFakeRuntime(); + + var outputBundle = cmd.outputBundle(); + + buildOverlay(cmd, TKit.createTempDirectory("app-content"), AppImageFile.getPathInAppImage(outputBundle)) + .textContent("This is not a valid XML content") + .configureCmdOptions().createOverlayFile(); + + // Run jpackage and verify it created valid .jpackage.xml file ignoring the overlay. + cmd.executeAndAssertImageCreated(); + + TKit.trace(String.format("Parse [%s] file...", AppImageFile.getPathInAppImage(outputBundle))); + AppImageFile.load(outputBundle); + } + + private static void test(JPackageCommand cmd, AppImageOverlay... overlays) { + if (overlays.length == 0) { + throw new IllegalArgumentException(); + } + + final var outputDir = Path.of(cmd.getArgumentValue("--dest")); + final var noOverlaysOutputDir = Path.of(outputDir.toString() + "-no-overlay"); + cmd.setArgumentValue("--dest", noOverlaysOutputDir); + + // Run the command without overlays with redirected output directory. + cmd.execute(); + + final Optional appContentRoot; + if (Stream.of(overlays).anyMatch(AppImageAppContentOverlay.class::isInstance)) { + appContentRoot = Optional.of(TKit.createTempDirectory("app-content")); + } else { + appContentRoot = Optional.empty(); + } + + // Apply overlays to the command. + var fileCopies = Stream.of(overlays).map(overlay -> { + switch (overlay) { + case AppImageDefaultOverlay v -> { + return v.addOverlay(cmd); + } + case AppImageAppContentOverlay v -> { + return v.addOverlay(cmd, appContentRoot.orElseThrow()); + } + } + }).flatMap(Collection::stream).collect(toMap(FileCopy::out, x -> x, (a, b) -> { + return b; + }, TreeMap::new)).values().stream().toList(); + + // Collect paths in the app image that will be affected by overlays. + var noOverlayOutputPaths = fileCopies.stream().map(FileCopy::out).toList(); + + fileCopies = fileCopies.stream().map(v -> { + return new FileCopy(v.in(), outputDir.resolve(noOverlaysOutputDir.relativize(v.out()))); + }).toList(); + + // Restore the original output directory for the command and execute it. + cmd.setArgumentValue("--dest", outputDir).execute(); + + for (var i = 0; i != fileCopies.size(); i++) { + var noOverlayPath = noOverlayOutputPaths.get(i); + var fc = fileCopies.get(i); + TKit.assertSameFileContent(fc.in(), fc.out()); + TKit.assertMismatchFileContent(noOverlayPath, fc.out()); + } + } + + public static Collection test() { + return Stream.of( + + // Overwrite main launcher .cfg file from the input dir. + List.of(AppImageDefaultOverlay.INPUT_MAIN_LAUNCHER_CFG), + + // Overwrite main launcher .cfg file from the app content dir. + List.of(AppImageAppContentOverlay.APP_CONTENT_MAIN_LAUNCHER_CFG), + + // Overwrite main launcher .cfg file from the input dir and from the app content dir. + // The one from app content should win. + List.of( + AppImageDefaultOverlay.INPUT_MAIN_LAUNCHER_CFG, + AppImageAppContentOverlay.APP_CONTENT_MAIN_LAUNCHER_CFG + ), + + // Overwrite main jar from the app content dir. + List.of(AppImageAppContentOverlay.APP_CONTENT_MAIN_JAR) + ).map(args -> { + return args.toArray(AppImageOverlay[]::new); + }).map(args -> { + return new Object[] {args}; + }).toList(); + } + + + public sealed interface AppImageOverlay { + } + + + private enum AppImageDefaultOverlay implements AppImageOverlay { + INPUT_MAIN_LAUNCHER_CFG(AppImageFillOrderTest::replaceMainLauncherCfgFile), + ; + + AppImageDefaultOverlay(Function func) { + Objects.requireNonNull(func); + this.func = cmd -> { + return List.of(func.apply(cmd)); + }; + } + + Collection addOverlay(JPackageCommand cmd) { + return func.apply(cmd); + } + + private final Function> func; + } + + + private enum AppImageAppContentOverlay implements AppImageOverlay { + // Replace the standard main launcher .cfg file with the custom one from the app content. + APP_CONTENT_MAIN_LAUNCHER_CFG((cmd, appContentRoot) -> { + return buildOverlay(cmd, appContentRoot, cmd.appLauncherCfgPath(null)) + .textContent("!Olleh") + .configureCmdOptions().createOverlayFile(); + }), + + // Replace the jar file that jpackage will pick up from the input directory with the custom one. + APP_CONTENT_MAIN_JAR((cmd, appContentRoot) -> { + return buildOverlay(cmd, appContentRoot, cmd.appLayout().appDirectory().resolve(cmd.getArgumentValue("--main-jar"))) + .textContent("Surprise!") + .configureCmdOptions().createOverlayFile(); + }), + + // Replace "release" file in the runtime directory. + APP_CONTENT_RUNTIME_RELEASE_FILE((cmd, appContentRoot) -> { + return buildOverlay(cmd, appContentRoot, cmd.appLayout().runtimeHomeDirectory().resolve("release")) + .textContent("blob") + .configureCmdOptions().createOverlayFile(); + }), + ; + + AppImageAppContentOverlay(BiFunction func) { + Objects.requireNonNull(func); + this.func = (cmd, appContentRoot) -> { + return List.of(func.apply(cmd, appContentRoot)); + }; + } + + Collection addOverlay(JPackageCommand cmd, Path appContentRoot) { + return func.apply(cmd, appContentRoot); + } + + private final BiFunction> func; + } + + + private record FileCopy(Path in, Path out) { + FileCopy { + Objects.requireNonNull(in); + Objects.requireNonNull(out); + } + } + + + private static FileCopy replaceMainLauncherCfgFile(JPackageCommand cmd) { + // Replace the standard main launcher .cfg file with the custom one from the input dir. + final var outputFile = cmd.appLauncherCfgPath(null); + + final var inputDir = Path.of(cmd.getArgumentValue("--input")); + + final var file = inputDir.resolve(outputFile.getFileName()); + + TKit.createTextFile(file, List.of("Hello!")); + + return new FileCopy(file, outputFile); + } + + private static AppContentOverlayFileBuilder buildOverlay(JPackageCommand cmd, Path appContentRoot, Path outputFile) { + return new AppContentOverlayFileBuilder(cmd, appContentRoot, outputFile); + } + + + private static final class AppContentOverlayFileBuilder { + + AppContentOverlayFileBuilder(JPackageCommand cmd, Path appContentRoot, Path outputFile) { + if (outputFile.isAbsolute()) { + throw new IllegalArgumentException(); + } + + if (!outputFile.startsWith(cmd.outputBundle())) { + throw new IllegalArgumentException(); + } + + this.cmd = Objects.requireNonNull(cmd); + this.outputFile = Objects.requireNonNull(outputFile); + this.appContentRoot = Objects.requireNonNull(appContentRoot); + } + + FileCopy createOverlayFile() { + final var file = appContentRoot.resolve(pathInAppContentDirectory()); + + try { + Files.createDirectories(file.getParent()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + fileContentInitializer.accept(file); + + return new FileCopy(file, outputFile); + } + + AppContentOverlayFileBuilder configureCmdOptions() { + cmd.addArguments("--app-content", appContentRoot.resolve(pathInAppContentDirectory().getName(0))); + return this; + } + + AppContentOverlayFileBuilder content(Consumer v) { + fileContentInitializer = v; + return this; + } + + AppContentOverlayFileBuilder textContent(String... lines) { + return content(path -> { + TKit.createTextFile(path, List.of(lines)); + }); + } + + private Path pathInAppContentDirectory() { + return APP_IMAGE_LAYOUT.resolveAt(cmd.outputBundle()).contentDirectory().relativize(outputFile); + } + + private Consumer fileContentInitializer; + private final JPackageCommand cmd; + private final Path outputFile; + private final Path appContentRoot; + } + + + private static JPackageCommand createJPackage() { + // With short name. + var cmd = JPackageCommand.helloAppImage().setArgumentValue("--name", "Foo"); + + // Clean leftovers in the input dir from the previous test run if any. + TKit.deleteDirectoryContentsRecursive(cmd.inputDir()); + + return cmd; + } + + private static final ApplicationLayout APP_IMAGE_LAYOUT = ApplicationLayout.platformAppImage(); + private static final Path RUNTIME_RELEASE_FILE = Path.of("release"); +} From 926f61f2e358c92cdb7ccdf75c853aa599f4dde3 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Fri, 17 Oct 2025 23:50:06 +0000 Subject: [PATCH 192/561] 8369447: GenShen: Regulator thread may observe inconsistent states Reviewed-by: kdnilsen, ysr --- src/hotspot/share/gc/shenandoah/shenandoahRegulatorThread.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRegulatorThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRegulatorThread.cpp index 774c4f7d941..964b6f0a10a 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRegulatorThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRegulatorThread.cpp @@ -58,6 +58,7 @@ void ShenandoahRegulatorThread::run_service() { void ShenandoahRegulatorThread::regulate_young_and_old_cycles() { while (!should_terminate()) { + SuspendibleThreadSetJoiner joiner; ShenandoahGenerationalControlThread::GCMode mode = _control_thread->gc_mode(); if (mode == ShenandoahGenerationalControlThread::none) { if (should_start_metaspace_gc()) { @@ -95,6 +96,7 @@ void ShenandoahRegulatorThread::regulate_young_and_old_cycles() { void ShenandoahRegulatorThread::regulate_young_and_global_cycles() { while (!should_terminate()) { + SuspendibleThreadSetJoiner joiner; if (_control_thread->gc_mode() == ShenandoahGenerationalControlThread::none) { if (start_global_cycle()) { log_debug(gc)("Heuristics request for global collection accepted."); @@ -122,6 +124,7 @@ void ShenandoahRegulatorThread::regulator_sleep() { _last_sleep_adjust_time = current; } + SuspendibleThreadSetLeaver leaver; os::naked_short_sleep(_sleep); if (LogTarget(Debug, gc, thread)::is_enabled()) { double elapsed = os::elapsedTime() - current; From 181657084a547457327b8657d7a8d3faa17eb1f5 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Sat, 18 Oct 2025 00:50:38 +0000 Subject: [PATCH 193/561] 8321687: Test vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/TestDescription.java failed: JVMTI_ERROR_THREAD_NOT_ALIVE Reviewed-by: amenkov, cjplummer, sspitsyn --- .../scenarios/contention/TC03/tc03t001.java | 6 +- .../contention/TC03/tc03t001/tc03t001.cpp | 64 ++++++++++-------- .../scenarios/contention/TC03/tc03t002.java | 7 +- .../contention/TC03/tc03t002/tc03t002.cpp | 65 +++++++++++-------- 4 files changed, 85 insertions(+), 57 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001.java index 4c7905809d9..eb202c87ef3 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -123,6 +123,8 @@ public class tc03t001 extends DebugeeClass { /* =================================================================== */ class tc03t001Thread extends Thread { + // The thread name prefix is used to find thread from jvmti agent. + final static String threadNamePrefix = "Debuggee Thread"; Object lock1; Object lock2; @@ -130,7 +132,7 @@ class tc03t001Thread extends Thread { int lock2Counter = 0; public tc03t001Thread(Object o1, Object o2) { - super("Debuggee Thread " + o1 + o2); + super(threadNamePrefix + " " + o1 + o2); lock1 = o1; lock2 = o2; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001/tc03t001.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001/tc03t001.cpp index ff7d346d237..9ea61a27bc6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001/tc03t001.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t001/tc03t001.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -41,10 +41,13 @@ typedef struct { static jlong timeout = 0; /* test objects */ -static threadDesc *threadList = nullptr; -static jint threads_count = 0; +static threadDesc *debuggee_threads = nullptr; +static jint debuggee_threads_cnt = 0; static int numberOfDeadlocks = 0; +static const char* THREAD_NAME_PREFIX = "Debugee Thread"; +static const size_t THREAD_NAME_PREFIX_LEN = strlen(THREAD_NAME_PREFIX); + /* ========================================================================== */ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { @@ -56,9 +59,9 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { NSK_DISPLAY1("Found deadlock #%d:\n", numberOfDeadlocks); for (pThread = dThread;;pThread = cThread) { - NSK_DISPLAY1(" \"%s\":\n", threadList[pThread].name); + NSK_DISPLAY1(" \"%s\":\n", debuggee_threads[pThread].name); if (!NSK_JVMTI_VERIFY( - jvmti->GetCurrentContendedMonitor(threadList[pThread].thread, &monitor))) + jvmti->GetCurrentContendedMonitor(debuggee_threads[pThread].thread, &monitor))) return NSK_FALSE; if (monitor != nullptr) { if (!NSK_JNI_VERIFY(jni, (klass = jni->GetObjectClass(monitor)) != nullptr)) @@ -74,8 +77,8 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { return NSK_FALSE; if (usageInfo.owner == nullptr) break; - for (cThread = 0; cThread < threads_count; cThread++) { - if (jni->IsSameObject(threadList[cThread].thread, usageInfo.owner)) + for (cThread = 0; cThread < debuggee_threads_cnt; cThread++) { + if (jni->IsSameObject(debuggee_threads[cThread].thread, usageInfo.owner)) break; } if (usageInfo.waiters != nullptr) { @@ -84,10 +87,10 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { if (usageInfo.notify_waiters != nullptr) { jvmti->Deallocate((unsigned char*)usageInfo.notify_waiters); } - if (!NSK_VERIFY(cThread != threads_count)) + if (!NSK_VERIFY(cThread != debuggee_threads_cnt)) return NSK_FALSE; NSK_DISPLAY1(" which is held by \"%s\"\n", - threadList[cThread].name); + debuggee_threads[cThread].name); if (cThread == dThread) break; } @@ -103,8 +106,9 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { int tDfn = 0, gDfn = 0; int pThread, cThread; int i; + int threads_count = 0; - NSK_DISPLAY0("Create threadList\n"); + NSK_DISPLAY0("Create debuggee_threads\n"); /* get all live threads */ if (!NSK_JVMTI_VERIFY(jvmti->GetAllThreads(&threads_count, &threads))) @@ -114,7 +118,7 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { return NSK_FALSE; if (!NSK_JVMTI_VERIFY( - jvmti->Allocate(threads_count*sizeof(threadDesc), (unsigned char**)&threadList))) + jvmti->Allocate(threads_count*sizeof(threadDesc), (unsigned char**)&debuggee_threads))) return NSK_FALSE; for (i = 0; i < threads_count; i++) { @@ -127,22 +131,30 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { NSK_DISPLAY3(" thread #%d (%s): %p\n", i, info.name, threads[i]); - threadList[i].thread = threads[i]; - threadList[i].dfn = -1; - threadList[i].name = info.name; + if (!strncmp(info.name, THREAD_NAME_PREFIX, THREAD_NAME_PREFIX_LEN)) { + NSK_DISPLAY1("Skipping thread %s\n", info.name); + if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)info.name))) + return NSK_FALSE; + continue; + } + + debuggee_threads[debuggee_threads_cnt].thread = threads[i]; + debuggee_threads[debuggee_threads_cnt].dfn = -1; + debuggee_threads[debuggee_threads_cnt].name = info.name; + debuggee_threads_cnt++; } /* deallocate thread list */ if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)threads))) return NSK_FALSE; - for (i = 0; i < threads_count; i++) { - if (threadList[i].dfn < 0) { + for (i = 0; i < debuggee_threads_cnt; i++) { + if (debuggee_threads[i].dfn < 0) { tDfn = gDfn; - threadList[i].dfn = gDfn++; + debuggee_threads[i].dfn = gDfn++; for (pThread = i;;pThread = cThread) { if (!NSK_JVMTI_VERIFY( - jvmti->GetCurrentContendedMonitor(threadList[pThread].thread, &monitor))) + jvmti->GetCurrentContendedMonitor(debuggee_threads[pThread].thread, &monitor))) return NSK_FALSE; if (monitor == nullptr) break; @@ -150,8 +162,8 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { return NSK_FALSE; if (usageInfo.owner == nullptr) break; - for (cThread = 0; cThread < threads_count; cThread++) { - if (jni->IsSameObject(threadList[cThread].thread, usageInfo.owner)) + for (cThread = 0; cThread < debuggee_threads_cnt; cThread++) { + if (jni->IsSameObject(debuggee_threads[cThread].thread, usageInfo.owner)) break; } if (usageInfo.waiters != nullptr) { @@ -160,10 +172,10 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { if (usageInfo.notify_waiters != nullptr) { jvmti->Deallocate((unsigned char*)usageInfo.notify_waiters); } - if (!NSK_VERIFY(cThread != threads_count)) + if (!NSK_VERIFY(cThread != debuggee_threads_cnt)) return NSK_FALSE; - if (threadList[cThread].dfn < 0) { - threadList[cThread].dfn = gDfn++; + if (debuggee_threads[cThread].dfn < 0) { + debuggee_threads[cThread].dfn = gDfn++; } else if (cThread == pThread) { break; } else { @@ -179,9 +191,9 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { } /* deallocate thread names */ - for (i = 0; i < threads_count; i++) { - if (threadList[i].name != nullptr) { - if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)threadList[i].name))) + for (i = 0; i < debuggee_threads_cnt; i++) { + if (debuggee_threads[i].name != nullptr) { + if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)debuggee_threads[i].name))) return NSK_FALSE; } } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002.java index f4ca83c0b54..852b915acd7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -104,7 +104,8 @@ public class tc03t002 extends DebugeeClass { /* =================================================================== */ class tc03t002Thread extends Thread { - + // The thread name prefix is used to find thread from jvmti agent. + final static String threadNamePrefix = "Debuggee Thread"; static Wicket startingBarrier = new Wicket(3); static Wicket lockingBarrier = new Wicket(3); Wicket waitingBarrier = new Wicket(); @@ -112,7 +113,7 @@ class tc03t002Thread extends Thread { Object lock2; public tc03t002Thread(Object o1, Object o2) { - super("Debuggee Thread " + o1 + o2); + super(threadNamePrefix + " " + o1 + o2); lock1 = o1; lock2 = o2; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/tc03t002.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/tc03t002.cpp index 11c74e3a9e2..5d18d6c23af 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/tc03t002.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC03/tc03t002/tc03t002.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -41,10 +41,13 @@ typedef struct { static jlong timeout = 0; /* test objects */ -static threadDesc *threadList = nullptr; -static jint threads_count = 0; +static threadDesc *debuggee_threads = nullptr; +static jint debuggee_threads_cnt = 0; static int numberOfDeadlocks = 0; +static const char* THREAD_NAME_PREFIX = "Debugee Thread"; +static const size_t THREAD_NAME_PREFIX_LEN = strlen(THREAD_NAME_PREFIX); + /* ========================================================================== */ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { @@ -56,9 +59,9 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { NSK_DISPLAY1("Found deadlock #%d:\n", numberOfDeadlocks); for (pThread = dThread;;pThread = cThread) { - NSK_DISPLAY1(" \"%s\":\n", threadList[pThread].name); + NSK_DISPLAY1(" \"%s\":\n", debuggee_threads[pThread].name); if (!NSK_JVMTI_VERIFY( - jvmti->GetCurrentContendedMonitor(threadList[pThread].thread, &monitor))) + jvmti->GetCurrentContendedMonitor(debuggee_threads[pThread].thread, &monitor))) return NSK_FALSE; if (monitor != nullptr) { if (!NSK_JNI_VERIFY(jni, (klass = jni->GetObjectClass(monitor)) != nullptr)) @@ -74,8 +77,8 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { return NSK_FALSE; if (usageInfo.owner == nullptr) break; - for (cThread = 0; cThread < threads_count; cThread++) { - if (jni->IsSameObject(threadList[cThread].thread, usageInfo.owner)) + for (cThread = 0; cThread < debuggee_threads_cnt; cThread++) { + if (jni->IsSameObject(debuggee_threads[cThread].thread, usageInfo.owner)) break; } if (usageInfo.waiters != nullptr) { @@ -84,10 +87,10 @@ static int printDeadlock(jvmtiEnv* jvmti, JNIEnv* jni, int dThread) { if (usageInfo.notify_waiters != nullptr) { jvmti->Deallocate((unsigned char*)usageInfo.notify_waiters); } - if (!NSK_VERIFY(cThread != threads_count)) + if (!NSK_VERIFY(cThread != debuggee_threads_cnt)) return NSK_FALSE; NSK_DISPLAY1(" which is held by \"%s\"\n", - threadList[cThread].name); + debuggee_threads[cThread].name); if (cThread == dThread) break; } @@ -103,8 +106,9 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { int tDfn = 0, gDfn = 0; int pThread, cThread; int i; + int threads_count = 0; - NSK_DISPLAY0("Create threadList\n"); + NSK_DISPLAY0("Create debuggee_threads\n"); /* get all live threads */ if (!NSK_JVMTI_VERIFY(jvmti->GetAllThreads(&threads_count, &threads))) @@ -114,7 +118,7 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { return NSK_FALSE; if (!NSK_JVMTI_VERIFY( - jvmti->Allocate(threads_count*sizeof(threadDesc), (unsigned char**)&threadList))) + jvmti->Allocate(threads_count*sizeof(threadDesc), (unsigned char**)&debuggee_threads))) return NSK_FALSE; for (i = 0; i < threads_count; i++) { @@ -127,22 +131,31 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { NSK_DISPLAY3(" thread #%d (%s): %p\n", i, info.name, threads[i]); - threadList[i].thread = threads[i]; - threadList[i].dfn = -1; - threadList[i].name = info.name; + if (!strncmp(info.name, THREAD_NAME_PREFIX, THREAD_NAME_PREFIX_LEN)) { + NSK_DISPLAY1("Skipping thread %s\n", info.name); + if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)info.name))) + return NSK_FALSE; + continue; + } + + debuggee_threads[debuggee_threads_cnt].thread = threads[i]; + debuggee_threads[debuggee_threads_cnt].dfn = -1; + debuggee_threads[debuggee_threads_cnt].name = info.name; + debuggee_threads_cnt++; } /* deallocate thread list */ if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)threads))) return NSK_FALSE; - for (i = 0; i < threads_count; i++) { - if (threadList[i].dfn < 0) { + for (i = 0; i < debuggee_threads_cnt; i++) { + + if (debuggee_threads[i].dfn < 0) { tDfn = gDfn; - threadList[i].dfn = gDfn++; + debuggee_threads[i].dfn = gDfn++; for (pThread = i;;pThread = cThread) { if (!NSK_JVMTI_VERIFY( - jvmti->GetCurrentContendedMonitor(threadList[pThread].thread, &monitor))) + jvmti->GetCurrentContendedMonitor(debuggee_threads[pThread].thread, &monitor))) return NSK_FALSE; if (monitor == nullptr) break; @@ -150,8 +163,8 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { return NSK_FALSE; if (usageInfo.owner == nullptr) break; - for (cThread = 0; cThread < threads_count; cThread++) { - if (jni->IsSameObject(threadList[cThread].thread, usageInfo.owner)) + for (cThread = 0; cThread < debuggee_threads_cnt; cThread++) { + if (jni->IsSameObject(debuggee_threads[cThread].thread, usageInfo.owner)) break; } if (usageInfo.waiters != nullptr) { @@ -160,10 +173,10 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { if (usageInfo.notify_waiters != nullptr) { jvmti->Deallocate((unsigned char*)usageInfo.notify_waiters); } - if (!NSK_VERIFY(cThread != threads_count)) + if (!NSK_VERIFY(cThread != debuggee_threads_cnt)) return NSK_FALSE; - if (threadList[cThread].dfn < 0) { - threadList[cThread].dfn = gDfn++; + if (debuggee_threads[cThread].dfn < 0) { + debuggee_threads[cThread].dfn = gDfn++; } else if (cThread == pThread) { break; } else { @@ -179,9 +192,9 @@ static int findDeadlockThreads(jvmtiEnv* jvmti, JNIEnv* jni) { } /* deallocate thread names */ - for (i = 0; i < threads_count; i++) { - if (threadList[i].name != nullptr) { - if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)threadList[i].name))) + for (i = 0; i < debuggee_threads_cnt; i++) { + if (debuggee_threads[i].name != nullptr) { + if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)debuggee_threads[i].name))) return NSK_FALSE; } } From 462519935827e25475f2fb35746ad81a14bc5da7 Mon Sep 17 00:00:00 2001 From: Feilong Jiang Date: Sat, 18 Oct 2025 01:09:41 +0000 Subject: [PATCH 194/561] 8369947: Bytecode rewriting causes Java heap corruption on RISC-V Reviewed-by: aph, jcking, fyang --- src/hotspot/cpu/riscv/interp_masm_riscv.cpp | 9 +++++++++ src/hotspot/cpu/riscv/interp_masm_riscv.hpp | 2 ++ src/hotspot/cpu/riscv/templateTable_riscv.cpp | 12 +++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp index 7c4b8444407..549c9cda7b6 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp @@ -1841,6 +1841,15 @@ void InterpreterMacroAssembler::load_method_entry(Register cache, Register index } #ifdef ASSERT +void InterpreterMacroAssembler::verify_field_offset(Register reg) { + // Verify the field offset is not in the header, implicitly checks for 0 + Label L; + mv(t0, oopDesc::base_offset_in_bytes()); + bge(reg, t0, L); + stop("bad field offset"); + bind(L); +} + void InterpreterMacroAssembler::verify_access_flags(Register access_flags, uint32_t flag, const char* msg, bool stop_by_hit) { Label L; diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp index 0732191ea83..eec4f0846a5 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp @@ -300,6 +300,8 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_field_entry(Register cache, Register index, int bcp_offset = 1); void load_method_entry(Register cache, Register index, int bcp_offset = 1); + void verify_field_offset(Register reg) NOT_DEBUG_RETURN; + #ifdef ASSERT void verify_access_flags(Register access_flags, uint32_t flag, const char* msg, bool stop_by_hit = true); diff --git a/src/hotspot/cpu/riscv/templateTable_riscv.cpp b/src/hotspot/cpu/riscv/templateTable_riscv.cpp index 2697b3e46dc..bd4a89d8199 100644 --- a/src/hotspot/cpu/riscv/templateTable_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateTable_riscv.cpp @@ -133,6 +133,7 @@ Address TemplateTable::at_bcp(int offset) { void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, Register temp_reg, bool load_bc_into_bc_reg /*=true*/, int byte_no) { + assert_different_registers(bc_reg, temp_reg); if (!RewriteBytecodes) { return; } Label L_patch_done; @@ -196,7 +197,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg, __ bind(L_okay); #endif - // patch bytecode + // Patch bytecode with release store to coordinate with ResolvedFieldEntry loads + // in fast bytecode codelets. load_field_entry has a memory barrier that gains + // the needed ordering, together with control dependency on entering the fast codelet + // itself. + __ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore); __ sb(bc_reg, at_bcp(0)); __ bind(L_patch_done); } @@ -3028,6 +3033,7 @@ void TemplateTable::fast_storefield(TosState state) { // X11: field offset, X12: field holder, X13: flags load_resolved_field_entry(x12, x12, noreg, x11, x13); + __ verify_field_offset(x11); { Label notVolatile; @@ -3115,6 +3121,8 @@ void TemplateTable::fast_accessfield(TosState state) { __ load_field_entry(x12, x11); __ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/); + __ verify_field_offset(x11); + __ load_unsigned_byte(x13, Address(x12, in_bytes(ResolvedFieldEntry::flags_offset()))); // x10: object @@ -3170,7 +3178,9 @@ void TemplateTable::fast_xaccess(TosState state) { __ ld(x10, aaddress(0)); // access constant pool cache __ load_field_entry(x12, x13, 2); + __ load_sized_value(x11, Address(x12, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/); + __ verify_field_offset(x11); // make sure exception is reported in correct bcp range (getfield is // next instruction) From b0af41d667f2fb5da37b4dd263486b34a15df0f3 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Sat, 18 Oct 2025 01:11:19 +0000 Subject: [PATCH 195/561] 8370134: Fix minor jpackage issues Reviewed-by: almatvee --- .../share/classes/jdk/jpackage/internal/Arguments.java | 2 +- .../share/classes/jdk/jpackage/internal/FromParams.java | 2 +- .../classes/jdk/jpackage/internal/WinExeBundler.java | 2 +- .../classes/jdk/jpackage/internal/WinMsiBundler.java | 9 +++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java index f9a5429a8bf..f0323bbd841 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java @@ -125,7 +125,7 @@ public class Arguments { for (String arg : args) { argList.add(arg); } - Log.verbose ("\njpackage argument list: \n" + argList + "\n"); + pos = 0; deployParams = new DeployParams(); diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java index 56f2b46ea8f..8cfab61c9c0 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java @@ -120,7 +120,7 @@ final class FromParams { final var runtimeBuilderBuilder = new RuntimeBuilderBuilder(); - MODULE_PATH.copyInto(params, runtimeBuilderBuilder::modulePath); + runtimeBuilderBuilder.modulePath(MODULE_PATH.fetchFrom(params)); predefinedRuntimeDirectory.ifPresentOrElse(runtimeBuilderBuilder::forRuntime, () -> { final var startupInfos = launchers.asList().stream() diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinExeBundler.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinExeBundler.java index 9ce758eb3c7..f61a26f0774 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinExeBundler.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinExeBundler.java @@ -65,7 +65,7 @@ public class WinExeBundler extends AbstractBundler { @Override public boolean validate(Map params) throws ConfigException { - return msiBundler.validate(params); + return msiBundler.validate(params, WinFromParams.EXE_PACKAGE); } @Override diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java index 3ca26f38f82..24aa3e0573a 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinMsiBundler.java @@ -30,6 +30,7 @@ import static jdk.jpackage.internal.model.ConfigException.rethrowConfigException import java.nio.file.Path; import java.util.Map; import jdk.jpackage.internal.model.ConfigException; +import jdk.jpackage.internal.model.Package; import jdk.jpackage.internal.model.PackagerException; import jdk.jpackage.internal.model.WinMsiPackage; import jdk.jpackage.internal.util.Result; @@ -80,11 +81,15 @@ public class WinMsiBundler extends AbstractBundler { } @Override - public boolean validate(Map params) + public boolean validate(Map params) throws ConfigException { + return validate(params, WinFromParams.MSI_PACKAGE); + } + + boolean validate(Map params, BundlerParamInfo pkgParam) throws ConfigException { try { // Order is important! - WinFromParams.APPLICATION.fetchFrom(params); + pkgParam.fetchFrom(params); BuildEnvFromParams.BUILD_ENV.fetchFrom(params); final var wixToolset = sysEnv.orElseThrow().wixToolset(); From eff6439e75d79c67370e79638024296e01101b48 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Sat, 18 Oct 2025 01:14:42 +0000 Subject: [PATCH 196/561] 8370120: Make jpackage tests output more stable Reviewed-by: almatvee --- .../internal/JLinkRuntimeBuilder.java | 2 +- .../jdk/jpackage/internal/PackageScripts.java | 15 ++++---- .../jpackage/internal/WixSourceConverter.java | 3 +- test/jdk/tools/jpackage/apps/PrintEnv.java | 1 + .../jdk/tools/jpackage/clean_stashed_files.sh | 3 +- test/jdk/tools/jpackage/clean_test_output.sh | 38 +++++++++++++++++++ .../jdk/jpackage/test/FileAssociations.java | 5 +-- .../jdk/jpackage/test/LinuxHelper.java | 19 ++++++---- .../jpackage/macosx/CustomInfoPListTest.java | 8 ++-- .../macosx/MacFileAssociationsTest.java | 5 ++- .../jpackage/share/FileAssociationsTest.java | 17 +++++---- test/jdk/tools/jpackage/share/IconTest.java | 31 +++++++-------- 12 files changed, 98 insertions(+), 49 deletions(-) diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java index bd82b34d897..b43acffbafb 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java @@ -215,7 +215,7 @@ final class JLinkRuntimeBuilder implements RuntimeBuilder { } private static String getStringList(Set strings) { - return strings.stream().collect(Collectors.joining(",")); + return strings.stream().sorted().collect(Collectors.joining(",")); } private final List jlinkCmdLine; diff --git a/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java b/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java index cd8799416f7..cef5fe05f35 100644 --- a/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java +++ b/src/jdk.jpackage/unix/classes/jdk/jpackage/internal/PackageScripts.java @@ -24,15 +24,16 @@ */ package jdk.jpackage.internal; +import static java.util.stream.Collectors.toMap; + import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.EnumSet; import java.util.Map; import java.util.Optional; +import java.util.TreeMap; import java.util.function.Supplier; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; import jdk.jpackage.internal.resources.ResourceLocator; /** @@ -46,11 +47,11 @@ final class PackageScripts & Supplier> { } PackageScripts(Class scriptIdsType) { - scripts = EnumSet.allOf(scriptIdsType).stream().collect( - Collectors.toMap(UnaryOperator.identity(), scriptId -> { - return new ShellScriptResource(scriptId.name()).setResource( - scriptId.get()); - })); + scripts = EnumSet.allOf(scriptIdsType).stream().collect(toMap(x -> x, scriptId -> { + return new ShellScriptResource(scriptId.name()).setResource(scriptId.get()); + }, (a, b) -> { + throw new UnsupportedOperationException(); + }, TreeMap::new)); } PackageScripts setSubstitutionData(T id, Map data) { diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java index b07c525db26..8f98df060ac 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java @@ -38,6 +38,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.function.Supplier; import java.util.stream.Collectors; import javax.xml.XMLConstants; @@ -193,7 +194,7 @@ final class WixSourceConverter { } } - private final Map resources = new HashMap<>(); + private final Map resources = new TreeMap<>(); private final WixToolsetType wixToolsetType; } diff --git a/test/jdk/tools/jpackage/apps/PrintEnv.java b/test/jdk/tools/jpackage/apps/PrintEnv.java index 64a243a0abc..4aed3c41422 100644 --- a/test/jdk/tools/jpackage/apps/PrintEnv.java +++ b/test/jdk/tools/jpackage/apps/PrintEnv.java @@ -69,6 +69,7 @@ public class PrintEnv { lines.add(ModuleFinder.ofSystem().findAll().stream() .map(ModuleReference::descriptor) .map(ModuleDescriptor::name) + .sorted() .collect(Collectors.joining(","))); } else if (arg.equals(PRINT_WORK_DIR)) { lines.add("$CD=" + Path.of("").toAbsolutePath()); diff --git a/test/jdk/tools/jpackage/clean_stashed_files.sh b/test/jdk/tools/jpackage/clean_stashed_files.sh index 28ad42048ac..db393877b19 100644 --- a/test/jdk/tools/jpackage/clean_stashed_files.sh +++ b/test/jdk/tools/jpackage/clean_stashed_files.sh @@ -120,8 +120,7 @@ macDmgFilterScpt() { # - Trim random absolute temp path # - Replace "/dmg-workdir/" (new) with "/images/" (old) find "$stash_dir" -name '*.scpt' -type f | xargs -I {} sed $sed_inplace_option \ - -e 's|"/.*/jdk.jpackage[0-9]\{1,\}/|"/jdk.jpackage/|' \ - -e 's|"file:///.*/jdk.jpackage[0-9]\{1,\}/|"file:///jdk.jpackage/|' \ + -e 's|/jdk.jpackage[0-9]\{1,\}/|/jdk.jpackage/|' \ -e 's|/dmg-workdir/|/images/|' \ '{}' } diff --git a/test/jdk/tools/jpackage/clean_test_output.sh b/test/jdk/tools/jpackage/clean_test_output.sh index e472d780ded..200d6add299 100644 --- a/test/jdk/tools/jpackage/clean_test_output.sh +++ b/test/jdk/tools/jpackage/clean_test_output.sh @@ -56,6 +56,9 @@ filterFile () { # Strip variable part of temporary directory name `jdk.jpackage5060841750457404688` -e 's|\([\/]\)jdk\.jpackage[0-9]\{1,\}\b|\1jdk.jpackage|g' + # Strip variable part of temporary directory name `jdk.jpackage.test217379316521032539` + -e 's|\([\/]\)jdk\.jpackage\.test[0-9]\{1,\}\b|\1jdk.jpackage.test|g' + # Convert PID value `[PID: 131561]` -e 's/\[PID: [0-9]\{1,\}\]/[PID: ]/' @@ -76,6 +79,41 @@ filterFile () { # Convert variable part of stack trace entry `at jdk.jpackage.test.JPackageCommand.execute(JPackageCommand.java:863)` -e 's/^\(.*\b\.java:\)[0-9]\{1,\}\()\r\{0,1\}\)$/\1N\2/' + + # Whipe out entire output of /usr/bin/hdiutil command. + # It is of little to no interest and contains too many variable parts to deal with individually. + -e '/^Running \/usr\/bin\/hdiutil/,/^Returned:/{ + //,/^Output:/!d + }' + + # Zip stack traces. + -e $'/^\tat /{ + :a + g + N + s/.*\\n// + /^\tat /ba + s/\\(^\t... \\)[0-9]\\{1,\\}\\( more\\)/\\1N\\2/ + s/\(.*\)/\tat \\n\\1/ + P + D + }' + + # Convert PID value in `taskkill /F /PID 5640` + -e 's|taskkill /F /PID [0-9]\{1,\}|taskkill /F /PID |' + + # Convert PID value in `The process with PID 5640 has been terminated` + -e 's|\(The process with PID \)[0-9]\{1,\}\( has been terminated\)|\1\2|' + + # Convert timeout value in `Check timeout value 57182ms is positive` + -e 's|\(Check timeout value \)[0-9]\{1,\}\(ms is positive\)|\1\2|' + + # Convert variable part of /usr/bin/osascript output `jdk.jpackage/config/SigningRuntimeImagePackageTest-dmg-setup.scpt:455:497: execution error: Finder got an error: Can’t set 1 to icon view. (-10006)` + -e 's|\(-dmg-setup.scpt:\)[0-9]\{1,\}:[0-9]\{1,\}\(: execution error: \)|\1\2|' + + # Use the same name for all exceptions. + -e 's|[^ ]\{1,\}\.[^ ]\{1,\}\Exception:|:|g' + -e 's|[^ ]\{1,\}\.[^ ]\{1,\}\ExceptionBox:|:|g' ) sed $sed_inplace_option "$1" "${expressions[@]}" diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java index ebdbb474006..576e294874a 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java @@ -27,12 +27,11 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.stream.Stream; +import java.util.TreeMap; import jdk.jpackage.internal.util.PathUtils; @@ -44,7 +43,7 @@ public final class FileAssociations { } private void createFile() { - Map entries = new HashMap<>(Map.of( + Map entries = new TreeMap<>(Map.of( "extension", suffixName, "mime-type", getMime() )); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index caec0e315c4..3a27ae32f43 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -22,6 +22,8 @@ */ package jdk.jpackage.test; +import static java.util.Collections.unmodifiableSortedSet; + import java.io.IOException; import java.io.UncheckedIOException; import java.lang.reflect.InvocationTargetException; @@ -32,12 +34,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -389,8 +392,7 @@ public final class LinuxHelper { Map> scriptlets = getScriptlets(cmd); if (integrated) { - Set requiredScriptlets = Stream.of(Scriptlet.values()).sorted().collect( - Collectors.toSet()); + var requiredScriptlets = Stream.of(Scriptlet.values()).sorted().toList(); TKit.assertTrue(scriptlets.keySet().containsAll( requiredScriptlets), String.format( "Check all required scriptlets %s found in the package. Package scriptlets: %s", @@ -488,13 +490,13 @@ public final class LinuxHelper { var data = new DesktopFile(desktopFile, true); - final Set mandatoryKeys = new HashSet<>(Set.of("Name", "Comment", + final Set mandatoryKeys = new TreeSet<>(Set.of("Name", "Comment", "Exec", "Icon", "Terminal", "Type", "Categories")); mandatoryKeys.removeAll(data.keySet()); TKit.assertTrue(mandatoryKeys.isEmpty(), String.format( "Check for missing %s keys in the file", mandatoryKeys)); - for (var e : Map.of("Type", "Application", "Terminal", "false").entrySet()) { + for (var e : List.of(Map.entry("Type", "Application"), Map.entry("Terminal", "false"))) { String key = e.getKey(); TKit.assertEquals(e.getValue(), data.find(key).orElseThrow(), String.format( "Check value of [%s] key", key)); @@ -710,7 +712,7 @@ public final class LinuxHelper { private static Map> getDebScriptlets( JPackageCommand cmd, Set scriptlets) { - Map> result = new HashMap<>(); + Map> result = new TreeMap<>(); TKit.withTempDirectory("dpkg-control-files", tempDir -> { // Extract control Debian package files into temporary directory Executor.of("dpkg", "-e") @@ -732,7 +734,7 @@ public final class LinuxHelper { List output = Executor.of("rpm", "-qp", "--scripts", cmd.outputBundle().toString()).executeAndGetOutput(); - Map> result = new HashMap<>(); + Map> result = new TreeMap<>(); List curScriptletBody = null; for (String str : output) { Matcher m = Scriptlet.RPM_HEADER_PATTERN.matcher(str); @@ -887,7 +889,8 @@ public final class LinuxHelper { private static final Pattern XDG_CMD_ICON_SIZE_PATTERN = Pattern.compile("\\s--size\\s+(\\d+)\\b"); // Values grabbed from https://linux.die.net/man/1/xdg-icon-resource - private static final Set XDG_CMD_VALID_ICON_SIZES = Set.of(16, 22, 32, 48, 64, 128); + private static final Set XDG_CMD_VALID_ICON_SIZES = unmodifiableSortedSet( + new TreeSet<>(List.of(16, 22, 32, 48, 64, 128))); private static final Method getServiceUnitFileName = initGetServiceUnitFileName(); } diff --git a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java index f8e606d77e8..d91f4e3504b 100644 --- a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java +++ b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java @@ -21,6 +21,7 @@ * questions. */ +import static java.util.Collections.unmodifiableSortedSet; import static java.util.Map.entry; import static jdk.jpackage.internal.util.PListWriter.writeDict; import static jdk.jpackage.internal.util.PListWriter.writePList; @@ -40,6 +41,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.TreeSet; import java.util.function.BiConsumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -142,12 +144,12 @@ public class CustomInfoPListTest { if (customPLists.isEmpty()) { throw new IllegalArgumentException(); } + customPLists = unmodifiableSortedSet(new TreeSet<>(customPLists)); } @Override public String toString() { return customPLists.stream() - .sorted(Comparator.comparing(CustomPListType::role)) .map(CustomPListType::toString) .collect(Collectors.joining("+")); } @@ -155,12 +157,12 @@ public class CustomInfoPListTest { JPackageCommand init(JPackageCommand cmd) throws IOException { if (customPLists.contains(CustomPListType.APP_WITH_FA)) { final Path propFile = TKit.createTempFile("fa.properties"); - var map = Map.ofEntries( + final var props = List.of( entry("mime-type", "application/x-jpackage-foo"), entry("extension", "foo"), entry("description", "bar") ); - TKit.createPropertiesFile(propFile, map); + TKit.createPropertiesFile(propFile, props); cmd.setArgumentValue("--file-associations", propFile); } diff --git a/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java b/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java index 3277b56ab46..ab7a23ec89a 100644 --- a/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java +++ b/test/jdk/tools/jpackage/macosx/MacFileAssociationsTest.java @@ -32,6 +32,7 @@ import static jdk.jpackage.test.MacHelper.writeFaPListFragment; import java.nio.file.Path; import java.util.Comparator; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -61,7 +62,7 @@ public class MacFileAssociationsTest { @Test public static void test() throws Exception { final Path propFile = TKit.createTempFile("fa.properties"); - Map map = Map.ofEntries( + final var props = List.of( entry("mime-type", "application/x-jpackage-foo"), entry("extension", "foo"), entry("description", "bar"), @@ -73,7 +74,7 @@ public class MacFileAssociationsTest { entry("mac.UISupportsDocumentBrowser", "false"), entry("mac.NSExportableTypes", "public.png, public.jpg"), entry("mac.UTTypeConformsTo", "public.image, public.data")); - TKit.createPropertiesFile(propFile, map); + TKit.createPropertiesFile(propFile, props); final var cmd = JPackageCommand.helloAppImage().setFakeRuntime(); cmd.addArguments("--file-associations", propFile); diff --git a/test/jdk/tools/jpackage/share/FileAssociationsTest.java b/test/jdk/tools/jpackage/share/FileAssociationsTest.java index 2257c5dbc65..cd4a0491532 100644 --- a/test/jdk/tools/jpackage/share/FileAssociationsTest.java +++ b/test/jdk/tools/jpackage/share/FileAssociationsTest.java @@ -21,10 +21,13 @@ * questions. */ +import static java.util.Map.entry; import static jdk.jpackage.test.JPackageStringBundle.MAIN; import java.nio.file.Path; +import java.util.List; import java.util.Map; +import java.util.TreeMap; import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.FileAssociations; @@ -114,9 +117,9 @@ public class FileAssociationsTest { final Path propFile = TKit.workDir().resolve("fa.properties"); initPackageTest().addRunOnceInitializer(() -> { - TKit.createPropertiesFile(propFile, Map.of( - "extension", "foo", - "description", "bar" + TKit.createPropertiesFile(propFile, List.of( + entry("extension", "foo"), + entry("description", "bar") )); }).addInitializer(cmd -> { cmd.addArguments("--file-associations", propFile); @@ -131,10 +134,10 @@ public class FileAssociationsTest { final Path propFile = TKit.workDir().resolve("fa.properties"); initPackageTest().addRunOnceInitializer(() -> { - TKit.createPropertiesFile(propFile, Map.of( - "mime-type", "application/x-jpackage-foo, application/x-jpackage-bar", - "extension", "foo", - "description", "bar" + TKit.createPropertiesFile(propFile, List.of( + entry("mime-type", "application/x-jpackage-foo, application/x-jpackage-bar"), + entry("extension", "foo"), + entry("description", "bar") )); }).addInitializer(cmd -> { cmd.addArguments("--file-associations", propFile); diff --git a/test/jdk/tools/jpackage/share/IconTest.java b/test/jdk/tools/jpackage/share/IconTest.java index a2a9e67bd91..051cad84a13 100644 --- a/test/jdk/tools/jpackage/share/IconTest.java +++ b/test/jdk/tools/jpackage/share/IconTest.java @@ -22,9 +22,6 @@ */ import java.io.IOException; -import java.util.stream.Stream; -import java.util.stream.Collectors; -import java.util.function.Consumer; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -34,17 +31,21 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.LauncherIconVerifier; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.Executor; -import jdk.jpackage.test.LinuxHelper; -import jdk.jpackage.test.AdditionalLauncher; -import jdk.jpackage.internal.util.function.ThrowingConsumer; +import java.util.TreeMap; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; import jdk.jpackage.internal.util.function.ThrowingBiConsumer; +import jdk.jpackage.internal.util.function.ThrowingConsumer; +import jdk.jpackage.test.AdditionalLauncher; import jdk.jpackage.test.Annotations.Parameters; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Executor; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.LauncherIconVerifier; +import jdk.jpackage.test.LinuxHelper; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.TKit; /* * @test @@ -92,18 +93,18 @@ public class IconTest { IconType additionalLauncherIconType, String[] extraJPackageArgs) { this.appImage = (bundleType == BundleType.AppImage); this.extraJPackageArgs = extraJPackageArgs; - config = Map.of( + config = new TreeMap<>(Map.of( Launcher.Main, mainLauncherIconType, - Launcher.Additional, additionalLauncherIconType); + Launcher.Additional, additionalLauncherIconType)); } public IconTest(BundleType bundleType, IconType mainLauncherIconType, IconType additionalLauncherIconType) { this.appImage = (bundleType == BundleType.AppImage); this.extraJPackageArgs = new String[0]; - config = Map.of( + config = new TreeMap<>(Map.of( Launcher.Main, mainLauncherIconType, - Launcher.Additional, additionalLauncherIconType); + Launcher.Additional, additionalLauncherIconType)); } public IconTest(BundleType bundleType, IconType mainLauncherIconType) { From c2fde517b44e2315385a5ffe17fcf9ab57e12786 Mon Sep 17 00:00:00 2001 From: Anass Baya Date: Sun, 19 Oct 2025 11:47:55 +0000 Subject: [PATCH 197/561] 8357390: java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java Test failing on Ubuntu 24.04 Vm Hosts used by Oracle's internal CI system Reviewed-by: honkar, serb --- .../java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java b/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java index 2cd05b08fc5..207954c521b 100644 --- a/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java +++ b/test/jdk/java/awt/Toolkit/ScreenInsetsTest/ScreenInsetsTest.java @@ -24,7 +24,7 @@ /* * @test * @key headful - * @bug 8020443 6899304 4737732 + * @bug 8020443 6899304 4737732 8357390 * @summary Tests that Toolkit.getScreenInsets() returns correct insets * @library /test/lib * @build jdk.test.lib.Platform @@ -44,7 +44,7 @@ import jdk.test.lib.Platform; public class ScreenInsetsTest { private static final int SIZE = 100; // Allow a margin tolerance of 1 pixel due to scaling - private static final int MARGIN_TOLERANCE = 1; + private static final int MARGIN_TOLERANCE = 2; public static void main(String[] args) throws InterruptedException { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); From 680414d0f9ab75d888bcb284cc494124a01a388f Mon Sep 17 00:00:00 2001 From: David Holmes Date: Mon, 20 Oct 2025 00:07:08 +0000 Subject: [PATCH 198/561] 8369631: Assess and remedy any unsafe usage of the sr_semaphore Semaphore in the Posix signal code Reviewed-by: stefank, kbarrett --- src/hotspot/os/posix/signals_posix.cpp | 37 ++++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/hotspot/os/posix/signals_posix.cpp b/src/hotspot/os/posix/signals_posix.cpp index 714eac12d22..10b340214a1 100644 --- a/src/hotspot/os/posix/signals_posix.cpp +++ b/src/hotspot/os/posix/signals_posix.cpp @@ -42,6 +42,7 @@ #include "signals_posix.hpp" #include "suspendResume_posix.hpp" #include "utilities/checkedCast.hpp" +#include "utilities/deferredStatic.hpp" #include "utilities/events.hpp" #include "utilities/ostream.hpp" #include "utilities/parseInteger.hpp" @@ -167,9 +168,9 @@ static get_signal_t get_signal_action = nullptr; // suspend/resume support #if defined(__APPLE__) - static OSXSemaphore sr_semaphore; +static DeferredStatic sr_semaphore; #else - static PosixSemaphore sr_semaphore; +static DeferredStatic sr_semaphore; #endif // Signal number used to suspend/resume a thread @@ -177,7 +178,7 @@ static get_signal_t get_signal_action = nullptr; int PosixSignals::SR_signum = SIGUSR2; // sun.misc.Signal support -static Semaphore* sig_semaphore = nullptr; +static DeferredStatic sig_semaphore; // a counter for each possible signal value static volatile jint pending_signals[NSIG+1] = { 0 }; @@ -351,18 +352,17 @@ static void jdk_misc_signal_init() { ::memset((void*)pending_signals, 0, sizeof(pending_signals)); // Initialize signal semaphore - sig_semaphore = new Semaphore(); + int sem_count = 0; + sig_semaphore.initialize(sem_count); } void os::signal_notify(int sig) { - if (sig_semaphore != nullptr) { + // Signal thread is not created with ReduceSignalUsage and jdk_misc_signal_init + // initialization isn't called. This code is also never called. + assert(!ReduceSignalUsage, "Should not reach here if ReduceSignalUsage is set"); + AtomicAccess::inc(&pending_signals[sig]); sig_semaphore->signal(); - } else { - // Signal thread is not created with ReduceSignalUsage and jdk_misc_signal_init - // initialization isn't called. - assert(ReduceSignalUsage, "signal semaphore should be created"); - } } static int check_pending_signals() { @@ -1696,7 +1696,7 @@ static void SR_handler(int sig, siginfo_t* siginfo, void* context) { pthread_sigmask(SIG_BLOCK, nullptr, &suspend_set); sigdelset(&suspend_set, PosixSignals::SR_signum); - sr_semaphore.signal(); + sr_semaphore->signal(); // wait here until we are resumed while (1) { @@ -1705,7 +1705,7 @@ static void SR_handler(int sig, siginfo_t* siginfo, void* context) { SuspendResume::State result = osthread->sr.running(); if (result == SuspendResume::SR_RUNNING) { // double check AIX doesn't need this! - sr_semaphore.signal(); + sr_semaphore->signal(); break; } else if (result != SuspendResume::SR_SUSPENDED) { ShouldNotReachHere(); @@ -1731,6 +1731,9 @@ static void SR_handler(int sig, siginfo_t* siginfo, void* context) { } static int SR_initialize() { + int sem_count = 0; + sr_semaphore.initialize(sem_count); + struct sigaction act; char *s; // Get signal number to use for suspend/resume @@ -1778,7 +1781,7 @@ static int sr_notify(OSThread* osthread) { // but this seems the normal response to library errors bool PosixSignals::do_suspend(OSThread* osthread) { assert(osthread->sr.is_running(), "thread should be running"); - assert(!sr_semaphore.trywait(), "semaphore has invalid state"); + assert(!sr_semaphore->trywait(), "semaphore has invalid state"); // mark as suspended and send signal if (osthread->sr.request_suspend() != SuspendResume::SR_SUSPEND_REQUEST) { @@ -1793,7 +1796,7 @@ bool PosixSignals::do_suspend(OSThread* osthread) { // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED while (true) { - if (sr_semaphore.timedwait(2)) { + if (sr_semaphore->timedwait(2)) { break; } else { // timeout @@ -1802,7 +1805,7 @@ bool PosixSignals::do_suspend(OSThread* osthread) { return false; } else if (cancelled == SuspendResume::SR_SUSPENDED) { // make sure that we consume the signal on the semaphore as well - sr_semaphore.wait(); + sr_semaphore->wait(); break; } else { ShouldNotReachHere(); @@ -1817,7 +1820,7 @@ bool PosixSignals::do_suspend(OSThread* osthread) { void PosixSignals::do_resume(OSThread* osthread) { assert(osthread->sr.is_suspended(), "thread should be suspended"); - assert(!sr_semaphore.trywait(), "invalid semaphore state"); + assert(!sr_semaphore->trywait(), "invalid semaphore state"); if (osthread->sr.request_wakeup() != SuspendResume::SR_WAKEUP_REQUEST) { // failed to switch to WAKEUP_REQUEST @@ -1827,7 +1830,7 @@ void PosixSignals::do_resume(OSThread* osthread) { while (true) { if (sr_notify(osthread) == 0) { - if (sr_semaphore.timedwait(2)) { + if (sr_semaphore->timedwait(2)) { if (osthread->sr.is_running()) { return; } From 7e068cc8d572e61cf2f4203f66fe0175a541209d Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Mon, 20 Oct 2025 07:16:00 +0000 Subject: [PATCH 199/561] 8343340: Swapping checking do not work for MetricsMemoryTester failcount Reviewed-by: sgehwolf --- .../platform/docker/MetricsMemoryTester.java | 4 ++-- .../platform/docker/TestDockerMemoryMetrics.java | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java index 8069965e8d8..c27a1c7480f 100644 --- a/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java +++ b/test/jdk/jdk/internal/platform/docker/MetricsMemoryTester.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -70,7 +70,7 @@ public class MetricsMemoryTester { // We need swap to execute this test or will SEGV if (memAndSwapLimit <= memLimit) { - System.out.println("No swap memory limits, test case skipped"); + System.out.println("No swap memory limits. Ignoring test!"); } else { long count = Metrics.systemMetrics().getMemoryFailCount(); diff --git a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java index 7cbab5c3b86..2afb5ed93b1 100644 --- a/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java +++ b/test/jdk/jdk/internal/platform/docker/TestDockerMemoryMetrics.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import jdk.test.lib.containers.docker.Common; import jdk.test.lib.containers.docker.DockerRunOptions; import jdk.test.lib.containers.docker.DockerTestUtils; import jdk.test.lib.process.OutputAnalyzer; +import jtreg.SkippedException; /* * @test @@ -112,18 +113,22 @@ public class TestDockerMemoryMetrics { // Check whether swapping really works for this test // On some systems there is no swap space enabled. And running - // 'java -Xms{mem-limit} -Xmx{mem-limit} -version' would fail due to swap space size being 0. + // 'java -Xms{mem-limit} -Xmx{mem-limit} -XX:+AlwaysPreTouch -version' + // would fail due to swap space size being 0. Note that when swap is + // properly enabled on the system the container gets the same amount + // of swap as is configured for memory. Thus, 2x{mem-limit} is the actual + // memory and swap bound for this pre-test. DockerRunOptions preOpts = new DockerRunOptions(imageName, "/jdk/bin/java", "-version"); preOpts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/") .addDockerOpts("--memory=" + value) + .addJavaOpts("-XX:+AlwaysPreTouch") .addJavaOpts("-Xms" + value) .addJavaOpts("-Xmx" + value); OutputAnalyzer oa = DockerTestUtils.dockerRunJava(preOpts); String output = oa.getOutput(); if (!output.contains("version")) { - System.out.println("Swapping doesn't work for this test."); - return; + throw new SkippedException("Swapping doesn't work for this test."); } DockerRunOptions opts = @@ -137,8 +142,7 @@ public class TestDockerMemoryMetrics { oa = DockerTestUtils.dockerRunJava(opts); output = oa.getOutput(); if (output.contains("Ignoring test")) { - System.out.println("Ignored by the tester"); - return; + throw new SkippedException("Ignored by the tester"); } oa.shouldHaveExitValue(0).shouldContain("TEST PASSED!!!"); } From 2148dbbe75bb827d568532021391beb0738744c2 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Mon, 20 Oct 2025 07:29:49 +0000 Subject: [PATCH 200/561] 8370213: Add sun/misc/SunMiscSignalTest.java to ProblemList Reviewed-by: alanb --- test/jdk/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 0e69446ae35..faf4c5e7a94 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -743,6 +743,8 @@ sun/tools/jstatd/TestJstatdRmiPort.java 8251259,8293577 jdk/incubator/vector/ShortMaxVectorTests.java 8306592 generic-i586 jdk/incubator/vector/LoadJsvmlTest.java 8305390 windows-x64 +sun/misc/SunMiscSignalTest.java 8370207 generic-all + ############################################################################ # jdk_jfr From 39211e7fac74a30c343987e2ef17ab5d855a73dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lund=C3=A9n?= Date: Mon, 20 Oct 2025 07:49:01 +0000 Subject: [PATCH 201/561] 8369569: Rename methods in regmask.hpp to conform with HotSpot coding style Reviewed-by: aseoane, rcastanedalo, epeter --- src/hotspot/cpu/aarch64/aarch64.ad | 30 +- src/hotspot/cpu/riscv/riscv.ad | 34 +- .../x86/gc/shared/barrierSetAssembler_x86.cpp | 52 +- src/hotspot/cpu/x86/x86_64.ad | 80 +-- src/hotspot/share/adlc/archDesc.cpp | 14 +- src/hotspot/share/adlc/formssel.cpp | 2 +- src/hotspot/share/adlc/output_c.cpp | 2 +- .../share/gc/shared/c2/barrierSetC2.cpp | 24 +- src/hotspot/share/opto/callnode.cpp | 22 +- src/hotspot/share/opto/cfgnode.cpp | 16 +- src/hotspot/share/opto/cfgnode.hpp | 2 +- src/hotspot/share/opto/chaitin.cpp | 48 +- src/hotspot/share/opto/chaitin.hpp | 22 +- src/hotspot/share/opto/coalesce.cpp | 14 +- src/hotspot/share/opto/connode.hpp | 4 +- src/hotspot/share/opto/gcm.cpp | 3 +- src/hotspot/share/opto/ifg.cpp | 14 +- src/hotspot/share/opto/ifnode.cpp | 2 +- src/hotspot/share/opto/lcm.cpp | 16 +- src/hotspot/share/opto/machnode.cpp | 9 +- src/hotspot/share/opto/machnode.hpp | 4 +- src/hotspot/share/opto/matcher.cpp | 198 +++---- src/hotspot/share/opto/memnode.cpp | 6 +- src/hotspot/share/opto/multnode.cpp | 4 +- src/hotspot/share/opto/node.cpp | 4 +- src/hotspot/share/opto/postaloc.cpp | 8 +- src/hotspot/share/opto/reg_split.cpp | 6 +- src/hotspot/share/opto/regmask.cpp | 8 +- src/hotspot/share/opto/regmask.hpp | 40 +- src/hotspot/share/opto/rootnode.cpp | 2 +- test/hotspot/gtest/opto/test_regmask.cpp | 554 +++++++++--------- 31 files changed, 628 insertions(+), 616 deletions(-) diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 51cdf8c71df..0cdf3c1b8b5 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -1267,38 +1267,38 @@ source %{ // registers conditionally reserved. _ANY_REG32_mask = _ALL_REG32_mask; - _ANY_REG32_mask.Remove(OptoReg::as_OptoReg(r31_sp->as_VMReg())); + _ANY_REG32_mask.remove(OptoReg::as_OptoReg(r31_sp->as_VMReg())); _ANY_REG_mask = _ALL_REG_mask; _PTR_REG_mask = _ALL_REG_mask; _NO_SPECIAL_REG32_mask = _ALL_REG32_mask; - _NO_SPECIAL_REG32_mask.SUBTRACT(_NON_ALLOCATABLE_REG32_mask); + _NO_SPECIAL_REG32_mask.subtract(_NON_ALLOCATABLE_REG32_mask); _NO_SPECIAL_REG_mask = _ALL_REG_mask; - _NO_SPECIAL_REG_mask.SUBTRACT(_NON_ALLOCATABLE_REG_mask); + _NO_SPECIAL_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); _NO_SPECIAL_PTR_REG_mask = _ALL_REG_mask; - _NO_SPECIAL_PTR_REG_mask.SUBTRACT(_NON_ALLOCATABLE_REG_mask); + _NO_SPECIAL_PTR_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); // r27 is not allocatable when compressed oops is on and heapbase is not // zero, compressed klass pointers doesn't use r27 after JDK-8234794 if (UseCompressedOops && (CompressedOops::base() != nullptr)) { - _NO_SPECIAL_REG32_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg())); - _NO_SPECIAL_REG_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg())); - _NO_SPECIAL_PTR_REG_mask.Remove(OptoReg::as_OptoReg(r27->as_VMReg())); + _NO_SPECIAL_REG32_mask.remove(OptoReg::as_OptoReg(r27->as_VMReg())); + _NO_SPECIAL_REG_mask.remove(OptoReg::as_OptoReg(r27->as_VMReg())); + _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(r27->as_VMReg())); } // r29 is not allocatable when PreserveFramePointer is on if (PreserveFramePointer) { - _NO_SPECIAL_REG32_mask.Remove(OptoReg::as_OptoReg(r29->as_VMReg())); - _NO_SPECIAL_REG_mask.Remove(OptoReg::as_OptoReg(r29->as_VMReg())); - _NO_SPECIAL_PTR_REG_mask.Remove(OptoReg::as_OptoReg(r29->as_VMReg())); + _NO_SPECIAL_REG32_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); + _NO_SPECIAL_REG_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); + _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); } _NO_SPECIAL_NO_RFP_PTR_REG_mask = _NO_SPECIAL_PTR_REG_mask; - _NO_SPECIAL_NO_RFP_PTR_REG_mask.Remove(OptoReg::as_OptoReg(r29->as_VMReg())); + _NO_SPECIAL_NO_RFP_PTR_REG_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); } // Optimizaton of volatile gets and puts @@ -1734,7 +1734,7 @@ uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const { } //============================================================================= -const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty; +const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::EMPTY; int ConstantTable::calculate_table_base_offset() const { return 0; // absolute addressing, no offset @@ -2520,10 +2520,10 @@ uint Matcher::int_pressure_limit() // as a spilled LRG. Spilling heuristics(Spill-USE) explicitly skip // derived pointers and lastly fail to spill after reaching maximum // number of iterations. Lowering the default pressure threshold to - // (_NO_SPECIAL_REG32_mask.Size() minus 1) forces CallNode to become + // (_NO_SPECIAL_REG32_mask.size() minus 1) forces CallNode to become // a high register pressure area of the code so that split_DEF can // generate DefinitionSpillCopy for the derived pointer. - uint default_int_pressure_threshold = _NO_SPECIAL_REG32_mask.Size() - 1; + uint default_int_pressure_threshold = _NO_SPECIAL_REG32_mask.size() - 1; if (!PreserveFramePointer) { // When PreserveFramePointer is off, frame pointer is allocatable, // but different from other SOC registers, it is excluded from @@ -2538,7 +2538,7 @@ uint Matcher::int_pressure_limit() uint Matcher::float_pressure_limit() { // _FLOAT_REG_mask is generated by adlc from the float_reg register class. - return (FLOATPRESSURE == -1) ? _FLOAT_REG_mask.Size() : FLOATPRESSURE; + return (FLOATPRESSURE == -1) ? _FLOAT_REG_mask.size() : FLOATPRESSURE; } bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 009acd628a0..00364d7dab7 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1093,39 +1093,39 @@ RegMask _NO_SPECIAL_NO_FP_PTR_REG_mask; void reg_mask_init() { _ANY_REG32_mask = _ALL_REG32_mask; - _ANY_REG32_mask.Remove(OptoReg::as_OptoReg(x0->as_VMReg())); + _ANY_REG32_mask.remove(OptoReg::as_OptoReg(x0->as_VMReg())); _ANY_REG_mask = _ALL_REG_mask; - _ANY_REG_mask.SUBTRACT(_ZR_REG_mask); + _ANY_REG_mask.subtract(_ZR_REG_mask); _PTR_REG_mask = _ALL_REG_mask; - _PTR_REG_mask.SUBTRACT(_ZR_REG_mask); + _PTR_REG_mask.subtract(_ZR_REG_mask); _NO_SPECIAL_REG32_mask = _ALL_REG32_mask; - _NO_SPECIAL_REG32_mask.SUBTRACT(_NON_ALLOCATABLE_REG32_mask); + _NO_SPECIAL_REG32_mask.subtract(_NON_ALLOCATABLE_REG32_mask); _NO_SPECIAL_REG_mask = _ALL_REG_mask; - _NO_SPECIAL_REG_mask.SUBTRACT(_NON_ALLOCATABLE_REG_mask); + _NO_SPECIAL_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); _NO_SPECIAL_PTR_REG_mask = _ALL_REG_mask; - _NO_SPECIAL_PTR_REG_mask.SUBTRACT(_NON_ALLOCATABLE_REG_mask); + _NO_SPECIAL_PTR_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); // x27 is not allocatable when compressed oops is on if (UseCompressedOops) { - _NO_SPECIAL_REG32_mask.Remove(OptoReg::as_OptoReg(x27->as_VMReg())); - _NO_SPECIAL_REG_mask.Remove(OptoReg::as_OptoReg(x27->as_VMReg())); - _NO_SPECIAL_PTR_REG_mask.Remove(OptoReg::as_OptoReg(x27->as_VMReg())); + _NO_SPECIAL_REG32_mask.remove(OptoReg::as_OptoReg(x27->as_VMReg())); + _NO_SPECIAL_REG_mask.remove(OptoReg::as_OptoReg(x27->as_VMReg())); + _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(x27->as_VMReg())); } // x8 is not allocatable when PreserveFramePointer is on if (PreserveFramePointer) { - _NO_SPECIAL_REG32_mask.Remove(OptoReg::as_OptoReg(x8->as_VMReg())); - _NO_SPECIAL_REG_mask.Remove(OptoReg::as_OptoReg(x8->as_VMReg())); - _NO_SPECIAL_PTR_REG_mask.Remove(OptoReg::as_OptoReg(x8->as_VMReg())); + _NO_SPECIAL_REG32_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); + _NO_SPECIAL_REG_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); + _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); } _NO_SPECIAL_NO_FP_PTR_REG_mask = _NO_SPECIAL_PTR_REG_mask; - _NO_SPECIAL_NO_FP_PTR_REG_mask.Remove(OptoReg::as_OptoReg(x8->as_VMReg())); + _NO_SPECIAL_NO_FP_PTR_REG_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); } void PhaseOutput::pd_perform_mach_node_analysis() { @@ -1326,7 +1326,7 @@ uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const { } //============================================================================= -const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty; +const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::EMPTY; int ConstantTable::calculate_table_base_offset() const { return 0; // absolute addressing, no offset @@ -2104,10 +2104,10 @@ uint Matcher::int_pressure_limit() // as a spilled LRG. Spilling heuristics(Spill-USE) explicitly skip // derived pointers and lastly fail to spill after reaching maximum // number of iterations. Lowering the default pressure threshold to - // (_NO_SPECIAL_REG32_mask.Size() minus 1) forces CallNode to become + // (_NO_SPECIAL_REG32_mask.size() minus 1) forces CallNode to become // a high register pressure area of the code so that split_DEF can // generate DefinitionSpillCopy for the derived pointer. - uint default_int_pressure_threshold = _NO_SPECIAL_REG32_mask.Size() - 1; + uint default_int_pressure_threshold = _NO_SPECIAL_REG32_mask.size() - 1; if (!PreserveFramePointer) { // When PreserveFramePointer is off, frame pointer is allocatable, // but different from other SOC registers, it is excluded from @@ -2122,7 +2122,7 @@ uint Matcher::int_pressure_limit() uint Matcher::float_pressure_limit() { // _FLOAT_REG_mask is generated by adlc from the float_reg register class. - return (FLOATPRESSURE == -1) ? _FLOAT_REG_mask.Size() : FLOATPRESSURE; + return (FLOATPRESSURE == -1) ? _FLOAT_REG_mask.size() : FLOATPRESSURE; } bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { diff --git a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp index 925444792ca..09c5d93dbb3 100644 --- a/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/gc/shared/barrierSetAssembler_x86.cpp @@ -471,33 +471,33 @@ void SaveLiveRegisters::initialize(BarrierStubC2* stub) { // Create mask of caller saved registers that need to // be saved/restored if live RegMask caller_saved; - caller_saved.Insert(OptoReg::as_OptoReg(rax->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(rcx->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(rdx->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(rsi->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(rdi->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r8->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r9->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r10->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r11->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(rax->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(rcx->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(rdx->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(rsi->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(rdi->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r8->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r9->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r10->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r11->as_VMReg())); if (UseAPX) { - caller_saved.Insert(OptoReg::as_OptoReg(r16->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r17->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r18->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r19->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r20->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r21->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r22->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r23->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r24->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r25->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r26->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r27->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r28->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r29->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r30->as_VMReg())); - caller_saved.Insert(OptoReg::as_OptoReg(r31->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r16->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r17->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r18->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r19->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r20->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r21->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r22->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r23->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r24->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r25->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r26->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r27->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r28->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r29->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r30->as_VMReg())); + caller_saved.insert(OptoReg::as_OptoReg(r31->as_VMReg())); } int gp_spill_size = 0; @@ -511,7 +511,7 @@ void SaveLiveRegisters::initialize(BarrierStubC2* stub) { const VMReg vm_reg = OptoReg::as_VMReg(opto_reg); if (vm_reg->is_Register()) { - if (caller_saved.Member(opto_reg)) { + if (caller_saved.member(opto_reg)) { _gp_registers.append(vm_reg->as_Register()); gp_spill_size += 8; } diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index b40f9e2924a..27daa51b39e 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -500,89 +500,89 @@ void reg_mask_init() { _ANY_REG_mask = _ALL_REG_mask; if (PreserveFramePointer) { - _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); } if (need_r12_heapbase()) { - _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); - _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); } _PTR_REG_mask = _ANY_REG_mask; - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg())); - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg())); - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); if (!UseAPX) { for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); - _PTR_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next())); } } _STACK_OR_PTR_REG_mask = _PTR_REG_mask; - _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + _STACK_OR_PTR_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); _PTR_REG_NO_RBP_mask = _PTR_REG_mask; - _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); _PTR_NO_RAX_REG_mask = _PTR_REG_mask; - _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); _PTR_NO_RAX_RBX_REG_mask = _PTR_NO_RAX_REG_mask; - _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg())); - _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); + _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg())); + _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); _LONG_REG_mask = _PTR_REG_mask; _STACK_OR_LONG_REG_mask = _LONG_REG_mask; - _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + _STACK_OR_LONG_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); _LONG_NO_RAX_RDX_REG_mask = _LONG_REG_mask; - _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); - _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); - _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); _LONG_NO_RCX_REG_mask = _LONG_REG_mask; - _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); - _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); + _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); + _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); _LONG_NO_RBP_R13_REG_mask = _LONG_REG_mask; - _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); - _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(r13->as_VMReg())); - _LONG_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); _INT_REG_mask = _ALL_INT_REG_mask; if (!UseAPX) { for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { - _INT_REG_mask.Remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + _INT_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); } } if (PreserveFramePointer) { - _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _INT_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); } if (need_r12_heapbase()) { - _INT_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); + _INT_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); } _STACK_OR_INT_REG_mask = _INT_REG_mask; - _STACK_OR_INT_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + _STACK_OR_INT_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); _INT_NO_RAX_RDX_REG_mask = _INT_REG_mask; - _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); _INT_NO_RCX_REG_mask = _INT_REG_mask; - _INT_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); + _INT_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); _INT_NO_RBP_R13_REG_mask = _INT_REG_mask; - _INT_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _INT_NO_RBP_R13_REG_mask.Remove(OptoReg::as_OptoReg(r13->as_VMReg())); + _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); // _FLOAT_REG_LEGACY_mask/_FLOAT_REG_EVEX_mask is generated by adlc // from the float_reg_legacy/float_reg_evex register class. @@ -756,7 +756,7 @@ static void emit_fp_min_max(MacroAssembler* masm, XMMRegister dst, } //============================================================================= -const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty; +const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::EMPTY; int ConstantTable::calculate_table_base_offset() const { return 0; // absolute addressing, no offset @@ -1658,7 +1658,7 @@ bool Matcher::is_spillable_arg(int reg) uint Matcher::int_pressure_limit() { - return (INTPRESSURE == -1) ? _INT_REG_mask.Size() : INTPRESSURE; + return (INTPRESSURE == -1) ? _INT_REG_mask.size() : INTPRESSURE; } uint Matcher::float_pressure_limit() @@ -1666,7 +1666,7 @@ uint Matcher::float_pressure_limit() // After experiment around with different values, the following default threshold // works best for LCM's register pressure scheduling on x64. uint dec_count = VM_Version::supports_evex() ? 4 : 2; - uint default_float_pressure_threshold = _FLOAT_REG_mask.Size() - dec_count; + uint default_float_pressure_threshold = _FLOAT_REG_mask.size() - dec_count; return (FLOATPRESSURE == -1) ? default_float_pressure_threshold : FLOATPRESSURE; } diff --git a/src/hotspot/share/adlc/archDesc.cpp b/src/hotspot/share/adlc/archDesc.cpp index 263752c521d..2461903ea26 100644 --- a/src/hotspot/share/adlc/archDesc.cpp +++ b/src/hotspot/share/adlc/archDesc.cpp @@ -899,10 +899,12 @@ int ArchDesc::emit_msg(int quiet, int flag, int line, const char *fmt, // Construct the name of the register mask. static const char *getRegMask(const char *reg_class_name) { - if( reg_class_name == nullptr ) return "RegMask::Empty"; + if (reg_class_name == nullptr) { + return "RegMask::EMPTY"; + } if (strcmp(reg_class_name,"Universe")==0) { - return "RegMask::Empty"; + return "RegMask::EMPTY"; } else if (strcmp(reg_class_name,"stack_slots")==0) { return "(Compile::current()->FIRST_STACK_mask())"; } else if (strcmp(reg_class_name, "dynamic")==0) { @@ -920,7 +922,7 @@ static const char *getRegMask(const char *reg_class_name) { // Convert a register class name to its register mask. const char *ArchDesc::reg_class_to_reg_mask(const char *rc_name) { - const char *reg_mask = "RegMask::Empty"; + const char* reg_mask = "RegMask::EMPTY"; if( _register ) { RegClass *reg_class = _register->getRegClass(rc_name); @@ -939,7 +941,7 @@ const char *ArchDesc::reg_class_to_reg_mask(const char *rc_name) { // Obtain the name of the RegMask for an OperandForm const char *ArchDesc::reg_mask(OperandForm &opForm) { - const char *regMask = "RegMask::Empty"; + const char* regMask = "RegMask::EMPTY"; // Check constraints on result's register class const char *result_class = opForm.constrained_reg_class(); @@ -968,9 +970,9 @@ const char *ArchDesc::reg_mask(InstructForm &inForm) { abort(); } - // Instructions producing 'Universe' use RegMask::Empty + // Instructions producing 'Universe' use RegMask::EMPTY if (strcmp(result,"Universe") == 0) { - return "RegMask::Empty"; + return "RegMask::EMPTY"; } // Lookup this result operand and get its register class diff --git a/src/hotspot/share/adlc/formssel.cpp b/src/hotspot/share/adlc/formssel.cpp index b938d5b7560..182587d2f2f 100644 --- a/src/hotspot/share/adlc/formssel.cpp +++ b/src/hotspot/share/adlc/formssel.cpp @@ -2422,7 +2422,7 @@ const char *OperandForm::constrained_reg_class() const { // Return the register class associated with 'leaf'. const char *OperandForm::in_reg_class(uint leaf, FormDict &globals) { - const char *reg_class = nullptr; // "RegMask::Empty"; + const char* reg_class = nullptr; // "RegMask::EMPTY"; if((_matrule == nullptr) || (_matrule->is_chain_rule(globals))) { reg_class = constrained_reg_class(); diff --git a/src/hotspot/share/adlc/output_c.cpp b/src/hotspot/share/adlc/output_c.cpp index caf2c9952a6..110db7f0e98 100644 --- a/src/hotspot/share/adlc/output_c.cpp +++ b/src/hotspot/share/adlc/output_c.cpp @@ -2837,7 +2837,7 @@ static void defineIn_RegMask(FILE *fp, FormDict &globals, OperandForm &oper) { if (strcmp(first_reg_class, "stack_slots") == 0) { fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); } else if (strcmp(first_reg_class, "dynamic") == 0) { - fprintf(fp," return &RegMask::Empty;\n"); + fprintf(fp, " return &RegMask::EMPTY;\n"); } else { const char* first_reg_class_to_upper = toUpper(first_reg_class); fprintf(fp," return &%s_mask();\n", first_reg_class_to_upper); diff --git a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp index e12e7b56e23..c4eefee5f65 100644 --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp @@ -115,7 +115,7 @@ uint8_t BarrierStubC2::barrier_data() const { void BarrierStubC2::preserve(Register r) { const VMReg vm_reg = r->as_VMReg(); assert(vm_reg->is_Register(), "r must be a general-purpose register"); - _preserve.Insert(OptoReg::as_OptoReg(vm_reg)); + _preserve.insert(OptoReg::as_OptoReg(vm_reg)); } void BarrierStubC2::dont_preserve(Register r) { @@ -124,7 +124,7 @@ void BarrierStubC2::dont_preserve(Register r) { // Subtract the given register and all its sub-registers (e.g. {R11, R11_H} // for r11 in aarch64). do { - _preserve.Remove(OptoReg::as_OptoReg(vm_reg)); + _preserve.remove(OptoReg::as_OptoReg(vm_reg)); vm_reg = vm_reg->next(); } while (vm_reg->is_Register() && !vm_reg->is_concrete()); } @@ -1171,7 +1171,7 @@ void BarrierSetC2::compute_liveness_at_stubs() const { // Initialize to union of successors for (uint i = 0; i < block->_num_succs; i++) { const uint succ_id = block->_succs[i]->_pre_order; - new_live.OR(live[succ_id]); + new_live.or_with(live[succ_id]); } // Walk block backwards, computing liveness @@ -1182,7 +1182,7 @@ void BarrierSetC2::compute_liveness_at_stubs() const { if (!bs_state->needs_livein_data()) { RegMask* const regs = bs_state->live(node); if (regs != nullptr) { - regs->OR(new_live); + regs->or_with(new_live); } } @@ -1190,10 +1190,10 @@ void BarrierSetC2::compute_liveness_at_stubs() const { const OptoReg::Name first = bs->refine_register(node, regalloc->get_reg_first(node)); const OptoReg::Name second = bs->refine_register(node, regalloc->get_reg_second(node)); if (first != OptoReg::Bad) { - new_live.Remove(first); + new_live.remove(first); } if (second != OptoReg::Bad) { - new_live.Remove(second); + new_live.remove(second); } // Add use bits @@ -1202,10 +1202,10 @@ void BarrierSetC2::compute_liveness_at_stubs() const { const OptoReg::Name first = bs->refine_register(use, regalloc->get_reg_first(use)); const OptoReg::Name second = bs->refine_register(use, regalloc->get_reg_second(use)); if (first != OptoReg::Bad) { - new_live.Insert(first); + new_live.insert(first); } if (second != OptoReg::Bad) { - new_live.Insert(second); + new_live.insert(second); } } @@ -1213,16 +1213,16 @@ void BarrierSetC2::compute_liveness_at_stubs() const { if (bs_state->needs_livein_data()) { RegMask* const regs = bs_state->live(node); if (regs != nullptr) { - regs->OR(new_live); + regs->or_with(new_live); } } } // Now at block top, see if we have any changes - new_live.SUBTRACT(old_live); - if (!new_live.is_Empty()) { + new_live.subtract(old_live); + if (!new_live.is_empty()) { // Liveness has refined, update and propagate to prior blocks - old_live.OR(new_live); + old_live.or_with(new_live); for (uint i = 1; i < block->num_preds(); ++i) { Block* const pred = cfg->get_block_for_node(block->pred(i)); worklist.push(pred); diff --git a/src/hotspot/share/opto/callnode.cpp b/src/hotspot/share/opto/callnode.cpp index ef1ebc5cef9..ad6548a649e 100644 --- a/src/hotspot/share/opto/callnode.cpp +++ b/src/hotspot/share/opto/callnode.cpp @@ -72,7 +72,7 @@ void StartNode::calling_convention(BasicType* sig_bt, VMRegPair *parm_regs, uint //------------------------------Registers-------------------------------------- const RegMask &StartNode::in_RegMask(uint) const { - return RegMask::Empty; + return RegMask::EMPTY; } //------------------------------match------------------------------------------ @@ -82,7 +82,7 @@ Node *StartNode::match( const ProjNode *proj, const Matcher *match ) { case TypeFunc::Control: case TypeFunc::I_O: case TypeFunc::Memory: - return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this,proj->_con,RegMask::EMPTY,MachProjNode::unmatched_proj); case TypeFunc::FramePtr: return new MachProjNode(this,proj->_con,Matcher::c_frame_ptr_mask, Op_RegP); case TypeFunc::ReturnAdr: @@ -777,12 +777,12 @@ Node *CallNode::match( const ProjNode *proj, const Matcher *match ) { case TypeFunc::Control: case TypeFunc::I_O: case TypeFunc::Memory: - return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this,proj->_con,RegMask::EMPTY,MachProjNode::unmatched_proj); case TypeFunc::Parms+1: // For LONG & DOUBLE returns assert(tf()->range()->field_at(TypeFunc::Parms+1) == Type::HALF, ""); // 2nd half of doubles and longs - return new MachProjNode(this,proj->_con, RegMask::Empty, (uint)OptoReg::Bad); + return new MachProjNode(this,proj->_con, RegMask::EMPTY, (uint)OptoReg::Bad); case TypeFunc::Parms: { // Normal returns uint ideal_reg = tf()->range()->field_at(TypeFunc::Parms)->ideal_reg(); @@ -798,14 +798,14 @@ Node *CallNode::match( const ProjNode *proj, const Matcher *match ) { if(ideal_reg >= Op_VecA && ideal_reg <= Op_VecZ) { if(OptoReg::is_valid(regs.second())) { for (OptoReg::Name r = regs.first(); r <= regs.second(); r = OptoReg::add(r, 1)) { - rm.Insert(r); + rm.insert(r); } } } } if( OptoReg::is_valid(regs.second()) ) - rm.Insert( regs.second() ); + rm.insert(regs.second()); return new MachProjNode(this,proj->_con,rm,ideal_reg); } @@ -1492,12 +1492,14 @@ void SafePointNode::dump_spec(outputStream *st) const { #endif const RegMask &SafePointNode::in_RegMask(uint idx) const { - if( idx < TypeFunc::Parms ) return RegMask::Empty; + if (idx < TypeFunc::Parms) { + return RegMask::EMPTY; + } // Values outside the domain represent debug info return *(Compile::current()->matcher()->idealreg2debugmask[in(idx)->ideal_reg()]); } const RegMask &SafePointNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } @@ -1608,7 +1610,7 @@ const RegMask &SafePointScalarObjectNode::in_RegMask(uint idx) const { } const RegMask &SafePointScalarObjectNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } uint SafePointScalarObjectNode::match_edge(uint idx) const { @@ -1659,7 +1661,7 @@ const RegMask &SafePointScalarMergeNode::in_RegMask(uint idx) const { } const RegMask &SafePointScalarMergeNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } uint SafePointScalarMergeNode::match_edge(uint idx) const { diff --git a/src/hotspot/share/opto/cfgnode.cpp b/src/hotspot/share/opto/cfgnode.cpp index ef912ff471a..0293f42d791 100644 --- a/src/hotspot/share/opto/cfgnode.cpp +++ b/src/hotspot/share/opto/cfgnode.cpp @@ -1014,7 +1014,7 @@ bool RegionNode::optimize_trichotomy(PhaseIterGVN* igvn) { } const RegMask &RegionNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } #ifndef PRODUCT @@ -2859,13 +2859,15 @@ bool PhiNode::is_tripcount(BasicType bt) const { //------------------------------out_RegMask------------------------------------ const RegMask &PhiNode::in_RegMask(uint i) const { - return i ? out_RegMask() : RegMask::Empty; + return i ? out_RegMask() : RegMask::EMPTY; } const RegMask &PhiNode::out_RegMask() const { uint ideal_reg = _type->ideal_reg(); assert( ideal_reg != Node::NotAMachineReg, "invalid type at Phi" ); - if( ideal_reg == 0 ) return RegMask::Empty; + if (ideal_reg == 0) { + return RegMask::EMPTY; + } assert(ideal_reg != Op_RegFlags, "flags register is not spillable"); return *(Compile::current()->matcher()->idealreg2spillmask[ideal_reg]); } @@ -2892,22 +2894,22 @@ Node* GotoNode::Identity(PhaseGVN* phase) { } const RegMask &GotoNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //============================================================================= const RegMask &JumpNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //============================================================================= const RegMask &JProjNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //============================================================================= const RegMask &CProjNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } diff --git a/src/hotspot/share/opto/cfgnode.hpp b/src/hotspot/share/opto/cfgnode.hpp index fffe00a4114..78ad085e03d 100644 --- a/src/hotspot/share/opto/cfgnode.hpp +++ b/src/hotspot/share/opto/cfgnode.hpp @@ -741,7 +741,7 @@ public: // Fake the incoming arguments mask for blackholes: accept all registers // and all stack slots. This would avoid any redundant register moves // for blackhole inputs. - return RegMask::All; + return RegMask::ALL; } #ifndef PRODUCT virtual void format(PhaseRegAlloc* ra, outputStream* st) const; diff --git a/src/hotspot/share/opto/chaitin.cpp b/src/hotspot/share/opto/chaitin.cpp index 45a91350626..903203bd094 100644 --- a/src/hotspot/share/opto/chaitin.cpp +++ b/src/hotspot/share/opto/chaitin.cpp @@ -49,9 +49,11 @@ void LRG::dump() const { _mask.dump(); if( _msize_valid ) { if( mask_size() == compute_mask_size() ) tty->print(", #%d ",_mask_size); - else tty->print(", #!!!_%d_vs_%d ",_mask_size,_mask.Size()); + else { + tty->print(", #!!!_%d_vs_%d ", _mask_size, _mask.size()); + } } else { - tty->print(", #?(%d) ",_mask.Size()); + tty->print(", #?(%d) ", _mask.size()); } tty->print("EffDeg: "); @@ -741,7 +743,7 @@ void PhaseChaitin::Register_Allocate() { } } else { // Misaligned; extract 2 bits OptoReg::Name hi = lrg.reg(); // Get hi register - lrg.Remove(hi); // Yank from mask + lrg.remove(hi); // Yank from mask int lo = lrg.mask().find_first_elem(); // Find lo set_pair(i, hi, lo); } @@ -773,7 +775,7 @@ void PhaseChaitin::de_ssa() { Node *n = block->get_node(j); // Pre-color to the zero live range, or pick virtual register const RegMask &rm = n->out_RegMask(); - _lrg_map.map(n->_idx, !rm.is_Empty() ? lr_counter++ : 0); + _lrg_map.map(n->_idx, !rm.is_empty() ? lr_counter++ : 0); } } @@ -794,7 +796,7 @@ void PhaseChaitin::mark_ssa() { Node *n = block->get_node(j); // Pre-color to the zero live range, or pick virtual register const RegMask &rm = n->out_RegMask(); - _lrg_map.map(n->_idx, !rm.is_Empty() ? n->_idx : 0); + _lrg_map.map(n->_idx, !rm.is_empty() ? n->_idx : 0); max_idx = (n->_idx > max_idx) ? n->_idx : max_idx; } } @@ -879,7 +881,7 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { // Limit result register mask to acceptable registers const RegMask &rm = n->out_RegMask(); - lrg.AND( rm ); + lrg.and_with(rm); uint ireg = n->ideal_reg(); assert( !n->bottom_type()->isa_oop_ptr() || ireg == Op_RegP, @@ -935,7 +937,7 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { switch (ireg) { case MachProjNode::fat_proj: // Fat projections have size equal to number of registers killed - lrg.set_num_regs(rm.Size()); + lrg.set_num_regs(rm.size()); lrg.set_reg_pressure(lrg.num_regs()); lrg._fat_proj = 1; lrg._is_bound = 1; @@ -1126,7 +1128,7 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { // Later, AFTER aggressive, this live range will have to spill // but the spiller handles slow-path calls very nicely. } else { - lrg.AND( rm ); + lrg.and_with(rm); } // Check for bound register masks @@ -1164,7 +1166,7 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { if (!is_vect && !n->is_SpillCopy() && (lrg._def == nullptr || lrg.is_multidef() || !lrg._def->is_SpillCopy()) && lrgmask.is_misaligned_pair()) { - lrg.Clear(); + lrg.clear(); } // Check for maximum frequency value @@ -1405,7 +1407,7 @@ void PhaseChaitin::Simplify( ) { // Is 'reg' register legal for 'lrg'? static bool is_legal_reg(LRG& lrg, OptoReg::Name reg) { - if (lrg.mask().can_represent(reg) && lrg.mask().Member(reg)) { + if (lrg.mask().can_represent(reg) && lrg.mask().member(reg)) { // RA uses OptoReg which represent the highest element of a registers set. // For example, vectorX (128bit) on x86 uses [XMM,XMMb,XMMc,XMMd] set // in which XMMd is used by RA to represent such vectors. A double value @@ -1459,7 +1461,7 @@ static OptoReg::Name find_first_set(LRG& lrg, RegMask& mask) { return assigned; } else { // Remove more for each iteration - mask.Remove(assigned - num_regs + 1); // Unmask the lowest reg + mask.remove(assigned - num_regs + 1); // Unmask the lowest reg mask.clear_to_sets(RegMask::SlotsPerVecA); // Align by SlotsPerVecA bits assigned = mask.find_first_set(lrg, num_regs); } @@ -1510,7 +1512,7 @@ OptoReg::Name PhaseChaitin::bias_color(LRG& lrg) { // Choose a color which is legal for him ResourceMark rm(C->regmask_arena()); RegMask tempmask(lrg.mask(), C->regmask_arena()); - tempmask.AND(lrgs(copy_lrg).mask()); + tempmask.and_with(lrgs(copy_lrg).mask()); tempmask.clear_to_sets(lrg.num_regs()); OptoReg::Name reg = find_first_set(lrg, tempmask); if (OptoReg::is_valid(reg)) @@ -1533,9 +1535,9 @@ OptoReg::Name PhaseChaitin::bias_color(LRG& lrg) { if( (++_alternate & 1) && OptoReg::is_valid(reg) ) { // This 'Remove; find; Insert' idiom is an expensive way to find the // SECOND element in the mask. - lrg.Remove(reg); + lrg.remove(reg); OptoReg::Name reg2 = lrg.mask().find_first_elem(); - lrg.Insert(reg); + lrg.insert(reg); if (OptoReg::is_reg(reg2)) { reg = reg2; } @@ -1545,8 +1547,8 @@ OptoReg::Name PhaseChaitin::bias_color(LRG& lrg) { // Choose a color in the current chunk OptoReg::Name PhaseChaitin::choose_color(LRG& lrg) { - assert(C->in_preserve_stack_slots() == 0 || lrg.mask().is_offset() || lrg._is_bound || lrg.mask().is_bound1() || !lrg.mask().Member(OptoReg::Name(_matcher._old_SP - 1)), "must not allocate stack0 (inside preserve area)"); - assert(C->out_preserve_stack_slots() == 0 || lrg.mask().is_offset() || lrg._is_bound || lrg.mask().is_bound1() || !lrg.mask().Member(OptoReg::Name(_matcher._old_SP + 0)), "must not allocate stack0 (inside preserve area)"); + assert(C->in_preserve_stack_slots() == 0 || lrg.mask().is_offset() || lrg._is_bound || lrg.mask().is_bound1() || !lrg.mask().member(OptoReg::Name(_matcher._old_SP - 1)), "must not allocate stack0 (inside preserve area)"); + assert(C->out_preserve_stack_slots() == 0 || lrg.mask().is_offset() || lrg._is_bound || lrg.mask().is_bound1() || !lrg.mask().member(OptoReg::Name(_matcher._old_SP + 0)), "must not allocate stack0 (inside preserve area)"); if( lrg.num_regs() == 1 || // Common Case !lrg._fat_proj ) // Aligned+adjacent pairs ok @@ -1622,20 +1624,20 @@ uint PhaseChaitin::Select( ) { // at retry_next_chunk. if (nreg < LRG::SPILL_REG) { #ifndef PRODUCT - uint size = lrg->mask().Size(); + uint size = lrg->mask().size(); ResourceMark rm(C->regmask_arena()); RegMask trace_mask(lrg->mask(), C->regmask_arena()); #endif - lrg->SUBTRACT_inner(nlrg.mask()); + lrg->subtract_inner(nlrg.mask()); #ifndef PRODUCT - if (trace_spilling() && lrg->mask().Size() != size) { + if (trace_spilling() && lrg->mask().size() != size) { ttyLocker ttyl; tty->print("L%d ", lidx); trace_mask.dump(); tty->print(" intersected L%d ", neighbor); nlrg.mask().dump(); tty->print(" removed "); - trace_mask.SUBTRACT(lrg->mask()); + trace_mask.subtract(lrg->mask()); trace_mask.dump(); tty->print(" leaving "); lrg->mask().dump(); @@ -1701,15 +1703,15 @@ uint PhaseChaitin::Select( ) { } else { assert(!lrg->_is_vector || n_regs <= RegMask::SlotsPerVecZ, "sanity"); } - lrg->Clear(); // Clear the mask - lrg->Insert(reg); // Set regmask to match selected reg + lrg->clear(); // Clear the mask + lrg->insert(reg); // Set regmask to match selected reg // For vectors and pairs, also insert the low bit of the pair // We always choose the high bit, then mask the low bits by register size if (lrg->is_scalable() && OptoReg::is_stack(lrg->reg())) { // stack n_regs = lrg->scalable_reg_slots(); } for (int i = 1; i < n_regs; i++) { - lrg->Insert(OptoReg::add(reg,-i)); + lrg->insert(OptoReg::add(reg, -i)); } lrg->set_mask_size(n_regs); } else { // Else fatproj diff --git a/src/hotspot/share/opto/chaitin.hpp b/src/hotspot/share/opto/chaitin.hpp index 9b3f8123ac2..22cc4259c6f 100644 --- a/src/hotspot/share/opto/chaitin.hpp +++ b/src/hotspot/share/opto/chaitin.hpp @@ -103,11 +103,11 @@ public: private: RegMask _mask; // Allowed registers for this LRG - uint _mask_size; // cache of _mask.Size(); + uint _mask_size; // cache of _mask.size(); public: - int compute_mask_size() const { return _mask.is_infinite_stack() ? INFINITE_STACK_SIZE : _mask.Size(); } + int compute_mask_size() const { return _mask.is_infinite_stack() ? INFINITE_STACK_SIZE : _mask.size(); } void set_mask_size( int size ) { - assert((size == (int)INFINITE_STACK_SIZE) || (size == (int)_mask.Size()), ""); + assert((size == (int)INFINITE_STACK_SIZE) || (size == (int)_mask.size()), ""); _mask_size = size; #ifdef ASSERT _msize_valid=1; @@ -130,15 +130,15 @@ public: const RegMask &mask() const { return _mask; } void set_mask( const RegMask &rm ) { _mask = rm; DEBUG_ONLY(_msize_valid=0;)} void init_mask(Arena* arena) { new (&_mask) RegMask(arena); } - void AND( const RegMask &rm ) { _mask.AND(rm); DEBUG_ONLY(_msize_valid=0;)} - void SUBTRACT( const RegMask &rm ) { _mask.SUBTRACT(rm); DEBUG_ONLY(_msize_valid=0;)} - void SUBTRACT_inner(const RegMask& rm) { _mask.SUBTRACT_inner(rm); DEBUG_ONLY(_msize_valid = 0;) } - void Clear() { _mask.Clear() ; DEBUG_ONLY(_msize_valid=1); _mask_size = 0; } - void Set_All() { _mask.Set_All(); DEBUG_ONLY(_msize_valid = 1); _mask_size = _mask.rm_size_in_bits(); } + void and_with( const RegMask &rm ) { _mask.and_with(rm); DEBUG_ONLY(_msize_valid=0;)} + void subtract( const RegMask &rm ) { _mask.subtract(rm); DEBUG_ONLY(_msize_valid=0;)} + void subtract_inner(const RegMask& rm) { _mask.subtract_inner(rm); DEBUG_ONLY(_msize_valid = 0;) } + void clear() { _mask.clear() ; DEBUG_ONLY(_msize_valid=1); _mask_size = 0; } + void set_all() { _mask.set_all(); DEBUG_ONLY(_msize_valid = 1); _mask_size = _mask.rm_size_in_bits(); } bool rollover() { DEBUG_ONLY(_msize_valid = 1); _mask_size = _mask.rm_size_in_bits(); return _mask.rollover(); } - void Insert( OptoReg::Name reg ) { _mask.Insert(reg); DEBUG_ONLY(_msize_valid=0;) } - void Remove( OptoReg::Name reg ) { _mask.Remove(reg); DEBUG_ONLY(_msize_valid=0;) } + void insert( OptoReg::Name reg ) { _mask.insert(reg); DEBUG_ONLY(_msize_valid=0;) } + void remove( OptoReg::Name reg ) { _mask.remove(reg); DEBUG_ONLY(_msize_valid=0;) } void clear_to_sets() { _mask.clear_to_sets(_num_regs); DEBUG_ONLY(_msize_valid=0;) } private: @@ -624,7 +624,7 @@ private: void check_pressure_at_fatproj(uint fatproj_location, RegMask& fatproj_mask) { // this pressure is only valid at this instruction, i.e. we don't need to lower // the register pressure since the fat proj was never live before (going backwards) - uint new_pressure = current_pressure() + fatproj_mask.Size(); + uint new_pressure = current_pressure() + fatproj_mask.size(); if (new_pressure > final_pressure()) { _final_pressure = new_pressure; } diff --git a/src/hotspot/share/opto/coalesce.cpp b/src/hotspot/share/opto/coalesce.cpp index 90a2dd0e152..82c1f7050c7 100644 --- a/src/hotspot/share/opto/coalesce.cpp +++ b/src/hotspot/share/opto/coalesce.cpp @@ -118,7 +118,7 @@ void PhaseCoalesce::combine_these_two(Node *n1, Node *n2) { // Merge in the IFG _phc._ifg->Union( lr1, lr2 ); // Combine register restrictions - lrg1->AND(lrg2->mask()); + lrg1->and_with(lrg2->mask()); } } } @@ -503,8 +503,8 @@ void PhaseConservativeCoalesce::union_helper( Node *lr1_node, Node *lr2_node, ui lrgs(lr2).is_multidef() ) ? NodeSentinel : src_def; lrgs(lr2)._def = nullptr; // No def for lrg 2 - lrgs(lr2).Clear(); // Force empty mask for LRG 2 - //lrgs(lr2)._size = 0; // Live-range 2 goes dead + lrgs(lr2).clear(); // Force empty mask for LRG 2 + // lrgs(lr2)._size = 0; // Live-range 2 goes dead lrgs(lr1)._is_oop |= lrgs(lr2)._is_oop; lrgs(lr2)._is_oop = 0; // In particular, not an oop for GC info @@ -570,9 +570,9 @@ uint PhaseConservativeCoalesce::compute_separating_interferences(Node *dst_copy, // If we attempt to coalesce across a bound def if( lrgs(lidx).is_bound() ) { // Do not let the coalesced LRG expect to get the bound color - rm.SUBTRACT( lrgs(lidx).mask() ); + rm.subtract(lrgs(lidx).mask()); // Recompute rm_size - rm_size = rm.Size(); + rm_size = rm.size(); //if( rm._flags ) rm_size += 1000000; if( reg_degree >= rm_size ) return max_juint; } @@ -695,9 +695,9 @@ bool PhaseConservativeCoalesce::copy_copy(Node *dst_copy, Node *src_copy, Block // intersecting their allowed register sets. ResourceMark rm(C->regmask_arena()); RegMask mask(lrgs(lr1).mask(), C->regmask_arena()); - mask.AND(lrgs(lr2).mask()); + mask.and_with(lrgs(lr2).mask()); // Number of bits free - uint rm_size = mask.Size(); + uint rm_size = mask.size(); if (UseFPUForSpilling && mask.is_infinite_stack() ) { // Don't coalesce when frequency difference is large diff --git a/src/hotspot/share/opto/connode.hpp b/src/hotspot/share/opto/connode.hpp index 47888587960..8cf3eea7570 100644 --- a/src/hotspot/share/opto/connode.hpp +++ b/src/hotspot/share/opto/connode.hpp @@ -43,8 +43,8 @@ public: } virtual int Opcode() const; virtual uint hash() const; - virtual const RegMask &out_RegMask() const { return RegMask::Empty; } - virtual const RegMask &in_RegMask(uint) const { return RegMask::Empty; } + virtual const RegMask& out_RegMask() const { return RegMask::EMPTY; } + virtual const RegMask& in_RegMask(uint) const { return RegMask::EMPTY; } virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return Node::Ideal(phase, can_reshape); diff --git a/src/hotspot/share/opto/gcm.cpp b/src/hotspot/share/opto/gcm.cpp index 72c001a64c4..4a1553b1e00 100644 --- a/src/hotspot/share/opto/gcm.cpp +++ b/src/hotspot/share/opto/gcm.cpp @@ -1449,8 +1449,9 @@ Block* PhaseCFG::hoist_to_cheaper_block(Block* LCA, Block* early, Node* self) { // single register. Hoisting stretches the live range of the // single register and may force spilling. MachNode* mach = self->is_Mach() ? self->as_Mach() : nullptr; - if (mach != nullptr && mach->out_RegMask().is_bound1() && !mach->out_RegMask().is_Empty()) + if (mach != nullptr && mach->out_RegMask().is_bound1() && !mach->out_RegMask().is_empty()) { in_latency = true; + } #ifndef PRODUCT if (trace_opto_pipelining()) { diff --git a/src/hotspot/share/opto/ifg.cpp b/src/hotspot/share/opto/ifg.cpp index 438209df8f8..681d2f28cb1 100644 --- a/src/hotspot/share/opto/ifg.cpp +++ b/src/hotspot/share/opto/ifg.cpp @@ -55,7 +55,7 @@ void PhaseIFG::init( uint maxlrg ) { for( uint i = 0; i < maxlrg; i++ ) { _adjs[i].initialize(maxlrg); _lrgs[i].init_mask(_arena); - _lrgs[i].Set_All(); + _lrgs[i].set_all(); } } @@ -655,7 +655,7 @@ bool PhaseChaitin::remove_node_if_not_used(Block* b, uint location, Node* n, uin void PhaseChaitin::check_for_high_pressure_transition_at_fatproj(uint& block_reg_pressure, uint location, LRG& lrg, Pressure& pressure, const int op_regtype) { ResourceMark rm(C->regmask_arena()); RegMask mask_tmp(lrg.mask(), C->regmask_arena()); - mask_tmp.AND(*Matcher::idealreg2regmask[op_regtype]); + mask_tmp.and_with(*Matcher::idealreg2regmask[op_regtype]); pressure.check_pressure_at_fatproj(location, mask_tmp); } @@ -742,17 +742,17 @@ void PhaseChaitin::remove_bound_register_from_interfering_live_ranges(LRG& lrg, // Leave only aligned set of bits. r2mask.smear_to_sets(interfering_lrg.num_regs()); // It includes vector case. - interfering_lrg.SUBTRACT(r2mask); + interfering_lrg.subtract(r2mask); interfering_lrg.compute_set_mask_size(); } else if (r_size != 1) { // fat proj - interfering_lrg.SUBTRACT(mask); + interfering_lrg.subtract(mask); interfering_lrg.compute_set_mask_size(); } else { // Common case: size 1 bound removal OptoReg::Name r_reg = mask.find_first_elem(); - if (interfering_lrg.mask().Member(r_reg)) { - interfering_lrg.Remove(r_reg); + if (interfering_lrg.mask().member(r_reg)) { + interfering_lrg.remove(r_reg); interfering_lrg.set_mask_size(interfering_lrg.mask().is_infinite_stack() ? LRG::INFINITE_STACK_SIZE : old_size - 1); } } @@ -933,7 +933,7 @@ uint PhaseChaitin::build_ifg_physical( ResourceArea *a ) { // Since rematerializable DEFs are not bound but the live range is, // some uses must be bound. If we spill live range 'r', it can // rematerialize at each use site according to its bindings. - if (lrg.is_bound() && !n->rematerialize() && !lrg.mask().is_Empty()) { + if (lrg.is_bound() && !n->rematerialize() && !lrg.mask().is_empty()) { remove_bound_register_from_interfering_live_ranges(lrg, &liveout, must_spill); } interfere_with_live(lid, &liveout); diff --git a/src/hotspot/share/opto/ifnode.cpp b/src/hotspot/share/opto/ifnode.cpp index b397c2c5852..83e975b95a2 100644 --- a/src/hotspot/share/opto/ifnode.cpp +++ b/src/hotspot/share/opto/ifnode.cpp @@ -82,7 +82,7 @@ const Type* IfNode::Value(PhaseGVN* phase) const { } const RegMask &IfNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //------------------------------split_if--------------------------------------- diff --git a/src/hotspot/share/opto/lcm.cpp b/src/hotspot/share/opto/lcm.cpp index fd7644f8587..53a503866fa 100644 --- a/src/hotspot/share/opto/lcm.cpp +++ b/src/hotspot/share/opto/lcm.cpp @@ -855,12 +855,12 @@ void PhaseCFG::needed_for_next_call(Block* block, Node* this_call, VectorSet& ne static void add_call_kills(MachProjNode *proj, RegMask& regs, const char* save_policy, bool exclude_soe) { // Fill in the kill mask for the call for( OptoReg::Name r = OptoReg::Name(0); r < _last_Mach_Reg; r=OptoReg::add(r,1) ) { - if( !regs.Member(r) ) { // Not already defined by the call + if (!regs.member(r)) { // Not already defined by the call // Save-on-call register? if ((save_policy[r] == 'C') || (save_policy[r] == 'A') || ((save_policy[r] == 'E') && exclude_soe)) { - proj->_rout.Insert(r); + proj->_rout.insert(r); } } } @@ -884,7 +884,7 @@ uint PhaseCFG::sched_call(Block* block, uint node_cnt, Node_List& worklist, Grow // Schedule next to call block->map_node(n, node_cnt++); // Collect defined registers - regs.OR(n->out_RegMask()); + regs.or_with(n->out_RegMask()); // Check for scheduling the next control-definer if( n->bottom_type() == Type::CONTROL ) // Warm up next pile of heuristic bits @@ -907,12 +907,12 @@ uint PhaseCFG::sched_call(Block* block, uint node_cnt, Node_List& worklist, Grow // Act as if the call defines the Frame Pointer. // Certainly the FP is alive and well after the call. - regs.Insert(_matcher.c_frame_pointer()); + regs.insert(_matcher.c_frame_pointer()); // Set all registers killed and not already defined by the call. uint r_cnt = mcall->tf()->range()->cnt(); int op = mcall->ideal_Opcode(); - MachProjNode *proj = new MachProjNode( mcall, r_cnt+1, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode* proj = new MachProjNode(mcall, r_cnt + 1, RegMask::EMPTY, MachProjNode::fat_proj); map_node_to_block(proj, block); block->insert_node(proj, node_cnt++); @@ -1164,10 +1164,10 @@ bool PhaseCFG::schedule_local(Block* block, GrowableArray& ready_cnt, Vecto if (n->is_Mach() && n->as_Mach()->has_call()) { RegMask regs; - regs.Insert(_matcher.c_frame_pointer()); - regs.OR(n->out_RegMask()); + regs.insert(_matcher.c_frame_pointer()); + regs.or_with(n->out_RegMask()); - MachProjNode *proj = new MachProjNode( n, 1, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode* proj = new MachProjNode(n, 1, RegMask::EMPTY, MachProjNode::fat_proj); map_node_to_block(proj, block); block->insert_node(proj, phi_cnt++); diff --git a/src/hotspot/share/opto/machnode.cpp b/src/hotspot/share/opto/machnode.cpp index 5da929e4748..e58befd8032 100644 --- a/src/hotspot/share/opto/machnode.cpp +++ b/src/hotspot/share/opto/machnode.cpp @@ -525,7 +525,7 @@ bool MachNode::rematerialize() const { uint idx = oper_input_base(); if (req() > idx) { const RegMask &rm = in_RegMask(idx); - if (!rm.is_Empty() && rm.is_bound(ideal_reg())) { + if (!rm.is_empty() && rm.is_bound(ideal_reg())) { return false; } } @@ -619,8 +619,11 @@ void MachNullCheckNode::save_label( Label** label, uint* block_num ) { } const RegMask &MachNullCheckNode::in_RegMask( uint idx ) const { - if( idx == 0 ) return RegMask::Empty; - else return in(1)->as_Mach()->out_RegMask(); + if (idx == 0) { + return RegMask::EMPTY; + } else { + return in(1)->as_Mach()->out_RegMask(); + } } //============================================================================= diff --git a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp index 43e9a35df34..30ac9181bec 100644 --- a/src/hotspot/share/opto/machnode.hpp +++ b/src/hotspot/share/opto/machnode.hpp @@ -737,7 +737,7 @@ public: virtual const class Type *bottom_type() const { return TypeTuple::IFBOTH; } virtual uint ideal_reg() const { return NotAMachineReg; } virtual const RegMask &in_RegMask(uint) const; - virtual const RegMask &out_RegMask() const { return RegMask::Empty; } + virtual const RegMask& out_RegMask() const { return RegMask::EMPTY; } #ifndef PRODUCT virtual const char *Name() const { return "NullCheck"; } virtual void format( PhaseRegAlloc *, outputStream *st ) const; @@ -769,7 +769,7 @@ public: virtual int Opcode() const; virtual const Type *bottom_type() const; virtual const TypePtr *adr_type() const; - virtual const RegMask &in_RegMask(uint) const { return RegMask::Empty; } + virtual const RegMask& in_RegMask(uint) const { return RegMask::EMPTY; } virtual const RegMask &out_RegMask() const { return _rout; } virtual uint ideal_reg() const { return _ideal_reg; } // Need size_of() for virtual ProjNode::clone() diff --git a/src/hotspot/share/opto/matcher.cpp b/src/hotspot/share/opto/matcher.cpp index 7d73487cf88..7621fc1bb3e 100644 --- a/src/hotspot/share/opto/matcher.cpp +++ b/src/hotspot/share/opto/matcher.cpp @@ -176,12 +176,12 @@ void Matcher::match( ) { if (C->failing()) { return; } - assert(_return_addr_mask.is_Empty(), + assert(_return_addr_mask.is_empty(), "return address mask must be empty initially"); - _return_addr_mask.Insert(return_addr()); + _return_addr_mask.insert(return_addr()); #ifdef _LP64 // Pointers take 2 slots in 64-bit land - _return_addr_mask.Insert(OptoReg::add(return_addr(),1)); + _return_addr_mask.insert(OptoReg::add(return_addr(), 1)); #endif // Map a Java-signature return type into return register-value @@ -197,7 +197,7 @@ void Matcher::match( ) { // And mask for same _return_value_mask = RegMask(regs.first()); if( OptoReg::is_valid(regs.second()) ) - _return_value_mask.Insert(regs.second()); + _return_value_mask.insert(regs.second()); } // --------------- @@ -261,7 +261,7 @@ void Matcher::match( ) { assert( is_even(_in_arg_limit), "out_preserve must be even" ); for( i = 0; i < argcnt; i++ ) { // Permit args to have no register - _calling_convention_mask[i].Clear(); + _calling_convention_mask[i].clear(); if( !vm_parm_regs[i].first()->is_valid() && !vm_parm_regs[i].second()->is_valid() ) { _parm_regs[i].set_bad(); continue; @@ -273,11 +273,11 @@ void Matcher::match( ) { OptoReg::Name reg1 = warp_incoming_stk_arg(vm_parm_regs[i].first()); if( OptoReg::is_valid(reg1)) - _calling_convention_mask[i].Insert(reg1); + _calling_convention_mask[i].insert(reg1); OptoReg::Name reg2 = warp_incoming_stk_arg(vm_parm_regs[i].second()); if( OptoReg::is_valid(reg2)) - _calling_convention_mask[i].Insert(reg2); + _calling_convention_mask[i].insert(reg2); // Saved biased stack-slot register number _parm_regs[i].set_pair(reg2, reg1); @@ -422,9 +422,9 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) { new (rms + i) RegMask(Compile::current()->comp_arena()); } // Do all the pre-defined register masks - rms[TypeFunc::Control ] = RegMask::Empty; - rms[TypeFunc::I_O ] = RegMask::Empty; - rms[TypeFunc::Memory ] = RegMask::Empty; + rms[TypeFunc::Control ] = RegMask::EMPTY; + rms[TypeFunc::I_O ] = RegMask::EMPTY; + rms[TypeFunc::Memory ] = RegMask::EMPTY; rms[TypeFunc::ReturnAdr] = ret_adr; rms[TypeFunc::FramePtr ] = fp; return rms; @@ -471,15 +471,15 @@ void Matcher::init_first_stack_mask() { assert(index == NOF_STACK_MASKS, "wrong size"); // At first, start with the empty mask - C->FIRST_STACK_mask().Clear(); + C->FIRST_STACK_mask().clear(); // Add in the incoming argument area OptoReg::Name init_in = OptoReg::add(_old_SP, C->out_preserve_stack_slots()); for (OptoReg::Name i = init_in; i < _in_arg_limit; i = OptoReg::add(i, 1)) { - C->FIRST_STACK_mask().Insert(i); + C->FIRST_STACK_mask().insert(i); } // Add in all bits past the outgoing argument area - C->FIRST_STACK_mask().Set_All_From(_out_arg_limit); + C->FIRST_STACK_mask().set_all_from(_out_arg_limit); // Make spill masks. Registers for their class, plus FIRST_STACK_mask. RegMask aligned_stack_mask(C->FIRST_STACK_mask(), C->comp_arena()); @@ -491,41 +491,41 @@ void Matcher::init_first_stack_mask() { *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP]; #ifdef _LP64 *idealreg2spillmask[Op_RegN] = *idealreg2regmask[Op_RegN]; - idealreg2spillmask[Op_RegN]->OR(C->FIRST_STACK_mask()); - idealreg2spillmask[Op_RegP]->OR(aligned_stack_mask); + idealreg2spillmask[Op_RegN]->or_with(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegP]->or_with(aligned_stack_mask); #else - idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegP]->or_with(C->FIRST_STACK_mask()); #endif *idealreg2spillmask[Op_RegI] = *idealreg2regmask[Op_RegI]; - idealreg2spillmask[Op_RegI]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegI]->or_with(C->FIRST_STACK_mask()); *idealreg2spillmask[Op_RegL] = *idealreg2regmask[Op_RegL]; - idealreg2spillmask[Op_RegL]->OR(aligned_stack_mask); + idealreg2spillmask[Op_RegL]->or_with(aligned_stack_mask); *idealreg2spillmask[Op_RegF] = *idealreg2regmask[Op_RegF]; - idealreg2spillmask[Op_RegF]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegF]->or_with(C->FIRST_STACK_mask()); *idealreg2spillmask[Op_RegD] = *idealreg2regmask[Op_RegD]; - idealreg2spillmask[Op_RegD]->OR(aligned_stack_mask); + idealreg2spillmask[Op_RegD]->or_with(aligned_stack_mask); if (Matcher::has_predicated_vectors()) { *idealreg2spillmask[Op_RegVectMask] = *idealreg2regmask[Op_RegVectMask]; - idealreg2spillmask[Op_RegVectMask]->OR(aligned_stack_mask); + idealreg2spillmask[Op_RegVectMask]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_RegVectMask] = RegMask::Empty; + *idealreg2spillmask[Op_RegVectMask] = RegMask::EMPTY; } if (Matcher::vector_size_supported(T_BYTE,4)) { *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS]; - idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_VecS]->or_with(C->FIRST_STACK_mask()); } else { - *idealreg2spillmask[Op_VecS] = RegMask::Empty; + *idealreg2spillmask[Op_VecS] = RegMask::EMPTY; } if (Matcher::vector_size_supported(T_FLOAT,2)) { // For VecD we need dual alignment and 8 bytes (2 slots) for spills. // RA guarantees such alignment since it is needed for Double and Long values. *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD]; - idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask); + idealreg2spillmask[Op_VecD]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecD] = RegMask::Empty; + *idealreg2spillmask[Op_VecD] = RegMask::EMPTY; } if (Matcher::vector_size_supported(T_FLOAT,4)) { @@ -538,45 +538,45 @@ void Matcher::init_first_stack_mask() { // otherwise vector spills could stomp over stack slots in caller frame. OptoReg::Name in = OptoReg::add(_in_arg_limit, -1); for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecX); k++) { - aligned_stack_mask.Remove(in); + aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX); assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX]; - idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask); + idealreg2spillmask[Op_VecX]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecX] = RegMask::Empty; + *idealreg2spillmask[Op_VecX] = RegMask::EMPTY; } if (Matcher::vector_size_supported(T_FLOAT,8)) { // For VecY we need octo alignment and 32 bytes (8 slots) for spills. OptoReg::Name in = OptoReg::add(_in_arg_limit, -1); for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecY); k++) { - aligned_stack_mask.Remove(in); + aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY); assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY]; - idealreg2spillmask[Op_VecY]->OR(aligned_stack_mask); + idealreg2spillmask[Op_VecY]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecY] = RegMask::Empty; + *idealreg2spillmask[Op_VecY] = RegMask::EMPTY; } if (Matcher::vector_size_supported(T_FLOAT,16)) { // For VecZ we need enough alignment and 64 bytes (16 slots) for spills. OptoReg::Name in = OptoReg::add(_in_arg_limit, -1); for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecZ); k++) { - aligned_stack_mask.Remove(in); + aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecZ); assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); *idealreg2spillmask[Op_VecZ] = *idealreg2regmask[Op_VecZ]; - idealreg2spillmask[Op_VecZ]->OR(aligned_stack_mask); + idealreg2spillmask[Op_VecZ]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecZ] = RegMask::Empty; + *idealreg2spillmask[Op_VecZ] = RegMask::EMPTY; } if (Matcher::supports_scalable_vector()) { @@ -586,7 +586,7 @@ void Matcher::init_first_stack_mask() { // Exclude last input arg stack slots to avoid spilling vector register there, // otherwise RegVectMask spills could stomp over stack slots in caller frame. for (; (in >= init_in) && (k < scalable_predicate_reg_slots()); k++) { - scalable_stack_mask.Remove(in); + scalable_stack_mask.remove(in); in = OptoReg::add(in, -1); } @@ -594,13 +594,13 @@ void Matcher::init_first_stack_mask() { scalable_stack_mask.clear_to_sets(scalable_predicate_reg_slots()); assert(scalable_stack_mask.is_infinite_stack(), "should be infinite stack"); *idealreg2spillmask[Op_RegVectMask] = *idealreg2regmask[Op_RegVectMask]; - idealreg2spillmask[Op_RegVectMask]->OR(scalable_stack_mask); + idealreg2spillmask[Op_RegVectMask]->or_with(scalable_stack_mask); } // Exclude last input arg stack slots to avoid spilling vector register there, // otherwise vector spills could stomp over stack slots in caller frame. for (; (in >= init_in) && (k < scalable_vector_reg_size(T_FLOAT)); k++) { - scalable_stack_mask.Remove(in); + scalable_stack_mask.remove(in); in = OptoReg::add(in, -1); } @@ -608,9 +608,9 @@ void Matcher::init_first_stack_mask() { scalable_stack_mask.clear_to_sets(RegMask::SlotsPerVecA); assert(scalable_stack_mask.is_infinite_stack(), "should be infinite stack"); *idealreg2spillmask[Op_VecA] = *idealreg2regmask[Op_VecA]; - idealreg2spillmask[Op_VecA]->OR(scalable_stack_mask); + idealreg2spillmask[Op_VecA]->or_with(scalable_stack_mask); } else { - *idealreg2spillmask[Op_VecA] = RegMask::Empty; + *idealreg2spillmask[Op_VecA] = RegMask::EMPTY; } if (UseFPUForSpilling) { @@ -618,20 +618,20 @@ void Matcher::init_first_stack_mask() { // symmetric and that the registers involved are the same size. // On sparc for instance we may have to use 64 bit moves will // kill 2 registers when used with F0-F31. - idealreg2spillmask[Op_RegI]->OR(*idealreg2regmask[Op_RegF]); - idealreg2spillmask[Op_RegF]->OR(*idealreg2regmask[Op_RegI]); + idealreg2spillmask[Op_RegI]->or_with(*idealreg2regmask[Op_RegF]); + idealreg2spillmask[Op_RegF]->or_with(*idealreg2regmask[Op_RegI]); #ifdef _LP64 - idealreg2spillmask[Op_RegN]->OR(*idealreg2regmask[Op_RegF]); - idealreg2spillmask[Op_RegL]->OR(*idealreg2regmask[Op_RegD]); - idealreg2spillmask[Op_RegD]->OR(*idealreg2regmask[Op_RegL]); - idealreg2spillmask[Op_RegP]->OR(*idealreg2regmask[Op_RegD]); + idealreg2spillmask[Op_RegN]->or_with(*idealreg2regmask[Op_RegF]); + idealreg2spillmask[Op_RegL]->or_with(*idealreg2regmask[Op_RegD]); + idealreg2spillmask[Op_RegD]->or_with(*idealreg2regmask[Op_RegL]); + idealreg2spillmask[Op_RegP]->or_with(*idealreg2regmask[Op_RegD]); #else - idealreg2spillmask[Op_RegP]->OR(*idealreg2regmask[Op_RegF]); + idealreg2spillmask[Op_RegP]->or_with(*idealreg2regmask[Op_RegF]); #ifdef ARM // ARM has support for moving 64bit values between a pair of // integer registers and a double register - idealreg2spillmask[Op_RegL]->OR(*idealreg2regmask[Op_RegD]); - idealreg2spillmask[Op_RegD]->OR(*idealreg2regmask[Op_RegL]); + idealreg2spillmask[Op_RegL]->or_with(*idealreg2regmask[Op_RegD]); + idealreg2spillmask[Op_RegD]->or_with(*idealreg2regmask[Op_RegL]); #endif #endif } @@ -659,20 +659,20 @@ void Matcher::init_first_stack_mask() { bool exclude_soe = !Compile::current()->is_method_compilation(); RegMask* caller_save_mask = exclude_soe ? &caller_save_regmask_exclude_soe : &caller_save_regmask; - idealreg2debugmask[Op_RegN]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegI]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegL]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegF]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegD]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegP]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_RegVectMask]->SUBTRACT(*caller_save_mask); + idealreg2debugmask[Op_RegN]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegI]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegL]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegF]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegD]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegP]->subtract(*caller_save_mask); + idealreg2debugmask[Op_RegVectMask]->subtract(*caller_save_mask); - idealreg2debugmask[Op_VecA]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_VecS]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_VecD]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_VecX]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_VecY]->SUBTRACT(*caller_save_mask); - idealreg2debugmask[Op_VecZ]->SUBTRACT(*caller_save_mask); + idealreg2debugmask[Op_VecA]->subtract(*caller_save_mask); + idealreg2debugmask[Op_VecS]->subtract(*caller_save_mask); + idealreg2debugmask[Op_VecD]->subtract(*caller_save_mask); + idealreg2debugmask[Op_VecX]->subtract(*caller_save_mask); + idealreg2debugmask[Op_VecY]->subtract(*caller_save_mask); + idealreg2debugmask[Op_VecZ]->subtract(*caller_save_mask); } //---------------------------is_save_on_entry---------------------------------- @@ -718,7 +718,7 @@ void Matcher::Fixup_Save_On_Entry( ) { reth_rms[TypeFunc::Parms] = mreg2regmask[reg]; #ifdef _LP64 // Need two slots for ptrs in 64-bit land - reth_rms[TypeFunc::Parms].Insert(OptoReg::add(OptoReg::Name(reg), 1)); + reth_rms[TypeFunc::Parms].insert(OptoReg::add(OptoReg::Name(reg), 1)); #endif } @@ -802,12 +802,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i+1] == Op_RegF && is_save_on_entry(i+1) ) { // Add other bit for double - ret_rms [ ret_edge_cnt].Insert(OptoReg::Name(i+1)); - reth_rms [ reth_edge_cnt].Insert(OptoReg::Name(i+1)); - tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1)); - tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1)); - forw_exc_rms [ forw_exc_edge_cnt].Insert(OptoReg::Name(i+1)); - halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1)); + ret_rms [ ret_edge_cnt].insert(OptoReg::Name(i+1)); + reth_rms [ reth_edge_cnt].insert(OptoReg::Name(i+1)); + tail_call_rms[tail_call_edge_cnt].insert(OptoReg::Name(i+1)); + tail_jump_rms[tail_jump_edge_cnt].insert(OptoReg::Name(i+1)); + forw_exc_rms [ forw_exc_edge_cnt].insert(OptoReg::Name(i+1)); + halt_rms [ halt_edge_cnt].insert(OptoReg::Name(i+1)); mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD ); proj_cnt += 2; // Skip 2 for doubles } @@ -815,12 +815,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i-1] == Op_RegF && _register_save_type[i ] == Op_RegF && is_save_on_entry(i-1) ) { - ret_rms [ ret_edge_cnt] = RegMask::Empty; - reth_rms [ reth_edge_cnt] = RegMask::Empty; - tail_call_rms[tail_call_edge_cnt] = RegMask::Empty; - tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty; - forw_exc_rms [ forw_exc_edge_cnt] = RegMask::Empty; - halt_rms [ halt_edge_cnt] = RegMask::Empty; + ret_rms [ ret_edge_cnt] = RegMask::EMPTY; + reth_rms [ reth_edge_cnt] = RegMask::EMPTY; + tail_call_rms[tail_call_edge_cnt] = RegMask::EMPTY; + tail_jump_rms[tail_jump_edge_cnt] = RegMask::EMPTY; + forw_exc_rms [ forw_exc_edge_cnt] = RegMask::EMPTY; + halt_rms [ halt_edge_cnt] = RegMask::EMPTY; mproj = C->top(); } // Is this a RegI low half of a RegL? Double up 2 adjacent RegI's @@ -830,12 +830,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i+1] == Op_RegI && is_save_on_entry(i+1) ) { // Add other bit for long - ret_rms [ ret_edge_cnt].Insert(OptoReg::Name(i+1)); - reth_rms [ reth_edge_cnt].Insert(OptoReg::Name(i+1)); - tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1)); - tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1)); - forw_exc_rms [ forw_exc_edge_cnt].Insert(OptoReg::Name(i+1)); - halt_rms [ halt_edge_cnt].Insert(OptoReg::Name(i+1)); + ret_rms [ ret_edge_cnt].insert(OptoReg::Name(i+1)); + reth_rms [ reth_edge_cnt].insert(OptoReg::Name(i+1)); + tail_call_rms[tail_call_edge_cnt].insert(OptoReg::Name(i+1)); + tail_jump_rms[tail_jump_edge_cnt].insert(OptoReg::Name(i+1)); + forw_exc_rms [ forw_exc_edge_cnt].insert(OptoReg::Name(i+1)); + halt_rms [ halt_edge_cnt].insert(OptoReg::Name(i+1)); mproj = new MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL ); proj_cnt += 2; // Skip 2 for longs } @@ -843,12 +843,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i-1] == Op_RegI && _register_save_type[i ] == Op_RegI && is_save_on_entry(i-1) ) { - ret_rms [ ret_edge_cnt] = RegMask::Empty; - reth_rms [ reth_edge_cnt] = RegMask::Empty; - tail_call_rms[tail_call_edge_cnt] = RegMask::Empty; - tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty; - forw_exc_rms [ forw_exc_edge_cnt] = RegMask::Empty; - halt_rms [ halt_edge_cnt] = RegMask::Empty; + ret_rms [ ret_edge_cnt] = RegMask::EMPTY; + reth_rms [ reth_edge_cnt] = RegMask::EMPTY; + tail_call_rms[tail_call_edge_cnt] = RegMask::EMPTY; + tail_jump_rms[tail_jump_edge_cnt] = RegMask::EMPTY; + forw_exc_rms [ forw_exc_edge_cnt] = RegMask::EMPTY; + halt_rms [ halt_edge_cnt] = RegMask::EMPTY; mproj = C->top(); } else { // Make a projection for it off the Start @@ -878,31 +878,31 @@ void Matcher::init_spill_mask( Node *ret ) { c_frame_ptr_mask = RegMask(c_frame_pointer()); #ifdef _LP64 // pointers are twice as big - c_frame_ptr_mask.Insert(OptoReg::add(c_frame_pointer(),1)); + c_frame_ptr_mask.insert(OptoReg::add(c_frame_pointer(), 1)); #endif // Start at OptoReg::stack0() - STACK_ONLY_mask.Clear(); + STACK_ONLY_mask.clear(); // STACK_ONLY_mask is all stack bits - STACK_ONLY_mask.Set_All_From(OptoReg::stack2reg(0)); + STACK_ONLY_mask.set_all_from(OptoReg::stack2reg(0)); for (OptoReg::Name i = OptoReg::Name(0); i < OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i, 1)) { // Copy the register names over into the shared world. // SharedInfo::regName[i] = regName[i]; // Handy RegMasks per machine register - mreg2regmask[i].Insert(i); + mreg2regmask[i].insert(i); // Set up regmasks used to exclude save-on-call (and always-save) registers from debug masks. if (_register_save_policy[i] == 'C' || _register_save_policy[i] == 'A') { - caller_save_regmask.Insert(i); + caller_save_regmask.insert(i); } // Exclude save-on-entry registers from debug masks for stub compilations. if (_register_save_policy[i] == 'C' || _register_save_policy[i] == 'A' || _register_save_policy[i] == 'E') { - caller_save_regmask_exclude_soe.Insert(i); + caller_save_regmask_exclude_soe.insert(i); } } @@ -1315,17 +1315,17 @@ MachNode *Matcher::match_sfpt( SafePointNode *sfpt ) { OptoReg::Name reg_snd = OptoReg::as_OptoReg(second); assert (reg_fst <= reg_snd, "fst=%d snd=%d", reg_fst, reg_snd); for (OptoReg::Name r = reg_fst; r <= reg_snd; r++) { - rm->Insert(r); + rm->insert(r); } } // Grab first register, adjust stack slots and insert in mask. OptoReg::Name reg1 = warp_outgoing_stk_arg(first, begin_out_arg_area, out_arg_limit_per_call ); if (OptoReg::is_valid(reg1)) - rm->Insert( reg1 ); + rm->insert(reg1); // Grab second register (if any), adjust stack slots and insert in mask. OptoReg::Name reg2 = warp_outgoing_stk_arg(second, begin_out_arg_area, out_arg_limit_per_call ); if (OptoReg::is_valid(reg2)) - rm->Insert( reg2 ); + rm->insert(reg2); } // End of for all arguments } @@ -1342,11 +1342,11 @@ MachNode *Matcher::match_sfpt( SafePointNode *sfpt ) { // is excluded on the max-per-method basis, debug info cannot land in // this killed area. uint r_cnt = mcall->tf()->range()->cnt(); - MachProjNode *proj = new MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj ); + MachProjNode* proj = new MachProjNode(mcall, r_cnt + 10000, RegMask::EMPTY, MachProjNode::fat_proj); for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++) { - proj->_rout.Insert(OptoReg::Name(i)); + proj->_rout.insert(OptoReg::Name(i)); } - if (!proj->_rout.is_Empty()) { + if (!proj->_rout.is_empty()) { push_projection(proj); } } diff --git a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp index 2080b7cbeb5..9187ef1a361 100644 --- a/src/hotspot/share/opto/memnode.cpp +++ b/src/hotspot/share/opto/memnode.cpp @@ -4325,7 +4325,7 @@ Node *MemBarNode::match( const ProjNode *proj, const Matcher *m ) { switch (proj->_con) { case TypeFunc::Control: case TypeFunc::Memory: - return new MachProjNode(this,proj->_con,RegMask::Empty,MachProjNode::unmatched_proj); + return new MachProjNode(this, proj->_con, RegMask::EMPTY, MachProjNode::unmatched_proj); } ShouldNotReachHere(); return nullptr; @@ -4572,7 +4572,7 @@ const RegMask &InitializeNode::in_RegMask(uint idx) const { // This edge should be set to top, by the set_complete. But be conservative. if (idx == InitializeNode::RawAddress) return *(Compile::current()->matcher()->idealreg2spillmask[in(idx)->ideal_reg()]); - return RegMask::Empty; + return RegMask::EMPTY; } Node* InitializeNode::memory(uint alias_idx) { @@ -5784,7 +5784,7 @@ void MergeMemNode::set_base_memory(Node *new_base) { //------------------------------out_RegMask------------------------------------ const RegMask &MergeMemNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //------------------------------dump_spec-------------------------------------- diff --git a/src/hotspot/share/opto/multnode.cpp b/src/hotspot/share/opto/multnode.cpp index f429d5daac0..4d8d1f4246c 100644 --- a/src/hotspot/share/opto/multnode.cpp +++ b/src/hotspot/share/opto/multnode.cpp @@ -36,7 +36,7 @@ //============================================================================= //------------------------------MultiNode-------------------------------------- const RegMask &MultiNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } Node *MultiNode::match( const ProjNode *proj, const Matcher *m ) { return proj->clone(); } @@ -185,7 +185,7 @@ const Type* ProjNode::Value(PhaseGVN* phase) const { //------------------------------out_RegMask------------------------------------ // Pass the buck uphill const RegMask &ProjNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } //------------------------------ideal_reg-------------------------------------- diff --git a/src/hotspot/share/opto/node.cpp b/src/hotspot/share/opto/node.cpp index cca98bd8aba..497d0d1aeb0 100644 --- a/src/hotspot/share/opto/node.cpp +++ b/src/hotspot/share/opto/node.cpp @@ -2800,12 +2800,12 @@ uint Node::match_edge(uint idx) const { // Register classes are defined for specific machines const RegMask &Node::out_RegMask() const { ShouldNotCallThis(); - return RegMask::Empty; + return RegMask::EMPTY; } const RegMask &Node::in_RegMask(uint) const { ShouldNotCallThis(); - return RegMask::Empty; + return RegMask::EMPTY; } void Node_Array::grow(uint i) { diff --git a/src/hotspot/share/opto/postaloc.cpp b/src/hotspot/share/opto/postaloc.cpp index 56d3ba6bbe0..8eb9167921b 100644 --- a/src/hotspot/share/opto/postaloc.cpp +++ b/src/hotspot/share/opto/postaloc.cpp @@ -173,7 +173,7 @@ int PhaseChaitin::use_prior_register( Node *n, uint idx, Node *def, Block *curre const LRG &def_lrg = lrgs(_lrg_map.live_range_id(def)); OptoReg::Name def_reg = def_lrg.reg(); const RegMask &use_mask = n->in_RegMask(idx); - bool can_use = use_mask.Member(def_reg); + bool can_use = use_mask.member(def_reg); if (!RegMask::is_vector(def->ideal_reg())) { // Check for a copy to or from a misaligned pair. // It is workaround for a sparc with misaligned pairs. @@ -678,7 +678,7 @@ void PhaseChaitin::post_allocate_copy_removal() { int n_regs = RegMask::num_registers(def_ideal_reg, lrgs(_lrg_map.live_range_id(def))); for (int l = 1; l < n_regs; l++) { OptoReg::Name ureg_lo = OptoReg::add(ureg,-l); - bool is_adjacent = lrgs(useidx).mask().Member(ureg_lo); + bool is_adjacent = lrgs(useidx).mask().member(ureg_lo); assert(is_adjacent || OptoReg::is_reg(ureg_lo), "only registers can be non-adjacent"); if (value[ureg_lo] == nullptr && is_adjacent) { // Nearly always adjacent @@ -762,13 +762,13 @@ void PhaseChaitin::post_allocate_copy_removal() { // If the value occupies a register pair, record same info // in both registers. OptoReg::Name nreg_lo = OptoReg::add(nreg,-1); - bool is_adjacent = lrgs(lidx).mask().Member(nreg_lo); + bool is_adjacent = lrgs(lidx).mask().member(nreg_lo); assert(is_adjacent || OptoReg::is_reg(nreg_lo), "only registers can be non-adjacent"); if (!is_adjacent) { // Nearly always adjacent // Sparc occasionally has non-adjacent pairs. // Find the actual other value RegMask tmp = lrgs(lidx).mask(); - tmp.Remove(nreg); + tmp.remove(nreg); nreg_lo = tmp.find_first_elem(); } if (value[nreg] != val || value[nreg_lo] != val) { diff --git a/src/hotspot/share/opto/reg_split.cpp b/src/hotspot/share/opto/reg_split.cpp index 327c30b152e..96f87fe6947 100644 --- a/src/hotspot/share/opto/reg_split.cpp +++ b/src/hotspot/share/opto/reg_split.cpp @@ -476,7 +476,7 @@ bool PhaseChaitin::prompt_use( Block *b, uint lidx ) { return true; // Found 1st use! } } - if (!n->out_RegMask().is_Empty()) { + if (!n->out_RegMask().is_empty()) { return false; } } @@ -1038,7 +1038,7 @@ uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) { // bound use if we can't rematerialize the def, or if we need the // split to form a misaligned pair. if (!umask.is_infinite_stack() && - (int)umask.Size() <= lrgs(useidx).num_regs() && + (int)umask.size() <= lrgs(useidx).num_regs() && (!def->rematerialize() || (!is_vect && umask.is_misaligned_pair()))) { // These need a Split regardless of overlap or pressure @@ -1128,7 +1128,7 @@ uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) { if( n->is_SpillCopy() ) { ResourceMark rm(C->regmask_arena()); RegMask tmp_rm(umask, C->regmask_arena()); - tmp_rm.SUBTRACT(Matcher::STACK_ONLY_mask); + tmp_rm.subtract(Matcher::STACK_ONLY_mask); if( dmask.overlap(tmp_rm) ) { if( def != n->in(inpidx) ) { n->set_req(inpidx, def); diff --git a/src/hotspot/share/opto/regmask.cpp b/src/hotspot/share/opto/regmask.cpp index 57cf13a8b31..dcbc4dbac8e 100644 --- a/src/hotspot/share/opto/regmask.cpp +++ b/src/hotspot/share/opto/regmask.cpp @@ -47,9 +47,9 @@ void OptoReg::dump(int r, outputStream *st) { //============================================================================= -const RegMask RegMask::Empty; +const RegMask RegMask::EMPTY; -const RegMask RegMask::All( +const RegMask RegMask::ALL( # define BODY(I) -1, FORALL_BODY # undef BODY @@ -126,7 +126,7 @@ void RegMask::clear_to_pairs() { } bool RegMask::is_misaligned_pair() const { - return Size() == 2 && !is_aligned_pairs(); + return size() == 2 && !is_aligned_pairs(); } bool RegMask::is_aligned_pairs() const { @@ -227,7 +227,7 @@ bool RegMask::is_bound(uint ireg) const { // for current regmask, where reg is the highest number. bool RegMask::is_valid_reg(OptoReg::Name reg, const int size) const { for (int i = 0; i < size; i++) { - if (!Member(reg - i)) { + if (!member(reg - i)) { return false; } } diff --git a/src/hotspot/share/opto/regmask.hpp b/src/hotspot/share/opto/regmask.hpp index 67e160940cc..832499d951d 100644 --- a/src/hotspot/share/opto/regmask.hpp +++ b/src/hotspot/share/opto/regmask.hpp @@ -449,7 +449,7 @@ public: RegMask(OptoReg::Name reg, Arena* arena DEBUG_ONLY(COMMA bool read_only = false)) : RegMask(arena DEBUG_ONLY(COMMA read_only)) { - Insert(reg); + insert(reg); } explicit RegMask(OptoReg::Name reg) : RegMask(reg, nullptr) {} @@ -473,7 +473,7 @@ public: // End deep copying // ---------------- - bool Member(OptoReg::Name reg) const { + bool member(OptoReg::Name reg) const { reg = reg - offset_bits(); if (reg < 0) { return false; @@ -486,7 +486,7 @@ public: } // Empty mask check. Ignores registers included through the infinite_stack flag. - bool is_Empty() const { + bool is_empty() const { assert(valid_watermarks(), "sanity"); for (unsigned i = _lwm; i <= _hwm; i++) { if (rm_word(i) != 0) { @@ -642,7 +642,7 @@ public: bool is_UP() const; // Clear a register mask. Does not clear any offset. - void Clear() { + void clear() { _lwm = rm_word_max_index(); _hwm = 0; set_range(0, 0, _rm_size_in_words); @@ -651,13 +651,13 @@ public: } // Fill a register mask with 1's - void Set_All() { + void set_all() { assert(_offset == 0, "offset non-zero"); - Set_All_From_Offset(); + set_all_from_offset(); } // Fill a register mask with 1's from the current offset. - void Set_All_From_Offset() { + void set_all_from_offset() { _lwm = 0; _hwm = rm_word_max_index(); set_range(0, 0xFF, _rm_size_in_words); @@ -666,7 +666,7 @@ public: } // Fill a register mask with 1's starting from the given register. - void Set_All_From(OptoReg::Name reg) { + void set_all_from(OptoReg::Name reg) { reg = reg - offset_bits(); assert(reg != OptoReg::Bad, "sanity"); assert(reg != OptoReg::Special, "sanity"); @@ -689,7 +689,7 @@ public: } // Insert register into mask - void Insert(OptoReg::Name reg) { + void insert(OptoReg::Name reg) { reg = reg - offset_bits(); assert(reg != OptoReg::Bad, "sanity"); assert(reg != OptoReg::Special, "sanity"); @@ -706,7 +706,7 @@ public: } // Remove register from mask - void Remove(OptoReg::Name reg) { + void remove(OptoReg::Name reg) { reg = reg - offset_bits(); assert(reg >= 0, "register outside mask"); assert(reg < (int)rm_size_in_bits(), "register outside mask"); @@ -714,8 +714,8 @@ public: rm_word(r >> LogBitsPerWord) &= ~(uintptr_t(1) << (r & WORD_BIT_MASK)); } - // OR 'rm' into 'this' - void OR(const RegMask &rm) { + // Or 'rm' into 'this' + void or_with(const RegMask& rm) { assert(_offset == rm._offset, "offset mismatch"); assert(valid_watermarks() && rm.valid_watermarks(), "sanity"); grow(rm._rm_size_in_words); @@ -736,8 +736,8 @@ public: assert(valid_watermarks(), "sanity"); } - // AND 'rm' into 'this' - void AND(const RegMask &rm) { + // And 'rm' into 'this' + void and_with(const RegMask& rm) { assert(_offset == rm._offset, "offset mismatch"); assert(valid_watermarks() && rm.valid_watermarks(), "sanity"); grow(rm._rm_size_in_words); @@ -768,7 +768,7 @@ public: } // Subtract 'rm' from 'this'. - void SUBTRACT(const RegMask &rm) { + void subtract(const RegMask& rm) { assert(_offset == rm._offset, "offset mismatch"); assert(valid_watermarks() && rm.valid_watermarks(), "sanity"); grow(rm._rm_size_in_words); @@ -791,7 +791,7 @@ public: // Subtract 'rm' from 'this', but ignore everything in 'rm' that does not // overlap with us and do not modify our infinite_stack flag. Supports masks of // differing offsets. Does not support 'rm' with the infinite_stack flag set. - void SUBTRACT_inner(const RegMask& rm) { + void subtract_inner(const RegMask& rm) { assert(valid_watermarks() && rm.valid_watermarks(), "sanity"); assert(!rm.is_infinite_stack(), "not supported"); // Various translations due to differing offsets @@ -821,12 +821,12 @@ public: return false; } _offset += _rm_size_in_words; - Set_All_From_Offset(); + set_all_from_offset(); return true; } // Compute size of register mask: number of bits - uint Size() const { + uint size() const { uint sum = 0; assert(valid_watermarks(), "sanity"); for (unsigned i = _lwm; i <= _hwm; i++) { @@ -895,8 +895,8 @@ public: void dump_hex(outputStream* st = tty) const; // Print a mask (raw hex) #endif - static const RegMask Empty; // Common empty mask - static const RegMask All; // Common all mask + static const RegMask EMPTY; // Common empty mask + static const RegMask ALL; // Common all mask bool can_represent(OptoReg::Name reg, unsigned int size = 1) const { reg = reg - offset_bits(); diff --git a/src/hotspot/share/opto/rootnode.cpp b/src/hotspot/share/opto/rootnode.cpp index 4ced13abdb1..60167c5436a 100644 --- a/src/hotspot/share/opto/rootnode.cpp +++ b/src/hotspot/share/opto/rootnode.cpp @@ -88,5 +88,5 @@ const Type* HaltNode::Value(PhaseGVN* phase) const { } const RegMask &HaltNode::out_RegMask() const { - return RegMask::Empty; + return RegMask::EMPTY; } diff --git a/test/hotspot/gtest/opto/test_regmask.cpp b/test/hotspot/gtest/opto/test_regmask.cpp index 0975314c33d..55dc020b6d0 100644 --- a/test/hotspot/gtest/opto/test_regmask.cpp +++ b/test/hotspot/gtest/opto/test_regmask.cpp @@ -33,11 +33,11 @@ static void contains_expected_num_of_registers(const RegMask& rm, unsigned int expected) { - ASSERT_TRUE(rm.Size() == expected); + ASSERT_TRUE(rm.size() == expected); if (expected > 0) { - ASSERT_TRUE(!rm.is_Empty()); + ASSERT_TRUE(!rm.is_empty()); } else { - ASSERT_TRUE(rm.is_Empty()); + ASSERT_TRUE(rm.is_empty()); ASSERT_TRUE(!rm.is_infinite_stack()); } @@ -60,14 +60,14 @@ TEST_VM(RegMask, empty) { TEST_VM(RegMask, iteration) { RegMask rm; - rm.Insert(30); - rm.Insert(31); - rm.Insert(32); - rm.Insert(33); - rm.Insert(62); - rm.Insert(63); - rm.Insert(64); - rm.Insert(65); + rm.insert(30); + rm.insert(31); + rm.insert(32); + rm.insert(33); + rm.insert(62); + rm.insert(63); + rm.insert(64); + rm.insert(65); RegMaskIterator rmi(rm); ASSERT_TRUE(rmi.next() == OptoReg::Name(30)); @@ -82,12 +82,12 @@ TEST_VM(RegMask, iteration) { } TEST_VM(RegMask, Set_ALL) { - // Check that Set_All doesn't add bits outside of rm.rm_size_bits() + // Check that set_all doesn't add bits outside of rm.rm_size_bits() RegMask rm; - rm.Set_All(); - ASSERT_TRUE(rm.Size() == rm.rm_size_in_bits()); - ASSERT_TRUE(!rm.is_Empty()); - // Set_All sets infinite_stack + rm.set_all(); + ASSERT_TRUE(rm.size() == rm.rm_size_in_bits()); + ASSERT_TRUE(!rm.is_empty()); + // set_all sets infinite_stack ASSERT_TRUE(rm.is_infinite_stack()); contains_expected_num_of_registers(rm, rm.rm_size_in_bits()); } @@ -95,64 +95,64 @@ TEST_VM(RegMask, Set_ALL) { TEST_VM(RegMask, Clear) { // Check that Clear doesn't leave any stray bits RegMask rm; - rm.Set_All(); - rm.Clear(); + rm.set_all(); + rm.clear(); contains_expected_num_of_registers(rm, 0); } -TEST_VM(RegMask, AND) { +TEST_VM(RegMask, and_with) { RegMask rm1; - rm1.Insert(OptoReg::Name(1)); + rm1.insert(OptoReg::Name(1)); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(1))); + ASSERT_TRUE(rm1.member(OptoReg::Name(1))); - rm1.AND(rm1); + rm1.and_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2; - rm1.AND(rm2); + rm1.and_with(rm2); contains_expected_num_of_registers(rm1, 0); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, OR) { +TEST_VM(RegMask, or_with) { RegMask rm1; - rm1.Insert(OptoReg::Name(1)); + rm1.insert(OptoReg::Name(1)); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(1))); + ASSERT_TRUE(rm1.member(OptoReg::Name(1))); - rm1.OR(rm1); + rm1.or_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2; - rm1.OR(rm2); + rm1.or_with(rm2); contains_expected_num_of_registers(rm1, 1); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, SUBTRACT) { +TEST_VM(RegMask, subtract) { RegMask rm1; RegMask rm2; - rm2.Set_All(); + rm2.set_all(); for (int i = 17; i < (int)rm1.rm_size_in_bits(); i++) { - rm1.Insert(i); + rm1.insert(i); } rm1.set_infinite_stack(true); ASSERT_TRUE(rm1.is_infinite_stack()); - rm2.SUBTRACT(rm1); + rm2.subtract(rm1); contains_expected_num_of_registers(rm1, rm1.rm_size_in_bits() - 17); contains_expected_num_of_registers(rm2, 17); } -TEST_VM(RegMask, SUBTRACT_inner) { +TEST_VM(RegMask, subtract_inner) { RegMask rm1; RegMask rm2; - rm2.Set_All(); + rm2.set_all(); for (int i = 17; i < (int)rm1.rm_size_in_bits(); i++) { - rm1.Insert(i); + rm1.insert(i); } - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm1, rm1.rm_size_in_bits() - 17); contains_expected_num_of_registers(rm2, 17); } @@ -161,11 +161,11 @@ TEST_VM(RegMask, is_bound1) { RegMask rm; ASSERT_FALSE(rm.is_bound1()); for (int i = 0; i < (int)rm.rm_size_in_bits() - 1; i++) { - rm.Insert(i); + rm.insert(i); ASSERT_TRUE(rm.is_bound1()) << "Index " << i; ASSERT_TRUE(rm.is_bound(Op_RegI)) << "Index " << i; contains_expected_num_of_registers(rm, 1); - rm.Remove(i); + rm.remove(i); } // infinite_stack does not count as a bound register rm.set_infinite_stack(true); @@ -176,18 +176,18 @@ TEST_VM(RegMask, is_bound_pair) { RegMask rm; ASSERT_TRUE(rm.is_bound_pair()); for (int i = 0; i < (int)rm.rm_size_in_bits() - 2; i++) { - rm.Insert(i); - rm.Insert(i + 1); + rm.insert(i); + rm.insert(i + 1); ASSERT_TRUE(rm.is_bound_pair()) << "Index " << i; ASSERT_TRUE(rm.is_bound_set(2)) << "Index " << i; ASSERT_TRUE(rm.is_bound(Op_RegI)) << "Index " << i; contains_expected_num_of_registers(rm, 2); - rm.Clear(); + rm.clear(); } // A pair with the infinite bit does not count as a bound pair - rm.Clear(); - rm.Insert(rm.rm_size_in_bits() - 2); - rm.Insert(rm.rm_size_in_bits() - 1); + rm.clear(); + rm.insert(rm.rm_size_in_bits() - 2); + rm.insert(rm.rm_size_in_bits() - 1); rm.set_infinite_stack(true); ASSERT_FALSE(rm.is_bound_pair()); } @@ -198,40 +198,40 @@ TEST_VM(RegMask, is_bound_set) { ASSERT_TRUE(rm.is_bound_set(size)); for (int i = 0; i < (int)rm.rm_size_in_bits() - size; i++) { for (int j = i; j < i + size; j++) { - rm.Insert(j); + rm.insert(j); } ASSERT_TRUE(rm.is_bound_set(size)) << "Size " << size << " Index " << i; contains_expected_num_of_registers(rm, size); - rm.Clear(); + rm.clear(); } // A set with infinite_stack does not count as a bound set for (int j = rm.rm_size_in_bits() - size; j < (int)rm.rm_size_in_bits(); j++) { - rm.Insert(j); + rm.insert(j); } rm.set_infinite_stack(true); ASSERT_FALSE(rm.is_bound_set(size)); - rm.Clear(); + rm.clear(); } } TEST_VM(RegMask, external_member) { RegMask rm; rm.set_infinite_stack(false); - ASSERT_FALSE(rm.Member(OptoReg::Name(rm.rm_size_in_bits()))); + ASSERT_FALSE(rm.member(OptoReg::Name(rm.rm_size_in_bits()))); rm.set_infinite_stack(true); - ASSERT_TRUE(rm.Member(OptoReg::Name(rm.rm_size_in_bits()))); + ASSERT_TRUE(rm.member(OptoReg::Name(rm.rm_size_in_bits()))); } TEST_VM(RegMask, find_element) { RegMask rm; - rm.Insert(OptoReg::Name(44)); - rm.Insert(OptoReg::Name(30)); - rm.Insert(OptoReg::Name(54)); + rm.insert(OptoReg::Name(44)); + rm.insert(OptoReg::Name(30)); + rm.insert(OptoReg::Name(54)); ASSERT_EQ(rm.find_first_elem(), OptoReg::Name(30)); ASSERT_EQ(rm.find_last_elem(), OptoReg::Name(54)); rm.set_infinite_stack(true); ASSERT_EQ(rm.find_last_elem(), OptoReg::Name(54)); - rm.Clear(); + rm.clear(); ASSERT_EQ(rm.find_first_elem(), OptoReg::Bad); ASSERT_EQ(rm.find_last_elem(), OptoReg::Bad); } @@ -242,58 +242,58 @@ TEST_VM(RegMask, find_first_set) { lrg._is_scalable = 0; lrg._is_vector = 0; ASSERT_EQ(rm.find_first_set(lrg, 2), OptoReg::Bad); - rm.Insert(OptoReg::Name(24)); - rm.Insert(OptoReg::Name(25)); - rm.Insert(OptoReg::Name(26)); - rm.Insert(OptoReg::Name(27)); - rm.Insert(OptoReg::Name(16)); - rm.Insert(OptoReg::Name(17)); - rm.Insert(OptoReg::Name(18)); - rm.Insert(OptoReg::Name(19)); + rm.insert(OptoReg::Name(24)); + rm.insert(OptoReg::Name(25)); + rm.insert(OptoReg::Name(26)); + rm.insert(OptoReg::Name(27)); + rm.insert(OptoReg::Name(16)); + rm.insert(OptoReg::Name(17)); + rm.insert(OptoReg::Name(18)); + rm.insert(OptoReg::Name(19)); ASSERT_EQ(rm.find_first_set(lrg, 4), OptoReg::Name(19)); } TEST_VM(RegMask, alignment) { RegMask rm; - rm.Insert(OptoReg::Name(30)); - rm.Insert(OptoReg::Name(31)); + rm.insert(OptoReg::Name(30)); + rm.insert(OptoReg::Name(31)); ASSERT_TRUE(rm.is_aligned_sets(2)); - rm.Insert(OptoReg::Name(32)); - rm.Insert(OptoReg::Name(37)); - rm.Insert(OptoReg::Name(62)); - rm.Insert(OptoReg::Name(71)); - rm.Insert(OptoReg::Name(74)); - rm.Insert(OptoReg::Name(75)); + rm.insert(OptoReg::Name(32)); + rm.insert(OptoReg::Name(37)); + rm.insert(OptoReg::Name(62)); + rm.insert(OptoReg::Name(71)); + rm.insert(OptoReg::Name(74)); + rm.insert(OptoReg::Name(75)); ASSERT_FALSE(rm.is_aligned_pairs()); rm.clear_to_pairs(); ASSERT_TRUE(rm.is_aligned_sets(2)); ASSERT_TRUE(rm.is_aligned_pairs()); contains_expected_num_of_registers(rm, 4); - ASSERT_TRUE(rm.Member(OptoReg::Name(30))); - ASSERT_TRUE(rm.Member(OptoReg::Name(31))); - ASSERT_TRUE(rm.Member(OptoReg::Name(74))); - ASSERT_TRUE(rm.Member(OptoReg::Name(75))); + ASSERT_TRUE(rm.member(OptoReg::Name(30))); + ASSERT_TRUE(rm.member(OptoReg::Name(31))); + ASSERT_TRUE(rm.member(OptoReg::Name(74))); + ASSERT_TRUE(rm.member(OptoReg::Name(75))); ASSERT_FALSE(rm.is_misaligned_pair()); - rm.Remove(OptoReg::Name(30)); - rm.Remove(OptoReg::Name(74)); + rm.remove(OptoReg::Name(30)); + rm.remove(OptoReg::Name(74)); ASSERT_TRUE(rm.is_misaligned_pair()); } TEST_VM(RegMask, clear_to_sets) { RegMask rm; - rm.Insert(OptoReg::Name(3)); - rm.Insert(OptoReg::Name(20)); - rm.Insert(OptoReg::Name(21)); - rm.Insert(OptoReg::Name(22)); - rm.Insert(OptoReg::Name(23)); - rm.Insert(OptoReg::Name(25)); - rm.Insert(OptoReg::Name(26)); - rm.Insert(OptoReg::Name(27)); - rm.Insert(OptoReg::Name(40)); - rm.Insert(OptoReg::Name(42)); - rm.Insert(OptoReg::Name(43)); - rm.Insert(OptoReg::Name(44)); - rm.Insert(OptoReg::Name(45)); + rm.insert(OptoReg::Name(3)); + rm.insert(OptoReg::Name(20)); + rm.insert(OptoReg::Name(21)); + rm.insert(OptoReg::Name(22)); + rm.insert(OptoReg::Name(23)); + rm.insert(OptoReg::Name(25)); + rm.insert(OptoReg::Name(26)); + rm.insert(OptoReg::Name(27)); + rm.insert(OptoReg::Name(40)); + rm.insert(OptoReg::Name(42)); + rm.insert(OptoReg::Name(43)); + rm.insert(OptoReg::Name(44)); + rm.insert(OptoReg::Name(45)); rm.clear_to_sets(2); ASSERT_TRUE(rm.is_aligned_sets(2)); contains_expected_num_of_registers(rm, 10); @@ -307,7 +307,7 @@ TEST_VM(RegMask, clear_to_sets) { TEST_VM(RegMask, smear_to_sets) { RegMask rm; - rm.Insert(OptoReg::Name(3)); + rm.insert(OptoReg::Name(3)); rm.smear_to_sets(2); ASSERT_TRUE(rm.is_aligned_sets(2)); contains_expected_num_of_registers(rm, 2); @@ -327,14 +327,14 @@ TEST_VM(RegMask, overlap) { RegMask rm2; ASSERT_FALSE(rm1.overlap(rm2)); ASSERT_FALSE(rm2.overlap(rm1)); - rm1.Insert(OptoReg::Name(23)); - rm1.Insert(OptoReg::Name(2)); - rm1.Insert(OptoReg::Name(12)); - rm2.Insert(OptoReg::Name(1)); - rm2.Insert(OptoReg::Name(4)); + rm1.insert(OptoReg::Name(23)); + rm1.insert(OptoReg::Name(2)); + rm1.insert(OptoReg::Name(12)); + rm2.insert(OptoReg::Name(1)); + rm2.insert(OptoReg::Name(4)); ASSERT_FALSE(rm1.overlap(rm2)); ASSERT_FALSE(rm2.overlap(rm1)); - rm1.Insert(OptoReg::Name(4)); + rm1.insert(OptoReg::Name(4)); ASSERT_TRUE(rm1.overlap(rm2)); ASSERT_TRUE(rm2.overlap(rm1)); } @@ -342,10 +342,10 @@ TEST_VM(RegMask, overlap) { TEST_VM(RegMask, valid_reg) { RegMask rm; ASSERT_FALSE(rm.is_valid_reg(OptoReg::Name(42), 1)); - rm.Insert(OptoReg::Name(3)); - rm.Insert(OptoReg::Name(5)); - rm.Insert(OptoReg::Name(6)); - rm.Insert(OptoReg::Name(7)); + rm.insert(OptoReg::Name(3)); + rm.insert(OptoReg::Name(5)); + rm.insert(OptoReg::Name(6)); + rm.insert(OptoReg::Name(7)); ASSERT_FALSE(rm.is_valid_reg(OptoReg::Name(7), 4)); ASSERT_TRUE(rm.is_valid_reg(OptoReg::Name(7), 2)); } @@ -355,19 +355,19 @@ TEST_VM(RegMask, rollover_and_insert_remove) { OptoReg::Name reg1(rm.rm_size_in_bits() + 42); OptoReg::Name reg2(rm.rm_size_in_bits() * 2 + 42); rm.set_infinite_stack(true); - ASSERT_TRUE(rm.Member(reg1)); + ASSERT_TRUE(rm.member(reg1)); rm.rollover(); - rm.Clear(); - rm.Insert(reg1); - ASSERT_TRUE(rm.Member(reg1)); - rm.Remove(reg1); - ASSERT_FALSE(rm.Member(reg1)); + rm.clear(); + rm.insert(reg1); + ASSERT_TRUE(rm.member(reg1)); + rm.remove(reg1); + ASSERT_FALSE(rm.member(reg1)); rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); - rm.Insert(reg2); - ASSERT_FALSE(rm.Member(reg1)); - ASSERT_TRUE(rm.Member(reg2)); + rm.clear(); + rm.insert(reg2); + ASSERT_FALSE(rm.member(reg1)); + ASSERT_TRUE(rm.member(reg2)); } TEST_VM(RegMask, rollover_and_find) { @@ -376,11 +376,11 @@ TEST_VM(RegMask, rollover_and_find) { OptoReg::Name reg2(rm.rm_size_in_bits() + 7); rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); + rm.clear(); ASSERT_EQ(rm.find_first_elem(), OptoReg::Bad); ASSERT_EQ(rm.find_last_elem(), OptoReg::Bad); - rm.Insert(reg1); - rm.Insert(reg2); + rm.insert(reg1); + rm.insert(reg2); ASSERT_EQ(rm.find_first_elem(), reg2); ASSERT_EQ(rm.find_last_elem(), reg1); } @@ -400,35 +400,35 @@ TEST_VM(RegMask, rollover_and_find_first_set) { OptoReg::Name reg8(rm.rm_size_in_bits() + 19); rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); + rm.clear(); ASSERT_EQ(rm.find_first_set(lrg, 2), OptoReg::Bad); - rm.Insert(reg1); - rm.Insert(reg2); - rm.Insert(reg3); - rm.Insert(reg4); - rm.Insert(reg5); - rm.Insert(reg6); - rm.Insert(reg7); - rm.Insert(reg8); + rm.insert(reg1); + rm.insert(reg2); + rm.insert(reg3); + rm.insert(reg4); + rm.insert(reg5); + rm.insert(reg6); + rm.insert(reg7); + rm.insert(reg8); ASSERT_EQ(rm.find_first_set(lrg, 4), reg8); } -TEST_VM(RegMask, rollover_and_Set_All_From) { +TEST_VM(RegMask, rollover_and_set_all_from) { RegMask rm; OptoReg::Name reg1(rm.rm_size_in_bits() + 42); rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); - rm.Set_All_From(reg1); + rm.clear(); + rm.set_all_from(reg1); contains_expected_num_of_registers(rm, rm.rm_size_in_bits() - 42); } -TEST_VM(RegMask, rollover_and_Set_All_From_Offset) { +TEST_VM(RegMask, rollover_and_set_all_from_offset) { RegMask rm; rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); - rm.Set_All_From_Offset(); + rm.clear(); + rm.set_all_from_offset(); contains_expected_num_of_registers(rm, rm.rm_size_in_bits()); } @@ -440,11 +440,11 @@ TEST_VM(RegMask, rollover_and_iterate) { OptoReg::Name reg4(rm.rm_size_in_bits() + 43); rm.set_infinite_stack(true); rm.rollover(); - rm.Clear(); - rm.Insert(reg1); - rm.Insert(reg2); - rm.Insert(reg3); - rm.Insert(reg4); + rm.clear(); + rm.insert(reg1); + rm.insert(reg2); + rm.insert(reg3); + rm.insert(reg4); RegMaskIterator rmi(rm); ASSERT_EQ(rmi.next(), reg1); ASSERT_EQ(rmi.next(), reg2); @@ -453,45 +453,45 @@ TEST_VM(RegMask, rollover_and_iterate) { ASSERT_FALSE(rmi.has_next()); } -TEST_VM(RegMask, rollover_and_SUBTRACT_inner_disjoint) { +TEST_VM(RegMask, rollover_and_subtract_inner_disjoint) { RegMask rm1; RegMask rm2; OptoReg::Name reg1(rm1.rm_size_in_bits() + 42); rm1.set_infinite_stack(true); rm1.rollover(); - rm1.Clear(); - rm1.SUBTRACT_inner(rm2); + rm1.clear(); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); - rm1.Insert(reg1); - rm2.Insert(42); - rm1.SUBTRACT_inner(rm2); + rm1.insert(reg1); + rm2.insert(42); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 1); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 1); } -TEST_VM(RegMask, rollover_and_SUBTRACT_inner_overlap) { +TEST_VM(RegMask, rollover_and_subtract_inner_overlap) { RegMask rm1; RegMask rm2; OptoReg::Name reg1(rm1.rm_size_in_bits() + 42); rm1.set_infinite_stack(true); rm1.rollover(); - rm1.Clear(); + rm1.clear(); rm2.set_infinite_stack(true); rm2.rollover(); - rm2.Clear(); - rm1.SUBTRACT_inner(rm2); + rm2.clear(); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); - rm1.Insert(reg1); - rm2.Insert(reg1); - rm1.SUBTRACT_inner(rm2); + rm1.insert(reg1); + rm2.insert(reg1); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm1.Insert(reg1); - rm2.SUBTRACT_inner(rm1); + rm1.insert(reg1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); } @@ -502,20 +502,20 @@ TEST_VM_ASSERT_MSG(RegMask, unexpected_clone, ".*clone sanity check") { RegMask rm2; // Copy contents of rm1 to rm2 inappropriately (no copy constructor) memcpy((void*)&rm2, (void*)&rm1, sizeof(RegMask)); - rm2.Member(0); // Safeguard in RegMask must catch this. + rm2.member(0); // Safeguard in RegMask must catch this. } TEST_VM_ASSERT_MSG(RegMask, unexpected_growth, ".*unexpected register mask growth") { RegMask rm; // Add clearly out of range OptoReg::Name - rm.Insert(std::numeric_limits::max()); + rm.insert(std::numeric_limits::max()); } TEST_VM_ASSERT_MSG(RegMask, not_growable, ".*register mask not growable") { RegMask rm; // Add a bit just outside the mask, without having specified an arena for // extension. - rm.Insert(rm.rm_size_in_bits()); + rm.insert(rm.rm_size_in_bits()); } TEST_VM_ASSERT_MSG(RegMask, offset_mismatch, ".*offset mismatch") { @@ -549,8 +549,8 @@ static int first_extended() { static void extend(RegMask& rm, unsigned int n = 4) { // Extend the given RegMask with at least n dynamically-allocated words. - rm.Insert(OptoReg::Name(first_extended() + (BitsPerWord * n) - 1)); - rm.Clear(); + rm.insert(OptoReg::Name(first_extended() + (BitsPerWord * n) - 1)); + rm.clear(); ASSERT_TRUE(rm.rm_size_in_words() >= RegMask::gtest_basic_rm_size_in_words() + n); } @@ -562,14 +562,14 @@ TEST_VM(RegMask, static_by_default) { TEST_VM(RegMask, iteration_extended) { RegMask rm(arena()); - rm.Insert(30); - rm.Insert(31); - rm.Insert(33); - rm.Insert(62); - rm.Insert(first_extended()); - rm.Insert(first_extended() + 42); - rm.Insert(first_extended() + 55); - rm.Insert(first_extended() + 456); + rm.insert(30); + rm.insert(31); + rm.insert(33); + rm.insert(62); + rm.insert(first_extended()); + rm.insert(first_extended() + 42); + rm.insert(first_extended() + 55); + rm.insert(first_extended() + 456); RegMaskIterator rmi(rm); ASSERT_TRUE(rmi.next() == OptoReg::Name(30)); @@ -583,125 +583,125 @@ TEST_VM(RegMask, iteration_extended) { ASSERT_FALSE(rmi.has_next()); } -TEST_VM(RegMask, Set_ALL_extended) { - // Check that Set_All doesn't add bits outside of rm.rm_size_bits() on +TEST_VM(RegMask, set_all_extended) { + // Check that set_all doesn't add bits outside of rm.rm_size_bits() on // extended RegMasks. RegMask rm(arena()); extend(rm); - rm.Set_All(); - ASSERT_EQ(rm.Size(), rm.rm_size_in_bits()); - ASSERT_TRUE(!rm.is_Empty()); - // Set_All sets infinite_stack bit + rm.set_all(); + ASSERT_EQ(rm.size(), rm.rm_size_in_bits()); + ASSERT_TRUE(!rm.is_empty()); + // set_all sets infinite_stack bit ASSERT_TRUE(rm.is_infinite_stack()); contains_expected_num_of_registers(rm, rm.rm_size_in_bits()); } -TEST_VM(RegMask, Set_ALL_From_extended) { +TEST_VM(RegMask, set_all_from_extended) { RegMask rm(arena()); extend(rm); - rm.Set_All_From(OptoReg::Name(42)); + rm.set_all_from(OptoReg::Name(42)); contains_expected_num_of_registers(rm, rm.rm_size_in_bits() - 42); } -TEST_VM(RegMask, Set_ALL_From_extended_grow) { +TEST_VM(RegMask, set_all_from_extended_grow) { RegMask rm(arena()); - rm.Set_All_From(first_extended() + OptoReg::Name(42)); + rm.set_all_from(first_extended() + OptoReg::Name(42)); is_extended(rm); contains_expected_num_of_registers(rm, rm.rm_size_in_bits() - first_extended() - 42); } -TEST_VM(RegMask, Clear_extended) { - // Check that Clear doesn't leave any stray bits on extended RegMasks. +TEST_VM(RegMask, clear_extended) { + // Check that clear doesn't leave any stray bits on extended RegMasks. RegMask rm(arena()); - rm.Insert(first_extended()); + rm.insert(first_extended()); is_extended(rm); - rm.Set_All(); - rm.Clear(); + rm.set_all(); + rm.clear(); contains_expected_num_of_registers(rm, 0); } -TEST_VM(RegMask, AND_extended_basic) { +TEST_VM(RegMask, and_with_extended_basic) { RegMask rm1(arena()); - rm1.Insert(OptoReg::Name(first_extended())); + rm1.insert(OptoReg::Name(first_extended())); is_extended(rm1); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(first_extended()))); + ASSERT_TRUE(rm1.member(OptoReg::Name(first_extended()))); - rm1.AND(rm1); + rm1.and_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2; is_basic(rm2); - rm1.AND(rm2); + rm1.and_with(rm2); contains_expected_num_of_registers(rm1, 0); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, AND_extended_extended) { +TEST_VM(RegMask, and_with_extended_extended) { RegMask rm1(arena()); - rm1.Insert(OptoReg::Name(first_extended())); + rm1.insert(OptoReg::Name(first_extended())); is_extended(rm1); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(first_extended()))); + ASSERT_TRUE(rm1.member(OptoReg::Name(first_extended()))); - rm1.AND(rm1); + rm1.and_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2(arena()); extend(rm2); - rm1.AND(rm2); + rm1.and_with(rm2); contains_expected_num_of_registers(rm1, 0); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, OR_extended_basic) { +TEST_VM(RegMask, or_with_extended_basic) { RegMask rm1(arena()); - rm1.Insert(OptoReg::Name(first_extended())); + rm1.insert(OptoReg::Name(first_extended())); is_extended(rm1); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(first_extended()))); + ASSERT_TRUE(rm1.member(OptoReg::Name(first_extended()))); - rm1.OR(rm1); + rm1.or_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2; is_basic(rm2); - rm1.OR(rm2); + rm1.or_with(rm2); contains_expected_num_of_registers(rm1, 1); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, OR_extended_extended) { +TEST_VM(RegMask, or_with_extended_extended) { RegMask rm1(arena()); - rm1.Insert(OptoReg::Name(first_extended())); + rm1.insert(OptoReg::Name(first_extended())); is_extended(rm1); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(first_extended()))); + ASSERT_TRUE(rm1.member(OptoReg::Name(first_extended()))); - rm1.OR(rm1); + rm1.or_with(rm1); contains_expected_num_of_registers(rm1, 1); RegMask rm2(arena()); extend(rm2); - rm1.OR(rm2); + rm1.or_with(rm2); contains_expected_num_of_registers(rm1, 1); contains_expected_num_of_registers(rm2, 0); } -TEST_VM(RegMask, SUBTRACT_extended) { +TEST_VM(RegMask, subtract_extended) { RegMask rm1(arena()); extend(rm1); RegMask rm2(arena()); extend(rm2); - rm2.Set_All(); + rm2.set_all(); ASSERT_TRUE(rm2.is_infinite_stack()); for (int i = first_extended() + 17; i < (int)rm1.rm_size_in_bits(); i++) { - rm1.Insert(i); + rm1.insert(i); } rm1.set_infinite_stack(true); ASSERT_TRUE(rm1.is_infinite_stack()); - rm2.SUBTRACT(rm1); + rm2.subtract(rm1); contains_expected_num_of_registers(rm1, rm1.rm_size_in_bits() - first_extended() - 17); contains_expected_num_of_registers(rm2, first_extended() + 17); } @@ -710,9 +710,9 @@ TEST_VM(RegMask, external_member_extended) { RegMask rm(arena()); extend(rm); rm.set_infinite_stack(false); - ASSERT_FALSE(rm.Member(OptoReg::Name(rm.rm_size_in_bits()))); + ASSERT_FALSE(rm.member(OptoReg::Name(rm.rm_size_in_bits()))); rm.set_infinite_stack(true); - ASSERT_TRUE(rm.Member(OptoReg::Name(rm.rm_size_in_bits()))); + ASSERT_TRUE(rm.member(OptoReg::Name(rm.rm_size_in_bits()))); } TEST_VM(RegMask, overlap_extended) { @@ -722,14 +722,14 @@ TEST_VM(RegMask, overlap_extended) { extend(rm2); ASSERT_FALSE(rm1.overlap(rm2)); ASSERT_FALSE(rm2.overlap(rm1)); - rm1.Insert(OptoReg::Name(23)); - rm1.Insert(OptoReg::Name(2)); - rm1.Insert(OptoReg::Name(first_extended() + 12)); - rm2.Insert(OptoReg::Name(1)); - rm2.Insert(OptoReg::Name(first_extended() + 4)); + rm1.insert(OptoReg::Name(23)); + rm1.insert(OptoReg::Name(2)); + rm1.insert(OptoReg::Name(first_extended() + 12)); + rm2.insert(OptoReg::Name(1)); + rm2.insert(OptoReg::Name(first_extended() + 4)); ASSERT_FALSE(rm1.overlap(rm2)); ASSERT_FALSE(rm2.overlap(rm1)); - rm1.Insert(OptoReg::Name(first_extended() + 4)); + rm1.insert(OptoReg::Name(first_extended() + 4)); ASSERT_TRUE(rm1.overlap(rm2)); ASSERT_TRUE(rm2.overlap(rm1)); } @@ -738,43 +738,43 @@ TEST_VM(RegMask, up_extended) { RegMask rm(arena()); extend(rm); ASSERT_TRUE(rm.is_UP()); - rm.Insert(OptoReg::Name(1)); + rm.insert(OptoReg::Name(1)); ASSERT_TRUE(rm.is_UP()); - rm.Insert(OptoReg::Name(first_extended())); + rm.insert(OptoReg::Name(first_extended())); ASSERT_FALSE(rm.is_UP()); - rm.Clear(); + rm.clear(); rm.set_infinite_stack(true); ASSERT_FALSE(rm.is_UP()); } -TEST_VM(RegMask, SUBTRACT_inner_basic_extended) { +TEST_VM(RegMask, subtract_inner_basic_extended) { RegMask rm1; RegMask rm2(arena()); - rm1.Insert(OptoReg::Name(1)); - rm1.Insert(OptoReg::Name(42)); + rm1.insert(OptoReg::Name(1)); + rm1.insert(OptoReg::Name(42)); is_basic(rm1); - rm2.Insert(OptoReg::Name(1)); - rm2.Insert(OptoReg::Name(first_extended() + 20)); + rm2.insert(OptoReg::Name(1)); + rm2.insert(OptoReg::Name(first_extended() + 20)); is_extended(rm2); - rm1.SUBTRACT_inner(rm2); + rm1.subtract_inner(rm2); is_basic(rm1); contains_expected_num_of_registers(rm1, 1); - ASSERT_TRUE(rm1.Member(OptoReg::Name(42))); + ASSERT_TRUE(rm1.member(OptoReg::Name(42))); } -TEST_VM(RegMask, SUBTRACT_inner_extended_basic) { +TEST_VM(RegMask, subtract_inner_extended_basic) { RegMask rm1(arena()); RegMask rm2; - rm1.Insert(OptoReg::Name(1)); - rm1.Insert(OptoReg::Name(42)); - rm1.Insert(OptoReg::Name(first_extended() + 20)); + rm1.insert(OptoReg::Name(1)); + rm1.insert(OptoReg::Name(42)); + rm1.insert(OptoReg::Name(first_extended() + 20)); is_extended(rm1); - rm2.Insert(OptoReg::Name(1)); + rm2.insert(OptoReg::Name(1)); is_basic(rm2); - rm1.SUBTRACT_inner(rm2); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 2); - ASSERT_TRUE(rm1.Member(OptoReg::Name(42))); - ASSERT_TRUE(rm1.Member(OptoReg::Name(first_extended() + 20))); + ASSERT_TRUE(rm1.member(OptoReg::Name(42))); + ASSERT_TRUE(rm1.member(OptoReg::Name(first_extended() + 20))); } TEST_VM(RegMask, rollover_extended) { @@ -784,48 +784,48 @@ TEST_VM(RegMask, rollover_extended) { OptoReg::Name reg1(rm.rm_size_in_bits() + 42); rm.set_infinite_stack(true); rm.rollover(); - rm.Insert(reg1); - ASSERT_TRUE(rm.Member(reg1)); + rm.insert(reg1); + ASSERT_TRUE(rm.member(reg1)); } -TEST_VM(RegMask, rollover_and_SUBTRACT_inner_disjoint_extended) { +TEST_VM(RegMask, rollover_and_subtract_inner_disjoint_extended) { RegMask rm1(arena()); RegMask rm2; extend(rm1); OptoReg::Name reg1(rm1.rm_size_in_bits() + 42); rm1.set_infinite_stack(true); rm1.rollover(); - rm1.Clear(); - rm1.SUBTRACT_inner(rm2); + rm1.clear(); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); - rm1.Insert(reg1); - rm2.Insert(42); - rm1.SUBTRACT_inner(rm2); + rm1.insert(reg1); + rm2.insert(42); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 1); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 1); } -TEST_VM(RegMask, rollover_and_SUBTRACT_inner_overlap_extended) { +TEST_VM(RegMask, rollover_and_subtract_inner_overlap_extended) { RegMask rm1(arena()); RegMask rm2; OptoReg::Name reg1(rm1.rm_size_in_bits() + 42); extend(rm1); rm2.set_infinite_stack(true); rm2.rollover(); - rm2.Clear(); - rm1.SUBTRACT_inner(rm2); + rm2.clear(); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm2.SUBTRACT_inner(rm1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); - rm1.Insert(reg1); - rm2.Insert(reg1); - rm1.SUBTRACT_inner(rm2); + rm1.insert(reg1); + rm2.insert(reg1); + rm1.subtract_inner(rm2); contains_expected_num_of_registers(rm1, 0); - rm1.Insert(reg1); - rm2.SUBTRACT_inner(rm1); + rm1.insert(reg1); + rm2.subtract_inner(rm1); contains_expected_num_of_registers(rm2, 0); } @@ -855,7 +855,7 @@ static void print(const char* name, const RegMask& mask) { static void assert_equivalent(const RegMask& mask, const ResourceBitMap& mask_ref, bool infinite_stack_ref) { - ASSERT_EQ(mask_ref.count_one_bits(), mask.Size()); + ASSERT_EQ(mask_ref.count_one_bits(), mask.size()); RegMaskIterator it(mask); OptoReg::Name reg = OptoReg::Bad; while (it.has_next()) { @@ -870,7 +870,7 @@ static void populate_auxiliary_sets(RegMask& mask_aux, ResourceBitMap& mask_aux_ref, uint reg_capacity, uint offset, bool random_offset) { - mask_aux.Clear(); + mask_aux.clear(); mask_aux_ref.clear(); if (random_offset) { uint offset_in_words = offset / BitsPerWord; @@ -936,7 +936,7 @@ static void populate_auxiliary_sets(RegMask& mask_aux, } for (uint i = 0; i < regs; i++) { uint reg = (next_random() % max_size) + offset; - mask_aux.Insert(reg); + mask_aux.insert(reg); mask_aux_ref.set_bit(reg); } mask_aux.set_infinite_stack(next_random() % 2); @@ -994,7 +994,7 @@ TEST_VM(RegMask, random) { OptoReg::dump(reg); tty->cr(); } - mask.Insert(reg); + mask.insert(reg); mask_ref.set_bit(reg); if (mask.is_infinite_stack() && reg >= size_bits_before) { // Stack-extend reference bitset. @@ -1010,36 +1010,36 @@ TEST_VM(RegMask, random) { OptoReg::dump(reg); tty->cr(); } - mask.Remove(reg); + mask.remove(reg); mask_ref.clear_bit(reg); break; case 2: if (Verbose) { tty->print_cr("action: Clear"); } - mask.Clear(); + mask.clear(); mask_ref.clear(); infinite_stack_ref = false; break; case 3: if (offset_ref > 0) { - // Set_All expects a zero-offset. + // set_all expects a zero-offset. break; } if (Verbose) { - tty->print_cr("action: Set_All"); + tty->print_cr("action: set_all"); } - mask.Set_All(); + mask.set_all(); mask_ref.set_range(0, size_bits_before); infinite_stack_ref = true; break; case 4: if (Verbose) { - tty->print_cr("action: AND"); + tty->print_cr("action: and_with"); } populate_auxiliary_sets(mask_aux, mask_aux_ref, mask.rm_size_in_bits(), offset_ref, /*random_offset*/ false); - mask.AND(mask_aux); + mask.and_with(mask_aux); stack_extend_ref_masks(mask_ref, infinite_stack_ref, size_bits_before, offset_ref, mask_aux_ref, mask_aux.is_infinite_stack(), mask_aux.rm_size_in_bits(), mask_aux.offset_bits()); @@ -1048,11 +1048,11 @@ TEST_VM(RegMask, random) { break; case 5: if (Verbose) { - tty->print_cr("action: OR"); + tty->print_cr("action: or_with"); } populate_auxiliary_sets(mask_aux, mask_aux_ref, mask.rm_size_in_bits(), offset_ref, /*random_offset*/ false); - mask.OR(mask_aux); + mask.or_with(mask_aux); stack_extend_ref_masks(mask_ref, infinite_stack_ref, size_bits_before, offset_ref, mask_aux_ref, mask_aux.is_infinite_stack(), mask_aux.rm_size_in_bits(), mask_aux.offset_bits()); @@ -1061,11 +1061,11 @@ TEST_VM(RegMask, random) { break; case 6: if (Verbose) { - tty->print_cr("action: SUBTRACT"); + tty->print_cr("action: subtract"); } populate_auxiliary_sets(mask_aux, mask_aux_ref, mask.rm_size_in_bits(), offset_ref, /*random_offset*/ false); - mask.SUBTRACT(mask_aux); + mask.subtract(mask_aux); stack_extend_ref_masks(mask_ref, infinite_stack_ref, size_bits_before, offset_ref, mask_aux_ref, mask_aux.is_infinite_stack(), mask_aux.rm_size_in_bits(), mask_aux.offset_bits()); @@ -1076,15 +1076,15 @@ TEST_VM(RegMask, random) { break; case 7: if (Verbose) { - tty->print_cr("action: SUBTRACT_inner"); + tty->print_cr("action: subtract_inner"); } populate_auxiliary_sets(mask_aux, mask_aux_ref, mask.rm_size_in_bits(), offset_ref, /*random_offset*/ true); - // SUBTRACT_inner expects an argument register mask with infinite_stack = + // subtract_inner expects an argument register mask with infinite_stack = // false. mask_aux.set_infinite_stack(false); - mask.SUBTRACT_inner(mask_aux); - // SUBTRACT_inner does not have "stack-extension semantics". + mask.subtract_inner(mask_aux); + // subtract_inner does not have "stack-extension semantics". mask_ref.set_difference(mask_aux_ref); break; case 8: @@ -1106,7 +1106,7 @@ TEST_VM(RegMask, random) { tty->print_cr("action: rollover"); } // rollover expects the mask to be cleared and with infinite_stack = true - mask.Clear(); + mask.clear(); mask.set_infinite_stack(true); mask_ref.clear(); infinite_stack_ref = true; @@ -1120,28 +1120,28 @@ TEST_VM(RegMask, random) { tty->print_cr("action: reset"); } mask.gtest_set_offset(0); - mask.Clear(); + mask.clear(); mask_ref.clear(); infinite_stack_ref = false; offset_ref = 0; break; case 11: if (Verbose) { - tty->print_cr("action: Set_All_From_Offset"); + tty->print_cr("action: set_all_from_offset"); } - mask.Set_All_From_Offset(); + mask.set_all_from_offset(); mask_ref.set_range(offset_ref, offset_ref + size_bits_before); infinite_stack_ref = true; break; case 12: reg = (next_random() % size_bits_before) + offset_ref; if (Verbose) { - tty->print_cr("action: Set_All_From"); + tty->print_cr("action: set_all_from"); tty->print("value : "); OptoReg::dump(reg); tty->cr(); } - mask.Set_All_From(reg); + mask.set_all_from(reg); mask_ref.set_range(reg, offset_ref + size_bits_before); infinite_stack_ref = true; break; @@ -1154,12 +1154,12 @@ TEST_VM(RegMask, random) { // Randomly sets register mask contents. Does not change register mask size. static void randomize(RegMask& rm) { - rm.Clear(); + rm.clear(); // Uniform distribution over number of registers. uint regs = next_random() % (rm.rm_size_in_bits() + 1); for (uint i = 0; i < regs; i++) { uint reg = (next_random() % rm.rm_size_in_bits()) + rm.offset_bits(); - rm.Insert(reg); + rm.insert(reg); } rm.set_infinite_stack(next_random() % 2); } @@ -1175,10 +1175,10 @@ static uint grow_randomly(RegMask& rm, uint min_growth = 1, break; } // Force grow - rm.Insert(reg); + rm.insert(reg); if (!rm.is_infinite_stack()) { // Restore - rm.Remove(reg); + rm.remove(reg); } } // Return how many times we grew From 5609ee11a2daf888d02c0c1b2b70eb4df817582c Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Mon, 20 Oct 2025 08:05:51 +0000 Subject: [PATCH 202/561] 8370049: [s390x] G1 barrier compareAndExchange does not return old value when compareExchange fails Reviewed-by: amitkumar, aph, rcastanedalo --- src/hotspot/cpu/s390/gc/g1/g1_s390.ad | 2 +- .../gcbarriers/TestG1BarrierGeneration.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/s390/gc/g1/g1_s390.ad b/src/hotspot/cpu/s390/gc/g1/g1_s390.ad index 7aed374fdae..000ac3bc5ba 100644 --- a/src/hotspot/cpu/s390/gc/g1/g1_s390.ad +++ b/src/hotspot/cpu/s390/gc/g1/g1_s390.ad @@ -356,7 +356,7 @@ instruct g1CompareAndExchangeP(iRegP mem_ptr, rarg5RegP oldval, iRegP_N2P newval __ z_lgr($res$$Register, $oldval$$Register); // previous content - __ z_csg($oldval$$Register, $newval$$Register, 0, $mem_ptr$$reg); + __ z_csg($res$$Register, $newval$$Register, 0, $mem_ptr$$reg); write_barrier_post(masm, this, $mem_ptr$$Register /* store_addr */, diff --git a/test/hotspot/jtreg/compiler/gcbarriers/TestG1BarrierGeneration.java b/test/hotspot/jtreg/compiler/gcbarriers/TestG1BarrierGeneration.java index 01e015d50cb..c1e2dd7a112 100644 --- a/test/hotspot/jtreg/compiler/gcbarriers/TestG1BarrierGeneration.java +++ b/test/hotspot/jtreg/compiler/gcbarriers/TestG1BarrierGeneration.java @@ -880,6 +880,16 @@ public class TestG1BarrierGeneration { Asserts.assertEquals(oldVal, oldVal2); Asserts.assertEquals(o.f, newVal); } + { + Outer o = new Outer(); + Object oldVal = new Object(); + o.f = oldVal; + Object cmpVal = new Object(); + Object newVal = new Object(); + Object oldVal2 = testCompareAndExchange(o, cmpVal, newVal); + Asserts.assertEquals(oldVal2, oldVal); + Asserts.assertEquals(o.f, oldVal); + } { Outer o = new Outer(); Object oldVal = new Object(); @@ -889,6 +899,16 @@ public class TestG1BarrierGeneration { Asserts.assertTrue(b); Asserts.assertEquals(o.f, newVal); } + { + Outer o = new Outer(); + Object oldVal = new Object(); + o.f = oldVal; + Object cmpVal = new Object(); + Object newVal = new Object(); + boolean b = testCompareAndSwap(o, cmpVal, newVal); + Asserts.assertFalse(b); + Asserts.assertEquals(o.f, oldVal); + } { Outer o = new Outer(); Object oldVal = new Object(); From f158451c259a7f86af0851131af374d68d011003 Mon Sep 17 00:00:00 2001 From: Nizar Benalla Date: Mon, 20 Oct 2025 08:51:42 +0000 Subject: [PATCH 203/561] 8361366: Allow sorting of member details in lexicographical order Reviewed-by: hannesw --- .../doclets/formats/html/HtmlDoclet.java | 1 + .../doclets/formats/html/HtmlIds.java | 1 + .../doclets/formats/html/TableOfContents.java | 10 + .../formats/html/markup/HtmlStyles.java | 10 + .../formats/html/resources/script.js.template | 173 ++++++++++++++++++ .../formats/html/resources/sort-a-z.svg | 16 ++ .../formats/html/resources/stylesheet.css | 34 +++- .../toolkit/resources/doclets.properties | 3 + .../doclets/toolkit/util/DocPaths.java | 3 + .../jdk/javadoc/tool/api/basic/APITest.java | 2 +- 10 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/sort-a-z.svg diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java index f364702ca12..66fcd90e2e8 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDoclet.java @@ -331,6 +331,7 @@ public class HtmlDoclet extends AbstractDoclet { copyResource(DocPaths.LINK_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.LINK_SVG), true); copyResource(DocPaths.MOON_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.MOON_SVG), true); copyResource(DocPaths.SUN_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.SUN_SVG), true); + copyResource(DocPaths.SORT_A_Z_SVG, DocPaths.RESOURCE_FILES.resolve(DocPaths.SORT_A_Z_SVG), true); if (options.createIndex()) { copyResource(DocPaths.SEARCH_JS_TEMPLATE, DocPaths.SCRIPT_FILES.resolve(DocPaths.SEARCH_JS), true); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java index c257e1e153c..a3fba7eca14 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java @@ -120,6 +120,7 @@ public class HtmlIds { static final HtmlId THEME_OS = HtmlId.of("theme-os"); static final HtmlId THEME_PANEL = HtmlId.of("theme-panel"); static final HtmlId UNNAMED_PACKAGE_ANCHOR = HtmlId.of("unnamed-package"); + static final HtmlId TOC_ORDER_TOGGLE = HtmlId.of("toc-lexical-order-toggle"); private static final String FIELDS_INHERITANCE = "fields-inherited-from-class-"; private static final String METHODS_INHERITANCE = "methods-inherited-from-class-"; private static final String NESTED_CLASSES_INHERITANCE = "nested-classes-inherited-from-class-"; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java index 6a3dff8a5d6..fab81914dbd 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TableOfContents.java @@ -112,6 +112,16 @@ public class TableOfContents { .add(HtmlTree.INPUT(HtmlAttr.InputType.RESET, HtmlStyles.resetFilter) .put(HtmlAttr.TABINDEX, "-1") .put(HtmlAttr.VALUE, writer.resources.getText("doclet.filter_reset"))); + + header.add(Entity.NO_BREAK_SPACE) + .add(HtmlTree.BUTTON(HtmlStyles.tocSortToggle) + .setId(HtmlIds.TOC_ORDER_TOGGLE) + .add(HtmlTree.IMG(writer.pathToRoot.resolve(DocPaths.RESOURCE_FILES) + .resolve(DocPaths.SORT_A_Z_SVG), + writer.resources.getText("doclet.sort_table_of_contents") + )) + ); + } content.add(header); content.add(listBuilder); diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyles.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyles.java index 358f490334b..7f33ebedfa4 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyles.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlStyles.java @@ -164,6 +164,16 @@ public enum HtmlStyles implements HtmlStyle { */ tocList, + /** + * The class used for lexical order toggle in the table of contents. + */ + tocSortToggle, + + /** + * The class used to indicate the state of the lexical sort toggle. + */ + tocSortIsActive, + // // diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template index b91f99b2c42..235d0a87d24 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template @@ -23,6 +23,14 @@ const linkIcon = "##REPLACE:doclet.Link_icon##"; const linkToSection = "##REPLACE:doclet.Link_to_section##"; const toggleMemberListing = "##REPLACE:doclet.Toggle_member_listing##"; +const sortLexicalLabel = "##REPLACE:doclet.Sort_lexicographically##"; +const sortSourceLabel = "##REPLACE:doclet.Sort_by_source_order##"; +const TOC_ALPHA = "alpha"; +const TOC_SOURCE = "source"; +var origOlOrder = new Map(); +var origContainerOrder = new Map(); +var snapshotted = false; + if (typeof hljs !== "undefined") { try { hljs.highlightAll(); @@ -409,6 +417,9 @@ document.addEventListener("DOMContentLoaded", function(e) { makeFilterWidget(tocMenu, updateToc); var menuInput = tocMenu.querySelector("input.filter-input"); } + + snapshotAllOnce(); + document.addEventListener("keydown", (e) => { if (e.ctrlKey || e.altKey || e.metaKey) { return; @@ -640,6 +651,168 @@ document.addEventListener("DOMContentLoaded", function(e) { } window.addEventListener("scroll", handleScroll); } + + function allTocNavs() { + return Array.from(document.querySelectorAll("nav.toc")); + } + + function nestedTocLists(scope) { + const listsToSort = []; + const sectionLinks = scope.querySelectorAll("ol.toc-list > li > a"); + + sectionLinks.forEach(function(link) { + const href = link.getAttribute("href"); + if (href === "#constructor-detail" || href === "#method-detail" + || href === "#field-detail" || href === "#annotation-interface-element-detail" + || href === "#enum-constant-detail" || href === "#property-detail") { + const memberList = link.nextElementSibling; + if (memberList && memberList.tagName === 'OL') { + listsToSort.push(memberList); + } + } + }); + + return listsToSort; + } + + function textForLi(li) { + return li.querySelector(":scope > a").textContent.trim(); + } + + function alphaCompare(a, b) { + return textForLi(a).localeCompare(textForLi(b), undefined, { + numeric: true, + sensitivity: "base" + }); + } + + function snapshotTocOnce(nav){ + nestedTocLists(nav).forEach(function(ol){ + if (!origOlOrder.has(ol)) origOlOrder.set(ol, Array.from(ol.children)); + }); + } + function restoreToc(nav){ + nestedTocLists(nav).forEach(function(ol){ + var orig = origOlOrder.get(ol); + if (orig) orig.forEach(function(li){ ol.appendChild(li); }); + }); + } + function sortTocAlpha(nav){ + nestedTocLists(nav).forEach(function(ol){ + var lis = Array.from(ol.children); + if (lis.length < 2) return; + lis.slice().sort(alphaCompare).forEach(function(li){ ol.appendChild(li); }); + }); + } + + function snapshotAllOnce() { + if (snapshotted) return; + allTocNavs().forEach(snapshotTocOnce); + snapshotted = true; + } + + function restoreAllMemberContainers(){ + origContainerOrder.forEach(function(kids, container){ + kids.forEach(function(ch){ container.appendChild(ch); }); + }); + } + + function reorderMemberDetailsAlpha() { + var sidebarNav = document.querySelector(".main-grid nav.toc"); + var mainRoot = document.querySelector(".main-grid main"); + if (!sidebarNav || !mainRoot) return; + + var containers = Array.from( + mainRoot.querySelectorAll("ul.member-list") + ); + + containers.forEach(function(container) { + var links = Array.from(sidebarNav.querySelectorAll("a[href^='#']")).filter(function(a) { + var id = a.getAttribute("href").slice(1); + if (!id) return false; + var target = document.getElementById(decodeURI(id)); + return target && container.contains(target); + }); + if (links.length < 2) return; + + var items = links.map(function(a) { + var id = a.getAttribute("href").slice(1); + var target = document.getElementById(decodeURI(id)); + if (!target) return null; + var block = target.closest("section.detail, div.detail") || target; + var li = block.closest("li"); + if (li.parentElement !== container) return null; + return { + node: li, + text: (a.textContent || "").trim() + }; + }).filter(Boolean); + + if (items.length < 2) return; + + if (!origContainerOrder.has(container)) { + origContainerOrder.set(container, Array.from(container.children)); + } + + items.slice() + .sort(function(x, y) { + return x.text.localeCompare(y.text, undefined, { + numeric: true, + sensitivity: "base" + }); + }) + .forEach(function(it) { + container.appendChild(it.node); + }); + }); + } + + function updateToggleButtons(order){ + const next = (order === TOC_ALPHA) ? sortSourceLabel : sortLexicalLabel; + document.querySelectorAll(".toc-sort-toggle").forEach(function(btn){ + btn.setAttribute("aria-label", next); + btn.setAttribute("title", next); + btn.setAttribute("aria-pressed", order === TOC_ALPHA); + + if (order === TOC_ALPHA) { + btn.classList.add("toc-sort-is-active"); + } else { + btn.classList.remove("toc-sort-is-active"); + } + + var img = btn.querySelector("img"); + if (img) img.alt = next; + }); + } + + var tocOrder = TOC_SOURCE; + updateToggleButtons(tocOrder); + + function applyAlpha(){ + snapshotAllOnce(); + reorderMemberDetailsAlpha(); + allTocNavs().forEach(sortTocAlpha); + initSectionData(); handleScroll(); + updateToggleButtons(TOC_ALPHA); + tocOrder = TOC_ALPHA; + } + + function applySource(){ + snapshotAllOnce(); + restoreAllMemberContainers(); + allTocNavs().forEach(restoreToc); + initSectionData(); handleScroll(); + updateToggleButtons(TOC_SOURCE); + tocOrder = TOC_SOURCE; + } + + document.querySelectorAll(".toc-sort-toggle").forEach(function(btn) { + btn.addEventListener("click", function() { + if (tocOrder === TOC_SOURCE) applyAlpha(); else applySource(); + if (typeof btn.blur === "function") btn.blur(); + }); + }); + // Resize handler new ResizeObserver((entries) => { if (expanded) { diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/sort-a-z.svg b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/sort-a-z.svg new file mode 100644 index 00000000000..ea1ed38942e --- /dev/null +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/sort-a-z.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css index 4bb0fad4306..8da885a12cc 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css @@ -693,10 +693,10 @@ dl.name-value > dd { background-color: var(--toc-background-color); color: #666666; font-size: 0.76rem; - border: none; cursor: pointer; padding: 6px 10px; white-space: nowrap; + border: 1px solid transparent; } .main-grid nav.toc button > img { vertical-align: middle; @@ -1901,6 +1901,11 @@ table.striped > tbody > tr > th { .ui-autocomplete .search-result-desc { display: block; } + .top-nav nav.toc .toc-sort-toggle { + background: transparent; + border: 0; + margin-left: 4px; + } } @media screen and (max-width: 800px) { .about-language { @@ -1957,6 +1962,33 @@ pre.snippet .highlighted { background-color: var(--snippet-highlight-color); border-radius: 10%; } + +nav.toc div.toc-header input.filter-input { + flex: 1 1 auto; + min-width: 0; +} + +nav.toc div.toc-header .toc-sort-toggle { + flex: 0 0 auto; + position: static; + display: inline-flex; + align-items: center; + padding: .5em; + cursor: pointer; +} + +nav.toc div.toc-header .toc-sort-toggle > img { + width: 22px; + height: 22px; + vertical-align: middle; + filter: var(--icon-filter); +} + +nav.toc div.toc-header .toc-sort-toggle.toc-sort-is-active { + background-color: var(--toc-highlight-color); + border-radius: 4px; +} + /* * Hide navigation links and search box in print layout */ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties index 138a8fd0040..6a15025044a 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties @@ -251,11 +251,14 @@ doclet.Description=Description doclet.ConstantField=Constant Field doclet.Value=Value doclet.table_of_contents=Table of contents +doclet.Sort_lexicographically=Sort member details lexicographically +doclet.Sort_by_source_order=Sort member details by source order doclet.hide_sidebar=Hide sidebar doclet.show_sidebar=Show sidebar doclet.filter_label=Filter contents (type .) doclet.filter_table_of_contents=Filter table of contents doclet.filter_reset=Reset +doclet.sort_table_of_contents=Sort member details in lexicographical order doclet.linkMismatch_PackagedLinkedtoModule=The code being documented uses packages in the unnamed module, \ but the packages defined in {0} are in named modules. doclet.linkMismatch_ModuleLinkedtoPackage=The code being documented uses modules but the packages defined \ diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java index dbe91585aff..f5672dcbf96 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/DocPaths.java @@ -115,6 +115,9 @@ public class DocPaths { /** The name of the link icon file. */ public static final DocPath LINK_SVG = DocPath.create("link.svg"); + /** The name of the table of contents toggle icon file. */ + public static final DocPath SORT_A_Z_SVG = DocPath.create("sort-a-z.svg"); + /** The name of the right pointing angle icon. */ public static final DocPath RIGHT_SVG = DocPath.create("right.svg"); diff --git a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java index e4e3c6baa87..71908f34e99 100644 --- a/test/langtools/jdk/javadoc/tool/api/basic/APITest.java +++ b/test/langtools/jdk/javadoc/tool/api/basic/APITest.java @@ -215,6 +215,7 @@ class APITest { "resource-files/stylesheet.css", "resource-files/sun.svg", "resource-files/x.svg", + "resource-files/sort-a-z.svg", "resource-files/fonts/dejavu.css", "resource-files/fonts/DejaVuLGCSans-Bold.woff", "resource-files/fonts/DejaVuLGCSans-Bold.woff2", @@ -265,4 +266,3 @@ class APITest { && !s.equals("system-properties.html")) .collect(Collectors.toSet()); } - From 8c775e299dbf651c3be1ba84b9e50356a3503861 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Mon, 20 Oct 2025 09:20:03 +0000 Subject: [PATCH 204/561] 8370074: Remove unused code in AbstractDebuggeeTest.java Reviewed-by: fandreuzzi, cjplummer, lmesnik --- .../nsk/share/jpda/AbstractDebuggeeTest.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java index 86d5d7ecd24..74516fd5a69 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/jpda/AbstractDebuggeeTest.java @@ -175,13 +175,6 @@ public class AbstractDebuggeeTest { } } - static public void sleep1sec() { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } - } - private StateTestThread stateTestThread; public static final String COMMAND_QUIT = "quit"; @@ -354,9 +347,6 @@ public class AbstractDebuggeeTest { eatMemory(); } - public void voidValueMethod() { - } - public void unexpectedException(Throwable t) { setSuccess(false); t.printStackTrace(log.getOutStream()); From ee353201d1c3f7521825ea852e37400277101164 Mon Sep 17 00:00:00 2001 From: Sean Coffey Date: Mon, 20 Oct 2025 09:47:34 +0000 Subject: [PATCH 205/561] 8370071: Clarify jcmd Thread.print help message Reviewed-by: kevinw --- src/hotspot/share/services/diagnosticCommand.hpp | 7 +++++-- src/jdk.jcmd/share/man/jcmd.md | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/hotspot/share/services/diagnosticCommand.hpp b/src/hotspot/share/services/diagnosticCommand.hpp index 001d89a5aef..2364b0ce4cd 100644 --- a/src/hotspot/share/services/diagnosticCommand.hpp +++ b/src/hotspot/share/services/diagnosticCommand.hpp @@ -356,7 +356,9 @@ public: ThreadDumpDCmd(outputStream* output, bool heap); static const char* name() { return "Thread.print"; } static const char* description() { - return "Print all threads with stacktraces."; + return "Print all platform threads, and mounted virtual threads, " + "with stack traces. The Thread.dump_to_file command will " + "print all threads to a file."; } static const char* impact() { return "Medium: Depends on the number of threads."; @@ -768,7 +770,8 @@ public: return "Thread.dump_to_file"; } static const char *description() { - return "Dump threads, with stack traces, to a file in plain text or JSON format."; + return "Dump all threads, with stack traces, " + "to a file in plain text or JSON format."; } static const char* impact() { return "Medium: Depends on the number of threads."; diff --git a/src/jdk.jcmd/share/man/jcmd.md b/src/jdk.jcmd/share/man/jcmd.md index 4e67e7a4502..af3886a915c 100644 --- a/src/jdk.jcmd/share/man/jcmd.md +++ b/src/jdk.jcmd/share/man/jcmd.md @@ -1,5 +1,5 @@ --- -# 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. # # This code is free software; you can redistribute it and/or modify it @@ -704,7 +704,7 @@ The following commands are available: Impact: Low `Thread.dump_to_file` \[*options*\] *filepath* -: Dump threads, with stack traces, to a file in plain text or JSON format. +: Dump all threads, with stack traces, to a file in plain text or JSON format. Impact: Medium: Depends on the number of threads. @@ -723,7 +723,8 @@ The following commands are available: - *filepath*: The file path to the output file. If %p is specified in the filename, it is expanded to the JVM's PID. (FILE, no default value) `Thread.print` \[*options*\] -: Prints all threads with stacktraces. +: Print all platform threads, and mounted virtual threads, with stack traces. + The Thread.dump_to_file command will print all threads to a file. Impact: Medium --- depends on the number of threads. From 73923601d8db9032b904cabb18b16a8cb9dd76c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Mon, 20 Oct 2025 10:29:21 +0000 Subject: [PATCH 206/561] 8369811: ZGC: Robust NUMA configuration detection Co-authored-by: Axel Boldt-Christmas Reviewed-by: aboldtch, sjohanss --- src/hotspot/os/bsd/gc/z/zNUMA_bsd.cpp | 4 ++ src/hotspot/os/linux/gc/z/zNUMA_linux.cpp | 42 ++++++++++++++++--- .../gc/z/zPhysicalMemoryBacking_linux.cpp | 2 +- src/hotspot/os/windows/gc/z/zNUMA_windows.cpp | 4 ++ src/hotspot/share/gc/z/zNUMA.hpp | 2 + .../share/gc/z/zPhysicalMemoryManager.cpp | 4 +- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/hotspot/os/bsd/gc/z/zNUMA_bsd.cpp b/src/hotspot/os/bsd/gc/z/zNUMA_bsd.cpp index d0c06e2ebf1..3acaa9ab8f9 100644 --- a/src/hotspot/os/bsd/gc/z/zNUMA_bsd.cpp +++ b/src/hotspot/os/bsd/gc/z/zNUMA_bsd.cpp @@ -46,3 +46,7 @@ uint32_t ZNUMA::memory_id(uintptr_t addr) { // NUMA support not enabled, assume everything belongs to node zero return 0; } + +int ZNUMA::numa_id_to_node(uint32_t numa_id) { + ShouldNotCallThis(); +} diff --git a/src/hotspot/os/linux/gc/z/zNUMA_linux.cpp b/src/hotspot/os/linux/gc/z/zNUMA_linux.cpp index 74e69655940..ab7498b313c 100644 --- a/src/hotspot/os/linux/gc/z/zNUMA_linux.cpp +++ b/src/hotspot/os/linux/gc/z/zNUMA_linux.cpp @@ -32,12 +32,35 @@ #include "runtime/os.hpp" #include "utilities/debug.hpp" +static uint* z_numa_id_to_node = nullptr; +static uint32_t* z_node_to_numa_id = nullptr; + void ZNUMA::pd_initialize() { _enabled = UseNUMA; + size_t configured_nodes = 0; + + if (UseNUMA) { + const size_t max_nodes = os::Linux::numa_num_configured_nodes(); + z_numa_id_to_node = NEW_C_HEAP_ARRAY(uint, max_nodes, mtGC); + configured_nodes = os::numa_get_leaf_groups(z_numa_id_to_node, 0); + + z_node_to_numa_id = NEW_C_HEAP_ARRAY(uint32_t, max_nodes, mtGC); + + // Fill the array with invalid NUMA ids + for (uint32_t i = 0; i < max_nodes; i++) { + z_node_to_numa_id[i] = (uint32_t)-1; + } + + // Fill the reverse mappings + for (uint32_t i = 0; i < configured_nodes; i++) { + z_node_to_numa_id[z_numa_id_to_node[i]] = i; + } + } + // UseNUMA and is_faked() are mutually excluded in zArguments.cpp. _count = UseNUMA - ? os::Linux::numa_max_node() + 1 + ? configured_nodes : !FLAG_IS_DEFAULT(ZFakeNUMA) ? ZFakeNUMA : 1; // No NUMA nodes @@ -54,7 +77,7 @@ uint32_t ZNUMA::id() { return 0; } - return os::Linux::get_node_by_cpu(ZCPU::id()); + return z_node_to_numa_id[os::Linux::get_node_by_cpu(ZCPU::id())]; } uint32_t ZNUMA::memory_id(uintptr_t addr) { @@ -63,14 +86,21 @@ uint32_t ZNUMA::memory_id(uintptr_t addr) { return 0; } - uint32_t id = (uint32_t)-1; + int node = -1; - if (ZSyscall::get_mempolicy((int*)&id, nullptr, 0, (void*)addr, MPOL_F_NODE | MPOL_F_ADDR) == -1) { + if (ZSyscall::get_mempolicy(&node, nullptr, 0, (void*)addr, MPOL_F_NODE | MPOL_F_ADDR) == -1) { ZErrno err; fatal("Failed to get NUMA id for memory at " PTR_FORMAT " (%s)", addr, err.to_string()); } - assert(id < _count, "Invalid NUMA id"); + DEBUG_ONLY(const int max_nodes = os::Linux::numa_num_configured_nodes();) + assert(node < max_nodes, "NUMA node is out of bounds node=%d, max=%d", node, max_nodes); - return id; + return z_node_to_numa_id[node]; +} + +int ZNUMA::numa_id_to_node(uint32_t numa_id) { + assert(numa_id < _count, "NUMA id out of range 0 <= %ud <= %ud", numa_id, _count); + + return (int)z_numa_id_to_node[numa_id]; } diff --git a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp index 84dfcbd6614..25ffd0b8078 100644 --- a/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp +++ b/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp @@ -629,7 +629,7 @@ retry: size_t ZPhysicalMemoryBacking::commit_numa_preferred(zbacking_offset offset, size_t length, uint32_t numa_id) const { // Setup NUMA policy to allocate memory from a preferred node - os::Linux::numa_set_preferred((int)numa_id); + os::Linux::numa_set_preferred(ZNUMA::numa_id_to_node(numa_id)); const size_t committed = commit_default(offset, length); diff --git a/src/hotspot/os/windows/gc/z/zNUMA_windows.cpp b/src/hotspot/os/windows/gc/z/zNUMA_windows.cpp index dc7521dde56..e2bd6803584 100644 --- a/src/hotspot/os/windows/gc/z/zNUMA_windows.cpp +++ b/src/hotspot/os/windows/gc/z/zNUMA_windows.cpp @@ -46,3 +46,7 @@ uint32_t ZNUMA::memory_id(uintptr_t addr) { // NUMA support not enabled, assume everything belongs to node zero return 0; } + +int ZNUMA::numa_id_to_node(uint32_t numa_id) { + ShouldNotCallThis(); +} diff --git a/src/hotspot/share/gc/z/zNUMA.hpp b/src/hotspot/share/gc/z/zNUMA.hpp index de74086b10a..838a114c210 100644 --- a/src/hotspot/share/gc/z/zNUMA.hpp +++ b/src/hotspot/share/gc/z/zNUMA.hpp @@ -53,6 +53,8 @@ public: static size_t calculate_share(uint32_t numa_id, size_t total, size_t granule = ZGranuleSize, uint32_t ignore_count = 0); static const char* to_string(); + + static int numa_id_to_node(uint32_t numa_id); }; #endif // SHARE_GC_Z_ZNUMA_HPP diff --git a/src/hotspot/share/gc/z/zPhysicalMemoryManager.cpp b/src/hotspot/share/gc/z/zPhysicalMemoryManager.cpp index 1a38efb89fd..2e7a97028ff 100644 --- a/src/hotspot/share/gc/z/zPhysicalMemoryManager.cpp +++ b/src/hotspot/share/gc/z/zPhysicalMemoryManager.cpp @@ -108,7 +108,7 @@ void ZPhysicalMemoryManager::try_enable_uncommit(size_t min_capacity, size_t max // Test if uncommit is supported by the operating system by committing // and then uncommitting a granule. const ZVirtualMemory vmem(zoffset(0), ZGranuleSize); - if (!commit(vmem, (uint32_t)-1) || !uncommit(vmem)) { + if (!commit(vmem, 0) || !uncommit(vmem)) { log_info_p(gc, init)("Uncommit: Implicitly Disabled (Not supported by operating system)"); FLAG_SET_ERGO(ZUncommit, false); return; @@ -293,7 +293,7 @@ void ZPhysicalMemoryManager::map(const ZVirtualMemory& vmem, uint32_t numa_id) c // Setup NUMA preferred for large pages if (ZNUMA::is_enabled() && ZLargePages::is_explicit()) { - os::numa_make_local((char*)addr, size, (int)numa_id); + os::numa_make_local((char*)addr, size, ZNUMA::numa_id_to_node(numa_id)); } } From c8679713402186b24608fa4c91397b6a4fd5ebf3 Mon Sep 17 00:00:00 2001 From: Afshin Zafari Date: Mon, 20 Oct 2025 11:32:48 +0000 Subject: [PATCH 207/561] 8369527: NMT: print malloc-site when a malloc'd memory detected as corrupted Reviewed-by: dholmes, jsjolen --- src/hotspot/share/nmt/mallocHeader.cpp | 15 ++- src/hotspot/share/nmt/mallocHeader.hpp | 2 +- src/hotspot/share/nmt/mallocHeader.inline.hpp | 2 +- src/hotspot/share/nmt/mallocSiteTable.cpp | 8 +- .../test_nmt_buffer_overflow_detection.cpp | 10 ++ .../NMTPrintMallocSiteOfCorruptedMemory.java | 115 ++++++++++++++++++ .../runtime/NMT/libMallocHeaderModifier.c | 52 ++++++++ 7 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java create mode 100644 test/hotspot/jtreg/runtime/NMT/libMallocHeaderModifier.c diff --git a/src/hotspot/share/nmt/mallocHeader.cpp b/src/hotspot/share/nmt/mallocHeader.cpp index 2b59a2b6648..d88b5c790fb 100644 --- a/src/hotspot/share/nmt/mallocHeader.cpp +++ b/src/hotspot/share/nmt/mallocHeader.cpp @@ -26,6 +26,7 @@ #include "nmt/mallocHeader.inline.hpp" #include "nmt/mallocSiteTable.hpp" #include "nmt/memTag.hpp" +#include "nmt/memTracker.hpp" #include "runtime/os.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" @@ -36,7 +37,7 @@ // fitting into eight bits. STATIC_ASSERT(sizeof(MemTag) == sizeof(uint8_t)); -void MallocHeader::print_block_on_error(outputStream* st, address bad_address) const { +void MallocHeader::print_block_on_error(outputStream* st, address bad_address, address block_address) const { assert(bad_address >= (address)this, "sanity"); // This function prints block information, including hex dump, in case of a detected @@ -48,6 +49,18 @@ void MallocHeader::print_block_on_error(outputStream* st, address bad_address) c st->print_cr("NMT Block at " PTR_FORMAT ", corruption at: " PTR_FORMAT ": ", p2i(this), p2i(bad_address)); + if (MemTracker::tracking_level() == NMT_TrackingLevel::NMT_detail) { + MallocHeader* mh = (MallocHeader*)block_address; + NativeCallStack stack; + if (MallocSiteTable::access_stack(stack, *mh)) { + st->print_cr("allocated from:"); + stack.print_on(st); + } else { + st->print_cr("allocation-site cannot be shown since the marker is also corrupted."); + } + st->print_cr(""); + } + static const size_t min_dump_length = 256; address from1 = align_down((address)this, sizeof(void*)) - (min_dump_length / 2); address to1 = from1 + min_dump_length; diff --git a/src/hotspot/share/nmt/mallocHeader.hpp b/src/hotspot/share/nmt/mallocHeader.hpp index 8472b5f8ce8..acfc7401268 100644 --- a/src/hotspot/share/nmt/mallocHeader.hpp +++ b/src/hotspot/share/nmt/mallocHeader.hpp @@ -106,7 +106,7 @@ class MallocHeader { // We discount sizes larger than these static const size_t max_reasonable_malloc_size = LP64_ONLY(256 * G) NOT_LP64(3500 * M); - void print_block_on_error(outputStream* st, address bad_address) const; + void print_block_on_error(outputStream* st, address bad_address, address block_address) const; static uint16_t build_footer(uint8_t b1, uint8_t b2) { return (uint16_t)(((uint16_t)b1 << 8) | (uint16_t)b2); } diff --git a/src/hotspot/share/nmt/mallocHeader.inline.hpp b/src/hotspot/share/nmt/mallocHeader.inline.hpp index 8b1862332fc..7bc8a25028c 100644 --- a/src/hotspot/share/nmt/mallocHeader.inline.hpp +++ b/src/hotspot/share/nmt/mallocHeader.inline.hpp @@ -103,7 +103,7 @@ inline OutTypeParam MallocHeader::resolve_checked_impl(InTypeParam memblock) { } OutTypeParam header_pointer = (OutTypeParam)memblock - 1; if (!header_pointer->check_block_integrity(msg, sizeof(msg), &corruption)) { - header_pointer->print_block_on_error(tty, corruption != nullptr ? corruption : (address)header_pointer); + header_pointer->print_block_on_error(tty, corruption != nullptr ? corruption : (address)header_pointer, (address)header_pointer); fatal("NMT has detected a memory corruption bug. Block at " PTR_FORMAT ": %s", p2i(memblock), msg); } return header_pointer; diff --git a/src/hotspot/share/nmt/mallocSiteTable.cpp b/src/hotspot/share/nmt/mallocSiteTable.cpp index c9ddffce5ec..0150a25cae3 100644 --- a/src/hotspot/share/nmt/mallocSiteTable.cpp +++ b/src/hotspot/share/nmt/mallocSiteTable.cpp @@ -163,13 +163,17 @@ MallocSite* MallocSiteTable::lookup_or_add(const NativeCallStack& key, uint32_t* // Access malloc site MallocSite* MallocSiteTable::malloc_site(uint32_t marker) { uint16_t bucket_idx = bucket_idx_from_marker(marker); - assert(bucket_idx < table_size, "Invalid bucket index"); + if (bucket_idx >= table_size) { + return nullptr; + } const uint16_t pos_idx = pos_idx_from_marker(marker); MallocSiteHashtableEntry* head = _table[bucket_idx]; for (size_t index = 0; index < pos_idx && head != nullptr; index++, head = (MallocSiteHashtableEntry*)head->next()) {} - assert(head != nullptr, "Invalid position index"); + if (head == nullptr) { + return nullptr; + } return head->data(); } diff --git a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp index ae3f4e74516..82ddd28d56c 100644 --- a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp @@ -164,4 +164,14 @@ TEST_VM(NMT, test_realloc) { } } +TEST_VM_FATAL_ERROR_MSG(NMT, memory_corruption_call_stack, ".*header canary.*") { + if (MemTracker::tracking_level() != NMT_detail) { + guarantee(false, "fake message ignore this - header canary"); + } + const size_t SIZE = 1024; + char* p = (char*)os::malloc(SIZE, mtTest); + *(p - 1) = 0; + os::free(p); +} + #endif // !INCLUDE_ASAN diff --git a/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java new file mode 100644 index 00000000000..f9f94107f37 --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java @@ -0,0 +1,115 @@ +/* + * 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. + * + * 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 021MALLOC_SIZE-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. + */ + +/* + * @test + * @summary Check the allocation-site stack trace of a corrupted memory at free() time + * @modules java.base/jdk.internal.misc + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail NMTPrintMallocSiteOfCorruptedMemory + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.whitebox.WhiteBox; + +public class NMTPrintMallocSiteOfCorruptedMemory { + private static final String HEADER_ARG = "header"; + private static final String FOOTER_ARG = "footer"; + private static final String HEADER_AND_SITE_ARG = "header-and-site"; + private static final String FOOTER_AND_SITE_ARG = "footer-and-site"; + private static final int MALLOC_SIZE = 10; + private static WhiteBox wb = WhiteBox.getWhiteBox(); + + static { + System.loadLibrary("MallocHeaderModifier"); + } + + public static native byte modifyHeaderCanary(long malloc_memory); + public static native byte modifyFooterCanary(long malloc_memory, long size); + public static native byte modifyHeaderCanaryAndSiteMarker(long malloc_memory); + public static native byte modifyFooterCanaryAndSiteMarker(long malloc_memory, long size); + + private static void runThisTestWith(String arg) throws Exception { + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(new String[] {"-Xbootclasspath/a:.", + "-XX:+UnlockDiagnosticVMOptions", + "-XX:+WhiteBoxAPI", + "-XX:NativeMemoryTracking=detail", + "-Djava.library.path=" + Utils.TEST_NATIVE_PATH, + "NMTPrintMallocSiteOfCorruptedMemory", + arg}); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldMatch("NMT Block at .*, corruption at: "); + switch(arg) { + case HEADER_AND_SITE_ARG, FOOTER_AND_SITE_ARG -> output.shouldContain("allocation-site cannot be shown since the marker is also corrupted."); + case HEADER_ARG, FOOTER_ARG -> { + output.shouldContain("allocated from:"); + output.shouldMatch("\\[.*\\]WB_NMTMalloc\\+0x.*"); + } + } + } + + private static void testModifyHeaderCanary() { + long addr = wb.NMTMalloc(MALLOC_SIZE); + modifyHeaderCanary(addr); + wb.NMTFree(addr); + } + + private static void testModifyFooterCanary() { + long addr = wb.NMTMalloc(MALLOC_SIZE); + modifyFooterCanary(addr, MALLOC_SIZE); + wb.NMTFree(addr); + } + + private static void testModifyHeaderCanaryAndSiteMarker() { + long addr = wb.NMTMalloc(MALLOC_SIZE); + modifyHeaderCanaryAndSiteMarker(addr); + wb.NMTFree(addr); + } + + private static void testModifyFooterCanaryAndSiteMarker() { + long addr = wb.NMTMalloc(MALLOC_SIZE); + modifyFooterCanaryAndSiteMarker(addr, MALLOC_SIZE); + wb.NMTFree(addr); + } + + public static void main(String args[]) throws Exception { + if (args != null && args.length == 1) { + switch (args[0]) { + case HEADER_ARG -> testModifyHeaderCanary(); + case FOOTER_ARG -> testModifyFooterCanary(); + case HEADER_AND_SITE_ARG -> testModifyHeaderCanaryAndSiteMarker(); + case FOOTER_AND_SITE_ARG -> testModifyFooterCanaryAndSiteMarker(); + default -> throw new RuntimeException("Invalid argument for NMTPrintMallocSiteOfCorruptedMemory (" + args[0] + ")"); + } + } else { + runThisTestWith(HEADER_ARG); + runThisTestWith(FOOTER_ARG); + runThisTestWith(HEADER_AND_SITE_ARG); + runThisTestWith(FOOTER_AND_SITE_ARG); + } + } +} diff --git a/test/hotspot/jtreg/runtime/NMT/libMallocHeaderModifier.c b/test/hotspot/jtreg/runtime/NMT/libMallocHeaderModifier.c new file mode 100644 index 00000000000..ca51b7212dd --- /dev/null +++ b/test/hotspot/jtreg/runtime/NMT/libMallocHeaderModifier.c @@ -0,0 +1,52 @@ +/* + * 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. + * + * 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. + */ + +#include "jni.h" +#include +#include + +JNIEXPORT jint JNICALL +Java_NMTPrintMallocSiteOfCorruptedMemory_modifyHeaderCanary(JNIEnv *env, jclass cls, jlong addr) { + *((jint*)(uintptr_t)addr - 1) = 0; + return 0; +} + +JNIEXPORT jint JNICALL +Java_NMTPrintMallocSiteOfCorruptedMemory_modifyFooterCanary(JNIEnv *env, jclass cls, jlong addr, jint size) { + *((jbyte*)(uintptr_t)addr + size + 1) = 0; + return 0; +} +JNIEXPORT jint JNICALL +Java_NMTPrintMallocSiteOfCorruptedMemory_modifyHeaderCanaryAndSiteMarker(JNIEnv *env, jclass cls, jlong addr) { + jbyte* p = (jbyte*)(uintptr_t)addr - 16; + memset(p, 0xFF , 16); + return 0; +} + +JNIEXPORT jint JNICALL +Java_NMTPrintMallocSiteOfCorruptedMemory_modifyFooterCanaryAndSiteMarker(JNIEnv *env, jclass cls, jlong addr, jint size) { + jbyte* p = (jbyte*)(uintptr_t)addr - 16; + memset(p, 0xFF , 16); + *((jbyte*)(uintptr_t)addr + size + 1) = 0; + return 0; +} From dc6858f336a9acaac26d302fdc462ac1ed5c94ba Mon Sep 17 00:00:00 2001 From: Afshin Zafari Date: Mon, 20 Oct 2025 15:09:43 +0000 Subject: [PATCH 208/561] 8370230: Bad copyright in NMTPrintMallocSiteOfCorruptedMemory.java after JDK-8369527 Reviewed-by: thartmann --- .../jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java index f9f94107f37..106295960fd 100644 --- a/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java +++ b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java @@ -14,7 +14,7 @@ * * 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 021MALLOC_SIZE-1301 USA. + * 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 From 257bb2b279771c80c4847d4cb2fa7e3518192585 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Mon, 20 Oct 2025 15:21:41 +0000 Subject: [PATCH 209/561] 8370079: Re-enable vmTestbase/gc/vector/CircularListLow and LinearListLow with SerialGC Reviewed-by: tschatzl --- .../vmTestbase/gc/vector/CircularListLow/TestDescription.java | 1 - .../vmTestbase/gc/vector/LinearListLow/TestDescription.java | 1 - 2 files changed, 2 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/gc/vector/CircularListLow/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/vector/CircularListLow/TestDescription.java index 252e3a2d40f..68fe6779e99 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/vector/CircularListLow/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/vector/CircularListLow/TestDescription.java @@ -31,6 +31,5 @@ * * @library /vmTestbase * /test/lib - * @requires vm.gc != "Serial" * @run main/othervm/timeout=480 gc.vector.SimpleGC.SimpleGC -ms low -gp circularList(low) */ diff --git a/test/hotspot/jtreg/vmTestbase/gc/vector/LinearListLow/TestDescription.java b/test/hotspot/jtreg/vmTestbase/gc/vector/LinearListLow/TestDescription.java index bd094045abf..8ae86af035d 100644 --- a/test/hotspot/jtreg/vmTestbase/gc/vector/LinearListLow/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/gc/vector/LinearListLow/TestDescription.java @@ -31,6 +31,5 @@ * * @library /vmTestbase * /test/lib - * @requires vm.gc != "Serial" * @run main/othervm gc.vector.SimpleGC.SimpleGC -ms low -gp linearList(low) */ From a1be29791156645fdcad69a4b7ab770a05f0fe0e Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Mon, 20 Oct 2025 15:25:49 +0000 Subject: [PATCH 210/561] 8369854: (ch) Refine specification of behavior of {Gathering,Writable}ByteChannel.write Reviewed-by: alanb --- .../java/nio/channels/GatheringByteChannel.java | 11 +++++++---- .../java/nio/channels/WritableByteChannel.java | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java b/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java index 4e3b0cf136d..e2e97562dee 100644 --- a/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -76,11 +76,14 @@ public interface GatheringByteChannel * the final position of each updated buffer, except the last updated * buffer, is guaranteed to be equal to that buffer's limit. * - *

        Unless otherwise specified, a write operation will return only after + *

        For many types of channels, a write operation will return only after * writing all of the r requested bytes. Some types of channels, * depending upon their state, may write only some of the bytes or possibly - * none at all. A socket channel in non-blocking mode, for example, cannot - * write any more bytes than are free in the socket's output buffer. + * none at all. A socket channel in {@linkplain + * SelectableChannel#isBlocking non-blocking mode}, for example, cannot + * write any more bytes than are free in the socket's output buffer. The + * write method may need to be invoked more than once to ensure that all + * {@linkplain ByteBuffer#hasRemaining remaining} bytes are written. * *

        This method may be invoked at any time. If another thread has * already initiated a write operation upon this channel, however, then an diff --git a/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java b/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java index ef8efa5037c..5284c72b37b 100644 --- a/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -65,11 +65,14 @@ public interface WritableByteChannel * Upon return the buffer's position will be equal to * p {@code +} n; its limit will not have changed. * - *

        Unless otherwise specified, a write operation will return only after + *

        For many types of channels, a write operation will return only after * writing all of the r requested bytes. Some types of channels, * depending upon their state, may write only some of the bytes or possibly - * none at all. A socket channel in non-blocking mode, for example, cannot - * write any more bytes than are free in the socket's output buffer. + * none at all. A socket channel in {@linkplain + * SelectableChannel#isBlocking non-blocking mode}, for example, cannot + * write any more bytes than are free in the socket's output buffer. The + * write method may need to be invoked more than once to ensure that all + * {@linkplain ByteBuffer#hasRemaining remaining} bytes are written. * *

        This method may be invoked at any time. If another thread has * already initiated a write operation upon this channel, however, then an From a1302e5fbc1e1b41bc0b334c2502e487fa42209f Mon Sep 17 00:00:00 2001 From: Alexey Ivanov Date: Mon, 20 Oct 2025 18:16:49 +0000 Subject: [PATCH 211/561] 8365625: Can't change accelerator colors in Windows L&F Reviewed-by: psadhukhan, kizune --- .../windows/WindowsCheckBoxMenuItemUI.java | 17 +- .../swing/plaf/windows/WindowsMenuItemUI.java | 46 ++--- .../swing/plaf/windows/WindowsMenuUI.java | 20 +- .../windows/WindowsRadioButtonMenuItemUI.java | 17 +- .../MenuItem/MenuItemAcceleratorColor.java | 193 ++++++++++++++++++ 5 files changed, 236 insertions(+), 57 deletions(-) create mode 100644 test/jdk/com/sun/java/swing/plaf/windows/MenuItem/MenuItemAcceleratorColor.java diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java index f28ae2a9326..3a2578b3e0b 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java @@ -76,19 +76,20 @@ public final class WindowsCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI { super.paintBackground(g, menuItem, bgColor); } - /** - * Paint MenuItem. - */ + @Override protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, Icon arrowIcon, Color background, Color foreground, int defaultTextIconGap) { if (WindowsMenuItemUI.isVistaPainting()) { - WindowsMenuItemUI.paintMenuItem(accessor, g, c, checkIcon, - arrowIcon, background, foreground, - disabledForeground, acceleratorSelectionForeground, - acceleratorForeground, defaultTextIconGap, - menuItem, getPropertyPrefix()); + WindowsMenuItemUI.paintMenuItem(accessor, g, c, + checkIcon, arrowIcon, + background, foreground, + disabledForeground, + acceleratorSelectionForeground, + acceleratorForeground, + defaultTextIconGap, + menuItem, getPropertyPrefix()); return; } super.paintMenuItem(g, c, checkIcon, arrowIcon, background, diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java index a9b09085ad1..041bdb5adaa 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java @@ -29,16 +29,11 @@ import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; -import java.awt.Insets; import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Enumeration; -import javax.swing.AbstractButton; -import javax.swing.ButtonGroup; import javax.swing.ButtonModel; -import javax.swing.DefaultButtonModel; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JMenu; @@ -132,27 +127,6 @@ public final class WindowsMenuItemUI extends BasicMenuItemUI { menuItem.addPropertyChangeListener(changeListener); } - protected void installDefaults() { - super.installDefaults(); - String prefix = getPropertyPrefix(); - - if (acceleratorSelectionForeground == null || - acceleratorSelectionForeground instanceof UIResource) { - acceleratorSelectionForeground = - UIManager.getColor(prefix + ".acceleratorSelectionForeground"); - } - if (acceleratorForeground == null || - acceleratorForeground instanceof UIResource) { - acceleratorForeground = - UIManager.getColor(prefix + ".acceleratorForeground"); - } - if (disabledForeground == null || - disabledForeground instanceof UIResource) { - disabledForeground = - UIManager.getColor(prefix + ".disabledForeground"); - } - } - /** * {@inheritDoc} */ @@ -165,15 +139,19 @@ public final class WindowsMenuItemUI extends BasicMenuItemUI { changeListener = null; } + @Override protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, Icon arrowIcon, Color background, Color foreground, int defaultTextIconGap) { if (WindowsMenuItemUI.isVistaPainting()) { - WindowsMenuItemUI.paintMenuItem(accessor, g, c, checkIcon, - arrowIcon, background, foreground, - disabledForeground, acceleratorSelectionForeground, - acceleratorForeground, defaultTextIconGap, menuItem, + WindowsMenuItemUI.paintMenuItem(accessor, g, c, + checkIcon, arrowIcon, + background, foreground, + disabledForeground, + acceleratorSelectionForeground, + acceleratorForeground, + defaultTextIconGap, menuItem, getPropertyPrefix()); return; } @@ -182,12 +160,16 @@ public final class WindowsMenuItemUI extends BasicMenuItemUI { } static void paintMenuItem(WindowsMenuItemUIAccessor accessor, Graphics g, - JComponent c, Icon checkIcon, Icon arrowIcon, + JComponent c, + Icon checkIcon, Icon arrowIcon, Color background, Color foreground, Color disabledForeground, Color acceleratorSelectionForeground, Color acceleratorForeground, - int defaultTextIconGap, JMenuItem menuItem, String prefix) { + int defaultTextIconGap, JMenuItem menuItem, + String prefix) { + assert c == menuItem : "menuItem passed as 'c' must be the same"; + // Save original graphics font and color Font holdf = g.getFont(); Color holdc = g.getColor(); diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java index 754b394d4ac..130b09227cc 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java @@ -131,18 +131,20 @@ public final class WindowsMenuUI extends BasicMenuUI { hotTrackingOn = (obj instanceof Boolean) ? (Boolean)obj : true; } - /** - * Paint MenuItem. - */ + @Override protected void paintMenuItem(Graphics g, JComponent c, - Icon checkIcon, Icon arrowIcon, - Color background, Color foreground, - int defaultTextIconGap) { + Icon checkIcon, Icon arrowIcon, + Color background, Color foreground, + int defaultTextIconGap) { + assert c == menuItem : "menuItem passed as 'c' must be the same"; if (WindowsMenuItemUI.isVistaPainting()) { - WindowsMenuItemUI.paintMenuItem(accessor, g, c, checkIcon, arrowIcon, + WindowsMenuItemUI.paintMenuItem(accessor, g, c, + checkIcon, arrowIcon, background, foreground, - disabledForeground, acceleratorSelectionForeground, - acceleratorForeground, defaultTextIconGap, menuItem, + disabledForeground, + acceleratorSelectionForeground, + acceleratorForeground, + defaultTextIconGap, menuItem, getPropertyPrefix()); return; } diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java index 06ef5db23a1..78768c29ab3 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java @@ -76,19 +76,20 @@ public final class WindowsRadioButtonMenuItemUI extends BasicRadioButtonMenuItem super.paintBackground(g, menuItem, bgColor); } - /** - * Paint MenuItem. - */ + @Override protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, Icon arrowIcon, Color background, Color foreground, int defaultTextIconGap) { if (WindowsMenuItemUI.isVistaPainting()) { - WindowsMenuItemUI.paintMenuItem(accessor, g, c, checkIcon, - arrowIcon, background, foreground, - disabledForeground, acceleratorSelectionForeground, - acceleratorForeground, defaultTextIconGap, - menuItem, getPropertyPrefix()); + WindowsMenuItemUI.paintMenuItem(accessor, g, c, + checkIcon, arrowIcon, + background, foreground, + disabledForeground, + acceleratorSelectionForeground, + acceleratorForeground, + defaultTextIconGap, + menuItem, getPropertyPrefix()); return; } super.paintMenuItem(g, c, checkIcon, arrowIcon, background, diff --git a/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/MenuItemAcceleratorColor.java b/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/MenuItemAcceleratorColor.java new file mode 100644 index 00000000000..f098be4fdbd --- /dev/null +++ b/test/jdk/com/sun/java/swing/plaf/windows/MenuItem/MenuItemAcceleratorColor.java @@ -0,0 +1,193 @@ +/* + * 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. + * + * 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. + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +import javax.swing.Box; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.KeyStroke; +import javax.swing.UIManager; + +import static javax.swing.BorderFactory.createEmptyBorder; + +/* + * @test id=windows + * @bug 8348760 8365375 8365389 8365625 + * @requires (os.family == "windows") + * @summary Verify that Windows Look & Feel allows changing + * accelerator colors + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual MenuItemAcceleratorColor + */ + +/* + * @test id=classic + * @bug 8348760 8365375 8365389 8365625 + * @requires (os.family == "windows") + * @summary Verify that Windows Classic Look & Feel allows changing + * accelerator colors + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual MenuItemAcceleratorColor classic + */ +public final class MenuItemAcceleratorColor { + private static final String INSTRUCTIONS = + "Click the Menu to open it.\n" + + "\n" + + "Verify that the first and the last menu items render " + + "their accelerators using the default colors, the color " + + "should match that of the menu item itself in regular and " + + "selected states.\n" + + "\n" + + "Verify that the second menu item renders its accelerator " + + "with green and that the color changes to red when selected.\n" + + "\n" + + "Verify that the third menu item renders its accelerator " + + "with magenta and yellow correspondingly.\n" + + "\n" + + "Verify that only the fifth menu item renders its accelerator " + + "with blue; both the fourth and sixth should render their " + + "accelerator with a shade of gray.\n" + + "\n" + + "If the above conditions are satisfied, press the Pass button; " + + "otherwise, press the Fail button."; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel((args.length > 0 && "classic".equals(args[0])) + ? "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel" + : "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + + PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .rows(20) + .columns(60) + .testUI(MenuItemAcceleratorColor::createUI) + .build() + .awaitAndCheck(); + } + + private static Box createInfoPanel() { + Box box = Box.createVerticalBox(); + box.add(new JLabel("Look and Feel: " + + UIManager.getLookAndFeel() + .getName())); + box.add(new JLabel("Java version: " + + System.getProperty("java.runtime.version"))); + return box; + } + + private static JFrame createUI() { + JPanel content = new JPanel(new BorderLayout()); + content.setBorder(createEmptyBorder(8, 8, 8, 8)); + content.add(createInfoPanel(), + BorderLayout.SOUTH); + + JFrame frame = new JFrame("Accelerator colors in Windows L&F"); + frame.setJMenuBar(createMenuBar()); + frame.add(content, BorderLayout.CENTER); + frame.setSize(350, 370); + return frame; + } + + private static JMenuBar createMenuBar() { + JMenuItem first = new JMenuItem("First menu item"); + first.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, + InputEvent.CTRL_DOWN_MASK)); + + // Modify colors for accelerator rendering + Color acceleratorForeground = UIManager.getColor("MenuItem.acceleratorForeground"); + Color acceleratorSelectionForeground = UIManager.getColor("MenuItem.acceleratorSelectionForeground"); + UIManager.put("MenuItem.acceleratorForeground", Color.GREEN); + UIManager.put("MenuItem.acceleratorSelectionForeground", Color.RED); + + JMenuItem second = new JMenuItem("Second menu item"); + second.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, + InputEvent.SHIFT_DOWN_MASK + | InputEvent.CTRL_DOWN_MASK)); + + UIManager.put("MenuItem.acceleratorForeground", Color.MAGENTA); + UIManager.put("MenuItem.acceleratorSelectionForeground", Color.YELLOW); + JMenuItem third = new JMenuItem("Third menu item"); + third.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, + InputEvent.ALT_DOWN_MASK)); + + // Restore colors + UIManager.put("MenuItem.acceleratorForeground", acceleratorForeground); + UIManager.put("MenuItem.acceleratorSelectionForeground", acceleratorSelectionForeground); + + + // Disabled foreground + JMenuItem fourth = new JMenuItem("Fourth menu item"); + fourth.setEnabled(false); + fourth.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, + InputEvent.CTRL_DOWN_MASK)); + + Color disabledForeground = UIManager.getColor("MenuItem.disabledForeground"); + UIManager.put("MenuItem.disabledForeground", Color.BLUE); + + JMenuItem fifth = new JMenuItem("Fifth menu item"); + fifth.setEnabled(false); + fifth.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, + InputEvent.CTRL_DOWN_MASK + | InputEvent.SHIFT_DOWN_MASK)); + + // Restore disabled foreground + UIManager.put("MenuItem.disabledForeground", disabledForeground); + + JMenuItem sixth = new JMenuItem("Sixth menu item"); + sixth.setEnabled(false); + sixth.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, + InputEvent.CTRL_DOWN_MASK + | InputEvent.ALT_DOWN_MASK)); + + + JMenuItem quit = new JMenuItem("Quit"); + quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, + InputEvent.CTRL_DOWN_MASK)); + + JMenu menu = new JMenu("Menu"); + menu.add(first); + menu.add(second); + menu.add(third); + menu.addSeparator(); + menu.add(fourth); + menu.add(fifth); + menu.add(sixth); + menu.addSeparator(); + menu.add(quit); + + JMenuBar menuBar = new JMenuBar(); + menuBar.add(menu); + + return menuBar; + } +} From 8145cfac8c697e37a05979e4b642828616764e9f Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Thu, 17 Apr 2025 16:13:45 +0000 Subject: [PATCH 212/561] 8352637: Enhance bytecode verification Reviewed-by: rhalade, mschoene, dlong, coleenp --- src/hotspot/share/classfile/stackMapTable.cpp | 10 ++++- src/hotspot/share/classfile/stackMapTable.hpp | 2 +- src/hotspot/share/classfile/verifier.cpp | 20 ++++------ .../share/interpreter/bytecodeStream.hpp | 19 ++++++++- .../share/native/libverify/check_code.c | 39 +++++++++++++------ 5 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/hotspot/share/classfile/stackMapTable.cpp b/src/hotspot/share/classfile/stackMapTable.cpp index 9e02956aceb..85fb4de8686 100644 --- a/src/hotspot/share/classfile/stackMapTable.cpp +++ b/src/hotspot/share/classfile/stackMapTable.cpp @@ -132,8 +132,16 @@ bool StackMapTable::match_stackmap( } void StackMapTable::check_jump_target( - StackMapFrame* frame, int32_t target, TRAPS) const { + StackMapFrame* frame, int bci, int offset, TRAPS) const { ErrorContext ctx; + // Jump targets must be within the method and the method size is limited. See JVMS 4.11 + int min_offset = -1 * max_method_code_size; + if (offset < min_offset || offset > max_method_code_size) { + frame->verifier()->verify_error(ErrorContext::bad_stackmap(bci, frame), + "Illegal target of jump or branch (bci %d + offset %d)", bci, offset); + return; + } + int target = bci + offset; bool match = match_stackmap( frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier())); if (!match || (target < 0 || target >= _code_length)) { diff --git a/src/hotspot/share/classfile/stackMapTable.hpp b/src/hotspot/share/classfile/stackMapTable.hpp index 6d4c0ce36c0..9b46fa89345 100644 --- a/src/hotspot/share/classfile/stackMapTable.hpp +++ b/src/hotspot/share/classfile/stackMapTable.hpp @@ -67,7 +67,7 @@ class StackMapTable : public StackObj { // Check jump instructions. Make sure there are no uninitialized // instances on backward branch. - void check_jump_target(StackMapFrame* frame, int32_t target, TRAPS) const; + void check_jump_target(StackMapFrame* frame, int bci, int offset, TRAPS) const; // The following methods are only used inside this class. diff --git a/src/hotspot/share/classfile/verifier.cpp b/src/hotspot/share/classfile/verifier.cpp index 9b93e283362..38dba1d3d5f 100644 --- a/src/hotspot/share/classfile/verifier.cpp +++ b/src/hotspot/share/classfile/verifier.cpp @@ -781,7 +781,6 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) { // Merge with the next instruction { - int target; VerificationType type, type2; VerificationType atype; @@ -1606,9 +1605,8 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) { case Bytecodes::_ifle: current_frame.pop_stack( VerificationType::integer_type(), CHECK_VERIFY(this)); - target = bcs.dest(); stackmap_table.check_jump_target( - ¤t_frame, target, CHECK_VERIFY(this)); + ¤t_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this)); no_control_flow = false; break; case Bytecodes::_if_acmpeq : case Bytecodes::_if_acmpne : @@ -1619,19 +1617,16 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) { case Bytecodes::_ifnonnull : current_frame.pop_stack( VerificationType::reference_check(), CHECK_VERIFY(this)); - target = bcs.dest(); stackmap_table.check_jump_target - (¤t_frame, target, CHECK_VERIFY(this)); + (¤t_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this)); no_control_flow = false; break; case Bytecodes::_goto : - target = bcs.dest(); stackmap_table.check_jump_target( - ¤t_frame, target, CHECK_VERIFY(this)); + ¤t_frame, bcs.bci(), bcs.get_offset_s2(), CHECK_VERIFY(this)); no_control_flow = true; break; case Bytecodes::_goto_w : - target = bcs.dest_w(); stackmap_table.check_jump_target( - ¤t_frame, target, CHECK_VERIFY(this)); + ¤t_frame, bcs.bci(), bcs.get_offset_s4(), CHECK_VERIFY(this)); no_control_flow = true; break; case Bytecodes::_tableswitch : case Bytecodes::_lookupswitch : @@ -2280,15 +2275,14 @@ void ClassVerifier::verify_switch( } } } - int target = bci + default_offset; - stackmap_table->check_jump_target(current_frame, target, CHECK_VERIFY(this)); + stackmap_table->check_jump_target(current_frame, bci, default_offset, CHECK_VERIFY(this)); for (int i = 0; i < keys; i++) { // Because check_jump_target() may safepoint, the bytecode could have // moved, which means 'aligned_bcp' is no good and needs to be recalculated. aligned_bcp = align_up(bcs->bcp() + 1, jintSize); - target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); + int offset = (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); stackmap_table->check_jump_target( - current_frame, target, CHECK_VERIFY(this)); + current_frame, bci, offset, CHECK_VERIFY(this)); } NOT_PRODUCT(aligned_bcp = nullptr); // no longer valid at this point } diff --git a/src/hotspot/share/interpreter/bytecodeStream.hpp b/src/hotspot/share/interpreter/bytecodeStream.hpp index 89d97053b45..412951691c5 100644 --- a/src/hotspot/share/interpreter/bytecodeStream.hpp +++ b/src/hotspot/share/interpreter/bytecodeStream.hpp @@ -100,8 +100,23 @@ class BaseBytecodeStream: StackObj { void set_next_bci(int bci) { assert(0 <= bci && bci <= method()->code_size(), "illegal bci"); _next_bci = bci; } // Bytecode-specific attributes - int dest() const { return bci() + bytecode().get_offset_s2(raw_code()); } - int dest_w() const { return bci() + bytecode().get_offset_s4(raw_code()); } + int get_offset_s2() const { return bytecode().get_offset_s2(raw_code()); } + int get_offset_s4() const { return bytecode().get_offset_s4(raw_code()); } + + // These methods are not safe to use before or during verification as they may + // have large offsets and cause overflows + int dest() const { + int min_offset = -1 * max_method_code_size; + int offset = bytecode().get_offset_s2(raw_code()); + guarantee(offset >= min_offset && offset <= max_method_code_size, "must be"); + return bci() + offset; + } + int dest_w() const { + int min_offset = -1 * max_method_code_size; + int offset = bytecode().get_offset_s4(raw_code()); + guarantee(offset >= min_offset && offset <= max_method_code_size, "must be"); + return bci() + offset; + } // One-byte indices. u1 get_index_u1() const { assert_raw_index_size(1); return *(jubyte*)(bcp()+1); } diff --git a/src/java.base/share/native/libverify/check_code.c b/src/java.base/share/native/libverify/check_code.c index 7266ac8f93c..32df102dcb3 100644 --- a/src/java.base/share/native/libverify/check_code.c +++ b/src/java.base/share/native/libverify/check_code.c @@ -395,7 +395,8 @@ static jboolean is_superclass(context_type *, fullinfo_type); static void initialize_exception_table(context_type *); static int instruction_length(unsigned char *iptr, unsigned char *end); -static jboolean isLegalTarget(context_type *, int offset); +static jboolean isLegalOffset(context_type *, int bci, int offset); +static jboolean isLegalTarget(context_type *, int target); static void verify_constant_pool_type(context_type *, int, unsigned); static void initialize_dataflow(context_type *); @@ -1154,9 +1155,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) case JVM_OPC_goto: { /* Set the ->operand to be the instruction number of the target. */ int jump = (((signed char)(code[offset+1])) << 8) + code[offset+2]; - int target = offset + jump; - if (!isLegalTarget(context, target)) + if (!isLegalOffset(context, offset, jump)) CCerror(context, "Illegal target of jump or branch"); + int target = offset + jump; this_idata->operand.i = code_data[target]; break; } @@ -1170,9 +1171,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) int jump = (((signed char)(code[offset+1])) << 24) + (code[offset+2] << 16) + (code[offset+3] << 8) + (code[offset + 4]); - int target = offset + jump; - if (!isLegalTarget(context, target)) + if (!isLegalOffset(context, offset, jump)) CCerror(context, "Illegal target of jump or branch"); + int target = offset + jump; this_idata->operand.i = code_data[target]; break; } @@ -1211,13 +1212,16 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) } } saved_operand = NEW(int, keys + 2); - if (!isLegalTarget(context, offset + _ck_ntohl(lpc[0]))) + int jump = _ck_ntohl(lpc[0]); + if (!isLegalOffset(context, offset, jump)) CCerror(context, "Illegal default target in switch"); - saved_operand[keys + 1] = code_data[offset + _ck_ntohl(lpc[0])]; + int target = offset + jump; + saved_operand[keys + 1] = code_data[target]; for (k = keys, lptr = &lpc[3]; --k >= 0; lptr += delta) { - int target = offset + _ck_ntohl(lptr[0]); - if (!isLegalTarget(context, target)) + jump = _ck_ntohl(lptr[0]); + if (!isLegalOffset(context, offset, jump)) CCerror(context, "Illegal branch in tableswitch"); + target = offset + jump; saved_operand[k + 1] = code_data[target]; } saved_operand[0] = keys + 1; /* number of successors */ @@ -1746,11 +1750,24 @@ static int instruction_length(unsigned char *iptr, unsigned char *end) /* Given the target of a branch, make sure that it's a legal target. */ static jboolean -isLegalTarget(context_type *context, int offset) +isLegalTarget(context_type *context, int target) { int code_length = context->code_length; int *code_data = context->code_data; - return (offset >= 0 && offset < code_length && code_data[offset] >= 0); + return (target >= 0 && target < code_length && code_data[target] >= 0); +} + +/* Given a bci and offset, make sure the offset is valid and the target is legal */ +static jboolean +isLegalOffset(context_type *context, int bci, int offset) +{ + int code_length = context->code_length; + int *code_data = context->code_data; + int max_offset = 65535; // JVMS 4.11 + int min_offset = -65535; + if (offset < min_offset || offset > max_offset) return JNI_FALSE; + int target = bci + offset; + return (target >= 0 && target < code_length && code_data[target] >= 0); } From d9dad578b87a258095468ee6ff8b0769bac0defc Mon Sep 17 00:00:00 2001 From: Joe Wang Date: Thu, 26 Jun 2025 02:33:17 +0000 Subject: [PATCH 213/561] 8356294: Enhance Path Factories Reviewed-by: ahgross, rriggs, rhalade, lancea, naoto --- .../jaxp/DocumentBuilderFactoryImpl.java | 19 ++++++++++++++++--- .../xpath/internal/jaxp/XPathFactoryImpl.java | 10 ++++++---- .../apache/xpath/internal/jaxp/XPathImpl.java | 9 ++++++--- .../xpath/internal/jaxp/XPathImplUtil.java | 12 ++++++++++-- .../classes/jdk/xml/internal/JdkXmlUtils.java | 16 +++++++++++++++- .../jdk/xml/internal/XMLSecurityManager.java | 16 ++++++++++++++++ 6 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java index 385b8e29439..bc8e93b4f0b 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/jaxp/DocumentBuilderFactoryImpl.java @@ -41,7 +41,7 @@ import org.xml.sax.SAXNotSupportedException; /** * @author Rajiv Mordani * @author Edwin Goei - * @LastModified: May 2025 + * @LastModified: June 2025 */ public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { /** These are DocumentBuilderFactory attributes not DOM attributes */ @@ -59,11 +59,24 @@ public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { XMLSecurityManager fSecurityManager; XMLSecurityPropertyManager fSecurityPropertyMgr; + /** + * Creates a new {@code DocumentBuilderFactory} instance. + */ public DocumentBuilderFactoryImpl() { + this(null, null); + } + + /** + * Creates a new {@code DocumentBuilderFactory} instance with a {@code XMLSecurityManager} + * and {@code XMLSecurityPropertyManager}. + * @param xsm the {@code XMLSecurityManager} + * @param xspm the {@code XMLSecurityPropertyManager} + */ + public DocumentBuilderFactoryImpl(XMLSecurityManager xsm, XMLSecurityPropertyManager xspm) { JdkXmlConfig config = JdkXmlConfig.getInstance(false); // security (property) managers updated with current system properties - fSecurityManager = config.getXMLSecurityManager(true); - fSecurityPropertyMgr = config.getXMLSecurityPropertyManager(true); + fSecurityManager = (xsm == null) ? config.getXMLSecurityManager(true) : xsm; + fSecurityPropertyMgr = (xspm == null) ? config.getXMLSecurityPropertyManager(true) : xspm; } /** diff --git a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java index 1288f1dbac3..2f4d2ade545 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathFactoryImpl.java @@ -35,7 +35,7 @@ import jdk.xml.internal.*; * * @author Ramesh Mandava * - * @LastModified: May 2025 + * @LastModified: June 2025 */ public class XPathFactoryImpl extends XPathFactory { @@ -72,6 +72,7 @@ public class XPathFactoryImpl extends XPathFactory { * The XML security manager */ private XMLSecurityManager _xmlSecMgr; + private XMLSecurityPropertyManager _xmlSecPropMgr; /** * javax.xml.xpath.XPathFactory implementation. @@ -80,6 +81,7 @@ public class XPathFactoryImpl extends XPathFactory { JdkXmlConfig config = JdkXmlConfig.getInstance(false); _xmlSecMgr = config.getXMLSecurityManager(true); _featureManager = config.getXMLFeatures(true); + _xmlSecPropMgr = config.getXMLSecurityPropertyManager(true); } /** @@ -129,7 +131,7 @@ public class XPathFactoryImpl extends XPathFactory { */ public javax.xml.xpath.XPath newXPath() { return new XPathImpl(xPathVariableResolver, xPathFunctionResolver, - !_isNotSecureProcessing, _featureManager, _xmlSecMgr); + !_isNotSecureProcessing, _featureManager, _xmlSecMgr, _xmlSecPropMgr); } /** @@ -183,6 +185,7 @@ public class XPathFactoryImpl extends XPathFactory { if (value && _featureManager != null) { _featureManager.setFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION, JdkProperty.State.FSP, false); + _xmlSecMgr.setSecureProcessing(value); } // all done processing feature @@ -338,8 +341,7 @@ public class XPathFactoryImpl extends XPathFactory { throw new NullPointerException(fmsg); } - if (_xmlSecMgr != null && - _xmlSecMgr.setLimit(name, JdkProperty.State.APIPROPERTY, value)) { + if (JdkXmlUtils.setProperty(_xmlSecMgr, _xmlSecPropMgr, name, value)) { return; } diff --git a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java index 53099ad078e..c2faf90ce2e 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImpl.java @@ -36,6 +36,7 @@ import javax.xml.xpath.XPathVariableResolver; import jdk.xml.internal.JdkXmlConfig; import jdk.xml.internal.JdkXmlFeatures; import jdk.xml.internal.XMLSecurityManager; +import jdk.xml.internal.XMLSecurityPropertyManager; import org.w3c.dom.Document; import org.xml.sax.InputSource; @@ -50,7 +51,7 @@ import org.xml.sax.InputSource; * New methods: evaluateExpression * Refactored to share code with XPathExpressionImpl. * - * @LastModified: May 2025 + * @LastModified: June 2025 */ public class XPathImpl extends XPathImplUtil implements javax.xml.xpath.XPath { @@ -62,12 +63,13 @@ public class XPathImpl extends XPathImplUtil implements javax.xml.xpath.XPath { XPathImpl(XPathVariableResolver vr, XPathFunctionResolver fr) { this(vr, fr, false, JdkXmlConfig.getInstance(false).getXMLFeatures(false), - JdkXmlConfig.getInstance(false).getXMLSecurityManager(false)); + JdkXmlConfig.getInstance(false).getXMLSecurityManager(false), + JdkXmlConfig.getInstance(false).getXMLSecurityPropertyManager(false)); } XPathImpl(XPathVariableResolver vr, XPathFunctionResolver fr, boolean featureSecureProcessing, JdkXmlFeatures featureManager, - XMLSecurityManager xmlSecMgr) { + XMLSecurityManager xmlSecMgr, XMLSecurityPropertyManager xmlSecPropMgr) { this.origVariableResolver = this.variableResolver = vr; this.origFunctionResolver = this.functionResolver = fr; this.featureSecureProcessing = featureSecureProcessing; @@ -75,6 +77,7 @@ public class XPathImpl extends XPathImplUtil implements javax.xml.xpath.XPath { overrideDefaultParser = featureManager.getFeature( JdkXmlFeatures.XmlFeature.JDK_OVERRIDE_PARSER); this.xmlSecMgr = xmlSecMgr; + this.xmlSecPropMgr = xmlSecPropMgr; } diff --git a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java index a92090900fa..3de72f3f68b 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/jaxp/XPathImplUtil.java @@ -31,6 +31,7 @@ import com.sun.org.apache.xpath.internal.axes.LocPathIterator; import com.sun.org.apache.xpath.internal.objects.XObject; import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; import java.io.IOException; +import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -44,6 +45,7 @@ import javax.xml.xpath.XPathVariableResolver; import jdk.xml.internal.JdkXmlFeatures; import jdk.xml.internal.JdkXmlUtils; import jdk.xml.internal.XMLSecurityManager; +import jdk.xml.internal.XMLSecurityPropertyManager; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.NodeIterator; @@ -54,7 +56,7 @@ import org.xml.sax.SAXException; * This class contains several utility methods used by XPathImpl and * XPathExpressionImpl * - * @LastModified: Apr 2025 + * @LastModified: June 2025 */ class XPathImplUtil { XPathFunctionResolver functionResolver; @@ -67,6 +69,7 @@ class XPathImplUtil { boolean featureSecureProcessing = false; JdkXmlFeatures featureManager; XMLSecurityManager xmlSecMgr; + XMLSecurityPropertyManager xmlSecPropMgr; /** * Evaluate an XPath context using the internal XPath engine @@ -128,7 +131,12 @@ class XPathImplUtil { // // so we really have to create a fresh DocumentBuilder every time we need one // - KK - DocumentBuilderFactory dbf = JdkXmlUtils.getDOMFactory(overrideDefaultParser); + DocumentBuilderFactory dbf = JdkXmlUtils.getDOMFactory( + overrideDefaultParser, xmlSecMgr, xmlSecPropMgr); + if (xmlSecMgr != null && xmlSecMgr.isSecureProcessingSet()) { + dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, + xmlSecMgr.isSecureProcessing()); + } return dbf.newDocumentBuilder().parse(source); } catch (ParserConfigurationException | SAXException | IOException e) { throw new XPathExpressionException (e); diff --git a/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java b/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java index 93b63a746f1..9e718b264e4 100644 --- a/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java +++ b/src/java.xml/share/classes/jdk/xml/internal/JdkXmlUtils.java @@ -445,6 +445,20 @@ public class JdkXmlUtils { * @return a DocumentBuilderFactory instance. */ public static DocumentBuilderFactory getDOMFactory(boolean overrideDefaultParser) { + return getDOMFactory(overrideDefaultParser, null, null); + } + + /** + * {@return a DocumentBuilderFactory instance} + * + * @param overrideDefaultParser a flag indicating whether the system-default + * implementation may be overridden. If the system property of the + * DOM factory ID is set, override is always allowed. + * @param xsm XMLSecurityManager + * @param xspm XMLSecurityPropertyManager + */ + public static DocumentBuilderFactory getDOMFactory(boolean overrideDefaultParser, + XMLSecurityManager xsm, XMLSecurityPropertyManager xspm) { boolean override = overrideDefaultParser; String spDOMFactory = SecuritySupport.getJAXPSystemProperty(DOM_FACTORY_ID); @@ -453,7 +467,7 @@ public class JdkXmlUtils { } DocumentBuilderFactory dbf = !override - ? new DocumentBuilderFactoryImpl() + ? new DocumentBuilderFactoryImpl(xsm, xspm) : DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); // false is the default setting. This step here is for compatibility diff --git a/src/java.xml/share/classes/jdk/xml/internal/XMLSecurityManager.java b/src/java.xml/share/classes/jdk/xml/internal/XMLSecurityManager.java index 5ca4073e20f..a1687c420c3 100644 --- a/src/java.xml/share/classes/jdk/xml/internal/XMLSecurityManager.java +++ b/src/java.xml/share/classes/jdk/xml/internal/XMLSecurityManager.java @@ -244,6 +244,12 @@ public final class XMLSecurityManager implements Cloneable { */ boolean secureProcessing; + /** + * Flag indicating the secure processing is set explicitly through factories' + * setFeature method and then the setSecureProcessing method + */ + boolean secureProcessingSet; + /** * States that determine if properties are set explicitly */ @@ -340,6 +346,7 @@ public final class XMLSecurityManager implements Cloneable { * Setting FEATURE_SECURE_PROCESSING explicitly */ public void setSecureProcessing(boolean secure) { + secureProcessingSet = true; secureProcessing = secure; for (Limit limit : Limit.values()) { if (secure) { @@ -358,6 +365,15 @@ public final class XMLSecurityManager implements Cloneable { return secureProcessing; } + /** + * Returns the state indicating whether the Secure Processing is set explicitly, + * via factories' setFeature and then this class' setSecureProcessing method. + * @return the state indicating whether the Secure Processing is set explicitly + */ + public boolean isSecureProcessingSet() { + return secureProcessingSet; + } + /** * Finds a limit's new name with the given property name. * @param propertyName the property name specified From c4485059149ab19882440659a0a167154d70c9a6 Mon Sep 17 00:00:00 2001 From: Raffaello Giulietti Date: Thu, 3 Jul 2025 13:57:01 +0000 Subject: [PATCH 214/561] 8359454: Enhance String handling Reviewed-by: rhalade, rriggs --- .../share/classes/java/lang/AbstractStringBuilder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java index d317557cbb1..f1da102236a 100644 --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java @@ -1448,8 +1448,8 @@ abstract sealed class AbstractStringBuilder implements Appendable, CharSequence shift(currValue, coder, count, dstOffset, len); count += len; // Coder of CharSequence may be a mismatch, requiring the value array to be inflated - byte[] newValue = (s instanceof String str) - ? putStringAt(currValue, coder, count, dstOffset, str, start, end) + byte[] newValue = (s instanceof String str && str.length() == len) + ? putStringAt(currValue, coder, count, dstOffset, str) : putCharsAt(currValue, coder, count, dstOffset, s, start, end); if (currValue != newValue) { this.coder = UTF16; @@ -1928,10 +1928,10 @@ abstract sealed class AbstractStringBuilder implements Appendable, CharSequence * @param index the index to insert the string * @param str the string */ - private static byte[] putStringAt(byte[] value, byte coder, int count, int index, String str, int off, int end) { + private static byte[] putStringAt(byte[] value, byte coder, int count, int index, String str) { byte[] newValue = inflateIfNeededFor(value, count, coder, str.coder()); coder = (newValue == value) ? coder : UTF16; - str.getBytes(newValue, off, index, coder, end - off); + str.getBytes(newValue, 0, index, coder, str.length()); return newValue; } From e1d1fa91cf2670b171e64ad79b88f5d1ad3e51f7 Mon Sep 17 00:00:00 2001 From: Sean Mullan Date: Wed, 9 Jul 2025 19:31:30 +0000 Subject: [PATCH 215/561] 8360937: Enhance certificate handling Reviewed-by: ahgross, rhalade, jnibedita, ascarpino, naoto --- .../classes/sun/security/util/DerValue.java | 16 +++++++ .../share/classes/sun/security/x509/AVA.java | 48 +++++++++++++++++-- .../test/lib/security/CertificateBuilder.java | 23 +++++++-- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/sun/security/util/DerValue.java b/src/java.base/share/classes/sun/security/util/DerValue.java index 19e7083180b..ec8b482b07d 100644 --- a/src/java.base/share/classes/sun/security/util/DerValue.java +++ b/src/java.base/share/classes/sun/security/util/DerValue.java @@ -859,6 +859,22 @@ public class DerValue { return readStringInternal(tag_UniversalString, new UTF_32BE()); } + /** + * Checks that the BMPString does not contain any surrogate characters, + * which are outside the Basic Multilingual Plane. + * + * @throws IOException if illegal characters are detected + */ + public void validateBMPString() throws IOException { + String bmpString = getBMPString(); + for (int i = 0; i < bmpString.length(); i++) { + if (Character.isSurrogate(bmpString.charAt(i))) { + throw new IOException( + "Illegal character in BMPString, index: " + i); + } + } + } + /** * Reads the ASN.1 NULL value */ diff --git a/src/java.base/share/classes/sun/security/x509/AVA.java b/src/java.base/share/classes/sun/security/x509/AVA.java index 915421c76f2..214ae718288 100644 --- a/src/java.base/share/classes/sun/security/x509/AVA.java +++ b/src/java.base/share/classes/sun/security/x509/AVA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -28,10 +28,13 @@ package sun.security.x509; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.Reader; +import java.nio.charset.Charset; import java.text.Normalizer; import java.util.*; +import static java.nio.charset.StandardCharsets.ISO_8859_1; import static java.nio.charset.StandardCharsets.UTF_8; +import static java.nio.charset.StandardCharsets.UTF_16BE; import sun.security.util.*; import sun.security.pkcs.PKCS9Attribute; @@ -589,6 +592,10 @@ public class AVA implements DerEncoder { throw new IOException("AVA, extra bytes = " + derval.data.available()); } + + if (value.tag == DerValue.tag_BMPString) { + value.validateBMPString(); + } } AVA(DerInputStream in) throws IOException { @@ -713,7 +720,8 @@ public class AVA implements DerEncoder { * NOTE: this implementation only emits DirectoryStrings of the * types returned by isDerString(). */ - String valStr = new String(value.getDataBytes(), UTF_8); + String valStr = + new String(value.getDataBytes(), getCharset(value, false)); /* * 2.4 (cont): If the UTF-8 string does not have any of the @@ -832,7 +840,8 @@ public class AVA implements DerEncoder { * NOTE: this implementation only emits DirectoryStrings of the * types returned by isDerString(). */ - String valStr = new String(value.getDataBytes(), UTF_8); + String valStr = + new String(value.getDataBytes(), getCharset(value, true)); /* * 2.4 (cont): If the UTF-8 string does not have any of the @@ -927,6 +936,39 @@ public class AVA implements DerEncoder { } } + /* + * Returns the charset that should be used to decode each DN string type. + * + * This method ensures that multi-byte (UTF8String and BMPString) types + * are decoded using the correct charset and the String forms represent + * the correct characters. For 8-bit ASCII-based types (PrintableString + * and IA5String), we return ISO_8859_1 rather than ASCII, so that the + * complete range of characters can be represented, as many certificates + * do not comply with the Internationalized Domain Name ACE format. + * + * NOTE: this method only supports DirectoryStrings of the types returned + * by isDerString(). + */ + private static Charset getCharset(DerValue value, boolean canonical) { + if (canonical) { + return switch (value.tag) { + case DerValue.tag_PrintableString -> ISO_8859_1; + case DerValue.tag_UTF8String -> UTF_8; + default -> throw new Error("unexpected tag: " + value.tag); + }; + } + + return switch (value.tag) { + case DerValue.tag_PrintableString, + DerValue.tag_T61String, + DerValue.tag_IA5String, + DerValue.tag_GeneralString -> ISO_8859_1; + case DerValue.tag_BMPString -> UTF_16BE; + case DerValue.tag_UTF8String -> UTF_8; + default -> throw new Error("unexpected tag: " + value.tag); + }; + } + boolean hasRFC2253Keyword() { return AVAKeyword.hasKeyword(oid, RFC2253); } diff --git a/test/lib/jdk/test/lib/security/CertificateBuilder.java b/test/lib/jdk/test/lib/security/CertificateBuilder.java index e5044d46b0f..d35a21e7ab5 100644 --- a/test/lib/jdk/test/lib/security/CertificateBuilder.java +++ b/test/lib/jdk/test/lib/security/CertificateBuilder.java @@ -53,6 +53,7 @@ import sun.security.x509.KeyUsageExtension; import sun.security.x509.SubjectAlternativeNameExtension; import sun.security.x509.URIName; import sun.security.x509.KeyIdentifier; +import sun.security.x509.X500Name; /** @@ -90,7 +91,7 @@ import sun.security.x509.KeyIdentifier; public class CertificateBuilder { private final CertificateFactory factory; - private X500Principal subjectName = null; + private X500Name subjectName = null; private BigInteger serialNumber = null; private PublicKey publicKey = null; private Date notBefore = null; @@ -199,7 +200,7 @@ public class CertificateBuilder { * on this certificate. */ public CertificateBuilder setSubjectName(X500Principal name) { - subjectName = name; + subjectName = X500Name.asX500Name(name); return this; } @@ -209,7 +210,23 @@ public class CertificateBuilder { * @param name The subject name in RFC 2253 format */ public CertificateBuilder setSubjectName(String name) { - subjectName = new X500Principal(name); + try { + subjectName = new X500Name(name); + } catch (IOException ioe) { + throw new IllegalArgumentException(ioe); + } + return this; + } + + /** + * Set the subject name for the certificate. This method is useful when + * you need more control over the contents of the subject name. + * + * @param name an {@code X500Name} to be used as the subject name + * on this certificate + */ + public CertificateBuilder setSubjectName(X500Name name) { + subjectName = name; return this; } From c781a2ff318d38598ce60af80da834638ebc6f00 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 21 Oct 2025 00:07:12 +0000 Subject: [PATCH 216/561] 8370136: Support async execution of jpackage tests Reviewed-by: almatvee --- .../jdk/jpackage/test/ConfigFilesStasher.java | 10 +- .../jdk/jpackage/test/JPackageCommand.java | 60 ++- .../helpers/jdk/jpackage/test/Main.java | 4 +- .../helpers/jdk/jpackage/test/TKit.java | 347 +++++++++++++----- .../jdk/jpackage/test/TestBuilder.java | 2 +- .../jdk/jpackage/test/TestMethodSupplier.java | 2 +- .../jpackage/windows/WinNoRestartTest.java | 25 +- 7 files changed, 301 insertions(+), 149 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java index e630659bdb1..2321e4e852e 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java @@ -374,8 +374,14 @@ final class ConfigFilesStasher { private static Path setupDirectory(JPackageCommand cmd, String argName) { if (!cmd.hasArgument(argName)) { - // Use absolute path as jpackage can be executed in another directory - cmd.setArgumentValue(argName, TKit.createTempDirectory("stash-script-resource-dir").toAbsolutePath()); + // Use absolute path as jpackage can be executed in another directory. + // Some tests expect a specific last argument, don't interfere with them + // and insert the argument at the beginning of the command line. + List args = new ArrayList<>(); + args.add(argName); + args.add(TKit.createTempDirectory("stash-script-resource-dir").toAbsolutePath().toString()); + args.addAll(cmd.getAllArguments()); + cmd.clearArguments().addArguments(args); } return Path.of(cmd.getArgumentValue(argName)); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 8984450f54b..ae9568bb844 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -39,7 +39,6 @@ import java.nio.file.Path; import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -691,7 +690,7 @@ public class JPackageCommand extends CommandArguments { } public static void useToolProviderByDefault(ToolProvider jpackageToolProvider) { - defaultToolProvider = Optional.of(jpackageToolProvider); + defaultToolProvider.set(Optional.of(jpackageToolProvider)); } public static void useToolProviderByDefault() { @@ -699,7 +698,7 @@ public class JPackageCommand extends CommandArguments { } public static void useExecutableByDefault() { - defaultToolProvider = Optional.empty(); + defaultToolProvider.set(Optional.empty()); } public JPackageCommand useToolProvider(boolean v) { @@ -808,7 +807,9 @@ public class JPackageCommand extends CommandArguments { } public boolean isWithToolProvider() { - return Optional.ofNullable(withToolProvider).orElseGet(defaultToolProvider::isPresent); + return Optional.ofNullable(withToolProvider).orElseGet(() -> { + return defaultToolProvider.get().isPresent(); + }); } public JPackageCommand executePrerequisiteActions() { @@ -824,7 +825,7 @@ public class JPackageCommand extends CommandArguments { .addArguments(args); if (isWithToolProvider()) { - exec.setToolProvider(defaultToolProvider.orElseGet(JavaTool.JPACKAGE::asToolProvider)); + exec.setToolProvider(defaultToolProvider.get().orElseGet(JavaTool.JPACKAGE::asToolProvider)); } else { exec.setExecutable(JavaTool.JPACKAGE); if (TKit.isWindows()) { @@ -1256,10 +1257,7 @@ public class JPackageCommand extends CommandArguments { private void assertFileInAppImage(Path filename, Path expectedPath) { if (expectedPath != null) { - if (expectedPath.isAbsolute()) { - throw new IllegalArgumentException(); - } - if (!expectedPath.getFileName().equals(filename.getFileName())) { + if (expectedPath.isAbsolute() || !expectedPath.getFileName().equals(filename.getFileName())) { throw new IllegalArgumentException(); } } @@ -1345,7 +1343,7 @@ public class JPackageCommand extends CommandArguments { addArguments("--runtime-image", DEFAULT_RUNTIME_IMAGE); } - if (!hasArgument("--verbose") && TKit.VERBOSE_JPACKAGE && !ignoreDefaultVerbose) { + if (!hasArgument("--verbose") && TKit.verboseJPackage() && !ignoreDefaultVerbose) { addArgument("--verbose"); } @@ -1369,11 +1367,7 @@ public class JPackageCommand extends CommandArguments { final var typesSet = Stream.of(types).collect(Collectors.toSet()); if (!hasArgument("--type")) { if (!isImagePackageType()) { - if (TKit.isLinux() && typesSet.equals(PackageType.LINUX)) { - return; - } - - if (TKit.isWindows() && typesSet.equals(PackageType.WINDOWS)) { + if ((TKit.isLinux() && typesSet.equals(PackageType.LINUX)) || (TKit.isWindows() && typesSet.equals(PackageType.WINDOWS))) { return; } @@ -1523,29 +1517,21 @@ public class JPackageCommand extends CommandArguments { private Set readOnlyPathAsserts = Set.of(ReadOnlyPathAssert.values()); private Set appLayoutAsserts = Set.of(AppLayoutAssert.values()); private List>> outputValidators = new ArrayList<>(); - private static Optional defaultToolProvider = Optional.empty(); - - private static final Map PACKAGE_TYPES = Functional.identity( - () -> { - Map reply = new HashMap<>(); - for (PackageType type : PackageType.values()) { - reply.put(type.getType(), type); - } - return reply; - }).get(); - - public static final Path DEFAULT_RUNTIME_IMAGE = Functional.identity(() -> { - // Set the property to the path of run-time image to speed up - // building app images and platform bundles by avoiding running jlink - // The value of the property will be automativcally appended to - // jpackage command line if the command line doesn't have - // `--runtime-image` parameter set. - String val = TKit.getConfigProperty("runtime-image"); - if (val != null) { - return Path.of(val); + private static InheritableThreadLocal> defaultToolProvider = new InheritableThreadLocal<>() { + @Override + protected Optional initialValue() { + return Optional.empty(); } - return null; - }).get(); + }; + + private static final Map PACKAGE_TYPES = Stream.of(PackageType.values()).collect(toMap(PackageType::getType, x -> x)); + + // Set the property to the path of run-time image to speed up + // building app images and platform bundles by avoiding running jlink. + // The value of the property will be automatically appended to + // jpackage command line if the command line doesn't have + // `--runtime-image` parameter set. + public static final Path DEFAULT_RUNTIME_IMAGE = Optional.ofNullable(TKit.getConfigProperty("runtime-image")).map(Path::of).orElse(null); // [HH:mm:ss.SSS] private static final Pattern TIMESTAMP_REGEXP = Pattern.compile( diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java index e7f06b0d608..fa8fe166f5a 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/Main.java @@ -41,11 +41,11 @@ import java.util.stream.Stream; public final class Main { - public static void main(String args[]) throws Throwable { + public static void main(String... args) throws Throwable { main(TestBuilder.build(), args); } - public static void main(TestBuilder.Builder builder, String args[]) throws Throwable { + public static void main(TestBuilder.Builder builder, String... args) throws Throwable { boolean listTests = false; List tests = new ArrayList<>(); try (TestBuilder testBuilder = builder.testConsumer(tests::add).create()) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index ed9c727abcc..bdf9fb85672 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -29,7 +29,6 @@ import static jdk.jpackage.internal.util.function.ThrowingBiFunction.toBiFunctio import static jdk.jpackage.internal.util.function.ThrowingSupplier.toSupplier; import java.io.Closeable; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.UncheckedIOException; @@ -39,6 +38,7 @@ import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchKey; @@ -110,7 +110,7 @@ public final class TKit { }).get(); static void withExtraLogStream(ThrowingRunnable action) { - if (extraLogStream != null) { + if (state().extraLogStream != null) { ThrowingRunnable.toRunnable(action).run(); } else { try (PrintStream logStream = openLogStream()) { @@ -120,12 +120,44 @@ public final class TKit { } static void withExtraLogStream(ThrowingRunnable action, PrintStream logStream) { - var oldExtraLogStream = extraLogStream; + withNewState(action, stateBuilder -> { + stateBuilder.extraLogStream(logStream); + }); + } + + public static void withMainLogStream(ThrowingRunnable action, PrintStream logStream) { + withNewState(action, stateBuilder -> { + stateBuilder.mainLogStream(logStream); + }); + } + + public static void withStackTraceStream(ThrowingRunnable action, PrintStream logStream) { + withNewState(action, stateBuilder -> { + stateBuilder.stackTraceStream(logStream); + }); + } + + public static State state() { + return STATE.get(); + } + + public static void state(State v) { + STATE.set(Objects.requireNonNull(v)); + } + + private static void withNewState(ThrowingRunnable action, Consumer stateBuilderMutator) { + Objects.requireNonNull(action); + Objects.requireNonNull(stateBuilderMutator); + + var oldState = state(); + var builder = oldState.buildCopy(); + stateBuilderMutator.accept(builder); + var newState = builder.create(); try { - extraLogStream = logStream; + state(newState); ThrowingRunnable.toRunnable(action).run(); } finally { - extraLogStream = oldExtraLogStream; + state(oldState); } } @@ -142,26 +174,25 @@ public final class TKit { static void runTests(List tests, Set modes) { Objects.requireNonNull(tests); Objects.requireNonNull(modes); - if (currentTest != null) { - throw new IllegalStateException( - "Unexpected nested or concurrent Test.run() call"); + if (currentTest() != null) { + throw new IllegalStateException("Unexpected nested Test.run() call"); } withExtraLogStream(() -> { tests.stream().forEach(test -> { - currentTest = test; - try { - if (modes.contains(RunTestMode.FAIL_FAST)) { - ThrowingRunnable.toRunnable(test::run).run(); - } else { - ignoreExceptions(test).run(); + withNewState(() -> { + try { + if (modes.contains(RunTestMode.FAIL_FAST)) { + test.run(); + } else { + ignoreExceptions(test).run(); + } + } finally { + Optional.ofNullable(state().extraLogStream).ifPresent(PrintStream::flush); } - } finally { - currentTest = null; - if (extraLogStream != null) { - extraLogStream.flush(); - } - } + }, stateBuilder -> { + stateBuilder.currentTest(test); + }); }); }); } @@ -218,18 +249,18 @@ public final class TKit { } public static Path workDir() { - return currentTest.workDir(); + return currentTest().workDir(); } static String getCurrentDefaultAppName() { // Construct app name from swapping and joining test base name // and test function name. // Say the test name is `FooTest.testBasic`. Then app name would be `BasicFooTest`. - String appNamePrefix = currentTest.functionName(); + String appNamePrefix = currentTest().functionName(); if (appNamePrefix != null && appNamePrefix.startsWith("test")) { appNamePrefix = appNamePrefix.substring("test".length()); } - return Stream.of(appNamePrefix, currentTest.baseName()).filter( + return Stream.of(appNamePrefix, currentTest().baseName()).filter( v -> v != null && !v.isEmpty()).collect(Collectors.joining()); } @@ -257,9 +288,10 @@ public final class TKit { static void log(String v) { v = addTimestamp(v); - System.out.println(v); - if (extraLogStream != null) { - extraLogStream.println(v); + var state = state(); + state.mainLogStream.println(v); + if (state.extraLogStream != null) { + state.extraLogStream.println(v); } } @@ -309,13 +341,13 @@ public final class TKit { } public static void trace(String v) { - if (TRACE) { + if (state().trace) { log("TRACE: " + v); } } private static void traceAssert(String v) { - if (TRACE_ASSERTS) { + if (state().traceAsserts) { log("TRACE: " + v); } } @@ -576,10 +608,14 @@ public final class TKit { public static RuntimeException throwSkippedException(RuntimeException ex) { trace("Skip the test: " + ex.getMessage()); - currentTest.notifySkipped(ex); + currentTest().notifySkipped(ex); throw ex; } + public static boolean isSkippedException(Throwable t) { + return JtregSkippedExceptionClass.INSTANCE.isInstance(t); + } + public static Path createRelativePathCopy(final Path file) { Path fileCopy = ThrowingSupplier.toSupplier(() -> { Path localPath = createTempFile(file.getFileName()); @@ -654,10 +690,9 @@ public final class TKit { } static void printStackTrace(Throwable throwable) { - if (extraLogStream != null) { - throwable.printStackTrace(extraLogStream); - } - throwable.printStackTrace(); + var state = state(); + Optional.ofNullable(state.extraLogStream).ifPresent(throwable::printStackTrace); + throwable.printStackTrace(state.stackTraceStream); } private static String concatMessages(String msg, String msg2) { @@ -668,7 +703,7 @@ public final class TKit { } public static void assertEquals(long expected, long actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (expected != actual) { error(concatMessages(String.format( "Expected [%d]. Actual [%d]", expected, actual), @@ -679,7 +714,7 @@ public final class TKit { } public static void assertNotEquals(long expected, long actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (expected == actual) { error(concatMessages(String.format("Unexpected [%d] value", actual), msg)); @@ -690,7 +725,7 @@ public final class TKit { } public static void assertEquals(boolean expected, boolean actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (expected != actual) { error(concatMessages(String.format( "Expected [%s]. Actual [%s]", expected, actual), @@ -701,7 +736,7 @@ public final class TKit { } public static void assertNotEquals(boolean expected, boolean actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (expected == actual) { error(concatMessages(String.format("Unexpected [%s] value", actual), msg)); @@ -713,7 +748,7 @@ public final class TKit { public static void assertEquals(Object expected, Object actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if ((actual != null && !actual.equals(expected)) || (expected != null && !expected.equals(actual))) { error(concatMessages(String.format( @@ -725,7 +760,7 @@ public final class TKit { } public static void assertNotEquals(Object expected, Object actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if ((actual != null && !actual.equals(expected)) || (expected != null && !expected.equals(actual))) { @@ -738,7 +773,7 @@ public final class TKit { } public static void assertNull(Object value, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (value != null) { error(concatMessages(String.format("Unexpected not null value [%s]", value), msg)); @@ -748,7 +783,7 @@ public final class TKit { } public static void assertNotNull(Object value, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (value == null) { error(concatMessages("Unexpected null value", msg)); } @@ -765,7 +800,7 @@ public final class TKit { } public static void assertTrue(boolean actual, String msg, Runnable onFail) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (!actual) { if (onFail != null) { onFail.run(); @@ -777,7 +812,7 @@ public final class TKit { } public static void assertFalse(boolean actual, String msg, Runnable onFail) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); if (actual) { if (onFail != null) { onFail.run(); @@ -883,7 +918,7 @@ public final class TKit { } public static void assertUnexpected(String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); error(concatMessages("Unexpected", msg)); } @@ -909,7 +944,7 @@ public final class TKit { } public void match(Set expected) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); var comm = Comm.compare(content, expected); if (!comm.unique1().isEmpty() && !comm.unique2().isEmpty()) { @@ -936,7 +971,7 @@ public final class TKit { } public void contains(Set expected) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); var comm = Comm.compare(content, expected); if (!comm.unique2().isEmpty()) { @@ -981,7 +1016,7 @@ public final class TKit { public static void assertStringListEquals(List expected, List actual, String msg) { - currentTest.notifyAssert(); + currentTest().notifyAssert(); traceAssert(concatMessages("assertStringListEquals()", msg)); @@ -1207,12 +1242,13 @@ public final class TKit { } private static PrintStream openLogStream() { - if (LOG_FILE == null) { - return null; - } - - return ThrowingSupplier.toSupplier(() -> new PrintStream( - new FileOutputStream(LOG_FILE.toFile(), true))).get(); + return state().logFile.map(logfile -> { + try { + return Files.newOutputStream(logfile, StandardOpenOption.CREATE, StandardOpenOption.APPEND); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }).map(PrintStream::new).orElse(null); } public record PathSnapshot(List contentHashes) { @@ -1256,15 +1292,6 @@ public final class TKit { } } - private static TestInstance currentTest; - private static PrintStream extraLogStream; - - private static final boolean TRACE; - private static final boolean TRACE_ASSERTS; - - static final boolean VERBOSE_JPACKAGE; - static final boolean VERBOSE_TEST_SETUP; - static String getConfigProperty(String propertyName) { return System.getProperty(getConfigPropertyName(propertyName)); } @@ -1292,38 +1319,19 @@ public final class TKit { return tokens.stream().collect(Collectors.toSet()); } - static final Path LOG_FILE = Functional.identity(() -> { - String val = getConfigProperty("logfile"); - if (val == null) { - return null; - } - return Path.of(val); - }).get(); - - static { - Set logOptions = tokenizeConfigProperty("suppress-logging"); - if (logOptions == null) { - TRACE = true; - TRACE_ASSERTS = true; - VERBOSE_JPACKAGE = true; - VERBOSE_TEST_SETUP = true; - } else if (logOptions.contains("all")) { - TRACE = false; - TRACE_ASSERTS = false; - VERBOSE_JPACKAGE = false; - VERBOSE_TEST_SETUP = false; - } else { - Predicate> isNonOf = options -> { - return Collections.disjoint(logOptions, options); - }; - - TRACE = isNonOf.test(Set.of("trace", "t")); - TRACE_ASSERTS = isNonOf.test(Set.of("assert", "a")); - VERBOSE_JPACKAGE = isNonOf.test(Set.of("jpackage", "jp")); - VERBOSE_TEST_SETUP = isNonOf.test(Set.of("init", "i")); - } + private static TestInstance currentTest() { + return state().currentTest; } + static boolean verboseJPackage() { + return state().verboseJPackage; + } + + static boolean verboseTestSetup() { + return state().verboseTestSetup; + } + + private static final class JtregSkippedExceptionClass extends ClassLoader { @SuppressWarnings("unchecked") JtregSkippedExceptionClass() { @@ -1349,4 +1357,159 @@ public final class TKit { static final Class INSTANCE = new JtregSkippedExceptionClass().clazz; } + + + public static final class State { + + private State( + Optional logFile, + TestInstance currentTest, + PrintStream mainLogStream, + PrintStream stackTraceStream, + PrintStream extraLogStream, + boolean trace, + boolean traceAsserts, + boolean verboseJPackage, + boolean verboseTestSetup) { + + Objects.requireNonNull(logFile); + Objects.requireNonNull(mainLogStream); + Objects.requireNonNull(stackTraceStream); + + this.logFile = logFile; + this.currentTest = currentTest; + this.mainLogStream = mainLogStream; + this.stackTraceStream = stackTraceStream; + this.extraLogStream = extraLogStream; + + this.trace = trace; + this.traceAsserts = traceAsserts; + + this.verboseJPackage = verboseJPackage; + this.verboseTestSetup = verboseTestSetup; + } + + + Builder buildCopy() { + return build().initFrom(this); + } + + static Builder build() { + return new Builder(); + } + + + static final class Builder { + + Builder initDefaults() { + logFile = Optional.ofNullable(getConfigProperty("logfile")).map(Path::of); + currentTest = null; + mainLogStream = System.out; + stackTraceStream = System.err; + extraLogStream = null; + + var logOptions = tokenizeConfigProperty("suppress-logging"); + if (logOptions == null) { + trace = true; + traceAsserts = true; + verboseJPackage = true; + verboseTestSetup = true; + } else if (logOptions.contains("all")) { + trace = false; + traceAsserts = false; + verboseJPackage = false; + verboseTestSetup = false; + } else { + Predicate> isNonOf = options -> { + return Collections.disjoint(logOptions, options); + }; + + trace = isNonOf.test(Set.of("trace", "t")); + traceAsserts = isNonOf.test(Set.of("assert", "a")); + verboseJPackage = isNonOf.test(Set.of("jpackage", "jp")); + verboseTestSetup = isNonOf.test(Set.of("init", "i")); + } + + return this; + } + + Builder initFrom(State state) { + logFile = state.logFile; + currentTest = state.currentTest; + mainLogStream = state.mainLogStream; + stackTraceStream = state.stackTraceStream; + extraLogStream = state.extraLogStream; + + trace = state.trace; + traceAsserts = state.traceAsserts; + + verboseJPackage = state.verboseJPackage; + verboseTestSetup = state.verboseTestSetup; + + return this; + } + + Builder logFile(Optional v) { + logFile = v; + return this; + } + + Builder currentTest(TestInstance v) { + currentTest = v; + return this; + } + + Builder mainLogStream(PrintStream v) { + mainLogStream = v; + return this; + } + + Builder stackTraceStream(PrintStream v) { + stackTraceStream = v; + return this; + } + + Builder extraLogStream(PrintStream v) { + extraLogStream = v; + return this; + } + + State create() { + return new State(logFile, currentTest, mainLogStream, stackTraceStream, extraLogStream, trace, traceAsserts, verboseJPackage, verboseTestSetup); + } + + private Optional logFile; + private TestInstance currentTest; + private PrintStream mainLogStream; + private PrintStream stackTraceStream; + private PrintStream extraLogStream; + + private boolean trace; + private boolean traceAsserts; + + private boolean verboseJPackage; + private boolean verboseTestSetup; + } + + + private final Optional logFile; + private final TestInstance currentTest; + private final PrintStream mainLogStream; + private final PrintStream stackTraceStream; + private final PrintStream extraLogStream; + + private final boolean trace; + private final boolean traceAsserts; + + private final boolean verboseJPackage; + private final boolean verboseTestSetup; + } + + + private static final InheritableThreadLocal STATE = new InheritableThreadLocal<>() { + @Override + protected State initialValue() { + return State.build().initDefaults().create(); + } + }; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java index 227c73bc68e..4009fe2f687 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestBuilder.java @@ -369,7 +369,7 @@ final class TestBuilder implements AutoCloseable { } static void trace(String msg) { - if (TKit.VERBOSE_TEST_SETUP) { + if (TKit.verboseTestSetup()) { TKit.log(msg); } } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java index 36ae81b7db4..80c8b133790 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TestMethodSupplier.java @@ -409,7 +409,7 @@ final class TestMethodSupplier { } private static void trace(String msg) { - if (TKit.VERBOSE_TEST_SETUP) { + if (TKit.verboseTestSetup()) { TKit.log(msg); } } diff --git a/test/jdk/tools/jpackage/windows/WinNoRestartTest.java b/test/jdk/tools/jpackage/windows/WinNoRestartTest.java index 7f04ee2bd2e..909ee06b01a 100644 --- a/test/jdk/tools/jpackage/windows/WinNoRestartTest.java +++ b/test/jdk/tools/jpackage/windows/WinNoRestartTest.java @@ -21,16 +21,15 @@ * questions. */ +import static jdk.jpackage.test.WindowsHelper.killAppLauncherProcess; + import java.io.IOException; import java.time.Duration; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.CfgFile; import jdk.jpackage.test.HelloApp; -import static jdk.jpackage.test.WindowsHelper.killAppLauncherProcess; +import jdk.jpackage.test.JPackageCommand; /* @test * @bug 8340311 @@ -93,18 +92,16 @@ public class WinNoRestartTest { // Save updated main launcher .cfg file cfgFile.save(cmd.appLauncherCfgPath(null)); - try ( // Launch the app in a separate thread - ExecutorService exec = Executors.newSingleThreadExecutor()) { - exec.execute(() -> { - HelloApp.executeLauncher(cmd); - }); + // Launch the app in a separate thread + new Thread(() -> { + HelloApp.executeLauncher(cmd); + }).start(); - // Wait a bit to let the app start - Thread.sleep(Duration.ofSeconds(10)); + // Wait a bit to let the app start + Thread.sleep(Duration.ofSeconds(10)); - // Find the main app launcher process and kill it - killAppLauncherProcess(cmd, null, expectedNoRestarted ? 1 : 2); - } + // Find the main app launcher process and kill it + killAppLauncherProcess(cmd, null, expectedNoRestarted ? 1 : 2); } } From 0522cf2ed99a8ba800c5112fa913221b67230571 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 21 Oct 2025 01:02:34 +0000 Subject: [PATCH 217/561] 8370123: Minor jpackage refactoring Reviewed-by: almatvee --- .../jdk/jpackage/internal/AppImageSigner.java | 4 +- .../jdk/jpackage/internal/MacFromParams.java | 4 +- .../jpackage/internal/ApplicationBuilder.java | 17 +++ .../jdk/jpackage/internal/IOUtils.java | 106 +----------------- .../internal/JLinkRuntimeBuilder.java | 51 ++++++++- .../internal/OverridableResource.java | 10 ++ .../internal/StandardBundlerParam.java | 39 +------ .../internal/model/ApplicationLaunchers.java | 4 +- .../internal/model/RuntimeBuilder.java | 9 +- .../resources/MainResources.properties | 2 - .../internal/WixAppImageFragmentBuilder.java | 8 +- .../jdk/jpackage/internal/WixPipeline.java | 2 +- .../jpackage/internal/WixSourceConverter.java | 2 +- 13 files changed, 100 insertions(+), 158 deletions(-) diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java index 571f163f682..1345597e352 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java @@ -106,7 +106,7 @@ final class AppImageSigner { throw new IllegalArgumentException(); } - app = normalizeAppImageLayout(app); + app = copyWithUnresolvedAppImageLayout(app); final var fileFilter = new SignFilter(app, appImage); @@ -243,7 +243,7 @@ final class AppImageSigner { } } - private static MacApplication normalizeAppImageLayout(MacApplication app) { + private static MacApplication copyWithUnresolvedAppImageLayout(MacApplication app) { switch (app.imageLayout()) { case MacApplicationLayout macLayout -> { return MacApplicationBuilder.overrideAppImageLayout(app, APPLICATION_LAYOUT); diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java index 7a881c846ff..e2d8750e39c 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java @@ -99,7 +99,7 @@ final class MacFromParams { // AppImageFile assumes the main launcher start up info is available when // it is constructed from Application instance. // This happens when jpackage signs predefined app image. - final var mainLauncherStartupInfo = new MainLauncherStartupInfo(PREDEFINED_APP_IMAGE_FILE.fetchFrom(params).getMainClass()); + final var mainLauncherStartupInfo = new MainLauncherStartupInfo(superAppBuilder.mainLauncherClassName().orElseThrow()); final var launchers = superAppBuilder.launchers().orElseThrow(); final var mainLauncher = ApplicationBuilder.overrideLauncherStartupInfo(launchers.mainLauncher(), mainLauncherStartupInfo); superAppBuilder.launchers(new ApplicationLaunchers(MacLauncher.create(mainLauncher), launchers.additionalLaunchers())); @@ -122,7 +122,7 @@ final class MacFromParams { final boolean appStore; if (hasPredefinedAppImage(params) && PACKAGE_TYPE.findIn(params).filter(Predicate.isEqual("app-image")).isEmpty()) { - final var appImageFileExtras = new MacAppImageFileExtras(PREDEFINED_APP_IMAGE_FILE.fetchFrom(params)); + final var appImageFileExtras = new MacAppImageFileExtras(superAppBuilder.externalApplication().orElseThrow()); sign = appImageFileExtras.signed(); appStore = appImageFileExtras.appStore(); } else { diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java index 141a1b5155f..9b5ed5b3b08 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java @@ -86,6 +86,9 @@ final class ApplicationBuilder { ApplicationBuilder initFromExternalApplication(ExternalApplication app, Function mapper) { + + externalApp = Objects.requireNonNull(app); + if (version == null) { version = app.getAppVersion(); } @@ -112,6 +115,19 @@ final class ApplicationBuilder { return Optional.ofNullable(launchers); } + Optional externalApplication() { + return Optional.ofNullable(externalApp); + } + + Optional mainLauncherClassName() { + return launchers() + .map(ApplicationLaunchers::mainLauncher) + .flatMap(Launcher::startupInfo) + .map(LauncherStartupInfo::qualifiedClassName).or(() -> { + return externalApplication().map(ExternalApplication::getMainClass); + }); + } + ApplicationBuilder appImageLayout(AppImageLayout v) { appImageLayout = v; return this; @@ -208,6 +224,7 @@ final class ApplicationBuilder { private String vendor; private String copyright; private Path srcDir; + private ExternalApplication externalApp; private List contentDirs; private AppImageLayout appImageLayout; private RuntimeBuilder runtimeBuilder; diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java index 13c7a78b502..427051719bb 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/IOUtils.java @@ -25,8 +25,6 @@ package jdk.jpackage.internal; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; @@ -45,33 +43,13 @@ final class IOUtils { public static void copyFile(Path sourceFile, Path destFile) throws IOException { - Files.createDirectories(getParent(destFile)); + Files.createDirectories(destFile.getParent()); Files.copy(sourceFile, destFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); } - public static boolean exists(Path path) { - if (path == null) { - return false; - } - - return Files.exists(path); - } - - // run "launcher paramfile" in the directory where paramfile is kept - public static void run(String launcher, Path paramFile) - throws IOException { - if (IOUtils.exists(paramFile)) { - ProcessBuilder pb = - new ProcessBuilder(launcher, - getFileName(paramFile).toString()); - pb = pb.directory(getParent(paramFile).toFile()); - exec(pb); - } - } - public static void exec(ProcessBuilder pb) throws IOException { exec(pb, false, null, false, Executor.INFINITE_TIMEOUT); @@ -83,21 +61,6 @@ final class IOUtils { exec(pb, false, null, false, timeout); } - // See JDK-8236282 - // Reading output from some processes (currently known "hdiutil attach") - // might hang even if process already exited. Only possible workaround found - // in "hdiutil attach" case is to redirect the output to a temp file and then - // read this file back. - public static void exec(ProcessBuilder pb, boolean writeOutputToFile) - throws IOException { - exec(pb, false, null, writeOutputToFile, Executor.INFINITE_TIMEOUT); - } - - static void exec(ProcessBuilder pb, boolean testForPresenceOnly, - PrintStream consumer) throws IOException { - exec(pb, testForPresenceOnly, consumer, false, Executor.INFINITE_TIMEOUT); - } - static void exec(ProcessBuilder pb, boolean testForPresenceOnly, PrintStream consumer, boolean writeOutputToFile, long timeout) throws IOException { @@ -127,51 +90,6 @@ final class IOUtils { } } - public static int getProcessOutput(List result, String... args) - throws IOException, InterruptedException { - - ProcessBuilder pb = new ProcessBuilder(args); - - final Process p = pb.start(); - - List list = new ArrayList<>(); - - final BufferedReader in = - new BufferedReader(new InputStreamReader(p.getInputStream())); - final BufferedReader err = - new BufferedReader(new InputStreamReader(p.getErrorStream())); - - Thread t = new Thread(() -> { - try { - String line; - while ((line = in.readLine()) != null) { - list.add(line); - } - } catch (IOException ioe) { - Log.verbose(ioe); - } - - try { - String line; - while ((line = err.readLine()) != null) { - Log.error(line); - } - } catch (IOException ioe) { - Log.verbose(ioe); - } - }); - t.setDaemon(true); - t.start(); - - int ret = p.waitFor(); - Log.verbose(pb.command(), list, ret, IOUtils.getPID(p)); - - result.clear(); - result.addAll(list); - - return ret; - } - static void writableOutputDir(Path outdir) throws PackagerException { if (!Files.isDirectory(outdir)) { try { @@ -188,28 +106,6 @@ final class IOUtils { } } - public static Path getParent(Path p) { - Path parent = p.getParent(); - if (parent == null) { - IllegalArgumentException iae = - new IllegalArgumentException(p.toString()); - Log.verbose(iae); - throw iae; - } - return parent; - } - - public static Path getFileName(Path p) { - Path filename = p.getFileName(); - if (filename == null) { - IllegalArgumentException iae = - new IllegalArgumentException(p.toString()); - Log.verbose(iae); - throw iae; - } - return filename; - } - public static long getPID(Process p) { try { return p.pid(); diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java index b43acffbafb..2273d385936 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkRuntimeBuilder.java @@ -23,8 +23,10 @@ * questions. */ package jdk.jpackage.internal; +import static jdk.jpackage.internal.model.RuntimeBuilder.getDefaultModulePath; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.module.Configuration; @@ -32,6 +34,7 @@ import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleFinder; import java.lang.module.ModuleReference; import java.lang.module.ResolvedModule; +import java.nio.file.Files; import java.nio.file.Path; import java.text.MessageFormat; import java.util.ArrayList; @@ -93,6 +96,52 @@ final class JLinkRuntimeBuilder implements RuntimeBuilder { options, startupInfos)); } + /** + * Returns a list of paths that includes the location where the "java.base" + * module can be found. + *

        + * Returns the specified path list if "java.base" module can be found in one of + * the paths from the specified path list. + *

        + * Returns a new path list created from the specified path list with the path of + * "java.base" module in the current runtime appended otherwise. + * + * @param modulePath the path list where to look up for "java.base" module + * @return the path list that includes location of "java.base" module + */ + static List ensureBaseModuleInModulePath(List modulePath) { + if (modulePath.stream().anyMatch(path -> { + return Files.isRegularFile(path.resolve("java.base.jmod")); + })) { + return modulePath; + } else { + // There is no "java.base.jmod" file in the `modulePath` path list. + // Pick items from the default module path list that are not yet + // in the `modulePath` path list and append them to it. + + var missingDefaultModulePath = getDefaultModulePath(); + + if (!modulePath.isEmpty()) { + missingDefaultModulePath.stream().filter(defaultPath -> { + return modulePath.stream().anyMatch(path -> { + try { + return Files.isSameFile(path, defaultPath); + } catch (IOException ex) { + // Assume `defaultPath` path doesn't exist in `modulePath` list. + return false; + } + }); + }).toList(); + } + + if (missingDefaultModulePath.isEmpty()) { + return modulePath; + } else { + return Stream.of(modulePath, missingDefaultModulePath).flatMap(Collection::stream).toList(); + } + } + } + private static List createJLinkCmdline(List modulePath, Set addModules, Set limitModules, List options, List startupInfos) throws ConfigException { List launcherModules = startupInfos.stream().map(si -> { @@ -230,5 +279,5 @@ final class JLinkRuntimeBuilder implements RuntimeBuilder { static final ToolProvider JLINK_TOOL = ToolProvider.findFirst( "jlink").orElseThrow(); - }; + } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/OverridableResource.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/OverridableResource.java index 0099491fc73..73fc36d78ac 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/OverridableResource.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/OverridableResource.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -180,6 +181,15 @@ final class OverridableResource { return setExternal(toPath(v)); } + Source probe() { + try { + return saveToStream(null); + } catch (IOException ex) { + // Should never happen. + throw new UncheckedIOException(ex); + } + } + Source saveToStream(OutputStream dest) throws IOException { if (dest == null) { return sendToConsumer(null); diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java index 6b89bb3ee65..2b35a6830f8 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java @@ -43,7 +43,6 @@ import java.util.stream.Stream; import jdk.jpackage.internal.model.ConfigException; import jdk.jpackage.internal.model.ExternalApplication; import static jdk.jpackage.internal.ApplicationLayoutUtils.PLATFORM_APPLICATION_LAYOUT; -import static jdk.jpackage.internal.model.RuntimeBuilder.getDefaultModulePath; /** * Standard bundler parameters. @@ -56,7 +55,6 @@ import static jdk.jpackage.internal.model.RuntimeBuilder.getDefaultModulePath; */ final class StandardBundlerParam { - private static final String JAVABASEJMOD = "java.base.jmod"; private static final String DEFAULT_VERSION = "1.0"; private static final String DEFAULT_RELEASE = "1"; private static final String[] DEFAULT_JLINK_OPTIONS = { @@ -415,47 +413,14 @@ final class StandardBundlerParam { new BundlerParamInfo<>( Arguments.CLIOptions.MODULE_PATH.getId(), (Class>) (Object)List.class, - p -> getDefaultModulePath(), + p -> JLinkRuntimeBuilder.ensureBaseModuleInModulePath(List.of()), (s, p) -> { List modulePath = Stream.of(s.split(File.pathSeparator)) .map(Path::of) .toList(); - Path javaBasePath = findPathOfModule(modulePath, JAVABASEJMOD); - - // Add the default JDK module path to the module path. - if (javaBasePath == null) { - List jdkModulePath = getDefaultModulePath(); - - if (jdkModulePath != null) { - modulePath = Stream.concat(modulePath.stream(), - jdkModulePath.stream()).toList(); - javaBasePath = findPathOfModule(modulePath, JAVABASEJMOD); - } - } - - if (javaBasePath == null || - !Files.exists(javaBasePath)) { - Log.error(String.format(I18N.getString( - "warning.no.jdk.modules.found"))); - } - - return modulePath; + return JLinkRuntimeBuilder.ensureBaseModuleInModulePath(modulePath); }); - // Returns the path to the JDK modules in the user defined module path. - private static Path findPathOfModule( List modulePath, String moduleName) { - - for (Path path : modulePath) { - Path moduleNamePath = path.resolve(moduleName); - - if (Files.exists(moduleNamePath)) { - return path; - } - } - - return null; - } - static final BundlerParamInfo MODULE = new BundlerParamInfo<>( Arguments.CLIOptions.MODULE.getId(), diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ApplicationLaunchers.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ApplicationLaunchers.java index af52696a546..ce2925d75e4 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ApplicationLaunchers.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ApplicationLaunchers.java @@ -57,12 +57,12 @@ public record ApplicationLaunchers(Launcher mainLauncher, List additio }).orElseGet(List::of); } - public static Optional fromList(List launchers) { + public static Optional fromList(List launchers) { if (launchers == null || launchers.isEmpty()) { return Optional.empty(); } else { return Optional.of(new ApplicationLaunchers(launchers.getFirst(), - launchers.subList(1, launchers.size()))); + List.copyOf(launchers.subList(1, launchers.size())))); } } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/RuntimeBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/RuntimeBuilder.java index c989bcc8915..a0f5f077c70 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/RuntimeBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/RuntimeBuilder.java @@ -24,6 +24,7 @@ */ package jdk.jpackage.internal.model; +import java.lang.module.ModuleFinder; import java.nio.file.Path; import java.util.List; @@ -46,7 +47,13 @@ public interface RuntimeBuilder { void create(AppImageLayout appImageLayout) throws PackagerException; /** - * Gets the default set of paths where to find Java modules. + * Gets the default set of paths where jlink should look up for system Java + * modules. + * + *

        + * These paths are for {@code jlink} command. Using them with + * {@link ModuleFinder#of(Path...)} may not work as expected: attempt to find + * "java.base" module in these paths will fail. * * @return the default set of paths where to find Java modules */ diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties index 3aa0c69dbd5..2a81b1c102c 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties @@ -78,8 +78,6 @@ error.blocked.option=jlink option [{0}] is not permitted in --jlink-options error.no.name=Name not specified with --name and cannot infer one from app-image error.no.name.advice=Specify name with --name -warning.no.jdk.modules.found=Warning: No JDK Modules found - error.foreign-app-image=Error: Missing .jpackage.xml file in app-image dir "{0}" error.invalid-app-image=Error: app-image dir "{0}" generated by another jpackage version or malformed "{1}" file diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java index 63be18a5ee8..0dff5c26ae2 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixAppImageFragmentBuilder.java @@ -248,7 +248,7 @@ final class WixAppImageFragmentBuilder extends WixFragmentBuilder { String of(Path path) { if (this == Folder && KNOWN_DIRS.contains(path)) { - return IOUtils.getFileName(path).toString(); + return path.getFileName().toString(); } String result = of(path, prefix, name()); @@ -525,7 +525,7 @@ final class WixAppImageFragmentBuilder extends WixFragmentBuilder { } String launcherBasename = PathUtils.replaceSuffix( - IOUtils.getFileName(launcherPath), "").toString(); + launcherPath.getFileName(), "").toString(); Path shortcutPath = folder.getPath(this).resolve(launcherBasename); return addComponent(xml, shortcutPath, Component.Shortcut, unused -> { @@ -712,7 +712,7 @@ final class WixAppImageFragmentBuilder extends WixFragmentBuilder { xml.writeAttribute("Id", Id.Folder.of(dir.getParent())); xml.writeStartElement("Directory"); xml.writeAttribute("Id", Id.Folder.of(dir)); - xml.writeAttribute("Name", IOUtils.getFileName(dir).toString()); + xml.writeAttribute("Name", dir.getFileName().toString()); xml.writeEndElement(); xml.writeEndElement(); } @@ -818,7 +818,7 @@ final class WixAppImageFragmentBuilder extends WixFragmentBuilder { appImagePathGroup.transform(installedAppImagePathGroup, new PathGroup.TransformHandler() { @Override public void copyFile(Path src, Path dst) throws IOException { - if (IOUtils.getFileName(src).toString().endsWith(".ico")) { + if (src.getFileName().toString().endsWith(".ico")) { icoFiles.add(Map.entry(src, dst)); } } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java index be15b202877..40160192862 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixPipeline.java @@ -241,7 +241,7 @@ final class WixPipeline { lightCmdline.addAll(lightOptions); wixObjs.stream().map(Path::toString).forEach(lightCmdline::add); - Files.createDirectories(IOUtils.getParent(msi)); + Files.createDirectories(msi.getParent()); execute(lightCmdline); } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java index 8f98df060ac..b1ad973b9ed 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixSourceConverter.java @@ -145,7 +145,7 @@ final class WixSourceConverter { newProxyInstance(XMLStreamWriter.class.getClassLoader(), new Class[]{XMLStreamWriter.class}, new NamespaceCleaner(nc. getPrefixToUri(), outputFactory.createXMLStreamWriter(outXml))))); - Files.createDirectories(IOUtils.getParent(resourceSaveAsFile)); + Files.createDirectories(resourceSaveAsFile.getParent()); Files.copy(new ByteArrayInputStream(outXml.toByteArray()), resourceSaveAsFile, StandardCopyOption.REPLACE_EXISTING); } catch (TransformerException | XMLStreamException ex) { From 2de8d58552936e5b02b851003ec000373c32a918 Mon Sep 17 00:00:00 2001 From: erifan Date: Tue, 21 Oct 2025 01:20:38 +0000 Subject: [PATCH 218/561] 8366333: AArch64: Enhance SVE subword type implementation of vector compress Co-authored-by: Jatin Bhateja Reviewed-by: jbhateja, xgong, galder, vlivanov --- src/hotspot/cpu/aarch64/aarch64_vector.ad | 20 +- src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 | 20 +- src/hotspot/cpu/aarch64/assembler_aarch64.hpp | 1 + .../cpu/aarch64/c2_MacroAssembler_aarch64.cpp | 145 ++++++----- .../cpu/aarch64/c2_MacroAssembler_aarch64.hpp | 9 +- test/hotspot/gtest/aarch64/aarch64-asmtest.py | 4 + test/hotspot/gtest/aarch64/asmtest.out.h | 47 ++-- .../compiler/lib/ir_framework/IRNode.java | 30 +++ .../ir_framework/test/IREncodingPrinter.java | 1 + .../vectorapi/VectorCompressTest.java | 246 ++++++++++++++++++ 10 files changed, 408 insertions(+), 115 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/vectorapi/VectorCompressTest.java diff --git a/src/hotspot/cpu/aarch64/aarch64_vector.ad b/src/hotspot/cpu/aarch64/aarch64_vector.ad index ef35b66003d..3379041b2cc 100644 --- a/src/hotspot/cpu/aarch64/aarch64_vector.ad +++ b/src/hotspot/cpu/aarch64/aarch64_vector.ad @@ -7081,29 +7081,31 @@ instruct vcompress(vReg dst, vReg src, pRegGov pg) %{ %} instruct vcompressB(vReg dst, vReg src, pReg pg, vReg tmp1, vReg tmp2, - vReg tmp3, vReg tmp4, pReg ptmp, pRegGov pgtmp) %{ + vReg tmp3, pReg ptmp, pRegGov pgtmp) %{ predicate(UseSVE > 0 && Matcher::vector_element_basic_type(n) == T_BYTE); - effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ptmp, TEMP pgtmp); + effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP ptmp, TEMP pgtmp); match(Set dst (CompressV src pg)); - format %{ "vcompressB $dst, $src, $pg\t# KILL $tmp1, $tmp2, $tmp3, tmp4, $ptmp, $pgtmp" %} + format %{ "vcompressB $dst, $src, $pg\t# KILL $tmp1, $tmp2, $tmp3, $ptmp, $pgtmp" %} ins_encode %{ + uint length_in_bytes = Matcher::vector_length_in_bytes(this); __ sve_compress_byte($dst$$FloatRegister, $src$$FloatRegister, $pg$$PRegister, - $tmp1$$FloatRegister,$tmp2$$FloatRegister, - $tmp3$$FloatRegister,$tmp4$$FloatRegister, - $ptmp$$PRegister, $pgtmp$$PRegister); + $tmp1$$FloatRegister, $tmp2$$FloatRegister, $tmp3$$FloatRegister, + $ptmp$$PRegister, $pgtmp$$PRegister, length_in_bytes); %} ins_pipe(pipe_slow); %} -instruct vcompressS(vReg dst, vReg src, pReg pg, - vReg tmp1, vReg tmp2, pRegGov pgtmp) %{ +instruct vcompressS(vReg dst, vReg src, pReg pg, vReg tmp1, vReg tmp2, pRegGov pgtmp) %{ predicate(UseSVE > 0 && Matcher::vector_element_basic_type(n) == T_SHORT); effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP pgtmp); match(Set dst (CompressV src pg)); format %{ "vcompressS $dst, $src, $pg\t# KILL $tmp1, $tmp2, $pgtmp" %} ins_encode %{ + uint length_in_bytes = Matcher::vector_length_in_bytes(this); + __ sve_dup($tmp1$$FloatRegister, __ H, 0); __ sve_compress_short($dst$$FloatRegister, $src$$FloatRegister, $pg$$PRegister, - $tmp1$$FloatRegister,$tmp2$$FloatRegister, $pgtmp$$PRegister); + $tmp1$$FloatRegister, $tmp2$$FloatRegister, $pgtmp$$PRegister, + length_in_bytes); %} ins_pipe(pipe_slow); %} diff --git a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 index 012de7e46d8..6d296cbdb3a 100644 --- a/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 +++ b/src/hotspot/cpu/aarch64/aarch64_vector_ad.m4 @@ -5069,29 +5069,31 @@ instruct vcompress(vReg dst, vReg src, pRegGov pg) %{ %} instruct vcompressB(vReg dst, vReg src, pReg pg, vReg tmp1, vReg tmp2, - vReg tmp3, vReg tmp4, pReg ptmp, pRegGov pgtmp) %{ + vReg tmp3, pReg ptmp, pRegGov pgtmp) %{ predicate(UseSVE > 0 && Matcher::vector_element_basic_type(n) == T_BYTE); - effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ptmp, TEMP pgtmp); + effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP ptmp, TEMP pgtmp); match(Set dst (CompressV src pg)); - format %{ "vcompressB $dst, $src, $pg\t# KILL $tmp1, $tmp2, $tmp3, tmp4, $ptmp, $pgtmp" %} + format %{ "vcompressB $dst, $src, $pg\t# KILL $tmp1, $tmp2, $tmp3, $ptmp, $pgtmp" %} ins_encode %{ + uint length_in_bytes = Matcher::vector_length_in_bytes(this); __ sve_compress_byte($dst$$FloatRegister, $src$$FloatRegister, $pg$$PRegister, - $tmp1$$FloatRegister,$tmp2$$FloatRegister, - $tmp3$$FloatRegister,$tmp4$$FloatRegister, - $ptmp$$PRegister, $pgtmp$$PRegister); + $tmp1$$FloatRegister, $tmp2$$FloatRegister, $tmp3$$FloatRegister, + $ptmp$$PRegister, $pgtmp$$PRegister, length_in_bytes); %} ins_pipe(pipe_slow); %} -instruct vcompressS(vReg dst, vReg src, pReg pg, - vReg tmp1, vReg tmp2, pRegGov pgtmp) %{ +instruct vcompressS(vReg dst, vReg src, pReg pg, vReg tmp1, vReg tmp2, pRegGov pgtmp) %{ predicate(UseSVE > 0 && Matcher::vector_element_basic_type(n) == T_SHORT); effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, TEMP pgtmp); match(Set dst (CompressV src pg)); format %{ "vcompressS $dst, $src, $pg\t# KILL $tmp1, $tmp2, $pgtmp" %} ins_encode %{ + uint length_in_bytes = Matcher::vector_length_in_bytes(this); + __ sve_dup($tmp1$$FloatRegister, __ H, 0); __ sve_compress_short($dst$$FloatRegister, $src$$FloatRegister, $pg$$PRegister, - $tmp1$$FloatRegister,$tmp2$$FloatRegister, $pgtmp$$PRegister); + $tmp1$$FloatRegister, $tmp2$$FloatRegister, $pgtmp$$PRegister, + length_in_bytes); %} ins_pipe(pipe_slow); %} diff --git a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp index 4c4251fbe9f..a8f378e524f 100644 --- a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp @@ -3486,6 +3486,7 @@ public: INSN(sve_smaxv, 0b00000100, 0b001000001); // signed maximum reduction to scalar INSN(sve_smin, 0b00000100, 0b001010000); // signed minimum vectors INSN(sve_sminv, 0b00000100, 0b001010001); // signed minimum reduction to scalar + INSN(sve_splice,0b00000101, 0b101100100); // splice two vectors under predicate control, destructive INSN(sve_sub, 0b00000100, 0b000001000); // vector sub INSN(sve_uaddv, 0b00000100, 0b000001001); // unsigned add reduction to scalar INSN(sve_umax, 0b00000100, 0b001001000); // unsigned maximum vectors diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp index b61a0e4e378..328ef0c53e6 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp @@ -2203,114 +2203,117 @@ void C2_MacroAssembler::sve_gen_mask_imm(PRegister dst, BasicType bt, uint32_t l // Pack active elements of src, under the control of mask, into the lowest-numbered elements of dst. // Any remaining elements of dst will be filled with zero. // Clobbers: rscratch1 -// Preserves: src, mask +// Preserves: mask, vzr void C2_MacroAssembler::sve_compress_short(FloatRegister dst, FloatRegister src, PRegister mask, - FloatRegister vtmp1, FloatRegister vtmp2, - PRegister pgtmp) { + FloatRegister vzr, FloatRegister vtmp, + PRegister pgtmp, unsigned vector_length_in_bytes) { assert(pgtmp->is_governing(), "This register has to be a governing predicate register"); - assert_different_registers(dst, src, vtmp1, vtmp2); + // When called by sve_compress_byte, src and vtmp may be the same register. + assert_different_registers(dst, src, vzr); + assert_different_registers(dst, vtmp, vzr); assert_different_registers(mask, pgtmp); - - // Example input: src = 8888 7777 6666 5555 4444 3333 2222 1111 - // mask = 0001 0000 0000 0001 0001 0000 0001 0001 - // Expected result: dst = 0000 0000 0000 8888 5555 4444 2222 1111 - sve_dup(vtmp2, H, 0); + // high <-- low + // Example input: src = hh gg ff ee dd cc bb aa, one character is 8 bits. + // mask = 01 00 00 01 01 00 01 01, one character is 1 bit. + // Expected result: dst = 00 00 00 hh ee dd bb aa // Extend lowest half to type INT. - // dst = 00004444 00003333 00002222 00001111 + // dst = 00dd 00cc 00bb 00aa sve_uunpklo(dst, S, src); - // pgtmp = 00000001 00000000 00000001 00000001 + // pgtmp = 0001 0000 0001 0001 sve_punpklo(pgtmp, mask); // Pack the active elements in size of type INT to the right, // and fill the remainings with zero. - // dst = 00000000 00004444 00002222 00001111 + // dst = 0000 00dd 00bb 00aa sve_compact(dst, S, dst, pgtmp); // Narrow the result back to type SHORT. - // dst = 0000 0000 0000 0000 0000 4444 2222 1111 - sve_uzp1(dst, H, dst, vtmp2); + // dst = 00 00 00 00 00 dd bb aa + sve_uzp1(dst, H, dst, vzr); + + // Return if the vector length is no more than MaxVectorSize/2, since the + // highest half is invalid. + if (vector_length_in_bytes <= (MaxVectorSize >> 1)) { + return; + } + // Count the active elements of lowest half. // rscratch1 = 3 sve_cntp(rscratch1, S, ptrue, pgtmp); // Repeat to the highest half. - // pgtmp = 00000001 00000000 00000000 00000001 + // pgtmp = 0001 0000 0000 0001 sve_punpkhi(pgtmp, mask); - // vtmp1 = 00008888 00007777 00006666 00005555 - sve_uunpkhi(vtmp1, S, src); - // vtmp1 = 00000000 00000000 00008888 00005555 - sve_compact(vtmp1, S, vtmp1, pgtmp); - // vtmp1 = 0000 0000 0000 0000 0000 0000 8888 5555 - sve_uzp1(vtmp1, H, vtmp1, vtmp2); + // vtmp = 00hh 00gg 00ff 00ee + sve_uunpkhi(vtmp, S, src); + // vtmp = 0000 0000 00hh 00ee + sve_compact(vtmp, S, vtmp, pgtmp); + // vtmp = 00 00 00 00 00 00 hh ee + sve_uzp1(vtmp, H, vtmp, vzr); - // Compressed low: dst = 0000 0000 0000 0000 0000 4444 2222 1111 - // Compressed high: vtmp1 = 0000 0000 0000 0000 0000 0000 8888 5555 - // Left shift(cross lane) compressed high with TRUE_CNT lanes, - // TRUE_CNT is the number of active elements in the compressed low. - neg(rscratch1, rscratch1); - // vtmp2 = {4 3 2 1 0 -1 -2 -3} - sve_index(vtmp2, H, rscratch1, 1); - // vtmp1 = 0000 0000 0000 8888 5555 0000 0000 0000 - sve_tbl(vtmp1, H, vtmp1, vtmp2); - - // Combine the compressed high(after shifted) with the compressed low. - // dst = 0000 0000 0000 8888 5555 4444 2222 1111 - sve_orr(dst, dst, vtmp1); + // pgtmp = 00 00 00 00 00 01 01 01 + sve_whilelt(pgtmp, H, zr, rscratch1); + // Compressed low: dst = 00 00 00 00 00 dd bb aa + // Compressed high: vtmp = 00 00 00 00 00 00 hh ee + // Combine the compressed low with the compressed high: + // dst = 00 00 00 hh ee dd bb aa + sve_splice(dst, H, pgtmp, vtmp); } // Clobbers: rscratch1, rscratch2 // Preserves: src, mask void C2_MacroAssembler::sve_compress_byte(FloatRegister dst, FloatRegister src, PRegister mask, - FloatRegister vtmp1, FloatRegister vtmp2, - FloatRegister vtmp3, FloatRegister vtmp4, - PRegister ptmp, PRegister pgtmp) { + FloatRegister vtmp1, FloatRegister vtmp2, FloatRegister vtmp3, + PRegister ptmp, PRegister pgtmp, unsigned vector_length_in_bytes) { assert(pgtmp->is_governing(), "This register has to be a governing predicate register"); - assert_different_registers(dst, src, vtmp1, vtmp2, vtmp3, vtmp4); + assert_different_registers(dst, src, vtmp1, vtmp2, vtmp3); assert_different_registers(mask, ptmp, pgtmp); - // Example input: src = 88 77 66 55 44 33 22 11 - // mask = 01 00 00 01 01 00 01 01 - // Expected result: dst = 00 00 00 88 55 44 22 11 + // high <-- low + // Example input: src = q p n m l k j i h g f e d c b a, one character is 8 bits. + // mask = 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1, one character is 1 bit. + // Expected result: dst = 0 0 0 0 0 0 0 0 0 0 0 p i g c a + FloatRegister vzr = vtmp3; + sve_dup(vzr, B, 0); - sve_dup(vtmp4, B, 0); // Extend lowest half to type SHORT. - // vtmp1 = 0044 0033 0022 0011 + // vtmp1 = 0h 0g 0f 0e 0d 0c 0b 0a sve_uunpklo(vtmp1, H, src); - // ptmp = 0001 0000 0001 0001 + // ptmp = 00 01 00 00 00 01 00 01 sve_punpklo(ptmp, mask); + // Pack the active elements in size of type SHORT to the right, + // and fill the remainings with zero. + // dst = 00 00 00 00 00 0g 0c 0a + unsigned extended_size = vector_length_in_bytes << 1; + sve_compress_short(dst, vtmp1, ptmp, vzr, vtmp2, pgtmp, extended_size > MaxVectorSize ? MaxVectorSize : extended_size); + // Narrow the result back to type BYTE. + // dst = 0 0 0 0 0 0 0 0 0 0 0 0 0 g c a + sve_uzp1(dst, B, dst, vzr); + + // Return if the vector length is no more than MaxVectorSize/2, since the + // highest half is invalid. + if (vector_length_in_bytes <= (MaxVectorSize >> 1)) { + return; + } // Count the active elements of lowest half. // rscratch2 = 3 sve_cntp(rscratch2, H, ptrue, ptmp); - // Pack the active elements in size of type SHORT to the right, - // and fill the remainings with zero. - // dst = 0000 0044 0022 0011 - sve_compress_short(dst, vtmp1, ptmp, vtmp2, vtmp3, pgtmp); - // Narrow the result back to type BYTE. - // dst = 00 00 00 00 00 44 22 11 - sve_uzp1(dst, B, dst, vtmp4); // Repeat to the highest half. - // ptmp = 0001 0000 0000 0001 + // ptmp = 00 01 00 00 00 00 00 01 sve_punpkhi(ptmp, mask); - // vtmp1 = 0088 0077 0066 0055 + // vtmp2 = 0q 0p 0n 0m 0l 0k 0j 0i sve_uunpkhi(vtmp2, H, src); - // vtmp1 = 0000 0000 0088 0055 - sve_compress_short(vtmp1, vtmp2, ptmp, vtmp3, vtmp4, pgtmp); + // vtmp1 = 00 00 00 00 00 00 0p 0i + sve_compress_short(vtmp1, vtmp2, ptmp, vzr, vtmp2, pgtmp, extended_size - MaxVectorSize); + // vtmp1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 p i + sve_uzp1(vtmp1, B, vtmp1, vzr); - sve_dup(vtmp4, B, 0); - // vtmp1 = 00 00 00 00 00 00 88 55 - sve_uzp1(vtmp1, B, vtmp1, vtmp4); - - // Compressed low: dst = 00 00 00 00 00 44 22 11 - // Compressed high: vtmp1 = 00 00 00 00 00 00 88 55 - // Left shift(cross lane) compressed high with TRUE_CNT lanes, - // TRUE_CNT is the number of active elements in the compressed low. - neg(rscratch2, rscratch2); - // vtmp2 = {4 3 2 1 0 -1 -2 -3} - sve_index(vtmp2, B, rscratch2, 1); - // vtmp1 = 00 00 00 88 55 00 00 00 - sve_tbl(vtmp1, B, vtmp1, vtmp2); - // Combine the compressed high(after shifted) with the compressed low. - // dst = 00 00 00 88 55 44 22 11 - sve_orr(dst, dst, vtmp1); + // ptmp = 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 + sve_whilelt(ptmp, B, zr, rscratch2); + // Compressed low: dst = 0 0 0 0 0 0 0 0 0 0 0 0 0 g c a + // Compressed high: vtmp1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 p i + // Combine the compressed low with the compressed high: + // dst = 0 0 0 0 0 0 0 0 0 0 0 p i g c a + sve_splice(dst, B, ptmp, vtmp1); } void C2_MacroAssembler::neon_reverse_bits(FloatRegister dst, FloatRegister src, BasicType bt, bool isQ) { diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp index cb8ded142f4..09850a60c64 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp @@ -173,13 +173,12 @@ // lowest-numbered elements of dst. Any remaining elements of dst will // be filled with zero. void sve_compress_byte(FloatRegister dst, FloatRegister src, PRegister mask, - FloatRegister vtmp1, FloatRegister vtmp2, - FloatRegister vtmp3, FloatRegister vtmp4, - PRegister ptmp, PRegister pgtmp); + FloatRegister vtmp1, FloatRegister vtmp2, FloatRegister vtmp3, + PRegister ptmp, PRegister pgtmp, unsigned vector_length_in_bytes); void sve_compress_short(FloatRegister dst, FloatRegister src, PRegister mask, - FloatRegister vtmp1, FloatRegister vtmp2, - PRegister pgtmp); + FloatRegister vzr, FloatRegister vtmp, + PRegister pgtmp, unsigned vector_length_in_bytes); void neon_reverse_bits(FloatRegister dst, FloatRegister src, BasicType bt, bool isQ); diff --git a/test/hotspot/gtest/aarch64/aarch64-asmtest.py b/test/hotspot/gtest/aarch64/aarch64-asmtest.py index bf4f2111999..48b19acaa05 100644 --- a/test/hotspot/gtest/aarch64/aarch64-asmtest.py +++ b/test/hotspot/gtest/aarch64/aarch64-asmtest.py @@ -2143,6 +2143,10 @@ generate(SpecialCases, [["ccmn", "__ ccmn(zr, zr, 3u, Assembler::LE);", ["facge", "__ sve_fac(Assembler::GE, p1, __ H, p2, z4, z5);", "facge\tp1.h, p2/z, z4.h, z5.h"], ["facge", "__ sve_fac(Assembler::GE, p1, __ S, p2, z4, z5);", "facge\tp1.s, p2/z, z4.s, z5.s"], ["facge", "__ sve_fac(Assembler::GE, p1, __ D, p2, z4, z5);", "facge\tp1.d, p2/z, z4.d, z5.d"], + ["splice", "__ sve_splice(z0, __ B, p0, z1);", "splice\tz0.b, p0, z0.b, z1.b"], + ["splice", "__ sve_splice(z0, __ H, p0, z1);", "splice\tz0.h, p0, z0.h, z1.h"], + ["splice", "__ sve_splice(z0, __ S, p0, z1);", "splice\tz0.s, p0, z0.s, z1.s"], + ["splice", "__ sve_splice(z0, __ D, p0, z1);", "splice\tz0.d, p0, z0.d, z1.d"], # SVE2 instructions ["histcnt", "__ sve_histcnt(z16, __ S, p0, z16, z16);", "histcnt\tz16.s, p0/z, z16.s, z16.s"], ["histcnt", "__ sve_histcnt(z17, __ D, p0, z17, z17);", "histcnt\tz17.d, p0/z, z17.d, z17.d"], diff --git a/test/hotspot/gtest/aarch64/asmtest.out.h b/test/hotspot/gtest/aarch64/asmtest.out.h index 352ea33750e..34a5f8ca68e 100644 --- a/test/hotspot/gtest/aarch64/asmtest.out.h +++ b/test/hotspot/gtest/aarch64/asmtest.out.h @@ -1156,6 +1156,10 @@ __ sve_fac(Assembler::GE, p1, __ H, p2, z4, z5); // facge p1.h, p2/z, z4.h, z5.h __ sve_fac(Assembler::GE, p1, __ S, p2, z4, z5); // facge p1.s, p2/z, z4.s, z5.s __ sve_fac(Assembler::GE, p1, __ D, p2, z4, z5); // facge p1.d, p2/z, z4.d, z5.d + __ sve_splice(z0, __ B, p0, z1); // splice z0.b, p0, z0.b, z1.b + __ sve_splice(z0, __ H, p0, z1); // splice z0.h, p0, z0.h, z1.h + __ sve_splice(z0, __ S, p0, z1); // splice z0.s, p0, z0.s, z1.s + __ sve_splice(z0, __ D, p0, z1); // splice z0.d, p0, z0.d, z1.d __ sve_histcnt(z16, __ S, p0, z16, z16); // histcnt z16.s, p0/z, z16.s, z16.s __ sve_histcnt(z17, __ D, p0, z17, z17); // histcnt z17.d, p0/z, z17.d, z17.d @@ -1445,30 +1449,30 @@ 0x9101a1a0, 0xb10a5cc8, 0xd10810aa, 0xf10fd061, 0x120cb166, 0x321764bc, 0x52174681, 0x720c0227, 0x9241018e, 0xb25a2969, 0xd278b411, 0xf26aad01, - 0x14000000, 0x17ffffd7, 0x140004b7, 0x94000000, - 0x97ffffd4, 0x940004b4, 0x3400000a, 0x34fffa2a, - 0x3400962a, 0x35000008, 0x35fff9c8, 0x350095c8, - 0xb400000b, 0xb4fff96b, 0xb400956b, 0xb500001d, - 0xb5fff91d, 0xb500951d, 0x10000013, 0x10fff8b3, - 0x100094b3, 0x90000013, 0x36300016, 0x3637f836, - 0x36309436, 0x3758000c, 0x375ff7cc, 0x375893cc, + 0x14000000, 0x17ffffd7, 0x140004bb, 0x94000000, + 0x97ffffd4, 0x940004b8, 0x3400000a, 0x34fffa2a, + 0x340096aa, 0x35000008, 0x35fff9c8, 0x35009648, + 0xb400000b, 0xb4fff96b, 0xb40095eb, 0xb500001d, + 0xb5fff91d, 0xb500959d, 0x10000013, 0x10fff8b3, + 0x10009533, 0x90000013, 0x36300016, 0x3637f836, + 0x363094b6, 0x3758000c, 0x375ff7cc, 0x3758944c, 0x128313a0, 0x528a32c7, 0x7289173b, 0x92ab3acc, 0xd2a0bf94, 0xf2c285e8, 0x9358722f, 0x330e652f, 0x53067f3b, 0x93577c53, 0xb34a1aac, 0xd35a4016, 0x13946c63, 0x93c3dbc8, 0x54000000, 0x54fff5a0, - 0x540091a0, 0x54000001, 0x54fff541, 0x54009141, - 0x54000002, 0x54fff4e2, 0x540090e2, 0x54000002, - 0x54fff482, 0x54009082, 0x54000003, 0x54fff423, - 0x54009023, 0x54000003, 0x54fff3c3, 0x54008fc3, - 0x54000004, 0x54fff364, 0x54008f64, 0x54000005, - 0x54fff305, 0x54008f05, 0x54000006, 0x54fff2a6, - 0x54008ea6, 0x54000007, 0x54fff247, 0x54008e47, - 0x54000008, 0x54fff1e8, 0x54008de8, 0x54000009, - 0x54fff189, 0x54008d89, 0x5400000a, 0x54fff12a, - 0x54008d2a, 0x5400000b, 0x54fff0cb, 0x54008ccb, - 0x5400000c, 0x54fff06c, 0x54008c6c, 0x5400000d, - 0x54fff00d, 0x54008c0d, 0x5400000e, 0x54ffefae, - 0x54008bae, 0x5400000f, 0x54ffef4f, 0x54008b4f, + 0x54009220, 0x54000001, 0x54fff541, 0x540091c1, + 0x54000002, 0x54fff4e2, 0x54009162, 0x54000002, + 0x54fff482, 0x54009102, 0x54000003, 0x54fff423, + 0x540090a3, 0x54000003, 0x54fff3c3, 0x54009043, + 0x54000004, 0x54fff364, 0x54008fe4, 0x54000005, + 0x54fff305, 0x54008f85, 0x54000006, 0x54fff2a6, + 0x54008f26, 0x54000007, 0x54fff247, 0x54008ec7, + 0x54000008, 0x54fff1e8, 0x54008e68, 0x54000009, + 0x54fff189, 0x54008e09, 0x5400000a, 0x54fff12a, + 0x54008daa, 0x5400000b, 0x54fff0cb, 0x54008d4b, + 0x5400000c, 0x54fff06c, 0x54008cec, 0x5400000d, + 0x54fff00d, 0x54008c8d, 0x5400000e, 0x54ffefae, + 0x54008c2e, 0x5400000f, 0x54ffef4f, 0x54008bcf, 0xd40658e1, 0xd4014d22, 0xd4046543, 0xd4273f60, 0xd44cad80, 0xd503201f, 0xd503203f, 0xd503205f, 0xd503209f, 0xd50320bf, 0xd503219f, 0xd50323bf, @@ -1689,7 +1693,8 @@ 0x05a14c00, 0x05e14c00, 0x05304001, 0x05314001, 0x05a18610, 0x05e18610, 0x0420bc31, 0x05271e11, 0x6545e891, 0x6585e891, 0x65c5e891, 0x6545c891, - 0x6585c891, 0x65c5c891, 0x45b0c210, 0x45f1c231, + 0x6585c891, 0x65c5c891, 0x052c8020, 0x056c8020, + 0x05ac8020, 0x05ec8020, 0x45b0c210, 0x45f1c231, 0x1e601000, 0x1e603000, 0x1e621000, 0x1e623000, 0x1e641000, 0x1e643000, 0x1e661000, 0x1e663000, 0x1e681000, 0x1e683000, 0x1e6a1000, 0x1e6a3000, diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java index 99a289476ec..f0f7aaf3836 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/IRNode.java @@ -2840,6 +2840,36 @@ public class IRNode { vectorNode(EXPAND_BITS_VL, "ExpandBitsV", TYPE_LONG); } + public static final String COMPRESS_VB = VECTOR_PREFIX + "COMPRESS_VB" + POSTFIX; + static { + vectorNode(COMPRESS_VB, "CompressV", TYPE_BYTE); + } + + public static final String COMPRESS_VS = VECTOR_PREFIX + "COMPRESS_VS" + POSTFIX; + static { + vectorNode(COMPRESS_VS, "CompressV", TYPE_SHORT); + } + + public static final String COMPRESS_VI = VECTOR_PREFIX + "COMPRESS_VI" + POSTFIX; + static { + vectorNode(COMPRESS_VI, "CompressV", TYPE_INT); + } + + public static final String COMPRESS_VL = VECTOR_PREFIX + "COMPRESS_VL" + POSTFIX; + static { + vectorNode(COMPRESS_VL, "CompressV", TYPE_LONG); + } + + public static final String COMPRESS_VF = VECTOR_PREFIX + "COMPRESS_VF" + POSTFIX; + static { + vectorNode(COMPRESS_VF, "CompressV", TYPE_FLOAT); + } + + public static final String COMPRESS_VD = VECTOR_PREFIX + "COMPRESS_VD" + POSTFIX; + static { + vectorNode(COMPRESS_VD, "CompressV", TYPE_DOUBLE); + } + public static final String EXPAND_VB = VECTOR_PREFIX + "EXPAND_VB" + POSTFIX; static { vectorNode(EXPAND_VB, "ExpandV", TYPE_BYTE); diff --git a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java index c05124edcd7..daa2b9765f8 100644 --- a/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java +++ b/test/hotspot/jtreg/compiler/lib/ir_framework/test/IREncodingPrinter.java @@ -106,6 +106,7 @@ public class IREncodingPrinter { "avx512_fp16", "avx512_vnni", "avx512_vbmi", + "avx512_vbmi2", "avx10_2", "bmi2", // AArch64 diff --git a/test/hotspot/jtreg/compiler/vectorapi/VectorCompressTest.java b/test/hotspot/jtreg/compiler/vectorapi/VectorCompressTest.java new file mode 100644 index 00000000000..7ab60885ad2 --- /dev/null +++ b/test/hotspot/jtreg/compiler/vectorapi/VectorCompressTest.java @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2025, NVIDIA CORPORATION & 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. + * + * 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 compiler.vectorapi; + +import compiler.lib.generators.*; +import compiler.lib.ir_framework.*; +import jdk.incubator.vector.*; +import jdk.test.lib.Asserts; + +/** + * @test + * @bug 8366333 + * @key randomness + * @library /test/lib / + * @summary IR test for VectorAPI compress + * @modules jdk.incubator.vector + * + * @run driver compiler.vectorapi.VectorCompressTest + */ + +public class VectorCompressTest { + static final VectorSpecies B_SPECIES = ByteVector.SPECIES_MAX; + static final VectorSpecies S_SPECIES = ShortVector.SPECIES_MAX; + static final VectorSpecies I_SPECIES = IntVector.SPECIES_MAX; + static final VectorSpecies F_SPECIES = FloatVector.SPECIES_MAX; + static final VectorSpecies L_SPECIES = LongVector.SPECIES_MAX; + static final VectorSpecies D_SPECIES = DoubleVector.SPECIES_MAX; + static final int LENGTH = 512; + static final Generators RD = Generators.G; + static byte[] ba, bb; + static short[] sa, sb; + static int[] ia, ib; + static long[] la, lb; + static float[] fa, fb; + static double[] da, db; + static boolean[] ma; + + static { + ba = new byte[LENGTH]; + bb = new byte[LENGTH]; + sa = new short[LENGTH]; + sb = new short[LENGTH]; + ia = new int[LENGTH]; + ib = new int[LENGTH]; + la = new long[LENGTH]; + lb = new long[LENGTH]; + fa = new float[LENGTH]; + fb = new float[LENGTH]; + da = new double[LENGTH]; + db = new double[LENGTH]; + ma = new boolean[LENGTH]; + + Generator iGen = RD.ints(); + Generator lGen = RD.longs(); + Generator fGen = RD.floats(); + Generator dGen = RD.doubles(); + + for (int i = 0; i < LENGTH; i++) { + ba[i] = iGen.next().byteValue(); + sa[i] = iGen.next().shortValue(); + ma[i] = iGen.next() % 2 == 0; + } + RD.fill(iGen, ia); + RD.fill(lGen, la); + RD.fill(fGen, fa); + RD.fill(dGen, da); + } + + @DontInline + static void verifyVectorCompressByte(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(ba[i], bb[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals((byte)0, bb[i]); + } + } + + @DontInline + static void verifyVectorCompressShort(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(sa[i], sb[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals((short)0, sb[i]); + } + } + + @DontInline + static void verifyVectorCompressInteger(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(ia[i], ib[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals(0, ib[i]); + } + } + + @DontInline + static void verifyVectorCompressLong(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(la[i], lb[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals(0L, lb[i]); + } + } + + @DontInline + static void verifyVectorCompressFloat(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(fa[i], fb[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals(0.0f, fb[i]); + } + } + + @DontInline + static void verifyVectorCompressDouble(int vlen) { + int index = 0; + for (int i = 0; i < vlen; i++) { + if (ma[i]) { + Asserts.assertEquals(da[i], db[index++]); + } + } + for (int i = index; i < vlen; i++) { + Asserts.assertEquals(0.0, db[i]); + } + } + + @Test + @IR(counts = { IRNode.COMPRESS_VB, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VB, "= 1" }, + applyIfCPUFeatureAnd = {"avx512_vbmi2", "true", "avx512vl", "true"}) + public static void testVectorCompressByte() { + ByteVector av = ByteVector.fromArray(B_SPECIES, ba, 0); + VectorMask m = VectorMask.fromArray(B_SPECIES, ma, 0); + av.compress(m).intoArray(bb, 0); + verifyVectorCompressByte(B_SPECIES.length()); + } + + @Test + @IR(counts = { IRNode.COMPRESS_VS, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VS, "= 1" }, + applyIfCPUFeatureAnd = {"avx512_vbmi2", "true", "avx512vl", "true"}) + public static void testVectorCompressShort() { + ShortVector av = ShortVector.fromArray(S_SPECIES, sa, 0); + VectorMask m = VectorMask.fromArray(S_SPECIES, ma, 0); + av.compress(m).intoArray(sb, 0); + verifyVectorCompressShort(S_SPECIES.length()); + } + + @Test + @IR(counts = { IRNode.COMPRESS_VI, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VI, "= 1" }, + applyIfCPUFeatureAnd = {"avx512f", "true", "avx512vl", "true"}) + public static void testVectorCompressInt() { + IntVector av = IntVector.fromArray(I_SPECIES, ia, 0); + VectorMask m = VectorMask.fromArray(I_SPECIES, ma, 0); + av.compress(m).intoArray(ib, 0); + verifyVectorCompressInteger(I_SPECIES.length()); + } + + @Test + @IR(counts = { IRNode.COMPRESS_VL, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VL, "= 1" }, + applyIfCPUFeatureAnd = {"avx512f", "true", "avx512vl", "true"}) + public static void testVectorCompressLong() { + LongVector av = LongVector.fromArray(L_SPECIES, la, 0); + VectorMask m = VectorMask.fromArray(L_SPECIES, ma, 0); + av.compress(m).intoArray(lb, 0); + verifyVectorCompressLong(L_SPECIES.length()); + } + + @Test + @IR(counts = { IRNode.COMPRESS_VF, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VF, "= 1" }, + applyIfCPUFeatureAnd = {"avx512f", "true", "avx512vl", "true"}) + public static void testVectorCompressFloat() { + FloatVector av = FloatVector.fromArray(F_SPECIES, fa, 0); + VectorMask m = VectorMask.fromArray(F_SPECIES, ma, 0); + av.compress(m).intoArray(fb, 0); + verifyVectorCompressFloat(F_SPECIES.length()); + } + + @Test + @IR(counts = { IRNode.COMPRESS_VD, "= 1" }, + applyIfCPUFeature = { "sve", "true" }) + @IR(counts = { IRNode.COMPRESS_VD, "= 1" }, + applyIfCPUFeatureAnd = {"avx512f", "true", "avx512vl", "true"}) + public static void testVectorCompressDouble() { + DoubleVector av = DoubleVector.fromArray(D_SPECIES, da, 0); + VectorMask m = VectorMask.fromArray(D_SPECIES, ma, 0); + av.compress(m).intoArray(db, 0); + verifyVectorCompressDouble(D_SPECIES.length()); + } + + public static void main(String[] args) { + TestFramework testFramework = new TestFramework(); + testFramework.setDefaultWarmup(10000) + .addFlags("--add-modules=jdk.incubator.vector") + .start(); + } +} From eee2908853342ae305c200f7ec37081ea939a4fa Mon Sep 17 00:00:00 2001 From: David Holmes Date: Tue, 21 Oct 2025 04:04:50 +0000 Subject: [PATCH 219/561] 8370257: Remove ProblemListed tests from ProblemList.txt Reviewed-by: cjplummer --- test/hotspot/jtreg/ProblemList.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index f02ba70ba87..b1c03553dfc 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -133,7 +133,7 @@ containers/docker/TestJcmdWithSideCar.java 8341518 linux-x64 # :hotspot_serviceability # 8239062 and 8270326 only affects macosx-x64,macosx-aarch64 -serviceability/sa/sadebugd/DebugdConnectTest.java 8239062,8270326,8344261 generic-all +serviceability/sa/sadebugd/DebugdConnectTest.java 8239062,8270326 generic-all serviceability/sa/TestRevPtrsForInvokeDynamic.java 8241235 generic-all serviceability/jvmti/vthread/GetThreadStateMountedTest/GetThreadStateMountedTest.java 8318090,8318729 generic-all @@ -153,10 +153,6 @@ serviceability/sa/ClhsdbThreadContext.java 8356704 windows-x64 serviceability/jvmti/stress/StackTrace/NotSuspended/GetStackTraceNotSuspendedStressTest.java 8315980 linux-all,windows-x64 -serviceability/sa/JhsdbThreadInfoTest.java 8344261 generic-all -serviceability/sa/TestJhsdbJstackLock.java 8344261 generic-all -serviceability/attach/RemovingUnixDomainSocketTest.java 8344261 generic-all - ############################################################################# # :hotspot_misc From 207fe55d90fd4fa1a53c876865b1c227518c170e Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Tue, 21 Oct 2025 05:42:50 +0000 Subject: [PATCH 220/561] 8369902: C2 SuperWord: wrong result because filterin NaN instead of zero in MemPointerParser::canonicalize_raw_summands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Manuel Hässig Reviewed-by: mhaessig, kvn --- src/hotspot/share/opto/mempointer.cpp | 2 +- .../superword/TestAliasingFuzzer.java | 5 +- .../superword/TestDoNotFilterNaNSummands.java | 107 +++++++++++++ .../TestMemorySegmentFilterSummands.java | 140 ++++++++++++++++++ 4 files changed, 252 insertions(+), 2 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestDoNotFilterNaNSummands.java create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegmentFilterSummands.java diff --git a/src/hotspot/share/opto/mempointer.cpp b/src/hotspot/share/opto/mempointer.cpp index a63ba8ef701..68abaffe642 100644 --- a/src/hotspot/share/opto/mempointer.cpp +++ b/src/hotspot/share/opto/mempointer.cpp @@ -112,7 +112,7 @@ void MemPointerParser::canonicalize_raw_summands() { } } // Keep summands with non-zero scale. - if (!scaleI.is_zero() && !scaleL.is_NaN()) { + if (!scaleI.is_zero() && !scaleL.is_zero()) { _raw_summands.at_put(pos_put++, MemPointerRawSummand(variable, scaleI, scaleL, int_group)); } } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java index 30e1f1c0619..62e474ecb2c 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java @@ -112,7 +112,10 @@ import compiler.lib.template_framework.library.TestFrameworkClass; * memory and split ranges. But we could alternate between same memory * and split ranges, and then different memory but overlapping ranges. * This would also be never aliasing. - * + * - Generate cases that would catch bugs like JDK-8369902: + * - Large long constants, or scales. Probably only possible for MemorySegment. + * - Large number of invar, and reuse of invar so that they could cancle + * to zero, and need to be filtered out. */ public class TestAliasingFuzzer { private static final Random RANDOM = Utils.getRandomInstance(); diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestDoNotFilterNaNSummands.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestDoNotFilterNaNSummands.java new file mode 100644 index 00000000000..93a1f0b56a8 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestDoNotFilterNaNSummands.java @@ -0,0 +1,107 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8369902 + * @summary Bug in MemPointerParser::canonicalize_raw_summands let to wrong result, because a + * NaN summand was filtered out, instead of making the MemPointer / VPointer invalid. + * @run main/othervm + * -XX:+IgnoreUnrecognizedVMOptions + * -XX:CompileCommand=compileonly,*TestDoNotFilterNaNSummands::test + * -Xbatch + * compiler.loopopts.superword.TestDoNotFilterNaNSummands + * @run main compiler.loopopts.superword.TestDoNotFilterNaNSummands + */ + +package compiler.loopopts.superword; + +// This was the test found by the fuzzer. If you are looking for a simpler example with the same issue, +// please look at TestMemorySegmentFilterSummands::test2. +public class TestDoNotFilterNaNSummands { + static final int N = 100; + static int zero = 0; + + static int[] test() { + int x = -4; + int aI[] = new int[N]; + for (int k = 0; k < N; k++) { + // Note that x is always "-4", and N is a compile time constant. The modulo "%" + // gets optimized with magic numbers and shift/mul/sub trick, in the long domain, + // which somehow creates some large long constant that cannot be represented + // as an int. + int idx = (x >>> 1) % N; + // This is the CountedLoop that we may try to auto vectorize. + // We have a linear access (i) and a constant index access (idx), which eventually + // cross, so there is aliasing. If there is vectorization with an aliasing runtime + // check, this check must fail. + for (int i = 1; i < 63; i++) { + aI[i] = 2; + // The MemPointer / VPointer for the accesses below contain a large constant + // long constant offset that cannot be represented as an int, so the scaleL + // NoOverflowInt becomes NaN. In MemPointerParser::canonicalize_raw_summands + // we are supposed to filter out zero summands, but since we WRONGLY filtered + // out NaNs instead, this summand got filtered out, and later we did not detect + // that the MemPointer contains a NaN. Instead, we just get a "valid" looking + // VPointer, and generate runtime checks that are missing the long constant + // offset, leading to wrong decisions, and hence vectorization even though + // we have aliasing. This means that the accesses from above and below get + // reordered in an illegal way, leading to wrong results. + aI[idx] += 1; + } + for (int i = 0; i < 100; i++) { + // It is a no-op, but the compiler can't know statically that zero=0. + // Seems to be required in the graph, no idea why. + x >>= zero; + } + } + return aI; + } + + // Use the sum as an easy way to compare the results. + public static int sum(int[] aI) { + int sum = 0; + for (int i = 0; i < aI.length; i++) { sum += aI[i]; } + return sum; + } + + public static void main(String[] args) { + // Run once, hopefully before compilation, so get interpreter results. + int[] aIG = test(); + int gold = sum(aIG); + + // Repeat execution, until eventually compilation happens, compare + // compiler results to interpreter results. + for (int k = 0; k < 1000; k++) { + int[] aI = test(); + int val = sum(aI); + if (gold != val) { + System.out.println("Detected wrong result, printing values of arrays:"); + for (int i = 0; i < aI.length; i++) { + System.out.println("at " + i + ": " + aIG[i] + " vs " + aI[i]); + } + throw new RuntimeException("wrong result: " + gold + " " + val); + } + } + } +} diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegmentFilterSummands.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegmentFilterSummands.java new file mode 100644 index 00000000000..355d8d5383c --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegmentFilterSummands.java @@ -0,0 +1,140 @@ +/* + * 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. + * + * 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 compiler.loopopts.superword; + +import java.lang.foreign.*; +import java.util.Set; + +import compiler.lib.ir_framework.*; +import compiler.lib.verify.*; + +/* + * @test + * @bug 8369902 + * @summary Bug in MemPointerParser::canonicalize_raw_summands let to wrong results or assert. + * @library /test/lib / + * @run driver compiler.loopopts.superword.TestMemorySegmentFilterSummands + */ + +public class TestMemorySegmentFilterSummands { + + static long init = 1000; + static long limit = 9000; + + static long invar0 = 0; + static long invar1 = 0; + static long invar2 = 0; + static long invar3 = 0; + static long invar4 = 0; + static long invarX = 0; + + public static final long BIG = 0x200000000L; + public static long big = -BIG; + + static MemorySegment a1 = Arena.ofAuto().allocate(10_000); + static MemorySegment b1 = Arena.ofAuto().allocate(10_000); + static { + for (long i = init; i < limit; i++) { + a1.set(ValueLayout.JAVA_BYTE, i, (byte)((i & 0xf) + 1)); + } + } + + static MemorySegment a2 = MemorySegment.ofArray(new byte[40_000]); + static MemorySegment b2 = a2; + + public static void main(String[] args) { + TestFramework f = new TestFramework(); + f.addFlags("-XX:+IgnoreUnrecognizedVMOptions"); + f.addCrossProductScenarios(Set.of("-XX:-AlignVector", "-XX:+AlignVector"), + Set.of("-XX:-ShortRunningLongLoop", "-XX:+ShortRunningLoop")); + f.start(); + } + + @Test + @IR(counts = {IRNode.STORE_VECTOR, "> 0", + IRNode.LOAD_VECTOR_B, "> 0", + ".*multiversion.*", "= 0"}, // AutoVectorization Predicate SUFFICES, there is no aliasing + phase = CompilePhase.PRINT_IDEAL, + applyIfPlatform = {"64-bit", "true"}, + applyIf = {"AlignVector", "false"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + public static void test1() { + long invar = 0; + invar += invarX; // cancles out with above + invar += invar0; + invar += invar1; + invar += invar2; + invar += invar3; + invar += invar4; + invar -= invarX; // cancles out with above + // invar contains a raw summand for invarX, which has a scaleL=0. It needs to be filtered out. + // The two occurances of invarX are conveniently put in a long chain, so that IGVN cannot see + // that they cancle out, so that they are not optimized out before loop-opts. + for (long i = init; i < limit; i++) { + byte v = a1.get(ValueLayout.JAVA_BYTE, i + invar); + b1.set(ValueLayout.JAVA_BYTE, i + invar, v); + } + } + + @Check(test = "test1") + static void check1() { + Verify.checkEQ(a1, b1); + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + // This test could in principle show vectorization, but it would probably need to do some special + // tricks to only vectorize around the overlap. Still, it could happen that at some point we end + // up multiversioning, and having a vectorized loop that is never entered. + // + // For now, the long constant BIG leads to an invalid VPointer, which means we do not vectorize. + static void test2() { + // At runtime, "BIG + big" is zero. But BIG is a long constant that cannot be represented as + // an int, and so the scaleL NoOverflowInt is a NaN. We should not filter it out from the summands, + // but instead make the MemPointer / VPointer invalid, which prevents vectorization. + long adr = 4L * 5000 + BIG + big; + + for (long i = init; i < limit; i++) { + // The reference to a2 iterates linearly, while the reference to "b2" stays at the same adr. + // But the two alias: in the middle of the "a2" range it crosses over "b2" adr, so the + // aliasing runtime check (if we generate one) should fail. But if "BIG" is just filtered + // out from the summands, we instead just create a runtime check without it, which leads + // to a wrong answer, and the check does not fail, and we get wrong results. + a2.set(ValueLayout.JAVA_INT_UNALIGNED, 4L * i, 0); + int v = b2.get(ValueLayout.JAVA_INT_UNALIGNED, adr); + b2.set(ValueLayout.JAVA_INT_UNALIGNED, adr, v + 1); + } + } + + @Check(test = "test2") + static void check2() { + int s = 0; + for (long i = init; i < limit; i++) { + s += a2.get(ValueLayout.JAVA_INT_UNALIGNED, 4L * i); + } + if (s != 4000) { + throw new RuntimeException("wrong value"); + } + } +} From 634746a0f167da50c2aef010756f607a436696e9 Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Tue, 21 Oct 2025 05:43:08 +0000 Subject: [PATCH 221/561] 8369898: C2 SuperWord: assert(has_ctrl(i)) failed: should be control, not loop Reviewed-by: chagedorn, kvn --- src/hotspot/share/opto/loopUnswitch.cpp | 4 +- ...iversionSlowProjReplacementAndGetCtrl.java | 95 +++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/superword/TestMultiversionSlowProjReplacementAndGetCtrl.java diff --git a/src/hotspot/share/opto/loopUnswitch.cpp b/src/hotspot/share/opto/loopUnswitch.cpp index b40a0492df5..f79afee3103 100644 --- a/src/hotspot/share/opto/loopUnswitch.cpp +++ b/src/hotspot/share/opto/loopUnswitch.cpp @@ -522,7 +522,9 @@ IfTrueNode* PhaseIdealLoop::create_new_if_for_multiversion(IfTrueNode* multivers // Hook region into slow_path, in stead of the multiversion_slow_proj. // This also moves all other dependencies of the multiversion_slow_proj to the region. - _igvn.replace_node(multiversion_slow_proj, region); + // The lazy_replace ensures that any get_ctrl that used to have multiversion_slow_proj + // as their control are forwarded to the new region node as their control. + lazy_replace(multiversion_slow_proj, region); return new_if_true; } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMultiversionSlowProjReplacementAndGetCtrl.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMultiversionSlowProjReplacementAndGetCtrl.java new file mode 100644 index 00000000000..6d2249cc15c --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMultiversionSlowProjReplacementAndGetCtrl.java @@ -0,0 +1,95 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8369898 + * @summary Bug in PhaseIdealLoop::create_new_if_for_multiversion, that messed up the + * _loop_or_ctrl data structure while doing SuperWord for a first loop, and + * then get_ctrl asserted for a second loop that was also SuperWord-ed in the + * same loop-opts-phase. + * @run main/othervm + * -XX:CompileCommand=compileonly,*TestMultiversionSlowProjReplacementAndGetCtrl::test + * -XX:CompileCommand=exclude,*TestMultiversionSlowProjReplacementAndGetCtrl::dontinline + * -XX:-TieredCompilation + * -Xbatch + * compiler.loopopts.superword.TestMultiversionSlowProjReplacementAndGetCtrl + * @run main compiler.loopopts.superword.TestMultiversionSlowProjReplacementAndGetCtrl + */ + +package compiler.loopopts.superword; + +public class TestMultiversionSlowProjReplacementAndGetCtrl { + static final int N = 400; + + static void dontinline() {} + + static long test() { + int x = 0; + int arrayI[] = new int[N]; + byte[] arrayB = new byte[N]; + dontinline(); + // CallStaticJava for dontinline + // -> memory Proj + // -> it is used in both the k-indexed and j-indexed loops by their loads/stores. + for (int k = 8; k < 92; ++k) { + // Loop here is multiversioned, and eventually we insert an aliasing runtime check. + // This means that a StoreN (with mem input Proj from above) has its ctrl changed + // from the old multiversion_if_proj to a new region. We have to be careful to update + // the _loop_or_ctrl side-table so that get_ctrl for StoreN is sane. + // + // Below is some nested loop material I could not reduce further. Maybe because + // of loop-opts phase timing. Because we have to SuperWord the k-indexed loop + // above in the same loop-opts-phase as the j-indexed loop below, so that they + // have a shared _loop_or_ctrl data structure. + int y = 6; + while (--y > 0) {} + for (long i = 1; i < 6; i++) { + // I suspect that it is the two array references below that are SuperWord-ed, + // and since we do not manage to statically prove they cannot overlap, we add + // a speculative runtime check, i.e. multiversioning in this case. + arrayI[0] += 1; + arrayI[k] = 0; + try { + x = 2 / k % y; + } catch (ArithmeticException a_e) { + } + } + } + long sum = 0; + for (int j = 0; j < arrayB.length; j++) { + // Load below has mem input from Proj below dontinline + // We look up to the mem input (Proj), and down to uses + // that are Stores, checking in_bb on them, which calls + // get_ctrl on that StoreN from the other loop above. + sum += arrayB[j]; + } + return sum; + } + + public static void main(String[] strArr) { + for (int i = 0; i < 1_000; i++) { + test(); + } + } +} From 2aa0efd4256a61e1e20989973f32be5d8e8f8fe3 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 21 Oct 2025 06:21:11 +0000 Subject: [PATCH 222/561] 8370126: Improve jpackage signing testing Reviewed-by: almatvee --- .../internal/MacBaseInstallerBundler.java | 27 +- .../jpackage/internal/MacPackageBuilder.java | 18 +- .../internal/MacPkgPackageBuilder.java | 12 +- .../jdk/jpackage/test/JPackageCommand.java | 5 + .../helpers/jdk/jpackage/test/MacHelper.java | 136 +++++++- .../helpers/jdk/jpackage/test/MacSign.java | 106 +++++- .../jdk/jpackage/test/MacSignVerify.java | 75 ++++- .../tools/jpackage/macosx/MacSignTest.java | 70 ++-- .../jpackage/macosx/SigningAppImageTest.java | 18 +- .../macosx/SigningAppImageTwoStepsTest.java | 26 +- ...SigningPackageFromTwoStepAppImageTest.java | 25 +- .../jpackage/macosx/SigningPackageTest.java | 17 +- .../macosx/SigningPackageTwoStepTest.java | 308 +++++++++++------- .../SigningRuntimeImagePackageTest.java | 60 ++-- .../jpackage/macosx/base/SigningBase.java | 51 ++- 15 files changed, 682 insertions(+), 272 deletions(-) diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacBaseInstallerBundler.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacBaseInstallerBundler.java index f46b5a328fd..5c912728c32 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacBaseInstallerBundler.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacBaseInstallerBundler.java @@ -26,14 +26,8 @@ package jdk.jpackage.internal; import static jdk.jpackage.internal.StandardBundlerParam.PREDEFINED_APP_IMAGE; -import static jdk.jpackage.internal.StandardBundlerParam.PREDEFINED_APP_IMAGE_FILE; -import static jdk.jpackage.internal.StandardBundlerParam.SIGN_BUNDLE; -import java.nio.file.Files; -import java.nio.file.Path; -import java.text.MessageFormat; import java.util.Map; -import java.util.Optional; import jdk.jpackage.internal.model.ConfigException; public abstract class MacBaseInstallerBundler extends AbstractBundler { @@ -44,26 +38,7 @@ public abstract class MacBaseInstallerBundler extends AbstractBundler { protected void validateAppImageAndBundeler( Map params) throws ConfigException { - if (PREDEFINED_APP_IMAGE.fetchFrom(params) != null) { - Path applicationImage = PREDEFINED_APP_IMAGE.fetchFrom(params); - if (new MacAppImageFileExtras(PREDEFINED_APP_IMAGE_FILE.fetchFrom(params)).signed()) { - var appLayout = ApplicationLayoutUtils.PLATFORM_APPLICATION_LAYOUT.resolveAt(applicationImage); - if (!Files.exists( - PackageFile.getPathInAppImage(appLayout))) { - Log.info(MessageFormat.format(I18N.getString( - "warning.per.user.app.image.signed"), - PackageFile.getPathInAppImage(appLayout))); - } - } else { - if (Optional.ofNullable( - SIGN_BUNDLE.fetchFrom(params)).orElse(Boolean.FALSE)) { - // if signing bundle with app-image, warn user if app-image - // is not already signed. - Log.info(MessageFormat.format(I18N.getString( - "warning.unsigned.app.image"), getID())); - } - } - } else { + if (PREDEFINED_APP_IMAGE.fetchFrom(params) == null) { appImageBundler.validate(params); } } diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackageBuilder.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackageBuilder.java index cf5c6a934f7..9576f6a6a99 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackageBuilder.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackageBuilder.java @@ -24,8 +24,10 @@ */ package jdk.jpackage.internal; +import static jdk.jpackage.internal.MacPackagingPipeline.APPLICATION_LAYOUT; import static jdk.jpackage.internal.MacPackagingPipeline.LayoutUtils.packagerLayout; +import java.nio.file.Files; import java.util.Objects; import jdk.jpackage.internal.model.ConfigException; import jdk.jpackage.internal.model.MacApplication; @@ -57,7 +59,21 @@ final class MacPackageBuilder { .installedPackageLayout(pkg.installedPackageLayout()); pkg = pkgBuilder.create(); - return MacPackage.create(pkg, new MacPackageMixin.Stub(pkg.predefinedAppImage().map(v -> predefinedAppImageSigned))); + + var macPkg = MacPackage.create(pkg, new MacPackageMixin.Stub(pkg.predefinedAppImage().map(v -> predefinedAppImageSigned))); + validatePredefinedAppImage(macPkg); + return macPkg; + } + + private static void validatePredefinedAppImage(MacPackage pkg) { + if (pkg.predefinedAppImageSigned().orElse(false)) { + pkg.predefinedAppImage().ifPresent(predefinedAppImage -> { + var thePackageFile = PackageFile.getPathInAppImage(APPLICATION_LAYOUT); + if (!Files.exists(predefinedAppImage.resolve(thePackageFile))) { + Log.info(I18N.format("warning.per.user.app.image.signed", thePackageFile)); + } + }); + } } private final PackageBuilder pkgBuilder; diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPkgPackageBuilder.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPkgPackageBuilder.java index 131650aebb5..663b8b16265 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPkgPackageBuilder.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPkgPackageBuilder.java @@ -43,7 +43,9 @@ final class MacPkgPackageBuilder { } MacPkgPackage create() throws ConfigException { - return MacPkgPackage.create(pkgBuilder.create(), new MacPkgPackageMixin.Stub(createSigningConfig())); + var pkg = MacPkgPackage.create(pkgBuilder.create(), new MacPkgPackageMixin.Stub(createSigningConfig())); + validatePredefinedAppImage(pkg); + return pkg; } private Optional createSigningConfig() throws ConfigException { @@ -56,6 +58,14 @@ final class MacPkgPackageBuilder { } } + private static void validatePredefinedAppImage(MacPkgPackage pkg) { + if (!pkg.predefinedAppImageSigned().orElse(false) && pkg.sign()) { + pkg.predefinedAppImage().ifPresent(predefinedAppImage -> { + Log.info(I18N.format("warning.unsigned.app.image", "pkg")); + }); + } + } + private final MacPackageBuilder pkgBuilder; private SigningIdentityBuilder signingBuilder; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index ae9568bb844..6945cd2b722 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -1131,6 +1131,11 @@ public class JPackageCommand extends CommandArguments { MacHelper.verifyBundleStructure(cmd); } }), + MAC_BUNDLE_UNSIGNED_SIGNATURE(cmd -> { + if (TKit.isOSX() && !MacHelper.appImageSigned(cmd)) { + MacHelper.verifyUnsignedBundleSignature(cmd); + } + }), ; AppLayoutAssert(Consumer action) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index d01536e327d..a7a69ef0329 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -52,6 +52,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Properties; import java.util.Set; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; import java.util.regex.Pattern; @@ -66,6 +67,7 @@ import jdk.jpackage.internal.util.PathUtils; import jdk.jpackage.internal.util.XmlUtils; import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.internal.util.function.ThrowingSupplier; +import jdk.jpackage.test.MacSign.CertificateRequest; import jdk.jpackage.test.PackageTest.PackageHandlers; public final class MacHelper { @@ -229,25 +231,61 @@ public final class MacHelper { } } + /** + * Returns {@code true} if the given jpackage command line is configured to sign + * predefined app image in place. + *

        + * jpackage will not create a new app image or a native bundle. + * + * @param cmd the jpackage command to examine + * @return {@code true} if the given jpackage command line is configured to sign + * predefined app image in place and {@code false} otherwise. + */ public static boolean signPredefinedAppImage(JPackageCommand cmd) { Objects.requireNonNull(cmd); if (!TKit.isOSX()) { throw new UnsupportedOperationException(); } - return cmd.hasArgument("--mac-sign") && cmd.hasArgument("--app-image"); + return cmd.hasArgument("--mac-sign") && cmd.hasArgument("--app-image") && cmd.isImagePackageType(); } + /** + * Returns {@code true} if the given jpackage command line is configured such + * that the app image it will produce will be signed. + *

        + * If the jpackage command line is bundling a native package, the function + * returns {@code true} if the bundled app image will be signed. + * + * @param cmd the jpackage command to examine + * @return {@code true} if the given jpackage command line is configured such + * that the app image it will produce will be signed and {@code false} + * otherwise. + */ public static boolean appImageSigned(JPackageCommand cmd) { Objects.requireNonNull(cmd); if (!TKit.isOSX()) { throw new UnsupportedOperationException(); } - if (Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of).map(AppImageFile::load).map(AppImageFile::macSigned).orElse(false)) { + var runtimeImage = Optional.ofNullable(cmd.getArgumentValue("--runtime-image")).map(Path::of); + var appImage = Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of); + + if (cmd.isRuntime() && Files.isDirectory(runtimeImage.orElseThrow().resolve("Contents/_CodeSignature"))) { + // If the predefined runtime is a signed bundle, bundled image should be signed too. + return true; + } else if (appImage.map(AppImageFile::load).map(AppImageFile::macSigned).orElse(false)) { // The external app image is signed, so the app image is signed too. return true; } + if (!cmd.isImagePackageType() && appImage.isPresent()) { + // Building a ".pkg" or a ".dmg" bundle from the predefined app image. + // The predefined app image is unsigned, so the app image bundled + // in the output native package will be unsigned too + // (even if the ".pkg" file may be signed itself, and we never sign ".dmg" files). + return false; + } + if (!cmd.hasArgument("--mac-sign")) { return false; } @@ -332,6 +370,100 @@ public final class MacHelper { }).run(); } + public static JPackageCommand useKeychain(JPackageCommand cmd, MacSign.ResolvedKeychain keychain) { + return useKeychain(cmd, keychain.spec().keychain()); + } + + public static JPackageCommand useKeychain(JPackageCommand cmd, MacSign.Keychain keychain) { + return sign(cmd).addArguments("--mac-signing-keychain", keychain.name()); + } + + public static JPackageCommand sign(JPackageCommand cmd) { + if (!cmd.hasArgument("--mac-sign")) { + cmd.addArgument("--mac-sign"); + } + return cmd; + } + + public record SignKeyOption(Type type, CertificateRequest certRequest) { + + public SignKeyOption { + Objects.requireNonNull(type); + Objects.requireNonNull(certRequest); + } + + public enum Type { + SIGN_KEY_USER_NAME, + SIGN_KEY_IDENTITY, + ; + } + + @Override + public String toString() { + var sb = new StringBuffer(); + applyTo((optionName, _) -> { + sb.append(String.format("{%s: %s}", optionName, certRequest)); + }); + return sb.toString(); + } + + public JPackageCommand addTo(JPackageCommand cmd) { + applyTo(cmd::addArguments); + return sign(cmd); + } + + public JPackageCommand setTo(JPackageCommand cmd) { + applyTo(cmd::setArgumentValue); + return sign(cmd); + } + + private void applyTo(BiConsumer sink) { + switch (certRequest.type()) { + case INSTALLER -> { + switch (type) { + case SIGN_KEY_IDENTITY -> { + sink.accept("--mac-installer-sign-identity", certRequest.name()); + return; + } + case SIGN_KEY_USER_NAME -> { + sink.accept("--mac-signing-key-user-name", certRequest.shortName()); + return; + } + } + } + case CODE_SIGN -> { + switch (type) { + case SIGN_KEY_IDENTITY -> { + sink.accept("--mac-app-image-sign-identity", certRequest.name()); + return; + } + case SIGN_KEY_USER_NAME -> { + sink.accept("--mac-signing-key-user-name", certRequest.shortName()); + return; + } + } + } + } + + throw new AssertionError(); + } + } + + static void verifyUnsignedBundleSignature(JPackageCommand cmd) { + if (!cmd.isImagePackageType()) { + MacSignVerify.assertUnsigned(cmd.outputBundle()); + } + + final Path bundleRoot; + if (cmd.isImagePackageType()) { + bundleRoot = cmd.outputBundle(); + } else { + bundleRoot = cmd.pathToUnpackedPackageFile(cmd.appInstallationDirectory()); + } + + MacSignVerify.assertAdhocSigned(bundleRoot); + } + static PackageHandlers createDmgPackageHandlers() { return new PackageHandlers(MacHelper::installDmg, MacHelper::uninstallDmg, MacHelper::unpackDmg); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java index af9f57c4f7f..7d2bb908edb 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSign.java @@ -59,6 +59,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; import javax.naming.ldap.LdapName; @@ -351,6 +352,52 @@ public final class MacSign { private String password; } + public static final class UsageBuilder { + + UsageBuilder(Collection keychains) { + this.keychains = List.copyOf(keychains); + } + + public void run(Runnable runnable) { + Objects.requireNonNull(runnable); + + final Optional> oldKeychains; + if (addToSearchList) { + oldKeychains = Optional.ofNullable(activeKeychainFiles()); + Keychain.addToSearchList(keychains); + } else { + oldKeychains = Optional.empty(); + } + + try { + // Ensure keychains to be used for signing are unlocked. + // When the codesign command operates on a locked keychain in a ssh session + // it emits cryptic "errSecInternalComponent" error without other details. + keychains.forEach(Keychain::unlock); + runnable.run(); + } finally { + oldKeychains.ifPresent(restoreKeychains -> { + security("list-keychains", "-d", "user", "-s") + .addArguments(restoreKeychains.stream().map(Path::toString).toList()) + .execute(); + }); + } + } + + public UsageBuilder addToSearchList(boolean v) { + addToSearchList = v; + return this; + } + + public UsageBuilder addToSearchList() { + return addToSearchList(true); + } + + private final Collection keychains; + private boolean addToSearchList; + } + + Keychain create() { final var exec = createExecutor("create-keychain"); final var result = exec.saveOutput().executeWithoutExitCodeCheck(); @@ -415,24 +462,12 @@ public final class MacSign { return certs; } - public static void addToSearchList(Collection keychains) { + static void addToSearchList(Collection keychains) { security("list-keychains", "-d", "user", "-s", "login.keychain") .addArguments(keychains.stream().map(Keychain::name).toList()) .execute(); } - public static void withAddedKeychains(Collection keychains, Runnable runnable) { - final var curKeychains = activeKeychainFiles(); - addToSearchList(keychains); - try { - runnable.run(); - } finally { - security("list-keychains", "-d", "user", "-s") - .addArguments(curKeychains.stream().map(Path::toString).toList()) - .execute(); - } - } - private static List activeKeychainFiles() { // $ security list-keychains // "/Users/alexeysemenyuk/Library/Keychains/login.keychain-db" @@ -1037,6 +1072,47 @@ public final class MacSign { return !missingKeychain && !missingCertificates && !invalidCertificates; } + public static Keychain.UsageBuilder withKeychains(KeychainWithCertsSpec... keychains) { + return withKeychains(Stream.of(keychains).map(KeychainWithCertsSpec::keychain).toArray(Keychain[]::new)); + } + + public static Keychain.UsageBuilder withKeychains(Keychain... keychains) { + return new Keychain.UsageBuilder(List.of(keychains)); + } + + public static void withKeychains(Runnable runnable, Consumer mutator, Keychain... keychains) { + Objects.requireNonNull(runnable); + var builder = withKeychains(keychains); + mutator.accept(builder); + builder.run(runnable); + } + + public static void withKeychains(Runnable runnable, Keychain... keychains) { + withKeychains(runnable, _ -> {}, keychains); + } + + public static void withKeychain(Consumer consumer, Consumer mutator, Keychain keychain) { + Objects.requireNonNull(consumer); + withKeychains(() -> { + consumer.accept(keychain); + }, mutator, keychain); + } + + public static void withKeychain(Consumer consumer, Keychain keychain) { + withKeychain(consumer, _ -> {}, keychain); + } + + public static void withKeychain(Consumer consumer, Consumer mutator, ResolvedKeychain keychain) { + Objects.requireNonNull(consumer); + withKeychains(() -> { + consumer.accept(keychain); + }, mutator, keychain.spec().keychain()); + } + + public static void withKeychain(Consumer consumer, ResolvedKeychain keychain) { + withKeychain(consumer, _ -> {}, keychain); + } + public static final class ResolvedKeychain { public ResolvedKeychain(KeychainWithCertsSpec spec) { this.spec = Objects.requireNonNull(spec); @@ -1046,6 +1122,10 @@ public final class MacSign { return spec; } + public String name() { + return spec.keychain().name(); + } + public Map mapCertificateRequests() { if (certMap == null) { synchronized (this) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java index ae27e292bf6..81d31ed7267 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java @@ -44,6 +44,43 @@ import jdk.jpackage.test.MacSign.CertificateRequest; */ public final class MacSignVerify { + public static void verifyAppImageSigned( + JPackageCommand cmd, CertificateRequest certRequest, MacSign.ResolvedKeychain keychain) { + + cmd.verifyIsOfType(PackageType.MAC); + Objects.requireNonNull(certRequest); + Objects.requireNonNull(keychain); + + final Path bundleRoot; + if (cmd.isImagePackageType()) { + bundleRoot = cmd.outputBundle(); + } else { + bundleRoot = cmd.pathToUnpackedPackageFile( + cmd.appInstallationDirectory()); + } + + assertSigned(bundleRoot, certRequest); + + if (!cmd.isRuntime()) { + cmd.addLauncherNames().stream().map(cmd::appLauncherPath).forEach(launcherPath -> { + assertSigned(launcherPath, certRequest); + }); + } + + // Set to "null" if the sign origin is not found, instead of bailing out with an exception. + // Let is fail in the following TKit.assertEquals() call with a proper log message. + var signOrigin = findSpctlSignOrigin(SpctlType.EXEC, bundleRoot).orElse(null); + + TKit.assertEquals(certRequest.name(), signOrigin, + String.format("Check [%s] has sign origin as expected", bundleRoot)); + } + + public static void verifyPkgSigned(JPackageCommand cmd, CertificateRequest certRequest, MacSign.ResolvedKeychain keychain) { + cmd.verifyIsOfType(PackageType.MAC_PKG); + assertPkgSigned(cmd.outputBundle(), certRequest, + Objects.requireNonNull(keychain.mapCertificateRequests().get(certRequest))); + } + public static void assertSigned(Path path, CertificateRequest certRequest) { assertSigned(path); TKit.assertEquals(certRequest.name(), findCodesignSignOrigin(path).orElse(null), @@ -114,8 +151,8 @@ public final class MacSignVerify { } public static Optional findCodesignSignOrigin(Path path) { - final var exec = Executor.of("/usr/bin/codesign", "--display", "--verbose=4", path.toString()).saveOutput(); - final var result = exec.executeWithoutExitCodeCheck(); + final var exec = Executor.of("/usr/bin/codesign", "--display", "--verbose=4", path.toString()); + final var result = exec.saveOutput().executeWithoutExitCodeCheck(); if (result.getExitCode() == 0) { return Optional.of(result.getOutput().stream().map(line -> { if (line.equals("Signature=adhoc")) { @@ -144,12 +181,34 @@ public final class MacSignVerify { } public static void assertSigned(Path path) { - final var verifier = TKit.TextStreamVerifier.group() - .add(TKit.assertTextStream(": valid on disk").predicate(String::endsWith)) - .add(TKit.assertTextStream(": satisfies its Designated Requirement").predicate(String::endsWith)) - .create(); - verifier.accept(Executor.of("/usr/bin/codesign", "--verify", "--deep", - "--strict", "--verbose=2", path.toString()).executeAndGetOutput().iterator()); + assertSigned(path, false); + } + + private static void assertSigned(Path path, boolean sudo) { + final Executor exec; + if (sudo) { + exec = Executor.of("sudo", "/usr/bin/codesign"); + } else { + exec = Executor.of("/usr/bin/codesign"); + } + exec.addArguments("--verify", "--deep", "--strict", "--verbose=2", path.toString()); + final var result = exec.saveOutput().executeWithoutExitCodeCheck(); + if (result.getExitCode() == 0) { + TKit.TextStreamVerifier.group() + .add(TKit.assertTextStream(": valid on disk").predicate(String::endsWith)) + .add(TKit.assertTextStream(": satisfies its Designated Requirement").predicate(String::endsWith)) + .create().accept(result.getOutput().iterator()); + } else if (!sudo && result.getOutput().stream().findFirst().filter(str -> { + // By some reason /usr/bin/codesign command fails for some installed bundles. + // It is known to fail for some AppContentTest test cases and all FileAssociationsTest test cases. + // Rerunning the command with "sudo" works, though. + return str.equals(String.format("%s: Permission denied", path)); + }).isPresent()) { + TKit.trace("Try /usr/bin/codesign again with `sudo`"); + assertSigned(path, true); + } else { + reportUnexpectedCommandOutcome(exec.getPrintableCommandLine(), result); + } } public static List getPkgCertificateChain(Path path) { diff --git a/test/jdk/tools/jpackage/macosx/MacSignTest.java b/test/jdk/tools/jpackage/macosx/MacSignTest.java index b6f3f91ff58..f5f8b3825cc 100644 --- a/test/jdk/tools/jpackage/macosx/MacSignTest.java +++ b/test/jdk/tools/jpackage/macosx/MacSignTest.java @@ -70,14 +70,14 @@ public class MacSignTest { final List expectedStrings = new ArrayList<>(); expectedStrings.add(JPackageStringBundle.MAIN.cannedFormattedString("message.codesign.failed.reason.app.content")); + expectedStrings.add(JPackageStringBundle.MAIN.cannedFormattedString("error.tool.failed.with.output", "codesign")); + final var xcodeWarning = JPackageStringBundle.MAIN.cannedFormattedString("message.codesign.failed.reason.xcode.tools"); if (!MacHelper.isXcodeDevToolsInstalled()) { expectedStrings.add(xcodeWarning); } - final var keychain = SigningBase.StandardKeychain.EXPIRED.spec().keychain(); - - MacSign.Keychain.withAddedKeychains(List.of(keychain), () -> { + MacSign.withKeychain(keychain -> { // --app-content and --type app-image // Expect `message.codesign.failed.reason.app.content` message in the log. // This is not a fatal error, just a warning. @@ -86,8 +86,6 @@ public class MacSignTest { .ignoreDefaultVerbose(true) .validateOutput(expectedStrings.toArray(CannedFormattedString[]::new)) .addArguments("--app-content", appContent) - .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", keychain.name()) .addArguments("--mac-app-image-sign-identity", SigningBase.StandardCertificateRequest.CODESIGN.spec().name()); if (MacHelper.isXcodeDevToolsInstalled()) { @@ -95,8 +93,36 @@ public class MacSignTest { cmd.validateOutput(TKit.assertTextStream(xcodeWarning.getValue()).negate()); } - cmd.execute(1); - }); + MacHelper.useKeychain(cmd, keychain).execute(1); + }, MacSign.Keychain.UsageBuilder::addToSearchList, SigningBase.StandardKeychain.MAIN.keychain()); + } + + @Test + public static void testCodesignUnspecifiedFailure() throws IOException { + + var appImageCmd = JPackageCommand.helloAppImage().setFakeRuntime(); + + appImageCmd.executeIgnoreExitCode().assertExitCodeIsZero(); + + // This test expects jpackage to respond in a specific way on a codesign failure. + // The simplest option to trigger codesign failure is to request the signing of an invalid bundle. + // Create app content directory with the name known to fail signing. + final var appContent = appImageCmd.appLayout().contentDirectory().resolve("foo.1"); + Files.createDirectory(appContent); + Files.createFile(appContent.resolve("file")); + + final List expectedStrings = new ArrayList<>(); + expectedStrings.add(JPackageStringBundle.MAIN.cannedFormattedString("error.tool.failed.with.output", "codesign")); + + MacSign.withKeychain(keychain -> { + final var cmd = new JPackageCommand().setPackageType(PackageType.IMAGE) + .ignoreDefaultVerbose(true) + .validateOutput(expectedStrings.toArray(CannedFormattedString[]::new)) + .addArguments("--app-image", appImageCmd.outputBundle()) + .addArguments("--mac-app-image-sign-identity", SigningBase.StandardCertificateRequest.CODESIGN.spec().name()); + + MacHelper.useKeychain(cmd, keychain).execute(1); + }, MacSign.Keychain.UsageBuilder::addToSearchList, SigningBase.StandardKeychain.MAIN.keychain()); } @Test @@ -116,20 +142,16 @@ public class MacSignTest { @Parameter({"MAC_PKG", "EXPIRED_CODESIGN_SIGN_IDENTITY", "GOOD_PKG_SIGN_IDENTITY"}) public static void testExpiredCertificate(PackageType type, SignOption... options) { - final var keychain = SigningBase.StandardKeychain.EXPIRED.spec().keychain(); - - MacSign.Keychain.withAddedKeychains(List.of(keychain), () -> { - final var cmd = JPackageCommand.helloAppImage() + MacSign.withKeychain(keychain -> { + final var cmd = MacHelper.useKeychain(JPackageCommand.helloAppImage(), keychain) .ignoreDefaultVerbose(true) - .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", keychain.name()) .addArguments(Stream.of(options).map(SignOption::args).flatMap(List::stream).toList()) .setPackageType(type); SignOption.configureOutputValidation(cmd, Stream.of(options).filter(SignOption::expired).toList(), opt -> { return JPackageStringBundle.MAIN.cannedFormattedString("error.certificate.expired", opt.identityName()); }).execute(1); - }); + }, MacSign.Keychain.UsageBuilder::addToSearchList, SigningBase.StandardKeychain.EXPIRED.keychain()); } @Test @@ -148,39 +170,31 @@ public class MacSignTest { @Parameter({"MAC_PKG", "1", "GOOD_PKG_SIGN_IDENTITY"}) public static void testMultipleCertificates(PackageType type, int jpackageExitCode, SignOption... options) { - final var keychain = SigningBase.StandardKeychain.DUPLICATE.spec().keychain(); - - MacSign.Keychain.withAddedKeychains(List.of(keychain), () -> { - final var cmd = JPackageCommand.helloAppImage() + MacSign.withKeychain(keychain -> { + final var cmd = MacHelper.useKeychain(JPackageCommand.helloAppImage(), keychain) .ignoreDefaultVerbose(true) - .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", keychain.name()) .addArguments(Stream.of(options).map(SignOption::args).flatMap(List::stream).toList()) .setPackageType(type); SignOption.configureOutputValidation(cmd, List.of(options), opt -> { return JPackageStringBundle.MAIN.cannedFormattedString("error.multiple.certs.found", opt.identityName(), keychain.name()); }).execute(jpackageExitCode); - }); + }, MacSign.Keychain.UsageBuilder::addToSearchList, SigningBase.StandardKeychain.DUPLICATE.keychain()); } @Test @ParameterSupplier public static void testSelectSigningIdentity(String signingKeyUserName, CertificateRequest certRequest) { - final var keychain = SigningBase.StandardKeychain.MAIN.spec().keychain(); - - MacSign.Keychain.withAddedKeychains(List.of(keychain), () -> { - final var cmd = JPackageCommand.helloAppImage() + MacSign.withKeychain(keychain -> { + final var cmd = MacHelper.useKeychain(JPackageCommand.helloAppImage(), keychain) .setFakeRuntime() - .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", keychain.name()) .addArguments("--mac-signing-key-user-name", signingKeyUserName); cmd.executeAndAssertHelloAppImageCreated(); MacSignVerify.assertSigned(cmd.outputBundle(), certRequest); - }); + }, MacSign.Keychain.UsageBuilder::addToSearchList, SigningBase.StandardKeychain.MAIN.keychain()); } public static Collection testSelectSigningIdentity() { diff --git a/test/jdk/tools/jpackage/macosx/SigningAppImageTest.java b/test/jdk/tools/jpackage/macosx/SigningAppImageTest.java index e93e659408f..37ba8a6c299 100644 --- a/test/jdk/tools/jpackage/macosx/SigningAppImageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningAppImageTest.java @@ -21,12 +21,14 @@ * questions. */ -import java.nio.file.Path; +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; +import java.nio.file.Path; import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.MacSign; /** * Tests generation of app image with --mac-sign and related arguments. Test will @@ -68,13 +70,19 @@ public class SigningAppImageTest { // Unsigned @Parameter({"false", "true", "INVALID_INDEX"}) public void test(boolean doSign, boolean signingKey, SigningBase.CertIndex certEnum) throws Exception { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, doSign, signingKey, certEnum); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private void test(MacSign.ResolvedKeychain keychain, boolean doSign, boolean signingKey, SigningBase.CertIndex certEnum) throws Exception { final var certIndex = certEnum.value(); JPackageCommand cmd = JPackageCommand.helloAppImage(); if (doSign) { cmd.addArguments("--mac-sign", "--mac-signing-keychain", - SigningBase.getKeyChain()); + keychain.name()); if (signingKey) { cmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(certIndex)); diff --git a/test/jdk/tools/jpackage/macosx/SigningAppImageTwoStepsTest.java b/test/jdk/tools/jpackage/macosx/SigningAppImageTwoStepsTest.java index 94199b31434..906734e6a9c 100644 --- a/test/jdk/tools/jpackage/macosx/SigningAppImageTwoStepsTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningAppImageTwoStepsTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -21,14 +21,16 @@ * questions. */ -import java.nio.file.Path; +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; +import java.nio.file.Path; import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.MacSign; +import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.TKit; /** * Tests generation of app image and then signs generated app image with --mac-sign @@ -67,6 +69,12 @@ public class SigningAppImageTwoStepsTest { // Unsigned @Parameter({"false", "true"}) public void test(boolean signAppImage, boolean signingKey) throws Exception { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, signAppImage, signingKey); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private static void test(MacSign.ResolvedKeychain keychain, boolean signAppImage, boolean signingKey) throws Exception { Path appimageOutput = TKit.createTempDirectory("appimage"); @@ -78,7 +86,7 @@ public class SigningAppImageTwoStepsTest { if (signAppImage) { appImageCmd.addArguments("--mac-sign", "--mac-signing-keychain", - SigningBase.getKeyChain()); + keychain.name()); if (signingKey) { appImageCmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); @@ -103,7 +111,7 @@ public class SigningAppImageTwoStepsTest { cmd.setPackageType(PackageType.IMAGE) .addArguments("--app-image", appImageCmd.outputBundle().toAbsolutePath()) .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", SigningBase.getKeyChain()); + .addArguments("--mac-signing-keychain", keychain.name()); if (signingKey) { cmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java index d25d9a7fa81..6db1cb2faab 100644 --- a/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -21,15 +21,18 @@ * questions. */ +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; + import java.nio.file.Path; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.ApplicationLayout; import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.TKit; +import jdk.jpackage.test.MacHelper; +import jdk.jpackage.test.MacSign; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.MacHelper; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.TKit; /** * Tests generation of dmg and pkg from signed predefined app image which was @@ -102,6 +105,12 @@ public class SigningPackageFromTwoStepAppImageTest { // Unsigned @Parameter({"false", "true"}) public void test(boolean signAppImage, boolean signingKey) throws Exception { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, signAppImage, signingKey); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private void test(MacSign.ResolvedKeychain keychain, boolean signAppImage, boolean signingKey) throws Exception { Path appimageOutput = TKit.createTempDirectory("appimage"); @@ -112,7 +121,7 @@ public class SigningPackageFromTwoStepAppImageTest { .setArgumentValue("--dest", appimageOutput); if (signAppImage) { appImageCmd.addArguments("--mac-sign", - "--mac-signing-keychain", SigningBase.getKeyChain()); + "--mac-signing-keychain", keychain.name()); if (signingKey) { appImageCmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); @@ -133,7 +142,7 @@ public class SigningPackageFromTwoStepAppImageTest { appImageSignedCmd.setPackageType(PackageType.IMAGE) .addArguments("--app-image", appImageCmd.outputBundle().toAbsolutePath()) .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", SigningBase.getKeyChain()); + .addArguments("--mac-signing-keychain", keychain.name()); if (signingKey) { appImageSignedCmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); @@ -154,7 +163,7 @@ public class SigningPackageFromTwoStepAppImageTest { if (signAppImage) { cmd.addArguments("--mac-sign", "--mac-signing-keychain", - SigningBase.getKeyChain()); + keychain.name()); if (signingKey) { cmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageTest.java index 2c2f5c3bb0f..b1e9155dacb 100644 --- a/test/jdk/tools/jpackage/macosx/SigningPackageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningPackageTest.java @@ -21,14 +21,17 @@ * questions. */ +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; + import java.nio.file.Path; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.ApplicationLayout; import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.MacHelper; +import jdk.jpackage.test.MacSign; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.MacHelper; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; /** * Tests generation of dmg and pkg with --mac-sign and related arguments. @@ -144,6 +147,12 @@ public class SigningPackageTest { // Signing-indentity, but sign pkg only and UNICODE certificate @Parameter({"false", "false", "true", "UNICODE_INDEX"}) public static void test(boolean signingKey, boolean signAppImage, boolean signPKG, SigningBase.CertIndex certEnum) throws Exception { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, signingKey, signAppImage, signPKG, certEnum); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private static void test(MacSign.ResolvedKeychain keychain, boolean signingKey, boolean signAppImage, boolean signPKG, SigningBase.CertIndex certEnum) throws Exception { final var certIndex = certEnum.value(); new PackageTest() @@ -151,7 +160,7 @@ public class SigningPackageTest { .forTypes(PackageType.MAC) .addInitializer(cmd -> { cmd.addArguments("--mac-sign", - "--mac-signing-keychain", SigningBase.getKeyChain()); + "--mac-signing-keychain", keychain.name()); if (signingKey) { cmd.addArguments("--mac-signing-key-user-name", SigningBase.getDevName(certIndex)); diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java index 3522d8d43e5..16cf616cfd3 100644 --- a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -21,31 +21,39 @@ * questions. */ +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; + import java.nio.file.Path; -import jdk.jpackage.test.ApplicationLayout; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.stream.Stream; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.TKit; +import jdk.jpackage.test.JPackageStringBundle; +import jdk.jpackage.test.MacHelper; +import jdk.jpackage.test.MacHelper.SignKeyOption; +import jdk.jpackage.test.MacSign; +import jdk.jpackage.test.MacSignVerify; +import jdk.jpackage.test.PackageFile; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.MacHelper; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.TKit; /** - * Note: Testing unsgined app image is done to verify support for per-user - * configuration by checking for PackageFile. - * Tests generation of dmg and pkg from signed or unsigned predefined app image. - * Test will generate pkg and verifies its signature. It verifies that dmg - * is not signed, but app image inside dmg is signed or unsigned. This test - * requires that the machine is configured with test certificate for - * "Developer ID Installer: jpackage.openjdk.java.net" in - * jpackagerTest keychain with - * always allowed access to this keychain for user which runs test. - * note: - * "jpackage.openjdk.java.net" can be over-ridden by system property - * "jpackage.mac.signing.key.user.name", and - * "jpackagerTest" can be over-ridden by system property - * "jpackage.mac.signing.keychain" + * Tests packaging of a signed/unsigned predefined app image into a + * signed/unsigned .pkg or .dmg package. + * + *

        + * Prerequisites: A keychain with self-signed certificates as specified in + * {@link SigningBase.StandardKeychain#MAIN}. */ /* @@ -64,100 +72,180 @@ import jdk.jpackage.test.Annotations.Parameter; */ public class SigningPackageTwoStepTest { - private static void verifyPKG(JPackageCommand cmd) { - if (!cmd.hasArgument("--mac-sign")) { - return; // Nothing to check if not signed - } - - Path outputBundle = cmd.outputBundle(); - SigningBase.verifyPkgutil(outputBundle, true, SigningBase.DEFAULT_INDEX); - SigningBase.verifySpctl(outputBundle, "install", SigningBase.DEFAULT_INDEX); - } - - private static void verifyDMG(JPackageCommand cmd) { - // DMG always unsigned, so we will check it - Path outputBundle = cmd.outputBundle(); - SigningBase.verifyDMG(outputBundle); - } - - private static void verifyAppImageInDMG(JPackageCommand cmd) { - MacHelper.withExplodedDmg(cmd, dmgImage -> { - // We will be called with all folders in DMG since JDK-8263155, but - // we only need to verify app. - if (dmgImage.endsWith(cmd.name() + ".app")) { - boolean isSigned = cmd.hasArgument("--mac-sign"); - Path launcherPath = ApplicationLayout.platformAppImage() - .resolveAt(dmgImage).launchersDirectory().resolve(cmd.name()); - SigningBase.verifyCodesign(launcherPath, isSigned, SigningBase.DEFAULT_INDEX); - SigningBase.verifyCodesign(dmgImage, isSigned, SigningBase.DEFAULT_INDEX); - if (isSigned) { - SigningBase.verifySpctl(dmgImage, "exec", SigningBase.DEFAULT_INDEX); - } - } - }); - } - @Test - // (Signed, "signing-key or sign-identity"}) - // Signed and signing-key - @Parameter({"true", "true"}) - // Signed and signing-identity - @Parameter({"true", "false"}) - // Unsigned - @Parameter({"false", "true"}) - public static void test(boolean signAppImage, boolean signingKey) throws Exception { - Path appimageOutput = TKit.createTempDirectory("appimage"); + @ParameterSupplier + public static void test(TestSpec spec) { + MacSign.withKeychain(toConsumer(keychain -> { + spec.test(keychain); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } - JPackageCommand appImageCmd = JPackageCommand.helloAppImage() - .setArgumentValue("--dest", appimageOutput); - if (signAppImage) { - appImageCmd.addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", - SigningBase.getKeyChain()); - if (signingKey) { - appImageCmd.addArguments("--mac-signing-key-user-name", - SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); - } else { - appImageCmd.addArguments("--mac-app-image-sign-identity", - SigningBase.getAppCert(SigningBase.DEFAULT_INDEX)); + public record TestSpec(Optional signAppImage, Map signPackage) { + + public TestSpec { + Objects.requireNonNull(signAppImage); + Objects.requireNonNull(signPackage); + + if ((signAppImage.isEmpty() && signPackage.isEmpty()) || !PackageType.MAC.containsAll(signPackage.keySet())) { + // Unexpected package types. + throw new IllegalArgumentException(); + } + + // Ensure stable result of toString() call. + if (!SortedMap.class.isInstance(signPackage)) { + signPackage = new TreeMap<>(signPackage); } } - new PackageTest() - .addRunOnceInitializer(() -> appImageCmd.execute()) - .forTypes(PackageType.MAC) - .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); - if (signAppImage) { - cmd.addArguments("--mac-sign", - "--mac-signing-keychain", - SigningBase.getKeyChain()); - if (signingKey) { - cmd.addArguments("--mac-signing-key-user-name", - SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); - } else { - cmd.addArguments("--mac-installer-sign-identity", - SigningBase.getInstallerCert(SigningBase.DEFAULT_INDEX)); - } - } - }) - .forTypes(PackageType.MAC_PKG) - .addBundleVerifier(SigningPackageTwoStepTest::verifyPKG) - .forTypes(PackageType.MAC_DMG) - .addInitializer(cmd -> { - if (signAppImage && !signingKey) { - // jpackage throws expected error with - // --mac-installer-sign-identity and DMG type - cmd.removeArgumentWithValue("--mac-installer-sign-identity"); - // It will do nothing, but it signals test that app - // image itself is signed for verification. - cmd.addArguments("--mac-app-image-sign-identity", - SigningBase.getAppCert(SigningBase.DEFAULT_INDEX)); - } - }) - .addBundleVerifier(SigningPackageTwoStepTest::verifyDMG) - .addBundleVerifier(SigningPackageTwoStepTest::verifyAppImageInDMG) - .run(); + @Override + public String toString() { + var sb = new StringBuilder(); + + signAppImage.ifPresent(signOption -> { + sb.append(String.format("app-image=%s", signOption)); + }); + + if (!sb.isEmpty() && !signPackage.isEmpty()) { + sb.append("; "); + } + + if (!signPackage.isEmpty()) { + sb.append(signPackage); + } + + return sb.toString(); + } + + boolean signNativeBundle() { + return signPackage.isEmpty(); + } + + static Builder build() { + return new Builder(); + } + + static class Builder { + + TestSpec create() { + return new TestSpec(Optional.ofNullable(signAppImage), signPackage); + } + + Builder certRequest(SigningBase.StandardCertificateRequest v) { + return certRequest(v.spec()); + } + + Builder certRequest(MacSign.CertificateRequest v) { + certRequest = Objects.requireNonNull(v); + return this; + } + + Builder signIdentityType(SignKeyOption.Type v) { + signIdentityType = Objects.requireNonNull(v); + return this; + } + + Builder signAppImage() { + signAppImage = createSignKeyOption(); + return this; + } + + Builder signPackage(PackageType type) { + Objects.requireNonNull(type); + signPackage.put(type, createSignKeyOption()); + return this; + } + + Builder signPackage() { + PackageType.MAC.forEach(this::signPackage); + return this; + } + + private SignKeyOption createSignKeyOption() { + return new SignKeyOption(signIdentityType, certRequest); + } + + private MacSign.CertificateRequest certRequest = SigningBase.StandardCertificateRequest.CODESIGN.spec(); + private SignKeyOption.Type signIdentityType = SignKeyOption.Type.SIGN_KEY_IDENTITY; + + private SignKeyOption signAppImage; + private Map signPackage = new HashMap<>(); + } + + void test(MacSign.ResolvedKeychain keychain) { + + var appImageCmd = JPackageCommand.helloAppImage().setFakeRuntime(); + MacHelper.useKeychain(appImageCmd, keychain); + signAppImage.ifPresent(signOption -> { + signOption.setTo(appImageCmd); + }); + + var test = new PackageTest(); + + signAppImage.map(SignKeyOption::certRequest).ifPresent(certRequest -> { + // The predefined app image is signed, verify bundled app image is signed too. + test.addInstallVerifier(cmd -> { + MacSignVerify.verifyAppImageSigned(cmd, certRequest, keychain); + }); + }); + + Optional.ofNullable(signPackage.get(PackageType.MAC_PKG)).map(SignKeyOption::certRequest).ifPresent(certRequest -> { + test.forTypes(PackageType.MAC_PKG, () -> { + test.addBundleVerifier(cmd -> { + MacSignVerify.verifyPkgSigned(cmd, certRequest, keychain); + }); + }); + }); + + test.forTypes(signPackage.keySet()).addRunOnceInitializer(() -> { + appImageCmd.setArgumentValue("--dest", TKit.createTempDirectory("appimage")).execute(0); + }).addInitializer(cmd -> { + MacHelper.useKeychain(cmd, keychain); + cmd.addArguments("--app-image", appImageCmd.outputBundle()); + cmd.removeArgumentWithValue("--input"); + Optional.ofNullable(signPackage.get(cmd.packageType())).ifPresent(signOption -> { + signOption.setTo(cmd); + }); + + if (signAppImage.isPresent()) { + // Predefined app image is signed. Expect a warning. + cmd.validateOutput(JPackageStringBundle.MAIN.cannedFormattedString( + "warning.per.user.app.image.signed", + PackageFile.getPathInAppImage(Path.of("")))); + } else if (cmd.packageType() == PackageType.MAC_PKG && signPackage.containsKey(cmd.packageType())) { + // Create signed ".pkg" bundle from the unsigned predefined app image. Expect a warning. + cmd.validateOutput(JPackageStringBundle.MAIN.cannedFormattedString("warning.unsigned.app.image", "pkg")); + } + }) + .run(); + } + } + + public static Collection test() { + + List data = new ArrayList<>(); + + Stream.of(SignKeyOption.Type.values()).flatMap(signIdentityType -> { + return Stream.of( + // Sign both predefined app image and native package. + TestSpec.build().signIdentityType(signIdentityType) + .signAppImage() + .signPackage() + .certRequest(SigningBase.StandardCertificateRequest.PKG) + .signPackage(PackageType.MAC_PKG), + + // Don't sign predefined app image, sign native package. + TestSpec.build().signIdentityType(signIdentityType) + .signPackage() + .certRequest(SigningBase.StandardCertificateRequest.PKG) + .signPackage(PackageType.MAC_PKG), + + // Sign predefined app image, don't sign native package. + TestSpec.build().signIdentityType(signIdentityType).signAppImage() + ); + }).forEach(data::add); + + return data.stream().map(TestSpec.Builder::create).map(v -> { + return new Object[] {v}; + }).toList(); } } diff --git a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java index b137824a910..efcaadc3fa8 100644 --- a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java @@ -21,51 +21,53 @@ * questions. */ +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; + import java.io.IOException; import java.nio.file.Path; import java.util.function.Predicate; import java.util.stream.Stream; - import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.test.Executor; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.MacHelper; +import jdk.jpackage.test.MacSign; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; /** - * Tests generation of dmg and pkg with --mac-sign and related arguments. - * Test will generate pkg and verifies its signature. It verifies that dmg - * is not signed, but runtime image inside dmg is signed. + * Tests generation of dmg and pkg with --mac-sign and related arguments. Test + * will generate pkg and verifies its signature. It verifies that dmg is not + * signed, but runtime image inside dmg is signed. * - * Note: Specific UNICODE signing is not tested, since it is shared code - * with app image signing and it will be covered by SigningPackageTest. + *

        + * Note: Specific UNICODE signing is not tested, since it is shared code with + * app image signing and it will be covered by SigningPackageTest. * + *

        * Following combinations are tested: - * 1) "--runtime-image" points to unsigned JDK bundle and --mac-sign is not + *

          + *
        1. "--runtime-image" points to unsigned JDK bundle and --mac-sign is not * provided. Expected result: runtime image ad-hoc signed. - * 2) "--runtime-image" points to unsigned JDK bundle and --mac-sign is + *
        2. "--runtime-image" points to unsigned JDK bundle and --mac-sign is * provided. Expected result: Everything is signed with provided certificate. - * 3) "--runtime-image" points to signed JDK bundle and --mac-sign is not + *
        3. "--runtime-image" points to signed JDK bundle and --mac-sign is not * provided. Expected result: runtime image is signed with original certificate. - * 4) "--runtime-image" points to signed JDK bundle and --mac-sign is provided. + *
        4. "--runtime-image" points to signed JDK bundle and --mac-sign is provided. * Expected result: runtime image is signed with provided certificate. - * 5) "--runtime-image" points to JDK image and --mac-sign is not provided. + *
        5. "--runtime-image" points to JDK image and --mac-sign is not provided. * Expected result: runtime image ad-hoc signed. - * 6) "--runtime-image" points to JDK image and --mac-sign is provided. + *
        6. "--runtime-image" points to JDK image and --mac-sign is provided. * Expected result: Everything is signed with provided certificate. + *
        * * This test requires that the machine is configured with test certificate for - * "Developer ID Installer: jpackage.openjdk.java.net" in - * jpackagerTest keychain with - * always allowed access to this keychain for user which runs test. - * note: + * "Developer ID Installer: jpackage.openjdk.java.net" in jpackagerTest keychain + * with always allowed access to this keychain for user which runs test. note: * "jpackage.openjdk.java.net" can be over-ridden by system property - * "jpackage.mac.signing.key.user.name", and - * "jpackagerTest" can be over-ridden by system property - * "jpackage.mac.signing.keychain" + * "jpackage.mac.signing.key.user.name" */ /* @@ -84,17 +86,17 @@ import jdk.jpackage.test.TKit; */ public class SigningRuntimeImagePackageTest { - private static JPackageCommand addSignOptions(JPackageCommand cmd, int certIndex) { + private static JPackageCommand addSignOptions(JPackageCommand cmd, MacSign.ResolvedKeychain keychain, int certIndex) { if (certIndex != SigningBase.CertIndex.INVALID_INDEX.value()) { cmd.addArguments( "--mac-sign", - "--mac-signing-keychain", SigningBase.getKeyChain(), + "--mac-signing-keychain", keychain.name(), "--mac-signing-key-user-name", SigningBase.getDevName(certIndex)); } return cmd; } - private static Path createInputRuntimeBundle(int certIndex) throws IOException { + private static Path createInputRuntimeBundle(MacSign.ResolvedKeychain keychain, int certIndex) throws IOException { final var runtimeImage = JPackageCommand.createInputRuntimeImage(); @@ -111,7 +113,7 @@ public class SigningRuntimeImagePackageTest { .addArguments("--runtime-image", runtimeImage) .addArguments("--dest", runtimeBundleWorkDir); - addSignOptions(cmd, certIndex); + addSignOptions(cmd, keychain, certIndex); cmd.execute(); @@ -147,13 +149,21 @@ public class SigningRuntimeImagePackageTest { public static void test(boolean useJDKBundle, SigningBase.CertIndex jdkBundleCert, SigningBase.CertIndex signCert) throws Exception { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, useJDKBundle, jdkBundleCert, signCert); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private static void test(MacSign.ResolvedKeychain keychain, boolean useJDKBundle, + SigningBase.CertIndex jdkBundleCert, + SigningBase.CertIndex signCert) throws Exception { final Path inputRuntime[] = new Path[1]; new PackageTest() .addRunOnceInitializer(() -> { if (useJDKBundle) { - inputRuntime[0] = createInputRuntimeBundle(jdkBundleCert.value()); + inputRuntime[0] = createInputRuntimeBundle(keychain, jdkBundleCert.value()); } else { inputRuntime[0] = JPackageCommand.createInputRuntimeImage(); } @@ -164,7 +174,7 @@ public class SigningRuntimeImagePackageTest { // create input directory in the test and jpackage fails // if --input references non existent directory. cmd.removeArgumentWithValue("--input"); - addSignOptions(cmd, signCert.value()); + addSignOptions(cmd, keychain, signCert.value()); }) .addInstallVerifier(cmd -> { final var certIndex = Stream.of(signCert, jdkBundleCert) diff --git a/test/jdk/tools/jpackage/macosx/base/SigningBase.java b/test/jdk/tools/jpackage/macosx/base/SigningBase.java index 5484245f111..1e38f9b0c29 100644 --- a/test/jdk/tools/jpackage/macosx/base/SigningBase.java +++ b/test/jdk/tools/jpackage/macosx/base/SigningBase.java @@ -90,17 +90,29 @@ public class SigningBase { private final CertificateRequest spec; } + /** + * Standard keychains used in signing tests. + */ public enum StandardKeychain { - MAIN(DEFAULT_KEYCHAIN, + /** + * The primary keychain with good certificates. + */ + MAIN("jpackagerTest.keychain", StandardCertificateRequest.CODESIGN, StandardCertificateRequest.PKG, StandardCertificateRequest.CODESIGN_UNICODE, StandardCertificateRequest.PKG_UNICODE), + /** + * A keychain with some good and some expired certificates. + */ EXPIRED("jpackagerTest-expired.keychain", StandardCertificateRequest.CODESIGN, StandardCertificateRequest.PKG, StandardCertificateRequest.CODESIGN_EXPIRED, StandardCertificateRequest.PKG_EXPIRED), + /** + * A keychain with duplicated certificates. + */ DUPLICATE("jpackagerTest-duplicate.keychain", StandardCertificateRequest.CODESIGN, StandardCertificateRequest.PKG, @@ -114,30 +126,26 @@ public class SigningBase { StandardKeychain(String keychainName, CertificateRequest cert, CertificateRequest... otherCerts) { final var builder = keychain(keychainName).addCert(cert); List.of(otherCerts).forEach(builder::addCert); - this.spec = new ResolvedKeychain(builder.create()); + this.keychain = new ResolvedKeychain(builder.create()); } - public KeychainWithCertsSpec spec() { - return spec.spec(); + public ResolvedKeychain keychain() { + return keychain; } public X509Certificate mapCertificateRequest(CertificateRequest certRequest) { - return Objects.requireNonNull(spec.mapCertificateRequests().get(certRequest)); + return Objects.requireNonNull(keychain.mapCertificateRequests().get(certRequest)); } private static KeychainWithCertsSpec.Builder keychain(String name) { return new KeychainWithCertsSpec.Builder().name(name); } - private static CertificateRequest.Builder cert() { - return new CertificateRequest.Builder(); - } - private static List signingEnv() { - return Stream.of(values()).map(StandardKeychain::spec).toList(); + return Stream.of(values()).map(StandardKeychain::keychain).map(ResolvedKeychain::spec).toList(); } - private final ResolvedKeychain spec; + private final ResolvedKeychain keychain; } public static void setUp() { @@ -179,7 +187,6 @@ public class SigningBase { "jpackage.openjdk.java.net", "jpackage.openjdk.java.net (ö)", }; - private static String DEFAULT_KEYCHAIN = "jpackagerTest.keychain"; public static String getDevName(int certIndex) { // Always use values from system properties if set @@ -195,16 +202,6 @@ public class SigningBase { return Arrays.binarySearch(DEV_NAMES, devName); } - // Returns 'true' if dev name from DEV_NAMES - public static boolean isDevNameDefault() { - String value = System.getProperty("jpackage.mac.signing.key.user.name"); - if (value != null) { - return false; - } - - return true; - } - public static String getAppCert(int certIndex) { return "Developer ID Application: " + getDevName(certIndex); } @@ -213,16 +210,6 @@ public class SigningBase { return "Developer ID Installer: " + getDevName(certIndex); } - public static String getKeyChain() { - // Always use values from system properties if set - String value = System.getProperty("jpackage.mac.signing.keychain"); - if (value != null) { - return value; - } - - return DEFAULT_KEYCHAIN; - } - public static void verifyCodesign(Path target, boolean signed, int certIndex) { if (signed) { final var certRequest = getCertRequest(certIndex); From b6b0f051d576a822bcbc098a5435e107525bd93b Mon Sep 17 00:00:00 2001 From: David Holmes Date: Tue, 21 Oct 2025 06:31:55 +0000 Subject: [PATCH 223/561] 8370262: Add jdk/javadoc/doccheck/checks/jdkCheckLinks.java to the ProblemList Reviewed-by: jpai --- test/docs/ProblemList.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/docs/ProblemList.txt b/test/docs/ProblemList.txt index 914ae21d49f..83693eacbd1 100644 --- a/test/docs/ProblemList.txt +++ b/test/docs/ProblemList.txt @@ -1,6 +1,6 @@ ########################################################################### # -# 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. # # This code is free software; you can redistribute it and/or modify it @@ -39,3 +39,5 @@ # More than one label is allowed but must be on the same line. # ############################################################################# + +jdk/javadoc/doccheck/checks/jdkCheckLinks.java 8370249 generic-all From 430041d366ddf450c2480c81608dde980dfa6d41 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 21 Oct 2025 07:21:53 +0000 Subject: [PATCH 224/561] 8367499: Refactor exhaustiveness computation from Flow into a separate class Reviewed-by: vromero --- .../javac/comp/ExhaustivenessComputer.java | 604 ++++++++++++++++++ .../com/sun/tools/javac/comp/Flow.java | 545 +--------------- 2 files changed, 608 insertions(+), 541 deletions(-) create mode 100644 src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java new file mode 100644 index 00000000000..7a8067ce983 --- /dev/null +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java @@ -0,0 +1,604 @@ +/* + * Copyright (c) 1999, 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 com.sun.tools.javac.comp; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import com.sun.tools.javac.code.*; +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.util.*; + +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.tree.JCTree.*; + +import com.sun.tools.javac.code.Kinds.Kind; +import com.sun.tools.javac.code.Type.TypeVar; +import java.util.Arrays; +import java.util.Iterator; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.groupingBy; + +/** A class to compute exhaustiveness of set of switch cases. + * + *

        This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class ExhaustivenessComputer { + protected static final Context.Key exhaustivenessKey = new Context.Key<>(); + + private final Symtab syms; + private final Types types; + private final Check chk; + private final Infer infer; + + public static ExhaustivenessComputer instance(Context context) { + ExhaustivenessComputer instance = context.get(exhaustivenessKey); + if (instance == null) + instance = new ExhaustivenessComputer(context); + return instance; + } + + @SuppressWarnings("this-escape") + protected ExhaustivenessComputer(Context context) { + context.put(exhaustivenessKey, this); + syms = Symtab.instance(context); + types = Types.instance(context); + chk = Check.instance(context); + infer = Infer.instance(context); + } + + public boolean exhausts(JCExpression selector, List cases) { + Set patternSet = new HashSet<>(); + Map> enum2Constants = new HashMap<>(); + Set booleanLiterals = new HashSet<>(Set.of(0, 1)); + for (JCCase c : cases) { + if (!TreeInfo.unguardedCase(c)) + continue; + + for (var l : c.labels) { + if (l instanceof JCPatternCaseLabel patternLabel) { + for (Type component : components(selector.type)) { + patternSet.add(makePatternDescription(component, patternLabel.pat)); + } + } else if (l instanceof JCConstantCaseLabel constantLabel) { + if (types.unboxedTypeOrType(selector.type).hasTag(TypeTag.BOOLEAN)) { + Object value = ((JCLiteral) constantLabel.expr).value; + booleanLiterals.remove(value); + } else { + Symbol s = TreeInfo.symbol(constantLabel.expr); + if (s != null && s.isEnum()) { + enum2Constants.computeIfAbsent(s.owner, x -> { + Set result = new HashSet<>(); + s.owner.members() + .getSymbols(sym -> sym.kind == Kind.VAR && sym.isEnum()) + .forEach(result::add); + return result; + }).remove(s); + } + } + } + } + } + + if (types.unboxedTypeOrType(selector.type).hasTag(TypeTag.BOOLEAN) && booleanLiterals.isEmpty()) { + return true; + } + + for (Entry> e : enum2Constants.entrySet()) { + if (e.getValue().isEmpty()) { + patternSet.add(new BindingPattern(e.getKey().type)); + } + } + Set patterns = patternSet; + boolean useHashes = true; + try { + boolean repeat = true; + while (repeat) { + Set updatedPatterns; + updatedPatterns = reduceBindingPatterns(selector.type, patterns); + updatedPatterns = reduceNestedPatterns(updatedPatterns, useHashes); + updatedPatterns = reduceRecordPatterns(updatedPatterns); + updatedPatterns = removeCoveredRecordPatterns(updatedPatterns); + repeat = !updatedPatterns.equals(patterns); + if (checkCovered(selector.type, patterns)) { + return true; + } + if (!repeat) { + //there may be situation like: + //class B permits S1, S2 + //patterns: R(S1, B), R(S2, S2) + //this might be joined to R(B, S2), as B could be rewritten to S2 + //but hashing in reduceNestedPatterns will not allow that + //disable the use of hashing, and use subtyping in + //reduceNestedPatterns to handle situations like this: + repeat = useHashes; + useHashes = false; + } else { + //if a reduction happened, make sure hashing in reduceNestedPatterns + //is enabled, as the hashing speeds up the process significantly: + useHashes = true; + } + patterns = updatedPatterns; + } + return checkCovered(selector.type, patterns); + } catch (CompletionFailure cf) { + chk.completionError(selector.pos(), cf); + return true; //error recovery + } + } + + private boolean checkCovered(Type seltype, Iterable patterns) { + for (Type seltypeComponent : components(seltype)) { + for (PatternDescription pd : patterns) { + if(isBpCovered(seltypeComponent, pd)) { + return true; + } + } + } + return false; + } + + private List components(Type seltype) { + return switch (seltype.getTag()) { + case CLASS -> { + if (seltype.isCompound()) { + if (seltype.isIntersection()) { + yield ((Type.IntersectionClassType) seltype).getComponents() + .stream() + .flatMap(t -> components(t).stream()) + .collect(List.collector()); + } + yield List.nil(); + } + yield List.of(types.erasure(seltype)); + } + case TYPEVAR -> components(((TypeVar) seltype).getUpperBound()); + default -> List.of(types.erasure(seltype)); + }; + } + + /* In a set of patterns, search for a sub-set of binding patterns that + * in combination exhaust their sealed supertype. If such a sub-set + * is found, it is removed, and replaced with a binding pattern + * for the sealed supertype. + */ + private Set reduceBindingPatterns(Type selectorType, Set patterns) { + Set existingBindings = patterns.stream() + .filter(pd -> pd instanceof BindingPattern) + .map(pd -> ((BindingPattern) pd).type.tsym) + .collect(Collectors.toSet()); + + for (PatternDescription pdOne : patterns) { + if (pdOne instanceof BindingPattern bpOne) { + Set toAdd = new HashSet<>(); + + for (Type sup : types.directSupertypes(bpOne.type)) { + ClassSymbol clazz = (ClassSymbol) types.erasure(sup).tsym; + + clazz.complete(); + + if (clazz.isSealed() && clazz.isAbstract() && + //if a binding pattern for clazz already exists, no need to analyze it again: + !existingBindings.contains(clazz)) { + ListBuffer bindings = new ListBuffer<>(); + //do not reduce to types unrelated to the selector type: + Type clazzErasure = types.erasure(clazz.type); + if (components(selectorType).stream() + .map(types::erasure) + .noneMatch(c -> types.isSubtype(clazzErasure, c))) { + continue; + } + + Set permitted = allPermittedSubTypes(clazz, csym -> { + Type instantiated; + if (csym.type.allparams().isEmpty()) { + instantiated = csym.type; + } else { + instantiated = infer.instantiatePatternType(selectorType, csym); + } + + return instantiated != null && types.isCastable(selectorType, instantiated); + }); + + for (PatternDescription pdOther : patterns) { + if (pdOther instanceof BindingPattern bpOther) { + Set currentPermittedSubTypes = + allPermittedSubTypes(bpOther.type.tsym, s -> true); + + PERMITTED: for (Iterator it = permitted.iterator(); it.hasNext();) { + Symbol perm = it.next(); + + for (Symbol currentPermitted : currentPermittedSubTypes) { + if (types.isSubtype(types.erasure(currentPermitted.type), + types.erasure(perm.type))) { + it.remove(); + continue PERMITTED; + } + } + if (types.isSubtype(types.erasure(perm.type), + types.erasure(bpOther.type))) { + it.remove(); + } + } + } + } + + if (permitted.isEmpty()) { + toAdd.add(new BindingPattern(clazz.type)); + } + } + } + + if (!toAdd.isEmpty()) { + Set newPatterns = new HashSet<>(patterns); + newPatterns.addAll(toAdd); + return newPatterns; + } + } + } + return patterns; + } + + private Set allPermittedSubTypes(TypeSymbol root, Predicate accept) { + Set permitted = new HashSet<>(); + List permittedSubtypesClosure = baseClasses(root); + + while (permittedSubtypesClosure.nonEmpty()) { + ClassSymbol current = permittedSubtypesClosure.head; + + permittedSubtypesClosure = permittedSubtypesClosure.tail; + + current.complete(); + + if (current.isSealed() && current.isAbstract()) { + for (Type t : current.getPermittedSubclasses()) { + ClassSymbol csym = (ClassSymbol) t.tsym; + + if (accept.test(csym)) { + permittedSubtypesClosure = permittedSubtypesClosure.prepend(csym); + permitted.add(csym); + } + } + } + } + + return permitted; + } + + private List baseClasses(TypeSymbol root) { + if (root instanceof ClassSymbol clazz) { + return List.of(clazz); + } else if (root instanceof TypeVariableSymbol tvar) { + ListBuffer result = new ListBuffer<>(); + for (Type bound : tvar.getBounds()) { + result.appendList(baseClasses(bound.tsym)); + } + return result.toList(); + } else { + return List.nil(); + } + } + + /* Among the set of patterns, find sub-set of patterns such: + * $record($prefix$, $nested, $suffix$) + * Where $record, $prefix$ and $suffix$ is the same for each pattern + * in the set, and the patterns only differ in one "column" in + * the $nested pattern. + * Then, the set of $nested patterns is taken, and passed recursively + * to reduceNestedPatterns and to reduceBindingPatterns, to + * simplify the pattern. If that succeeds, the original found sub-set + * of patterns is replaced with a new set of patterns of the form: + * $record($prefix$, $resultOfReduction, $suffix$) + * + * useHashes: when true, patterns will be subject to exact equivalence; + * when false, two binding patterns will be considered equivalent + * if one of them is more generic than the other one; + * when false, the processing will be significantly slower, + * as pattern hashes cannot be used to speed up the matching process + */ + private Set reduceNestedPatterns(Set patterns, + boolean useHashes) { + /* implementation note: + * finding a sub-set of patterns that only differ in a single + * column is time-consuming task, so this method speeds it up by: + * - group the patterns by their record class + * - for each column (nested pattern) do: + * -- group patterns by their hash + * -- in each such by-hash group, find sub-sets that only differ in + * the chosen column, and then call reduceBindingPatterns and reduceNestedPatterns + * on patterns in the chosen column, as described above + */ + var groupByRecordClass = + patterns.stream() + .filter(pd -> pd instanceof RecordPattern) + .map(pd -> (RecordPattern) pd) + .collect(groupingBy(pd -> (ClassSymbol) pd.recordType.tsym)); + + for (var e : groupByRecordClass.entrySet()) { + int nestedPatternsCount = e.getKey().getRecordComponents().size(); + Set current = new HashSet<>(e.getValue()); + + for (int mismatchingCandidate = 0; + mismatchingCandidate < nestedPatternsCount; + mismatchingCandidate++) { + int mismatchingCandidateFin = mismatchingCandidate; + var groupEquivalenceCandidates = + current + .stream() + //error recovery, ignore patterns with incorrect number of nested patterns: + .filter(pd -> pd.nested.length == nestedPatternsCount) + .collect(groupingBy(pd -> useHashes ? pd.hashCode(mismatchingCandidateFin) : 0)); + for (var candidates : groupEquivalenceCandidates.values()) { + var candidatesArr = candidates.toArray(RecordPattern[]::new); + + for (int firstCandidate = 0; + firstCandidate < candidatesArr.length; + firstCandidate++) { + RecordPattern rpOne = candidatesArr[firstCandidate]; + ListBuffer join = new ListBuffer<>(); + + join.append(rpOne); + + NEXT_PATTERN: for (int nextCandidate = 0; + nextCandidate < candidatesArr.length; + nextCandidate++) { + if (firstCandidate == nextCandidate) { + continue; + } + + RecordPattern rpOther = candidatesArr[nextCandidate]; + if (rpOne.recordType.tsym == rpOther.recordType.tsym) { + for (int i = 0; i < rpOne.nested.length; i++) { + if (i != mismatchingCandidate) { + if (!rpOne.nested[i].equals(rpOther.nested[i])) { + if (useHashes || + //when not using hashes, + //check if rpOne.nested[i] is + //a subtype of rpOther.nested[i]: + !(rpOne.nested[i] instanceof BindingPattern bpOne) || + !(rpOther.nested[i] instanceof BindingPattern bpOther) || + !types.isSubtype(types.erasure(bpOne.type), types.erasure(bpOther.type))) { + continue NEXT_PATTERN; + } + } + } + } + join.append(rpOther); + } + } + + var nestedPatterns = join.stream().map(rp -> rp.nested[mismatchingCandidateFin]).collect(Collectors.toSet()); + var updatedPatterns = reduceNestedPatterns(nestedPatterns, useHashes); + + updatedPatterns = reduceRecordPatterns(updatedPatterns); + updatedPatterns = removeCoveredRecordPatterns(updatedPatterns); + updatedPatterns = reduceBindingPatterns(rpOne.fullComponentTypes()[mismatchingCandidateFin], updatedPatterns); + + if (!nestedPatterns.equals(updatedPatterns)) { + if (useHashes) { + current.removeAll(join); + } + + for (PatternDescription nested : updatedPatterns) { + PatternDescription[] newNested = + Arrays.copyOf(rpOne.nested, rpOne.nested.length); + newNested[mismatchingCandidateFin] = nested; + current.add(new RecordPattern(rpOne.recordType(), + rpOne.fullComponentTypes(), + newNested)); + } + } + } + } + } + + if (!current.equals(new HashSet<>(e.getValue()))) { + Set result = new HashSet<>(patterns); + result.removeAll(e.getValue()); + result.addAll(current); + return result; + } + } + return patterns; + } + + /* In the set of patterns, find those for which, given: + * $record($nested1, $nested2, ...) + * all the $nestedX pattern cover the given record component, + * and replace those with a simple binding pattern over $record. + */ + private Set reduceRecordPatterns(Set patterns) { + var newPatterns = new HashSet(); + boolean modified = false; + for (PatternDescription pd : patterns) { + if (pd instanceof RecordPattern rpOne) { + PatternDescription reducedPattern = reduceRecordPattern(rpOne); + if (reducedPattern != rpOne) { + newPatterns.add(reducedPattern); + modified = true; + continue; + } + } + newPatterns.add(pd); + } + return modified ? newPatterns : patterns; + } + + private PatternDescription reduceRecordPattern(PatternDescription pattern) { + if (pattern instanceof RecordPattern rpOne) { + Type[] componentType = rpOne.fullComponentTypes(); + //error recovery, ignore patterns with incorrect number of nested patterns: + if (componentType.length != rpOne.nested.length) { + return pattern; + } + PatternDescription[] reducedNestedPatterns = null; + boolean covered = true; + for (int i = 0; i < componentType.length; i++) { + PatternDescription newNested = reduceRecordPattern(rpOne.nested[i]); + if (newNested != rpOne.nested[i]) { + if (reducedNestedPatterns == null) { + reducedNestedPatterns = Arrays.copyOf(rpOne.nested, rpOne.nested.length); + } + reducedNestedPatterns[i] = newNested; + } + + covered &= checkCovered(componentType[i], List.of(newNested)); + } + if (covered) { + return new BindingPattern(rpOne.recordType); + } else if (reducedNestedPatterns != null) { + return new RecordPattern(rpOne.recordType, rpOne.fullComponentTypes(), reducedNestedPatterns); + } + } + return pattern; + } + + private Set removeCoveredRecordPatterns(Set patterns) { + Set existingBindings = patterns.stream() + .filter(pd -> pd instanceof BindingPattern) + .map(pd -> ((BindingPattern) pd).type.tsym) + .collect(Collectors.toSet()); + Set result = new HashSet<>(patterns); + + for (Iterator it = result.iterator(); it.hasNext();) { + PatternDescription pd = it.next(); + if (pd instanceof RecordPattern rp && existingBindings.contains(rp.recordType.tsym)) { + it.remove(); + } + } + + return result; + } + + private boolean isBpCovered(Type componentType, PatternDescription newNested) { + if (newNested instanceof BindingPattern bp) { + Type seltype = types.erasure(componentType); + Type pattype = types.erasure(bp.type); + + return seltype.isPrimitive() ? + types.isUnconditionallyExact(seltype, pattype) : + (bp.type.isPrimitive() && types.isUnconditionallyExact(types.unboxedType(seltype), bp.type)) || types.isSubtype(seltype, pattype); + } + return false; + } + + sealed interface PatternDescription { } + public PatternDescription makePatternDescription(Type selectorType, JCPattern pattern) { + if (pattern instanceof JCBindingPattern binding) { + Type type = !selectorType.isPrimitive() && types.isSubtype(selectorType, binding.type) + ? selectorType : binding.type; + return new BindingPattern(type); + } else if (pattern instanceof JCRecordPattern record) { + Type[] componentTypes; + + if (!record.type.isErroneous()) { + componentTypes = ((ClassSymbol) record.type.tsym).getRecordComponents() + .map(r -> types.memberType(record.type, r)) + .toArray(s -> new Type[s]); + } + else { + componentTypes = record.nested.map(t -> types.createErrorType(t.type)).toArray(s -> new Type[s]);; + } + + PatternDescription[] nestedDescriptions = + new PatternDescription[record.nested.size()]; + int i = 0; + for (List it = record.nested; + it.nonEmpty(); + it = it.tail, i++) { + Type componentType = i < componentTypes.length ? componentTypes[i] + : syms.errType; + nestedDescriptions[i] = makePatternDescription(types.erasure(componentType), it.head); + } + return new RecordPattern(record.type, componentTypes, nestedDescriptions); + } else if (pattern instanceof JCAnyPattern) { + return new BindingPattern(selectorType); + } else { + throw Assert.error(); + } + } + record BindingPattern(Type type) implements PatternDescription { + @Override + public int hashCode() { + return type.tsym.hashCode(); + } + @Override + public boolean equals(Object o) { + return o instanceof BindingPattern other && + type.tsym == other.type.tsym; + } + @Override + public String toString() { + return type.tsym + " _"; + } + } + record RecordPattern(Type recordType, int _hashCode, Type[] fullComponentTypes, PatternDescription... nested) implements PatternDescription { + + public RecordPattern(Type recordType, Type[] fullComponentTypes, PatternDescription[] nested) { + this(recordType, hashCode(-1, recordType, nested), fullComponentTypes, nested); + } + + @Override + public int hashCode() { + return _hashCode; + } + + @Override + public boolean equals(Object o) { + return o instanceof RecordPattern other && + recordType.tsym == other.recordType.tsym && + Arrays.equals(nested, other.nested); + } + + public int hashCode(int excludeComponent) { + return hashCode(excludeComponent, recordType, nested); + } + + public static int hashCode(int excludeComponent, Type recordType, PatternDescription... nested) { + int hash = 5; + hash = 41 * hash + recordType.tsym.hashCode(); + for (int i = 0; i < nested.length; i++) { + if (i != excludeComponent) { + hash = 41 * hash + nested[i].hashCode(); + } + } + return hash; + } + @Override + public String toString() { + return recordType.tsym + "(" + Arrays.stream(nested) + .map(pd -> pd.toString()) + .collect(Collectors.joining(", ")) + ")"; + } + } +} diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java index 3bbd007c66a..e74aed6a357 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java @@ -27,11 +27,7 @@ package com.sun.tools.javac.comp; -import java.util.Map; -import java.util.Map.Entry; import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; import java.util.function.Consumer; import com.sun.source.tree.LambdaExpressionTree.BodyKind; @@ -51,20 +47,12 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; -import com.sun.tools.javac.code.Kinds.Kind; import static com.sun.tools.javac.code.Kinds.Kind.*; -import com.sun.tools.javac.code.Type.TypeVar; import static com.sun.tools.javac.code.TypeTag.BOOLEAN; import static com.sun.tools.javac.code.TypeTag.VOID; import com.sun.tools.javac.resources.CompilerProperties.Fragments; import static com.sun.tools.javac.tree.JCTree.Tag.*; import com.sun.tools.javac.util.JCDiagnostic.Fragment; -import java.util.Arrays; -import java.util.Iterator; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import static java.util.stream.Collectors.groupingBy; /** This pass implements dataflow analysis for Java programs though * different AST visitor steps. Liveness analysis (see AliveAnalyzer) checks that @@ -213,8 +201,8 @@ public class Flow { private TreeMaker make; private final Resolve rs; private final JCDiagnostic.Factory diags; + private final ExhaustivenessComputer exhaustiveness; private Env attrEnv; - private final Infer infer; public static Flow instance(Context context) { Flow instance = context.get(flowKey); @@ -336,10 +324,9 @@ public class Flow { syms = Symtab.instance(context); types = Types.instance(context); chk = Check.instance(context); - infer = Infer.instance(context); rs = Resolve.instance(context); diags = JCDiagnostic.Factory.instance(context); - Source source = Source.instance(context); + exhaustiveness = ExhaustivenessComputer.instance(context); } /** @@ -709,7 +696,7 @@ public class Flow { tree.isExhaustive = tree.hasUnconditionalPattern || TreeInfo.isErrorEnumSwitch(tree.selector, tree.cases); if (exhaustiveSwitch) { - tree.isExhaustive |= exhausts(tree.selector, tree.cases); + tree.isExhaustive |= exhaustiveness.exhausts(tree.selector, tree.cases); if (!tree.isExhaustive) { log.error(tree, Errors.NotExhaustiveStatement); } @@ -748,7 +735,7 @@ public class Flow { TreeInfo.isErrorEnumSwitch(tree.selector, tree.cases)) { tree.isExhaustive = true; } else { - tree.isExhaustive = exhausts(tree.selector, tree.cases); + tree.isExhaustive = exhaustiveness.exhausts(tree.selector, tree.cases); } if (!tree.isExhaustive) { @@ -758,429 +745,6 @@ public class Flow { alive = alive.or(resolveYields(tree, prevPendingExits)); } - private boolean exhausts(JCExpression selector, List cases) { - Set patternSet = new HashSet<>(); - Map> enum2Constants = new HashMap<>(); - Set booleanLiterals = new HashSet<>(Set.of(0, 1)); - for (JCCase c : cases) { - if (!TreeInfo.unguardedCase(c)) - continue; - - for (var l : c.labels) { - if (l instanceof JCPatternCaseLabel patternLabel) { - for (Type component : components(selector.type)) { - patternSet.add(makePatternDescription(component, patternLabel.pat)); - } - } else if (l instanceof JCConstantCaseLabel constantLabel) { - if (types.unboxedTypeOrType(selector.type).hasTag(TypeTag.BOOLEAN)) { - Object value = ((JCLiteral) constantLabel.expr).value; - booleanLiterals.remove(value); - } else { - Symbol s = TreeInfo.symbol(constantLabel.expr); - if (s != null && s.isEnum()) { - enum2Constants.computeIfAbsent(s.owner, x -> { - Set result = new HashSet<>(); - s.owner.members() - .getSymbols(sym -> sym.kind == Kind.VAR && sym.isEnum()) - .forEach(result::add); - return result; - }).remove(s); - } - } - } - } - } - - if (types.unboxedTypeOrType(selector.type).hasTag(TypeTag.BOOLEAN) && booleanLiterals.isEmpty()) { - return true; - } - - for (Entry> e : enum2Constants.entrySet()) { - if (e.getValue().isEmpty()) { - patternSet.add(new BindingPattern(e.getKey().type)); - } - } - Set patterns = patternSet; - boolean useHashes = true; - try { - boolean repeat = true; - while (repeat) { - Set updatedPatterns; - updatedPatterns = reduceBindingPatterns(selector.type, patterns); - updatedPatterns = reduceNestedPatterns(updatedPatterns, useHashes); - updatedPatterns = reduceRecordPatterns(updatedPatterns); - updatedPatterns = removeCoveredRecordPatterns(updatedPatterns); - repeat = !updatedPatterns.equals(patterns); - if (checkCovered(selector.type, patterns)) { - return true; - } - if (!repeat) { - //there may be situation like: - //class B permits S1, S2 - //patterns: R(S1, B), R(S2, S2) - //this might be joined to R(B, S2), as B could be rewritten to S2 - //but hashing in reduceNestedPatterns will not allow that - //disable the use of hashing, and use subtyping in - //reduceNestedPatterns to handle situations like this: - repeat = useHashes; - useHashes = false; - } else { - //if a reduction happened, make sure hashing in reduceNestedPatterns - //is enabled, as the hashing speeds up the process significantly: - useHashes = true; - } - patterns = updatedPatterns; - } - return checkCovered(selector.type, patterns); - } catch (CompletionFailure cf) { - chk.completionError(selector.pos(), cf); - return true; //error recovery - } - } - - private boolean checkCovered(Type seltype, Iterable patterns) { - for (Type seltypeComponent : components(seltype)) { - for (PatternDescription pd : patterns) { - if(isBpCovered(seltypeComponent, pd)) { - return true; - } - } - } - return false; - } - - private List components(Type seltype) { - return switch (seltype.getTag()) { - case CLASS -> { - if (seltype.isCompound()) { - if (seltype.isIntersection()) { - yield ((Type.IntersectionClassType) seltype).getComponents() - .stream() - .flatMap(t -> components(t).stream()) - .collect(List.collector()); - } - yield List.nil(); - } - yield List.of(types.erasure(seltype)); - } - case TYPEVAR -> components(((TypeVar) seltype).getUpperBound()); - default -> List.of(types.erasure(seltype)); - }; - } - - /* In a set of patterns, search for a sub-set of binding patterns that - * in combination exhaust their sealed supertype. If such a sub-set - * is found, it is removed, and replaced with a binding pattern - * for the sealed supertype. - */ - private Set reduceBindingPatterns(Type selectorType, Set patterns) { - Set existingBindings = patterns.stream() - .filter(pd -> pd instanceof BindingPattern) - .map(pd -> ((BindingPattern) pd).type.tsym) - .collect(Collectors.toSet()); - - for (PatternDescription pdOne : patterns) { - if (pdOne instanceof BindingPattern bpOne) { - Set toAdd = new HashSet<>(); - - for (Type sup : types.directSupertypes(bpOne.type)) { - ClassSymbol clazz = (ClassSymbol) types.erasure(sup).tsym; - - clazz.complete(); - - if (clazz.isSealed() && clazz.isAbstract() && - //if a binding pattern for clazz already exists, no need to analyze it again: - !existingBindings.contains(clazz)) { - ListBuffer bindings = new ListBuffer<>(); - //do not reduce to types unrelated to the selector type: - Type clazzErasure = types.erasure(clazz.type); - if (components(selectorType).stream() - .map(types::erasure) - .noneMatch(c -> types.isSubtype(clazzErasure, c))) { - continue; - } - - Set permitted = allPermittedSubTypes(clazz, csym -> { - Type instantiated; - if (csym.type.allparams().isEmpty()) { - instantiated = csym.type; - } else { - instantiated = infer.instantiatePatternType(selectorType, csym); - } - - return instantiated != null && types.isCastable(selectorType, instantiated); - }); - - for (PatternDescription pdOther : patterns) { - if (pdOther instanceof BindingPattern bpOther) { - Set currentPermittedSubTypes = - allPermittedSubTypes(bpOther.type.tsym, s -> true); - - PERMITTED: for (Iterator it = permitted.iterator(); it.hasNext();) { - Symbol perm = it.next(); - - for (Symbol currentPermitted : currentPermittedSubTypes) { - if (types.isSubtype(types.erasure(currentPermitted.type), - types.erasure(perm.type))) { - it.remove(); - continue PERMITTED; - } - } - if (types.isSubtype(types.erasure(perm.type), - types.erasure(bpOther.type))) { - it.remove(); - } - } - } - } - - if (permitted.isEmpty()) { - toAdd.add(new BindingPattern(clazz.type)); - } - } - } - - if (!toAdd.isEmpty()) { - Set newPatterns = new HashSet<>(patterns); - newPatterns.addAll(toAdd); - return newPatterns; - } - } - } - return patterns; - } - - private Set allPermittedSubTypes(TypeSymbol root, Predicate accept) { - Set permitted = new HashSet<>(); - List permittedSubtypesClosure = baseClasses(root); - - while (permittedSubtypesClosure.nonEmpty()) { - ClassSymbol current = permittedSubtypesClosure.head; - - permittedSubtypesClosure = permittedSubtypesClosure.tail; - - current.complete(); - - if (current.isSealed() && current.isAbstract()) { - for (Type t : current.getPermittedSubclasses()) { - ClassSymbol csym = (ClassSymbol) t.tsym; - - if (accept.test(csym)) { - permittedSubtypesClosure = permittedSubtypesClosure.prepend(csym); - permitted.add(csym); - } - } - } - } - - return permitted; - } - - private List baseClasses(TypeSymbol root) { - if (root instanceof ClassSymbol clazz) { - return List.of(clazz); - } else if (root instanceof TypeVariableSymbol tvar) { - ListBuffer result = new ListBuffer<>(); - for (Type bound : tvar.getBounds()) { - result.appendList(baseClasses(bound.tsym)); - } - return result.toList(); - } else { - return List.nil(); - } - } - - /* Among the set of patterns, find sub-set of patterns such: - * $record($prefix$, $nested, $suffix$) - * Where $record, $prefix$ and $suffix$ is the same for each pattern - * in the set, and the patterns only differ in one "column" in - * the $nested pattern. - * Then, the set of $nested patterns is taken, and passed recursively - * to reduceNestedPatterns and to reduceBindingPatterns, to - * simplify the pattern. If that succeeds, the original found sub-set - * of patterns is replaced with a new set of patterns of the form: - * $record($prefix$, $resultOfReduction, $suffix$) - * - * useHashes: when true, patterns will be subject to exact equivalence; - * when false, two binding patterns will be considered equivalent - * if one of them is more generic than the other one; - * when false, the processing will be significantly slower, - * as pattern hashes cannot be used to speed up the matching process - */ - private Set reduceNestedPatterns(Set patterns, - boolean useHashes) { - /* implementation note: - * finding a sub-set of patterns that only differ in a single - * column is time-consuming task, so this method speeds it up by: - * - group the patterns by their record class - * - for each column (nested pattern) do: - * -- group patterns by their hash - * -- in each such by-hash group, find sub-sets that only differ in - * the chosen column, and then call reduceBindingPatterns and reduceNestedPatterns - * on patterns in the chosen column, as described above - */ - var groupByRecordClass = - patterns.stream() - .filter(pd -> pd instanceof RecordPattern) - .map(pd -> (RecordPattern) pd) - .collect(groupingBy(pd -> (ClassSymbol) pd.recordType.tsym)); - - for (var e : groupByRecordClass.entrySet()) { - int nestedPatternsCount = e.getKey().getRecordComponents().size(); - Set current = new HashSet<>(e.getValue()); - - for (int mismatchingCandidate = 0; - mismatchingCandidate < nestedPatternsCount; - mismatchingCandidate++) { - int mismatchingCandidateFin = mismatchingCandidate; - var groupEquivalenceCandidates = - current - .stream() - //error recovery, ignore patterns with incorrect number of nested patterns: - .filter(pd -> pd.nested.length == nestedPatternsCount) - .collect(groupingBy(pd -> useHashes ? pd.hashCode(mismatchingCandidateFin) : 0)); - for (var candidates : groupEquivalenceCandidates.values()) { - var candidatesArr = candidates.toArray(RecordPattern[]::new); - - for (int firstCandidate = 0; - firstCandidate < candidatesArr.length; - firstCandidate++) { - RecordPattern rpOne = candidatesArr[firstCandidate]; - ListBuffer join = new ListBuffer<>(); - - join.append(rpOne); - - NEXT_PATTERN: for (int nextCandidate = 0; - nextCandidate < candidatesArr.length; - nextCandidate++) { - if (firstCandidate == nextCandidate) { - continue; - } - - RecordPattern rpOther = candidatesArr[nextCandidate]; - if (rpOne.recordType.tsym == rpOther.recordType.tsym) { - for (int i = 0; i < rpOne.nested.length; i++) { - if (i != mismatchingCandidate) { - if (!rpOne.nested[i].equals(rpOther.nested[i])) { - if (useHashes || - //when not using hashes, - //check if rpOne.nested[i] is - //a subtype of rpOther.nested[i]: - !(rpOne.nested[i] instanceof BindingPattern bpOne) || - !(rpOther.nested[i] instanceof BindingPattern bpOther) || - !types.isSubtype(types.erasure(bpOne.type), types.erasure(bpOther.type))) { - continue NEXT_PATTERN; - } - } - } - } - join.append(rpOther); - } - } - - var nestedPatterns = join.stream().map(rp -> rp.nested[mismatchingCandidateFin]).collect(Collectors.toSet()); - var updatedPatterns = reduceNestedPatterns(nestedPatterns, useHashes); - - updatedPatterns = reduceRecordPatterns(updatedPatterns); - updatedPatterns = removeCoveredRecordPatterns(updatedPatterns); - updatedPatterns = reduceBindingPatterns(rpOne.fullComponentTypes()[mismatchingCandidateFin], updatedPatterns); - - if (!nestedPatterns.equals(updatedPatterns)) { - if (useHashes) { - current.removeAll(join); - } - - for (PatternDescription nested : updatedPatterns) { - PatternDescription[] newNested = - Arrays.copyOf(rpOne.nested, rpOne.nested.length); - newNested[mismatchingCandidateFin] = nested; - current.add(new RecordPattern(rpOne.recordType(), - rpOne.fullComponentTypes(), - newNested)); - } - } - } - } - } - - if (!current.equals(new HashSet<>(e.getValue()))) { - Set result = new HashSet<>(patterns); - result.removeAll(e.getValue()); - result.addAll(current); - return result; - } - } - return patterns; - } - - /* In the set of patterns, find those for which, given: - * $record($nested1, $nested2, ...) - * all the $nestedX pattern cover the given record component, - * and replace those with a simple binding pattern over $record. - */ - private Set reduceRecordPatterns(Set patterns) { - var newPatterns = new HashSet(); - boolean modified = false; - for (PatternDescription pd : patterns) { - if (pd instanceof RecordPattern rpOne) { - PatternDescription reducedPattern = reduceRecordPattern(rpOne); - if (reducedPattern != rpOne) { - newPatterns.add(reducedPattern); - modified = true; - continue; - } - } - newPatterns.add(pd); - } - return modified ? newPatterns : patterns; - } - - private PatternDescription reduceRecordPattern(PatternDescription pattern) { - if (pattern instanceof RecordPattern rpOne) { - Type[] componentType = rpOne.fullComponentTypes(); - //error recovery, ignore patterns with incorrect number of nested patterns: - if (componentType.length != rpOne.nested.length) { - return pattern; - } - PatternDescription[] reducedNestedPatterns = null; - boolean covered = true; - for (int i = 0; i < componentType.length; i++) { - PatternDescription newNested = reduceRecordPattern(rpOne.nested[i]); - if (newNested != rpOne.nested[i]) { - if (reducedNestedPatterns == null) { - reducedNestedPatterns = Arrays.copyOf(rpOne.nested, rpOne.nested.length); - } - reducedNestedPatterns[i] = newNested; - } - - covered &= checkCovered(componentType[i], List.of(newNested)); - } - if (covered) { - return new BindingPattern(rpOne.recordType); - } else if (reducedNestedPatterns != null) { - return new RecordPattern(rpOne.recordType, rpOne.fullComponentTypes(), reducedNestedPatterns); - } - } - return pattern; - } - - private Set removeCoveredRecordPatterns(Set patterns) { - Set existingBindings = patterns.stream() - .filter(pd -> pd instanceof BindingPattern) - .map(pd -> ((BindingPattern) pd).type.tsym) - .collect(Collectors.toSet()); - Set result = new HashSet<>(patterns); - - for (Iterator it = result.iterator(); it.hasNext();) { - PatternDescription pd = it.next(); - if (pd instanceof RecordPattern rp && existingBindings.contains(rp.recordType.tsym)) { - it.remove(); - } - } - - return result; - } - public void visitTry(JCTry tree) { ListBuffer prevPendingExits = pendingExits; pendingExits = new ListBuffer<>(); @@ -1326,18 +890,6 @@ public class Flow { } } - private boolean isBpCovered(Type componentType, PatternDescription newNested) { - if (newNested instanceof BindingPattern bp) { - Type seltype = types.erasure(componentType); - Type pattype = types.erasure(bp.type); - - return seltype.isPrimitive() ? - types.isUnconditionallyExact(seltype, pattype) : - (bp.type.isPrimitive() && types.isUnconditionallyExact(types.unboxedType(seltype), bp.type)) || types.isSubtype(seltype, pattype); - } - return false; - } - /** * This pass implements the second step of the dataflow analysis, namely * the exception analysis. This is to ensure that every checked exception that is @@ -3473,93 +3025,4 @@ public class Flow { } } - sealed interface PatternDescription { } - public PatternDescription makePatternDescription(Type selectorType, JCPattern pattern) { - if (pattern instanceof JCBindingPattern binding) { - Type type = !selectorType.isPrimitive() && types.isSubtype(selectorType, binding.type) - ? selectorType : binding.type; - return new BindingPattern(type); - } else if (pattern instanceof JCRecordPattern record) { - Type[] componentTypes; - - if (!record.type.isErroneous()) { - componentTypes = ((ClassSymbol) record.type.tsym).getRecordComponents() - .map(r -> types.memberType(record.type, r)) - .toArray(s -> new Type[s]); - } - else { - componentTypes = record.nested.map(t -> types.createErrorType(t.type)).toArray(s -> new Type[s]);; - } - - PatternDescription[] nestedDescriptions = - new PatternDescription[record.nested.size()]; - int i = 0; - for (List it = record.nested; - it.nonEmpty(); - it = it.tail, i++) { - Type componentType = i < componentTypes.length ? componentTypes[i] - : syms.errType; - nestedDescriptions[i] = makePatternDescription(types.erasure(componentType), it.head); - } - return new RecordPattern(record.type, componentTypes, nestedDescriptions); - } else if (pattern instanceof JCAnyPattern) { - return new BindingPattern(selectorType); - } else { - throw Assert.error(); - } - } - record BindingPattern(Type type) implements PatternDescription { - @Override - public int hashCode() { - return type.tsym.hashCode(); - } - @Override - public boolean equals(Object o) { - return o instanceof BindingPattern other && - type.tsym == other.type.tsym; - } - @Override - public String toString() { - return type.tsym + " _"; - } - } - record RecordPattern(Type recordType, int _hashCode, Type[] fullComponentTypes, PatternDescription... nested) implements PatternDescription { - - public RecordPattern(Type recordType, Type[] fullComponentTypes, PatternDescription[] nested) { - this(recordType, hashCode(-1, recordType, nested), fullComponentTypes, nested); - } - - @Override - public int hashCode() { - return _hashCode; - } - - @Override - public boolean equals(Object o) { - return o instanceof RecordPattern other && - recordType.tsym == other.recordType.tsym && - Arrays.equals(nested, other.nested); - } - - public int hashCode(int excludeComponent) { - return hashCode(excludeComponent, recordType, nested); - } - - public static int hashCode(int excludeComponent, Type recordType, PatternDescription... nested) { - int hash = 5; - hash = 41 * hash + recordType.tsym.hashCode(); - for (int i = 0; i < nested.length; i++) { - if (i != excludeComponent) { - hash = 41 * hash + nested[i].hashCode(); - } - } - return hash; - } - @Override - public String toString() { - return recordType.tsym + "(" + Arrays.stream(nested) - .map(pd -> pd.toString()) - .collect(Collectors.joining(", ")) + ")"; - } - } } From ec13c283c48c37e80d6c9c2753b09b31f4d14734 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Tue, 21 Oct 2025 07:47:57 +0000 Subject: [PATCH 225/561] 8366829: Add java.time.Duration constants MIN and MAX Reviewed-by: rriggs, naoto, scolebourne --- .../share/classes/java/time/Duration.java | 31 ++++++++++++++ .../java/time/temporal/ChronoUnit.java | 7 ++-- .../java/time/tck/java/time/TCKDuration.java | 42 ++++++++++++++++++- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/time/Duration.java b/src/java.base/share/classes/java/time/Duration.java index 23577a8a634..7b3289a1f59 100644 --- a/src/java.base/share/classes/java/time/Duration.java +++ b/src/java.base/share/classes/java/time/Duration.java @@ -138,6 +138,37 @@ public final class Duration * Constant for a duration of zero. */ public static final Duration ZERO = new Duration(0, 0); + /** + * The minimum supported {@code Duration}, which is {@link Long#MIN_VALUE} + * seconds. + * + * @apiNote This constant represents the smallest possible instance of + * {@code Duration}. Since {@code Duration} is directed, the smallest + * possible duration is negative. + * + * The constant is intended to be used as a sentinel value or in tests. + * Care should be taken when performing arithmetic on {@code MIN} as there + * is a high risk that {@link ArithmeticException} or {@link DateTimeException} + * will be thrown. + * + * @since 26 + */ + public static final Duration MIN = new Duration(Long.MIN_VALUE, 0); + /** + * The maximum supported {@code Duration}, which is {@link Long#MAX_VALUE} + * seconds and {@code 999,999,999} nanoseconds. + * + * @apiNote This constant represents the largest possible instance of + * {@code Duration}. + * + * The constant is intended to be used as a sentinel value or in tests. + * Care should be taken when performing arithmetic on {@code MAX} as there + * is a high risk that {@link ArithmeticException} or {@link DateTimeException} + * will be thrown. + * + * @since 26 + */ + public static final Duration MAX = new Duration(Long.MAX_VALUE, 999_999_999); /** * Serialization version. */ diff --git a/src/java.base/share/classes/java/time/temporal/ChronoUnit.java b/src/java.base/share/classes/java/time/temporal/ChronoUnit.java index 8f94e061d4d..6e944b296da 100644 --- a/src/java.base/share/classes/java/time/temporal/ChronoUnit.java +++ b/src/java.base/share/classes/java/time/temporal/ChronoUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 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. * * This code is free software; you can redistribute it and/or modify it @@ -184,10 +184,9 @@ public enum ChronoUnit implements TemporalUnit { * Artificial unit that represents the concept of forever. * This is primarily used with {@link TemporalField} to represent unbounded fields * such as the year or era. - * The estimated duration of this unit is artificially defined as the largest duration - * supported by {@link Duration}. + * The estimated duration of this unit is artificially defined as {@link Duration#MAX}. */ - FOREVER("Forever", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999)); + FOREVER("Forever", Duration.MAX); private final String name; private final Duration duration; diff --git a/test/jdk/java/time/tck/java/time/TCKDuration.java b/test/jdk/java/time/tck/java/time/TCKDuration.java index ee3950dec06..2057e8e8939 100644 --- a/test/jdk/java/time/tck/java/time/TCKDuration.java +++ b/test/jdk/java/time/tck/java/time/TCKDuration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021, 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. * * This code is free software; you can redistribute it and/or modify it @@ -71,6 +71,8 @@ import static java.time.temporal.ChronoUnit.SECONDS; import static java.time.temporal.ChronoUnit.WEEKS; import static java.time.temporal.ChronoUnit.YEARS; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotEquals; +import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; @@ -115,6 +117,44 @@ public class TCKDuration extends AbstractTCKTest { assertEquals(Duration.ZERO.getNano(), 0); } + @Test + public void test_min() { + assertEquals(Duration.MIN.getSeconds(), Long.MIN_VALUE); + assertEquals(Duration.MIN.getNano(), 0); + // no duration minimally less than MIN + assertThrows(ArithmeticException.class, () -> Duration.MIN.minusNanos(1)); + } + + @Test + public void test_max() { + assertEquals(Duration.MAX.getSeconds(), Long.MAX_VALUE); + assertEquals(Duration.MAX.getNano(), 999_999_999); + // no duration minimally greater than MAX + assertThrows(ArithmeticException.class, () -> Duration.MAX.plusNanos(1)); + } + + @Test + public void test_constant_properties() { + assertTrue(Duration.MIN.compareTo(Duration.MIN) == 0); + assertEquals(Duration.MIN, Duration.MIN); + assertTrue(Duration.ZERO.compareTo(Duration.ZERO) == 0); + assertEquals(Duration.ZERO, Duration.ZERO); + assertTrue(Duration.MAX.compareTo(Duration.MAX) == 0); + assertEquals(Duration.MAX, Duration.MAX); + + assertTrue(Duration.MIN.compareTo(Duration.ZERO) < 0); + assertTrue(Duration.ZERO.compareTo(Duration.MIN) > 0); + assertNotEquals(Duration.ZERO, Duration.MIN); + + assertTrue(Duration.ZERO.compareTo(Duration.MAX) < 0); + assertTrue(Duration.MAX.compareTo(Duration.ZERO) > 0); + assertNotEquals(Duration.ZERO, Duration.MAX); + + assertTrue(Duration.MIN.compareTo(Duration.MAX) < 0); + assertTrue(Duration.MAX.compareTo(Duration.MIN) > 0); + assertNotEquals(Duration.MIN, Duration.MAX); + } + //----------------------------------------------------------------------- // ofSeconds(long) //----------------------------------------------------------------------- From 2be273f20f839980f22a74b88b74fc5754fa0c11 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 21 Oct 2025 08:13:06 +0000 Subject: [PATCH 226/561] 8346005: Parallel: Incorrect page size calculation with UseLargePages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Joel Sikström Reviewed-by: jsikstro, fandreuzzi --- .../share/gc/parallel/mutableNUMASpace.cpp | 137 ++++++------------ .../share/gc/parallel/mutableNUMASpace.hpp | 16 +- .../share/gc/parallel/mutableSpace.cpp | 45 +++--- .../share/gc/parallel/mutableSpace.hpp | 11 +- .../share/gc/parallel/objectStartArray.cpp | 5 +- .../share/gc/parallel/parallelArguments.cpp | 24 +-- .../gc/parallel/parallelScavengeHeap.cpp | 9 +- .../gc/parallel/parallelScavengeHeap.hpp | 15 ++ src/hotspot/share/gc/parallel/psOldGen.cpp | 2 +- .../share/gc/parallel/psVirtualspace.cpp | 7 +- .../share/gc/parallel/psVirtualspace.hpp | 4 + src/hotspot/share/gc/parallel/psYoungGen.cpp | 8 +- .../gc/parallel/vmStructs_parallelgc.hpp | 1 + src/hotspot/share/memory/universe.cpp | 18 ++- src/hotspot/share/memory/universe.hpp | 2 +- 15 files changed, 144 insertions(+), 160 deletions(-) diff --git a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp index df4312ebd75..36412ce5efe 100644 --- a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp +++ b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp @@ -37,21 +37,11 @@ #include "runtime/threadSMR.hpp" #include "utilities/align.hpp" -MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment), _must_use_large_pages(false) { +MutableNUMASpace::MutableNUMASpace(size_t page_size) : MutableSpace(page_size) { _lgrp_spaces = new (mtGC) GrowableArray(0, mtGC); - _page_size = os::vm_page_size(); _adaptation_cycles = 0; _samples_count = 0; -#ifdef LINUX - // Changing the page size can lead to freeing of memory. When using large pages - // and the memory has been both reserved and committed, Linux does not support - // freeing parts of it. - if (UseLargePages && !os::can_commit_large_page_memory()) { - _must_use_large_pages = true; - } -#endif // LINUX - size_t lgrp_limit = os::numa_get_groups_num(); uint *lgrp_ids = NEW_C_HEAP_ARRAY(uint, lgrp_limit, mtGC); size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); @@ -60,7 +50,7 @@ MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment), lgrp_spaces()->reserve(checked_cast(lgrp_num)); // Add new spaces for the new nodes for (size_t i = 0; i < lgrp_num; i++) { - lgrp_spaces()->append(new LGRPSpace(lgrp_ids[i], alignment)); + lgrp_spaces()->append(new LGRPSpace(lgrp_ids[i], page_size)); } FREE_C_HEAP_ARRAY(uint, lgrp_ids); @@ -128,7 +118,10 @@ MutableNUMASpace::LGRPSpace *MutableNUMASpace::lgrp_space_for_thread(Thread* thr return space->lgrp_id() == (uint)lgrp_id; }); - assert(lgrp_spaces_index != -1, "must have created spaces for all lgrp_ids"); + if (lgrp_spaces_index == -1) { + // Running on a CPU with no memory; pick another CPU based on %. + lgrp_spaces_index = lgrp_id % lgrp_spaces()->length(); + } return lgrp_spaces()->at(lgrp_spaces_index); } @@ -146,22 +139,19 @@ size_t MutableNUMASpace::unsafe_max_tlab_alloc(Thread *thr) const { // Bias region towards the first-touching lgrp. Set the right page sizes. void MutableNUMASpace::bias_region(MemRegion mr, uint lgrp_id) { - HeapWord *start = align_up(mr.start(), page_size()); - HeapWord *end = align_down(mr.end(), page_size()); - if (end > start) { - MemRegion aligned_region(start, end); - assert((intptr_t)aligned_region.start() % page_size() == 0 && - (intptr_t)aligned_region.byte_size() % page_size() == 0, "Bad alignment"); - assert(region().contains(aligned_region), "Sanity"); - // First we tell the OS which page size we want in the given range. The underlying - // large page can be broken down if we require small pages. - const size_t os_align = UseLargePages ? page_size() : os::vm_page_size(); - os::realign_memory((char*)aligned_region.start(), aligned_region.byte_size(), os_align); - // Then we uncommit the pages in the range. - os::disclaim_memory((char*)aligned_region.start(), aligned_region.byte_size()); - // And make them local/first-touch biased. - os::numa_make_local((char*)aligned_region.start(), aligned_region.byte_size(), checked_cast(lgrp_id)); + assert(is_aligned(mr.start(), page_size()), "precondition"); + assert(is_aligned(mr.end(), page_size()), "precondition"); + + if (mr.is_empty()) { + return; } + // First we tell the OS which page size we want in the given range. The underlying + // large page can be broken down if we require small pages. + os::realign_memory((char*) mr.start(), mr.byte_size(), page_size()); + // Then we uncommit the pages in the range. + os::disclaim_memory((char*) mr.start(), mr.byte_size()); + // And make them local/first-touch biased. + os::numa_make_local((char*)mr.start(), mr.byte_size(), checked_cast(lgrp_id)); } // Update space layout. Perform adaptation. @@ -210,14 +200,15 @@ size_t MutableNUMASpace::current_chunk_size(int i) { // Return the default chunk size by equally diving the space. // page_size() aligned. size_t MutableNUMASpace::default_chunk_size() { - return base_space_size() / lgrp_spaces()->length() * page_size(); + // The number of pages may not be evenly divided. + return align_down(capacity_in_bytes() / lgrp_spaces()->length(), page_size()); } // Produce a new chunk size. page_size() aligned. // This function is expected to be called on sequence of i's from 0 to // lgrp_spaces()->length(). size_t MutableNUMASpace::adaptive_chunk_size(int i, size_t limit) { - size_t pages_available = base_space_size(); + size_t pages_available = capacity_in_bytes() / page_size(); for (int j = 0; j < i; j++) { pages_available -= align_down(current_chunk_size(j), page_size()) / page_size(); } @@ -263,20 +254,13 @@ size_t MutableNUMASpace::adaptive_chunk_size(int i, size_t limit) { // |----bottom_region--|---intersection---|------top_region------| void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection, MemRegion* bottom_region, MemRegion *top_region) { + assert(is_aligned(new_region.start(), page_size()), "precondition"); + assert(is_aligned(new_region.end(), page_size()), "precondition"); + assert(is_aligned(intersection.start(), page_size()), "precondition"); + assert(is_aligned(intersection.end(), page_size()), "precondition"); + // Is there bottom? if (new_region.start() < intersection.start()) { // Yes - // Try to coalesce small pages into a large one. - if (UseLargePages && page_size() >= alignment()) { - HeapWord* p = align_up(intersection.start(), alignment()); - if (new_region.contains(p) - && pointer_delta(p, new_region.start(), sizeof(char)) >= alignment()) { - if (intersection.contains(p)) { - intersection = MemRegion(p, intersection.end()); - } else { - intersection = MemRegion(p, p); - } - } - } *bottom_region = MemRegion(new_region.start(), intersection.start()); } else { *bottom_region = MemRegion(); @@ -284,18 +268,6 @@ void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection // Is there top? if (intersection.end() < new_region.end()) { // Yes - // Try to coalesce small pages into a large one. - if (UseLargePages && page_size() >= alignment()) { - HeapWord* p = align_down(intersection.end(), alignment()); - if (new_region.contains(p) - && pointer_delta(new_region.end(), p, sizeof(char)) >= alignment()) { - if (intersection.contains(p)) { - intersection = MemRegion(intersection.start(), p); - } else { - intersection = MemRegion(p, p); - } - } - } *top_region = MemRegion(intersection.end(), new_region.end()); } else { *top_region = MemRegion(); @@ -309,6 +281,8 @@ void MutableNUMASpace::initialize(MemRegion mr, WorkerThreads* pretouch_workers) { assert(clear_space, "Reallocation will destroy data!"); assert(lgrp_spaces()->length() > 0, "There should be at least one space"); + assert(is_aligned(mr.start(), page_size()), "precondition"); + assert(is_aligned(mr.end(), page_size()), "precondition"); MemRegion old_region = region(), new_region; set_bottom(mr.start()); @@ -316,37 +290,22 @@ void MutableNUMASpace::initialize(MemRegion mr, // Must always clear the space clear(SpaceDecorator::DontMangle); - // Compute chunk sizes - size_t prev_page_size = page_size(); - set_page_size(alignment()); - HeapWord* rounded_bottom = align_up(bottom(), page_size()); - HeapWord* rounded_end = align_down(end(), page_size()); - size_t base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size(); + size_t num_pages = mr.byte_size() / page_size(); - // Try small pages if the chunk size is too small - if (base_space_size_pages / lgrp_spaces()->length() == 0 - && page_size() > os::vm_page_size()) { - // Changing the page size below can lead to freeing of memory. So we fail initialization. - if (_must_use_large_pages) { - vm_exit_during_initialization("Failed initializing NUMA with large pages. Too small heap size"); - } - set_page_size(os::vm_page_size()); - rounded_bottom = align_up(bottom(), page_size()); - rounded_end = align_down(end(), page_size()); - base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size(); + if (num_pages < (size_t)lgrp_spaces()->length()) { + log_warning(gc)("Degraded NUMA config: #os-pages (%zu) < #CPU (%d); space-size: %zu, page-size: %zu", + num_pages, lgrp_spaces()->length(), mr.byte_size(), page_size()); + + // Keep only the first few CPUs. + lgrp_spaces()->trunc_to((int)num_pages); } - guarantee(base_space_size_pages / lgrp_spaces()->length() > 0, "Space too small"); - set_base_space_size(base_space_size_pages); // Handle space resize MemRegion top_region, bottom_region; if (!old_region.equals(region())) { - new_region = MemRegion(rounded_bottom, rounded_end); + new_region = mr; MemRegion intersection = new_region.intersection(old_region); - if (intersection.start() == nullptr || - intersection.end() == nullptr || - prev_page_size > page_size()) { // If the page size got smaller we have to change - // the page size preference for the whole space. + if (intersection.is_empty()) { intersection = MemRegion(new_region.start(), new_region.start()); } select_tails(new_region, intersection, &bottom_region, &top_region); @@ -393,19 +352,18 @@ void MutableNUMASpace::initialize(MemRegion mr, if (i == 0) { // Bottom chunk if (i != lgrp_spaces()->length() - 1) { - new_region = MemRegion(bottom(), rounded_bottom + (chunk_byte_size >> LogHeapWordSize)); + new_region = MemRegion(bottom(), chunk_byte_size >> LogHeapWordSize); } else { new_region = MemRegion(bottom(), end()); } - } else - if (i < lgrp_spaces()->length() - 1) { // Middle chunks - MutableSpace *ps = lgrp_spaces()->at(i - 1)->space(); - new_region = MemRegion(ps->end(), - ps->end() + (chunk_byte_size >> LogHeapWordSize)); - } else { // Top chunk - MutableSpace *ps = lgrp_spaces()->at(i - 1)->space(); - new_region = MemRegion(ps->end(), end()); - } + } else if (i < lgrp_spaces()->length() - 1) { // Middle chunks + MutableSpace* ps = lgrp_spaces()->at(i - 1)->space(); + new_region = MemRegion(ps->end(), + chunk_byte_size >> LogHeapWordSize); + } else { // Top chunk + MutableSpace* ps = lgrp_spaces()->at(i - 1)->space(); + new_region = MemRegion(ps->end(), end()); + } guarantee(region().contains(new_region), "Region invariant"); @@ -432,9 +390,8 @@ void MutableNUMASpace::initialize(MemRegion mr, // Clear space (set top = bottom) but never mangle. s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle, MutableSpace::DontSetupPages); - - set_adaptation_cycles(samples_count()); } + set_adaptation_cycles(samples_count()); } // Set the top of the whole space. diff --git a/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp b/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp index dc37b10292a..02850376592 100644 --- a/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp +++ b/src/hotspot/share/gc/parallel/mutableNUMASpace.hpp @@ -80,8 +80,8 @@ class MutableNUMASpace : public MutableSpace { SpaceStats _space_stats; public: - LGRPSpace(uint l, size_t alignment) : _lgrp_id(l), _allocation_failed(false) { - _space = new MutableSpace(alignment); + LGRPSpace(uint l, size_t page_size) : _lgrp_id(l), _allocation_failed(false) { + _space = new MutableSpace(page_size); _alloc_rate = new AdaptiveWeightedAverage(NUMAChunkResizeWeight); } ~LGRPSpace() { @@ -117,24 +117,14 @@ class MutableNUMASpace : public MutableSpace { }; GrowableArray* _lgrp_spaces; - size_t _page_size; unsigned _adaptation_cycles, _samples_count; - bool _must_use_large_pages; - - void set_page_size(size_t psz) { _page_size = psz; } - size_t page_size() const { return _page_size; } - unsigned adaptation_cycles() { return _adaptation_cycles; } void set_adaptation_cycles(int v) { _adaptation_cycles = v; } unsigned samples_count() { return _samples_count; } void increment_samples_count() { ++_samples_count; } - size_t _base_space_size; - void set_base_space_size(size_t v) { _base_space_size = v; } - size_t base_space_size() const { return _base_space_size; } - // Bias region towards the lgrp. void bias_region(MemRegion mr, uint lgrp_id); @@ -154,7 +144,7 @@ class MutableNUMASpace : public MutableSpace { public: GrowableArray* lgrp_spaces() const { return _lgrp_spaces; } - MutableNUMASpace(size_t alignment); + MutableNUMASpace(size_t page_size); virtual ~MutableNUMASpace(); // Space initialization. virtual void initialize(MemRegion mr, diff --git a/src/hotspot/share/gc/parallel/mutableSpace.cpp b/src/hotspot/share/gc/parallel/mutableSpace.cpp index 71fddf2c4da..a8f47a387e3 100644 --- a/src/hotspot/share/gc/parallel/mutableSpace.cpp +++ b/src/hotspot/share/gc/parallel/mutableSpace.cpp @@ -34,30 +34,26 @@ #include "utilities/align.hpp" #include "utilities/macros.hpp" -MutableSpace::MutableSpace(size_t alignment) : +MutableSpace::MutableSpace(size_t page_size) : _last_setup_region(), - _alignment(alignment), + _page_size(page_size), _bottom(nullptr), _top(nullptr), - _end(nullptr) -{ - assert(MutableSpace::alignment() % os::vm_page_size() == 0, - "Space should be aligned"); -} + _end(nullptr) {} -void MutableSpace::numa_setup_pages(MemRegion mr, size_t page_size, bool clear_space) { - if (!mr.is_empty()) { - HeapWord *start = align_up(mr.start(), page_size); - HeapWord *end = align_down(mr.end(), page_size); - if (end > start) { - size_t size = pointer_delta(end, start, sizeof(char)); - if (clear_space) { - // Prefer page reallocation to migration. - os::disclaim_memory((char*)start, size); - } - os::numa_make_global((char*)start, size); - } +void MutableSpace::numa_setup_pages(MemRegion mr, bool clear_space) { + assert(is_aligned(mr.start(), page_size()), "precondition"); + assert(is_aligned(mr.end(), page_size()), "precondition"); + + if (mr.is_empty()) { + return; } + + if (clear_space) { + // Prefer page reallocation to migration. + os::disclaim_memory((char*) mr.start(), mr.byte_size()); + } + os::numa_make_global((char*) mr.start(), mr.byte_size()); } void MutableSpace::initialize(MemRegion mr, @@ -105,20 +101,17 @@ void MutableSpace::initialize(MemRegion mr, } assert(mr.contains(head) && mr.contains(tail), "Sanity"); - size_t page_size = alignment(); - if (UseNUMA) { - numa_setup_pages(head, page_size, clear_space); - numa_setup_pages(tail, page_size, clear_space); + numa_setup_pages(head, clear_space); + numa_setup_pages(tail, clear_space); } if (AlwaysPreTouch) { - size_t pretouch_page_size = UseLargePages ? page_size : os::vm_page_size(); PretouchTask::pretouch("ParallelGC PreTouch head", (char*)head.start(), (char*)head.end(), - pretouch_page_size, pretouch_workers); + page_size(), pretouch_workers); PretouchTask::pretouch("ParallelGC PreTouch tail", (char*)tail.start(), (char*)tail.end(), - pretouch_page_size, pretouch_workers); + page_size(), pretouch_workers); } // Remember where we stopped so that we can continue later. diff --git a/src/hotspot/share/gc/parallel/mutableSpace.hpp b/src/hotspot/share/gc/parallel/mutableSpace.hpp index d09a2b2df89..785bfe27228 100644 --- a/src/hotspot/share/gc/parallel/mutableSpace.hpp +++ b/src/hotspot/share/gc/parallel/mutableSpace.hpp @@ -51,17 +51,20 @@ class MutableSpace: public CHeapObj { // The last region which page had been setup to be interleaved. MemRegion _last_setup_region; - size_t _alignment; + size_t _page_size; HeapWord* _bottom; HeapWord* volatile _top; HeapWord* _end; - void numa_setup_pages(MemRegion mr, size_t page_size, bool clear_space); + void numa_setup_pages(MemRegion mr, bool clear_space); void set_last_setup_region(MemRegion mr) { _last_setup_region = mr; } MemRegion last_setup_region() const { return _last_setup_region; } - public: +protected: + size_t page_size() const { return _page_size; } + +public: virtual ~MutableSpace() = default; MutableSpace(size_t page_size); @@ -77,8 +80,6 @@ class MutableSpace: public CHeapObj { HeapWord* volatile* top_addr() { return &_top; } HeapWord** end_addr() { return &_end; } - size_t alignment() { return _alignment; } - MemRegion region() const { return MemRegion(bottom(), end()); } size_t capacity_in_bytes() const { return capacity_in_words() * HeapWordSize; } diff --git a/src/hotspot/share/gc/parallel/objectStartArray.cpp b/src/hotspot/share/gc/parallel/objectStartArray.cpp index d120c71d2fa..255ee0c56ec 100644 --- a/src/hotspot/share/gc/parallel/objectStartArray.cpp +++ b/src/hotspot/share/gc/parallel/objectStartArray.cpp @@ -47,7 +47,10 @@ ObjectStartArray::ObjectStartArray(MemRegion covered_region) // Do not use large-pages for the backing store. The one large page region // will be used for the heap proper. - ReservedSpace backing_store = MemoryReserver::reserve(bytes_to_reserve, mtGC); + ReservedSpace backing_store = MemoryReserver::reserve(bytes_to_reserve, + os::vm_allocation_granularity(), + os::vm_page_size(), + mtGC); if (!backing_store.is_reserved()) { vm_exit_during_initialization("Could not reserve space for ObjectStartArray"); } diff --git a/src/hotspot/share/gc/parallel/parallelArguments.cpp b/src/hotspot/share/gc/parallel/parallelArguments.cpp index 780185952b4..2d267951f79 100644 --- a/src/hotspot/share/gc/parallel/parallelArguments.cpp +++ b/src/hotspot/share/gc/parallel/parallelArguments.cpp @@ -103,15 +103,10 @@ void ParallelArguments::initialize() { FullGCForwarding::initialize_flags(heap_reserved_size_bytes()); } -// The alignment used for spaces in young gen and old gen -static size_t default_space_alignment() { - return 64 * K * HeapWordSize; -} - void ParallelArguments::initialize_alignments() { // Initialize card size before initializing alignments CardTable::initialize_card_size(); - SpaceAlignment = default_space_alignment(); + SpaceAlignment = ParallelScavengeHeap::default_space_alignment(); HeapAlignment = compute_heap_alignment(); } @@ -123,12 +118,23 @@ void ParallelArguments::initialize_heap_flags_and_sizes_one_pass() { void ParallelArguments::initialize_heap_flags_and_sizes() { initialize_heap_flags_and_sizes_one_pass(); + if (!UseLargePages) { + ParallelScavengeHeap::set_desired_page_size(os::vm_page_size()); + return; + } + + // If using large-page, need to update SpaceAlignment so that spaces are page-size aligned. const size_t min_pages = 4; // 1 for eden + 1 for each survivor + 1 for old const size_t page_sz = os::page_size_for_region_aligned(MinHeapSize, min_pages); + ParallelScavengeHeap::set_desired_page_size(page_sz); - // Can a page size be something else than a power of two? - assert(is_power_of_2((intptr_t)page_sz), "must be a power of 2"); - size_t new_alignment = align_up(page_sz, SpaceAlignment); + if (page_sz == os::vm_page_size()) { + log_warning(gc, heap)("MinHeapSize (%zu) must be large enough for 4 * page-size; Disabling UseLargePages for heap", MinHeapSize); + return; + } + + // Space is largepage-aligned. + size_t new_alignment = page_sz; if (new_alignment != SpaceAlignment) { SpaceAlignment = new_alignment; // Redo everything from the start diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index eb1552e3db6..eef9dfbc97c 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -61,11 +61,18 @@ PSYoungGen* ParallelScavengeHeap::_young_gen = nullptr; PSOldGen* ParallelScavengeHeap::_old_gen = nullptr; PSAdaptiveSizePolicy* ParallelScavengeHeap::_size_policy = nullptr; GCPolicyCounters* ParallelScavengeHeap::_gc_policy_counters = nullptr; +size_t ParallelScavengeHeap::_desired_page_size = 0; jint ParallelScavengeHeap::initialize() { const size_t reserved_heap_size = ParallelArguments::heap_reserved_size_bytes(); - ReservedHeapSpace heap_rs = Universe::reserve_heap(reserved_heap_size, HeapAlignment); + assert(_desired_page_size != 0, "Should be initialized"); + ReservedHeapSpace heap_rs = Universe::reserve_heap(reserved_heap_size, HeapAlignment, _desired_page_size); + // Adjust SpaceAlignment based on actually used large page size. + if (UseLargePages) { + SpaceAlignment = MAX2(heap_rs.page_size(), default_space_alignment()); + } + assert(is_aligned(SpaceAlignment, heap_rs.page_size()), "inv"); trace_actual_reserved_page_size(reserved_heap_size, heap_rs); diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp index bf777bda29e..84732a86880 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp @@ -76,6 +76,9 @@ class ParallelScavengeHeap : public CollectedHeap { static PSAdaptiveSizePolicy* _size_policy; static GCPolicyCounters* _gc_policy_counters; + // At startup, calculate the desired OS page-size based on heap size and large-page flags. + static size_t _desired_page_size; + GCMemoryManager* _young_manager; GCMemoryManager* _old_manager; @@ -128,6 +131,18 @@ public: _gc_overhead_counter(0), _is_heap_almost_full(false) {} + // The alignment used for spaces in young gen and old gen + constexpr static size_t default_space_alignment() { + constexpr size_t alignment = 64 * K * HeapWordSize; + static_assert(is_power_of_2(alignment), "inv"); + return alignment; + } + + static void set_desired_page_size(size_t page_size) { + assert(is_power_of_2(page_size), "precondition"); + _desired_page_size = page_size; + } + Name kind() const override { return CollectedHeap::Parallel; } diff --git a/src/hotspot/share/gc/parallel/psOldGen.cpp b/src/hotspot/share/gc/parallel/psOldGen.cpp index 89f22b72b69..2d4b0698ad0 100644 --- a/src/hotspot/share/gc/parallel/psOldGen.cpp +++ b/src/hotspot/share/gc/parallel/psOldGen.cpp @@ -96,7 +96,7 @@ void PSOldGen::initialize_work() { // ObjectSpace stuff // - _object_space = new MutableSpace(virtual_space()->alignment()); + _object_space = new MutableSpace(virtual_space()->page_size()); object_space()->initialize(committed_mr, SpaceDecorator::Clear, SpaceDecorator::Mangle, diff --git a/src/hotspot/share/gc/parallel/psVirtualspace.cpp b/src/hotspot/share/gc/parallel/psVirtualspace.cpp index 3be90b370d1..f4b24fa51af 100644 --- a/src/hotspot/share/gc/parallel/psVirtualspace.cpp +++ b/src/hotspot/share/gc/parallel/psVirtualspace.cpp @@ -29,8 +29,8 @@ #include "utilities/align.hpp" PSVirtualSpace::PSVirtualSpace(ReservedSpace rs, size_t alignment) : - _alignment(alignment) -{ + _alignment(alignment), + _page_size(rs.page_size()) { set_reserved(rs); set_committed(reserved_low_addr(), reserved_low_addr()); DEBUG_ONLY(verify()); @@ -88,7 +88,8 @@ bool PSVirtualSpace::shrink_by(size_t bytes) { #ifndef PRODUCT void PSVirtualSpace::verify() const { - assert(is_aligned(_alignment, os::vm_page_size()), "bad alignment"); + assert(is_aligned(_page_size, os::vm_page_size()), "bad alignment"); + assert(is_aligned(_alignment, _page_size), "inv"); assert(is_aligned(reserved_low_addr(), _alignment), "bad reserved_low_addr"); assert(is_aligned(reserved_high_addr(), _alignment), "bad reserved_high_addr"); assert(is_aligned(committed_low_addr(), _alignment), "bad committed_low_addr"); diff --git a/src/hotspot/share/gc/parallel/psVirtualspace.hpp b/src/hotspot/share/gc/parallel/psVirtualspace.hpp index a54a513a117..ca94f4d83b6 100644 --- a/src/hotspot/share/gc/parallel/psVirtualspace.hpp +++ b/src/hotspot/share/gc/parallel/psVirtualspace.hpp @@ -41,6 +41,9 @@ class PSVirtualSpace : public CHeapObj { // ReservedSpace passed to initialize() must be aligned to this value. const size_t _alignment; + // OS page size used. If using Transparent Huge Pages, it's the desired large page-size. + const size_t _page_size; + // Reserved area char* _reserved_low_addr; char* _reserved_high_addr; @@ -68,6 +71,7 @@ class PSVirtualSpace : public CHeapObj { // Accessors (all sizes are bytes). size_t alignment() const { return _alignment; } + size_t page_size() const { return _page_size; } char* reserved_low_addr() const { return _reserved_low_addr; } char* reserved_high_addr() const { return _reserved_high_addr; } char* committed_low_addr() const { return _committed_low_addr; } diff --git a/src/hotspot/share/gc/parallel/psYoungGen.cpp b/src/hotspot/share/gc/parallel/psYoungGen.cpp index c26fdf4740c..b2cce11398d 100644 --- a/src/hotspot/share/gc/parallel/psYoungGen.cpp +++ b/src/hotspot/share/gc/parallel/psYoungGen.cpp @@ -83,12 +83,12 @@ void PSYoungGen::initialize_work() { } if (UseNUMA) { - _eden_space = new MutableNUMASpace(virtual_space()->alignment()); + _eden_space = new MutableNUMASpace(virtual_space()->page_size()); } else { - _eden_space = new MutableSpace(virtual_space()->alignment()); + _eden_space = new MutableSpace(virtual_space()->page_size()); } - _from_space = new MutableSpace(virtual_space()->alignment()); - _to_space = new MutableSpace(virtual_space()->alignment()); + _from_space = new MutableSpace(virtual_space()->page_size()); + _to_space = new MutableSpace(virtual_space()->page_size()); // Generation Counters - generation 0, 3 subspaces _gen_counters = new GenerationCounters("new", 0, 3, min_gen_size(), diff --git a/src/hotspot/share/gc/parallel/vmStructs_parallelgc.hpp b/src/hotspot/share/gc/parallel/vmStructs_parallelgc.hpp index fa019aa5b42..f5e7375fca1 100644 --- a/src/hotspot/share/gc/parallel/vmStructs_parallelgc.hpp +++ b/src/hotspot/share/gc/parallel/vmStructs_parallelgc.hpp @@ -40,6 +40,7 @@ /* Parallel GC fields */ \ /**********************/ \ nonstatic_field(PSVirtualSpace, _alignment, const size_t) \ + nonstatic_field(PSVirtualSpace, _page_size, const size_t) \ nonstatic_field(PSVirtualSpace, _reserved_low_addr, char*) \ nonstatic_field(PSVirtualSpace, _reserved_high_addr, char*) \ nonstatic_field(PSVirtualSpace, _committed_low_addr, char*) \ diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp index 424e43c5e83..756619bff33 100644 --- a/src/hotspot/share/memory/universe.cpp +++ b/src/hotspot/share/memory/universe.cpp @@ -955,7 +955,7 @@ void Universe::initialize_tlab() { } } -ReservedHeapSpace Universe::reserve_heap(size_t heap_size, size_t alignment) { +ReservedHeapSpace Universe::reserve_heap(size_t heap_size, size_t alignment, size_t desired_page_size) { assert(alignment <= Arguments::conservative_max_heap_alignment(), "actual alignment %zu must be within maximum heap alignment %zu", @@ -966,15 +966,21 @@ ReservedHeapSpace Universe::reserve_heap(size_t heap_size, size_t alignment) { assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())), "heap size is too big for compressed oops"); - size_t page_size = os::vm_page_size(); - if (UseLargePages && is_aligned(alignment, os::large_page_size())) { - page_size = os::large_page_size(); + size_t page_size; + if (desired_page_size == 0) { + if (UseLargePages) { + page_size = os::large_page_size(); + } else { + page_size = os::vm_page_size(); + } } else { // Parallel is the only collector that might opt out of using large pages // for the heap. - assert(!UseLargePages || UseParallelGC , "Wrong alignment to use large pages"); + assert(UseParallelGC , "only Parallel"); + // Use caller provided value. + page_size = desired_page_size; } - + assert(is_aligned(heap_size, page_size), "inv"); // Now create the space. ReservedHeapSpace rhs = HeapReserver::reserve(total_reserved, alignment, page_size, AllocateHeapAt); diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp index 3b1f2523ed8..37ca965062e 100644 --- a/src/hotspot/share/memory/universe.hpp +++ b/src/hotspot/share/memory/universe.hpp @@ -315,7 +315,7 @@ class Universe: AllStatic { DEBUG_ONLY(static bool is_in_heap_or_null(const void* p) { return p == nullptr || is_in_heap(p); }) // Reserve Java heap and determine CompressedOops mode - static ReservedHeapSpace reserve_heap(size_t heap_size, size_t alignment); + static ReservedHeapSpace reserve_heap(size_t heap_size, size_t alignment, size_t desired_page_size = 0); // Global OopStorages static OopStorage* vm_weak(); From a0c41244325c3d14873e494e79f6c4e38c8e541a Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 21 Oct 2025 09:01:27 +0000 Subject: [PATCH 227/561] 8370078: Remove unnecessary argument in ContiguousSpace::initialize Reviewed-by: fandreuzzi, jsikstro --- src/hotspot/share/gc/epsilon/epsilonHeap.cpp | 2 +- src/hotspot/share/gc/serial/defNewGeneration.cpp | 8 ++++---- src/hotspot/share/gc/serial/tenuredGeneration.cpp | 2 +- src/hotspot/share/gc/shared/space.cpp | 5 ++--- src/hotspot/share/gc/shared/space.hpp | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp index 16cae714cb9..f3d411e34ba 100644 --- a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp +++ b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp @@ -52,7 +52,7 @@ jint EpsilonHeap::initialize() { initialize_reserved_region(heap_rs); _space = new ContiguousSpace(); - _space->initialize(committed_region, /* clear_space = */ true, /* mangle_space = */ true); + _space->initialize(committed_region, /* clear_space = */ true); // Precompute hot fields _max_tlab_size = MIN2(CollectedHeap::max_tlab_size(), align_object_size(EpsilonMaxTLABSize / HeapWordSize)); diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index aef896182c0..413d80bebf4 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -297,9 +297,9 @@ void DefNewGeneration::init_spaces() { MemRegion edenMR((HeapWord*)eden_start, (HeapWord*)eden_end); // Reset the spaces for their new regions. - from()->initialize(fromMR, from()->is_empty(), SpaceDecorator::Mangle); - to()->initialize(toMR, true, SpaceDecorator::Mangle); - eden()->initialize(edenMR, true, SpaceDecorator::Mangle); + from()->initialize(fromMR, from()->is_empty()); + to()->initialize(toMR, true); + eden()->initialize(edenMR, true); post_resize(); } @@ -340,7 +340,7 @@ void DefNewGeneration::expand_eden_by(size_t delta_bytes) { } MemRegion eden_mr{eden()->bottom(), (HeapWord*)_virtual_space.high()}; - eden()->initialize(eden_mr, eden()->is_empty(), SpaceDecorator::Mangle); + eden()->initialize(eden_mr, eden()->is_empty()); post_resize(); } diff --git a/src/hotspot/share/gc/serial/tenuredGeneration.cpp b/src/hotspot/share/gc/serial/tenuredGeneration.cpp index a28a8c8e1cb..f68847ed1a6 100644 --- a/src/hotspot/share/gc/serial/tenuredGeneration.cpp +++ b/src/hotspot/share/gc/serial/tenuredGeneration.cpp @@ -314,7 +314,7 @@ TenuredGeneration::TenuredGeneration(ReservedSpace rs, HeapWord* bottom = (HeapWord*) _virtual_space.low(); HeapWord* end = (HeapWord*) _virtual_space.high(); _the_space = new ContiguousSpace(); - _the_space->initialize(MemRegion(bottom, end), SpaceDecorator::Clear, SpaceDecorator::Mangle); + _the_space->initialize(MemRegion(bottom, end), SpaceDecorator::Clear); // If we don't shrink the heap in steps, '_shrink_factor' is always 100%. _shrink_factor = ShrinkHeapInSteps ? 0 : 100; _capacity_at_prologue = 0; diff --git a/src/hotspot/share/gc/shared/space.cpp b/src/hotspot/share/gc/shared/space.cpp index 1d15fbc3fa9..011a0f5cfd8 100644 --- a/src/hotspot/share/gc/shared/space.cpp +++ b/src/hotspot/share/gc/shared/space.cpp @@ -44,8 +44,7 @@ ContiguousSpace::ContiguousSpace(): _top(nullptr) {} void ContiguousSpace::initialize(MemRegion mr, - bool clear_space, - bool mangle_space) { + bool clear_space) { HeapWord* bottom = mr.start(); HeapWord* end = mr.end(); assert(Universe::on_page_boundary(bottom) && Universe::on_page_boundary(end), @@ -55,7 +54,7 @@ void ContiguousSpace::initialize(MemRegion mr, if (clear_space) { clear(SpaceDecorator::DontMangle); } - if (ZapUnusedHeapArea && mangle_space) { + if (ZapUnusedHeapArea) { mangle_unused_area(); } } diff --git a/src/hotspot/share/gc/shared/space.hpp b/src/hotspot/share/gc/shared/space.hpp index 75dd3f998d6..7f2887275b3 100644 --- a/src/hotspot/share/gc/shared/space.hpp +++ b/src/hotspot/share/gc/shared/space.hpp @@ -101,7 +101,7 @@ public: // any purpose. The "mr" arguments gives the bounds of the space, and // the "clear_space" argument should be true unless the memory in "mr" is // known to be zeroed. - void initialize(MemRegion mr, bool clear_space, bool mangle_space); + void initialize(MemRegion mr, bool clear_space); // The "clear" method must be called on a region that may have // had allocation performed in it, but is now to be considered empty. From ea7186a87f990346fe6af6d4a36989d87e6f98d1 Mon Sep 17 00:00:00 2001 From: Gennadiy Krivoshein Date: Tue, 21 Oct 2025 10:33:19 +0000 Subject: [PATCH 228/561] 8020207: jconsole fails connecting over SSL using service:jmx:rmi://...jndi... Reviewed-by: kevinw --- .../sun/tools/jconsole/ProxyClient.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ProxyClient.java b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ProxyClient.java index ec2290421a4..0ff2d0e3665 100644 --- a/src/jdk.jconsole/share/classes/sun/tools/jconsole/ProxyClient.java +++ b/src/jdk.jconsole/share/classes/sun/tools/jconsole/ProxyClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -34,6 +34,7 @@ import java.lang.management.*; import static java.lang.management.ManagementFactory.*; import java.lang.ref.WeakReference; import java.lang.reflect.*; +import java.net.URI; import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; @@ -133,7 +134,24 @@ public class ProxyClient implements JConsoleContext { this.advancedUrl = url; this.connectionName = getConnectionName(url, userName); this.displayName = connectionName; - setParameters(new JMXServiceURL(url), userName, password); + JMXServiceURL jmxServiceURL = new JMXServiceURL(url); + setParameters(jmxServiceURL, userName, password); + if ("rmi".equals(jmxServiceURL.getProtocol())) { + String path = jmxServiceURL.getURLPath(); + if (path.startsWith("/jndi/")) { + int end = path.indexOf(';'); + if (end < 0) end = path.length(); + String registryURIStr = path.substring(6, end); + URI registryURI = URI.create(registryURIStr); + if ("rmi".equals(registryURI.getScheme()) + && "/jmxrmi".equals(registryURI.getPath())) { + this.registryHostName = registryURI.getHost(); + this.registryPort = registryURI.getPort(); + this.vmConnector = true; + checkSslConfig(); + } + } + } } private ProxyClient(LocalVirtualMachine lvm) throws IOException { From d4c023974685148844401688327b2de18b82a994 Mon Sep 17 00:00:00 2001 From: David Briemann Date: Tue, 21 Oct 2025 12:54:59 +0000 Subject: [PATCH 229/561] 8370240: [PPC64] jhsdb jstack cannot handle continuation stub Reviewed-by: mdoerr, rrich --- .../jvm/hotspot/runtime/ppc64/PPC64Frame.java | 17 ++++++++++++++++- .../sa/TestJhsdbJstackWithVirtualThread.java | 1 - 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java index f4ce5337e2f..cae034c9613 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java @@ -258,7 +258,13 @@ public class PPC64Frame extends Frame { } if (cb != null) { - return cb.isUpcallStub() ? senderForUpcallStub(map, (UpcallStub)cb) : senderForCompiledFrame(map, cb); + if (cb.isUpcallStub()) { + return senderForUpcallStub(map, (UpcallStub)cb); + } else if (cb.isContinuationStub()) { + return senderForContinuationStub(map, cb); + } else { + return senderForCompiledFrame(map, cb); + } } // Must be native-compiled frame, i.e. the marshaling code for native @@ -331,6 +337,15 @@ public class PPC64Frame extends Frame { return new PPC64Frame(sp, unextendedSP, getLink(), getSenderPC()); } + private Frame senderForContinuationStub(PPC64RegisterMap map, CodeBlob cb) { + var contEntry = map.getThread().getContEntry(); + + Address sp = contEntry.getEntrySP(); + Address pc = contEntry.getEntryPC(); + Address fp = contEntry.getEntryFP(); + + return new PPC64Frame(sp, fp, pc); + } private Frame senderForCompiledFrame(PPC64RegisterMap map, CodeBlob cb) { if (DEBUG) { diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java index acea00a190b..6d7921c7ed8 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java @@ -37,7 +37,6 @@ import jdk.test.lib.process.OutputAnalyzer; * @test * @bug 8369505 * @requires vm.hasSA - * @requires (os.arch == "amd64" | os.arch == "x86_64" | os.arch == "aarch64" | os.arch == "riscv64") * @library /test/lib * @run driver TestJhsdbJstackWithVirtualThread */ From 517d54373fcabf4ef2c1d189b0c703a21be8eaf6 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 21 Oct 2025 13:01:50 +0000 Subject: [PATCH 230/561] 8370234: Remove CardTableBarrierSet::write_region Reviewed-by: tschatzl, fandreuzzi --- src/hotspot/share/gc/g1/g1BarrierSet.cpp | 2 +- src/hotspot/share/gc/g1/g1BarrierSet.hpp | 3 +-- src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp | 4 ---- src/hotspot/share/gc/shared/cardTableBarrierSet.hpp | 4 ---- src/hotspot/share/gc/shared/modRefBarrierSet.hpp | 2 -- 5 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.cpp b/src/hotspot/share/gc/g1/g1BarrierSet.cpp index ab7d6febf4c..622651ce0d8 100644 --- a/src/hotspot/share/gc/g1/g1BarrierSet.cpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.cpp @@ -111,7 +111,7 @@ void G1BarrierSet::write_ref_array_pre(narrowOop* dst, size_t count, bool dest_u } } -void G1BarrierSet::write_region(JavaThread* thread, MemRegion mr) { +void G1BarrierSet::write_region(MemRegion mr) { if (mr.is_empty()) { return; } diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.hpp b/src/hotspot/share/gc/g1/g1BarrierSet.hpp index 1e5c111a652..58a70ed6a60 100644 --- a/src/hotspot/share/gc/g1/g1BarrierSet.hpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.hpp @@ -99,8 +99,7 @@ class G1BarrierSet: public CardTableBarrierSet { template void write_ref_field_pre(T* field); - inline void write_region(MemRegion mr); - void write_region(JavaThread* thread, MemRegion mr); + virtual void write_region(MemRegion mr); template void write_ref_field_post(T* field); diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp b/src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp index 0888fc58937..ffba561f11f 100644 --- a/src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp +++ b/src/hotspot/share/gc/g1/g1BarrierSet.inline.hpp @@ -68,10 +68,6 @@ inline void G1BarrierSet::write_ref_field_pre(T* field) { enqueue(field); } -inline void G1BarrierSet::write_region(MemRegion mr) { - write_region(JavaThread::current(), mr); -} - template inline void G1BarrierSet::write_ref_field_post(T* field) { volatile CardValue* byte = _card_table->byte_for(field); diff --git a/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp b/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp index e97da234d16..a5646c303f3 100644 --- a/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp +++ b/src/hotspot/share/gc/shared/cardTableBarrierSet.hpp @@ -61,10 +61,6 @@ public: CardTable* card_table() const { return _card_table; } - void write_region(JavaThread* thread, MemRegion mr) { - write_region(mr); - } - // Record a reference update. Note that these versions are precise! // The scanning code has to handle the fact that the write barrier may be // either precise or imprecise. We make non-virtual inline variants of diff --git a/src/hotspot/share/gc/shared/modRefBarrierSet.hpp b/src/hotspot/share/gc/shared/modRefBarrierSet.hpp index 15ac7971118..c078d151233 100644 --- a/src/hotspot/share/gc/shared/modRefBarrierSet.hpp +++ b/src/hotspot/share/gc/shared/modRefBarrierSet.hpp @@ -53,8 +53,6 @@ public: // Causes all refs in "mr" to be assumed to be modified (by this JavaThread). virtual void write_region(MemRegion mr) = 0; - // Causes all refs in "mr" to be assumed to be modified by the given JavaThread. - virtual void write_region(JavaThread* thread, MemRegion mr) = 0; // Operations on arrays, or general regions (e.g., for "clone") may be // optimized by some barriers. From 2af4d20abfda4113a2bfcf34dfad87187c0f584d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Lund=C3=A9n?= Date: Tue, 21 Oct 2025 13:17:14 +0000 Subject: [PATCH 231/561] 8370031: Make RegMask copy constructor explicit and replace RegMask operator= with named function Reviewed-by: mhaessig, rcastanedalo --- src/hotspot/cpu/aarch64/aarch64.ad | 30 ++-- src/hotspot/cpu/arm/arm.ad | 16 +- src/hotspot/cpu/ppc/ppc.ad | 16 +- src/hotspot/cpu/riscv/riscv.ad | 30 ++-- src/hotspot/cpu/s390/s390.ad | 8 +- src/hotspot/cpu/x86/x86_64.ad | 42 +++--- src/hotspot/share/opto/chaitin.hpp | 2 +- src/hotspot/share/opto/divnode.cpp | 16 +- src/hotspot/share/opto/ifg.cpp | 4 +- src/hotspot/share/opto/matcher.cpp | 179 ++++++++++++----------- src/hotspot/share/opto/matcher.hpp | 8 +- src/hotspot/share/opto/postaloc.cpp | 2 +- src/hotspot/share/opto/regmask.hpp | 82 +++++------ test/hotspot/gtest/opto/test_regmask.cpp | 8 +- 14 files changed, 221 insertions(+), 222 deletions(-) diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 0cdf3c1b8b5..5734519301e 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -1266,20 +1266,20 @@ source %{ // adlc register classes to make AArch64 rheapbase (r27) and rfp (r29) // registers conditionally reserved. - _ANY_REG32_mask = _ALL_REG32_mask; + _ANY_REG32_mask.assignFrom(_ALL_REG32_mask); _ANY_REG32_mask.remove(OptoReg::as_OptoReg(r31_sp->as_VMReg())); - _ANY_REG_mask = _ALL_REG_mask; + _ANY_REG_mask.assignFrom(_ALL_REG_mask); - _PTR_REG_mask = _ALL_REG_mask; + _PTR_REG_mask.assignFrom(_ALL_REG_mask); - _NO_SPECIAL_REG32_mask = _ALL_REG32_mask; + _NO_SPECIAL_REG32_mask.assignFrom(_ALL_REG32_mask); _NO_SPECIAL_REG32_mask.subtract(_NON_ALLOCATABLE_REG32_mask); - _NO_SPECIAL_REG_mask = _ALL_REG_mask; + _NO_SPECIAL_REG_mask.assignFrom(_ALL_REG_mask); _NO_SPECIAL_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); - _NO_SPECIAL_PTR_REG_mask = _ALL_REG_mask; + _NO_SPECIAL_PTR_REG_mask.assignFrom(_ALL_REG_mask); _NO_SPECIAL_PTR_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); // r27 is not allocatable when compressed oops is on and heapbase is not @@ -1297,7 +1297,7 @@ source %{ _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); } - _NO_SPECIAL_NO_RFP_PTR_REG_mask = _NO_SPECIAL_PTR_REG_mask; + _NO_SPECIAL_NO_RFP_PTR_REG_mask.assignFrom(_NO_SPECIAL_PTR_REG_mask); _NO_SPECIAL_NO_RFP_PTR_REG_mask.remove(OptoReg::as_OptoReg(r29->as_VMReg())); } @@ -2545,27 +2545,27 @@ bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { return false; } -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODI projection of divmodI. -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for DIVL projection of divmodL. -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODL projection of divmodL. -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } bool size_fits_all_mem_uses(AddPNode* addp, int shift) { diff --git a/src/hotspot/cpu/arm/arm.ad b/src/hotspot/cpu/arm/arm.ad index 68fece5263d..31a442be624 100644 --- a/src/hotspot/cpu/arm/arm.ad +++ b/src/hotspot/cpu/arm/arm.ad @@ -1131,27 +1131,27 @@ bool Matcher::use_asm_for_ldiv_by_con( jlong divisor ) { } // Register for DIVI projection of divmodI -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODI projection of divmodI -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for DIVL projection of divmodL -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODL projection of divmodL -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } bool maybe_far_call(const CallNode *n) { diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 2c83b2d5765..03dbd0e780b 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -2450,27 +2450,27 @@ bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { } // Register for DIVI projection of divmodI. -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODI projection of divmodI. -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for DIVL projection of divmodL. -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODL projection of divmodL. -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } %} diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 00364d7dab7..83c59af9113 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1092,22 +1092,22 @@ RegMask _NO_SPECIAL_NO_FP_PTR_REG_mask; void reg_mask_init() { - _ANY_REG32_mask = _ALL_REG32_mask; + _ANY_REG32_mask.assignFrom(_ALL_REG32_mask); _ANY_REG32_mask.remove(OptoReg::as_OptoReg(x0->as_VMReg())); - _ANY_REG_mask = _ALL_REG_mask; + _ANY_REG_mask.assignFrom(_ALL_REG_mask); _ANY_REG_mask.subtract(_ZR_REG_mask); - _PTR_REG_mask = _ALL_REG_mask; + _PTR_REG_mask.assignFrom(_ALL_REG_mask); _PTR_REG_mask.subtract(_ZR_REG_mask); - _NO_SPECIAL_REG32_mask = _ALL_REG32_mask; + _NO_SPECIAL_REG32_mask.assignFrom(_ALL_REG32_mask); _NO_SPECIAL_REG32_mask.subtract(_NON_ALLOCATABLE_REG32_mask); - _NO_SPECIAL_REG_mask = _ALL_REG_mask; + _NO_SPECIAL_REG_mask.assignFrom(_ALL_REG_mask); _NO_SPECIAL_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); - _NO_SPECIAL_PTR_REG_mask = _ALL_REG_mask; + _NO_SPECIAL_PTR_REG_mask.assignFrom(_ALL_REG_mask); _NO_SPECIAL_PTR_REG_mask.subtract(_NON_ALLOCATABLE_REG_mask); // x27 is not allocatable when compressed oops is on @@ -1124,7 +1124,7 @@ void reg_mask_init() { _NO_SPECIAL_PTR_REG_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); } - _NO_SPECIAL_NO_FP_PTR_REG_mask = _NO_SPECIAL_PTR_REG_mask; + _NO_SPECIAL_NO_FP_PTR_REG_mask.assignFrom(_NO_SPECIAL_PTR_REG_mask); _NO_SPECIAL_NO_FP_PTR_REG_mask.remove(OptoReg::as_OptoReg(x8->as_VMReg())); } @@ -2129,27 +2129,27 @@ bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { return false; } -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODI projection of divmodI. -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for DIVL projection of divmodL. -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } // Register for MODL projection of divmodL. -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { ShouldNotReachHere(); - return RegMask(); + return RegMask::EMPTY; } bool size_fits_all_mem_uses(AddPNode* addp, int shift) { diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index cfc8b19534b..ab991896b53 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -1961,22 +1961,22 @@ bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { } // Register for DIVI projection of divmodI -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { return _Z_RARG4_INT_REG_mask; } // Register for MODI projection of divmodI -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { return _Z_RARG3_INT_REG_mask; } // Register for DIVL projection of divmodL -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { return _Z_RARG4_LONG_REG_mask; } // Register for MODL projection of divmodL -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { return _Z_RARG3_LONG_REG_mask; } diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad index 27daa51b39e..62306b562d6 100644 --- a/src/hotspot/cpu/x86/x86_64.ad +++ b/src/hotspot/cpu/x86/x86_64.ad @@ -497,7 +497,7 @@ void reg_mask_init() { // _ALL_REG_mask is generated by adlc from the all_reg register class below. // We derive a number of subsets from it. - _ANY_REG_mask = _ALL_REG_mask; + _ANY_REG_mask.assignFrom(_ALL_REG_mask); if (PreserveFramePointer) { _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); @@ -508,7 +508,7 @@ void reg_mask_init() { _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); } - _PTR_REG_mask = _ANY_REG_mask; + _PTR_REG_mask.assignFrom(_ANY_REG_mask); _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg())); _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg())); @@ -520,43 +520,43 @@ void reg_mask_init() { } } - _STACK_OR_PTR_REG_mask = _PTR_REG_mask; + _STACK_OR_PTR_REG_mask.assignFrom(_PTR_REG_mask); _STACK_OR_PTR_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - _PTR_REG_NO_RBP_mask = _PTR_REG_mask; + _PTR_REG_NO_RBP_mask.assignFrom(_PTR_REG_mask); _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); - _PTR_NO_RAX_REG_mask = _PTR_REG_mask; + _PTR_NO_RAX_REG_mask.assignFrom(_PTR_REG_mask); _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); - _PTR_NO_RAX_RBX_REG_mask = _PTR_NO_RAX_REG_mask; + _PTR_NO_RAX_RBX_REG_mask.assignFrom(_PTR_NO_RAX_REG_mask); _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg())); _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); - _LONG_REG_mask = _PTR_REG_mask; - _STACK_OR_LONG_REG_mask = _LONG_REG_mask; + _LONG_REG_mask.assignFrom(_PTR_REG_mask); + _STACK_OR_LONG_REG_mask.assignFrom(_LONG_REG_mask); _STACK_OR_LONG_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - _LONG_NO_RAX_RDX_REG_mask = _LONG_REG_mask; + _LONG_NO_RAX_RDX_REG_mask.assignFrom(_LONG_REG_mask); _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); - _LONG_NO_RCX_REG_mask = _LONG_REG_mask; + _LONG_NO_RCX_REG_mask.assignFrom(_LONG_REG_mask); _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); - _LONG_NO_RBP_R13_REG_mask = _LONG_REG_mask; + _LONG_NO_RBP_R13_REG_mask.assignFrom(_LONG_REG_mask); _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); - _INT_REG_mask = _ALL_INT_REG_mask; + _INT_REG_mask.assignFrom(_ALL_INT_REG_mask); if (!UseAPX) { for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { _INT_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); @@ -570,23 +570,23 @@ void reg_mask_init() { _INT_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); } - _STACK_OR_INT_REG_mask = _INT_REG_mask; + _STACK_OR_INT_REG_mask.assignFrom(_INT_REG_mask); _STACK_OR_INT_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - _INT_NO_RAX_RDX_REG_mask = _INT_REG_mask; + _INT_NO_RAX_RDX_REG_mask.assignFrom(_INT_REG_mask); _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); - _INT_NO_RCX_REG_mask = _INT_REG_mask; + _INT_NO_RCX_REG_mask.assignFrom(_INT_REG_mask); _INT_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); - _INT_NO_RBP_R13_REG_mask = _INT_REG_mask; + _INT_NO_RBP_R13_REG_mask.assignFrom(_INT_REG_mask); _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); // _FLOAT_REG_LEGACY_mask/_FLOAT_REG_EVEX_mask is generated by adlc // from the float_reg_legacy/float_reg_evex register class. - _FLOAT_REG_mask = VM_Version::supports_evex() ? _FLOAT_REG_EVEX_mask : _FLOAT_REG_LEGACY_mask; + _FLOAT_REG_mask.assignFrom(VM_Version::supports_evex() ? _FLOAT_REG_EVEX_mask : _FLOAT_REG_LEGACY_mask); } static bool generate_vzeroupper(Compile* C) { @@ -1678,22 +1678,22 @@ bool Matcher::use_asm_for_ldiv_by_con( jlong divisor ) { } // Register for DIVI projection of divmodI -RegMask Matcher::divI_proj_mask() { +const RegMask& Matcher::divI_proj_mask() { return INT_RAX_REG_mask(); } // Register for MODI projection of divmodI -RegMask Matcher::modI_proj_mask() { +const RegMask& Matcher::modI_proj_mask() { return INT_RDX_REG_mask(); } // Register for DIVL projection of divmodL -RegMask Matcher::divL_proj_mask() { +const RegMask& Matcher::divL_proj_mask() { return LONG_RAX_REG_mask(); } // Register for MODL projection of divmodL -RegMask Matcher::modL_proj_mask() { +const RegMask& Matcher::modL_proj_mask() { return LONG_RDX_REG_mask(); } diff --git a/src/hotspot/share/opto/chaitin.hpp b/src/hotspot/share/opto/chaitin.hpp index 22cc4259c6f..b477c54fcae 100644 --- a/src/hotspot/share/opto/chaitin.hpp +++ b/src/hotspot/share/opto/chaitin.hpp @@ -128,7 +128,7 @@ public: // count of bits in the current mask. int get_invalid_mask_size() const { return _mask_size; } const RegMask &mask() const { return _mask; } - void set_mask( const RegMask &rm ) { _mask = rm; DEBUG_ONLY(_msize_valid=0;)} + void set_mask(const RegMask& rm) { _mask.assignFrom(rm); DEBUG_ONLY(_msize_valid = 0;) } void init_mask(Arena* arena) { new (&_mask) RegMask(arena); } void and_with( const RegMask &rm ) { _mask.and_with(rm); DEBUG_ONLY(_msize_valid=0;)} void subtract( const RegMask &rm ) { _mask.subtract(rm); DEBUG_ONLY(_msize_valid=0;)} diff --git a/src/hotspot/share/opto/divnode.cpp b/src/hotspot/share/opto/divnode.cpp index 823745ea8e7..06ba1856941 100644 --- a/src/hotspot/share/opto/divnode.cpp +++ b/src/hotspot/share/opto/divnode.cpp @@ -1668,10 +1668,10 @@ Node *DivModINode::match( const ProjNode *proj, const Matcher *match ) { uint ideal_reg = proj->ideal_reg(); RegMask rm; if (proj->_con == div_proj_num) { - rm = match->divI_proj_mask(); + rm.assignFrom(match->divI_proj_mask()); } else { assert(proj->_con == mod_proj_num, "must be div or mod projection"); - rm = match->modI_proj_mask(); + rm.assignFrom(match->modI_proj_mask()); } return new MachProjNode(this, proj->_con, rm, ideal_reg); } @@ -1683,10 +1683,10 @@ Node *DivModLNode::match( const ProjNode *proj, const Matcher *match ) { uint ideal_reg = proj->ideal_reg(); RegMask rm; if (proj->_con == div_proj_num) { - rm = match->divL_proj_mask(); + rm.assignFrom(match->divL_proj_mask()); } else { assert(proj->_con == mod_proj_num, "must be div or mod projection"); - rm = match->modL_proj_mask(); + rm.assignFrom(match->modL_proj_mask()); } return new MachProjNode(this, proj->_con, rm, ideal_reg); } @@ -1721,10 +1721,10 @@ Node* UDivModINode::match( const ProjNode *proj, const Matcher *match ) { uint ideal_reg = proj->ideal_reg(); RegMask rm; if (proj->_con == div_proj_num) { - rm = match->divI_proj_mask(); + rm.assignFrom(match->divI_proj_mask()); } else { assert(proj->_con == mod_proj_num, "must be div or mod projection"); - rm = match->modI_proj_mask(); + rm.assignFrom(match->modI_proj_mask()); } return new MachProjNode(this, proj->_con, rm, ideal_reg); } @@ -1736,10 +1736,10 @@ Node* UDivModLNode::match( const ProjNode *proj, const Matcher *match ) { uint ideal_reg = proj->ideal_reg(); RegMask rm; if (proj->_con == div_proj_num) { - rm = match->divL_proj_mask(); + rm.assignFrom(match->divL_proj_mask()); } else { assert(proj->_con == mod_proj_num, "must be div or mod projection"); - rm = match->modL_proj_mask(); + rm.assignFrom(match->modL_proj_mask()); } return new MachProjNode(this, proj->_con, rm, ideal_reg); } diff --git a/src/hotspot/share/opto/ifg.cpp b/src/hotspot/share/opto/ifg.cpp index 681d2f28cb1..1480e806f76 100644 --- a/src/hotspot/share/opto/ifg.cpp +++ b/src/hotspot/share/opto/ifg.cpp @@ -729,7 +729,7 @@ void PhaseChaitin::remove_bound_register_from_interfering_live_ranges(LRG& lrg, } // Remove bound register(s) from 'l's choices - old = interfering_lrg.mask(); + old.assignFrom(interfering_lrg.mask()); uint old_size = interfering_lrg.mask_size(); // Remove the bits from LRG 'mask' from LRG 'l' so 'l' no @@ -738,7 +738,7 @@ void PhaseChaitin::remove_bound_register_from_interfering_live_ranges(LRG& lrg, assert(!interfering_lrg._is_vector || !interfering_lrg._fat_proj, "sanity"); if (interfering_lrg.num_regs() > 1 && !interfering_lrg._fat_proj) { - r2mask = mask; + r2mask.assignFrom(mask); // Leave only aligned set of bits. r2mask.smear_to_sets(interfering_lrg.num_regs()); // It includes vector case. diff --git a/src/hotspot/share/opto/matcher.cpp b/src/hotspot/share/opto/matcher.cpp index 7621fc1bb3e..c63cefe7ac2 100644 --- a/src/hotspot/share/opto/matcher.cpp +++ b/src/hotspot/share/opto/matcher.cpp @@ -195,7 +195,7 @@ void Matcher::match( ) { OptoRegPair regs = return_value(ireg); // And mask for same - _return_value_mask = RegMask(regs.first()); + _return_value_mask.assignFrom(RegMask(regs.first())); if( OptoReg::is_valid(regs.second()) ) _return_value_mask.insert(regs.second()); } @@ -422,11 +422,11 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) { new (rms + i) RegMask(Compile::current()->comp_arena()); } // Do all the pre-defined register masks - rms[TypeFunc::Control ] = RegMask::EMPTY; - rms[TypeFunc::I_O ] = RegMask::EMPTY; - rms[TypeFunc::Memory ] = RegMask::EMPTY; - rms[TypeFunc::ReturnAdr] = ret_adr; - rms[TypeFunc::FramePtr ] = fp; + rms[TypeFunc::Control ].assignFrom(RegMask::EMPTY); + rms[TypeFunc::I_O ].assignFrom(RegMask::EMPTY); + rms[TypeFunc::Memory ].assignFrom(RegMask::EMPTY); + rms[TypeFunc::ReturnAdr].assignFrom(ret_adr); + rms[TypeFunc::FramePtr ].assignFrom(fp); return rms; } @@ -488,44 +488,44 @@ void Matcher::init_first_stack_mask() { assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); RegMask scalable_stack_mask(aligned_stack_mask, C->comp_arena()); - *idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP]; + idealreg2spillmask[Op_RegP]->assignFrom(*idealreg2regmask[Op_RegP]); #ifdef _LP64 - *idealreg2spillmask[Op_RegN] = *idealreg2regmask[Op_RegN]; - idealreg2spillmask[Op_RegN]->or_with(C->FIRST_STACK_mask()); - idealreg2spillmask[Op_RegP]->or_with(aligned_stack_mask); + idealreg2spillmask[Op_RegN]->assignFrom(*idealreg2regmask[Op_RegN]); + idealreg2spillmask[Op_RegN]->or_with(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegP]->or_with(aligned_stack_mask); #else idealreg2spillmask[Op_RegP]->or_with(C->FIRST_STACK_mask()); #endif - *idealreg2spillmask[Op_RegI] = *idealreg2regmask[Op_RegI]; - idealreg2spillmask[Op_RegI]->or_with(C->FIRST_STACK_mask()); - *idealreg2spillmask[Op_RegL] = *idealreg2regmask[Op_RegL]; - idealreg2spillmask[Op_RegL]->or_with(aligned_stack_mask); - *idealreg2spillmask[Op_RegF] = *idealreg2regmask[Op_RegF]; - idealreg2spillmask[Op_RegF]->or_with(C->FIRST_STACK_mask()); - *idealreg2spillmask[Op_RegD] = *idealreg2regmask[Op_RegD]; - idealreg2spillmask[Op_RegD]->or_with(aligned_stack_mask); + idealreg2spillmask[Op_RegI]->assignFrom(*idealreg2regmask[Op_RegI]); + idealreg2spillmask[Op_RegI]->or_with(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegL]->assignFrom(*idealreg2regmask[Op_RegL]); + idealreg2spillmask[Op_RegL]->or_with(aligned_stack_mask); + idealreg2spillmask[Op_RegF]->assignFrom(*idealreg2regmask[Op_RegF]); + idealreg2spillmask[Op_RegF]->or_with(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_RegD]->assignFrom(*idealreg2regmask[Op_RegD]); + idealreg2spillmask[Op_RegD]->or_with(aligned_stack_mask); if (Matcher::has_predicated_vectors()) { - *idealreg2spillmask[Op_RegVectMask] = *idealreg2regmask[Op_RegVectMask]; - idealreg2spillmask[Op_RegVectMask]->or_with(aligned_stack_mask); + idealreg2spillmask[Op_RegVectMask]->assignFrom(*idealreg2regmask[Op_RegVectMask]); + idealreg2spillmask[Op_RegVectMask]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_RegVectMask] = RegMask::EMPTY; + idealreg2spillmask[Op_RegVectMask]->assignFrom(RegMask::EMPTY); } if (Matcher::vector_size_supported(T_BYTE,4)) { - *idealreg2spillmask[Op_VecS] = *idealreg2regmask[Op_VecS]; - idealreg2spillmask[Op_VecS]->or_with(C->FIRST_STACK_mask()); + idealreg2spillmask[Op_VecS]->assignFrom(*idealreg2regmask[Op_VecS]); + idealreg2spillmask[Op_VecS]->or_with(C->FIRST_STACK_mask()); } else { - *idealreg2spillmask[Op_VecS] = RegMask::EMPTY; + idealreg2spillmask[Op_VecS]->assignFrom(RegMask::EMPTY); } if (Matcher::vector_size_supported(T_FLOAT,2)) { // For VecD we need dual alignment and 8 bytes (2 slots) for spills. // RA guarantees such alignment since it is needed for Double and Long values. - *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD]; - idealreg2spillmask[Op_VecD]->or_with(aligned_stack_mask); + idealreg2spillmask[Op_VecD]->assignFrom(*idealreg2regmask[Op_VecD]); + idealreg2spillmask[Op_VecD]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecD] = RegMask::EMPTY; + idealreg2spillmask[Op_VecD]->assignFrom(RegMask::EMPTY); } if (Matcher::vector_size_supported(T_FLOAT,4)) { @@ -541,12 +541,12 @@ void Matcher::init_first_stack_mask() { aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } - aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX); - assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); - *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX]; - idealreg2spillmask[Op_VecX]->or_with(aligned_stack_mask); + aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX); + assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); + idealreg2spillmask[Op_VecX]->assignFrom(*idealreg2regmask[Op_VecX]); + idealreg2spillmask[Op_VecX]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecX] = RegMask::EMPTY; + idealreg2spillmask[Op_VecX]->assignFrom(RegMask::EMPTY); } if (Matcher::vector_size_supported(T_FLOAT,8)) { @@ -556,12 +556,12 @@ void Matcher::init_first_stack_mask() { aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } - aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY); - assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); - *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY]; - idealreg2spillmask[Op_VecY]->or_with(aligned_stack_mask); + aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY); + assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); + idealreg2spillmask[Op_VecY]->assignFrom(*idealreg2regmask[Op_VecY]); + idealreg2spillmask[Op_VecY]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecY] = RegMask::EMPTY; + idealreg2spillmask[Op_VecY]->assignFrom(RegMask::EMPTY); } if (Matcher::vector_size_supported(T_FLOAT,16)) { @@ -571,12 +571,12 @@ void Matcher::init_first_stack_mask() { aligned_stack_mask.remove(in); in = OptoReg::add(in, -1); } - aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecZ); - assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); - *idealreg2spillmask[Op_VecZ] = *idealreg2regmask[Op_VecZ]; - idealreg2spillmask[Op_VecZ]->or_with(aligned_stack_mask); + aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecZ); + assert(aligned_stack_mask.is_infinite_stack(), "should be infinite stack"); + idealreg2spillmask[Op_VecZ]->assignFrom(*idealreg2regmask[Op_VecZ]); + idealreg2spillmask[Op_VecZ]->or_with(aligned_stack_mask); } else { - *idealreg2spillmask[Op_VecZ] = RegMask::EMPTY; + idealreg2spillmask[Op_VecZ]->assignFrom(RegMask::EMPTY); } if (Matcher::supports_scalable_vector()) { @@ -593,7 +593,7 @@ void Matcher::init_first_stack_mask() { // For RegVectMask scalable_stack_mask.clear_to_sets(scalable_predicate_reg_slots()); assert(scalable_stack_mask.is_infinite_stack(), "should be infinite stack"); - *idealreg2spillmask[Op_RegVectMask] = *idealreg2regmask[Op_RegVectMask]; + idealreg2spillmask[Op_RegVectMask]->assignFrom(*idealreg2regmask[Op_RegVectMask]); idealreg2spillmask[Op_RegVectMask]->or_with(scalable_stack_mask); } @@ -605,12 +605,12 @@ void Matcher::init_first_stack_mask() { } // For VecA - scalable_stack_mask.clear_to_sets(RegMask::SlotsPerVecA); - assert(scalable_stack_mask.is_infinite_stack(), "should be infinite stack"); - *idealreg2spillmask[Op_VecA] = *idealreg2regmask[Op_VecA]; - idealreg2spillmask[Op_VecA]->or_with(scalable_stack_mask); + scalable_stack_mask.clear_to_sets(RegMask::SlotsPerVecA); + assert(scalable_stack_mask.is_infinite_stack(), "should be infinite stack"); + idealreg2spillmask[Op_VecA]->assignFrom(*idealreg2regmask[Op_VecA]); + idealreg2spillmask[Op_VecA]->or_with(scalable_stack_mask); } else { - *idealreg2spillmask[Op_VecA] = RegMask::EMPTY; + idealreg2spillmask[Op_VecA]->assignFrom(RegMask::EMPTY); } if (UseFPUForSpilling) { @@ -639,20 +639,20 @@ void Matcher::init_first_stack_mask() { // Make up debug masks. Any spill slot plus callee-save (SOE) registers. // Caller-save (SOC, AS) registers are assumed to be trashable by the various // inline-cache fixup routines. - *idealreg2debugmask [Op_RegN] = *idealreg2spillmask[Op_RegN]; - *idealreg2debugmask [Op_RegI] = *idealreg2spillmask[Op_RegI]; - *idealreg2debugmask [Op_RegL] = *idealreg2spillmask[Op_RegL]; - *idealreg2debugmask [Op_RegF] = *idealreg2spillmask[Op_RegF]; - *idealreg2debugmask [Op_RegD] = *idealreg2spillmask[Op_RegD]; - *idealreg2debugmask [Op_RegP] = *idealreg2spillmask[Op_RegP]; - *idealreg2debugmask [Op_RegVectMask] = *idealreg2spillmask[Op_RegVectMask]; + idealreg2debugmask[Op_RegN]->assignFrom(*idealreg2spillmask[Op_RegN]); + idealreg2debugmask[Op_RegI]->assignFrom(*idealreg2spillmask[Op_RegI]); + idealreg2debugmask[Op_RegL]->assignFrom(*idealreg2spillmask[Op_RegL]); + idealreg2debugmask[Op_RegF]->assignFrom(*idealreg2spillmask[Op_RegF]); + idealreg2debugmask[Op_RegD]->assignFrom(*idealreg2spillmask[Op_RegD]); + idealreg2debugmask[Op_RegP]->assignFrom(*idealreg2spillmask[Op_RegP]); + idealreg2debugmask[Op_RegVectMask]->assignFrom(*idealreg2spillmask[Op_RegVectMask]); - *idealreg2debugmask [Op_VecA] = *idealreg2spillmask[Op_VecA]; - *idealreg2debugmask [Op_VecS] = *idealreg2spillmask[Op_VecS]; - *idealreg2debugmask [Op_VecD] = *idealreg2spillmask[Op_VecD]; - *idealreg2debugmask [Op_VecX] = *idealreg2spillmask[Op_VecX]; - *idealreg2debugmask [Op_VecY] = *idealreg2spillmask[Op_VecY]; - *idealreg2debugmask [Op_VecZ] = *idealreg2spillmask[Op_VecZ]; + idealreg2debugmask[Op_VecA]->assignFrom(*idealreg2spillmask[Op_VecA]); + idealreg2debugmask[Op_VecS]->assignFrom(*idealreg2spillmask[Op_VecS]); + idealreg2debugmask[Op_VecD]->assignFrom(*idealreg2spillmask[Op_VecD]); + idealreg2debugmask[Op_VecX]->assignFrom(*idealreg2spillmask[Op_VecX]); + idealreg2debugmask[Op_VecY]->assignFrom(*idealreg2spillmask[Op_VecY]); + idealreg2debugmask[Op_VecZ]->assignFrom(*idealreg2spillmask[Op_VecZ]); // Prevent stub compilations from attempting to reference // callee-saved (SOE) registers from debug info @@ -702,8 +702,9 @@ void Matcher::Fixup_Save_On_Entry( ) { RegMask *ret_rms = init_input_masks( ret_edge_cnt + soe_cnt, _return_addr_mask, c_frame_ptr_mask ); // Returns have 0 or 1 returned values depending on call signature. // Return register is specified by return_value in the AD file. - if (ret_edge_cnt > TypeFunc::Parms) - ret_rms[TypeFunc::Parms+0] = _return_value_mask; + if (ret_edge_cnt > TypeFunc::Parms) { + ret_rms[TypeFunc::Parms + 0].assignFrom(_return_value_mask); + } // Input RegMask array shared by all ForwardExceptions uint forw_exc_edge_cnt = TypeFunc::Parms; @@ -715,7 +716,7 @@ void Matcher::Fixup_Save_On_Entry( ) { // Rethrow takes exception oop only, but in the argument 0 slot. OptoReg::Name reg = find_receiver(); if (reg >= 0) { - reth_rms[TypeFunc::Parms] = mreg2regmask[reg]; + reth_rms[TypeFunc::Parms].assignFrom(mreg2regmask[reg]); #ifdef _LP64 // Need two slots for ptrs in 64-bit land reth_rms[TypeFunc::Parms].insert(OptoReg::add(OptoReg::Name(reg), 1)); @@ -737,8 +738,8 @@ void Matcher::Fixup_Save_On_Entry( ) { for( i=1; i < root->req(); i++ ) { MachReturnNode *m = root->in(i)->as_MachReturn(); if( m->ideal_Opcode() == Op_TailCall ) { - tail_call_rms[TypeFunc::Parms+0] = m->MachNode::in_RegMask(TypeFunc::Parms+0); - tail_call_rms[TypeFunc::Parms+1] = m->MachNode::in_RegMask(TypeFunc::Parms+1); + tail_call_rms[TypeFunc::Parms + 0].assignFrom(m->MachNode::in_RegMask(TypeFunc::Parms + 0)); + tail_call_rms[TypeFunc::Parms + 1].assignFrom(m->MachNode::in_RegMask(TypeFunc::Parms + 1)); break; } } @@ -750,8 +751,8 @@ void Matcher::Fixup_Save_On_Entry( ) { for( i=1; i < root->req(); i++ ) { MachReturnNode *m = root->in(i)->as_MachReturn(); if( m->ideal_Opcode() == Op_TailJump ) { - tail_jump_rms[TypeFunc::Parms+0] = m->MachNode::in_RegMask(TypeFunc::Parms+0); - tail_jump_rms[TypeFunc::Parms+1] = m->MachNode::in_RegMask(TypeFunc::Parms+1); + tail_jump_rms[TypeFunc::Parms + 0].assignFrom(m->MachNode::in_RegMask(TypeFunc::Parms + 0)); + tail_jump_rms[TypeFunc::Parms + 1].assignFrom(m->MachNode::in_RegMask(TypeFunc::Parms + 1)); break; } } @@ -784,14 +785,14 @@ void Matcher::Fixup_Save_On_Entry( ) { if( is_save_on_entry(i) ) { // Add the save-on-entry to the mask array - ret_rms [ ret_edge_cnt] = mreg2regmask[i]; - reth_rms [ reth_edge_cnt] = mreg2regmask[i]; - tail_call_rms[tail_call_edge_cnt] = mreg2regmask[i]; - tail_jump_rms[tail_jump_edge_cnt] = mreg2regmask[i]; - forw_exc_rms [ forw_exc_edge_cnt] = mreg2regmask[i]; + ret_rms [ ret_edge_cnt].assignFrom(mreg2regmask[i]); + reth_rms [ reth_edge_cnt].assignFrom(mreg2regmask[i]); + tail_call_rms[tail_call_edge_cnt].assignFrom(mreg2regmask[i]); + tail_jump_rms[tail_jump_edge_cnt].assignFrom(mreg2regmask[i]); + forw_exc_rms [ forw_exc_edge_cnt].assignFrom(mreg2regmask[i]); // Halts need the SOE registers, but only in the stack as debug info. // A just-prior uncommon-trap or deoptimization will use the SOE regs. - halt_rms [ halt_edge_cnt] = *idealreg2spillmask[_register_save_type[i]]; + halt_rms [ halt_edge_cnt].assignFrom(*idealreg2spillmask[_register_save_type[i]]); Node *mproj; @@ -815,12 +816,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i-1] == Op_RegF && _register_save_type[i ] == Op_RegF && is_save_on_entry(i-1) ) { - ret_rms [ ret_edge_cnt] = RegMask::EMPTY; - reth_rms [ reth_edge_cnt] = RegMask::EMPTY; - tail_call_rms[tail_call_edge_cnt] = RegMask::EMPTY; - tail_jump_rms[tail_jump_edge_cnt] = RegMask::EMPTY; - forw_exc_rms [ forw_exc_edge_cnt] = RegMask::EMPTY; - halt_rms [ halt_edge_cnt] = RegMask::EMPTY; + ret_rms [ ret_edge_cnt].assignFrom(RegMask::EMPTY); + reth_rms [ reth_edge_cnt].assignFrom(RegMask::EMPTY); + tail_call_rms[tail_call_edge_cnt].assignFrom(RegMask::EMPTY); + tail_jump_rms[tail_jump_edge_cnt].assignFrom(RegMask::EMPTY); + forw_exc_rms [ forw_exc_edge_cnt].assignFrom(RegMask::EMPTY); + halt_rms [ halt_edge_cnt].assignFrom(RegMask::EMPTY); mproj = C->top(); } // Is this a RegI low half of a RegL? Double up 2 adjacent RegI's @@ -843,12 +844,12 @@ void Matcher::Fixup_Save_On_Entry( ) { _register_save_type[i-1] == Op_RegI && _register_save_type[i ] == Op_RegI && is_save_on_entry(i-1) ) { - ret_rms [ ret_edge_cnt] = RegMask::EMPTY; - reth_rms [ reth_edge_cnt] = RegMask::EMPTY; - tail_call_rms[tail_call_edge_cnt] = RegMask::EMPTY; - tail_jump_rms[tail_jump_edge_cnt] = RegMask::EMPTY; - forw_exc_rms [ forw_exc_edge_cnt] = RegMask::EMPTY; - halt_rms [ halt_edge_cnt] = RegMask::EMPTY; + ret_rms [ ret_edge_cnt].assignFrom(RegMask::EMPTY); + reth_rms [ reth_edge_cnt].assignFrom(RegMask::EMPTY); + tail_call_rms[tail_call_edge_cnt].assignFrom(RegMask::EMPTY); + tail_jump_rms[tail_jump_edge_cnt].assignFrom(RegMask::EMPTY); + forw_exc_rms [ forw_exc_edge_cnt].assignFrom(RegMask::EMPTY); + halt_rms [ halt_edge_cnt].assignFrom(RegMask::EMPTY); mproj = C->top(); } else { // Make a projection for it off the Start @@ -875,7 +876,7 @@ void Matcher::init_spill_mask( Node *ret ) { if( idealreg2regmask[Op_RegI] ) return; // One time only init OptoReg::c_frame_pointer = c_frame_pointer(); - c_frame_ptr_mask = RegMask(c_frame_pointer()); + c_frame_ptr_mask.assignFrom(RegMask(c_frame_pointer())); #ifdef _LP64 // pointers are twice as big c_frame_ptr_mask.insert(OptoReg::add(c_frame_pointer(), 1)); @@ -1240,8 +1241,8 @@ MachNode *Matcher::match_sfpt( SafePointNode *sfpt ) { } // Do all the pre-defined non-Empty register masks - msfpt->_in_rms[TypeFunc::ReturnAdr] = _return_addr_mask; - msfpt->_in_rms[TypeFunc::FramePtr ] = c_frame_ptr_mask; + msfpt->_in_rms[TypeFunc::ReturnAdr].assignFrom(_return_addr_mask); + msfpt->_in_rms[TypeFunc::FramePtr ].assignFrom(c_frame_ptr_mask); // Place first outgoing argument can possibly be put. OptoReg::Name begin_out_arg_area = OptoReg::add(_new_SP, C->out_preserve_stack_slots()); diff --git a/src/hotspot/share/opto/matcher.hpp b/src/hotspot/share/opto/matcher.hpp index 0b609b70ab5..e4396b423ac 100644 --- a/src/hotspot/share/opto/matcher.hpp +++ b/src/hotspot/share/opto/matcher.hpp @@ -408,14 +408,14 @@ public: static int inline_cache_reg_encode(); // Register for DIVI projection of divmodI - static RegMask divI_proj_mask(); + static const RegMask& divI_proj_mask(); // Register for MODI projection of divmodI - static RegMask modI_proj_mask(); + static const RegMask& modI_proj_mask(); // Register for DIVL projection of divmodL - static RegMask divL_proj_mask(); + static const RegMask& divL_proj_mask(); // Register for MODL projection of divmodL - static RegMask modL_proj_mask(); + static const RegMask& modL_proj_mask(); // Use hardware DIV instruction when it is faster than // a code which use multiply for division by constant. diff --git a/src/hotspot/share/opto/postaloc.cpp b/src/hotspot/share/opto/postaloc.cpp index 8eb9167921b..c961340e71a 100644 --- a/src/hotspot/share/opto/postaloc.cpp +++ b/src/hotspot/share/opto/postaloc.cpp @@ -767,7 +767,7 @@ void PhaseChaitin::post_allocate_copy_removal() { if (!is_adjacent) { // Nearly always adjacent // Sparc occasionally has non-adjacent pairs. // Find the actual other value - RegMask tmp = lrgs(lidx).mask(); + RegMask tmp(lrgs(lidx).mask()); tmp.remove(nreg); nreg_lo = tmp.find_first_elem(); } diff --git a/src/hotspot/share/opto/regmask.hpp b/src/hotspot/share/opto/regmask.hpp index 832499d951d..453fbb45d33 100644 --- a/src/hotspot/share/opto/regmask.hpp +++ b/src/hotspot/share/opto/regmask.hpp @@ -299,39 +299,6 @@ class RegMask { } } - // Make us a copy of src - void copy(const RegMask& src) { - assert(_offset == src._offset, "offset mismatch"); - _hwm = src._hwm; - _lwm = src._lwm; - - // Copy base mask - memcpy(_rm_word, src._rm_word, sizeof(uintptr_t) * RM_SIZE_IN_WORDS); - _infinite_stack = src._infinite_stack; - - // Copy extension - if (src._rm_word_ext != nullptr) { - assert(src._rm_size_in_words > RM_SIZE_IN_WORDS, "sanity"); - assert(_original_ext_address == &_rm_word_ext, "clone sanity check"); - grow(src._rm_size_in_words, false); - memcpy(_rm_word_ext, src._rm_word_ext, - sizeof(uintptr_t) * (src._rm_size_in_words - RM_SIZE_IN_WORDS)); - } - - // If the source is smaller than us, we need to set the gap according to - // the sources infinite_stack flag. - if (src._rm_size_in_words < _rm_size_in_words) { - int value = 0; - if (src.is_infinite_stack()) { - value = 0xFF; - _hwm = rm_word_max_index(); - } - set_range(src._rm_size_in_words, value, _rm_size_in_words - src._rm_size_in_words); - } - - assert(valid_watermarks(), "post-condition"); - } - // Make the watermarks as tight as possible. void trim_watermarks() { if (_hwm < _lwm) { @@ -453,21 +420,52 @@ public: } explicit RegMask(OptoReg::Name reg) : RegMask(reg, nullptr) {} - // ---------------------------------------- - // Deep copying constructors and assignment - // ---------------------------------------- + // Make us represent the same set of registers as src. + void assignFrom(const RegMask& src) { + assert(_offset == src._offset, "offset mismatch"); + _hwm = src._hwm; + _lwm = src._lwm; + // Copy base mask + memcpy(_rm_word, src._rm_word, sizeof(uintptr_t) * RM_SIZE_IN_WORDS); + _infinite_stack = src._infinite_stack; + + // Copy extension + if (src._rm_word_ext != nullptr) { + assert(src._rm_size_in_words > RM_SIZE_IN_WORDS, "sanity"); + assert(_original_ext_address == &_rm_word_ext, "clone sanity check"); + grow(src._rm_size_in_words, false); + memcpy(_rm_word_ext, src._rm_word_ext, + sizeof(uintptr_t) * (src._rm_size_in_words - RM_SIZE_IN_WORDS)); + } + + // If the source is smaller than us, we need to set the gap according to + // the sources infinite_stack flag. + if (src._rm_size_in_words < _rm_size_in_words) { + int value = 0; + if (src.is_infinite_stack()) { + value = 0xFF; + _hwm = rm_word_max_index(); + } + set_range(src._rm_size_in_words, value, _rm_size_in_words - src._rm_size_in_words); + } + + assert(valid_watermarks(), "post-condition"); + } + + // Construct from other register mask (deep copy) and register an arena + // for potential register mask extension. Passing nullptr as arena disables + // extension. RegMask(const RegMask& rm, Arena* arena) : _arena(arena), _rm_size_in_words(RM_SIZE_IN_WORDS), _offset(rm._offset) { - copy(rm); + assignFrom(rm); } - RegMask(const RegMask& rm) : RegMask(rm, nullptr) {} + // Copy constructor (deep copy). By default does not allow extension. + explicit RegMask(const RegMask& rm) : RegMask(rm, nullptr) {} - RegMask& operator=(const RegMask& rm) { - copy(rm); - return *this; - } + // Disallow copy assignment (use assignFrom instead) + RegMask& operator=(const RegMask&) = delete; // ---------------- // End deep copying diff --git a/test/hotspot/gtest/opto/test_regmask.cpp b/test/hotspot/gtest/opto/test_regmask.cpp index 55dc020b6d0..f367ca4bef4 100644 --- a/test/hotspot/gtest/opto/test_regmask.cpp +++ b/test/hotspot/gtest/opto/test_regmask.cpp @@ -523,8 +523,8 @@ TEST_VM_ASSERT_MSG(RegMask, offset_mismatch, ".*offset mismatch") { RegMask rm2; rm1.set_infinite_stack(true); rm1.rollover(); - // Cannot copy with different offsets - rm2 = rm1; + // Cannot assign with different offsets + rm2.assignFrom(rm1); } #endif @@ -1241,8 +1241,8 @@ TEST_VM(RegMask, random_copy) { // Randomly initialize source randomize(src); - // Copy source to destination - dst = src; + // Set destination to source + dst.assignFrom(src); // Check equality bool passed = src.gtest_equals(dst); From 0529a58a73a532d06899e145ed284b222fe3f07c Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 21 Oct 2025 13:43:48 +0000 Subject: [PATCH 232/561] 8370326: Parallel: Remove unused ParCompactionManager::push Reviewed-by: fandreuzzi, tschatzl --- src/hotspot/share/gc/parallel/psCompactionManager.hpp | 1 - src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp index b013238a9f8..613361c7039 100644 --- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp +++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp @@ -120,7 +120,6 @@ class ParCompactionManager : public CHeapObj { static RegionTaskQueueSet* region_task_queues() { return _region_task_queues; } inline PSMarkTaskQueue* marking_stack() { return &_marking_stack; } - inline void push(PartialArrayState* stat); void push_objArray(oop obj); // To collect per-region live-words in a worker local cache in order to diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp index 2c0b8480726..75f54caf89e 100644 --- a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp @@ -60,10 +60,6 @@ inline void ParCompactionManager::push(oop obj) { marking_stack()->push(ScannerTask(obj)); } -inline void ParCompactionManager::push(PartialArrayState* stat) { - marking_stack()->push(ScannerTask(stat)); -} - void ParCompactionManager::push_region(size_t index) { #ifdef ASSERT From b77b9103c3e9c911439a999f882475d0d7b77423 Mon Sep 17 00:00:00 2001 From: Sorna Sarathi N Date: Tue, 21 Oct 2025 14:09:33 +0000 Subject: [PATCH 233/561] 8369349: Add missing CPE headers Reviewed-by: asemenyuk --- .../share/classes/jdk/jpackage/internal/util/Result.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Result.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Result.java index 7bd6408183a..8a61acafe77 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Result.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Result.java @@ -4,7 +4,9 @@ * * 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. + * 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 From 9a88d7f468cdd040bdf4e1ff9441dc9c66eab03e Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Tue, 21 Oct 2025 14:27:02 +0000 Subject: [PATCH 234/561] 8369211: AArch64: Devirtualize class RelocActions Reviewed-by: adinn, asmehra --- .../cpu/aarch64/macroAssembler_aarch64.cpp | 189 ++++++++---------- .../cpu/aarch64/macroAssembler_aarch64.hpp | 12 +- 2 files changed, 81 insertions(+), 120 deletions(-) diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index a37edab8578..14009789319 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -148,56 +148,34 @@ extern "C" void disnm(intptr_t p); // strictly should be 64 bit movz #imm16<<0 // 110___10100 (i.e. requires insn[31:21] == 11010010100) // -class RelocActions { -protected: - typedef int (*reloc_insn)(address insn_addr, address &target); - virtual reloc_insn adrpMem() = 0; - virtual reloc_insn adrpAdd() = 0; - virtual reloc_insn adrpMovk() = 0; +static uint32_t insn_at(address insn_addr, int n) { + return ((uint32_t*)insn_addr)[n]; +} - const address _insn_addr; - const uint32_t _insn; - - static uint32_t insn_at(address insn_addr, int n) { - return ((uint32_t*)insn_addr)[n]; - } - uint32_t insn_at(int n) const { - return insn_at(_insn_addr, n); - } +template +class RelocActions : public AllStatic { public: - RelocActions(address insn_addr) : _insn_addr(insn_addr), _insn(insn_at(insn_addr, 0)) {} - RelocActions(address insn_addr, uint32_t insn) - : _insn_addr(insn_addr), _insn(insn) {} - - virtual int unconditionalBranch(address insn_addr, address &target) = 0; - virtual int conditionalBranch(address insn_addr, address &target) = 0; - virtual int testAndBranch(address insn_addr, address &target) = 0; - virtual int loadStore(address insn_addr, address &target) = 0; - virtual int adr(address insn_addr, address &target) = 0; - virtual int adrp(address insn_addr, address &target, reloc_insn inner) = 0; - virtual int immediate(address insn_addr, address &target) = 0; - virtual void verify(address insn_addr, address &target) = 0; - - int ALWAYSINLINE run(address insn_addr, address &target) { + static int ALWAYSINLINE run(address insn_addr, address &target) { int instructions = 1; + uint32_t insn = insn_at(insn_addr, 0); - uint32_t dispatch = Instruction_aarch64::extract(_insn, 30, 25); + uint32_t dispatch = Instruction_aarch64::extract(insn, 30, 25); switch(dispatch) { case 0b001010: case 0b001011: { - instructions = unconditionalBranch(insn_addr, target); + instructions = T::unconditionalBranch(insn_addr, target); break; } case 0b101010: // Conditional branch (immediate) case 0b011010: { // Compare & branch (immediate) - instructions = conditionalBranch(insn_addr, target); - break; + instructions = T::conditionalBranch(insn_addr, target); + break; } case 0b011011: { - instructions = testAndBranch(insn_addr, target); + instructions = T::testAndBranch(insn_addr, target); break; } case 0b001100: @@ -209,9 +187,9 @@ public: case 0b111100: case 0b111110: { // load/store - if ((Instruction_aarch64::extract(_insn, 29, 24) & 0b111011) == 0b011000) { + if ((Instruction_aarch64::extract(insn, 29, 24) & 0b111011) == 0b011000) { // Load register (literal) - instructions = loadStore(insn_addr, target); + instructions = T::loadStore(insn_addr, target); break; } else { // nothing to do @@ -224,27 +202,27 @@ public: case 0b101000: case 0b111000: { // adr/adrp - assert(Instruction_aarch64::extract(_insn, 28, 24) == 0b10000, "must be"); - int shift = Instruction_aarch64::extract(_insn, 31, 31); + assert(Instruction_aarch64::extract(insn, 28, 24) == 0b10000, "must be"); + int shift = Instruction_aarch64::extract(insn, 31, 31); if (shift) { - uint32_t insn2 = insn_at(1); + uint32_t insn2 = insn_at(insn_addr, 1); if (Instruction_aarch64::extract(insn2, 29, 24) == 0b111001 && - Instruction_aarch64::extract(_insn, 4, 0) == + Instruction_aarch64::extract(insn, 4, 0) == Instruction_aarch64::extract(insn2, 9, 5)) { - instructions = adrp(insn_addr, target, adrpMem()); + instructions = T::adrp(insn_addr, target, T::adrpMem); } else if (Instruction_aarch64::extract(insn2, 31, 22) == 0b1001000100 && - Instruction_aarch64::extract(_insn, 4, 0) == + Instruction_aarch64::extract(insn, 4, 0) == Instruction_aarch64::extract(insn2, 4, 0)) { - instructions = adrp(insn_addr, target, adrpAdd()); + instructions = T::adrp(insn_addr, target, T::adrpAdd); } else if (Instruction_aarch64::extract(insn2, 31, 21) == 0b11110010110 && - Instruction_aarch64::extract(_insn, 4, 0) == + Instruction_aarch64::extract(insn, 4, 0) == Instruction_aarch64::extract(insn2, 4, 0)) { - instructions = adrp(insn_addr, target, adrpMovk()); + instructions = T::adrp(insn_addr, target, T::adrpMovk); } else { ShouldNotReachHere(); } } else { - instructions = adr(insn_addr, target); + instructions = T::adr(insn_addr, target); } break; } @@ -252,7 +230,7 @@ public: case 0b011001: case 0b101001: case 0b111001: { - instructions = immediate(insn_addr, target); + instructions = T::immediate(insn_addr, target); break; } default: { @@ -260,42 +238,36 @@ public: } } - verify(insn_addr, target); + T::verify(insn_addr, target); return instructions * NativeInstruction::instruction_size; } }; -class Patcher : public RelocActions { - virtual reloc_insn adrpMem() { return &Patcher::adrpMem_impl; } - virtual reloc_insn adrpAdd() { return &Patcher::adrpAdd_impl; } - virtual reloc_insn adrpMovk() { return &Patcher::adrpMovk_impl; } - +class Patcher : public AllStatic { public: - Patcher(address insn_addr) : RelocActions(insn_addr) {} - - virtual int unconditionalBranch(address insn_addr, address &target) { + static int unconditionalBranch(address insn_addr, address &target) { intptr_t offset = (target - insn_addr) >> 2; Instruction_aarch64::spatch(insn_addr, 25, 0, offset); return 1; } - virtual int conditionalBranch(address insn_addr, address &target) { + static int conditionalBranch(address insn_addr, address &target) { intptr_t offset = (target - insn_addr) >> 2; Instruction_aarch64::spatch(insn_addr, 23, 5, offset); return 1; } - virtual int testAndBranch(address insn_addr, address &target) { + static int testAndBranch(address insn_addr, address &target) { intptr_t offset = (target - insn_addr) >> 2; Instruction_aarch64::spatch(insn_addr, 18, 5, offset); return 1; } - virtual int loadStore(address insn_addr, address &target) { + static int loadStore(address insn_addr, address &target) { intptr_t offset = (target - insn_addr) >> 2; Instruction_aarch64::spatch(insn_addr, 23, 5, offset); return 1; } - virtual int adr(address insn_addr, address &target) { + static int adr(address insn_addr, address &target) { #ifdef ASSERT - assert(Instruction_aarch64::extract(_insn, 28, 24) == 0b10000, "must be"); + assert(Instruction_aarch64::extract(insn_at(insn_addr, 0), 28, 24) == 0b10000, "must be"); #endif // PC-rel. addressing ptrdiff_t offset = target - insn_addr; @@ -305,17 +277,18 @@ public: Instruction_aarch64::patch(insn_addr, 30, 29, offset_lo); return 1; } - virtual int adrp(address insn_addr, address &target, reloc_insn inner) { + template + static int adrp(address insn_addr, address &target, U inner) { int instructions = 1; #ifdef ASSERT - assert(Instruction_aarch64::extract(_insn, 28, 24) == 0b10000, "must be"); + assert(Instruction_aarch64::extract(insn_at(insn_addr, 0), 28, 24) == 0b10000, "must be"); #endif ptrdiff_t offset = target - insn_addr; instructions = 2; precond(inner != nullptr); // Give the inner reloc a chance to modify the target. address adjusted_target = target; - instructions = (*inner)(insn_addr, adjusted_target); + instructions = inner(insn_addr, adjusted_target); uintptr_t pc_page = (uintptr_t)insn_addr >> 12; uintptr_t adr_page = (uintptr_t)adjusted_target >> 12; offset = adr_page - pc_page; @@ -325,7 +298,7 @@ public: Instruction_aarch64::patch(insn_addr, 30, 29, offset_lo); return instructions; } - static int adrpMem_impl(address insn_addr, address &target) { + static int adrpMem(address insn_addr, address &target) { uintptr_t dest = (uintptr_t)target; int offset_lo = dest & 0xfff; uint32_t insn2 = insn_at(insn_addr, 1); @@ -334,21 +307,21 @@ public: guarantee(((dest >> size) << size) == dest, "misaligned target"); return 2; } - static int adrpAdd_impl(address insn_addr, address &target) { + static int adrpAdd(address insn_addr, address &target) { uintptr_t dest = (uintptr_t)target; int offset_lo = dest & 0xfff; Instruction_aarch64::patch(insn_addr + sizeof (uint32_t), 21, 10, offset_lo); return 2; } - static int adrpMovk_impl(address insn_addr, address &target) { + static int adrpMovk(address insn_addr, address &target) { uintptr_t dest = uintptr_t(target); Instruction_aarch64::patch(insn_addr + sizeof (uint32_t), 20, 5, (uintptr_t)target >> 32); dest = (dest & 0xffffffffULL) | (uintptr_t(insn_addr) & 0xffff00000000ULL); target = address(dest); return 2; } - virtual int immediate(address insn_addr, address &target) { - assert(Instruction_aarch64::extract(_insn, 31, 21) == 0b11010010100, "must be"); + static int immediate(address insn_addr, address &target) { + assert(Instruction_aarch64::extract(insn_at(insn_addr, 0), 31, 21) == 0b11010010100, "must be"); uint64_t dest = (uint64_t)target; // Move wide constant assert(nativeInstruction_at(insn_addr+4)->is_movk(), "wrong insns in patch"); @@ -358,7 +331,7 @@ public: Instruction_aarch64::patch(insn_addr+8, 20, 5, (dest >>= 16) & 0xffff); return 3; } - virtual void verify(address insn_addr, address &target) { + static void verify(address insn_addr, address &target) { #ifdef ASSERT address address_is = MacroAssembler::target_addr_for_insn(insn_addr); if (!(address_is == target)) { @@ -392,56 +365,54 @@ static bool offset_for(uint32_t insn1, uint32_t insn2, ptrdiff_t &byte_offset) { return false; } -class AArch64Decoder : public RelocActions { - virtual reloc_insn adrpMem() { return &AArch64Decoder::adrpMem_impl; } - virtual reloc_insn adrpAdd() { return &AArch64Decoder::adrpAdd_impl; } - virtual reloc_insn adrpMovk() { return &AArch64Decoder::adrpMovk_impl; } - +class AArch64Decoder : public AllStatic { public: - AArch64Decoder(address insn_addr, uint32_t insn) : RelocActions(insn_addr, insn) {} - virtual int loadStore(address insn_addr, address &target) { - intptr_t offset = Instruction_aarch64::sextract(_insn, 23, 5); + static int loadStore(address insn_addr, address &target) { + intptr_t offset = Instruction_aarch64::sextract(insn_at(insn_addr, 0), 23, 5); target = insn_addr + (offset << 2); return 1; } - virtual int unconditionalBranch(address insn_addr, address &target) { - intptr_t offset = Instruction_aarch64::sextract(_insn, 25, 0); + static int unconditionalBranch(address insn_addr, address &target) { + intptr_t offset = Instruction_aarch64::sextract(insn_at(insn_addr, 0), 25, 0); target = insn_addr + (offset << 2); return 1; } - virtual int conditionalBranch(address insn_addr, address &target) { - intptr_t offset = Instruction_aarch64::sextract(_insn, 23, 5); + static int conditionalBranch(address insn_addr, address &target) { + intptr_t offset = Instruction_aarch64::sextract(insn_at(insn_addr, 0), 23, 5); target = address(((uint64_t)insn_addr + (offset << 2))); return 1; } - virtual int testAndBranch(address insn_addr, address &target) { - intptr_t offset = Instruction_aarch64::sextract(_insn, 18, 5); + static int testAndBranch(address insn_addr, address &target) { + intptr_t offset = Instruction_aarch64::sextract(insn_at(insn_addr, 0), 18, 5); target = address(((uint64_t)insn_addr + (offset << 2))); return 1; } - virtual int adr(address insn_addr, address &target) { + static int adr(address insn_addr, address &target) { // PC-rel. addressing - intptr_t offset = Instruction_aarch64::extract(_insn, 30, 29); - offset |= Instruction_aarch64::sextract(_insn, 23, 5) << 2; + uint32_t insn = insn_at(insn_addr, 0); + intptr_t offset = Instruction_aarch64::extract(insn, 30, 29); + offset |= Instruction_aarch64::sextract(insn, 23, 5) << 2; target = address((uint64_t)insn_addr + offset); return 1; } - virtual int adrp(address insn_addr, address &target, reloc_insn inner) { - assert(Instruction_aarch64::extract(_insn, 28, 24) == 0b10000, "must be"); - intptr_t offset = Instruction_aarch64::extract(_insn, 30, 29); - offset |= Instruction_aarch64::sextract(_insn, 23, 5) << 2; + template + static int adrp(address insn_addr, address &target, U inner) { + uint32_t insn = insn_at(insn_addr, 0); + assert(Instruction_aarch64::extract(insn, 28, 24) == 0b10000, "must be"); + intptr_t offset = Instruction_aarch64::extract(insn, 30, 29); + offset |= Instruction_aarch64::sextract(insn, 23, 5) << 2; int shift = 12; offset <<= shift; uint64_t target_page = ((uint64_t)insn_addr) + offset; target_page &= ((uint64_t)-1) << shift; - uint32_t insn2 = insn_at(1); + uint32_t insn2 = insn_at(insn_addr, 1); target = address(target_page); precond(inner != nullptr); - (*inner)(insn_addr, target); + inner(insn_addr, target); return 2; } - static int adrpMem_impl(address insn_addr, address &target) { + static int adrpMem(address insn_addr, address &target) { uint32_t insn2 = insn_at(insn_addr, 1); // Load/store register (unsigned immediate) ptrdiff_t byte_offset = Instruction_aarch64::extract(insn2, 21, 10); @@ -450,14 +421,14 @@ public: target += byte_offset; return 2; } - static int adrpAdd_impl(address insn_addr, address &target) { + static int adrpAdd(address insn_addr, address &target) { uint32_t insn2 = insn_at(insn_addr, 1); // add (immediate) ptrdiff_t byte_offset = Instruction_aarch64::extract(insn2, 21, 10); target += byte_offset; return 2; } - static int adrpMovk_impl(address insn_addr, address &target) { + static int adrpMovk(address insn_addr, address &target) { uint32_t insn2 = insn_at(insn_addr, 1); uint64_t dest = uint64_t(target); dest = (dest & 0xffff0000ffffffff) | @@ -476,35 +447,33 @@ public: return 2; } } - virtual int immediate(address insn_addr, address &target) { + static int immediate(address insn_addr, address &target) { uint32_t *insns = (uint32_t *)insn_addr; - assert(Instruction_aarch64::extract(_insn, 31, 21) == 0b11010010100, "must be"); + assert(Instruction_aarch64::extract(insns[0], 31, 21) == 0b11010010100, "must be"); // Move wide constant: movz, movk, movk. See movptr(). assert(nativeInstruction_at(insns+1)->is_movk(), "wrong insns in patch"); assert(nativeInstruction_at(insns+2)->is_movk(), "wrong insns in patch"); - target = address(uint64_t(Instruction_aarch64::extract(_insn, 20, 5)) - + (uint64_t(Instruction_aarch64::extract(insns[1], 20, 5)) << 16) - + (uint64_t(Instruction_aarch64::extract(insns[2], 20, 5)) << 32)); + target = address(uint64_t(Instruction_aarch64::extract(insns[0], 20, 5)) + + (uint64_t(Instruction_aarch64::extract(insns[1], 20, 5)) << 16) + + (uint64_t(Instruction_aarch64::extract(insns[2], 20, 5)) << 32)); assert(nativeInstruction_at(insn_addr+4)->is_movk(), "wrong insns in patch"); assert(nativeInstruction_at(insn_addr+8)->is_movk(), "wrong insns in patch"); return 3; } - virtual void verify(address insn_addr, address &target) { + static void verify(address insn_addr, address &target) { } }; -address MacroAssembler::target_addr_for_insn(address insn_addr, uint32_t insn) { - AArch64Decoder decoder(insn_addr, insn); +address MacroAssembler::target_addr_for_insn(address insn_addr) { address target; - decoder.run(insn_addr, target); + RelocActions::run(insn_addr, target); return target; } // Patch any kind of instruction; there may be several instructions. // Return the total length (in bytes) of the instructions. int MacroAssembler::pd_patch_instruction_size(address insn_addr, address target) { - Patcher patcher(insn_addr); - return patcher.run(insn_addr, target); + return RelocActions::run(insn_addr, target); } int MacroAssembler::patch_oop(address insn_addr, address o) { @@ -546,11 +515,11 @@ int MacroAssembler::patch_narrow_klass(address insn_addr, narrowKlass n) { return 2 * NativeInstruction::instruction_size; } -address MacroAssembler::target_addr_for_insn_or_null(address insn_addr, unsigned insn) { - if (NativeInstruction::is_ldrw_to_zr(address(&insn))) { +address MacroAssembler::target_addr_for_insn_or_null(address insn_addr) { + if (NativeInstruction::is_ldrw_to_zr(insn_addr)) { return nullptr; } - return MacroAssembler::target_addr_for_insn(insn_addr, insn); + return MacroAssembler::target_addr_for_insn(insn_addr); } void MacroAssembler::safepoint_poll(Label& slow_path, bool at_return, bool in_nmethod, Register tmp) { diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index 705bd19093c..d5a16e424e4 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -676,16 +676,8 @@ public: static bool needs_explicit_null_check(intptr_t offset); static bool uses_implicit_null_check(void* address); - static address target_addr_for_insn(address insn_addr, unsigned insn); - static address target_addr_for_insn_or_null(address insn_addr, unsigned insn); - static address target_addr_for_insn(address insn_addr) { - unsigned insn = *(unsigned*)insn_addr; - return target_addr_for_insn(insn_addr, insn); - } - static address target_addr_for_insn_or_null(address insn_addr) { - unsigned insn = *(unsigned*)insn_addr; - return target_addr_for_insn_or_null(insn_addr, insn); - } + static address target_addr_for_insn(address insn_addr); + static address target_addr_for_insn_or_null(address insn_addr); // Required platform-specific helpers for Label::patch_instructions. // They _shadow_ the declarations in AbstractAssembler, which are undefined. From d55e1b4a11aec65e8dfcd163370c4d8b5800c26f Mon Sep 17 00:00:00 2001 From: Ana Maria Mihalceanu Date: Tue, 21 Oct 2025 16:46:50 +0000 Subject: [PATCH 235/561] 8370222: Wrong output for a command in jlink man page Reviewed-by: alanb --- src/jdk.jlink/share/man/jlink.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/jdk.jlink/share/man/jlink.md b/src/jdk.jlink/share/man/jlink.md index 74f2d119c69..dc256af43b5 100644 --- a/src/jdk.jlink/share/man/jlink.md +++ b/src/jdk.jlink/share/man/jlink.md @@ -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. # # This code is free software; you can redistribute it and/or modify it @@ -279,8 +279,6 @@ Suggested providers: java.smartcardio provides java.security.Provider used by java.base java.xml.crypto provides java.security.Provider used by java.base jdk.crypto.cryptoki provides java.security.Provider used by java.base - jdk.crypto.ec provides java.security.Provider used by java.base - jdk.crypto.mscapi provides java.security.Provider used by java.base jdk.security.jgss provides java.security.Provider used by java.base ``` From 43e036ba89dc8a09129313705f61354463d2c266 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Tue, 21 Oct 2025 19:00:51 +0000 Subject: [PATCH 236/561] 8366424: Missing type profiling in generated Record Object methods Reviewed-by: jvernee --- .../java/lang/runtime/ObjectMethods.java | 228 ++++++++++++++---- .../lang/runtime/RecordMethodsBenchmark.java | 171 +++++++++++++ 2 files changed, 349 insertions(+), 50 deletions(-) create mode 100644 test/micro/org/openjdk/bench/java/lang/runtime/RecordMethodsBenchmark.java diff --git a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java index 24b55600954..18aa6f29f1f 100644 --- a/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java +++ b/src/java.base/share/classes/java/lang/runtime/ObjectMethods.java @@ -25,18 +25,26 @@ package java.lang.runtime; +import java.lang.classfile.ClassFile; +import java.lang.classfile.ClassHierarchyResolver; +import java.lang.classfile.Opcode; +import java.lang.constant.ClassDesc; +import java.lang.constant.MethodTypeDesc; import java.lang.invoke.ConstantCallSite; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.invoke.StringConcatFactory; import java.lang.invoke.TypeDescriptor; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Objects; +import static java.lang.classfile.ClassFile.ACC_STATIC; +import static java.lang.constant.ConstantDescs.*; import static java.util.Objects.requireNonNull; /** @@ -58,15 +66,18 @@ public final class ObjectMethods { private static final MethodHandle TRUE = MethodHandles.constant(boolean.class, true); private static final MethodHandle ZERO = MethodHandles.zero(int.class); private static final MethodHandle CLASS_IS_INSTANCE; - private static final MethodHandle OBJECTS_EQUALS; - private static final MethodHandle OBJECTS_HASHCODE; - private static final MethodHandle OBJECTS_TOSTRING; + private static final MethodHandle IS_NULL; + private static final MethodHandle IS_ARG0_NULL; + private static final MethodHandle IS_ARG1_NULL; private static final MethodHandle OBJECT_EQ; private static final MethodHandle HASH_COMBINER; + private static final MethodType MT_OBJECT_BOOLEAN = MethodType.methodType(boolean.class, Object.class); + private static final MethodType MT_INT = MethodType.methodType(int.class); + private static final MethodTypeDesc MTD_OBJECT_BOOLEAN = MethodTypeDesc.of(CD_boolean, CD_Object); + private static final MethodTypeDesc MTD_INT = MethodTypeDesc.of(CD_int); private static final HashMap, MethodHandle> primitiveEquals = new HashMap<>(); private static final HashMap, MethodHandle> primitiveHashers = new HashMap<>(); - private static final HashMap, MethodHandle> primitiveToString = new HashMap<>(); static { try { @@ -76,12 +87,12 @@ public final class ObjectMethods { CLASS_IS_INSTANCE = publicLookup.findVirtual(Class.class, "isInstance", MethodType.methodType(boolean.class, Object.class)); - OBJECTS_EQUALS = publicLookup.findStatic(Objects.class, "equals", - MethodType.methodType(boolean.class, Object.class, Object.class)); - OBJECTS_HASHCODE = publicLookup.findStatic(Objects.class, "hashCode", - MethodType.methodType(int.class, Object.class)); - OBJECTS_TOSTRING = publicLookup.findStatic(Objects.class, "toString", - MethodType.methodType(String.class, Object.class)); + + var objectsIsNull = publicLookup.findStatic(Objects.class, "isNull", + MethodType.methodType(boolean.class, Object.class)); + IS_NULL = objectsIsNull; + IS_ARG0_NULL = MethodHandles.dropArguments(objectsIsNull, 1, Object.class); + IS_ARG1_NULL = MethodHandles.dropArguments(objectsIsNull, 0, Object.class); OBJECT_EQ = lookup.findStatic(OBJECT_METHODS_CLASS, "eq", MethodType.methodType(boolean.class, Object.class, Object.class)); @@ -121,23 +132,6 @@ public final class ObjectMethods { MethodType.methodType(int.class, double.class))); primitiveHashers.put(boolean.class, lookup.findStatic(Boolean.class, "hashCode", MethodType.methodType(int.class, boolean.class))); - - primitiveToString.put(byte.class, lookup.findStatic(Byte.class, "toString", - MethodType.methodType(String.class, byte.class))); - primitiveToString.put(short.class, lookup.findStatic(Short.class, "toString", - MethodType.methodType(String.class, short.class))); - primitiveToString.put(char.class, lookup.findStatic(Character.class, "toString", - MethodType.methodType(String.class, char.class))); - primitiveToString.put(int.class, lookup.findStatic(Integer.class, "toString", - MethodType.methodType(String.class, int.class))); - primitiveToString.put(long.class, lookup.findStatic(Long.class, "toString", - MethodType.methodType(String.class, long.class))); - primitiveToString.put(float.class, lookup.findStatic(Float.class, "toString", - MethodType.methodType(String.class, float.class))); - primitiveToString.put(double.class, lookup.findStatic(Double.class, "toString", - MethodType.methodType(String.class, double.class))); - primitiveToString.put(boolean.class, lookup.findStatic(Boolean.class, "toString", - MethodType.methodType(String.class, boolean.class))); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); @@ -159,24 +153,41 @@ public final class ObjectMethods { private static boolean eq(boolean a, boolean b) { return a == b; } /** Get the method handle for combining two values of a given type */ - private static MethodHandle equalator(Class clazz) { - return (clazz.isPrimitive() - ? primitiveEquals.get(clazz) - : OBJECTS_EQUALS.asType(MethodType.methodType(boolean.class, clazz, clazz))); + private static MethodHandle equalator(MethodHandles.Lookup lookup, Class clazz) throws Throwable { + if (clazz.isPrimitive()) + return primitiveEquals.get(clazz); + MethodType mt = MethodType.methodType(boolean.class, clazz, clazz); + return MethodHandles.guardWithTest(IS_ARG0_NULL.asType(mt), + IS_ARG1_NULL.asType(mt), + lookup.findVirtual(clazz, "equals", MT_OBJECT_BOOLEAN).asType(mt)); } /** Get the hasher for a value of a given type */ - private static MethodHandle hasher(Class clazz) { - return (clazz.isPrimitive() - ? primitiveHashers.get(clazz) - : OBJECTS_HASHCODE.asType(MethodType.methodType(int.class, clazz))); + private static MethodHandle hasher(MethodHandles.Lookup lookup, Class clazz) throws Throwable { + if (clazz.isPrimitive()) + return primitiveHashers.get(clazz); + MethodType mt = MethodType.methodType(int.class, clazz); + return MethodHandles.guardWithTest(IS_NULL.asType(MethodType.methodType(boolean.class, clazz)), + MethodHandles.dropArguments(MethodHandles.zero(int.class), 0, clazz), + lookup.findVirtual(clazz, "hashCode", MT_INT).asType(mt)); } - /** Get the stringifier for a value of a given type */ - private static MethodHandle stringifier(Class clazz) { - return (clazz.isPrimitive() - ? primitiveToString.get(clazz) - : OBJECTS_TOSTRING.asType(MethodType.methodType(String.class, clazz))); + // If this type must be a monomorphic receiver, that is, one that has no + // subtypes in the JVM. For example, Object-typed fields may have a more + // specific one type at runtime and thus need optimizations. + private static boolean isMonomorphic(Class type) { + // Includes primitives and final classes, but not arrays. + // All array classes are reported to be final, but Object[] can have subtypes like String[] + return Modifier.isFinal(type.getModifiers()) && !type.isArray(); + } + + private static String specializerClassName(Class targetClass, String kind) { + String name = targetClass.getName(); + if (targetClass.isHidden()) { + // use the original class name + name = name.replace('/', '_'); + } + return name + "$$" + kind + "Specializer"; } /** @@ -185,8 +196,8 @@ public final class ObjectMethods { * @param getters the list of getters * @return the method handle */ - private static MethodHandle makeEquals(Class receiverClass, - List getters) { + private static MethodHandle makeEquals(MethodHandles.Lookup lookup, Class receiverClass, + List getters) throws Throwable { MethodType rr = MethodType.methodType(boolean.class, receiverClass, receiverClass); MethodType ro = MethodType.methodType(boolean.class, receiverClass, Object.class); MethodHandle instanceFalse = MethodHandles.dropArguments(FALSE, 0, receiverClass, Object.class); // (RO)Z @@ -195,8 +206,70 @@ public final class ObjectMethods { MethodHandle isInstance = MethodHandles.dropArguments(CLASS_IS_INSTANCE.bindTo(receiverClass), 0, receiverClass); // (RO)Z MethodHandle accumulator = MethodHandles.dropArguments(TRUE, 0, receiverClass, receiverClass); // (RR)Z - for (MethodHandle getter : getters) { - MethodHandle equalator = equalator(getter.type().returnType()); // (TT)Z + int size = getters.size(); + MethodHandle[] equalators = new MethodHandle[size]; + boolean hasPolymorphism = false; + for (int i = 0; i < size; i++) { + var getter = getters.get(i); + var type = getter.type().returnType(); + if (isMonomorphic(type)) { + equalators[i] = equalator(lookup, type); + } else { + hasPolymorphism = true; + } + } + + // Currently, hotspot does not support polymorphic inlining. + // As a result, if we have a MethodHandle to Object.equals, + // it does not enjoy separate profiles like individual invokevirtuals, + // and we must spin bytecode to accomplish separate profiling. + if (hasPolymorphism) { + String[] names = new String[size]; + + var classFileContext = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(ClassHierarchyResolver.ofClassLoading(lookup))); + var bytes = classFileContext.build(ClassDesc.of(specializerClassName(lookup.lookupClass(), "Equalator")), clb -> { + for (int i = 0; i < size; i++) { + if (equalators[i] == null) { + var name = "equalator".concat(Integer.toString(i)); + names[i] = name; + var type = getters.get(i).type().returnType(); + boolean isInterface = type.isInterface(); + var typeDesc = type.describeConstable().orElseThrow(); + clb.withMethodBody(name, MethodTypeDesc.of(CD_boolean, typeDesc, typeDesc), ACC_STATIC, cob -> { + var nonNullPath = cob.newLabel(); + var fail = cob.newLabel(); + cob.aload(0) + .ifnonnull(nonNullPath) + .aload(1) + .ifnonnull(fail) + .iconst_1() // arg0 null, arg1 null + .ireturn() + .labelBinding(fail) + .iconst_0() // arg0 null, arg1 non-null + .ireturn() + .labelBinding(nonNullPath) + .aload(0) // arg0.equals(arg1) - bytecode subject to customized profiling + .aload(1) + .invoke(isInterface ? Opcode.INVOKEINTERFACE : Opcode.INVOKEVIRTUAL, typeDesc, "equals", MTD_OBJECT_BOOLEAN, isInterface) + .ireturn(); + }); + } + } + }); + + var specializerLookup = lookup.defineHiddenClass(bytes, true, MethodHandles.Lookup.ClassOption.STRONG); + + for (int i = 0; i < size; i++) { + if (equalators[i] == null) { + var type = getters.get(i).type().returnType(); + equalators[i] = specializerLookup.findStatic(specializerLookup.lookupClass(), names[i], MethodType.methodType(boolean.class, type, type)); + } + } + } + + for (int i = 0; i < size; i++) { + var getter = getters.get(i); + MethodHandle equalator = equalators[i]; // (TT)Z MethodHandle thisFieldEqual = MethodHandles.filterArguments(equalator, 0, getter, getter); // (RR)Z accumulator = MethodHandles.guardWithTest(thisFieldEqual, accumulator, instanceFalse.asType(rr)); } @@ -212,13 +285,68 @@ public final class ObjectMethods { * @param getters the list of getters * @return the method handle */ - private static MethodHandle makeHashCode(Class receiverClass, - List getters) { + private static MethodHandle makeHashCode(MethodHandles.Lookup lookup, Class receiverClass, + List getters) throws Throwable { MethodHandle accumulator = MethodHandles.dropArguments(ZERO, 0, receiverClass); // (R)I + int size = getters.size(); + MethodHandle[] hashers = new MethodHandle[size]; + boolean hasPolymorphism = false; + for (int i = 0; i < size; i++) { + var getter = getters.get(i); + var type = getter.type().returnType(); + if (isMonomorphic(type)) { + hashers[i] = hasher(lookup, type); + } else { + hasPolymorphism = true; + } + } + + // Currently, hotspot does not support polymorphic inlining. + // As a result, if we have a MethodHandle to Object.hashCode, + // it does not enjoy separate profiles like individual invokevirtuals, + // and we must spin bytecode to accomplish separate profiling. + if (hasPolymorphism) { + String[] names = new String[size]; + + var classFileContext = ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(ClassHierarchyResolver.ofClassLoading(lookup))); + var bytes = classFileContext.build(ClassDesc.of(specializerClassName(lookup.lookupClass(), "Hasher")), clb -> { + for (int i = 0; i < size; i++) { + if (hashers[i] == null) { + var name = "hasher".concat(Integer.toString(i)); + names[i] = name; + var type = getters.get(i).type().returnType(); + boolean isInterface = type.isInterface(); + var typeDesc = type.describeConstable().orElseThrow(); + clb.withMethodBody(name, MethodTypeDesc.of(CD_int, typeDesc), ACC_STATIC, cob -> { + var nonNullPath = cob.newLabel(); + cob.aload(0) + .ifnonnull(nonNullPath) + .iconst_0() // null hash is 0 + .ireturn() + .labelBinding(nonNullPath) + .aload(0) // arg0.hashCode() - bytecode subject to customized profiling + .invoke(isInterface ? Opcode.INVOKEINTERFACE : Opcode.INVOKEVIRTUAL, typeDesc, "hashCode", MTD_INT, isInterface) + .ireturn(); + }); + } + } + }); + + var specializerLookup = lookup.defineHiddenClass(bytes, true, MethodHandles.Lookup.ClassOption.STRONG); + + for (int i = 0; i < size; i++) { + if (hashers[i] == null) { + var type = getters.get(i).type().returnType(); + hashers[i] = specializerLookup.findStatic(specializerLookup.lookupClass(), names[i], MethodType.methodType(int.class, type)); + } + } + } + // @@@ Use loop combinator instead? - for (MethodHandle getter : getters) { - MethodHandle hasher = hasher(getter.type().returnType()); // (T)I + for (int i = 0; i < size; i++) { + var getter = getters.get(i); + MethodHandle hasher = hashers[i]; // (T)I MethodHandle hashThisField = MethodHandles.filterArguments(hasher, 0, getter); // (R)I MethodHandle combineHashes = MethodHandles.filterArguments(HASH_COMBINER, 0, accumulator, hashThisField); // (RR)I accumulator = MethodHandles.permuteArguments(combineHashes, accumulator.type(), 0, 0); // adapt (R)I to (RR)I @@ -403,12 +531,12 @@ public final class ObjectMethods { case "equals" -> { if (methodType != null && !methodType.equals(MethodType.methodType(boolean.class, recordClass, Object.class))) throw new IllegalArgumentException("Bad method type: " + methodType); - yield makeEquals(recordClass, getterList); + yield makeEquals(lookup, recordClass, getterList); } case "hashCode" -> { if (methodType != null && !methodType.equals(MethodType.methodType(int.class, recordClass))) throw new IllegalArgumentException("Bad method type: " + methodType); - yield makeHashCode(recordClass, getterList); + yield makeHashCode(lookup, recordClass, getterList); } case "toString" -> { if (methodType != null && !methodType.equals(MethodType.methodType(String.class, recordClass))) diff --git a/test/micro/org/openjdk/bench/java/lang/runtime/RecordMethodsBenchmark.java b/test/micro/org/openjdk/bench/java/lang/runtime/RecordMethodsBenchmark.java new file mode 100644 index 00000000000..91d26601383 --- /dev/null +++ b/test/micro/org/openjdk/bench/java/lang/runtime/RecordMethodsBenchmark.java @@ -0,0 +1,171 @@ +/* + * 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. + * + * 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 org.openjdk.bench.java.lang.runtime; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/// Tests the generated equals and hashCode for records. +/// There are 4 types of methods: +/// - distinct: distinct sites for type profiling +/// - polluted: megamorphic site that blocks type profiling +/// - generated: actual body generated by ObjectMethods::bootstrap +/// - specialized: generated body for non-extensible types +/// The result of generated compared to the other distinct/polluted shows +/// whether the generated code could perform type profiling. +/// Specialized is the result of distinct without trap, should be even faster. +@Fork(3) +@Warmup(iterations = 10, time = 1) +@Measurement(iterations = 5, time = 2) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@BenchmarkMode(Mode.Throughput) +public class RecordMethodsBenchmark { + + record One(int a) {} + + @State(Scope.Thread) + public static class BenchmarkState { + Key k1 = new Key(new One(1), "a"); + Key k2 = new Key(new One(1), new String("a")); + SpecializedKey sk1 = new SpecializedKey(new One(1), "a"); + SpecializedKey sk2 = new SpecializedKey(new One(1), new String("a")); + } + + @Benchmark + public int hashCodeDistinct(BenchmarkState state) { + return state.k1.hashCodeDistinct(); + } + + @Benchmark + public int hashCodePolluted(BenchmarkState state) { + return state.k1.hashCodePolluted(); + } + + @Benchmark + public int hashCodeGenerated(BenchmarkState state) { + return state.k1.hashCode(); + } + + @Benchmark + public int hashCodeSpecial(BenchmarkState state) { + return state.sk1.hashCode(); + } + + @Benchmark + public boolean equalsDistinct(BenchmarkState state) { + return state.k1.equalsDistinct(state.k2); + } + + @Benchmark + public boolean equalsPolluted(BenchmarkState state) { + return state.k1.equalsPolluted(state.k2); + } + + @Benchmark + public boolean equalsGenerated(BenchmarkState state) { + return state.k1.equals(state.k2); + } + + @Benchmark + public boolean equalsSpecial(BenchmarkState state) { + return state.sk1.equals(state.sk2); + } + + /// A key object. + /// + /// Having both field as Object pollutes Object.equals for record object + /// method MH tree. We must verify the leaf Object.equals calls don't + /// share the same profile in generated code. + record Key(Object key1, Object key2) { + /// A hashCode method which has distinct hashCode invocations + /// in bytecode for each field for type profiling. + public int hashCodeDistinct() { + final int prime = 31; + int result = 1; + result = prime * result + ((key1 == null) ? 0 : key1.hashCode()); + result = prime * result + ((key2 == null) ? 0 : key2.hashCode()); + return result; + } + + /// A hashCode method which uses a megamorphic polluted + /// Object.hashCode virtual invocation in Objects.hashCode. + public int hashCodePolluted() { + final int prime = 31; + int result = 1; + result = prime * result + Objects.hashCode(key1); + result = prime * result + Objects.hashCode(key2); + return result; + } + + /// An equals method which has distinct equals invocations + /// in bytecode for each field for type profiling. + public boolean equalsDistinct(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Key other = (Key) obj; + if (key1 == null) { + if (other.key1 != null) + return false; + } + else if (!key1.equals(other.key1)) + return false; + if (key2 == null) { + if (other.key2 != null) + return false; + } + else if (!key2.equals(other.key2)) + return false; + return true; + } + + /// An equals method which uses a megamorphic polluted + /// Object.equals virtual invocation in Objects.equals. + public boolean equalsPolluted(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Key other = (Key) obj; + return Objects.equals(key1, other.key1) && Objects.equals(key2, other.key2); + } + } + + record SpecializedKey(One key1, String key2) {} +} From aab3fc54e6689dfa90ba097847a92d508c970be6 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Tue, 21 Oct 2025 20:49:53 +0000 Subject: [PATCH 237/561] 8370207: Test sun/misc/SunMiscSignalTest.java crashes after JDK-8369631 Reviewed-by: kbarrett, coleenp --- src/hotspot/os/posix/signals_posix.cpp | 8 ++++---- test/jdk/ProblemList.txt | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hotspot/os/posix/signals_posix.cpp b/src/hotspot/os/posix/signals_posix.cpp index 10b340214a1..5833e324070 100644 --- a/src/hotspot/os/posix/signals_posix.cpp +++ b/src/hotspot/os/posix/signals_posix.cpp @@ -357,12 +357,12 @@ static void jdk_misc_signal_init() { } void os::signal_notify(int sig) { - // Signal thread is not created with ReduceSignalUsage and jdk_misc_signal_init - // initialization isn't called. This code is also never called. - assert(!ReduceSignalUsage, "Should not reach here if ReduceSignalUsage is set"); - + // Signal thread is not created with ReduceSignalUsage and jdk_misc_signal_init + // initialization isn't called. + if (!ReduceSignalUsage) { AtomicAccess::inc(&pending_signals[sig]); sig_semaphore->signal(); + } } static int check_pending_signals() { diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index faf4c5e7a94..0e69446ae35 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -743,8 +743,6 @@ sun/tools/jstatd/TestJstatdRmiPort.java 8251259,8293577 jdk/incubator/vector/ShortMaxVectorTests.java 8306592 generic-i586 jdk/incubator/vector/LoadJsvmlTest.java 8305390 windows-x64 -sun/misc/SunMiscSignalTest.java 8370207 generic-all - ############################################################################ # jdk_jfr From cac2519fc6552b6187d6f94db1ed33d9186d95cf Mon Sep 17 00:00:00 2001 From: Alexander Matveev Date: Tue, 21 Oct 2025 21:34:38 +0000 Subject: [PATCH 238/561] 8356578: Test --mac-entitlements Reviewed-by: asemenyuk --- .../jdk/jpackage/test/LauncherVerifier.java | 15 ++- .../jpackage/macosx/EntitlementsTest.java | 124 ++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 test/jdk/tools/jpackage/macosx/EntitlementsTest.java diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java index 87dc203daa1..55cb38f21cf 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java @@ -339,9 +339,20 @@ public final class LauncherVerifier { TKit.assertTrue(entitlements.isPresent(), String.format("Check [%s] launcher is signed with entitlements", name)); + var customFile = Optional.ofNullable(cmd.getArgumentValue("--mac-entitlements")).map(Path::of); + if (customFile.isEmpty()) { + // Try from the resource dir. + var resourceDirFile = Optional.ofNullable(cmd.getArgumentValue("--resource-dir")).map(Path::of).map(resourceDir -> { + return resourceDir.resolve(cmd.name() + ".entitlements"); + }).filter(Files::exists); + if (resourceDirFile.isPresent()) { + customFile = resourceDirFile; + } + } + Map expected; - if (cmd.hasArgument("--mac-entitlements")) { - expected = new PListReader(Files.readAllBytes(Path.of(cmd.getArgumentValue("--mac-entitlements")))).toMap(true); + if (customFile.isPresent()) { + expected = new PListReader(Files.readAllBytes(customFile.orElseThrow())).toMap(true); } else if (cmd.hasArgument("--mac-app-store")) { expected = DefaultEntitlements.APP_STORE; } else { diff --git a/test/jdk/tools/jpackage/macosx/EntitlementsTest.java b/test/jdk/tools/jpackage/macosx/EntitlementsTest.java new file mode 100644 index 00000000000..1d6d86118a6 --- /dev/null +++ b/test/jdk/tools/jpackage/macosx/EntitlementsTest.java @@ -0,0 +1,124 @@ +/* + * 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. + * + * 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. + */ + +import static jdk.jpackage.internal.util.PListWriter.writeDict; +import static jdk.jpackage.internal.util.PListWriter.writePList; +import static jdk.jpackage.internal.util.PListWriter.writeBoolean; +import static jdk.jpackage.internal.util.XmlUtils.createXml; +import static jdk.jpackage.internal.util.XmlUtils.toXmlConsumer; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Date; + +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.TKit; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.Annotations.Parameter; + +/* + * Test generates signed app-image with custom entitlements file from the + * "--mac-entitlements" parameter and the resource directory. Following cases + * are covered: + * - Custom entitlements file in the resource directory. + * - Custom entitlements file specified with the "--mac-entitlements" parameter. + * - Custom entitlements file in the resource directory and specified with the + * "--mac-entitlements" parameter. + */ + +/* + * @test + * @summary jpackage with --type app-image "--mac-entitlements" parameter + * @library /test/jdk/tools/jpackage/helpers + * @library base + * @build SigningBase + * @build jdk.jpackage.test.* + * @build EntitlementsTest + * @requires (jpackage.test.MacSignTests == "run") + * @run main/othervm/timeout=720 -Xmx512m jdk.jpackage.test.Main + * --jpt-run=EntitlementsTest + * --jpt-before-run=SigningBase.verifySignTestEnvReady + */ +public class EntitlementsTest { + + void createEntitlementsFile(Path file, boolean microphone) throws IOException { + createXml(file, xml -> { + writePList(xml, toXmlConsumer(() -> { + writeDict(xml, toXmlConsumer(() -> { + writeBoolean(xml, "com.apple.security.cs.allow-jit", true); + writeBoolean(xml, "com.apple.security.cs.allow-unsigned-executable-memory", true); + writeBoolean(xml, "com.apple.security.cs.disable-library-validation", true); + writeBoolean(xml, "com.apple.security.cs.allow-dyld-environment-variables", true); + writeBoolean(xml, "com.apple.security.cs.debugger", true); + writeBoolean(xml, "com.apple.security.device.audio-input", true); + writeBoolean(xml, "com.apple.security.device.microphone", microphone); + })); + })); + }); + } + + @Test + // ({"--mac-app-store", doMacEntitlements", "doResources"}) + @Parameter({"false", "true", "false"}) + @Parameter({"false", "false", "true"}) + @Parameter({"false", "true", "true"}) + @Parameter({"true", "true", "false"}) + @Parameter({"true", "false", "true"}) + @Parameter({"true", "true", "true"}) + public void test(boolean appStore, boolean doMacEntitlements, boolean doResources) throws Exception { + final Path macEntitlementsFile; + final Path resourcesDir; + + if (doMacEntitlements) { + macEntitlementsFile = TKit.createTempFile("EntitlementsTest.plist"); + createEntitlementsFile(macEntitlementsFile, true); + } else { + macEntitlementsFile = null; + } + + if (doResources) { + resourcesDir = TKit.createTempDirectory("resources"); + createEntitlementsFile(resourcesDir.resolve("EntitlementsTest.entitlements"), false); + } else { + resourcesDir = null; + } + + JPackageCommand cmd = JPackageCommand.helloAppImage() + .addArguments("--mac-sign", "--mac-signing-keychain", + SigningBase.getKeyChain(), "--mac-app-image-sign-identity", + SigningBase.getAppCert(SigningBase.CertIndex.ASCII_INDEX.value())); + if (appStore) { + cmd.addArguments("--mac-app-store"); + } + if (doMacEntitlements) { + cmd.addArguments("--mac-entitlements", + macEntitlementsFile.toAbsolutePath().toString()); + } + if (doResources) { + cmd.addArguments("--resource-dir", + resourcesDir.toAbsolutePath().toString()); + } + + cmd.executeAndAssertHelloAppImageCreated(); + } +} From ed153ee2c4614c814da92c23c4741eed68ce1a0c Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Tue, 21 Oct 2025 22:10:01 +0000 Subject: [PATCH 239/561] 8369032: Add test to ensure serialized ICC_Profile stores only necessary optional data Reviewed-by: honkar --- .../color/ICC_Profile/SerializedFormSize.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java diff --git a/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java b/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java new file mode 100644 index 00000000000..bb8d7a0ab88 --- /dev/null +++ b/test/jdk/java/awt/color/ICC_Profile/SerializedFormSize.java @@ -0,0 +1,72 @@ +/* + * Copyright Amazon.com Inc. 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. + * + * 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. + */ + +import java.awt.color.ColorSpace; +import java.awt.color.ICC_Profile; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; + +/** + * @test + * @bug 8369032 + * @summary Checks the size of the serialized ICC_Profile for standard and + * non-standard profiles. + */ +public final class SerializedFormSize { + + private static final ICC_Profile[] PROFILES = { + ICC_Profile.getInstance(ColorSpace.CS_sRGB), + ICC_Profile.getInstance(ColorSpace.CS_LINEAR_RGB), + ICC_Profile.getInstance(ColorSpace.CS_CIEXYZ), + ICC_Profile.getInstance(ColorSpace.CS_PYCC), + ICC_Profile.getInstance(ColorSpace.CS_GRAY) + }; + + public static void main(String[] args) throws Exception { + for (ICC_Profile profile : PROFILES) { + byte[] data = profile.getData(); + int dataSize = data.length; + int min = 3; // At least version, name and data fields + int max = 200; // Small enough to confirm no data saved + + // Standard profile: should serialize to a small size, no data + test(profile, min, max); + // Non-standard profile: includes full data, but only once + test(ICC_Profile.getInstance(data), dataSize, dataSize + max); + } + } + + private static void test(ICC_Profile p, int min, int max) throws Exception { + try (var bos = new ByteArrayOutputStream(); + var oos = new ObjectOutputStream(bos)) + { + oos.writeObject(p); + int size = bos.size(); + if (size < min || size > max) { + System.err.println("Expected: >= " + min + " and <= " + max); + System.err.println("Actual: " + size); + throw new RuntimeException("Wrong size"); + } + } + } +} From 94c0611b9534f74b41b1f513f5c9ea96f41f83af Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Wed, 22 Oct 2025 02:41:27 +0000 Subject: [PATCH 240/561] 8370122: jpackage test lib improvements Reviewed-by: almatvee --- .../internal/util/IdentityWrapper.java | 73 ++ .../jdk/jpackage/test/JUnitUtilsTest.java | 56 ++ .../jdk/jpackage/test/ObjectMapperTest.java | 731 ++++++++++++++++ .../jdk/jpackage/test/PackageTestTest.java | 2 +- .../jdk/jpackage/test/AdditionalLauncher.java | 2 +- .../jdk/jpackage/test/ApplicationLayout.java | 12 +- .../jpackage/test/ConfigurationTarget.java | 68 ++ .../helpers/jdk/jpackage/test/HelloApp.java | 2 + .../jdk/jpackage/test/JPackageCommand.java | 43 +- .../helpers/jdk/jpackage/test/JarBuilder.java | 21 +- .../jpackage/test/LauncherIconVerifier.java | 17 +- .../jdk/jpackage/test/LinuxHelper.java | 59 +- .../jdk/jpackage/test/ObjectMapper.java | 780 ++++++++++++++++++ .../jdk/jpackage/test/PackageTest.java | 20 +- .../helpers/jdk/jpackage/test/TKit.java | 4 +- .../internal/util/IdentityWrapperTest.java | 157 ++++ .../tools/jdk/jpackage/test/JUnitUtils.java | 139 ++++ .../jpackage/linux/ShortcutHintTest.java | 2 +- .../jpackage/share/AddLShortcutTest.java | 6 + .../tools/jpackage/share/AddLauncherTest.java | 73 +- .../jpackage/share/AppImagePackageTest.java | 102 ++- .../tools/jpackage/share/InOutPathTest.java | 4 +- .../jdk/tools/jpackage/share/LicenseTest.java | 2 +- .../jpackage/share/RuntimePackageTest.java | 6 +- 24 files changed, 2285 insertions(+), 96 deletions(-) create mode 100644 src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/IdentityWrapper.java create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JUnitUtilsTest.java create mode 100644 test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/ObjectMapperTest.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ObjectMapper.java create mode 100644 test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/IdentityWrapperTest.java create mode 100644 test/jdk/tools/jpackage/junit/tools/jdk/jpackage/test/JUnitUtils.java diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/IdentityWrapper.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/IdentityWrapper.java new file mode 100644 index 00000000000..0a7a8cc8d4b --- /dev/null +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/IdentityWrapper.java @@ -0,0 +1,73 @@ +/* + * 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 jdk.jpackage.internal.util; + +import java.util.Objects; + +/** + * Object wrapper implementing {@link Object#equals(Object)} such that it + * returns {@code true} only when the argument is another instance of this class + * wrapping the same object. + *

        + * The class guarantees that {@link Object#equals(Object)} and + * {@link Object#hashCode()} methods of the wrapped object will never be called + * inside of the class methods. + * + * @param the type of the wrapped value + */ +public final class IdentityWrapper { + + public IdentityWrapper(T value) { + this.value = Objects.requireNonNull(value); + } + + public T value() { + return value; + } + + @Override + public int hashCode() { + return System.identityHashCode(value); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if ((obj == null) || (getClass() != obj.getClass())) { + return false; + } + var other = (IdentityWrapper) obj; + return value == other.value; + } + + @Override + public String toString() { + return String.format("Identity[%s]", value); + } + + private final T value; +} diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JUnitUtilsTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JUnitUtilsTest.java new file mode 100644 index 00000000000..28b55f98fe2 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/JUnitUtilsTest.java @@ -0,0 +1,56 @@ +/* + * 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. + * + * 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 jdk.jpackage.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Map; +import org.junit.jupiter.api.Test; + +public class JUnitUtilsTest { + + @Test + public void test_assertArrayEquals() { + JUnitUtils.assertArrayEquals(new int[] {1, 2, 3}, new int[] {1, 2, 3}); + JUnitUtils.assertArrayEquals(new long[] {1, 2, 3}, new long[] {1, 2, 3}); + JUnitUtils.assertArrayEquals(new boolean[] {true, true}, new boolean[] {true, true}); + } + + @Test + public void test_assertArrayEquals_negative() { + assertThrows(AssertionError.class, () -> { + JUnitUtils.assertArrayEquals(new int[] {1, 2, 3}, new int[] {2, 3}); + }); + } + + @Test + public void test_exceptionAsPropertyMapWithMessageWithoutCause() { + + var ex = new Exception("foo"); + + var map = JUnitUtils.exceptionAsPropertyMap(ex); + + assertEquals(Map.of("getClass", Exception.class.getName(), "getMessage", "foo"), map); + } +} diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/ObjectMapperTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/ObjectMapperTest.java new file mode 100644 index 00000000000..0310d276e21 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/ObjectMapperTest.java @@ -0,0 +1,731 @@ +/* + * 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. + * + * 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 jdk.jpackage.test; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrowsExactly; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.math.BigInteger; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import org.junit.jupiter.api.Test; + +public class ObjectMapperTest { + + @Test + public void test_String() { + var om = ObjectMapper.blank().create(); + + var map = om.map("foo"); + + assertEquals("foo", map); + } + + @Test + public void test_int() { + var om = ObjectMapper.blank().create(); + + var map = om.map(100); + + assertEquals(100, map); + } + + @Test + public void test_null() { + var om = ObjectMapper.blank().create(); + + var map = om.map(null); + + assertNull(map); + } + + @Test + public void test_Object() { + var obj = new Object(); + assertSame(obj, ObjectMapper.blank().create().map(obj)); + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_Path() { + var obj = Path.of("foo/bar"); + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_UUID() { + var obj = UUID.randomUUID(); + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_BigInteger() { + var obj = BigInteger.TEN; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_Enum() { + + var expected = Map.of( + "name", TestEnum.BAR.name(), + "ordinal", TestEnum.BAR.ordinal(), + "a", "A", + "b", 123, + "num", 100 + ); + + assertEquals(expected, ObjectMapper.standard().create().map(TestEnum.BAR)); + } + + @Test + public void test_array_int() { + + var obj = new int[] { 1, 4, 5 }; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_array_String() { + + var obj = new String[] { "Hello", "Bye" }; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_array_empty() { + + var obj = new Thread[0]; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_array_nulls() { + + var obj = new Thread[10]; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_array_Path() { + + var obj = new Path[] { Path.of("foo/bar"), null, Path.of("").toAbsolutePath() }; + + assertSame(obj, ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_array_Object() { + + var obj = new Object[] { Path.of("foo/bar"), null, 145, new Simple.Stub("Hello", 738), "foo" }; + + var expected = new Object[] { Path.of("foo/bar"), null, 145, Map.of("a", "Hello", "b", 738), "foo" }; + + assertArrayEquals(expected, (Object[])ObjectMapper.standard().create().map(obj)); + } + + @Test + public void test_functional() { + assertWrappedIdentity(new Function() { + + @Override + public Integer apply(Object o) { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new BiFunction() { + + @Override + public Integer apply(Object a, String b) { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new Consumer<>() { + + @Override + public void accept(Object o) { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new BiConsumer<>() { + + @Override + public void accept(Object a, Object b) { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new Predicate<>() { + + @Override + public boolean test(Object o) { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new Supplier<>() { + + @Override + public Object get() { + throw new AssertionError(); + } + + }); + + assertWrappedIdentity(new Runnable() { + + @Override + public void run() { + throw new AssertionError(); + } + + }); + } + + @Test + public void testIdentityWrapper() { + var om = ObjectMapper.standard().create(); + + var a = new Object() {}; + var b = new Object() {}; + + var amap = om.map(a); + var amap2 = om.map(a); + + assertEquals(amap, amap2); + assertEquals(ObjectMapper.wrapIdentity(a), amap); + + var bmap = om.map(b); + + assertNotEquals(amap, bmap); + assertEquals(ObjectMapper.wrapIdentity(b), bmap); + } + + @Test + public void test_wrapIdentity() { + + assertThrowsExactly(NullPointerException.class, () -> ObjectMapper.wrapIdentity(null)); + + var iw = ObjectMapper.wrapIdentity(new Object()); + + assertSame(iw, ObjectMapper.wrapIdentity(iw)); + + var simpleStubA = new Simple.Stub("Hello", 77); + var simpleStubB = new Simple.Stub("Hello", 77); + + assertEquals(simpleStubA, simpleStubB); + assertNotEquals(ObjectMapper.wrapIdentity(simpleStubA), ObjectMapper.wrapIdentity(simpleStubB)); + assertEquals(ObjectMapper.wrapIdentity(simpleStubA), ObjectMapper.wrapIdentity(simpleStubA)); + } + + @Test + public void test_empty_List() { + var om = ObjectMapper.blank().create(); + + var map = om.map(List.of()); + + assertEquals(List.of(), map); + } + + @Test + public void test_List() { + var om = ObjectMapper.blank().create(); + + var map = om.map(List.of(100, "foo")); + + assertEquals(List.of(100, "foo"), map); + } + + @Test + public void test_empty_Map() { + var om = ObjectMapper.blank().create(); + + var map = om.map(Map.of()); + + assertEquals(Map.of(), map); + } + + @Test + public void test_Map() { + var om = ObjectMapper.blank().create(); + + var map = om.map(Map.of(100, "foo")); + + assertEquals(Map.of(100, "foo"), map); + } + + @Test + public void test_MapSimple() { + var om = ObjectMapper.standard().create(); + + var map = om.map(Map.of(123, "foo", 321, new Simple.Stub("Hello", 567))); + + assertEquals(Map.of(123, "foo", 321, Map.of("a", "Hello", "b", 567)), map); + } + + @Test + public void test_ListSimple() { + var om = ObjectMapper.standard().create(); + + var map = om.map(List.of(100, new Simple.Stub("Hello", 567), "bar", new Simple() {})); + + assertEquals(List.of(100, Map.of("a", "Hello", "b", 567), "bar", Map.of("a", "foo", "b", 123)), map); + } + + @Test + public void test_Simple() { + var om = ObjectMapper.standard().create(); + + var map = om.map(new Simple() {}); + + assertEquals(Map.of("a", "foo", "b", 123), map); + } + + @Test + public void test_Proxy() { + var om = ObjectMapper.standard().create(); + + var map = om.map(Proxy.newProxyInstance(Simple.class.getClassLoader(), new Class[] { Simple.class }, new InvocationHandler() { + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + switch (method.getName()) { + case "a" -> { + return "Bye"; + } + case "b" -> { + return 335; + } + default -> { + throw new UnsupportedOperationException(); + } + } + } + + })); + + assertEquals(Map.of("a", "Bye", "b", 335), map); + } + + @Test + public void test_Simple_null_property() { + var om = ObjectMapper.standard().create(); + + var map = om.map(new Simple.Stub(null, 123)); + + assertEquals(Map.of("b", 123, "a", ObjectMapper.NULL), map); + } + + @Test + public void test_Optional_String() { + var om = ObjectMapper.standard().create(); + + var map = om.map(Optional.of("foo")); + + assertEquals(Map.of("get", "foo"), map); + } + + @Test + public void test_Optional_empty() { + var om = ObjectMapper.standard().create(); + + var map = om.map(Optional.empty()); + + assertEquals(Map.of("get", ObjectMapper.NULL), map); + } + + @Test + public void test_toMap() { + var om = ObjectMapper.standard().create(); + + assertNull(om.toMap(null)); + assertEquals(Map.of("value", "Hello"), om.toMap("Hello")); + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + } + + @Test + public void test_getter_throws() { + var om = ObjectMapper.blank() + .mutate(ObjectMapper.configureObject()) + .mutate(ObjectMapper.configureLeafClasses()) + .mutate(ObjectMapper.configureException()) + .create(); + + var expected = Map.of("get", om.toMap(new UnsupportedOperationException("Not for you!"))); + + var actual = om.toMap(new Supplier<>() { + @Override + public Object get() { + throw new UnsupportedOperationException("Not for you!"); + } + }); + + assertEquals(expected, actual); + } + + @Test + public void test_exception_with_message_with_cause() { + + var ex = new Exception("foo", new IllegalArgumentException("Cause", new RuntimeException("Ops!"))); + + var om = ObjectMapper.standard().create(); + + var map = om.toMap(ex); + + assertEquals(Map.of( + "getClass", Exception.class.getName(), + "getMessage", "foo", + "getCause", Map.of( + "getClass", IllegalArgumentException.class.getName(), + "getMessage", "Cause", + "getCause", Map.of( + "getClass", RuntimeException.class.getName(), + "getMessage", "Ops!" + ) + ) + ), map); + } + + @Test + public void test_exception_without_message_with_cause() { + + var ex = new RuntimeException(null, new UnknownError("Ops!")); + + var om = ObjectMapper.standard().create(); + + var map = om.toMap(ex); + + assertEquals(Map.of( + "getClass", RuntimeException.class.getName(), + "getCause", Map.of( + "getMessage", "Ops!", + "getCause", ObjectMapper.NULL + ) + ), map); + } + + @Test + public void test_exception_without_message_without_cause() { + + var ex = new UnsupportedOperationException(); + + var om = ObjectMapper.standard().create(); + + var map = om.toMap(ex); + + assertEquals(Map.of("getClass", UnsupportedOperationException.class.getName()), map); + } + + @Test + public void test_exception_CustomException() { + + var ex = new CustomException("Hello", Path.of(""), Optional.empty(), null); + + var om = ObjectMapper.standard().create(); + + var map = om.toMap(ex); + + assertEquals(Map.of( + "getClass", CustomException.class.getName(), + "getMessage", "Hello", + "op", Map.of("get", ObjectMapper.NULL), + "path2", Path.of("") + ), map); + } + + @Test + public void test_Builder_accessPackageMethods() { + + var obj = new TestType().foo("Hello").bar(81); + + var map = ObjectMapper.standard().create().toMap(obj); + + assertEquals(Map.of("foo", "Hello"), map); + + map = ObjectMapper.standard().accessPackageMethods(TestType.class.getPackage()).create().toMap(obj); + + assertEquals(Map.of("foo", "Hello", "bar", 81), map); + } + + @Test + public void test_Builder_methods_Simple() { + + var om = ObjectMapper.standard().exceptSomeMethods(Simple.class).add("a").apply().create(); + + assertEquals(Map.of("b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + + om = ObjectMapper.standard().exceptSomeMethods(Simple.class).add("b").apply().create(); + + assertEquals(Map.of("a", "foo"), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]"), om.toMap(new Simple.DefaultExt("Hello", 345))); + } + + @Test + public void test_Builder_methods_SimpleStub() { + + var om = ObjectMapper.standard().exceptSomeMethods(Simple.Stub.class).add("a").apply().create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello", "b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]", "b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + + om = ObjectMapper.standard().exceptSomeMethods(Simple.Stub.class).add("b").apply().create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello", "b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]", "b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + } + + @Test + public void test_Builder_methods_SimpleDefault() { + + var om = ObjectMapper.standard().exceptSomeMethods(Simple.Default.class).add("a").apply().create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello", "b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + + om = ObjectMapper.standard().exceptSomeMethods(Simple.Default.class).add("b").apply().create(); + + assertEquals(Map.of("a", "foo"), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]"), om.toMap(new Simple.DefaultExt("Hello", 345))); + } + + @Test + public void test_Builder_methods_SimpleDefaultExt() { + + var om = ObjectMapper.standard().exceptSomeMethods(Simple.DefaultExt.class).add("a").apply().create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello", "b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello", "b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + + om = ObjectMapper.standard().exceptSomeMethods(Simple.DefaultExt.class).add("b").apply().create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello", "b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello", "b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]"), om.toMap(new Simple.DefaultExt("Hello", 345))); + } + + @Test + public void test_Builder_methods_SimpleStub_and_SimpleDefault() { + + var om = ObjectMapper.standard() + .exceptSomeMethods(Simple.Stub.class).add("a").apply() + .exceptSomeMethods(Simple.Default.class).add("a").apply() + .create(); + + assertEquals(Map.of("a", "foo", "b", 123), om.toMap(new Simple() {})); + assertEquals(Map.of("b", 345), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("b", 123), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("b", 345 + 10), om.toMap(new Simple.DefaultExt("Hello", 345))); + + om = ObjectMapper.standard() + .exceptSomeMethods(Simple.Stub.class).add("b").apply() + .exceptSomeMethods(Simple.Default.class).add("b").apply() + .create(); + + assertEquals(Map.of("a", "foo"), om.toMap(new Simple() {})); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Stub("Hello", 345))); + assertEquals(Map.of("a", "Hello"), om.toMap(new Simple.Default("Hello"))); + assertEquals(Map.of("a", "[Hello]"), om.toMap(new Simple.DefaultExt("Hello", 345))); + } + + @Test + public void test_Builder_methods_all_excluded() { + + var om = ObjectMapper.standard() + .exceptSomeMethods(Simple.class).add("a").apply() + .exceptSomeMethods(Simple.Stub.class).add("b").apply() + .create(); + + var obj = new Simple.Stub("Hello", 345); + + assertEquals(ObjectMapper.wrapIdentity(obj), om.map(obj)); + } + + interface Simple { + default String a() { + return "foo"; + } + + default int b() { + return 123; + } + + record Stub(String a, int b) implements Simple {} + + static class Default implements Simple { + Default(String a) { + this.a = a; + } + + @Override + public String a() { + return a; + } + + private final String a; + } + + static class DefaultExt extends Default { + DefaultExt(String a, int b) { + super(a); + this.b = b; + } + + @Override + public String a() { + return "[" + super.a() + "]"; + } + + @Override + public int b() { + return 10 + b; + } + + private final int b; + } + } + + final class TestType { + + public String foo() { + return foo; + } + + public TestType foo(String v) { + foo = v; + return this; + } + + int bar() { + return bar; + } + + TestType bar(int v) { + bar = v; + return this; + } + + private String foo; + private int bar; + } + + enum TestEnum implements Simple { + FOO, + BAR; + + public int num() { + return 100; + } + + public int num(int v) { + return v; + } + + @Override + public String a() { + return "A"; + } + } + + static final class CustomException extends Exception { + + CustomException(String message, Path path, Optional optional, Throwable cause) { + super(message, cause); + this.path = path; + this.optional = optional; + } + + Path path() { + return path; + } + + public Path path2() { + return path; + } + + public Optional op() { + return optional; + } + + private final Path path; + private final Optional optional; + + private static final long serialVersionUID = 1L; + + } + + private static void assertWrappedIdentity(ObjectMapper om, Object obj) { + var map = om.toMap(obj); + assertEquals(Map.of("value", ObjectMapper.wrapIdentity(obj)), map); + } + + private static void assertWrappedIdentity(Object obj) { + assertWrappedIdentity(ObjectMapper.standard().create(), obj); + } +} diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java index da94db30925..4cf89fca3cc 100644 --- a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java @@ -341,7 +341,7 @@ public class PackageTestTest extends JUnitAdapter { } @Override - JPackageCommand assertAppLayout() { + JPackageCommand runStandardAsserts() { return this; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java index 50222d89ceb..66da89fc3f9 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java @@ -198,7 +198,7 @@ public final class AdditionalLauncher { } } - static PropertyFile getAdditionalLauncherProperties( + public static PropertyFile getAdditionalLauncherProperties( JPackageCommand cmd, String launcherName) { PropertyFile shell[] = new PropertyFile[1]; forEachAdditionalLauncher(cmd, (name, propertiesFilePath) -> { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ApplicationLayout.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ApplicationLayout.java index 7ab3b824aa4..0701421e999 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ApplicationLayout.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ApplicationLayout.java @@ -98,12 +98,18 @@ public record ApplicationLayout(Path launchersDirectory, Path appDirectory, throw new IllegalArgumentException("Unknown platform"); } - public static ApplicationLayout javaRuntime() { + public static ApplicationLayout platformJavaRuntime() { + Path runtime = Path.of(""); + Path runtimeHome = runtime; + if (TKit.isOSX()) { + runtimeHome = Path.of("Contents/Home"); + } + return new ApplicationLayout( null, null, - Path.of(""), - null, + runtime, + runtimeHome, null, null, null, diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java new file mode 100644 index 00000000000..ba3131a7680 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java @@ -0,0 +1,68 @@ +/* + * 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. + * + * 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 jdk.jpackage.test; + +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; + +/** + * Provides uniform way to configure {@code JPackageCommand} and + * {@code PackageTest} instances. + */ +public record ConfigurationTarget(Optional cmd, Optional test) { + + public ConfigurationTarget { + Objects.requireNonNull(cmd); + Objects.requireNonNull(test); + if (cmd.isEmpty() == test.isEmpty()) { + throw new IllegalArgumentException(); + } + } + + public ConfigurationTarget(JPackageCommand target) { + this(Optional.of(target), Optional.empty()); + } + + public ConfigurationTarget(PackageTest target) { + this(Optional.empty(), Optional.of(target)); + } + + public ConfigurationTarget apply(Consumer a, Consumer b) { + cmd.ifPresent(Objects.requireNonNull(a)); + test.ifPresent(Objects.requireNonNull(b)); + return this; + } + + public ConfigurationTarget addInitializer(Consumer initializer) { + cmd.ifPresent(Objects.requireNonNull(initializer)); + test.ifPresent(v -> { + v.addInitializer(initializer::accept); + }); + return this; + } + + public ConfigurationTarget add(AdditionalLauncher addLauncher) { + return apply(addLauncher::applyTo, addLauncher::applyTo); + } +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java index 69ea4ecfaa0..6c7b6a25255 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/HelloApp.java @@ -125,6 +125,8 @@ public final class HelloApp { if (appDesc.isWithMainClass()) { builder.setMainClass(appDesc.className()); } + // Use an old release number to make test app classes runnable on older runtimes. + builder.setRelease(11); return builder; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 6945cd2b722..22e75a57911 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -67,9 +67,11 @@ import jdk.jpackage.internal.util.function.ThrowingSupplier; */ public class JPackageCommand extends CommandArguments { + @SuppressWarnings("this-escape") public JPackageCommand() { prerequisiteActions = new Actions(); verifyActions = new Actions(); + excludeStandardAsserts(StandardAssert.MAIN_LAUNCHER_DESCRIPTION); } private JPackageCommand(JPackageCommand cmd, boolean immutable) { @@ -85,7 +87,7 @@ public class JPackageCommand extends CommandArguments { dmgInstallDir = cmd.dmgInstallDir; prerequisiteActions = new Actions(cmd.prerequisiteActions); verifyActions = new Actions(cmd.verifyActions); - appLayoutAsserts = cmd.appLayoutAsserts; + standardAsserts = cmd.standardAsserts; readOnlyPathAsserts = cmd.readOnlyPathAsserts; outputValidators = cmd.outputValidators; executeInDirectory = cmd.executeInDirectory; @@ -459,7 +461,7 @@ public class JPackageCommand extends CommandArguments { if (layout != null) { } else if (isRuntime()) { - layout = ApplicationLayout.javaRuntime(); + layout = ApplicationLayout.platformJavaRuntime(); } else { layout = ApplicationLayout.platformAppImage(); } @@ -933,7 +935,7 @@ public class JPackageCommand extends CommandArguments { public JPackageCommand assertImageCreated() { verifyIsOfType(PackageType.IMAGE); - assertAppLayout(); + runStandardAsserts(); return this; } @@ -976,10 +978,10 @@ public class JPackageCommand extends CommandArguments { void updateAndAssert() { final var newSnapshots = createSnapshots(); for (final var a : asserts.keySet().stream().sorted().toList()) { - final var snapshopGroup = snapshots.get(a); - final var newSnapshopGroup = newSnapshots.get(a); - for (int i = 0; i < snapshopGroup.size(); i++) { - TKit.PathSnapshot.assertEquals(snapshopGroup.get(i), newSnapshopGroup.get(i), + final var snapshotGroup = snapshots.get(a); + final var newSnapshotGroup = newSnapshots.get(a); + for (int i = 0; i < snapshotGroup.size(); i++) { + snapshotGroup.get(i).assertEquals(newSnapshotGroup.get(i), String.format("Check jpackage didn't modify ${%s}=[%s]", a, asserts.get(a).get(i))); } } @@ -1094,7 +1096,7 @@ public class JPackageCommand extends CommandArguments { asSet::contains)).toArray(ReadOnlyPathAssert[]::new)); } - public static enum AppLayoutAssert { + public static enum StandardAssert { APP_IMAGE_FILE(JPackageCommand::assertAppImageFile), PACKAGE_FILE(JPackageCommand::assertPackageFile), NO_MAIN_LAUNCHER_IN_RUNTIME(cmd -> { @@ -1114,6 +1116,11 @@ public class JPackageCommand extends CommandArguments { LauncherVerifier.Action.VERIFY_MAC_ENTITLEMENTS); } }), + MAIN_LAUNCHER_DESCRIPTION(cmd -> { + if (!cmd.isRuntime()) { + new LauncherVerifier(cmd).verify(cmd, LauncherVerifier.Action.VERIFY_DESCRIPTION); + } + }), MAIN_JAR_FILE(cmd -> { Optional.ofNullable(cmd.getArgumentValue("--main-jar", () -> null)).ifPresent(mainJar -> { TKit.assertFileExists(cmd.appLayout().appDirectory().resolve(mainJar)); @@ -1138,7 +1145,7 @@ public class JPackageCommand extends CommandArguments { }), ; - AppLayoutAssert(Consumer action) { + StandardAssert(Consumer action) { this.action = action; } @@ -1156,21 +1163,21 @@ public class JPackageCommand extends CommandArguments { private final Consumer action; } - public JPackageCommand setAppLayoutAsserts(AppLayoutAssert ... asserts) { + public JPackageCommand setStandardAsserts(StandardAssert ... asserts) { verifyMutable(); - appLayoutAsserts = Set.of(asserts); + standardAsserts = Set.of(asserts); return this; } - public JPackageCommand excludeAppLayoutAsserts(AppLayoutAssert... asserts) { + public JPackageCommand excludeStandardAsserts(StandardAssert... asserts) { var asSet = Set.of(asserts); - return setAppLayoutAsserts(appLayoutAsserts.stream().filter(Predicate.not( - asSet::contains)).toArray(AppLayoutAssert[]::new)); + return setStandardAsserts(standardAsserts.stream().filter(Predicate.not( + asSet::contains)).toArray(StandardAssert[]::new)); } - JPackageCommand assertAppLayout() { - for (var appLayoutAssert : appLayoutAsserts.stream().sorted().toList()) { - appLayoutAssert.action.accept(this); + JPackageCommand runStandardAsserts() { + for (var standardAssert : standardAsserts.stream().sorted().toList()) { + standardAssert.action.accept(this); } return this; } @@ -1520,7 +1527,7 @@ public class JPackageCommand extends CommandArguments { private Path winMsiLogFile; private Path unpackedPackageDirectory; private Set readOnlyPathAsserts = Set.of(ReadOnlyPathAssert.values()); - private Set appLayoutAsserts = Set.of(AppLayoutAssert.values()); + private Set standardAsserts = Set.of(StandardAssert.values()); private List>> outputValidators = new ArrayList<>(); private static InheritableThreadLocal> defaultToolProvider = new InheritableThreadLocal<>() { @Override diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JarBuilder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JarBuilder.java index d62575d2fef..c69c29af53a 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JarBuilder.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JarBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** @@ -48,6 +49,11 @@ public final class JarBuilder { return this; } + public JarBuilder setRelease(int v) { + release = v; + return this; + } + public JarBuilder addSourceFile(Path v) { sourceFiles.add(v); return this; @@ -61,11 +67,15 @@ public final class JarBuilder { public void create() { TKit.withTempDirectory("jar-workdir", workDir -> { if (!sourceFiles.isEmpty()) { - new Executor() + var exec = new Executor() .setToolProvider(JavaTool.JAVAC) - .addArguments("-d", workDir.toString()) - .addPathArguments(sourceFiles) - .execute(); + .addArguments("-d", workDir.toString()); + + Optional.ofNullable(release).ifPresent(r -> { + exec.addArguments("--release", r.toString()); + }); + + exec.addPathArguments(sourceFiles).execute(); } Files.createDirectories(outputJar.getParent()); @@ -92,4 +102,5 @@ public final class JarBuilder { private Path outputJar; private String mainClass; private String moduleVersion; + private Integer release; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java index 278cd569bac..79652a9828e 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java @@ -25,6 +25,7 @@ package jdk.jpackage.test; import java.io.IOException; import java.nio.file.Path; +import java.util.Optional; public final class LauncherIconVerifier { public LauncherIconVerifier() { @@ -37,19 +38,33 @@ public final class LauncherIconVerifier { public LauncherIconVerifier setExpectedIcon(Path v) { expectedIcon = v; + expectedDefault = false; return this; } public LauncherIconVerifier setExpectedDefaultIcon() { + expectedIcon = null; expectedDefault = true; return this; } + public LauncherIconVerifier setExpectedNoIcon() { + return setExpectedIcon(null); + } + public LauncherIconVerifier verifyFileInAppImageOnly(boolean v) { verifyFileInAppImageOnly = true; return this; } + public boolean expectDefaultIcon() { + return expectedDefault; + } + + public Optional expectIcon() { + return Optional.ofNullable(expectedIcon); + } + public void applyTo(JPackageCommand cmd) throws IOException { final String curLauncherName; final String label; @@ -70,7 +85,7 @@ public final class LauncherIconVerifier { WinExecutableIconVerifier.verifyLauncherIcon(cmd, launcherName, expectedIcon, expectedDefault); } } else if (expectedDefault) { - TKit.assertPathExists(iconPath, true); + TKit.assertFileExists(iconPath); } else if (expectedIcon == null) { TKit.assertPathExists(iconPath, false); } else { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 3a27ae32f43..9776ab5c4c8 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -22,7 +22,11 @@ */ package jdk.jpackage.test; +import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import static java.util.Collections.unmodifiableSortedSet; +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toMap; +import static java.util.stream.Collectors.toSet; import java.io.IOException; import java.io.UncheckedIOException; @@ -45,7 +49,6 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.internal.util.PathUtils; import jdk.jpackage.internal.util.function.ThrowingConsumer; @@ -164,8 +167,7 @@ public final class LinuxHelper { switch (packageType) { case LINUX_DEB: return Stream.of(getDebBundleProperty(cmd.outputBundle(), - "Depends").split(",")).map(String::strip).collect( - Collectors.toList()); + "Depends").split(",")).map(String::strip).toList(); case LINUX_RPM: return Executor.of("rpm", "-qp", "-R") @@ -326,10 +328,9 @@ public final class LinuxHelper { if (cmd.isRuntime()) { Path runtimeDir = cmd.appRuntimeDirectory(); Set expectedCriticalRuntimePaths = CRITICAL_RUNTIME_FILES.stream().map( - runtimeDir::resolve).collect(Collectors.toSet()); + runtimeDir::resolve).collect(toSet()); Set actualCriticalRuntimePaths = getPackageFiles(cmd).filter( - expectedCriticalRuntimePaths::contains).collect( - Collectors.toSet()); + expectedCriticalRuntimePaths::contains).collect(toSet()); checkPrerequisites = expectedCriticalRuntimePaths.equals( actualCriticalRuntimePaths); } else { @@ -375,8 +376,7 @@ public final class LinuxHelper { Function, String> verifier = (lines) -> { // Lookup for xdg commands return lines.stream().filter(line -> { - Set words = Stream.of(line.split("\\s+")).collect( - Collectors.toSet()); + Set words = Stream.of(line.split("\\s+")).collect(toSet()); return words.contains("xdg-desktop-menu") || words.contains( "xdg-mime") || words.contains("xdg-icon-resource"); }).findFirst().orElse(null); @@ -454,11 +454,29 @@ public final class LinuxHelper { } private static Collection getDesktopFiles(JPackageCommand cmd) { + var unpackedDir = cmd.appLayout().desktopIntegrationDirectory(); + + return relativePackageFilesInSubdirectory(cmd, ApplicationLayout::desktopIntegrationDirectory) + .filter(path -> { + return path.getNameCount() == 1; + }) + .filter(path -> { + return ".desktop".equals(PathUtils.getSuffix(path)); + }) + .map(unpackedDir::resolve) + .toList(); + } + + private static Stream relativePackageFilesInSubdirectory( + JPackageCommand cmd, Function subdirFunc) { + + var unpackedDir = subdirFunc.apply(cmd.appLayout()); var packageDir = cmd.pathToPackageFile(unpackedDir); + return getPackageFiles(cmd).filter(path -> { - return packageDir.equals(path.getParent()) && path.getFileName().toString().endsWith(".desktop"); - }).map(Path::getFileName).map(unpackedDir::resolve).toList(); + return path.startsWith(packageDir); + }).map(packageDir::relativize); } private static String launcherNameFromDesktopFile(JPackageCommand cmd, Optional predefinedAppImage, Path desktopFile) { @@ -496,7 +514,20 @@ public final class LinuxHelper { TKit.assertTrue(mandatoryKeys.isEmpty(), String.format( "Check for missing %s keys in the file", mandatoryKeys)); - for (var e : List.of(Map.entry("Type", "Application"), Map.entry("Terminal", "false"))) { + final String launcherDescription; + if (cmd.name().equals(launcherName) || predefinedAppImage.isPresent()) { + launcherDescription = Optional.ofNullable(cmd.getArgumentValue("--description")).orElseGet(cmd::name); + } else { + launcherDescription = getAdditionalLauncherProperties(cmd, launcherName).findProperty("description").or(() -> { + return Optional.ofNullable(cmd.getArgumentValue("--description")); + }).orElseGet(cmd::name); + } + + for (var e : List.of( + Map.entry("Type", "Application"), + Map.entry("Terminal", "false"), + Map.entry("Comment", launcherDescription) + )) { String key = e.getKey(); TKit.assertEquals(e.getValue(), data.find(key).orElseThrow(), String.format( "Check value of [%s] key", key)); @@ -768,10 +799,10 @@ public final class LinuxHelper { static final Pattern RPM_HEADER_PATTERN = Pattern.compile(String.format( "(%s) scriptlet \\(using /bin/sh\\):", Stream.of(values()).map( - v -> v.rpm).collect(Collectors.joining("|")))); + v -> v.rpm).collect(joining("|")))); static final Map RPM_MAP = Stream.of(values()).collect( - Collectors.toMap(v -> v.rpm, v -> v)); + toMap(v -> v.rpm, v -> v)); } public static String getDefaultPackageArch(PackageType type) { @@ -848,7 +879,7 @@ public final class LinuxHelper { } else { return Map.entry(components[0], components[1]); } - }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); } catch (IOException ex) { throw new UncheckedIOException(ex); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ObjectMapper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ObjectMapper.java new file mode 100644 index 00000000000..f35e255951e --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ObjectMapper.java @@ -0,0 +1,780 @@ +/* + * 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. + * + * 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 jdk.jpackage.test; + +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toSet; +import static jdk.jpackage.internal.util.function.ExceptionBox.rethrowUnchecked; +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; +import static jdk.jpackage.internal.util.function.ThrowingRunnable.toRunnable; +import static jdk.jpackage.internal.util.function.ThrowingSupplier.toSupplier; + +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.math.BigInteger; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.IntPredicate; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collector; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.xml.stream.XMLStreamWriter; +import jdk.jpackage.internal.util.IdentityWrapper; + +public final class ObjectMapper { + + private ObjectMapper( + Predicate classFilter, + Predicate> methodFilter, + Predicate leafClassFilter, + Map> substitutes, + Map, BiConsumer>> mutators, + Set accessPackageMethods) { + + this.classFilter = Objects.requireNonNull(classFilter); + this.methodFilter = Objects.requireNonNull(methodFilter); + this.leafClassFilter = Objects.requireNonNull(leafClassFilter); + this.substitutes = Objects.requireNonNull(substitutes); + this.mutators = Objects.requireNonNull(mutators); + this.accessPackageMethods = accessPackageMethods; + } + + public static Builder blank() { + return new Builder().allowAllLeafClasses(false).exceptLeafClasses().add(Stream.of( + Object.class, + String.class, String[].class, + boolean.class, Boolean.class, boolean[].class, Boolean[].class, + byte.class, Byte.class, byte[].class, Byte[].class, + char.class, Character.class, char[].class, Character[].class, + short.class, Short.class, short[].class, Short[].class, + int.class, Integer.class, int[].class, Integer[].class, + long.class, Long.class, long[].class, Long[].class, + float.class, Float.class, float[].class, Float[].class, + double.class, Double.class, double[].class, Double[].class, + void.class, Void.class, Void[].class + ).map(Class::getName).toList()).apply(); + } + + public static Builder standard() { + return blank() + .mutate(configureObject()) + .mutate(configureLeafClasses()) + .mutate(configureOptional()) + .mutate(configureFunctionalTypes()) + .mutate(configureEnum()) + .mutate(configureException()); + } + + public static Consumer configureObject() { + // Exclude all method of Object class. + return builder -> { + builder.exceptMethods().add(OBJECT_METHODS).apply(); + }; + } + + public static Consumer configureLeafClasses() { + return builder -> { + builder.exceptLeafClasses().add(Stream.of( + IdentityWrapper.class, + Class.class, + Path.class, + Path.of("").getClass(), + UUID.class, + BigInteger.class + ).map(Class::getName).toList()).apply(); + }; + } + + public static Consumer configureOptional() { + return builder -> { + // Filter out all but "get()" methods of "Optional" class. + builder.exceptAllMethods(Optional.class).remove("get").apply(); + // Substitute "Optional.get()" with the function that will return "null" if the value is "null". + builder.subst(Optional.class, "get", opt -> { + if (opt.isPresent()) { + return opt.get(); + } else { + return null; + } + }); + }; + } + + public static Consumer configureFunctionalTypes() { + // Remove all getters from the standard functional types. + return builder -> { + builder.exceptAllMethods(Predicate.class).apply(); + builder.exceptAllMethods(Supplier.class).apply(); + }; + } + + public static Consumer configureEnum() { + return builder -> { + // Filter out "getDeclaringClass()" and "describeConstable()" methods of "Enum" class. + builder.exceptSomeMethods(Enum.class).add("getDeclaringClass", "describeConstable").apply(); + }; + } + + public static Consumer configureException() { + return builder -> { + // Include only "getMessage()" and "getCause()" methods of "Exception" class. + builder.exceptAllMethods(Exception.class).remove("getMessage", "getCause").apply(); + builder.mutator(Exception.class, (ex, map) -> { + var eit = map.entrySet().iterator(); + while (eit.hasNext()) { + var e = eit.next(); + if (e.getValue() == NULL) { + // Remove property with the "null" value. + eit.remove(); + } + } + map.put("getClass", ex.getClass().getName()); + }); + }; + } + + public static String lookupFullMethodName(Method m) { + return lookupFullMethodName(m.getDeclaringClass(), m.getName()); + } + + public static String lookupFullMethodName(Class c, String m) { + return Objects.requireNonNull(c).getName() + lookupMethodName(m); + } + + public static String lookupMethodName(Method m) { + return lookupMethodName(m.getName()); + } + + public static String lookupMethodName(String m) { + return "#" + Objects.requireNonNull(m); + } + + public static Object wrapIdentity(Object v) { + if (v instanceof IdentityWrapper wrapper) { + return wrapper; + } else { + return new IdentityWrapper(v); + } + } + + public static void store(Map map, XMLStreamWriter xml) { + XmlWriter.writePropertyMap(map, xml); + } + + @SuppressWarnings("unchecked") + public static Optional findNonNullProperty(Map map, String propertyName) { + Objects.requireNonNull(propertyName); + Objects.requireNonNull(map); + + return Optional.ofNullable(map.get(propertyName)).filter(Predicate.not(NULL::equals)).map(v -> { + return (T)v; + }); + } + + public Object map(Object obj) { + if (obj != null) { + return mapObject(obj).orElseGet(Map::of); + } else { + return null; + } + } + + @SuppressWarnings("unchecked") + public Map toMap(Object obj) { + if (obj == null) { + return null; + } else { + var mappedObj = map(obj); + if (mappedObj instanceof Map m) { + return (Map)m; + } else { + return Map.of("value", mappedObj); + } + } + } + + public Optional mapObject(Object obj) { + if (obj == null) { + return Optional.empty(); + } + + if (leafClassFilter.test(obj.getClass().getName())) { + return Optional.of(obj); + } + + if (!filter(obj.getClass())) { + return Optional.empty(); + } + + if (obj instanceof Iterable col) { + return Optional.of(mapIterable(col)); + } + + if (obj instanceof Map map) { + return Optional.of(mapMap(map)); + } + + if (obj.getClass().isArray()) { + return Optional.of(mapArray(obj)); + } + + var theMap = getMethods(obj).map(m -> { + final Object propertyValue; + final var subst = substitutes.get(m); + if (subst != null) { + propertyValue = applyGetter(obj, subst); + } else { + propertyValue = invoke(m, obj); + } + return Map.entry(m.getName(), mapObject(propertyValue).orElse(NULL)); + }).collect(toMutableMap(Map.Entry::getKey, Map.Entry::getValue)); + + mutators.entrySet().stream().filter(m -> { + return m.getKey().isInstance(obj); + }).findFirst().ifPresent(m -> { + m.getValue().accept(obj, theMap); + }); + + if (theMap.isEmpty()) { + return Optional.of(wrapIdentity(obj)); + } + + return Optional.of(theMap); + } + + private Object invoke(Method m, Object obj) { + try { + return m.invoke(obj); + } catch (IllegalAccessException ex) { + throw rethrowUnchecked(ex); + } catch (InvocationTargetException ex) { + return map(ex.getTargetException()); + } + } + + private Collection mapIterable(Iterable col) { + final List list = new ArrayList<>(); + for (var obj : col) { + list.add(mapObject(obj).orElse(NULL)); + } + return list; + } + + private Map mapMap(Map map) { + return map.entrySet().stream().collect(toMutableMap(e -> { + return mapObject(e.getKey()).orElse(NULL); + }, e -> { + return mapObject(e.getValue()).orElse(NULL); + })); + } + + private Object mapArray(Object arr) { + final var len = Array.getLength(arr); + + if (len == 0) { + return arr; + } + + Object[] buf = null; + + for (int i = 0; i != len; i++) { + var from = Array.get(arr, i); + if (from != null) { + var to = mapObject(from).orElseThrow(); + if (from != to || buf != null) { + if (buf == null) { + buf = (Object[])Array.newInstance(Object.class, len); + System.arraycopy(arr, 0, buf, 0, i); + } + buf[i] = to; + } + } + } + + return Optional.ofNullable((Object)buf).orElse(arr); + } + + @SuppressWarnings("unchecked") + private static Object applyGetter(Object obj, Function getter) { + return getter.apply((T)obj); + } + + private boolean filter(Class type) { + return classFilter.test(type.getName()); + } + + private boolean filter(Method m) { + return methodFilter.test(List.of(lookupMethodName(m), lookupFullMethodName(m))); + } + + private Stream getMethods(Object obj) { + return MethodGroups.create(obj.getClass(), accessPackageMethods).filter(this::filter).map(MethodGroup::callable); + } + + private static boolean defaultFilter(Method m) { + if (Modifier.isStatic(m.getModifiers()) || (m.getParameterCount() > 0) || void.class.equals(m.getReturnType())) { + return false; + } + return true; + } + + private static + Collector> toMutableMap(Function keyMapper, + Function valueMapper) { + return Collectors.toMap(keyMapper, valueMapper, (x , y) -> { + throw new UnsupportedOperationException( + String.format("Entries with the same key and different values [%s] and [%s]", x, y)); + }, HashMap::new); + } + + public static final class Builder { + + private Builder() { + allowAllClasses(); + allowAllLeafClasses(); + allowAllMethods(); + } + + public ObjectMapper create() { + return new ObjectMapper( + classFilter.createPredicate(), + methodFilter.createMultiPredicate(), + leafClassFilter.createPredicate(), + Map.copyOf(substitutes), + Map.copyOf(mutators), + accessPackageMethods); + } + + + public final class NamePredicateBuilder { + + NamePredicateBuilder(Filter sink) { + this.sink = Objects.requireNonNull(sink); + } + + public Builder apply() { + sink.addAll(items); + return Builder.this; + } + + public NamePredicateBuilder add(String... v) { + return add(List.of(v)); + } + + public NamePredicateBuilder add(Collection v) { + items.addAll(v); + return this; + } + + private final Filter sink; + private final Set items = new HashSet<>(); + } + + + public final class AllMethodPredicateBuilder { + + AllMethodPredicateBuilder(Class type) { + impl = new MethodPredicateBuilder(type, false); + } + + public AllMethodPredicateBuilder remove(String... v) { + return remove(List.of(v)); + } + + public AllMethodPredicateBuilder remove(Collection v) { + impl.add(v); + return this; + } + + public Builder apply() { + return impl.apply(); + } + + private final MethodPredicateBuilder impl; + } + + + public final class SomeMethodPredicateBuilder { + + SomeMethodPredicateBuilder(Class type) { + impl = new MethodPredicateBuilder(type, true); + } + + public SomeMethodPredicateBuilder add(String... v) { + return add(List.of(v)); + } + + public SomeMethodPredicateBuilder add(Collection v) { + impl.add(v); + return this; + } + + public Builder apply() { + return impl.apply(); + } + + private final MethodPredicateBuilder impl; + } + + + public Builder allowAllClasses(boolean v) { + classFilter.negate(v); + return this; + } + + public Builder allowAllClasses() { + return allowAllClasses(true); + } + + public Builder allowAllMethods(boolean v) { + methodFilter.negate(v); + return this; + } + + public Builder allowAllMethods() { + return allowAllMethods(true); + } + + public Builder allowAllLeafClasses(boolean v) { + leafClassFilter.negate(v); + return this; + } + + public Builder allowAllLeafClasses() { + return allowAllLeafClasses(true); + } + + public NamePredicateBuilder exceptClasses() { + return new NamePredicateBuilder(classFilter); + } + + public AllMethodPredicateBuilder exceptAllMethods(Class type) { + return new AllMethodPredicateBuilder(type); + } + + public SomeMethodPredicateBuilder exceptSomeMethods(Class type) { + return new SomeMethodPredicateBuilder(type); + } + + public NamePredicateBuilder exceptMethods() { + return new NamePredicateBuilder(methodFilter); + } + + public NamePredicateBuilder exceptLeafClasses() { + return new NamePredicateBuilder(leafClassFilter); + } + + public Builder subst(Method target, Function substitute) { + substitutes.put(Objects.requireNonNull(target), Objects.requireNonNull(substitute)); + return this; + } + + public Builder subst(Class targetClass, String targetMethodName, Function substitute) { + var method = toSupplier(() -> targetClass.getMethod(targetMethodName)).get(); + return subst(method, substitute); + } + + public Builder mutator(Class targetClass, BiConsumer> mutator) { + mutators.put(Objects.requireNonNull(targetClass), Objects.requireNonNull(mutator)); + return this; + } + + public Builder mutate(Consumer mutator) { + mutator.accept(this); + return this; + } + + public Builder accessPackageMethods(Package... packages) { + Stream.of(packages).map(Package::getName).forEach(accessPackageMethods::add); + return this; + } + + + private final class MethodPredicateBuilder { + + MethodPredicateBuilder(Class type, boolean negate) { + this.type = Objects.requireNonNull(type); + buffer.negate(negate); + } + + void add(Collection v) { + buffer.addAll(v); + } + + Builder apply() { + var pred = buffer.createPredicate(); + + var items = MethodGroups.create(type, accessPackageMethods).groups().stream().map(MethodGroup::primary).filter(m -> { + return !OBJECT_METHODS.contains(ObjectMapper.lookupMethodName(m)); + }).filter(m -> { + return !pred.test(m.getName()); + }).map(ObjectMapper::lookupFullMethodName).toList(); + + return exceptMethods().add(items).apply(); + } + + private final Class type; + private final Filter buffer = new Filter(); + } + + + private static final class Filter { + Predicate> createMultiPredicate() { + if (items.isEmpty()) { + var match = negate; + return v -> match; + } else if (negate) { + return v -> { + return v.stream().noneMatch(Set.copyOf(items)::contains); + }; + } else { + return v -> { + return v.stream().anyMatch(Set.copyOf(items)::contains); + }; + } + } + + Predicate createPredicate() { + if (items.isEmpty()) { + var match = negate; + return v -> match; + } else if (negate) { + return Predicate.not(Set.copyOf(items)::contains); + } else { + return Set.copyOf(items)::contains; + } + } + + void addAll(Collection v) { + items.addAll(v); + } + + void negate(boolean v) { + negate = v; + } + + private boolean negate; + private final Set items = new HashSet<>(); + } + + + private final Filter classFilter = new Filter(); + private final Filter methodFilter = new Filter(); + private final Filter leafClassFilter = new Filter(); + private final Map> substitutes = new HashMap<>(); + private final Map, BiConsumer>> mutators = new HashMap<>(); + private final Set accessPackageMethods = new HashSet<>(); + } + + + private record MethodGroup(List methods) { + + MethodGroup { + Objects.requireNonNull(methods); + + if (methods.isEmpty()) { + throw new IllegalArgumentException(); + } + + methods.stream().map(Method::getName).reduce((a, b) -> { + if (!a.equals(b)) { + throw new IllegalArgumentException(); + } else { + return a; + } + }); + } + + Method callable() { + var primary = primary(); + if (!primary.getDeclaringClass().isInterface()) { + primary = methods.stream().filter(m -> { + return m.getDeclaringClass().isInterface(); + }).findFirst().orElse(primary); + } + return primary; + } + + Method primary() { + return methods.getFirst(); + } + + boolean match(Predicate predicate) { + Objects.requireNonNull(predicate); + return methods.stream().allMatch(predicate); + } + } + + + private record MethodGroups(Collection groups) { + + MethodGroups { + Objects.requireNonNull(groups); + } + + Stream filter(Predicate predicate) { + Objects.requireNonNull(predicate); + + return groups.stream().filter(g -> { + return g.match(predicate); + }); + } + + static MethodGroups create(Class type, Set accessPackageMethods) { + List> types = new ArrayList<>(); + + collectSuperclassAndInterfaces(type, types::add); + + final var methodGroups = types.stream() + .map(c -> { + if (accessPackageMethods.contains(c.getPackageName())) { + return PUBLIC_AND_PACKAGE_METHODS_GETTER.apply(c); + } else { + return PUBLIC_METHODS_GETTER.apply(c); + } + }) + .flatMap(x -> x) + .filter(ObjectMapper::defaultFilter) + .collect(groupingBy(Method::getName)); + + return new MethodGroups(methodGroups.values().stream().distinct().map(MethodGroup::new).toList()); + } + + private static void collectSuperclassAndInterfaces(Class type, Consumer> sink) { + Objects.requireNonNull(type); + Objects.requireNonNull(sink); + + for (; type != null; type = type.getSuperclass()) { + sink.accept(type); + for (var i : type.getInterfaces()) { + collectSuperclassAndInterfaces(i, sink); + } + } + } + } + + + private static final class XmlWriter { + static void write(Object obj, XMLStreamWriter xml) { + if (obj instanceof Map map) { + writePropertyMap(map, xml); + } else if (obj instanceof Collection col) { + writeCollection(col, xml); + } else if (obj.getClass().isArray()) { + writeArray(obj, xml); + } else { + toRunnable(() -> xml.writeCharacters(obj.toString())).run(); + } + } + + private static void writePropertyMap(Map map, XMLStreamWriter xml) { + map.entrySet().stream().sorted(Comparator.comparing(e -> e.getKey().toString())).forEach(toConsumer(e -> { + xml.writeStartElement("property"); + xml.writeAttribute("name", e.getKey().toString()); + write(e.getValue(), xml); + xml.writeEndElement(); + })); + } + + private static void writeCollection(Collection col, XMLStreamWriter xml) { + try { + xml.writeStartElement("collection"); + xml.writeAttribute("size", Integer.toString(col.size())); + for (var item : col) { + xml.writeStartElement("item"); + write(item, xml); + xml.writeEndElement(); + } + xml.writeEndElement(); + } catch (Exception ex) { + rethrowUnchecked(ex); + } + } + + private static void writeArray(Object arr, XMLStreamWriter xml) { + var len = Array.getLength(arr); + try { + xml.writeStartElement("array"); + xml.writeAttribute("size", Integer.toString(len)); + for (int i = 0; i != len; i++) { + xml.writeStartElement("item"); + write(Array.get(arr, i), xml); + xml.writeEndElement(); + } + xml.writeEndElement(); + } catch (Exception ex) { + rethrowUnchecked(ex); + } + } + } + + + private final Predicate classFilter; + private final Predicate> methodFilter; + private final Predicate leafClassFilter; + private final Map> substitutes; + private final Map, BiConsumer>> mutators; + private final Set accessPackageMethods; + + static final Object NULL = new Object() { + @Override + public String toString() { + return ""; + } + }; + + private static final Set OBJECT_METHODS = + Stream.of(Object.class.getMethods()).map(ObjectMapper::lookupMethodName).collect(toSet()); + + private static final Function, Stream> PUBLIC_METHODS_GETTER = type -> { + return Stream.of(type.getMethods()); + }; + + private static final Function, Stream> PUBLIC_AND_PACKAGE_METHODS_GETTER = type -> { + return Stream.of(type.getDeclaredMethods()).filter(m -> { + return Stream.of(Modifier::isPrivate, Modifier::isProtected).map(p -> { + return p.test(m.getModifiers()); + }).allMatch(v -> !v); + }).map(m -> { + m.setAccessible(true); + return m; + }); + }; +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java index 84453038cd2..3226811fe36 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java @@ -39,7 +39,6 @@ import java.nio.file.Path; import java.time.Duration; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -318,6 +317,11 @@ public final class PackageTest extends RunnablePackageTest { return this; } + public PackageTest mutate(Consumer mutator) { + mutator.accept(this); + return this; + } + public PackageTest forTypes(Collection types, Runnable action) { final var oldTypes = Set.of(currentTypes.toArray(PackageType[]::new)); try { @@ -334,7 +338,11 @@ public final class PackageTest extends RunnablePackageTest { } public PackageTest forTypes(PackageType type, Consumer action) { - return forTypes(List.of(type), () -> action.accept(this)); + return forTypes(List.of(type), action); + } + + public PackageTest forTypes(Collection types, Consumer action) { + return forTypes(types, () -> action.accept(this)); } public PackageTest notForTypes(Collection types, Runnable action) { @@ -348,7 +356,11 @@ public final class PackageTest extends RunnablePackageTest { } public PackageTest notForTypes(PackageType type, Consumer action) { - return notForTypes(List.of(type), () -> action.accept(this)); + return notForTypes(List.of(type), action); + } + + public PackageTest notForTypes(Collection types, Consumer action) { + return notForTypes(types, () -> action.accept(this)); } public PackageTest configureHelloApp() { @@ -780,7 +792,7 @@ public final class PackageTest extends RunnablePackageTest { LauncherAsServiceVerifier.verify(cmd); } - cmd.assertAppLayout(); + cmd.runStandardAsserts(); installVerifiers.forEach(v -> v.accept(cmd)); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index bdf9fb85672..a19b3697a81 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -1260,8 +1260,8 @@ public final class TKit { this(hashRecursive(path)); } - public static void assertEquals(PathSnapshot a, PathSnapshot b, String msg) { - assertStringListEquals(a.contentHashes(), b.contentHashes(), msg); + public void assertEquals(PathSnapshot other, String msg) { + assertStringListEquals(contentHashes(), other.contentHashes(), msg); } private static List hashRecursive(Path path) { diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/IdentityWrapperTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/IdentityWrapperTest.java new file mode 100644 index 00000000000..471a7cb55a9 --- /dev/null +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/IdentityWrapperTest.java @@ -0,0 +1,157 @@ +/* + * 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. + * + * 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 jdk.jpackage.internal.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; + + +public class IdentityWrapperTest { + + @Test + public void test_null() { + assertThrows(NullPointerException.class, () -> identityOf(null)); + } + + @Test + public void test_equals() { + var obj = new TestRecord(10); + assertEquals(identityOf(obj), identityOf(obj)); + } + + @Test + public void test_not_equals() { + var identity = identityOf(new TestRecord(10)); + var identity2 = identityOf(new TestRecord(10)); + assertNotEquals(identity, identity2); + assertEquals(identity.value(), identity2.value()); + } + + @Test + public void test_Foo() { + var foo = new Foo(10); + assertFalse(foo.accessed()); + + foo.hashCode(); + assertTrue(foo.accessed()); + assertTrue(foo.hashCodeCalled()); + assertFalse(foo.equalsCalled()); + + foo = new Foo(1); + foo.equals(null); + assertTrue(foo.accessed()); + assertFalse(foo.hashCodeCalled()); + assertTrue(foo.equalsCalled()); + } + + @Test + public void test_wrappedValue_not_accessed() { + var identity = identityOf(new Foo(10)); + var identity2 = identityOf(new Foo(10)); + assertNotEquals(identity, identity2); + + assertFalse(identity.value().accessed()); + assertFalse(identity2.value().accessed()); + + assertEquals(identity.value(), identity2.value()); + assertEquals(identity2.value(), identity.value()); + + assertTrue(identity.value().accessed()); + assertTrue(identity2.value().accessed()); + } + + @Test + public void test_wrappedValue_not_accessed_in_set() { + var identitySet = Set.of(identityOf(new Foo(10)), identityOf(new Foo(10)), identityOf(new Foo(10))); + assertEquals(3, identitySet.size()); + + var valueSet = identitySet.stream().peek(identity -> { + assertFalse(identity.value().accessed()); + }).map(IdentityWrapper::value).collect(Collectors.toSet()); + + assertEquals(1, valueSet.size()); + } + + private static IdentityWrapper identityOf(T obj) { + return new IdentityWrapper<>(obj); + } + + private record TestRecord(int v) {} + + private final static class Foo { + + Foo(int v) { + this.v = v; + } + + @Override + public int hashCode() { + try { + return Objects.hash(v); + } finally { + hashCodeCalled = true; + } + } + + @Override + public boolean equals(Object obj) { + try { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Foo other = (Foo) obj; + return v == other.v; + } finally { + equalsCalled = true; + } + } + + boolean equalsCalled() { + return equalsCalled; + } + + boolean hashCodeCalled() { + return hashCodeCalled; + } + + boolean accessed() { + return equalsCalled() || hashCodeCalled(); + } + + private final int v; + private boolean equalsCalled; + private boolean hashCodeCalled; + } +} diff --git a/test/jdk/tools/jpackage/junit/tools/jdk/jpackage/test/JUnitUtils.java b/test/jdk/tools/jpackage/junit/tools/jdk/jpackage/test/JUnitUtils.java new file mode 100644 index 00000000000..c91b178cb10 --- /dev/null +++ b/test/jdk/tools/jpackage/junit/tools/jdk/jpackage/test/JUnitUtils.java @@ -0,0 +1,139 @@ +/* + * 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. + * + * 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 jdk.jpackage.test; + +import java.util.Map; +import java.util.Objects; +import org.junit.jupiter.api.Assertions; + + +public final class JUnitUtils { + + /** + * Convenience adapter for {@link Assertions#assertArrayEquals(byte[], byte[])}, + * {@link Assertions#assertArrayEquals(int[], int[])}, + * {@link Assertions#assertArrayEquals(Object[], Object[])}, etc. methods. + * + * @param expected the expected array to test for equality + * @param actual the actual array to test for equality + */ + public static void assertArrayEquals(Object expected, Object actual) { + ARRAY_ASSERTERS.getOrDefault(expected.getClass().componentType(), OBJECT_ARRAY_ASSERTER).acceptUnchecked(expected, actual); + } + + /** + * Converts the given exception object to a property map. + *

        + * Values returned by public getters are added to the map. Names of getters are + * the keys in the returned map. The values are property map representations of + * the objects returned by the getters. Only {@link Throwable#getMessage()} and + * {@link Throwable#getCause()} getters are picked for the property map by + * default. If the exception class has additional getters, they will be added to + * the map. {@code null} is permitted. + * + * @param ex the exception to convert into a property map + * @return the property map view of the given exception object + */ + public static Map exceptionAsPropertyMap(Exception ex) { + return EXCEPTION_OM.toMap(ex); + } + + + public static final class ExceptionPattern { + + public ExceptionPattern() { + } + + public boolean match(Exception ex) { + Objects.requireNonNull(ex); + + if (expectedType != null && !expectedType.isInstance(ex)) { + return false; + } + + if (expectedMessage != null && !expectedMessage.equals(ex.getMessage())) { + return false; + } + + if (expectedCauseType != null && !expectedCauseType.isInstance(ex.getCause())) { + return false; + } + + return true; + } + + public ExceptionPattern hasMessage(String v) { + expectedMessage = v; + return this; + } + + public ExceptionPattern isInstanceOf(Class v) { + expectedType = v; + return this; + } + + public ExceptionPattern isCauseInstanceOf(Class v) { + expectedCauseType = v; + return this; + } + + public ExceptionPattern hasCause(boolean v) { + return isCauseInstanceOf(v ? Exception.class : null); + } + + public ExceptionPattern hasCause() { + return hasCause(true); + } + + private String expectedMessage; + private Class expectedType; + private Class expectedCauseType; + } + + + @FunctionalInterface + private interface ArrayEqualsAsserter { + void accept(T expected, T actual); + + @SuppressWarnings("unchecked") + default void acceptUnchecked(Object expected, Object actual) { + accept((T)expected, (T)actual); + } + } + + + private static final Map, ArrayEqualsAsserter> ARRAY_ASSERTERS = Map.of( + boolean.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + byte.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + char.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + double.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + float.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + int.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + long.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals, + short.class, (ArrayEqualsAsserter)Assertions::assertArrayEquals + ); + + private static final ArrayEqualsAsserter OBJECT_ARRAY_ASSERTER = Assertions::assertArrayEquals; + + private static final ObjectMapper EXCEPTION_OM = ObjectMapper.standard().create(); +} diff --git a/test/jdk/tools/jpackage/linux/ShortcutHintTest.java b/test/jdk/tools/jpackage/linux/ShortcutHintTest.java index 4d3b33bcd6b..8d373cb2b86 100644 --- a/test/jdk/tools/jpackage/linux/ShortcutHintTest.java +++ b/test/jdk/tools/jpackage/linux/ShortcutHintTest.java @@ -164,7 +164,7 @@ public class ShortcutHintTest { "Exec=APPLICATION_LAUNCHER", "Terminal=false", "Type=Application", - "Comment=", + "Comment=APPLICATION_DESCRIPTION", "Icon=APPLICATION_ICON", "Categories=DEPLOY_BUNDLE_CATEGORY", expectedVersionString diff --git a/test/jdk/tools/jpackage/share/AddLShortcutTest.java b/test/jdk/tools/jpackage/share/AddLShortcutTest.java index 9c50c6ffc98..f000e79227e 100644 --- a/test/jdk/tools/jpackage/share/AddLShortcutTest.java +++ b/test/jdk/tools/jpackage/share/AddLShortcutTest.java @@ -118,6 +118,12 @@ public class AddLShortcutTest { HelloApp.createBundle(JavaAppDesc.parse(addLauncherApp + "*another.jar:Welcome"), cmd.inputDir()); }); + if (RunnablePackageTest.hasAction(RunnablePackageTest.Action.INSTALL)) { + // Ensure launchers are executable because the output bundle will be installed + // and launchers will be attempted to be executed through their shortcuts. + packageTest.addInitializer(JPackageCommand::ignoreFakeRuntime); + } + new FileAssociations(packageName).applyTo(packageTest); new AdditionalLauncher("Foo") diff --git a/test/jdk/tools/jpackage/share/AddLauncherTest.java b/test/jdk/tools/jpackage/share/AddLauncherTest.java index a7bfbf376ed..21f475cbd78 100644 --- a/test/jdk/tools/jpackage/share/AddLauncherTest.java +++ b/test/jdk/tools/jpackage/share/AddLauncherTest.java @@ -21,18 +21,22 @@ * questions. */ -import java.nio.file.Path; -import java.util.Map; import java.lang.invoke.MethodHandles; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.FileAssociations; +import java.nio.file.Path; +import java.util.function.Consumer; +import jdk.internal.util.OperatingSystem; import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.CfgFile; +import jdk.jpackage.test.ConfigurationTarget; +import jdk.jpackage.test.FileAssociations; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JavaAppDesc; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.RunnablePackageTest.Action; import jdk.jpackage.test.TKit; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.CfgFile; /** * Test --add-launcher parameter. Output of the test should be @@ -233,6 +237,61 @@ public class AddLauncherTest { "Check app.classpath value in ModularAppLauncher cfg file"); } + /** + * Test --description option + */ + @Test(ifNotOS = OperatingSystem.MACOS) // Don't run on macOS as launcher description is ignored on this platform + @Parameter("true") + @Parameter("fase") + public void testDescription(boolean withPredefinedAppImage) { + + ConfigurationTarget target; + if (TKit.isWindows() || withPredefinedAppImage) { + target = new ConfigurationTarget(JPackageCommand.helloAppImage()); + } else { + target = new ConfigurationTarget(new PackageTest().configureHelloApp()); + } + + target.addInitializer(cmd -> { + cmd.setArgumentValue("--name", "Foo").setArgumentValue("--description", "Hello"); + cmd.setFakeRuntime(); + cmd.setStandardAsserts(JPackageCommand.StandardAssert.MAIN_LAUNCHER_DESCRIPTION); + }); + + target.add(new AdditionalLauncher("x")); + target.add(new AdditionalLauncher("bye").setProperty("description", "Bye")); + + target.test().ifPresent(test -> { + // Make all launchers have shortcuts and thus .desktop files. + // Launcher description is recorded in a desktop file and verified automatically. + test.mutate(addLinuxShortcuts()); + }); + + target.cmd().ifPresent(withPredefinedAppImage ? JPackageCommand::execute : JPackageCommand::executeAndAssertImageCreated); + target.test().ifPresent(test -> { + test.run(Action.CREATE_AND_UNPACK); + }); + + if (withPredefinedAppImage) { + new PackageTest().addInitializer(cmd -> { + cmd.setArgumentValue("--name", "Bar"); + // Should not have impact of launcher descriptions, but it does. + cmd.setArgumentValue("--description", "Installer"); + cmd.removeArgumentWithValue("--input").setArgumentValue("--app-image", target.cmd().orElseThrow().outputBundle()); + }).mutate(addLinuxShortcuts()).run(Action.CREATE_AND_UNPACK); + } + } + + private static Consumer addLinuxShortcuts() { + return test -> { + test.forTypes(PackageType.LINUX, () -> { + test.addInitializer(cmd -> { + cmd.addArgument("--linux-shortcut"); + }); + }); + }; + } + private static final Path GOLDEN_ICON = TKit.TEST_SRC_ROOT.resolve(Path.of( "resources", "icon" + TKit.ICON_SUFFIX)); } diff --git a/test/jdk/tools/jpackage/share/AppImagePackageTest.java b/test/jdk/tools/jpackage/share/AppImagePackageTest.java index 34a418c6f9e..aacb76b122b 100644 --- a/test/jdk/tools/jpackage/share/AppImagePackageTest.java +++ b/test/jdk/tools/jpackage/share/AppImagePackageTest.java @@ -21,20 +21,21 @@ * questions. */ -import java.nio.file.Path; -import java.nio.file.Files; import java.io.IOException; -import java.util.List; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.function.Predicate; import jdk.jpackage.internal.util.XmlUtils; -import jdk.jpackage.test.AppImageFile; import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.AppImageFile; import jdk.jpackage.test.CannedFormattedString; -import jdk.jpackage.test.TKit; import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.JPackageCommand.StandardAssert; import jdk.jpackage.test.JPackageStringBundle; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.RunnablePackageTest.Action; -import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.TKit; /** * Test --app-image parameter. The output installer should provide the same @@ -55,56 +56,86 @@ import jdk.jpackage.test.Annotations.Test; */ public class AppImagePackageTest { + /** + * Create a native bundle from a valid predefined app image produced by jpackage. + */ @Test public static void test() { - Path appimageOutput = TKit.workDir().resolve("appimage"); - JPackageCommand appImageCmd = JPackageCommand.helloAppImage() - .setArgumentValue("--dest", appimageOutput); + var appImageCmd = JPackageCommand.helloAppImage() + .setArgumentValue("--dest", TKit.createTempDirectory("appimage")); new PackageTest() - .addRunOnceInitializer(() -> appImageCmd.execute()) + .addRunOnceInitializer(appImageCmd::execute) .addInitializer(cmd -> { cmd.addArguments("--app-image", appImageCmd.outputBundle()); cmd.removeArgumentWithValue("--input"); }).addBundleDesktopIntegrationVerifier(false).run(); } + /** + * Create a native bundle from a predefined app image not produced by jpackage + * but having a valid ".jpackage.xml" file. + * + * @param withIcon {@code true} if jpackage command line should have "--icon" + * option + */ @Test @Parameter("true") @Parameter("false") public static void testEmpty(boolean withIcon) throws IOException { - final String name = "EmptyAppImagePackageTest"; - final String imageName = name + (TKit.isOSX() ? ".app" : ""); - Path appImageDir = TKit.createTempDirectory("appimage").resolve(imageName); - Files.createDirectories(appImageDir.resolve("bin")); - Path libDir = Files.createDirectories(appImageDir.resolve("lib")); - TKit.createTextFile(libDir.resolve("README"), - List.of("This is some arbitrary text for the README file\n")); + var appImageCmd = JPackageCommand.helloAppImage() + .setFakeRuntime() + .setArgumentValue("--name", "EmptyAppImagePackageTest") + .setArgumentValue("--dest", TKit.createTempDirectory("appimage")); new PackageTest() + .addRunOnceInitializer(appImageCmd::execute) + .addRunOnceInitializer(() -> { + var layout = appImageCmd.appLayout(); + if (!TKit.isOSX()) { + // Delete the launcher if not on macOS. + // On macOS, deleting the launcher will render the app bundle invalid. + TKit.deleteIfExists(appImageCmd.appLauncherPath()); + } + // Delete the runtime. + TKit.deleteDirectoryRecursive(layout.runtimeDirectory()); + // Delete the "app" dir. + TKit.deleteDirectoryRecursive(layout.appDirectory()); + + new AppImageFile(appImageCmd.name(), "PhonyMainClass").save(appImageCmd.outputBundle()); + var appImageDir = appImageCmd.outputBundle(); + + TKit.trace(String.format("Files in [%s] app image:", appImageDir)); + try (var files = Files.walk(appImageDir)) { + files.sequential() + .filter(Predicate.isEqual(appImageDir).negate()) + .map(path -> String.format("[%s]", appImageDir.relativize(path))) + .forEachOrdered(TKit::trace); + TKit.trace("Done"); + } + }) .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageDir); + cmd.addArguments("--app-image", appImageCmd.outputBundle()); if (withIcon) { cmd.addArguments("--icon", iconPath("icon")); } cmd.removeArgumentWithValue("--input"); - new AppImageFile("EmptyAppImagePackageTest", "Hello").save(appImageDir); - // on mac, with --app-image and without --mac-package-identifier, - // will try to infer it from the image, so foreign image needs it. - if (TKit.isOSX()) { - cmd.addArguments("--mac-package-identifier", name); - } + cmd.excludeStandardAsserts( + StandardAssert.MAIN_JAR_FILE, + StandardAssert.MAIN_LAUNCHER_FILES, + StandardAssert.MAC_BUNDLE_STRUCTURE, + StandardAssert.RUNTIME_DIRECTORY); }) - // On macOS we always signing app image and signing will fail, since - // test produces invalid app bundle. - .setExpectedExitCode(TKit.isOSX() ? 1 : 0) - .run(Action.CREATE, Action.UNPACK); - // default: {CREATE, UNPACK, VERIFY}, but we can't verify foreign image + .run(Action.CREATE_AND_UNPACK); } + /** + * Bad predefined app image - not an output of jpackage. + * jpackage command using the bad predefined app image doesn't have "--name" option. + */ @Test public static void testBadAppImage() throws IOException { Path appImageDir = TKit.createTempDirectory("appimage"); @@ -114,6 +145,9 @@ public class AppImagePackageTest { }).run(Action.CREATE); } + /** + * Bad predefined app image - not an output of jpackage. + */ @Test public static void testBadAppImage2() throws IOException { Path appImageDir = TKit.createTempDirectory("appimage"); @@ -121,8 +155,11 @@ public class AppImagePackageTest { configureBadAppImage(appImageDir).run(Action.CREATE); } + /** + * Bad predefined app image - valid app image missing ".jpackage.xml" file. + */ @Test - public static void testBadAppImage3() throws IOException { + public static void testBadAppImage3() { Path appImageDir = TKit.createTempDirectory("appimage"); JPackageCommand appImageCmd = JPackageCommand.helloAppImage(). @@ -134,8 +171,11 @@ public class AppImagePackageTest { }).run(Action.CREATE); } + /** + * Bad predefined app image - valid app image with invalid ".jpackage.xml" file. + */ @Test - public static void testBadAppImageFile() throws IOException { + public static void testBadAppImageFile() { final var appImageRoot = TKit.createTempDirectory("appimage"); final var appImageCmd = JPackageCommand.helloAppImage(). diff --git a/test/jdk/tools/jpackage/share/InOutPathTest.java b/test/jdk/tools/jpackage/share/InOutPathTest.java index f7c597d2ed3..d36731c2960 100644 --- a/test/jdk/tools/jpackage/share/InOutPathTest.java +++ b/test/jdk/tools/jpackage/share/InOutPathTest.java @@ -38,7 +38,7 @@ import jdk.jpackage.test.Annotations.Parameters; import jdk.jpackage.test.Annotations.Test; import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.JPackageCommand.AppLayoutAssert; +import jdk.jpackage.test.JPackageCommand.StandardAssert; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import static jdk.jpackage.test.RunnablePackageTest.Action.CREATE_AND_UNPACK; @@ -177,7 +177,7 @@ public final class InOutPathTest { if (!isAppImageValid(cmd)) { // Standard asserts for .jpackage.xml fail in messed up app image. Disable them. // Other standard asserts for app image contents should pass. - cmd.excludeAppLayoutAsserts(AppLayoutAssert.APP_IMAGE_FILE); + cmd.excludeStandardAsserts(StandardAssert.APP_IMAGE_FILE); } }; diff --git a/test/jdk/tools/jpackage/share/LicenseTest.java b/test/jdk/tools/jpackage/share/LicenseTest.java index c9e3c8508aa..1c6bfd51b62 100644 --- a/test/jdk/tools/jpackage/share/LicenseTest.java +++ b/test/jdk/tools/jpackage/share/LicenseTest.java @@ -208,7 +208,7 @@ public class LicenseTest { private static void verifyLicenseFileInLinuxPackage(JPackageCommand cmd, Path expectedLicensePath) { TKit.assertTrue(LinuxHelper.getPackageFiles(cmd).filter(path -> path.equals( - expectedLicensePath)).findFirst().orElse(null) != null, + expectedLicensePath)).findFirst().isPresent(), String.format("Check license file [%s] is in %s package", expectedLicensePath, LinuxHelper.getPackageName(cmd))); } diff --git a/test/jdk/tools/jpackage/share/RuntimePackageTest.java b/test/jdk/tools/jpackage/share/RuntimePackageTest.java index f66f774b227..caa129713b4 100644 --- a/test/jdk/tools/jpackage/share/RuntimePackageTest.java +++ b/test/jdk/tools/jpackage/share/RuntimePackageTest.java @@ -135,11 +135,7 @@ public class RuntimePackageTest { }) .addInstallVerifier(cmd -> { var src = TKit.assertDirectoryContentRecursive(inputRuntimeDir(cmd)).items(); - Path dest = cmd.appRuntimeDirectory(); - if (TKit.isOSX()) { - dest = dest.resolve("Contents/Home"); - } - + var dest = cmd.appLayout().runtimeHomeDirectory(); TKit.assertDirectoryContentRecursive(dest).match(src); }) .forTypes(PackageType.LINUX_DEB, test -> { From 70e786154fae78c0dacaa3e29c7aa4d3d14b892b Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Wed, 22 Oct 2025 06:01:11 +0000 Subject: [PATCH 241/561] 8370248: AOTMapLogger should check if pointer is in AOTMetaspace Reviewed-by: kvn, adinn --- src/hotspot/share/cds/aotMapLogger.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/cds/aotMapLogger.cpp b/src/hotspot/share/cds/aotMapLogger.cpp index b0e410b5cf1..151c15048c2 100644 --- a/src/hotspot/share/cds/aotMapLogger.cpp +++ b/src/hotspot/share/cds/aotMapLogger.cpp @@ -135,12 +135,14 @@ public: virtual bool do_unique_ref(Ref* ref, bool read_only) { ArchivedObjInfo info; - info._src_addr = ref->obj(); - info._buffered_addr = ref->obj(); - info._requested_addr = ref->obj(); - info._bytes = ref->size() * BytesPerWord; - info._type = ref->msotype(); - _objs.append(info); + if (AOTMetaspace::in_aot_cache(ref->obj())) { + info._src_addr = ref->obj(); + info._buffered_addr = ref->obj(); + info._requested_addr = ref->obj(); + info._bytes = ref->size() * BytesPerWord; + info._type = ref->msotype(); + _objs.append(info); + } return true; // keep iterating } From eff4b1103396dc8e383d86472435ff983e298b61 Mon Sep 17 00:00:00 2001 From: Saint Wesonga Date: Wed, 22 Oct 2025 07:45:40 +0000 Subject: [PATCH 242/561] 8369322: Implement native stack printing for Windows-AArch64 Reviewed-by: dholmes, karianna --- src/hotspot/os/windows/os_windows.cpp | 103 ++++++++++++++++++ .../os_windows_aarch64.inline.hpp | 7 ++ .../os_cpu/windows_x86/os_windows_x86.cpp | 92 ---------------- 3 files changed, 110 insertions(+), 92 deletions(-) diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index ba05d390c9f..7934c9d6ffb 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -6259,3 +6259,106 @@ const void* os::get_saved_assert_context(const void** sigInfo) { *sigInfo = nullptr; return nullptr; } + +/* + * Windows/x64 does not use stack frames the way expected by Java: + * [1] in most cases, there is no frame pointer. All locals are addressed via RSP + * [2] in rare cases, when alloca() is used, a frame pointer is used, but this may + * not be RBP. + * See http://msdn.microsoft.com/en-us/library/ew5tede7.aspx + * + * So it's not possible to print the native stack using the + * while (...) {... fr = os::get_sender_for_C_frame(&fr); } + * loop in vmError.cpp. We need to roll our own loop. + * This approach works for Windows AArch64 as well. + */ +bool os::win32::platform_print_native_stack(outputStream* st, const void* context, + char* buf, int buf_size, address& lastpc) +{ + CONTEXT ctx; + if (context != nullptr) { + memcpy(&ctx, context, sizeof(ctx)); + } else { + RtlCaptureContext(&ctx); + } + + st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)"); + + DWORD machine_type; + STACKFRAME stk; + memset(&stk, 0, sizeof(stk)); + stk.AddrStack.Mode = AddrModeFlat; + stk.AddrFrame.Mode = AddrModeFlat; + stk.AddrPC.Mode = AddrModeFlat; + +#if defined(_M_AMD64) + stk.AddrStack.Offset = ctx.Rsp; + stk.AddrFrame.Offset = ctx.Rbp; + stk.AddrPC.Offset = ctx.Rip; + machine_type = IMAGE_FILE_MACHINE_AMD64; +#elif defined(_M_ARM64) + stk.AddrStack.Offset = ctx.Sp; + stk.AddrFrame.Offset = ctx.Fp; + stk.AddrPC.Offset = ctx.Pc; + machine_type = IMAGE_FILE_MACHINE_ARM64; +#else + #error unknown architecture +#endif + + // Ensure we consider dynamically loaded DLLs + SymbolEngine::refreshModuleList(); + + int count = 0; + address lastpc_internal = 0; + while (count++ < StackPrintLimit) { + intptr_t* sp = (intptr_t*)stk.AddrStack.Offset; + intptr_t* fp = (intptr_t*)stk.AddrFrame.Offset; // NOT necessarily the same as ctx.Rbp! + address pc = (address)stk.AddrPC.Offset; + + if (pc != nullptr) { + if (count == 2 && lastpc_internal == pc) { + // Skip it -- StackWalk64() may return the same PC + // (but different SP) on the first try. + } else { + // Don't try to create a frame(sp, fp, pc) -- on WinX64, stk.AddrFrame + // may not contain what Java expects, and may cause the frame() constructor + // to crash. Let's just print out the symbolic address. + frame::print_C_frame(st, buf, buf_size, pc); + // print source file and line, if available + char buf[128]; + int line_no; + if (SymbolEngine::get_source_info(pc, buf, sizeof(buf), &line_no)) { + st->print(" (%s:%d)", buf, line_no); + } else { + st->print(" (no source info available)"); + } + st->cr(); + } + lastpc_internal = pc; + } + + PVOID p = WindowsDbgHelp::symFunctionTableAccess64(GetCurrentProcess(), stk.AddrPC.Offset); + if (p == nullptr) { + // StackWalk64() can't handle this PC. Calling StackWalk64 again may cause crash. + lastpc = lastpc_internal; + break; + } + + BOOL result = WindowsDbgHelp::stackWalk64( + machine_type, // __in DWORD MachineType, + GetCurrentProcess(), // __in HANDLE hProcess, + GetCurrentThread(), // __in HANDLE hThread, + &stk, // __inout LP STACKFRAME64 StackFrame, + &ctx); // __inout PVOID ContextRecord, + + if (!result) { + break; + } + } + if (count > StackPrintLimit) { + st->print_cr("......"); + } + st->cr(); + + return true; +} diff --git a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.inline.hpp b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.inline.hpp index 794aa12155b..568b6e3938e 100644 --- a/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.inline.hpp +++ b/src/hotspot/os_cpu/windows_aarch64/os_windows_aarch64.inline.hpp @@ -26,10 +26,17 @@ #define OS_CPU_WINDOWS_AARCH64_OS_WINDOWS_AARCH64_INLINE_HPP #include "runtime/os.hpp" +#include "os_windows.hpp" inline bool os::register_code_area(char *low, char *high) { // Using Vectored Exception Handling return true; } +#define HAVE_PLATFORM_PRINT_NATIVE_STACK 1 +inline bool os::platform_print_native_stack(outputStream* st, const void* context, + char *buf, int buf_size, address& lastpc) { + return os::win32::platform_print_native_stack(st, context, buf, buf_size, lastpc); +} + #endif // OS_CPU_WINDOWS_AARCH64_OS_WINDOWS_AARCH64_INLINE_HPP diff --git a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp index c188919595c..53f96479832 100644 --- a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp +++ b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp @@ -197,98 +197,6 @@ bool handle_FLT_exception(struct _EXCEPTION_POINTERS* exceptionInfo) { } #endif -#ifdef HAVE_PLATFORM_PRINT_NATIVE_STACK -/* - * Windows/x64 does not use stack frames the way expected by Java: - * [1] in most cases, there is no frame pointer. All locals are addressed via RSP - * [2] in rare cases, when alloca() is used, a frame pointer is used, but this may - * not be RBP. - * See http://msdn.microsoft.com/en-us/library/ew5tede7.aspx - * - * So it's not possible to print the native stack using the - * while (...) {... fr = os::get_sender_for_C_frame(&fr); } - * loop in vmError.cpp. We need to roll our own loop. - */ -bool os::win32::platform_print_native_stack(outputStream* st, const void* context, - char *buf, int buf_size, address& lastpc) -{ - CONTEXT ctx; - if (context != nullptr) { - memcpy(&ctx, context, sizeof(ctx)); - } else { - RtlCaptureContext(&ctx); - } - - st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)"); - - STACKFRAME stk; - memset(&stk, 0, sizeof(stk)); - stk.AddrStack.Offset = ctx.Rsp; - stk.AddrStack.Mode = AddrModeFlat; - stk.AddrFrame.Offset = ctx.Rbp; - stk.AddrFrame.Mode = AddrModeFlat; - stk.AddrPC.Offset = ctx.Rip; - stk.AddrPC.Mode = AddrModeFlat; - - // Ensure we consider dynamically loaded dll's - SymbolEngine::refreshModuleList(); - - int count = 0; - address lastpc_internal = 0; - while (count++ < StackPrintLimit) { - intptr_t* sp = (intptr_t*)stk.AddrStack.Offset; - intptr_t* fp = (intptr_t*)stk.AddrFrame.Offset; // NOT necessarily the same as ctx.Rbp! - address pc = (address)stk.AddrPC.Offset; - - if (pc != nullptr) { - if (count == 2 && lastpc_internal == pc) { - // Skip it -- StackWalk64() may return the same PC - // (but different SP) on the first try. - } else { - // Don't try to create a frame(sp, fp, pc) -- on WinX64, stk.AddrFrame - // may not contain what Java expects, and may cause the frame() constructor - // to crash. Let's just print out the symbolic address. - frame::print_C_frame(st, buf, buf_size, pc); - // print source file and line, if available - char buf[128]; - int line_no; - if (SymbolEngine::get_source_info(pc, buf, sizeof(buf), &line_no)) { - st->print(" (%s:%d)", buf, line_no); - } else { - st->print(" (no source info available)"); - } - st->cr(); - } - lastpc_internal = pc; - } - - PVOID p = WindowsDbgHelp::symFunctionTableAccess64(GetCurrentProcess(), stk.AddrPC.Offset); - if (!p) { - // StackWalk64() can't handle this PC. Calling StackWalk64 again may cause crash. - lastpc = lastpc_internal; - break; - } - - BOOL result = WindowsDbgHelp::stackWalk64( - IMAGE_FILE_MACHINE_AMD64, // __in DWORD MachineType, - GetCurrentProcess(), // __in HANDLE hProcess, - GetCurrentThread(), // __in HANDLE hThread, - &stk, // __inout LP STACKFRAME64 StackFrame, - &ctx); // __inout PVOID ContextRecord, - - if (!result) { - break; - } - } - if (count > StackPrintLimit) { - st->print_cr("......"); - } - st->cr(); - - return true; -} -#endif // HAVE_PLATFORM_PRINT_NATIVE_STACK - address os::fetch_frame_from_context(const void* ucVoid, intptr_t** ret_sp, intptr_t** ret_fp) { From 8d9b2fa6af5d0f601168abbc24510a4e9eed785b Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Wed, 22 Oct 2025 07:50:38 +0000 Subject: [PATCH 243/561] 8365072: Refactor tests to use PEM API (Phase 2) Reviewed-by: ascarpino --- .../cert/CertPathBuilder/NoExtensions.java | 27 +- .../selfIssued/StatusLoopDependency.java | 98 +++-- .../indirectCRL/CircularCRLTwoLevel.java | 77 ++-- .../CircularCRLTwoLevelRevoked.java | 79 ++-- .../ssl/ServerName/SSLSocketSNISensitive.java | 375 +++++++++--------- .../ClientHelloBufferUnderflowException.java | 3 +- .../ssl/interop/ClientHelloChromeInterOp.java | 3 +- .../net/ssl/interop/ClientHelloInterOp.java | 69 ++-- .../CPValidatorTrustAnchor.java | 59 +-- .../sun/security/rsa/InvalidBitString.java | 33 +- .../ssl/ClientHandshaker/RSAExport.java | 86 ++-- .../BasicConstraints.java | 212 ++++------ .../X509TrustManagerImpl/ComodoHacker.java | 50 +-- .../sun/security/x509/X509CRLImpl/Verify.java | 36 +- 14 files changed, 560 insertions(+), 647 deletions(-) diff --git a/test/jdk/java/security/cert/CertPathBuilder/NoExtensions.java b/test/jdk/java/security/cert/CertPathBuilder/NoExtensions.java index 7109d310d51..e38d18dc943 100644 --- a/test/jdk/java/security/cert/CertPathBuilder/NoExtensions.java +++ b/test/jdk/java/security/cert/CertPathBuilder/NoExtensions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -25,8 +25,10 @@ * @test * @bug 4519462 * @summary Verify Sun CertPathBuilder implementation handles certificates with no extensions + * @enablePreview */ +import java.security.PEMDecoder; import java.security.cert.X509Certificate; import java.security.cert.TrustAnchor; import java.security.cert.CollectionCertStoreParameters; @@ -35,16 +37,15 @@ import java.security.cert.X509CertSelector; import java.security.cert.CertPathBuilder; import java.security.cert.PKIXBuilderParameters; import java.security.cert.CertPathBuilderResult; -import java.security.cert.CertificateFactory; -import java.security.cert.CRL; import java.security.cert.CertPath; import java.util.HashSet; import java.util.ArrayList; -import java.io.ByteArrayInputStream; // Test based on user code submitted with bug by daniel.boggs@compass.net public class NoExtensions { + private static final PEMDecoder pemDecoder = PEMDecoder.of(); + public static void main(String[] args) { try { NoExtensions certs = new NoExtensions(); @@ -92,7 +93,7 @@ public class NoExtensions { // System.out.println(certPath.toString()); } - private static X509Certificate getTrustedCertificate() throws Exception { + private static X509Certificate getTrustedCertificate() { String sCert = "-----BEGIN CERTIFICATE-----\n" + "MIIBezCCASWgAwIBAgIQyWD8dLUoqpJFyDxrfRlrsTANBgkqhkiG9w0BAQQFADAW\n" @@ -104,12 +105,10 @@ public class NoExtensions { + "AKoAZIoRz7jUqlw19DANBgkqhkiG9w0BAQQFAANBACJxAfP57yqaT9N+nRgAOugM\n" + "JG0aN3/peCIvL3p29epRL2xoWFvxpUUlsH2I39OZ6b8+twWCebhkv1I62segXAk=\n" + "-----END CERTIFICATE-----"; - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream bytes = new ByteArrayInputStream(sCert.getBytes()); - return (X509Certificate)certFactory.generateCertificate(bytes); + return pemDecoder.decode(sCert, X509Certificate.class); } - private static X509Certificate getUserCertificate1() throws Exception { + private static X509Certificate getUserCertificate1() { // this certificate includes an extension String sCert = "-----BEGIN CERTIFICATE-----\n" @@ -123,12 +122,10 @@ public class NoExtensions { + "CxeUaYlXmvbxVNkxM65Pplsj3h4ntfZaynmlhahH3YsnnA8wk6xPt04LjSId12RB\n" + "PeuO\n" + "-----END CERTIFICATE-----"; - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream bytes = new ByteArrayInputStream(sCert.getBytes()); - return (X509Certificate)certFactory.generateCertificate(bytes); + return pemDecoder.decode(sCert, X509Certificate.class); } - private static X509Certificate getUserCertificate2() throws Exception { + private static X509Certificate getUserCertificate2() { // this certificate does not include any extensions String sCert = "-----BEGIN CERTIFICATE-----\n" @@ -140,8 +137,6 @@ public class NoExtensions { + "BAUAA0EAQmj9SFHEx66JyAps3ew4pcSS3QvfVZ/6qsNUYCG75rFGcTUPHcXKql9y\n" + "qBT83iNLJ//krjw5Ju0WRPg/buHSww==\n" + "-----END CERTIFICATE-----"; - CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream bytes = new ByteArrayInputStream(sCert.getBytes()); - return (X509Certificate)certFactory.generateCertificate(bytes); + return pemDecoder.decode(sCert, X509Certificate.class); } } diff --git a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/StatusLoopDependency.java b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/StatusLoopDependency.java index 65242394162..2a1514fae8a 100644 --- a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/StatusLoopDependency.java +++ b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/StatusLoopDependency.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -33,18 +33,31 @@ * @summary PIT b61: PKI test suite fails because self signed certificates * are being rejected * @modules java.base/sun.security.util + * @enablePreview * @run main/othervm StatusLoopDependency subca * @run main/othervm StatusLoopDependency subci * @run main/othervm StatusLoopDependency alice - * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; -import java.util.*; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.security.Security; -import java.security.cert.*; -import java.security.cert.CertPathValidatorException.BasicReason; +import java.security.cert.CertPathBuilder; +import java.security.cert.CertStore; +import java.security.cert.Certificate; +import java.security.cert.CollectionCertStoreParameters; +import java.security.cert.PKIXBuilderParameters; +import java.security.cert.PKIXCertPathBuilderResult; +import java.security.cert.TrustAnchor; +import java.security.cert.X509CRL; +import java.security.cert.X509CertSelector; +import java.security.cert.X509Certificate; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + import sun.security.util.DerInputStream; /** @@ -183,61 +196,46 @@ public final class StatusLoopDependency { "N9AvUXxGxU4DruoJuFPcrCI=\n" + "-----END X509 CRL-----"; - private static Set generateTrustAnchors() - throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + private static final PEMDecoder pemDecoder = PEMDecoder.of(); - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + private static Set generateTrustAnchors() { + X509Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); - // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + Collection entries = new HashSet<>(); - ByteArrayInputStream is; - - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate cert = cf.generateCertificate(is); + DEREncodable cert = pemDecoder.decode(targetCertStr, X509Certificate.class); entries.add(cert); - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - cert = cf.generateCertificate(is); + cert = pemDecoder.decode(subCaCertStr, X509Certificate.class); entries.add(cert); - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - cert = cf.generateCertificate(is); + cert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); entries.add(cert); - is = new ByteArrayInputStream(topCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); + cert = pemDecoder.decode(topCrlIssuerCertStr, X509Certificate.class); entries.add(cert); - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); + cert = pemDecoder.decode(subCrlIssuerCertStr, X509Certificate.class); entries.add(cert); // generate CRL from CRL string - is = new ByteArrayInputStream(topCrlStr.getBytes()); - Collection mixes = cf.generateCRLs(is); - entries.addAll(mixes); + DEREncodable mixes = pemDecoder.decode(topCrlStr, X509CRL.class); + entries.add(mixes); - is = new ByteArrayInputStream(subCrlStr.getBytes()); - mixes = cf.generateCRLs(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(subCrlStr, X509CRL.class); + entries.add(mixes); return CertStore.getInstance("Collection", - new CollectionCertStoreParameters(entries)); + new CollectionCertStoreParameters(entries)); } private static X509CertSelector generateSelector(String name) @@ -245,17 +243,16 @@ public final class StatusLoopDependency { X509CertSelector selector = new X509CertSelector(); // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = null; + String cert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + cert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + cert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + cert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = pemDecoder.decode(cert, X509Certificate.class); byte[] extVal = target.getExtensionValue("2.5.29.14"); if (extVal != null) { DerInputStream in = new DerInputStream(extVal); @@ -269,21 +266,18 @@ public final class StatusLoopDependency { return selector; } - private static boolean match(String name, Certificate cert) - throws Exception { - X509CertSelector selector = new X509CertSelector(); + private static boolean match(String name, Certificate cert) { // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = null; + String newCert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + newCert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + newCert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + newCert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = pemDecoder.decode(newCert, X509Certificate.class); return target.equals(cert); } diff --git a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevel.java b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevel.java index d67db44e396..c83f1bc1f5d 100644 --- a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevel.java +++ b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -32,16 +32,34 @@ * * @bug 6720721 * @summary CRL check with circular depency support needed + * @enablePreview * @run main/othervm CircularCRLTwoLevel * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; -import java.util.*; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.security.Security; -import java.security.cert.*; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; import java.security.cert.CertPathValidatorException.BasicReason; +import java.security.cert.CertStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.CollectionCertStoreParameters; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509CRL; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class CircularCRLTwoLevel { @@ -149,25 +167,19 @@ public class CircularCRLTwoLevel { "ARGr6Qu68MYGtLMC6ZqP3u0=\n" + "-----END X509 CRL-----"; + private static final PEMDecoder pemDecoder = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; - - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - Certificate subCaCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate targetCert = pemDecoder.decode(targetCertStr, X509Certificate.class); + Certificate subCaCert = pemDecoder.decode(subCaCertStr, X509Certificate.class); + Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, subCaCert, selfSignedCert}); + List list = Arrays.asList(targetCert, subCaCert, selfSignedCert); return cf.generateCertPath(list); } @@ -175,42 +187,33 @@ public class CircularCRLTwoLevel { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + final X509Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); + Collection entries = new HashSet<>(); // generate CRL from CRL string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = - new ByteArrayInputStream(topCrlStr.getBytes()); - Collection mixes = cf.generateCRLs(is); - entries.addAll(mixes); + DEREncodable mixes = pemDecoder.decode(topCrlStr, X509CRL.class); + entries.add(mixes); - is = new ByteArrayInputStream(subCrlStr.getBytes()); - mixes = cf.generateCRLs(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(subCrlStr, X509CRL.class); + entries.add(mixes); // intermediate certs - is = new ByteArrayInputStream(topCrlIssuerCertStr.getBytes()); - mixes = cf.generateCertificates(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(topCrlIssuerCertStr, X509Certificate.class); + entries.add(mixes); - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); - mixes = cf.generateCertificates(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(subCrlIssuerCertStr, X509Certificate.class); + entries.add(mixes); return CertStore.getInstance("Collection", new CollectionCertStoreParameters(entries)); diff --git a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevelRevoked.java b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevelRevoked.java index e67934b8a19..7ac63072737 100644 --- a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevelRevoked.java +++ b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLTwoLevelRevoked.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -32,16 +32,34 @@ * * @bug 6720721 * @summary CRL check with circular depency support needed + * @enablePreview * @run main/othervm CircularCRLTwoLevelRevoked * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; -import java.util.*; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.security.Security; -import java.security.cert.*; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; import java.security.cert.CertPathValidatorException.BasicReason; +import java.security.cert.CertStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.CollectionCertStoreParameters; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509CRL; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class CircularCRLTwoLevelRevoked { @@ -150,25 +168,19 @@ public class CircularCRLTwoLevelRevoked { "ARGr6Qu68MYGtLMC6ZqP3u0=\n" + "-----END X509 CRL-----"; + private static final PEMDecoder pemDecoder = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; - - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - Certificate subCaCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate targetCert = pemDecoder.decode(targetCertStr, X509Certificate.class); + Certificate subCaCert = pemDecoder.decode(subCaCertStr, X509Certificate.class); + Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, subCaCert, selfSignedCert}); + List list = Arrays.asList(targetCert, subCaCert, selfSignedCert); return cf.generateCertPath(list); } @@ -176,45 +188,36 @@ public class CircularCRLTwoLevelRevoked { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + final X509Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); + Collection entries = new HashSet<>(); // generate CRL from CRL string CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = - new ByteArrayInputStream(topCrlStr.getBytes()); - Collection mixes = cf.generateCRLs(is); - entries.addAll(mixes); + DEREncodable mixes = pemDecoder.decode(topCrlStr, X509CRL.class); + entries.add(mixes); - is = new ByteArrayInputStream(subCrlStr.getBytes()); - mixes = cf.generateCRLs(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(subCrlStr, X509CRL.class); + entries.add(mixes); // intermediate certs - is = new ByteArrayInputStream(topCrlIssuerCertStr.getBytes()); - mixes = cf.generateCertificates(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(topCrlIssuerCertStr, X509Certificate.class); + entries.add(mixes); - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); - mixes = cf.generateCertificates(is); - entries.addAll(mixes); + mixes = pemDecoder.decode(subCrlIssuerCertStr, X509Certificate.class); + entries.add(mixes); return CertStore.getInstance("Collection", - new CollectionCertStoreParameters(entries)); + new CollectionCertStoreParameters(entries)); } public static void main(String args[]) throws Exception { diff --git a/test/jdk/javax/net/ssl/ServerName/SSLSocketSNISensitive.java b/test/jdk/javax/net/ssl/ServerName/SSLSocketSNISensitive.java index 45593b9129e..fd1569b4eea 100644 --- a/test/jdk/javax/net/ssl/ServerName/SSLSocketSNISensitive.java +++ b/test/jdk/javax/net/ssl/ServerName/SSLSocketSNISensitive.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, 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. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ * @test * @bug 7068321 * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @enablePreview * @run main/othervm SSLSocketSNISensitive PKIX www.example.com * @run main/othervm SSLSocketSNISensitive SunX509 www.example.com * @run main/othervm SSLSocketSNISensitive PKIX www.example.net @@ -38,19 +39,31 @@ * @run main/othervm SSLSocketSNISensitive SunX509 www.invalid.com */ -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.PEMDecoder; +import java.security.PEMEncoder; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SNIHostName; +import javax.net.ssl.SNIServerName; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManagerFactory; import java.security.Security; import java.security.KeyStore; import java.security.KeyFactory; import java.security.cert.Certificate; import java.security.cert.X509Certificate; -import java.security.cert.CertificateFactory; -import java.security.spec.*; -import java.security.interfaces.*; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; // Note: this test case works only on TLS 1.2 and prior versions because of // the use of MD5withRSA signed certificate. @@ -74,159 +87,167 @@ public class SSLSocketSNISensitive { */ // Certificates and key used in the test. static String trustedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIICkjCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + - "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + - "MTIwNDE3MTIwNjA3WhcNMzMwMzI4MTIwNjA3WjA7MQswCQYDVQQGEwJVUzENMAsG\n" + - "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwgZ8wDQYJ\n" + - "KoZIhvcNAQEBBQADgY0AMIGJAoGBANY+7Enp+1S566kLcKk+qe4Ki6BxaHGZ+v7r\n" + - "vLksx9IQZCbAEf4YLbrZhKzKD3SPIJXyxPFwknAknIh3Knk8mViOZks7T8L3GnJr\n" + - "TBaVvDyTzDJum/QYiahfO2qpfN/Oya2UILmqsBAeLyWpzbQsAyWBXfoUtkOUgnzK\n" + - "fk6QAKYrAgMBAAGjgaUwgaIwHQYDVR0OBBYEFEtmQi7jT1ijXOafPsfkrLwSVu9e\n" + - "MGMGA1UdIwRcMFqAFEtmQi7jT1ijXOafPsfkrLwSVu9eoT+kPTA7MQswCQYDVQQG\n" + - "EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" + - "Y2WCAQAwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEE\n" + - "BQADgYEAkKWxMc4+ODk5WwLXXweB8/IKfVfrizNn0KLEgsZ6xNXFIXDpiPGAFcgl\n" + - "MzFO424JgyvUulsUc/X16Cnuwwntkk6KUG7vEV7h4o9sAV7Cax3gfQE/EZFb4ybn\n" + - "aBm1UsujMKd/ovqbbbxJbmOWzCeo0QfIGleDEyh3NBBZ0i11Kiw=\n" + - "-----END CERTIFICATE-----"; + "-----BEGIN CERTIFICATE-----\n" + + "MIICkjCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA3WhcNMzMwMzI4MTIwNjA3WjA7MQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwgZ8wDQYJ\n" + + "KoZIhvcNAQEBBQADgY0AMIGJAoGBANY+7Enp+1S566kLcKk+qe4Ki6BxaHGZ+v7r\n" + + "vLksx9IQZCbAEf4YLbrZhKzKD3SPIJXyxPFwknAknIh3Knk8mViOZks7T8L3GnJr\n" + + "TBaVvDyTzDJum/QYiahfO2qpfN/Oya2UILmqsBAeLyWpzbQsAyWBXfoUtkOUgnzK\n" + + "fk6QAKYrAgMBAAGjgaUwgaIwHQYDVR0OBBYEFEtmQi7jT1ijXOafPsfkrLwSVu9e\n" + + "MGMGA1UdIwRcMFqAFEtmQi7jT1ijXOafPsfkrLwSVu9eoT+kPTA7MQswCQYDVQQG\n" + + "EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" + + "Y2WCAQAwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEE\n" + + "BQADgYEAkKWxMc4+ODk5WwLXXweB8/IKfVfrizNn0KLEgsZ6xNXFIXDpiPGAFcgl\n" + + "MzFO424JgyvUulsUc/X16Cnuwwntkk6KUG7vEV7h4o9sAV7Cax3gfQE/EZFb4ybn\n" + + "aBm1UsujMKd/ovqbbbxJbmOWzCeo0QfIGleDEyh3NBBZ0i11Kiw=\n" + + "-----END CERTIFICATE-----"; // web server certificate, www.example.com static String targetCertStr_A = - "-----BEGIN CERTIFICATE-----\n" + - "MIICVTCCAb6gAwIBAgIBAjANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + - "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + - "MTIwNDE3MTIwNjA4WhcNMzIwMTAzMTIwNjA4WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + - "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + - "BAMTD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + - "4zFp3PZNzsd3ZwG6FNNWO9eSN+UBymlf8oCwpKJM2tIinmMWvWIXnlx/2UXIfSAq\n" + - "QEG3aXkAFyEiGGpQlBbqcfrESsHsiz2pnnm5dG2v/eS0Bwz1jmcuNmwnh3UQw2Vl\n" + - "+BLk8ukdrLjiCT8jARiHExYf1Xg+wUqQ9y8NV26hdaUCAwEAAaNPME0wCwYDVR0P\n" + - "BAQDAgPoMB0GA1UdDgQWBBQwtx+gqzn2w4y82brXlp7tqBYEZDAfBgNVHSMEGDAW\n" + - "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQAJWo8B6Ud+\n" + - "/OU+UcZLihlfMX02OSlK2ZB7mfqpj2G3JT9yb0A+VbY3uuajmaYYIIxl3kXGz/n8\n" + - "M2Q/Ux/MDxG+IFKHC26Kuj4dAQgzjq2pILVPTE2QnaQTNCsgVZtTaC47SG9FRSoC\n" + - "qvnIvn/oTpKSqus76I1cR4joDtiV2OEuVw==\n" + - "-----END CERTIFICATE-----"; + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBAjANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA4WhcNMzIwMTAzMTIwNjA4WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "4zFp3PZNzsd3ZwG6FNNWO9eSN+UBymlf8oCwpKJM2tIinmMWvWIXnlx/2UXIfSAq\n" + + "QEG3aXkAFyEiGGpQlBbqcfrESsHsiz2pnnm5dG2v/eS0Bwz1jmcuNmwnh3UQw2Vl\n" + + "+BLk8ukdrLjiCT8jARiHExYf1Xg+wUqQ9y8NV26hdaUCAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBQwtx+gqzn2w4y82brXlp7tqBYEZDAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQAJWo8B6Ud+\n" + + "/OU+UcZLihlfMX02OSlK2ZB7mfqpj2G3JT9yb0A+VbY3uuajmaYYIIxl3kXGz/n8\n" + + "M2Q/Ux/MDxG+IFKHC26Kuj4dAQgzjq2pILVPTE2QnaQTNCsgVZtTaC47SG9FRSoC\n" + + "qvnIvn/oTpKSqus76I1cR4joDtiV2OEuVw==\n" + + "-----END CERTIFICATE-----"; // Private key in the format of PKCS#8 static String targetPrivateKey_A = - "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOMxadz2Tc7Hd2cB\n" + - "uhTTVjvXkjflAcppX/KAsKSiTNrSIp5jFr1iF55cf9lFyH0gKkBBt2l5ABchIhhq\n" + - "UJQW6nH6xErB7Is9qZ55uXRtr/3ktAcM9Y5nLjZsJ4d1EMNlZfgS5PLpHay44gk/\n" + - "IwEYhxMWH9V4PsFKkPcvDVduoXWlAgMBAAECgYAqX2nuIyXp3fvgA0twXOYlbRRB\n" + - "Rn3qAXM6qFPJsNeCrFR2k+aG1cev6nKR1FkLNTeMGnWZv06MAcr5IML8i7WXyG4C\n" + - "LY/C0gedn94FDKFlln+bTENwQTGjn4lKysDA+IuNpasTeMCajbic+dPByhIdTOjZ\n" + - "iMCyxbLfpk40zQopVQJBAPyfGmkeHB3GjdbdgujWCGKb2UxBa4O8dy3O4l2yizTn\n" + - "uUqMGcwGY4ciNSVvZQ7jKo4vDmkSuYib4/woPChaNfMCQQDmO0BQuSWYGNtSwV35\n" + - "lafZfX1dNCLKm1iNA6A12evXgvQiE9WT4mqionig0VZW16HtiY4/BkHOcos/K9Um\n" + - "ARQHAkA8mkaRtSF1my5nv1gqVz5Hua+VdZQ/VDUbDiiL5cszc+ulkJqXsWirAG/T\n" + - "fTe3LJQG7A7+8fkEZrF4yoY0AAA1AkEAotokezULj5N9iAL5SzL9wIzQYV4ggfny\n" + - "YATBjXXxKccakwQ+ndWZIiMUeoS4ssLialhTgucVI0fIkU2a/r/ifwJAc6e+5Pvh\n" + - "MghQj/U788Od/v6rgqz/NGsduZ7uilCMcWiwA73OR2MHMH/OIuoofuEPrfuV9isV\n" + - "xVXhgpKfP/pdOA=="; + "-----BEGIN PRIVATE KEY-----\n" + + "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOMxadz2Tc7Hd2cB\n" + + "uhTTVjvXkjflAcppX/KAsKSiTNrSIp5jFr1iF55cf9lFyH0gKkBBt2l5ABchIhhq\n" + + "UJQW6nH6xErB7Is9qZ55uXRtr/3ktAcM9Y5nLjZsJ4d1EMNlZfgS5PLpHay44gk/\n" + + "IwEYhxMWH9V4PsFKkPcvDVduoXWlAgMBAAECgYAqX2nuIyXp3fvgA0twXOYlbRRB\n" + + "Rn3qAXM6qFPJsNeCrFR2k+aG1cev6nKR1FkLNTeMGnWZv06MAcr5IML8i7WXyG4C\n" + + "LY/C0gedn94FDKFlln+bTENwQTGjn4lKysDA+IuNpasTeMCajbic+dPByhIdTOjZ\n" + + "iMCyxbLfpk40zQopVQJBAPyfGmkeHB3GjdbdgujWCGKb2UxBa4O8dy3O4l2yizTn\n" + + "uUqMGcwGY4ciNSVvZQ7jKo4vDmkSuYib4/woPChaNfMCQQDmO0BQuSWYGNtSwV35\n" + + "lafZfX1dNCLKm1iNA6A12evXgvQiE9WT4mqionig0VZW16HtiY4/BkHOcos/K9Um\n" + + "ARQHAkA8mkaRtSF1my5nv1gqVz5Hua+VdZQ/VDUbDiiL5cszc+ulkJqXsWirAG/T\n" + + "fTe3LJQG7A7+8fkEZrF4yoY0AAA1AkEAotokezULj5N9iAL5SzL9wIzQYV4ggfny\n" + + "YATBjXXxKccakwQ+ndWZIiMUeoS4ssLialhTgucVI0fIkU2a/r/ifwJAc6e+5Pvh\n" + + "MghQj/U788Od/v6rgqz/NGsduZ7uilCMcWiwA73OR2MHMH/OIuoofuEPrfuV9isV\n" + + "xVXhgpKfP/pdOA==\n" + + "-----END PRIVATE KEY-----"; // web server certificate, www.example.net static String targetCertStr_B = - "-----BEGIN CERTIFICATE-----\n" + - "MIICVTCCAb6gAwIBAgIBBDANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + - "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + - "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + - "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + - "BAMTD3d3dy5leGFtcGxlLm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + - "2VlzF1fvWYczDChrUeJiLJ1M/dIShCaOTfYGiXfQGEZCAWTacUclwr+rVMnZ75/c\n" + - "wwg5pNdXRijxMil8DBTS1gFcIFQhosLHvzIAe6ULlg/xB+/L6KBz+NTWfo/2KF6t\n" + - "xatmcToNrCcwi7eUOfbzQje65Tizs56jJYem2m7Rk0ECAwEAAaNPME0wCwYDVR0P\n" + - "BAQDAgPoMB0GA1UdDgQWBBQT/FR0cAWcZQ7h0X79KGki34OSQjAfBgNVHSMEGDAW\n" + - "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQB67cPIT6fz\n" + - "6Ws8fBpYgW2ad4ci66i1WduBD9CpGFE+jRK2feRj6hvYBXocKj0AMWUFIEB2E3hA\n" + - "oIjxcf1GxIpHVl9DjlhxqXbA0Ktl7/NGNRlDSLTizOTl3FB1mMTlOGvXDVmpcFhl\n" + - "HuoP1hYvhTsBwPx5igGNchuPtDIUzL2mXw==\n" + - "-----END CERTIFICATE-----"; + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBBDANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5leGFtcGxlLm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "2VlzF1fvWYczDChrUeJiLJ1M/dIShCaOTfYGiXfQGEZCAWTacUclwr+rVMnZ75/c\n" + + "wwg5pNdXRijxMil8DBTS1gFcIFQhosLHvzIAe6ULlg/xB+/L6KBz+NTWfo/2KF6t\n" + + "xatmcToNrCcwi7eUOfbzQje65Tizs56jJYem2m7Rk0ECAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBQT/FR0cAWcZQ7h0X79KGki34OSQjAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQB67cPIT6fz\n" + + "6Ws8fBpYgW2ad4ci66i1WduBD9CpGFE+jRK2feRj6hvYBXocKj0AMWUFIEB2E3hA\n" + + "oIjxcf1GxIpHVl9DjlhxqXbA0Ktl7/NGNRlDSLTizOTl3FB1mMTlOGvXDVmpcFhl\n" + + "HuoP1hYvhTsBwPx5igGNchuPtDIUzL2mXw==\n" + + "-----END CERTIFICATE-----"; static String targetPrivateKey_B = - "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANlZcxdX71mHMwwo\n" + - "a1HiYiydTP3SEoQmjk32Bol30BhGQgFk2nFHJcK/q1TJ2e+f3MMIOaTXV0Yo8TIp\n" + - "fAwU0tYBXCBUIaLCx78yAHulC5YP8Qfvy+igc/jU1n6P9ihercWrZnE6DawnMIu3\n" + - "lDn280I3uuU4s7OeoyWHptpu0ZNBAgMBAAECgYEAl19H26sfhD+32rDPxZCgBShs\n" + - "dZ33zVe45i0Bcn4iTLWpxKTDyf7eGps4rO2DvfKdYqt40ggzvSZIjUH9JcDe8GmG\n" + - "d3m0ILB7pg4jsFlpyeHpTO8grPLxA1G9s3o0DoFpz/rooqgFfe/DrRDmRoOSkgfV\n" + - "/gseIbgJHRO/Ctyvdh0CQQD6uFd0HxhH1jl/JzvPzIH4LSnPcdEh9zsMEb6uzh75\n" + - "9qL+IHD5N2I/pYZTKqDFIwhJf701+LKag55AX/zrDt7rAkEA3e00AbnwanDMa6Wj\n" + - "+gFekUQveSVra38LiihzCkyVvQpFjbiF1rUhSNQ0dpU5/hmrYF0C6H9VXAesfkUY\n" + - "WhpDgwJAYjgZOop77piDycZK7isFt32p5XSHIzFBVocVFlH1XKM8UyXOXDNQL/Le\n" + - "XnJSrSf+NRzvuNcG0PVC56Ey6brXpQJAY4M4vcltt5zq3R5CQBmbGRJ1IyKXX3Vx\n" + - "bDslEqoyvri7ZYgnY5aG3UxiVgYmIf3KrgQnCLAIS6MZQumiuMxsFwJAK5pEG063\n" + - "9ngUof4fDMvZphqZjZR1zMKz/V/9ge0DWBINaqFgsgebNu+MyImsC8C6WKjGmV/2\n" + - "f1MY0D7sC2vU/Q=="; + "-----BEGIN PRIVATE KEY-----\n" + + "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANlZcxdX71mHMwwo\n" + + "a1HiYiydTP3SEoQmjk32Bol30BhGQgFk2nFHJcK/q1TJ2e+f3MMIOaTXV0Yo8TIp\n" + + "fAwU0tYBXCBUIaLCx78yAHulC5YP8Qfvy+igc/jU1n6P9ihercWrZnE6DawnMIu3\n" + + "lDn280I3uuU4s7OeoyWHptpu0ZNBAgMBAAECgYEAl19H26sfhD+32rDPxZCgBShs\n" + + "dZ33zVe45i0Bcn4iTLWpxKTDyf7eGps4rO2DvfKdYqt40ggzvSZIjUH9JcDe8GmG\n" + + "d3m0ILB7pg4jsFlpyeHpTO8grPLxA1G9s3o0DoFpz/rooqgFfe/DrRDmRoOSkgfV\n" + + "/gseIbgJHRO/Ctyvdh0CQQD6uFd0HxhH1jl/JzvPzIH4LSnPcdEh9zsMEb6uzh75\n" + + "9qL+IHD5N2I/pYZTKqDFIwhJf701+LKag55AX/zrDt7rAkEA3e00AbnwanDMa6Wj\n" + + "+gFekUQveSVra38LiihzCkyVvQpFjbiF1rUhSNQ0dpU5/hmrYF0C6H9VXAesfkUY\n" + + "WhpDgwJAYjgZOop77piDycZK7isFt32p5XSHIzFBVocVFlH1XKM8UyXOXDNQL/Le\n" + + "XnJSrSf+NRzvuNcG0PVC56Ey6brXpQJAY4M4vcltt5zq3R5CQBmbGRJ1IyKXX3Vx\n" + + "bDslEqoyvri7ZYgnY5aG3UxiVgYmIf3KrgQnCLAIS6MZQumiuMxsFwJAK5pEG063\n" + + "9ngUof4fDMvZphqZjZR1zMKz/V/9ge0DWBINaqFgsgebNu+MyImsC8C6WKjGmV/2\n" + + "f1MY0D7sC2vU/Q==\n" + + "-----END PRIVATE KEY-----"; // web server certificate, www.invalid.com static String targetCertStr_C = - "-----BEGIN CERTIFICATE-----\n" + - "MIICVTCCAb6gAwIBAgIBAzANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + - "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + - "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + - "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + - "BAMTD3d3dy5pbnZhbGlkLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + - "q6MyQwzCr2nJ41l0frmHL0qULSyW51MhevBC+1W28i0LE/efrmpwV3LdnlQEGFak\n" + - "DLDwtnff3iru8dSMcA7KdWVkivsE7ZTP+qFDaWBAy7XXiSsv6yZ2Nh4jJb0YcD28\n" + - "45zk2nAl5Az1/PuoTi1vpQxzFZKuBm1HGgz3MEZvBvMCAwEAAaNPME0wCwYDVR0P\n" + - "BAQDAgPoMB0GA1UdDgQWBBRRMifrND015Nm8N6gV5X7cg1YjjjAfBgNVHSMEGDAW\n" + - "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQBjkUO6Ri/B\n" + - "uDC2gDMIyL5+NTe/1dPPQYM4HhCNa/KQYvU5lzCKO9Vpa+i+nyrUNNXUu8Tkyq4Y\n" + - "A+aGSm6+FT/i9rFwkYUdorBtD3KfQiwTIWrVERXBkWI5iZNaVZhx0TFy4vUpf65d\n" + - "QtwkbHpC66fdKc2EdLXkuY9KkmtZZJJ7YA==\n" + - "-----END CERTIFICATE-----"; + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBAzANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5pbnZhbGlkLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "q6MyQwzCr2nJ41l0frmHL0qULSyW51MhevBC+1W28i0LE/efrmpwV3LdnlQEGFak\n" + + "DLDwtnff3iru8dSMcA7KdWVkivsE7ZTP+qFDaWBAy7XXiSsv6yZ2Nh4jJb0YcD28\n" + + "45zk2nAl5Az1/PuoTi1vpQxzFZKuBm1HGgz3MEZvBvMCAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBRRMifrND015Nm8N6gV5X7cg1YjjjAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQBjkUO6Ri/B\n" + + "uDC2gDMIyL5+NTe/1dPPQYM4HhCNa/KQYvU5lzCKO9Vpa+i+nyrUNNXUu8Tkyq4Y\n" + + "A+aGSm6+FT/i9rFwkYUdorBtD3KfQiwTIWrVERXBkWI5iZNaVZhx0TFy4vUpf65d\n" + + "QtwkbHpC66fdKc2EdLXkuY9KkmtZZJJ7YA==\n" + + "-----END CERTIFICATE-----"; static String targetPrivateKey_C = - "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKujMkMMwq9pyeNZ\n" + - "dH65hy9KlC0sludTIXrwQvtVtvItCxP3n65qcFdy3Z5UBBhWpAyw8LZ3394q7vHU\n" + - "jHAOynVlZIr7BO2Uz/qhQ2lgQMu114krL+smdjYeIyW9GHA9vOOc5NpwJeQM9fz7\n" + - "qE4tb6UMcxWSrgZtRxoM9zBGbwbzAgMBAAECgYASJDK40Y12Wvki1Z6xkkyOnBRj\n" + - "XfYpRykfxGtgA2RN3qLwHlk7Zzaul46DIKA6LlYynTUkJDF+Ww1cdDnP0lBlwcmM\n" + - "iD0ck3zYyYBLhQHuVbkK3SYE+ANRhM0icvvqANP2at/U4awQcPNEae/KCiecLNu3\n" + - "CJGqyhPDdrEAqPuJGQJBAN46pQC6l3yrcSYE2s53jSmsm2HVVOFlFXjU6k/RMTxG\n" + - "FfDJtGUAOQ37rPQ06ugr/gjLAmmPp+FXozaBdA32D80CQQDFuGRgv3WYqbglIcRL\n" + - "JRs6xlj9w1F97s/aiUenuwhIPNiUoRbV7mnNuZ/sGF0svOVE7SazRjuFX6UqL9Y9\n" + - "HzG/AkEA170pCI8cl4w8eUNHRB9trGKEKjMXhwVCFh7lJf2ZBcGodSzr8w2HVhrZ\n" + - "Ke7hiemDYffrbJ1oxmv05+o+x3r0lQJBAL6adVm2+FyFMFnLZXmzeb59O4jWY5bt\n" + - "Qz6/HG6bpO5OidMuP99YCHMkQQDOs/PO3Y5GuAoW6IY4n/Y9S2B80+0CQBl1/H9/\n" + - "0n/vrb6vW6Azds49tuS82RFAnOhtwTyBEajs08WF8rZQ3WD2RHJnH0+jjfL0anIp\n" + - "dQBSeNN7s7b6rRk="; + "-----BEGIN PRIVATE KEY-----\n" + + "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKujMkMMwq9pyeNZ\n" + + "dH65hy9KlC0sludTIXrwQvtVtvItCxP3n65qcFdy3Z5UBBhWpAyw8LZ3394q7vHU\n" + + "jHAOynVlZIr7BO2Uz/qhQ2lgQMu114krL+smdjYeIyW9GHA9vOOc5NpwJeQM9fz7\n" + + "qE4tb6UMcxWSrgZtRxoM9zBGbwbzAgMBAAECgYASJDK40Y12Wvki1Z6xkkyOnBRj\n" + + "XfYpRykfxGtgA2RN3qLwHlk7Zzaul46DIKA6LlYynTUkJDF+Ww1cdDnP0lBlwcmM\n" + + "iD0ck3zYyYBLhQHuVbkK3SYE+ANRhM0icvvqANP2at/U4awQcPNEae/KCiecLNu3\n" + + "CJGqyhPDdrEAqPuJGQJBAN46pQC6l3yrcSYE2s53jSmsm2HVVOFlFXjU6k/RMTxG\n" + + "FfDJtGUAOQ37rPQ06ugr/gjLAmmPp+FXozaBdA32D80CQQDFuGRgv3WYqbglIcRL\n" + + "JRs6xlj9w1F97s/aiUenuwhIPNiUoRbV7mnNuZ/sGF0svOVE7SazRjuFX6UqL9Y9\n" + + "HzG/AkEA170pCI8cl4w8eUNHRB9trGKEKjMXhwVCFh7lJf2ZBcGodSzr8w2HVhrZ\n" + + "Ke7hiemDYffrbJ1oxmv05+o+x3r0lQJBAL6adVm2+FyFMFnLZXmzeb59O4jWY5bt\n" + + "Qz6/HG6bpO5OidMuP99YCHMkQQDOs/PO3Y5GuAoW6IY4n/Y9S2B80+0CQBl1/H9/\n" + + "0n/vrb6vW6Azds49tuS82RFAnOhtwTyBEajs08WF8rZQ3WD2RHJnH0+jjfL0anIp\n" + + "dQBSeNN7s7b6rRk=\n" + + "-----END PRIVATE KEY-----"; // This is a certificate for client - static String targetCertStr_D= - "-----BEGIN CERTIFICATE-----\n" + - "MIICVDCCAb2gAwIBAgIBBTANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + - "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + - "MTIwNDE3MTIwNjEwWhcNMzIwMTAzMTIwNjEwWjBUMQswCQYDVQQGEwJVUzENMAsG\n" + - "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxFzAVBgNV\n" + - "BAMTDkludGVyT3AgVGVzdGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo\n" + - "Q/KoAIAC2ljFfW2KwjnxTzi4NQJeUuk2seqKpsAY8x4O5dvixzUl6142zmljapqi\n" + - "bJloQVpfB+CEc5/l4h5gzGRVzkuqP1oPzDrpZ5GsvmvuHenV/TzCIgX1cLETzQVt\n" + - "6Rk06okoBPnw3hDJEJiEc1Rv7HCE8p/p+SaiHrskwwIDAQABo08wTTALBgNVHQ8E\n" + - "BAMCA+gwHQYDVR0OBBYEFPr91O33RIGfFSqza2AwQIgE4QswMB8GA1UdIwQYMBaA\n" + - "FEtmQi7jT1ijXOafPsfkrLwSVu9eMA0GCSqGSIb3DQEBBAUAA4GBANIDFYgAhoj3\n" + - "B8u1YpqeoEp2Lt9TwrYBshaIrbmBPCwCGio0JIsoov3n8BCSg5F+8MnOtPl+TjeO\n" + - "0Ug+7guPdCk/wg8YNxLHgSsQlpcNJDjWiErqmUPVrg5BPPQb65qMund6KTmMN0y6\n" + - "4EbSmxRpZO/N0/5oK4umTk0EeXKNekBj\n" + - "-----END CERTIFICATE-----"; + static String targetCertStr_D = + "-----BEGIN CERTIFICATE-----\n" + + "MIICVDCCAb2gAwIBAgIBBTANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjEwWhcNMzIwMTAzMTIwNjEwWjBUMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxFzAVBgNV\n" + + "BAMTDkludGVyT3AgVGVzdGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo\n" + + "Q/KoAIAC2ljFfW2KwjnxTzi4NQJeUuk2seqKpsAY8x4O5dvixzUl6142zmljapqi\n" + + "bJloQVpfB+CEc5/l4h5gzGRVzkuqP1oPzDrpZ5GsvmvuHenV/TzCIgX1cLETzQVt\n" + + "6Rk06okoBPnw3hDJEJiEc1Rv7HCE8p/p+SaiHrskwwIDAQABo08wTTALBgNVHQ8E\n" + + "BAMCA+gwHQYDVR0OBBYEFPr91O33RIGfFSqza2AwQIgE4QswMB8GA1UdIwQYMBaA\n" + + "FEtmQi7jT1ijXOafPsfkrLwSVu9eMA0GCSqGSIb3DQEBBAUAA4GBANIDFYgAhoj3\n" + + "B8u1YpqeoEp2Lt9TwrYBshaIrbmBPCwCGio0JIsoov3n8BCSg5F+8MnOtPl+TjeO\n" + + "0Ug+7guPdCk/wg8YNxLHgSsQlpcNJDjWiErqmUPVrg5BPPQb65qMund6KTmMN0y6\n" + + "4EbSmxRpZO/N0/5oK4umTk0EeXKNekBj\n" + + "-----END CERTIFICATE-----"; static String targetPrivateKey_D = - "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOhD8qgAgALaWMV9\n" + - "bYrCOfFPOLg1Al5S6Tax6oqmwBjzHg7l2+LHNSXrXjbOaWNqmqJsmWhBWl8H4IRz\n" + - "n+XiHmDMZFXOS6o/Wg/MOulnkay+a+4d6dX9PMIiBfVwsRPNBW3pGTTqiSgE+fDe\n" + - "EMkQmIRzVG/scITyn+n5JqIeuyTDAgMBAAECgYBw37yIKp4LRONJLnhSq6sO+0n8\n" + - "Mz6waiiN/Q6XTQwj09pysQAYCGlqwSRrDAqpVsBJWO+Ae+oYLrLMi4hUZnwN75v3\n" + - "pe1nXlrD11RmPLXwBxqFxNSvAs2FgLHZEtwHI7Bn8KybT/8bGkQ8csLceInYtMDD\n" + - "MuTyy2KRk/pj60zIKQJBAPgebQiAH6viFQ88AwHaNvQhlUfwmSC1i6f8LVoeqaHC\n" + - "lnP0LJBwlyDeeEInhHrCR2ibnCB6I/Pig+49XQgabK8CQQDvpJwuGEbsOO+3rkJJ\n" + - "OpOw4toG0QJZdRnT6l8I6BlboQRZSfFh+lGGahvFXkxc4KdUpJ7QPtXU7HHk6Huk\n" + - "8RYtAkA9CW8VGj+wTuuTVdX/jKjcIa7RhbSFwWNbrcOSWdys+Gt+luCnn6rt4QyA\n" + - "aaxDbquWZkFgE+voQR7nap0KM0XtAkAznd0WAJymHM1lXt9gLoHJQ9N6TGKZKiPa\n" + - "BU1a+cMcfV4WbVrUo7oTnZ9Fr73681iXXq3mZOJh7lvJ1llreZIxAkBEnbiTgEf4\n" + - "tvku68jHcRbRPmdS7CBSWNEBaHLOm4pUSTcxVTKKMHw7vmM5/UYUxJ8QNKCYxn6O\n" + - "+vtiBwBawwzN"; + "-----BEGIN PRIVATE KEY-----\n" + + "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOhD8qgAgALaWMV9\n" + + "bYrCOfFPOLg1Al5S6Tax6oqmwBjzHg7l2+LHNSXrXjbOaWNqmqJsmWhBWl8H4IRz\n" + + "n+XiHmDMZFXOS6o/Wg/MOulnkay+a+4d6dX9PMIiBfVwsRPNBW3pGTTqiSgE+fDe\n" + + "EMkQmIRzVG/scITyn+n5JqIeuyTDAgMBAAECgYBw37yIKp4LRONJLnhSq6sO+0n8\n" + + "Mz6waiiN/Q6XTQwj09pysQAYCGlqwSRrDAqpVsBJWO+Ae+oYLrLMi4hUZnwN75v3\n" + + "pe1nXlrD11RmPLXwBxqFxNSvAs2FgLHZEtwHI7Bn8KybT/8bGkQ8csLceInYtMDD\n" + + "MuTyy2KRk/pj60zIKQJBAPgebQiAH6viFQ88AwHaNvQhlUfwmSC1i6f8LVoeqaHC\n" + + "lnP0LJBwlyDeeEInhHrCR2ibnCB6I/Pig+49XQgabK8CQQDvpJwuGEbsOO+3rkJJ\n" + + "OpOw4toG0QJZdRnT6l8I6BlboQRZSfFh+lGGahvFXkxc4KdUpJ7QPtXU7HHk6Huk\n" + + "8RYtAkA9CW8VGj+wTuuTVdX/jKjcIa7RhbSFwWNbrcOSWdys+Gt+luCnn6rt4QyA\n" + + "aaxDbquWZkFgE+voQR7nap0KM0XtAkAznd0WAJymHM1lXt9gLoHJQ9N6TGKZKiPa\n" + + "BU1a+cMcfV4WbVrUo7oTnZ9Fr73681iXXq3mZOJh7lvJ1llreZIxAkBEnbiTgEf4\n" + + "tvku68jHcRbRPmdS7CBSWNEBaHLOm4pUSTcxVTKKMHw7vmM5/UYUxJ8QNKCYxn6O\n" + + "+vtiBwBawwzN\n" + + "-----END PRIVATE KEY-----"; static String[] serverCerts = {targetCertStr_A, targetCertStr_B, targetCertStr_C}; @@ -235,7 +256,7 @@ public class SSLSocketSNISensitive { static String[] clientCerts = {targetCertStr_D}; static String[] clientKeys = {targetPrivateKey_D}; - static char passphrase[] = "passphrase".toCharArray(); + static char[] passphrase = "passphrase".toCharArray(); /* * Is the server ready to serve? @@ -245,7 +266,7 @@ public class SSLSocketSNISensitive { /* * Turn on SSL debugging? */ - static boolean debug = false; + static boolean debug = Boolean.getBoolean("test.debug"); /* * Define the server side of the test. @@ -362,19 +383,16 @@ public class SSLSocketSNISensitive { private static SSLContext generateSSLContext(boolean isClient) throws Exception { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + final PEMDecoder pemDecoder = PEMDecoder.of(); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); ks.load(null, null); - // import the trused cert - ByteArrayInputStream is = - new ByteArrayInputStream(trustedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); - is.close(); + // generate certificate from cert string + Certificate trusedCert = pemDecoder.decode(trustedCertStr, X509Certificate.class); + // import the trused cert ks.setCertificateEntry("RSA Export Signer", trusedCert); String[] certStrs = null; @@ -390,17 +408,14 @@ public class SSLSocketSNISensitive { for (int i = 0; i < certStrs.length; i++) { // generate the private key. String keySpecStr = keyStrs[i]; - PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(keySpecStr)); + PKCS8EncodedKeySpec priKeySpec = pemDecoder.decode(keySpecStr, PKCS8EncodedKeySpec.class); KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPrivateKey priKey = (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain String keyCertStr = certStrs[i]; - is = new ByteArrayInputStream(keyCertStr.getBytes()); - Certificate keyCert = cf.generateCertificate(is); - is.close(); + Certificate keyCert = pemDecoder.decode(keyCertStr, X509Certificate.class); Certificate[] chain = new Certificate[2]; chain[0] = keyCert; @@ -521,22 +536,20 @@ public class SSLSocketSNISensitive { void startServer(boolean newThread) throws Exception { if (newThread) { - serverThread = new Thread() { - public void run() { - try { - doServerSide(); - } catch (Exception e) { - /* - * Our server thread just died. - * - * Release the client, if not active already... - */ - System.err.println("Server died, because of " + e); - serverReady = true; - serverException = e; - } + serverThread = new Thread(() -> { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died, because of " + e); + serverReady = true; + serverException = e; } - }; + }); serverThread.start(); } else { try { @@ -551,19 +564,17 @@ public class SSLSocketSNISensitive { void startClient(boolean newThread) throws Exception { if (newThread) { - clientThread = new Thread() { - public void run() { - try { - doClientSide(); - } catch (Exception e) { - /* - * Our client thread just died. - */ - System.err.println("Client died, because of " + e); - clientException = e; - } + clientThread = new Thread(() -> { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died, because of " + e); + clientException = e; } - }; + }); clientThread.start(); } else { try { diff --git a/test/jdk/javax/net/ssl/interop/ClientHelloBufferUnderflowException.java b/test/jdk/javax/net/ssl/interop/ClientHelloBufferUnderflowException.java index ca5742f37b2..0b030c71459 100644 --- a/test/jdk/javax/net/ssl/interop/ClientHelloBufferUnderflowException.java +++ b/test/jdk/javax/net/ssl/interop/ClientHelloBufferUnderflowException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ * @test * @bug 8215790 8219389 * @summary Verify exception + * @enablePreview * @library /test/lib * @modules java.base/sun.security.util * @run main/othervm ClientHelloBufferUnderflowException diff --git a/test/jdk/javax/net/ssl/interop/ClientHelloChromeInterOp.java b/test/jdk/javax/net/ssl/interop/ClientHelloChromeInterOp.java index f426cce33e3..bcdfa270394 100644 --- a/test/jdk/javax/net/ssl/interop/ClientHelloChromeInterOp.java +++ b/test/jdk/javax/net/ssl/interop/ClientHelloChromeInterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -30,6 +30,7 @@ * @test * @bug 8169362 * @summary Interop automated testing with Chrome + * @enablePreview * @library /test/lib * @modules jdk.crypto.ec * java.base/sun.security.util diff --git a/test/jdk/javax/net/ssl/interop/ClientHelloInterOp.java b/test/jdk/javax/net/ssl/interop/ClientHelloInterOp.java index c6bf74bd533..808d137223e 100644 --- a/test/jdk/javax/net/ssl/interop/ClientHelloInterOp.java +++ b/test/jdk/javax/net/ssl/interop/ClientHelloInterOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -21,17 +21,22 @@ * questions. */ -import javax.net.ssl.*; -import javax.net.ssl.SSLEngineResult.*; -import java.io.*; -import java.nio.*; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLEngineResult.HandshakeStatus; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManagerFactory; +import java.nio.ByteBuffer; import java.security.KeyStore; +import java.security.PEMDecoder; +import java.security.PEMRecord; import java.security.PrivateKey; -import java.security.KeyFactory; import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; -import java.security.spec.*; -import java.util.Base64; +import java.security.cert.X509Certificate; +import java.security.interfaces.ECPrivateKey; +import java.security.interfaces.RSAPrivateKey; public abstract class ClientHelloInterOp { @@ -138,13 +143,16 @@ public abstract class ClientHelloInterOp { // // EC private key related to cert endEntityCertStrs[0]. // + "-----BEGIN PRIVATE KEY-----\n" + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgA3pmS+OrIjGyUv2F\n" + "K/PkyayJIePM2RTFYxNoQqmJGnihRANCAASHi9c1QnNQurh7t8A68XRaJZTpyWU4\n" + - "Ay6zUapMW9ydE84KGXyy5my+Sw7QKlmoveGNeZVf12nUVX+tQEYujVob", + "Ay6zUapMW9ydE84KGXyy5my+Sw7QKlmoveGNeZVf12nUVX+tQEYujVob\n" + + "-----END PRIVATE KEY-----", // // RSA private key related to cert endEntityCertStrs[1]. // + "-----BEGIN PRIVATE KEY-----\n" + "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfq0lpd8nYH8AW\n" + "8RL62e57JA9I0AFW72d8x1T40Q9qYn4UftwQXxnVKmvW+VCA3MKkNRWt+eZPvmsJ\n" + "qmDPmV0D37L7eF19TIeNkHPN/H7oYdcsHi7p5TY0BNru+pIs1twtx9nv9CaQWqDg\n" + @@ -170,8 +178,9 @@ public abstract class ClientHelloInterOp { "sZ2JRtyK3OV9RtL/MYmYzPLqm1Ah02+GXLVNnvKWmwKBgE8Ble8CzrXYuuPdGxXz\n" + "BZU6HnXQrmTUcgeze0tj8SDHzCfsGsaG6pHrVNkT7CKsRuCHTZLM0kXmUijLFKuP\n" + "5xyE257z4IbbEbs+tcbB3p28n4/47MzZkSR3kt8+FrsEMZq5oOHbFTGzgp9dhZCC\n" + - "dKUqlw5BPHdbxoWB/JpSHGCV" - }; + "dKUqlw5BPHdbxoWB/JpSHGCV\n" + + "-----END PRIVATE KEY-----" + }; // Private key names of endEntityPrivateKeys. private final static String[] endEntityPrivateKeyNames = { @@ -179,6 +188,8 @@ public abstract class ClientHelloInterOp { "RSA" }; + private static final PEMDecoder pemDecoder = PEMDecoder.of(); + /* * Run the test case. */ @@ -251,13 +262,9 @@ public abstract class ClientHelloInterOp { KeyStore ts = null; // trust store KeyStore ks = null; // key store - char passphrase[] = "passphrase".toCharArray(); - - // Generate certificate from cert string. - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + char[] passphrase = "passphrase".toCharArray(); // Import the trused certs. - ByteArrayInputStream is; if (trustedMaterials != null && trustedMaterials.length != 0) { ts = KeyStore.getInstance("JKS"); ts.load(null, null); @@ -266,13 +273,8 @@ public abstract class ClientHelloInterOp { new Certificate[trustedMaterials.length]; for (int i = 0; i < trustedMaterials.length; i++) { String trustedCertStr = trustedMaterials[i]; - - is = new ByteArrayInputStream(trustedCertStr.getBytes()); - try { - trustedCert[i] = cf.generateCertificate(is); - } finally { - is.close(); - } + // Generate certificate from cert string. + trustedCert[i] = pemDecoder.decode(trustedCertStr, X509Certificate.class); ts.setCertificateEntry("trusted-cert-" + i, trustedCert[i]); } @@ -295,21 +297,14 @@ public abstract class ClientHelloInterOp { String keyCertStr = keyMaterialCerts[i]; // generate the private key. - PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(keyMaterialKeys[i])); - KeyFactory kf = - KeyFactory.getInstance(keyMaterialKeyAlgs[i]); - PrivateKey priKey = kf.generatePrivate(priKeySpec); + PrivateKey priKey = switch (keyMaterialKeyAlgs[i]) { + case "RSA" -> pemDecoder.decode(keyMaterialKeys[i], RSAPrivateKey.class); + case "EC" -> pemDecoder.decode(keyMaterialKeys[i], ECPrivateKey.class); + default -> pemDecoder.decode(keyMaterialKeys[i], PrivateKey.class); + }; // generate certificate chain - is = new ByteArrayInputStream(keyCertStr.getBytes()); - Certificate keyCert = null; - try { - keyCert = cf.generateCertificate(is); - } finally { - is.close(); - } - + Certificate keyCert = pemDecoder.decode(keyCertStr, X509Certificate.class); Certificate[] chain = new Certificate[] { keyCert }; // import the key entry. diff --git a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorTrustAnchor.java b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorTrustAnchor.java index 63eaa12b00c..d74d712d8d7 100644 --- a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorTrustAnchor.java +++ b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorTrustAnchor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -31,19 +31,35 @@ * @summary Disable MD2 support * new CertPathValidatorException.BasicReason enum constant for * constrained algorithm + * @enablePreview * @run main/othervm CPValidatorTrustAnchor * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; -import java.util.*; +import java.io.ByteArrayInputStream; +import java.security.PEMDecoder; import java.security.Security; -import java.security.cert.*; -import java.security.cert.CertPathValidatorException.*; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertPathValidatorException.BasicReason; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Set; public class CPValidatorTrustAnchor { + private static final PEMDecoder pemDecoder = java.security.PEMDecoder.of(); + static String selfSignedCertStr = null; // SHA1withRSA 1024 @@ -104,33 +120,26 @@ public class CPValidatorTrustAnchor { private static CertPath generateCertificatePath() throws CertificateException { - // generate certificate from cert strings + CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + // generate certificate from cert strings + Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - selfSignedCert}); + List list = Collections.singletonList(selfSignedCert); return cf.generateCertPath(list); } - private static Set generateTrustAnchors() - throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + private static Set generateTrustAnchors() { - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + // generate certificate from cert string + X509Certificate selfSignedCert = pemDecoder.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } @@ -164,7 +173,7 @@ public class CPValidatorTrustAnchor { } private static void validate(String trustAnchor) - throws CertPathValidatorException, Exception { + throws Exception { selfSignedCertStr = trustAnchor; CertPath path = generateCertificatePath(); @@ -176,7 +185,11 @@ public class CPValidatorTrustAnchor { params.setRevocationEnabled(false); // set the validation time - params.setDate(new Date(109, 9, 1)); // 2009-09-01 + final Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, 2009); + calendar.set(Calendar.MONTH, 9); + calendar.set(Calendar.DATE, 1); + params.setDate(calendar.getTime()); // 2009-09-01 CertPathValidator validator = CertPathValidator.getInstance("PKIX"); diff --git a/test/jdk/sun/security/rsa/InvalidBitString.java b/test/jdk/sun/security/rsa/InvalidBitString.java index be9e42ca544..7f8408f35f0 100644 --- a/test/jdk/sun/security/rsa/InvalidBitString.java +++ b/test/jdk/sun/security/rsa/InvalidBitString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -23,15 +23,15 @@ /* @test * @summary Validation of signatures succeed when it should fail + * @enablePreview * @bug 6896700 */ -import java.io.InputStream; -import java.io.ByteArrayInputStream; +import java.security.PEMDecoder; import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; import java.security.PublicKey; import java.security.SignatureException; +import java.security.cert.X509Certificate; public class InvalidBitString { @@ -87,16 +87,16 @@ public class InvalidBitString { "ZAM6mgkuSY7/vdnsiJtU\n" + "-----END CERTIFICATE-----\n"; - public static void main(String args[]) throws Exception { - - Certificate signer = generate(signerCertStr); + public static void main(String[] args) throws Exception { + final PEMDecoder pemDecoder = PEMDecoder.of(); + Certificate signer = pemDecoder.decode(signerCertStr, X509Certificate.class); // the valid certificate - Certificate normal = generate(normalCertStr); + Certificate normal = pemDecoder.decode(normalCertStr, X509Certificate.class); // the invalid certificate with extra signature bits - Certificate longer = generate(longerCertStr); + Certificate longer = pemDecoder.decode(longerCertStr, X509Certificate.class); // the invalid certificate without enough signature bits - Certificate shorter = generate(shorterCertStr); + Certificate shorter = pemDecoder.decode(shorterCertStr, X509Certificate.class); if (!test(normal, signer, " normal", true) || !test(longer, signer, " longer", false) || @@ -105,19 +105,6 @@ public class InvalidBitString { } } - private static Certificate generate(String certStr) throws Exception { - InputStream is = null; - try { - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - is = new ByteArrayInputStream(certStr.getBytes()); - return cf.generateCertificate(is); - } finally { - if (is != null) { - is.close(); - } - } - } - private static boolean test(Certificate target, Certificate signer, String title, boolean expected) throws Exception { System.out.print("Checking " + title + ": expected: " + diff --git a/test/jdk/sun/security/ssl/ClientHandshaker/RSAExport.java b/test/jdk/sun/security/ssl/ClientHandshaker/RSAExport.java index 698bbdf88b1..26d5c69e219 100644 --- a/test/jdk/sun/security/ssl/ClientHandshaker/RSAExport.java +++ b/test/jdk/sun/security/ssl/ClientHandshaker/RSAExport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -27,6 +27,7 @@ /* * @test * @bug 6690018 + * @enablePreview * @summary RSAClientKeyExchange NullPointerException * @run main/othervm RSAExport */ @@ -197,17 +198,24 @@ * */ -import java.io.*; -import java.net.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.PEMDecoder; import java.security.Security; import java.security.KeyStore; import java.security.KeyFactory; import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; -import java.security.spec.*; -import java.security.interfaces.*; -import javax.net.ssl.*; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManagerFactory; import java.math.BigInteger; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.RSAPrivateKeySpec; public class RSAExport { @@ -312,7 +320,7 @@ public class RSAExport { /* * Turn on SSL debugging? */ - static boolean debug = false; + static boolean debug = Boolean.getBoolean("test.debug"); /* * If the client or server is doing some kind of object creation @@ -386,7 +394,7 @@ public class RSAExport { // Enable RSA_EXPORT cipher suites only. try { - String enabledSuites[] = { + String[] enabledSuites = { "SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"}; sslSocket.setEnabledCipherSuites(enabledSuites); @@ -471,22 +479,20 @@ public class RSAExport { void startServer(boolean newThread) throws Exception { if (newThread) { - serverThread = new Thread() { - public void run() { - try { - doServerSide(); - } catch (Exception e) { - /* - * Our server thread just died. - * - * Release the client, if not active already... - */ - System.err.println("Server died..." + e); - serverReady = true; - serverException = e; - } + serverThread = new Thread(() -> { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..." + e); + serverReady = true; + serverException = e; } - }; + }); serverThread.start(); } else { doServerSide(); @@ -495,19 +501,17 @@ public class RSAExport { void startClient(boolean newThread) throws Exception { if (newThread) { - clientThread = new Thread() { - public void run() { - try { - doClientSide(); - } catch (Exception e) { - /* - * Our client thread just died. - */ - System.err.println("Client died..."); - clientException = e; - } + clientThread = new Thread(() -> { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; } - }; + }); clientThread.start(); } else { doClientSide(); @@ -517,11 +521,10 @@ public class RSAExport { // Get the SSL context private SSLContext getSSLContext(boolean authnRequired) throws Exception { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trustedCert = cf.generateCertificate(is); + final PEMDecoder pemDecoder = PEMDecoder.of(); + + Certificate trustedCert = pemDecoder.decode(trusedCertStr, X509Certificate.class); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); @@ -540,8 +543,7 @@ public class RSAExport { (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain - is = new ByteArrayInputStream(serverCertStr.getBytes()); - Certificate serverCert = cf.generateCertificate(is); + Certificate serverCert = pemDecoder.decode(serverCertStr, X509Certificate.class); Certificate[] chain = new Certificate[2]; chain[0] = serverCert; diff --git a/test/jdk/sun/security/ssl/X509TrustManagerImpl/BasicConstraints.java b/test/jdk/sun/security/ssl/X509TrustManagerImpl/BasicConstraints.java index 7f9573a8eeb..051c940b3b0 100644 --- a/test/jdk/sun/security/ssl/X509TrustManagerImpl/BasicConstraints.java +++ b/test/jdk/sun/security/ssl/X509TrustManagerImpl/BasicConstraints.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, 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. * * This code is free software; you can redistribute it and/or modify it @@ -31,20 +31,33 @@ * @bug 7166570 * @summary JSSE certificate validation has started to fail for * certificate chains + * @enablePreview * @run main/othervm BasicConstraints PKIX * @run main/othervm BasicConstraints SunX509 */ -import java.util.*; -import java.io.*; -import javax.net.ssl.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.PEMDecoder; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.cert.PKIXParameters; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManagerFactory; import java.security.KeyStore; import java.security.KeyFactory; -import java.security.cert.*; -import java.security.spec.*; -import java.security.interfaces.*; -import java.util.Base64; +import java.util.Arrays; public class BasicConstraints { @@ -96,33 +109,6 @@ public class BasicConstraints { "cwIDUWqQda62xV7ChkTh7ia3uvBXob2iiB0aI3gVTTqDfK9F5XXtW4BXfqx0hvwB\n" + "6JzgmNyDQos=\n" + "-----END CERTIFICATE-----"; - static String trustedPrivateKey = // Private key in the format of PKCS#8 - "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDUJ3hT/9jY/i8i\n" + - "70EEaL6mbrhhdg/Ys1E0r97n+dZaY0olqkIBhh1r8UkKWtvOkj8WBFQ0sz0HhSjT\n" + - "rkVEisGLW+7zPJiDBPtQrRawvCDpnzUofnQ98zQKUTHji1OqhxgNzsKCy9vIh5Mh\n" + - "tX0CdGUScEDXlYUkAkxMKCVo2V5dRn34D+1rNGEeWxGnQ5vyPi0IwlpEOkYxhPLV\n" + - "dsb5aoLzBc/rdrrdzCM+svm7O38LhbVuA0F9NHAgdJRKE2F91ztkk1KvY0U9zCh1\n" + - "3u5WV7kl481qDujKGM4UURoEarbV2Xr+jNVGSpJZYCLU/sxFrL15iPeYtmJlovo2\n" + - "VbFed/NXAgMBAAECggEAUZvlQ5q1VbNhenTCc+m+/NK2hncd3WQNJtFIU7/dXuO2\n" + - "0ApQXbmzc6RbTmppB2tmbRe5NJSGM3BbpiHxb05Y6TyyDEsQ98Vgz0Xl5pJXrsaZ\n" + - "cjxChtoY+KcHI9qikoRpElaoqBu3LcpJJLxlnB4eCxu3NbbEgneH1fvTeCO1kvcp\n" + - "i3DDdyfY7WB9RW1yWAveiuqvtnbsPfJJLKEhFvZL2ArYCRTm/oIw64yukNe/QLR5\n" + - "bGzEJMT2ZNQMld1f+CW9tOrUKrnnPCGfMa351T5we+8B6sujWfftPutgEVx5TmHs\n" + - "AOW1SntMapbgg46K9EC/C5YQa5D1aNOH9ZTEMkgUMQKBgQDrpPQIHFozeeyZ0iiq\n" + - "HtReLPcqpkwr/9ELc3SjgUypSvpu0l/m++um0yLinlXMn25km/BP6Mv3t/+1uzAc\n" + - "qpopkcyek8X1hzNRhDkWuMv4KDOKk5c6qLx8FGSm6q8PYm5KbsiyeCM7CJoeoqJ5\n" + - "74IZjOIw7UrYLckCb6W8xGQLIwKBgQDmew3vGRR3JmCCSumtJQOqhF6bBYrNb6Qc\n" + - "r4vrng+QhNIquwGqHKPorAI1J8J1jOS+dkDWTxSz2xQKQ83nsOspzVPskpDh5mWL\n" + - "gGk5QCkX87jFsXfhvZFLksZMbIdpWze997Zs2fe/PWfPaH6o3erqo2zAhQV0eA9q\n" + - "C7tfImREPQKBgQDi2Xq/8CN52M9IScQx+dnyC5Gqckt0NCKXxn8sBIa7l129oDMI\n" + - "187FXA8CYPEyOu14V5KiKvdos66s0daAUlB04lI8+v+g3ZYuzH50/FQHwxPTPUBi\n" + - "DRzeyncXJWiAA/8vErWM8hDgfOh5w5Fsl4EEfdcmyNm7gWA4Qyknr1ysRwKBgQDC\n" + - "JSPepUy09VHUTxA59nT5HRmoEeoTFRizxTfi2LkZrphuwCotxoRXiRUu+3f1lyJU\n" + - "Qb5qCCFTQ5bE8squgTwGcVxhajC66V3ePePlAuPatkWN2ek28X1DoLaDR+Rk3h69\n" + - "Wb2EQbNMl4grkUUoMA8jaVhBb4vhyQSK+qjyAUFerQKBgQDXZPuflfsjH/d/O2yw\n" + - "qZbssKe9AKORjv795teblAc3vmsSlNwwVnPdS2aq1LHyoNbetc/OaZV151hTQ/9z\n" + - "bsA48oOojgrDD07Ovg3uDcNEIufxR0aGeSSvqhElp1r7wAYj8bAr6W/RH6MS16WW\n" + - "dRd+PH6hsap8BD2RlVCnrT3vIQ=="; // Certificate information: // Issuer: C=US, O=Java, OU=SunJSSE Test Serivce @@ -156,33 +142,6 @@ public class BasicConstraints { "P0QqaqP+xJIY+sRrzdckxSfS9AOOrJk2VXY8qEoxCN4wCvHJWuHEAF/Lm65d/hq3\n" + "2Uh8P+QHLeuEwF8RoTpjiGM9dXvaqcQz7w5G\n" + "-----END CERTIFICATE-----"; - static String caSignerPrivateKey = // Private key in the format of PKCS#8 - "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDAvGeLKlW1ljae\n" + - "eu8NvDCjfW5BNK2c0C4ry7Is+1mM4PC7FA4bRpMaQHKIjLsZ5D1hoA9183cv3p1a\n" + - "P75/ZYMOyx1id/hXmbd3jp8BR0wbvrKxa53+4lO0S5AL5dOpU2AVhcdeQ7+DwoL6\n" + - "iAuHqNcABg3CijrIcFeZHcPMwaZMd9YxJG6YrnNHMWjbXTGKpma02NMB1UnRxsdN\n" + - "phqfRt2gkUs18l6697sSJ7eblvSWEWw1Bmtrg9No28UUsiF8q0m9i/G0QzYOrS6v\n" + - "ghum5bpHAixxfA9Z/ozHrN8gf8gNDTRnG6phDwVb1Uj9nO2f9yTArx7Kz5EtRNmD\n" + - "x9SNMS9rAgMBAAECggEAZk6cF/8s5+sIqy9OXdgbaW1XbT1tOuQ23gCOX9o8Os/c\n" + - "eTG4GzpnM3QqV9l8J85D1uKD0nSeO8bLd/CGSlG0M9IVkwNjy/xIqyoFtUQHXmLn\n" + - "r84UXAv/qqDBoc8pf6RGSKZuodcMfgBuTlaQ6D3zgou0GiQN9//KP/jQyouwnr3A\n" + - "LyXQekxriwPuSYAPak8s5XLfugOebbSRm2UdGEgX3yrT9FVu9rtgeMKdRaCOU8T4\n" + - "G2UdpGaiDfm5yrR+2XEIv4oaH3WFxmmfQCxVcOFJ1iRvfKBbLb1UCgtJuCBD067y\n" + - "dq5PrwUTeAvd7hwZd0lxCSnWY7VvYFNr7iJfyElowQKBgQD8eosot+Th03hpkYDs\n" + - "BIVsw7oqhJmcrPV1bSZ+aQwqqrOGypNmb7nLGTC8Cj1sT+EzfGs7GqxiLOEn4NXr\n" + - "TYV//RUPBSEXVp2y+2dot1a9oq0BJ8FwGTYL0qSwJrIXJfkQFrYhVVz3JLIWJbwV\n" + - "cy4YCQr094BhXTS7joJOUDRsYwKBgQDDbI3Lv+bBK8lLfIBll1RY1k5Gqy/H+qxp\n" + - "sMN8FmadmIGzHhe9xml6b5EfAZphAUF4vZJhQXloT5Wm+NNIAf6X6dRjvzyw7N9B\n" + - "d48EFJF4ChqNGBocsQRNr2wPRzQ+k2caw9YyYMIjbhktDzO1U/FJGYW6/Vgr2v4K\n" + - "siROnXfLWQKBgBOVAZQP5z2opC8z7NbhZuPPrnG7xRpEw+jupUyqoxnwEWqD7bjF\n" + - "M5jQBFqhRLBQ5buTi9GSuQoIRxJLuuu8IH2TyH1YvX9M5YBLRXL2vVCJ/HcZeURT\n" + - "gECcfs92wNtQw6d+y3N8ZnB4tSNIm/Th8RJGKUZkp91lWECvxeWDDP3XAoGASfNq\n" + - "NRAJYlAPfGFAtTDu2i8+r79X9XUGiXg6gVp4umpbqkxY75eFkq9lWzZgFRVEkUwr\n" + - "eGIubyquluDSEw2uKg5yMMzNSqZYVY3IsOKXqbUpFvtn5jOWTU90tNNdEdD100sI\n" + - "Y0f6Ly4amNKH3rZFOERQNtJn6zCTsbh3xMgR7QECgYBhQTqxLU5eIu38MKobzRue\n" + - "RoUkMcoY3DePkKPSYjilFhkUDozIXf/xUGnB8kERZKO+44wUkuPGljiFL1/P/RO9\n" + - "zhHAV94Kw2ddtfxy05GVtUZ99miBmsMb2m8vumGJqfR8h2xpfc1Ra0zfrsPgLNru\n" + - "xDTDW+bNbM7XyPvg9mOf7Q=="; // Certificate information: // Issuer: C=US, O=Java, OU=SunJSSE Test Serivce, CN=casigner @@ -216,33 +175,6 @@ public class BasicConstraints { "zr4da2aIg9CKrH2QWoMkDfRKkJvrU3/VhVfVWpNbXFE2xZXftQl3hpFCJ3FkpciA\n" + "l3hKeq4byY3LXxhAClHpk1KkXJkMnQdOfA5aGekj/Cjuaz1/iKYAG2vRq7YcuM/o\n" + "-----END CERTIFICATE-----"; - static String certIssuerPrivateKey = // Private key in the format of PKCS#8 - "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1lDVpzmzwbKOL\n" + - "yFWkjPjqtX9xLMq7SVqobvhBv+VChMGGjQbNQPbtczOcXNOcuMFyXxY++eXY7c37\n" + - "MzhbdZHv4Y4aWEn+A3EiX2/fTAbxx165qxKiHbD2EmlKk/Q6yIvi9M9EXXr/viEC\n" + - "Y4/Sdtd4KYtfETa0FpfF5/ZpZMYQo8I9RqBQOmhfvXL1l/Lodla5elZtvIUyp5k2\n" + - "nRQe58AxeP5hrilbIgfmEySf9mOkaTalRf2epBE/wRNA7Qi5Sr2O4pY2x3PPdmMy\n" + - "NL4cZaOJTgdyeDYbEMSW6vpiJW26ma/qeFgPIXZ8COFJZLSOEu310M4QOdSR1Y2c\n" + - "l3/V2E0VAgMBAAECggEBAJjfVrjl2kHwtSCSYchQB6FTfSBDnctgTrtP8iMo9FO0\n" + - "gVpOkVNtRndTbjhOzro7smIgPBJ5QlIIpErBLMmTinJza7gybNk2/KD7yKwuzgnw\n" + - "2IdoyB9E8B+8EHmBZzW2ck953KaqLUvzPsdMG2IOPAomr/gx/eRQwScVzBefiEGo\n" + - "sN+rGfUt/RNAHwWje1KuNDj21S84agQhN6hdYUnIMsvJLu/9mOwUb9ff+AzTUfFr\n" + - "zyx2MJL4Cx59DkUUMESCfinlHUc21llQjFWmX/zOoGY0X0qV/YM/GRsv1ZDFHw9o\n" + - "hQ6m8Ov7D9wB3TKZBI97sCyggjBfSeuYQlNbs99KWQECgYEA7IKNL0ME7FuIrKYu\n" + - "FCQ/Duz1N3oQXLzrTGKUSU1qSbrU2Jwk4SfJ8ZYCW1TP6vZkaQsTXmXun3yyCAqZ\n" + - "hcOtDBhI+b7Wpmmyf6nb83oYJtzHMRQZ5qS+9vOBfV9Uf1za8XI4p90EqkFHByCF\n" + - "tHfjVbjK39zN4CvaO3tqpOaYtL0CgYEAxIrTAhGWy9nBsxf8QeqDou0rV5Cw50Kl\n" + - "kQsE7KLmjvrMaFFpUc5lgWoC+pm/69VpNBUuN/38YozwxVjVi/nMJuuK150mhdWI\n" + - "B28FI7ORnFmVeSvTrP4mBX1ct2Tny9zpchXn3rpHR5NZUs7oBhjudHSfRMrHxeBs\n" + - "Kv2pr2s6uzkCgYAtrEh3iAm7WzHZpX3ghd9nknsIa5odTp5h8eeRAFI2Ss4vxneY\n" + - "w4ZMERwDZy1/wnVBk9H5uNWMFxiKVQGww0j3vPjawe/R0zeVT8gaDMn9N0WARNF7\n" + - "qPT3265196LptZTSa6xlPllYR6LfzXgEkeJk+3qyIIHheJZ8RikiDyYOQQKBgQC/\n" + - "rxlegiMNC4KDldf7vanGxAKqcz5lPbXWQOX7mGC+f9HNx+Cs3VxYHDltiXgJnOju\n" + - "191s1HRK9WR5REt5KhY2uzB9WxJQItJ5VYiwqhhQYXqLY/gdVv1kC0DayDndtMWk\n" + - "88JhklGkeAv83DikgbpGr9sJr6+oyFkWkLDmmfD82QKBgQCMgkZJzrdSNNlB0n5x\n" + - "xC3MzlsQ5aBJuUctnMfuyDi+11yLAuP1oLzGEJ7qEfFoGRO0V8zJWmHAfNhmVYEX\n" + - "ow5g0WbPT16GoRCiOAzq+ewH+TEELMF6HWqnDuTnCg28Jg0dw2kdVTqeyzKOQlLG\n" + - "ua9c2DY3PUTXQPNqLVhz+XxZKA=="; // Certificate information: // Issuer: C=US, O=Java, OU=SunJSSE Test Serivce, CN=certissuer @@ -277,6 +209,7 @@ public class BasicConstraints { "u/inkyf8NcG7zLBJJyuKfUXO/OzGPD5QMviVc+PCGTY=\n" + "-----END CERTIFICATE-----"; static String serverPrivateKey = // Private key in the format of PKCS#8 + "-----BEGIN PRIVATE KEY-----\n" + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCaDgoxN2UQQero\n" + "oBQ4JlQP1BFaZEtIkdIU2VJs4whz85J0LSB/68iEOS5e8wCz9wiQWr4isor7sl3e\n" + "B2dnLGY28BthOTw2j/CYw/dRqyDbPZniooB233uLGarKjqQWXpRFQi6bgEQmNqWe\n" + @@ -302,7 +235,8 @@ public class BasicConstraints { "/RiupLD4/awmf21ytpfHcmOWCcdQoE4WC69a6VyVAoGAboeogM5/TRKj80rXfUH2\n" + "lFZzgX246XGwNyOVVgOuv/Oxa61b5FeeCpnFQcjpZmC5vd63X3w7oYSDe2wUt+Wh\n" + "LhYunmcCEj+yb3of33loQb/FM2OLW9UoQakB7ewio9vtw+BAnWxnHFkEaqdxMXpy\n" + - "TiSXLpQ1Q9GvDpzngDzJzzY="; + "TiSXLpQ1Q9GvDpzngDzJzzY=\n" + + "-----END PRIVATE KEY-----"; // Certificate information: // Issuer: C=US, O=Java, OU=SunJSSE Test Serivce, CN=certissuer @@ -337,6 +271,7 @@ public class BasicConstraints { "tL85OZz8ov7d2jVet/w7FD4M5XfcogsNtpX4kaMsctyvQbDYRA==\n" + "-----END CERTIFICATE-----"; static String clientPrivateKey = // Private key in the format of PKCS#8 + "-----BEGIN PRIVATE KEY-----\n" + "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFwNzVfqQ58J0I\n" + "FxUO1ng7XE3uKg0FfbQ4/XEWRakF6PeAt9JZLl83R++tW2QfOAxEldKiyJOv5/g/\n" + "UjrIO0j3u7noxtuK6Yf1aTwDaz16PI8cIfylvvMtKWDYoBVGQ4vphAwDhoMqmgG2\n" + @@ -362,9 +297,10 @@ public class BasicConstraints { "cWJdYS5BrwEUen8vaQt1LhgS6lOqYsjysCxkYm078QKBgEJuq4RzecgiGx8srWDb\n" + "pQKpxrdEt82Y7OXLVj+W9vixcW/xUYhDYGsfdUigZoOjo4nV8KVmMbuI48PIYwnw\n" + "haLwWrBWlki4x9MRwuZUdewOYoo7hDZToZmIDescdiwv8CA/Dg9kOX3YYLPW+cWl\n" + - "i1pnyMPaloBOhz3Y07sWXxCz"; + "i1pnyMPaloBOhz3Y07sWXxCz\n" + + "-----END PRIVATE KEY-----"; - static char passphrase[] = "passphrase".toCharArray(); + static char[] passphrase = "passphrase".toCharArray(); /* * Is the server ready to serve? @@ -374,7 +310,7 @@ public class BasicConstraints { /* * Turn on SSL debugging? */ - static boolean debug = false; + static boolean debug = Boolean.getBoolean("test.debug"); /* * Define the server side of the test. @@ -447,48 +383,39 @@ public class BasicConstraints { // get the ssl context private static SSLContext getSSLContext(boolean isServer) throws Exception { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + final PEMDecoder pemDecoder = PEMDecoder.of(); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); ks.load(null, null); - // import the trused cert - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); - is.close(); + // generate certificate from cert string + Certificate trusedCert = pemDecoder.decode(trusedCertStr, X509Certificate.class); + + // import the trused cert ks.setCertificateEntry("SunJSSE Test Serivce", trusedCert); // import the certificate chain and key Certificate[] chain = new Certificate[3]; - is = new ByteArrayInputStream(caSignerStr.getBytes()); - Certificate caSignerCert = cf.generateCertificate(is); - is.close(); + Certificate caSignerCert =pemDecoder.decode(caSignerStr, X509Certificate.class); chain[2] = caSignerCert; - is = new ByteArrayInputStream(certIssuerStr.getBytes()); - Certificate certIssuerCert = cf.generateCertificate(is); - is.close(); + Certificate certIssuerCert =pemDecoder.decode(certIssuerStr, X509Certificate.class); chain[1] = certIssuerCert; - PKCS8EncodedKeySpec priKeySpec = null; + PKCS8EncodedKeySpec priKeySpec; + Certificate keyCert; if (isServer) { - priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(serverPrivateKey)); - is = new ByteArrayInputStream(serverCertStr.getBytes()); + priKeySpec =pemDecoder.decode(serverPrivateKey, PKCS8EncodedKeySpec.class); + keyCert = pemDecoder.decode(serverCertStr, X509Certificate.class); } else { - priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(clientPrivateKey)); - is = new ByteArrayInputStream(clientCertStr.getBytes()); + priKeySpec = pemDecoder.decode(clientPrivateKey, PKCS8EncodedKeySpec.class); + keyCert = pemDecoder.decode(clientCertStr, X509Certificate.class); } KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPrivateKey priKey = (RSAPrivateKey)kf.generatePrivate(priKeySpec); - Certificate keyCert = cf.generateCertificate(is); - is.close(); chain[0] = keyCert; ks.setKeyEntry("End Entity", priKey, passphrase, chain); @@ -496,7 +423,8 @@ public class BasicConstraints { // check the certification path PKIXParameters paras = new PKIXParameters(ks); paras.setRevocationEnabled(false); - CertPath path = cf.generateCertPath(Arrays.asList(chain)); + CertPath path = CertificateFactory.getInstance("X.509") + .generateCertPath(Arrays.asList(chain)); CertPathValidator cv = CertPathValidator.getInstance("PKIX"); cv.validate(path, paras); @@ -531,7 +459,7 @@ public class BasicConstraints { volatile Exception serverException = null; volatile Exception clientException = null; - public static void main(String args[]) throws Exception { + public static void main(String[] args) throws Exception { if (debug) System.setProperty("javax.net.debug", "all"); @@ -586,22 +514,20 @@ public class BasicConstraints { void startServer(boolean newThread) throws Exception { if (newThread) { - serverThread = new Thread() { - public void run() { - try { - doServerSide(); - } catch (Exception e) { - /* - * Our server thread just died. - * - * Release the client, if not active already... - */ - System.err.println("Server died..."); - serverReady = true; - serverException = e; - } + serverThread = new Thread(() -> { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; } - }; + }); serverThread.start(); } else { doServerSide(); @@ -610,19 +536,17 @@ public class BasicConstraints { void startClient(boolean newThread) throws Exception { if (newThread) { - clientThread = new Thread() { - public void run() { - try { - doClientSide(); - } catch (Exception e) { - /* - * Our client thread just died. - */ - System.err.println("Client died..."); - clientException = e; - } + clientThread = new Thread(() -> { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; } - }; + }); clientThread.start(); } else { doClientSide(); diff --git a/test/jdk/sun/security/ssl/X509TrustManagerImpl/ComodoHacker.java b/test/jdk/sun/security/ssl/X509TrustManagerImpl/ComodoHacker.java index 6a67364360f..f1e5415e2c3 100644 --- a/test/jdk/sun/security/ssl/X509TrustManagerImpl/ComodoHacker.java +++ b/test/jdk/sun/security/ssl/X509TrustManagerImpl/ComodoHacker.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,21 +25,18 @@ * @test * @bug 7123519 * @summary Problem with java/classes_security + * @enablePreview * @run main/othervm ComodoHacker PKIX * @run main/othervm ComodoHacker SunX509 */ -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; import java.security.KeyStore; +import java.security.PEMDecoder; import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.cert.CertificateException; -import java.security.spec.*; -import java.security.interfaces.*; public class ComodoHacker { // DigiNotar Root CA, untrusted root certificate @@ -213,6 +210,8 @@ public class ComodoHacker { "baB2sVGcVNBkK55bT8gPqnx8JypubyUvayzZGg==\n" + "-----END CERTIFICATE-----"; + private static final PEMDecoder pemDecoder = PEMDecoder.of(); + private static String tmAlgorithm; // trust manager public static void main(String args[]) throws Exception { @@ -253,19 +252,15 @@ public class ComodoHacker { } private static X509TrustManager getTrustManager() throws Exception { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); ks.load(null, null); + // generate certificate from cert string + Certificate trustedCert = pemDecoder.decode(trustedCertStr, X509Certificate.class); // import the trusted cert - try (ByteArrayInputStream is = - new ByteArrayInputStream(trustedCertStr.getBytes())) { - Certificate trustedCert = cf.generateCertificate(is); - ks.setCertificateEntry("RSA Export Signer", trustedCert); - } + ks.setCertificateEntry("RSA Export Signer", trustedCert); // create the trust manager TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmAlgorithm); @@ -276,28 +271,11 @@ public class ComodoHacker { private static X509Certificate[] getFraudulentChain() throws Exception { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate[] chain = new X509Certificate[4]; - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - chain[0] = (X509Certificate)cf.generateCertificate(is); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(intermediateCertStr.getBytes())) { - chain[1] = (X509Certificate)cf.generateCertificate(is); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(compromisedCertStr.getBytes())) { - chain[2] = (X509Certificate)cf.generateCertificate(is); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(untrustedCrossCertStr.getBytes())) { - chain[3] = (X509Certificate)cf.generateCertificate(is); - } + chain[0] = pemDecoder.decode(targetCertStr, X509Certificate.class); + chain[1] = pemDecoder.decode(intermediateCertStr, X509Certificate.class); + chain[2] = pemDecoder.decode(compromisedCertStr, X509Certificate.class); + chain[3] = pemDecoder.decode(untrustedCrossCertStr, X509Certificate.class); return chain; } diff --git a/test/jdk/sun/security/x509/X509CRLImpl/Verify.java b/test/jdk/sun/security/x509/X509CRLImpl/Verify.java index 911f53f5120..a10a18971d2 100644 --- a/test/jdk/sun/security/x509/X509CRLImpl/Verify.java +++ b/test/jdk/sun/security/x509/X509CRLImpl/Verify.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,19 @@ * @test * @bug 7026347 * @summary X509CRL should have verify(PublicKey key, Provider sigProvider) + * @enablePreview */ -import java.io.ByteArrayInputStream; -import java.security.*; -import java.security.cert.*; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.PEMDecoder; +import java.security.Provider; +import java.security.PublicKey; +import java.security.Security; +import java.security.SignatureException; +import java.security.cert.CRLException; +import java.security.cert.X509CRL; +import java.security.cert.X509Certificate; public class Verify { @@ -144,23 +152,21 @@ public class Verify { } } - private static void setup() throws CertificateException, CRLException { - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + private static void setup() { + final PEMDecoder pemDecoder = PEMDecoder.of(); /* Create CRL */ - ByteArrayInputStream inputStream = - new ByteArrayInputStream(crlStr.getBytes()); - crl = (X509CRL)cf.generateCRL(inputStream); + crl = pemDecoder.decode(crlStr, X509CRL.class); /* Get public key of the CRL issuer cert */ - inputStream = new ByteArrayInputStream(crlIssuerCertStr.getBytes()); - X509Certificate cert - = (X509Certificate)cf.generateCertificate(inputStream); - crlIssuerCertPubKey = cert.getPublicKey(); + crlIssuerCertPubKey = pemDecoder.decode(crlIssuerCertStr, X509Certificate.class) + .getPublicKey(); + /* Get public key of the self-signed Cert */ - inputStream = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - selfSignedCertPubKey = cf.generateCertificate(inputStream).getPublicKey(); + selfSignedCertPubKey = pemDecoder.decode(selfSignedCertStr, X509Certificate.class) + .getPublicKey(); + } private static void verifyCRL(PublicKey key, String providerName) From 27c83c730d8b0f87bb51230c35e4fe261c9d2723 Mon Sep 17 00:00:00 2001 From: Hamlin Li Date: Wed, 22 Oct 2025 08:12:10 +0000 Subject: [PATCH 244/561] 8370225: RISC-V: cleanup verify_xxx in interp_masm_riscv.hpp Reviewed-by: fyang --- src/hotspot/cpu/riscv/interp_masm_riscv.hpp | 7 ++----- .../cpu/riscv/templateInterpreterGenerator_riscv.cpp | 4 ---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp index eec4f0846a5..295f1b22191 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp @@ -301,12 +301,9 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_method_entry(Register cache, Register index, int bcp_offset = 1); void verify_field_offset(Register reg) NOT_DEBUG_RETURN; - -#ifdef ASSERT void verify_access_flags(Register access_flags, uint32_t flag, - const char* msg, bool stop_by_hit = true); - void verify_frame_setup(); -#endif + const char* msg, bool stop_by_hit = true) NOT_DEBUG_RETURN; + void verify_frame_setup() NOT_DEBUG_RETURN; }; #endif // CPU_RISCV_INTERP_MASM_RISCV_HPP diff --git a/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp b/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp index 61f4aa3e722..692335d8c08 100644 --- a/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp @@ -1073,9 +1073,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) { } // start execution -#ifdef ASSERT __ verify_frame_setup(); -#endif // jvmti support __ notify_method_entry(); @@ -1541,9 +1539,7 @@ address TemplateInterpreterGenerator::generate_normal_entry(bool synchronized) { } // start execution -#ifdef ASSERT __ verify_frame_setup(); -#endif // jvmti support __ notify_method_entry(); From 6bf3581bbacc2ed8f6411d23a5ab332376c53c87 Mon Sep 17 00:00:00 2001 From: Martin Doerr Date: Wed, 22 Oct 2025 08:35:05 +0000 Subject: [PATCH 245/561] 8369946: Bytecode rewriting causes Java heap corruption on PPC Reviewed-by: rrich, dbriemann --- src/hotspot/cpu/ppc/interp_masm_ppc.hpp | 9 ++++-- src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp | 34 ++++++++++---------- src/hotspot/cpu/ppc/templateTable_ppc_64.cpp | 13 +++++--- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/hotspot/cpu/ppc/interp_masm_ppc.hpp b/src/hotspot/cpu/ppc/interp_masm_ppc.hpp index d3969427db3..9140dd7ca4e 100644 --- a/src/hotspot/cpu/ppc/interp_masm_ppc.hpp +++ b/src/hotspot/cpu/ppc/interp_masm_ppc.hpp @@ -133,8 +133,13 @@ class InterpreterMacroAssembler: public MacroAssembler { void get_cache_index_at_bcp(Register Rdst, int bcp_offset, size_t index_size); void load_resolved_indy_entry(Register cache, Register index); - void load_field_entry(Register cache, Register index, int bcp_offset = 1); - void load_method_entry(Register cache, Register index, int bcp_offset = 1); + void load_field_or_method_entry(bool is_method, Register cache, Register index, int bcp_offset, bool for_fast_bytecode); + void load_field_entry(Register cache, Register index, int bcp_offset = 1, bool for_fast_bytecode = false) { + load_field_or_method_entry(false, cache, index, bcp_offset, for_fast_bytecode); + } + void load_method_entry(Register cache, Register index, int bcp_offset = 1, bool for_fast_bytecode = false) { + load_field_or_method_entry(true, cache, index, bcp_offset, for_fast_bytecode); + } void get_u4(Register Rdst, Register Rsrc, int offset, signedOrNot is_signed); diff --git a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp index 8df2cc5d273..503cc259432 100644 --- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp @@ -468,33 +468,33 @@ void InterpreterMacroAssembler::load_resolved_indy_entry(Register cache, Registe add(cache, cache, index); } -void InterpreterMacroAssembler::load_field_entry(Register cache, Register index, int bcp_offset) { +void InterpreterMacroAssembler::load_field_or_method_entry(bool is_method, Register cache, Register index, int bcp_offset, bool for_fast_bytecode) { + const int entry_size = is_method ? sizeof(ResolvedMethodEntry) : sizeof(ResolvedFieldEntry), + base_offset = is_method ? Array::base_offset_in_bytes() : Array::base_offset_in_bytes(), + entries_offset = is_method ? in_bytes(ConstantPoolCache::method_entries_offset()) : in_bytes(ConstantPoolCache::field_entries_offset()); + // Get index out of bytecode pointer get_cache_index_at_bcp(index, bcp_offset, sizeof(u2)); // Take shortcut if the size is a power of 2 - if (is_power_of_2(sizeof(ResolvedFieldEntry))) { + if (is_power_of_2(entry_size)) { // Scale index by power of 2 - sldi(index, index, log2i_exact(sizeof(ResolvedFieldEntry))); + sldi(index, index, log2i_exact(entry_size)); } else { // Scale the index to be the entry index * sizeof(ResolvedFieldEntry) - mulli(index, index, sizeof(ResolvedFieldEntry)); + mulli(index, index, entry_size); } // Get address of field entries array - ld_ptr(cache, in_bytes(ConstantPoolCache::field_entries_offset()), R27_constPoolCache); - addi(cache, cache, Array::base_offset_in_bytes()); + ld_ptr(cache, entries_offset, R27_constPoolCache); + addi(cache, cache, base_offset); add(cache, cache, index); -} -void InterpreterMacroAssembler::load_method_entry(Register cache, Register index, int bcp_offset) { - // Get index out of bytecode pointer - get_cache_index_at_bcp(index, bcp_offset, sizeof(u2)); - // Scale the index to be the entry index * sizeof(ResolvedMethodEntry) - mulli(index, index, sizeof(ResolvedMethodEntry)); - - // Get address of field entries array - ld_ptr(cache, ConstantPoolCache::method_entries_offset(), R27_constPoolCache); - addi(cache, cache, Array::base_offset_in_bytes()); - add(cache, cache, index); // method_entries + base_offset + scaled index + if (for_fast_bytecode) { + // Prevent speculative loading from ResolvedFieldEntry/ResolvedMethodEntry as it can miss the info written by another thread. + // TemplateTable::patch_bytecode uses release-store. + // We reached here via control dependency (Bytecode dispatch has used the rewritten Bytecode). + // So, we can use control-isync based ordering. + isync(); + } } // Load object from cpool->resolved_references(index). diff --git a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp index 41fbe66647e..09acd1c067d 100644 --- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp @@ -148,7 +148,9 @@ void TemplateTable::patch_bytecode(Bytecodes::Code new_bc, Register Rnew_bc, Reg __ bind(L_fast_patch); } - // Patch bytecode. + // Patch bytecode with release store to coordinate with ResolvedFieldEntry + // and ResolvedMethodEntry loads in fast bytecode codelets. + __ release(); __ stb(Rnew_bc, 0, R14_bcp); __ bind(L_patch_done); @@ -312,6 +314,7 @@ void TemplateTable::fast_aldc(LdcType type) { // We are resolved if the resolved reference cache entry contains a // non-null object (CallSite, etc.) __ get_cache_index_at_bcp(R31, 1, index_size); // Load index. + // Only rewritten during link time. So, no need for memory barriers for accessing resolved info. __ load_resolved_reference_at_index(R17_tos, R31, R11_scratch1, R12_scratch2, &is_null); // Convert null sentinel to null @@ -3114,7 +3117,7 @@ void TemplateTable::fast_storefield(TosState state) { const ConditionRegister CR_is_vol = CR2; // Non-volatile condition register (survives runtime call in do_oop_store). // Constant pool already resolved => Load flags and offset of field. - __ load_field_entry(Rcache, Rscratch); + __ load_field_entry(Rcache, Rscratch, 1, /* for_fast_bytecode */ true); jvmti_post_field_mod(Rcache, Rscratch, false /* not static */); load_resolved_field_entry(noreg, Rcache, noreg, Roffset, Rflags, false); // Uses R11, R12 @@ -3195,7 +3198,7 @@ void TemplateTable::fast_accessfield(TosState state) { // R12_scratch2 used by load_field_cp_cache_entry // Constant pool already resolved. Get the field offset. - __ load_field_entry(Rcache, Rscratch); + __ load_field_entry(Rcache, Rscratch, 1, /* for_fast_bytecode */ true); load_resolved_field_entry(noreg, Rcache, noreg, Roffset, Rflags, false); // Uses R11, R12 // JVMTI support @@ -3334,7 +3337,7 @@ void TemplateTable::fast_xaccess(TosState state) { __ ld(Rclass_or_obj, 0, R18_locals); // Constant pool already resolved. Get the field offset. - __ load_field_entry(Rcache, Rscratch, 2); + __ load_field_entry(Rcache, Rscratch, 2, /* for_fast_bytecode */ true); load_resolved_field_entry(noreg, Rcache, noreg, Roffset, Rflags, false); // Uses R11, R12 // JVMTI support not needed, since we switch back to single bytecode as soon as debugger attaches. @@ -3495,7 +3498,7 @@ void TemplateTable::fast_invokevfinal(int byte_no) { assert(byte_no == f2_byte, "use this argument"); Register Rcache = R31; - __ load_method_entry(Rcache, R11_scratch1); + __ load_method_entry(Rcache, R11_scratch1, 1, /* for_fast_bytecode */ true); invokevfinal_helper(Rcache, R11_scratch1, R12_scratch2, R22_tmp2, R23_tmp3); } From bdfd5e843a7d3db50edf4375e50449b0ce528f8a Mon Sep 17 00:00:00 2001 From: Anton Seoane Ampudia Date: Wed, 22 Oct 2025 09:08:26 +0000 Subject: [PATCH 246/561] 8367690: C2: Unneeded branch in reduce_phi Reviewed-by: rcastanedalo, chagedorn --- src/hotspot/share/opto/escape.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hotspot/share/opto/escape.cpp b/src/hotspot/share/opto/escape.cpp index cbf0666c00e..a148b167ee3 100644 --- a/src/hotspot/share/opto/escape.cpp +++ b/src/hotspot/share/opto/escape.cpp @@ -1296,9 +1296,8 @@ void ConnectionGraph::reduce_phi(PhiNode* ophi, GrowableArray &alloc_wo castpps.push(use); } else if (use->is_AddP() || use->is_Cmp()) { others.push(use); - } else if (use->is_SafePoint()) { - // processed later } else { + // Safepoints to be processed later; other users aren't expected here assert(use->is_SafePoint(), "Unexpected user of reducible Phi %d -> %d:%s:%d", ophi->_idx, use->_idx, use->Name(), use->outcnt()); } } From b8d3c9049c2b2557e51752c4ed90d7be54731b36 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Wed, 22 Oct 2025 09:35:24 +0000 Subject: [PATCH 247/561] 8370229: Remove unused method declarations after JDK-8322630 Reviewed-by: ayang, dholmes --- src/hotspot/share/runtime/sharedRuntime.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/hotspot/share/runtime/sharedRuntime.hpp b/src/hotspot/share/runtime/sharedRuntime.hpp index 93cd92b3a32..f4ff51504f0 100644 --- a/src/hotspot/share/runtime/sharedRuntime.hpp +++ b/src/hotspot/share/runtime/sharedRuntime.hpp @@ -384,10 +384,6 @@ class SharedRuntime: AllStatic { // deopt blob static void generate_deopt_blob(void); - static bool handle_ic_miss_helper_internal(Handle receiver, nmethod* caller_nm, const frame& caller_frame, - methodHandle callee_method, Bytecodes::Code bc, CallInfo& call_info, - bool& needs_ic_stub_refill, TRAPS); - public: static DeoptimizationBlob* deopt_blob(void) { return _deopt_blob; } @@ -549,7 +545,6 @@ class SharedRuntime: AllStatic { // A compiled caller has just called the interpreter, but compiled code // exists. Patch the caller so he no longer calls into the interpreter. static void fixup_callers_callsite(Method* moop, address ret_pc); - static bool should_fixup_call_destination(address destination, address entry_point, address caller_pc, Method* moop, CodeBlob* cb); // Slow-path Locking and Unlocking static void complete_monitor_locking_C(oopDesc* obj, BasicLock* lock, JavaThread* current); From 60104575b221eb3d78a4d56839d55953d4036c21 Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Wed, 22 Oct 2025 10:36:23 +0000 Subject: [PATCH 248/561] 8370378: Some compiler tests inadvertently exclude particular platforms Reviewed-by: chagedorn, mchevalier --- test/hotspot/jtreg/compiler/c2/TestBit.java | 2 +- .../c2/irTests/RotateLeftNodeIntIdealizationTests.java | 4 ++-- .../c2/irTests/RotateLeftNodeLongIdealizationTests.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/hotspot/jtreg/compiler/c2/TestBit.java b/test/hotspot/jtreg/compiler/c2/TestBit.java index b1186a85cae..01769470d78 100644 --- a/test/hotspot/jtreg/compiler/c2/TestBit.java +++ b/test/hotspot/jtreg/compiler/c2/TestBit.java @@ -33,7 +33,7 @@ import jdk.test.lib.process.ProcessTools; * @library /test/lib / * * @requires vm.flagless - * @requires os.arch=="aarch64" | os.arch=="amd64" | os.arch == "ppc64" | os.arch == "ppc64le" | os.arch == "riscv64" + * @requires os.arch == "aarch64" | os.arch == "amd64" | os.arch == "x86_64" | os.arch == "ppc64" | os.arch == "ppc64le" | os.arch == "riscv64" * @requires vm.debug == true & vm.compiler2.enabled * * @run driver compiler.c2.TestBit diff --git a/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeIntIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeIntIdealizationTests.java index e3651129daa..f5225e8173c 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeIntIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeIntIdealizationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import compiler.lib.ir_framework.*; * @summary Test that Ideal transformations of RotateLeftNode* are being performed as expected. * @library /test/lib / * @run driver compiler.c2.irTests.RotateLeftNodeIntIdealizationTests - * @requires os.arch == "x86_64" | os.arch == "aarch64" | (os.arch == "riscv64" & vm.cpu.features ~= ".*zbb.*") + * @requires os.arch == "amd64" | os.arch == "x86_64" | os.arch == "aarch64" | (os.arch == "riscv64" & vm.cpu.features ~= ".*zbb.*") */ public class RotateLeftNodeIntIdealizationTests { diff --git a/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeLongIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeLongIdealizationTests.java index 190f08d348c..b28d2f6dc8b 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeLongIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/RotateLeftNodeLongIdealizationTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import compiler.lib.ir_framework.*; * @summary Test that Ideal transformations of RotateLeftNode* are being performed as expected. * @library /test/lib / * @run driver compiler.c2.irTests.RotateLeftNodeLongIdealizationTests - * @requires os.arch == "x86_64" | os.arch == "aarch64" | (os.arch == "riscv64" & vm.cpu.features ~= ".*zbb.*") + * @requires os.arch == "amd64" | os.arch == "x86_64" | os.arch == "aarch64" | (os.arch == "riscv64" & vm.cpu.features ~= ".*zbb.*") */ public class RotateLeftNodeLongIdealizationTests { From 763d4252f8228adb822f6f4ad2d943e8cffb5b18 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Wed, 22 Oct 2025 11:11:42 +0000 Subject: [PATCH 249/561] 8368781: PerfMemory - make issues more transparent Reviewed-by: dholmes, goetz --- src/hotspot/os/posix/perfMemory_posix.cpp | 88 +++---- src/hotspot/os/windows/perfMemory_windows.cpp | 242 +++++------------- src/hotspot/share/runtime/perfMemory.cpp | 9 +- 3 files changed, 102 insertions(+), 237 deletions(-) diff --git a/src/hotspot/os/posix/perfMemory_posix.cpp b/src/hotspot/os/posix/perfMemory_posix.cpp index ed83487265c..2cc0263d291 100644 --- a/src/hotspot/os/posix/perfMemory_posix.cpp +++ b/src/hotspot/os/posix/perfMemory_posix.cpp @@ -26,6 +26,7 @@ #include "classfile/vmSymbols.hpp" #include "jvm_io.h" #include "logging/log.hpp" +#include "logging/logStream.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" #include "nmt/memTracker.hpp" @@ -71,9 +72,7 @@ static char* create_standard_memory(size_t size) { // commit memory if (!os::commit_memory(mapAddress, size, !ExecMem)) { - if (PrintMiscellaneous && Verbose) { - warning("Could not commit PerfData memory\n"); - } + log_debug(perf)("could not commit PerfData memory"); os::release_memory(mapAddress, size); return nullptr; } @@ -297,11 +296,12 @@ static DIR *open_directory_secure(const char* dirname) { RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); if (result == OS_ERR) { // Directory doesn't exist or is a symlink, so there is nothing to cleanup. - if (PrintMiscellaneous && Verbose) { + if (log_is_enabled(Debug, perf)) { + LogStreamHandle(Debug, perf) log; if (errno == ELOOP) { - warning("directory %s is a symlink and is not secure\n", dirname); + log.print_cr("directory %s is a symlink and is not secure", dirname); } else { - warning("could not open directory %s: %s\n", dirname, os::strerror(errno)); + log.print_cr("could not open directory %s: %s", dirname, os::strerror(errno)); } } return dirp; @@ -371,9 +371,7 @@ static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) { // handle errors, otherwise shared memory files will be created in cwd. result = fchdir(fd); if (result == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("could not change to directory %s", dirname); - } + log_debug(perf)("could not change to directory %s", dirname); if (*saved_cwd_fd != -1) { ::close(*saved_cwd_fd); *saved_cwd_fd = -1; @@ -411,16 +409,12 @@ static bool is_file_secure(int fd, const char *filename) { // Determine if the file is secure. RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("fstat failed on %s: %s\n", filename, os::strerror(errno)); - } + log_debug(perf)("fstat failed on %s: %s", filename, os::strerror(errno)); return false; } if (statbuf.st_nlink > 1) { // A file with multiple links is not expected. - if (PrintMiscellaneous && Verbose) { - warning("file %s has multiple links\n", filename); - } + log_debug(perf)("file %s has multiple links", filename); return false; } return true; @@ -447,10 +441,10 @@ static char* get_user_name(uid_t uid) { int result = getpwuid_r(uid, &pwent, pwbuf, (size_t)bufsize, &p); if (result != 0 || p == nullptr || p->pw_name == nullptr || *(p->pw_name) == '\0') { - if (PrintMiscellaneous && Verbose) { + if (log_is_enabled(Debug, perf)) { + LogStreamHandle(Debug, perf) log; if (result != 0) { - warning("Could not retrieve passwd entry: %s\n", - os::strerror(result)); + log.print_cr("Could not retrieve passwd entry: %s", os::strerror(result)); } else if (p == nullptr) { // this check is added to protect against an observed problem @@ -463,13 +457,11 @@ static char* get_user_name(uid_t uid) { // message may result in an erroneous message. // Bug Id 89052 was opened with RedHat. // - warning("Could not retrieve passwd entry: %s\n", - os::strerror(errno)); + log.print_cr("Could not retrieve passwd entry: %s", os::strerror(errno)); } else { - warning("Could not determine user name: %s\n", - p->pw_name == nullptr ? "pw_name = null" : - "pw_name zero length"); + log.print_cr("Could not determine user name: %s", + p->pw_name == nullptr ? "pw_name = null" : "pw_name zero length"); } } FREE_C_HEAP_ARRAY(char, pwbuf); @@ -680,10 +672,10 @@ static void remove_file(const char* path) { // maliciously planted, the directory's presence won't hurt anything. // RESTARTABLE(::unlink(path), result); - if (PrintMiscellaneous && Verbose && result == OS_ERR) { + if (log_is_enabled(Debug, perf) && result == OS_ERR) { if (errno != ENOENT) { - warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, os::strerror(errno)); + log_debug(perf)("could not unlink shared memory backing store file %s : %s", + path, os::strerror(errno)); } } } @@ -819,23 +811,16 @@ static bool make_user_tmp_dir(const char* dirname) { // The directory already exists and was probably created by another // JVM instance. However, this could also be the result of a // deliberate symlink. Verify that the existing directory is safe. - // if (!is_directory_secure(dirname)) { // directory is not secure - if (PrintMiscellaneous && Verbose) { - warning("%s directory is insecure\n", dirname); - } + log_debug(perf)("%s directory is insecure", dirname); return false; } } else { // we encountered some other failure while attempting // to create the directory - // - if (PrintMiscellaneous && Verbose) { - warning("could not create directory %s: %s\n", - dirname, os::strerror(errno)); - } + log_debug(perf)("could not create directory %s: %s", dirname, os::strerror(errno)); return false; } } @@ -872,11 +857,12 @@ static int create_sharedmem_file(const char* dirname, const char* filename, size int fd; RESTARTABLE(os::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IRUSR|S_IWUSR), fd); if (fd == OS_ERR) { - if (PrintMiscellaneous && Verbose) { + if (log_is_enabled(Debug, perf)) { + LogStreamHandle(Debug, perf) log; if (errno == ELOOP) { - warning("file %s is a symlink and is not secure\n", filename); + log.print_cr("file %s is a symlink and is not secure", filename); } else { - warning("could not create file %s: %s\n", filename, os::strerror(errno)); + log.print_cr("could not create file %s: %s", filename, os::strerror(errno)); } } // close the directory and reset the current working directory @@ -924,18 +910,14 @@ static int create_sharedmem_file(const char* dirname, const char* filename, size // truncate the file to get rid of any existing data RESTARTABLE(::ftruncate(fd, (off_t)0), result); if (result == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("could not truncate shared memory file: %s\n", os::strerror(errno)); - } + log_debug(perf)("could not truncate shared memory file: %s", os::strerror(errno)); ::close(fd); return -1; } // set the file size RESTARTABLE(::ftruncate(fd, (off_t)size), result); if (result == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("could not set shared memory file size: %s\n", os::strerror(errno)); - } + log_debug(perf)("could not set shared memory file size: %s", os::strerror(errno)); ::close(fd); return -1; } @@ -1057,9 +1039,7 @@ static char* mmap_create_shared(size_t size) { assert(result != OS_ERR, "could not close file"); if (mapAddress == MAP_FAILED) { - if (PrintMiscellaneous && Verbose) { - warning("mmap failed - %s\n", os::strerror(errno)); - } + log_debug(perf)("mmap failed - %s", os::strerror(errno)); remove_file(filename); FREE_C_HEAP_ARRAY(char, filename); return nullptr; @@ -1135,9 +1115,7 @@ static size_t sharedmem_filesize(int fd, TRAPS) { RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("fstat failed: %s\n", os::strerror(errno)); - } + log_debug(perf)("fstat failed: %s", os::strerror(errno)); THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); } @@ -1212,9 +1190,7 @@ static void mmap_attach_shared(int vmid, char** addr, size_t* sizep, TRAPS) { assert(result != OS_ERR, "could not close file"); if (mapAddress == MAP_FAILED) { - if (PrintMiscellaneous && Verbose) { - warning("mmap failed: %s\n", os::strerror(errno)); - } + log_debug(perf)("mmap failed: %s", os::strerror(errno)); THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); } @@ -1244,13 +1220,9 @@ void PerfMemory::create_memory_region(size_t size) { else { _start = create_shared_memory(size); if (_start == nullptr) { - // creation of the shared memory region failed, attempt // to create a contiguous, non-shared memory region instead. - // - if (PrintMiscellaneous && Verbose) { - warning("Reverting to non-shared PerfMemory region.\n"); - } + log_debug(perf)("Reverting to non-shared PerfMemory region."); FLAG_SET_ERGO(PerfDisableSharedMem, true); _start = create_standard_memory(size); } diff --git a/src/hotspot/os/windows/perfMemory_windows.cpp b/src/hotspot/os/windows/perfMemory_windows.cpp index a9b2eebb7be..f815f3bd104 100644 --- a/src/hotspot/os/windows/perfMemory_windows.cpp +++ b/src/hotspot/os/windows/perfMemory_windows.cpp @@ -24,6 +24,7 @@ #include "classfile/vmSymbols.hpp" #include "logging/log.hpp" +#include "logging/logStream.hpp" #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" #include "nmt/memTracker.hpp" @@ -62,9 +63,7 @@ static char* create_standard_memory(size_t size) { // commit memory if (!os::commit_memory(mapAddress, size, !ExecMem)) { - if (PrintMiscellaneous && Verbose) { - warning("Could not commit PerfData memory\n"); - } + log_debug(perf)("could not commit PerfData memory"); os::release_memory(mapAddress, size); return nullptr; } @@ -90,25 +89,21 @@ static void delete_standard_memory(char* addr, size_t size) { static void save_memory_to_file(char* addr, size_t size) { const char* destfile = PerfMemory::get_perfdata_file_path(); - assert(destfile[0] != '\0', "invalid Perfdata file path"); + assert(destfile[0] != '\0', "invalid PerfData file path"); int fd = ::_open(destfile, _O_BINARY|_O_CREAT|_O_WRONLY|_O_TRUNC, _S_IREAD|_S_IWRITE); if (fd == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("Could not create Perfdata save file: %s: %s\n", - destfile, os::strerror(errno)); - } + log_debug(perf)("could not create PerfData save file: %s: %s", + destfile, os::strerror(errno)); } else { for (size_t remaining = size; remaining > 0;) { int nbytes = ::_write(fd, addr, (unsigned int)remaining); if (nbytes == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("Could not write Perfdata save file: %s: %s\n", - destfile, os::strerror(errno)); - } + log_debug(perf)("could not write PerfData save file: %s: %s", + destfile, os::strerror(errno)); break; } @@ -117,10 +112,8 @@ static void save_memory_to_file(char* addr, size_t size) { } int result = ::_close(fd); - if (PrintMiscellaneous && Verbose) { - if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, os::strerror(errno)); - } + if (result == OS_ERR) { + log_debug(perf)("could not close %s: %s", destfile, os::strerror(errno)); } } @@ -220,10 +213,8 @@ static bool is_directory_secure(const char* path) { } else { // unexpected error, declare the path insecure - if (PrintMiscellaneous && Verbose) { - warning("could not get attributes for file %s: " - " lasterror = %d\n", path, lasterror); - } + log_debug(perf)("could not get attributes for file %s: lasterror = %d", + path, lasterror); return false; } } @@ -234,9 +225,7 @@ static bool is_directory_secure(const char* path) { // as some types of reparse points might be acceptable, but it // is probably more secure to avoid these conditions. // - if (PrintMiscellaneous && Verbose) { - warning("%s is a reparse point\n", path); - } + log_debug(perf)("%s is a reparse point", path); return false; } @@ -253,10 +242,8 @@ static bool is_directory_secure(const char* path) { // this is either a regular file or some other type of file, // any of which are unexpected and therefore insecure. // - if (PrintMiscellaneous && Verbose) { - warning("%s is not a directory, file attributes = " - INTPTR_FORMAT "\n", path, fa); - } + log_debug(perf)("%s is not a directory, file attributes : " + INTPTR_FORMAT, path, fa); return false; } } @@ -492,11 +479,9 @@ static void remove_file(const char* dirname, const char* filename) { strcat(path, filename); if (::unlink(path) == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - if (errno != ENOENT) { - warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, os::strerror(errno)); - } + if (errno != ENOENT) { + log_debug(perf)("could not unlink shared memory backing store file %s : %s", + path, os::strerror(errno)); } } @@ -515,20 +500,16 @@ static bool is_alive(int pid) { HANDLE ph = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (ph == nullptr) { // the process does not exist. - if (PrintMiscellaneous && Verbose) { - DWORD lastError = GetLastError(); - if (lastError != ERROR_INVALID_PARAMETER) { - warning("OpenProcess failed: %d\n", GetLastError()); - } + DWORD lastError = GetLastError(); + if (lastError != ERROR_INVALID_PARAMETER) { + log_debug(perf)("OpenProcess failed: %d", lastError); } return false; } DWORD exit_status; if (!GetExitCodeProcess(ph, &exit_status)) { - if (PrintMiscellaneous && Verbose) { - warning("GetExitCodeProcess failed: %d\n", GetLastError()); - } + log_debug(perf)("GetExitCodeProcess failed: %d", GetLastError()); CloseHandle(ph); return false; } @@ -545,17 +526,13 @@ static bool is_filesystem_secure(const char* path) { char fs_type[MAX_PATH]; if (PerfBypassFileSystemCheck) { - if (PrintMiscellaneous && Verbose) { - warning("bypassing file system criteria checks for %s\n", path); - } + log_debug(perf)("bypassing file system criteria checks for %s", path); return true; } char* first_colon = strchr((char *)path, ':'); if (first_colon == nullptr) { - if (PrintMiscellaneous && Verbose) { - warning("expected device specifier in path: %s\n", path); - } + log_debug(perf)("expected device specifier in path: %s", path); return false; } @@ -576,29 +553,22 @@ static bool is_filesystem_secure(const char* path) { if (!GetVolumeInformation(root_path, nullptr, 0, nullptr, &maxpath, &flags, fs_type, MAX_PATH)) { // we can't get information about the volume, so assume unsafe. - if (PrintMiscellaneous && Verbose) { - warning("could not get device information for %s: " - " path = %s: lasterror = %d\n", - root_path, path, GetLastError()); - } + log_debug(perf)("could not get device information for %s: path = %s: lasterror = %d", + root_path, path, GetLastError()); return false; } if ((flags & FS_PERSISTENT_ACLS) == 0) { // file system doesn't support ACLs, declare file system unsafe - if (PrintMiscellaneous && Verbose) { - warning("file system type %s on device %s does not support" - " ACLs\n", fs_type, root_path); - } + log_debug(perf)("file system type %s on device %s does not support ACLs", + fs_type, root_path); return false; } if ((flags & FS_VOL_IS_COMPRESSED) != 0) { // file system is compressed, declare file system unsafe - if (PrintMiscellaneous && Verbose) { - warning("file system type %s on device %s is compressed\n", - fs_type, root_path); - } + log_debug(perf)("file system type %s on device %s is compressed", + fs_type, root_path); return false; } @@ -704,9 +674,7 @@ static HANDLE create_file_mapping(const char* name, HANDLE fh, LPSECURITY_ATTRIB name); /* LPCTSTR name for object */ if (fmh == nullptr) { - if (PrintMiscellaneous && Verbose) { - warning("CreateFileMapping failed, lasterror = %d\n", GetLastError()); - } + log_debug(perf)("CreateFileMapping failed, lasterror = %d", GetLastError()); return nullptr; } @@ -717,9 +685,7 @@ static HANDLE create_file_mapping(const char* name, HANDLE fh, LPSECURITY_ATTRIB // the other processes either exit or close their mapping objects // and/or mapped views of this mapping object. // - if (PrintMiscellaneous && Verbose) { - warning("file mapping already exists, lasterror = %d\n", GetLastError()); - } + log_debug(perf)("file mapping already exists, lasterror = %d", GetLastError()); CloseHandle(fmh); return nullptr; @@ -783,9 +749,7 @@ static PSID get_user_sid(HANDLE hProcess) { // get the process token if (!OpenProcessToken(hProcess, TOKEN_READ, &hAccessToken)) { - if (PrintMiscellaneous && Verbose) { - warning("OpenProcessToken failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("OpenProcessToken failure: lasterror = %d", GetLastError()); return nullptr; } @@ -795,10 +759,8 @@ static PSID get_user_sid(HANDLE hProcess) { if (!GetTokenInformation(hAccessToken, TokenUser, nullptr, rsize, &rsize)) { DWORD lasterror = GetLastError(); if (lasterror != ERROR_INSUFFICIENT_BUFFER) { - if (PrintMiscellaneous && Verbose) { - warning("GetTokenInformation failure: lasterror = %d," - " rsize = %d\n", lasterror, rsize); - } + log_debug(perf)("GetTokenInformation failure: lasterror = %d, rsize = %d", + lasterror, rsize); CloseHandle(hAccessToken); return nullptr; } @@ -808,10 +770,8 @@ static PSID get_user_sid(HANDLE hProcess) { // get the user token information if (!GetTokenInformation(hAccessToken, TokenUser, token_buf, rsize, &rsize)) { - if (PrintMiscellaneous && Verbose) { - warning("GetTokenInformation failure: lasterror = %d," - " rsize = %d\n", GetLastError(), rsize); - } + log_debug(perf)("GetTokenInformation failure: lasterror = %d, rsize = %d", + GetLastError(), rsize); FREE_C_HEAP_ARRAY(char, token_buf); CloseHandle(hAccessToken); return nullptr; @@ -821,10 +781,8 @@ static PSID get_user_sid(HANDLE hProcess) { PSID pSID = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); if (!CopySid(nbytes, pSID, token_buf->User.Sid)) { - if (PrintMiscellaneous && Verbose) { - warning("GetTokenInformation failure: lasterror = %d," - " rsize = %d\n", GetLastError(), rsize); - } + log_debug(perf)("GetTokenInformation failure: lasterror = %d, rsize = %d", + GetLastError(), rsize); FREE_C_HEAP_ARRAY(char, token_buf); FREE_C_HEAP_ARRAY(char, pSID); CloseHandle(hAccessToken); @@ -866,10 +824,8 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, // retrieve any existing access control list. if (!GetSecurityDescriptorDacl(pSD, &exists, &oldACL, &isdefault)) { - if (PrintMiscellaneous && Verbose) { - warning("GetSecurityDescriptor failure: lasterror = %d \n", - GetLastError()); - } + log_debug(perf)("GetSecurityDescriptor failure: lasterror = %d", + GetLastError()); return false; } @@ -886,10 +842,8 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, if (!GetAclInformation(oldACL, &aclinfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation)) { - if (PrintMiscellaneous && Verbose) { - warning("GetAclInformation failure: lasterror = %d \n", GetLastError()); - return false; - } + log_debug(perf)("GetAclInformation failure: lasterror = %d", GetLastError()); + return false; } } else { aclinfo.AceCount = 0; // assume null DACL @@ -914,9 +868,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, newACL = (PACL) NEW_C_HEAP_ARRAY(char, newACLsize, mtInternal); if (!InitializeAcl(newACL, newACLsize, ACL_REVISION)) { - if (PrintMiscellaneous && Verbose) { - warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("InitializeAcl failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -927,9 +879,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, while (ace_index < aclinfo.AceCount) { LPVOID ace; if (!GetAce(oldACL, ace_index, &ace)) { - if (PrintMiscellaneous && Verbose) { - warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("InitializeAcl failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -954,9 +904,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, if (matches == 0) { if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace, ((PACE_HEADER)ace)->AceSize)) { - if (PrintMiscellaneous && Verbose) { - warning("AddAce failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("AddAce failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -969,10 +917,8 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, for (int i = 0; i < ace_count; i++) { if (!AddAccessAllowedAce(newACL, ACL_REVISION, aces[i].mask, aces[i].pSid)) { - if (PrintMiscellaneous && Verbose) { - warning("AddAccessAllowedAce failure: lasterror = %d \n", - GetLastError()); - } + log_debug(perf)("AddAccessAllowedAce failure: lasterror = %d", + GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -985,17 +931,13 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, while (ace_index < aclinfo.AceCount) { LPVOID ace; if (!GetAce(oldACL, ace_index, &ace)) { - if (PrintMiscellaneous && Verbose) { - warning("InitializeAcl failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("InitializeAcl failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } if (!AddAce(newACL, ACL_REVISION, MAXDWORD, ace, ((PACE_HEADER)ace)->AceSize)) { - if (PrintMiscellaneous && Verbose) { - warning("AddAce failure: lasterror = %d \n", GetLastError()); - } + log_debug(perf)("AddAce failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -1005,10 +947,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, // add the new ACL to the security descriptor. if (!SetSecurityDescriptorDacl(pSD, TRUE, newACL, FALSE)) { - if (PrintMiscellaneous && Verbose) { - warning("SetSecurityDescriptorDacl failure:" - " lasterror = %d \n", GetLastError()); - } + log_debug(perf)("SetSecurityDescriptorDacl failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -1025,10 +964,7 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, // protected prevents that. if (!_SetSecurityDescriptorControl(pSD, SE_DACL_PROTECTED, SE_DACL_PROTECTED)) { - if (PrintMiscellaneous && Verbose) { - warning("SetSecurityDescriptorControl failure:" - " lasterror = %d \n", GetLastError()); - } + log_debug(perf)("SetSecurityDescriptorControl failure: lasterror = %d", GetLastError()); FREE_C_HEAP_ARRAY(char, newACL); return false; } @@ -1057,10 +993,7 @@ static LPSECURITY_ATTRIBUTES make_security_attr(ace_data_t aces[], int count) { // initialize the security descriptor if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { - if (PrintMiscellaneous && Verbose) { - warning("InitializeSecurityDescriptor failure: " - "lasterror = %d \n", GetLastError()); - } + log_debug(perf)("InitializeSecurityDescriptor failure: lasterror = %d", GetLastError()); free_security_desc(pSD); return nullptr; } @@ -1113,11 +1046,7 @@ static LPSECURITY_ATTRIBUTES make_user_everybody_admin_security_attr( SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &administratorsSid)) { - - if (PrintMiscellaneous && Verbose) { - warning("AllocateAndInitializeSid failure: " - "lasterror = %d \n", GetLastError()); - } + log_debug(perf)("AllocateAndInitializeSid failure: lasterror = %d", GetLastError()); return nullptr; } @@ -1131,11 +1060,7 @@ static LPSECURITY_ATTRIBUTES make_user_everybody_admin_security_attr( if (!AllocateAndInitializeSid( &SIDAuthEverybody, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everybodySid)) { - - if (PrintMiscellaneous && Verbose) { - warning("AllocateAndInitializeSid failure: " - "lasterror = %d \n", GetLastError()); - } + log_debug(perf)("AllocateAndInitializeSid failure: lasterror = %d", GetLastError()); return nullptr; } @@ -1236,9 +1161,7 @@ static bool make_user_tmp_dir(const char* dirname) { // if (!is_directory_secure(dirname)) { // directory is not secure - if (PrintMiscellaneous && Verbose) { - warning("%s directory is insecure\n", dirname); - } + log_debug(perf)("%s directory is insecure", dirname); free_security_attr(pDirSA); return false; } @@ -1249,16 +1172,11 @@ static bool make_user_tmp_dir(const char* dirname) { // DACLs might fix the corrupted the DACLs. SECURITY_INFORMATION secInfo = DACL_SECURITY_INFORMATION; if (!SetFileSecurity(dirname, secInfo, pDirSA->lpSecurityDescriptor)) { - if (PrintMiscellaneous && Verbose) { - lasterror = GetLastError(); - warning("SetFileSecurity failed for %s directory. lasterror %d \n", - dirname, lasterror); - } + lasterror = GetLastError(); + log_debug(perf)("SetFileSecurity failed for %s directory. lasterror = %d", dirname, lasterror); } } else { - if (PrintMiscellaneous && Verbose) { - warning("CreateDirectory failed: %d\n", GetLastError()); - } + log_debug(perf)("CreateDirectory failed: %d", GetLastError()); free_security_attr(pDirSA); return false; } @@ -1325,9 +1243,7 @@ static HANDLE create_sharedmem_resources(const char* dirname, const char* filena if (fh == INVALID_HANDLE_VALUE) { DWORD lasterror = GetLastError(); - if (PrintMiscellaneous && Verbose) { - warning("could not create file %s: %d\n", filename, lasterror); - } + log_debug(perf)("could not create file %s: %d", filename, lasterror); free_security_attr(lpSmoSA); return nullptr; } @@ -1353,10 +1269,8 @@ static HANDLE create_sharedmem_resources(const char* dirname, const char* filena struct stat statbuf; int ret_code = ::stat(filename, &statbuf); if (ret_code == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("Could not get status information from file %s: %s\n", - filename, os::strerror(errno)); - } + log_debug(perf)("could not get status information from file %s: %s", + filename, os::strerror(errno)); CloseHandle(fmh); CloseHandle(fh); fh = nullptr; @@ -1369,9 +1283,7 @@ static HANDLE create_sharedmem_resources(const char* dirname, const char* filena // call it when we observe the size as zero (0). if (statbuf.st_size == 0 && FlushFileBuffers(fh) != TRUE) { DWORD lasterror = GetLastError(); - if (PrintMiscellaneous && Verbose) { - warning("could not flush file %s: %d\n", filename, lasterror); - } + log_debug(perf)("could not flush file %s: %d", filename, lasterror); CloseHandle(fmh); CloseHandle(fh); fh = nullptr; @@ -1402,10 +1314,8 @@ static HANDLE open_sharedmem_object(const char* objectname, DWORD ofm_access, TR if (fmh == nullptr) { DWORD lasterror = GetLastError(); - if (PrintMiscellaneous && Verbose) { - warning("OpenFileMapping failed for shared memory object %s:" - " lasterror = %d\n", objectname, lasterror); - } + log_debug(perf)("OpenFileMapping failed for shared memory object %s:" + " lasterror = %d", objectname, lasterror); THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Could not open PerfMemory, error %d", lasterror), INVALID_HANDLE_VALUE); @@ -1485,9 +1395,7 @@ static char* mapping_create_shared(size_t size) { (DWORD)size); /* DWORD Number of bytes to map */ if (mapAddress == nullptr) { - if (PrintMiscellaneous && Verbose) { - warning("MapViewOfFile failed, lasterror = %d\n", GetLastError()); - } + log_debug(perf)("MapViewOfFile failed, lasterror = %d", GetLastError()); CloseHandle(sharedmem_fileMapHandle); sharedmem_fileMapHandle = nullptr; return nullptr; @@ -1551,20 +1459,14 @@ static size_t sharedmem_filesize(const char* filename, TRAPS) { // inconsistencies // if (::stat(filename, &statbuf) == OS_ERR) { - if (PrintMiscellaneous && Verbose) { - warning("stat %s failed: %s\n", filename, os::strerror(errno)); - } + log_debug(perf)("stat %s failed: %s", filename, os::strerror(errno)); THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); } if ((statbuf.st_size == 0) || (statbuf.st_size % os::vm_page_size() != 0)) { - if (PrintMiscellaneous && Verbose) { - warning("unexpected file size: size = %zu\n", - statbuf.st_size); - } - THROW_MSG_0(vmSymbols::java_io_IOException(), - "Invalid PerfMemory size"); + log_debug(perf)("unexpected file size: size = %zu", statbuf.st_size); + THROW_MSG_0(vmSymbols::java_io_IOException(), "Invalid PerfMemory size"); } return statbuf.st_size; @@ -1637,9 +1539,7 @@ static void open_file_mapping(int vmid, char** addrp, size_t* sizep, TRAPS) { size); /* DWORD Number of bytes to map */ if (mapAddress == nullptr) { - if (PrintMiscellaneous && Verbose) { - warning("MapViewOfFile failed, lasterror = %d\n", GetLastError()); - } + log_debug(perf)("MapViewOfFile failed, lasterror = %d", GetLastError()); CloseHandle(fmh); THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); @@ -1708,9 +1608,7 @@ void PerfMemory::create_memory_region(size_t size) { // creation of the shared memory region failed, attempt // to create a contiguous, non-shared memory region instead. // - if (PrintMiscellaneous && Verbose) { - warning("Reverting to non-shared PerfMemory region.\n"); - } + log_debug(perf)("Reverting to non-shared PerfMemory region."); FLAG_SET_ERGO(PerfDisableSharedMem, true); _start = create_standard_memory(size); } diff --git a/src/hotspot/share/runtime/perfMemory.cpp b/src/hotspot/share/runtime/perfMemory.cpp index a75a41e95a9..9594149333e 100644 --- a/src/hotspot/share/runtime/perfMemory.cpp +++ b/src/hotspot/share/runtime/perfMemory.cpp @@ -114,9 +114,7 @@ void PerfMemory::initialize() { // the warning is issued only in debug mode in order to avoid // additional output to the stdout or stderr output streams. // - if (PrintMiscellaneous && Verbose) { - warning("Could not create PerfData Memory region, reverting to malloc"); - } + log_debug(perf)("could not create PerfData Memory region, reverting to malloc"); _prologue = NEW_C_HEAP_OBJ(PerfDataPrologue, mtInternal); } @@ -250,10 +248,7 @@ char* PerfMemory::get_perfdata_file_path() { if(!Arguments::copy_expand_pid(PerfDataSaveFile, strlen(PerfDataSaveFile), dest_file, JVM_MAXPATHLEN)) { FREE_C_HEAP_ARRAY(char, dest_file); - if (PrintMiscellaneous && Verbose) { - warning("Invalid performance data file path name specified, "\ - "fall back to a default name"); - } + log_debug(perf)("invalid performance data file path name specified, fall back to a default name"); } else { return dest_file; } From cbbb0a8630c991ba3a9e703ace47b479e944ce27 Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Wed, 22 Oct 2025 11:20:43 +0000 Subject: [PATCH 250/561] 8367976: Validate and clamp jdk.httpclient.bufsize Reviewed-by: dfuchs --- .../jdk/internal/net/http/common/Utils.java | 19 ++- .../share/classes/module-info.java | 4 +- .../java/net/httpclient/BufferSize1Test.java | 158 ++++++++++++++++++ .../BufferSizePropertyClampTest.java | 106 ++++++++++++ .../OfByteArrayTest.java | 7 - 5 files changed, 279 insertions(+), 15 deletions(-) create mode 100644 test/jdk/java/net/httpclient/BufferSize1Test.java create mode 100644 test/jdk/java/net/httpclient/BufferSizePropertyClampTest.java diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java index b14d76d8dba..a02506cff5c 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/Utils.java @@ -174,15 +174,20 @@ public final class Utils { public static final int SLICE_THRESHOLD = 32; /** - * Allocated buffer size. Must never be higher than 16K. But can be lower - * if smaller allocation units preferred. HTTP/2 mandates that all - * implementations support frame payloads of at least 16K. + * The capacity of ephemeral {@link ByteBuffer}s allocated to pass data to and from the client. + * It is ensured to have a value between 1 and 2^14 (16,384). */ - private static final int DEFAULT_BUFSIZE = 16 * 1024; - public static final int BUFSIZE = getIntegerNetProperty( - "jdk.httpclient.bufsize", DEFAULT_BUFSIZE - ); + "jdk.httpclient.bufsize", 1, + // We cap at 2^14 (16,384) for two main reasons: + // - The initial frame size is 2^14 (RFC 9113) + // - SSL record layer fragments data in chunks of 2^14 bytes or less (RFC 5246) + 1 << 14, + // We choose 2^14 (16,384) as the default, because: + // 1. It maximizes throughput within the limits described above + // 2. It is small enough to not create a GC bottleneck when it is partially filled + 1 << 14, + true); public static final BiPredicate ACCEPT_ALL = (x,y) -> true; diff --git a/src/java.net.http/share/classes/module-info.java b/src/java.net.http/share/classes/module-info.java index 392385136b0..48f23953ad0 100644 --- a/src/java.net.http/share/classes/module-info.java +++ b/src/java.net.http/share/classes/module-info.java @@ -48,7 +48,9 @@ * depending on the context. These restrictions cannot be overridden by this property. * *

      • {@systemProperty jdk.httpclient.bufsize} (default: 16384 bytes or 16 kB)
        - * The size to use for internal allocated buffers in bytes. + * The capacity of internal ephemeral buffers allocated to pass data to and from the + * client, in bytes. Valid values are in the range [1, 2^14 (16384)]. + * If an invalid value is provided, the default value is used. *

      • *
      • {@systemProperty jdk.httpclient.connectionPoolSize} (default: 0)
        * The maximum number of connections to keep in the HTTP/1.1 keep alive cache. A value of 0 diff --git a/test/jdk/java/net/httpclient/BufferSize1Test.java b/test/jdk/java/net/httpclient/BufferSize1Test.java new file mode 100644 index 00000000000..842dc06a630 --- /dev/null +++ b/test/jdk/java/net/httpclient/BufferSize1Test.java @@ -0,0 +1,158 @@ +/* + * 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. + * + * 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. + */ + +import jdk.httpclient.test.lib.common.HttpServerAdapters; +import jdk.internal.net.http.common.Utils; +import jdk.test.lib.net.SimpleSSLContext; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpClient.Version; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import static java.net.http.HttpClient.Builder.NO_PROXY; +import static java.net.http.HttpClient.Version.HTTP_1_1; +import static java.net.http.HttpClient.Version.HTTP_2; +import static java.net.http.HttpClient.Version.HTTP_3; +import static java.net.http.HttpOption.H3_DISCOVERY; +import static java.net.http.HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/* + * @test id + * @bug 8367976 + * @summary Verifies that setting the `jdk.httpclient.bufsize` system property + * to its lowest possible value, 1, does not wedge the client + * @library /test/jdk/java/net/httpclient/lib + * /test/lib + * @run junit/othervm -Djdk.httpclient.bufsize=1 BufferSize1Test + */ + +class BufferSize1Test implements HttpServerAdapters { + + @BeforeAll + static void verifyBufferSize() { + assertEquals(1, Utils.BUFSIZE); + } + + static Object[][] testArgs() { + return new Object[][]{ + {HTTP_1_1, false}, + {HTTP_1_1, true}, + {HTTP_2, false}, + {HTTP_2, true}, + {HTTP_3, true} + }; + } + + @ParameterizedTest + @MethodSource("testArgs") + void test(Version version, boolean secure) throws Exception { + + // Create the server + var sslContext = secure || HTTP_3.equals(version) ? new SimpleSSLContext().get() : null; + try (var server = switch (version) { + case HTTP_1_1, HTTP_2 -> HttpTestServer.create(version, sslContext); + case HTTP_3 -> HttpTestServer.create(HTTP_3_URI_ONLY, sslContext); + }) { + + // Add the handler and start the server + var serverHandlerPath = "/" + BufferSize1Test.class.getSimpleName(); + server.addHandler(new HttpTestEchoHandler(), serverHandlerPath); + server.start(); + + // Create the client + try (var client = createClient(version, sslContext)) { + + // Create the request with body to ensure that `ByteBuffer`s + // will be used throughout the entire end-to-end interaction. + byte[] requestBodyBytes = "body".repeat(1000).getBytes(StandardCharsets.US_ASCII); + var request = createRequest(sslContext, server, serverHandlerPath, version, requestBodyBytes); + + // Execute and verify the request. + // Do it twice to cover code paths before and after a protocol upgrade. + requestAndVerify(client, request, requestBodyBytes); + requestAndVerify(client, request, requestBodyBytes); + + } + + } + + } + + private HttpClient createClient(Version version, SSLContext sslContext) { + var clientBuilder = newClientBuilderForH3() + .proxy(NO_PROXY) + .version(version); + if (sslContext != null) { + clientBuilder.sslContext(sslContext); + } + return clientBuilder.build(); + } + + private static HttpRequest createRequest( + SSLContext sslContext, + HttpTestServer server, + String serverHandlerPath, + Version version, + byte[] requestBodyBytes) { + var requestUri = URI.create(String.format( + "%s://%s%s/x", + sslContext == null ? "http" : "https", + server.serverAuthority(), + serverHandlerPath)); + var requestBuilder = HttpRequest + .newBuilder(requestUri) + .version(version) + .POST(HttpRequest.BodyPublishers.ofByteArray(requestBodyBytes)); + if (HTTP_3.equals(version)) { + requestBuilder.setOption(H3_DISCOVERY, HTTP_3_URI_ONLY); + } + return requestBuilder.build(); + } + + private static void requestAndVerify(HttpClient client, HttpRequest request, byte[] requestBodyBytes) + throws IOException, InterruptedException { + var response = client.send(request, HttpResponse.BodyHandlers.ofByteArray()); + if (response.statusCode() != 200) { + throw new AssertionError("Was expecting status code 200, found: " + response.statusCode()); + } + byte[] responseBodyBytes = response.body(); + int mismatchIndex = Arrays.mismatch(requestBodyBytes, responseBodyBytes); + assertTrue( + mismatchIndex < 0, + String.format( + "Response body (%s bytes) mismatches the request body (%s bytes) at index %s!", + responseBodyBytes.length, requestBodyBytes.length, mismatchIndex)); + } + +} diff --git a/test/jdk/java/net/httpclient/BufferSizePropertyClampTest.java b/test/jdk/java/net/httpclient/BufferSizePropertyClampTest.java new file mode 100644 index 00000000000..caef0a58a6d --- /dev/null +++ b/test/jdk/java/net/httpclient/BufferSizePropertyClampTest.java @@ -0,0 +1,106 @@ +/* + * 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. + * + * 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. + */ + +import jdk.internal.net.http.common.Utils; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.logging.Handler; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/* + * @test + * @bug 8367976 + * @summary Verifies that the `jdk.httpclient.bufsize` system property is + * clamped correctly + * + * @library /test/lib + * + * @comment `-Djdk.httpclient.HttpClient.log=errors` is needed to enable + * logging and verify that invalid input gets logged + * @run junit/othervm + * -Djdk.httpclient.HttpClient.log=errors + * -Djdk.httpclient.bufsize=-1 + * BufferSizePropertyClampTest + * @run junit/othervm + * -Djdk.httpclient.HttpClient.log=errors + * -Djdk.httpclient.bufsize=0 + * BufferSizePropertyClampTest + * @run junit/othervm + * -Djdk.httpclient.HttpClient.log=errors + * -Djdk.httpclient.bufsize=16385 + * BufferSizePropertyClampTest + */ + +class BufferSizePropertyClampTest { + + /** Anchor to avoid the {@code Logger} instance get GC'ed */ + private static final Logger CLIENT_LOGGER = + Logger.getLogger("jdk.httpclient.HttpClient"); + + private static final List CLIENT_LOGGER_MESSAGES = + Collections.synchronizedList(new ArrayList<>()); + + @BeforeAll + static void registerLoggerHandler() { + CLIENT_LOGGER.addHandler(new Handler() { + + @Override + public void publish(LogRecord record) { + var message = MessageFormat.format(record.getMessage(), record.getParameters()); + CLIENT_LOGGER_MESSAGES.add(message); + } + + @Override + public void flush() { + // Do nothing + } + + @Override + public void close() { + // Do nothing + } + + }); + } + + @Test + void test() { + assertEquals(16384, Utils.BUFSIZE); + assertEquals( + 1, CLIENT_LOGGER_MESSAGES.size(), + "Unexpected number of logger messages: " + CLIENT_LOGGER_MESSAGES); + var expectedMessage = "ERROR: Property value for jdk.httpclient.bufsize=" + + System.getProperty("jdk.httpclient.bufsize") + + " not in [1..16384]: using default=16384"; + assertEquals(expectedMessage, CLIENT_LOGGER_MESSAGES.getFirst().replaceAll(",", "")); + } + +} diff --git a/test/jdk/java/net/httpclient/HttpRequestBodyPublishers/OfByteArrayTest.java b/test/jdk/java/net/httpclient/HttpRequestBodyPublishers/OfByteArrayTest.java index 9973272b435..19f7369125d 100644 --- a/test/jdk/java/net/httpclient/HttpRequestBodyPublishers/OfByteArrayTest.java +++ b/test/jdk/java/net/httpclient/HttpRequestBodyPublishers/OfByteArrayTest.java @@ -43,8 +43,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; * @run junit OfByteArrayTest * * @comment Using `main/othervm` to initiate tests that depend on a custom-configured JVM - * @run main/othervm -Djdk.httpclient.bufsize=-1 OfByteArrayTest testInvalidBufferSize - * @run main/othervm -Djdk.httpclient.bufsize=0 OfByteArrayTest testInvalidBufferSize * @run main/othervm -Djdk.httpclient.bufsize=3 OfByteArrayTest testChunking "" 0 0 "" * @run main/othervm -Djdk.httpclient.bufsize=3 OfByteArrayTest testChunking a 0 0 "" * @run main/othervm -Djdk.httpclient.bufsize=3 OfByteArrayTest testChunking a 1 0 "" @@ -88,7 +86,6 @@ public class OfByteArrayTest { */ public static void main(String[] args) throws InterruptedException { switch (args[0]) { - case "testInvalidBufferSize" -> testInvalidBufferSize(); case "testChunking" -> testChunking( parseStringArg(args[1]), Integer.parseInt(args[2]), @@ -102,10 +99,6 @@ public class OfByteArrayTest { return arg == null || arg.trim().equals("\"\"") ? "" : arg; } - private static void testInvalidBufferSize() { - assertThrows(IllegalArgumentException.class, () -> HttpRequest.BodyPublishers.ofByteArray(new byte[1])); - } - private static void testChunking( String contentText, int offset, int length, String expectedBuffersText) throws InterruptedException { From 65b32394187988abab99a8017eda39b1bd4a1782 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Wed, 22 Oct 2025 11:27:11 +0000 Subject: [PATCH 251/561] 8370242: JFR: Clear event reference eagerly when using EventStream Reviewed-by: mgronlun --- .../jdk/jfr/internal/consumer/EventDirectoryStream.java | 5 +++++ .../classes/jdk/jfr/internal/consumer/EventFileStream.java | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java index 46dab564ac0..c8db9aef169 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventDirectoryStream.java @@ -257,6 +257,11 @@ public final class EventDirectoryStream extends AbstractEventStream { } for (int i = 0; i < index; i++) { c.dispatch(sortedCache[i]); + sortedCache[i] = null; + } + // Shrink array + if (index > 100_000 && 4 * index < sortedCache.length) { + sortedCache = new RecordedEvent[2 * index]; } onFlush(); return; diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java index 56d9fe01d79..82712fcbedc 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/EventFileStream.java @@ -127,6 +127,10 @@ public final class EventFileStream extends AbstractEventStream { cacheSorted[index++] = event; } dispatchOrdered(c, index); + if (index > 100_000 && 4 * index < cacheSorted.length) { + cacheSorted = new RecordedEvent[2 * index]; + } + onFlush(); index = 0; } } @@ -136,8 +140,8 @@ public final class EventFileStream extends AbstractEventStream { Arrays.sort(cacheSorted, 0, index, EVENT_COMPARATOR); for (int i = 0; i < index; i++) { c.dispatch(cacheSorted[i]); + cacheSorted[i] = null; } - onFlush(); } private void processUnordered(Dispatcher c) throws IOException { From 92e380c59c2498b1bc94e26658b07b383deae59a Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Wed, 22 Oct 2025 12:34:17 +0000 Subject: [PATCH 252/561] 8361451: Test vmTestbase/metaspace/stressHierarchy/stressHierarchy012/TestDescription.java fails with OutOfMemoryError: Metaspace Reviewed-by: dholmes, lmesnik, iklam, syan --- .../stressHierarchy/common/PerformChecksHelper.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java index 3d57bfb6ea9..e660dac4fd5 100644 --- a/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java +++ b/test/hotspot/jtreg/vmTestbase/metaspace/stressHierarchy/common/PerformChecksHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -136,8 +136,17 @@ public class PerformChecksHelper { } } } + } catch (InvocationTargetException ite) { + Throwable cause = ite.getCause(); + if (cause != null && (cause instanceof OutOfMemoryError) && cause.getMessage().contains("Metaspace")) { + // avoid string concatenation, which may create more classes. + System.out.println("Got OOME in metaspace in PerformChecksHelper.callMethods(Class clazz). "); + System.out.println("This is possible with -triggerUnloadingByFillingMetaspace"); + } else { + throw ite; + } } catch (OutOfMemoryError e) { - if (e.getMessage().trim().toLowerCase().contains("metaspace")) { + if (e.getMessage().contains("Metaspace")) { // avoid string concatenation, which may create more classes. System.out.println("Got OOME in metaspace in PerformChecksHelper.callMethods(Class clazz). "); System.out.println("This is possible with -triggerUnloadingByFillingMetaspace"); From afba636869bc297d0c9c29fbe7f2a1eb5929218b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Gr=C3=B6nlund?= Date: Wed, 22 Oct 2025 17:39:41 +0000 Subject: [PATCH 253/561] 8369991: Thread blocking during JFR emergency dump must be in safepoint safe state Reviewed-by: fandreuzzi, egahlin --- .../jfr/recorder/repository/jfrEmergencyDump.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp b/src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp index 5163bc7f6a5..309ae961808 100644 --- a/src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp +++ b/src/hotspot/share/jfr/recorder/repository/jfrEmergencyDump.cpp @@ -458,6 +458,7 @@ const char* JfrEmergencyDump::chunk_path(const char* repository_path) { */ static void release_locks(Thread* thread) { assert(thread != nullptr, "invariant"); + assert(!thread->is_Java_thread() || JavaThread::cast(thread)->thread_state() == _thread_in_vm, "invariant"); #ifdef ASSERT Mutex* owned_lock = thread->owned_locks(); @@ -519,13 +520,14 @@ static void release_locks(Thread* thread) { class JavaThreadInVMAndNative : public StackObj { private: - JavaThread* const _jt; + JavaThread* _jt; JavaThreadState _original_state; public: - JavaThreadInVMAndNative(Thread* t) : _jt(t->is_Java_thread() ? JavaThread::cast(t) : nullptr), + JavaThreadInVMAndNative(Thread* t) : _jt(nullptr), _original_state(_thread_max_state) { - if (_jt != nullptr) { + if (t != nullptr && t->is_Java_thread()) { + _jt = JavaThread::cast(t); _original_state = _jt->thread_state(); if (_original_state != _thread_in_vm) { _jt->set_thread_state(_thread_in_vm); @@ -535,6 +537,7 @@ class JavaThreadInVMAndNative : public StackObj { ~JavaThreadInVMAndNative() { if (_original_state != _thread_max_state) { + assert(_jt != nullptr, "invariant"); _jt->set_thread_state(_original_state); } } @@ -574,11 +577,13 @@ static bool guard_reentrancy() { Thread* const thread = Thread::current_or_null_safe(); const traceid tid = thread != nullptr ? JFR_JVM_THREAD_ID(thread) : max_julong; if (AtomicAccess::cmpxchg(&_jfr_shutdown_tid, shutdown_tid, tid) != shutdown_tid) { + JavaThreadInVMAndNative jtivm(thread); if (thread != nullptr) { - JavaThreadInVMAndNative jtivm(thread); release_locks(thread); } log_info(jfr, system)("A jfr emergency dump is already in progress, waiting for thread id " UINT64_FORMAT_X, AtomicAccess::load(&_jfr_shutdown_tid)); + // Transition to a safe safepoint state for the infinite sleep. A nop for non-java threads. + jtivm.transition_to_native(); os::infinite_sleep(); // stay here until we exit normally or crash. ShouldNotReachHere(); } From a925461395dc1bc81b70aa49e8869a143d170f31 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Wed, 22 Oct 2025 18:08:19 +0000 Subject: [PATCH 254/561] 8370442: Compilation error in jpackage EntitlementsTest test Reviewed-by: almatvee --- .../jdk/jpackage/test/AnnotationsTest.java | 14 +++ .../jdk/jpackage/test/JPackageCommand.java | 11 ++ .../helpers/jdk/jpackage/test/MacHelper.java | 11 ++ .../jpackage/macosx/EntitlementsTest.java | 116 +++++++++++------- 4 files changed, 109 insertions(+), 43 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java index e16b175ab8a..f88d1f81a34 100644 --- a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/AnnotationsTest.java @@ -95,6 +95,18 @@ public class AnnotationsTest extends JUnitAdapter { recordTestCase(a, b, other); } + enum Tack { + STARBOARD, + PORTSIDE; + } + + @Test + @Parameter({"STARBOARD"}) + @Parameter({"PORTSIDE", "STARBOARD"}) + public void testEnumVarArg(Tack ... cource) { + recordTestCase((Object[]) cource); + } + @Test @ParameterSupplier("dateSupplier") @ParameterSupplier("jdk.jpackage.test.AnnotationsTest.dateSupplier") @@ -118,6 +130,8 @@ public class AnnotationsTest extends JUnitAdapter { "().testVarArg2(-89, bar, [more, moore](length=2))", "().testVarArg2(-89, bar, [more](length=1))", "().testVarArg2(12, foo, [](length=0))", + "().testEnumVarArg(STARBOARD)", + "().testEnumVarArg(PORTSIDE, STARBOARD)", "().testDates(2018-05-05)", "().testDates(2018-07-11)", "().testDates(2034-05-05)", diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 22e75a57911..b3729093ad2 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -203,6 +203,17 @@ public class JPackageCommand extends CommandArguments { return addArguments(name, value.toString()); } + public JPackageCommand mutate(Consumer mutator) { + return mutate(List.of(mutator)); + } + + public JPackageCommand mutate(Iterable> mutators) { + for (var mutator : mutators) { + mutator.accept(this); + } + return this; + } + public boolean isImagePackageType() { return PackageType.IMAGE == getArgumentValue("--type", () -> null, PACKAGE_TYPES::get); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index a7a69ef0329..3900851f810 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -54,6 +54,7 @@ import java.util.Properties; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import java.util.function.Consumer; import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -370,6 +371,16 @@ public final class MacHelper { }).run(); } + public static Consumer useKeychain(MacSign.ResolvedKeychain keychain) { + return useKeychain(keychain.spec().keychain()); + } + + public static Consumer useKeychain(MacSign.Keychain keychain) { + return cmd -> { + useKeychain(cmd, keychain); + }; + } + public static JPackageCommand useKeychain(JPackageCommand cmd, MacSign.ResolvedKeychain keychain) { return useKeychain(cmd, keychain.spec().keychain()); } diff --git a/test/jdk/tools/jpackage/macosx/EntitlementsTest.java b/test/jdk/tools/jpackage/macosx/EntitlementsTest.java index 1d6d86118a6..aa5879e0c61 100644 --- a/test/jdk/tools/jpackage/macosx/EntitlementsTest.java +++ b/test/jdk/tools/jpackage/macosx/EntitlementsTest.java @@ -21,20 +21,26 @@ * questions. */ +import static jdk.jpackage.internal.util.PListWriter.writeBoolean; import static jdk.jpackage.internal.util.PListWriter.writeDict; import static jdk.jpackage.internal.util.PListWriter.writePList; -import static jdk.jpackage.internal.util.PListWriter.writeBoolean; import static jdk.jpackage.internal.util.XmlUtils.createXml; import static jdk.jpackage.internal.util.XmlUtils.toXmlConsumer; +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; import java.io.IOException; import java.nio.file.Path; -import java.util.Date; - -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.Annotations.Test; +import java.util.function.Consumer; +import java.util.stream.Stream; +import jdk.jpackage.internal.util.function.ThrowingConsumer; +import jdk.jpackage.test.AdditionalLauncher; import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.MacHelper; +import jdk.jpackage.test.MacHelper.SignKeyOption; +import jdk.jpackage.test.MacSign; +import jdk.jpackage.test.TKit; /* * Test generates signed app-image with custom entitlements file from the @@ -61,7 +67,7 @@ import jdk.jpackage.test.Annotations.Parameter; */ public class EntitlementsTest { - void createEntitlementsFile(Path file, boolean microphone) throws IOException { + private static void createEntitlementsFile(Path file, boolean microphone) throws IOException { createXml(file, xml -> { writePList(xml, toXmlConsumer(() -> { writeDict(xml, toXmlConsumer(() -> { @@ -77,47 +83,71 @@ public class EntitlementsTest { }); } - @Test - // ({"--mac-app-store", doMacEntitlements", "doResources"}) - @Parameter({"false", "true", "false"}) - @Parameter({"false", "false", "true"}) - @Parameter({"false", "true", "true"}) - @Parameter({"true", "true", "false"}) - @Parameter({"true", "false", "true"}) - @Parameter({"true", "true", "true"}) - public void test(boolean appStore, boolean doMacEntitlements, boolean doResources) throws Exception { - final Path macEntitlementsFile; - final Path resourcesDir; - - if (doMacEntitlements) { - macEntitlementsFile = TKit.createTempFile("EntitlementsTest.plist"); + public enum EntitlementsSource implements Consumer { + CMDLINE(cmd -> { + var macEntitlementsFile = TKit.createTempFile("foo.plist"); createEntitlementsFile(macEntitlementsFile, true); - } else { - macEntitlementsFile = null; + cmd.addArguments("--mac-entitlements", macEntitlementsFile); + }), + RESOURCE_DIR(cmd -> { + if (!cmd.hasArgument("--resource-dir")) { + cmd.setArgumentValue("--resource-dir", TKit.createTempDirectory("resources")); + } + + var resourcesDir = Path.of(cmd.getArgumentValue("--resource-dir")); + createEntitlementsFile(resourcesDir.resolve(cmd.name() + ".entitlements"), false); + }), + ; + + EntitlementsSource(ThrowingConsumer initializer) { + this.initializer = toConsumer(initializer); } - if (doResources) { - resourcesDir = TKit.createTempDirectory("resources"); - createEntitlementsFile(resourcesDir.resolve("EntitlementsTest.entitlements"), false); - } else { - resourcesDir = null; + @Override + public void accept(JPackageCommand cmd) { + initializer.accept(cmd); } - JPackageCommand cmd = JPackageCommand.helloAppImage() - .addArguments("--mac-sign", "--mac-signing-keychain", - SigningBase.getKeyChain(), "--mac-app-image-sign-identity", - SigningBase.getAppCert(SigningBase.CertIndex.ASCII_INDEX.value())); - if (appStore) { - cmd.addArguments("--mac-app-store"); - } - if (doMacEntitlements) { - cmd.addArguments("--mac-entitlements", - macEntitlementsFile.toAbsolutePath().toString()); - } - if (doResources) { - cmd.addArguments("--resource-dir", - resourcesDir.toAbsolutePath().toString()); - } + private final Consumer initializer; + } + + @Test + @Parameter({"CMDLINE"}) + @Parameter({"RESOURCE_DIR"}) + @Parameter({"CMDLINE", "RESOURCE_DIR"}) + public static void test(EntitlementsSource... entitlementsSources) { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, Stream.of(entitlementsSources)); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + @Test + @Parameter({"CMDLINE"}) + @Parameter({"RESOURCE_DIR"}) + @Parameter({"CMDLINE", "RESOURCE_DIR"}) + public static void testAppStore(EntitlementsSource... entitlementsSources) { + MacSign.withKeychain(toConsumer(keychain -> { + test(keychain, Stream.concat(Stream.of(cmd -> { + cmd.addArguments("--mac-app-store"); + // Ignore externally supplied runtime as it may have the "bin" + // directory that will cause jpackage to bail out. + cmd.ignoreDefaultRuntime(true); + }), Stream.of(entitlementsSources))); + }), SigningBase.StandardKeychain.MAIN.keychain()); + } + + private static void test(MacSign.ResolvedKeychain keychain, Stream> mutators) { + + var cmd = JPackageCommand.helloAppImage(); + + cmd.mutate(MacHelper.useKeychain(keychain)).mutate(new SignKeyOption( + SignKeyOption.Type.SIGN_KEY_IDENTITY, + SigningBase.StandardCertificateRequest.CODESIGN.spec() + )::addTo); + + cmd.mutate(new AdditionalLauncher("x")::applyTo); + + mutators.forEach(cmd::mutate); cmd.executeAndAssertHelloAppImageCreated(); } From d8ebe387595af43e2cdbbce396547d6daaf8c7dc Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Wed, 22 Oct 2025 19:11:37 +0000 Subject: [PATCH 255/561] 8370377: Avoid resolving constant pool entries during preimage generation in the training run Reviewed-by: adinn, iklam --- .../share/cds/aotConstantPoolResolver.cpp | 31 ++++++ src/hotspot/share/cds/finalImageRecipes.cpp | 8 ++ src/hotspot/share/oops/constantPool.cpp | 21 ++-- src/hotspot/share/oops/cpCache.cpp | 103 +++++++++--------- 4 files changed, 102 insertions(+), 61 deletions(-) diff --git a/src/hotspot/share/cds/aotConstantPoolResolver.cpp b/src/hotspot/share/cds/aotConstantPoolResolver.cpp index 6cc3a81c2ae..8b4e60dece2 100644 --- a/src/hotspot/share/cds/aotConstantPoolResolver.cpp +++ b/src/hotspot/share/cds/aotConstantPoolResolver.cpp @@ -225,7 +225,38 @@ void AOTConstantPoolResolver::preresolve_field_and_method_cp_entries(JavaThread* Bytecodes::Code raw_bc = bcs.raw_code(); switch (raw_bc) { case Bytecodes::_getfield: + // no-fast bytecode + case Bytecodes::_nofast_getfield: + // fast bytecodes + case Bytecodes::_fast_agetfield: + case Bytecodes::_fast_bgetfield: + case Bytecodes::_fast_cgetfield: + case Bytecodes::_fast_dgetfield: + case Bytecodes::_fast_fgetfield: + case Bytecodes::_fast_igetfield: + case Bytecodes::_fast_lgetfield: + case Bytecodes::_fast_sgetfield: + raw_bc = Bytecodes::_getfield; + maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); + if (HAS_PENDING_EXCEPTION) { + CLEAR_PENDING_EXCEPTION; // just ignore + } + break; + case Bytecodes::_putfield: + // no-fast bytecode + case Bytecodes::_nofast_putfield: + // fast bytecodes + case Bytecodes::_fast_aputfield: + case Bytecodes::_fast_bputfield: + case Bytecodes::_fast_zputfield: + case Bytecodes::_fast_cputfield: + case Bytecodes::_fast_dputfield: + case Bytecodes::_fast_fputfield: + case Bytecodes::_fast_iputfield: + case Bytecodes::_fast_lputfield: + case Bytecodes::_fast_sputfield: + raw_bc = Bytecodes::_putfield; maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; // just ignore diff --git a/src/hotspot/share/cds/finalImageRecipes.cpp b/src/hotspot/share/cds/finalImageRecipes.cpp index dfe74acd6c1..a9bbc398736 100644 --- a/src/hotspot/share/cds/finalImageRecipes.cpp +++ b/src/hotspot/share/cds/finalImageRecipes.cpp @@ -127,6 +127,14 @@ void FinalImageRecipes::record_recipes_for_constantpool() { } if (cp_indices.length() > 0) { + LogStreamHandle(Trace, aot, resolve) log; + if (log.is_enabled()) { + log.print("ConstantPool entries for %s to be pre-resolved:", k->external_name()); + for (int i = 0; i < cp_indices.length(); i++) { + log.print(" %d", cp_indices.at(i)); + } + log.print("\n"); + } tmp_cp_recipes.append(ArchiveUtils::archive_array(&cp_indices)); } else { tmp_cp_recipes.append(nullptr); diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp index 5d5c0548215..b072c7f26ec 100644 --- a/src/hotspot/share/oops/constantPool.cpp +++ b/src/hotspot/share/oops/constantPool.cpp @@ -538,18 +538,23 @@ void ConstantPool::remove_resolved_klass_if_non_deterministic(int cp_index) { assert(ArchiveBuilder::current()->is_in_buffer_space(this), "must be"); assert(tag_at(cp_index).is_klass(), "must be resolved"); - Klass* k = resolved_klass_at(cp_index); bool can_archive; + Klass* k = nullptr; - if (k == nullptr) { - // We'd come here if the referenced class has been excluded via - // SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder - // has cleared the resolved_klasses()->at(...) pointer to null. Thus, we - // need to revert the tag to JVM_CONSTANT_UnresolvedClass. + if (CDSConfig::is_dumping_preimage_static_archive()) { can_archive = false; } else { - ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this); - can_archive = AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index); + k = resolved_klass_at(cp_index); + if (k == nullptr) { + // We'd come here if the referenced class has been excluded via + // SystemDictionaryShared::is_excluded_class(). As a result, ArchiveBuilder + // has cleared the resolved_klasses()->at(...) pointer to null. Thus, we + // need to revert the tag to JVM_CONSTANT_UnresolvedClass. + can_archive = false; + } else { + ConstantPool* src_cp = ArchiveBuilder::current()->get_source_addr(this); + can_archive = AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index); + } } if (!can_archive) { diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp index 941ceac8de1..f60229dbfff 100644 --- a/src/hotspot/share/oops/cpCache.cpp +++ b/src/hotspot/share/oops/cpCache.cpp @@ -430,26 +430,25 @@ void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() { bool archived = false; bool resolved = rfi->is_resolved(Bytecodes::_getfield) || rfi->is_resolved(Bytecodes::_putfield); - if (resolved && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { + if (resolved && !CDSConfig::is_dumping_preimage_static_archive() + && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { rfi->mark_and_relocate(); archived = true; } else { rfi->remove_unshareable_info(); } - if (resolved) { - LogStreamHandle(Trace, aot, resolve) log; - if (log.is_enabled()) { - ResourceMark rm; - int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); - Symbol* klass_name = cp->klass_name_at(klass_cp_index); - Symbol* name = cp->uncached_name_ref_at(cp_index); - Symbol* signature = cp->uncached_signature_ref_at(cp_index); - log.print("%s field CP entry [%3d]: %s => %s.%s:%s", - (archived ? "archived" : "reverted"), - cp_index, - cp->pool_holder()->name()->as_C_string(), - klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); - } + LogStreamHandle(Trace, aot, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + Symbol* klass_name = cp->klass_name_at(klass_cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); + log.print("%s field CP entry [%3d]: %s => %s.%s:%s", + (archived ? "archived" : "reverted"), + cp_index, + cp->pool_holder()->name()->as_C_string(), + klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); } ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived); } @@ -470,32 +469,31 @@ void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() { // Just for safety -- this should not happen, but do not archive if we ever see this. resolved &= !(rme->is_resolved(Bytecodes::_invokestatic)); - if (resolved && can_archive_resolved_method(src_cp, rme)) { + if (resolved && !CDSConfig::is_dumping_preimage_static_archive() + && can_archive_resolved_method(src_cp, rme)) { rme->mark_and_relocate(src_cp); archived = true; } else { rme->remove_unshareable_info(); } - if (resolved) { - LogStreamHandle(Trace, aot, resolve) log; - if (log.is_enabled()) { - ResourceMark rm; - int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); - Symbol* klass_name = cp->klass_name_at(klass_cp_index); - Symbol* name = cp->uncached_name_ref_at(cp_index); - Symbol* signature = cp->uncached_signature_ref_at(cp_index); - log.print("%s%s method CP entry [%3d]: %s %s.%s:%s", - (archived ? "archived" : "reverted"), - (rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""), - cp_index, - cp->pool_holder()->name()->as_C_string(), - klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); - if (archived) { - Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index); - log.print(" => %s%s", - resolved_klass->name()->as_C_string(), - (rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : "")); - } + LogStreamHandle(Trace, aot, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + int klass_cp_index = cp->uncached_klass_ref_index_at(cp_index); + Symbol* klass_name = cp->klass_name_at(klass_cp_index); + Symbol* name = cp->uncached_name_ref_at(cp_index); + Symbol* signature = cp->uncached_signature_ref_at(cp_index); + log.print("%s%s method CP entry [%3d]: %s %s.%s:%s", + (archived ? "archived" : "reverted"), + (rme->is_resolved(Bytecodes::_invokeinterface) ? " interface" : ""), + cp_index, + cp->pool_holder()->name()->as_C_string(), + klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); + if (archived) { + Klass* resolved_klass = cp->resolved_klass_at(klass_cp_index); + log.print(" => %s%s", + resolved_klass->name()->as_C_string(), + (rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : "")); } ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived); } @@ -510,29 +508,28 @@ void ConstantPoolCache::remove_resolved_indy_entries_if_non_deterministic() { int cp_index = rei->constant_pool_index(); bool archived = false; bool resolved = rei->is_resolved(); - if (resolved && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { + if (resolved && !CDSConfig::is_dumping_preimage_static_archive() + && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { rei->mark_and_relocate(); archived = true; } else { rei->remove_unshareable_info(); } - if (resolved) { - LogStreamHandle(Trace, aot, resolve) log; - if (log.is_enabled()) { - ResourceMark rm; - int bsm = cp->bootstrap_method_ref_index_at(cp_index); - int bsm_ref = cp->method_handle_index_at(bsm); - Symbol* bsm_name = cp->uncached_name_ref_at(bsm_ref); - Symbol* bsm_signature = cp->uncached_signature_ref_at(bsm_ref); - Symbol* bsm_klass = cp->klass_name_at(cp->uncached_klass_ref_index_at(bsm_ref)); - log.print("%s indy CP entry [%3d]: %s (%d)", - (archived ? "archived" : "reverted"), - cp_index, cp->pool_holder()->name()->as_C_string(), i); - log.print(" %s %s.%s:%s", (archived ? "=>" : " "), bsm_klass->as_C_string(), - bsm_name->as_C_string(), bsm_signature->as_C_string()); - } - ArchiveBuilder::alloc_stats()->record_indy_cp_entry(archived, resolved && !archived); + LogStreamHandle(Trace, aot, resolve) log; + if (log.is_enabled()) { + ResourceMark rm; + int bsm = cp->bootstrap_method_ref_index_at(cp_index); + int bsm_ref = cp->method_handle_index_at(bsm); + Symbol* bsm_name = cp->uncached_name_ref_at(bsm_ref); + Symbol* bsm_signature = cp->uncached_signature_ref_at(bsm_ref); + Symbol* bsm_klass = cp->klass_name_at(cp->uncached_klass_ref_index_at(bsm_ref)); + log.print("%s indy CP entry [%3d]: %s (%d)", + (archived ? "archived" : "reverted"), + cp_index, cp->pool_holder()->name()->as_C_string(), i); + log.print(" %s %s.%s:%s", (archived ? "=>" : " "), bsm_klass->as_C_string(), + bsm_name->as_C_string(), bsm_signature->as_C_string()); } + ArchiveBuilder::alloc_stats()->record_indy_cp_entry(archived, resolved && !archived); } } From 4377e7c9e8399037c66799e99825c56bebbee68e Mon Sep 17 00:00:00 2001 From: Koushik Thirupattur Date: Wed, 22 Oct 2025 21:00:18 +0000 Subject: [PATCH 256/561] 8367008: Algorithm identifiers for HmacSHA* should always have NULL as params Reviewed-by: weijun --- .../sun/security/x509/AlgorithmId.java | 143 ++++++++++-------- .../AlgorithmIdEqualsHashCode.java | 24 ++- .../security/x509/AlgorithmId/NullParams.java | 10 +- 3 files changed, 111 insertions(+), 66 deletions(-) diff --git a/src/java.base/share/classes/sun/security/x509/AlgorithmId.java b/src/java.base/share/classes/sun/security/x509/AlgorithmId.java index 7d525a9add7..8d2c761a011 100644 --- a/src/java.base/share/classes/sun/security/x509/AlgorithmId.java +++ b/src/java.base/share/classes/sun/security/x509/AlgorithmId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -127,10 +127,35 @@ public class AlgorithmId implements Serializable, DerEncoder { public AlgorithmId(ObjectIdentifier oid, DerValue params) throws IOException { this.algid = oid; - if (params != null) { - encodedParams = params.toByteArray(); - decodeParams(); + + if (params == null) { + this.encodedParams = null; + this.algParams = null; + return; } + + /* + * If the parameters field explicitly contains an ASN.1 NULL, treat it as + * "no parameters" rather than storing a literal NULL encoding. + * + * This canonicalization ensures consistent encoding/decoding behavior: + * - Algorithms that omit parameters and those that encode explicit NULL + * are treated equivalently (encodedParams == null). + */ + if (params.tag == DerValue.tag_Null) { + if (params.length() != 0) { + throw new IOException("Invalid ASN.1 NULL in AlgorithmId parameters: " + + "non-zero length"); + } + // Canonicalize to "no parameters" representation for consistency + this.encodedParams = null; + this.algParams = null; + return; + } + + // Normal case: non-NULL params -> store and decode + this.encodedParams = params.toByteArray(); + decodeParams(); } protected void decodeParams() throws IOException { @@ -163,38 +188,10 @@ public class AlgorithmId implements Serializable, DerEncoder { bytes.putOID(algid); if (encodedParams == null) { - // MessageDigest algorithms usually have a NULL parameters even - // if most RFCs suggested absent. - // RSA key and signature algorithms requires the NULL parameters - // to be present, see A.1 and A.2.4 of RFC 8017. - if (algid.equals(RSAEncryption_oid) - || algid.equals(MD2_oid) - || algid.equals(MD5_oid) - || algid.equals(SHA_oid) - || algid.equals(SHA224_oid) - || algid.equals(SHA256_oid) - || algid.equals(SHA384_oid) - || algid.equals(SHA512_oid) - || algid.equals(SHA512_224_oid) - || algid.equals(SHA512_256_oid) - || algid.equals(SHA3_224_oid) - || algid.equals(SHA3_256_oid) - || algid.equals(SHA3_384_oid) - || algid.equals(SHA3_512_oid) - || algid.equals(SHA1withRSA_oid) - || algid.equals(SHA224withRSA_oid) - || algid.equals(SHA256withRSA_oid) - || algid.equals(SHA384withRSA_oid) - || algid.equals(SHA512withRSA_oid) - || algid.equals(SHA512$224withRSA_oid) - || algid.equals(SHA512$256withRSA_oid) - || algid.equals(MD2withRSA_oid) - || algid.equals(MD5withRSA_oid) - || algid.equals(SHA3_224withRSA_oid) - || algid.equals(SHA3_256withRSA_oid) - || algid.equals(SHA3_384withRSA_oid) - || algid.equals(SHA3_512withRSA_oid)) { + if (OIDS_REQUIRING_NULL.contains(algid.toString())) { bytes.putNull(); + } else { + // Parameters omitted } } else { bytes.writeBytes(encodedParams); @@ -646,30 +643,54 @@ public class AlgorithmId implements Serializable, DerEncoder { public static final ObjectIdentifier MGF1_oid = ObjectIdentifier.of(KnownOIDs.MGF1); - public static final ObjectIdentifier SHA1withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA1withRSA); - public static final ObjectIdentifier SHA224withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA224withRSA); - public static final ObjectIdentifier SHA256withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA256withRSA); - public static final ObjectIdentifier SHA384withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA384withRSA); - public static final ObjectIdentifier SHA512withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA512withRSA); - public static final ObjectIdentifier SHA512$224withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA512$224withRSA); - public static final ObjectIdentifier SHA512$256withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA512$256withRSA); - public static final ObjectIdentifier MD2withRSA_oid = - ObjectIdentifier.of(KnownOIDs.MD2withRSA); - public static final ObjectIdentifier MD5withRSA_oid = - ObjectIdentifier.of(KnownOIDs.MD5withRSA); - public static final ObjectIdentifier SHA3_224withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA3_224withRSA); - public static final ObjectIdentifier SHA3_256withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA3_256withRSA); - public static final ObjectIdentifier SHA3_384withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA3_384withRSA); - public static final ObjectIdentifier SHA3_512withRSA_oid = - ObjectIdentifier.of(KnownOIDs.SHA3_512withRSA); + /* Set of OIDs that must explicitly encode a NULL parameter in AlgorithmIdentifier. + * References: + - RFC 8017 (PKCS #1) §A.1, §A.2.4: RSA key and signature algorithms + - RFC 9879 (HMAC) §4: HMAC algorithm identifiers + - RFC 9688 (HMAC with SHA-3) §4.3: HMAC-SHA3 algorithms MUST omit parameters + */ + private static final Set OIDS_REQUIRING_NULL = Set.of( + // MessageDigest algorithms usually have a NULL parameters even + // if most RFCs suggested absent. + KnownOIDs.MD2.value(), + KnownOIDs.MD5.value(), + KnownOIDs.SHA_1.value(), + KnownOIDs.SHA_224.value(), + KnownOIDs.SHA_256.value(), + KnownOIDs.SHA_384.value(), + KnownOIDs.SHA_512.value(), + KnownOIDs.SHA_512$224.value(), + KnownOIDs.SHA_512$256.value(), + KnownOIDs.SHA3_224.value(), + KnownOIDs.SHA3_256.value(), + KnownOIDs.SHA3_384.value(), + KnownOIDs.SHA3_512.value(), + + //--- RSA key and signature algorithms (RFC 8017 §A.1, §A.2.4) + KnownOIDs.RSA.value(), + KnownOIDs.SHA1withRSA.value(), + KnownOIDs.SHA224withRSA.value(), + KnownOIDs.SHA256withRSA.value(), + KnownOIDs.SHA384withRSA.value(), + KnownOIDs.SHA512withRSA.value(), + KnownOIDs.SHA512$224withRSA.value(), + KnownOIDs.SHA512$256withRSA.value(), + KnownOIDs.MD2withRSA.value(), + KnownOIDs.MD5withRSA.value(), + KnownOIDs.SHA3_224withRSA.value(), + KnownOIDs.SHA3_256withRSA.value(), + KnownOIDs.SHA3_384withRSA.value(), + KnownOIDs.SHA3_512withRSA.value(), + + // HMACs per RFC 9879 (Section 4): these require explicit NULL parameters + // Note: HMAC-SHA3 algorithms (RFC 9688 §4.3) MUST omit parameters, + // so they are intentionally excluded from this list. + KnownOIDs.HmacSHA1.value(), + KnownOIDs.HmacSHA224.value(), + KnownOIDs.HmacSHA256.value(), + KnownOIDs.HmacSHA384.value(), + KnownOIDs.HmacSHA512.value(), + KnownOIDs.HmacSHA512$224.value(), + KnownOIDs.HmacSHA512$256.value() + ); } diff --git a/test/jdk/sun/security/x509/AlgorithmId/AlgorithmIdEqualsHashCode.java b/test/jdk/sun/security/x509/AlgorithmId/AlgorithmIdEqualsHashCode.java index ff91e3dff81..be3da70f851 100644 --- a/test/jdk/sun/security/x509/AlgorithmId/AlgorithmIdEqualsHashCode.java +++ b/test/jdk/sun/security/x509/AlgorithmId/AlgorithmIdEqualsHashCode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -24,16 +24,19 @@ /* * @test * @author Gary Ellison - * @bug 4170635 8258247 + * @bug 4170635 8258247 8367008 + * @library /test/lib * @summary Verify equals()/hashCode() contract honored * @modules java.base/sun.security.x509 java.base/sun.security.util */ -import java.io.*; +import java.io.IOException; import java.security.AlgorithmParameters; import java.security.spec.MGF1ParameterSpec; import java.security.spec.PSSParameterSpec; +import jdk.test.lib.Asserts; + import sun.security.util.DerValue; import sun.security.x509.*; @@ -97,5 +100,20 @@ public class AlgorithmIdEqualsHashCode { } else { System.out.println("PASSED equals() test"); } + + // Construct an AlgorithmId with explicit DER NULL parameters + DerValue explicitNullParams = new DerValue(DerValue.tag_Null, new byte[0]); + AlgorithmId aiNullParams = new AlgorithmId(AlgorithmId.SHA256_oid, + explicitNullParams); + // The constructor should canonicalize this to "no parameters" + Asserts.assertTrue(aiNullParams.getEncodedParams() == null); + AlgorithmId aiNormal = AlgorithmId.get("SHA-256"); + Asserts.assertEquals(aiNullParams, aiNormal); + Asserts.assertEquals(aiNullParams.hashCode(), aiNormal.hashCode()); + + // Test invalid ASN.1 NULL (non-zero length) + DerValue invalidNull = new DerValue(DerValue.tag_Null, new byte[]{0x00}); + Asserts.assertThrows(IOException.class, + () -> new AlgorithmId(AlgorithmId.SHA256_oid, invalidNull)); } } diff --git a/test/jdk/sun/security/x509/AlgorithmId/NullParams.java b/test/jdk/sun/security/x509/AlgorithmId/NullParams.java index 733ab9fa522..0b542997a19 100644 --- a/test/jdk/sun/security/x509/AlgorithmId/NullParams.java +++ b/test/jdk/sun/security/x509/AlgorithmId/NullParams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,13 @@ public class NullParams { test("SHA3-256withRSA", true); test("SHA3-384withRSA", true); test("SHA3-512withRSA", true); + test("HmacSHA1", true); + test("HmacSHA224", true); + test("HmacSHA256", true); + test("HmacSHA384", true); + test("HmacSHA512", true); + test("HmacSHA512/224", true); + test("HmacSHA512/256", true); // Full old list: must be absent test("SHA1withECDSA", false); @@ -83,7 +90,6 @@ public class NullParams { // Others test("DSA", false); test("SHA1withDSA", false); - test("HmacSHA1", false); if (failed) { throw new RuntimeException("At least one failed"); From 45e145fac2abc90faa56679336ddea4a8cd05446 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Wed, 22 Oct 2025 21:06:25 +0000 Subject: [PATCH 257/561] 8359057: AbstractInterpreter::is_not_reached returns incorrectly with invokedynamic Reviewed-by: vlivanov --- src/hotspot/share/interpreter/abstractInterpreter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/interpreter/abstractInterpreter.cpp b/src/hotspot/share/interpreter/abstractInterpreter.cpp index 640e3ab3fff..b6a2255b468 100644 --- a/src/hotspot/share/interpreter/abstractInterpreter.cpp +++ b/src/hotspot/share/interpreter/abstractInterpreter.cpp @@ -258,7 +258,8 @@ bool AbstractInterpreter::is_not_reached(const methodHandle& method, int bci) { case Bytecodes::_invokedynamic: { assert(invoke_bc.has_index_u4(code), "sanity"); int method_index = invoke_bc.get_index_u4(code); - return cpool->resolved_indy_entry_at(method_index)->is_resolved(); + bool is_resolved = cpool->resolved_indy_entry_at(method_index)->is_resolved(); + return !is_resolved; } case Bytecodes::_invokevirtual: // fall-through case Bytecodes::_invokeinterface: // fall-through From 2a8cbd944ba4d8896e48181e396c65f70e5aa215 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Wed, 22 Oct 2025 21:47:06 +0000 Subject: [PATCH 258/561] 8359472: JVM crashes when attaching a dynamic agent before JVMTI_PHASE_LIVE Reviewed-by: lmesnik, sspitsyn, amenkov --- src/hotspot/share/prims/jvmtiAgentList.cpp | 5 + .../EarlyDynamicLoad/EarlyDynamicLoad.java | 103 ++++++++++++++++++ .../EarlyDynamicLoad/libEarlyDynamicLoad.cpp | 59 ++++++++++ 3 files changed, 167 insertions(+) create mode 100644 test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java create mode 100644 test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/libEarlyDynamicLoad.cpp diff --git a/src/hotspot/share/prims/jvmtiAgentList.cpp b/src/hotspot/share/prims/jvmtiAgentList.cpp index 8da5b75be46..41fc9c0f359 100644 --- a/src/hotspot/share/prims/jvmtiAgentList.cpp +++ b/src/hotspot/share/prims/jvmtiAgentList.cpp @@ -196,6 +196,11 @@ void JvmtiAgentList::load_xrun_agents() { // Invokes Agent_OnAttach for agents loaded dynamically during runtime. void JvmtiAgentList::load_agent(const char* agent_name, bool is_absolute_path, const char* options, outputStream* st) { + if (JvmtiEnvBase::get_phase() != JVMTI_PHASE_LIVE) { + st->print_cr("Dynamic agent loading is only permitted in the live phase"); + return; + } + JvmtiAgent* const agent = new JvmtiAgent(agent_name, options, is_absolute_path, /* dynamic agent */ true); if (agent->load(st)) { add(agent); diff --git a/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java new file mode 100644 index 00000000000..cb1596da08c --- /dev/null +++ b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java @@ -0,0 +1,103 @@ +/* + * 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. + * + * 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. + */ + +import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AgentLoadException; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterAll; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.TimeUnit; +import jdk.test.lib.dcmd.PidJcmdExecutor; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.Utils; + +/* + * @test EarlyDynamicLoad + * @summary Test that dynamic attach fails gracefully when the JVM is not in live phase. + * @requires vm.jvmti + * @library /test/lib + * @run junit EarlyDynamicLoad + */ +public class EarlyDynamicLoad { + private static final String EXPECTED_MESSAGE = "Dynamic agent loading is only permitted in the live phase"; + + private static Process child; + + @BeforeAll + static void startAndWaitChild() throws Exception { + child = ProcessTools.createTestJavaProcessBuilder( + "-XX:+StartAttachListener", + "-agentpath:" + Utils.TEST_NATIVE_PATH + File.separator + System.mapLibraryName("EarlyDynamicLoad"), + "--version").start(); + + // Wait until the process enters VMStartCallback + try (InputStream is = child.getInputStream()) { + is.read(); + } + } + + @AfterAll + static void stopChild() throws Exception { + try (OutputStream os = child.getOutputStream()) { + os.write(0); + } + + if (!child.waitFor(5, TimeUnit.SECONDS)) { + child.destroyForcibly(); + throw new AssertionError("Timed out while waiting child process to complete"); + } + + OutputAnalyzer analyzer = new OutputAnalyzer(child); + analyzer.shouldHaveExitValue(0); + analyzer.stderrShouldBeEmpty(); + } + + @Test + public void virtualMachine() throws Exception { + try { + VirtualMachine vm = VirtualMachine.attach(String.valueOf(child.pid())); + vm.loadAgent("some.jar"); + vm.detach(); + throw new AssertionError("Should have failed with AgentLoadException"); + } catch(AgentLoadException exception) { + if (!exception.getMessage().contains(EXPECTED_MESSAGE)) { + throw new AssertionError("Unexpected error message", exception); + } + } + } + + @Test + public void jcmd() throws Exception { + PidJcmdExecutor executor = new PidJcmdExecutor(String.valueOf(child.pid())); + OutputAnalyzer out = executor.execute("JVMTI.agent_load some.jar"); + + out.shouldHaveExitValue(0); + out.stdoutShouldContain(EXPECTED_MESSAGE); + } +} diff --git a/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/libEarlyDynamicLoad.cpp b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/libEarlyDynamicLoad.cpp new file mode 100644 index 00000000000..3991926306e --- /dev/null +++ b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/libEarlyDynamicLoad.cpp @@ -0,0 +1,59 @@ +/* + * 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. + * + * 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. + */ + +#include +#include +#include + +extern "C" { + +static void JNICALL VMStartCallback(jvmtiEnv* jvmti, JNIEnv* env) { + putchar('1'); + fflush(stdout); + getchar(); +} + +JNIEXPORT int Agent_OnLoad(JavaVM* vm, char* options, void* reserved) { + jvmtiEnv* jvmti; + if (vm->GetEnv((void**) &jvmti, JVMTI_VERSION_1_0) != JVMTI_ERROR_NONE) { + fprintf(stderr, "JVMTI error occurred during GetEnv\n"); + return JNI_ERR; + } + + jvmtiEventCallbacks callbacks; + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.VMStart = VMStartCallback; + + if (jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks)) != JVMTI_ERROR_NONE) { + fprintf(stderr, "JVMTI error occurred during SetEventCallbacks\n"); + return JNI_ERR; + } + if (jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, nullptr) != JVMTI_ERROR_NONE) { + fprintf(stderr, "JVMTI error occurred during SetEventNotificationMode\n"); + return JNI_ERR; + } + + return JNI_OK; +} + +} From 0744db8366183a0fd07f42ee1ce6ef677bf4136e Mon Sep 17 00:00:00 2001 From: Dean Long Date: Wed, 22 Oct 2025 22:01:31 +0000 Subject: [PATCH 259/561] 8367002: Missing compiled exception handler for "recursive" exception Reviewed-by: thartmann, kvn --- src/hotspot/share/runtime/deoptimization.cpp | 21 ++++-- src/hotspot/share/runtime/deoptimization.hpp | 6 +- src/hotspot/share/runtime/sharedRuntime.cpp | 12 +++- src/hotspot/share/runtime/vmStructs.cpp | 2 +- .../exceptions/IllegalAccessInCatch.jasm | 62 +++++++++++++++++ .../exceptions/TestAccessErrorInCatch.java | 67 +++++++++++++++++++ 6 files changed, 159 insertions(+), 11 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/exceptions/IllegalAccessInCatch.jasm create mode 100644 test/hotspot/jtreg/compiler/exceptions/TestAccessErrorInCatch.java diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 853c6554022..daafcaea61b 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -1804,10 +1804,11 @@ void Deoptimization::deoptimize(JavaThread* thread, frame fr, DeoptReason reason deoptimize_single_frame(thread, fr, reason); } -#if INCLUDE_JVMCI -address Deoptimization::deoptimize_for_missing_exception_handler(nmethod* nm) { +address Deoptimization::deoptimize_for_missing_exception_handler(nmethod* nm, bool make_not_entrant) { // there is no exception handler for this pc => deoptimize - nm->make_not_entrant(nmethod::InvalidationReason::MISSING_EXCEPTION_HANDLER); + if (make_not_entrant) { + nm->make_not_entrant(nmethod::InvalidationReason::MISSING_EXCEPTION_HANDLER); + } // Use Deoptimization::deoptimize for all of its side-effects: // gathering traps statistics, logging... @@ -1821,6 +1822,15 @@ address Deoptimization::deoptimize_for_missing_exception_handler(nmethod* nm) { frame runtime_frame = thread->last_frame(); frame caller_frame = runtime_frame.sender(®_map); assert(caller_frame.cb()->as_nmethod_or_null() == nm, "expect top frame compiled method"); + + Deoptimization::deoptimize(thread, caller_frame, Deoptimization::Reason_not_compiled_exception_handler); + + if (!nm->is_compiled_by_jvmci()) { + return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls(); + } + +#if INCLUDE_JVMCI + // JVMCI support vframe* vf = vframe::new_vframe(&caller_frame, ®_map, thread); compiledVFrame* cvf = compiledVFrame::cast(vf); ScopeDesc* imm_scope = cvf->scope(); @@ -1836,16 +1846,15 @@ address Deoptimization::deoptimize_for_missing_exception_handler(nmethod* nm) { } } - Deoptimization::deoptimize(thread, caller_frame, Deoptimization::Reason_not_compiled_exception_handler); MethodData* trap_mdo = get_method_data(thread, methodHandle(thread, nm->method()), true); if (trap_mdo != nullptr) { trap_mdo->inc_trap_count(Deoptimization::Reason_not_compiled_exception_handler); } +#endif return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls(); } -#endif void Deoptimization::deoptimize_frame_internal(JavaThread* thread, intptr_t* id, DeoptReason reason) { assert(thread == Thread::current() || @@ -2748,10 +2757,10 @@ const char* Deoptimization::_trap_reason_name[] = { "unstable_if", "unstable_fused_if", "receiver_constraint", + "not_compiled_exception_handler", "short_running_loop" JVMCI_ONLY("_or_aliasing"), #if INCLUDE_JVMCI "transfer_to_interpreter", - "not_compiled_exception_handler", "unresolved", "jsr_mismatch", #endif diff --git a/src/hotspot/share/runtime/deoptimization.hpp b/src/hotspot/share/runtime/deoptimization.hpp index 5d97e2056ad..d168d9c8af6 100644 --- a/src/hotspot/share/runtime/deoptimization.hpp +++ b/src/hotspot/share/runtime/deoptimization.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -117,11 +117,11 @@ class Deoptimization : AllStatic { Reason_unstable_if, // a branch predicted always false was taken Reason_unstable_fused_if, // fused two ifs that had each one untaken branch. One is now taken. Reason_receiver_constraint, // receiver subtype check failed + Reason_not_compiled_exception_handler, // missing compiled exception handler Reason_short_running_long_loop, // profile reports loop runs for small number of iterations #if INCLUDE_JVMCI Reason_aliasing = Reason_short_running_long_loop, // optimistic assumption about aliasing failed Reason_transfer_to_interpreter, // explicit transferToInterpreter() - Reason_not_compiled_exception_handler, Reason_unresolved, Reason_jsr_mismatch, #endif @@ -184,8 +184,8 @@ class Deoptimization : AllStatic { // Deoptimizes a frame lazily. Deopt happens on return to the frame. static void deoptimize(JavaThread* thread, frame fr, DeoptReason reason = Reason_constraint); + static address deoptimize_for_missing_exception_handler(nmethod* nm, bool make_not_entrant); #if INCLUDE_JVMCI - static address deoptimize_for_missing_exception_handler(nmethod* nm); static oop get_cached_box(AutoBoxObjectValue* bv, frame* fr, RegisterMap* reg_map, bool& cache_init_error, TRAPS); #endif diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index efc47dd11c6..35bc3f5f1be 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -791,7 +791,8 @@ address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, if (t != nullptr) { return nm->code_begin() + t->pco(); } else { - return Deoptimization::deoptimize_for_missing_exception_handler(nm); + bool make_not_entrant = true; + return Deoptimization::deoptimize_for_missing_exception_handler(nm, make_not_entrant); } } #endif // INCLUDE_JVMCI @@ -847,6 +848,15 @@ address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, ExceptionHandlerTable table(nm); HandlerTableEntry *t = table.entry_for(catch_pco, handler_bci, scope_depth); + + // If the compiler did not anticipate a recursive exception, resulting in an exception + // thrown from the catch bci, then the compiled exception handler might be missing. + // This is rare. Just deoptimize and let the interpreter handle it. + if (t == nullptr && recursive_exception_occurred) { + bool make_not_entrant = false; + return Deoptimization::deoptimize_for_missing_exception_handler(nm, make_not_entrant); + } + if (t == nullptr && (nm->is_compiled_by_c1() || handler_bci != -1)) { // Allow abbreviated catch tables. The idea is to allow a method // to materialize its exceptions without committing to the exact diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index 8dc4b660f91..85f921ef3e3 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -1581,8 +1581,8 @@ declare_constant(Deoptimization::Reason_unstable_if) \ declare_constant(Deoptimization::Reason_unstable_fused_if) \ declare_constant(Deoptimization::Reason_receiver_constraint) \ + declare_constant(Deoptimization::Reason_not_compiled_exception_handler) \ NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_transfer_to_interpreter))) \ - NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_not_compiled_exception_handler))) \ NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_unresolved))) \ NOT_ZERO(JVMCI_ONLY(declare_constant(Deoptimization::Reason_jsr_mismatch))) \ declare_constant(Deoptimization::Reason_tenured) \ diff --git a/test/hotspot/jtreg/compiler/exceptions/IllegalAccessInCatch.jasm b/test/hotspot/jtreg/compiler/exceptions/IllegalAccessInCatch.jasm new file mode 100644 index 00000000000..beeffa69a97 --- /dev/null +++ b/test/hotspot/jtreg/compiler/exceptions/IllegalAccessInCatch.jasm @@ -0,0 +1,62 @@ +/* + * 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. + * + * 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. + */ + +super class IllegalAccessInCatch + version 52:0 +{ + /* + static int test() { + try { + return 1 / 0; + } catch (jdk.internal.agent.AgentConfigurationError e1) { + try { + return 0; + } catch (IllegalAccessError e2) { + return 1; + } + } + } + */ + static Method test:"()I" + stack 2 locals 1 + { + iconst_1; + iconst_0; + try t0; + idiv; + endtry t0; + ireturn; + catch t0 jdk/internal/agent/AgentConfigurationError; // loadable but not accessible from unnamed module + stack_frame_type full; + stack_map class java/lang/Throwable; + try t1; + iconst_0; + ireturn; + endtry t1; + catch t1 java/lang/IllegalAccessError; + stack_frame_type full; + stack_map class java/lang/Throwable; + iconst_1; + ireturn; + } +} diff --git a/test/hotspot/jtreg/compiler/exceptions/TestAccessErrorInCatch.java b/test/hotspot/jtreg/compiler/exceptions/TestAccessErrorInCatch.java new file mode 100644 index 00000000000..46541d76016 --- /dev/null +++ b/test/hotspot/jtreg/compiler/exceptions/TestAccessErrorInCatch.java @@ -0,0 +1,67 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8367002 + * @summary Compilers might not generate handlers for recursive exceptions + * + * @compile IllegalAccessInCatch.jasm + * @run main/othervm -Xbatch + * -XX:CompileCommand=compileonly,IllegalAccessInCatch*::test + * -XX:-TieredCompilation + * TestAccessErrorInCatch + * @run main/othervm -Xbatch + * -XX:CompileCommand=compileonly,IllegalAccessInCatch*::test + * -XX:TieredStopAtLevel=3 + * TestAccessErrorInCatch + */ + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +import java.nio.file.Files; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class TestAccessErrorInCatch { + + public static void main(String[] args) throws Throwable { + Path TEST_CLASSES_DIR = FileSystems.getDefault().getPath(System.getProperty("test.classes")); + byte[] bytes = Files.readAllBytes(TEST_CLASSES_DIR.resolve("IllegalAccessInCatch.class")); + + var l = MethodHandles.lookup().defineHiddenClass(bytes, true); + Class anonClass = l.lookupClass(); + MethodHandle mh = l.findStatic(anonClass, "test", MethodType.methodType(int.class)); + for (int i = 0; i < 16_000; i++) { + invoke(mh); + } + System.out.println(invoke(mh)); + } + + private static int invoke(MethodHandle mh) throws Throwable { + return (int) mh.invokeExact(); + } +} From be18e7ecfd2e89a0abb168e0d9a5b69598e2199f Mon Sep 17 00:00:00 2001 From: Damon Nguyen Date: Wed, 22 Oct 2025 22:42:46 +0000 Subject: [PATCH 260/561] 8064922: [macos] Test javax/swing/JTabbedPane/4624207/bug4624207.java fails Reviewed-by: tr, honkar, psadhukhan --- test/jdk/ProblemList.txt | 1 - .../swing/JTabbedPane/4624207/bug4624207.java | 67 ++++++++----------- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 0e69446ae35..1f6bea97407 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -676,7 +676,6 @@ javax/swing/AbstractButton/6711682/bug6711682.java 8060765 windows-all,macosx-al javax/swing/JFileChooser/6396844/TwentyThousandTest.java 8198003 generic-all javax/swing/JFileChooser/8194044/FileSystemRootTest.java 8327236 windows-all javax/swing/JPopupMenu/6800513/bug6800513.java 7184956 macosx-all -javax/swing/JTabbedPane/4624207/bug4624207.java 8064922 macosx-all javax/swing/SwingUtilities/TestBadBreak/TestBadBreak.java 8160720 generic-all javax/swing/JFileChooser/bug6798062.java 8146446 windows-all javax/swing/JPopupMenu/4870644/bug4870644.java 8194130 macosx-all,linux-all diff --git a/test/jdk/javax/swing/JTabbedPane/4624207/bug4624207.java b/test/jdk/javax/swing/JTabbedPane/4624207/bug4624207.java index 10de2ab221a..4d2fdcf030c 100644 --- a/test/jdk/javax/swing/JTabbedPane/4624207/bug4624207.java +++ b/test/jdk/javax/swing/JTabbedPane/4624207/bug4624207.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,25 +25,26 @@ * @test * @key headful * @bug 4624207 + * @requires (os.family != "mac") * @summary JTabbedPane mnemonics don't work from outside the tabbed pane - * @author Oleg Mokhovikov - * @library /test/lib - * @library ../../regtesthelpers - * @build Util jdk.test.lib.Platform * @run main bug4624207 */ -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.*; + +import java.awt.BorderLayout; +import java.awt.Robot; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; -import jdk.test.lib.Platform; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; public class bug4624207 implements ChangeListener, FocusListener { - private static volatile boolean stateChanged = false; private static volatile boolean focusGained = false; private static JTextField txtField; @@ -71,51 +72,39 @@ public class bug4624207 implements ChangeListener, FocusListener { Robot robot = new Robot(); robot.setAutoDelay(50); - SwingUtilities.invokeAndWait(new Runnable() { - - public void run() { - createAndShowGUI(); - } - }); - + SwingUtilities.invokeAndWait(() -> createAndShowGUI()); robot.waitForIdle(); - - SwingUtilities.invokeAndWait(new Runnable() { - - public void run() { - txtField.requestFocus(); - } - }); - + SwingUtilities.invokeAndWait(() -> txtField.requestFocus()); robot.waitForIdle(); if (!focusGained) { throw new RuntimeException("Couldn't gain focus for text field"); } - SwingUtilities.invokeAndWait(new Runnable() { - - public void run() { - tab.addChangeListener((ChangeListener) listener); - txtField.removeFocusListener((FocusListener) listener); - } + SwingUtilities.invokeAndWait(() -> { + tab.addChangeListener((ChangeListener) listener); + txtField.removeFocusListener((FocusListener) listener); }); robot.waitForIdle(); - if (Platform.isOSX()) { - Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT, KeyEvent.VK_B); - } else { - Util.hitKeys(robot, KeyEvent.VK_ALT, KeyEvent.VK_B); - } + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_B); + robot.keyRelease(KeyEvent.VK_B); + robot.keyRelease(KeyEvent.VK_ALT); robot.waitForIdle(); if (!stateChanged || tab.getSelectedIndex() != 1) { - throw new RuntimeException("JTabbedPane mnemonics don't work from outside the tabbed pane"); + throw new RuntimeException("JTabbedPane mnemonics don't " + + "work from outside the tabbed pane"); } } finally { - if (frame != null) SwingUtilities.invokeAndWait(() -> frame.dispose()); + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); } } From 3e20a9392fecef796098507acef429ef2d45a3d2 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Wed, 22 Oct 2025 23:50:39 +0000 Subject: [PATCH 261/561] 8370156: Fix jpackage IconTest Reviewed-by: almatvee --- test/jdk/tools/jpackage/share/IconTest.java | 320 +++++++++++--------- 1 file changed, 174 insertions(+), 146 deletions(-) diff --git a/test/jdk/tools/jpackage/share/IconTest.java b/test/jdk/tools/jpackage/share/IconTest.java index 051cad84a13..03726e524dc 100644 --- a/test/jdk/tools/jpackage/share/IconTest.java +++ b/test/jdk/tools/jpackage/share/IconTest.java @@ -21,7 +21,10 @@ * questions. */ +import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; + import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -29,10 +32,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeMap; -import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.internal.util.function.ThrowingBiConsumer; @@ -40,8 +43,11 @@ import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.test.AdditionalLauncher; import jdk.jpackage.test.Annotations.Parameters; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.CannedFormattedString; +import jdk.jpackage.test.ConfigurationTarget; import jdk.jpackage.test.Executor; import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.JPackageStringBundle; import jdk.jpackage.test.LauncherIconVerifier; import jdk.jpackage.test.LinuxHelper; import jdk.jpackage.test.PackageTest; @@ -159,27 +165,37 @@ public class IconTest { @Test public void test() throws IOException { - if (appImage) { - JPackageCommand cmd = initAppImageTest(); - var result = cmd.executeAndAssertImageCreated(); - ThrowingConsumer.toConsumer(createInstallVerifier()).accept(cmd); - ThrowingBiConsumer.toBiConsumer(createBundleVerifier()).accept(cmd, result); - } else { - PackageTest test = initPackageTest(); - test.addInstallVerifier(createInstallVerifier()); - test.addBundleVerifier(createBundleVerifier()); + final ConfigurationTarget target; + if (appImage) { + target = new ConfigurationTarget(JPackageCommand.helloAppImage()); + } else { + target = new ConfigurationTarget(new PackageTest().configureHelloApp()); + } + + initTest(target); + + var installVerifier = createInstallVerifier(); + var bundleVerifier = createBundleVerifier(); + + var cmdResult = target.cmd().map(JPackageCommand::executeAndAssertImageCreated); + + target.apply(ThrowingConsumer.toConsumer(installVerifier), test -> { + test.addInstallVerifier(installVerifier); + }).apply(cmd -> { + ThrowingBiConsumer.toBiConsumer(bundleVerifier).accept(cmd, cmdResult.orElseThrow()); + }, test -> { + test.addBundleVerifier(bundleVerifier); test.addBundleDesktopIntegrationVerifier(config.values().stream() .anyMatch(this::isWithDesktopIntegration)); + }); - test.run(PackageTest.Action.CREATE_AND_UNPACK); - } + target.test().ifPresent(v -> { + v.run(PackageTest.Action.CREATE_AND_UNPACK); + }); } boolean isWithDesktopIntegration(IconType iconType) { - if (appImage) { - return false; - } boolean withDesktopFile = !Set.of( IconType.NoIcon, IconType.DefaultIcon).contains(iconType); @@ -189,89 +205,110 @@ public class IconTest { private ThrowingBiConsumer createBundleVerifier() { return (cmd, result) -> { - var verifier = createConsoleOutputVerifier(cmd.name(), config.get( - Launcher.Main), null); - if (verifier != null) { - verifier.apply(result.getOutput()); - } - - if (config.containsKey(Launcher.Additional)) { - verifier = createConsoleOutputVerifier( - Launcher.Additional.launcherName, config.get( - Launcher.Additional), config.get(Launcher.Main)); - if (verifier != null) { + Stream.of(Launcher.Main, Launcher.Additional).filter(config::containsKey).forEach(launcher -> { + createConsoleOutputVerifier(cmd, launcher).ifPresent(verifier -> { verifier.apply(result.getOutput()); - } - } + }); + }); }; } - private TKit.TextStreamVerifier createConsoleOutputVerifier( - String launcherName, IconType iconType, IconType mainIconType) { - if (iconType == IconType.DefaultIcon && mainIconType != null) { - iconType = mainIconType; + private Optional createConsoleOutputVerifier( + JPackageCommand cmd, Launcher launcher) { + + var launcherName = Optional.ofNullable(launcher.launcherName).orElseGet(cmd::name); + var resourceName = launcherName; + Optional customIcon; + + if (launcherName.equals(cmd.name())) { + customIcon = Optional.ofNullable(cmd.getArgumentValue("--icon")).map(Path::of); + } else if (config.get(launcher) == IconType.DefaultIcon) { + resourceName = cmd.name(); + customIcon = Optional.ofNullable(cmd.getArgumentValue("--icon")).map(Path::of); + } else { + customIcon = getAdditionalLauncherProperties(cmd, launcherName).findProperty("icon").map(Path::of); } - return createConsoleOutputVerifier(launcherName, iconType); + + return createConsoleOutputVerifier( + getBundleIconType(cmd, launcher), + launcherName, + resourceName, + customIcon); } - private static TKit.TextStreamVerifier createConsoleOutputVerifier( - String launcherName, IconType iconType) { - String lookupString = null; + private static Optional createConsoleOutputVerifier( + IconType iconType, String launcherName, String resourceName, Optional customIcon) { + + Objects.requireNonNull(launcherName); + Objects.requireNonNull(resourceName); + Objects.requireNonNull(customIcon); + + CannedFormattedString lookupString; + switch (iconType) { case DefaultIcon: - lookupString = String.format( - "Using default package resource %s [icon] (add %s%s to the resource-dir to customize)", + lookupString = JPackageStringBundle.MAIN.cannedFormattedString( + "message.using-default-resource", "JavaApp" + TKit.ICON_SUFFIX, - launcherName, TKit.ICON_SUFFIX); + "[icon]", + launcherName + TKit.ICON_SUFFIX); break; case ResourceDirIcon: - lookupString = String.format( - "Using custom package resource [icon] (loaded from %s%s)", - launcherName, TKit.ICON_SUFFIX); + lookupString = JPackageStringBundle.MAIN.cannedFormattedString( + "message.using-custom-resource", + "[icon]", + resourceName + TKit.ICON_SUFFIX); break; case CustomIcon: case CustomWithResourceDirIcon: - lookupString = "Using custom package resource [icon] (loaded from file"; + lookupString = JPackageStringBundle.MAIN.cannedFormattedString( + "message.using-custom-resource-from-file", + "[icon]", + customIcon.orElseThrow()); break; default: - return null; + return Optional.empty(); } - return TKit.assertTextStream(lookupString); + return Optional.of(TKit.assertTextStream(lookupString.getValue())); } private ThrowingConsumer createInstallVerifier() { - LauncherIconVerifier verifier = new LauncherIconVerifier(); - switch (config.get(Launcher.Main)) { - case NoIcon: - verifier.setExpectedIcon(null); - break; - - case DefaultIcon: - verifier.setExpectedDefaultIcon(); - break; - - case CustomIcon: - verifier.setExpectedIcon(Launcher.Main.cmdlineIcon); - break; - - case ResourceDirIcon: - verifier.setExpectedIcon(Launcher.Main.resourceDirIcon); - break; - - case CustomWithResourceDirIcon: - verifier.setExpectedIcon(Launcher.Main2.cmdlineIcon); - break; - } - return cmd -> { + var verifier = new LauncherIconVerifier(); + + var bundleIconType = getBundleIconType(cmd, Launcher.Main); + + switch (bundleIconType) { + case NoIcon: + verifier.setExpectedNoIcon(); + break; + + case DefaultIcon: + verifier.setExpectedDefaultIcon(); + break; + + case CustomIcon: + verifier.setExpectedIcon(Launcher.Main.cmdlineIcon); + break; + + case ResourceDirIcon: + verifier.setExpectedIcon(Launcher.Main.resourceDirIcon); + break; + + case CustomWithResourceDirIcon: + verifier.setExpectedIcon(Launcher.Main2.cmdlineIcon); + break; + } + verifier.applyTo(cmd); + if (TKit.isLinux() && !cmd.isImagePackageType()) { Path desktopFile = LinuxHelper.getDesktopFile(cmd); - if (isWithDesktopIntegration(config.get(Launcher.Main))) { + if (isWithDesktopIntegration(bundleIconType)) { TKit.assertFileExists(desktopFile); } else { TKit.assertPathExists(desktopFile, false); @@ -280,80 +317,61 @@ public class IconTest { }; } - private void initTest(JPackageCommand cmd, PackageTest test) { + private void initTest(ConfigurationTarget target) { config.entrySet().forEach(ThrowingConsumer.toConsumer(entry -> { - initTest(entry.getKey(), entry.getValue(), cmd, test); + initTest(entry.getKey(), entry.getValue(), target); })); - ThrowingConsumer initializer = testCmd -> { - testCmd.saveConsoleOutput(true); - testCmd.setFakeRuntime(); - testCmd.addArguments(extraJPackageArgs); - }; - - if (test != null) { - test.addInitializer(initializer); - } else { - ThrowingConsumer.toConsumer(initializer).accept(cmd); - } + target.addInitializer(cmd -> { + cmd.saveConsoleOutput(true); + cmd.setFakeRuntime(); + cmd.addArguments(extraJPackageArgs); + }); } private static void initTest(Launcher cfg, IconType iconType, - JPackageCommand cmd, PackageTest test) throws IOException { - Consumer addLauncher = v -> { - if (test != null) { - v.applyTo(test); - } else { - v.applyTo(cmd); - } - }; + ConfigurationTarget target) throws IOException { switch (iconType) { case DefaultIcon: - if (cfg.launcherName != null) { - addLauncher.accept(new AdditionalLauncher(cfg.launcherName)); - } + Optional.ofNullable(cfg.launcherName).map(AdditionalLauncher::new) + .ifPresent(target::add); break; case NoIcon: - if (cfg.launcherName != null) { - addLauncher.accept( - new AdditionalLauncher(cfg.launcherName).setNoIcon()); - } + Optional.ofNullable(cfg.launcherName).map(AdditionalLauncher::new) + .map(AdditionalLauncher::setNoIcon) + .ifPresent(target::add); break; case CustomIcon: - if (test != null) { - addCustomIcon(null, test, cfg.launcherName, cfg.cmdlineIcon); - } else { - addCustomIcon(cmd, null, cfg.launcherName, cfg.cmdlineIcon); - } + addCustomIcon(target, cfg.launcherName, cfg.cmdlineIcon); break; case ResourceDirIcon: - if (Launcher.PRIMARY.contains(cfg) && cfg.launcherName != null) { - addLauncher.accept(new AdditionalLauncher(cfg.launcherName)); - } - if (test != null) { - test.addInitializer(testCmd -> { - addResourceDirIcon(testCmd, cfg.launcherName, - cfg.resourceDirIcon); - }); - } else { - addResourceDirIcon(cmd, cfg.launcherName, cfg.resourceDirIcon); + if (Launcher.PRIMARY.contains(cfg)) { + Optional.ofNullable(cfg.launcherName).map(AdditionalLauncher::new) + .ifPresent(target::add); } + target.addInitializer(cmd -> { + try { + addResourceDirIcon(cmd, cfg.launcherName, cfg.resourceDirIcon); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }); break; case CustomWithResourceDirIcon: switch (cfg) { case Main: - initTest(Launcher.Main2, IconType.CustomIcon, cmd, test); - initTest(Launcher.Main2, IconType.ResourceDirIcon, cmd, test); + initTest(Launcher.Main2, IconType.CustomIcon, target); + initTest(Launcher.Main2, IconType.ResourceDirIcon, target); break; case Additional: - initTest(Launcher.Additional2, IconType.CustomIcon, cmd, test); - initTest(Launcher.Additional2, IconType.ResourceDirIcon, cmd, test); + initTest(Launcher.Additional2, IconType.CustomIcon, target); + initTest(Launcher.Additional2, IconType.ResourceDirIcon, target); break; default: @@ -363,29 +381,46 @@ public class IconTest { } } - private JPackageCommand initAppImageTest() { - JPackageCommand cmd = JPackageCommand.helloAppImage(); - initTest(cmd, null); - return cmd; + private IconType getBundleIconType(JPackageCommand cmd, Launcher launcher) { + return getBundleIconType(cmd, config.get(Launcher.Main), launcher, config.get(launcher)); } - private PackageTest initPackageTest() { - PackageTest test = new PackageTest().configureHelloApp(); - initTest(null, test); - return test; + /** + * Returns the expected icon type of the given launcher in the output bundle + * that the given jpackage command line will output based on the icon type + * configured for the launcher. + * + * @param cmd jpackage command line + * @param mainLauncherIconType the icon type configured for the main launcher + * @param launcher the launcher + * @param iconType the icon type configured for the specified + * launcher + * @return the type of of an icon of the given launcher in the output bundle + */ + private static IconType getBundleIconType(JPackageCommand cmd, + IconType mainLauncherIconType, Launcher launcher, IconType iconType) { + + Objects.requireNonNull(cmd); + Objects.requireNonNull(mainLauncherIconType); + Objects.requireNonNull(launcher); + Objects.requireNonNull(iconType); + + if (iconType == IconType.DefaultIcon) { + iconType = mainLauncherIconType; + } + + return iconType; } private static void addResourceDirIcon(JPackageCommand cmd, String launcherName, Path iconPath) throws IOException { - Path resourceDir = cmd.getArgumentValue("--resource-dir", () -> null, - Path::of); - if (resourceDir == null) { - resourceDir = TKit.createTempDirectory("resources"); - cmd.addArguments("--resource-dir", resourceDir); - } + var resourceDir = Optional.ofNullable(cmd.getArgumentValue("--resource-dir")).map(Path::of).orElseGet(() -> { + return TKit.createTempDirectory("resources"); + }); - String dstIconFileName = Optional.ofNullable(launcherName).orElseGet( - () -> cmd.name()) + TKit.ICON_SUFFIX; + cmd.addArguments("--resource-dir", resourceDir); + + String dstIconFileName = Optional.ofNullable(launcherName).orElseGet(cmd::name) + TKit.ICON_SUFFIX; TKit.trace(String.format("Resource file: [%s] <- [%s]", resourceDir.resolve(dstIconFileName), iconPath)); @@ -393,23 +428,16 @@ public class IconTest { StandardCopyOption.REPLACE_EXISTING); } - private static void addCustomIcon(JPackageCommand cmd, PackageTest test, - String launcherName, Path iconPath) throws IOException { + private static void addCustomIcon(ConfigurationTarget target, + String launcherName, Path iconPath) { if (launcherName != null) { - AdditionalLauncher al = new AdditionalLauncher(launcherName).setIcon( - iconPath); - if (test != null) { - al.applyTo(test); - } else { - al.applyTo(cmd); - } - } else if (test != null) { - test.addInitializer(testCmd -> { - testCmd.addArguments("--icon", iconPath); - }); + var al = new AdditionalLauncher(launcherName).setIcon(iconPath); + target.apply(al::applyTo, al::applyTo); } else { - cmd.addArguments("--icon", iconPath); + target.addInitializer(cmd -> { + cmd.addArguments("--icon", iconPath); + }); } } From ffcb1585ed6c2a2bff28be6854d44a672aa31a0b Mon Sep 17 00:00:00 2001 From: Anass Baya Date: Thu, 23 Oct 2025 06:28:50 +0000 Subject: [PATCH 262/561] 8320677: Printer tests use invalid '@run main/manual=yesno Reviewed-by: aivanov, dnguyen --- .../java/awt/print/PrinterJob/PageRanges.java | 67 ++++--- .../PrinterJob/PolylinePrintingTest.java | 179 ++++-------------- 2 files changed, 69 insertions(+), 177 deletions(-) diff --git a/test/jdk/java/awt/print/PrinterJob/PageRanges.java b/test/jdk/java/awt/print/PrinterJob/PageRanges.java index accde99ae95..e80330bae6c 100644 --- a/test/jdk/java/awt/print/PrinterJob/PageRanges.java +++ b/test/jdk/java/awt/print/PrinterJob/PageRanges.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -21,58 +21,63 @@ * questions. */ -/** +/* * @test * @bug 6575331 * @key printer * @summary The specified pages should be printed. - * @run main/manual=yesno PageRanges + * @library /java/awt/regtesthelpers + * @library /test/lib + * @build PassFailJFrame + * @build jtreg.SkippedException + * @run main/manual PageRanges */ -import java.awt.*; -import java.awt.print.*; +import java.awt.Graphics; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import jtreg.SkippedException; public class PageRanges implements Printable { - - static String[] instr = { - "This test prints two jobs, and tests that the specified range", - "of pages is printed. You must have a printer installed for this test.", - "In the first dialog, select a page range of 2 to 3, and press OK", - "In the second dialog, select ALL, to print all pages (in total 5 pages).", - "Collect the two print outs and confirm the jobs printed correctly", - }; + private static final String INSTRUCTIONS = """ + This test prints two jobs and tests that the specified range + of pages is printed. + In the first dialog, select a page range of 2 to 3, and press OK. + In the second dialog, select ALL, to print all pages (in total 5 pages). + Collect the two print outs and confirm the jobs are printed correctly. + """; public static void main(String args[]) throws Exception { - for (int i=0;i= 5) { return NO_SUCH_PAGE; } g.drawString("Page : " + (pi+1), 200, 200); - return PAGE_EXISTS; } } diff --git a/test/jdk/java/awt/print/PrinterJob/PolylinePrintingTest.java b/test/jdk/java/awt/print/PrinterJob/PolylinePrintingTest.java index 7d8568c01f9..c9dcdfdd450 100644 --- a/test/jdk/java/awt/print/PrinterJob/PolylinePrintingTest.java +++ b/test/jdk/java/awt/print/PrinterJob/PolylinePrintingTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -21,31 +21,56 @@ * questions. */ -/** +/* + * @test * @bug 8041902 * @key printer * @summary Test printing of wide poly lines. - * @run main/manual=yesno PolylinePrintingTest + * @library /java/awt/regtesthelpers + * @library /test/lib + * @build PassFailJFrame + * @build jtreg.SkippedException + * @run main/manual PolylinePrintingTest */ -import java.awt.Dialog; -import java.awt.Frame; -import java.awt.TextArea; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Path2D; import java.awt.print.PageFormat; -import java.awt.print.Paper; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; +import jtreg.SkippedException; public class PolylinePrintingTest implements Printable { + private static final String INSTRUCTIONS = """ + Press OK in the print dialog and collect the printed page. + Passing test : Output should show two identical chevrons. + Failing test : The line joins will appear different. + """; + + public static void main(String[] args) throws Exception { + PrinterJob job = PrinterJob.getPrinterJob(); + if (job.getPrintService() == null) { + throw new SkippedException("Printer not configured or available."); + } + + PassFailJFrame passFailJFrame = PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(45) + .build(); + + job.setPrintable(new PolylinePrintingTest()); + if (job.printDialog()) { + job.print(); + } + + passFailJFrame.awaitAndCheck(); + } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { - if (pageIndex > 0) { return NO_SUCH_PAGE; } @@ -66,7 +91,6 @@ public class PolylinePrintingTest implements Printable { private void drawPolylineGOOD(Graphics2D g2d, int[] x2Points, int[] y2Points) { - Path2D polyline = new Path2D.Float(Path2D.WIND_EVEN_ODD, x2Points.length); @@ -83,141 +107,4 @@ public class PolylinePrintingTest implements Printable { g.translate(0, offset); g.drawPolyline(xp, yp, xp.length); } - - public PolylinePrintingTest() throws PrinterException { - PrinterJob job = PrinterJob.getPrinterJob(); - PageFormat pf = job.defaultPage(); - Paper p = pf.getPaper(); - p.setImageableArea(0,0,p.getWidth(), p.getHeight()); - pf.setPaper(p); - job.setPrintable(this, pf); - if (job.printDialog()) { - job.print(); - } - } - - public static void main(String[] args) throws PrinterException { - String[] instructions = { - "You must have a printer available to perform this test.", - "OK the print dialog, and collect the printed page.", - "Passing test : Output should show two identical chevrons.", - "Failing test : The line joins will appear different." - }; - Sysout.createDialog(); - Sysout.printInstructions(instructions); - new PolylinePrintingTest(); - } } - -class Sysout { - private static TestDialog dialog; - - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); - } - - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); - } - -}// Sysout class - -/** - This is part of the standard test machinery. It provides a place for the - test instructions to be displayed, and a place for interactive messages - to the user to be displayed. - To have the test instructions displayed, see Sysout. - To have a message to the user be displayed, see Sysout. - Do not call anything in this dialog directly. - */ -class TestDialog extends Dialog { - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("Center", messageText); - - pack(); - - show(); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - } - -}// TestDialog class - From 027aea9d2e0dff29fcd00fa7074ca955066929ec Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Thu, 23 Oct 2025 07:05:08 +0000 Subject: [PATCH 263/561] 8370325: G1: Disallow GC for TLAB allocation Reviewed-by: iwalulya, ayang --- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 21 ++++++++++++++------- src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 21 +++++++++------------ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index 485caa9f6c0..d3e02df3e09 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -403,21 +403,25 @@ HeapWord* G1CollectedHeap::allocate_new_tlab(size_t min_size, assert_heap_not_locked_and_not_at_safepoint(); assert(!is_humongous(requested_size), "we do not allow humongous TLABs"); - return attempt_allocation(min_size, requested_size, actual_size); + // Do not allow a GC because we are allocating a new TLAB to avoid an issue + // with UseGCOverheadLimit: although this GC would return null if the overhead + // limit would be exceeded, but it would likely free at least some space. + // So the subsequent outside-TLAB allocation could be successful anyway and + // the indication that the overhead limit had been exceeded swallowed. + return attempt_allocation(min_size, requested_size, actual_size, false /* allow_gc */); } -HeapWord* -G1CollectedHeap::mem_allocate(size_t word_size) { +HeapWord* G1CollectedHeap::mem_allocate(size_t word_size) { assert_heap_not_locked_and_not_at_safepoint(); if (is_humongous(word_size)) { return attempt_allocation_humongous(word_size); } size_t dummy = 0; - return attempt_allocation(word_size, word_size, &dummy); + return attempt_allocation(word_size, word_size, &dummy, true /* allow_gc */); } -HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_size) { +HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_size, bool allow_gc) { ResourceMark rm; // For retrieving the thread names in log messages. // Make sure you read the note in attempt_allocation_humongous(). @@ -444,6 +448,8 @@ HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_ result = _allocator->attempt_allocation_locked(node_index, word_size); if (result != nullptr) { return result; + } else if (!allow_gc) { + return nullptr; } // Read the GC count while still holding the Heap_lock. @@ -612,7 +618,8 @@ void G1CollectedHeap::dealloc_archive_regions(MemRegion range) { inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size, size_t desired_word_size, - size_t* actual_word_size) { + size_t* actual_word_size, + bool allow_gc) { assert_heap_not_locked_and_not_at_safepoint(); assert(!is_humongous(desired_word_size), "attempt_allocation() should not " "be called for humongous allocation requests"); @@ -624,7 +631,7 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size, if (result == nullptr) { *actual_word_size = desired_word_size; - result = attempt_allocation_slow(node_index, desired_word_size); + result = attempt_allocation_slow(node_index, desired_word_size, allow_gc); } assert_heap_not_locked(); diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index 7e3f8a30285..0d354525d89 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -439,18 +439,14 @@ private: // // * If either call cannot satisfy the allocation request using the // current allocating region, they will try to get a new one. If - // this fails, they will attempt to do an evacuation pause and - // retry the allocation. - // - // * If all allocation attempts fail, even after trying to schedule - // an evacuation pause, allocate_new_tlab() will return null, - // whereas mem_allocate() will attempt a heap expansion and/or - // schedule a Full GC. + // this fails, (only) mem_allocate() will attempt to do an evacuation + // pause and retry the allocation. Allocate_new_tlab() will return null, + // deferring to the following mem_allocate(). // // * We do not allow humongous-sized TLABs. So, allocate_new_tlab // should never be called with word_size being humongous. All // humongous allocation requests should go to mem_allocate() which - // will satisfy them with a special path. + // will satisfy them in a special path. HeapWord* allocate_new_tlab(size_t min_size, size_t requested_size, @@ -463,12 +459,13 @@ private: // should only be used for non-humongous allocations. inline HeapWord* attempt_allocation(size_t min_word_size, size_t desired_word_size, - size_t* actual_word_size); - + size_t* actual_word_size, + bool allow_gc); // Second-level mutator allocation attempt: take the Heap_lock and // retry the allocation attempt, potentially scheduling a GC - // pause. This should only be used for non-humongous allocations. - HeapWord* attempt_allocation_slow(uint node_index, size_t word_size); + // pause if allow_gc is set. This should only be used for non-humongous + // allocations. + HeapWord* attempt_allocation_slow(uint node_index, size_t word_size, bool allow_gc); // Takes the Heap_lock and attempts a humongous allocation. It can // potentially schedule a GC pause. From dcf46a0a195d7386ed0bc872f60eb9c586425cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Thu, 23 Oct 2025 08:22:32 +0000 Subject: [PATCH 264/561] 8369658: Client emulation mode sets MaxRAM too late Reviewed-by: aboldtch, stefank --- .../share/compiler/compilerDefinitions.cpp | 28 +++++++++++++------ .../share/compiler/compilerDefinitions.hpp | 2 ++ src/hotspot/share/runtime/arguments.cpp | 6 ++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/compiler/compilerDefinitions.cpp b/src/hotspot/share/compiler/compilerDefinitions.cpp index 35201973dfe..aed1edc0db5 100644 --- a/src/hotspot/share/compiler/compilerDefinitions.cpp +++ b/src/hotspot/share/compiler/compilerDefinitions.cpp @@ -215,11 +215,6 @@ void CompilerConfig::set_client_emulation_mode_flags() { if (FLAG_IS_DEFAULT(CodeCacheExpansionSize)) { FLAG_SET_ERGO(CodeCacheExpansionSize, 32*K); } - if (FLAG_IS_DEFAULT(MaxRAM)) { - // Do not use FLAG_SET_ERGO to update MaxRAM, as this will impact - // heap setting done based on available phys_mem (see Arguments::set_heap_size). - FLAG_SET_DEFAULT(MaxRAM, 1ULL*G); - } if (FLAG_IS_DEFAULT(CICompilerCount)) { FLAG_SET_ERGO(CICompilerCount, 1); } @@ -553,21 +548,36 @@ bool CompilerConfig::check_args_consistency(bool status) { return status; } -void CompilerConfig::ergo_initialize() { +bool CompilerConfig::should_set_client_emulation_mode_flags() { #if !COMPILER1_OR_COMPILER2 - return; + return false; #endif if (has_c1()) { if (!is_compilation_mode_selected()) { if (NeverActAsServerClassMachine) { - set_client_emulation_mode_flags(); + return true; } } else if (!has_c2() && !is_jvmci_compiler()) { - set_client_emulation_mode_flags(); + return true; } } + return false; +} + +void CompilerConfig::ergo_initialize() { +#if !COMPILER1_OR_COMPILER2 + return; +#endif + + // This property is also checked when selecting the heap size. Since client + // emulation mode influences Java heap memory usage, part of the logic must + // occur before choosing the heap size. + if (should_set_client_emulation_mode_flags()) { + set_client_emulation_mode_flags(); + } + set_legacy_emulation_flags(); set_compilation_policy_flags(); diff --git a/src/hotspot/share/compiler/compilerDefinitions.hpp b/src/hotspot/share/compiler/compilerDefinitions.hpp index 1c8c65b2a53..a9b052ff782 100644 --- a/src/hotspot/share/compiler/compilerDefinitions.hpp +++ b/src/hotspot/share/compiler/compilerDefinitions.hpp @@ -151,6 +151,8 @@ public: inline static CompilerType compiler_type(); + static bool should_set_client_emulation_mode_flags(); + private: static bool is_compilation_mode_selected(); static void set_compilation_policy_flags(); diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 0d9973a1b09..0d92f22af79 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -1521,6 +1521,12 @@ void Arguments::set_heap_size() { !FLAG_IS_DEFAULT(InitialRAMPercentage) || !FLAG_IS_DEFAULT(MaxRAM); + if (CompilerConfig::should_set_client_emulation_mode_flags() && + FLAG_IS_DEFAULT(MaxRAM)) { + // Reduce the maximum available memory if client emulation mode is enabled. + FLAG_SET_DEFAULT(MaxRAM, 1ULL*G); + } + if (has_ram_limit) { if (!FLAG_IS_DEFAULT(MaxRAM)) { // The user has configured MaxRAM, use that instead of physical memory From aec138886ec2dff765ed810059a1c7b9905c43ca Mon Sep 17 00:00:00 2001 From: Casper Norrbin Date: Thu, 23 Oct 2025 09:06:00 +0000 Subject: [PATCH 265/561] 8313770: jdk/internal/platform/docker/TestSystemMetrics.java fails on Ubuntu Reviewed-by: sgehwolf, mbaesken, syan --- .../test/lib/containers/cgroup/MetricsTesterCgroupV2.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java b/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java index a3723e2eda2..2a756102ded 100644 --- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java +++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTesterCgroupV2.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Red Hat Inc. + * 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 @@ -447,13 +448,13 @@ public class MetricsTesterCgroupV2 implements CgroupMetricsTester { Metrics metrics = Metrics.systemMetrics(); long oldVal = metrics.getBlkIOServiceCount(); long newVal = getIoStatAccumulate(new String[] { "rios", "wios" }); - if (!CgroupMetricsTester.compareWithErrorMargin(oldVal, newVal)) { + if (newVal < oldVal) { fail("io.stat->rios/wios: ", oldVal, newVal); } oldVal = metrics.getBlkIOServiced(); newVal = getIoStatAccumulate(new String[] { "rbytes", "wbytes" }); - if (!CgroupMetricsTester.compareWithErrorMargin(oldVal, newVal)) { + if (newVal < oldVal) { fail("io.stat->rbytes/wbytes: ", oldVal, newVal); } } From da968dc645db498b4315e4c8926e7aeb21cc533a Mon Sep 17 00:00:00 2001 From: Claes Redestad Date: Thu, 23 Oct 2025 10:02:03 +0000 Subject: [PATCH 266/561] 8370227: Migrate micros-javac benchmarks from jmh-jdk-microbenchmarks Reviewed-by: asotona, erikj, ecaspole --- .gitignore | 1 + test/benchmarks/micros-javac/README.md | 61 +++++ test/benchmarks/micros-javac/pom.xml | 139 +++++++++++ .../langtools/javac/GroupJavacBenchmark.java | 231 ++++++++++++++++++ .../bench/langtools/javac/JavacBenchmark.java | 198 +++++++++++++++ .../langtools/javac/SingleJavacBenchmark.java | 69 ++++++ 6 files changed, 699 insertions(+) create mode 100644 test/benchmarks/micros-javac/README.md create mode 100644 test/benchmarks/micros-javac/pom.xml create mode 100644 test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/GroupJavacBenchmark.java create mode 100644 test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/JavacBenchmark.java create mode 100644 test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/SingleJavacBenchmark.java diff --git a/.gitignore b/.gitignore index 9145a9fa67b..852b692f99b 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ NashornProfile.txt **/core.[0-9]* *.rej *.orig +test/benchmarks/**/target diff --git a/test/benchmarks/micros-javac/README.md b/test/benchmarks/micros-javac/README.md new file mode 100644 index 00000000000..66ca073a763 --- /dev/null +++ b/test/benchmarks/micros-javac/README.md @@ -0,0 +1,61 @@ +# Javac microbenchmarks + +The Javac Microbenchmarks is a collection of microbenchmarks for measuring +the performance of Javac API using the +[JMH](http://openjdk.java.net/projects/code-tools/jmh/) framework. + + +## Building and running the project + +Currently, the project can be built and run with JDK 9 and later. This is +a Maven project and is built by: + + $ mvn clean install + +After building, the executable jar is target/micros-javac-[version].jar. +Run the benchmarks with: + + $ java -jar target/micros-javac-*.jar [optional jmh parameters] + +See the entire list of benchmarks using: + + $ java -jar target/micros-javacs-*.jar -l [optional regex to select benchmarks] + +For example: + + $ java -jar target/micros-javac-1.0-SNAPSHOT.jar -l + Benchmarks: + org.openjdk.bench.langtools.javac.GroupJavacBenchmark.coldGroup + org.openjdk.bench.langtools.javac.GroupJavacBenchmark.hotGroup + org.openjdk.bench.langtools.javac.SingleJavacBenchmark.compileCold + org.openjdk.bench.langtools.javac.SingleJavacBenchmark.compileHot + +And the same regex syntax works to run some test: + + $ java -jar target/micros-javac-1.0-SNAPSHOT.jar SingleJavacBenchmark.compileHot + +## Troubleshooting + +### Build of micros-javac module got stuck + +If you build got stuck on `[get] Getting: https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip` then you are probably experiencing some networking or web proxy obstacles. + +One solution is to download required reference JDK from [https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip](https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip) manually and then build the project with property pointing to the local copy: + + $ mvn clean install -Djavac.benchmark.openjdk.zip.download.url=file:////openjdk-11+28_windows-x64_bin.zip + +Note: Please use `openjdk-11+28_windows-x64_bin.zip` to build the project no matter what target platform is. + +Another solution might be to add proxy settings: + + $ mvn -Dhttps.proxyHost=... -Dhttps.proxyPort=... clean install + +### Execution of micros-javac benchmarks takes several hours + +micros-javac benchmarks consist of two sets of benchmarks: + * `SingleJavacBenchmark` (which is parametrized) measures each single javac compilation stage in an isolated run. This benchmark is designed for exact automated performance regression testing and it takes several hours to execute completely. + * `GroupJavacBenchmark` is grouping the measurements of all javac compilation stages into one run and its execution should take less than 30 minutes on a regular developers computer. + +Solution to speed up javac benchmarking is to select only `GroupJavacBenchmark` for execution using following command line: + + $ java -jar target/micros-javac-1.0-SNAPSHOT.jar .*GroupJavacBenchmark.* diff --git a/test/benchmarks/micros-javac/pom.xml b/test/benchmarks/micros-javac/pom.xml new file mode 100644 index 00000000000..5a8a40d7a9a --- /dev/null +++ b/test/benchmarks/micros-javac/pom.xml @@ -0,0 +1,139 @@ + + + 4.0.0 + org.openjdk + micros-javac + jar + 1.0-SNAPSHOT + OpenJDK Microbenchmark of Java Compile + + https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_windows-x64_bin.zip + UTF-8 + 1.36 + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.1 + + + package + + shade + + + + + org.openjdk.jmh.Main + + + META-INF/BenchmarkList + + + META-INF/CompilerHints + + + false + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + 1.8 + 1.8 + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + + + + + + org.apache.maven.plugins + maven-release-plugin + 3.1.1 + + + maven-deploy-plugin + 3.1.4 + + + maven-antrun-plugin + 3.1.0 + + + process-resources + + + + + + + + + + + + + +------------------------------------------------- +Bundling JDK sources with following release info: +------------------------------------------------- +${release.info} +------------------------------------------------- + + + + + run + + + + + + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + diff --git a/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/GroupJavacBenchmark.java b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/GroupJavacBenchmark.java new file mode 100644 index 00000000000..5ca3f0bf648 --- /dev/null +++ b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/GroupJavacBenchmark.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2020, 2021, 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 org.openjdk.bench.langtools.javac; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Group; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +@State(Scope.Benchmark) +public class GroupJavacBenchmark extends JavacBenchmark { + + public static final String COLD_GROUP_NAME = "coldGroup"; + public static final int COLD_ITERATION_WARMUPS = 0; + public static final int COLD_ITERATIONS = 1; + public static final int COLD_FORK_WARMUPS = 1; + public static final int COLD_FORKS = 15; + + public static final String HOT_GROUP_NAME = "hotGroup"; + public static final int HOT_ITERATION_WARMUPS = 8; + public static final int HOT_ITERATIONS = 10; + public static final int HOT_FORK_WARMUPS = 0; + public static final int HOT_FORKS = 1; + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold1_Init() throws InterruptedException { + Stage.Init.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold2_Parse() throws InterruptedException { + Stage.Parse.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold3_InitModules() throws InterruptedException { + Stage.InitModules.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold4_Enter() throws InterruptedException { + Stage.Enter.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold5_Attribute() throws InterruptedException { + Stage.Attribute.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold6_Flow() throws InterruptedException { + Stage.Flow.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold7_Desugar() throws InterruptedException { + Stage.Desugar.waitFor(); + } + + @Benchmark + @Group(COLD_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = COLD_ITERATION_WARMUPS) + @Measurement(iterations = COLD_ITERATIONS) + @Fork(warmups = COLD_FORK_WARMUPS, value = COLD_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void cold8_Generate(Blackhole bh) throws IOException { + compile(bh, Stage.Generate); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot1_Init() throws InterruptedException { + Stage.Init.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot2_Parse() throws InterruptedException { + Stage.Parse.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot3_InitModules() throws InterruptedException { + Stage.InitModules.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot4_Enter() throws InterruptedException { + Stage.Enter.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot5_Attribute() throws InterruptedException { + Stage.Attribute.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot6_Flow() throws InterruptedException { + Stage.Flow.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot7_Desugar() throws InterruptedException { + Stage.Desugar.waitFor(); + } + + @Benchmark + @Group(HOT_GROUP_NAME) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = HOT_ITERATION_WARMUPS) + @Measurement(iterations = HOT_ITERATIONS) + @Fork(warmups = HOT_FORK_WARMUPS, value = HOT_FORKS, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void hot8_Generate(Blackhole bh) throws IOException { + compile(bh, Stage.Generate); + } +} diff --git a/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/JavacBenchmark.java b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/JavacBenchmark.java new file mode 100644 index 00000000000..1afffc6d044 --- /dev/null +++ b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/JavacBenchmark.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * 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 org.openjdk.bench.langtools.javac; + +import com.sun.tools.javac.comp.AttrContext; +import com.sun.tools.javac.comp.Env; +import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.main.JavaCompiler; +import com.sun.tools.javac.main.Main; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Context.Factory; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Pair; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Queue; +import static java.util.logging.Level.FINE; +import static java.util.logging.Level.CONFIG; +import java.util.logging.Logger; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import javax.tools.FileObject; +import javax.tools.ForwardingJavaFileObject; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; + +@State(Scope.Benchmark) +public class JavacBenchmark { + + static final Logger LOG = Logger.getLogger(JavacBenchmark.class.getName()); + + public enum Stage { + Init, Parse, InitModules, Enter, Attribute, Flow, Desugar, Generate; + + public synchronized void waitFor() throws InterruptedException { + wait(); + } + public synchronized void notifyDone() { + notifyAll(); + LOG.log(FINE, "{0} finished.", this.name()); + } + public boolean isAfter(Stage other) { + return ordinal() > other.ordinal(); + } + } + + private Path root; + private Path srcList; + + @Setup(Level.Trial) + public void setup(Blackhole bh) throws IOException, InterruptedException { + LOG.log(CONFIG, "Release info of the sources to be compiled by the benchmark:\n{0}", new String(JavacBenchmark.class.getResourceAsStream("/release").readAllBytes(), StandardCharsets.UTF_8)); + root = Files.createTempDirectory("JavacBenchmarkRoot"); + srcList = root.resolve("sources.list"); + int i = 0; + try (PrintStream srcListOut = new PrintStream(srcList.toFile())) { + try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream(JavacBenchmark.class.getResourceAsStream("/src.zip")))) { + for (ZipEntry entry; (entry = zis.getNextEntry()) != null;) { + final String ename = entry.getName(); + if (!ename.startsWith("java.desktop") && !ename.startsWith("jdk.internal.vm.compiler") && !ename.startsWith("jdk.aot") && !ename.startsWith("jdk.accessibility")) { + if (!entry.isDirectory() && ename.endsWith(".java")) { + Path dst = root.resolve(ename); + Files.createDirectories(dst.getParent()); + Files.copy(zis, dst); + Files.readAllBytes(dst); //reads all the file back to exclude antivirus scanning time from following measurements + srcListOut.println(dst.toString()); + i++; + } + } + } + } + } + Files.walk(root).map(Path::toFile).forEach(File::deleteOnExit); //mark all files and folders for deletion on JVM exit for cases when tearDown is not executed + Thread.sleep(10000); //give some more time for the system to catch a breath for more precise measurement + LOG.log(FINE, "Extracted {0} sources.", i); + } + + @TearDown(Level.Trial) + public void tearDown() throws IOException { + Files.walk(root).sorted(Comparator.reverseOrder()).map(Path::toFile).forEachOrdered(File::delete); + LOG.fine("Sources deleted."); + } + + protected void compile(Blackhole bh, final Stage stopAt) throws IOException { + final OutputStream bhos = new OutputStream() { + @Override + public void write(int b) throws IOException { + bh.consume(b); + } + @Override + public void write(byte[] b, int off, int len) throws IOException { + bh.consume(b); + } + }; + final Context ctx = new Context(); + //inject JavaCompiler wrapping all measured methods so they directly report to the benchmark + ctx.put(JavaCompiler.compilerKey, (Factory)(c) -> { + return new JavaCompiler(c) { + @Override + public List parseFiles(Iterable fileObjects) { + Stage.Init.notifyDone(); + return stopAt.isAfter(Stage.Init) ? super.parseFiles(fileObjects) : List.nil(); + } + + @Override + public List initModules(List roots) { + Stage.Parse.notifyDone(); + return stopAt.isAfter(Stage.Parse) ? super.initModules(roots) : List.nil(); + } + + @Override + public List enterTrees(List roots) { + Stage.InitModules.notifyDone(); + return stopAt.isAfter(Stage.InitModules) ? super.enterTrees(roots) : List.nil(); + } + + @Override + public Queue> attribute(Queue> envs) { + Stage.Enter.notifyDone(); + return stopAt.isAfter(Stage.Enter) ? super.attribute(envs) : new ListBuffer<>(); + } + + @Override + public Queue> flow(Queue> envs) { + Stage.Attribute.notifyDone(); + return stopAt.isAfter(Stage.Attribute) ? super.flow(envs) : new ListBuffer<>(); + } + + @Override + public Queue, JCTree.JCClassDecl>> desugar(Queue> envs) { + Stage.Flow.notifyDone(); + return stopAt.isAfter(Stage.Flow) ? super.desugar(envs) : new ListBuffer<>(); + } + + @Override + public void generate(Queue, JCTree.JCClassDecl>> queue) { + Stage.Desugar.notifyDone(); + if (stopAt.isAfter(Stage.Desugar)) super.generate(queue); + } + }; + }); + //JavaFileManager directing all writes to a Blackhole to avoid measurement fluctuations due to delayed filesystem writes + try (JavacFileManager mngr = new JavacFileManager(ctx, true, null) { + @Override + public JavaFileObject getJavaFileForOutput(JavaFileManager.Location arg0, String arg1, JavaFileObject.Kind arg2, FileObject arg3) throws IOException { + return new ForwardingJavaFileObject(super.getJavaFileForOutput(arg0, arg1, arg2, arg3)) { + @Override + public OutputStream openOutputStream() throws IOException { + return bhos; + } + }; + } + }) { + String[] cmdLine = new String[] {"-XDcompilePolicy=simple", "-implicit:none", "-nowarn", "--module-source-path", root.toString(), "-d", root.toString(), "-XDignore.symbol.file=true", "@" + srcList.toString()}; + if (new Main("javac").compile(cmdLine, ctx).exitCode != 0) { + throw new IOException("compilation failed"); + } + } + LOG.fine("Compilation finished."); + } +} diff --git a/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/SingleJavacBenchmark.java b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/SingleJavacBenchmark.java new file mode 100644 index 00000000000..2cc5c1a7c83 --- /dev/null +++ b/test/benchmarks/micros-javac/src/main/java/org/openjdk/bench/langtools/javac/SingleJavacBenchmark.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020, 2021, 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 org.openjdk.bench.langtools.javac; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +@State(Scope.Benchmark) +public class SingleJavacBenchmark extends JavacBenchmark { + + @Param + public Stage stopStage; + + @Benchmark + @Threads(1) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = 0) + @Measurement(iterations = 1) + @Fork(warmups = 1, value = 15, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void compileCold(Blackhole bh) throws IOException { + compile(bh, stopStage); + } + + @Benchmark + @Threads(1) + @BenchmarkMode(Mode.SingleShotTime) + @Warmup(iterations = 8) + @Measurement(iterations = 10) + @Fork(warmups = 0, value = 1, jvmArgsPrepend = { "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" }) + @OutputTimeUnit(TimeUnit.SECONDS) + public void compileHot(Blackhole bh) throws IOException { + compile(bh, stopStage); + } +} From 5a83d6a8355b36cffcf5945b9c6bcfc7aebdd136 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Thu, 23 Oct 2025 11:09:33 +0000 Subject: [PATCH 267/561] 8370406: Parallel: Refactor ParCompactionManager::mark_and_push Reviewed-by: fandreuzzi, iwalulya --- .../share/gc/parallel/psCompactionManager.hpp | 1 - .../parallel/psCompactionManager.inline.hpp | 40 +++++++++---------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.hpp index 613361c7039..0a404579da8 100644 --- a/src/hotspot/share/gc/parallel/psCompactionManager.hpp +++ b/src/hotspot/share/gc/parallel/psCompactionManager.hpp @@ -188,7 +188,6 @@ public: ParMarkBitMap* mark_bitmap() { return _mark_bitmap; } // Save for later processing. Must not fail. - inline void push(oop obj); inline void push_region(size_t index); // Check mark and maybe push on marking stack. diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp index 75f54caf89e..663cd83be9c 100644 --- a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp @@ -56,10 +56,6 @@ inline bool ParCompactionManager::steal(int queue_num, size_t& region) { return region_task_queues()->steal(queue_num, region); } -inline void ParCompactionManager::push(oop obj) { - marking_stack()->push(ScannerTask(obj)); -} - void ParCompactionManager::push_region(size_t index) { #ifdef ASSERT @@ -74,24 +70,26 @@ void ParCompactionManager::push_region(size_t index) template inline void ParCompactionManager::mark_and_push(T* p) { T heap_oop = RawAccess<>::oop_load(p); - if (!CompressedOops::is_null(heap_oop)) { - oop obj = CompressedOops::decode_not_null(heap_oop); - assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap"); - - if (mark_bitmap()->mark_obj(obj)) { - if (StringDedup::is_enabled() && - java_lang_String::is_instance(obj) && - psStringDedup::is_candidate_from_mark(obj)) { - _string_dedup_requests.add(obj); - } - - ContinuationGCSupport::transform_stack_chunk(obj); - - assert(_marking_stats_cache != nullptr, "inv"); - _marking_stats_cache->push(obj, obj->size()); - push(obj); - } + if (CompressedOops::is_null(heap_oop)) { + return; } + + oop obj = CompressedOops::decode_not_null(heap_oop); + if (!mark_bitmap()->mark_obj(obj)) { + // Marked by another worker. + return; + } + + if (StringDedup::is_enabled() && + java_lang_String::is_instance(obj) && + psStringDedup::is_candidate_from_mark(obj)) { + _string_dedup_requests.add(obj); + } + + ContinuationGCSupport::transform_stack_chunk(obj); + + _marking_stats_cache->push(obj, obj->size()); + marking_stack()->push(ScannerTask(obj)); } inline void ParCompactionManager::FollowStackClosure::do_void() { From 3fdb15fc5203a559a5e6951a5a9505160057f258 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Thu, 23 Oct 2025 11:46:01 +0000 Subject: [PATCH 268/561] 8369622: GlobalChunkPoolMutex is recursively locked during error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Johan Sjölen Co-authored-by: Afshin Zafari Reviewed-by: dholmes, azafari, phubner --- src/hotspot/share/memory/arena.cpp | 19 +++++++++++++------ src/hotspot/share/memory/arena.hpp | 5 ++++- src/hotspot/share/nmt/mallocTracker.cpp | 6 +++++- src/hotspot/share/nmt/nmtUsage.cpp | 7 ++++++- .../test_nmt_buffer_overflow_detection.cpp | 16 ++++++++++++++++ 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/memory/arena.cpp b/src/hotspot/share/memory/arena.cpp index db0bb8add21..b9968083e0e 100644 --- a/src/hotspot/share/memory/arena.cpp +++ b/src/hotspot/share/memory/arena.cpp @@ -39,19 +39,26 @@ // It is used very early in the vm initialization, in allocation // code and other areas. For many calls, the current thread has not // been created so we cannot use Mutex. -static PlatformMutex* GlobalChunkPoolMutex = nullptr; +static DeferredStatic GlobalChunkPoolMutex; void Arena::initialize_chunk_pool() { - GlobalChunkPoolMutex = new PlatformMutex(); + GlobalChunkPoolMutex.initialize(); } -ChunkPoolLocker::ChunkPoolLocker() { - assert(GlobalChunkPoolMutex != nullptr, "must be initialized"); - GlobalChunkPoolMutex->lock(); +ChunkPoolLocker::ChunkPoolLocker(LockStrategy ls) { + if (ls == LockStrategy::Lock) { + GlobalChunkPoolMutex->lock(); + _locked = true; + } else { + assert(ls == LockStrategy::Try, "must be"); + _locked = GlobalChunkPoolMutex->try_lock(); + } }; ChunkPoolLocker::~ChunkPoolLocker() { - GlobalChunkPoolMutex->unlock(); + if (_locked) { + GlobalChunkPoolMutex->unlock(); + } }; // Pre-defined default chunk sizes must be arena-aligned, see Chunk::operator new() diff --git a/src/hotspot/share/memory/arena.hpp b/src/hotspot/share/memory/arena.hpp index e2169ee406e..b4a0546babf 100644 --- a/src/hotspot/share/memory/arena.hpp +++ b/src/hotspot/share/memory/arena.hpp @@ -38,8 +38,11 @@ #define ARENA_ALIGN(x) (align_up((x), ARENA_AMALLOC_ALIGNMENT)) class ChunkPoolLocker : public StackObj { + bool _locked; public: - ChunkPoolLocker(); + enum class LockStrategy { Lock, Try }; + + ChunkPoolLocker(LockStrategy ls = LockStrategy::Lock); ~ChunkPoolLocker(); }; diff --git a/src/hotspot/share/nmt/mallocTracker.cpp b/src/hotspot/share/nmt/mallocTracker.cpp index 75089dffc30..a61a27db25d 100644 --- a/src/hotspot/share/nmt/mallocTracker.cpp +++ b/src/hotspot/share/nmt/mallocTracker.cpp @@ -65,7 +65,11 @@ void MallocMemorySnapshot::copy_to(MallocMemorySnapshot* s) { // Use lock to make sure that mtChunks don't get deallocated while the // copy is going on, because their size is adjusted using this // buffer in make_adjustment(). - ChunkPoolLocker lock; + ChunkPoolLocker::LockStrategy ls = ChunkPoolLocker::LockStrategy::Lock; + if (VMError::is_error_reported() && VMError::is_error_reported_in_current_thread()) { + ls = ChunkPoolLocker::LockStrategy::Try; + } + ChunkPoolLocker cpl(ls); s->_all_mallocs = _all_mallocs; size_t total_size = 0; size_t total_count = 0; diff --git a/src/hotspot/share/nmt/nmtUsage.cpp b/src/hotspot/share/nmt/nmtUsage.cpp index 3a9a232a36e..9e6fc3e183b 100644 --- a/src/hotspot/share/nmt/nmtUsage.cpp +++ b/src/hotspot/share/nmt/nmtUsage.cpp @@ -30,6 +30,7 @@ #include "nmt/nmtUsage.hpp" #include "nmt/threadStackTracker.hpp" #include "runtime/mutexLocker.hpp" +#include "utilities/vmError.hpp" // Enabled all options for snapshot. const NMTUsageOptions NMTUsage::OptionsAll = { true, true, true }; @@ -58,7 +59,11 @@ void NMTUsage::update_malloc_usage() { // Lock needed to keep values in sync, total area size // is deducted from mtChunk in the end to give correct values. { - ChunkPoolLocker lock; + ChunkPoolLocker::LockStrategy ls = ChunkPoolLocker::LockStrategy::Lock; + if (VMError::is_error_reported() && VMError::is_error_reported_in_current_thread()) { + ls = ChunkPoolLocker::LockStrategy::Try; + } + ChunkPoolLocker cpl(ls); ms = MallocMemorySummary::as_snapshot(); } diff --git a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp index 82ddd28d56c..5752d6df75d 100644 --- a/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp +++ b/test/hotspot/gtest/nmt/test_nmt_buffer_overflow_detection.cpp @@ -23,6 +23,7 @@ */ #include "memory/allocation.hpp" +#include "memory/arena.hpp" #include "nmt/memTracker.hpp" #include "runtime/os.hpp" #include "sanitizers/address.hpp" @@ -142,6 +143,21 @@ DEFINE_TEST(test_corruption_on_realloc_growing, COMMON_NMT_HEAP_CORRUPTION_MESSA static void test_corruption_on_realloc_shrinking() { test_corruption_on_realloc(0x11, 0x10); } DEFINE_TEST(test_corruption_on_realloc_shrinking, COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX); +static void test_chunkpool_lock() { + if (!MemTracker::enabled()) { + tty->print_cr("Skipped"); + return; + } + PrintNMTStatistics = true; + { + ChunkPoolLocker cpl; + char* mem = (char*)os::malloc(100, mtTest); + memset(mem - 16, 0, 100 + 16 + 2); + os::free(mem); + } +} +DEFINE_TEST(test_chunkpool_lock, COMMON_NMT_HEAP_CORRUPTION_MESSAGE_PREFIX); + /////// // realloc is the trickiest of the bunch. Test that realloc works and correctly takes over From b597b6556dbd18360423c29c784a5fbb792a8899 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Thu, 23 Oct 2025 13:03:13 +0000 Subject: [PATCH 269/561] 8370065: Windows perfmemory coding - use SetSecurityDescriptorControl directly Reviewed-by: dholmes, stuefe --- src/hotspot/os/windows/perfMemory_windows.cpp | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/hotspot/os/windows/perfMemory_windows.cpp b/src/hotspot/os/windows/perfMemory_windows.cpp index f815f3bd104..f54a2b52cca 100644 --- a/src/hotspot/os/windows/perfMemory_windows.cpp +++ b/src/hotspot/os/windows/perfMemory_windows.cpp @@ -42,11 +42,7 @@ #include #include #include - -typedef BOOL (WINAPI *SetSecurityDescriptorControlFnPtr)( - IN PSECURITY_DESCRIPTOR pSecurityDescriptor, - IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest, - IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet); +#include // Standard Memory Implementation Details @@ -952,28 +948,18 @@ static bool add_allow_aces(PSECURITY_DESCRIPTOR pSD, return false; } - // if running on windows 2000 or later, set the automatic inheritance - // control flags. - SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl; - _SetSecurityDescriptorControl = (SetSecurityDescriptorControlFnPtr) - GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")), - "SetSecurityDescriptorControl"); - - if (_SetSecurityDescriptorControl != nullptr) { - // We do not want to further propagate inherited DACLs, so making them - // protected prevents that. - if (!_SetSecurityDescriptorControl(pSD, SE_DACL_PROTECTED, - SE_DACL_PROTECTED)) { - log_debug(perf)("SetSecurityDescriptorControl failure: lasterror = %d", GetLastError()); - FREE_C_HEAP_ARRAY(char, newACL); - return false; - } + // We do not want to further propagate inherited DACLs, so making them + // protected prevents that. + if (!SetSecurityDescriptorControl(pSD, SE_DACL_PROTECTED, SE_DACL_PROTECTED)) { + log_debug(perf)("SetSecurityDescriptorControl failure: lasterror = %d", GetLastError()); + FREE_C_HEAP_ARRAY(char, newACL); + return false; } - // Note, the security descriptor maintains a reference to the newACL, not - // a copy of it. Therefore, the newACL is not freed here. It is freed when - // the security descriptor containing its reference is freed. - // - return true; + + // Note, the security descriptor maintains a reference to the newACL, not + // a copy of it. Therefore, the newACL is not freed here. It is freed when + // the security descriptor containing its reference is freed. + return true; } // method to create a security attributes structure, which contains a From aaa9fbf6b5a0dda0773a657a986246b407402fa1 Mon Sep 17 00:00:00 2001 From: Thomas Stuefe Date: Thu, 23 Oct 2025 13:03:31 +0000 Subject: [PATCH 270/561] 8368365: ASAN errors should produce hs-err files and core dumps Reviewed-by: mbaesken, asmehra --- src/hotspot/share/logging/logTag.hpp | 1 + src/hotspot/share/runtime/globals.hpp | 2 +- src/hotspot/share/runtime/threads.cpp | 5 + src/hotspot/share/sanitizers/address.cpp | 120 ++++++++++++++++++ src/hotspot/share/sanitizers/address.hpp | 12 ++ src/hotspot/share/utilities/vmError.cpp | 20 ++- .../runtime/ErrorHandling/AsanReportTest.java | 87 +++++++++++++ 7 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 src/hotspot/share/sanitizers/address.cpp create mode 100644 test/hotspot/jtreg/runtime/ErrorHandling/AsanReportTest.java diff --git a/src/hotspot/share/logging/logTag.hpp b/src/hotspot/share/logging/logTag.hpp index 6d0bd117ad9..3ad6a197d07 100644 --- a/src/hotspot/share/logging/logTag.hpp +++ b/src/hotspot/share/logging/logTag.hpp @@ -41,6 +41,7 @@ class outputStream; LOG_TAG(aot) \ LOG_TAG(arguments) \ LOG_TAG(array) \ + LOG_TAG(asan) \ LOG_TAG(attach) \ LOG_TAG(barrier) \ LOG_TAG(blocks) \ diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index 513edaf6588..238517197b2 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -502,7 +502,7 @@ const int ObjectAlignmentInBytes = 8; "If > 0, provokes an error after VM initialization; the value " \ "determines which error to provoke. See controlled_crash() " \ "in vmError.cpp.") \ - range(0, 17) \ + range(0, 18) \ \ develop(uint, TestCrashInErrorHandler, 0, \ "If > 0, provokes an error inside VM error handler (a secondary " \ diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 52275049eae..299905ff0a2 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -97,6 +97,7 @@ #include "runtime/trimNativeHeap.hpp" #include "runtime/vm_version.hpp" #include "runtime/vmOperations.hpp" +#include "sanitizers/address.hpp" #include "services/attachListener.hpp" #include "services/management.hpp" #include "services/threadIdTable.hpp" @@ -702,6 +703,10 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // No more stub generation allowed after that point. StubCodeDesc::freeze(); +#ifdef ADDRESS_SANITIZER + Asan::initialize(); +#endif + // Set flag that basic initialization has completed. Used by exceptions and various // debug stuff, that does not work until all basic classes have been initialized. set_init_completed(); diff --git a/src/hotspot/share/sanitizers/address.cpp b/src/hotspot/share/sanitizers/address.cpp new file mode 100644 index 00000000000..b050039b1b8 --- /dev/null +++ b/src/hotspot/share/sanitizers/address.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 1998, 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. + * + * 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. + * + */ + +#ifdef ADDRESS_SANITIZER + +#include "logging/log.hpp" +#include "sanitizers/address.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/vmError.hpp" + +#include +#include + +typedef void (*callback_setter_t) (void (*callback)(const char *)); +static callback_setter_t g_callback_setter = nullptr; +static const char* g_report = nullptr; + +extern "C" void asan_error_callback(const char* report_text) { + // Please keep things very short and simple here and use as little + // as possible of any hotspot infrastructure. However shaky the JVM, + // we should always at least get the ASAN report on stderr. + + // Note: this is threadsafe since ASAN synchronizes error reports + g_report = report_text; + + // First, print off the bare error to stderr + fprintf(stderr, "JVM caught ASAN Error\n"); + fprintf(stderr, "%s\n", report_text); + + // Then, let normal JVM error handling run its due course. + fatal("ASAN Error"); +} + +void Asan::initialize() { + + // For documentation of __asan_set_error_report_callback() see asan_interface.h . + g_callback_setter = (callback_setter_t) dlsym(RTLD_DEFAULT, "__asan_set_error_report_callback"); + if (g_callback_setter == nullptr) { + log_info(asan)("*** Failed to install JVM callback for ASAN. ASAN errors will not generate hs-err files. ***"); + return; + } + + g_callback_setter(asan_error_callback); + log_info(asan)("JVM callback for ASAN errors successfully installed"); + + // Controlling core dump behavior: + // + // In hotspot, CreateCoredumpOnCrash decides whether to create a core dump (on Posix, whether to + // end the process with abort(3) or exit(3)). + // + // Core generation in the default ASAN reporter is controlled by two options: + // - "abort_on_error=0" (default) - end with exit(3), "abort_on_error=1" end with abort(3) + // - "disable_coredump=1" (default) disables cores by imposing a near-zero core soft limit. + // By default both options are set to prevent cores. That default makes sense since ASAN cores + // can get very large (due to the shadow map) and very numerous (ASAN is typically ran for + // large-scale integration tests, not targeted micro-tests). + // + // In hotspot ASAN builds, we replace the default ASAN reporter. The soft limit imposed by + // "disable_coredump=1" is still in effect. But "abort_on_error" is not honored. Since we'd + // like to exhibit exactly the same behavior as the standard ASAN error reporter, we disable + // core files if ASAN would inhibit them (we just switch off CreateCoredumpOnCrash). + // + // Thus: + // abort_on_error disable_coredump core file? + // 0 0 No (enforced by ergo-setting CreateCoredumpOnCrash=0) + // (*) 0 1 No (enforced by ASAN-imposed soft limit) + // 1 0 Yes, unless -XX:-CreateCoredumpOnCrash set on command line + // 1 1 No (enforced by ASAN-imposed soft limit) + // (*) is the default if no ASAN options are specified. + + const char* const asan_options = getenv("ASAN_OPTIONS"); + const bool asan_inhibits_cores = (asan_options == nullptr) || + (::strstr(asan_options, "abort_on_error=1") == nullptr) || + (::strstr(asan_options, "disable_coredump=0") == nullptr); + if (asan_inhibits_cores) { + if (CreateCoredumpOnCrash) { + log_info(asan)("CreateCoredumpOnCrash overruled by%s asan options. Core generation disabled.", + asan_options != nullptr ? "" : " default setting for"); + log_info(asan)("Use 'ASAN_OPTIONS=abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1' " + "to enable core generation."); + } + FLAG_SET_ERGO(CreateCoredumpOnCrash, false); + } +} + +bool Asan::had_error() { + return g_report != nullptr; +} + +void Asan::report(outputStream* st) { + if (had_error()) { + // Use raw print here to avoid truncation. + st->print_raw(g_report); + st->cr(); + st->cr(); + } +} + +#endif // ADDRESS_SANITIZER diff --git a/src/hotspot/share/sanitizers/address.hpp b/src/hotspot/share/sanitizers/address.hpp index 5186053f1c9..109aa59dac0 100644 --- a/src/hotspot/share/sanitizers/address.hpp +++ b/src/hotspot/share/sanitizers/address.hpp @@ -26,6 +26,8 @@ #define SHARE_SANITIZERS_ADDRESS_HPP #ifdef ADDRESS_SANITIZER +#include "memory/allStatic.hpp" + #include #endif @@ -74,4 +76,14 @@ } while (false) #endif +class outputStream; + +#ifdef ADDRESS_SANITIZER +struct Asan : public AllStatic { + static void initialize(); + static bool had_error(); + static void report(outputStream* st); +}; +#endif + #endif // SHARE_SANITIZERS_ADDRESS_HPP diff --git a/src/hotspot/share/utilities/vmError.cpp b/src/hotspot/share/utilities/vmError.cpp index 0fbd8ed4259..e0cbb60c744 100644 --- a/src/hotspot/share/utilities/vmError.cpp +++ b/src/hotspot/share/utilities/vmError.cpp @@ -60,6 +60,7 @@ #include "runtime/vm_version.hpp" #include "runtime/vmOperations.hpp" #include "runtime/vmThread.hpp" +#include "sanitizers/address.hpp" #include "sanitizers/ub.hpp" #include "utilities/debug.hpp" #include "utilities/decoder.hpp" @@ -910,7 +911,16 @@ void VMError::report(outputStream* st, bool _verbose) { STEP_IF("printing date and time", _verbose) os::print_date_and_time(st, buf, sizeof(buf)); - STEP_IF("printing thread", _verbose) +#ifdef ADDRESS_SANITIZER + STEP_IF("printing ASAN error information", _verbose && Asan::had_error()) + st->cr(); + st->print_cr("------------------ A S A N ----------------"); + st->cr(); + Asan::report(st); + st->cr(); +#endif // ADDRESS_SANITIZER + + STEP_IF("printing thread", _verbose) st->cr(); st->print_cr("--------------- T H R E A D ---------------"); st->cr(); @@ -2186,6 +2196,14 @@ void VMError::controlled_crash(int how) { fatal("Force crash with a nested ThreadsListHandle."); } } + case 18: { + // Trigger an error that should cause ASAN to report a double free or use-after-free. + // Please note that this is not 100% bullet-proof since it assumes that this block + // is not immediately repurposed by some other thread after free. + void* const p = os::malloc(4096, mtTest); + os::free(p); + os::free(p); + } default: // If another number is given, give a generic crash. fatal("Crashing with number %d", how); diff --git a/test/hotspot/jtreg/runtime/ErrorHandling/AsanReportTest.java b/test/hotspot/jtreg/runtime/ErrorHandling/AsanReportTest.java new file mode 100644 index 00000000000..211df563e6c --- /dev/null +++ b/test/hotspot/jtreg/runtime/ErrorHandling/AsanReportTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2025, IBM Corporation. All rights reserved. + * 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. + * + * 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. + */ + +/* + * @test + * @summary Test that we get ASAN-reports and hs-err files on ASAN error + * @library /test/lib + * @requires vm.asan + * @requires vm.flagless + * @requires vm.debug == true & os.family == "linux" + * @modules java.base/jdk.internal.misc + * java.management + * @run driver AsanReportTest + */ + +// Note: this test can only run on debug since it relies on VMError::controlled_crash() which +// only exists in debug builds. +import java.io.File; +import java.util.regex.Pattern; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class AsanReportTest { + + private static void do_test() throws Exception { + + ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder( + "-Xmx64M", "-XX:CompressedClassSpaceSize=64M", + // Default ASAN options should prevent core file generation, which should overrule +CreateCoredumpOnCrash. + // We test below. + "-XX:+CreateCoredumpOnCrash", + "-Xlog:asan", + // Switch off NMT since it can alter the error ASAN sees; we want the pure double free error + "-XX:NativeMemoryTracking=off", + // Causes double-free in controlled_crash + "-XX:ErrorHandlerTest=18", + "-version"); + + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + + output.shouldNotHaveExitValue(0); + + // ASAN error should appear on stderr + output.shouldContain("CreateCoredumpOnCrash overruled"); + output.shouldContain("JVM caught ASAN Error"); + output.shouldMatch("AddressSanitizer.*double-free"); + output.shouldMatch("# +A fatal error has been detected by the Java Runtime Environment"); + output.shouldMatch("# +fatal error: ASAN"); + output.shouldNotContain("Aborted (core dumped)"); + + File hs_err_file = HsErrFileUtils.openHsErrFileFromOutput(output); + Pattern[] pat = new Pattern[] { + Pattern.compile(".*A S A N.*"), + Pattern.compile(".*AddressSanitizer.*double-free.*"), + Pattern.compile(".*(crash_with_segfault|controlled_crash).*") + }; + HsErrFileUtils.checkHsErrFileContent(hs_err_file, pat, false); + } + + public static void main(String[] args) throws Exception { + do_test(); + } + +} + From 6e898e21130259839e8060245c70182f70d8ee12 Mon Sep 17 00:00:00 2001 From: Patricio Chilano Mateo Date: Thu, 23 Oct 2025 15:46:34 +0000 Subject: [PATCH 271/561] 8369944: Notification can be lost due to interrupt in Object.wait Reviewed-by: dholmes, fbredberg --- src/hotspot/share/runtime/objectMonitor.cpp | 17 ++++++----------- src/hotspot/share/runtime/objectMonitor.hpp | 4 +--- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index 142324fec7a..f6d569b1b7a 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -1863,10 +1863,10 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { // could be profitable. // // TODO-FIXME: change the following logic to a loop of the form - // while (!timeout && !interrupted && _notified == 0) park() + // while (!timeout && !interrupted && node.TState == TS_WAIT) park() int ret = OS_OK; - int WasNotified = 0; + bool was_notified = false; // Need to check interrupt state whilst still _thread_in_vm bool interrupted = interruptible && current->is_interrupted(false); @@ -1882,7 +1882,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { ThreadBlockInVMPreprocess tbivs(current, csos, true /* allow_suspend */); if (interrupted || HAS_PENDING_EXCEPTION) { // Intentionally empty - } else if (!node._notified) { + } else if (node.TState == ObjectWaiter::TS_WAIT) { if (millis <= 0) { current->_ParkEvent->park(); } else { @@ -1910,7 +1910,6 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { Thread::SpinAcquire(&_wait_set_lock); if (node.TState == ObjectWaiter::TS_WAIT) { dequeue_specific_waiter(&node); // unlink from wait_set - assert(!node._notified, "invariant"); node.TState = ObjectWaiter::TS_RUN; } Thread::SpinRelease(&_wait_set_lock); @@ -1923,7 +1922,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { guarantee(node.TState != ObjectWaiter::TS_WAIT, "invariant"); OrderAccess::loadload(); if (has_successor(current)) clear_successor(); - WasNotified = node._notified; + was_notified = node.TState == ObjectWaiter::TS_ENTER; // Reentry phase -- reacquire the monitor. // re-enter contended monitor after object.wait(). @@ -1936,7 +1935,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { if (JvmtiExport::should_post_monitor_waited()) { JvmtiExport::post_monitor_waited(current, this, ret == OS_TIMEOUT); - if (node._notified && has_successor(current)) { + if (was_notified && has_successor(current)) { // In this part of the monitor wait-notify-reenter protocol it // is possible (and normal) for another thread to do a fastpath // monitor enter-exit while this thread is still trying to get @@ -2003,7 +2002,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { } // check if the notification happened - if (!WasNotified) { + if (!was_notified) { // no, it could be timeout or Thread.interrupt() or both // check for interrupt event, otherwise it is timeout if (interruptible && current->is_interrupted(true) && !HAS_PENDING_EXCEPTION) { @@ -2026,7 +2025,6 @@ bool ObjectMonitor::notify_internal(JavaThread* current) { ObjectWaiter* iterator = dequeue_waiter(); if (iterator != nullptr) { guarantee(iterator->TState == ObjectWaiter::TS_WAIT, "invariant"); - guarantee(!iterator->_notified, "invariant"); if (iterator->is_vthread()) { oop vthread = iterator->vthread(); @@ -2048,7 +2046,6 @@ bool ObjectMonitor::notify_internal(JavaThread* current) { inc_unmounted_vthreads(); } - iterator->_notified = true; iterator->_notifier_tid = JFR_THREAD_ID(current); did_notify = true; add_to_entry_list(current, iterator); @@ -2210,7 +2207,6 @@ bool ObjectMonitor::vthread_wait_reenter(JavaThread* current, ObjectWaiter* node Thread::SpinAcquire(&_wait_set_lock); if (node->TState == ObjectWaiter::TS_WAIT) { dequeue_specific_waiter(node); // unlink from wait_set - assert(!node->_notified, "invariant"); node->TState = ObjectWaiter::TS_RUN; } Thread::SpinRelease(&_wait_set_lock); @@ -2516,7 +2512,6 @@ ObjectWaiter::ObjectWaiter(JavaThread* current) { _notifier_tid = 0; _recursions = 0; TState = TS_RUN; - _notified = false; _is_wait = false; _at_reenter = false; _interrupted = false; diff --git a/src/hotspot/share/runtime/objectMonitor.hpp b/src/hotspot/share/runtime/objectMonitor.hpp index 058e0317ec1..77919d99955 100644 --- a/src/hotspot/share/runtime/objectMonitor.hpp +++ b/src/hotspot/share/runtime/objectMonitor.hpp @@ -52,7 +52,6 @@ class ObjectWaiter : public CHeapObj { uint64_t _notifier_tid; int _recursions; volatile TStates TState; - volatile bool _notified; bool _is_wait; bool _at_reenter; bool _interrupted; @@ -67,9 +66,8 @@ class ObjectWaiter : public CHeapObj { uint8_t state() const { return TState; } ObjectMonitor* monitor() const { return _monitor; } bool is_wait() const { return _is_wait; } - bool notified() const { return _notified; } bool at_reenter() const { return _at_reenter; } - bool at_monitorenter() const { return !_is_wait || _at_reenter || _notified; } + bool at_monitorenter() const { return !_is_wait || TState != TS_WAIT; } oop vthread() const; void wait_reenter_begin(ObjectMonitor *mon); void wait_reenter_end(ObjectMonitor *mon); From 869112ef65ec79c8a746a7dc51fa7dbd2384f035 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Thu, 23 Oct 2025 16:24:48 +0000 Subject: [PATCH 272/561] 8026776: Broken API names in API doc Reviewed-by: aivanov, tr, ayang, prr --- .../share/classes/java/awt/GridBagConstraints.java | 4 ++-- .../image/renderable/ContextualRenderedImageFactory.java | 4 ++-- .../java/awt/image/renderable/RenderableImageOp.java | 4 ++-- .../share/classes/javax/swing/ScrollPaneLayout.java | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/java.desktop/share/classes/java/awt/GridBagConstraints.java b/src/java.desktop/share/classes/java/awt/GridBagConstraints.java index 30f8bc4bf50..0008f5ac780 100644 --- a/src/java.desktop/share/classes/java/awt/GridBagConstraints.java +++ b/src/java.desktop/share/classes/java/awt/GridBagConstraints.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -575,7 +575,7 @@ public class GridBagConstraints implements Cloneable, java.io.Serializable { private static final long serialVersionUID = -1000070633030801713L; /** - * Creates a {@code GridBagConstraint} object with + * Creates a {@code GridBagConstraints} object with * all of its fields set to their default value. */ public GridBagConstraints () { diff --git a/src/java.desktop/share/classes/java/awt/image/renderable/ContextualRenderedImageFactory.java b/src/java.desktop/share/classes/java/awt/image/renderable/ContextualRenderedImageFactory.java index 94a2aa14bf5..8df3895a021 100644 --- a/src/java.desktop/share/classes/java/awt/image/renderable/ContextualRenderedImageFactory.java +++ b/src/java.desktop/share/classes/java/awt/image/renderable/ContextualRenderedImageFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -41,7 +41,7 @@ import java.awt.image.RenderedImage; * ContextualRenderedImageFactory provides an interface for the * functionality that may differ between instances of * RenderableImageOp. Thus different operations on RenderableImages - * may be performed by a single class such as RenderedImageOp through + * may be performed by a single class such as RenderableImageOp through * the use of multiple instances of ContextualRenderedImageFactory. * The name ContextualRenderedImageFactory is commonly shortened to * "CRIF." diff --git a/src/java.desktop/share/classes/java/awt/image/renderable/RenderableImageOp.java b/src/java.desktop/share/classes/java/awt/image/renderable/RenderableImageOp.java index 19bf3b39323..f2f0d458ba1 100644 --- a/src/java.desktop/share/classes/java/awt/image/renderable/RenderableImageOp.java +++ b/src/java.desktop/share/classes/java/awt/image/renderable/RenderableImageOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -58,7 +58,7 @@ public class RenderableImageOp implements RenderableImage { /** - * Constructs a RenderedImageOp given a + * Constructs a {@code RenderableImageOp} given a * ContextualRenderedImageFactory object, and * a ParameterBlock containing RenderableImage sources and other * parameters. Any RenderedImage sources referenced by the diff --git a/src/java.desktop/share/classes/javax/swing/ScrollPaneLayout.java b/src/java.desktop/share/classes/javax/swing/ScrollPaneLayout.java index 0b8d8576f14..50cb25fe4f8 100644 --- a/src/java.desktop/share/classes/javax/swing/ScrollPaneLayout.java +++ b/src/java.desktop/share/classes/javax/swing/ScrollPaneLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -38,8 +38,8 @@ import java.io.Serializable; /** - * The layout manager used by JScrollPane. - * JScrollPaneLayout is + * The layout manager used by {@code JScrollPane}. + * {@code ScrollPaneLayout} is * responsible for nine components: a viewport, two scrollbars, * a row header, a column header, and four "corner" components. *

        From a0e0b2d3658e6b9f9d228b410e1621f5281074f6 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Thu, 23 Oct 2025 17:02:44 +0000 Subject: [PATCH 273/561] 8370057: Correct scale handling of BigDecimal.sqrt Reviewed-by: rgiulietti --- src/java.base/share/classes/java/math/BigDecimal.java | 6 +++--- test/jdk/java/math/BigDecimal/SquareRootTests.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/java/math/BigDecimal.java b/src/java.base/share/classes/java/math/BigDecimal.java index 199b6648cdd..14d81d30c3d 100644 --- a/src/java.base/share/classes/java/math/BigDecimal.java +++ b/src/java.base/share/classes/java/math/BigDecimal.java @@ -154,7 +154,7 @@ import jdk.internal.vm.annotation.Stable; * Subtractmax(minuend.scale(), subtrahend.scale()) * Multiplymultiplier.scale() + multiplicand.scale() * Dividedividend.scale() - divisor.scale() - * Square rootradicand.scale()/2 + * Square rootceil(radicand.scale()/2.0) * * * @@ -2113,7 +2113,7 @@ public class BigDecimal extends Number implements Comparable { * with rounding according to the context settings. * *

        The preferred scale of the returned result is equal to - * {@code this.scale()/2}. The value of the returned result is + * {@code Math.ceilDiv(this.scale(), 2)}. The value of the returned result is * always within one ulp of the exact decimal value for the * precision in question. If the rounding mode is {@link * RoundingMode#HALF_UP HALF_UP}, {@link RoundingMode#HALF_DOWN @@ -2174,7 +2174,7 @@ public class BigDecimal extends Number implements Comparable { // The code below favors relative simplicity over checking // for special cases that could run faster. - final int preferredScale = this.scale/2; + final int preferredScale = Math.ceilDiv(this.scale, 2); BigDecimal result; if (mc.roundingMode == RoundingMode.UNNECESSARY || mc.precision == 0) { // Exact result requested diff --git a/test/jdk/java/math/BigDecimal/SquareRootTests.java b/test/jdk/java/math/BigDecimal/SquareRootTests.java index 7d9fce4caa0..1a685c8483a 100644 --- a/test/jdk/java/math/BigDecimal/SquareRootTests.java +++ b/test/jdk/java/math/BigDecimal/SquareRootTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -348,7 +348,7 @@ public class SquareRootTests { for (int scale = 0; scale <= 4; scale++) { BigDecimal scaledSquare = square.setScale(scale, RoundingMode.UNNECESSARY); - int expectedScale = scale/2; + int expectedScale = Math.ceilDiv(scale, 2); for (int precision = 0; precision <= 5; precision++) { for (RoundingMode rm : RoundingMode.values()) { MathContext mc = new MathContext(precision, rm); @@ -582,7 +582,8 @@ public class SquareRootTests { // The code below favors relative simplicity over checking // for special cases that could run faster. - int preferredScale = bd.scale()/2; + int preferredScale = Math.ceilDiv(bd.scale(), 2); + BigDecimal zeroWithFinalPreferredScale = BigDecimal.valueOf(0L, preferredScale); From b0721e28591f2ee19fd5cb6581747df0b1efed48 Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Thu, 23 Oct 2025 17:08:53 +0000 Subject: [PATCH 274/561] 8368982: Test sun/security/tools/jarsigner/EC.java completed and timed out Reviewed-by: rhalade --- test/jdk/sun/security/tools/jarsigner/EC.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/jdk/sun/security/tools/jarsigner/EC.java b/test/jdk/sun/security/tools/jarsigner/EC.java index 848dc8bf843..1b41c48e234 100644 --- a/test/jdk/sun/security/tools/jarsigner/EC.java +++ b/test/jdk/sun/security/tools/jarsigner/EC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -26,6 +26,7 @@ * @bug 6870812 * @summary enhance security tools to use ECC algorithm * @library /test/lib + * @run main/timeout=300 EC */ import jdk.test.lib.SecurityTools; From b2e431a1cb22b78eca396ac1d97e6c272de72aa9 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 23 Oct 2025 19:06:47 +0000 Subject: [PATCH 275/561] 8369068: GenShen: Generations still aren't reconciled assertion failure Reviewed-by: ysr, kdnilsen --- .../shenandoahGenerationalHeuristics.cpp | 2 +- .../heuristics/shenandoahHeuristics.cpp | 7 +- .../share/gc/shenandoah/shenandoahAsserts.cpp | 27 ++-- .../share/gc/shenandoah/shenandoahAsserts.hpp | 14 +- .../gc/shenandoah/shenandoahConcurrentGC.cpp | 45 ++++--- .../gc/shenandoah/shenandoahConcurrentGC.hpp | 1 - .../shenandoah/shenandoahConcurrentMark.cpp | 14 +- .../gc/shenandoah/shenandoahDegeneratedGC.cpp | 23 ++-- .../gc/shenandoah/shenandoahDegeneratedGC.hpp | 3 +- .../share/gc/shenandoah/shenandoahFullGC.cpp | 79 +++++------ .../share/gc/shenandoah/shenandoahFullGC.hpp | 2 +- .../share/gc/shenandoah/shenandoahGC.hpp | 7 + .../gc/shenandoah/shenandoahGeneration.hpp | 2 +- .../shenandoahGenerationalEvacuationTask.cpp | 8 +- .../shenandoahGenerationalEvacuationTask.hpp | 2 + .../shenandoahGenerationalFullGC.cpp | 3 +- .../shenandoah/shenandoahGenerationalHeap.cpp | 38 +++--- .../shenandoah/shenandoahGenerationalHeap.hpp | 11 +- .../share/gc/shenandoah/shenandoahHeap.cpp | 39 ++---- .../share/gc/shenandoah/shenandoahHeap.hpp | 35 ++--- .../gc/shenandoah/shenandoahHeapRegion.cpp | 12 +- .../share/gc/shenandoah/shenandoahMark.cpp | 42 +++--- .../share/gc/shenandoah/shenandoahMark.hpp | 13 +- .../share/gc/shenandoah/shenandoahOldGC.cpp | 2 +- .../shenandoahReferenceProcessor.cpp | 26 ++-- .../gc/shenandoah/shenandoahRootVerifier.cpp | 12 +- .../gc/shenandoah/shenandoahRootVerifier.hpp | 6 +- .../share/gc/shenandoah/shenandoahSTWMark.cpp | 11 +- .../gc/shenandoah/shenandoahVMOperations.cpp | 36 ++++- .../gc/shenandoah/shenandoahVMOperations.hpp | 86 +++++------- .../gc/shenandoah/shenandoahVerifier.cpp | 127 ++++++++---------- .../gc/shenandoah/shenandoahVerifier.hpp | 27 ++-- 32 files changed, 361 insertions(+), 401 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp index c7067b2e5ab..a2cccec8423 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp @@ -127,7 +127,7 @@ void ShenandoahGenerationalHeuristics::choose_collection_set(ShenandoahCollectio // Reclaim humongous regions here, and count them as the immediate garbage #ifdef ASSERT bool reg_live = region->has_live(); - bool bm_live = heap->active_generation()->complete_marking_context()->is_marked(cast_to_oop(region->bottom())); + bool bm_live = _generation->complete_marking_context()->is_marked(cast_to_oop(region->bottom())); assert(reg_live == bm_live, "Humongous liveness and marks should agree. Region live: %s; Bitmap live: %s; Region Live Words: %zu", BOOL_TO_STR(reg_live), BOOL_TO_STR(bm_live), region->get_live_data_words()); diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahHeuristics.cpp index c8a0c3dc518..478c5696188 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahHeuristics.cpp @@ -73,10 +73,11 @@ ShenandoahHeuristics::~ShenandoahHeuristics() { } void ShenandoahHeuristics::choose_collection_set(ShenandoahCollectionSet* collection_set) { - assert(collection_set->is_empty(), "Must be empty"); - ShenandoahHeap* heap = ShenandoahHeap::heap(); + assert(collection_set->is_empty(), "Must be empty"); + assert(!heap->mode()->is_generational(), "Wrong heuristic for heap mode"); + // Check all pinned regions have updated status before choosing the collection set. heap->assert_pinned_region_status(); @@ -120,7 +121,7 @@ void ShenandoahHeuristics::choose_collection_set(ShenandoahCollectionSet* collec // Reclaim humongous regions here, and count them as the immediate garbage #ifdef ASSERT bool reg_live = region->has_live(); - bool bm_live = heap->gc_generation()->complete_marking_context()->is_marked(cast_to_oop(region->bottom())); + bool bm_live = heap->global_generation()->complete_marking_context()->is_marked(cast_to_oop(region->bottom())); assert(reg_live == bm_live, "Humongous liveness and marks should agree. Region live: %s; Bitmap live: %s; Region Live Words: %zu", BOOL_TO_STR(reg_live), BOOL_TO_STR(bm_live), region->get_live_data_words()); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp index 3d9fa10b0fc..baeaffb9c7b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.cpp @@ -425,6 +425,16 @@ void ShenandoahAsserts::assert_marked_strong(void *interior_loc, oop obj, const } } +void ShenandoahAsserts::assert_mark_complete(HeapWord* obj, const char* file, int line) { + const ShenandoahHeap* heap = ShenandoahHeap::heap(); + const ShenandoahHeapRegion* region = heap->heap_region_containing(obj); + const ShenandoahGeneration* generation = heap->generation_for(region->affiliation()); + if (!generation->is_mark_complete()) { + ShenandoahMessageBuffer msg("Marking should be complete for object " PTR_FORMAT " in the %s generation", p2i(obj), generation->name()); + report_vm_error(file, line, msg.buffer()); + } +} + void ShenandoahAsserts::assert_in_cset(void* interior_loc, oop obj, const char* file, int line) { assert_correct(interior_loc, obj, file, line); @@ -542,23 +552,6 @@ void ShenandoahAsserts::assert_control_or_vm_thread_at_safepoint(bool at_safepoi report_vm_error(file, line, msg.buffer()); } -void ShenandoahAsserts::assert_generations_reconciled(const char* file, int line) { - if (!ShenandoahSafepoint::is_at_shenandoah_safepoint()) { - // Only shenandoah safepoint operations participate in the active/gc generation scheme - return; - } - - ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahGeneration* ggen = heap->gc_generation(); - ShenandoahGeneration* agen = heap->active_generation(); - if (agen == ggen) { - return; - } - - ShenandoahMessageBuffer msg("Active(%s) & GC(%s) Generations aren't reconciled", agen->name(), ggen->name()); - report_vm_error(file, line, msg.buffer()); -} - bool ShenandoahAsserts::extract_klass_safely(oop obj, narrowKlass& nk, const Klass*& k) { nk = 0; k = nullptr; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp index e31ef7c99aa..d0fc3e213c8 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahAsserts.hpp @@ -65,6 +65,9 @@ public: static void assert_marked(void* interior_loc, oop obj, const char* file, int line); static void assert_marked_weak(void* interior_loc, oop obj, const char* file, int line); static void assert_marked_strong(void* interior_loc, oop obj, const char* file, int line); + + // Assert that marking is complete for the generation where this obj resides + static void assert_mark_complete(HeapWord* obj, const char* file, int line); static void assert_in_cset(void* interior_loc, oop obj, const char* file, int line); static void assert_not_in_cset(void* interior_loc, oop obj, const char* file, int line); static void assert_not_in_cset_loc(void* interior_loc, const char* file, int line); @@ -76,7 +79,6 @@ public: static void assert_heaplocked_or_safepoint(const char* file, int line); static void assert_control_or_vm_thread_at_safepoint(bool at_safepoint, const char* file, int line); static void assert_generational(const char* file, int line); - static void assert_generations_reconciled(const char* file, int line); // Given a possibly invalid oop, extract narrowKlass (if UCCP) and Klass* // from it safely. @@ -133,6 +135,9 @@ public: #define shenandoah_assert_marked_strong(interior_loc, obj) \ ShenandoahAsserts::assert_marked_strong(interior_loc, obj, __FILE__, __LINE__) +#define shenandoah_assert_mark_complete(obj) \ + ShenandoahAsserts::assert_mark_complete(obj, __FILE__, __LINE__) + #define shenandoah_assert_in_cset_if(interior_loc, obj, condition) \ if (condition) ShenandoahAsserts::assert_in_cset(interior_loc, obj, __FILE__, __LINE__) #define shenandoah_assert_in_cset_except(interior_loc, obj, exception) \ @@ -184,10 +189,6 @@ public: #define shenandoah_assert_generational() \ ShenandoahAsserts::assert_generational(__FILE__, __LINE__) -// Some limited sanity checking of the _gc_generation and _active_generation fields of ShenandoahHeap -#define shenandoah_assert_generations_reconciled() \ - ShenandoahAsserts::assert_generations_reconciled(__FILE__, __LINE__) - #else #define shenandoah_assert_in_heap_bounds(interior_loc, obj) #define shenandoah_assert_in_heap_bounds_or_null(interior_loc, obj) @@ -217,6 +218,8 @@ public: #define shenandoah_assert_marked_strong_except(interior_loc, obj, exception) #define shenandoah_assert_marked_strong(interior_loc, obj) +#define shenandoah_assert_mark_complete(obj) + #define shenandoah_assert_in_cset_if(interior_loc, obj, condition) #define shenandoah_assert_in_cset_except(interior_loc, obj, exception) #define shenandoah_assert_in_cset(interior_loc, obj) @@ -241,7 +244,6 @@ public: #define shenandoah_assert_control_or_vm_thread() #define shenandoah_assert_control_or_vm_thread_at_safepoint() #define shenandoah_assert_generational() -#define shenandoah_assert_generations_reconciled() #endif diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index 456b9fe6d3c..9613422496a 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -91,8 +91,8 @@ public: }; ShenandoahConcurrentGC::ShenandoahConcurrentGC(ShenandoahGeneration* generation, bool do_old_gc_bootstrap) : + ShenandoahGC(generation), _mark(generation), - _generation(generation), _degen_point(ShenandoahDegenPoint::_degenerated_unset), _abbreviated(false), _do_old_gc_bootstrap(do_old_gc_bootstrap) { @@ -576,7 +576,7 @@ void ShenandoahConcurrentGC::entry_promote_in_place() const { ShenandoahGCWorkerPhase worker_phase(ShenandoahPhaseTimings::promote_in_place); EventMark em("%s", "Promote in place"); - ShenandoahGenerationalHeap::heap()->promote_regions_in_place(true); + ShenandoahGenerationalHeap::heap()->promote_regions_in_place(_generation, true); } void ShenandoahConcurrentGC::entry_update_thread_roots() { @@ -706,7 +706,7 @@ void ShenandoahConcurrentGC::op_init_mark() { if (ShenandoahVerify) { ShenandoahTimingsTracker v(ShenandoahPhaseTimings::init_mark_verify); - heap->verifier()->verify_before_concmark(); + heap->verifier()->verify_before_concmark(_generation); } if (VerifyBeforeGC) { @@ -763,7 +763,7 @@ void ShenandoahConcurrentGC::op_final_mark() { assert(!heap->has_forwarded_objects(), "No forwarded objects on this path"); if (ShenandoahVerify) { - heap->verifier()->verify_roots_no_forwarded(); + heap->verifier()->verify_roots_no_forwarded(_generation); } if (!heap->cancelled_gc()) { @@ -791,7 +791,7 @@ void ShenandoahConcurrentGC::op_final_mark() { if (ShenandoahVerify) { ShenandoahTimingsTracker v(ShenandoahPhaseTimings::final_mark_verify); - heap->verifier()->verify_before_evacuation(); + heap->verifier()->verify_before_evacuation(_generation); } heap->set_evacuation_in_progress(true); @@ -806,9 +806,9 @@ void ShenandoahConcurrentGC::op_final_mark() { if (ShenandoahVerify) { ShenandoahTimingsTracker v(ShenandoahPhaseTimings::final_mark_verify); if (has_in_place_promotions(heap)) { - heap->verifier()->verify_after_concmark_with_promotions(); + heap->verifier()->verify_after_concmark_with_promotions(_generation); } else { - heap->verifier()->verify_after_concmark(); + heap->verifier()->verify_after_concmark(_generation); } } } @@ -877,18 +877,20 @@ void ShenandoahConcurrentGC::op_weak_refs() { class ShenandoahEvacUpdateCleanupOopStorageRootsClosure : public BasicOopIterateClosure { private: ShenandoahHeap* const _heap; + ShenandoahGeneration* const _generation; ShenandoahMarkingContext* const _mark_context; bool _evac_in_progress; Thread* const _thread; public: - ShenandoahEvacUpdateCleanupOopStorageRootsClosure(); + explicit ShenandoahEvacUpdateCleanupOopStorageRootsClosure(ShenandoahGeneration* generation); void do_oop(oop* p); void do_oop(narrowOop* p); }; -ShenandoahEvacUpdateCleanupOopStorageRootsClosure::ShenandoahEvacUpdateCleanupOopStorageRootsClosure() : +ShenandoahEvacUpdateCleanupOopStorageRootsClosure::ShenandoahEvacUpdateCleanupOopStorageRootsClosure(ShenandoahGeneration* generation) : _heap(ShenandoahHeap::heap()), + _generation(generation), _mark_context(ShenandoahHeap::heap()->marking_context()), _evac_in_progress(ShenandoahHeap::heap()->is_evacuation_in_progress()), _thread(Thread::current()) { @@ -898,8 +900,7 @@ void ShenandoahEvacUpdateCleanupOopStorageRootsClosure::do_oop(oop* p) { const oop obj = RawAccess<>::oop_load(p); if (!CompressedOops::is_null(obj)) { if (!_mark_context->is_marked(obj)) { - shenandoah_assert_generations_reconciled(); - if (_heap->is_in_active_generation(obj)) { + if (_generation->contains(obj)) { // Note: The obj is dead here. Do not touch it, just clear. ShenandoahHeap::atomic_clear_oop(p, obj); } @@ -942,14 +943,16 @@ private: ShenandoahClassLoaderDataRoots _cld_roots; ShenandoahConcurrentNMethodIterator _nmethod_itr; + ShenandoahGeneration* _generation; ShenandoahPhaseTimings::Phase _phase; public: - ShenandoahConcurrentWeakRootsEvacUpdateTask(ShenandoahPhaseTimings::Phase phase) : + ShenandoahConcurrentWeakRootsEvacUpdateTask(ShenandoahGeneration* generation, ShenandoahPhaseTimings::Phase phase) : WorkerTask("Shenandoah Evacuate/Update Concurrent Weak Roots"), _vm_roots(phase), _cld_roots(phase, ShenandoahHeap::heap()->workers()->active_workers(), false /*heap iteration*/), _nmethod_itr(ShenandoahCodeRoots::table()), + _generation(generation), _phase(phase) {} ~ShenandoahConcurrentWeakRootsEvacUpdateTask() { @@ -957,14 +960,14 @@ public: _vm_roots.report_num_dead(); } - void work(uint worker_id) { + void work(uint worker_id) override { ShenandoahConcurrentWorkerSession worker_session(worker_id); ShenandoahSuspendibleThreadSetJoiner sts_join; { ShenandoahEvacOOMScope oom; // jni_roots and weak_roots are OopStorage backed roots, concurrent iteration // may race against OopStorage::release() calls. - ShenandoahEvacUpdateCleanupOopStorageRootsClosure cl; + ShenandoahEvacUpdateCleanupOopStorageRootsClosure cl(_generation); _vm_roots.oops_do(&cl, worker_id); } @@ -999,7 +1002,7 @@ void ShenandoahConcurrentGC::op_weak_roots() { // Concurrent weak root processing ShenandoahTimingsTracker t(ShenandoahPhaseTimings::conc_weak_roots_work); ShenandoahGCWorkerPhase worker_phase(ShenandoahPhaseTimings::conc_weak_roots_work); - ShenandoahConcurrentWeakRootsEvacUpdateTask task(ShenandoahPhaseTimings::conc_weak_roots_work); + ShenandoahConcurrentWeakRootsEvacUpdateTask task(_generation, ShenandoahPhaseTimings::conc_weak_roots_work); heap->workers()->run_task(&task); } @@ -1105,19 +1108,19 @@ void ShenandoahConcurrentGC::op_cleanup_early() { } void ShenandoahConcurrentGC::op_evacuate() { - ShenandoahHeap::heap()->evacuate_collection_set(true /*concurrent*/); + ShenandoahHeap::heap()->evacuate_collection_set(_generation, true /*concurrent*/); } void ShenandoahConcurrentGC::op_init_update_refs() { - ShenandoahHeap* const heap = ShenandoahHeap::heap(); if (ShenandoahVerify) { + ShenandoahHeap* const heap = ShenandoahHeap::heap(); ShenandoahTimingsTracker v(ShenandoahPhaseTimings::init_update_refs_verify); - heap->verifier()->verify_before_update_refs(); + heap->verifier()->verify_before_update_refs(_generation); } } void ShenandoahConcurrentGC::op_update_refs() { - ShenandoahHeap::heap()->update_heap_references(true /*concurrent*/); + ShenandoahHeap::heap()->update_heap_references(_generation, true /*concurrent*/); } class ShenandoahUpdateThreadHandshakeClosure : public HandshakeClosure { @@ -1163,7 +1166,7 @@ void ShenandoahConcurrentGC::op_final_update_refs() { // Has to be done before cset is clear if (ShenandoahVerify) { - heap->verifier()->verify_roots_in_to_space(); + heap->verifier()->verify_roots_in_to_space(_generation); } // If we are running in generational mode and this is an aging cycle, this will also age active @@ -1198,7 +1201,7 @@ void ShenandoahConcurrentGC::op_final_update_refs() { if (ShenandoahVerify) { ShenandoahTimingsTracker v(ShenandoahPhaseTimings::final_update_refs_verify); - heap->verifier()->verify_after_update_refs(); + heap->verifier()->verify_after_update_refs(_generation); } if (VerifyAfterGC) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.hpp index d81c49363a2..54d43416fdb 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.hpp @@ -47,7 +47,6 @@ class ShenandoahConcurrentGC : public ShenandoahGC { protected: ShenandoahConcurrentMark _mark; - ShenandoahGeneration* const _generation; private: ShenandoahDegenPoint _degen_point; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp index 005d6c42f8c..7a195f64cbd 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp @@ -56,18 +56,11 @@ public: } void work(uint worker_id) { - ShenandoahHeap* heap = ShenandoahHeap::heap(); ShenandoahConcurrentWorkerSession worker_session(worker_id); ShenandoahWorkerTimingsTracker timer(ShenandoahPhaseTimings::conc_mark, ShenandoahPhaseTimings::ParallelMark, worker_id, true); ShenandoahSuspendibleThreadSetJoiner stsj; - // Do not use active_generation() : we must use the gc_generation() set by - // ShenandoahGCScope on the ControllerThread's stack; no safepoint may - // intervene to update active_generation, so we can't - // shenandoah_assert_generations_reconciled() here. - ShenandoahReferenceProcessor* rp = heap->gc_generation()->ref_processor(); - assert(rp != nullptr, "need reference processor"); StringDedup::Requests requests; - _cm->mark_loop(worker_id, _terminator, rp, GENERATION, true /*cancellable*/, + _cm->mark_loop(worker_id, _terminator, GENERATION, true /*cancellable*/, ShenandoahStringDedup::is_enabled() ? ENQUEUE_DEDUP : NO_DEDUP, &requests); } @@ -106,9 +99,6 @@ public: ShenandoahParallelWorkerSession worker_session(worker_id); StringDedup::Requests requests; - ShenandoahReferenceProcessor* rp = heap->gc_generation()->ref_processor(); - shenandoah_assert_generations_reconciled(); - // First drain remaining SATB buffers. { ShenandoahObjToScanQueue* q = _cm->get_queue(worker_id); @@ -122,7 +112,7 @@ public: ShenandoahSATBAndRemarkThreadsClosure tc(satb_mq_set); Threads::possibly_parallel_threads_do(true /* is_par */, &tc); } - _cm->mark_loop(worker_id, _terminator, rp, GENERATION, false /*not cancellable*/, + _cm->mark_loop(worker_id, _terminator, GENERATION, false /*not cancellable*/, _dedup_string ? ENQUEUE_DEDUP : NO_DEDUP, &requests); assert(_cm->task_queues()->is_empty(), "Should be empty"); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index b918bf67b34..2b791619d2e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -46,9 +46,8 @@ #include "utilities/events.hpp" ShenandoahDegenGC::ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation) : - ShenandoahGC(), + ShenandoahGC(generation), _degen_point(degen_point), - _generation(generation), _abbreviated(false) { } @@ -260,7 +259,7 @@ void ShenandoahDegenGC::op_degenerated() { } else if (has_in_place_promotions(heap)) { // We have nothing to evacuate, but there are still regions to promote in place. ShenandoahGCPhase phase(ShenandoahPhaseTimings::degen_gc_promote_regions); - ShenandoahGenerationalHeap::heap()->promote_regions_in_place(false /* concurrent*/); + ShenandoahGenerationalHeap::heap()->promote_regions_in_place(_generation, false /* concurrent*/); } // Update collector state regardless of whether there are forwarded objects @@ -300,7 +299,7 @@ void ShenandoahDegenGC::op_degenerated() { } if (ShenandoahVerify) { - heap->verifier()->verify_after_degenerated(); + heap->verifier()->verify_after_degenerated(_generation); } if (VerifyAfterGC) { @@ -337,11 +336,11 @@ void ShenandoahDegenGC::op_finish_mark() { void ShenandoahDegenGC::op_prepare_evacuation() { ShenandoahHeap* const heap = ShenandoahHeap::heap(); if (ShenandoahVerify) { - heap->verifier()->verify_roots_no_forwarded(); + heap->verifier()->verify_roots_no_forwarded(_generation); } // STW cleanup weak roots and unload classes - heap->parallel_cleaning(false /*full gc*/); + heap->parallel_cleaning(_generation, false /*full gc*/); // Prepare regions and collection set _generation->prepare_regions_and_collection_set(false /*concurrent*/); @@ -358,7 +357,7 @@ void ShenandoahDegenGC::op_prepare_evacuation() { if (!heap->collection_set()->is_empty()) { if (ShenandoahVerify) { - heap->verifier()->verify_before_evacuation(); + heap->verifier()->verify_before_evacuation(_generation); } heap->set_evacuation_in_progress(true); @@ -366,9 +365,9 @@ void ShenandoahDegenGC::op_prepare_evacuation() { } else { if (ShenandoahVerify) { if (has_in_place_promotions(heap)) { - heap->verifier()->verify_after_concmark_with_promotions(); + heap->verifier()->verify_after_concmark_with_promotions(_generation); } else { - heap->verifier()->verify_after_concmark(); + heap->verifier()->verify_after_concmark(_generation); } } @@ -388,7 +387,7 @@ void ShenandoahDegenGC::op_cleanup_early() { void ShenandoahDegenGC::op_evacuate() { ShenandoahGCPhase phase(ShenandoahPhaseTimings::degen_gc_stw_evac); - ShenandoahHeap::heap()->evacuate_collection_set(false /* concurrent*/); + ShenandoahHeap::heap()->evacuate_collection_set(_generation, false /* concurrent*/); } void ShenandoahDegenGC::op_init_update_refs() { @@ -402,7 +401,7 @@ void ShenandoahDegenGC::op_update_refs() { ShenandoahHeap* const heap = ShenandoahHeap::heap(); ShenandoahGCPhase phase(ShenandoahPhaseTimings::degen_gc_update_refs); // Handed over from concurrent update references phase - heap->update_heap_references(false /*concurrent*/); + heap->update_heap_references(_generation, false /*concurrent*/); heap->set_update_refs_in_progress(false); heap->set_has_forwarded_objects(false); @@ -416,7 +415,7 @@ void ShenandoahDegenGC::op_update_roots() { heap->update_heap_region_states(false /*concurrent*/); if (ShenandoahVerify) { - heap->verifier()->verify_after_update_refs(); + heap->verifier()->verify_after_update_refs(_generation); } if (VerifyAfterGC) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp index 971bd67eb0d..34b9688106c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.hpp @@ -34,12 +34,11 @@ class ShenandoahDegenGC : public ShenandoahGC { friend class VM_ShenandoahDegeneratedGC; private: const ShenandoahDegenPoint _degen_point; - ShenandoahGeneration* _generation; bool _abbreviated; public: ShenandoahDegenGC(ShenandoahDegenPoint degen_point, ShenandoahGeneration* generation); - bool collect(GCCause::Cause cause); + bool collect(GCCause::Cause cause) override; private: void vmop_degenerated(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp index 2e486a23363..78218f5e403 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp @@ -68,6 +68,7 @@ #include "utilities/growableArray.hpp" ShenandoahFullGC::ShenandoahFullGC() : + ShenandoahGC(ShenandoahHeap::heap()->global_generation()), _gc_timer(ShenandoahHeap::heap()->gc_timer()), _preserved_marks(new PreservedMarksSet(true)) {} @@ -124,7 +125,7 @@ void ShenandoahFullGC::op_full(GCCause::Cause cause) { } // Regardless if progress was made, we record that we completed a "successful" full GC. - heap->global_generation()->heuristics()->record_success_full(); + _generation->heuristics()->record_success_full(); heap->shenandoah_policy()->record_success_full(); { @@ -141,7 +142,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { } if (ShenandoahVerify) { - heap->verifier()->verify_before_fullgc(); + heap->verifier()->verify_before_fullgc(_generation); } if (VerifyBeforeGC) { @@ -194,7 +195,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { } // d. Abandon reference discovery and clear all discovered references. - ShenandoahReferenceProcessor* rp = heap->global_generation()->ref_processor(); + ShenandoahReferenceProcessor* rp = _generation->ref_processor(); rp->abandon_partial_discovery(); // e. Sync pinned region status from the CP marks @@ -273,7 +274,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { heap->set_full_gc_in_progress(false); if (ShenandoahVerify) { - heap->verifier()->verify_after_fullgc(); + heap->verifier()->verify_after_fullgc(_generation); } if (VerifyAfterGC) { @@ -292,19 +293,19 @@ void ShenandoahFullGC::phase1_mark_heap() { ShenandoahHeap* heap = ShenandoahHeap::heap(); - heap->global_generation()->reset_mark_bitmap(); + _generation->reset_mark_bitmap(); assert(heap->marking_context()->is_bitmap_clear(), "sanity"); - assert(!heap->global_generation()->is_mark_complete(), "sanity"); + assert(!_generation->is_mark_complete(), "sanity"); - heap->set_unload_classes(heap->global_generation()->heuristics()->can_unload_classes()); + heap->set_unload_classes(_generation->heuristics()->can_unload_classes()); - ShenandoahReferenceProcessor* rp = heap->global_generation()->ref_processor(); + ShenandoahReferenceProcessor* rp = _generation->ref_processor(); // enable ("weak") refs discovery rp->set_soft_reference_policy(true); // forcefully purge all soft references - ShenandoahSTWMark mark(heap->global_generation(), true /*full_gc*/); + ShenandoahSTWMark mark(_generation, true /*full_gc*/); mark.mark(); - heap->parallel_cleaning(true /* full_gc */); + heap->parallel_cleaning(_generation, true /* full_gc */); if (ShenandoahHeap::heap()->mode()->is_generational()) { ShenandoahGenerationalFullGC::log_live_in_old(heap); @@ -350,10 +351,12 @@ public: return _empty_regions_pos; } - void do_object(oop p) { + void do_object(oop p) override { + shenandoah_assert_mark_complete(cast_from_oop(p)); assert(_from_region != nullptr, "must set before work"); - assert(_heap->gc_generation()->complete_marking_context()->is_marked(p), "must be marked"); - assert(!_heap->gc_generation()->complete_marking_context()->allocated_after_mark_start(p), "must be truly marked"); + assert(_heap->global_generation()->is_mark_complete(), "marking must be finished"); + assert(_heap->marking_context()->is_marked(p), "must be marked"); + assert(!_heap->marking_context()->allocated_after_mark_start(p), "must be truly marked"); size_t obj_size = p->size(); if (_compact_point + obj_size > _to_region->end()) { @@ -523,12 +526,8 @@ void ShenandoahFullGC::calculate_target_humongous_objects() { } class ShenandoahEnsureHeapActiveClosure: public ShenandoahHeapRegionClosure { -private: - ShenandoahHeap* const _heap; - public: - ShenandoahEnsureHeapActiveClosure() : _heap(ShenandoahHeap::heap()) {} - void heap_region_do(ShenandoahHeapRegion* r) { + void heap_region_do(ShenandoahHeapRegion* r) override { if (r->is_trash()) { r->try_recycle_under_lock(); } @@ -760,7 +759,6 @@ void ShenandoahFullGC::phase2_calculate_target_addresses(ShenandoahHeapRegionSet class ShenandoahAdjustPointersClosure : public MetadataVisitingOopIterateClosure { private: - ShenandoahHeap* const _heap; ShenandoahMarkingContext* const _ctx; template @@ -778,8 +776,7 @@ private: public: ShenandoahAdjustPointersClosure() : - _heap(ShenandoahHeap::heap()), - _ctx(ShenandoahHeap::heap()->gc_generation()->complete_marking_context()) {} + _ctx(ShenandoahHeap::heap()->global_generation()->complete_marking_context()) {} void do_oop(oop* p) { do_oop_work(p); } void do_oop(narrowOop* p) { do_oop_work(p); } @@ -789,15 +786,12 @@ public: class ShenandoahAdjustPointersObjectClosure : public ObjectClosure { private: - ShenandoahHeap* const _heap; ShenandoahAdjustPointersClosure _cl; public: - ShenandoahAdjustPointersObjectClosure() : - _heap(ShenandoahHeap::heap()) { - } - void do_object(oop p) { - assert(_heap->gc_generation()->complete_marking_context()->is_marked(p), "must be marked"); + void do_object(oop p) override { + assert(ShenandoahHeap::heap()->global_generation()->is_mark_complete(), "marking must be complete"); + assert(ShenandoahHeap::heap()->marking_context()->is_marked(p), "must be marked"); p->oop_iterate(&_cl); } }; @@ -813,7 +807,7 @@ public: _heap(ShenandoahHeap::heap()) { } - void work(uint worker_id) { + void work(uint worker_id) override { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahAdjustPointersObjectClosure obj_cl; ShenandoahHeapRegion* r = _regions.next(); @@ -839,7 +833,7 @@ public: _rp(rp), _preserved_marks(preserved_marks) {} - void work(uint worker_id) { + void work(uint worker_id) override { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahAdjustPointersClosure cl; _rp->roots_do(worker_id, &cl); @@ -873,15 +867,15 @@ void ShenandoahFullGC::phase3_update_references() { class ShenandoahCompactObjectsClosure : public ObjectClosure { private: - ShenandoahHeap* const _heap; - uint const _worker_id; + uint const _worker_id; public: - ShenandoahCompactObjectsClosure(uint worker_id) : - _heap(ShenandoahHeap::heap()), _worker_id(worker_id) {} + explicit ShenandoahCompactObjectsClosure(uint worker_id) : + _worker_id(worker_id) {} - void do_object(oop p) { - assert(_heap->gc_generation()->complete_marking_context()->is_marked(p), "must be marked"); + void do_object(oop p) override { + assert(ShenandoahHeap::heap()->global_generation()->is_mark_complete(), "marking must be finished"); + assert(ShenandoahHeap::heap()->marking_context()->is_marked(p), "must be marked"); size_t size = p->size(); if (FullGCForwarding::is_forwarded(p)) { HeapWord* compact_from = cast_from_oop(p); @@ -908,7 +902,7 @@ public: _worker_slices(worker_slices) { } - void work(uint worker_id) { + void work(uint worker_id) override { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahHeapRegionSetIterator slice(_worker_slices[worker_id]); @@ -945,7 +939,7 @@ public: _heap->free_set()->clear(); } - void heap_region_do(ShenandoahHeapRegion* r) { + void heap_region_do(ShenandoahHeapRegion* r) override { assert (!r->is_cset(), "cset regions should have been demoted already"); // Need to reset the complete-top-at-mark-start pointer here because @@ -954,7 +948,7 @@ public: // NOTE: See blurb at ShenandoahMCResetCompleteBitmapTask on why we need to skip // pinned regions. if (!r->is_pinned()) { - _heap->gc_generation()->complete_marking_context()->reset_top_at_mark_start(r); + _heap->marking_context()->reset_top_at_mark_start(r); } size_t live = r->used(); @@ -1079,7 +1073,7 @@ void ShenandoahFullGC::compact_humongous_objects() { // we need to remain able to walk pinned regions. // Since pinned region do not move and don't get compacted, we will get holes with // unreachable objects in them (which may have pointers to unloaded Klasses and thus -// cannot be iterated over using oop->size(). The only way to safely iterate over those is using +// cannot be iterated over using oop->size()). The only way to safely iterate over those is using // a valid marking bitmap and valid TAMS pointer. This class only resets marking // bitmaps for un-pinned regions, and later we only reset TAMS for unpinned regions. class ShenandoahMCResetCompleteBitmapTask : public WorkerTask { @@ -1091,11 +1085,12 @@ public: WorkerTask("Shenandoah Reset Bitmap") { } - void work(uint worker_id) { + void work(uint worker_id) override { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahHeapRegion* region = _regions.next(); ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahMarkingContext* const ctx = heap->gc_generation()->complete_marking_context(); + ShenandoahMarkingContext* const ctx = heap->marking_context(); + assert(heap->global_generation()->is_mark_complete(), "Marking must be complete"); while (region != nullptr) { if (heap->is_bitmap_slice_committed(region) && !region->is_pinned() && region->has_live()) { ctx->clear_bitmap(region); @@ -1163,7 +1158,7 @@ ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() { heap->free_set()->finish_rebuild(young_cset_regions, old_cset_regions, num_old); // Set mark incomplete because the marking bitmaps have been reset except pinned regions. - heap->global_generation()->set_mark_incomplete(); + _generation->set_mark_incomplete(); heap->clear_cancelled_gc(); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp index b0b8c7bf0c5..8b8244f2ce3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp @@ -68,7 +68,7 @@ private: public: ShenandoahFullGC(); ~ShenandoahFullGC(); - bool collect(GCCause::Cause cause); + bool collect(GCCause::Cause cause) override; private: // GC entries diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGC.hpp index f08bdce0a20..7182665f2e3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGC.hpp @@ -44,6 +44,8 @@ * Full GC --------> (finish) */ +class ShenandoahGeneration; + class ShenandoahGC : public StackObj { public: // Fail point from concurrent GC @@ -57,12 +59,17 @@ public: _DEGENERATED_LIMIT }; + explicit ShenandoahGC(ShenandoahGeneration* generation) : _generation(generation) {} + // Returns false if the collection was cancelled, true otherwise. virtual bool collect(GCCause::Cause cause) = 0; static const char* degen_point_to_string(ShenandoahDegenPoint point); + ShenandoahGeneration* generation() const { return _generation; } protected: static void update_roots(bool full_gc); + + ShenandoahGeneration* _generation; }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHGC_HPP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp index 76e4412cfed..d2e25176c1f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp @@ -203,7 +203,7 @@ private: bool is_bitmap_clear(); // We need to track the status of marking for different generations. - bool is_mark_complete() { return _is_marking_complete.is_set(); } + bool is_mark_complete() const { return _is_marking_complete.is_set(); } virtual void set_mark_complete(); virtual void set_mark_incomplete(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp index 971129beea8..ccabdb7b9da 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp @@ -50,10 +50,12 @@ public: }; ShenandoahGenerationalEvacuationTask::ShenandoahGenerationalEvacuationTask(ShenandoahGenerationalHeap* heap, + ShenandoahGeneration* generation, ShenandoahRegionIterator* iterator, bool concurrent, bool only_promote_regions) : WorkerTask("Shenandoah Evacuation"), _heap(heap), + _generation(generation), _regions(iterator), _concurrent(concurrent), _only_promote_regions(only_promote_regions) @@ -169,13 +171,12 @@ void ShenandoahGenerationalEvacuationTask::maybe_promote_region(ShenandoahHeapRe // We identify the entirety of the region as DIRTY to force the next remembered set scan to identify the "interesting pointers" // contained herein. void ShenandoahGenerationalEvacuationTask::promote_in_place(ShenandoahHeapRegion* region) { - assert(!_heap->gc_generation()->is_old(), "Sanity check"); + assert(!_generation->is_old(), "Sanity check"); ShenandoahMarkingContext* const marking_context = _heap->young_generation()->complete_marking_context(); HeapWord* const tams = marking_context->top_at_mark_start(region); { const size_t old_garbage_threshold = (ShenandoahHeapRegion::region_size_bytes() * ShenandoahOldGarbageThreshold) / 100; - shenandoah_assert_generations_reconciled(); assert(!_heap->is_concurrent_old_mark_in_progress(), "Cannot promote in place during old marking"); assert(region->garbage_before_padded_for_promote() < old_garbage_threshold, "Region %zu has too much garbage for promotion", region->index()); assert(region->is_young(), "Only young regions can be promoted"); @@ -259,8 +260,7 @@ void ShenandoahGenerationalEvacuationTask::promote_in_place(ShenandoahHeapRegion void ShenandoahGenerationalEvacuationTask::promote_humongous(ShenandoahHeapRegion* region) { ShenandoahMarkingContext* marking_context = _heap->marking_context(); oop obj = cast_to_oop(region->bottom()); - assert(_heap->gc_generation()->is_mark_complete(), "sanity"); - shenandoah_assert_generations_reconciled(); + assert(_generation->is_mark_complete(), "sanity"); assert(region->is_young(), "Only young regions can be promoted"); assert(region->is_humongous_start(), "Should not promote humongous continuation in isolation"); assert(_heap->is_tenurable(region), "Only promote regions that are sufficiently aged"); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.hpp index 0c402d6c90a..de47184ffff 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.hpp @@ -36,12 +36,14 @@ class ShenandoahRegionIterator; class ShenandoahGenerationalEvacuationTask : public WorkerTask { private: ShenandoahGenerationalHeap* const _heap; + ShenandoahGeneration* const _generation; ShenandoahRegionIterator* _regions; bool _concurrent; bool _only_promote_regions; public: ShenandoahGenerationalEvacuationTask(ShenandoahGenerationalHeap* sh, + ShenandoahGeneration* generation, ShenandoahRegionIterator* iterator, bool concurrent, bool only_promote_regions); void work(uint worker_id) override; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp index c4a7408e032..8d8091472fc 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp @@ -53,8 +53,7 @@ void assert_usage_not_more_than_regions_used(ShenandoahGeneration* generation) { void ShenandoahGenerationalFullGC::prepare() { auto heap = ShenandoahGenerationalHeap::heap(); // Since we may arrive here from degenerated GC failure of either young or old, establish generation as GLOBAL. - heap->set_gc_generation(heap->global_generation()); - heap->set_active_generation(); + heap->set_active_generation(heap->global_generation()); // No need for old_gen->increase_used() as this was done when plabs were allocated. heap->reset_generation_reserves(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 34f217ada25..bc653b030a8 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -178,15 +178,15 @@ bool ShenandoahGenerationalHeap::requires_barriers(stackChunkOop obj) const { return false; } -void ShenandoahGenerationalHeap::evacuate_collection_set(bool concurrent) { +void ShenandoahGenerationalHeap::evacuate_collection_set(ShenandoahGeneration* generation, bool concurrent) { ShenandoahRegionIterator regions; - ShenandoahGenerationalEvacuationTask task(this, ®ions, concurrent, false /* only promote regions */); + ShenandoahGenerationalEvacuationTask task(this, generation, ®ions, concurrent, false /* only promote regions */); workers()->run_task(&task); } -void ShenandoahGenerationalHeap::promote_regions_in_place(bool concurrent) { +void ShenandoahGenerationalHeap::promote_regions_in_place(ShenandoahGeneration* generation, bool concurrent) { ShenandoahRegionIterator regions; - ShenandoahGenerationalEvacuationTask task(this, ®ions, concurrent, true /* only promote regions */); + ShenandoahGenerationalEvacuationTask task(this, generation, ®ions, concurrent, true /* only promote regions */); workers()->run_task(&task); } @@ -757,23 +757,27 @@ void ShenandoahGenerationalHeap::coalesce_and_fill_old_regions(bool concurrent) template class ShenandoahGenerationalUpdateHeapRefsTask : public WorkerTask { private: + // For update refs, _generation will be young or global. Mixed collections use the young generation. + ShenandoahGeneration* _generation; ShenandoahGenerationalHeap* _heap; ShenandoahRegionIterator* _regions; ShenandoahRegionChunkIterator* _work_chunks; public: - explicit ShenandoahGenerationalUpdateHeapRefsTask(ShenandoahRegionIterator* regions, - ShenandoahRegionChunkIterator* work_chunks) : + ShenandoahGenerationalUpdateHeapRefsTask(ShenandoahGeneration* generation, + ShenandoahRegionIterator* regions, + ShenandoahRegionChunkIterator* work_chunks) : WorkerTask("Shenandoah Update References"), + _generation(generation), _heap(ShenandoahGenerationalHeap::heap()), _regions(regions), _work_chunks(work_chunks) { - bool old_bitmap_stable = _heap->old_generation()->is_mark_complete(); + const bool old_bitmap_stable = _heap->old_generation()->is_mark_complete(); log_debug(gc, remset)("Update refs, scan remembered set using bitmap: %s", BOOL_TO_STR(old_bitmap_stable)); } - void work(uint worker_id) { + void work(uint worker_id) override { if (CONCURRENT) { ShenandoahConcurrentWorkerSession worker_session(worker_id); ShenandoahSuspendibleThreadSetJoiner stsj; @@ -803,10 +807,8 @@ private: // If !CONCURRENT, there's no value in expanding Mutator free set ShenandoahHeapRegion* r = _regions->next(); - // We update references for global, old, and young collections. - ShenandoahGeneration* const gc_generation = _heap->gc_generation(); - shenandoah_assert_generations_reconciled(); - assert(gc_generation->is_mark_complete(), "Expected complete marking"); + // We update references for global, mixed, and young collections. + assert(_generation->is_mark_complete(), "Expected complete marking"); ShenandoahMarkingContext* const ctx = _heap->marking_context(); bool is_mixed = _heap->collection_set()->has_old_regions(); while (r != nullptr) { @@ -818,7 +820,7 @@ private: if (r->is_young()) { _heap->marked_object_oop_iterate(r, &cl, update_watermark); } else if (r->is_old()) { - if (gc_generation->is_global()) { + if (_generation->is_global()) { _heap->marked_object_oop_iterate(r, &cl, update_watermark); } @@ -847,7 +849,7 @@ private: r = _regions->next(); } - if (!gc_generation->is_global()) { + if (_generation->is_young()) { // Since this is generational and not GLOBAL, we have to process the remembered set. There's no remembered // set processing if not in generational mode or if GLOBAL mode. @@ -961,15 +963,15 @@ private: } }; -void ShenandoahGenerationalHeap::update_heap_references(bool concurrent) { +void ShenandoahGenerationalHeap::update_heap_references(ShenandoahGeneration* generation, bool concurrent) { assert(!is_full_gc_in_progress(), "Only for concurrent and degenerated GC"); const uint nworkers = workers()->active_workers(); ShenandoahRegionChunkIterator work_list(nworkers); if (concurrent) { - ShenandoahGenerationalUpdateHeapRefsTask task(&_update_refs_iterator, &work_list); + ShenandoahGenerationalUpdateHeapRefsTask task(generation, &_update_refs_iterator, &work_list); workers()->run_task(&task); } else { - ShenandoahGenerationalUpdateHeapRefsTask task(&_update_refs_iterator, &work_list); + ShenandoahGenerationalUpdateHeapRefsTask task(generation, &_update_refs_iterator, &work_list); workers()->run_task(&task); } @@ -1044,7 +1046,7 @@ public: void ShenandoahGenerationalHeap::final_update_refs_update_region_states() { ShenandoahSynchronizePinnedRegionStates pins; - ShenandoahUpdateRegionAges ages(active_generation()->complete_marking_context()); + ShenandoahUpdateRegionAges ages(marking_context()); auto cl = ShenandoahCompositeRegionClosure::of(pins, ages); parallel_heap_region_iterate(&cl); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp index 6960562b31d..d3584a6f9a0 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp @@ -88,8 +88,11 @@ public: oop evacuate_object(oop p, Thread* thread) override; oop try_evacuate_object(oop p, Thread* thread, ShenandoahHeapRegion* from_region, ShenandoahAffiliation target_gen); - void evacuate_collection_set(bool concurrent) override; - void promote_regions_in_place(bool concurrent); + + // In the generational mode, we will use these two functions for young, mixed, and global collections. + // For young and mixed, the generation argument will be the young generation, otherwise it will be the global generation. + void evacuate_collection_set(ShenandoahGeneration* generation, bool concurrent) override; + void promote_regions_in_place(ShenandoahGeneration* generation, bool concurrent); size_t plab_min_size() const { return _min_plab_size; } size_t plab_max_size() const { return _max_plab_size; } @@ -99,7 +102,9 @@ public: // ---------- Update References // - void update_heap_references(bool concurrent) override; + // In the generational mode, we will use this function for young, mixed, and global collections. + // For young and mixed, the generation argument will be the young generation, otherwise it will be the global generation. + void update_heap_references(ShenandoahGeneration* generation, bool concurrent) override; void final_update_refs_update_region_states() override; private: diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 84f5c3362ac..cb22c794d85 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -529,7 +529,6 @@ void ShenandoahHeap::initialize_heuristics() { ShenandoahHeap::ShenandoahHeap(ShenandoahCollectorPolicy* policy) : CollectedHeap(), - _gc_generation(nullptr), _active_generation(nullptr), _initial_size(0), _committed(0), @@ -1257,7 +1256,8 @@ private: ShenandoahGCStatePropagatorHandshakeClosure _propagator; }; -void ShenandoahHeap::evacuate_collection_set(bool concurrent) { +void ShenandoahHeap::evacuate_collection_set(ShenandoahGeneration* generation, bool concurrent) { + assert(generation->is_global(), "Only global generation expected here"); ShenandoahEvacuationTask task(this, _collection_set, concurrent); workers()->run_task(&task); } @@ -1659,17 +1659,11 @@ void ShenandoahHeap::print_tracing_info() const { } } -void ShenandoahHeap::set_gc_generation(ShenandoahGeneration* generation) { - shenandoah_assert_control_or_vm_thread_at_safepoint(); - _gc_generation = generation; -} - // Active generation may only be set by the VM thread at a safepoint. -void ShenandoahHeap::set_active_generation() { +void ShenandoahHeap::set_active_generation(ShenandoahGeneration* generation) { assert(Thread::current()->is_VM_thread(), "Only the VM Thread"); assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint!"); - assert(_gc_generation != nullptr, "Will set _active_generation to nullptr"); - _active_generation = _gc_generation; + _active_generation = generation; } void ShenandoahHeap::on_cycle_start(GCCause::Cause cause, ShenandoahGeneration* generation) { @@ -1678,17 +1672,14 @@ void ShenandoahHeap::on_cycle_start(GCCause::Cause cause, ShenandoahGeneration* const GCCause::Cause current = gc_cause(); assert(current == GCCause::_no_gc, "Over-writing cause: %s, with: %s", GCCause::to_string(current), GCCause::to_string(cause)); - assert(_gc_generation == nullptr, "Over-writing _gc_generation"); set_gc_cause(cause); - set_gc_generation(generation); generation->heuristics()->record_cycle_start(); } void ShenandoahHeap::on_cycle_end(ShenandoahGeneration* generation) { assert(gc_cause() != GCCause::_no_gc, "cause wasn't set"); - assert(_gc_generation != nullptr, "_gc_generation wasn't set"); generation->heuristics()->record_cycle_end(); if (mode()->is_generational() && generation->is_global()) { @@ -1697,14 +1688,13 @@ void ShenandoahHeap::on_cycle_end(ShenandoahGeneration* generation) { old_generation()->heuristics()->record_cycle_end(); } - set_gc_generation(nullptr); set_gc_cause(GCCause::_no_gc); } void ShenandoahHeap::verify(VerifyOption vo) { if (ShenandoahSafepoint::is_at_shenandoah_safepoint()) { if (ShenandoahVerify) { - verifier()->verify_generic(vo); + verifier()->verify_generic(active_generation(), vo); } else { // TODO: Consider allocating verification bitmaps on demand, // and turn this on unconditionally. @@ -2064,14 +2054,13 @@ void ShenandoahHeap::do_class_unloading() { } } -void ShenandoahHeap::stw_weak_refs(bool full_gc) { +void ShenandoahHeap::stw_weak_refs(ShenandoahGeneration* generation, bool full_gc) { // Weak refs processing ShenandoahPhaseTimings::Phase phase = full_gc ? ShenandoahPhaseTimings::full_gc_weakrefs : ShenandoahPhaseTimings::degen_gc_weakrefs; ShenandoahTimingsTracker t(phase); ShenandoahGCWorkerPhase worker_phase(phase); - shenandoah_assert_generations_reconciled(); - gc_generation()->ref_processor()->process_references(phase, workers(), false /* concurrent */); + generation->ref_processor()->process_references(phase, workers(), false /* concurrent */); } void ShenandoahHeap::prepare_update_heap_references() { @@ -2312,13 +2301,13 @@ void ShenandoahHeap::stw_process_weak_roots(bool full_gc) { } } -void ShenandoahHeap::parallel_cleaning(bool full_gc) { +void ShenandoahHeap::parallel_cleaning(ShenandoahGeneration* generation, bool full_gc) { assert(SafepointSynchronize::is_at_safepoint(), "Must be at a safepoint"); assert(is_stw_gc_in_progress(), "Only for Degenerated and Full GC"); ShenandoahGCPhase phase(full_gc ? ShenandoahPhaseTimings::full_gc_purge : ShenandoahPhaseTimings::degen_gc_purge); - stw_weak_refs(full_gc); + stw_weak_refs(generation, full_gc); stw_process_weak_roots(full_gc); stw_unload_classes(full_gc); } @@ -2426,11 +2415,8 @@ void ShenandoahHeap::sync_pinned_region_status() { void ShenandoahHeap::assert_pinned_region_status() { for (size_t i = 0; i < num_regions(); i++) { ShenandoahHeapRegion* r = get_region(i); - shenandoah_assert_generations_reconciled(); - if (gc_generation()->contains(r)) { - assert((r->is_pinned() && r->pin_count() > 0) || (!r->is_pinned() && r->pin_count() == 0), - "Region %zu pinning status is inconsistent", i); - } + assert((r->is_pinned() && r->pin_count() > 0) || (!r->is_pinned() && r->pin_count() == 0), + "Region %zu pinning status is inconsistent", i); } } #endif @@ -2533,7 +2519,8 @@ private: } }; -void ShenandoahHeap::update_heap_references(bool concurrent) { +void ShenandoahHeap::update_heap_references(ShenandoahGeneration* generation, bool concurrent) { + assert(generation->is_global(), "Should only get global generation here"); assert(!is_full_gc_in_progress(), "Only for concurrent and degenerated GC"); if (concurrent) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index 8bcb04e5766..d6bc17b844b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -145,17 +145,10 @@ class ShenandoahHeap : public CollectedHeap { private: ShenandoahHeapLock _lock; - // Indicates the generation whose collection is in - // progress. Mutator threads aren't allowed to read - // this field. - ShenandoahGeneration* _gc_generation; - // This is set and cleared by only the VMThread - // at each STW pause (safepoint) to the value seen in - // _gc_generation. This allows the value to be always consistently + // at each STW pause (safepoint) to the value given to the VM operation. + // This allows the value to be always consistently // seen by all mutators as well as all GC worker threads. - // In that sense, it's a stable snapshot of _gc_generation that is - // updated at each STW pause associated with a ShenandoahVMOp. ShenandoahGeneration* _active_generation; protected: @@ -167,25 +160,13 @@ public: return &_lock; } - ShenandoahGeneration* gc_generation() const { - // We don't want this field read by a mutator thread - assert(!Thread::current()->is_Java_thread(), "Not allowed"); - // value of _gc_generation field, see above - return _gc_generation; - } - ShenandoahGeneration* active_generation() const { // value of _active_generation field, see above return _active_generation; } - // Set the _gc_generation field - void set_gc_generation(ShenandoahGeneration* generation); - - // Copy the value in the _gc_generation field into - // the _active_generation field: can only be called at - // a safepoint by the VMThread. - void set_active_generation(); + // Update the _active_generation field: can only be called at a safepoint by the VMThread. + void set_active_generation(ShenandoahGeneration* generation); ShenandoahHeuristics* heuristics(); @@ -482,7 +463,7 @@ private: // GC support // Evacuation - virtual void evacuate_collection_set(bool concurrent); + virtual void evacuate_collection_set(ShenandoahGeneration* generation, bool concurrent); // Concurrent root processing void prepare_concurrent_roots(); void finish_concurrent_roots(); @@ -497,7 +478,7 @@ private: // Turn off weak roots flag, purge old satb buffers in generational mode void concurrent_final_roots(HandshakeClosure* handshake_closure = nullptr); - virtual void update_heap_references(bool concurrent); + virtual void update_heap_references(ShenandoahGeneration* generation, bool concurrent); // Final update region states void update_heap_region_states(bool concurrent); virtual void final_update_refs_update_region_states(); @@ -605,12 +586,12 @@ public: bool unload_classes() const; // Perform STW class unloading and weak root cleaning - void parallel_cleaning(bool full_gc); + void parallel_cleaning(ShenandoahGeneration* generation, bool full_gc); private: void stw_unload_classes(bool full_gc); void stw_process_weak_roots(bool full_gc); - void stw_weak_refs(bool full_gc); + void stw_weak_refs(ShenandoahGeneration* generation, bool full_gc); inline void assert_lock_for_affiliation(ShenandoahAffiliation orig_affiliation, ShenandoahAffiliation new_affiliation); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp index df45a59433e..ca0f7460d54 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp @@ -315,9 +315,9 @@ void ShenandoahHeapRegion::make_trash_immediate() { // On this path, we know there are no marked objects in the region, // tell marking context about it to bypass bitmap resets. - assert(ShenandoahHeap::heap()->gc_generation()->is_mark_complete(), "Marking should be complete here."); - shenandoah_assert_generations_reconciled(); - ShenandoahHeap::heap()->marking_context()->reset_top_bitmap(this); + const ShenandoahHeap* heap = ShenandoahHeap::heap(); + assert(heap->generation_for(affiliation())->is_mark_complete(), "Marking should be complete here."); + heap->marking_context()->reset_top_bitmap(this); } void ShenandoahHeapRegion::make_empty() { @@ -461,9 +461,9 @@ bool ShenandoahHeapRegion::oop_coalesce_and_fill(bool cancellable) { ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); ShenandoahMarkingContext* marking_context = heap->marking_context(); - // Expect marking to be completed before these threads invoke this service. - assert(heap->gc_generation()->is_mark_complete(), "sanity"); - shenandoah_assert_generations_reconciled(); + // Expect marking to be completed for the old generation before we fill in unmarked objects + assert(heap->old_generation()->is_mark_complete(), "sanity"); + assert(is_old(), "Only need to coalesce and fill old regions"); // All objects above TAMS are considered live even though their mark bits will not be set. Note that young- // gen evacuations that interrupt a long-running old-gen concurrent mark may promote objects into old-gen diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMark.cpp index 2a4149ee44d..a3c28e2c6d3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMark.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMark.cpp @@ -55,10 +55,10 @@ ShenandoahMark::ShenandoahMark(ShenandoahGeneration* generation) : } template -void ShenandoahMark::mark_loop_prework(uint w, TaskTerminator *t, ShenandoahReferenceProcessor *rp, StringDedup::Requests* const req, bool update_refs) { +void ShenandoahMark::mark_loop_prework(uint w, TaskTerminator *t, StringDedup::Requests* const req, bool update_refs) { ShenandoahObjToScanQueue* q = get_queue(w); ShenandoahObjToScanQueue* old_q = get_old_queue(w); - + ShenandoahReferenceProcessor *rp = _generation->ref_processor(); ShenandoahHeap* const heap = ShenandoahHeap::heap(); ShenandoahLiveData* ld = heap->get_liveness_cache(w); @@ -78,22 +78,22 @@ void ShenandoahMark::mark_loop_prework(uint w, TaskTerminator *t, ShenandoahRefe } template -void ShenandoahMark::mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahReferenceProcessor *rp, - ShenandoahGenerationType generation, StringDedup::Requests* const req) { +void ShenandoahMark::mark_loop(uint worker_id, TaskTerminator* terminator, + ShenandoahGenerationType generation_type, StringDedup::Requests* const req) { bool update_refs = ShenandoahHeap::heap()->has_forwarded_objects(); - switch (generation) { + switch (generation_type) { case YOUNG: - mark_loop_prework(worker_id, terminator, rp, req, update_refs); + mark_loop_prework(worker_id, terminator, req, update_refs); break; case OLD: // Old generation collection only performs marking, it should not update references. - mark_loop_prework(worker_id, terminator, rp, req, false); + mark_loop_prework(worker_id, terminator, req, false); break; case GLOBAL: - mark_loop_prework(worker_id, terminator, rp, req, update_refs); + mark_loop_prework(worker_id, terminator, req, update_refs); break; case NON_GEN: - mark_loop_prework(worker_id, terminator, rp, req, update_refs); + mark_loop_prework(worker_id, terminator, req, update_refs); break; default: ShouldNotReachHere(); @@ -101,30 +101,30 @@ void ShenandoahMark::mark_loop(uint worker_id, TaskTerminator* terminator, Shena } } -void ShenandoahMark::mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahReferenceProcessor *rp, - ShenandoahGenerationType generation, bool cancellable, StringDedupMode dedup_mode, StringDedup::Requests* const req) { +void ShenandoahMark::mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahGenerationType generation_type, + bool cancellable, StringDedupMode dedup_mode, StringDedup::Requests* const req) { if (cancellable) { switch(dedup_mode) { case NO_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; case ENQUEUE_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; case ALWAYS_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; } } else { switch(dedup_mode) { case NO_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; case ENQUEUE_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; case ALWAYS_DEDUP: - mark_loop(worker_id, terminator, rp, generation, req); + mark_loop(worker_id, terminator, generation_type, req); break; } } @@ -139,12 +139,8 @@ void ShenandoahMark::mark_loop_work(T* cl, ShenandoahLiveData* live_data, uint w ShenandoahObjToScanQueue* q; ShenandoahMarkTask t; - // Do not use active_generation() : we must use the gc_generation() set by - // ShenandoahGCScope on the ControllerThread's stack; no safepoint may - // intervene to update active_generation, so we can't - // shenandoah_assert_generations_reconciled() here. - assert(heap->gc_generation()->type() == GENERATION, "Sanity: %d != %d", heap->gc_generation()->type(), GENERATION); - heap->gc_generation()->ref_processor()->set_mark_closure(worker_id, cl); + assert(_generation->type() == GENERATION, "Sanity: %d != %d", _generation->type(), GENERATION); + _generation->ref_processor()->set_mark_closure(worker_id, cl); /* * Process outstanding queues, if any. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp index 4aef14f2c9a..2fbb106f4d7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMark.hpp @@ -41,7 +41,6 @@ enum StringDedupMode { }; class ShenandoahMarkingContext; -class ShenandoahReferenceProcessor; // Base class for mark // Mark class does not maintain states. Instead, mark states are @@ -72,7 +71,7 @@ public: inline ShenandoahObjToScanQueue* get_queue(uint index) const; inline ShenandoahObjToScanQueue* get_old_queue(uint index) const; - inline ShenandoahGeneration* generation() { return _generation; }; + ShenandoahGeneration* generation() const { return _generation; }; private: // ---------- Marking loop and tasks @@ -93,7 +92,7 @@ private: void mark_loop_work(T* cl, ShenandoahLiveData* live_data, uint worker_id, TaskTerminator *t, StringDedup::Requests* const req); template - void mark_loop_prework(uint worker_id, TaskTerminator *terminator, ShenandoahReferenceProcessor *rp, StringDedup::Requests* const req, bool update_refs); + void mark_loop_prework(uint worker_id, TaskTerminator *terminator, StringDedup::Requests* const req, bool update_refs); template static bool in_generation(ShenandoahHeap* const heap, oop obj); @@ -109,11 +108,11 @@ private: inline void dedup_string(oop obj, StringDedup::Requests* const req); protected: template - void mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahReferenceProcessor *rp, - ShenandoahGenerationType generation, StringDedup::Requests* const req); + void mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahGenerationType generation_type, + StringDedup::Requests* const req); - void mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahReferenceProcessor *rp, - ShenandoahGenerationType generation, bool cancellable, StringDedupMode dedup_mode, StringDedup::Requests* const req); + void mark_loop(uint worker_id, TaskTerminator* terminator, ShenandoahGenerationType generation_type, + bool cancellable, StringDedupMode dedup_mode, StringDedup::Requests* const req); }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHMARK_HPP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp index 1724fc2849f..3e9f3a490df 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp @@ -49,7 +49,7 @@ void ShenandoahOldGC::op_final_mark() { assert(!heap->has_forwarded_objects(), "No forwarded objects on this path"); if (ShenandoahVerify) { - heap->verifier()->verify_roots_no_forwarded(); + heap->verifier()->verify_roots_no_forwarded(_old_generation); } if (!heap->cancelled_gc()) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp index 4ca6f2fdf49..f37329d1c44 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp @@ -329,25 +329,31 @@ bool ShenandoahReferenceProcessor::should_drop(oop reference, ReferenceType type return true; } + shenandoah_assert_mark_complete(raw_referent); ShenandoahHeap* heap = ShenandoahHeap::heap(); - // Check if the referent is still alive, in which case we should - // drop the reference. + // Check if the referent is still alive, in which case we should drop the reference. if (type == REF_PHANTOM) { - return heap->active_generation()->complete_marking_context()->is_marked(raw_referent); + return heap->marking_context()->is_marked(raw_referent); } else { - return heap->active_generation()->complete_marking_context()->is_marked_strong(raw_referent); + return heap->marking_context()->is_marked_strong(raw_referent); } } template void ShenandoahReferenceProcessor::make_inactive(oop reference, ReferenceType type) const { if (type == REF_FINAL) { +#ifdef ASSERT + auto referent = reference_referent_raw(reference); + auto heap = ShenandoahHeap::heap(); + shenandoah_assert_mark_complete(referent); + assert(reference_next(reference) == nullptr, "Already inactive"); + assert(heap->marking_context()->is_marked(referent), "only make inactive final refs with alive referents"); +#endif + // Don't clear referent. It is needed by the Finalizer thread to make the call // to finalize(). A FinalReference is instead made inactive by self-looping the // next field. An application can't call FinalReference.enqueue(), so there is // no race to worry about when setting the next field. - assert(reference_next(reference) == nullptr, "Already inactive"); - assert(ShenandoahHeap::heap()->active_generation()->complete_marking_context()->is_marked(reference_referent_raw(reference)), "only make inactive final refs with alive referents"); reference_set_next(reference, reference); } else { // Clear referent @@ -437,8 +443,12 @@ oop ShenandoahReferenceProcessor::drop(oop reference, ReferenceType type) { HeapWord* raw_referent = reference_referent_raw(reference); #ifdef ASSERT - assert(raw_referent == nullptr || ShenandoahHeap::heap()->active_generation()->complete_marking_context()->is_marked(raw_referent), - "only drop references with alive referents"); + if (raw_referent != nullptr) { + ShenandoahHeap* heap = ShenandoahHeap::heap(); + ShenandoahHeapRegion* region = heap->heap_region_containing(raw_referent); + ShenandoahMarkingContext* ctx = heap->generation_for(region->affiliation())->complete_marking_context(); + assert(ctx->is_marked(raw_referent), "only drop references with alive referents"); + } #endif // Unlink and return next in list diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp index 11ff92cd9cc..23edc780e47 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.cpp @@ -61,7 +61,7 @@ ShenandoahGCStateResetter::~ShenandoahGCStateResetter() { assert(_heap->gc_state() == _saved_gc_state, "Should be restored"); } -void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops) { +void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops, ShenandoahGeneration* generation) { ShenandoahGCStateResetter resetter; shenandoah_assert_safepoint(); @@ -75,9 +75,9 @@ void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops) { OopStorageSet::storage(id)->oops_do(oops); } - ShenandoahHeap* heap = ShenandoahHeap::heap(); - if (heap->mode()->is_generational() && heap->active_generation()->is_young()) { + if (generation->is_young()) { shenandoah_assert_safepoint(); + shenandoah_assert_generational(); ShenandoahGenerationalHeap::heap()->old_generation()->card_scan()->roots_do(oops); } @@ -87,7 +87,7 @@ void ShenandoahRootVerifier::roots_do(OopIterateClosure* oops) { Threads::possibly_parallel_oops_do(true, oops, nullptr); } -void ShenandoahRootVerifier::strong_roots_do(OopIterateClosure* oops) { +void ShenandoahRootVerifier::strong_roots_do(OopIterateClosure* oops, ShenandoahGeneration* generation) { ShenandoahGCStateResetter resetter; shenandoah_assert_safepoint(); @@ -98,8 +98,8 @@ void ShenandoahRootVerifier::strong_roots_do(OopIterateClosure* oops) { OopStorageSet::storage(id)->oops_do(oops); } - ShenandoahHeap* heap = ShenandoahHeap::heap(); - if (heap->mode()->is_generational() && heap->active_generation()->is_young()) { + if (generation->is_young()) { + shenandoah_assert_generational(); ShenandoahGenerationalHeap::heap()->old_generation()->card_scan()->roots_do(oops); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp index 405c69c4160..1f3cb400465 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahRootVerifier.hpp @@ -43,8 +43,10 @@ public: class ShenandoahRootVerifier : public AllStatic { public: // Used to seed ShenandoahVerifier, do not honor root type filter - static void roots_do(OopIterateClosure* cl); - static void strong_roots_do(OopIterateClosure* cl); + // The generation parameter here may be young or global. If it is young, + // then the roots will include the remembered set. + static void roots_do(OopIterateClosure* cl, ShenandoahGeneration* generation); + static void strong_roots_do(OopIterateClosure* cl, ShenandoahGeneration* generation); }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHROOTVERIFIER_HPP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSTWMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahSTWMark.cpp index 53391a3e224..117984a6d41 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSTWMark.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSTWMark.cpp @@ -77,15 +77,13 @@ void ShenandoahSTWMark::mark() { ShenandoahCodeRoots::arm_nmethods_for_mark(); // Weak reference processing - assert(ShenandoahHeap::heap()->gc_generation() == _generation, "Marking unexpected generation"); ShenandoahReferenceProcessor* rp = _generation->ref_processor(); - shenandoah_assert_generations_reconciled(); rp->reset_thread_locals(); // Init mark, do not expect forwarded pointers in roots if (ShenandoahVerify) { assert(Thread::current()->is_VM_thread(), "Must be"); - heap->verifier()->verify_roots_no_forwarded(); + heap->verifier()->verify_roots_no_forwarded(_generation); } start_mark(); @@ -119,7 +117,6 @@ void ShenandoahSTWMark::mark() { } void ShenandoahSTWMark::mark_roots(uint worker_id) { - assert(ShenandoahHeap::heap()->gc_generation() == _generation, "Marking unexpected generation"); ShenandoahReferenceProcessor* rp = _generation->ref_processor(); auto queue = task_queues()->queue(worker_id); switch (_generation->type()) { @@ -148,14 +145,10 @@ void ShenandoahSTWMark::mark_roots(uint worker_id) { } void ShenandoahSTWMark::finish_mark(uint worker_id) { - assert(ShenandoahHeap::heap()->gc_generation() == _generation, "Marking unexpected generation"); ShenandoahPhaseTimings::Phase phase = _full_gc ? ShenandoahPhaseTimings::full_gc_mark : ShenandoahPhaseTimings::degen_gc_stw_mark; ShenandoahWorkerTimingsTracker timer(phase, ShenandoahPhaseTimings::ParallelMark, worker_id); - ShenandoahReferenceProcessor* rp = _generation->ref_processor(); - shenandoah_assert_generations_reconciled(); StringDedup::Requests requests; - mark_loop(worker_id, &_terminator, rp, - _generation->type(), false /* not cancellable */, + mark_loop(worker_id, &_terminator, _generation->type(), false /* not cancellable */, ShenandoahStringDedup::is_enabled() ? ALWAYS_DEDUP : NO_DEDUP, &requests); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp index 0137492f06f..6b45842f781 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.cpp @@ -50,16 +50,14 @@ void VM_ShenandoahOperation::doit_epilogue() { void VM_ShenandoahOperation::log_active_generation(const char* prefix) { ShenandoahGeneration* agen = ShenandoahHeap::heap()->active_generation(); - ShenandoahGeneration* ggen = ShenandoahHeap::heap()->gc_generation(); - log_debug(gc, heap)("%s: active_generation is %s, gc_generation is %s", prefix, - agen == nullptr ? "nullptr" : shenandoah_generation_name(agen->type()), - ggen == nullptr ? "nullptr" : shenandoah_generation_name(ggen->type())); + log_debug(gc, heap)("%s: active_generation is %s", prefix, + agen == nullptr ? "nullptr" : shenandoah_generation_name(agen->type())); } void VM_ShenandoahOperation::set_active_generation() { if (evaluate_at_safepoint()) { assert(SafepointSynchronize::is_at_safepoint(), "Error??"); - ShenandoahHeap::heap()->set_active_generation(); + ShenandoahHeap::heap()->set_active_generation(_generation); } } @@ -77,42 +75,70 @@ void VM_ShenandoahReferenceOperation::doit_epilogue() { Heap_lock->unlock(); } +VM_ShenandoahInitMark::VM_ShenandoahInitMark(ShenandoahConcurrentGC* gc) + : VM_ShenandoahOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahInitMark::doit() { ShenandoahGCPauseMark mark(_gc_id, "Init Mark", SvcGCMarker::CONCURRENT); set_active_generation(); _gc->entry_init_mark(); } +VM_ShenandoahFinalMarkStartEvac::VM_ShenandoahFinalMarkStartEvac(ShenandoahConcurrentGC* gc) + : VM_ShenandoahOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahFinalMarkStartEvac::doit() { ShenandoahGCPauseMark mark(_gc_id, "Final Mark", SvcGCMarker::CONCURRENT); set_active_generation(); _gc->entry_final_mark(); } +VM_ShenandoahFullGC::VM_ShenandoahFullGC(GCCause::Cause gc_cause, ShenandoahFullGC* full_gc) + : VM_ShenandoahReferenceOperation(full_gc->generation()), _gc_cause(gc_cause), _full_gc(full_gc) { +} + void VM_ShenandoahFullGC::doit() { ShenandoahGCPauseMark mark(_gc_id, "Full GC", SvcGCMarker::FULL); set_active_generation(); _full_gc->entry_full(_gc_cause); } +VM_ShenandoahDegeneratedGC::VM_ShenandoahDegeneratedGC(ShenandoahDegenGC* gc) + : VM_ShenandoahReferenceOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahDegeneratedGC::doit() { ShenandoahGCPauseMark mark(_gc_id, "Degenerated GC", SvcGCMarker::CONCURRENT); set_active_generation(); _gc->entry_degenerated(); } +VM_ShenandoahInitUpdateRefs::VM_ShenandoahInitUpdateRefs(ShenandoahConcurrentGC* gc) + : VM_ShenandoahOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahInitUpdateRefs::doit() { ShenandoahGCPauseMark mark(_gc_id, "Init Update Refs", SvcGCMarker::CONCURRENT); set_active_generation(); _gc->entry_init_update_refs(); } +VM_ShenandoahFinalUpdateRefs::VM_ShenandoahFinalUpdateRefs(ShenandoahConcurrentGC* gc) + : VM_ShenandoahOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahFinalUpdateRefs::doit() { ShenandoahGCPauseMark mark(_gc_id, "Final Update Refs", SvcGCMarker::CONCURRENT); set_active_generation(); _gc->entry_final_update_refs(); } +VM_ShenandoahFinalRoots::VM_ShenandoahFinalRoots(ShenandoahConcurrentGC* gc) + : VM_ShenandoahOperation(gc->generation()), _gc(gc) { +} + void VM_ShenandoahFinalRoots::doit() { ShenandoahGCPauseMark mark(_gc_id, "Final Roots", SvcGCMarker::CONCURRENT); set_active_generation(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp index 291fadd1887..d565a3df22c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVMOperations.hpp @@ -46,10 +46,15 @@ class ShenandoahFullGC; class VM_ShenandoahOperation : public VM_Operation { protected: uint _gc_id; + ShenandoahGeneration* _generation; void set_active_generation(); public: - VM_ShenandoahOperation() : _gc_id(GCId::current()) {}; + explicit VM_ShenandoahOperation(ShenandoahGeneration* generation) + : _gc_id(GCId::current()) + , _generation(generation) { + } + bool skip_thread_oop_barriers() const override { return true; } void log_active_generation(const char* prefix); @@ -61,93 +66,74 @@ public: class VM_ShenandoahReferenceOperation : public VM_ShenandoahOperation { public: - VM_ShenandoahReferenceOperation() : VM_ShenandoahOperation() {}; + explicit VM_ShenandoahReferenceOperation(ShenandoahGeneration* generation) + : VM_ShenandoahOperation(generation) {}; bool doit_prologue() override; void doit_epilogue() override; }; class VM_ShenandoahInitMark: public VM_ShenandoahOperation { -private: ShenandoahConcurrentGC* const _gc; public: - VM_ShenandoahInitMark(ShenandoahConcurrentGC* gc) : - VM_ShenandoahOperation(), - _gc(gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahInitMark; } - const char* name() const { return "Shenandoah Init Marking"; } - virtual void doit(); + explicit VM_ShenandoahInitMark(ShenandoahConcurrentGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahInitMark; } + const char* name() const override { return "Shenandoah Init Marking"; } + void doit() override; }; class VM_ShenandoahFinalMarkStartEvac: public VM_ShenandoahOperation { -private: ShenandoahConcurrentGC* const _gc; public: - VM_ShenandoahFinalMarkStartEvac(ShenandoahConcurrentGC* gc) : - VM_ShenandoahOperation(), - _gc(gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalMarkStartEvac; } - const char* name() const { return "Shenandoah Final Mark and Start Evacuation"; } - virtual void doit(); + explicit VM_ShenandoahFinalMarkStartEvac(ShenandoahConcurrentGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahFinalMarkStartEvac; } + const char* name() const override { return "Shenandoah Final Mark and Start Evacuation"; } + void doit() override; }; class VM_ShenandoahDegeneratedGC: public VM_ShenandoahReferenceOperation { -private: ShenandoahDegenGC* const _gc; public: - VM_ShenandoahDegeneratedGC(ShenandoahDegenGC* gc) : - VM_ShenandoahReferenceOperation(), - _gc(gc) {}; - - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahDegeneratedGC; } - const char* name() const { return "Shenandoah Degenerated GC"; } - virtual void doit(); + explicit VM_ShenandoahDegeneratedGC(ShenandoahDegenGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahDegeneratedGC; } + const char* name() const override { return "Shenandoah Degenerated GC"; } + void doit() override; }; class VM_ShenandoahFullGC : public VM_ShenandoahReferenceOperation { -private: GCCause::Cause _gc_cause; ShenandoahFullGC* const _full_gc; public: - VM_ShenandoahFullGC(GCCause::Cause gc_cause, ShenandoahFullGC* full_gc) : - VM_ShenandoahReferenceOperation(), - _gc_cause(gc_cause), - _full_gc(full_gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFullGC; } - const char* name() const { return "Shenandoah Full GC"; } - virtual void doit(); + explicit VM_ShenandoahFullGC(GCCause::Cause gc_cause, ShenandoahFullGC* full_gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahFullGC; } + const char* name() const override { return "Shenandoah Full GC"; } + void doit() override; }; class VM_ShenandoahInitUpdateRefs: public VM_ShenandoahOperation { ShenandoahConcurrentGC* const _gc; public: - VM_ShenandoahInitUpdateRefs(ShenandoahConcurrentGC* gc) : - VM_ShenandoahOperation(), - _gc(gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahInitUpdateRefs; } - const char* name() const { return "Shenandoah Init Update References"; } - virtual void doit(); + explicit VM_ShenandoahInitUpdateRefs(ShenandoahConcurrentGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahInitUpdateRefs; } + const char* name() const override { return "Shenandoah Init Update References"; } + void doit() override; }; class VM_ShenandoahFinalUpdateRefs: public VM_ShenandoahOperation { ShenandoahConcurrentGC* const _gc; public: - VM_ShenandoahFinalUpdateRefs(ShenandoahConcurrentGC* gc) : - VM_ShenandoahOperation(), - _gc(gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalUpdateRefs; } - const char* name() const { return "Shenandoah Final Update References"; } - virtual void doit(); + explicit VM_ShenandoahFinalUpdateRefs(ShenandoahConcurrentGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahFinalUpdateRefs; } + const char* name() const override { return "Shenandoah Final Update References"; } + void doit() override; }; class VM_ShenandoahFinalRoots: public VM_ShenandoahOperation { ShenandoahConcurrentGC* const _gc; public: - VM_ShenandoahFinalRoots(ShenandoahConcurrentGC* gc) : - VM_ShenandoahOperation(), - _gc(gc) {}; - VM_Operation::VMOp_Type type() const { return VMOp_ShenandoahFinalRoots; } - const char* name() const { return "Shenandoah Final Roots"; } - virtual void doit(); + explicit VM_ShenandoahFinalRoots(ShenandoahConcurrentGC* gc); + VM_Operation::VMOp_Type type() const override { return VMOp_ShenandoahFinalRoots; } + const char* name() const override { return "Shenandoah Final Roots"; } + void doit() override; }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHVMOPERATIONS_HPP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp index c84a2a65677..fb5fbbd00a1 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp @@ -70,7 +70,8 @@ private: ShenandoahGeneration* _generation; public: - ShenandoahVerifyOopClosure(ShenandoahVerifierStack* stack, MarkBitMap* map, ShenandoahLivenessData* ld, + ShenandoahVerifyOopClosure(ShenandoahGeneration* generation, ShenandoahVerifierStack* stack, + MarkBitMap* map, ShenandoahLivenessData* ld, const char* phase, ShenandoahVerifier::VerifyOptions options) : _phase(phase), _options(options), @@ -80,7 +81,7 @@ public: _ld(ld), _interior_loc(nullptr), _loc(nullptr), - _generation(nullptr) { + _generation(generation) { if (options._verify_marked == ShenandoahVerifier::_verify_marked_complete_except_references || options._verify_marked == ShenandoahVerifier::_verify_marked_complete_satb_empty || options._verify_marked == ShenandoahVerifier::_verify_marked_disable) { @@ -92,12 +93,6 @@ public: // Otherwise do all fields. _ref_mode = DO_FIELDS; } - - if (_heap->mode()->is_generational()) { - _generation = _heap->gc_generation(); - assert(_generation != nullptr, "Expected active generation in this mode"); - shenandoah_assert_generations_reconciled(); - } } ReferenceIterationMode reference_iteration_mode() override { @@ -131,11 +126,7 @@ private: } } - bool in_generation(oop obj) { - if (_generation == nullptr) { - return true; - } - + bool in_generation(oop obj) const { ShenandoahHeapRegion* region = _heap->heap_region_containing(obj); return _generation->contains(region); } @@ -197,9 +188,8 @@ private: // fallthrough for fast failure for un-live regions: case ShenandoahVerifier::_verify_liveness_conservative: check(ShenandoahAsserts::_safe_oop, obj, obj_reg->has_live() || - (obj_reg->is_old() && _heap->gc_generation()->is_young()), + (obj_reg->is_old() && _generation->is_young()), "Object must belong to region with live data"); - shenandoah_assert_generations_reconciled(); break; default: assert(false, "Unhandled liveness verification"); @@ -276,12 +266,12 @@ private: "Must be marked in incomplete bitmap"); break; case ShenandoahVerifier::_verify_marked_complete: - check(ShenandoahAsserts::_safe_all, obj, _heap->gc_generation()->complete_marking_context()->is_marked(obj), + check(ShenandoahAsserts::_safe_all, obj, _generation->complete_marking_context()->is_marked(obj), "Must be marked in complete bitmap"); break; case ShenandoahVerifier::_verify_marked_complete_except_references: case ShenandoahVerifier::_verify_marked_complete_satb_empty: - check(ShenandoahAsserts::_safe_all, obj, _heap->gc_generation()->complete_marking_context()->is_marked(obj), + check(ShenandoahAsserts::_safe_all, obj, _generation->complete_marking_context()->is_marked(obj), "Must be marked in complete bitmap, except j.l.r.Reference referents"); break; default: @@ -571,9 +561,11 @@ private: ShenandoahLivenessData* _ld; MarkBitMap* _bitmap; volatile size_t _processed; + ShenandoahGeneration* _generation; public: - ShenandoahVerifierReachableTask(MarkBitMap* bitmap, + ShenandoahVerifierReachableTask(ShenandoahGeneration* generation, + MarkBitMap* bitmap, ShenandoahLivenessData* ld, const char* label, ShenandoahVerifier::VerifyOptions options) : @@ -583,7 +575,8 @@ public: _heap(ShenandoahHeap::heap()), _ld(ld), _bitmap(bitmap), - _processed(0) {}; + _processed(0), + _generation(generation) {}; size_t processed() const { return _processed; @@ -599,20 +592,20 @@ public: // extended parallelism would buy us out. if (((ShenandoahVerifyLevel == 2) && (worker_id == 0)) || (ShenandoahVerifyLevel >= 3)) { - ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld, + ShenandoahVerifyOopClosure cl(_generation, &stack, _bitmap, _ld, ShenandoahMessageBuffer("%s, Roots", _label), _options); if (_heap->unload_classes()) { - ShenandoahRootVerifier::strong_roots_do(&cl); + ShenandoahRootVerifier::strong_roots_do(&cl, _generation); } else { - ShenandoahRootVerifier::roots_do(&cl); + ShenandoahRootVerifier::roots_do(&cl, _generation); } } size_t processed = 0; if (ShenandoahVerifyLevel >= 3) { - ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld, + ShenandoahVerifyOopClosure cl(_generation, &stack, _bitmap, _ld, ShenandoahMessageBuffer("%s, Reachable", _label), _options); while (!stack.is_empty()) { @@ -648,7 +641,8 @@ private: ShenandoahGeneration* _generation; public: - ShenandoahVerifierMarkedRegionTask(MarkBitMap* bitmap, + ShenandoahVerifierMarkedRegionTask(ShenandoahGeneration* generation, + MarkBitMap* bitmap, ShenandoahLivenessData* ld, const char* label, ShenandoahVerifier::VerifyOptions options) : @@ -660,13 +654,7 @@ public: _ld(ld), _claimed(0), _processed(0), - _generation(nullptr) { - if (_heap->mode()->is_generational()) { - _generation = _heap->gc_generation(); - assert(_generation != nullptr, "Expected active generation in this mode."); - shenandoah_assert_generations_reconciled(); - } - }; + _generation(generation) {} size_t processed() { return AtomicAccess::load(&_processed); @@ -679,7 +667,7 @@ public: } ShenandoahVerifierStack stack; - ShenandoahVerifyOopClosure cl(&stack, _bitmap, _ld, + ShenandoahVerifyOopClosure cl(_generation, &stack, _bitmap, _ld, ShenandoahMessageBuffer("%s, Marked", _label), _options); @@ -702,14 +690,14 @@ public: } } - bool in_generation(ShenandoahHeapRegion* r) { - return _generation == nullptr || _generation->contains(r); + bool in_generation(ShenandoahHeapRegion* r) const { + return _generation->contains(r); } virtual void work_humongous(ShenandoahHeapRegion *r, ShenandoahVerifierStack& stack, ShenandoahVerifyOopClosure& cl) { size_t processed = 0; HeapWord* obj = r->bottom(); - if (_heap->gc_generation()->complete_marking_context()->is_marked(cast_to_oop(obj))) { + if (_generation->complete_marking_context()->is_marked(cast_to_oop(obj))) { verify_and_follow(obj, stack, cl, &processed); } AtomicAccess::add(&_processed, processed, memory_order_relaxed); @@ -717,7 +705,7 @@ public: virtual void work_regular(ShenandoahHeapRegion *r, ShenandoahVerifierStack &stack, ShenandoahVerifyOopClosure &cl) { size_t processed = 0; - ShenandoahMarkingContext* ctx = _heap->gc_generation()->complete_marking_context(); + ShenandoahMarkingContext* ctx = _generation->complete_marking_context(); HeapWord* tams = ctx->top_at_mark_start(r); // Bitmaps, before TAMS @@ -794,7 +782,8 @@ public: } }; -void ShenandoahVerifier::verify_at_safepoint(const char* label, +void ShenandoahVerifier::verify_at_safepoint(ShenandoahGeneration* generation, + const char* label, VerifyRememberedSet remembered, VerifyForwarded forwarded, VerifyMarked marked, @@ -896,16 +885,7 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, log_debug(gc)("Safepoint verification finished heap usage verification"); - ShenandoahGeneration* generation; if (_heap->mode()->is_generational()) { - generation = _heap->gc_generation(); - guarantee(generation != nullptr, "Need to know which generation to verify."); - shenandoah_assert_generations_reconciled(); - } else { - generation = nullptr; - } - - if (generation != nullptr) { ShenandoahHeapLocker lock(_heap->lock()); switch (remembered) { @@ -952,11 +932,7 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, // Internal heap region checks if (ShenandoahVerifyLevel >= 1) { ShenandoahVerifyHeapRegionClosure cl(label, regions); - if (generation != nullptr) { - generation->heap_region_iterate(&cl); - } else { - _heap->heap_region_iterate(&cl); - } + generation->heap_region_iterate(&cl); } log_debug(gc)("Safepoint verification finished heap region closure verification"); @@ -980,7 +956,7 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, // This verifies what application can see, since it only cares about reachable objects. size_t count_reachable = 0; if (ShenandoahVerifyLevel >= 2) { - ShenandoahVerifierReachableTask task(_verification_bit_map, ld, label, options); + ShenandoahVerifierReachableTask task(generation, _verification_bit_map, ld, label, options); _heap->workers()->run_task(&task); count_reachable = task.processed(); } @@ -999,8 +975,8 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, (marked == _verify_marked_complete || marked == _verify_marked_complete_except_references || marked == _verify_marked_complete_satb_empty)) { - guarantee(_heap->gc_generation()->is_mark_complete(), "Marking context should be complete"); - ShenandoahVerifierMarkedRegionTask task(_verification_bit_map, ld, label, options); + guarantee(generation->is_mark_complete(), "Marking context should be complete"); + ShenandoahVerifierMarkedRegionTask task(generation, _verification_bit_map, ld, label, options); _heap->workers()->run_task(&task); count_marked = task.processed(); } else { @@ -1015,7 +991,7 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, if (ShenandoahVerifyLevel >= 4 && marked == _verify_marked_complete && liveness == _verify_liveness_complete) { for (size_t i = 0; i < _heap->num_regions(); i++) { ShenandoahHeapRegion* r = _heap->get_region(i); - if (generation != nullptr && !generation->contains(r)) { + if (!generation->contains(r)) { continue; } @@ -1042,16 +1018,15 @@ void ShenandoahVerifier::verify_at_safepoint(const char* label, } log_debug(gc)("Safepoint verification finished accumulation of liveness data"); - - log_info(gc)("Verify %s, Level %zd (%zu reachable, %zu marked)", label, ShenandoahVerifyLevel, count_reachable, count_marked); FREE_C_HEAP_ARRAY(ShenandoahLivenessData, ld); } -void ShenandoahVerifier::verify_generic(VerifyOption vo) { +void ShenandoahVerifier::verify_generic(ShenandoahGeneration* generation, VerifyOption vo) { verify_at_safepoint( + generation, "Generic Verification", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_allow, // conservatively allow forwarded @@ -1064,7 +1039,7 @@ void ShenandoahVerifier::verify_generic(VerifyOption vo) { ); } -void ShenandoahVerifier::verify_before_concmark() { +void ShenandoahVerifier::verify_before_concmark(ShenandoahGeneration* generation) { VerifyRememberedSet verify_remembered_set = _verify_remembered_before_marking; if (_heap->mode()->is_generational() && !_heap->old_generation()->is_mark_complete()) { @@ -1072,6 +1047,7 @@ void ShenandoahVerifier::verify_before_concmark() { verify_remembered_set = _verify_remembered_disable; } verify_at_safepoint( + generation, "Before Mark", verify_remembered_set, // verify read-only remembered set from bottom() to top() @@ -1085,8 +1061,9 @@ void ShenandoahVerifier::verify_before_concmark() { ); } -void ShenandoahVerifier::verify_after_concmark() { +void ShenandoahVerifier::verify_after_concmark(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "After Mark", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_none, // no forwarded references @@ -1099,8 +1076,9 @@ void ShenandoahVerifier::verify_after_concmark() { ); } -void ShenandoahVerifier::verify_after_concmark_with_promotions() { +void ShenandoahVerifier::verify_after_concmark_with_promotions(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "After Mark", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_none, // no forwarded references @@ -1114,8 +1092,9 @@ void ShenandoahVerifier::verify_after_concmark_with_promotions() { ); } -void ShenandoahVerifier::verify_before_evacuation() { +void ShenandoahVerifier::verify_before_evacuation(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "Before Evacuation", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_none, // no forwarded references @@ -1129,13 +1108,14 @@ void ShenandoahVerifier::verify_before_evacuation() { ); } -void ShenandoahVerifier::verify_before_update_refs() { +void ShenandoahVerifier::verify_before_update_refs(ShenandoahGeneration* generation) { VerifyRememberedSet verify_remembered_set = _verify_remembered_before_updating_references; if (_heap->mode()->is_generational() && !_heap->old_generation()->is_mark_complete()) { verify_remembered_set = _verify_remembered_disable; } verify_at_safepoint( + generation, "Before Updating References", verify_remembered_set, // verify read-write remembered set _verify_forwarded_allow, // forwarded references allowed @@ -1149,8 +1129,9 @@ void ShenandoahVerifier::verify_before_update_refs() { } // We have not yet cleanup (reclaimed) the collection set -void ShenandoahVerifier::verify_after_update_refs() { +void ShenandoahVerifier::verify_after_update_refs(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "After Updating References", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_none, // no forwarded references @@ -1163,8 +1144,9 @@ void ShenandoahVerifier::verify_after_update_refs() { ); } -void ShenandoahVerifier::verify_after_degenerated() { +void ShenandoahVerifier::verify_after_degenerated(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "After Degenerated GC", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_none, // all objects are non-forwarded @@ -1177,8 +1159,9 @@ void ShenandoahVerifier::verify_after_degenerated() { ); } -void ShenandoahVerifier::verify_before_fullgc() { +void ShenandoahVerifier::verify_before_fullgc(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "Before Full GC", _verify_remembered_disable, // do not verify remembered set _verify_forwarded_allow, // can have forwarded objects @@ -1191,8 +1174,9 @@ void ShenandoahVerifier::verify_before_fullgc() { ); } -void ShenandoahVerifier::verify_after_fullgc() { +void ShenandoahVerifier::verify_after_fullgc(ShenandoahGeneration* generation) { verify_at_safepoint( + generation, "After Full GC", _verify_remembered_after_full_gc, // verify read-write remembered set _verify_forwarded_none, // all objects are non-forwarded @@ -1257,14 +1241,14 @@ public: void do_oop(oop* p) override { do_oop_work(p); } }; -void ShenandoahVerifier::verify_roots_in_to_space() { +void ShenandoahVerifier::verify_roots_in_to_space(ShenandoahGeneration* generation) { ShenandoahVerifyInToSpaceClosure cl; - ShenandoahRootVerifier::roots_do(&cl); + ShenandoahRootVerifier::roots_do(&cl, generation); } -void ShenandoahVerifier::verify_roots_no_forwarded() { +void ShenandoahVerifier::verify_roots_no_forwarded(ShenandoahGeneration* generation) { ShenandoahVerifyNoForwarded cl; - ShenandoahRootVerifier::roots_do(&cl); + ShenandoahRootVerifier::roots_do(&cl, generation); } template @@ -1300,7 +1284,6 @@ public: template void ShenandoahVerifier::help_verify_region_rem_set(Scanner* scanner, ShenandoahHeapRegion* r, HeapWord* registration_watermark, const char* message) { - shenandoah_assert_generations_reconciled(); ShenandoahOldGeneration* old_gen = _heap->old_generation(); assert(old_gen->is_mark_complete() || old_gen->is_parsable(), "Sanity"); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp index aba6379e022..e49990fdc62 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp @@ -196,7 +196,8 @@ public: }; private: - void verify_at_safepoint(const char* label, + void verify_at_safepoint(ShenandoahGeneration* generation, + const char* label, VerifyRememberedSet remembered, VerifyForwarded forwarded, VerifyMarked marked, @@ -210,20 +211,20 @@ public: ShenandoahVerifier(ShenandoahHeap* heap, MarkBitMap* verification_bitmap) : _heap(heap), _verification_bit_map(verification_bitmap) {}; - void verify_before_concmark(); - void verify_after_concmark(); - void verify_after_concmark_with_promotions(); - void verify_before_evacuation(); - void verify_before_update_refs(); - void verify_after_update_refs(); - void verify_before_fullgc(); - void verify_after_fullgc(); - void verify_after_degenerated(); - void verify_generic(VerifyOption option); + void verify_before_concmark(ShenandoahGeneration* generation); + void verify_after_concmark(ShenandoahGeneration* generation); + void verify_after_concmark_with_promotions(ShenandoahGeneration* generation); + void verify_before_evacuation(ShenandoahGeneration* generation); + void verify_before_update_refs(ShenandoahGeneration* generation); + void verify_after_update_refs(ShenandoahGeneration* generation); + void verify_before_fullgc(ShenandoahGeneration* generation); + void verify_after_fullgc(ShenandoahGeneration* generation); + void verify_after_degenerated(ShenandoahGeneration* generation); + void verify_generic(ShenandoahGeneration* generation, VerifyOption option); // Roots should only contain to-space oops - void verify_roots_in_to_space(); - void verify_roots_no_forwarded(); + void verify_roots_in_to_space(ShenandoahGeneration* generation); + void verify_roots_no_forwarded(ShenandoahGeneration* generation); // Check that generation usages are accurate before rebuilding free set void verify_before_rebuilding_free_set(); From 62f11cd4070f21ad82eebbb5319bdbbf4e13f9cf Mon Sep 17 00:00:00 2001 From: Shawn M Emery Date: Thu, 23 Oct 2025 19:36:49 +0000 Subject: [PATCH 276/561] 8326609: New AES implementation with updates specified in FIPS 197 Reviewed-by: valeriep --- src/hotspot/share/classfile/vmIntrinsics.hpp | 4 +- src/hotspot/share/opto/library_call.cpp | 20 +- .../com/sun/crypto/provider/AESCipher.java | 8 +- .../com/sun/crypto/provider/AESCrypt.java | 1437 ----------------- .../sun/crypto/provider/AESKeyGenerator.java | 4 +- .../com/sun/crypto/provider/AESKeyWrap.java | 4 +- .../sun/crypto/provider/AESKeyWrapPadded.java | 4 +- .../com/sun/crypto/provider/AES_Crypt.java | 1392 ++++++++++++++++ .../classes/com/sun/crypto/provider/GCTR.java | 4 +- .../crypto/provider/GaloisCounterMode.java | 12 +- .../sun/crypto/provider/KeyWrapCipher.java | 4 +- .../com/sun/crypto/provider/PBES2Core.java | 4 +- .../sun/crypto/provider/SymmetricCipher.java | 4 +- src/java.base/share/legal/aes.md | 36 - .../compiler/codegen/aes/TestAESMain.java | 4 +- .../compiler/cpuflags/AESIntrinsicsBase.java | 4 +- .../hotspot/test/TestHotSpotJVMCIRuntime.java | 4 +- .../bench/javax/crypto/AESDecrypt.java | 84 + 18 files changed, 1518 insertions(+), 1515 deletions(-) delete mode 100644 src/java.base/share/classes/com/sun/crypto/provider/AESCrypt.java create mode 100644 src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java delete mode 100644 src/java.base/share/legal/aes.md create mode 100644 test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java diff --git a/src/hotspot/share/classfile/vmIntrinsics.hpp b/src/hotspot/share/classfile/vmIntrinsics.hpp index c9c5c925f86..0895418ef84 100644 --- a/src/hotspot/share/classfile/vmIntrinsics.hpp +++ b/src/hotspot/share/classfile/vmIntrinsics.hpp @@ -467,8 +467,8 @@ class methodHandle; do_intrinsic(_Reference_clear0, java_lang_ref_Reference, clear0_name, void_method_signature, F_RN) \ do_intrinsic(_PhantomReference_clear0, java_lang_ref_PhantomReference, clear0_name, void_method_signature, F_RN) \ \ - /* support for com.sun.crypto.provider.AESCrypt and some of its callers */ \ - do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \ + /* support for com.sun.crypto.provider.AES_Crypt and some of its callers */ \ + do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AES_Crypt") \ do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ do_name( encryptBlock_name, "implEncryptBlock") \ diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index ee3a3d3ba47..bd8a550b9ab 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -7273,7 +7273,7 @@ bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) { const TypeInstPtr* tinst = _gvn.type(cipherBlockChaining_object)->isa_instptr(); assert(tinst != nullptr, "CBC obj is null"); assert(tinst->is_loaded(), "CBC obj is not loaded"); - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); @@ -7359,7 +7359,7 @@ bool LibraryCallKit::inline_electronicCodeBook_AESCrypt(vmIntrinsics::ID id) { const TypeInstPtr* tinst = _gvn.type(electronicCodeBook_object)->isa_instptr(); assert(tinst != nullptr, "ECB obj is null"); assert(tinst->is_loaded(), "ECB obj is not loaded"); - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); @@ -7429,7 +7429,7 @@ bool LibraryCallKit::inline_counterMode_AESCrypt(vmIntrinsics::ID id) { const TypeInstPtr* tinst = _gvn.type(counterMode_object)->isa_instptr(); assert(tinst != nullptr, "CTR obj is null"); assert(tinst->is_loaded(), "CTR obj is not loaded"); - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); @@ -7469,7 +7469,7 @@ Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) // However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption. // The ppc64 and riscv64 stubs of encryption and decryption use the same round keys (sessionK[0]). Node* objSessionK = load_field_from_object(aescrypt_object, "sessionK", "[[I"); - assert (objSessionK != nullptr, "wrong version of com.sun.crypto.provider.AESCrypt"); + assert (objSessionK != nullptr, "wrong version of com.sun.crypto.provider.AES_Crypt"); if (objSessionK == nullptr) { return (Node *) nullptr; } @@ -7477,7 +7477,7 @@ Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) #else Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I"); #endif // PPC64 - assert (objAESCryptKey != nullptr, "wrong version of com.sun.crypto.provider.AESCrypt"); + assert (objAESCryptKey != nullptr, "wrong version of com.sun.crypto.provider.AES_Crypt"); if (objAESCryptKey == nullptr) return (Node *) nullptr; // now have the array, need to get the start address of the K array @@ -7512,7 +7512,7 @@ Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypt assert(tinst->is_loaded(), "CBCobj is not loaded"); // we want to do an instanceof comparison against the AESCrypt class - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); if (!klass_AESCrypt->is_loaded()) { // if AESCrypt is not even loaded, we never take the intrinsic fast path Node* ctrl = control(); @@ -7575,7 +7575,7 @@ Node* LibraryCallKit::inline_electronicCodeBook_AESCrypt_predicate(bool decrypti assert(tinst->is_loaded(), "ECBobj is not loaded"); // we want to do an instanceof comparison against the AESCrypt class - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); if (!klass_AESCrypt->is_loaded()) { // if AESCrypt is not even loaded, we never take the intrinsic fast path Node* ctrl = control(); @@ -7635,7 +7635,7 @@ Node* LibraryCallKit::inline_counterMode_AESCrypt_predicate() { assert(tinst->is_loaded(), "CTRobj is not loaded"); // we want to do an instanceof comparison against the AESCrypt class - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); if (!klass_AESCrypt->is_loaded()) { // if AESCrypt is not even loaded, we never take the intrinsic fast path Node* ctrl = control(); @@ -8608,7 +8608,7 @@ bool LibraryCallKit::inline_galoisCounterMode_AESCrypt() { const TypeInstPtr* tinst = _gvn.type(gctr_object)->isa_instptr(); assert(tinst != nullptr, "GCTR obj is null"); assert(tinst->is_loaded(), "GCTR obj is not loaded"); - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); @@ -8662,7 +8662,7 @@ Node* LibraryCallKit::inline_galoisCounterMode_AESCrypt_predicate() { assert(tinst->is_loaded(), "GCTR obj is not loaded"); // we want to do an instanceof comparison against the AESCrypt class - ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + ciKlass* klass_AESCrypt = tinst->instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AES_Crypt")); if (!klass_AESCrypt->is_loaded()) { // if AESCrypt is not even loaded, we never take the intrinsic fast path Node* ctrl = control(); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java index 12359cba7d1..329f367717a 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -49,7 +49,7 @@ import java.util.Arrays; * * @author Valerie Peng * - * @see AESCrypt + * @see AES_Crypt * @see CipherBlockChaining * @see ElectronicCodeBook * @see CipherFeedback @@ -174,7 +174,7 @@ class AESCipher extends CipherSpi { * PKCS5Padding. */ protected AESCipher(int keySize) { - core = new CipherCore(new AESCrypt(), AESConstants.AES_BLOCK_SIZE); + core = new CipherCore(new AES_Crypt(), AESConstants.AES_BLOCK_SIZE); fixedKeySize = keySize; } @@ -504,7 +504,7 @@ class AESCipher extends CipherSpi { protected int engineGetKeySize(Key key) throws InvalidKeyException { byte[] encoded = key.getEncoded(); Arrays.fill(encoded, (byte)0); - if (!AESCrypt.isKeySizeValid(encoded.length)) { + if (!AES_Crypt.isKeySizeValid(encoded.length)) { throw new InvalidKeyException("Invalid AES key length: " + encoded.length + " bytes"); } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESCrypt.java b/src/java.base/share/classes/com/sun/crypto/provider/AESCrypt.java deleted file mode 100644 index 9bbc8c16764..00000000000 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESCrypt.java +++ /dev/null @@ -1,1437 +0,0 @@ -/* - * Copyright (c) 2002, 2022, 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. - */ - -/* $Id: Rijndael.java,v 1.6 2000/02/10 01:31:41 gelderen Exp $ - * - * Copyright (C) 1995-2000 The Cryptix Foundation Limited. - * All rights reserved. - * - * Use, modification, copying and distribution of this softwareas is subject - * the terms and conditions of the Cryptix General Licence. You should have - * received a copy of the Cryptix General Licence along with this library; - * if not, you can download a copy from http://www.cryptix.org/ . - */ - -package com.sun.crypto.provider; - -import java.security.InvalidKeyException; -import java.security.MessageDigest; -import java.util.Arrays; - -import jdk.internal.vm.annotation.IntrinsicCandidate; - -/** - * Rijndael --pronounced Reindaal-- is a symmetric cipher with a 128-bit - * block size and variable key-size (128-, 192- and 256-bit). - *

        - * Rijndael was designed by Vincent - * Rijmen and Joan Daemen. - */ -final class AESCrypt extends SymmetricCipher implements AESConstants { - // - // Pre-computed tables, which are copied or derived from FIPS 197. - // - - // the pre-computed substitution table (S-box), 256 bytes - private static final byte[] S = { - (byte)0x63, (byte)0x7C, (byte)0x77, (byte)0x7B, - (byte)0xF2, (byte)0x6B, (byte)0x6F, (byte)0xC5, - (byte)0x30, (byte)0x01, (byte)0x67, (byte)0x2B, - (byte)0xFE, (byte)0xD7, (byte)0xAB, (byte)0x76, - (byte)0xCA, (byte)0x82, (byte)0xC9, (byte)0x7D, - (byte)0xFA, (byte)0x59, (byte)0x47, (byte)0xF0, - (byte)0xAD, (byte)0xD4, (byte)0xA2, (byte)0xAF, - (byte)0x9C, (byte)0xA4, (byte)0x72, (byte)0xC0, - (byte)0xB7, (byte)0xFD, (byte)0x93, (byte)0x26, - (byte)0x36, (byte)0x3F, (byte)0xF7, (byte)0xCC, - (byte)0x34, (byte)0xA5, (byte)0xE5, (byte)0xF1, - (byte)0x71, (byte)0xD8, (byte)0x31, (byte)0x15, - (byte)0x04, (byte)0xC7, (byte)0x23, (byte)0xC3, - (byte)0x18, (byte)0x96, (byte)0x05, (byte)0x9A, - (byte)0x07, (byte)0x12, (byte)0x80, (byte)0xE2, - (byte)0xEB, (byte)0x27, (byte)0xB2, (byte)0x75, - (byte)0x09, (byte)0x83, (byte)0x2C, (byte)0x1A, - (byte)0x1B, (byte)0x6E, (byte)0x5A, (byte)0xA0, - (byte)0x52, (byte)0x3B, (byte)0xD6, (byte)0xB3, - (byte)0x29, (byte)0xE3, (byte)0x2F, (byte)0x84, - (byte)0x53, (byte)0xD1, (byte)0x00, (byte)0xED, - (byte)0x20, (byte)0xFC, (byte)0xB1, (byte)0x5B, - (byte)0x6A, (byte)0xCB, (byte)0xBE, (byte)0x39, - (byte)0x4A, (byte)0x4C, (byte)0x58, (byte)0xCF, - (byte)0xD0, (byte)0xEF, (byte)0xAA, (byte)0xFB, - (byte)0x43, (byte)0x4D, (byte)0x33, (byte)0x85, - (byte)0x45, (byte)0xF9, (byte)0x02, (byte)0x7F, - (byte)0x50, (byte)0x3C, (byte)0x9F, (byte)0xA8, - (byte)0x51, (byte)0xA3, (byte)0x40, (byte)0x8F, - (byte)0x92, (byte)0x9D, (byte)0x38, (byte)0xF5, - (byte)0xBC, (byte)0xB6, (byte)0xDA, (byte)0x21, - (byte)0x10, (byte)0xFF, (byte)0xF3, (byte)0xD2, - (byte)0xCD, (byte)0x0C, (byte)0x13, (byte)0xEC, - (byte)0x5F, (byte)0x97, (byte)0x44, (byte)0x17, - (byte)0xC4, (byte)0xA7, (byte)0x7E, (byte)0x3D, - (byte)0x64, (byte)0x5D, (byte)0x19, (byte)0x73, - (byte)0x60, (byte)0x81, (byte)0x4F, (byte)0xDC, - (byte)0x22, (byte)0x2A, (byte)0x90, (byte)0x88, - (byte)0x46, (byte)0xEE, (byte)0xB8, (byte)0x14, - (byte)0xDE, (byte)0x5E, (byte)0x0B, (byte)0xDB, - (byte)0xE0, (byte)0x32, (byte)0x3A, (byte)0x0A, - (byte)0x49, (byte)0x06, (byte)0x24, (byte)0x5C, - (byte)0xC2, (byte)0xD3, (byte)0xAC, (byte)0x62, - (byte)0x91, (byte)0x95, (byte)0xE4, (byte)0x79, - (byte)0xE7, (byte)0xC8, (byte)0x37, (byte)0x6D, - (byte)0x8D, (byte)0xD5, (byte)0x4E, (byte)0xA9, - (byte)0x6C, (byte)0x56, (byte)0xF4, (byte)0xEA, - (byte)0x65, (byte)0x7A, (byte)0xAE, (byte)0x08, - (byte)0xBA, (byte)0x78, (byte)0x25, (byte)0x2E, - (byte)0x1C, (byte)0xA6, (byte)0xB4, (byte)0xC6, - (byte)0xE8, (byte)0xDD, (byte)0x74, (byte)0x1F, - (byte)0x4B, (byte)0xBD, (byte)0x8B, (byte)0x8A, - (byte)0x70, (byte)0x3E, (byte)0xB5, (byte)0x66, - (byte)0x48, (byte)0x03, (byte)0xF6, (byte)0x0E, - (byte)0x61, (byte)0x35, (byte)0x57, (byte)0xB9, - (byte)0x86, (byte)0xC1, (byte)0x1D, (byte)0x9E, - (byte)0xE1, (byte)0xF8, (byte)0x98, (byte)0x11, - (byte)0x69, (byte)0xD9, (byte)0x8E, (byte)0x94, - (byte)0x9B, (byte)0x1E, (byte)0x87, (byte)0xE9, - (byte)0xCE, (byte)0x55, (byte)0x28, (byte)0xDF, - (byte)0x8C, (byte)0xA1, (byte)0x89, (byte)0x0D, - (byte)0xBF, (byte)0xE6, (byte)0x42, (byte)0x68, - (byte)0x41, (byte)0x99, (byte)0x2D, (byte)0x0F, - (byte)0xB0, (byte)0x54, (byte)0xBB, (byte)0x16, - }; - - // the pre-computed substitution table (inverse S-box), 256 bytes - private static final byte[] Si = { - (byte)0x52, (byte)0x09, (byte)0x6A, (byte)0xD5, - (byte)0x30, (byte)0x36, (byte)0xA5, (byte)0x38, - (byte)0xBF, (byte)0x40, (byte)0xA3, (byte)0x9E, - (byte)0x81, (byte)0xF3, (byte)0xD7, (byte)0xFB, - (byte)0x7C, (byte)0xE3, (byte)0x39, (byte)0x82, - (byte)0x9B, (byte)0x2F, (byte)0xFF, (byte)0x87, - (byte)0x34, (byte)0x8E, (byte)0x43, (byte)0x44, - (byte)0xC4, (byte)0xDE, (byte)0xE9, (byte)0xCB, - (byte)0x54, (byte)0x7B, (byte)0x94, (byte)0x32, - (byte)0xA6, (byte)0xC2, (byte)0x23, (byte)0x3D, - (byte)0xEE, (byte)0x4C, (byte)0x95, (byte)0x0B, - (byte)0x42, (byte)0xFA, (byte)0xC3, (byte)0x4E, - (byte)0x08, (byte)0x2E, (byte)0xA1, (byte)0x66, - (byte)0x28, (byte)0xD9, (byte)0x24, (byte)0xB2, - (byte)0x76, (byte)0x5B, (byte)0xA2, (byte)0x49, - (byte)0x6D, (byte)0x8B, (byte)0xD1, (byte)0x25, - (byte)0x72, (byte)0xF8, (byte)0xF6, (byte)0x64, - (byte)0x86, (byte)0x68, (byte)0x98, (byte)0x16, - (byte)0xD4, (byte)0xA4, (byte)0x5C, (byte)0xCC, - (byte)0x5D, (byte)0x65, (byte)0xB6, (byte)0x92, - (byte)0x6C, (byte)0x70, (byte)0x48, (byte)0x50, - (byte)0xFD, (byte)0xED, (byte)0xB9, (byte)0xDA, - (byte)0x5E, (byte)0x15, (byte)0x46, (byte)0x57, - (byte)0xA7, (byte)0x8D, (byte)0x9D, (byte)0x84, - (byte)0x90, (byte)0xD8, (byte)0xAB, (byte)0x00, - (byte)0x8C, (byte)0xBC, (byte)0xD3, (byte)0x0A, - (byte)0xF7, (byte)0xE4, (byte)0x58, (byte)0x05, - (byte)0xB8, (byte)0xB3, (byte)0x45, (byte)0x06, - (byte)0xD0, (byte)0x2C, (byte)0x1E, (byte)0x8F, - (byte)0xCA, (byte)0x3F, (byte)0x0F, (byte)0x02, - (byte)0xC1, (byte)0xAF, (byte)0xBD, (byte)0x03, - (byte)0x01, (byte)0x13, (byte)0x8A, (byte)0x6B, - (byte)0x3A, (byte)0x91, (byte)0x11, (byte)0x41, - (byte)0x4F, (byte)0x67, (byte)0xDC, (byte)0xEA, - (byte)0x97, (byte)0xF2, (byte)0xCF, (byte)0xCE, - (byte)0xF0, (byte)0xB4, (byte)0xE6, (byte)0x73, - (byte)0x96, (byte)0xAC, (byte)0x74, (byte)0x22, - (byte)0xE7, (byte)0xAD, (byte)0x35, (byte)0x85, - (byte)0xE2, (byte)0xF9, (byte)0x37, (byte)0xE8, - (byte)0x1C, (byte)0x75, (byte)0xDF, (byte)0x6E, - (byte)0x47, (byte)0xF1, (byte)0x1A, (byte)0x71, - (byte)0x1D, (byte)0x29, (byte)0xC5, (byte)0x89, - (byte)0x6F, (byte)0xB7, (byte)0x62, (byte)0x0E, - (byte)0xAA, (byte)0x18, (byte)0xBE, (byte)0x1B, - (byte)0xFC, (byte)0x56, (byte)0x3E, (byte)0x4B, - (byte)0xC6, (byte)0xD2, (byte)0x79, (byte)0x20, - (byte)0x9A, (byte)0xDB, (byte)0xC0, (byte)0xFE, - (byte)0x78, (byte)0xCD, (byte)0x5A, (byte)0xF4, - (byte)0x1F, (byte)0xDD, (byte)0xA8, (byte)0x33, - (byte)0x88, (byte)0x07, (byte)0xC7, (byte)0x31, - (byte)0xB1, (byte)0x12, (byte)0x10, (byte)0x59, - (byte)0x27, (byte)0x80, (byte)0xEC, (byte)0x5F, - (byte)0x60, (byte)0x51, (byte)0x7F, (byte)0xA9, - (byte)0x19, (byte)0xB5, (byte)0x4A, (byte)0x0D, - (byte)0x2D, (byte)0xE5, (byte)0x7A, (byte)0x9F, - (byte)0x93, (byte)0xC9, (byte)0x9C, (byte)0xEF, - (byte)0xA0, (byte)0xE0, (byte)0x3B, (byte)0x4D, - (byte)0xAE, (byte)0x2A, (byte)0xF5, (byte)0xB0, - (byte)0xC8, (byte)0xEB, (byte)0xBB, (byte)0x3C, - (byte)0x83, (byte)0x53, (byte)0x99, (byte)0x61, - (byte)0x17, (byte)0x2B, (byte)0x04, (byte)0x7E, - (byte)0xBA, (byte)0x77, (byte)0xD6, (byte)0x26, - (byte)0xE1, (byte)0x69, (byte)0x14, (byte)0x63, - (byte)0x55, (byte)0x21, (byte)0x0C, (byte)0x7D, - }; - - // pre-computed tables (T-box) - private static final int[] T1 = { - 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, - 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, - 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, - 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, - 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, - 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, - 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, - 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B, - 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, - 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, - 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, - 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, - 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, - 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5, - 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, - 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, - 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, - 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, - 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, - 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, - 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, - 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, - 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, - 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, - 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, - 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, - 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, - 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, - 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, - 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, - 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, - 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, - 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, - 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, - 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, - 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, - 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, - 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883, - 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, - 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, - 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, - 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, - 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, - 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B, - 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, - 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, - 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, - 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, - 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, - 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, - 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, - 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, - 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, - 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, - 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, - 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, - 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, - 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, - 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, - 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, - 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, - 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8, - 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, - 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A, - }; - - private static final int[] T2 = { - 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, - 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, - 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, - 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676, - 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, - 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, - 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, - 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, - 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, - 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, - 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, - 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, - 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, - 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, - 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, - 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, - 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, - 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, - 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, - 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, - 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, - 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, - 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, - 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, - 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, - 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, - 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, - 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8, - 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, - 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, - 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, - 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, - 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, - 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717, - 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, - 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, - 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, - 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, - 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, - 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, - 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, - 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, - 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, - 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, - 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, - 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, - 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, - 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, - 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, - 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, - 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, - 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, - 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, - 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, - 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, - 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, - 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, - 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494, - 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, - 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, - 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, - 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, - 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, - 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616, - }; - - private static final int[] T3 = { - 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, - 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, - 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, - 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, - 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, - 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, - 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, - 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, - 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, - 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, - 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, - 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15, - 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, - 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, - 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, - 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, - 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, - 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0, - 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, - 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, - 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, - 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, - 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, - 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF, - 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, - 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, - 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, - 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, - 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, - 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, - 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, - 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, - 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, - 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, - 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, - 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, - 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, - 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, - 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, - 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, - 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, - 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C, - 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, - 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, - 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, - 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, - 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, - 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008, - 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, - 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, - 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, - 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, - 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, - 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E, - 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, - 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, - 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, - 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, - 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, - 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, - 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, - 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, - 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, - 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16, - }; - - private static final int[] T4 = { - 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, - 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, - 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, - 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, - 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, - 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, - 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, - 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, - 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, - 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, - 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, - 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, - 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, - 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, - 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, - 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, - 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, - 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, - 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, - 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, - 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, - 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, - 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, - 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, - 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, - 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, - 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, - 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, - 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, - 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, - 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, - 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, - 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, - 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, - 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, - 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, - 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, - 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, - 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, - 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, - 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, - 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, - 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, - 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, - 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, - 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, - 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, - 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, - 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, - 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, - 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, - 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, - 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, - 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, - 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, - 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, - 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, - 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, - 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, - 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, - 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, - 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, - 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, - 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C, - }; - - - // pre-computed inverse tables (inverse T-box) - private static final int[] T5 = { - 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, - 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, - 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, - 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, - 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, - 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, - 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, - 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844, - 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, - 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, - 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, - 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, - 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, - 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A, - 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, - 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, - 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, - 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, - 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, - 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, - 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, - 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, - 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, - 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, - 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, - 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, - 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, - 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, - 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, - 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, - 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, - 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, - 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, - 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, - 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, - 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, - 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, - 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0, - 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, - 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, - 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, - 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, - 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, - 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5, - 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, - 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, - 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, - 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, - 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, - 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, - 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, - 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, - 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, - 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, - 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, - 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, - 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, - 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, - 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, - 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, - 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, - 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541, - 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, - 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742, - }; - - private static final int[] T6 = { - 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, - 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, - 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, - 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3, - 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, - 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, - 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, - 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, - 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, - 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, - 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, - 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, - 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, - 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, - 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, - 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, - 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, - 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, - 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, - 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, - 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, - 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015, - 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, - 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, - 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, - 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, - 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, - 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E, - 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, - 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, - 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, - 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, - 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, - 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E, - 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, - 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, - 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, - 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, - 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, - 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, - 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, - 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, - 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, - 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, - 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, - 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, - 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, - 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, - 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, - 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, - 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, - 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, - 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, - 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, - 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, - 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, - 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, - 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1, - 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, - 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, - 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, - 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, - 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, - 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857, - }; - - private static final int[] T7 = { - 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, - 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, - 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, - 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, - 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, - 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, - 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, - 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, - 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, - 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, - 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, - 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, - 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, - 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, - 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, - 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, - 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, - 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6, - 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, - 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, - 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, - 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, - 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, - 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8, - 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, - 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, - 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, - 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, - 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, - 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, - 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, - 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, - 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, - 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, - 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, - 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, - 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, - 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, - 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, - 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, - 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, - 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, - 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, - 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, - 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, - 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, - 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, - 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15, - 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, - 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, - 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, - 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, - 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, - 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665, - 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, - 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, - 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, - 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, - 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, - 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, - 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, - 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, - 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, - 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8, - }; - - private static final int[] T8 = { - 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, - 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, - 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, - 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, - 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, - 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, - 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, - 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, - 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, - 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, - 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, - 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, - 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, - 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, - 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, - 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, - 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, - 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, - 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, - 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, - 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, - 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, - 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, - 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, - 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, - 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, - 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, - 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, - 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, - 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, - 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, - 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, - 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, - 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, - 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, - 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, - 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, - 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, - 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, - 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, - 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, - 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, - 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, - 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, - 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, - 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, - 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, - 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, - 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, - 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, - 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, - 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, - 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, - 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, - 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, - 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, - 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, - 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, - 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, - 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, - 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, - 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, - 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, - 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0, - }; - - private static final int[] U1 = { - 0x00000000, 0x0E090D0B, 0x1C121A16, 0x121B171D, - 0x3824342C, 0x362D3927, 0x24362E3A, 0x2A3F2331, - 0x70486858, 0x7E416553, 0x6C5A724E, 0x62537F45, - 0x486C5C74, 0x4665517F, 0x547E4662, 0x5A774B69, - 0xE090D0B0, 0xEE99DDBB, 0xFC82CAA6, 0xF28BC7AD, - 0xD8B4E49C, 0xD6BDE997, 0xC4A6FE8A, 0xCAAFF381, - 0x90D8B8E8, 0x9ED1B5E3, 0x8CCAA2FE, 0x82C3AFF5, - 0xA8FC8CC4, 0xA6F581CF, 0xB4EE96D2, 0xBAE79BD9, - 0xDB3BBB7B, 0xD532B670, 0xC729A16D, 0xC920AC66, - 0xE31F8F57, 0xED16825C, 0xFF0D9541, 0xF104984A, - 0xAB73D323, 0xA57ADE28, 0xB761C935, 0xB968C43E, - 0x9357E70F, 0x9D5EEA04, 0x8F45FD19, 0x814CF012, - 0x3BAB6BCB, 0x35A266C0, 0x27B971DD, 0x29B07CD6, - 0x038F5FE7, 0x0D8652EC, 0x1F9D45F1, 0x119448FA, - 0x4BE30393, 0x45EA0E98, 0x57F11985, 0x59F8148E, - 0x73C737BF, 0x7DCE3AB4, 0x6FD52DA9, 0x61DC20A2, - 0xAD766DF6, 0xA37F60FD, 0xB16477E0, 0xBF6D7AEB, - 0x955259DA, 0x9B5B54D1, 0x894043CC, 0x87494EC7, - 0xDD3E05AE, 0xD33708A5, 0xC12C1FB8, 0xCF2512B3, - 0xE51A3182, 0xEB133C89, 0xF9082B94, 0xF701269F, - 0x4DE6BD46, 0x43EFB04D, 0x51F4A750, 0x5FFDAA5B, - 0x75C2896A, 0x7BCB8461, 0x69D0937C, 0x67D99E77, - 0x3DAED51E, 0x33A7D815, 0x21BCCF08, 0x2FB5C203, - 0x058AE132, 0x0B83EC39, 0x1998FB24, 0x1791F62F, - 0x764DD68D, 0x7844DB86, 0x6A5FCC9B, 0x6456C190, - 0x4E69E2A1, 0x4060EFAA, 0x527BF8B7, 0x5C72F5BC, - 0x0605BED5, 0x080CB3DE, 0x1A17A4C3, 0x141EA9C8, - 0x3E218AF9, 0x302887F2, 0x223390EF, 0x2C3A9DE4, - 0x96DD063D, 0x98D40B36, 0x8ACF1C2B, 0x84C61120, - 0xAEF93211, 0xA0F03F1A, 0xB2EB2807, 0xBCE2250C, - 0xE6956E65, 0xE89C636E, 0xFA877473, 0xF48E7978, - 0xDEB15A49, 0xD0B85742, 0xC2A3405F, 0xCCAA4D54, - 0x41ECDAF7, 0x4FE5D7FC, 0x5DFEC0E1, 0x53F7CDEA, - 0x79C8EEDB, 0x77C1E3D0, 0x65DAF4CD, 0x6BD3F9C6, - 0x31A4B2AF, 0x3FADBFA4, 0x2DB6A8B9, 0x23BFA5B2, - 0x09808683, 0x07898B88, 0x15929C95, 0x1B9B919E, - 0xA17C0A47, 0xAF75074C, 0xBD6E1051, 0xB3671D5A, - 0x99583E6B, 0x97513360, 0x854A247D, 0x8B432976, - 0xD134621F, 0xDF3D6F14, 0xCD267809, 0xC32F7502, - 0xE9105633, 0xE7195B38, 0xF5024C25, 0xFB0B412E, - 0x9AD7618C, 0x94DE6C87, 0x86C57B9A, 0x88CC7691, - 0xA2F355A0, 0xACFA58AB, 0xBEE14FB6, 0xB0E842BD, - 0xEA9F09D4, 0xE49604DF, 0xF68D13C2, 0xF8841EC9, - 0xD2BB3DF8, 0xDCB230F3, 0xCEA927EE, 0xC0A02AE5, - 0x7A47B13C, 0x744EBC37, 0x6655AB2A, 0x685CA621, - 0x42638510, 0x4C6A881B, 0x5E719F06, 0x5078920D, - 0x0A0FD964, 0x0406D46F, 0x161DC372, 0x1814CE79, - 0x322BED48, 0x3C22E043, 0x2E39F75E, 0x2030FA55, - 0xEC9AB701, 0xE293BA0A, 0xF088AD17, 0xFE81A01C, - 0xD4BE832D, 0xDAB78E26, 0xC8AC993B, 0xC6A59430, - 0x9CD2DF59, 0x92DBD252, 0x80C0C54F, 0x8EC9C844, - 0xA4F6EB75, 0xAAFFE67E, 0xB8E4F163, 0xB6EDFC68, - 0x0C0A67B1, 0x02036ABA, 0x10187DA7, 0x1E1170AC, - 0x342E539D, 0x3A275E96, 0x283C498B, 0x26354480, - 0x7C420FE9, 0x724B02E2, 0x605015FF, 0x6E5918F4, - 0x44663BC5, 0x4A6F36CE, 0x587421D3, 0x567D2CD8, - 0x37A10C7A, 0x39A80171, 0x2BB3166C, 0x25BA1B67, - 0x0F853856, 0x018C355D, 0x13972240, 0x1D9E2F4B, - 0x47E96422, 0x49E06929, 0x5BFB7E34, 0x55F2733F, - 0x7FCD500E, 0x71C45D05, 0x63DF4A18, 0x6DD64713, - 0xD731DCCA, 0xD938D1C1, 0xCB23C6DC, 0xC52ACBD7, - 0xEF15E8E6, 0xE11CE5ED, 0xF307F2F0, 0xFD0EFFFB, - 0xA779B492, 0xA970B999, 0xBB6BAE84, 0xB562A38F, - 0x9F5D80BE, 0x91548DB5, 0x834F9AA8, 0x8D4697A3, - }; - - private static final int[] U2 = { - 0x00000000, 0x0B0E090D, 0x161C121A, 0x1D121B17, - 0x2C382434, 0x27362D39, 0x3A24362E, 0x312A3F23, - 0x58704868, 0x537E4165, 0x4E6C5A72, 0x4562537F, - 0x74486C5C, 0x7F466551, 0x62547E46, 0x695A774B, - 0xB0E090D0, 0xBBEE99DD, 0xA6FC82CA, 0xADF28BC7, - 0x9CD8B4E4, 0x97D6BDE9, 0x8AC4A6FE, 0x81CAAFF3, - 0xE890D8B8, 0xE39ED1B5, 0xFE8CCAA2, 0xF582C3AF, - 0xC4A8FC8C, 0xCFA6F581, 0xD2B4EE96, 0xD9BAE79B, - 0x7BDB3BBB, 0x70D532B6, 0x6DC729A1, 0x66C920AC, - 0x57E31F8F, 0x5CED1682, 0x41FF0D95, 0x4AF10498, - 0x23AB73D3, 0x28A57ADE, 0x35B761C9, 0x3EB968C4, - 0x0F9357E7, 0x049D5EEA, 0x198F45FD, 0x12814CF0, - 0xCB3BAB6B, 0xC035A266, 0xDD27B971, 0xD629B07C, - 0xE7038F5F, 0xEC0D8652, 0xF11F9D45, 0xFA119448, - 0x934BE303, 0x9845EA0E, 0x8557F119, 0x8E59F814, - 0xBF73C737, 0xB47DCE3A, 0xA96FD52D, 0xA261DC20, - 0xF6AD766D, 0xFDA37F60, 0xE0B16477, 0xEBBF6D7A, - 0xDA955259, 0xD19B5B54, 0xCC894043, 0xC787494E, - 0xAEDD3E05, 0xA5D33708, 0xB8C12C1F, 0xB3CF2512, - 0x82E51A31, 0x89EB133C, 0x94F9082B, 0x9FF70126, - 0x464DE6BD, 0x4D43EFB0, 0x5051F4A7, 0x5B5FFDAA, - 0x6A75C289, 0x617BCB84, 0x7C69D093, 0x7767D99E, - 0x1E3DAED5, 0x1533A7D8, 0x0821BCCF, 0x032FB5C2, - 0x32058AE1, 0x390B83EC, 0x241998FB, 0x2F1791F6, - 0x8D764DD6, 0x867844DB, 0x9B6A5FCC, 0x906456C1, - 0xA14E69E2, 0xAA4060EF, 0xB7527BF8, 0xBC5C72F5, - 0xD50605BE, 0xDE080CB3, 0xC31A17A4, 0xC8141EA9, - 0xF93E218A, 0xF2302887, 0xEF223390, 0xE42C3A9D, - 0x3D96DD06, 0x3698D40B, 0x2B8ACF1C, 0x2084C611, - 0x11AEF932, 0x1AA0F03F, 0x07B2EB28, 0x0CBCE225, - 0x65E6956E, 0x6EE89C63, 0x73FA8774, 0x78F48E79, - 0x49DEB15A, 0x42D0B857, 0x5FC2A340, 0x54CCAA4D, - 0xF741ECDA, 0xFC4FE5D7, 0xE15DFEC0, 0xEA53F7CD, - 0xDB79C8EE, 0xD077C1E3, 0xCD65DAF4, 0xC66BD3F9, - 0xAF31A4B2, 0xA43FADBF, 0xB92DB6A8, 0xB223BFA5, - 0x83098086, 0x8807898B, 0x9515929C, 0x9E1B9B91, - 0x47A17C0A, 0x4CAF7507, 0x51BD6E10, 0x5AB3671D, - 0x6B99583E, 0x60975133, 0x7D854A24, 0x768B4329, - 0x1FD13462, 0x14DF3D6F, 0x09CD2678, 0x02C32F75, - 0x33E91056, 0x38E7195B, 0x25F5024C, 0x2EFB0B41, - 0x8C9AD761, 0x8794DE6C, 0x9A86C57B, 0x9188CC76, - 0xA0A2F355, 0xABACFA58, 0xB6BEE14F, 0xBDB0E842, - 0xD4EA9F09, 0xDFE49604, 0xC2F68D13, 0xC9F8841E, - 0xF8D2BB3D, 0xF3DCB230, 0xEECEA927, 0xE5C0A02A, - 0x3C7A47B1, 0x37744EBC, 0x2A6655AB, 0x21685CA6, - 0x10426385, 0x1B4C6A88, 0x065E719F, 0x0D507892, - 0x640A0FD9, 0x6F0406D4, 0x72161DC3, 0x791814CE, - 0x48322BED, 0x433C22E0, 0x5E2E39F7, 0x552030FA, - 0x01EC9AB7, 0x0AE293BA, 0x17F088AD, 0x1CFE81A0, - 0x2DD4BE83, 0x26DAB78E, 0x3BC8AC99, 0x30C6A594, - 0x599CD2DF, 0x5292DBD2, 0x4F80C0C5, 0x448EC9C8, - 0x75A4F6EB, 0x7EAAFFE6, 0x63B8E4F1, 0x68B6EDFC, - 0xB10C0A67, 0xBA02036A, 0xA710187D, 0xAC1E1170, - 0x9D342E53, 0x963A275E, 0x8B283C49, 0x80263544, - 0xE97C420F, 0xE2724B02, 0xFF605015, 0xF46E5918, - 0xC544663B, 0xCE4A6F36, 0xD3587421, 0xD8567D2C, - 0x7A37A10C, 0x7139A801, 0x6C2BB316, 0x6725BA1B, - 0x560F8538, 0x5D018C35, 0x40139722, 0x4B1D9E2F, - 0x2247E964, 0x2949E069, 0x345BFB7E, 0x3F55F273, - 0x0E7FCD50, 0x0571C45D, 0x1863DF4A, 0x136DD647, - 0xCAD731DC, 0xC1D938D1, 0xDCCB23C6, 0xD7C52ACB, - 0xE6EF15E8, 0xEDE11CE5, 0xF0F307F2, 0xFBFD0EFF, - 0x92A779B4, 0x99A970B9, 0x84BB6BAE, 0x8FB562A3, - 0xBE9F5D80, 0xB591548D, 0xA8834F9A, 0xA38D4697, - }; - - private static final int[] U3 = { - 0x00000000, 0x0D0B0E09, 0x1A161C12, 0x171D121B, - 0x342C3824, 0x3927362D, 0x2E3A2436, 0x23312A3F, - 0x68587048, 0x65537E41, 0x724E6C5A, 0x7F456253, - 0x5C74486C, 0x517F4665, 0x4662547E, 0x4B695A77, - 0xD0B0E090, 0xDDBBEE99, 0xCAA6FC82, 0xC7ADF28B, - 0xE49CD8B4, 0xE997D6BD, 0xFE8AC4A6, 0xF381CAAF, - 0xB8E890D8, 0xB5E39ED1, 0xA2FE8CCA, 0xAFF582C3, - 0x8CC4A8FC, 0x81CFA6F5, 0x96D2B4EE, 0x9BD9BAE7, - 0xBB7BDB3B, 0xB670D532, 0xA16DC729, 0xAC66C920, - 0x8F57E31F, 0x825CED16, 0x9541FF0D, 0x984AF104, - 0xD323AB73, 0xDE28A57A, 0xC935B761, 0xC43EB968, - 0xE70F9357, 0xEA049D5E, 0xFD198F45, 0xF012814C, - 0x6BCB3BAB, 0x66C035A2, 0x71DD27B9, 0x7CD629B0, - 0x5FE7038F, 0x52EC0D86, 0x45F11F9D, 0x48FA1194, - 0x03934BE3, 0x0E9845EA, 0x198557F1, 0x148E59F8, - 0x37BF73C7, 0x3AB47DCE, 0x2DA96FD5, 0x20A261DC, - 0x6DF6AD76, 0x60FDA37F, 0x77E0B164, 0x7AEBBF6D, - 0x59DA9552, 0x54D19B5B, 0x43CC8940, 0x4EC78749, - 0x05AEDD3E, 0x08A5D337, 0x1FB8C12C, 0x12B3CF25, - 0x3182E51A, 0x3C89EB13, 0x2B94F908, 0x269FF701, - 0xBD464DE6, 0xB04D43EF, 0xA75051F4, 0xAA5B5FFD, - 0x896A75C2, 0x84617BCB, 0x937C69D0, 0x9E7767D9, - 0xD51E3DAE, 0xD81533A7, 0xCF0821BC, 0xC2032FB5, - 0xE132058A, 0xEC390B83, 0xFB241998, 0xF62F1791, - 0xD68D764D, 0xDB867844, 0xCC9B6A5F, 0xC1906456, - 0xE2A14E69, 0xEFAA4060, 0xF8B7527B, 0xF5BC5C72, - 0xBED50605, 0xB3DE080C, 0xA4C31A17, 0xA9C8141E, - 0x8AF93E21, 0x87F23028, 0x90EF2233, 0x9DE42C3A, - 0x063D96DD, 0x0B3698D4, 0x1C2B8ACF, 0x112084C6, - 0x3211AEF9, 0x3F1AA0F0, 0x2807B2EB, 0x250CBCE2, - 0x6E65E695, 0x636EE89C, 0x7473FA87, 0x7978F48E, - 0x5A49DEB1, 0x5742D0B8, 0x405FC2A3, 0x4D54CCAA, - 0xDAF741EC, 0xD7FC4FE5, 0xC0E15DFE, 0xCDEA53F7, - 0xEEDB79C8, 0xE3D077C1, 0xF4CD65DA, 0xF9C66BD3, - 0xB2AF31A4, 0xBFA43FAD, 0xA8B92DB6, 0xA5B223BF, - 0x86830980, 0x8B880789, 0x9C951592, 0x919E1B9B, - 0x0A47A17C, 0x074CAF75, 0x1051BD6E, 0x1D5AB367, - 0x3E6B9958, 0x33609751, 0x247D854A, 0x29768B43, - 0x621FD134, 0x6F14DF3D, 0x7809CD26, 0x7502C32F, - 0x5633E910, 0x5B38E719, 0x4C25F502, 0x412EFB0B, - 0x618C9AD7, 0x6C8794DE, 0x7B9A86C5, 0x769188CC, - 0x55A0A2F3, 0x58ABACFA, 0x4FB6BEE1, 0x42BDB0E8, - 0x09D4EA9F, 0x04DFE496, 0x13C2F68D, 0x1EC9F884, - 0x3DF8D2BB, 0x30F3DCB2, 0x27EECEA9, 0x2AE5C0A0, - 0xB13C7A47, 0xBC37744E, 0xAB2A6655, 0xA621685C, - 0x85104263, 0x881B4C6A, 0x9F065E71, 0x920D5078, - 0xD9640A0F, 0xD46F0406, 0xC372161D, 0xCE791814, - 0xED48322B, 0xE0433C22, 0xF75E2E39, 0xFA552030, - 0xB701EC9A, 0xBA0AE293, 0xAD17F088, 0xA01CFE81, - 0x832DD4BE, 0x8E26DAB7, 0x993BC8AC, 0x9430C6A5, - 0xDF599CD2, 0xD25292DB, 0xC54F80C0, 0xC8448EC9, - 0xEB75A4F6, 0xE67EAAFF, 0xF163B8E4, 0xFC68B6ED, - 0x67B10C0A, 0x6ABA0203, 0x7DA71018, 0x70AC1E11, - 0x539D342E, 0x5E963A27, 0x498B283C, 0x44802635, - 0x0FE97C42, 0x02E2724B, 0x15FF6050, 0x18F46E59, - 0x3BC54466, 0x36CE4A6F, 0x21D35874, 0x2CD8567D, - 0x0C7A37A1, 0x017139A8, 0x166C2BB3, 0x1B6725BA, - 0x38560F85, 0x355D018C, 0x22401397, 0x2F4B1D9E, - 0x642247E9, 0x692949E0, 0x7E345BFB, 0x733F55F2, - 0x500E7FCD, 0x5D0571C4, 0x4A1863DF, 0x47136DD6, - 0xDCCAD731, 0xD1C1D938, 0xC6DCCB23, 0xCBD7C52A, - 0xE8E6EF15, 0xE5EDE11C, 0xF2F0F307, 0xFFFBFD0E, - 0xB492A779, 0xB999A970, 0xAE84BB6B, 0xA38FB562, - 0x80BE9F5D, 0x8DB59154, 0x9AA8834F, 0x97A38D46, - }; - - private static final int[] U4 = { - 0x00000000, 0x090D0B0E, 0x121A161C, 0x1B171D12, - 0x24342C38, 0x2D392736, 0x362E3A24, 0x3F23312A, - 0x48685870, 0x4165537E, 0x5A724E6C, 0x537F4562, - 0x6C5C7448, 0x65517F46, 0x7E466254, 0x774B695A, - 0x90D0B0E0, 0x99DDBBEE, 0x82CAA6FC, 0x8BC7ADF2, - 0xB4E49CD8, 0xBDE997D6, 0xA6FE8AC4, 0xAFF381CA, - 0xD8B8E890, 0xD1B5E39E, 0xCAA2FE8C, 0xC3AFF582, - 0xFC8CC4A8, 0xF581CFA6, 0xEE96D2B4, 0xE79BD9BA, - 0x3BBB7BDB, 0x32B670D5, 0x29A16DC7, 0x20AC66C9, - 0x1F8F57E3, 0x16825CED, 0x0D9541FF, 0x04984AF1, - 0x73D323AB, 0x7ADE28A5, 0x61C935B7, 0x68C43EB9, - 0x57E70F93, 0x5EEA049D, 0x45FD198F, 0x4CF01281, - 0xAB6BCB3B, 0xA266C035, 0xB971DD27, 0xB07CD629, - 0x8F5FE703, 0x8652EC0D, 0x9D45F11F, 0x9448FA11, - 0xE303934B, 0xEA0E9845, 0xF1198557, 0xF8148E59, - 0xC737BF73, 0xCE3AB47D, 0xD52DA96F, 0xDC20A261, - 0x766DF6AD, 0x7F60FDA3, 0x6477E0B1, 0x6D7AEBBF, - 0x5259DA95, 0x5B54D19B, 0x4043CC89, 0x494EC787, - 0x3E05AEDD, 0x3708A5D3, 0x2C1FB8C1, 0x2512B3CF, - 0x1A3182E5, 0x133C89EB, 0x082B94F9, 0x01269FF7, - 0xE6BD464D, 0xEFB04D43, 0xF4A75051, 0xFDAA5B5F, - 0xC2896A75, 0xCB84617B, 0xD0937C69, 0xD99E7767, - 0xAED51E3D, 0xA7D81533, 0xBCCF0821, 0xB5C2032F, - 0x8AE13205, 0x83EC390B, 0x98FB2419, 0x91F62F17, - 0x4DD68D76, 0x44DB8678, 0x5FCC9B6A, 0x56C19064, - 0x69E2A14E, 0x60EFAA40, 0x7BF8B752, 0x72F5BC5C, - 0x05BED506, 0x0CB3DE08, 0x17A4C31A, 0x1EA9C814, - 0x218AF93E, 0x2887F230, 0x3390EF22, 0x3A9DE42C, - 0xDD063D96, 0xD40B3698, 0xCF1C2B8A, 0xC6112084, - 0xF93211AE, 0xF03F1AA0, 0xEB2807B2, 0xE2250CBC, - 0x956E65E6, 0x9C636EE8, 0x877473FA, 0x8E7978F4, - 0xB15A49DE, 0xB85742D0, 0xA3405FC2, 0xAA4D54CC, - 0xECDAF741, 0xE5D7FC4F, 0xFEC0E15D, 0xF7CDEA53, - 0xC8EEDB79, 0xC1E3D077, 0xDAF4CD65, 0xD3F9C66B, - 0xA4B2AF31, 0xADBFA43F, 0xB6A8B92D, 0xBFA5B223, - 0x80868309, 0x898B8807, 0x929C9515, 0x9B919E1B, - 0x7C0A47A1, 0x75074CAF, 0x6E1051BD, 0x671D5AB3, - 0x583E6B99, 0x51336097, 0x4A247D85, 0x4329768B, - 0x34621FD1, 0x3D6F14DF, 0x267809CD, 0x2F7502C3, - 0x105633E9, 0x195B38E7, 0x024C25F5, 0x0B412EFB, - 0xD7618C9A, 0xDE6C8794, 0xC57B9A86, 0xCC769188, - 0xF355A0A2, 0xFA58ABAC, 0xE14FB6BE, 0xE842BDB0, - 0x9F09D4EA, 0x9604DFE4, 0x8D13C2F6, 0x841EC9F8, - 0xBB3DF8D2, 0xB230F3DC, 0xA927EECE, 0xA02AE5C0, - 0x47B13C7A, 0x4EBC3774, 0x55AB2A66, 0x5CA62168, - 0x63851042, 0x6A881B4C, 0x719F065E, 0x78920D50, - 0x0FD9640A, 0x06D46F04, 0x1DC37216, 0x14CE7918, - 0x2BED4832, 0x22E0433C, 0x39F75E2E, 0x30FA5520, - 0x9AB701EC, 0x93BA0AE2, 0x88AD17F0, 0x81A01CFE, - 0xBE832DD4, 0xB78E26DA, 0xAC993BC8, 0xA59430C6, - 0xD2DF599C, 0xDBD25292, 0xC0C54F80, 0xC9C8448E, - 0xF6EB75A4, 0xFFE67EAA, 0xE4F163B8, 0xEDFC68B6, - 0x0A67B10C, 0x036ABA02, 0x187DA710, 0x1170AC1E, - 0x2E539D34, 0x275E963A, 0x3C498B28, 0x35448026, - 0x420FE97C, 0x4B02E272, 0x5015FF60, 0x5918F46E, - 0x663BC544, 0x6F36CE4A, 0x7421D358, 0x7D2CD856, - 0xA10C7A37, 0xA8017139, 0xB3166C2B, 0xBA1B6725, - 0x8538560F, 0x8C355D01, 0x97224013, 0x9E2F4B1D, - 0xE9642247, 0xE0692949, 0xFB7E345B, 0xF2733F55, - 0xCD500E7F, 0xC45D0571, 0xDF4A1863, 0xD647136D, - 0x31DCCAD7, 0x38D1C1D9, 0x23C6DCCB, 0x2ACBD7C5, - 0x15E8E6EF, 0x1CE5EDE1, 0x07F2F0F3, 0x0EFFFBFD, - 0x79B492A7, 0x70B999A9, 0x6BAE84BB, 0x62A38FB5, - 0x5D80BE9F, 0x548DB591, 0x4F9AA883, 0x4697A38D, - }; - - private static final int[] rcon = { - 0x00000001, 0x00000002, 0x00000004, 0x00000008, - 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x0000001B, 0x00000036, 0x0000006C, 0x000000D8, - 0x000000AB, 0x0000004D, 0x0000009A, 0x0000002F, - 0x0000005E, 0x000000BC, 0x00000063, 0x000000C6, - 0x00000097, 0x00000035, 0x0000006A, 0x000000D4, - 0x000000B3, 0x0000007D, 0x000000FA, 0x000000EF, - 0x000000C5, 0x00000091, - }; - - private boolean ROUNDS_12 = false; - private boolean ROUNDS_14 = false; - - /** Session and Sub keys */ - private int[][] sessionK = null; - private int[] K = null; - - /** Cipher encryption/decryption key */ - // skip re-generating Session and Sub keys if the cipher key is - // the same - private byte[] lastKey = null; - - /** ROUNDS * 4 */ - private int limit = 0; - - AESCrypt() { - // empty - } - - /** - * Returns this cipher's block size. - * - * @return this cipher's block size - */ - int getBlockSize() { - return AES_BLOCK_SIZE; - } - - void init(boolean decrypting, String algorithm, byte[] key) - throws InvalidKeyException { - if (!algorithm.equalsIgnoreCase("AES") - && !algorithm.equalsIgnoreCase("Rijndael")) { - throw new InvalidKeyException - ("Wrong algorithm: AES or Rijndael required"); - } - - if (key == null) { // Unlikely, but just double check it. - throw new InvalidKeyException("Empty key"); - } - - if (!MessageDigest.isEqual(key, lastKey)) { - // re-generate session key 'sessionK' when cipher key changes - makeSessionKey(key); - if (lastKey != null) { - Arrays.fill(lastKey, (byte)0); - } - lastKey = key.clone(); // save cipher key - } - - // set sub key to the corresponding session Key - this.K = sessionK[(decrypting? 1:0)]; - } - - // check if the specified length (in bytes) is a valid keysize for AES - static boolean isKeySizeValid(int len) { - for (int aesKeysize : AES_KEYSIZES) { - if (len == aesKeysize) { - return true; - } - } - return false; - } - - /** - * Encrypt exactly one block of plaintext. - */ - void encryptBlock(byte[] in, int inOffset, - byte[] out, int outOffset) { - // Array bound checks are done in caller code, i.e. - // FeedbackCipher.encrypt/decrypt(...) to improve performance. - implEncryptBlock(in, inOffset, out, outOffset); - } - - // Encryption operation. Possibly replaced with a compiler intrinsic. - @IntrinsicCandidate - private void implEncryptBlock(byte[] in, int inOffset, - byte[] out, int outOffset) - { - int keyOffset = 0; - int t0 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t1 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t2 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t3 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset] & 0xFF) ) ^ K[keyOffset++]; - - // apply round transforms - while( keyOffset < limit ) - { - int a0, a1, a2; - a0 = T1[(t0 >>> 24) ] ^ - T2[(t1 >>> 16) & 0xFF] ^ - T3[(t2 >>> 8) & 0xFF] ^ - T4[(t3 ) & 0xFF] ^ K[keyOffset++]; - a1 = T1[(t1 >>> 24) ] ^ - T2[(t2 >>> 16) & 0xFF] ^ - T3[(t3 >>> 8) & 0xFF] ^ - T4[(t0 ) & 0xFF] ^ K[keyOffset++]; - a2 = T1[(t2 >>> 24) ] ^ - T2[(t3 >>> 16) & 0xFF] ^ - T3[(t0 >>> 8) & 0xFF] ^ - T4[(t1 ) & 0xFF] ^ K[keyOffset++]; - t3 = T1[(t3 >>> 24) ] ^ - T2[(t0 >>> 16) & 0xFF] ^ - T3[(t1 >>> 8) & 0xFF] ^ - T4[(t2 ) & 0xFF] ^ K[keyOffset++]; - t0 = a0; t1 = a1; t2 = a2; - } - - // last round is special - int tt = K[keyOffset++]; - out[outOffset++] = (byte)(S[(t0 >>> 24) ] ^ (tt >>> 24)); - out[outOffset++] = (byte)(S[(t1 >>> 16) & 0xFF] ^ (tt >>> 16)); - out[outOffset++] = (byte)(S[(t2 >>> 8) & 0xFF] ^ (tt >>> 8)); - out[outOffset++] = (byte)(S[(t3 ) & 0xFF] ^ (tt )); - tt = K[keyOffset++]; - out[outOffset++] = (byte)(S[(t1 >>> 24) ] ^ (tt >>> 24)); - out[outOffset++] = (byte)(S[(t2 >>> 16) & 0xFF] ^ (tt >>> 16)); - out[outOffset++] = (byte)(S[(t3 >>> 8) & 0xFF] ^ (tt >>> 8)); - out[outOffset++] = (byte)(S[(t0 ) & 0xFF] ^ (tt )); - tt = K[keyOffset++]; - out[outOffset++] = (byte)(S[(t2 >>> 24) ] ^ (tt >>> 24)); - out[outOffset++] = (byte)(S[(t3 >>> 16) & 0xFF] ^ (tt >>> 16)); - out[outOffset++] = (byte)(S[(t0 >>> 8) & 0xFF] ^ (tt >>> 8)); - out[outOffset++] = (byte)(S[(t1 ) & 0xFF] ^ (tt )); - tt = K[keyOffset]; - out[outOffset++] = (byte)(S[(t3 >>> 24) ] ^ (tt >>> 24)); - out[outOffset++] = (byte)(S[(t0 >>> 16) & 0xFF] ^ (tt >>> 16)); - out[outOffset++] = (byte)(S[(t1 >>> 8) & 0xFF] ^ (tt >>> 8)); - out[outOffset ] = (byte)(S[(t2 ) & 0xFF] ^ (tt )); - } - - /** - * Decrypt exactly one block of plaintext. - */ - void decryptBlock(byte[] in, int inOffset, - byte[] out, int outOffset) { - // Array bound checks are done in caller code, i.e. - // FeedbackCipher.encrypt/decrypt(...) to improve performance. - implDecryptBlock(in, inOffset, out, outOffset); - } - - // Decrypt operation. Possibly replaced with a compiler intrinsic. - @IntrinsicCandidate - private void implDecryptBlock(byte[] in, int inOffset, - byte[] out, int outOffset) - { - int keyOffset = 4; - int t0 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t1 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t2 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset++] & 0xFF) ) ^ K[keyOffset++]; - int t3 = ((in[inOffset++] ) << 24 | - (in[inOffset++] & 0xFF) << 16 | - (in[inOffset++] & 0xFF) << 8 | - (in[inOffset ] & 0xFF) ) ^ K[keyOffset++]; - - int a0, a1, a2; - if(ROUNDS_12) - { - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - - if(ROUNDS_14) - { - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - } - } - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset++]; - t0 = T5[(a0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(a2>>> 8)&0xFF] ^ T8[(a1 )&0xFF] ^ K[keyOffset++]; - t1 = T5[(a1>>>24) ] ^ T6[(a0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(a2 )&0xFF] ^ K[keyOffset++]; - t2 = T5[(a2>>>24) ] ^ T6[(a1>>>16)&0xFF] ^ - T7[(a0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(a2>>>16)&0xFF] ^ - T7[(a1>>> 8)&0xFF] ^ T8[(a0 )&0xFF] ^ K[keyOffset++]; - a0 = T5[(t0>>>24) ] ^ T6[(t3>>>16)&0xFF] ^ - T7[(t2>>> 8)&0xFF] ^ T8[(t1 )&0xFF] ^ K[keyOffset++]; - a1 = T5[(t1>>>24) ] ^ T6[(t0>>>16)&0xFF] ^ - T7[(t3>>> 8)&0xFF] ^ T8[(t2 )&0xFF] ^ K[keyOffset++]; - a2 = T5[(t2>>>24) ] ^ T6[(t1>>>16)&0xFF] ^ - T7[(t0>>> 8)&0xFF] ^ T8[(t3 )&0xFF] ^ K[keyOffset++]; - t3 = T5[(t3>>>24) ] ^ T6[(t2>>>16)&0xFF] ^ - T7[(t1>>> 8)&0xFF] ^ T8[(t0 )&0xFF] ^ K[keyOffset]; - - t1 = K[0]; - out[outOffset++] = (byte)(Si[(a0 >>> 24) ] ^ (t1 >>> 24)); - out[outOffset++] = (byte)(Si[(t3 >>> 16) & 0xFF] ^ (t1 >>> 16)); - out[outOffset++] = (byte)(Si[(a2 >>> 8) & 0xFF] ^ (t1 >>> 8)); - out[outOffset++] = (byte)(Si[(a1 ) & 0xFF] ^ (t1 )); - t1 = K[1]; - out[outOffset++] = (byte)(Si[(a1 >>> 24) ] ^ (t1 >>> 24)); - out[outOffset++] = (byte)(Si[(a0 >>> 16) & 0xFF] ^ (t1 >>> 16)); - out[outOffset++] = (byte)(Si[(t3 >>> 8) & 0xFF] ^ (t1 >>> 8)); - out[outOffset++] = (byte)(Si[(a2 ) & 0xFF] ^ (t1 )); - t1 = K[2]; - out[outOffset++] = (byte)(Si[(a2 >>> 24) ] ^ (t1 >>> 24)); - out[outOffset++] = (byte)(Si[(a1 >>> 16) & 0xFF] ^ (t1 >>> 16)); - out[outOffset++] = (byte)(Si[(a0 >>> 8) & 0xFF] ^ (t1 >>> 8)); - out[outOffset++] = (byte)(Si[(t3 ) & 0xFF] ^ (t1 )); - t1 = K[3]; - out[outOffset++] = (byte)(Si[(t3 >>> 24) ] ^ (t1 >>> 24)); - out[outOffset++] = (byte)(Si[(a2 >>> 16) & 0xFF] ^ (t1 >>> 16)); - out[outOffset++] = (byte)(Si[(a1 >>> 8) & 0xFF] ^ (t1 >>> 8)); - out[outOffset ] = (byte)(Si[(a0 ) & 0xFF] ^ (t1 )); - } - - /** - * Expand a user-supplied key material into a session key. - * - * @param k The 128/192/256-bit cipher key to use. - * @exception InvalidKeyException If the key is invalid. - */ - private void makeSessionKey(byte[] k) throws InvalidKeyException { - if (!isKeySizeValid(k.length)) { - throw new InvalidKeyException("Invalid AES key length: " + - k.length + " bytes"); - } - - final int BC = 4; - - int ROUNDS = getRounds(k.length); - int ROUND_KEY_COUNT = (ROUNDS + 1) * BC; - - int[] Ke = new int[ROUND_KEY_COUNT]; // encryption round keys - int[] Kd = new int[ROUND_KEY_COUNT]; // decryption round keys - - int KC = k.length/4; // keylen in 32-bit elements - - int[] tk = new int[KC]; - int i, j; - - // copy user material bytes into temporary ints - for (i = 0, j = 0; i < KC; i++, j+=4) { - tk[i] = (k[j] ) << 24 | - (k[j+1] & 0xFF) << 16 | - (k[j+2] & 0xFF) << 8 | - (k[j+3] & 0xFF); - } - - // copy values into round key arrays - int t = 0; - for (j = 0; (j < KC) && (t < ROUND_KEY_COUNT); j++, t++) { - Ke[t] = tk[j]; - Kd[(ROUNDS - (t / BC))*BC + (t % BC)] = tk[j]; - } - int tt, rconpointer = 0; - while (t < ROUND_KEY_COUNT) { - // extrapolate using phi (the round key evolution function) - tt = tk[KC - 1]; - tk[0] ^= (S[(tt >>> 16) & 0xFF] ) << 24 ^ - (S[(tt >>> 8) & 0xFF] & 0xFF) << 16 ^ - (S[(tt ) & 0xFF] & 0xFF) << 8 ^ - (S[(tt >>> 24) ] & 0xFF) ^ - (rcon[rconpointer++] ) << 24; - if (KC != 8) - for (i = 1, j = 0; i < KC; i++, j++) tk[i] ^= tk[j]; - else { - for (i = 1, j = 0; i < KC / 2; i++, j++) tk[i] ^= tk[j]; - tt = tk[KC / 2 - 1]; - tk[KC / 2] ^= (S[(tt ) & 0xFF] & 0xFF) ^ - (S[(tt >>> 8) & 0xFF] & 0xFF) << 8 ^ - (S[(tt >>> 16) & 0xFF] & 0xFF) << 16 ^ - (S[(tt >>> 24) ] ) << 24; - for (j = KC / 2, i = j + 1; i < KC; i++, j++) tk[i] ^= tk[j]; - } - // copy values into round key arrays - for (j = 0; (j < KC) && (t < ROUND_KEY_COUNT); j++, t++) { - Ke[t] = tk[j]; - Kd[(ROUNDS - (t / BC))*BC + (t % BC)] = tk[j]; - } - } - for (int r = 1; r < ROUNDS; r++) { - // inverse MixColumn where needed - for (j = 0; j < BC; j++) { - int idx = r*BC + j; - tt = Kd[idx]; - Kd[idx] = U1[(tt >>> 24) & 0xFF] ^ - U2[(tt >>> 16) & 0xFF] ^ - U3[(tt >>> 8) & 0xFF] ^ - U4[ tt & 0xFF]; - } - } - - // For decryption round keys, need to rotate right by 4 ints. - // Do that without allocating and zeroing the small buffer. - int KdTail_0 = Kd[Kd.length - 4]; - int KdTail_1 = Kd[Kd.length - 3]; - int KdTail_2 = Kd[Kd.length - 2]; - int KdTail_3 = Kd[Kd.length - 1]; - System.arraycopy(Kd, 0, Kd, 4, Kd.length - 4); - Kd[0] = KdTail_0; - Kd[1] = KdTail_1; - Kd[2] = KdTail_2; - Kd[3] = KdTail_3; - - Arrays.fill(tk, 0); - ROUNDS_12 = (ROUNDS>=12); - ROUNDS_14 = (ROUNDS==14); - limit = ROUNDS*4; - - // store the expanded sub keys into 'sessionK' - if (sessionK != null) { - // erase the previous values in sessionK - Arrays.fill(sessionK[0], 0); - Arrays.fill(sessionK[1], 0); - } else { - sessionK = new int[2][]; - } - sessionK[0] = Ke; - sessionK[1] = Kd; - } - - /** - * Return The number of rounds for a given Rijndael keysize. - * - * @param keySize The size of the user key material in bytes. - * MUST be one of (16, 24, 32). - * @return The number of rounds. - */ - private static int getRounds(int keySize) { - return (keySize >> 2) + 6; - } -} diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java index 51671fdf25d..915d329d33d 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyGenerator.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,7 +91,7 @@ public final class AESKeyGenerator extends KeyGeneratorSpi { */ protected void engineInit(int keysize, SecureRandom random) { if (((keysize % 8) != 0) || - (!AESCrypt.isKeySizeValid(keysize/8))) { + (!AES_Crypt.isKeySizeValid(keysize/8))) { throw new InvalidParameterException ("Wrong keysize: must be equal to 128, 192 or 256"); } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java index 7ba4420f973..2828183802f 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -50,7 +50,7 @@ class AESKeyWrap extends FeedbackCipher { }; AESKeyWrap() { - super(new AESCrypt()); + super(new AES_Crypt()); } /** diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java index 4f25849d850..f6fec405b2f 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/AESKeyWrapPadded.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -87,7 +87,7 @@ class AESKeyWrapPadded extends FeedbackCipher { } AESKeyWrapPadded() { - super(new AESCrypt()); + super(new AES_Crypt()); } /** diff --git a/src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java b/src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java new file mode 100644 index 00000000000..6e3e6144aff --- /dev/null +++ b/src/java.base/share/classes/com/sun/crypto/provider/AES_Crypt.java @@ -0,0 +1,1392 @@ +/* + * 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 com.sun.crypto.provider; + +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.util.Arrays; + +import jdk.internal.vm.annotation.IntrinsicCandidate; + +/** + * Implementation of the AES cipher, which is based on the following documents: + * + * @spec https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/aes-development/rijndael-ammended.pdf + * + * @spec https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197-upd1.pdf + * + * https://www.internationaljournalcorner.com/index.php/ijird_ojs/article/view/134688 + */ +final class AES_Crypt extends SymmetricCipher { + + // Number of words in a block + private static final int WB = 4; + // Number of bytes in a word + private static final int BW = 4; + + private static final int AES_128_ROUNDS = 10; + private static final int AES_192_ROUNDS = 12; + private static final int AES_256_ROUNDS = 14; + + private int rounds; + private byte[] prevKey = null; + + // Following two attributes are specific to Intrinsics where sessionK is + // used for PPC64, S390, and RISCV64 architectures, whereas K is used for + // everything else. + private int[][] sessionK = null; + private int[] K = null; + + // Round constant + private static final int[] RCON = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + }; + + private static final byte[][] SBOX = { + { (byte)0x63, (byte)0x7C, (byte)0x77, (byte)0x7B, (byte)0xF2, + (byte)0x6B, (byte)0x6F, (byte)0xC5, (byte)0x30, (byte)0x01, + (byte)0x67, (byte)0x2B, (byte)0xFE, (byte)0xD7, (byte)0xAB, + (byte)0x76 }, + { (byte)0xCA, (byte)0x82, (byte)0xC9, (byte)0x7D, (byte)0xFA, + (byte)0x59, (byte)0x47, (byte)0xF0, (byte)0xAD, (byte)0xD4, + (byte)0xA2, (byte)0xAF, (byte)0x9C, (byte)0xA4, (byte)0x72, + (byte)0xC0 }, + { (byte)0xB7, (byte)0xFD, (byte)0x93, (byte)0x26, (byte)0x36, + (byte)0x3F, (byte)0xF7, (byte)0xCC, (byte)0x34, (byte)0xA5, + (byte)0xE5, (byte)0xF1, (byte)0x71, (byte)0xD8, (byte)0x31, + (byte)0x15 }, + { (byte)0x04, (byte)0xC7, (byte)0x23, (byte)0xC3, (byte)0x18, + (byte)0x96, (byte)0x05, (byte)0x9A, (byte)0x07, (byte)0x12, + (byte)0x80, (byte)0xE2, (byte)0xEB, (byte)0x27, (byte)0xB2, + (byte)0x75 }, + { (byte)0x09, (byte)0x83, (byte)0x2C, (byte)0x1A, (byte)0x1B, + (byte)0x6E, (byte)0x5A, (byte)0xA0, (byte)0x52, (byte)0x3B, + (byte)0xD6, (byte)0xB3, (byte)0x29, (byte)0xE3, (byte)0x2F, + (byte)0x84 }, + { (byte)0x53, (byte)0xD1, (byte)0x00, (byte)0xED, (byte)0x20, + (byte)0xFC, (byte)0xB1, (byte)0x5B, (byte)0x6A, (byte)0xCB, + (byte)0xBE, (byte)0x39, (byte)0x4A, (byte)0x4C, (byte)0x58, + (byte)0xCF }, + { (byte)0xD0, (byte)0xEF, (byte)0xAA, (byte)0xFB, (byte)0x43, + (byte)0x4D, (byte)0x33, (byte)0x85, (byte)0x45, (byte)0xF9, + (byte)0x02, (byte)0x7F, (byte)0x50, (byte)0x3C, (byte)0x9F, + (byte)0xA8 }, + { (byte)0x51, (byte)0xA3, (byte)0x40, (byte)0x8F, (byte)0x92, + (byte)0x9D, (byte)0x38, (byte)0xF5, (byte)0xBC, (byte)0xB6, + (byte)0xDA, (byte)0x21, (byte)0x10, (byte)0xFF, (byte)0xF3, + (byte)0xD2 }, + { (byte)0xCD, (byte)0x0C, (byte)0x13, (byte)0xEC, (byte)0x5F, + (byte)0x97, (byte)0x44, (byte)0x17, (byte)0xC4, (byte)0xA7, + (byte)0x7E, (byte)0x3D, (byte)0x64, (byte)0x5D, (byte)0x19, + (byte)0x73 }, + { (byte)0x60, (byte)0x81, (byte)0x4F, (byte)0xDC, (byte)0x22, + (byte)0x2A, (byte)0x90, (byte)0x88, (byte)0x46, (byte)0xEE, + (byte)0xB8, (byte)0x14, (byte)0xDE, (byte)0x5E, (byte)0x0B, + (byte)0xDB }, + { (byte)0xE0, (byte)0x32, (byte)0x3A, (byte)0x0A, (byte)0x49, + (byte)0x06, (byte)0x24, (byte)0x5C, (byte)0xC2, (byte)0xD3, + (byte)0xAC, (byte)0x62, (byte)0x91, (byte)0x95, (byte)0xE4, + (byte)0x79 }, + { (byte)0xE7, (byte)0xC8, (byte)0x37, (byte)0x6D, (byte)0x8D, + (byte)0xD5, (byte)0x4E, (byte)0xA9, (byte)0x6C, (byte)0x56, + (byte)0xF4, (byte)0xEA, (byte)0x65, (byte)0x7A, (byte)0xAE, + (byte)0x08 }, + { (byte)0xBA, (byte)0x78, (byte)0x25, (byte)0x2E, (byte)0x1C, + (byte)0xA6, (byte)0xB4, (byte)0xC6, (byte)0xE8, (byte)0xDD, + (byte)0x74, (byte)0x1F, (byte)0x4B, (byte)0xBD, (byte)0x8B, + (byte)0x8A }, + { (byte)0x70, (byte)0x3E, (byte)0xB5, (byte)0x66, (byte)0x48, + (byte)0x03, (byte)0xF6, (byte)0x0E, (byte)0x61, (byte)0x35, + (byte)0x57, (byte)0xB9, (byte)0x86, (byte)0xC1, (byte)0x1D, + (byte)0x9E }, + { (byte)0xE1, (byte)0xF8, (byte)0x98, (byte)0x11, (byte)0x69, + (byte)0xD9, (byte)0x8E, (byte)0x94, (byte)0x9B, (byte)0x1E, + (byte)0x87, (byte)0xE9, (byte)0xCE, (byte)0x55, (byte)0x28, + (byte)0xDF }, + { (byte)0x8C, (byte)0xA1, (byte)0x89, (byte)0x0D, (byte)0xBF, + (byte)0xE6, (byte)0x42, (byte)0x68, (byte)0x41, (byte)0x99, + (byte)0x2D, (byte)0x0F, (byte)0xB0, (byte)0x54, (byte)0xBB, + (byte)0x16 } + }; + + // Lookup table for row 0 transforms, see section 5.2.1 of original spec. + private static final int[] T0 = { + 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, + 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, 0x60303050, 0x02010103, + 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, + 0xEC76769A, 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, + 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, 0x41ADADEC, + 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, + 0xE4727296, 0x9BC0C05B, 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, + 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, + 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, + 0xABD8D873, 0x62313153, 0x2A15153F, 0x0804040C, 0x95C7C752, + 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, + 0x2F9A9AB5, 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, + 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, 0x1209091B, + 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, + 0xB45A5AEE, 0x5BA0A0FB, 0xA45252F6, 0x763B3B4D, 0xB7D6D661, + 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, + 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, + 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, 0xD46A6ABE, 0x8DCBCB46, + 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, + 0x85CFCF4A, 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, + 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, 0x8A4545CF, + 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, + 0x259F9FBA, 0x4BA8A8E3, 0xA25151F3, 0x5DA3A3FE, 0x804040C0, + 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, + 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, + 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, 0x81CDCD4C, 0x180C0C14, + 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, + 0x2E171739, 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, + 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, 0xC06060A0, + 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, + 0x3B9090AB, 0x0B888883, 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, + 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, + 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, + 0x0C06060A, 0x4824246C, 0xB85C5CE4, 0x9FC2C25D, 0xBDD3D36E, + 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, + 0xF279798B, 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, + 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, 0xD86C6CB4, + 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, + 0x47AEAEE9, 0x10080818, 0x6FBABAD5, 0xF0787888, 0x4A25256F, + 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, + 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, + 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, 0xE0707090, 0x7C3E3E42, + 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, + 0x1C0E0E12, 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, + 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, 0xD9E1E138, + 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, + 0x078E8E89, 0x339494A7, 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, + 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, + 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, + 0xD7E6E631, 0x844242C6, 0xD06868B8, 0x824141C3, 0x299999B0, + 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, + 0x2C16163A, + }; + + // Lookup table for row 1 transforms, see section 5.2.1 of original spec. + private static final int[] T1 = { + 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, + 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, 0x50603030, 0x03020101, + 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, + 0x9AEC7676, 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, + 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, 0xEC41ADAD, + 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, + 0x96E47272, 0x5B9BC0C0, 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, + 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, + 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, + 0x73ABD8D8, 0x53623131, 0x3F2A1515, 0x0C080404, 0x5295C7C7, + 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, + 0xB52F9A9A, 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, + 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, 0x1B120909, + 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, + 0xEEB45A5A, 0xFB5BA0A0, 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, + 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, + 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, + 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, 0xBED46A6A, 0x468DCBCB, + 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, + 0x4A85CFCF, 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, + 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, 0xCF8A4545, + 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, + 0xBA259F9F, 0xE34BA8A8, 0xF3A25151, 0xFE5DA3A3, 0xC0804040, + 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, + 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, + 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, 0x4C81CDCD, 0x14180C0C, + 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, + 0x392E1717, 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, + 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, 0xA0C06060, + 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, + 0xAB3B9090, 0x830B8888, 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, + 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, + 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, + 0x0A0C0606, 0x6C482424, 0xE4B85C5C, 0x5D9FC2C2, 0x6EBDD3D3, + 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, + 0x8BF27979, 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, + 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, 0xB4D86C6C, + 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, + 0xE947AEAE, 0x18100808, 0xD56FBABA, 0x88F07878, 0x6F4A2525, + 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, + 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, + 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, 0x90E07070, 0x427C3E3E, + 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, + 0x121C0E0E, 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, + 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, 0x38D9E1E1, + 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, + 0x89078E8E, 0xA7339494, 0xB62D9B9B, 0x223C1E1E, 0x92158787, + 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, + 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, + 0x31D7E6E6, 0xC6844242, 0xB8D06868, 0xC3824141, 0xB0299999, + 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, + 0x3A2C1616, + }; + + // Lookup table for row 2 transforms, see section 5.2.1 of original spec. + private static final int[] T2 = { + 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, + 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, 0x30506030, 0x01030201, + 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, + 0x769AEC76, 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, + 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, 0xADEC41AD, + 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, + 0x7296E472, 0xC05B9BC0, 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, + 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, + 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, + 0xD873ABD8, 0x31536231, 0x153F2A15, 0x040C0804, 0xC75295C7, + 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, + 0x9AB52F9A, 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, + 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, 0x091B1209, + 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, + 0x5AEEB45A, 0xA0FB5BA0, 0x52F6A452, 0x3B4D763B, 0xD661B7D6, + 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, + 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, + 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, 0x6ABED46A, 0xCB468DCB, + 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, + 0xCF4A85CF, 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, + 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, 0x45CF8A45, + 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, + 0x9FBA259F, 0xA8E34BA8, 0x51F3A251, 0xA3FE5DA3, 0x40C08040, + 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, + 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, + 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, 0xCD4C81CD, 0x0C14180C, + 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, + 0x17392E17, 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, + 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, 0x60A0C060, + 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, + 0x90AB3B90, 0x88830B88, 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, + 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, + 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, + 0x060A0C06, 0x246C4824, 0x5CE4B85C, 0xC25D9FC2, 0xD36EBDD3, + 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, + 0x798BF279, 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, + 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, 0x6CB4D86C, + 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, + 0xAEE947AE, 0x08181008, 0xBAD56FBA, 0x7888F078, 0x256F4A25, + 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, + 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, + 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, 0x7090E070, 0x3E427C3E, + 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, + 0x0E121C0E, 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, + 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, 0xE138D9E1, + 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, + 0x8E89078E, 0x94A73394, 0x9BB62D9B, 0x1E223C1E, 0x87921587, + 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, + 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, + 0xE631D7E6, 0x42C68442, 0x68B8D068, 0x41C38241, 0x99B02999, + 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, + 0x163A2C16, + }; + + // Lookup table for row 3 transforms, see section 5.2.1 of original spec. + private static final int[] T3 = { + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, + 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, 0x30305060, 0x01010302, + 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, + 0x76769AEC, 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, + 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, 0xADADEC41, + 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, + 0x727296E4, 0xC0C05B9B, 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, + 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, + 0xD8D873AB, 0x31315362, 0x15153F2A, 0x04040C08, 0xC7C75295, + 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, + 0x9A9AB52F, 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, + 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, 0x09091B12, + 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, + 0x5A5AEEB4, 0xA0A0FB5B, 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, + 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, + 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, 0x6A6ABED4, 0xCBCB468D, + 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, + 0xCFCF4A85, 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, + 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, 0x4545CF8A, + 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, + 0x9F9FBA25, 0xA8A8E34B, 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, + 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, + 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, 0xCDCD4C81, 0x0C0C1418, + 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, + 0x1717392E, 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, + 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, 0x6060A0C0, + 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, + 0x9090AB3B, 0x8888830B, 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, + 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, + 0x06060A0C, 0x24246C48, 0x5C5CE4B8, 0xC2C25D9F, 0xD3D36EBD, + 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, + 0x79798BF2, 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, + 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, 0x6C6CB4D8, + 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, + 0xAEAEE947, 0x08081810, 0xBABAD56F, 0x787888F0, 0x25256F4A, + 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, + 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, 0x707090E0, 0x3E3E427C, + 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, + 0x0E0E121C, 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, + 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, 0xE1E138D9, + 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, + 0x8E8E8907, 0x9494A733, 0x9B9BB62D, 0x1E1E223C, 0x87879215, + 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, + 0xE6E631D7, 0x4242C684, 0x6868B8D0, 0x4141C382, 0x9999B029, + 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, + 0x16163A2C, + }; + + // Lookup table for row 0 inverse transforms, see section 5.2.1 of original + // spec. + private static final int[] TI0 = { + 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, + 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, 0x2030FA55, 0xAD766DF6, + 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, + 0xB562A38F, 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, + 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, 0x038F5FE7, + 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, + 0x49E06929, 0x8EC9C844, 0x75C2896A, 0xF48E7978, 0x99583E6B, + 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, + 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, + 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, 0x70486858, 0x8F45FD19, + 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, + 0x6655AB2A, 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, + 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, 0x8ACF1C2B, + 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, + 0xD134621F, 0xC4A6FE8A, 0x342E539D, 0xA2F355A0, 0x058AE132, + 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, + 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, + 0x71C45D05, 0x0406D46F, 0x605015FF, 0x1998FB24, 0xD6BDE997, + 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, + 0x79C8EEDB, 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, + 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, 0xFD0EFFFB, + 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, + 0x9B5B54D1, 0x24362E3A, 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, + 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, + 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, + 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, 0x57F11985, 0xAF75074C, + 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, + 0x5BFB7E34, 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, + 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, 0x854A247D, + 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, + 0x0D8652EC, 0x77C1E3D0, 0x2BB3166C, 0xA970B999, 0x119448FA, + 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, + 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, + 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, 0x2C3A9DE4, 0x5078920D, + 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, + 0x82C3AFF5, 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, + 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, 0xCD267809, + 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, + 0x21BCCF08, 0xEF15E8E6, 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, + 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, + 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, + 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, 0x764DD68D, 0x43EFB04D, + 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, + 0x4665517F, 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, + 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, 0x9AD7618C, + 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, + 0xE11CE5ED, 0x7A47B13C, 0x9CD2DF59, 0x55F2733F, 0x1814CE79, + 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, + 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, + 0xBCE2250C, 0x283C498B, 0xFF0D9541, 0x39A80171, 0x080CB3DE, + 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, + 0xD0B85742, + }; + + // Lookup table for row 1 inverse transforms, see section 5.2.1 of original + // spec. + private static final int[] TI1 = { + 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, + 0xF11F9D45, 0xABACFA58, 0x934BE303, 0x552030FA, 0xF6AD766D, + 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, + 0x8FB562A3, 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, + 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, 0xE7038F5F, + 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, + 0x2949E069, 0x448EC9C8, 0x6A75C289, 0x78F48E79, 0x6B99583E, + 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, + 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, + 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, 0x58704868, 0x198F45FD, + 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, + 0x2A6655AB, 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, + 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, 0x2B8ACF1C, + 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, + 0x1FD13462, 0x8AC4A6FE, 0x9D342E53, 0xA0A2F355, 0x32058AE1, + 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, + 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, + 0x0571C45D, 0x6F0406D4, 0xFF605015, 0x241998FB, 0x97D6BDE9, + 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, + 0xDB79C8EE, 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, + 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, 0xFBFD0EFF, + 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, + 0xD19B5B54, 0x3A24362E, 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, + 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, + 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, + 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, 0x8557F119, 0x4CAF7507, + 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, + 0x345BFB7E, 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, + 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, 0x7D854A24, + 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, + 0xEC0D8652, 0xD077C1E3, 0x6C2BB316, 0x99A970B9, 0xFA119448, + 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, + 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, + 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, 0xE42C3A9D, 0x0D507892, + 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, + 0xF582C3AF, 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, + 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, 0x09CD2678, + 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, + 0x0821BCCF, 0xE6EF15E8, 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, + 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, + 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, + 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, 0x8D764DD6, 0x4D43EFB0, + 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, + 0x7F466551, 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, + 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, 0x8C9AD761, + 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, + 0xEDE11CE5, 0x3C7A47B1, 0x599CD2DF, 0x3F55F273, 0x791814CE, + 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, + 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, + 0x0CBCE225, 0x8B283C49, 0x41FF0D95, 0x7139A801, 0xDE080CB3, + 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, + 0x42D0B857, + }; + + // Lookup table for row 2 inverse transforms, see section 5.2.1 of original + // spec. + private static final int[] TI2 = { + 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, + 0x45F11F9D, 0x58ABACFA, 0x03934BE3, 0xFA552030, 0x6DF6AD76, + 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, + 0xA38FB562, 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, + 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, 0x5FE7038F, + 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, + 0x692949E0, 0xC8448EC9, 0x896A75C2, 0x7978F48E, 0x3E6B9958, + 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, + 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, + 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, 0x68587048, 0xFD198F45, + 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, + 0xAB2A6655, 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, + 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, 0x1C2B8ACF, + 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, + 0x621FD134, 0xFE8AC4A6, 0x539D342E, 0x55A0A2F3, 0xE132058A, + 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, + 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, + 0x5D0571C4, 0xD46F0406, 0x15FF6050, 0xFB241998, 0xE997D6BD, + 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, + 0xEEDB79C8, 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, + 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, 0xFFFBFD0E, + 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, + 0x54D19B5B, 0x2E3A2436, 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, + 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, + 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, + 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, 0x198557F1, 0x074CAF75, + 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, + 0x7E345BFB, 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, + 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, 0x247D854A, + 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, + 0x52EC0D86, 0xE3D077C1, 0x166C2BB3, 0xB999A970, 0x48FA1194, + 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, + 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, + 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, 0x9DE42C3A, 0x920D5078, + 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, + 0xAFF582C3, 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, + 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, 0x7809CD26, + 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, + 0xCF0821BC, 0xE8E6EF15, 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, + 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, + 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, + 0xDAF741EC, 0x500E7FCD, 0xF62F1791, 0xD68D764D, 0xB04D43EF, + 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, + 0x517F4665, 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, + 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, 0x618C9AD7, + 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, + 0xE5EDE11C, 0xB13C7A47, 0xDF599CD2, 0x733F55F2, 0xCE791814, + 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, + 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, + 0x250CBCE2, 0x498B283C, 0x9541FF0D, 0x017139A8, 0xB3DE080C, + 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, + 0x5742D0B8, + }; + + // Lookup table for row 3 inverse transforms, see section 5.2.1 of original + // spec. + private static final int[] TI3 = { + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, + 0x9D45F11F, 0xFA58ABAC, 0xE303934B, 0x30FA5520, 0x766DF6AD, + 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, + 0x62A38FB5, 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, + 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, 0x8F5FE703, + 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, + 0xE0692949, 0xC9C8448E, 0xC2896A75, 0x8E7978F4, 0x583E6B99, + 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, + 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, 0x48685870, 0x45FD198F, + 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, + 0x55AB2A66, 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, + 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, 0xCF1C2B8A, + 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, + 0x34621FD1, 0xA6FE8AC4, 0x2E539D34, 0xF355A0A2, 0x8AE13205, + 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, + 0xC45D0571, 0x06D46F04, 0x5015FF60, 0x98FB2419, 0xBDE997D6, + 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, + 0xC8EEDB79, 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, + 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, 0x0EFFFBFD, + 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, + 0x5B54D19B, 0x362E3A24, 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, + 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, + 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, 0xF1198557, 0x75074CAF, + 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, + 0xFB7E345B, 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, + 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, 0x4A247D85, + 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, + 0x8652EC0D, 0xC1E3D077, 0xB3166C2B, 0x70B999A9, 0x9448FA11, + 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, + 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, 0x3A9DE42C, 0x78920D50, + 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, + 0xC3AFF582, 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, + 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, 0x267809CD, + 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, + 0xBCCF0821, 0x15E8E6EF, 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, + 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, + 0xECDAF741, 0xCD500E7F, 0x91F62F17, 0x4DD68D76, 0xEFB04D43, + 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, + 0x65517F46, 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, + 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, 0xD7618C9A, + 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, + 0x1CE5EDE1, 0x47B13C7A, 0xD2DF599C, 0xF2733F55, 0x14CE7918, + 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, + 0xE2250CBC, 0x3C498B28, 0x0D9541FF, 0xA8017139, 0x0CB3DE08, + 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, + 0xB85742D0, + }; + + // Lookup table for inverse substitution transform of last round as + // described in the international journal article referenced. + private static final int[] TI4 = { + 0x52525252, 0x09090909, 0x6A6A6A6A, 0xD5D5D5D5, 0x30303030, + 0x36363636, 0xA5A5A5A5, 0x38383838, 0xBFBFBFBF, 0x40404040, + 0xA3A3A3A3, 0x9E9E9E9E, 0x81818181, 0xF3F3F3F3, 0xD7D7D7D7, + 0xFBFBFBFB, 0x7C7C7C7C, 0xE3E3E3E3, 0x39393939, 0x82828282, + 0x9B9B9B9B, 0x2F2F2F2F, 0xFFFFFFFF, 0x87878787, 0x34343434, + 0x8E8E8E8E, 0x43434343, 0x44444444, 0xC4C4C4C4, 0xDEDEDEDE, + 0xE9E9E9E9, 0xCBCBCBCB, 0x54545454, 0x7B7B7B7B, 0x94949494, + 0x32323232, 0xA6A6A6A6, 0xC2C2C2C2, 0x23232323, 0x3D3D3D3D, + 0xEEEEEEEE, 0x4C4C4C4C, 0x95959595, 0x0B0B0B0B, 0x42424242, + 0xFAFAFAFA, 0xC3C3C3C3, 0x4E4E4E4E, 0x08080808, 0x2E2E2E2E, + 0xA1A1A1A1, 0x66666666, 0x28282828, 0xD9D9D9D9, 0x24242424, + 0xB2B2B2B2, 0x76767676, 0x5B5B5B5B, 0xA2A2A2A2, 0x49494949, + 0x6D6D6D6D, 0x8B8B8B8B, 0xD1D1D1D1, 0x25252525, 0x72727272, + 0xF8F8F8F8, 0xF6F6F6F6, 0x64646464, 0x86868686, 0x68686868, + 0x98989898, 0x16161616, 0xD4D4D4D4, 0xA4A4A4A4, 0x5C5C5C5C, + 0xCCCCCCCC, 0x5D5D5D5D, 0x65656565, 0xB6B6B6B6, 0x92929292, + 0x6C6C6C6C, 0x70707070, 0x48484848, 0x50505050, 0xFDFDFDFD, + 0xEDEDEDED, 0xB9B9B9B9, 0xDADADADA, 0x5E5E5E5E, 0x15151515, + 0x46464646, 0x57575757, 0xA7A7A7A7, 0x8D8D8D8D, 0x9D9D9D9D, + 0x84848484, 0x90909090, 0xD8D8D8D8, 0xABABABAB, 0x00000000, + 0x8C8C8C8C, 0xBCBCBCBC, 0xD3D3D3D3, 0x0A0A0A0A, 0xF7F7F7F7, + 0xE4E4E4E4, 0x58585858, 0x05050505, 0xB8B8B8B8, 0xB3B3B3B3, + 0x45454545, 0x06060606, 0xD0D0D0D0, 0x2C2C2C2C, 0x1E1E1E1E, + 0x8F8F8F8F, 0xCACACACA, 0x3F3F3F3F, 0x0F0F0F0F, 0x02020202, + 0xC1C1C1C1, 0xAFAFAFAF, 0xBDBDBDBD, 0x03030303, 0x01010101, + 0x13131313, 0x8A8A8A8A, 0x6B6B6B6B, 0x3A3A3A3A, 0x91919191, + 0x11111111, 0x41414141, 0x4F4F4F4F, 0x67676767, 0xDCDCDCDC, + 0xEAEAEAEA, 0x97979797, 0xF2F2F2F2, 0xCFCFCFCF, 0xCECECECE, + 0xF0F0F0F0, 0xB4B4B4B4, 0xE6E6E6E6, 0x73737373, 0x96969696, + 0xACACACAC, 0x74747474, 0x22222222, 0xE7E7E7E7, 0xADADADAD, + 0x35353535, 0x85858585, 0xE2E2E2E2, 0xF9F9F9F9, 0x37373737, + 0xE8E8E8E8, 0x1C1C1C1C, 0x75757575, 0xDFDFDFDF, 0x6E6E6E6E, + 0x47474747, 0xF1F1F1F1, 0x1A1A1A1A, 0x71717171, 0x1D1D1D1D, + 0x29292929, 0xC5C5C5C5, 0x89898989, 0x6F6F6F6F, 0xB7B7B7B7, + 0x62626262, 0x0E0E0E0E, 0xAAAAAAAA, 0x18181818, 0xBEBEBEBE, + 0x1B1B1B1B, 0xFCFCFCFC, 0x56565656, 0x3E3E3E3E, 0x4B4B4B4B, + 0xC6C6C6C6, 0xD2D2D2D2, 0x79797979, 0x20202020, 0x9A9A9A9A, + 0xDBDBDBDB, 0xC0C0C0C0, 0xFEFEFEFE, 0x78787878, 0xCDCDCDCD, + 0x5A5A5A5A, 0xF4F4F4F4, 0x1F1F1F1F, 0xDDDDDDDD, 0xA8A8A8A8, + 0x33333333, 0x88888888, 0x07070707, 0xC7C7C7C7, 0x31313131, + 0xB1B1B1B1, 0x12121212, 0x10101010, 0x59595959, 0x27272727, + 0x80808080, 0xECECECEC, 0x5F5F5F5F, 0x60606060, 0x51515151, + 0x7F7F7F7F, 0xA9A9A9A9, 0x19191919, 0xB5B5B5B5, 0x4A4A4A4A, + 0x0D0D0D0D, 0x2D2D2D2D, 0xE5E5E5E5, 0x7A7A7A7A, 0x9F9F9F9F, + 0x93939393, 0xC9C9C9C9, 0x9C9C9C9C, 0xEFEFEFEF, 0xA0A0A0A0, + 0xE0E0E0E0, 0x3B3B3B3B, 0x4D4D4D4D, 0xAEAEAEAE, 0x2A2A2A2A, + 0xF5F5F5F5, 0xB0B0B0B0, 0xC8C8C8C8, 0xEBEBEBEB, 0xBBBBBBBB, + 0x3C3C3C3C, 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2B2B2B2B, 0x04040404, 0x7E7E7E7E, 0xBABABABA, + 0x77777777, 0xD6D6D6D6, 0x26262626, 0xE1E1E1E1, 0x69696969, + 0x14141414, 0x63636363, 0x55555555, 0x21212121, 0x0C0C0C0C, + 0x7D7D7D7D, + }; + + // Lookup table for row 0 of the inverse mix column transform. + private static final int[] TMI0 = { + 0x00000000, 0x0E090D0B, 0x1C121A16, 0x121B171D, 0x3824342C, + 0x362D3927, 0x24362E3A, 0x2A3F2331, 0x70486858, 0x7E416553, + 0x6C5A724E, 0x62537F45, 0x486C5C74, 0x4665517F, 0x547E4662, + 0x5A774B69, 0xE090D0B0, 0xEE99DDBB, 0xFC82CAA6, 0xF28BC7AD, + 0xD8B4E49C, 0xD6BDE997, 0xC4A6FE8A, 0xCAAFF381, 0x90D8B8E8, + 0x9ED1B5E3, 0x8CCAA2FE, 0x82C3AFF5, 0xA8FC8CC4, 0xA6F581CF, + 0xB4EE96D2, 0xBAE79BD9, 0xDB3BBB7B, 0xD532B670, 0xC729A16D, + 0xC920AC66, 0xE31F8F57, 0xED16825C, 0xFF0D9541, 0xF104984A, + 0xAB73D323, 0xA57ADE28, 0xB761C935, 0xB968C43E, 0x9357E70F, + 0x9D5EEA04, 0x8F45FD19, 0x814CF012, 0x3BAB6BCB, 0x35A266C0, + 0x27B971DD, 0x29B07CD6, 0x038F5FE7, 0x0D8652EC, 0x1F9D45F1, + 0x119448FA, 0x4BE30393, 0x45EA0E98, 0x57F11985, 0x59F8148E, + 0x73C737BF, 0x7DCE3AB4, 0x6FD52DA9, 0x61DC20A2, 0xAD766DF6, + 0xA37F60FD, 0xB16477E0, 0xBF6D7AEB, 0x955259DA, 0x9B5B54D1, + 0x894043CC, 0x87494EC7, 0xDD3E05AE, 0xD33708A5, 0xC12C1FB8, + 0xCF2512B3, 0xE51A3182, 0xEB133C89, 0xF9082B94, 0xF701269F, + 0x4DE6BD46, 0x43EFB04D, 0x51F4A750, 0x5FFDAA5B, 0x75C2896A, + 0x7BCB8461, 0x69D0937C, 0x67D99E77, 0x3DAED51E, 0x33A7D815, + 0x21BCCF08, 0x2FB5C203, 0x058AE132, 0x0B83EC39, 0x1998FB24, + 0x1791F62F, 0x764DD68D, 0x7844DB86, 0x6A5FCC9B, 0x6456C190, + 0x4E69E2A1, 0x4060EFAA, 0x527BF8B7, 0x5C72F5BC, 0x0605BED5, + 0x080CB3DE, 0x1A17A4C3, 0x141EA9C8, 0x3E218AF9, 0x302887F2, + 0x223390EF, 0x2C3A9DE4, 0x96DD063D, 0x98D40B36, 0x8ACF1C2B, + 0x84C61120, 0xAEF93211, 0xA0F03F1A, 0xB2EB2807, 0xBCE2250C, + 0xE6956E65, 0xE89C636E, 0xFA877473, 0xF48E7978, 0xDEB15A49, + 0xD0B85742, 0xC2A3405F, 0xCCAA4D54, 0x41ECDAF7, 0x4FE5D7FC, + 0x5DFEC0E1, 0x53F7CDEA, 0x79C8EEDB, 0x77C1E3D0, 0x65DAF4CD, + 0x6BD3F9C6, 0x31A4B2AF, 0x3FADBFA4, 0x2DB6A8B9, 0x23BFA5B2, + 0x09808683, 0x07898B88, 0x15929C95, 0x1B9B919E, 0xA17C0A47, + 0xAF75074C, 0xBD6E1051, 0xB3671D5A, 0x99583E6B, 0x97513360, + 0x854A247D, 0x8B432976, 0xD134621F, 0xDF3D6F14, 0xCD267809, + 0xC32F7502, 0xE9105633, 0xE7195B38, 0xF5024C25, 0xFB0B412E, + 0x9AD7618C, 0x94DE6C87, 0x86C57B9A, 0x88CC7691, 0xA2F355A0, + 0xACFA58AB, 0xBEE14FB6, 0xB0E842BD, 0xEA9F09D4, 0xE49604DF, + 0xF68D13C2, 0xF8841EC9, 0xD2BB3DF8, 0xDCB230F3, 0xCEA927EE, + 0xC0A02AE5, 0x7A47B13C, 0x744EBC37, 0x6655AB2A, 0x685CA621, + 0x42638510, 0x4C6A881B, 0x5E719F06, 0x5078920D, 0x0A0FD964, + 0x0406D46F, 0x161DC372, 0x1814CE79, 0x322BED48, 0x3C22E043, + 0x2E39F75E, 0x2030FA55, 0xEC9AB701, 0xE293BA0A, 0xF088AD17, + 0xFE81A01C, 0xD4BE832D, 0xDAB78E26, 0xC8AC993B, 0xC6A59430, + 0x9CD2DF59, 0x92DBD252, 0x80C0C54F, 0x8EC9C844, 0xA4F6EB75, + 0xAAFFE67E, 0xB8E4F163, 0xB6EDFC68, 0x0C0A67B1, 0x02036ABA, + 0x10187DA7, 0x1E1170AC, 0x342E539D, 0x3A275E96, 0x283C498B, + 0x26354480, 0x7C420FE9, 0x724B02E2, 0x605015FF, 0x6E5918F4, + 0x44663BC5, 0x4A6F36CE, 0x587421D3, 0x567D2CD8, 0x37A10C7A, + 0x39A80171, 0x2BB3166C, 0x25BA1B67, 0x0F853856, 0x018C355D, + 0x13972240, 0x1D9E2F4B, 0x47E96422, 0x49E06929, 0x5BFB7E34, + 0x55F2733F, 0x7FCD500E, 0x71C45D05, 0x63DF4A18, 0x6DD64713, + 0xD731DCCA, 0xD938D1C1, 0xCB23C6DC, 0xC52ACBD7, 0xEF15E8E6, + 0xE11CE5ED, 0xF307F2F0, 0xFD0EFFFB, 0xA779B492, 0xA970B999, + 0xBB6BAE84, 0xB562A38F, 0x9F5D80BE, 0x91548DB5, 0x834F9AA8, + 0x8D4697A3, + }; + + // Lookup table for row 1 of the inverse mix column transform. + private static final int[] TMI1 = { + 0x00000000, 0x0B0E090D, 0x161C121A, 0x1D121B17, 0x2C382434, + 0x27362D39, 0x3A24362E, 0x312A3F23, 0x58704868, 0x537E4165, + 0x4E6C5A72, 0x4562537F, 0x74486C5C, 0x7F466551, 0x62547E46, + 0x695A774B, 0xB0E090D0, 0xBBEE99DD, 0xA6FC82CA, 0xADF28BC7, + 0x9CD8B4E4, 0x97D6BDE9, 0x8AC4A6FE, 0x81CAAFF3, 0xE890D8B8, + 0xE39ED1B5, 0xFE8CCAA2, 0xF582C3AF, 0xC4A8FC8C, 0xCFA6F581, + 0xD2B4EE96, 0xD9BAE79B, 0x7BDB3BBB, 0x70D532B6, 0x6DC729A1, + 0x66C920AC, 0x57E31F8F, 0x5CED1682, 0x41FF0D95, 0x4AF10498, + 0x23AB73D3, 0x28A57ADE, 0x35B761C9, 0x3EB968C4, 0x0F9357E7, + 0x049D5EEA, 0x198F45FD, 0x12814CF0, 0xCB3BAB6B, 0xC035A266, + 0xDD27B971, 0xD629B07C, 0xE7038F5F, 0xEC0D8652, 0xF11F9D45, + 0xFA119448, 0x934BE303, 0x9845EA0E, 0x8557F119, 0x8E59F814, + 0xBF73C737, 0xB47DCE3A, 0xA96FD52D, 0xA261DC20, 0xF6AD766D, + 0xFDA37F60, 0xE0B16477, 0xEBBF6D7A, 0xDA955259, 0xD19B5B54, + 0xCC894043, 0xC787494E, 0xAEDD3E05, 0xA5D33708, 0xB8C12C1F, + 0xB3CF2512, 0x82E51A31, 0x89EB133C, 0x94F9082B, 0x9FF70126, + 0x464DE6BD, 0x4D43EFB0, 0x5051F4A7, 0x5B5FFDAA, 0x6A75C289, + 0x617BCB84, 0x7C69D093, 0x7767D99E, 0x1E3DAED5, 0x1533A7D8, + 0x0821BCCF, 0x032FB5C2, 0x32058AE1, 0x390B83EC, 0x241998FB, + 0x2F1791F6, 0x8D764DD6, 0x867844DB, 0x9B6A5FCC, 0x906456C1, + 0xA14E69E2, 0xAA4060EF, 0xB7527BF8, 0xBC5C72F5, 0xD50605BE, + 0xDE080CB3, 0xC31A17A4, 0xC8141EA9, 0xF93E218A, 0xF2302887, + 0xEF223390, 0xE42C3A9D, 0x3D96DD06, 0x3698D40B, 0x2B8ACF1C, + 0x2084C611, 0x11AEF932, 0x1AA0F03F, 0x07B2EB28, 0x0CBCE225, + 0x65E6956E, 0x6EE89C63, 0x73FA8774, 0x78F48E79, 0x49DEB15A, + 0x42D0B857, 0x5FC2A340, 0x54CCAA4D, 0xF741ECDA, 0xFC4FE5D7, + 0xE15DFEC0, 0xEA53F7CD, 0xDB79C8EE, 0xD077C1E3, 0xCD65DAF4, + 0xC66BD3F9, 0xAF31A4B2, 0xA43FADBF, 0xB92DB6A8, 0xB223BFA5, + 0x83098086, 0x8807898B, 0x9515929C, 0x9E1B9B91, 0x47A17C0A, + 0x4CAF7507, 0x51BD6E10, 0x5AB3671D, 0x6B99583E, 0x60975133, + 0x7D854A24, 0x768B4329, 0x1FD13462, 0x14DF3D6F, 0x09CD2678, + 0x02C32F75, 0x33E91056, 0x38E7195B, 0x25F5024C, 0x2EFB0B41, + 0x8C9AD761, 0x8794DE6C, 0x9A86C57B, 0x9188CC76, 0xA0A2F355, + 0xABACFA58, 0xB6BEE14F, 0xBDB0E842, 0xD4EA9F09, 0xDFE49604, + 0xC2F68D13, 0xC9F8841E, 0xF8D2BB3D, 0xF3DCB230, 0xEECEA927, + 0xE5C0A02A, 0x3C7A47B1, 0x37744EBC, 0x2A6655AB, 0x21685CA6, + 0x10426385, 0x1B4C6A88, 0x065E719F, 0x0D507892, 0x640A0FD9, + 0x6F0406D4, 0x72161DC3, 0x791814CE, 0x48322BED, 0x433C22E0, + 0x5E2E39F7, 0x552030FA, 0x01EC9AB7, 0x0AE293BA, 0x17F088AD, + 0x1CFE81A0, 0x2DD4BE83, 0x26DAB78E, 0x3BC8AC99, 0x30C6A594, + 0x599CD2DF, 0x5292DBD2, 0x4F80C0C5, 0x448EC9C8, 0x75A4F6EB, + 0x7EAAFFE6, 0x63B8E4F1, 0x68B6EDFC, 0xB10C0A67, 0xBA02036A, + 0xA710187D, 0xAC1E1170, 0x9D342E53, 0x963A275E, 0x8B283C49, + 0x80263544, 0xE97C420F, 0xE2724B02, 0xFF605015, 0xF46E5918, + 0xC544663B, 0xCE4A6F36, 0xD3587421, 0xD8567D2C, 0x7A37A10C, + 0x7139A801, 0x6C2BB316, 0x6725BA1B, 0x560F8538, 0x5D018C35, + 0x40139722, 0x4B1D9E2F, 0x2247E964, 0x2949E069, 0x345BFB7E, + 0x3F55F273, 0x0E7FCD50, 0x0571C45D, 0x1863DF4A, 0x136DD647, + 0xCAD731DC, 0xC1D938D1, 0xDCCB23C6, 0xD7C52ACB, 0xE6EF15E8, + 0xEDE11CE5, 0xF0F307F2, 0xFBFD0EFF, 0x92A779B4, 0x99A970B9, + 0x84BB6BAE, 0x8FB562A3, 0xBE9F5D80, 0xB591548D, 0xA8834F9A, + 0xA38D4697, + }; + + // Lookup table for row 2 of the inverse mix column transform. + private static final int[] TMI2 = { + 0x00000000, 0x0D0B0E09, 0x1A161C12, 0x171D121B, 0x342C3824, + 0x3927362D, 0x2E3A2436, 0x23312A3F, 0x68587048, 0x65537E41, + 0x724E6C5A, 0x7F456253, 0x5C74486C, 0x517F4665, 0x4662547E, + 0x4B695A77, 0xD0B0E090, 0xDDBBEE99, 0xCAA6FC82, 0xC7ADF28B, + 0xE49CD8B4, 0xE997D6BD, 0xFE8AC4A6, 0xF381CAAF, 0xB8E890D8, + 0xB5E39ED1, 0xA2FE8CCA, 0xAFF582C3, 0x8CC4A8FC, 0x81CFA6F5, + 0x96D2B4EE, 0x9BD9BAE7, 0xBB7BDB3B, 0xB670D532, 0xA16DC729, + 0xAC66C920, 0x8F57E31F, 0x825CED16, 0x9541FF0D, 0x984AF104, + 0xD323AB73, 0xDE28A57A, 0xC935B761, 0xC43EB968, 0xE70F9357, + 0xEA049D5E, 0xFD198F45, 0xF012814C, 0x6BCB3BAB, 0x66C035A2, + 0x71DD27B9, 0x7CD629B0, 0x5FE7038F, 0x52EC0D86, 0x45F11F9D, + 0x48FA1194, 0x03934BE3, 0x0E9845EA, 0x198557F1, 0x148E59F8, + 0x37BF73C7, 0x3AB47DCE, 0x2DA96FD5, 0x20A261DC, 0x6DF6AD76, + 0x60FDA37F, 0x77E0B164, 0x7AEBBF6D, 0x59DA9552, 0x54D19B5B, + 0x43CC8940, 0x4EC78749, 0x05AEDD3E, 0x08A5D337, 0x1FB8C12C, + 0x12B3CF25, 0x3182E51A, 0x3C89EB13, 0x2B94F908, 0x269FF701, + 0xBD464DE6, 0xB04D43EF, 0xA75051F4, 0xAA5B5FFD, 0x896A75C2, + 0x84617BCB, 0x937C69D0, 0x9E7767D9, 0xD51E3DAE, 0xD81533A7, + 0xCF0821BC, 0xC2032FB5, 0xE132058A, 0xEC390B83, 0xFB241998, + 0xF62F1791, 0xD68D764D, 0xDB867844, 0xCC9B6A5F, 0xC1906456, + 0xE2A14E69, 0xEFAA4060, 0xF8B7527B, 0xF5BC5C72, 0xBED50605, + 0xB3DE080C, 0xA4C31A17, 0xA9C8141E, 0x8AF93E21, 0x87F23028, + 0x90EF2233, 0x9DE42C3A, 0x063D96DD, 0x0B3698D4, 0x1C2B8ACF, + 0x112084C6, 0x3211AEF9, 0x3F1AA0F0, 0x2807B2EB, 0x250CBCE2, + 0x6E65E695, 0x636EE89C, 0x7473FA87, 0x7978F48E, 0x5A49DEB1, + 0x5742D0B8, 0x405FC2A3, 0x4D54CCAA, 0xDAF741EC, 0xD7FC4FE5, + 0xC0E15DFE, 0xCDEA53F7, 0xEEDB79C8, 0xE3D077C1, 0xF4CD65DA, + 0xF9C66BD3, 0xB2AF31A4, 0xBFA43FAD, 0xA8B92DB6, 0xA5B223BF, + 0x86830980, 0x8B880789, 0x9C951592, 0x919E1B9B, 0x0A47A17C, + 0x074CAF75, 0x1051BD6E, 0x1D5AB367, 0x3E6B9958, 0x33609751, + 0x247D854A, 0x29768B43, 0x621FD134, 0x6F14DF3D, 0x7809CD26, + 0x7502C32F, 0x5633E910, 0x5B38E719, 0x4C25F502, 0x412EFB0B, + 0x618C9AD7, 0x6C8794DE, 0x7B9A86C5, 0x769188CC, 0x55A0A2F3, + 0x58ABACFA, 0x4FB6BEE1, 0x42BDB0E8, 0x09D4EA9F, 0x04DFE496, + 0x13C2F68D, 0x1EC9F884, 0x3DF8D2BB, 0x30F3DCB2, 0x27EECEA9, + 0x2AE5C0A0, 0xB13C7A47, 0xBC37744E, 0xAB2A6655, 0xA621685C, + 0x85104263, 0x881B4C6A, 0x9F065E71, 0x920D5078, 0xD9640A0F, + 0xD46F0406, 0xC372161D, 0xCE791814, 0xED48322B, 0xE0433C22, + 0xF75E2E39, 0xFA552030, 0xB701EC9A, 0xBA0AE293, 0xAD17F088, + 0xA01CFE81, 0x832DD4BE, 0x8E26DAB7, 0x993BC8AC, 0x9430C6A5, + 0xDF599CD2, 0xD25292DB, 0xC54F80C0, 0xC8448EC9, 0xEB75A4F6, + 0xE67EAAFF, 0xF163B8E4, 0xFC68B6ED, 0x67B10C0A, 0x6ABA0203, + 0x7DA71018, 0x70AC1E11, 0x539D342E, 0x5E963A27, 0x498B283C, + 0x44802635, 0x0FE97C42, 0x02E2724B, 0x15FF6050, 0x18F46E59, + 0x3BC54466, 0x36CE4A6F, 0x21D35874, 0x2CD8567D, 0x0C7A37A1, + 0x017139A8, 0x166C2BB3, 0x1B6725BA, 0x38560F85, 0x355D018C, + 0x22401397, 0x2F4B1D9E, 0x642247E9, 0x692949E0, 0x7E345BFB, + 0x733F55F2, 0x500E7FCD, 0x5D0571C4, 0x4A1863DF, 0x47136DD6, + 0xDCCAD731, 0xD1C1D938, 0xC6DCCB23, 0xCBD7C52A, 0xE8E6EF15, + 0xE5EDE11C, 0xF2F0F307, 0xFFFBFD0E, 0xB492A779, 0xB999A970, + 0xAE84BB6B, 0xA38FB562, 0x80BE9F5D, 0x8DB59154, 0x9AA8834F, + 0x97A38D46, + }; + + // Lookup table for row 3 of the inverse mix column transform. + private static final int[] TMI3 = { + 0x00000000, 0x090D0B0E, 0x121A161C, 0x1B171D12, 0x24342C38, + 0x2D392736, 0x362E3A24, 0x3F23312A, 0x48685870, 0x4165537E, + 0x5A724E6C, 0x537F4562, 0x6C5C7448, 0x65517F46, 0x7E466254, + 0x774B695A, 0x90D0B0E0, 0x99DDBBEE, 0x82CAA6FC, 0x8BC7ADF2, + 0xB4E49CD8, 0xBDE997D6, 0xA6FE8AC4, 0xAFF381CA, 0xD8B8E890, + 0xD1B5E39E, 0xCAA2FE8C, 0xC3AFF582, 0xFC8CC4A8, 0xF581CFA6, + 0xEE96D2B4, 0xE79BD9BA, 0x3BBB7BDB, 0x32B670D5, 0x29A16DC7, + 0x20AC66C9, 0x1F8F57E3, 0x16825CED, 0x0D9541FF, 0x04984AF1, + 0x73D323AB, 0x7ADE28A5, 0x61C935B7, 0x68C43EB9, 0x57E70F93, + 0x5EEA049D, 0x45FD198F, 0x4CF01281, 0xAB6BCB3B, 0xA266C035, + 0xB971DD27, 0xB07CD629, 0x8F5FE703, 0x8652EC0D, 0x9D45F11F, + 0x9448FA11, 0xE303934B, 0xEA0E9845, 0xF1198557, 0xF8148E59, + 0xC737BF73, 0xCE3AB47D, 0xD52DA96F, 0xDC20A261, 0x766DF6AD, + 0x7F60FDA3, 0x6477E0B1, 0x6D7AEBBF, 0x5259DA95, 0x5B54D19B, + 0x4043CC89, 0x494EC787, 0x3E05AEDD, 0x3708A5D3, 0x2C1FB8C1, + 0x2512B3CF, 0x1A3182E5, 0x133C89EB, 0x082B94F9, 0x01269FF7, + 0xE6BD464D, 0xEFB04D43, 0xF4A75051, 0xFDAA5B5F, 0xC2896A75, + 0xCB84617B, 0xD0937C69, 0xD99E7767, 0xAED51E3D, 0xA7D81533, + 0xBCCF0821, 0xB5C2032F, 0x8AE13205, 0x83EC390B, 0x98FB2419, + 0x91F62F17, 0x4DD68D76, 0x44DB8678, 0x5FCC9B6A, 0x56C19064, + 0x69E2A14E, 0x60EFAA40, 0x7BF8B752, 0x72F5BC5C, 0x05BED506, + 0x0CB3DE08, 0x17A4C31A, 0x1EA9C814, 0x218AF93E, 0x2887F230, + 0x3390EF22, 0x3A9DE42C, 0xDD063D96, 0xD40B3698, 0xCF1C2B8A, + 0xC6112084, 0xF93211AE, 0xF03F1AA0, 0xEB2807B2, 0xE2250CBC, + 0x956E65E6, 0x9C636EE8, 0x877473FA, 0x8E7978F4, 0xB15A49DE, + 0xB85742D0, 0xA3405FC2, 0xAA4D54CC, 0xECDAF741, 0xE5D7FC4F, + 0xFEC0E15D, 0xF7CDEA53, 0xC8EEDB79, 0xC1E3D077, 0xDAF4CD65, + 0xD3F9C66B, 0xA4B2AF31, 0xADBFA43F, 0xB6A8B92D, 0xBFA5B223, + 0x80868309, 0x898B8807, 0x929C9515, 0x9B919E1B, 0x7C0A47A1, + 0x75074CAF, 0x6E1051BD, 0x671D5AB3, 0x583E6B99, 0x51336097, + 0x4A247D85, 0x4329768B, 0x34621FD1, 0x3D6F14DF, 0x267809CD, + 0x2F7502C3, 0x105633E9, 0x195B38E7, 0x024C25F5, 0x0B412EFB, + 0xD7618C9A, 0xDE6C8794, 0xC57B9A86, 0xCC769188, 0xF355A0A2, + 0xFA58ABAC, 0xE14FB6BE, 0xE842BDB0, 0x9F09D4EA, 0x9604DFE4, + 0x8D13C2F6, 0x841EC9F8, 0xBB3DF8D2, 0xB230F3DC, 0xA927EECE, + 0xA02AE5C0, 0x47B13C7A, 0x4EBC3774, 0x55AB2A66, 0x5CA62168, + 0x63851042, 0x6A881B4C, 0x719F065E, 0x78920D50, 0x0FD9640A, + 0x06D46F04, 0x1DC37216, 0x14CE7918, 0x2BED4832, 0x22E0433C, + 0x39F75E2E, 0x30FA5520, 0x9AB701EC, 0x93BA0AE2, 0x88AD17F0, + 0x81A01CFE, 0xBE832DD4, 0xB78E26DA, 0xAC993BC8, 0xA59430C6, + 0xD2DF599C, 0xDBD25292, 0xC0C54F80, 0xC9C8448E, 0xF6EB75A4, + 0xFFE67EAA, 0xE4F163B8, 0xEDFC68B6, 0x0A67B10C, 0x036ABA02, + 0x187DA710, 0x1170AC1E, 0x2E539D34, 0x275E963A, 0x3C498B28, + 0x35448026, 0x420FE97C, 0x4B02E272, 0x5015FF60, 0x5918F46E, + 0x663BC544, 0x6F36CE4A, 0x7421D358, 0x7D2CD856, 0xA10C7A37, + 0xA8017139, 0xB3166C2B, 0xBA1B6725, 0x8538560F, 0x8C355D01, + 0x97224013, 0x9E2F4B1D, 0xE9642247, 0xE0692949, 0xFB7E345B, + 0xF2733F55, 0xCD500E7F, 0xC45D0571, 0xDF4A1863, 0xD647136D, + 0x31DCCAD7, 0x38D1C1D9, 0x23C6DCCB, 0x2ACBD7C5, 0x15E8E6EF, + 0x1CE5EDE1, 0x07F2F0F3, 0x0EFFFBFD, 0x79B492A7, 0x70B999A9, + 0x6BAE84BB, 0x62A38FB5, 0x5D80BE9F, 0x548DB591, 0x4F9AA883, + 0x4697A38D, + }; + + /** + * Return the block cipher size. + * + * @return the AES block cipher size (in bytes). + */ + int getBlockSize() { + return AESConstants.AES_BLOCK_SIZE; + } + + /** + * Verifies if the length argument is a valid key size or not. + * + * @param len the size of the key (in bytes) to be validated. + * + * @return {@code true} if the size of the key is valid else {@code false}. + */ + static boolean isKeySizeValid(int len) { + for (int kLength : AESConstants.AES_KEYSIZES) { + if (len == kLength) { + return true; + } + } + return false; + } + + /** + * Check algorithm and initalize round keys for decryption and encryption. + * + * @param decrypting [in] indicates if encrypting ({@code false}) or + * decrypting ({@code true}). + * @param algorithm [in] the case insentive string name for the AES cipher. + * @param key [in] the symmetric key byte array for encryption/decryption. + * + * @throws InvalidKeyException if an incorrect algorithm is given or if + * an invalid key size is provided. + */ + void init(boolean decrypting, String algorithm, byte[] key) + throws InvalidKeyException { + int decrypt = decrypting ? 1 : 0; + + if (!algorithm.equalsIgnoreCase("AES") + && !algorithm.equalsIgnoreCase("Rijndael")) { + throw new InvalidKeyException ("Invalid algorithm name."); + } + if (key.length == AESConstants.AES_KEYSIZES[0]) { + rounds = AES_128_ROUNDS; + } else if (key.length == AESConstants.AES_KEYSIZES[1]) { + rounds = AES_192_ROUNDS; + } else if (key.length == AESConstants.AES_KEYSIZES[2]) { + rounds = AES_256_ROUNDS; + } else { + throw new InvalidKeyException("Invalid key length (" + key.length + + ")."); + } + if (!MessageDigest.isEqual(prevKey, key)) { + if (sessionK == null) { + sessionK = new int[2][]; + } else { + Arrays.fill(sessionK[0], 0); + Arrays.fill(sessionK[1], 0); + } + sessionK[0] = genRoundKeys(key, rounds); + sessionK[1] = genInvRoundKeys(sessionK[0], rounds); + if (prevKey != null) { + Arrays.fill(prevKey, (byte) 0); + } + prevKey = key.clone(); + } + K = sessionK[decrypt]; + } + + /** + * Generate the cipher's round keys as outlined in section 5.2 of the spec. + * + * @param key [in] the symmetric key byte array. + * + * @return w the cipher round keys. + */ + private static int[] genRoundKeys(byte[] key, int rounds) { + int wLen = WB * (rounds + 1); + int[] w = new int[wLen]; + int nk = key.length / BW; + + for (int i = 0, j = 0; i < nk; i++, j += BW) { + w[i] = ((key[j] & 0xFF) << 24) | ((key[j + 1] & 0xFF) << 16) + | ((key[j + 2] & 0xFF) << 8) | (key[j + 3] & 0xFF); + } + for (int i = nk; i < wLen; i++) { + int tmp = w[i - 1]; + if (i % nk == 0) { + int rW = (tmp << 8) & 0xFFFFFF00 | (tmp >>> 24); + tmp = subWord(rW) ^ RCON[(i / nk) - 1]; + } else if ((nk > 6) && ((i % nk) == WB)) { + tmp = subWord(tmp); + } + w[i] = w[i - nk] ^ tmp; + } + + return w; + } + + /** + * Generate the inverse cipher round keys. + * + * @return w1 the inverse cipher round keys. + */ + private static int[] genInvRoundKeys(int[] w, int rounds) { + int kLen = w.length;; + int[] temp = new int[WB]; + int[] dw = new int[kLen]; + + // Intrinsics requires the inverse key expansion to be reverse order + // except for the first and last round key as the first two round keys + // are without a mix column transform. + for (int i = 1; i < rounds; i++) { + System.arraycopy(w, i * WB, temp, 0, WB); + temp[0] = TMI0[temp[0] >>> 24] ^ TMI1[(temp[0] >> 16) & 0xFF] + ^ TMI2[(temp[0] >> 8) & 0xFF] ^ TMI3[temp[0] & 0xFF]; + temp[1] = TMI0[temp[1] >>> 24] ^ TMI1[(temp[1] >> 16) & 0xFF] + ^ TMI2[(temp[1] >> 8) & 0xFF] ^ TMI3[temp[1] & 0xFF]; + temp[2] = TMI0[temp[2] >>> 24] ^ TMI1[(temp[2] >> 16) & 0xFF] + ^ TMI2[(temp[2] >> 8) & 0xFF] ^ TMI3[temp[2] & 0xFF]; + temp[3] = TMI0[temp[3] >>> 24] ^ TMI1[(temp[3] >> 16) & 0xFF] + ^ TMI2[(temp[3] >> 8) & 0xFF] ^ TMI3[temp[3] & 0xFF]; + System.arraycopy(temp, 0, dw, kLen - (i * WB), WB); + } + System.arraycopy(w, kLen - WB, dw, WB, WB); + System.arraycopy(w, 0, dw, 0, WB); + Arrays.fill(temp, 0); + + return dw; + } + + /** + * Subtitute the word as a step of key expansion. + * + * @param state [in] the targeted word for substituion. + * @param sub [in] the substitute table for cipher and inverse cipher. + * + * @return the substituted word. + */ + private static int subWord(int word) { + byte b0 = (byte) (word >>> 24); + byte b1 = (byte) ((word >> 16) & 0xFF); + byte b2 = (byte) ((word >> 8) & 0xFF); + byte b3 = (byte) (word & 0xFF); + + return ((SBOX[(b0 & 0xF0) >> 4][b0 & 0x0F] & 0xFF) << 24) + | ((SBOX[(b1 & 0xF0) >> 4][b1 & 0x0F] & 0xFF) << 16) + | ((SBOX[(b2 & 0xF0) >> 4][b2 & 0x0F] & 0xFF) << 8) + | (SBOX[(b3 & 0xF0) >> 4][b3 & 0x0F] & 0xFF); + } + + /** + * Method for one block of encryption. + * + * @param p [in] the plaintext to be encrypted. + * @param po [in] the plaintext offset in the array of bytes. + * @param c [out] the ciphertext output. + * @param co [in] the ciphertext offset in the array of bytes. + */ + @IntrinsicCandidate + private void implEncryptBlock(byte[] p, int po, byte[] c, int co) { + int ti0, ti1, ti2, ti3; + int a0, a1, a2, a3; + int w = K.length - WB; + + a0 = ((p[po] & 0xFF) << 24) ^ ((p[po + 1] & 0xFF) << 16) + ^ ((p[po + 2] & 0xFF) << 8) ^ (p[po + 3] & 0xFF) ^ K[0]; + a1 = ((p[po + 4] & 0xFF) << 24) ^ ((p[po + 5] & 0xFF) << 16) + ^ ((p[po + 6] & 0xFF) << 8) ^ (p[po + 7] & 0xFF) ^ K[1]; + a2 = ((p[po + 8] & 0xFF) << 24) ^ ((p[po + 9] & 0xFF) << 16) + ^ ((p[po + 10] & 0xFF) << 8) ^ (p[po + 11] & 0xFF) ^ K[2]; + a3 = ((p[po + 12] & 0xFF) << 24) ^ ((p[po + 13] & 0xFF) << 16) + ^ ((p[po + 14] & 0xFF) << 8) ^ (p[po + 15] & 0xFF) ^ K[3]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[4]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[5]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[6]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[7]; + + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[8]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[9]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[10]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[11]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[12]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[13]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[14]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[15]; + + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[16]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[17]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[18]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[19]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[20]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[21]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[22]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[23]; + + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[24]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[25]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[26]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[27]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[28]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[29]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[30]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[31]; + + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[32]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[33]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[34]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[35]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[36]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[37]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[38]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[39]; + + if (rounds > AES_128_ROUNDS) { + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[40]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[41]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[42]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[43]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[44]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[45]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[46]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[47]; + } + if (rounds > AES_192_ROUNDS) { + a0 = T0[ti0 >>> 24] ^ T1[(ti1 >> 16) & 0xFF] + ^ T2[(ti2 >> 8) & 0xFF] ^ T3[ti3 & 0xFF] ^ K[48]; + a1 = T0[ti1 >>> 24] ^ T1[(ti2 >> 16) & 0xFF] + ^ T2[(ti3 >> 8) & 0xFF] ^ T3[ti0 & 0xFF] ^ K[49]; + a2 = T0[ti2 >>> 24] ^ T1[(ti3 >> 16) & 0xFF] + ^ T2[(ti0 >> 8) & 0xFF] ^ T3[ti1 & 0xFF] ^ K[50]; + a3 = T0[ti3 >>> 24] ^ T1[(ti0 >> 16) & 0xFF] + ^ T2[(ti1 >> 8) & 0xFF] ^ T3[ti2 & 0xFF] ^ K[51]; + + ti0 = T0[a0 >>> 24] ^ T1[(a1 >> 16) & 0xFF] + ^ T2[(a2 >> 8) & 0xFF] ^ T3[a3 & 0xFF] ^ K[52]; + ti1 = T0[a1 >>> 24] ^ T1[(a2 >> 16) & 0xFF] + ^ T2[(a3 >> 8) & 0xFF] ^ T3[a0 & 0xFF] ^ K[53]; + ti2 = T0[a2 >>> 24] ^ T1[(a3 >> 16) & 0xFF] + ^ T2[(a0 >> 8) & 0xFF] ^ T3[a1 & 0xFF] ^ K[54]; + ti3 = T0[a3 >>> 24] ^ T1[(a0 >> 16) & 0xFF] + ^ T2[(a1 >> 8) & 0xFF] ^ T3[a2 & 0xFF] ^ K[55]; + } + + a0 = T2[ti0 >>> 24] & 0xFF000000 + ^ T3[(ti1 >> 16) & 0xFF] & 0xFF0000 + ^ T0[(ti2 >> 8) & 0xFF] & 0xFF00 + ^ T1[ti3 & 0xFF] & 0xFF ^ K[w]; + a1 = T2[ti1 >>> 24] & 0xFF000000 + ^ T3[(ti2 >> 16) & 0xFF] & 0xFF0000 + ^ T0[(ti3 >> 8) & 0xFF] & 0xFF00 + ^ T1[ti0 & 0xFF] & 0xFF ^ K[w + 1]; + a2 = T2[ti2 >>> 24] & 0xFF000000 + ^ T3[(ti3 >> 16) & 0xFF] & 0xFF0000 + ^ T0[(ti0 >> 8) & 0xFF] & 0xFF00 + ^ T1[ti1 & 0xFF] & 0xFF ^ K[w + 2]; + a3 = T2[ti3 >>> 24] & 0xFF000000 + ^ T3[(ti0 >> 16) & 0xFF] & 0xFF0000 + ^ T0[(ti1 >> 8) & 0xFF] & 0xFF00 + ^ T1[ti2 & 0xFF] & 0xFF ^ K[w + 3]; + + c[co] = (byte) (a0 >>> 24); + c[co + 1] = (byte) ((a0 >> 16) & 0xFF); + c[co + 2] = (byte) ((a0 >> 8) & 0xFF); + c[co + 3] = (byte) (a0 & 0xFF); + c[co + 4] = (byte) (a1 >>> 24); + c[co + 5] = (byte) ((a1 >> 16) & 0xFF); + c[co + 6] = (byte) ((a1 >> 8) & 0xFF); + c[co + 7] = (byte) (a1 & 0xFF); + c[co + 8] = (byte) (a2 >>> 24); + c[co + 9] = (byte) ((a2 >> 16) & 0xFF); + c[co + 10] = (byte) ((a2 >> 8) & 0xFF); + c[co + 11] = (byte) (a2 & 0xFF); + c[co + 12] = (byte) (a3 >> 24); + c[co + 13] = (byte) ((a3 >> 16) & 0xFF); + c[co + 14] = (byte) ((a3 >> 8) & 0xFF); + c[co + 15] = (byte) (a3 & 0xFF); + } + + /** + * Method for one block of decryption. + * + * @param c [in] the ciphertext to be decrypted. + * @param co [in] the ciphertext offset in the array of bytes. + * @param p [out] the plaintext output. + * @param po [in] the plaintext offset in the array of bytes. + */ + @IntrinsicCandidate + private void implDecryptBlock(byte[] c, int co, byte[] p, int po) { + int ti0, ti1, ti2, ti3; + int a0, a1, a2, a3; + + ti0 = ((c[co] & 0xFF) << 24) ^ ((c[co + 1] & 0xFF) << 16) + ^ ((c[co + 2] & 0xFF) << 8) ^ (c[co + 3] & 0xFF) ^ K[4]; + ti1 = ((c[co + 4] & 0xFF) << 24) ^ ((c[co + 5] & 0xFF) << 16) + ^ ((c[co + 6] & 0xFF) << 8) ^ (c[co + 7] & 0xFF) ^ K[5]; + ti2 = ((c[co + 8] & 0xFF) << 24) ^ ((c[co + 9] & 0xFF) << 16) + ^ ((c[co + 10] & 0xFF) << 8) ^ (c[co + 11] & 0xFF) ^ K[6]; + ti3 = ((c[co + 12] & 0xFF) << 24) ^ ((c[co + 13] & 0xFF) << 16) + ^ ((c[co + 14] & 0xFF) << 8) ^ (c[co + 15] & 0xFF) ^ K[7]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[8]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[9]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[10]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[11]; + + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[12]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[13]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[14]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[15]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[16]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[17]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[18]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[19]; + + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[20]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[21]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[22]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[23]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[24]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[25]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[26]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[27]; + + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[28]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[29]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[30]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[31]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[32]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[33]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[34]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[35]; + + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[36]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[37]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[38]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[39]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[40]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[41]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[42]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[43]; + + if (rounds > AES_128_ROUNDS) { + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[44]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[45]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[46]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[47]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[48]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[49]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[50]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[51]; + } + if (rounds > AES_192_ROUNDS) { + ti0 = TI0[a0 >>> 24] ^ TI1[(a3 >> 16) & 0xFF] + ^ TI2[(a2 >> 8) & 0xFF] ^ TI3[a1 & 0xFF] ^ K[52]; + ti1 = TI0[a1 >>> 24] ^ TI1[(a0 >> 16) & 0xFF] + ^ TI2[(a3 >> 8) & 0xFF] ^ TI3[a2 & 0xFF] ^ K[53]; + ti2 = TI0[a2 >>> 24] ^ TI1[(a1 >> 16) & 0xFF] + ^ TI2[(a0 >> 8) & 0xFF] ^ TI3[a3 & 0xFF] ^ K[54]; + ti3 = TI0[a3 >>> 24] ^ TI1[(a2 >> 16) & 0xFF] + ^ TI2[(a1 >> 8) & 0xFF] ^ TI3[a0 & 0xFF] ^ K[55]; + + a0 = TI0[ti0 >>> 24] ^ TI1[(ti3 >> 16) & 0xFF] + ^ TI2[(ti2 >> 8) & 0xFF] ^ TI3[ti1 & 0xFF] ^ K[56]; + a1 = TI0[ti1 >>> 24] ^ TI1[(ti0 >> 16) & 0xFF] + ^ TI2[(ti3 >> 8) & 0xFF] ^ TI3[ti2 & 0xFF] ^ K[57]; + a2 = TI0[ti2 >>> 24] ^ TI1[(ti1 >> 16) & 0xFF] + ^ TI2[(ti0 >> 8) & 0xFF] ^ TI3[ti3 & 0xFF] ^ K[58]; + a3 = TI0[ti3 >>> 24] ^ TI1[(ti2 >> 16) & 0xFF] + ^ TI2[(ti1 >> 8) & 0xFF] ^ TI3[ti0 & 0xFF] ^ K[59]; + } + + ti0 = TI4[a0 >>> 24] & 0xFF000000 ^ TI4[(a3 >> 16) & 0xFF] & 0xFF0000 + ^ TI4[(a2 >> 8) & 0xFF] & 0xFF00 ^ TI4[a1 & 0xFF] & 0xFF ^ K[0]; + ti1 = TI4[a1 >>> 24] & 0xFF000000 ^ TI4[(a0 >> 16) & 0xFF] & 0xFF0000 + ^ TI4[(a3 >> 8) & 0xFF] & 0xFF00 ^ TI4[a2 & 0xFF] & 0xFF ^ K[1]; + ti2 = TI4[a2 >>> 24] & 0xFF000000 ^ TI4[(a1 >> 16) & 0xFF] & 0xFF0000 + ^ TI4[(a0 >> 8) & 0xFF] & 0xFF00 ^ TI4[a3 & 0xFF] & 0xFF ^ K[2]; + ti3 = TI4[a3 >>> 24] & 0xFF000000 ^ TI4[(a2 >> 16) & 0xFF] & 0xFF0000 + ^ TI4[(a1 >> 8) & 0xFF] & 0xFF00 ^ TI4[a0 & 0xFF] & 0xFF ^ K[3]; + + p[po] = (byte) (ti0 >>> 24); + p[po + 1] = (byte) ((ti0 >> 16) & 0xFF); + p[po + 2] = (byte) ((ti0 >> 8) & 0xFF); + p[po + 3] = (byte) (ti0 & 0xFF); + p[po + 4] = (byte) (ti1 >>> 24); + p[po + 5] = (byte) ((ti1 >> 16) & 0xFF); + p[po + 6] = (byte) ((ti1 >> 8) & 0xFF); + p[po + 7] = (byte) (ti1 & 0xFF); + p[po + 8] = (byte) (ti2 >>> 24); + p[po + 9] = (byte) ((ti2 >> 16) & 0xFF); + p[po + 10] = (byte) ((ti2 >> 8) & 0xFF); + p[po + 11] = (byte) (ti2 & 0xFF); + p[po + 12] = (byte) (ti3 >>> 24); + p[po + 13] = (byte) ((ti3 >> 16) & 0xFF); + p[po + 14] = (byte) ((ti3 >> 8) & 0xFF); + p[po + 15] = (byte) (ti3 & 0xFF); + } + + /** + * Method for one block of encryption. + * + * @param plain [in] the plaintext to be encrypted. + * @param pOff [in] the plaintext offset in the array of bytes. + * @param cipher [out] the encrypted ciphertext output. + * @param cOff [in] the ciphertext offset in the array of bytes. + */ + void encryptBlock(byte[] plain, int pOff, byte[] cipher, int cOff) { + implEncryptBlock(plain, pOff, cipher, cOff); + } + + /** + * Method for one block of decryption. + * + * @param cipher [in] the ciphertext to be decrypted. + * @param cOff [in] the ciphertext offset in the array of bytes. + * @param plain [out] the decrypted plaintext output. + * @param pOff [in] the plaintext offset in the array of bytes. + */ + void decryptBlock(byte[] cipher, int cOff, byte[] plain, int pOff) { + implDecryptBlock(cipher, cOff, plain, pOff); + } +} diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java index 926a56c140b..3f3373860f3 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -40,7 +40,7 @@ import java.util.Arrays; * to 16 bytes. * * If any invariant is broken, failures can occur because the - * AESCrypt.encryptBlock method can be intrinsified on the HotSpot VM + * AES_Crypt.encryptBlock method can be intrinsified on the HotSpot VM * (see JDK-8067648 for details). * * The counter mode operations can be intrinsified and parallelized diff --git a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java index 3d1396121ad..2f4df1eba03 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/GaloisCounterMode.java @@ -102,7 +102,7 @@ abstract class GaloisCounterMode extends CipherSpi { /** * * @param keySize length of key. - * @param embeddedCipher Cipher object, such as AESCrypt. + * @param embeddedCipher Cipher object, such as AES_Crypt. */ GaloisCounterMode(int keySize, SymmetricCipher embeddedCipher) { blockCipher = embeddedCipher; @@ -198,7 +198,7 @@ abstract class GaloisCounterMode extends CipherSpi { protected int engineGetKeySize(Key key) throws InvalidKeyException { byte[] encoded = key.getEncoded(); Arrays.fill(encoded, (byte)0); - if (!AESCrypt.isKeySizeValid(encoded.length)) { + if (!AES_Crypt.isKeySizeValid(encoded.length)) { throw new InvalidKeyException("Invalid key length: " + encoded.length + " bytes"); } @@ -1693,25 +1693,25 @@ abstract class GaloisCounterMode extends CipherSpi { public static final class AESGCM extends GaloisCounterMode { public AESGCM() { - super(-1, new AESCrypt()); + super(-1, new AES_Crypt()); } } public static final class AES128 extends GaloisCounterMode { public AES128() { - super(16, new AESCrypt()); + super(16, new AES_Crypt()); } } public static final class AES192 extends GaloisCounterMode { public AES192() { - super(24, new AESCrypt()); + super(24, new AES_Crypt()); } } public static final class AES256 extends GaloisCounterMode { public AES256() { - super(32, new AESCrypt()); + super(32, new AES_Crypt()); } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java index ba2825fa36c..e0c1873213b 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/KeyWrapCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -137,7 +137,7 @@ abstract class KeyWrapCipher extends CipherSpi { } int keyLen = keyBytes.length; if (!key.getAlgorithm().equalsIgnoreCase("AES") || - !AESCrypt.isKeySizeValid(keyLen) || + !AES_Crypt.isKeySizeValid(keyLen) || (fixedKeySize != -1 && fixedKeySize != keyLen)) { throw new InvalidKeyException("Invalid key length: " + keyLen + " bytes"); diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Core.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Core.java index 6d2c4da3b8b..df37da2347f 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Core.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Core.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -68,7 +68,7 @@ abstract class PBES2Core extends CipherSpi { if (cipherAlgo.equals("AES")) { blkSize = AESConstants.AES_BLOCK_SIZE; - cipher = new CipherCore(new AESCrypt(), blkSize); + cipher = new CipherCore(new AES_Crypt(), blkSize); switch(kdfAlgo) { case "HmacSHA1": diff --git a/src/java.base/share/classes/com/sun/crypto/provider/SymmetricCipher.java b/src/java.base/share/classes/com/sun/crypto/provider/SymmetricCipher.java index 7b428f86aa7..ad93679140c 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/SymmetricCipher.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/SymmetricCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -36,7 +36,7 @@ import java.security.InvalidKeyException; * @author Jan Luehe * * - * @see AESCrypt + * @see AES_Crypt * @see DESCrypt * @see DESedeCrypt * @see BlowfishCrypt diff --git a/src/java.base/share/legal/aes.md b/src/java.base/share/legal/aes.md deleted file mode 100644 index 6d0ee2e2bb4..00000000000 --- a/src/java.base/share/legal/aes.md +++ /dev/null @@ -1,36 +0,0 @@ -## Cryptix AES v3.2.0 - -### Cryptix General License -

        -
        -Cryptix General License
        -
        -Copyright (c) 1995-2005 The Cryptix Foundation Limited.
        -All rights reserved.
        -
        -Redistribution and use in source and binary forms, with or without
        -modification, are permitted provided that the following conditions are
        -met:
        -
        -  1. Redistributions of source code must retain the copyright notice,
        -     this list of conditions and the following disclaimer.
        -
        -  2. Redistributions in binary form must reproduce the above copyright
        -     notice, this list of conditions and the following disclaimer in
        -     the documentation and/or other materials provided with the
        -     distribution.
        -
        -THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
        -CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
        -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
        -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        -IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
        -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
        -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
        -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
        -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        -
        -
        diff --git a/test/hotspot/jtreg/compiler/codegen/aes/TestAESMain.java b/test/hotspot/jtreg/compiler/codegen/aes/TestAESMain.java index 36ee43a7732..608b979e8f1 100644 --- a/test/hotspot/jtreg/compiler/codegen/aes/TestAESMain.java +++ b/test/hotspot/jtreg/compiler/codegen/aes/TestAESMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -155,7 +155,7 @@ public class TestAESMain { public static void main(String[] args) { String mode = System.getProperty("mode", "CBC"); if ((mode.equals("CBC") || mode.equals("ECB")) && - !Compiler.isIntrinsicAvailable(CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION, "com.sun.crypto.provider.AESCrypt", "implEncryptBlock", byte[].class, int.class, byte[].class, int.class)) { + !Compiler.isIntrinsicAvailable(CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION, "com.sun.crypto.provider.AES_Crypt", "implEncryptBlock", byte[].class, int.class, byte[].class, int.class)) { throw new SkippedException("AES intrinsic is not available"); } if (mode.equals("GCM") && diff --git a/test/hotspot/jtreg/compiler/cpuflags/AESIntrinsicsBase.java b/test/hotspot/jtreg/compiler/cpuflags/AESIntrinsicsBase.java index 2ed3fd81e1c..9f36aae4579 100644 --- a/test/hotspot/jtreg/compiler/cpuflags/AESIntrinsicsBase.java +++ b/test/hotspot/jtreg/compiler/cpuflags/AESIntrinsicsBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ public abstract class AESIntrinsicsBase { + ".provider\\.CipherBlockChaining::" + "(implEncrypt|implDecrypt) \\([0-9]+ bytes\\)\\s+\\(intrinsic[,\\)]"; public static final String AES_INTRINSIC = "com\\.sun\\.crypto\\" - + ".provider\\.AESCrypt::(implEncryptBlock|implDecryptBlock) \\([0-9]+ " + + ".provider\\.AES_Crypt::(implEncryptBlock|implDecryptBlock) \\([0-9]+ " + "bytes\\)\\s+\\(intrinsic[,\\)]"; public static final String USE_AES = "UseAES"; public static final String USE_AES_INTRINSICS = "UseAESIntrinsics"; diff --git a/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/TestHotSpotJVMCIRuntime.java b/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/TestHotSpotJVMCIRuntime.java index e5d1da81309..e62de99f366 100644 --- a/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/TestHotSpotJVMCIRuntime.java +++ b/test/hotspot/jtreg/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/TestHotSpotJVMCIRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -114,7 +114,7 @@ public class TestHotSpotJVMCIRuntime { VirtualObjectLayoutTest.class, TestHotSpotJVMCIRuntime.class)); try { - classes.add(Class.forName("com.sun.crypto.provider.AESCrypt")); + classes.add(Class.forName("com.sun.crypto.provider.AES_Crypt")); classes.add(Class.forName("com.sun.crypto.provider.CipherBlockChaining")); } catch (ClassNotFoundException e) { // Extension classes not available diff --git a/test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java b/test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java new file mode 100644 index 00000000000..0514a6d25f3 --- /dev/null +++ b/test/micro/org/openjdk/bench/javax/crypto/AESDecrypt.java @@ -0,0 +1,84 @@ +/* + * 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. + * + * 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 org.openjdk.bench.javax.crypto; + +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Thread) +public class AESDecrypt { + + @Param("10000000") + private int count; + + private Cipher cipher; + private byte[] src; + private byte[] ct; + + @Setup + public void setup() throws Exception { + SecretKeySpec keySpec = new SecretKeySpec(new byte[]{-80, -103, -1, 68, -29, -94, 61, -52, 93, -59, -128, 105, 110, 88, 44, 105}, "AES"); + IvParameterSpec iv = new IvParameterSpec(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}); + + cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); + + src = new byte[count]; + new Random(1).nextBytes(src); + + ct = cipher.doFinal(src); + + cipher.init(Cipher.DECRYPT_MODE, keySpec, iv); + } + + @Benchmark + @Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:-UseAES", "-XX:-UseAESIntrinsics"}) + public byte[] testBaseline() throws Exception { + return cipher.doFinal(ct); + } + + @Benchmark + @Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:+UseAES", "-XX:-UseAESIntrinsics"}) + public byte[] testUseAes() throws Exception { + return cipher.doFinal(ct); + } + + @Benchmark + @Fork(jvmArgs = {"-XX:+UnlockDiagnosticVMOptions", "-XX:+UseAES", "-XX:+UseAESIntrinsics"}) + public byte[] testUseAesIntrinsics() throws Exception { + return cipher.doFinal(ct); + } + +} From d720a8491b2556373b2686a129c306deefafd671 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Fri, 24 Oct 2025 00:16:18 +0000 Subject: [PATCH 277/561] 8343220: Add test cases to AppContentTest jpackage test Reviewed-by: almatvee --- .../jdk/jpackage/internal/util/FileUtils.java | 12 + .../jpackage/test/ConfigurationTarget.java | 21 + .../helpers/jdk/jpackage/test/TKit.java | 10 +- .../tools/jpackage/share/AppContentTest.java | 728 ++++++++++++++---- 4 files changed, 639 insertions(+), 132 deletions(-) diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/FileUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/FileUtils.java index 8ac88c13e1d..cb1bcaa51b1 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/FileUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/FileUtils.java @@ -30,6 +30,7 @@ import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; @@ -106,6 +107,17 @@ public final class FileUtils { private static record CopyAction(Path src, Path dest) { void apply(CopyOption... options) throws IOException { + if (List.of(options).contains(StandardCopyOption.REPLACE_EXISTING)) { + // They requested copying with replacing the existing content. + if (src == null && Files.isRegularFile(dest)) { + // This copy action creates a directory, but a file at the same path already exists, so delete it. + Files.deleteIfExists(dest); + } else if (src != null && Files.isDirectory(dest)) { + // This copy action copies a file, but a directory at the same path exists already, so delete it. + deleteRecursive(dest); + } + } + if (src == null) { Files.createDirectories(dest); } else { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java index ba3131a7680..0d68d055b92 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigurationTarget.java @@ -62,6 +62,27 @@ public record ConfigurationTarget(Optional cmd, Optional verifier) { + cmd.ifPresent(Objects.requireNonNull(verifier)); + test.ifPresent(v -> { + v.addInstallVerifier(verifier::accept); + }); + return this; + } + + public ConfigurationTarget addRunOnceInitializer(Consumer initializer) { + Objects.requireNonNull(initializer); + cmd.ifPresent(_ -> { + initializer.accept(this); + }); + test.ifPresent(v -> { + v.addRunOnceInitializer(() -> { + initializer.accept(this); + }); + }); + return this; + } + public ConfigurationTarget add(AdditionalLauncher addLauncher) { return apply(addLauncher::applyTo, addLauncher::applyTo); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index a19b3697a81..baeeda4e569 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -26,6 +26,7 @@ import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import static java.util.stream.Collectors.toSet; import static jdk.jpackage.internal.util.function.ThrowingBiFunction.toBiFunction; +import static jdk.jpackage.internal.util.function.ThrowingFunction.toFunction; import static jdk.jpackage.internal.util.function.ThrowingSupplier.toSupplier; import java.io.Closeable; @@ -896,7 +897,14 @@ public final class TKit { public static void assertSymbolicLinkExists(Path path) { assertPathExists(path, true); assertTrue(Files.isSymbolicLink(path), String.format - ("Check [%s] is a symbolic link", path)); + ("Check [%s] is a symbolic link", Objects.requireNonNull(path))); + } + + public static void assertSymbolicLinkTarget(Path symlinkPath, Path expectedTargetPath) { + assertSymbolicLinkExists(symlinkPath); + var targetPath = toFunction(Files::readSymbolicLink).apply(symlinkPath); + assertEquals(expectedTargetPath, targetPath, + String.format("Check the target of the symbolic link [%s]", symlinkPath)); } public static void assertFileExists(Path path) { diff --git a/test/jdk/tools/jpackage/share/AppContentTest.java b/test/jdk/tools/jpackage/share/AppContentTest.java index 2c6498a631b..5b5734df61d 100644 --- a/test/jdk/tools/jpackage/share/AppContentTest.java +++ b/test/jdk/tools/jpackage/share/AppContentTest.java @@ -21,24 +21,43 @@ * questions. */ -import static jdk.internal.util.OperatingSystem.LINUX; -import static jdk.internal.util.OperatingSystem.MACOS; +import static java.util.Map.entry; import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toMap; +import static jdk.internal.util.OperatingSystem.MACOS; +import static jdk.internal.util.OperatingSystem.WINDOWS; +import static jdk.jpackage.internal.util.function.ThrowingFunction.toFunction; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import jdk.jpackage.internal.util.FileUtils; -import jdk.jpackage.internal.util.function.ThrowingFunction; +import jdk.jpackage.internal.util.IdentityWrapper; +import jdk.jpackage.internal.util.function.ThrowingSupplier; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.ParameterSupplier; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.ConfigurationTarget; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JPackageStringBundle; +import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.PackageType; +import jdk.jpackage.test.TKit; /** @@ -57,68 +76,23 @@ import jdk.jpackage.test.JPackageStringBundle; */ public class AppContentTest { - private static final String TEST_JAVA = "apps/PrintEnv.java"; - private static final String TEST_DUKE = "apps/dukeplug.png"; - private static final String TEST_DUKE_LINK = "dukeplugLink.txt"; - private static final String TEST_DIR = "apps"; - private static final String TEST_BAD = "non-existant"; - - // On OSX `--app-content` paths will be copied into the "Contents" folder - // of the output app image. - // "codesign" imposes restrictions on the directory structure of "Contents" folder. - // In particular, random files should be placed in "Contents/Resources" folder - // otherwise "codesign" will fail to sign. - // Need to prepare arguments for `--app-content` accordingly. - private static final boolean copyInResources = TKit.isOSX(); - - private static final String RESOURCES_DIR = "Resources"; - private static final String LINKS_DIR = "Links"; + @Test + @ParameterSupplier + @ParameterSupplier(value="testSymlink", ifNotOS = WINDOWS) + public void test(TestSpec testSpec) throws Exception { + testSpec.test(new ConfigurationTarget(new PackageTest().configureHelloApp())); + } @Test - // include two files in two options - @Parameter({TEST_JAVA, TEST_DUKE}) - // try to include non-existant content - @Parameter({TEST_JAVA, TEST_BAD}) - // two files in one option and a dir tree in another option. - @Parameter({TEST_JAVA + "," + TEST_DUKE, TEST_DIR}) - // include one file and one link to the file - @Parameter(value = {TEST_JAVA, TEST_DUKE_LINK}, ifOS = {MACOS,LINUX}) - public void test(String... args) throws Exception { - final List testPathArgs = List.of(args); - final int expectedJPackageExitCode; - if (testPathArgs.contains(TEST_BAD)) { - expectedJPackageExitCode = 1; - } else { - expectedJPackageExitCode = 0; - } - - var appContentInitializer = new AppContentInitializer(testPathArgs); - - new PackageTest().configureHelloApp() - .addRunOnceInitializer(appContentInitializer::initAppContent) - .addInitializer(appContentInitializer::applyTo) - .addInstallVerifier(cmd -> { - for (String arg : testPathArgs) { - List paths = Arrays.asList(arg.split(",")); - for (String p : paths) { - Path name = Path.of(p).getFileName(); - if (isSymlinkPath(name)) { - TKit.assertSymbolicLinkExists(getAppContentRoot(cmd) - .resolve(LINKS_DIR).resolve(name)); - } else { - TKit.assertPathExists(getAppContentRoot(cmd) - .resolve(name), true); - } - } - } - }) - .setExpectedExitCode(expectedJPackageExitCode) - .run(); + @ParameterSupplier("test") + @ParameterSupplier(value="testSymlink", ifNotOS = WINDOWS) + public void testAppImage(TestSpec testSpec) throws Exception { + testSpec.test(new ConfigurationTarget(JPackageCommand.helloAppImage())); } @Test(ifOS = MACOS) - @Parameter({TEST_DIR, "warning.non.standard.contents.sub.dir"}) - @Parameter({TEST_DUKE, "warning.app.content.is.not.dir"}) + @Parameter({"apps", "warning.non.standard.contents.sub.dir"}) + @Parameter({"apps/dukeplug.png", "warning.app.content.is.not.dir"}) public void testWarnings(String testPath, String warningId) throws Exception { final var appContentValue = TKit.TEST_SRC_ROOT.resolve(testPath); final var expectedWarning = JPackageStringBundle.MAIN.cannedFormattedString( @@ -126,96 +100,588 @@ public class AppContentTest { JPackageCommand.helloAppImage() .addArguments("--app-content", appContentValue) + .setFakeRuntime() .validateOutput(expectedWarning) .executeIgnoreExitCode(); } + public static Collection test() { + return Stream.of( + build().add(TEST_JAVA).add(TEST_DUKE), + build().add(TEST_JAVA).add(TEST_BAD), + build().startGroup().add(TEST_JAVA).add(TEST_DUKE).endGroup().add(TEST_DIR), + // Same directory specified multiple times. + build().add(TEST_DIR).add(TEST_DIR), + // Same file specified multiple times. + build().add(TEST_JAVA).add(TEST_JAVA), + // Two files with the same name but different content. + build() + .add(createTextFileContent("welcome.txt", "Welcome")) + .add(createTextFileContent("welcome.txt", "Benvenuti")), + // Same name: one is a directory, another is a file. + build().add(createTextFileContent("a/b/c/d", "Foo")).add(createTextFileContent("a", "Bar")), + // Same name: one is a file, another is a directory. + build().add(createTextFileContent("a", "Bar")).add(createTextFileContent("a/b/c/d", "Foo")) + ).map(TestSpec.Builder::create).map(v -> { + return new Object[] {v}; + }).toList(); + } + + public static Collection testSymlink() { + return Stream.of( + build().add(TEST_JAVA) + .add(new SymlinkContentFactory("Links", "duke-link", "duke-target")) + .add(new SymlinkContentFactory("", "a/b/foo-link", "c/bar-target")) + ).map(TestSpec.Builder::create).map(v -> { + return new Object[] {v}; + }).toList(); + } + + public record TestSpec(List> contentFactories) { + public TestSpec { + contentFactories.stream().flatMap(List::stream).forEach(Objects::requireNonNull); + } + + @Override + public String toString() { + return contentFactories.stream().map(group -> { + return group.stream().map(ContentFactory::toString).collect(joining(",")); + }).collect(joining("; ")); + } + + void test(ConfigurationTarget target) { + final int expectedJPackageExitCode; + if (contentFactories.stream().flatMap(List::stream).anyMatch(TEST_BAD::equals)) { + expectedJPackageExitCode = 1; + } else { + expectedJPackageExitCode = 0; + } + + final List> allContent = new ArrayList<>(); + + target.addInitializer(JPackageCommand::setFakeRuntime) + .addRunOnceInitializer(_ -> { + contentFactories.stream().map(group -> { + return group.stream().map(ContentFactory::create).toList(); + }).forEach(allContent::add); + }).addInitializer(cmd -> { + allContent.stream().map(group -> { + return Stream.of("--app-content", group.stream() + .map(Content::paths) + .flatMap(List::stream) + .map(appContentArg -> { + if (COPY_IN_RESOURCES && Optional.ofNullable(appContentArg.getParent()) + .map(Path::getFileName) + .map(RESOURCES_DIR::equals) + .orElse(false)) { + return appContentArg.getParent(); + } else { + return appContentArg; + } + }) + .map(Path::toString) + .collect(joining(","))); + }).flatMap(x -> x).forEachOrdered(cmd::addArgument); + }); + + target.cmd().ifPresent(cmd -> { + if (expectedJPackageExitCode == 0) { + cmd.executeAndAssertImageCreated(); + } else { + cmd.execute(expectedJPackageExitCode); + } + }); + + target.addInstallVerifier(cmd -> { + var appContentRoot = getAppContentRoot(cmd); + + Set disabledVerifiers = new HashSet<>(); + + var verifiers = allContent.stream().flatMap(List::stream).flatMap(content -> { + return StreamSupport.stream(content.verifiers(appContentRoot).spliterator(), false).map(verifier -> { + return new PathVerifierWithOrigin(verifier, content); + }); + }).collect(toMap(PathVerifierWithOrigin::path, x -> x, (first, second) -> { + // The same file in the content directory is sourced from multiple origins. + // jpackage will handle this case such that the following origins overwrite preceding origins. + // Scratch all path verifiers affected by overrides. + first.getNestedVerifiers(appContentRoot, first.path()).forEach(disabledVerifiers::add); + return second; + }, TreeMap::new)).values().stream() + .map(PathVerifierWithOrigin::verifier) + .filter(Predicate.not(disabledVerifiers::contains)) + .filter(verifier -> { + if (!(verifier instanceof DirectoryVerifier dirVerifier)) { + return true; + } else { + try { + // Run the directory verifier if the directory is empty. + // Otherwise, it just pollutes the test log. + return isDirectoryEmpty(verifier.path()); + } catch (NoSuchFileException ex) { + // If an MSI contains an empty directory, it will be installed but not created when the MSI is unpacked. + // In the latter the control flow will reach this point. + if (dirVerifier.isEmpty() + && PackageType.WINDOWS.contains(cmd.packageType()) + && cmd.isPackageUnpacked(String.format( + "Expected empty directory [%s] is missing", verifier.path()))) { + return false; + } + throw new UncheckedIOException(ex); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + }) + .toList(); + + verifiers.forEach(PathVerifier::verify); + }); + + target.test().ifPresent(test -> { + test.setExpectedExitCode(expectedJPackageExitCode).run(); + }); + } + + static final class Builder { + TestSpec create() { + return new TestSpec(groups); + } + + final class GroupBuilder { + GroupBuilder add(ContentFactory cf) { + group.add(Objects.requireNonNull(cf)); + return this; + } + + Builder endGroup() { + if (!group.isEmpty()) { + groups.add(group); + } + return Builder.this; + } + + private final List group = new ArrayList<>(); + } + + Builder add(ContentFactory cf) { + return startGroup().add(cf).endGroup(); + } + + GroupBuilder startGroup() { + return new GroupBuilder(); + } + + private final List> groups = new ArrayList<>(); + } + + private record PathVerifierWithOrigin(PathVerifier verifier, Content origin) { + PathVerifierWithOrigin { + Objects.requireNonNull(verifier); + Objects.requireNonNull(origin); + } + + Path path() { + return verifier.path(); + } + + Stream getNestedVerifiers(Path appContentRoot, Path path) { + if (!path.startsWith(appContentRoot)) { + throw new IllegalArgumentException(); + } + + return StreamSupport.stream(origin.verifiers(appContentRoot).spliterator(), false).filter(v -> { + return v.path().getNameCount() > path.getNameCount() && v.path().startsWith(path); + }); + } + } + } + + private static TestSpec.Builder build() { + return new TestSpec.Builder(); + } + private static Path getAppContentRoot(JPackageCommand cmd) { - Path contentDir = cmd.appLayout().contentDirectory(); - if (copyInResources) { + final Path contentDir = cmd.appLayout().contentDirectory(); + if (COPY_IN_RESOURCES) { return contentDir.resolve(RESOURCES_DIR); } else { return contentDir; } } - private static boolean isSymlinkPath(Path v) { - return v.getFileName().toString().contains("Link"); + private static Path createAppContentRoot() { + if (COPY_IN_RESOURCES) { + return TKit.createTempDirectory("app-content").resolve(RESOURCES_DIR); + } else { + return TKit.createTempDirectory("app-content"); + } } - private static final class AppContentInitializer { - AppContentInitializer(List appContentArgs) { - appContentPathGroups = appContentArgs.stream().map(arg -> { - return Stream.of(arg.split(",")).map(Path::of).toList(); - }).toList(); + private static boolean isDirectoryEmpty(Path path) throws IOException { + if (Files.exists(path) && !Files.isDirectory(path)) { + throw new IllegalArgumentException(); } - void initAppContent() { - jpackageArgs = appContentPathGroups.stream() - .map(AppContentInitializer::initAppContentPaths) - .mapMulti((appContentPaths, consumer) -> { - consumer.accept("--app-content"); - consumer.accept( - appContentPaths.stream().map(Path::toString).collect( - joining(","))); - }).toList(); + try (var files = Files.list(path)) { + return files.findAny().isEmpty(); + } + } + + @FunctionalInterface + private interface ContentFactory { + Content create(); + } + + private interface Content { + List paths(); + Iterable verifiers(Path appContentRoot); + } + + private sealed interface PathVerifier permits + RegularFileVerifier, + DirectoryVerifier, + SymlinkTargetVerifier, + NoPathVerifier { + + Path path(); + void verify(); + } + + private record RegularFileVerifier(Path path, Path srcFile) implements PathVerifier { + RegularFileVerifier { + Objects.requireNonNull(path); + Objects.requireNonNull(srcFile); } - void applyTo(JPackageCommand cmd) { - cmd.addArguments(jpackageArgs); + @Override + public void verify() { + TKit.assertSameFileContent(srcFile, path); + } + } + + private record DirectoryVerifier(Path path, boolean isEmpty, IdentityWrapper origin) implements PathVerifier { + DirectoryVerifier { + Objects.requireNonNull(path); } - private static Path copyAppContentPath(Path appContentPath) throws IOException { - var appContentArg = TKit.createTempDirectory("app-content").resolve(RESOURCES_DIR); - var srcPath = TKit.TEST_SRC_ROOT.resolve(appContentPath); - var dstPath = appContentArg.resolve(srcPath.getFileName()); - FileUtils.copyRecursive(srcPath, dstPath); - return appContentArg; - } - - private static Path createAppContentLink(Path appContentPath) throws IOException { - var appContentArg = TKit.createTempDirectory("app-content"); - Path dstPath; - if (copyInResources) { - appContentArg = appContentArg.resolve(RESOURCES_DIR); - dstPath = appContentArg.resolve(LINKS_DIR) - .resolve(appContentPath.getFileName()); + @Override + public void verify() { + if (isEmpty) { + TKit.assertDirectoryEmpty(path); } else { - appContentArg = appContentArg.resolve(LINKS_DIR); - dstPath = appContentArg.resolve(appContentPath.getFileName()); + TKit.assertDirectoryExists(path); + } + } + } + + private record SymlinkTargetVerifier(Path path, Path targetPath) implements PathVerifier { + SymlinkTargetVerifier { + Objects.requireNonNull(path); + Objects.requireNonNull(targetPath); + } + + @Override + public void verify() { + TKit.assertSymbolicLinkTarget(path, targetPath); + } + } + + private record NoPathVerifier(Path path) implements PathVerifier { + NoPathVerifier { + Objects.requireNonNull(path); + } + + @Override + public void verify() { + TKit.assertPathExists(path, false); + } + } + + private record FileContent(Path path, int level) implements Content { + + FileContent { + Objects.requireNonNull(path); + if ((level < 0) || (path.getNameCount() <= level)) { + throw new IllegalArgumentException(); + } + } + + @Override + public List paths() { + return List.of(appContentOptionValue()); + } + + @Override + public Iterable verifiers(Path appContentRoot) { + List verifiers = new ArrayList<>(); + + var appContentPath = appContentRoot.resolve(pathInAppContentRoot()); + + if (Files.isDirectory(path)) { + try (var walk = Files.walk(path)) { + verifiers.addAll(walk.map(srcFile -> { + var dstFile = appContentPath.resolve(path.relativize(srcFile)); + if (Files.isRegularFile(srcFile)) { + return new RegularFileVerifier(dstFile, srcFile); + } else { + return new DirectoryVerifier(dstFile, + toFunction(AppContentTest::isDirectoryEmpty).apply(srcFile), + new IdentityWrapper<>(this)); + } + }).toList()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } else if (Files.isRegularFile(path)) { + verifiers.add(new RegularFileVerifier(appContentPath, path)); + } else { + verifiers.add(new NoPathVerifier(appContentPath)); } - Files.createDirectories(dstPath.getParent()); - - // Create target file for a link - String tagetName = dstPath.getFileName().toString().replace("Link", ""); - Path targetPath = dstPath.getParent().resolve(tagetName); - Files.write(targetPath, "foo".getBytes()); - // Create link - Files.createSymbolicLink(dstPath, targetPath.getFileName()); - - return appContentArg; - } - - private static List initAppContentPaths(List appContentPaths) { - return appContentPaths.stream().map(appContentPath -> { - if (appContentPath.endsWith(TEST_BAD)) { - return appContentPath; - } else if (isSymlinkPath(appContentPath)) { - return ThrowingFunction.toFunction( - AppContentInitializer::createAppContentLink).apply( - appContentPath); - } else if (copyInResources) { - return ThrowingFunction.toFunction( - AppContentInitializer::copyAppContentPath).apply( - appContentPath); - } else { - return TKit.TEST_SRC_ROOT.resolve(appContentPath); + if (level > 0) { + var cur = appContentPath; + for (int i = 0; i != level; i++) { + cur = cur.getParent(); + verifiers.add(new DirectoryVerifier(cur, false, new IdentityWrapper<>(this))); } - }).toList(); + } + + return verifiers; } - private List jpackageArgs; - private final List> appContentPathGroups; + private Path appContentOptionValue() { + var cur = path; + for (int i = 0; i != level; i++) { + cur = cur.getParent(); + } + return cur; + } + + private Path pathInAppContentRoot() { + return StreamSupport.stream(path.spliterator(), false) + .skip(path.getNameCount() - level - 1) + .reduce(Path::resolve).orElseThrow(); + } } + + /** + * Non-existing content. + */ + private static final class NonExistantPath implements ContentFactory { + @Override + public Content create() { + var nonExistant = TKit.createTempFile("non-existant"); + try { + TKit.deleteIfExists(nonExistant); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + return new FileContent(nonExistant, 0); + } + + @Override + public String toString() { + return "*non-existant*"; + } + } + + /** + * Creates a content from a directory tree. + * + * @param path name of directory where to create a directory tree + */ + private static ContentFactory createDirTreeContent(Path path) { + if (path.isAbsolute()) { + throw new IllegalArgumentException(); + } + + return new FileContentFactory(() -> { + var basedir = TKit.createTempDirectory("content").resolve(path); + + for (var textFile : Map.ofEntries( + entry("woods/moose", "The moose"), + entry("woods/bear", "The bear"), + entry("woods/trees/jay", "The gray jay") + ).entrySet()) { + var src = basedir.resolve(textFile.getKey()); + Files.createDirectories(src.getParent()); + TKit.createTextFile(src, Stream.of(textFile.getValue())); + } + + for (var emptyDir : List.of("sky")) { + Files.createDirectories(basedir.resolve(emptyDir)); + } + + return basedir; + }, path); + } + + private static ContentFactory createDirTreeContent(String path) { + return createDirTreeContent(Path.of(path)); + } + + /** + * Creates a content from a text file. + * + * @param path the path where to copy the text file in app image's content directory + * @param lines the content of the source text file + */ + private static ContentFactory createTextFileContent(Path path, String ... lines) { + if (path.isAbsolute()) { + throw new IllegalArgumentException(); + } + + return new FileContentFactory(() -> { + var srcPath = TKit.createTempDirectory("content").resolve(path); + Files.createDirectories(srcPath.getParent()); + TKit.createTextFile(srcPath, Stream.of(lines)); + return srcPath; + }, path); + } + + private static ContentFactory createTextFileContent(String path, String ... lines) { + return createTextFileContent(Path.of(path), lines); + } + + /** + * Symlink content factory. + * + * @path basedir the directory where to write the content in app image's content + * directory + * @param symlink the path to the symlink relative to {@code basedir} path + * @param symlinked the path to the source file for the symlink + */ + private record SymlinkContentFactory(Path basedir, Path symlink, Path symlinked) implements ContentFactory { + SymlinkContentFactory { + for (final var path : List.of(basedir, symlink, symlinked)) { + if (path.isAbsolute()) { + throw new IllegalArgumentException(); + } + } + } + + SymlinkContentFactory(String basedir, String symlink, String symlinked) { + this(Path.of(basedir), Path.of(symlink), Path.of(symlinked)); + } + + @Override + public Content create() { + final var appContentRoot = createAppContentRoot(); + + final var symlinkPath = appContentRoot.resolve(symlinkPath()); + final var symlinkedPath = appContentRoot.resolve(symlinkedPath()); + try { + Files.createDirectories(symlinkPath.getParent()); + Files.createDirectories(symlinkedPath.getParent()); + // Create the target file for the link. + Files.writeString(symlinkedPath, symlinkedPath().toString()); + // Create the link. + Files.createSymbolicLink(symlinkPath, symlinkTarget()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + + List contentPaths; + if (COPY_IN_RESOURCES) { + contentPaths = List.of(appContentRoot); + } else if (basedir.equals(Path.of(""))) { + contentPaths = Stream.of(symlinkPath(), symlinkedPath()).map(path -> { + return path.getName(0); + }).map(appContentRoot::resolve).toList(); + } else { + contentPaths = List.of(appContentRoot.resolve(basedir)); + } + + return new Content() { + @Override + public List paths() { + return contentPaths; + } + + @Override + public Iterable verifiers(Path appContentRoot) { + return List.of( + new RegularFileVerifier(appContentRoot.resolve(symlinkedPath()), symlinkedPath), + new SymlinkTargetVerifier(appContentRoot.resolve(symlinkPath()), symlinkTarget()) + ); + } + }; + } + + @Override + public String toString() { + return String.format("symlink:[%s]->[%s][%s]", symlinkPath(), symlinkedPath(), symlinkTarget()); + } + + private Path symlinkPath() { + return basedir.resolve(symlink); + } + + private Path symlinkedPath() { + return basedir.resolve(symlinked); + } + + private Path symlinkTarget() { + return Optional.ofNullable(symlinkPath().getParent()).map(dir -> { + return dir.relativize(symlinkedPath()); + }).orElseGet(this::symlinkedPath); + } + } + + private static final class FileContentFactory implements ContentFactory { + + FileContentFactory(ThrowingSupplier factory, Path pathInAppContentRoot) { + this.factory = ThrowingSupplier.toSupplier(factory); + this.pathInAppContentRoot = pathInAppContentRoot; + if (pathInAppContentRoot.isAbsolute()) { + throw new IllegalArgumentException(); + } + } + + @Override + public Content create() { + Path srcPath = factory.get(); + if (!srcPath.endsWith(pathInAppContentRoot)) { + throw new IllegalArgumentException(); + } + + Path dstPath; + if (!COPY_IN_RESOURCES) { + dstPath = srcPath; + } else { + var contentDir = createAppContentRoot(); + dstPath = contentDir.resolve(pathInAppContentRoot); + try { + FileUtils.copyRecursive(srcPath, dstPath); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + return new FileContent(dstPath, pathInAppContentRoot.getNameCount() - 1); + } + + @Override + public String toString() { + return pathInAppContentRoot.toString(); + } + + private final Supplier factory; + private final Path pathInAppContentRoot; + } + + private static final ContentFactory TEST_JAVA = createTextFileContent("apps/PrintEnv.java", "Not what someone would expect"); + private static final ContentFactory TEST_DUKE = createTextFileContent("duke.txt", "Hi Duke!"); + private static final ContentFactory TEST_DIR = createDirTreeContent("apps"); + private static final ContentFactory TEST_BAD = new NonExistantPath(); + + // On OSX `--app-content` paths will be copied into the "Contents" folder + // of the output app image. + // "codesign" imposes restrictions on the directory structure of "Contents" folder. + // In particular, random files should be placed in "Contents/Resources" folder + // otherwise "codesign" will fail to sign. + // Need to prepare arguments for `--app-content` accordingly. + private static final boolean COPY_IN_RESOURCES = TKit.isOSX(); + + private static final Path RESOURCES_DIR = Path.of("Resources"); } From 586235896536cde293402167775d4d60f1426a9e Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Fri, 24 Oct 2025 00:40:13 +0000 Subject: [PATCH 278/561] 8370013: Refactor Double.toHexString to eliminate regex and StringBuilder Reviewed-by: rgiulietti, darcy --- .../share/classes/java/lang/Double.java | 120 +++++++++++------- test/jdk/java/lang/Double/ToHexString.java | 21 +++ .../{FloatingDecimal.java => Doubles.java} | 13 +- 3 files changed, 105 insertions(+), 49 deletions(-) rename test/micro/org/openjdk/bench/java/lang/{FloatingDecimal.java => Doubles.java} (89%) diff --git a/src/java.base/share/classes/java/lang/Double.java b/src/java.base/share/classes/java/lang/Double.java index 6cee75cea2b..53b027dd773 100644 --- a/src/java.base/share/classes/java/lang/Double.java +++ b/src/java.base/share/classes/java/lang/Double.java @@ -1,5 +1,6 @@ /* * Copyright (c) 1994, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Alibaba Group Holding Limited. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +34,7 @@ import java.util.Optional; import jdk.internal.math.FloatingDecimal; import jdk.internal.math.DoubleConsts; import jdk.internal.math.DoubleToDecimal; +import jdk.internal.util.DecimalDigits; import jdk.internal.vm.annotation.IntrinsicCandidate; /** @@ -699,56 +701,80 @@ public final class Double extends Number * 7.19.6.1; however, the output of this method is more * tightly specified. */ - if (!isFinite(d) ) + if (!isFinite(d)) { // For infinity and NaN, use the decimal output. return Double.toString(d); - else { - // Initialized to maximum size of output. - StringBuilder answer = new StringBuilder(24); - - if (Math.copySign(1.0, d) == -1.0) // value is negative, - answer.append("-"); // so append sign info - - answer.append("0x"); - - d = Math.abs(d); - - if(d == 0.0) { - answer.append("0.0p0"); - } else { - boolean subnormal = (d < Double.MIN_NORMAL); - - // Isolate significand bits and OR in a high-order bit - // so that the string representation has a known - // length. - long signifBits = (Double.doubleToLongBits(d) - & DoubleConsts.SIGNIF_BIT_MASK) | - 0x1000000000000000L; - - // Subnormal values have a 0 implicit bit; normal - // values have a 1 implicit bit. - answer.append(subnormal ? "0." : "1."); - - // Isolate the low-order 13 digits of the hex - // representation. If all the digits are zero, - // replace with a single 0; otherwise, remove all - // trailing zeros. - String signif = Long.toHexString(signifBits).substring(3,16); - answer.append(signif.equals("0000000000000") ? // 13 zeros - "0": - signif.replaceFirst("0{1,12}$", "")); - - answer.append('p'); - // If the value is subnormal, use the E_min exponent - // value for double; otherwise, extract and report d's - // exponent (the representation of a subnormal uses - // E_min -1). - answer.append(subnormal ? - Double.MIN_EXPONENT: - Math.getExponent(d)); - } - return answer.toString(); } + + long doubleToLongBits = Double.doubleToLongBits(d); + boolean negative = doubleToLongBits < 0; + + if (d == 0.0) { + return negative ? "-0x0.0p0" : "0x0.0p0"; + } + d = Math.abs(d); + // Check if the value is subnormal (less than the smallest normal value) + boolean subnormal = d < Double.MIN_NORMAL; + + // Isolate significand bits and OR in a high-order bit + // so that the string representation has a known length. + // This ensures we always have 13 hex digits to work with (52 bits / 4 bits per hex digit) + long signifBits = doubleToLongBits & DoubleConsts.SIGNIF_BIT_MASK; + + // Calculate the number of trailing zeros in the significand (in groups of 4 bits) + // This is used to remove trailing zeros from the hex representation + // We limit to 12 because we want to keep at least 1 hex digit (13 total - 12 = 1) + // assert 0 <= trailingZeros && trailingZeros <= 12 + int trailingZeros = Long.numberOfTrailingZeros(signifBits | 1L << 4 * 12) >> 2; + + // Determine the exponent value based on whether the number is subnormal or normal + // Subnormal numbers use the minimum exponent, normal numbers use the actual exponent + int exp = subnormal ? Double.MIN_EXPONENT : Math.getExponent(d); + + // Calculate the total length of the resulting string: + // Sign (optional) + prefix "0x" + implicit bit + "." + hex digits + "p" + exponent + int charlen = (negative ? 1 : 0) // sign character + + 4 // "0x1." or "0x0." + + 13 - trailingZeros // hex digits (13 max, minus trailing zeros) + + 1 // "p" + + DecimalDigits.stringSize(exp) // exponent + ; + + // Create a byte array to hold the result characters + byte[] chars = new byte[charlen]; + int index = 0; + + // Add the sign character if the number is negative + if (negative) { // value is negative + chars[index++] = '-'; + } + + // Add the prefix and the implicit bit ('1' for normal, '0' for subnormal) + // Subnormal values have a 0 implicit bit; normal values have a 1 implicit bit. + chars[index ] = '0'; // Hex prefix + chars[index + 1] = 'x'; // Hex prefix + chars[index + 2] = (byte) (subnormal ? '0' : '1'); // Implicit bit + chars[index + 3] = '.'; // Decimal point + index += 4; + + // Convert significand to hex digits manually to avoid creating temporary strings + // Extract the 13 hex digits (52 bits) from signifBits + // We need to extract bits 48-51, 44-47, ..., 0-3 (13 groups of 4 bits) + for (int sh = 4 * 12, end = 4 * trailingZeros; sh >= end; sh -= 4) { + // Extract 4 bits at a time from left to right + // Shift right by sh positions and mask with 0xF + // Integer.digits maps values 0-15 to '0'-'f' characters + chars[index++] = Integer.digits[((int)(signifBits >> sh)) & 0xF]; + } + + // Add the exponent indicator + chars[index] = 'p'; + + // Append the exponent value to the character array + // This method writes the decimal representation of exp directly into the byte array + DecimalDigits.uncheckedGetCharsLatin1(exp, charlen, chars); + + return String.newStringWithLatin1Bytes(chars); } /** diff --git a/test/jdk/java/lang/Double/ToHexString.java b/test/jdk/java/lang/Double/ToHexString.java index 912835b7aeb..c408f74fa63 100644 --- a/test/jdk/java/lang/Double/ToHexString.java +++ b/test/jdk/java/lang/Double/ToHexString.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Alibaba Group Holding Limited. 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 @@ -174,6 +175,26 @@ public class ToHexString { {"+4.9e-324", "0000000000000001"}, {"-4.9e-324", "8000000000000001"}, + // Test cases for trailing zeros in significand + // These test the removal of trailing zeros in the hexadecimal representation + // The comments indicate the number of trailing zeros removed from the significand + // For "0x1.0p1", there are 13 trailing zeros in the significand, but only 12 are removed + // as we always keep at least one hex digit in the significand + {"0x1.0p1", "4000000000000000"}, // 12 trailing zeros removed (13 total, but only 12 removed) + {"0x1.1p1", "4001000000000000"}, // 12 trailing zeros removed (all zeros after '1') + {"0x1.01p1", "4000100000000000"}, // 11 trailing zeros removed + {"0x1.001p1", "4000010000000000"}, // 10 trailing zeros removed + {"0x1.0001p1", "4000001000000000"}, // 9 trailing zeros removed + {"0x1.00001p1", "4000000100000000"}, // 8 trailing zeros removed + {"0x1.000001p1", "4000000010000000"}, // 7 trailing zeros removed + {"0x1.0000001p1", "4000000001000000"}, // 6 trailing zeros removed + {"0x1.00000001p1", "4000000000100000"}, // 5 trailing zeros removed + {"0x1.000000001p1", "4000000000010000"}, // 4 trailing zeros removed + {"0x1.0000000001p1", "4000000000001000"}, // 3 trailing zeros removed + {"0x1.00000000001p1", "4000000000000100"}, // 2 trailing zeros removed + {"0x1.000000000001p1", "4000000000000010"}, // 1 trailing zero removed (minimum) + {"0x1.0000000000001p1", "4000000000000001"}, // 0 trailing zeros removed (no trailing zeros to remove) + // fdlibm k_sin.c {"+5.00000000000000000000e-01", "3FE0000000000000"}, {"-1.66666666666666324348e-01", "BFC5555555555549"}, diff --git a/test/micro/org/openjdk/bench/java/lang/FloatingDecimal.java b/test/micro/org/openjdk/bench/java/lang/Doubles.java similarity index 89% rename from test/micro/org/openjdk/bench/java/lang/FloatingDecimal.java rename to test/micro/org/openjdk/bench/java/lang/Doubles.java index b8d29aabc84..50c295900af 100644 --- a/test/micro/org/openjdk/bench/java/lang/FloatingDecimal.java +++ b/test/micro/org/openjdk/bench/java/lang/Doubles.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Alibaba Group Holding Limited. 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 @@ -47,7 +48,7 @@ import java.util.concurrent.TimeUnit; @Warmup(iterations = 10, time = 1) @Measurement(iterations = 5, time = 2) @Fork(3) -public class FloatingDecimal { +public class Doubles { private double[] randomArray, twoDecimalsArray, integerArray; private static final int TESTSIZE = 1000; @@ -65,6 +66,14 @@ public class FloatingDecimal { } } + @Benchmark + @OperationsPerInvocation(TESTSIZE) + public void toHexString(Blackhole bh) { + for (double d : randomArray) { + bh.consume(Double.toHexString(d)); + } + } + /** Tests Double.toString on double values generated from Random.nextDouble() */ @Benchmark @OperationsPerInvocation(TESTSIZE) From 87645afa052a87ab2af9602c8fafc2a707c77c19 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Fri, 24 Oct 2025 05:43:16 +0000 Subject: [PATCH 279/561] 8370389: JavaFrameAnchor on s390 has unnecessary barriers Reviewed-by: lucy, aph --- src/hotspot/cpu/s390/javaFrameAnchor_s390.hpp | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/hotspot/cpu/s390/javaFrameAnchor_s390.hpp b/src/hotspot/cpu/s390/javaFrameAnchor_s390.hpp index ae8b8766159..307034ca0cd 100644 --- a/src/hotspot/cpu/s390/javaFrameAnchor_s390.hpp +++ b/src/hotspot/cpu/s390/javaFrameAnchor_s390.hpp @@ -35,38 +35,32 @@ // 3 - restoring an old state (javaCalls). inline void clear(void) { + // No hardware barriers are necessary. All members are volatile and the profiler + // is run from a signal handler and only observers the thread its running on. + // Clearing _last_Java_sp must be first. - OrderAccess::release(); + _last_Java_sp = nullptr; - // Fence? - OrderAccess::fence(); _last_Java_pc = nullptr; } inline void set(intptr_t* sp, address pc) { _last_Java_pc = pc; - - OrderAccess::release(); _last_Java_sp = sp; } void copy(JavaFrameAnchor* src) { - // In order to make sure the transition state is valid for "this" + // No hardware barriers are necessary. All members are volatile and the profiler + // is run from a signal handler and only observers the thread its running on. + // we must clear _last_Java_sp before copying the rest of the new data. - // Hack Alert: Temporary bugfix for 4717480/4721647 - // To act like previous version (pd_cache_state) don't null _last_Java_sp - // unless the value is changing. - // if (_last_Java_sp != src->_last_Java_sp) { - OrderAccess::release(); _last_Java_sp = nullptr; - OrderAccess::fence(); } _last_Java_pc = src->_last_Java_pc; // Must be last so profiler will always see valid frame if has_last_frame() is true. - OrderAccess::release(); _last_Java_sp = src->_last_Java_sp; } @@ -80,7 +74,7 @@ intptr_t* last_Java_fp(void) { return nullptr; } intptr_t* last_Java_sp() const { return _last_Java_sp; } - void set_last_Java_sp(intptr_t* sp) { OrderAccess::release(); _last_Java_sp = sp; } + void set_last_Java_sp(intptr_t* sp) { _last_Java_sp = sp; } address last_Java_pc(void) { return _last_Java_pc; } From 26eed3b61e4987a2998f941d7d26790493850612 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Fri, 24 Oct 2025 07:25:53 +0000 Subject: [PATCH 280/561] 8068293: [TEST_BUG] Test closed/com/sun/java/swing/plaf/motif/InternalFrame/4150591/bug4150591.java fails with GTKLookAndFeel Reviewed-by: serb, tr --- test/jdk/javax/swing/plaf/motif/bug4150591.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/jdk/javax/swing/plaf/motif/bug4150591.java b/test/jdk/javax/swing/plaf/motif/bug4150591.java index 66c668a441c..f3614908cff 100644 --- a/test/jdk/javax/swing/plaf/motif/bug4150591.java +++ b/test/jdk/javax/swing/plaf/motif/bug4150591.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -23,6 +23,7 @@ import com.sun.java.swing.plaf.motif.MotifInternalFrameTitlePane; import javax.swing.JInternalFrame; +import javax.swing.UIManager; /* * @test @@ -36,7 +37,8 @@ import javax.swing.JInternalFrame; */ public class bug4150591 { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); MotifInternalFrameTitlePane mtp = new MotifInternalFrameTitlePane(new JInternalFrame()); } } From b31bbfcf2f13fa5b16762f5384d95c2b5d9c5705 Mon Sep 17 00:00:00 2001 From: Martin Doerr Date: Fri, 24 Oct 2025 08:26:24 +0000 Subject: [PATCH 281/561] 8368787: Error reporting: hs_err files should show instructions when referencing code in nmethods Reviewed-by: stuefe, aph, mbaesken, shade --- src/hotspot/share/code/codeBlob.cpp | 1 + src/hotspot/share/code/nmethod.cpp | 40 +++++++++++++++++++++++++++++ src/hotspot/share/code/nmethod.hpp | 1 + 3 files changed, 42 insertions(+) diff --git a/src/hotspot/share/code/codeBlob.cpp b/src/hotspot/share/code/codeBlob.cpp index 18e77520139..e901d560616 100644 --- a/src/hotspot/share/code/codeBlob.cpp +++ b/src/hotspot/share/code/codeBlob.cpp @@ -910,6 +910,7 @@ void CodeBlob::dump_for_addr(address addr, outputStream* st, bool verbose) const nm->print_nmethod(true); } else { nm->print_on(st); + nm->print_code_snippet(st, addr); } return; } diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index a99e753180d..8e6a1797480 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -4308,6 +4308,46 @@ void nmethod::print_value_on_impl(outputStream* st) const { #endif } +void nmethod::print_code_snippet(outputStream* st, address addr) const { + if (entry_point() <= addr && addr < code_end()) { + // Pointing into the nmethod's code. Try to disassemble some instructions around addr. + // Determine conservative start and end points. + address start; + if (frame_complete_offset() != CodeOffsets::frame_never_safe && + addr >= code_begin() + frame_complete_offset()) { + start = code_begin() + frame_complete_offset(); + } else { + start = (addr < verified_entry_point()) ? entry_point() : verified_entry_point(); + } + address start_for_hex_dump = start; // We can choose a different starting point for hex dump, below. + address end = code_end(); + + // Try using relocations to find closer instruction start and end points. + // (Some platforms have variable length instructions and can only + // disassemble correctly at instruction start addresses.) + RelocIterator iter((nmethod*)this, start); + while (iter.next() && iter.addr() < addr) { // find relocation before addr + // Note: There's a relocation which doesn't point to an instruction start: + // ZBarrierRelocationFormatStoreGoodAfterMov with ZGC on x86_64 + // We could detect and skip it, but hex dump is still usable when + // disassembler produces garbage in such a very rare case. + start = iter.addr(); + // We want at least 64 Bytes ahead in hex dump. + if (iter.addr() <= (addr - 64)) start_for_hex_dump = iter.addr(); + } + if (iter.has_current()) { + if (iter.addr() == addr) iter.next(); // find relocation after addr + if (iter.has_current()) end = iter.addr(); + } + + // Always print hex. Disassembler may still have problems when hitting an incorrect instruction start. + os::print_hex_dump(st, start_for_hex_dump, end, 1, /* print_ascii=*/false); + if (!Disassembler::is_abstract()) { + Disassembler::decode(start, end, st); + } + } +} + #ifndef PRODUCT void nmethod::print_calls(outputStream* st) { diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 3763b81f887..bce0181a3ec 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -1008,6 +1008,7 @@ public: void print_on_impl(outputStream* st) const; void print_code(); void print_value_on_impl(outputStream* st) const; + void print_code_snippet(outputStream* st, address addr) const; #if defined(SUPPORT_DATA_STRUCTS) // print output in opt build for disassembler library From b7a4c9ced82717434e43b3f3a0a57083f4005f32 Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Fri, 24 Oct 2025 08:55:17 +0000 Subject: [PATCH 282/561] 8366240: Improve memory ordering in new CPU Time Profiler Reviewed-by: jbachorik, krk, zgu --- .../sampling/jfrCPUTimeThreadSampler.cpp | 38 ++++++++----------- .../sampling/jfrCPUTimeThreadSampler.hpp | 20 ++++++---- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp index 7507b9c994e..031dfb7e8ad 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp @@ -82,14 +82,7 @@ JfrCPUTimeTraceQueue::~JfrCPUTimeTraceQueue() { bool JfrCPUTimeTraceQueue::enqueue(JfrCPUTimeSampleRequest& request) { assert(JavaThread::current()->jfr_thread_local()->is_cpu_time_jfr_enqueue_locked(), "invariant"); assert(&JavaThread::current()->jfr_thread_local()->cpu_time_jfr_queue() == this, "invariant"); - u4 elementIndex; - do { - elementIndex = AtomicAccess::load_acquire(&_head); - if (elementIndex >= _capacity) { - return false; - } - } while (AtomicAccess::cmpxchg(&_head, elementIndex, elementIndex + 1) != elementIndex); - _data[elementIndex] = request; + _data[_head++] = request; return true; } @@ -101,19 +94,19 @@ JfrCPUTimeSampleRequest& JfrCPUTimeTraceQueue::at(u4 index) { static volatile u4 _lost_samples_sum = 0; u4 JfrCPUTimeTraceQueue::size() const { - return AtomicAccess::load_acquire(&_head); + return _head; } void JfrCPUTimeTraceQueue::set_size(u4 size) { - AtomicAccess::release_store(&_head, size); + _head = size; } u4 JfrCPUTimeTraceQueue::capacity() const { - return AtomicAccess::load_acquire(&_capacity); + return _capacity; } void JfrCPUTimeTraceQueue::set_capacity(u4 capacity) { - if (capacity == AtomicAccess::load(&_capacity)) { + if (capacity == _capacity) { return; } _head = 0; @@ -126,15 +119,15 @@ void JfrCPUTimeTraceQueue::set_capacity(u4 capacity) { } else { _data = nullptr; } - AtomicAccess::release_store(&_capacity, capacity); + _capacity = capacity; } bool JfrCPUTimeTraceQueue::is_empty() const { - return AtomicAccess::load_acquire(&_head) == 0; + return _head == 0; } u4 JfrCPUTimeTraceQueue::lost_samples() const { - return AtomicAccess::load(&_lost_samples); + return _lost_samples; } void JfrCPUTimeTraceQueue::increment_lost_samples() { @@ -143,7 +136,7 @@ void JfrCPUTimeTraceQueue::increment_lost_samples() { } void JfrCPUTimeTraceQueue::increment_lost_samples_due_to_queue_full() { - AtomicAccess::inc(&_lost_samples_due_to_queue_full); + _lost_samples_due_to_queue_full++; } u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples() { @@ -151,7 +144,9 @@ u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples() { } u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples_due_to_queue_full() { - return AtomicAccess::xchg(&_lost_samples_due_to_queue_full, (u4)0); + u4 lost = _lost_samples_due_to_queue_full; + _lost_samples_due_to_queue_full = 0; + return lost; } void JfrCPUTimeTraceQueue::init() { @@ -159,7 +154,7 @@ void JfrCPUTimeTraceQueue::init() { } void JfrCPUTimeTraceQueue::clear() { - AtomicAccess::release_store(&_head, (u4)0); + _head = 0; } void JfrCPUTimeTraceQueue::resize_if_needed() { @@ -167,9 +162,8 @@ void JfrCPUTimeTraceQueue::resize_if_needed() { if (lost_samples_due_to_queue_full == 0) { return; } - u4 capacity = AtomicAccess::load(&_capacity); - if (capacity < CPU_TIME_QUEUE_MAX_CAPACITY) { - float ratio = (float)lost_samples_due_to_queue_full / (float)capacity; + if (_capacity < CPU_TIME_QUEUE_MAX_CAPACITY) { + float ratio = (float)lost_samples_due_to_queue_full / (float)_capacity; int factor = 1; if (ratio > 8) { // idea is to quickly scale the queue in the worst case factor = ratio; @@ -181,7 +175,7 @@ void JfrCPUTimeTraceQueue::resize_if_needed() { factor = 2; } if (factor > 1) { - u4 new_capacity = MIN2(CPU_TIME_QUEUE_MAX_CAPACITY, capacity * factor); + u4 new_capacity = MIN2(CPU_TIME_QUEUE_MAX_CAPACITY, _capacity * factor); set_capacity(new_capacity); } } diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp index e7c915fc8be..48fe28d22f0 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp @@ -43,19 +43,24 @@ struct JfrCPUTimeSampleRequest { // Fixed size async-signal-safe SPSC linear queue backed by an array. // Designed to be only used under lock and read linearly +// The lock in question is the tri-state CPU time JFR lock in JfrThreadLocal +// This allows us to skip most of the atomic accesses and memory barriers, +// holding a lock acts as a memory barrier +// Only the _lost_samples property is atomic, as it can be accessed even after +// acquiring the lock failed. +// Important to note is that the queue is also only accessed under lock in signal +// handlers. class JfrCPUTimeTraceQueue { - // the default queue capacity, scaled if the sampling period is smaller than 10ms - // when the thread is started - static const u4 CPU_TIME_QUEUE_CAPACITY = 500; - JfrCPUTimeSampleRequest* _data; - volatile u4 _capacity; + u4 _capacity; // next unfilled index - volatile u4 _head; + u4 _head; + // the only property accessible without a lock volatile u4 _lost_samples; - volatile u4 _lost_samples_due_to_queue_full; + + u4 _lost_samples_due_to_queue_full; static const u4 CPU_TIME_QUEUE_INITIAL_CAPACITY = 20; static const u4 CPU_TIME_QUEUE_MAX_CAPACITY = 2000; @@ -82,6 +87,7 @@ public: u4 lost_samples() const; + // the only method callable without holding a lock void increment_lost_samples(); void increment_lost_samples_due_to_queue_full(); From f73e56e24f0edfaeb99e2106a56725ea033bd6d6 Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Fri, 24 Oct 2025 09:14:04 +0000 Subject: [PATCH 283/561] 8361894: sun/security/krb5/config/native/TestDynamicStore.java ensure that the test is run with sudo Reviewed-by: rhalade --- .../krb5/config/native/TestDynamicStore.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/jdk/sun/security/krb5/config/native/TestDynamicStore.java b/test/jdk/sun/security/krb5/config/native/TestDynamicStore.java index 7e396013a71..0ee559f33e4 100644 --- a/test/jdk/sun/security/krb5/config/native/TestDynamicStore.java +++ b/test/jdk/sun/security/krb5/config/native/TestDynamicStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -27,13 +27,15 @@ * @summary SCDynamicStoreConfig works * @modules java.security.jgss/sun.security.krb5 * @library /test/lib - * @run main/manual/native TestDynamicStore + * @run main/manual/native/timeout=180 TestDynamicStore * @requires (os.family == "mac") */ import jdk.test.lib.Asserts; import sun.security.krb5.Config; +import javax.swing.JOptionPane; + // =================== Attention =================== // This test calls a native method implemented in libTestDynamicStore.m // to modify system-level Kerberos 5 settings stored in the dynamic store. @@ -56,6 +58,17 @@ public class TestDynamicStore { public static void main(String[] args) throws Exception { + // Show a popup to remind to run this test as sudo user + // this will only trigger if sudo (root) user is not detected + if (!"root".equals(System.getProperty("user.name"))) { + + JOptionPane.showMessageDialog(null, """ + This test MUST be run as ROOT.\s + Please close and RESTART the test."""); + + Asserts.assertFalse(true, "This test must be run as ROOT"); + } + System.loadLibrary("TestDynamicStore"); Config cfg = Config.getInstance(); From 470eedb1e9d67058ff8d67a5b0c2250d9f9b3fa5 Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Fri, 24 Oct 2025 09:46:00 +0000 Subject: [PATCH 284/561] 8370511: test/jdk/javax/swing/JSlider/bug4382876.java does not release previously pressed keys Reviewed-by: psadhukhan, serb, honkar --- test/jdk/javax/swing/JSlider/bug4382876.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/jdk/javax/swing/JSlider/bug4382876.java b/test/jdk/javax/swing/JSlider/bug4382876.java index b9ec64aab21..b0988de3cab 100644 --- a/test/jdk/javax/swing/JSlider/bug4382876.java +++ b/test/jdk/javax/swing/JSlider/bug4382876.java @@ -48,8 +48,8 @@ public class bug4382876 { private static Robot r; private static JFrame f; private static JSlider slider; - private static boolean upFail; - private static boolean downFail; + private static volatile boolean upFail; + private static volatile boolean downFail; public static void main(String[] args) throws Exception { try { @@ -70,23 +70,30 @@ public class bug4382876 { r.delay(1000); r.keyPress(KeyEvent.VK_PAGE_UP); + r.keyRelease(KeyEvent.VK_PAGE_UP); + SwingUtilities.invokeAndWait(() -> { if (slider.getValue() < -1000) { System.out.println("PAGE_UP VAL: " + slider.getValue()); upFail = true; } }); + if (upFail) { writeFailImage(); throw new RuntimeException("Slider value did NOT change with PAGE_UP"); } + r.keyPress(KeyEvent.VK_PAGE_DOWN); + r.keyRelease(KeyEvent.VK_PAGE_DOWN); + SwingUtilities.invokeAndWait(() -> { if (slider.getValue() > -1000) { System.out.println("PAGE_DOWN VAL: " + slider.getValue()); downFail = true; } }); + if (downFail) { writeFailImage(); throw new RuntimeException("Slider value did NOT change with PAGE_DOWN"); From cc9483b4da1a0f65f8773d0c7f35f2e6a7e1bd4f Mon Sep 17 00:00:00 2001 From: Matthew Donovan Date: Fri, 24 Oct 2025 11:10:59 +0000 Subject: [PATCH 285/561] 8366182: Some PKCS11Tests are being skipped when they shouldn't Reviewed-by: rhalade --- .../security/pkcs11/Cipher/TestKATForGCM.java | 13 ++- .../pkcs11/KeyStore/SecretKeysBasic.java | 17 ++-- test/jdk/sun/security/pkcs11/PKCS11Test.java | 79 +++++++++---------- .../pkcs11/Secmod/AddTrustedCert.java | 10 +-- .../pkcs11/Signature/TestDSAKeyLength.java | 18 +++-- test/jdk/sun/security/pkcs11/ec/TestECDH.java | 1 + 6 files changed, 73 insertions(+), 65 deletions(-) diff --git a/test/jdk/sun/security/pkcs11/Cipher/TestKATForGCM.java b/test/jdk/sun/security/pkcs11/Cipher/TestKATForGCM.java index 9844e8ecfd2..e5e8284e6f4 100644 --- a/test/jdk/sun/security/pkcs11/Cipher/TestKATForGCM.java +++ b/test/jdk/sun/security/pkcs11/Cipher/TestKATForGCM.java @@ -321,14 +321,19 @@ public class TestKATForGCM extends PKCS11Test { System.out.println("Test Passed!"); } } catch (Exception e) { - System.out.println("Exception occured using " + p.getName() + " version " + p.getVersionStr()); + System.out.println("Exception occured using " + p.getName() + + " version " + p.getVersionStr()); if (isNSS(p)) { - double ver = getNSSInfo("nss"); + Version ver = getNSSInfo("nss"); String osName = System.getProperty("os.name"); - if (ver > 3.139 && ver < 3.15 && osName.equals("Linux")) { + + if (osName.equals("Linux") && + ver.major() == 3 && ver.minor() < 15 + && (ver.minor() > 13 && ver.patch() >= 9)) { // warn about buggy behaviour on Linux with nss 3.14 - System.out.println("Warning: old NSS " + ver + " might be problematic, consider upgrading it"); + System.out.println("Warning: old NSS " + ver + + " might be problematic, consider upgrading it"); } } throw e; diff --git a/test/jdk/sun/security/pkcs11/KeyStore/SecretKeysBasic.java b/test/jdk/sun/security/pkcs11/KeyStore/SecretKeysBasic.java index 4d876604c01..1ff80fcaf07 100644 --- a/test/jdk/sun/security/pkcs11/KeyStore/SecretKeysBasic.java +++ b/test/jdk/sun/security/pkcs11/KeyStore/SecretKeysBasic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -116,11 +116,14 @@ public class SecretKeysBasic extends PKCS11Test { // A bug in NSS 3.12 (Mozilla bug 471665) causes AES key lengths // to be read incorrectly. Checking for improper 16 byte length // in key string. - if (isNSS(provider) && expected.getAlgorithm().equals("AES") && - (getNSSVersion() >= 3.12 && getNSSVersion() <= 3.122)) { - System.out.println("NSS 3.12 bug returns incorrect AES key "+ - "length breaking key storage. Aborting..."); - return true; + if (isNSS(provider) && expected.getAlgorithm().equals("AES")) { + Version version = getNSSVersion(); + if (version.major() == 3 && version.minor() == 12 + && version.patch() <= 2) { + System.out.println("NSS 3.12 bug returns incorrect AES key " + + "length breaking key storage. Aborting..."); + return true; + } } if (saveBeforeCheck) { @@ -168,7 +171,7 @@ public class SecretKeysBasic extends PKCS11Test { private static void doTest() throws Exception { // Make sure both NSS libraries are the same version. if (isNSS(provider) && - (getLibsoftokn3Version() != getLibnss3Version())) { + (!getLibsoftokn3Version().equals(getLibnss3Version()))) { System.out.println("libsoftokn3 and libnss3 versions do not match. Aborting test..."); return; } diff --git a/test/jdk/sun/security/pkcs11/PKCS11Test.java b/test/jdk/sun/security/pkcs11/PKCS11Test.java index 8454f3ac463..98343d9b7e6 100644 --- a/test/jdk/sun/security/pkcs11/PKCS11Test.java +++ b/test/jdk/sun/security/pkcs11/PKCS11Test.java @@ -83,7 +83,7 @@ public abstract class PKCS11Test { private static final String NSS_BUNDLE_VERSION = "3.111"; private static final String NSSLIB = "jpg.tests.jdk.nsslib"; - static double nss_version = -1; + static Version nss_version = null; static ECCState nss_ecc_status = ECCState.Basic; // The NSS library we need to search for in getNSSLibDir() @@ -93,8 +93,8 @@ public abstract class PKCS11Test { // NSS versions of each library. It is simpler to keep nss_version // for quick checking for generic testing than many if-else statements. - static double softoken3_version = -1; - static double nss3_version = -1; + static Version softoken3_version = null; + static Version nss3_version = null; static Provider pkcs11 = newPKCS11Provider(); private static String PKCS11_BASE; private static Map osMap; @@ -269,13 +269,29 @@ public abstract class PKCS11Test { } static boolean isBadNSSVersion(Provider p) { - double nssVersion = getNSSVersion(); - if (isNSS(p) && nssVersion >= 3.11 && nssVersion < 3.12) { - System.out.println("NSS 3.11 has a DER issue that recent " + - "version do not, skipping"); - return true; + Version nssVersion = getNSSVersion(); + if (isNSS(p)) { + // bad version is just between [3.11,3.12) + return nssVersion.major == 3 && 11 == nssVersion.minor; + } else { + return false; } - return false; + } + + public record Version(int major, int minor, int patch) {} + + protected static Version parseVersionString(String version) { + String [] parts = version.split("\\."); + int major = Integer.parseInt(parts[0]); + int minor = 0; + int patch = 0; + if (parts.length >= 2) { + minor = Integer.parseInt(parts[1]); + } + if (parts.length >= 3) { + patch = Integer.parseInt(parts[2]); + } + return new Version(major, minor, patch); } protected static void safeReload(String lib) { @@ -304,26 +320,26 @@ public abstract class PKCS11Test { return p.getName().equalsIgnoreCase("SUNPKCS11-NSS"); } - static double getNSSVersion() { - if (nss_version == -1) + static Version getNSSVersion() { + if (nss_version == null) getNSSInfo(); return nss_version; } static ECCState getNSSECC() { - if (nss_version == -1) + if (nss_version == null) getNSSInfo(); return nss_ecc_status; } - public static double getLibsoftokn3Version() { - if (softoken3_version == -1) + public static Version getLibsoftokn3Version() { + if (softoken3_version == null) return getNSSInfo("softokn3"); return softoken3_version; } - public static double getLibnss3Version() { - if (nss3_version == -1) + public static Version getLibnss3Version() { + if (nss3_version == null) return getNSSInfo("nss3"); return nss3_version; } @@ -338,7 +354,7 @@ public abstract class PKCS11Test { // $Header: NSS // Version: NSS // Here, stands for NSS version. - static double getNSSInfo(String library) { + static Version getNSSInfo(String library) { // look for two types of headers in NSS libraries String nssHeader1 = "$Header: NSS"; String nssHeader2 = "Version: NSS"; @@ -347,15 +363,15 @@ public abstract class PKCS11Test { int i = 0; Path libfile = null; - if (library.compareTo("softokn3") == 0 && softoken3_version > -1) + if (library.compareTo("softokn3") == 0 && softoken3_version != null) return softoken3_version; - if (library.compareTo("nss3") == 0 && nss3_version > -1) + if (library.compareTo("nss3") == 0 && nss3_version != null) return nss3_version; try { libfile = getNSSLibPath(); if (libfile == null) { - return 0.0; + return parseVersionString("0.0"); } try (InputStream is = Files.newInputStream(libfile)) { byte[] data = new byte[1000]; @@ -391,7 +407,7 @@ public abstract class PKCS11Test { if (!found) { System.out.println("lib" + library + " version not found, set to 0.0: " + libfile); - nss_version = 0.0; + nss_version = parseVersionString("0.0"); return nss_version; } @@ -404,26 +420,7 @@ public abstract class PKCS11Test { version.append(c); } - // If a "dot dot" release, strip the extra dots for double parsing - String[] dot = version.toString().split("\\."); - if (dot.length > 2) { - version = new StringBuilder(dot[0] + "." + dot[1]); - for (int j = 2; dot.length > j; j++) { - version.append(dot[j]); - } - } - - // Convert to double for easier version value checking - try { - nss_version = Double.parseDouble(version.toString()); - } catch (NumberFormatException e) { - System.out.println("===== Content start ====="); - System.out.println(s); - System.out.println("===== Content end ====="); - System.out.println("Failed to parse lib" + library + - " version. Set to 0.0"); - e.printStackTrace(); - } + nss_version = parseVersionString(version.toString()); System.out.print("library: " + library + ", version: " + version + ". "); diff --git a/test/jdk/sun/security/pkcs11/Secmod/AddTrustedCert.java b/test/jdk/sun/security/pkcs11/Secmod/AddTrustedCert.java index 880adc954ea..7b4a5075da8 100644 --- a/test/jdk/sun/security/pkcs11/Secmod/AddTrustedCert.java +++ b/test/jdk/sun/security/pkcs11/Secmod/AddTrustedCert.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -121,10 +121,10 @@ public class AddTrustedCert extends SecmodTest { } private static boolean improperNSSVersion(Provider p) { - double nssVersion = getNSSVersion(); - if (p.getName().equalsIgnoreCase("SunPKCS11-NSSKeyStore") - && nssVersion >= 3.28 && nssVersion < 3.35) { - return true; + Version nssVersion = getNSSVersion(); + if (p.getName().equalsIgnoreCase("SunPKCS11-NSSKeyStore")) { + return nssVersion.major() == 3 && + (nssVersion.minor() >= 28 && nssVersion.minor() < 35); } return false; diff --git a/test/jdk/sun/security/pkcs11/Signature/TestDSAKeyLength.java b/test/jdk/sun/security/pkcs11/Signature/TestDSAKeyLength.java index a9b43a647a9..ffd7b9e3ee0 100644 --- a/test/jdk/sun/security/pkcs11/Signature/TestDSAKeyLength.java +++ b/test/jdk/sun/security/pkcs11/Signature/TestDSAKeyLength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -47,13 +47,15 @@ public class TestDSAKeyLength extends PKCS11Test { @Override protected boolean skipTest(Provider provider) { - double version = getNSSVersion(); - String[] versionStrs = Double.toString(version).split("\\."); - int major = Integer.parseInt(versionStrs[0]); - int minor = Integer.parseInt(versionStrs[1]); - if (isNSS(provider) && (version == 0.0 || (major >= 3 && minor >= 14))) { - System.out.println("Skip testing NSS " + version); - return true; + if (isNSS(provider)) { + Version version = getNSSVersion(); + if (version == null) { + return true; + } + if (version.major() >= 3 && version.minor() >= 14){ + System.out.println("Skip testing NSS " + version); + return true; + } } return false; diff --git a/test/jdk/sun/security/pkcs11/ec/TestECDH.java b/test/jdk/sun/security/pkcs11/ec/TestECDH.java index b6821b88372..2900656f626 100644 --- a/test/jdk/sun/security/pkcs11/ec/TestECDH.java +++ b/test/jdk/sun/security/pkcs11/ec/TestECDH.java @@ -111,6 +111,7 @@ public class TestECDH extends PKCS11Test { * PKCS11Test.main will remove this provider if needed */ Providers.setAt(p, 1); + System.out.println("Testing provider " + p.getName()); if (false) { KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", p); From fd23a61cd48be5ae2c7f76cc88af3da5b4a27e3d Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Fri, 24 Oct 2025 16:43:57 +0000 Subject: [PATCH 286/561] 8370503: Use String.newStringWithLatin1Bytes to simplify Integer/Long toString method Reviewed-by: rgiulietti, rriggs --- .../share/classes/java/lang/Integer.java | 44 +++--------------- .../share/classes/java/lang/Long.java | 45 +++---------------- 2 files changed, 12 insertions(+), 77 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Integer.java b/src/java.base/share/classes/java/lang/Integer.java index 6e49f1983aa..20d1edb6d5f 100644 --- a/src/java.base/share/classes/java/lang/Integer.java +++ b/src/java.base/share/classes/java/lang/Integer.java @@ -363,15 +363,9 @@ public final class Integer extends Number // assert shift > 0 && shift <=5 : "Illegal shift value"; int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val); int chars = Math.max(((mag + (shift - 1)) / shift), 1); - if (COMPACT_STRINGS) { - byte[] buf = new byte[chars]; - formatUnsignedInt(val, shift, buf, chars); - return new String(buf, LATIN1); - } else { - byte[] buf = new byte[chars * 2]; - formatUnsignedIntUTF16(val, shift, buf, chars); - return new String(buf, UTF16); - } + byte[] buf = new byte[chars]; + formatUnsignedInt(val, shift, buf, chars); + return String.newStringWithLatin1Bytes(buf); } /** @@ -394,26 +388,6 @@ public final class Integer extends Number } while (charPos > 0); } - /** - * Format an {@code int} (treated as unsigned) into a byte buffer (UTF16 version). If - * {@code len} exceeds the formatted ASCII representation of {@code val}, - * {@code buf} will be padded with leading zeroes. - * - * @param val the unsigned int to format - * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) - * @param buf the byte buffer to write to - * @param len the number of characters to write - */ - private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int len) { - int charPos = len; - int radix = 1 << shift; - int mask = radix - 1; - do { - StringUTF16.putChar(buf, --charPos, Integer.digits[val & mask]); - val >>>= shift; - } while (charPos > 0); - } - /** * Returns a {@code String} object representing the * specified integer. The argument is converted to signed decimal @@ -427,15 +401,9 @@ public final class Integer extends Number @IntrinsicCandidate public static String toString(int i) { int size = DecimalDigits.stringSize(i); - if (COMPACT_STRINGS) { - byte[] buf = new byte[size]; - DecimalDigits.uncheckedGetCharsLatin1(i, size, buf); - return new String(buf, LATIN1); - } else { - byte[] buf = new byte[size * 2]; - DecimalDigits.uncheckedGetCharsUTF16(i, size, buf); - return new String(buf, UTF16); - } + byte[] buf = new byte[size]; + DecimalDigits.uncheckedGetCharsLatin1(i, size, buf); + return String.newStringWithLatin1Bytes(buf); } /** diff --git a/src/java.base/share/classes/java/lang/Long.java b/src/java.base/share/classes/java/lang/Long.java index 90249cb1edb..b0477fdab6d 100644 --- a/src/java.base/share/classes/java/lang/Long.java +++ b/src/java.base/share/classes/java/lang/Long.java @@ -391,15 +391,9 @@ public final class Long extends Number // assert shift > 0 && shift <=5 : "Illegal shift value"; int mag = Long.SIZE - Long.numberOfLeadingZeros(val); int chars = Math.max(((mag + (shift - 1)) / shift), 1); - if (COMPACT_STRINGS) { - byte[] buf = new byte[chars]; - formatUnsignedLong0(val, shift, buf, 0, chars); - return new String(buf, LATIN1); - } else { - byte[] buf = new byte[chars * 2]; - formatUnsignedLong0UTF16(val, shift, buf, 0, chars); - return new String(buf, UTF16); - } + byte[] buf = new byte[chars]; + formatUnsignedLong0(val, shift, buf, 0, chars); + return String.newStringWithLatin1Bytes(buf); } /** @@ -423,27 +417,6 @@ public final class Long extends Number } while (charPos > offset); } - /** - * Format a long (treated as unsigned) into a byte buffer (UTF16 version). If - * {@code len} exceeds the formatted ASCII representation of {@code val}, - * {@code buf} will be padded with leading zeroes. - * - * @param val the unsigned long to format - * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) - * @param buf the byte buffer to write to - * @param offset the offset in the destination buffer to start at - * @param len the number of characters to write - */ - private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) { - int charPos = offset + len; - int radix = 1 << shift; - int mask = radix - 1; - do { - StringUTF16.putChar(buf, --charPos, Integer.digits[((int) val) & mask]); - val >>>= shift; - } while (charPos > offset); - } - /** * Returns a {@code String} object representing the specified * {@code long}. The argument is converted to signed decimal @@ -456,15 +429,9 @@ public final class Long extends Number */ public static String toString(long i) { int size = DecimalDigits.stringSize(i); - if (COMPACT_STRINGS) { - byte[] buf = new byte[size]; - DecimalDigits.uncheckedGetCharsLatin1(i, size, buf); - return new String(buf, LATIN1); - } else { - byte[] buf = new byte[size * 2]; - DecimalDigits.uncheckedGetCharsUTF16(i, size, buf); - return new String(buf, UTF16); - } + byte[] buf = new byte[size]; + DecimalDigits.uncheckedGetCharsLatin1(i, size, buf); + return String.newStringWithLatin1Bytes(buf); } /** From 13adcd99db4f14caf90de7f59e341380cfa354b0 Mon Sep 17 00:00:00 2001 From: Anass Baya Date: Fri, 24 Oct 2025 17:04:28 +0000 Subject: [PATCH 287/561] 8274082: Wrong test name in jtreg run tag for java/awt/print/PrinterJob/SwingUIText.java Co-authored-by: Lawrence Andrews Reviewed-by: honkar, dnguyen --- .../awt/print/PrinterJob/SwingUIText.java | 216 +++++------------- 1 file changed, 56 insertions(+), 160 deletions(-) diff --git a/test/jdk/java/awt/print/PrinterJob/SwingUIText.java b/test/jdk/java/awt/print/PrinterJob/SwingUIText.java index 5fcd5e39158..6ef5064fc30 100644 --- a/test/jdk/java/awt/print/PrinterJob/SwingUIText.java +++ b/test/jdk/java/awt/print/PrinterJob/SwingUIText.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -21,44 +21,70 @@ * questions. */ -/** +/* * @test * @bug 6488219 6560738 7158350 8017469 * @key printer * @summary Test that text printed in Swing UI measures and looks OK. - * @run main/manual=yesno PrintTextTest + * @library /java/awt/regtesthelpers /test/lib + * @build PassFailJFrame jtreg.SkippedException + * @run main/manual SwingUIText */ -import java.awt.*; -import javax.swing.*; -import java.awt.print.*; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.GridLayout; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterJob; +import javax.swing.JButton; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import jtreg.SkippedException; public class SwingUIText implements Printable { + private static JFrame frame; + private static final String INSTRUCTIONS = """ + This test checks that when a Swing UI is printed, + the text in each component aligns with the component’s length as seen on-screen. + It also ensures the text spacing is reasonably even, though this is subjective. + The comparison should be made with JDK 1.5 GA or JDK 1.6 GA. - static String[] instructions = { - "This tests that when a Swing UI is printed, that the text", - "in each component properly matches the length of the component", - "as seen on-screen, and that the spacing of the text is of", - "reasonable even-ness. This latter part is very subjective and", - "the comparison has to be with JDK1.5 GA, or JDK 1.6 GA", - }; + Steps: + 1. Press the "Print" or "OK" button on the Print dialog. + This will print the content of the "Swing UI Text Printing Test" JFrame. + 2. Compare the printout with the content of the JFrame. + 3. If they match, press Pass; otherwise, press Fail. + """; - static JFrame frame; + public static void main(String args[]) throws Exception { + PrinterJob job = PrinterJob.getPrinterJob(); + if (job.getPrintService() == null) { + throw new SkippedException("Printer not configured or available."); + } - public static void main(String args[]) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - createUI(); - } - }); + PassFailJFrame passFailJFrame = PassFailJFrame.builder() + .instructions(INSTRUCTIONS) + .columns(45) + .testUI(SwingUIText::createTestUI) + .build(); + + job.setPrintable(new SwingUIText()); + if (job.printDialog()) { + job.print(); + } + + passFailJFrame.awaitAndCheck(); } - public static void createUI() { - - Sysout.createDialogWithInstructions(instructions); - + public static JFrame createTestUI() { + frame = new JFrame(); JPanel panel = new JPanel(); - panel.setLayout(new GridLayout(4,1)); + panel.setLayout(new GridLayout(4, 1)); String text = "marvelous suspicious solving"; displayText(panel, text); @@ -89,24 +115,12 @@ public class SwingUIText implements Printable { frame = new JFrame("Swing UI Text Printing Test"); frame.getContentPane().add(panel); frame.pack(); - frame.setVisible(true); - - PrinterJob job = PrinterJob.getPrinterJob(); - PageFormat pf = job.defaultPage(); - job.setPrintable(new SwingUIText(), pf); - if (job.printDialog()) { - try { job.print(); } - catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } + return frame; } - static void displayText(JPanel p, String text) { JPanel panel = new JPanel(); - panel.setLayout(new GridLayout(2,1)); + panel.setLayout(new GridLayout(2, 1)); JPanel row = new JPanel(); Font font = new Font("Dialog", Font.PLAIN, 12); @@ -114,7 +128,7 @@ public class SwingUIText implements Printable { label.setFont(font); row.add(label); - JButton button = new JButton("Print "+text); + JButton button = new JButton("Print " + text); button.setMnemonic('P'); button.setFont(font); row.add(button); @@ -133,132 +147,14 @@ public class SwingUIText implements Printable { p.add(panel); } - public int print(Graphics g, PageFormat pf, int pageIndex) - throws PrinterException { - + public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex >= 1) { return Printable.NO_SUCH_PAGE; } + g.translate((int)pf.getImageableX(), (int)pf.getImageableY()); frame.printAll(g); - return Printable.PAGE_EXISTS; } } - -class Sysout - { - private static TestDialog dialog; - - public static void createDialogWithInstructions( String[] instructions ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - dialog.printInstructions( instructions ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - public static void createDialog( ) - { - dialog = new TestDialog( new Frame(), "Instructions" ); - String[] defInstr = { "Instructions will appear here. ", "" } ; - dialog.printInstructions( defInstr ); - dialog.show(); - println( "Any messages for the tester will display here." ); - } - - - public static void printInstructions( String[] instructions ) - { - dialog.printInstructions( instructions ); - } - - - public static void println( String messageIn ) - { - dialog.displayMessage( messageIn ); - } - - }// Sysout class - -/** - This is part of the standard test machinery. It provides a place for the - test instructions to be displayed, and a place for interactive messages - to the user to be displayed. - To have the test instructions displayed, see Sysout. - To have a message to the user be displayed, see Sysout. - Do not call anything in this dialog directly. - */ -class TestDialog extends Dialog - { - - TextArea instructionsText; - TextArea messageText; - int maxStringLength = 80; - - //DO NOT call this directly, go through Sysout - public TestDialog( Frame frame, String name ) - { - super( frame, name ); - int scrollBoth = TextArea.SCROLLBARS_BOTH; - instructionsText = new TextArea( "", 10, maxStringLength, scrollBoth ); - add( "North", instructionsText ); - - messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); - add("South", messageText); - - pack(); - - show(); - }// TestDialog() - - //DO NOT call this directly, go through Sysout - public void printInstructions( String[] instructions ) - { - //Clear out any current instructions - instructionsText.setText( "" ); - - //Go down array of instruction strings - - String printStr, remainingStr; - for( int i=0; i < instructions.length; i++ ) - { - //chop up each into pieces maxSringLength long - remainingStr = instructions[ i ]; - while( remainingStr.length() > 0 ) - { - //if longer than max then chop off first max chars to print - if( remainingStr.length() >= maxStringLength ) - { - //Try to chop on a word boundary - int posOfSpace = remainingStr. - lastIndexOf( ' ', maxStringLength - 1 ); - - if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; - - printStr = remainingStr.substring( 0, posOfSpace + 1 ); - remainingStr = remainingStr.substring( posOfSpace + 1 ); - } - //else just print - else - { - printStr = remainingStr; - remainingStr = ""; - } - - instructionsText.append( printStr + "\n" ); - - }// while - - }// for - - }//printInstructions() - - //DO NOT call this directly, go through Sysout - public void displayMessage( String messageIn ) - { - messageText.append( messageIn + "\n" ); - } - -}// TestDialog class From 2ee34391c152abeb06a6baf69f4420988b8c838e Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Fri, 24 Oct 2025 17:43:41 +0000 Subject: [PATCH 288/561] 8368975: Windows ProcessImpl.java has dead code Reviewed-by: ayang, rriggs --- .../windows/classes/java/lang/ProcessImpl.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/java.base/windows/classes/java/lang/ProcessImpl.java b/src/java.base/windows/classes/java/lang/ProcessImpl.java index 7f7c1e75013..78180cce678 100644 --- a/src/java.base/windows/classes/java/lang/ProcessImpl.java +++ b/src/java.base/windows/classes/java/lang/ProcessImpl.java @@ -199,7 +199,6 @@ final class ProcessImpl extends Process { } private static final int VERIFICATION_CMD_BAT = 0; - private static final int VERIFICATION_WIN32 = 1; private static final int VERIFICATION_WIN32_SAFE = 2; // inside quotes not allowed private static final int VERIFICATION_LEGACY = 3; // See Command shell overview for documentation of special characters. @@ -384,12 +383,6 @@ final class ProcessImpl extends Process { return (upName.endsWith(".EXE") || upName.indexOf('.') < 0); } - // Old version that can be bypassed - private boolean isShellFile(String executablePath) { - String upPath = executablePath.toUpperCase(Locale.ROOT); - return (upPath.endsWith(".CMD") || upPath.endsWith(".BAT")); - } - private String quoteString(String arg) { StringBuilder argbuf = new StringBuilder(arg.length() + 2); return argbuf.append('"').append(arg).append('"').toString(); @@ -472,12 +465,10 @@ final class ProcessImpl extends Process { // Quotation protects from interpretation of the [path] argument as // start of longer path with spaces. Quotation has no influence to // [.exe] extension heuristic. - boolean isShell = allowAmbiguousCommands ? isShellFile(executablePath) - : !isExe(executablePath); + boolean isShell = !isExe(executablePath); cmdstr = createCommandLine( // We need the extended verification procedures - isShell ? VERIFICATION_CMD_BAT - : (allowAmbiguousCommands ? VERIFICATION_WIN32 : VERIFICATION_WIN32_SAFE), + isShell ? VERIFICATION_CMD_BAT : VERIFICATION_WIN32_SAFE, quoteString(executablePath), cmd); } From 97e5ac6e728baeae4341c6235d026ecd99bc600e Mon Sep 17 00:00:00 2001 From: Mikhailo Seledtsov Date: Fri, 24 Oct 2025 18:04:32 +0000 Subject: [PATCH 289/561] 8370514: Problemlist nio/channels/AsyncCloseAndInterrupt until JDK-8368290 is resolved Reviewed-by: bpb --- test/jdk/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 1f6bea97407..f95b3681723 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -587,6 +587,7 @@ java/net/MulticastSocket/Test.java 7145658,8308807 # jdk_nio java/nio/channels/Channels/SocketChannelStreams.java 8317838 aix-ppc64 +java/nio/channels/AsyncCloseAndInterrupt.java 8368290 macosx-26.0.1 java/nio/channels/DatagramChannel/AdaptorMulticasting.java 8308807,8144003 aix-ppc64,macosx-all java/nio/channels/DatagramChannel/AfterDisconnect.java 8308807 aix-ppc64 From a4eaeb47c9c42d8da4e3814c80247f40236a03a2 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Fri, 24 Oct 2025 22:24:28 +0000 Subject: [PATCH 290/561] 6453640: BandedSampleModel.createCompatibleSampleModel() API docs are wrong Reviewed-by: azvegint, serb --- .../java/awt/image/BandedSampleModel.java | 13 +-- .../BSMCreateCompatibleSMTest.java | 100 ++++++++++++++++++ 2 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 test/jdk/java/awt/image/BandedSampleModel/BSMCreateCompatibleSMTest.java diff --git a/src/java.desktop/share/classes/java/awt/image/BandedSampleModel.java b/src/java.desktop/share/classes/java/awt/image/BandedSampleModel.java index bd955e35870..bad9abc6130 100644 --- a/src/java.desktop/share/classes/java/awt/image/BandedSampleModel.java +++ b/src/java.desktop/share/classes/java/awt/image/BandedSampleModel.java @@ -141,12 +141,9 @@ public final class BandedSampleModel extends ComponentSampleModel * @param h the height of the resulting {@code BandedSampleModel} * @return a new {@code BandedSampleModel} with the specified * width and height. - * @throws IllegalArgumentException if {@code w} or - * {@code h} equals either - * {@code Integer.MAX_VALUE} or - * {@code Integer.MIN_VALUE} - * @throws IllegalArgumentException if {@code dataType} is not - * one of the supported data types + * @throws IllegalArgumentException if the product of {@code w} + * and {@code h} is greater than {@code Integer.MAX_VALUE} + * or {@code w} or {@code h} is not greater than 0. */ public SampleModel createCompatibleSampleModel(int w, int h) { int[] bandOffs; @@ -172,8 +169,8 @@ public final class BandedSampleModel extends ComponentSampleModel * of the original BandedSampleModel/DataBuffer combination. * @throws RasterFormatException if the number of bands is greater than * the number of banks in this sample model. - * @throws IllegalArgumentException if {@code dataType} is not - * one of the supported data types + * @throws IllegalArgumentException if the number of bands is not greater than 0 + * @throws ArrayIndexOutOfBoundsException if any of the bank indices is out of bounds */ public SampleModel createSubsetSampleModel(int[] bands) { if (bands.length > bankIndices.length) diff --git a/test/jdk/java/awt/image/BandedSampleModel/BSMCreateCompatibleSMTest.java b/test/jdk/java/awt/image/BandedSampleModel/BSMCreateCompatibleSMTest.java new file mode 100644 index 00000000000..a47659300e8 --- /dev/null +++ b/test/jdk/java/awt/image/BandedSampleModel/BSMCreateCompatibleSMTest.java @@ -0,0 +1,100 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 6453640 + * @summary Verify BandedSampleModel.createCompatibleSampleModel + * and createSubsetSampleModel behaviour + * @run main BSMCreateCompatibleSMTest + */ + +import java.awt.image.BandedSampleModel; +import java.awt.image.DataBuffer; +import java.awt.image.RasterFormatException; + +public class BSMCreateCompatibleSMTest { + + public static void main(String[] args) { + + // These should all be OK + BandedSampleModel bsm = new BandedSampleModel(DataBuffer.TYPE_BYTE, 1, 1, 1); + bsm.createCompatibleSampleModel(20_000, 20_000); + int[] bands = { 0 } ; + bsm.createSubsetSampleModel(bands); + + // These should all throw an exception + try { + bsm.createCompatibleSampleModel(-1, 1); + throw new RuntimeException("No exception for illegal w"); + } catch (IllegalArgumentException e) { + System.out.println(e); + } + + try { + bsm.createCompatibleSampleModel(1, 0); + throw new RuntimeException("No exception for illegal h"); + } catch (IllegalArgumentException e) { + System.out.println(e); + } + + try { + bsm.createCompatibleSampleModel(-1, -1); + throw new RuntimeException("No exception for illegal w+h"); + } catch (IllegalArgumentException e) { + System.out.println(e); + } + + try { + bsm.createCompatibleSampleModel(50_000, 50_000); + throw new RuntimeException("No exception for too large dims"); + } catch (IllegalArgumentException e) { + System.out.println(e); + } + + try { + int[] bands0 = { } ; + bsm.createSubsetSampleModel(bands0); + throw new RuntimeException("No exception for empty bands[]"); + } catch (IllegalArgumentException e) { + System.out.println(e); + } + + try { + int[] bands1 = { 1 } ; + bsm.createSubsetSampleModel(bands1); + throw new RuntimeException("No exception for out of bounds band"); + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println(e); + } + + try { + int[] bands2 = { 0, 0 } ; + bsm.createSubsetSampleModel(bands2); + throw new RuntimeException("No exception for too many bands"); + } catch (RasterFormatException e) { + System.out.println(e); + } + } + +} From 35fdda0889bd6a83027089672b643ef7ffc8a40c Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 24 Oct 2025 23:03:50 +0000 Subject: [PATCH 291/561] 7105350: HttpExchange's attributes are the same as HttpContext's attributes Reviewed-by: michaelm, jpai, dfuchs --- .../share/classes/module-info.java | 10 +++++++ .../sun/net/httpserver/ExchangeImpl.java | 30 ++++++++----------- .../net/httpserver/ExchangeAttributeTest.java | 20 ++++++++++--- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/jdk.httpserver/share/classes/module-info.java b/src/jdk.httpserver/share/classes/module-info.java index 15e9e2cc36d..ac147582b14 100644 --- a/src/jdk.httpserver/share/classes/module-info.java +++ b/src/jdk.httpserver/share/classes/module-info.java @@ -23,6 +23,8 @@ * questions. */ +import com.sun.net.httpserver.*; + /** * Defines the JDK-specific HTTP server API, and provides the jwebserver tool * for running a minimal HTTP server. @@ -109,6 +111,14 @@ * and implementation of the server does not intend to be a full-featured, high performance * HTTP server. * + * @implNote + * Prior to JDK 26, in the JDK default implementation, the {@link HttpExchange} attribute map was + * shared with the enclosing {@link HttpContext}. + * Since JDK 26, by default, exchange attributes are per-exchange and the context attributes must + * be accessed by calling {@link HttpExchange#getHttpContext() getHttpContext()}{@link + * HttpContext#getAttributes() .getAttributes()}.
        + * A new system property, {@systemProperty jdk.httpserver.attributes} (default value: {@code ""}) + * allows to revert this new behavior. Set this property to "context" to restore the pre JDK 26 behavior. * @toolGuide jwebserver * * @uses com.sun.net.httpserver.spi.HttpServerProvider diff --git a/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java b/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java index 1119d1e386b..0899952b495 100644 --- a/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java +++ b/src/jdk.httpserver/share/classes/sun/net/httpserver/ExchangeImpl.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import java.io.*; import java.net.*; import javax.net.ssl.*; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.lang.System.Logger; import java.lang.System.Logger.Level; import java.text.*; @@ -59,6 +60,9 @@ class ExchangeImpl { /* for formatting the Date: header */ private static final DateTimeFormatter FORMATTER; + private static final boolean perExchangeAttributes = + !System.getProperty("jdk.httpserver.attributes", "") + .equals("context"); static { String pattern = "EEE, dd MMM yyyy HH:mm:ss zzz"; FORMATTER = DateTimeFormatter.ofPattern(pattern, Locale.US) @@ -76,7 +80,7 @@ class ExchangeImpl { PlaceholderOutputStream uos_orig; boolean sentHeaders; /* true after response headers sent */ - Map attributes; + final Map attributes; int rcode = -1; HttpPrincipal principal; ServerImpl server; @@ -91,6 +95,9 @@ class ExchangeImpl { this.uri = u; this.connection = connection; this.reqContentLen = len; + this.attributes = perExchangeAttributes + ? new ConcurrentHashMap<>() + : getHttpContext().getAttributes(); /* ros only used for headers, body written directly to stream */ this.ros = req.outputStream(); this.ris = req.inputStream(); @@ -361,26 +368,15 @@ class ExchangeImpl { } public Object getAttribute (String name) { - if (name == null) { - throw new NullPointerException ("null name parameter"); - } - if (attributes == null) { - attributes = getHttpContext().getAttributes(); - } - return attributes.get (name); + return attributes.get(Objects.requireNonNull(name, "null name parameter")); } public void setAttribute (String name, Object value) { - if (name == null) { - throw new NullPointerException ("null name parameter"); - } - if (attributes == null) { - attributes = getHttpContext().getAttributes(); - } + var key = Objects.requireNonNull(name, "null name parameter"); if (value != null) { - attributes.put (name, value); + attributes.put(key, value); } else { - attributes.remove (name); + attributes.remove(key); } } diff --git a/test/jdk/com/sun/net/httpserver/ExchangeAttributeTest.java b/test/jdk/com/sun/net/httpserver/ExchangeAttributeTest.java index 2ce3dfd016d..e7bea2814db 100644 --- a/test/jdk/com/sun/net/httpserver/ExchangeAttributeTest.java +++ b/test/jdk/com/sun/net/httpserver/ExchangeAttributeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,9 @@ * @summary Tests for HttpExchange set/getAttribute * @library /test/lib * @run junit/othervm ExchangeAttributeTest + * @run junit/othervm -Djdk.httpserver.attributes=context ExchangeAttributeTest + * @run junit/othervm -Djdk.httpserver.attributes=random-string ExchangeAttributeTest + * @run junit/othervm -Djdk.httpserver.attributes ExchangeAttributeTest */ import com.sun.net.httpserver.HttpExchange; @@ -71,7 +74,7 @@ public class ExchangeAttributeTest { public void testExchangeAttributes() throws Exception { var handler = new AttribHandler(); var server = HttpServer.create(new InetSocketAddress(LOOPBACK_ADDR,0), 10); - server.createContext("/", handler); + server.createContext("/", handler).getAttributes().put("attr", "context-val"); server.start(); try { var client = HttpClient.newBuilder().proxy(NO_PROXY).build(); @@ -101,8 +104,17 @@ public class ExchangeAttributeTest { @java.lang.Override public void handle(HttpExchange exchange) throws IOException { try { - exchange.setAttribute("attr", "val"); - assertEquals("val", exchange.getAttribute("attr")); + if ("context".equals(System.getProperty("jdk.httpserver.attributes"))) { + exchange.setAttribute("attr", "val"); + assertEquals("val", exchange.getAttribute("attr")); + assertEquals("val", exchange.getHttpContext().getAttributes().get("attr")); + } else { + assertNull(exchange.getAttribute("attr")); + assertEquals("context-val", exchange.getHttpContext().getAttributes().get("attr")); + exchange.setAttribute("attr", "val"); + assertEquals("val", exchange.getAttribute("attr")); + assertEquals("context-val", exchange.getHttpContext().getAttributes().get("attr")); + } exchange.setAttribute("attr", null); assertNull(exchange.getAttribute("attr")); exchange.sendResponseHeaders(200, -1); From 32697bf652429fa7247047465e365835dfa24b39 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Sat, 25 Oct 2025 01:54:03 +0000 Subject: [PATCH 292/561] 8370501: vmTestbase/vm/gc/compact/Humongous_NonbranchyTree5M/TestDescription.java intermittent timed out Reviewed-by: tschatzl --- .../compact/Humongous_NonbranchyTree5M/TestDescription.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree5M/TestDescription.java b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree5M/TestDescription.java index 1d5a6f0cf11..a539fb7cea2 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree5M/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/compact/Humongous_NonbranchyTree5M/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ * * @library /vmTestbase * /test/lib - * @run main/othervm + * @run main/othervm/timeout=480 * -XX:-UseGCOverheadLimit * vm.gc.compact.Compact * -gp nonbranchyTree(high) From c3449de23f4fa74590494b8677f6832d47f12dea Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Sat, 25 Oct 2025 15:27:03 +0000 Subject: [PATCH 293/561] 8360395: sun/security/tools/keytool/i18n.java user country is current user location instead of the language Reviewed-by: rhalade --- test/jdk/sun/security/tools/keytool/i18n.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/jdk/sun/security/tools/keytool/i18n.java b/test/jdk/sun/security/tools/keytool/i18n.java index ab9da8b1d3e..030735e966c 100644 --- a/test/jdk/sun/security/tools/keytool/i18n.java +++ b/test/jdk/sun/security/tools/keytool/i18n.java @@ -28,7 +28,7 @@ * @author charlie lai * @modules java.base/sun.security.tools.keytool * @library /test/lib - * @run main/manual/othervm -Duser.language=en i18n + * @run main/manual/othervm -Duser.language=en -Duser.country=USA i18n */ /* @@ -38,7 +38,7 @@ * @author charlie lai * @modules java.base/sun.security.tools.keytool * @library /test/lib - * @run main/manual/othervm -Duser.language=de i18n + * @run main/manual/othervm -Duser.language=de -Duser.country=DE i18n */ /* @@ -48,7 +48,7 @@ * @author charlie lai * @modules java.base/sun.security.tools.keytool * @library /test/lib - * @run main/manual/othervm -Duser.language=ja i18n + * @run main/manual/othervm -Duser.language=ja -Duser.country=JP i18n */ /* From e7c7892b9f0fcee37495cce312fdd67dc800f9c9 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Sun, 26 Oct 2025 06:04:02 +0000 Subject: [PATCH 294/561] 8370197: Add missing @Override annotations in com.sun.beans package Reviewed-by: prr --- .../classes/com/sun/beans/WildcardTypeImpl.java | 4 +++- .../sun/beans/decoder/NullElementHandler.java | 4 +++- .../com/sun/beans/decoder/ValueObjectImpl.java | 4 +++- .../com/sun/beans/editors/BooleanEditor.java | 6 +++++- .../com/sun/beans/editors/ByteEditor.java | 4 +++- .../com/sun/beans/editors/ColorEditor.java | 17 ++++++++++++++++- .../com/sun/beans/editors/DoubleEditor.java | 3 ++- .../com/sun/beans/editors/EnumEditor.java | 14 +++++++++++++- .../com/sun/beans/editors/FloatEditor.java | 4 +++- .../com/sun/beans/editors/FontEditor.java | 16 +++++++++++++++- .../com/sun/beans/editors/IntegerEditor.java | 3 ++- .../com/sun/beans/editors/LongEditor.java | 4 +++- .../com/sun/beans/editors/NumberEditor.java | 3 ++- .../com/sun/beans/editors/ShortEditor.java | 4 +++- .../com/sun/beans/editors/StringEditor.java | 4 +++- .../com/sun/beans/infos/ComponentBeanInfo.java | 3 ++- .../share/classes/com/sun/beans/util/Cache.java | 17 ++++++++++++++++- 17 files changed, 97 insertions(+), 17 deletions(-) diff --git a/src/java.desktop/share/classes/com/sun/beans/WildcardTypeImpl.java b/src/java.desktop/share/classes/com/sun/beans/WildcardTypeImpl.java index 28e316c90ec..ebbc8d2cb26 100644 --- a/src/java.desktop/share/classes/com/sun/beans/WildcardTypeImpl.java +++ b/src/java.desktop/share/classes/com/sun/beans/WildcardTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -73,6 +73,7 @@ final class WildcardTypeImpl implements WildcardType { * @return an array of types representing * the upper bound(s) of this type variable */ + @Override public Type[] getUpperBounds() { return this.upperBounds.clone(); } @@ -87,6 +88,7 @@ final class WildcardTypeImpl implements WildcardType { * @return an array of types representing * the lower bound(s) of this type variable */ + @Override public Type[] getLowerBounds() { return this.lowerBounds.clone(); } diff --git a/src/java.desktop/share/classes/com/sun/beans/decoder/NullElementHandler.java b/src/java.desktop/share/classes/com/sun/beans/decoder/NullElementHandler.java index f865535e4fb..d5ac5368f9a 100644 --- a/src/java.desktop/share/classes/com/sun/beans/decoder/NullElementHandler.java +++ b/src/java.desktop/share/classes/com/sun/beans/decoder/NullElementHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -61,6 +61,7 @@ class NullElementHandler extends ElementHandler implements ValueObject { * * @return {@code null} by default */ + @Override public Object getValue() { return null; } @@ -70,6 +71,7 @@ class NullElementHandler extends ElementHandler implements ValueObject { * * @return {@code false} always */ + @Override public final boolean isVoid() { return false; } diff --git a/src/java.desktop/share/classes/com/sun/beans/decoder/ValueObjectImpl.java b/src/java.desktop/share/classes/com/sun/beans/decoder/ValueObjectImpl.java index 6fa46c93fa8..54c73381191 100644 --- a/src/java.desktop/share/classes/com/sun/beans/decoder/ValueObjectImpl.java +++ b/src/java.desktop/share/classes/com/sun/beans/decoder/ValueObjectImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -72,6 +72,7 @@ final class ValueObjectImpl implements ValueObject { * * @return the result of method execution */ + @Override public Object getValue() { return this.value; } @@ -82,6 +83,7 @@ final class ValueObjectImpl implements ValueObject { * @return {@code true} if value should be ignored, * {@code false} otherwise */ + @Override public boolean isVoid() { return this.isVoid; } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/BooleanEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/BooleanEditor.java index 69aca3238c9..79900b5deb1 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/BooleanEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/BooleanEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class BooleanEditor extends PropertyEditorSupport { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) @@ -41,6 +42,7 @@ public class BooleanEditor extends PropertyEditorSupport { : "null"; } + @Override public String getAsText() { Object value = getValue(); return (value instanceof Boolean) @@ -48,6 +50,7 @@ public class BooleanEditor extends PropertyEditorSupport { : null; } + @Override public void setAsText(String text) throws java.lang.IllegalArgumentException { if (text == null) { setValue(null); @@ -60,6 +63,7 @@ public class BooleanEditor extends PropertyEditorSupport { } } + @Override public String[] getTags() { return new String[] {getValidName(true), getValidName(false)}; } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/ByteEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/ByteEditor.java index 2f4f342774f..fe927fda74d 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/ByteEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/ByteEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class ByteEditor extends NumberEditor { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) @@ -41,6 +42,7 @@ public class ByteEditor extends NumberEditor { : "null"; } + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Byte.decode(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/ColorEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/ColorEditor.java index 3c3207ccd15..a5cf00923dd 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/ColorEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/ColorEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -79,16 +79,19 @@ public class ColorEditor extends Panel implements PropertyEditor { resize(ourWidth,40); } + @Override public void setValue(Object o) { Color c = (Color)o; changeColor(c); } + @Override @SuppressWarnings("deprecation") public Dimension preferredSize() { return new Dimension(ourWidth, 40); } + @Override @SuppressWarnings("deprecation") public boolean keyUp(Event e, int key) { if (e.target == text) { @@ -101,6 +104,7 @@ public class ColorEditor extends Panel implements PropertyEditor { return (false); } + @Override public void setAsText(String s) throws java.lang.IllegalArgumentException { if (s == null) { changeColor(null); @@ -124,6 +128,7 @@ public class ColorEditor extends Panel implements PropertyEditor { } + @Override @SuppressWarnings("deprecation") public boolean action(Event e, Object arg) { if (e.target == chooser) { @@ -132,6 +137,7 @@ public class ColorEditor extends Panel implements PropertyEditor { return false; } + @Override public String getJavaInitializationString() { return (this.color != null) ? "new java.awt.Color(" + this.color.getRGB() + ",true)" @@ -165,14 +171,17 @@ public class ColorEditor extends Panel implements PropertyEditor { support.firePropertyChange("", null, null); } + @Override public Object getValue() { return color; } + @Override public boolean isPaintable() { return true; } + @Override public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) { Color oldColor = gfx.getColor(); gfx.setColor(Color.black); @@ -182,28 +191,34 @@ public class ColorEditor extends Panel implements PropertyEditor { gfx.setColor(oldColor); } + @Override public String getAsText() { return (this.color != null) ? this.color.getRed() + "," + this.color.getGreen() + "," + this.color.getBlue() : null; } + @Override public String[] getTags() { return null; } + @Override public java.awt.Component getCustomEditor() { return this; } + @Override public boolean supportsCustomEditor() { return true; } + @Override public void addPropertyChangeListener(PropertyChangeListener l) { support.addPropertyChangeListener(l); } + @Override public void removePropertyChangeListener(PropertyChangeListener l) { support.removePropertyChangeListener(l); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/DoubleEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/DoubleEditor.java index 55d5a0528a4..3803cca7d7c 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/DoubleEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/DoubleEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class DoubleEditor extends NumberEditor { + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Double.valueOf(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/EnumEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/EnumEditor.java index b7f5ada0d1f..b5316a04d65 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/EnumEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/EnumEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -63,10 +63,12 @@ public final class EnumEditor implements PropertyEditor { } } + @Override public Object getValue() { return this.value; } + @Override public void setValue( Object value ) { if ( ( value != null ) && !this.type.isInstance( value ) ) { throw new IllegalArgumentException( "Unsupported value: " + value ); @@ -92,12 +94,14 @@ public final class EnumEditor implements PropertyEditor { } } + @Override public String getAsText() { return ( this.value != null ) ? ( ( Enum )this.value ).name() : null; } + @Override public void setAsText( String text ) { @SuppressWarnings("unchecked") Object tmp = ( text != null ) @@ -106,10 +110,12 @@ public final class EnumEditor implements PropertyEditor { setValue(tmp); } + @Override public String[] getTags() { return this.tags.clone(); } + @Override public String getJavaInitializationString() { String name = getAsText(); return ( name != null ) @@ -117,27 +123,33 @@ public final class EnumEditor implements PropertyEditor { : "null"; } + @Override public boolean isPaintable() { return false; } + @Override public void paintValue( Graphics gfx, Rectangle box ) { } + @Override public boolean supportsCustomEditor() { return false; } + @Override public Component getCustomEditor() { return null; } + @Override public void addPropertyChangeListener( PropertyChangeListener listener ) { synchronized ( this.listeners ) { this.listeners.add( listener ); } } + @Override public void removePropertyChangeListener( PropertyChangeListener listener ) { synchronized ( this.listeners ) { this.listeners.remove( listener ); diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/FloatEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/FloatEditor.java index 4723c489cc0..5820c00d82e 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/FloatEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/FloatEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class FloatEditor extends NumberEditor { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) @@ -41,6 +42,7 @@ public class FloatEditor extends NumberEditor { : "null"; } + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Float.valueOf(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/FontEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/FontEditor.java index cf2fdd26307..26d4ab2b182 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/FontEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/FontEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -78,11 +78,13 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { } + @Override @SuppressWarnings("deprecation") public Dimension preferredSize() { return new Dimension(300, 40); } + @Override public void setValue(Object o) { font = (Font) o; if (this.font == null) @@ -130,10 +132,12 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { support.firePropertyChange("", null, null); } + @Override public Object getValue() { return (font); } + @Override public String getJavaInitializationString() { if (this.font == null) return "null"; @@ -142,6 +146,7 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { font.getStyle() + ", " + font.getSize() + ")"; } + @Override @SuppressWarnings("deprecation") public boolean action(Event e, Object arg) { String family = familyChoser.getSelectedItem(); @@ -158,10 +163,12 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { } + @Override public boolean isPaintable() { return true; } + @Override public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) { // Silent noop. Font oldFont = gfx.getFont(); @@ -172,6 +179,7 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { gfx.setFont(oldFont); } + @Override public String getAsText() { if (this.font == null) { return null; @@ -195,26 +203,32 @@ public class FontEditor extends Panel implements java.beans.PropertyEditor { return sb.toString(); } + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Font.decode(text)); } + @Override public String[] getTags() { return null; } + @Override public java.awt.Component getCustomEditor() { return this; } + @Override public boolean supportsCustomEditor() { return true; } + @Override public void addPropertyChangeListener(PropertyChangeListener l) { support.addPropertyChangeListener(l); } + @Override public void removePropertyChangeListener(PropertyChangeListener l) { support.removePropertyChangeListener(l); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/IntegerEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/IntegerEditor.java index 066b7143ac6..65b4d1dcf19 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/IntegerEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/IntegerEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -35,6 +35,7 @@ import java.beans.*; public class IntegerEditor extends NumberEditor { + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Integer.decode(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/LongEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/LongEditor.java index 3a8efbba53c..ed4d12ac505 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/LongEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/LongEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class LongEditor extends NumberEditor { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) @@ -41,6 +42,7 @@ public class LongEditor extends NumberEditor { : "null"; } + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Long.decode(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/NumberEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/NumberEditor.java index 9097546d2e0..3c0c5bb6c9f 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/NumberEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/NumberEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public abstract class NumberEditor extends PropertyEditorSupport { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/ShortEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/ShortEditor.java index cf82eef215d..6be5b14b90f 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/ShortEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/ShortEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -35,6 +35,7 @@ import java.beans.*; public class ShortEditor extends NumberEditor { + @Override public String getJavaInitializationString() { Object value = getValue(); return (value != null) @@ -42,6 +43,7 @@ public class ShortEditor extends NumberEditor { : "null"; } + @Override public void setAsText(String text) throws IllegalArgumentException { setValue((text == null) ? null : Short.decode(text)); } diff --git a/src/java.desktop/share/classes/com/sun/beans/editors/StringEditor.java b/src/java.desktop/share/classes/com/sun/beans/editors/StringEditor.java index 2f1cde46ea0..b064ccbddbb 100644 --- a/src/java.desktop/share/classes/com/sun/beans/editors/StringEditor.java +++ b/src/java.desktop/share/classes/com/sun/beans/editors/StringEditor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -30,6 +30,7 @@ import java.beans.*; public class StringEditor extends PropertyEditorSupport { + @Override public String getJavaInitializationString() { Object value = getValue(); if (value == null) @@ -67,6 +68,7 @@ public class StringEditor extends PropertyEditorSupport { return sb.toString(); } + @Override public void setAsText(String text) { setValue(text); } diff --git a/src/java.desktop/share/classes/com/sun/beans/infos/ComponentBeanInfo.java b/src/java.desktop/share/classes/com/sun/beans/infos/ComponentBeanInfo.java index 1514b005074..39d7cbb2146 100644 --- a/src/java.desktop/share/classes/com/sun/beans/infos/ComponentBeanInfo.java +++ b/src/java.desktop/share/classes/com/sun/beans/infos/ComponentBeanInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -34,6 +34,7 @@ import java.beans.*; public class ComponentBeanInfo extends SimpleBeanInfo { private static final Class beanClass = java.awt.Component.class; + @Override public PropertyDescriptor[] getPropertyDescriptors() { try { PropertyDescriptor diff --git a/src/java.desktop/share/classes/com/sun/beans/util/Cache.java b/src/java.desktop/share/classes/com/sun/beans/util/Cache.java index 2cb21791416..58151e3a56f 100644 --- a/src/java.desktop/share/classes/com/sun/beans/util/Cache.java +++ b/src/java.desktop/share/classes/com/sun/beans/util/Cache.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -405,11 +405,13 @@ public abstract class Cache { */ public static enum Kind { STRONG { + @Override Ref create(Object owner, T value, ReferenceQueue queue) { return new Strong<>(owner, value); } }, SOFT { + @Override Ref create(Object owner, T referent, ReferenceQueue queue) { return (referent == null) ? new Strong<>(owner, referent) @@ -417,6 +419,7 @@ public abstract class Cache { } }, WEAK { + @Override Ref create(Object owner, T referent, ReferenceQueue queue) { return (referent == null) ? new Strong<>(owner, referent) @@ -463,6 +466,7 @@ public abstract class Cache { * * @return the owner of the reference or {@code null} if the owner is unknown */ + @Override public Object getOwner() { return this.owner; } @@ -472,6 +476,7 @@ public abstract class Cache { * * @return the referred object */ + @Override public T getReferent() { return this.referent; } @@ -481,6 +486,7 @@ public abstract class Cache { * * @return {@code true} if the referred object was collected */ + @Override public boolean isStale() { return false; } @@ -488,6 +494,7 @@ public abstract class Cache { /** * Marks this reference as removed from the cache. */ + @Override public void removeOwner() { this.owner = null; } @@ -522,6 +529,7 @@ public abstract class Cache { * * @return the owner of the reference or {@code null} if the owner is unknown */ + @Override public Object getOwner() { return this.owner; } @@ -531,6 +539,7 @@ public abstract class Cache { * * @return the referred object or {@code null} if it was collected */ + @Override public T getReferent() { return get(); } @@ -540,6 +549,7 @@ public abstract class Cache { * * @return {@code true} if the referred object was collected */ + @Override public boolean isStale() { return null == get(); } @@ -547,6 +557,7 @@ public abstract class Cache { /** * Marks this reference as removed from the cache. */ + @Override public void removeOwner() { this.owner = null; } @@ -581,6 +592,7 @@ public abstract class Cache { * * @return the owner of the reference or {@code null} if the owner is unknown */ + @Override public Object getOwner() { return this.owner; } @@ -590,6 +602,7 @@ public abstract class Cache { * * @return the referred object or {@code null} if it was collected */ + @Override public T getReferent() { return get(); } @@ -599,6 +612,7 @@ public abstract class Cache { * * @return {@code true} if the referred object was collected */ + @Override public boolean isStale() { return null == get(); } @@ -606,6 +620,7 @@ public abstract class Cache { /** * Marks this reference as removed from the cache. */ + @Override public void removeOwner() { this.owner = null; } From bfc1db7ed6bf9563c0441b24abe6943607b532e7 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Mon, 27 Oct 2025 05:17:43 +0000 Subject: [PATCH 295/561] 8370560: Remove non-public API reference from public API javadoc Reviewed-by: prr --- src/java.desktop/share/classes/java/awt/Component.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.desktop/share/classes/java/awt/Component.java b/src/java.desktop/share/classes/java/awt/Component.java index e78cab2a14c..e48255aaf00 100644 --- a/src/java.desktop/share/classes/java/awt/Component.java +++ b/src/java.desktop/share/classes/java/awt/Component.java @@ -6287,7 +6287,7 @@ public abstract class Component implements ImageObserver, MenuContainer, * and paint (and update) events. * For mouse move events the last event is always returned, causing * intermediate moves to be discarded. For paint events, the new - * event is coalesced into a complex {@code RepaintArea} in the peer. + * event is coalesced into a complex repaint area in the peer. * The new {@code AWTEvent} is always returned. * * @param existingEvent the event already on the {@code EventQueue} From 3d2ce8045f9ea52c6559638f9cc7e0a0544b4540 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Mon, 27 Oct 2025 06:53:08 +0000 Subject: [PATCH 296/561] 8212084: G1: Implement UseGCOverheadLimit Reviewed-by: ayang, iwalulya, fandreuzzi --- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 110 ++++++++++++++---- src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 11 ++ .../share/gc/parallel/parallelArguments.cpp | 5 - .../gc/parallel/parallelScavengeHeap.cpp | 9 +- .../gc/parallel/parallelScavengeHeap.hpp | 2 +- src/hotspot/share/gc/shared/gc_globals.hpp | 2 +- .../jtreg/gc/TestUseGCOverheadLimit.java | 98 ++++++++++++++++ 7 files changed, 204 insertions(+), 33 deletions(-) create mode 100644 test/hotspot/jtreg/gc/TestUseGCOverheadLimit.java diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index d3e02df3e09..d37ae512023 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -467,8 +467,20 @@ HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_ log_trace(gc, alloc)("%s: Unsuccessfully scheduled collection allocating %zu words", Thread::current()->name(), word_size); + if (is_shutting_down()) { + stall_for_vm_shutdown(); + return nullptr; + } + + // Has the gc overhead limit been reached in the meantime? If so, this mutator + // should receive null even when unsuccessfully scheduling a collection as well + // for global consistency. + if (gc_overhead_limit_exceeded()) { + return nullptr; + } + // We can reach here if we were unsuccessful in scheduling a collection (because - // another thread beat us to it). In this case immeditealy retry the allocation + // another thread beat us to it). In this case immediately retry the allocation // attempt because another thread successfully performed a collection and possibly // reclaimed enough space. The first attempt (without holding the Heap_lock) is // here and the follow-on attempt will be at the start of the next loop @@ -485,11 +497,6 @@ HeapWord* G1CollectedHeap::attempt_allocation_slow(uint node_index, size_t word_ log_warning(gc, alloc)("%s: Retried allocation %u times for %zu words", Thread::current()->name(), try_count, word_size); } - - if (is_shutting_down()) { - stall_for_vm_shutdown(); - return nullptr; - } } ShouldNotReachHere(); @@ -714,6 +721,18 @@ HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size) { log_trace(gc, alloc)("%s: Unsuccessfully scheduled collection allocating %zu", Thread::current()->name(), word_size); + if (is_shutting_down()) { + stall_for_vm_shutdown(); + return nullptr; + } + + // Has the gc overhead limit been reached in the meantime? If so, this mutator + // should receive null even when unsuccessfully scheduling a collection as well + // for global consistency. + if (gc_overhead_limit_exceeded()) { + return nullptr; + } + // We can reach here if we were unsuccessful in scheduling a collection (because // another thread beat us to it). // Humongous object allocation always needs a lock, so we wait for the retry @@ -725,11 +744,6 @@ HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size) { log_warning(gc, alloc)("%s: Retried allocation %u times for %zu words", Thread::current()->name(), try_count, word_size); } - - if (is_shutting_down()) { - stall_for_vm_shutdown(); - return nullptr; - } } ShouldNotReachHere(); @@ -955,25 +969,62 @@ void G1CollectedHeap::resize_heap_after_young_collection(size_t allocation_word_ phase_times()->record_resize_heap_time((Ticks::now() - start).seconds() * 1000.0); } +void G1CollectedHeap::update_gc_overhead_counter() { + assert(SafepointSynchronize::is_at_safepoint(), "precondition"); + + if (!UseGCOverheadLimit) { + return; + } + + bool gc_time_over_limit = (_policy->analytics()->long_term_gc_time_ratio() * 100) >= GCTimeLimit; + double free_space_percent = percent_of(num_available_regions() * G1HeapRegion::GrainBytes, max_capacity()); + bool free_space_below_limit = free_space_percent < GCHeapFreeLimit; + + log_debug(gc)("GC Overhead Limit: GC Time %f Free Space %f Counter %zu", + (_policy->analytics()->long_term_gc_time_ratio() * 100), + free_space_percent, + _gc_overhead_counter); + + if (gc_time_over_limit && free_space_below_limit) { + _gc_overhead_counter++; + } else { + _gc_overhead_counter = 0; + } +} + +bool G1CollectedHeap::gc_overhead_limit_exceeded() { + return _gc_overhead_counter >= GCOverheadLimitThreshold; +} + HeapWord* G1CollectedHeap::satisfy_failed_allocation_helper(size_t word_size, bool do_gc, bool maximal_compaction, bool expect_null_mutator_alloc_region) { - // Let's attempt the allocation first. - HeapWord* result = - attempt_allocation_at_safepoint(word_size, - expect_null_mutator_alloc_region); - if (result != nullptr) { - return result; - } + // Skip allocation if GC overhead limit has been exceeded to let the mutator run + // into an OOME. It can either exit "gracefully" or try to free up memory asap. + // For the latter situation, keep running GCs. If the mutator frees up enough + // memory quickly enough, the overhead(s) will go below the threshold(s) again + // and the VM may continue running. + // If we did not continue garbage collections, the (gc overhead) limit may decrease + // enough by itself to not count as exceeding the limit any more, in the worst + // case bouncing back-and-forth all the time. + if (!gc_overhead_limit_exceeded()) { + // Let's attempt the allocation first. + HeapWord* result = + attempt_allocation_at_safepoint(word_size, + expect_null_mutator_alloc_region); + if (result != nullptr) { + return result; + } - // In a G1 heap, we're supposed to keep allocation from failing by - // incremental pauses. Therefore, at least for now, we'll favor - // expansion over collection. (This might change in the future if we can - // do something smarter than full collection to satisfy a failed alloc.) - result = expand_and_allocate(word_size); - if (result != nullptr) { - return result; + // In a G1 heap, we're supposed to keep allocation from failing by + // incremental pauses. Therefore, at least for now, we'll favor + // expansion over collection. (This might change in the future if we can + // do something smarter than full collection to satisfy a failed alloc.) + result = expand_and_allocate(word_size); + if (result != nullptr) { + return result; + } } if (do_gc) { @@ -997,6 +1048,10 @@ HeapWord* G1CollectedHeap::satisfy_failed_allocation_helper(size_t word_size, HeapWord* G1CollectedHeap::satisfy_failed_allocation(size_t word_size) { assert_at_safepoint_on_vm_thread(); + // Update GC overhead limits after the initial garbage collection leading to this + // allocation attempt. + update_gc_overhead_counter(); + // Attempts to allocate followed by Full GC. HeapWord* result = satisfy_failed_allocation_helper(word_size, @@ -1028,6 +1083,10 @@ HeapWord* G1CollectedHeap::satisfy_failed_allocation(size_t word_size) { return result; } + if (gc_overhead_limit_exceeded()) { + log_info(gc)("GC Overhead Limit exceeded too often (%zu).", GCOverheadLimitThreshold); + } + // What else? We might try synchronous finalization later. If the total // space available is large enough for the allocation, then a more // complete compaction phase than we've tried so far might be @@ -1209,6 +1268,7 @@ public: G1CollectedHeap::G1CollectedHeap() : CollectedHeap(), + _gc_overhead_counter(0), _service_thread(nullptr), _periodic_gc_task(nullptr), _free_arena_memory_task(nullptr), diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index 0d354525d89..c5b7da613d0 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -169,6 +169,17 @@ class G1CollectedHeap : public CollectedHeap { friend class G1CheckRegionAttrTableClosure; private: + // GC Overhead Limit functionality related members. + // + // The goal is to return null for allocations prematurely (before really going + // OOME) in case both GC CPU usage (>= GCTimeLimit) and not much available free + // memory (<= GCHeapFreeLimit) so that applications can exit gracefully or try + // to keep running by easing off memory. + uintx _gc_overhead_counter; // The number of consecutive garbage collections we were over the limits. + + void update_gc_overhead_counter(); + bool gc_overhead_limit_exceeded(); + G1ServiceThread* _service_thread; G1ServiceTask* _periodic_gc_task; G1MonotonicArenaFreeMemoryTask* _free_arena_memory_task; diff --git a/src/hotspot/share/gc/parallel/parallelArguments.cpp b/src/hotspot/share/gc/parallel/parallelArguments.cpp index 2d267951f79..629690a6258 100644 --- a/src/hotspot/share/gc/parallel/parallelArguments.cpp +++ b/src/hotspot/share/gc/parallel/parallelArguments.cpp @@ -66,11 +66,6 @@ void ParallelArguments::initialize() { } } - // True in product build, since tests using debug build often stress GC - if (FLAG_IS_DEFAULT(UseGCOverheadLimit)) { - FLAG_SET_DEFAULT(UseGCOverheadLimit, trueInProduct); - } - if (InitialSurvivorRatio < MinSurvivorRatio) { if (FLAG_IS_CMDLINE(InitialSurvivorRatio)) { if (FLAG_IS_CMDLINE(MinSurvivorRatio)) { diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index eef9dfbc97c..f1baa4c4ff7 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -374,6 +374,13 @@ bool ParallelScavengeHeap::check_gc_overhead_limit() { bool little_mutator_time = _size_policy->mutator_time_percent() * 100 < (100 - GCTimeLimit); bool little_free_space = check_gc_heap_free_limit(_young_gen->free_in_bytes(), _young_gen->capacity_in_bytes()) && check_gc_heap_free_limit( _old_gen->free_in_bytes(), _old_gen->capacity_in_bytes()); + + log_debug(gc)("GC Overhead Limit: GC Time %f Free Space Young %f Old %f Counter %zu", + (100 - _size_policy->mutator_time_percent()), + percent_of(_young_gen->free_in_bytes(), _young_gen->capacity_in_bytes()), + percent_of(_old_gen->free_in_bytes(), _young_gen->capacity_in_bytes()), + _gc_overhead_counter); + if (little_mutator_time && little_free_space) { _gc_overhead_counter++; if (_gc_overhead_counter >= GCOverheadLimitThreshold) { @@ -426,7 +433,7 @@ HeapWord* ParallelScavengeHeap::satisfy_failed_allocation(size_t size, bool is_t } if (check_gc_overhead_limit()) { - log_info(gc)("GCOverheadLimitThreshold %zu reached.", GCOverheadLimitThreshold); + log_info(gc)("GC Overhead Limit exceeded too often (%zu).", GCOverheadLimitThreshold); return nullptr; } diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp index 84732a86880..962a3c4b15b 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.hpp @@ -88,7 +88,7 @@ class ParallelScavengeHeap : public CollectedHeap { WorkerThreads _workers; - uint _gc_overhead_counter; + uintx _gc_overhead_counter; bool _is_heap_almost_full; diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 956bffde156..6f754dbc39d 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -357,7 +357,7 @@ "Initial ratio of young generation/survivor space size") \ range(3, max_uintx) \ \ - product(bool, UseGCOverheadLimit, true, \ + product(bool, UseGCOverheadLimit, falseInDebug, \ "Use policy to limit of proportion of time spent in GC " \ "before an OutOfMemory error is thrown") \ \ diff --git a/test/hotspot/jtreg/gc/TestUseGCOverheadLimit.java b/test/hotspot/jtreg/gc/TestUseGCOverheadLimit.java new file mode 100644 index 00000000000..bc4c6bd6278 --- /dev/null +++ b/test/hotspot/jtreg/gc/TestUseGCOverheadLimit.java @@ -0,0 +1,98 @@ +/* + * 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. + * + * 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 gc; + +/* + * @test id=Parallel + * @requires vm.gc.Parallel + * @requires !vm.debug + * @summary Verifies that the UseGCOverheadLimit functionality works in Parallel GC. + * @library /test/lib + * @run driver gc.TestUseGCOverheadLimit Parallel + */ + +/* + * @test id=G1 + * @requires vm.gc.G1 + * @requires !vm.debug + * @summary Verifies that the UseGCOverheadLimit functionality works in G1 GC. + * @library /test/lib + * @run driver gc.TestUseGCOverheadLimit G1 + */ + +import java.util.Arrays; +import java.util.stream.Stream; + +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; + +public class TestUseGCOverheadLimit { + public static void main(String args[]) throws Exception { + String[] parallelArgs = { + "-XX:+UseParallelGC", + "-XX:NewSize=122m", + "-XX:SurvivorRatio=99", + "-XX:GCHeapFreeLimit=10" + }; + String[] g1Args = { + "-XX:+UseG1GC", + "-XX:GCHeapFreeLimit=5" + }; + + String[] selectedArgs = args[0].equals("G1") ? g1Args : parallelArgs; + + final String[] commonArgs = { + "-XX:-UseCompactObjectHeaders", // Object sizes are calculated such that the heap is tight. + "-XX:ParallelGCThreads=1", // Make GCs take longer. + "-XX:+UseGCOverheadLimit", + "-Xlog:gc=debug", + "-XX:GCTimeLimit=90", // Ease the CPU requirement a little. + "-Xmx128m", + Allocating.class.getName() + }; + + String[] vmArgs = Stream.concat(Arrays.stream(selectedArgs), Arrays.stream(commonArgs)).toArray(String[]::new); + OutputAnalyzer output = ProcessTools.executeLimitedTestJava(vmArgs); + output.shouldNotHaveExitValue(0); + + System.out.println(output.getStdout()); + + output.stdoutShouldContain("GC Overhead Limit exceeded too often (5)."); + } + + static class Allocating { + public static void main(String[] args) { + Object[] cache = new Object[1024 * 1024 * 2]; + + // Allocate random objects, keeping around data, causing garbage + // collections. + for (int i = 0; i < 1024* 1024 * 30; i++) { + Object[] obj = new Object[10]; + cache[i % cache.length] = obj; + } + + System.out.println(cache); + } + } +} From f5ef01d4bfcf960b6a46844818138ee798532d45 Mon Sep 17 00:00:00 2001 From: Sergey Bylokhov Date: Mon, 27 Oct 2025 07:38:28 +0000 Subject: [PATCH 297/561] 8370368: Apply java.io.Serial annotations in java.security.jgss Reviewed-by: mullan --- .../classes/sun/security/jgss/krb5/Krb5Context.java | 6 ++++-- .../sun/security/jgss/krb5/Krb5InitCredential.java | 2 +- .../share/classes/sun/security/krb5/Asn1Exception.java | 3 +++ .../classes/sun/security/krb5/KrbCryptoException.java | 3 +++ .../share/classes/sun/security/krb5/KrbException.java | 4 +++- .../share/classes/sun/security/krb5/RealmException.java | 5 ++++- .../classes/sun/security/krb5/internal/KRBError.java | 9 ++++++--- .../sun/security/krb5/internal/KdcErrException.java | 5 ++++- .../sun/security/krb5/internal/KrbApErrException.java | 5 ++++- .../sun/security/krb5/internal/KrbErrException.java | 3 +++ .../classes/sun/security/krb5/internal/tools/Ktab.java | 5 +++-- 11 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java index 7df3d8d2de0..b118c9ee215 100644 --- a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java +++ b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,7 @@ import java.io.InvalidObjectException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.OutputStream; +import java.io.Serial; import java.security.*; import javax.security.auth.Subject; import javax.security.auth.kerberos.KerberosCredMessage; @@ -1332,6 +1333,7 @@ class Krb5Context implements GSSContextSpi { * The session key returned by inquireSecContext(KRB5_INQ_SSPI_SESSION_KEY) */ static class KerberosSessionKey implements Key { + @Serial private static final long serialVersionUID = 699307378954123869L; @SuppressWarnings("serial") // Not statically typed as Serializable @@ -1369,7 +1371,7 @@ class Krb5Context implements GSSContextSpi { * @throws IOException if an I/O error occurs * @throws ClassNotFoundException if a serialized class cannot be loaded */ - @java.io.Serial + @Serial private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { throw new InvalidObjectException diff --git a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java index 29176ba3c2b..7aaa8975185 100644 --- a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java +++ b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java @@ -402,7 +402,7 @@ public class Krb5InitCredential * @throws IOException if an I/O error occurs * @throws ClassNotFoundException if a serialized class cannot be loaded */ - @java.io.Serial + @Serial private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { throw new InvalidObjectException("Krb5InitCredential not deserializable"); diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/Asn1Exception.java b/src/java.security.jgss/share/classes/sun/security/krb5/Asn1Exception.java index 7899a571589..8fe5591ffbc 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/Asn1Exception.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/Asn1Exception.java @@ -30,8 +30,11 @@ package sun.security.krb5; +import java.io.Serial; + public class Asn1Exception extends KrbException { + @Serial private static final long serialVersionUID = 8291288984575084132L; public Asn1Exception(int i) { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/KrbCryptoException.java b/src/java.security.jgss/share/classes/sun/security/krb5/KrbCryptoException.java index eda5fcec397..24cda1849ff 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/KrbCryptoException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/KrbCryptoException.java @@ -30,6 +30,8 @@ package sun.security.krb5; +import java.io.Serial; + /** * KrbCryptoException is a wrapper exception for exceptions thrown by JCE. * @@ -37,6 +39,7 @@ package sun.security.krb5; */ public class KrbCryptoException extends KrbException { + @Serial private static final long serialVersionUID = -1657367919979982250L; public KrbCryptoException(String s) { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java b/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java index 3fae5c7c2c5..434a0b401dd 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -31,6 +31,7 @@ package sun.security.krb5; +import java.io.Serial; import java.util.Objects; import sun.security.krb5.internal.Krb5; @@ -38,6 +39,7 @@ import sun.security.krb5.internal.KRBError; public class KrbException extends Exception { + @Serial private static final long serialVersionUID = -4993302876451928596L; private int returnCode; diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/RealmException.java b/src/java.security.jgss/share/classes/sun/security/krb5/RealmException.java index 124d1b63ed4..461da49c757 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/RealmException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/RealmException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -31,8 +31,11 @@ package sun.security.krb5; +import java.io.Serial; + public class RealmException extends KrbException { + @Serial private static final long serialVersionUID = -9100385213693792864L; public RealmException(int i) { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KRBError.java b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KRBError.java index db6192ce9ee..46c733824c5 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KRBError.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KRBError.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,7 @@ import sun.security.krb5.RealmException; import sun.security.util.*; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.Serial; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -85,7 +86,8 @@ import static sun.security.krb5.internal.Krb5.DEBUG; */ public class KRBError implements java.io.Serializable { - static final long serialVersionUID = 3643809337475284503L; + @Serial + private static final long serialVersionUID = 3643809337475284503L; private transient int pvno; private transient int msgType; @@ -112,7 +114,7 @@ public class KRBError implements java.io.Serializable { * @throws IOException if an I/O error occurs * @throws ClassNotFoundException if a serialized class cannot be loaded */ - @java.io.Serial + @Serial private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException { try { @@ -123,6 +125,7 @@ public class KRBError implements java.io.Serializable { } } + @Serial private void writeObject(ObjectOutputStream os) throws IOException { try { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KdcErrException.java b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KdcErrException.java index c55670f4b23..744ba9ba2ac 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KdcErrException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KdcErrException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -31,8 +31,11 @@ package sun.security.krb5.internal; +import java.io.Serial; + public class KdcErrException extends sun.security.krb5.KrbException { + @Serial private static final long serialVersionUID = -8788186031117310306L; public KdcErrException(int i) { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbApErrException.java b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbApErrException.java index 04048cb73bb..4fd0aec5fa8 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbApErrException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbApErrException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -31,8 +31,11 @@ package sun.security.krb5.internal; +import java.io.Serial; + public class KrbApErrException extends sun.security.krb5.KrbException { + @Serial private static final long serialVersionUID = 7545264413323118315L; public KrbApErrException(int i) { diff --git a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbErrException.java b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbErrException.java index 62e84959ca9..8e5a49dd802 100644 --- a/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbErrException.java +++ b/src/java.security.jgss/share/classes/sun/security/krb5/internal/KrbErrException.java @@ -30,8 +30,11 @@ package sun.security.krb5.internal; +import java.io.Serial; + public class KrbErrException extends sun.security.krb5.KrbException { + @Serial private static final long serialVersionUID = 2186533836785448317L; public KrbErrException(int i) { diff --git a/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Ktab.java b/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Ktab.java index ffe2e3196c1..bf1ceed8d22 100644 --- a/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Ktab.java +++ b/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Ktab.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.Reader; +import java.io.Serial; import java.nio.charset.Charset; import java.text.DateFormat; import java.util.Arrays; @@ -82,8 +83,8 @@ public class Ktab { } private static class ExitException extends RuntimeException { - @java.io.Serial - static final long serialVersionUID = 0L; + @Serial + private static final long serialVersionUID = 0L; private final int errorCode; public ExitException(int errorCode) { this.errorCode = errorCode; From e9479b517ad8b6eac7244057644f90e710bd74b7 Mon Sep 17 00:00:00 2001 From: Raffaello Giulietti Date: Mon, 27 Oct 2025 08:15:00 +0000 Subject: [PATCH 298/561] 8370628: Rename BigInteger::nthRoot to rootn, and similarly for nthRootAndRemainder Reviewed-by: darcy --- .../share/classes/java/math/BigInteger.java | 14 +-- .../classes/java/math/MutableBigInteger.java | 16 ++-- .../java/math/BigInteger/BigIntegerTest.java | 88 +++++++++---------- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/java.base/share/classes/java/math/BigInteger.java b/src/java.base/share/classes/java/math/BigInteger.java index 6253adffb2b..ed26f5c1211 100644 --- a/src/java.base/share/classes/java/math/BigInteger.java +++ b/src/java.base/share/classes/java/math/BigInteger.java @@ -2768,9 +2768,9 @@ public class BigInteger extends Number implements Comparable { * @throws ArithmeticException if {@code n} is even and {@code this} is negative. * @see #sqrt() * @since 26 - * @apiNote Note that calling {@code nthRoot(2)} is equivalent to calling {@code sqrt()}. + * @apiNote Note that calling {@code rootn(2)} is equivalent to calling {@code sqrt()}. */ - public BigInteger nthRoot(int n) { + public BigInteger rootn(int n) { if (n == 1) return this; @@ -2778,7 +2778,7 @@ public class BigInteger extends Number implements Comparable { return sqrt(); checkRootDegree(n); - return new MutableBigInteger(this.mag).nthRootRem(n)[0].toBigInteger(signum); + return new MutableBigInteger(this.mag).rootnRem(n)[0].toBigInteger(signum); } /** @@ -2793,12 +2793,12 @@ public class BigInteger extends Number implements Comparable { * @throws ArithmeticException if {@code n} is even and {@code this} is negative. * @see #sqrt() * @see #sqrtAndRemainder() - * @see #nthRoot(int) + * @see #rootn(int) * @since 26 - * @apiNote Note that calling {@code nthRootAndRemainder(2)} is equivalent to calling + * @apiNote Note that calling {@code rootnAndRemainder(2)} is equivalent to calling * {@code sqrtAndRemainder()}. */ - public BigInteger[] nthRootAndRemainder(int n) { + public BigInteger[] rootnAndRemainder(int n) { if (n == 1) return new BigInteger[] { this, ZERO }; @@ -2806,7 +2806,7 @@ public class BigInteger extends Number implements Comparable { return sqrtAndRemainder(); checkRootDegree(n); - MutableBigInteger[] rootRem = new MutableBigInteger(this.mag).nthRootRem(n); + MutableBigInteger[] rootRem = new MutableBigInteger(this.mag).rootnRem(n); return new BigInteger[] { rootRem[0].toBigInteger(signum), rootRem[1].toBigInteger(signum) diff --git a/src/java.base/share/classes/java/math/MutableBigInteger.java b/src/java.base/share/classes/java/math/MutableBigInteger.java index dd1da29ddd2..1ede4cf32f8 100644 --- a/src/java.base/share/classes/java/math/MutableBigInteger.java +++ b/src/java.base/share/classes/java/math/MutableBigInteger.java @@ -1906,7 +1906,7 @@ class MutableBigInteger { * @param n the root degree * @return the integer {@code n}th root of {@code this} and the remainder */ - MutableBigInteger[] nthRootRem(int n) { + MutableBigInteger[] rootnRem(int n) { // Special cases. if (this.isZero() || this.isOne()) return new MutableBigInteger[] { this, new MutableBigInteger() }; @@ -1923,7 +1923,7 @@ class MutableBigInteger { if (bitLength <= Long.SIZE) { // Initial estimate is the root of the unsigned long value. final long x = this.toLong(); - long sLong = (long) nthRootApprox(Math.nextUp(x >= 0 ? x : x + 0x1p64), n) + 1L; + long sLong = (long) rootnApprox(Math.nextUp(x >= 0 ? x : x + 0x1p64), n) + 1L; /* The integer-valued recurrence formula in the algorithm of Brent&Zimmermann * simply discards the fraction part of the real-valued Newton recurrence * on the function f discussed in the referenced work. @@ -1996,7 +1996,7 @@ class MutableBigInteger { // Use the root of the shifted value as an estimate. // rad ≤ 2^ME, so Math.nextUp(rad) < Double.MAX_VALUE rad = Math.nextUp(rad); - approx = nthRootApprox(rad, n); + approx = rootnApprox(rad, n); } else { // fp arithmetic gives too few correct bits // Set the root shift to the root's bit length minus 1 // The initial estimate will be 2^rootLen == 2 << (rootLen - 1) @@ -2050,7 +2050,7 @@ class MutableBigInteger { MutableBigInteger x = new MutableBigInteger(this); x.rightShift(rootSh * n); - newtonRecurrenceNthRoot(x, s, n, s.toBigInteger().pow(n - 1)); + newtonRecurrenceRootn(x, s, n, s.toBigInteger().pow(n - 1)); s.add(ONE); // round up to ensure s is an upper bound of the root } @@ -2060,7 +2060,7 @@ class MutableBigInteger { } // Do the 1st iteration outside the loop to ensure an overestimate - newtonRecurrenceNthRoot(this, s, n, s.toBigInteger().pow(n - 1)); + newtonRecurrenceRootn(this, s, n, s.toBigInteger().pow(n - 1)); // Refine the estimate. do { BigInteger sBig = s.toBigInteger(); @@ -2069,18 +2069,18 @@ class MutableBigInteger { if (rem.subtract(this) <= 0) return new MutableBigInteger[] { s, rem }; - newtonRecurrenceNthRoot(this, s, n, sToN1); + newtonRecurrenceRootn(this, s, n, sToN1); } while (true); } - private static double nthRootApprox(double x, int n) { + private static double rootnApprox(double x, int n) { return Math.nextUp(n == 3 ? Math.cbrt(x) : Math.pow(x, Math.nextUp(1.0 / n))); } /** * Computes {@code ((n-1)*s + x/sToN1)/n} and places the result in {@code s}. */ - private static void newtonRecurrenceNthRoot( + private static void newtonRecurrenceRootn( MutableBigInteger x, MutableBigInteger s, int n, BigInteger sToN1) { MutableBigInteger dividend = new MutableBigInteger(); s.mul(n - 1, dividend); diff --git a/test/jdk/java/math/BigInteger/BigIntegerTest.java b/test/jdk/java/math/BigInteger/BigIntegerTest.java index 0e847f5ff6c..84aa8d15676 100644 --- a/test/jdk/java/math/BigInteger/BigIntegerTest.java +++ b/test/jdk/java/math/BigInteger/BigIntegerTest.java @@ -24,7 +24,7 @@ /* * @test * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 - * 8074460 8078672 8032027 8229845 8077587 8367365 + * 8074460 8078672 8032027 8229845 8077587 8367365 8370628 * @summary tests methods in BigInteger (use -Dseed=X to set PRNG seed) * @key randomness * @library /test/lib @@ -232,7 +232,7 @@ public class BigIntegerTest { failCount1++; failCount1 += checkResult(x.signum() < 0 && power % 2 == 0 ? x.negate() : x, - y.nthRoot(power), "BigInteger.pow() inconsistent with BigInteger.nthRoot()"); + y.rootn(power), "BigInteger.pow() inconsistent with BigInteger.rootn()"); } report("pow for " + order + " bits", failCount1); } @@ -414,7 +414,7 @@ public class BigIntegerTest { BigInteger.valueOf(x)).collect(Collectors.summingInt(g))); } - private static void nthRootSmall() { + private static void rootnSmall() { int failCount = 0; // A non-positive degree should cause an exception. @@ -422,10 +422,10 @@ public class BigIntegerTest { BigInteger x = BigInteger.ONE; BigInteger s; try { - s = x.nthRoot(n); - // If nthRoot() does not throw an exception that is a failure. + s = x.rootn(n); + // If rootn() does not throw an exception that is a failure. failCount++; - printErr("nthRoot() of non-positive degree did not throw an exception"); + printErr("rootn() of non-positive degree did not throw an exception"); } catch (ArithmeticException expected) { // Not a failure } @@ -434,41 +434,41 @@ public class BigIntegerTest { n = 4; x = BigInteger.valueOf(-1); try { - s = x.nthRoot(n); - // If nthRoot() does not throw an exception that is a failure. + s = x.rootn(n); + // If rootn() does not throw an exception that is a failure. failCount++; - printErr("nthRoot() of negative number and even degree did not throw an exception"); + printErr("rootn() of negative number and even degree did not throw an exception"); } catch (ArithmeticException expected) { // Not a failure } - // A negative value with odd degree should return -nthRoot(-x, n) + // A negative value with odd degree should return -rootn(-x, n) n = 3; x = BigInteger.valueOf(-8); - failCount += checkResult(x.negate().nthRoot(n).negate(), x.nthRoot(n), - "nthRoot(" + x + ", " + n + ") != -nthRoot(" + x.negate() + ", " + n + ")"); + failCount += checkResult(x.negate().rootn(n).negate(), x.rootn(n), + "rootn(" + x + ", " + n + ") != -rootn(" + x.negate() + ", " + n + ")"); // A zero value should return BigInteger.ZERO. - failCount += checkResult(BigInteger.ZERO, BigInteger.ZERO.nthRoot(n), - "nthRoot(0, " + n + ") != 0"); + failCount += checkResult(BigInteger.ZERO, BigInteger.ZERO.rootn(n), + "rootn(0, " + n + ") != 0"); // A one degree should return x. x = BigInteger.TWO; - failCount += checkResult(x, x.nthRoot(1), "nthRoot(" + x + ", 1) != " + x); + failCount += checkResult(x, x.rootn(1), "rootn(" + x + ", 1) != " + x); n = 8; // 1 <= value < 2^n should return BigInteger.ONE. int end = 1 << n; for (int i = 1; i < end; i++) { failCount += checkResult(BigInteger.ONE, - BigInteger.valueOf(i).nthRoot(n), "nthRoot(" + i + ", " + n + ") != 1"); + BigInteger.valueOf(i).rootn(n), "rootn(" + i + ", " + n + ") != 1"); } - report("nthRootSmall", failCount); + report("rootnSmall", failCount); } - public static void nthRoot() { - nthRootSmall(); + public static void rootn() { + rootnSmall(); ToIntFunction f = (x) -> { int n = random.nextInt(x.bitLength()) + 2; @@ -476,28 +476,28 @@ public class BigIntegerTest { // nth root of x^n -> x BigInteger xN = x.pow(n); - failCount += checkResult(x, xN.nthRoot(n), "nthRoot() x^n -> x"); + failCount += checkResult(x, xN.rootn(n), "rootn() x^n -> x"); // nth root of x^n + 1 -> x BigInteger xNup = xN.add(BigInteger.ONE); - failCount += checkResult(x, xNup.nthRoot(n), "nthRoot() x^n + 1 -> x"); + failCount += checkResult(x, xNup.rootn(n), "rootn() x^n + 1 -> x"); // nth root of (x + 1)^n - 1 -> x BigInteger up = x.add(BigInteger.ONE).pow(n).subtract(BigInteger.ONE); - failCount += checkResult(x, up.nthRoot(n), "nthRoot() (x + 1)^n - 1 -> x"); + failCount += checkResult(x, up.rootn(n), "rootn() (x + 1)^n - 1 -> x"); - // nthRoot(x, n)^n <= x - BigInteger r = x.nthRoot(n); + // rootn(x, n)^n <= x + BigInteger r = x.rootn(n); if (r.pow(n).compareTo(x) > 0) { failCount++; - printErr("nthRoot(x, n)^n > x for x = " + x + ", n = " + n); + printErr("rootn(x, n)^n > x for x = " + x + ", n = " + n); } - // (nthRoot(x, n) + 1)^n > x + // (rootn(x, n) + 1)^n > x if (r.add(BigInteger.ONE).pow(n).compareTo(x) <= 0) { failCount++; - printErr("(nthRoot(x, n) + 1)^n <= x for x = " + x + ", n = " + n); + printErr("(rootn(x, n) + 1)^n <= x for x = " + x + ", n = " + n); } return failCount; @@ -513,52 +513,52 @@ public class BigIntegerTest { } sb.add((new BigDecimal(Double.MAX_VALUE)).toBigInteger()); sb.add((new BigDecimal(Double.MAX_VALUE)).toBigInteger().add(BigInteger.ONE)); - report("nthRoot for 2^N, 2^N - 1 and 2^N + 1, 1 <= N <= " + maxExponent, + report("rootn for 2^N, 2^N - 1 and 2^N + 1, 1 <= N <= " + maxExponent, sb.build().collect(Collectors.summingInt(f))); IntStream ints = random.ints(SIZE, 2, Integer.MAX_VALUE); - report("nthRoot for int", ints.mapToObj(x -> + report("rootn for int", ints.mapToObj(x -> BigInteger.valueOf(x)).collect(Collectors.summingInt(f))); LongStream longs = random.longs(SIZE, Integer.MAX_VALUE + 1L, Long.MAX_VALUE); - report("nthRoot for long", longs.mapToObj(x -> + report("rootn for long", longs.mapToObj(x -> BigInteger.valueOf(x)).collect(Collectors.summingInt(f))); DoubleStream doubles = random.doubles(SIZE, 0x1p63, Math.scalb(1.0, maxExponent)); - report("nthRoot for double", doubles.mapToObj(x -> + report("rootn for double", doubles.mapToObj(x -> BigDecimal.valueOf(x).toBigInteger()).collect(Collectors.summingInt(f))); } - public static void nthRootAndRemainder() { + public static void rootnAndRemainder() { ToIntFunction g = (x) -> { int failCount = 0; int n = random.nextInt(x.bitLength()) + 2; BigInteger xN = x.pow(n); // nth root of x^n -> x - BigInteger[] actual = xN.nthRootAndRemainder(n); - failCount += checkResult(x, actual[0], "nthRootAndRemainder()[0]"); - failCount += checkResult(BigInteger.ZERO, actual[1], "nthRootAndRemainder()[1]"); + BigInteger[] actual = xN.rootnAndRemainder(n); + failCount += checkResult(x, actual[0], "rootnAndRemainder()[0]"); + failCount += checkResult(BigInteger.ZERO, actual[1], "rootnAndRemainder()[1]"); // nth root of x^n + 1 -> x BigInteger xNup = xN.add(BigInteger.ONE); - actual = xNup.nthRootAndRemainder(n); - failCount += checkResult(x, actual[0], "nthRootAndRemainder()[0]"); - failCount += checkResult(BigInteger.ONE, actual[1], "nthRootAndRemainder()[1]"); + actual = xNup.rootnAndRemainder(n); + failCount += checkResult(x, actual[0], "rootnAndRemainder()[0]"); + failCount += checkResult(BigInteger.ONE, actual[1], "rootnAndRemainder()[1]"); // nth root of (x + 1)^n - 1 -> x BigInteger up = x.add(BigInteger.ONE).pow(n).subtract(BigInteger.ONE); - actual = up.nthRootAndRemainder(n); - failCount += checkResult(x, actual[0], "nthRootAndRemainder()[0]"); + actual = up.rootnAndRemainder(n); + failCount += checkResult(x, actual[0], "rootnAndRemainder()[0]"); BigInteger r = up.subtract(xN); - failCount += checkResult(r, actual[1], "nthRootAndRemainder()[1]"); + failCount += checkResult(r, actual[1], "rootnAndRemainder()[1]"); return failCount; }; IntStream bits = random.ints(SIZE, 3, Short.MAX_VALUE); - report("nthRootAndRemainder", bits.mapToObj(x -> + report("rootnAndRemainder", bits.mapToObj(x -> BigInteger.valueOf(x)).collect(Collectors.summingInt(g))); } @@ -1472,8 +1472,8 @@ public class BigIntegerTest { squareRoot(); squareRootAndRemainder(); - nthRoot(); - nthRootAndRemainder(); + rootn(); + rootnAndRemainder(); } if (failure) From 91e1dcb1083cc8c451d2d169d7f2fdb51c1a158e Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Mon, 27 Oct 2025 10:07:55 +0000 Subject: [PATCH 299/561] 8366781: Parallel: Include OS free memory in GC selection heuristics Reviewed-by: gli, iwalulya --- src/hotspot/share/gc/parallel/psScavenge.cpp | 47 +++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/gc/parallel/psScavenge.cpp b/src/hotspot/share/gc/parallel/psScavenge.cpp index f633f40ef7f..e738a13d464 100644 --- a/src/hotspot/share/gc/parallel/psScavenge.cpp +++ b/src/hotspot/share/gc/parallel/psScavenge.cpp @@ -521,31 +521,56 @@ void PSScavenge::clean_up_failed_promotion() { } bool PSScavenge::should_attempt_scavenge() { - ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); + const bool ShouldRunYoungGC = true; + const bool ShouldRunFullGC = false; + ParallelScavengeHeap* heap = ParallelScavengeHeap::heap(); PSYoungGen* young_gen = heap->young_gen(); PSOldGen* old_gen = heap->old_gen(); if (!young_gen->to_space()->is_empty()) { - log_debug(gc, ergo)("To-space is not empty; should run full-gc instead."); - return false; + log_debug(gc, ergo)("To-space is not empty; run full-gc instead."); + return ShouldRunFullGC; } - // Test to see if the scavenge will likely fail. + // Check if the predicted promoted bytes will overflow free space in old-gen. PSAdaptiveSizePolicy* policy = heap->size_policy(); size_t avg_promoted = (size_t) policy->padded_average_promoted_in_bytes(); size_t promotion_estimate = MIN2(avg_promoted, young_gen->used_in_bytes()); // Total free size after possible old gen expansion - size_t free_in_old_gen = old_gen->max_gen_size() - old_gen->used_in_bytes(); - bool result = promotion_estimate < free_in_old_gen; + size_t free_in_old_gen_with_expansion = old_gen->max_gen_size() - old_gen->used_in_bytes(); - log_trace(gc, ergo)("%s scavenge: average_promoted %zu padded_average_promoted %zu free in old gen %zu", - result ? "Do" : "Skip", (size_t) policy->average_promoted_in_bytes(), - (size_t) policy->padded_average_promoted_in_bytes(), - free_in_old_gen); + log_trace(gc, ergo)("average_promoted %zu; padded_average_promoted %zu", + (size_t) policy->average_promoted_in_bytes(), + (size_t) policy->padded_average_promoted_in_bytes()); - return result; + if (promotion_estimate >= free_in_old_gen_with_expansion) { + log_debug(gc, ergo)("Run full-gc; predicted promotion size >= max free space in old-gen: %zu >= %zu", + promotion_estimate, free_in_old_gen_with_expansion); + return ShouldRunFullGC; + } + + if (UseAdaptiveSizePolicy) { + // Also checking OS has enough free memory to commit and expand old-gen. + // Otherwise, the recorded gc-pause-time might be inflated to include time + // of OS preparing free memory, resulting in inaccurate young-gen resizing. + assert(old_gen->committed().byte_size() >= old_gen->used_in_bytes(), "inv"); + // Use uint64_t instead of size_t for 32bit compatibility. + uint64_t free_mem_in_os; + if (os::free_memory(free_mem_in_os)) { + size_t actual_free = (size_t)MIN2(old_gen->committed().byte_size() - old_gen->used_in_bytes() + free_mem_in_os, + (uint64_t)SIZE_MAX); + if (promotion_estimate > actual_free) { + log_debug(gc, ergo)("Run full-gc; predicted promotion size > free space in old-gen and OS: %zu > %zu", + promotion_estimate, actual_free); + return ShouldRunFullGC; + } + } + } + + // No particular reasons to run full-gc, so young-gc. + return ShouldRunYoungGC; } // Adaptive size policy support. From 6f8d07ae21e49f87f64a5d4e10c930c4447ec8b6 Mon Sep 17 00:00:00 2001 From: Johny Jose Date: Mon, 27 Oct 2025 10:23:48 +0000 Subject: [PATCH 300/561] 8368500: ContextClassLoader cannot be reset on threads in ForkJoinPool.commonPool() Reviewed-by: vklang, alanb --- .../util/concurrent/ForkJoinWorkerThread.java | 6 +- .../forkjoin/ContextClassLoaderTest.java | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 test/jdk/java/util/concurrent/forkjoin/ContextClassLoaderTest.java diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java index b942d3ecd09..566fc417952 100644 --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java @@ -267,10 +267,8 @@ public class ForkJoinWorkerThread extends Thread { @Override // to record changes public void setContextClassLoader(ClassLoader cl) { - if (ClassLoader.getSystemClassLoader() != cl) { - resetCCL = true; - super.setContextClassLoader(cl); - } + resetCCL = ClassLoader.getSystemClassLoader() != cl; + super.setContextClassLoader(cl); } @Override // to re-establish CCL if necessary diff --git a/test/jdk/java/util/concurrent/forkjoin/ContextClassLoaderTest.java b/test/jdk/java/util/concurrent/forkjoin/ContextClassLoaderTest.java new file mode 100644 index 00000000000..eb6465e9619 --- /dev/null +++ b/test/jdk/java/util/concurrent/forkjoin/ContextClassLoaderTest.java @@ -0,0 +1,56 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8368500 + * @run junit/othervm ContextClassLoaderTest + * @summary Check the context classloader is reset + */ +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.Future; +import java.util.concurrent.ForkJoinPool; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class ContextClassLoaderTest { + + @Test + void testContextClassLoaderIsSetAndRestored() throws Exception { + Future future = ForkJoinPool.commonPool().submit(() -> { + Thread thread = Thread.currentThread(); + ClassLoader originalCCL = thread.getContextClassLoader(); + ClassLoader customCCL = new URLClassLoader(new URL[0], originalCCL); + // Set custom context classloader and verify it + thread.setContextClassLoader(customCCL); + assertSame(customCCL, thread.getContextClassLoader(), "Custom context class loader not set"); + + // Reset to original and verify restoration + thread.setContextClassLoader(originalCCL); + assertSame(originalCCL, thread.getContextClassLoader(), "Original context class loader not restored"); + }); + future.get(); + } +} + From 7bb490c4bf7ae55547e4468da0795dac0a873d2b Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Mon, 27 Oct 2025 10:35:02 +0000 Subject: [PATCH 301/561] 8370318: AES-GCM vector intrinsic may read out of bounds (x86_64, AVX-512) Reviewed-by: kvn, roland --- src/hotspot/cpu/x86/stubGenerator_x86_64.hpp | 2 ++ .../cpu/x86/stubGenerator_x86_64_aes.cpp | 20 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp index 44d13bbbf31..0887225d3e8 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp @@ -393,6 +393,8 @@ class StubGenerator: public StubCodeGenerator { XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, XMMRegister xmm8); void ghash_last_8_avx2(Register subkeyHtbl); + void check_key_offset(Register key, int offset, int load_size); + // Load key and shuffle operation void ev_load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask); void ev_load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch); diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64_aes.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64_aes.cpp index 6f698b954ad..f0726ded7e5 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64_aes.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64_aes.cpp @@ -1759,25 +1759,43 @@ void StubGenerator::roundDeclast(XMMRegister xmm_reg) { __ vaesdeclast(xmm8, xmm8, xmm_reg, Assembler::AVX_512bit); } +// Check incoming byte offset against the int[] len. key is the pointer to the int[0]. +// This check happens often, so it is important for it to be very compact. +void StubGenerator::check_key_offset(Register key, int offset, int load_size) { +#ifdef ASSERT + Address key_length(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)); + assert((offset + load_size) % 4 == 0, "Alignment is good: %d + %d", offset, load_size); + int end_offset = (offset + load_size) / 4; + Label L_good; + __ cmpl(key_length, end_offset); + __ jccb(Assembler::greaterEqual, L_good); + __ hlt(); + __ bind(L_good); +#endif +} // Utility routine for loading a 128-bit key word in little endian format void StubGenerator::load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) { + check_key_offset(key, offset, 16); __ movdqu(xmmdst, Address(key, offset)); __ pshufb(xmmdst, xmm_shuf_mask); } void StubGenerator::load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch) { + check_key_offset(key, offset, 16); __ movdqu(xmmdst, Address(key, offset)); __ pshufb(xmmdst, ExternalAddress(key_shuffle_mask_addr()), rscratch); } void StubGenerator::ev_load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) { + check_key_offset(key, offset, 16); __ movdqu(xmmdst, Address(key, offset)); __ pshufb(xmmdst, xmm_shuf_mask); __ evshufi64x2(xmmdst, xmmdst, xmmdst, 0x0, Assembler::AVX_512bit); } void StubGenerator::ev_load_key(XMMRegister xmmdst, Register key, int offset, Register rscratch) { + check_key_offset(key, offset, 16); __ movdqu(xmmdst, Address(key, offset)); __ pshufb(xmmdst, ExternalAddress(key_shuffle_mask_addr()), rscratch); __ evshufi64x2(xmmdst, xmmdst, xmmdst, 0x0, Assembler::AVX_512bit); @@ -3205,12 +3223,12 @@ void StubGenerator::ghash16_encrypt_parallel16_avx512(Register in, Register out, //AES round 9 roundEncode(AESKEY2, B00_03, B04_07, B08_11, B12_15); - ev_load_key(AESKEY2, key, 11 * 16, rbx); //AES rounds up to 11 (AES192) or 13 (AES256) //AES128 is done __ cmpl(NROUNDS, 52); __ jcc(Assembler::less, last_aes_rnd); __ bind(aes_192); + ev_load_key(AESKEY2, key, 11 * 16, rbx); roundEncode(AESKEY1, B00_03, B04_07, B08_11, B12_15); ev_load_key(AESKEY1, key, 12 * 16, rbx); roundEncode(AESKEY2, B00_03, B04_07, B08_11, B12_15); From 5ed6c201ba0a9dc78960f2f3a5afce268e84a82d Mon Sep 17 00:00:00 2001 From: Johannes Bechberger Date: Mon, 27 Oct 2025 12:29:22 +0000 Subject: [PATCH 302/561] 8370681: [BACKOUT] Improve memory ordering in new CPU Time Profiler Reviewed-by: mdoerr --- .../sampling/jfrCPUTimeThreadSampler.cpp | 38 +++++++++++-------- .../sampling/jfrCPUTimeThreadSampler.hpp | 20 ++++------ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp index 031dfb7e8ad..7507b9c994e 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.cpp @@ -82,7 +82,14 @@ JfrCPUTimeTraceQueue::~JfrCPUTimeTraceQueue() { bool JfrCPUTimeTraceQueue::enqueue(JfrCPUTimeSampleRequest& request) { assert(JavaThread::current()->jfr_thread_local()->is_cpu_time_jfr_enqueue_locked(), "invariant"); assert(&JavaThread::current()->jfr_thread_local()->cpu_time_jfr_queue() == this, "invariant"); - _data[_head++] = request; + u4 elementIndex; + do { + elementIndex = AtomicAccess::load_acquire(&_head); + if (elementIndex >= _capacity) { + return false; + } + } while (AtomicAccess::cmpxchg(&_head, elementIndex, elementIndex + 1) != elementIndex); + _data[elementIndex] = request; return true; } @@ -94,19 +101,19 @@ JfrCPUTimeSampleRequest& JfrCPUTimeTraceQueue::at(u4 index) { static volatile u4 _lost_samples_sum = 0; u4 JfrCPUTimeTraceQueue::size() const { - return _head; + return AtomicAccess::load_acquire(&_head); } void JfrCPUTimeTraceQueue::set_size(u4 size) { - _head = size; + AtomicAccess::release_store(&_head, size); } u4 JfrCPUTimeTraceQueue::capacity() const { - return _capacity; + return AtomicAccess::load_acquire(&_capacity); } void JfrCPUTimeTraceQueue::set_capacity(u4 capacity) { - if (capacity == _capacity) { + if (capacity == AtomicAccess::load(&_capacity)) { return; } _head = 0; @@ -119,15 +126,15 @@ void JfrCPUTimeTraceQueue::set_capacity(u4 capacity) { } else { _data = nullptr; } - _capacity = capacity; + AtomicAccess::release_store(&_capacity, capacity); } bool JfrCPUTimeTraceQueue::is_empty() const { - return _head == 0; + return AtomicAccess::load_acquire(&_head) == 0; } u4 JfrCPUTimeTraceQueue::lost_samples() const { - return _lost_samples; + return AtomicAccess::load(&_lost_samples); } void JfrCPUTimeTraceQueue::increment_lost_samples() { @@ -136,7 +143,7 @@ void JfrCPUTimeTraceQueue::increment_lost_samples() { } void JfrCPUTimeTraceQueue::increment_lost_samples_due_to_queue_full() { - _lost_samples_due_to_queue_full++; + AtomicAccess::inc(&_lost_samples_due_to_queue_full); } u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples() { @@ -144,9 +151,7 @@ u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples() { } u4 JfrCPUTimeTraceQueue::get_and_reset_lost_samples_due_to_queue_full() { - u4 lost = _lost_samples_due_to_queue_full; - _lost_samples_due_to_queue_full = 0; - return lost; + return AtomicAccess::xchg(&_lost_samples_due_to_queue_full, (u4)0); } void JfrCPUTimeTraceQueue::init() { @@ -154,7 +159,7 @@ void JfrCPUTimeTraceQueue::init() { } void JfrCPUTimeTraceQueue::clear() { - _head = 0; + AtomicAccess::release_store(&_head, (u4)0); } void JfrCPUTimeTraceQueue::resize_if_needed() { @@ -162,8 +167,9 @@ void JfrCPUTimeTraceQueue::resize_if_needed() { if (lost_samples_due_to_queue_full == 0) { return; } - if (_capacity < CPU_TIME_QUEUE_MAX_CAPACITY) { - float ratio = (float)lost_samples_due_to_queue_full / (float)_capacity; + u4 capacity = AtomicAccess::load(&_capacity); + if (capacity < CPU_TIME_QUEUE_MAX_CAPACITY) { + float ratio = (float)lost_samples_due_to_queue_full / (float)capacity; int factor = 1; if (ratio > 8) { // idea is to quickly scale the queue in the worst case factor = ratio; @@ -175,7 +181,7 @@ void JfrCPUTimeTraceQueue::resize_if_needed() { factor = 2; } if (factor > 1) { - u4 new_capacity = MIN2(CPU_TIME_QUEUE_MAX_CAPACITY, _capacity * factor); + u4 new_capacity = MIN2(CPU_TIME_QUEUE_MAX_CAPACITY, capacity * factor); set_capacity(new_capacity); } } diff --git a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp index 48fe28d22f0..e7c915fc8be 100644 --- a/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp +++ b/src/hotspot/share/jfr/periodic/sampling/jfrCPUTimeThreadSampler.hpp @@ -43,24 +43,19 @@ struct JfrCPUTimeSampleRequest { // Fixed size async-signal-safe SPSC linear queue backed by an array. // Designed to be only used under lock and read linearly -// The lock in question is the tri-state CPU time JFR lock in JfrThreadLocal -// This allows us to skip most of the atomic accesses and memory barriers, -// holding a lock acts as a memory barrier -// Only the _lost_samples property is atomic, as it can be accessed even after -// acquiring the lock failed. -// Important to note is that the queue is also only accessed under lock in signal -// handlers. class JfrCPUTimeTraceQueue { + // the default queue capacity, scaled if the sampling period is smaller than 10ms + // when the thread is started + static const u4 CPU_TIME_QUEUE_CAPACITY = 500; + JfrCPUTimeSampleRequest* _data; - u4 _capacity; + volatile u4 _capacity; // next unfilled index - u4 _head; + volatile u4 _head; - // the only property accessible without a lock volatile u4 _lost_samples; - - u4 _lost_samples_due_to_queue_full; + volatile u4 _lost_samples_due_to_queue_full; static const u4 CPU_TIME_QUEUE_INITIAL_CAPACITY = 20; static const u4 CPU_TIME_QUEUE_MAX_CAPACITY = 2000; @@ -87,7 +82,6 @@ public: u4 lost_samples() const; - // the only method callable without holding a lock void increment_lost_samples(); void increment_lost_samples_due_to_queue_full(); From 1e49376ece39e8f9b5c72b58688b1e195a0014be Mon Sep 17 00:00:00 2001 From: Igor Veresov Date: Mon, 27 Oct 2025 15:09:59 +0000 Subject: [PATCH 303/561] 8368321: Rethink compilation delay strategy for lukewarm methods Reviewed-by: kvn, vlivanov --- .../share/compiler/compilationPolicy.cpp | 65 ++++++++++++------- .../share/compiler/compilationPolicy.hpp | 9 +-- .../share/compiler/compiler_globals.hpp | 7 -- src/hotspot/share/oops/trainingData.cpp | 3 + src/hotspot/share/oops/trainingData.hpp | 7 ++ 5 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/hotspot/share/compiler/compilationPolicy.cpp b/src/hotspot/share/compiler/compilationPolicy.cpp index 177fd04fbbc..1cc44602186 100644 --- a/src/hotspot/share/compiler/compilationPolicy.cpp +++ b/src/hotspot/share/compiler/compilationPolicy.cpp @@ -423,13 +423,16 @@ void CompilationPolicy::print_counters_on(outputStream* st, const char* prefix, st->print(" %smax levels=%d,%d", prefix, m->highest_comp_level(), m->highest_osr_comp_level()); } -void CompilationPolicy::print_training_data_on(outputStream* st, const char* prefix, Method* method) { +void CompilationPolicy::print_training_data_on(outputStream* st, const char* prefix, Method* method, CompLevel cur_level) { methodHandle m(Thread::current(), method); st->print(" %smtd: ", prefix); MethodTrainingData* mtd = MethodTrainingData::find(m); if (mtd == nullptr) { st->print("null"); } else { + if (should_delay_standard_transition(m, cur_level, mtd)) { + st->print("delayed, "); + } MethodData* md = mtd->final_profile(); st->print("mdo="); if (md == nullptr) { @@ -536,9 +539,9 @@ void CompilationPolicy::print_event_on(outputStream *st, EventType type, Method* st->print("in-queue"); } else st->print("idle"); - print_training_data_on(st, "", m); + print_training_data_on(st, "", m, level); if (inlinee_event) { - print_training_data_on(st, "inlinee ", im); + print_training_data_on(st, "inlinee ", im, level); } } st->print_cr("]"); @@ -1153,7 +1156,7 @@ CompLevel CompilationPolicy::trained_transition_from_none(const methodHandle& me // Now handle the case of level 4. assert(highest_training_level == CompLevel_full_optimization, "Unexpected compilation level: %d", highest_training_level); if (!training_has_profile) { - // The method was a part of a level 4 compile, but don't have a stored profile, + // The method was a part of a level 4 compile, but doesn't have a stored profile, // we need to profile it. return CompLevel_full_profile; } @@ -1308,33 +1311,53 @@ CompLevel CompilationPolicy::common(const methodHandle& method, CompLevel cur_le if (mtd == nullptr) { // We haven't see compilations of this method in training. It's either very cold or the behavior changed. // Feed it to the standard TF with no profiling delay. - next_level = standard_transition(method, cur_level, false /*delay_profiling*/, disable_feedback); + next_level = standard_transition(method, cur_level, disable_feedback); } else { next_level = trained_transition(method, cur_level, mtd, THREAD); - if (cur_level == next_level) { + if (cur_level == next_level && !should_delay_standard_transition(method, cur_level, mtd)) { // trained_transtion() is going to return the same level if no startup/warmup optimizations apply. // In order to catch possible pathologies due to behavior change we feed the event to the regular // TF but with profiling delay. - next_level = standard_transition(method, cur_level, true /*delay_profiling*/, disable_feedback); + next_level = standard_transition(method, cur_level, disable_feedback); } } } else { - next_level = standard_transition(method, cur_level, false /*delay_profiling*/, disable_feedback); + next_level = standard_transition(method, cur_level, disable_feedback); } return (next_level != cur_level) ? limit_level(next_level) : next_level; } +bool CompilationPolicy::should_delay_standard_transition(const methodHandle& method, CompLevel cur_level, MethodTrainingData* mtd) { + precond(mtd != nullptr); + CompLevel highest_training_level = static_cast(mtd->highest_top_level()); + if (highest_training_level != CompLevel_full_optimization && cur_level == CompLevel_limited_profile) { + // This is a lukewarm method - it hasn't been compiled with C2 during the tranining run and is currently + // running at level 2. Delay any further state changes until its counters exceed the training run counts. + MethodCounters* mc = method->method_counters(); + if (mc == nullptr) { + return false; + } + if (mc->invocation_counter()->carry() || mc->backedge_counter()->carry()) { + return false; + } + if (static_cast(mc->invocation_counter()->count()) <= mtd->invocation_count() && + static_cast(mc->backedge_counter()->count()) <= mtd->backedge_count()) { + return true; + } + } + return false; +} template -CompLevel CompilationPolicy::standard_transition(const methodHandle& method, CompLevel cur_level, bool delay_profiling, bool disable_feedback) { +CompLevel CompilationPolicy::standard_transition(const methodHandle& method, CompLevel cur_level, bool disable_feedback) { CompLevel next_level = cur_level; switch(cur_level) { default: break; case CompLevel_none: - next_level = transition_from_none(method, cur_level, delay_profiling, disable_feedback); + next_level = transition_from_none(method, cur_level, disable_feedback); break; case CompLevel_limited_profile: - next_level = transition_from_limited_profile(method, cur_level, delay_profiling, disable_feedback); + next_level = transition_from_limited_profile(method, cur_level, disable_feedback); break; case CompLevel_full_profile: next_level = transition_from_full_profile(method, cur_level); @@ -1343,16 +1366,8 @@ CompLevel CompilationPolicy::standard_transition(const methodHandle& method, Com return next_level; } -template static inline bool apply_predicate(const methodHandle& method, CompLevel cur_level, int i, int b, bool delay_profiling, double delay_profiling_scale) { - if (delay_profiling) { - return Predicate::apply_scaled(method, cur_level, i, b, delay_profiling_scale); - } else { - return Predicate::apply(method, cur_level, i, b); - } -} - template -CompLevel CompilationPolicy::transition_from_none(const methodHandle& method, CompLevel cur_level, bool delay_profiling, bool disable_feedback) { +CompLevel CompilationPolicy::transition_from_none(const methodHandle& method, CompLevel cur_level, bool disable_feedback) { precond(cur_level == CompLevel_none); CompLevel next_level = cur_level; int i = method->invocation_count(); @@ -1360,7 +1375,7 @@ CompLevel CompilationPolicy::transition_from_none(const methodHandle& method, Co // If we were at full profile level, would we switch to full opt? if (transition_from_full_profile(method, CompLevel_full_profile) == CompLevel_full_optimization) { next_level = CompLevel_full_optimization; - } else if (!CompilationModeFlag::disable_intermediate() && apply_predicate(method, cur_level, i, b, delay_profiling, Tier0ProfileDelayFactor)) { + } else if (!CompilationModeFlag::disable_intermediate() && Predicate::apply(method, cur_level, i, b)) { // C1-generated fully profiled code is about 30% slower than the limited profile // code that has only invocation and backedge counters. The observation is that // if C2 queue is large enough we can spend too much time in the fully profiled code @@ -1368,7 +1383,7 @@ CompLevel CompilationPolicy::transition_from_none(const methodHandle& method, Co // we introduce a feedback on the C2 queue size. If the C2 queue is sufficiently long // we choose to compile a limited profiled version and then recompile with full profiling // when the load on C2 goes down. - if (delay_profiling || (!disable_feedback && CompileBroker::queue_size(CompLevel_full_optimization) > Tier3DelayOn * compiler_count(CompLevel_full_optimization))) { + if (!disable_feedback && CompileBroker::queue_size(CompLevel_full_optimization) > Tier3DelayOn * compiler_count(CompLevel_full_optimization)) { next_level = CompLevel_limited_profile; } else { next_level = CompLevel_full_profile; @@ -1397,7 +1412,7 @@ CompLevel CompilationPolicy::transition_from_full_profile(const methodHandle& me } template -CompLevel CompilationPolicy::transition_from_limited_profile(const methodHandle& method, CompLevel cur_level, bool delay_profiling, bool disable_feedback) { +CompLevel CompilationPolicy::transition_from_limited_profile(const methodHandle& method, CompLevel cur_level, bool disable_feedback) { precond(cur_level == CompLevel_limited_profile); CompLevel next_level = cur_level; int i = method->invocation_count(); @@ -1407,7 +1422,7 @@ CompLevel CompilationPolicy::transition_from_limited_profile(const methodHandle& if (mdo->would_profile()) { if (disable_feedback || (CompileBroker::queue_size(CompLevel_full_optimization) <= Tier3DelayOff * compiler_count(CompLevel_full_optimization) && - apply_predicate(method, cur_level, i, b, delay_profiling, Tier2ProfileDelayFactor))) { + Predicate::apply(method, cur_level, i, b))) { next_level = CompLevel_full_profile; } } else { @@ -1417,7 +1432,7 @@ CompLevel CompilationPolicy::transition_from_limited_profile(const methodHandle& // If there is no MDO we need to profile if (disable_feedback || (CompileBroker::queue_size(CompLevel_full_optimization) <= Tier3DelayOff * compiler_count(CompLevel_full_optimization) && - apply_predicate(method, cur_level, i, b, delay_profiling, Tier2ProfileDelayFactor))) { + Predicate::apply(method, cur_level, i, b))) { next_level = CompLevel_full_profile; } } diff --git a/src/hotspot/share/compiler/compilationPolicy.hpp b/src/hotspot/share/compiler/compilationPolicy.hpp index d950ba418f9..3efc374d998 100644 --- a/src/hotspot/share/compiler/compilationPolicy.hpp +++ b/src/hotspot/share/compiler/compilationPolicy.hpp @@ -263,14 +263,15 @@ class CompilationPolicy : AllStatic { static CompLevel common(const methodHandle& method, CompLevel cur_level, JavaThread* THREAD, bool disable_feedback = false); template - static CompLevel transition_from_none(const methodHandle& method, CompLevel cur_level, bool delay_profiling, bool disable_feedback); + static CompLevel transition_from_none(const methodHandle& method, CompLevel cur_level, bool disable_feedback); template - static CompLevel transition_from_limited_profile(const methodHandle& method, CompLevel cur_level, bool delay_profiling, bool disable_feedback); + static CompLevel transition_from_limited_profile(const methodHandle& method, CompLevel cur_level, bool disable_feedback); template static CompLevel transition_from_full_profile(const methodHandle& method, CompLevel cur_level); template - static CompLevel standard_transition(const methodHandle& method, CompLevel cur_level, bool delayprof, bool disable_feedback); + static CompLevel standard_transition(const methodHandle& method, CompLevel cur_level, bool disable_feedback); + static bool should_delay_standard_transition(const methodHandle& method, CompLevel cur_level, MethodTrainingData* mtd); static CompLevel trained_transition_from_none(const methodHandle& method, CompLevel cur_level, MethodTrainingData* mtd, JavaThread* THREAD); static CompLevel trained_transition_from_limited_profile(const methodHandle& method, CompLevel cur_level, MethodTrainingData* mtd, JavaThread* THREAD); static CompLevel trained_transition_from_full_profile(const methodHandle& method, CompLevel cur_level, MethodTrainingData* mtd, JavaThread* THREAD); @@ -284,7 +285,7 @@ class CompilationPolicy : AllStatic { // level. static CompLevel loop_event(const methodHandle& method, CompLevel cur_level, JavaThread* THREAD); static void print_counters_on(outputStream* st, const char* prefix, Method* m); - static void print_training_data_on(outputStream* st, const char* prefix, Method* method); + static void print_training_data_on(outputStream* st, const char* prefix, Method* method, CompLevel cur_level); // Has a method been long around? // We don't remove old methods from the compile queue even if they have // very low activity (see select_task()). diff --git a/src/hotspot/share/compiler/compiler_globals.hpp b/src/hotspot/share/compiler/compiler_globals.hpp index 605c0c58869..3919c596d74 100644 --- a/src/hotspot/share/compiler/compiler_globals.hpp +++ b/src/hotspot/share/compiler/compiler_globals.hpp @@ -271,13 +271,6 @@ "Maximum rate sampling interval (in milliseconds)") \ range(1, max_intx) \ \ - product(double, Tier0ProfileDelayFactor, 100.0, DIAGNOSTIC, \ - "Delay profiling/compiling of methods that were " \ - "observed to be lukewarm") \ - \ - product(double, Tier2ProfileDelayFactor, 250.0, DIAGNOSTIC, \ - "Delay profiling of methods that were observed to be lukewarm") \ - \ product(bool, SkipTier2IfPossible, false, DIAGNOSTIC, \ "Compile at tier 4 instead of tier 2 in training replay " \ "mode if posssible") \ diff --git a/src/hotspot/share/oops/trainingData.cpp b/src/hotspot/share/oops/trainingData.cpp index 24f82a53843..27ae3404f41 100644 --- a/src/hotspot/share/oops/trainingData.cpp +++ b/src/hotspot/share/oops/trainingData.cpp @@ -35,6 +35,7 @@ #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/method.hpp" +#include "oops/method.inline.hpp" #include "oops/methodCounters.hpp" #include "oops/trainingData.hpp" #include "runtime/arguments.hpp" @@ -352,6 +353,8 @@ void MethodTrainingData::prepare(Visitor& visitor) { _final_counters = holder()->method_counters(); _final_profile = holder()->method_data(); assert(_final_profile == nullptr || _final_profile->method() == holder(), ""); + _invocation_count = holder()->invocation_count(); + _backedge_count = holder()->backedge_count(); } for (int i = 0; i < CompLevel_count - 1; i++) { CompileTrainingData* ctd = _last_toplevel_compiles[i]; diff --git a/src/hotspot/share/oops/trainingData.hpp b/src/hotspot/share/oops/trainingData.hpp index 7ab5e179eea..c549004e76e 100644 --- a/src/hotspot/share/oops/trainingData.hpp +++ b/src/hotspot/share/oops/trainingData.hpp @@ -748,6 +748,9 @@ class MethodTrainingData : public TrainingData { MethodCounters* _final_counters; MethodData* _final_profile; + int _invocation_count; + int _backedge_count; + MethodTrainingData(); MethodTrainingData(Method* method, KlassTrainingData* ktd) : TrainingData(method) { _klass = ktd; @@ -758,6 +761,8 @@ class MethodTrainingData : public TrainingData { _highest_top_level = CompLevel_none; _level_mask = 0; _was_toplevel = false; + _invocation_count = 0; + _backedge_count = 0; } static int level_mask(int level) { @@ -772,6 +777,8 @@ class MethodTrainingData : public TrainingData { bool saw_level(CompLevel l) const { return (_level_mask & level_mask(l)) != 0; } int highest_top_level() const { return _highest_top_level; } MethodData* final_profile() const { return _final_profile; } + int invocation_count() const { return _invocation_count; } + int backedge_count() const { return _backedge_count; } Symbol* name() const { precond(has_holder()); From 583ff202b1cc1f018d798a34d93359301840cf06 Mon Sep 17 00:00:00 2001 From: Vladimir Ivanov Date: Mon, 27 Oct 2025 16:15:10 +0000 Subject: [PATCH 304/561] 8370251: C2: Inlining checks for method handle intrinsics are too strict Reviewed-by: kvn, roland --- src/hotspot/share/opto/doCall.cpp | 12 +- .../jtreg/compiler/jsr292/MHInlineTest.java | 157 +++++++++++++----- 2 files changed, 126 insertions(+), 43 deletions(-) diff --git a/src/hotspot/share/opto/doCall.cpp b/src/hotspot/share/opto/doCall.cpp index ad7b64f93f5..754b0fa8d1c 100644 --- a/src/hotspot/share/opto/doCall.cpp +++ b/src/hotspot/share/opto/doCall.cpp @@ -102,6 +102,8 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool (orig_callee->intrinsic_id() == vmIntrinsics::_linkToVirtual) || (orig_callee->intrinsic_id() == vmIntrinsics::_linkToInterface); + const bool check_access = !orig_callee->is_method_handle_intrinsic(); // method handle intrinsics don't perform access checks + // Dtrace currently doesn't work unless all calls are vanilla if (env()->dtrace_method_probes()) { allow_inline = false; @@ -239,7 +241,8 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool // this invoke because it may lead to bimorphic inlining which // a speculative type should help us avoid. receiver_method = callee->resolve_invoke(jvms->method()->holder(), - speculative_receiver_type); + speculative_receiver_type, + check_access); if (receiver_method == nullptr) { speculative_receiver_type = nullptr; } else { @@ -256,8 +259,9 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool (morphism == 2 && UseBimorphicInlining))) { // receiver_method = profile.method(); // Profiles do not suggest methods now. Look it up in the major receiver. + assert(check_access, "required"); receiver_method = callee->resolve_invoke(jvms->method()->holder(), - profile.receiver(0)); + profile.receiver(0)); } if (receiver_method != nullptr) { // The single majority receiver sufficiently outweighs the minority. @@ -268,8 +272,9 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool CallGenerator* next_hit_cg = nullptr; ciMethod* next_receiver_method = nullptr; if (morphism == 2 && UseBimorphicInlining) { + assert(check_access, "required"); next_receiver_method = callee->resolve_invoke(jvms->method()->holder(), - profile.receiver(1)); + profile.receiver(1)); if (next_receiver_method != nullptr) { next_hit_cg = this->call_generator(next_receiver_method, vtable_index, !call_does_dispatch, jvms, @@ -342,6 +347,7 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool if (singleton != nullptr) { assert(singleton != declared_interface, "not a unique implementor"); + assert(check_access, "required"); ciMethod* cha_monomorphic_target = callee->find_monomorphic_target(caller->holder(), declared_interface, singleton); diff --git a/test/hotspot/jtreg/compiler/jsr292/MHInlineTest.java b/test/hotspot/jtreg/compiler/jsr292/MHInlineTest.java index a8e76f5797d..4638c27fe59 100644 --- a/test/hotspot/jtreg/compiler/jsr292/MHInlineTest.java +++ b/test/hotspot/jtreg/compiler/jsr292/MHInlineTest.java @@ -51,7 +51,8 @@ public class MHInlineTest { "-XX:+IgnoreUnrecognizedVMOptions", "-showversion", "-XX:-TieredCompilation", "-Xbatch", "-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining", - "-XX:CompileCommand=dontinline,compiler.jsr292.MHInlineTest::test*", + "-XX:CompileCommand=quiet", + "-XX:CompileCommand=compileonly,compiler.jsr292.MHInlineTest::test*", Launcher.class.getName()); OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); @@ -60,13 +61,17 @@ public class MHInlineTest { // The test is applicable only to C2 (present in Server VM). if (analyzer.getStderr().contains("Server VM")) { + analyzer.shouldContain("compiler.jsr292.MHInlineTest$A::package_final_x (3 bytes) inline (hot)"); + analyzer.shouldContain("compiler.jsr292.MHInlineTest$A::private_x (3 bytes) inline (hot)"); + analyzer.shouldContain("compiler.jsr292.MHInlineTest$A::package_static_x (3 bytes) inline (hot)"); + analyzer.shouldContain("compiler.jsr292.MHInlineTest$B::public_x (3 bytes) inline (hot)"); analyzer.shouldContain("compiler.jsr292.MHInlineTest$B::protected_x (3 bytes) inline (hot)"); analyzer.shouldContain("compiler.jsr292.MHInlineTest$B::package_x (3 bytes) inline (hot)"); - analyzer.shouldContain("compiler.jsr292.MHInlineTest$A::package_final_x (3 bytes) inline (hot)"); analyzer.shouldContain("compiler.jsr292.MHInlineTest$B::private_x (3 bytes) inline (hot)"); analyzer.shouldContain("compiler.jsr292.MHInlineTest$B::private_static_x (3 bytes) inline (hot)"); - analyzer.shouldContain("compiler.jsr292.MHInlineTest$A::package_static_x (3 bytes) inline (hot)"); + + analyzer.shouldNotContain("failed to inline"); } else { throw new SkippedException("The test is applicable only to C2 (present in Server VM)"); } @@ -75,23 +80,24 @@ public class MHInlineTest { static class A { public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - public Class public_x() { return A.class; } - protected Class protected_x() { return A.class; } - Class package_x() { return A.class; } - final Class package_final_x() { return A.class; } + public Class public_x() { return A.class; } + protected Class protected_x() { return A.class; } + /*package*/ Class package_x() { return A.class; } + /*package*/ final Class package_final_x() { return A.class; } + private Class private_x() { return A.class; } - static Class package_static_x() { return A.class; } + /*package*/ static Class package_static_x() { return A.class; } } static class B extends A { public static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - @Override public Class public_x() { return B.class; } - @Override protected Class protected_x() { return B.class; } - @Override Class package_x() { return B.class; } + @Override public Class public_x() { return B.class; } + @Override protected Class protected_x() { return B.class; } + @Override /*package*/ Class package_x() { return B.class; } - private Class private_x() { return B.class; } - static Class private_static_x() { return B.class; } + private Class private_x() { return B.class; } + private static Class private_static_x() { return B.class; } } static final MethodHandle A_PUBLIC_X; @@ -99,6 +105,7 @@ public class MHInlineTest { static final MethodHandle A_PACKAGE_X; static final MethodHandle A_PACKAGE_STATIC_X; static final MethodHandle A_PACKAGE_FINAL_X; + static final MethodHandle A_PRIVATE_X; static final MethodHandle B_PRIVATE_X; static final MethodHandle B_PRIVATE_STATIC_X; @@ -117,6 +124,8 @@ public class MHInlineTest { A.class, "package_final_x", MethodType.methodType(Class.class)); A_PACKAGE_STATIC_X = LOOKUP.findStatic( A.class, "package_static_x", MethodType.methodType(Class.class)); + A_PRIVATE_X = LOOKUP.findVirtual( + A.class, "private_x", MethodType.methodType(Class.class)); B_PRIVATE_X = B.LOOKUP.findVirtual( B.class, "private_x", MethodType.methodType(Class.class)); @@ -129,7 +138,18 @@ public class MHInlineTest { static final A a = new B(); - private static void testPublicMH() { + /* ============== public Class public_x() ============== */ + + private static void testPublicMH(A recv) { + try { + Class r = (Class)A_PUBLIC_X.invokeExact(recv); + assertEquals(r, B.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testPublicMHConst() { try { Class r = (Class)A_PUBLIC_X.invokeExact(a); assertEquals(r, B.class); @@ -138,7 +158,18 @@ public class MHInlineTest { } } - private static void testProtectedMH() { + /* ============== protected Class protected_x() ============== */ + + private static void testProtectedMH(A recv) { + try { + Class r = (Class)A_PROTECTED_X.invokeExact(recv); + assertEquals(r, B.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testProtectedMHConst() { try { Class r = (Class)A_PROTECTED_X.invokeExact(a); assertEquals(r, B.class); @@ -147,7 +178,18 @@ public class MHInlineTest { } } - private static void testPackageMH() { + /* ============== Class package_x() ============== */ + + private static void testPackageMH(A recv) { + try { + Class r = (Class)A_PACKAGE_X.invokeExact(recv); + assertEquals(r, B.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testPackageMHConst() { try { Class r = (Class)A_PACKAGE_X.invokeExact(a); assertEquals(r, B.class); @@ -156,7 +198,9 @@ public class MHInlineTest { } } - private static void testPackageFinalMH() { + /* ============== final Class package_final_x() ============== */ + + private static void testPackageFinalMH(A recv) { try { Class r = (Class)A_PACKAGE_FINAL_X.invokeExact(a); assertEquals(r, A.class); @@ -165,16 +209,45 @@ public class MHInlineTest { } } - private static void testPackageStaticMH() { + private static void testPackageFinalMHConst() { try { - Class r = (Class)A_PACKAGE_STATIC_X.invokeExact(); + Class r = (Class)A_PACKAGE_FINAL_X.invokeExact(a); assertEquals(r, A.class); } catch (Throwable throwable) { throw new Error(throwable); } } - private static void testPrivateMH() { + /* ============== private Class private_x() ============== */ + + private static void testPrivateA_MH(A recv) { + try { + Class r = (Class)A_PRIVATE_X.invokeExact(recv); + assertEquals(r, A.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testPrivateA_MHConst() { + try { + Class r = (Class)A_PRIVATE_X.invokeExact(a); + assertEquals(r, A.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testPrivateB_MH(B recv) { + try { + Class r = (Class)B_PRIVATE_X.invokeExact(recv); + assertEquals(r, B.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + private static void testPrivateB_MHConst() { try { Class r = (Class)B_PRIVATE_X.invokeExact((B)a); assertEquals(r, B.class); @@ -183,7 +256,19 @@ public class MHInlineTest { } } - private static void testPrivateStaticMH() { + /* ============== static ============== */ + + private static void testPackageStaticMHConst() { + try { + Class r = (Class)A_PACKAGE_STATIC_X.invokeExact(); + assertEquals(r, A.class); + } catch (Throwable throwable) { + throw new Error(throwable); + } + } + + + private static void testPrivateStaticMHConst() { try { Class r = (Class)B_PRIVATE_STATIC_X.invokeExact(); assertEquals(r, B.class); @@ -192,28 +277,20 @@ public class MHInlineTest { } } + /* ====================================================================== */ + static class Launcher { public static void main(String[] args) throws Exception { for (int i = 0; i < 20_000; i++) { - testPublicMH(); - } - for (int i = 0; i < 20_000; i++) { - testProtectedMH(); - } - for (int i = 0; i < 20_000; i++) { - testPackageMH(); - } - for (int i = 0; i < 20_000; i++) { - testPackageFinalMH(); - } - for (int i = 0; i < 20_000; i++) { - testPackageStaticMH(); - } - for (int i = 0; i < 20_000; i++) { - testPrivateMH(); - } - for (int i = 0; i < 20_000; i++) { - testPrivateStaticMH(); + testPublicMH(a); testPublicMHConst(); + testProtectedMH(a); testProtectedMHConst(); + testPackageMH(a); testPackageMHConst(); + testPackageFinalMH(a); testPackageFinalMHConst(); + testPrivateA_MH(a); testPrivateA_MHConst(); + testPrivateB_MH((B)a); testPrivateB_MHConst(); + + testPackageStaticMHConst(); + testPrivateStaticMHConst(); } } } From ebf9c5bfc1b2e8e9210cc37283a29d471f913916 Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Mon, 27 Oct 2025 16:40:17 +0000 Subject: [PATCH 305/561] 8370250: Locale should mention the behavior for duplicate subtags Reviewed-by: naoto --- .../share/classes/java/util/Locale.java | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/src/java.base/share/classes/java/util/Locale.java b/src/java.base/share/classes/java/util/Locale.java index a55ddee648e..452b621ea05 100644 --- a/src/java.base/share/classes/java/util/Locale.java +++ b/src/java.base/share/classes/java/util/Locale.java @@ -204,15 +204,18 @@ import sun.util.locale.provider.TimeZoneNameUtility; * key="x"/value="java-1-7" * * - * BCP 47 deviation: Although BCP 47 requires field values to be registered - * in the IANA Language Subtag Registry, the {@code Locale} class - * does not validate this requirement. For example, the variant code "foobar" - * is well-formed since it is composed of 5 to 8 alphanumerics, but is not defined - * the IANA Language Subtag Registry. The {@link Builder} - * only checks if an individual field satisfies the syntactic - * requirement (is well-formed), but does not validate the value - * itself. Conversely, {@link #of(String, String, String) Locale::of} and its - * overloads do not make any syntactic checks on the input. + * BCP 47 deviation: BCP47 defines the following two levels of + * conformance, + * "valid" and "well-formed". A valid tag requires that it is well-formed, its + * subtag values are registered in the IANA Language Subtag Registry, and it does not + * contain duplicate variant or extension singleton subtags. The {@code Locale} + * class does not enforce that subtags are registered in the Subtag Registry. + * {@link Builder} only checks if an individual field satisfies the syntactic + * requirement (is well-formed). When passed duplicate variants, {@code Builder} + * accepts and includes them. When passed duplicate extension singletons, {@code + * Builder} accepts but ignores the duplicate key and its associated value. + * Conversely, {@link #of(String, String, String) Locale::of} and its + * overloads do not check if the input is well-formed at all. * *

        Unicode BCP 47 U Extension

        * @@ -246,7 +249,11 @@ import sun.util.locale.provider.TimeZoneNameUtility; * can be empty, or a series of subtags 3-8 alphanums in length). A * well-formed locale attribute has the form * {@code [0-9a-zA-Z]{3,8}} (it is a single subtag with the same - * form as a locale type subtag). + * form as a locale type subtag). Duplicate locale attributes as well + * as locale keys do not convey meaning. For methods in {@code Locale} and + * {@code Locale.Builder} that accept extensions, occurrences of duplicate + * locale attributes as well as locale keys and their associated type are accepted + * but ignored. * *

        The Unicode locale extension specifies optional behavior in * locale-sensitive services. Although the LDML specification defines @@ -561,6 +568,8 @@ import sun.util.locale.provider.TimeZoneNameUtility; * RFC 4647: Matching of Language Tags * @spec https://www.rfc-editor.org/info/rfc5646 * RFC 5646: Tags for Identifying Languages + * @spec https://www.rfc-editor.org/info/rfc6067 + * RFC 6067: BCP 47 Extension U * @spec https://www.unicode.org/reports/tr35 * Unicode Locale Data Markup Language (LDML) * @see Builder @@ -1743,6 +1752,12 @@ public final class Locale implements Cloneable, Serializable { * to {@link Locale.Builder#setLanguageTag(String)} which throws an exception * in this case. * + *

        Duplicate variants are accepted and included by the builder. + * However, duplicate extension singleton keys and their associated type + * are accepted but ignored. The same behavior applies to duplicate locale + * keys and attributes within a U extension. Note that subsequent subtags after + * the occurrence of a duplicate are not ignored. + * *

        The following conversions are performed:

          * *
        • The language code "und" is mapped to language "". @@ -2717,6 +2732,12 @@ public final class Locale implements Cloneable, Serializable { * just discards ill-formed and following portions of the * tag). * + *

          Duplicate variants are accepted and included by the builder. + * However, duplicate extension singleton keys and their associated type + * are accepted but ignored. The same behavior applies to duplicate locale + * keys and attributes within a U extension. Note that subsequent subtags after + * the occurrence of a duplicate are not ignored. + * *

          See {@link Locale##langtag_conversions converions} for a full list * of conversions that are performed on {@code languageTag}. * @@ -2808,7 +2829,8 @@ public final class Locale implements Cloneable, Serializable { * Sets the variant. If variant is null or the empty string, the * variant in this {@code Builder} is removed. Otherwise, it * must consist of one or more {@linkplain Locale##def_variant well-formed} - * subtags, or an exception is thrown. + * subtags, or an exception is thrown. Duplicate variants are + * accepted and included by the builder. * *

          Note: This method checks if {@code variant} * satisfies the IETF BCP 47 variant subtag's syntax requirements, @@ -2841,7 +2863,8 @@ public final class Locale implements Cloneable, Serializable { *

          Note: The key {@link #UNICODE_LOCALE_EXTENSION * UNICODE_LOCALE_EXTENSION} ('u') is used for the Unicode locale extension. * Setting a value for this key replaces any existing Unicode locale key/type - * pairs with those defined in the extension. + * pairs with those defined in the extension. Duplicate locale attributes + * as well as locale keys and their associated type are accepted but ignored. * *

          Note: The key {@link #PRIVATE_USE_EXTENSION * PRIVATE_USE_EXTENSION} ('x') is used for the private use code. To be From c25f35205ae4544970bbaca233de8745f8e4e92c Mon Sep 17 00:00:00 2001 From: Daniel Hu Date: Mon, 27 Oct 2025 16:48:51 +0000 Subject: [PATCH 306/561] 8341735: Rewrite the build/AbsPathsInImage.java test to not load the entire file at once Reviewed-by: erikj --- test/jdk/build/AbsPathsInImage.java | 203 ++++++++++++++++++++-------- 1 file changed, 145 insertions(+), 58 deletions(-) diff --git a/test/jdk/build/AbsPathsInImage.java b/test/jdk/build/AbsPathsInImage.java index 1aa7e59941e..7b2c60c3dda 100644 --- a/test/jdk/build/AbsPathsInImage.java +++ b/test/jdk/build/AbsPathsInImage.java @@ -21,6 +21,7 @@ * questions. */ +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.FileVisitResult; @@ -35,6 +36,8 @@ import java.util.Properties; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import static java.util.Comparator.comparing; + /* * @test * @bug 8226346 @@ -42,7 +45,7 @@ import java.util.zip.ZipInputStream; * @requires !vm.debug * @comment ASAN keeps the 'unwanted' paths in the binaries because of its build options * @requires !vm.asan - * @run main/othervm -Xmx900m AbsPathsInImage + * @run main AbsPathsInImage */ public class AbsPathsInImage { @@ -51,9 +54,14 @@ public class AbsPathsInImage { public static final String DIR_PROPERTY = "jdk.test.build.AbsPathsInImage.dir"; private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows"); private static final boolean IS_LINUX = System.getProperty("os.name").toLowerCase().contains("linux"); + private static final int DEFAULT_BUFFER_SIZE = 8192; + private static List searchPatterns = new ArrayList<>(); + private static List prefixTables = new ArrayList<>(); private boolean matchFound = false; + record Match(int begin, int end) { } + public static void main(String[] args) throws Exception { String jdkPathString = System.getProperty("test.jdk"); Path jdkHome = Paths.get(jdkPathString); @@ -107,9 +115,9 @@ public class AbsPathsInImage { throw new Error("Output root is not an absolute path: " + buildOutputRoot); } - List searchPatterns = new ArrayList<>(); - expandPatterns(searchPatterns, buildWorkspaceRoot); - expandPatterns(searchPatterns, buildOutputRoot); + expandPatterns(buildWorkspaceRoot); + expandPatterns(buildOutputRoot); + createPrefixTables(); System.out.println("Looking for:"); for (byte[] searchPattern : searchPatterns) { @@ -118,7 +126,7 @@ public class AbsPathsInImage { System.out.println(); AbsPathsInImage absPathsInImage = new AbsPathsInImage(); - absPathsInImage.scanFiles(dirToScan, searchPatterns); + absPathsInImage.scanFiles(dirToScan); if (absPathsInImage.matchFound) { throw new Exception("Test failed"); @@ -129,7 +137,7 @@ public class AbsPathsInImage { * Add path pattern to list of patterns to search for. Create all possible * variants depending on platform. */ - private static void expandPatterns(List searchPatterns, String pattern) { + private static void expandPatterns(String pattern) { if (IS_WINDOWS) { String forward = pattern.replace('\\', '/'); String back = pattern.replace('/', '\\'); @@ -151,7 +159,42 @@ public class AbsPathsInImage { } } - private void scanFiles(Path root, List searchPatterns) throws IOException { + /** + * The failure function for KMP. Returns the correct index in the pattern to jump + * back to when encountering a mismatched character. Used in both + * createPrefixTables (pre-processing) and scanBytes (matching). + */ + private static int getPrefixIndex(int patternIdx, int state, byte match) { + if (state == 0) { + return 0; + } + byte[] searchPattern = searchPatterns.get(patternIdx); + int[] prefixTable = prefixTables.get(patternIdx); + int i = prefixTable[state - 1]; + while (i > 0 && searchPattern[i] != match) { + i = prefixTable[i - 1]; + } + return searchPattern[i] == match ? i + 1 : i; + } + + /** + * Pre-processing string patterns for Knuth–Morris–Pratt (KMP) search algorithm. + * Lookup tables of longest prefixes at each given index are created for each + * search pattern string. These tables are later used in scanBytes during matching + * as lookups for failure state transitions. + */ + private static void createPrefixTables() { + for (int patternIdx = 0; patternIdx < searchPatterns.size(); patternIdx++) { + int patternLen = searchPatterns.get(patternIdx).length; + int[] prefixTable = new int[patternLen]; + prefixTables.add(prefixTable); + for (int i = 1; i < patternLen; i++) { + prefixTable[i] = getPrefixIndex(patternIdx, i, searchPatterns.get(patternIdx)[i]); + } + } + } + + private void scanFiles(Path root) throws IOException { Files.walkFileTree(root, new SimpleFileVisitor<>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { @@ -170,84 +213,128 @@ public class AbsPathsInImage { } else if ((fileName.endsWith(".debuginfo") && !IS_LINUX) || fileName.endsWith(".pdb")) { // Do nothing } else if (fileName.endsWith(".zip")) { - scanZipFile(file, searchPatterns); + scanZipFile(file); } else { - scanFile(file, searchPatterns); + scanFile(file); } return super.visitFile(file, attrs); } }); } - private void scanFile(Path file, List searchPatterns) throws IOException { - List matches = scanBytes(Files.readAllBytes(file), searchPatterns); - if (matches.size() > 0) { - matchFound = true; - System.out.println(file + ":"); - for (String match : matches) { - System.out.println(match); - } - System.out.println(); + private void scanFile(Path file) throws IOException { + List matches; + try (InputStream inputStream = Files.newInputStream(file)) { + matches = scanBytes(inputStream); + } + // test succeeds + if (matches.size() == 0) { + return; + } + // test fails; pay penalty and re-scan file for debug output + try (InputStream inputStream = Files.newInputStream(file)) { + printDebugOutput(inputStream, matches, file + ":"); } } - private void scanZipFile(Path zipFile, List searchPatterns) throws IOException { + private void scanZipFile(Path zipFile) throws IOException { + List> entryMatches = new ArrayList<>(); + boolean found = false; + ZipEntry zipEntry; try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile))) { - ZipEntry zipEntry; while ((zipEntry = zipInputStream.getNextEntry()) != null) { - List matches = scanBytes(zipInputStream.readAllBytes(), searchPatterns); + List matches = scanBytes(zipInputStream); if (matches.size() > 0) { - matchFound = true; - System.out.println(zipFile + ", " + zipEntry.getName() + ":"); - for (String match : matches) { - System.out.println(match); - } - System.out.println(); + entryMatches.add(matches); + found = true; + } else { + entryMatches.add(null); + } + } + } + // test succeeds + if (!found) { + return; + } + // test fails + try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile))) { + int i = 0; + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + List matches = entryMatches.get(i); + i++; + if (matches != null) { + printDebugOutput(zipInputStream, matches, zipFile + ", " + zipEntry.getName() + ":"); } } } } - private List scanBytes(byte[] data, List searchPatterns) { - List matches = new ArrayList<>(); - for (int i = 0; i < data.length; i++) { - for (byte[] searchPattern : searchPatterns) { - boolean found = true; - for (int j = 0; j < searchPattern.length; j++) { - if ((i + j >= data.length || data[i + j] != searchPattern[j])) { - found = false; + /** + * Scans each byte until encounters a match with one of searchPatterns. Uses KMP to + * perform matches. Keep track of current matched index (states) for each search + * pattern. At each given byte, update states accordingly (increment if match or + * failure function transition if mismatch). Returns a list of Match objects. + */ + private List scanBytes(InputStream input) throws IOException { + List matches = new ArrayList<>(); + byte[] buf = new byte[DEFAULT_BUFFER_SIZE]; + int[] states = new int[searchPatterns.size()]; + int fileIdx = 0; + int bytesRead, patternLen; + while ((bytesRead = input.read(buf)) != -1) { + for (int bufIdx = 0; bufIdx < bytesRead; bufIdx++, fileIdx++) { + byte datum = buf[bufIdx]; + for (int i = 0; i < searchPatterns.size(); i++) { + patternLen = searchPatterns.get(i).length; + if (datum != searchPatterns.get(i)[states[i]]) { + states[i] = getPrefixIndex(i, states[i], datum); + } else if (++states[i] == patternLen) { + // technically at last match, state should reset according to failure function + // but in original test, matching didn't search same string for multiple matches + states[i] = 0; + matches.add(new Match(fileIdx - patternLen + 1, fileIdx)); break; } } - if (found) { - matches.add(new String(data, charsStart(data, i), charsOffset(data, i, searchPattern.length))); - // No need to search the same string for multiple patterns - break; - } } } return matches; } - private int charsStart(byte[] data, int startIndex) { - int index = startIndex; - while (--index > 0) { - byte datum = data[index]; - if (datum < 32 || datum > 126) { - break; + /** + * In original test, failed test output would backtrack to last non-ascii byte on + * matched pattern. This is incompatible with the new buffered approach (and a + * proper solution requires a 2nd dynamic buffer). Instead, on failed test case, + * files are scanned a 2nd time to print debug output. Failed runs will pay + * additional performance/space penalty, but passing runs are faster. + */ + private void printDebugOutput(InputStream input, List matches, final String HEADER) throws IOException{ + matchFound = true; + System.out.println(HEADER); + matches.sort(comparing(Match::begin)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[DEFAULT_BUFFER_SIZE]; + int matchIdx = 0; + int fileIdx = 0; + int bytesRead; + while (matchIdx < matches.size() && (bytesRead = input.read(buf)) != -1) { + for (int i = 0; matchIdx < matches.size() && i < bytesRead; i++, fileIdx++) { + byte datum = buf[i]; + if (datum >= 32 && datum <= 126) { + output.write(datum); + } else if (fileIdx < matches.get(matchIdx).begin()) { + output.reset(); + } else if (fileIdx > matches.get(matchIdx).end()) { + System.out.println(output.toString()); + output.reset(); + // This imperfect as incorrect in edge cases with patterns containing non-ascii? + // but high-accuracy not priority + output still legible and useful + for (; matchIdx < matches.size() && matches.get(matchIdx).end() < fileIdx; matchIdx++); + } else { + output.write(datum); + } } } - return index + 1; - } - - private int charsOffset(byte[] data, int startIndex, int startOffset) { - int offset = startOffset; - while (startIndex + ++offset < data.length) { - byte datum = data[startIndex + offset]; - if (datum < 32 || datum > 126) { - break; - } - } - return offset; + System.out.println(); } } From 8151251fa683459e57430abf8e3583c444315746 Mon Sep 17 00:00:00 2001 From: Joe Darcy Date: Mon, 27 Oct 2025 18:46:44 +0000 Subject: [PATCH 307/561] 8370370: Add still more cases to WorstCaseTests Reviewed-by: rgiulietti --- test/jdk/java/lang/Math/WorstCaseTests.java | 39 +++++++++++++++++-- .../java/lang/StrictMath/CubeRootTests.java | 3 +- .../java/lang/StrictMath/HyperbolicTests.java | 14 ++++++- test/jdk/java/lang/StrictMath/Log10Tests.java | 5 ++- test/jdk/java/lang/StrictMath/Log1pTests.java | 3 +- test/jdk/java/lang/StrictMath/TrigTests.java | 6 ++- 6 files changed, 61 insertions(+), 9 deletions(-) diff --git a/test/jdk/java/lang/Math/WorstCaseTests.java b/test/jdk/java/lang/Math/WorstCaseTests.java index a479c6a3444..664958da158 100644 --- a/test/jdk/java/lang/Math/WorstCaseTests.java +++ b/test/jdk/java/lang/Math/WorstCaseTests.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,7 @@ */ /** - * This test contains two distinct kinds of worst-case inputs: + * This test contains three distinct kinds of worst-case inputs: * * 1) Exact numerical results that are nearly half-way between * representable numbers or very close to a representable @@ -43,6 +43,9 @@ * 2) Worst-case errors as observed empirically across different * implementations that are not correctly rounded. * + * 3) Worst-case values found in the Julia environment, which uses a + * fork of FDLIBM. + * * For the first category, the "Table Maker's Dilemma" results from * Jean-Michel Muller and Vincent Lefèvre, are used. * See https://perso.ens-lyon.fr/jean-michel.muller/TMD.html for original @@ -70,6 +73,8 @@ * Extended, and Quadruple Precision" by Brian Gladman, Vincenzo * Innocente and Paul Zimmermann. * + * For the third category, see the preprint https://arxiv.org/abs/2509.05666 + * * From https://openlibm.org/, "The OpenLibm code derives from the * FreeBSD msun and OpenBSD libm implementations, which in turn derive * from FDLIBM 5.3." Java's StrictMath libraries use the FDLIBM 5.3 @@ -143,6 +148,8 @@ public class WorstCaseTests { // Worst-case observed error for OpenLibm {+0x1.2e8f20cf3cbe7p+8, 0x1.6a2a59cc78bf7p436}, + // Julia worst-case observed error + {-0x1.6251620687bf3p9, 0x0.c980224219398p-1022}, // Other worst-case observed errors {-0x1.49f33ad2c1c58p+9, 0x1.f3ccc815431b5p-953}, {+0x1.fce66609f7428p+5, 0x1.b59724cb0bc4cp91}, @@ -188,7 +195,9 @@ public class WorstCaseTests { {+0x1.DE7CD6751029Ap16, +0x1.76E7E5D7B6EABp+3}, // Worst-case observed error for OpenLibm - {+0x1.48ae5a67204f5p+0, 0x1.ffd10abffc3fep-3}, + {+0x1.48ae5a67204f5p+0, +0x1.ffd10abffc3fep-3}, + // Julia worst-case observed error + {+0x1.14fad2c09e275p0, +0x1.42a13ec2691dbp-4}, // Other worst-case observed errors {+0x1.1211bef8f68e9p+0, +0x1.175caeca67f84p-4}, {+0x1.008000db2e8bep+0, +0x1.ff83959f5cc1fp-10}, @@ -238,6 +247,8 @@ public class WorstCaseTests { // Worst-case observed error for OpenLibm {+0x1.4d84db080b9fdp+21, +0x1.6e21c4ff6aec3p-1}, + // Worst-case observed error for Julia + {+0x1.5a8e729e7934p102, +0x1.6deadddde6752p-1}, // Other worst-case observed errors {-0x1.f8b791cafcdefp+4, -0x1.073ca87470df9p-3 }, {-0x1.0e16eb809a35dp+944, +0x1.b5e361ed01dacp-2}, @@ -285,7 +296,10 @@ public class WorstCaseTests { {+0x1.E264357EA0E29p-1, +0x1.3AA301F6EBB1Dp+0}, // Worst-case observed error for OpenLibm - {-0x1.004d1c5a9400bp-1, -0x1.0c6e322e8a28bp-1}, + {-0x1.004d1c5a9400bp-1, -0x1.0c6e322e8a28bp-1}, + // Julia worst-case observed error + {-0x1.012d405d9408ep-1, -0x1.0d7142df4968fp-1}, + // Other worst-case observed errors {-0x1.0000045b2c904p-3, -0x1.00abe5252746cp-3}, {+0x1.6c042a6378102p-1, +0x1.94eda53f72c5ap-1}, @@ -334,6 +348,8 @@ public class WorstCaseTests { // Worst-case observed error for OpenLibm {-0x1.34e729fd08086p+21, +0x1.6a6a0d6a17f0fp-1}, + // Julia worst-case observed error + {-0x1.4e4cb79b5b5a2p930, 0x1.70f851fbdea52p-1}, // Other worst-case observed errors {-0x1.7120161c92674p+0, +0x1.0741fb7683849p-3}, {-0x1.d19ebc5567dcdp+311, -0x1.b5d2f45f68958p-2}, @@ -374,6 +390,8 @@ public class WorstCaseTests { // Worst-case observed error for OpenLibm {-0x1.0068b067c6feep-1, +0x1.0c335e2f0726fp1}, + // Julia worst-case observed error + {-0x1.0b7c63033d6cp-1, +0x1.0f6c7f5db3b93p1}, // Other worst-case observed errors {+0x1.dffffb3488a4p-1, 0x1.6bf3a4a4f4dcbp-2}, {+0x1.6c05eb219ec46p-1, 0x1.8f4f472807261p-1}, @@ -418,6 +436,9 @@ public class WorstCaseTests { // Worst-case observed error for OpenLibm, outside of 1 ulp error // {0x1.3f9605aaeb51bp+21, -0x1.9678ee5d64934p-1}, // 1.02 + + // Worst-case observed error for Julia, outside of 1 ulp error + // {0x1.e608f1390d9fp293, -0x1.9942a10545924p-1}, // 1.04 }; for(double[] testCase: testCases) { @@ -456,6 +477,8 @@ public class WorstCaseTests { // Worst-case observed error {0x1.62ff6a1682c25p-1, +0x1.3666b15c8756ap-1}, + // Julia worst-case observed error + {0x1.66340e55ce1adp-1, +0x1.388f4792eaa82p-1}, // Other worst-case observed errors {+0x1.f9004c4fef9eap-4, 0x1.f67727f5618f2p-4}, {-0x1.ffff8020d3d1dp-7, -0x1.fff4d5e4886c7p-7}, @@ -554,6 +577,10 @@ public class WorstCaseTests { {+0x1.E07E71BFCF06Fp+5, +0x1.91EC4412C344Fp+85}, {+0x1.54CD1FEA7663Ap+7, +0x1.C90810D354618p+244}, {+0x1.D6479EBA7C971p+8, +0x1.62A88613629B5p+677}, + + // Julia worst-case observed error, 1.9 ulps; + // added to hyperbolics testing in StrictMath. + // {-0x1.633c654fee2bap9, -0x1.fdf25fc26e7cp1023}, }; for(double[] testCase: testCases) { @@ -582,6 +609,10 @@ public class WorstCaseTests { {+0x1.A6031CD5F93BAp-1, +0x1.5BFF041B260FDp+0}, {+0x1.104B648F113A1p+0, +0x1.9EFDCA62B7009p+0}, {+0x1.EA5F2F2E4B0C5p+1, +0x17.10DB0CD0FED5p+0}, + + // Julia worst-case observed error, 1.9 ulps; + // added to hyperbolics testing in StrictMath. + // {-0x1.633c654fee2bap9, 0x1.fdf25fc26e7cp1023}, }; for(double[] testCase: testCases) { diff --git a/test/jdk/java/lang/StrictMath/CubeRootTests.java b/test/jdk/java/lang/StrictMath/CubeRootTests.java index 474a7760984..6275b8a8b44 100644 --- a/test/jdk/java/lang/StrictMath/CubeRootTests.java +++ b/test/jdk/java/lang/StrictMath/CubeRootTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -471,6 +471,7 @@ public class CubeRootTests { {0x0.0000ffffffap-1022, 0x1.ffffffcp-347}, {0x0.0000ffffffff8p-1022, 0x1.ffffffffaaaabp-347}, {0x0.0fffffffffffbp-1022, 0x1.fffffffffffcbp-343}, + {-0x1.0edb6c7fa500fp-531, -0x1.04dc0b189b6cep-177}, // next down from Julia value // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM diff --git a/test/jdk/java/lang/StrictMath/HyperbolicTests.java b/test/jdk/java/lang/StrictMath/HyperbolicTests.java index 68e6a27124c..1f570ce9efd 100644 --- a/test/jdk/java/lang/StrictMath/HyperbolicTests.java +++ b/test/jdk/java/lang/StrictMath/HyperbolicTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -340,6 +340,10 @@ public class HyperbolicTests { {0x1.fffffffffff68p4, 0x1.1f43fcc4b5b83p45}, {0x1.fffffffffffd4p4, 0x1.1f43fcc4b6316p45}, {0x1.0p5, 0x1.1f43fcc4b662cp45}, + + // Julia worst-case input + {-0x1.633c654fee2bap9, -0x1.fdf25fc26e7cp1023}, + // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM {-0x1.633c654fee2bap+9, -0x1.fdf25fc26e7cp1023}, @@ -386,6 +390,10 @@ public class HyperbolicTests { {0x1.0p4, 0x1.0f2ebd0a8005cp22}, {0x1.fffffffffffd4p4, 0x1.1f43fcc4b6316p45}, {0x1.0p5, 0x1.1f43fcc4b662cp45}, + + // Julia worst-case input + {-0x1.633c654fee2bap9, 0x1.fdf25fc26e7cp1023}, + // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM {-0x1.633c654fee2bap+9, 0x1.fdf25fc26e7cp1023}, @@ -462,6 +470,10 @@ public class HyperbolicTests { {0x1.fffffffffffe1p0, 0x1.ed9505e1bc3cfp-1}, {0x1.ffffffffffed8p1, 0x1.ffa81708a0b4p-1}, {0x1.fffffffffff92p1, 0x1.ffa81708a0b41p-1}, + + // Julia worst-case input + {0x1.0108b83c4bbc8p-1, 0x1.dad53a45da5b0p-2}, + // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM {-0x1.c41e527b70f43p-3, -0x1.bcea047cc736cp-3}, diff --git a/test/jdk/java/lang/StrictMath/Log10Tests.java b/test/jdk/java/lang/StrictMath/Log10Tests.java index 6cd8427c438..537d13d9cb4 100644 --- a/test/jdk/java/lang/StrictMath/Log10Tests.java +++ b/test/jdk/java/lang/StrictMath/Log10Tests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -722,6 +722,9 @@ public class Log10Tests { {0x1.3fffffffffebdp25, 0x1.e7d9a8edb47a2p2}, {0x1.4p25, 0x1.e7d9a8edb47bfp2}, + // Julia worst-case + {0x1.10f12374877e3p0, 0x1.c7f8d2e32f5e9p-6}, + // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM {0x1.de02157073b31p-1, -0x1.e8cfabf160ec6p-6}, diff --git a/test/jdk/java/lang/StrictMath/Log1pTests.java b/test/jdk/java/lang/StrictMath/Log1pTests.java index b8a8592812f..c31dc946136 100644 --- a/test/jdk/java/lang/StrictMath/Log1pTests.java +++ b/test/jdk/java/lang/StrictMath/Log1pTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -209,6 +209,7 @@ public class Log1pTests { {0x1.7688bb5394bd3p325, 0x1.c34e8276daa48p7}, {0x1.d42aea2878b45p328, 0x1.c7e96ee5c7f87p7}, {0x1.249ad2594989p332, 0x1.cc845b54b54a6p7}, + {0x1.300240b87b096p-4, 0x1.25417bd05ba95p-4}, // nextUp from Julia value // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM diff --git a/test/jdk/java/lang/StrictMath/TrigTests.java b/test/jdk/java/lang/StrictMath/TrigTests.java index c4f7dab547f..e758762a97d 100644 --- a/test/jdk/java/lang/StrictMath/TrigTests.java +++ b/test/jdk/java/lang/StrictMath/TrigTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -271,6 +271,10 @@ public class TrigTests { {0x1.000000000001cp300, -0x1.b30fc9f73002cp-1}, {0x1.0000000000013p500, -0x1.c4e46751be12cp-1}, {0x1.00000000000ep1023, -0x1.d52c4ec04f108p-2}, + + // Julia worst-case input + {0x1.e608f1390d9fp293, -0x1.9942a10545925p-1}, + // Empirical worst-case points in other libraries with // larger worst-case errors than FDLIBM {+0x1.371a47b7e4eb2p+11, 0x1.9ded57c9ff46ap-1}, From e4e457f6966568ed93093e57c0f7cd50f2bfba95 Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Mon, 27 Oct 2025 20:11:54 +0000 Subject: [PATCH 308/561] 8366871: (javac) legacy.properties seems to be an obsolete file Reviewed-by: liach --- .../tools/javac/resources/legacy.properties | 570 ------------------ 1 file changed, 570 deletions(-) delete mode 100644 src/jdk.compiler/share/classes/com/sun/tools/javac/resources/legacy.properties diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/legacy.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/legacy.properties deleted file mode 100644 index c8e433e67c0..00000000000 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/legacy.properties +++ /dev/null @@ -1,570 +0,0 @@ -# -# Copyright (c) 2006, 2010, 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. -# - -com.sun.accessibility.internal.resources = tiger legacy -com.sun.awt = tiger legacy -com.sun.beans = tiger legacy -com.sun.corba.se.impl.activation = tiger legacy -com.sun.corba.se.impl.copyobject = tiger legacy -com.sun.corba.se.impl.corba = tiger legacy -com.sun.corba.se.impl.dynamicany = tiger legacy -com.sun.corba.se.impl.encoding = tiger legacy -com.sun.corba.se.impl.interceptors = tiger legacy -com.sun.corba.se.impl.io = tiger legacy -com.sun.corba.se.impl.ior = tiger legacy -com.sun.corba.se.impl.ior.iiop = tiger legacy -com.sun.corba.se.impl.javax.rmi = tiger legacy -com.sun.corba.se.impl.javax.rmi.CORBA = tiger legacy -com.sun.corba.se.impl.legacy.connection = tiger legacy -com.sun.corba.se.impl.logging = tiger legacy -com.sun.corba.se.impl.monitoring = tiger legacy -com.sun.corba.se.impl.naming.cosnaming = tiger legacy -com.sun.corba.se.impl.naming.namingutil = tiger legacy -com.sun.corba.se.impl.naming.pcosnaming = tiger legacy -com.sun.corba.se.impl.oa = tiger legacy -com.sun.corba.se.impl.oa.poa = tiger legacy -com.sun.corba.se.impl.oa.toa = tiger legacy -com.sun.corba.se.impl.orb = tiger legacy -com.sun.corba.se.impl.orbutil = tiger legacy -com.sun.corba.se.impl.orbutil.closure = tiger legacy -com.sun.corba.se.impl.orbutil.concurrent = tiger legacy -com.sun.corba.se.impl.orbutil.fsm = tiger legacy -com.sun.corba.se.impl.orbutil.graph = tiger legacy -com.sun.corba.se.impl.orbutil.resources = tiger legacy -com.sun.corba.se.impl.orbutil.threadpool = tiger legacy -com.sun.corba.se.impl.presentation.rmi = tiger legacy -com.sun.corba.se.impl.protocol = tiger legacy -com.sun.corba.se.impl.protocol.giopmsgheaders = tiger legacy -com.sun.corba.se.impl.resolver = tiger legacy -com.sun.corba.se.impl.transport = tiger legacy -com.sun.corba.se.impl.util = tiger legacy -com.sun.corba.se.internal.CosNaming = tiger legacy -com.sun.corba.se.internal.Interceptors = tiger legacy -com.sun.corba.se.internal.POA = tiger legacy -com.sun.corba.se.internal.corba = tiger legacy -com.sun.corba.se.internal.iiop = tiger legacy -com.sun.corba.se.org.omg.CORBA = tiger legacy -com.sun.corba.se.pept.broker = tiger legacy -com.sun.corba.se.pept.encoding = tiger legacy -com.sun.corba.se.pept.protocol = tiger legacy -com.sun.corba.se.pept.transport = tiger legacy -com.sun.corba.se.spi.activation = tiger legacy -com.sun.corba.se.spi.activation.InitialNameServicePackage = tiger legacy -com.sun.corba.se.spi.activation.LocatorPackage = tiger legacy -com.sun.corba.se.spi.activation.RepositoryPackage = tiger legacy -com.sun.corba.se.spi.copyobject = tiger legacy -com.sun.corba.se.spi.encoding = tiger legacy -com.sun.corba.se.spi.extension = tiger legacy -com.sun.corba.se.spi.ior = tiger legacy -com.sun.corba.se.spi.ior.iiop = tiger legacy -com.sun.corba.se.spi.legacy.connection = tiger legacy -com.sun.corba.se.spi.legacy.interceptor = tiger legacy -com.sun.corba.se.spi.logging = tiger legacy -com.sun.corba.se.spi.monitoring = tiger legacy -com.sun.corba.se.spi.oa = tiger legacy -com.sun.corba.se.spi.orb = tiger legacy -com.sun.corba.se.spi.orbutil.closure = tiger legacy -com.sun.corba.se.spi.orbutil.fsm = tiger legacy -com.sun.corba.se.spi.orbutil.proxy = tiger legacy -com.sun.corba.se.spi.orbutil.threadpool = tiger legacy -com.sun.corba.se.spi.presentation.rmi = tiger legacy -com.sun.corba.se.spi.protocol = tiger legacy -com.sun.corba.se.spi.resolver = tiger legacy -com.sun.corba.se.spi.servicecontext = tiger legacy -com.sun.corba.se.spi.transport = tiger legacy -com.sun.imageio.metadata = tiger legacy -com.sun.imageio.plugins.bmp = tiger legacy -com.sun.imageio.plugins.common = tiger legacy -com.sun.imageio.plugins.gif = tiger legacy -com.sun.imageio.plugins.jpeg = tiger legacy -com.sun.imageio.plugins.png = tiger legacy -com.sun.imageio.plugins.wbmp = tiger legacy -com.sun.imageio.spi = tiger legacy -com.sun.java.swing = tiger legacy -com.sun.java.swing.plaf.gtk = tiger legacy -com.sun.java.swing.plaf.gtk.icons = tiger legacy -com.sun.java.swing.plaf.gtk.resources = tiger legacy -com.sun.java.swing.plaf.gtk.resources.metacity.SwingFallbackTheme.metacity-1 = tiger legacy -com.sun.java.swing.plaf.motif = tiger legacy -com.sun.java.swing.plaf.motif.icons = tiger legacy -com.sun.java.swing.plaf.motif.resources = tiger legacy -com.sun.java.swing.plaf.nimbus = tiger legacy -com.sun.java.swing.plaf.windows = tiger legacy -com.sun.java.swing.plaf.windows.icons = tiger legacy -com.sun.java.swing.plaf.windows.resources = tiger legacy -com.sun.java.util.jar.pack = tiger legacy -com.sun.java_cup.internal = tiger legacy -com.sun.java_cup.internal.runtime = tiger legacy -com.sun.jlex.internal = tiger legacy -com.sun.jmx.defaults = tiger legacy -com.sun.jmx.interceptor = tiger legacy -com.sun.jmx.mbeanserver = tiger legacy -com.sun.jmx.remote.internal = tiger legacy -com.sun.jmx.remote.protocol.iiop = tiger legacy -com.sun.jmx.remote.protocol.rmi = tiger legacy -com.sun.jmx.remote.security = tiger legacy -com.sun.jmx.remote.util = tiger legacy -com.sun.jmx.snmp = tiger legacy -com.sun.jmx.snmp.IPAcl = tiger legacy -com.sun.jmx.snmp.agent = tiger legacy -com.sun.jmx.snmp.daemon = tiger legacy -com.sun.jmx.snmp.defaults = tiger legacy -com.sun.jmx.snmp.internal = tiger legacy -com.sun.jmx.snmp.mpm = tiger legacy -com.sun.jmx.snmp.tasks = tiger legacy -com.sun.jmx.trace = tiger legacy -com.sun.jndi.cosnaming = tiger legacy -com.sun.jndi.dns = tiger legacy -com.sun.jndi.ldap = tiger legacy -com.sun.jndi.ldap.ext = tiger legacy -com.sun.jndi.ldap.pool = tiger legacy -com.sun.jndi.ldap.sasl = tiger legacy -com.sun.jndi.rmi.registry = tiger legacy -com.sun.jndi.toolkit.corba = tiger legacy -com.sun.jndi.toolkit.ctx = tiger legacy -com.sun.jndi.toolkit.dir = tiger legacy -com.sun.jndi.toolkit.url = tiger legacy -com.sun.jndi.url.corbaname = tiger legacy -com.sun.jndi.url.dns = tiger legacy -com.sun.jndi.url.iiop = tiger legacy -com.sun.jndi.url.iiopname = tiger legacy -com.sun.jndi.url.ldap = tiger legacy -com.sun.jndi.url.ldaps = tiger legacy -com.sun.jndi.url.rmi = tiger legacy -com.sun.management = tiger legacy -com.sun.management.jmx = tiger legacy -com.sun.media.sound = tiger legacy -com.sun.naming.internal = tiger legacy -com.sun.net.ssl = tiger legacy -com.sun.net.ssl.internal.ssl = tiger legacy -com.sun.net.ssl.internal.www.protocol.https = tiger legacy -com.sun.org.apache.bcel.internal = tiger legacy -com.sun.org.apache.bcel.internal.classfile = tiger legacy -com.sun.org.apache.bcel.internal.generic = tiger legacy -com.sun.org.apache.bcel.internal.util = tiger legacy -com.sun.org.apache.bcel.internal.verifier = tiger legacy -com.sun.org.apache.bcel.internal.verifier.exc = tiger legacy -com.sun.org.apache.bcel.internal.verifier.statics = tiger legacy -com.sun.org.apache.bcel.internal.verifier.structurals = tiger legacy -com.sun.org.apache.html.internal.dom = tiger legacy -com.sun.org.apache.regexp.internal = tiger legacy -com.sun.org.apache.wml.internal = tiger legacy -com.sun.org.apache.wml.internal.dom = tiger legacy -com.sun.org.apache.xalan.internal = tiger legacy -com.sun.org.apache.xalan.internal.client = tiger legacy -com.sun.org.apache.xalan.internal.extensions = tiger legacy -com.sun.org.apache.xalan.internal.lib = tiger legacy -com.sun.org.apache.xalan.internal.res = tiger legacy -com.sun.org.apache.xalan.internal.templates = tiger legacy -com.sun.org.apache.xalan.internal.xslt = tiger legacy -com.sun.org.apache.xalan.internal.xsltc = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.cmdline = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.compiler = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.compiler.util = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.dom = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.runtime = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.runtime.output = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.trax = tiger legacy -com.sun.org.apache.xalan.internal.xsltc.util = tiger legacy -com.sun.org.apache.xerces.internal.dom = tiger legacy -com.sun.org.apache.xerces.internal.dom.events = tiger legacy -com.sun.org.apache.xerces.internal.dom3.as = tiger legacy -com.sun.org.apache.xerces.internal.impl = tiger legacy -com.sun.org.apache.xerces.internal.impl.dtd = tiger legacy -com.sun.org.apache.xerces.internal.impl.dtd.models = tiger legacy -com.sun.org.apache.xerces.internal.impl.dv = tiger legacy -com.sun.org.apache.xerces.internal.impl.dv.dtd = tiger legacy -com.sun.org.apache.xerces.internal.impl.dv.util = tiger legacy -com.sun.org.apache.xerces.internal.impl.dv.xs = tiger legacy -com.sun.org.apache.xerces.internal.impl.io = tiger legacy -com.sun.org.apache.xerces.internal.impl.msg = tiger legacy -com.sun.org.apache.xerces.internal.impl.validation = tiger legacy -com.sun.org.apache.xerces.internal.impl.xpath = tiger legacy -com.sun.org.apache.xerces.internal.impl.xpath.regex = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.dom = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.identity = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.models = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.opti = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.traversers = tiger legacy -com.sun.org.apache.xerces.internal.impl.xs.util = tiger legacy -com.sun.org.apache.xerces.internal.jaxp = tiger legacy -com.sun.org.apache.xerces.internal.jaxp.datatype = tiger legacy -com.sun.org.apache.xerces.internal.jaxp.validation = tiger legacy -com.sun.org.apache.xerces.internal.jaxp.validation.xs = tiger legacy -com.sun.org.apache.xerces.internal.parsers = tiger legacy -com.sun.org.apache.xerces.internal.util = tiger legacy -com.sun.org.apache.xerces.internal.xinclude = tiger legacy -com.sun.org.apache.xerces.internal.xni = tiger legacy -com.sun.org.apache.xerces.internal.xni.grammars = tiger legacy -com.sun.org.apache.xerces.internal.xni.parser = tiger legacy -com.sun.org.apache.xerces.internal.xs = tiger legacy -com.sun.org.apache.xml.internal.dtm = tiger legacy -com.sun.org.apache.xml.internal.dtm.ref = tiger legacy -com.sun.org.apache.xml.internal.dtm.ref.dom2dtm = tiger legacy -com.sun.org.apache.xml.internal.dtm.ref.sax2dtm = tiger legacy -com.sun.org.apache.xml.internal.res = tiger legacy -com.sun.org.apache.xml.internal.serialize = tiger legacy -com.sun.org.apache.xml.internal.serializer = tiger legacy -com.sun.org.apache.xml.internal.utils = tiger legacy -com.sun.org.apache.xml.internal.utils.res = tiger legacy -com.sun.org.apache.xml.internal.utils.synthetic = tiger legacy -com.sun.org.apache.xml.internal.utils.synthetic.reflection = tiger legacy -com.sun.org.apache.xpath.internal = tiger legacy -com.sun.org.apache.xpath.internal.axes = tiger legacy -com.sun.org.apache.xpath.internal.compiler = tiger legacy -com.sun.org.apache.xpath.internal.functions = tiger legacy -com.sun.org.apache.xpath.internal.jaxp = tiger legacy -com.sun.org.apache.xpath.internal.objects = tiger legacy -com.sun.org.apache.xpath.internal.operations = tiger legacy -com.sun.org.apache.xpath.internal.patterns = tiger legacy -com.sun.org.apache.xpath.internal.res = tiger legacy -com.sun.org.omg.CORBA = tiger legacy -com.sun.org.omg.CORBA.ValueDefPackage = tiger legacy -com.sun.org.omg.CORBA.portable = tiger legacy -com.sun.org.omg.SendingContext = tiger legacy -com.sun.org.omg.SendingContext.CodeBasePackage = tiger legacy -com.sun.rmi.rmid = tiger legacy -com.sun.rowset = tiger legacy -com.sun.rowset.internal = tiger legacy -com.sun.rowset.providers = tiger legacy -com.sun.security.auth = tiger legacy -com.sun.security.auth.callback = tiger legacy -com.sun.security.auth.login = tiger legacy -com.sun.security.auth.module = tiger legacy -com.sun.security.cert.internal.x509 = tiger legacy -com.sun.security.jgss = tiger legacy -com.sun.security.sasl = tiger legacy -com.sun.security.sasl.digest = tiger legacy -com.sun.security.sasl.gsskerb = tiger legacy -com.sun.security.sasl.util = tiger legacy -com.sun.swing.internal.plaf.basic.resources = tiger legacy -com.sun.swing.internal.plaf.metal.resources = tiger legacy -com.sun.swing.internal.plaf.synth.resources = tiger legacy -com.sun.tracing = tiger legacy -com.sun.tracing.dtrace = tiger legacy -java.applet = tiger legacy -java.awt = tiger legacy -java.awt.color = tiger legacy -java.awt.datatransfer = tiger legacy -java.awt.dnd = tiger legacy -java.awt.dnd.peer = tiger legacy -java.awt.event = tiger legacy -java.awt.font = tiger legacy -java.awt.geom = tiger legacy -java.awt.im = tiger legacy -java.awt.im.spi = tiger legacy -java.awt.image = tiger legacy -java.awt.image.renderable = tiger legacy -java.awt.peer = tiger legacy -java.awt.print = tiger legacy -java.beans = tiger legacy -java.beans.beancontext = tiger legacy -java.io = tiger legacy -java.lang = tiger legacy -java.lang.annotation = tiger legacy -java.lang.instrument = tiger legacy -java.lang.management = tiger legacy -java.lang.ref = tiger legacy -java.lang.reflect = tiger legacy -java.math = tiger legacy -java.net = tiger legacy -java.nio = tiger legacy -java.nio.channels = tiger legacy -java.nio.channels.spi = tiger legacy -java.nio.charset = tiger legacy -java.nio.charset.spi = tiger legacy -java.rmi = tiger legacy -java.rmi.activation = tiger legacy -java.rmi.dgc = tiger legacy -java.rmi.registry = tiger legacy -java.rmi.server = tiger legacy -java.security = tiger legacy -java.security.acl = tiger legacy -java.security.cert = tiger legacy -java.security.interfaces = tiger legacy -java.security.spec = tiger legacy -java.sql = tiger legacy -java.text = tiger legacy -java.util = tiger legacy -java.util.concurrent = tiger legacy -java.util.concurrent.atomic = tiger legacy -java.util.concurrent.locks = tiger legacy -java.util.jar = tiger legacy -java.util.logging = tiger legacy -java.util.prefs = tiger legacy -java.util.regex = tiger legacy -java.util.zip = tiger legacy -javax.accessibility = tiger legacy -javax.activity = tiger legacy -javax.imageio = tiger legacy -javax.imageio.event = tiger legacy -javax.imageio.metadata = tiger legacy -javax.imageio.plugins.bmp = tiger legacy -javax.imageio.plugins.jpeg = tiger legacy -javax.imageio.spi = tiger legacy -javax.imageio.stream = tiger legacy -javax.management = tiger legacy -javax.management.loading = tiger legacy -javax.management.modelmbean = tiger legacy -javax.management.monitor = tiger legacy -javax.management.openmbean = tiger legacy -javax.management.relation = tiger legacy -javax.management.remote = tiger legacy -javax.management.remote.rmi = tiger legacy -javax.management.timer = tiger legacy -javax.naming = tiger legacy -javax.naming.directory = tiger legacy -javax.naming.event = tiger legacy -javax.naming.ldap = tiger legacy -javax.naming.spi = tiger legacy -javax.net = tiger legacy -javax.net.ssl = tiger legacy -javax.print = tiger legacy -javax.print.attribute = tiger legacy -javax.print.attribute.standard = tiger legacy -javax.print.event = tiger legacy -javax.rmi = tiger legacy -javax.rmi.CORBA = tiger legacy -javax.rmi.ssl = tiger legacy -javax.security.auth = tiger legacy -javax.security.auth.callback = tiger legacy -javax.security.auth.kerberos = tiger legacy -javax.security.auth.login = tiger legacy -javax.security.auth.spi = tiger legacy -javax.security.auth.x500 = tiger legacy -javax.security.cert = tiger legacy -javax.security.sasl = tiger legacy -javax.sound.midi = tiger legacy -javax.sound.midi.spi = tiger legacy -javax.sound.sampled = tiger legacy -javax.sound.sampled.spi = tiger legacy -javax.sql = tiger legacy -javax.sql.rowset = tiger legacy -javax.sql.rowset.serial = tiger legacy -javax.sql.rowset.spi = tiger legacy -javax.swing = tiger legacy -javax.swing.border = tiger legacy -javax.swing.colorchooser = tiger legacy -javax.swing.event = tiger legacy -javax.swing.filechooser = tiger legacy -javax.swing.plaf = tiger legacy -javax.swing.plaf.basic = tiger legacy -javax.swing.plaf.basic.icons = tiger legacy -javax.swing.plaf.metal = tiger legacy -javax.swing.plaf.metal.icons = tiger legacy -javax.swing.plaf.metal.icons.ocean = tiger legacy -javax.swing.plaf.metal.sounds = tiger legacy -javax.swing.plaf.multi = tiger legacy -javax.swing.plaf.nimbus = tiger legacy -javax.swing.plaf.synth = tiger legacy -javax.swing.table = tiger legacy -javax.swing.text = tiger legacy -javax.swing.text.html = tiger legacy -javax.swing.text.html.icons = tiger legacy -javax.swing.text.html.parser = tiger legacy -javax.swing.text.rtf = tiger legacy -javax.swing.text.rtf.charsets = tiger legacy -javax.swing.tree = tiger legacy -javax.swing.undo = tiger legacy -javax.transaction = tiger legacy -javax.transaction.xa = tiger legacy -javax.xml = tiger legacy -javax.xml.datatype = tiger legacy -javax.xml.namespace = tiger legacy -javax.xml.parsers = tiger legacy -javax.xml.transform = tiger legacy -javax.xml.transform.dom = tiger legacy -javax.xml.transform.sax = tiger legacy -javax.xml.transform.stream = tiger legacy -javax.xml.validation = tiger legacy -javax.xml.xpath = tiger legacy -org.ietf.jgss = tiger legacy -org.omg.CORBA = tiger legacy -org.omg.CORBA.DynAnyPackage = tiger legacy -org.omg.CORBA.ORBPackage = tiger legacy -org.omg.CORBA.TypeCodePackage = tiger legacy -org.omg.CORBA.portable = tiger legacy -org.omg.CORBA_2_3 = tiger legacy -org.omg.CORBA_2_3.portable = tiger legacy -org.omg.CosNaming = tiger legacy -org.omg.CosNaming.NamingContextExtPackage = tiger legacy -org.omg.CosNaming.NamingContextPackage = tiger legacy -org.omg.Dynamic = tiger legacy -org.omg.DynamicAny = tiger legacy -org.omg.DynamicAny.DynAnyFactoryPackage = tiger legacy -org.omg.DynamicAny.DynAnyPackage = tiger legacy -org.omg.IOP = tiger legacy -org.omg.IOP.CodecFactoryPackage = tiger legacy -org.omg.IOP.CodecPackage = tiger legacy -org.omg.Messaging = tiger legacy -org.omg.PortableInterceptor = tiger legacy -org.omg.PortableInterceptor.ORBInitInfoPackage = tiger legacy -org.omg.PortableServer = tiger legacy -org.omg.PortableServer.CurrentPackage = tiger legacy -org.omg.PortableServer.POAManagerPackage = tiger legacy -org.omg.PortableServer.POAPackage = tiger legacy -org.omg.PortableServer.ServantLocatorPackage = tiger legacy -org.omg.PortableServer.portable = tiger legacy -org.omg.SendingContext = tiger legacy -org.omg.stub.java.rmi = tiger legacy -org.omg.stub.javax.management.remote.rmi = tiger legacy -org.w3c.dom = tiger legacy -org.w3c.dom.bootstrap = tiger legacy -org.w3c.dom.css = tiger legacy -org.w3c.dom.events = tiger legacy -org.w3c.dom.html = tiger legacy -org.w3c.dom.ls = tiger legacy -org.w3c.dom.ranges = tiger legacy -org.w3c.dom.stylesheets = tiger legacy -org.w3c.dom.traversal = tiger legacy -org.w3c.dom.views = tiger legacy -org.xml.sax = tiger legacy -org.xml.sax.ext = tiger legacy -org.xml.sax.helpers = tiger legacy -sun.applet = tiger legacy -sun.applet.resources = tiger legacy -sun.audio = tiger legacy -sun.awt = tiger legacy -sun.awt.X11 = tiger legacy -sun.awt.color = tiger legacy -sun.awt.datatransfer = tiger legacy -sun.awt.dnd = tiger legacy -sun.awt.geom = tiger legacy -sun.awt.im = tiger legacy -sun.awt.image = tiger legacy -sun.awt.image.codec = tiger legacy -sun.awt.motif = tiger legacy -sun.awt.resources = tiger legacy -sun.awt.shell = tiger legacy -sun.awt.windows = tiger legacy -sun.beans.editors = tiger legacy -sun.beans.infos = tiger legacy -sun.corba = tiger legacy -sun.dc.path = tiger legacy -sun.dc.pr = tiger legacy -sun.font = tiger legacy -sun.instrument = tiger legacy -sun.io = tiger legacy -sun.java2d = tiger legacy -sun.java2d.loops = tiger legacy -sun.java2d.opengl = tiger legacy -sun.java2d.pipe = tiger legacy -sun.jdbc.odbc = tiger legacy -sun.jdbc.odbc.ee = tiger legacy -sun.management = tiger legacy -sun.management.counter = tiger legacy -sun.management.counter.perf = tiger legacy -sun.management.jmxremote = tiger legacy -sun.management.resources = tiger legacy -sun.management.snmp = tiger legacy -sun.management.snmp.jvminstr = tiger legacy -sun.management.snmp.jvmmib = tiger legacy -sun.management.snmp.util = tiger legacy -sun.misc = tiger legacy -sun.misc.resources = tiger legacy -sun.net = tiger legacy -sun.net.dns = tiger legacy -sun.net.ftp = tiger legacy -sun.net.smtp = tiger legacy -sun.net.spi = tiger legacy -sun.net.spi.nameservice = tiger legacy -sun.net.util = tiger legacy -sun.net.www = tiger legacy -sun.net.www.content.audio = tiger legacy -sun.net.www.content.image = tiger legacy -sun.net.www.content.text = tiger legacy -sun.net.www.http = tiger legacy -sun.net.www.protocol.doc = tiger legacy -sun.net.www.protocol.file = tiger legacy -sun.net.www.protocol.ftp = tiger legacy -sun.net.www.protocol.gopher = tiger legacy -sun.net.www.protocol.http = tiger legacy -sun.net.www.protocol.https = tiger legacy -sun.net.www.protocol.jar = tiger legacy -sun.net.www.protocol.mailto = tiger legacy -sun.net.www.protocol.netdoc = tiger legacy -sun.net.www.protocol.systemresource = tiger legacy -sun.net.www.protocol.verbatim = tiger legacy -sun.nio = tiger legacy -sun.nio.ch = tiger legacy -sun.nio.cs = tiger legacy -sun.print = tiger legacy -sun.print.resources = tiger legacy -sun.reflect = tiger legacy -sun.reflect.annotation = tiger legacy -sun.reflect.generics.factory = tiger legacy -sun.reflect.generics.parser = tiger legacy -sun.reflect.generics.reflectiveObjects = tiger legacy -sun.reflect.generics.repository = tiger legacy -sun.reflect.generics.scope = tiger legacy -sun.reflect.generics.tree = tiger legacy -sun.reflect.generics.visitor = tiger legacy -sun.rmi.log = tiger legacy -sun.rmi.registry = tiger legacy -sun.rmi.registry.resources = tiger legacy -sun.rmi.rmid.resources = tiger legacy -sun.rmi.runtime = tiger legacy -sun.rmi.server = tiger legacy -sun.rmi.transport = tiger legacy -sun.rmi.transport.proxy = tiger legacy -sun.rmi.transport.tcp = tiger legacy -sun.security.action = tiger legacy -sun.security.jca = tiger legacy -sun.security.jgss = tiger legacy -sun.security.jgss.krb5 = tiger legacy -sun.security.jgss.spi = tiger legacy -sun.security.krb5 = tiger legacy -sun.security.krb5.internal = tiger legacy -sun.security.krb5.internal.ccache = tiger legacy -sun.security.krb5.internal.crypto = tiger legacy -sun.security.krb5.internal.crypto.dk = tiger legacy -sun.security.krb5.internal.ktab = tiger legacy -sun.security.krb5.internal.rcache = tiger legacy -sun.security.krb5.internal.tools = tiger legacy -sun.security.krb5.internal.util = tiger legacy -sun.security.pkcs = tiger legacy -sun.security.provider = tiger legacy -sun.security.provider.certpath = tiger legacy -sun.security.rsa = tiger legacy -sun.security.timestamp = tiger legacy -sun.security.tools = tiger legacy -sun.security.util = tiger legacy -sun.security.validator = tiger legacy -sun.security.x509 = tiger legacy -sun.swing = tiger legacy -sun.swing.plaf.synth = tiger legacy -sun.text = tiger legacy -sun.text.resources = tiger legacy -sun.tools.hprof = tiger legacy -sun.tools.jar = tiger legacy -sun.tools.jar.resources = tiger legacy -sun.util = tiger legacy -sun.util.calendar = tiger legacy -sun.util.locale = tiger legacy -sun.util.logging.resources = tiger legacy -sunw.io = tiger legacy -sunw.util = tiger legacy From 70aa3678fccddc1a626fd86b9cec348fae571555 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Mon, 27 Oct 2025 20:58:33 +0000 Subject: [PATCH 309/561] 8370520: GenShen: Track and report on promotion failures Reviewed-by: shade, fandreuzzi --- .../shenandoah/shenandoahGenerationalHeap.cpp | 4 ++ .../gc/shenandoah/shenandoahOldGeneration.cpp | 52 +++++++++++-------- .../gc/shenandoah/shenandoahOldGeneration.hpp | 24 ++++++--- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index bc653b030a8..3db810a9d9d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -1090,6 +1090,10 @@ void ShenandoahGenerationalHeap::complete_concurrent_cycle() { entry_global_coalesce_and_fill(); } + log_info(gc, cset)("Concurrent cycle complete, promotions reserved: %zu, promotions expended: %zu, failed count: %zu, failed bytes: %zu", + old_generation()->get_promoted_reserve(), old_generation()->get_promoted_expended(), + old_generation()->get_promotion_failed_count(), old_generation()->get_promotion_failed_words() * HeapWordSize); + TransferResult result; { ShenandoahHeapLocker locker(lock()); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp index ac3107eb396..095aa0079ae 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp @@ -204,6 +204,8 @@ ShenandoahOldGeneration::ShenandoahOldGeneration(uint max_queues, size_t max_cap _promoted_expended(0), _promotion_potential(0), _pad_for_promote_in_place(0), + _promotion_failure_count(0), + _promotion_failure_words(0), _promotable_humongous_regions(0), _promotable_regular_regions(0), _is_parsable(true), @@ -240,7 +242,9 @@ void ShenandoahOldGeneration::augment_promoted_reserve(size_t increment) { void ShenandoahOldGeneration::reset_promoted_expended() { shenandoah_assert_heaplocked_or_safepoint(); - AtomicAccess::store(&_promoted_expended, (size_t) 0); + AtomicAccess::store(&_promoted_expended, static_cast(0)); + AtomicAccess::store(&_promotion_failure_count, static_cast(0)); + AtomicAccess::store(&_promotion_failure_words, static_cast(0)); } size_t ShenandoahOldGeneration::expend_promoted(size_t increment) { @@ -669,38 +673,42 @@ void ShenandoahOldGeneration::handle_failed_evacuation() { } void ShenandoahOldGeneration::handle_failed_promotion(Thread* thread, size_t size) { + AtomicAccess::inc(&_promotion_failure_count); + AtomicAccess::add(&_promotion_failure_words, size); + + LogTarget(Debug, gc, plab) lt; + LogStream ls(lt); + if (lt.is_enabled()) { + log_failed_promotion(ls, thread, size); + } +} + +void ShenandoahOldGeneration::log_failed_promotion(LogStream& ls, Thread* thread, size_t size) const { // We squelch excessive reports to reduce noise in logs. - const size_t MaxReportsPerEpoch = 4; + constexpr size_t MaxReportsPerEpoch = 4; static size_t last_report_epoch = 0; static size_t epoch_report_count = 0; - auto heap = ShenandoahGenerationalHeap::heap(); - - size_t promotion_reserve; - size_t promotion_expended; + const auto heap = ShenandoahGenerationalHeap::heap(); const size_t gc_id = heap->control_thread()->get_gc_id(); - if ((gc_id != last_report_epoch) || (epoch_report_count++ < MaxReportsPerEpoch)) { - { - // Promotion failures should be very rare. Invest in providing useful diagnostic info. - ShenandoahHeapLocker locker(heap->lock()); - promotion_reserve = get_promoted_reserve(); - promotion_expended = get_promoted_expended(); - } + // Promotion failures should be very rare. Invest in providing useful diagnostic info. PLAB* const plab = ShenandoahThreadLocalData::plab(thread); const size_t words_remaining = (plab == nullptr)? 0: plab->words_remaining(); const char* promote_enabled = ShenandoahThreadLocalData::allow_plab_promotions(thread)? "enabled": "disabled"; - log_info(gc, ergo)("Promotion failed, size %zu, has plab? %s, PLAB remaining: %zu" - ", plab promotions %s, promotion reserve: %zu, promotion expended: %zu" - ", old capacity: %zu, old_used: %zu, old unaffiliated regions: %zu", - size * HeapWordSize, plab == nullptr? "no": "yes", - words_remaining * HeapWordSize, promote_enabled, promotion_reserve, promotion_expended, - max_capacity(), used(), free_unaffiliated_regions()); + // Promoted reserve is only changed by vm or control thread. Promoted expended is always accessed atomically. + const size_t promotion_reserve = get_promoted_reserve(); + const size_t promotion_expended = get_promoted_expended(); - if ((gc_id == last_report_epoch) && (epoch_report_count >= MaxReportsPerEpoch)) { - log_debug(gc, ergo)("Squelching additional promotion failure reports for current epoch"); - } else if (gc_id != last_report_epoch) { + ls.print_cr("Promotion failed, size %zu, has plab? %s, PLAB remaining: %zu" + ", plab promotions %s, promotion reserve: %zu, promotion expended: %zu" + ", old capacity: %zu, old_used: %zu, old unaffiliated regions: %zu", + size * HeapWordSize, plab == nullptr? "no": "yes", + words_remaining * HeapWordSize, promote_enabled, promotion_reserve, promotion_expended, + max_capacity(), used(), free_unaffiliated_regions()); + + if (gc_id != last_report_epoch) { last_report_epoch = gc_id; epoch_report_count = 1; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp index abc865c31cd..28d2a30493c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp @@ -32,6 +32,7 @@ #include "gc/shenandoah/shenandoahScanRemembered.hpp" #include "gc/shenandoah/shenandoahSharedVariables.hpp" +class LogStream; class ShenandoahHeapRegion; class ShenandoahHeapRegionClosure; class ShenandoahOldHeuristics; @@ -65,16 +66,21 @@ private: // remaining in a PLAB when it is retired. size_t _promoted_expended; - // Represents the quantity of live bytes we expect to promote in place during the next - // evacuation cycle. This value is used by the young heuristic to trigger mixed collections. + // Represents the quantity of live bytes we expect to promote during the next evacuation + // cycle. This value is used by the young heuristic to trigger mixed collections. // It is also used when computing the optimum size for the old generation. size_t _promotion_potential; // When a region is selected to be promoted in place, the remaining free memory is filled // in to prevent additional allocations (preventing premature promotion of newly allocated - // objects. This field records the total amount of padding used for such regions. + // objects). This field records the total amount of padding used for such regions. size_t _pad_for_promote_in_place; + // Keep track of the number and size of promotions that failed. Perhaps we should use this to increase + // the size of the old generation for the next collection cycle. + size_t _promotion_failure_count; + size_t _promotion_failure_words; + // During construction of the collection set, we keep track of regions that are eligible // for promotion in place. These fields track the count of those humongous and regular regions. // This data is used to force the evacuation phase even when the collection set is otherwise @@ -119,6 +125,10 @@ public: // This is used on the allocation path to gate promotions that would exceed the reserve size_t get_promoted_expended() const; + // Return the count and size (in words) of failed promotions since the last reset + size_t get_promotion_failed_count() const { return AtomicAccess::load(&_promotion_failure_count); } + size_t get_promotion_failed_words() const { return AtomicAccess::load(&_promotion_failure_words); } + // Test if there is enough memory reserved for this promotion bool can_promote(size_t requested_bytes) const { size_t promotion_avail = get_promoted_reserve(); @@ -137,9 +147,10 @@ public: // See description in field declaration void set_region_balance(ssize_t balance) { _region_balance = balance; } ssize_t get_region_balance() const { return _region_balance; } + // See description in field declaration - void set_promotion_potential(size_t val) { _promotion_potential = val; }; - size_t get_promotion_potential() const { return _promotion_potential; }; + void set_promotion_potential(size_t val) { _promotion_potential = val; } + size_t get_promotion_potential() const { return _promotion_potential; } // See description in field declaration void set_pad_for_promote_in_place(size_t pad) { _pad_for_promote_in_place = pad; } @@ -161,8 +172,9 @@ public: // This will signal the control thread to run a full GC instead of a futile degenerated gc void handle_failed_evacuation(); - // This logs that an evacuation to the old generation has failed + // Increment promotion failure counters, optionally log a more detailed message void handle_failed_promotion(Thread* thread, size_t size); + void log_failed_promotion(LogStream& ls, Thread* thread, size_t size) const; // A successful evacuation re-dirties the cards and registers the object with the remembered set void handle_evacuation(HeapWord* obj, size_t words, bool promotion); From 4e8e55db602702715135d28a3a3b160e2101593b Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Mon, 27 Oct 2025 21:13:51 +0000 Subject: [PATCH 310/561] 8370633: Remove dead code for Windows file path canonicalization functions Reviewed-by: alanb, iris --- .../native/libjava/WinNTFileSystem_md.c | 36 ------------ .../windows/native/libjava/canonicalize_md.c | 58 ------------------- 2 files changed, 94 deletions(-) diff --git a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c index ccf89eb71e0..974d5c11d7e 100644 --- a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c +++ b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c @@ -60,7 +60,6 @@ Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls) /* -- Path operations -- */ extern int wcanonicalize(const WCHAR *path, WCHAR *out, int len); -extern int wcanonicalizeWithPrefix(const WCHAR *canonicalPrefix, const WCHAR *pathWithCanonicalPrefix, WCHAR *out, int len); /** * Retrieves the fully resolved (final) path for the given path or NULL @@ -296,41 +295,6 @@ Java_java_io_WinNTFileSystem_canonicalize0(JNIEnv *env, jobject this, } -JNIEXPORT jstring JNICALL -Java_java_io_WinNTFileSystem_canonicalizeWithPrefix0(JNIEnv *env, jobject this, - jstring canonicalPrefixString, - jstring pathWithCanonicalPrefixString) -{ - jstring rv = NULL; - WCHAR canonicalPath[MAX_PATH_LENGTH]; - WITH_UNICODE_STRING(env, canonicalPrefixString, canonicalPrefix) { - WITH_UNICODE_STRING(env, pathWithCanonicalPrefixString, pathWithCanonicalPrefix) { - int len = (int)wcslen(canonicalPrefix) + MAX_PATH; - if (len > MAX_PATH_LENGTH) { - WCHAR *cp = (WCHAR*)malloc(len * sizeof(WCHAR)); - if (cp != NULL) { - if (wcanonicalizeWithPrefix(canonicalPrefix, - pathWithCanonicalPrefix, - cp, len) >= 0) { - rv = (*env)->NewString(env, cp, (jsize)wcslen(cp)); - } - free(cp); - } else { - JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); - } - } else if (wcanonicalizeWithPrefix(canonicalPrefix, - pathWithCanonicalPrefix, - canonicalPath, MAX_PATH_LENGTH) >= 0) { - rv = (*env)->NewString(env, canonicalPath, (jsize)wcslen(canonicalPath)); - } - } END_UNICODE_STRING(env, pathWithCanonicalPrefix); - } END_UNICODE_STRING(env, canonicalPrefix); - if (rv == NULL && !(*env)->ExceptionCheck(env)) { - JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); - } - return rv; -} - JNIEXPORT jstring JNICALL Java_java_io_WinNTFileSystem_getFinalPath0(JNIEnv* env, jobject this, jstring pathname) { jstring rv = NULL; diff --git a/src/java.base/windows/native/libjava/canonicalize_md.c b/src/java.base/windows/native/libjava/canonicalize_md.c index 7e567c7fbb4..3719ec75d11 100644 --- a/src/java.base/windows/native/libjava/canonicalize_md.c +++ b/src/java.base/windows/native/libjava/canonicalize_md.c @@ -268,64 +268,6 @@ wcanonicalize(WCHAR *orig_path, WCHAR *result, int size) return -1; } -/* Convert a pathname to canonical form. The input prefix is assumed - to be in canonical form already, and the trailing filename must not - contain any wildcard, dot/double dot, or other "tricky" characters - that are rejected by the canonicalize() routine above. This - routine is present to allow the canonicalization prefix cache to be - used while still returning canonical names with the correct - capitalization. */ -int -wcanonicalizeWithPrefix(WCHAR *canonicalPrefix, WCHAR *pathWithCanonicalPrefix, WCHAR *result, int size) -{ - WIN32_FIND_DATAW fd; - HANDLE h; - WCHAR *src, *dst, *dend; - WCHAR *pathbuf; - int pathlen; - - src = pathWithCanonicalPrefix; - dst = result; /* Place results here */ - dend = dst + size; /* Don't go to or past here */ - - - if ((pathlen=(int)wcslen(pathWithCanonicalPrefix)) > MAX_PATH - 1) { - pathbuf = getPrefixed(pathWithCanonicalPrefix, pathlen); - h = FindFirstFileW(pathbuf, &fd); /* Look up prefix */ - free(pathbuf); - } else - h = FindFirstFileW(pathWithCanonicalPrefix, &fd); /* Look up prefix */ - if (h != INVALID_HANDLE_VALUE) { - /* Lookup succeeded; append true name to result and continue */ - FindClose(h); - if (!(dst = wcp(dst, dend, L'\0', - canonicalPrefix, - canonicalPrefix + wcslen(canonicalPrefix)))) { - return -1; - } - if (!(dst = wcp(dst, dend, L'\\', - fd.cFileName, - fd.cFileName + wcslen(fd.cFileName)))) { - return -1; - } - } else { - if (!lastErrorReportable()) { - if (!(dst = wcp(dst, dend, L'\0', src, src + wcslen(src)))) { - return -1; - } - } else { - return -1; - } - } - - if (dst >= dend) { - errno = ENAMETOOLONG; - return -1; - } - *dst = L'\0'; - return 0; -} - /* Non-Wide character version of canonicalize. Converts to wchar and delegates to wcanonicalize. */ JNIEXPORT int From 2f613911d58478913dc482e1500d3fbab74408b9 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Mon, 27 Oct 2025 21:14:13 +0000 Subject: [PATCH 311/561] 8370387: Remove handling of InterruptedIOException from java.io classes Reviewed-by: alanb --- .../share/classes/java/io/PrintStream.java | 26 +------------------ .../share/classes/java/io/PrintWriter.java | 14 +--------- 2 files changed, 2 insertions(+), 38 deletions(-) diff --git a/src/java.base/share/classes/java/io/PrintStream.java b/src/java.base/share/classes/java/io/PrintStream.java index 0c1dd20e668..5d8e2b167c9 100644 --- a/src/java.base/share/classes/java/io/PrintStream.java +++ b/src/java.base/share/classes/java/io/PrintStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -508,9 +508,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -541,9 +538,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -626,8 +620,6 @@ public class PrintStream extends FilterOutputStream } } } - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -649,9 +641,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -668,9 +657,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -692,9 +678,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -711,9 +694,6 @@ public class PrintStream extends FilterOutputStream out.flush(); } } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { trouble = true; } @@ -1182,8 +1162,6 @@ public class PrintStream extends FilterOutputStream formatter = new Formatter((Appendable) this); formatter.format(Locale.getDefault(Locale.Category.FORMAT), format, args); } - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -1238,8 +1216,6 @@ public class PrintStream extends FilterOutputStream formatter = new Formatter(this, l); formatter.format(l, format, args); } - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } diff --git a/src/java.base/share/classes/java/io/PrintWriter.java b/src/java.base/share/classes/java/io/PrintWriter.java index dd6deb75ab7..d09a1b63798 100644 --- a/src/java.base/share/classes/java/io/PrintWriter.java +++ b/src/java.base/share/classes/java/io/PrintWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 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 @@ -460,8 +460,6 @@ public class PrintWriter extends Writer { try { ensureOpen(); out.write(c); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -484,8 +482,6 @@ public class PrintWriter extends Writer { try { ensureOpen(); out.write(buf, off, len); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -517,8 +513,6 @@ public class PrintWriter extends Writer { try { ensureOpen(); out.write(s, off, len); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -541,8 +535,6 @@ public class PrintWriter extends Writer { out.write(System.lineSeparator()); if (autoFlush) out.flush(); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -973,8 +965,6 @@ public class PrintWriter extends Writer { formatter.format(Locale.getDefault(), format, args); if (autoFlush) out.flush(); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } @@ -1032,8 +1022,6 @@ public class PrintWriter extends Writer { formatter.format(l, format, args); if (autoFlush) out.flush(); - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } From b3e63aeab304016b9b479a05f44ed1c8dfb0b9bb Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Tue, 28 Oct 2025 01:21:26 +0000 Subject: [PATCH 312/561] 8370649: Add intermittent tag for gc/shenandoah/generational/TestOldGrowthTriggers.java Reviewed-by: wkemper --- .../jtreg/gc/shenandoah/generational/TestOldGrowthTriggers.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/gc/shenandoah/generational/TestOldGrowthTriggers.java b/test/hotspot/jtreg/gc/shenandoah/generational/TestOldGrowthTriggers.java index b5d191e33ba..5182d4a9ea3 100644 --- a/test/hotspot/jtreg/gc/shenandoah/generational/TestOldGrowthTriggers.java +++ b/test/hotspot/jtreg/gc/shenandoah/generational/TestOldGrowthTriggers.java @@ -25,6 +25,7 @@ /* * @test id=generational * @summary Test that growth of old-gen triggers old-gen marking + * @key intermittent * @requires vm.gc.Shenandoah * @library /test/lib * @run driver TestOldGrowthTriggers From 460a69bd5088f92a2843ee4e89b29a71cab81d52 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Tue, 28 Oct 2025 02:41:21 +0000 Subject: [PATCH 313/561] 8017266: Background is painted taller than needed for styled text. Reviewed-by: kizune, dnguyen --- .../classes/javax/swing/text/GlyphView.java | 4 +- .../text/GlyphView/TestGlyphBGHeight.java | 108 ++++++++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java diff --git a/src/java.desktop/share/classes/javax/swing/text/GlyphView.java b/src/java.desktop/share/classes/javax/swing/text/GlyphView.java index 792d99fd7db..ef9d1bbe1ea 100644 --- a/src/java.desktop/share/classes/javax/swing/text/GlyphView.java +++ b/src/java.desktop/share/classes/javax/swing/text/GlyphView.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -391,7 +391,7 @@ public class GlyphView extends View implements TabableView, Cloneable { } if (bg != null) { g.setColor(bg); - g.fillRect(alloc.x, alloc.y, alloc.width, alloc.height); + g.fillRect(alloc.x, alloc.y, alloc.width, (int)painter.getHeight(this)); } if (c instanceof JTextComponent) { JTextComponent tc = (JTextComponent) c; diff --git a/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java b/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java new file mode 100644 index 00000000000..000ba16339e --- /dev/null +++ b/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java @@ -0,0 +1,108 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8017266 + * @key headful + * @summary Verifies if Background is painted taller than needed for styled text. + * @run main TestGlyphBGHeight + */ + +import java.io.File; +import java.awt.Graphics2D; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.awt.Robot; +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JTextPane; +import javax.swing.text.Style; +import javax.swing.text.StyleConstants; +import javax.swing.text.StyledDocument; +import javax.swing.SwingUtilities; + +public class TestGlyphBGHeight { + + static JFrame frame; + + public static void main(String[] args) throws Exception { + int width = 100; + int height = 100; + + try { + Robot robot = new Robot(); + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame("TestGlyphBGHeight"); + frame.setSize(width, height); + frame.getContentPane().setLayout(new BorderLayout()); + + final JTextPane comp = new JTextPane(); + final StyledDocument doc = comp.getStyledDocument(); + + Style style = comp.addStyle("superscript", null); + StyleConstants.setSuperscript(style, true); + StyleConstants.setFontSize(style, 32); + StyleConstants.setBackground(style, Color.YELLOW); + try { + doc.insertString(doc.getLength(), "hello", style); + } catch (Exception e) {} + + comp.setDocument(doc); + comp.setBackground(Color.RED); + + frame.getContentPane().add(comp, BorderLayout.CENTER); + + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + robot.waitForIdle(); + robot.delay(1000); + + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = (Graphics2D) img.getGraphics(); + frame.paint(g2d); + ImageIO.write(img, "png", new File("AppTest.png")); + g2d.dispose(); + + BufferedImage bimg = img.getSubimage(0, 80, width, 1); + ImageIO.write(bimg, "png", new File("AppTest1.png")); + robot.waitForIdle(); + robot.delay(1000); + for (int x = 10; x < width / 2; x++) { + Color col = new Color(bimg.getRGB(x, 0)); + System.out.println(Integer.toHexString(bimg.getRGB(x, 0))); + if (col.equals(Color.YELLOW)) { + throw new RuntimeException(" Background is painted taller than needed for styled text"); + } + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + } +} From 327b7c3cd854bea3ffce557b981df535d5ed04bf Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 28 Oct 2025 03:10:19 +0000 Subject: [PATCH 314/561] 8370100: Redundant .png files in Linux app-image cause unnecessary bloat Reviewed-by: almatvee --- .../jpackage/internal/DesktopIntegration.java | 27 +--- .../jpackage/internal/LinuxAppBundler.java | 4 +- .../jpackage/internal/LinuxDebBundler.java | 9 +- .../jpackage/internal/LinuxFromParams.java | 5 +- .../internal/LinuxPackagingPipeline.java | 21 ++- .../jpackage/internal/LinuxRpmBundler.java | 9 +- .../jdk/jpackage/internal/MacFromParams.java | 4 +- .../jpackage/internal/ApplicationBuilder.java | 107 ++++++++++++++ .../internal/ApplicationImageUtils.java | 47 +++---- .../jdk/jpackage/internal/FromParams.java | 14 +- .../jpackage/internal/LauncherBuilder.java | 13 ++ .../internal/model/CustomLauncherIcon.java | 4 +- .../internal/model/DefaultLauncherIcon.java | 10 +- .../jdk/jpackage/internal/model/Launcher.java | 8 +- .../jpackage/internal/model/LauncherIcon.java | 2 +- .../model/ResourceDirLauncherIcon.java | 73 ++++++++++ .../internal/util/CompositeProxy.java | 130 +++++++++++++++--- .../jdk/jpackage/internal/WinFromParams.java | 5 +- .../internal/WinPackagingPipeline.java | 2 +- .../jdk/jpackage/test/FileAssociations.java | 12 +- .../jpackage/test/LauncherIconVerifier.java | 23 ++-- .../jdk/jpackage/test/LauncherVerifier.java | 25 +++- .../jdk/jpackage/test/LinuxHelper.java | 82 +++++++++-- .../jdk/jpackage/test/PackageTest.java | 4 +- test/jdk/tools/jpackage/share/IconTest.java | 8 ++ 25 files changed, 515 insertions(+), 133 deletions(-) create mode 100644 src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ResourceDirLauncherIcon.java diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/DesktopIntegration.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/DesktopIntegration.java index 790d5d877aa..dbaa5e3eec6 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/DesktopIntegration.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/DesktopIntegration.java @@ -26,12 +26,10 @@ package jdk.jpackage.internal; import static jdk.jpackage.internal.ApplicationImageUtils.createLauncherIconResource; import static jdk.jpackage.internal.model.LauncherShortcut.toRequest; -import static jdk.jpackage.internal.util.function.ThrowingFunction.toFunction; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -82,22 +80,12 @@ final class DesktopIntegration extends ShellCustomAction { // - user explicitly requested to create a shortcut boolean withDesktopFile = !associations.isEmpty() || toRequest(launcher.shortcut()).orElse(false); - var curIconResource = createLauncherIconResource(pkg.app(), launcher, - env::createResource); - - if (curIconResource.isEmpty()) { + if (!launcher.hasIcon()) { // This is additional launcher with explicit `no icon` configuration. withDesktopFile = false; - } else { - try { - if (curIconResource.get().saveToFile((Path)null) != OverridableResource.Source.DefaultResource) { - // This launcher has custom icon configured. - withDesktopFile = true; - } - } catch (IOException ex) { - // Should never happen as `saveToFile((Path)null)` should not perform any actual I/O operations. - throw new UncheckedIOException(ex); - } + } else if (launcher.hasCustomIcon()) { + // This launcher has custom icon configured. + withDesktopFile = true; } desktopFileResource = env.createResource("template.desktop") @@ -119,17 +107,12 @@ final class DesktopIntegration extends ShellCustomAction { if (withDesktopFile) { desktopFile = Optional.of(createDesktopFile(desktopFileName)); iconFile = Optional.of(createDesktopFile(escapedAppFileName + ".png")); - - if (curIconResource.isEmpty()) { - // Create default icon. - curIconResource = createLauncherIconResource(pkg.app(), pkg.app().mainLauncher().orElseThrow(), env::createResource); - } } else { desktopFile = Optional.empty(); iconFile = Optional.empty(); } - iconResource = curIconResource; + iconResource = createLauncherIconResource(launcher, env::createResource); desktopFileData = createDataForDesktopFile(); diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppBundler.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppBundler.java index 992ec630c0e..fe8d6bcf34f 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppBundler.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppBundler.java @@ -25,13 +25,15 @@ package jdk.jpackage.internal; +import java.util.Optional; + public class LinuxAppBundler extends AppImageBundler { public LinuxAppBundler() { setAppImageSupplier((params, output) -> { // Order is important! var app = LinuxFromParams.APPLICATION.fetchFrom(params); var env = BuildEnvFromParams.BUILD_ENV.fetchFrom(params); - LinuxPackagingPipeline.build() + LinuxPackagingPipeline.build(Optional.empty()) .excludeDirFromCopying(output.getParent()) .create().execute(BuildEnv.withAppImageDir(env, output), app); }); diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebBundler.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebBundler.java index 9e2ea63cc32..76a08519b48 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebBundler.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxDebBundler.java @@ -27,6 +27,7 @@ package jdk.jpackage.internal; import java.nio.file.Path; import java.util.Map; +import java.util.Optional; import jdk.jpackage.internal.model.LinuxDebPackage; import jdk.jpackage.internal.model.PackagerException; import jdk.jpackage.internal.model.StandardPackageType; @@ -51,12 +52,14 @@ public class LinuxDebBundler extends LinuxPackageBundler { @Override public Path execute(Map params, Path outputParentDir) throws PackagerException { + var pkg = LinuxFromParams.DEB_PACKAGE.fetchFrom(params); + return Packager.build().outputDir(outputParentDir) - .pkg(LinuxFromParams.DEB_PACKAGE.fetchFrom(params)) + .pkg(pkg) .env(BuildEnvFromParams.BUILD_ENV.fetchFrom(params)) - .pipelineBuilderMutatorFactory((env, pkg, outputDir) -> { + .pipelineBuilderMutatorFactory((env, _, outputDir) -> { return new LinuxDebPackager(env, pkg, outputDir, sysEnv.orElseThrow()); - }).execute(LinuxPackagingPipeline.build()); + }).execute(LinuxPackagingPipeline.build(Optional.of(pkg))); } @Override diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxFromParams.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxFromParams.java index a8d109220dc..e9d1416b5c3 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxFromParams.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxFromParams.java @@ -43,6 +43,7 @@ import jdk.jpackage.internal.model.LinuxDebPackage; import jdk.jpackage.internal.model.LinuxLauncher; import jdk.jpackage.internal.model.LinuxLauncherMixin; import jdk.jpackage.internal.model.LinuxRpmPackage; +import jdk.jpackage.internal.model.Launcher; import jdk.jpackage.internal.model.StandardPackageType; final class LinuxFromParams { @@ -55,7 +56,9 @@ final class LinuxFromParams { final var launcher = launcherFromParams.create(launcherParams); final var shortcut = findLauncherShortcut(LINUX_SHORTCUT_HINT, params, launcherParams); return LinuxLauncher.create(launcher, new LinuxLauncherMixin.Stub(shortcut)); - }), APPLICATION_LAYOUT).create(); + }), (LinuxLauncher linuxLauncher, Launcher launcher) -> { + return LinuxLauncher.create(launcher, linuxLauncher); + }, APPLICATION_LAYOUT).create(); return LinuxApplication.create(app); } diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxPackagingPipeline.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxPackagingPipeline.java index dd29338655d..6f6013b3091 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxPackagingPipeline.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxPackagingPipeline.java @@ -25,17 +25,20 @@ package jdk.jpackage.internal; import static jdk.jpackage.internal.ApplicationImageUtils.createLauncherIconResource; -import jdk.jpackage.internal.PackagingPipeline.AppImageBuildEnv; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Optional; +import jdk.jpackage.internal.PackagingPipeline.AppImageBuildEnv; import jdk.jpackage.internal.PackagingPipeline.BuildApplicationTaskID; import jdk.jpackage.internal.PackagingPipeline.PrimaryTaskID; import jdk.jpackage.internal.PackagingPipeline.TaskID; import jdk.jpackage.internal.model.Application; import jdk.jpackage.internal.model.ApplicationLayout; +import jdk.jpackage.internal.model.Launcher; +import jdk.jpackage.internal.model.LinuxPackage; import jdk.jpackage.internal.resources.ResourceLocator; final class LinuxPackagingPipeline { @@ -45,14 +48,20 @@ final class LinuxPackagingPipeline { LAUNCHER_ICONS } - static PackagingPipeline.Builder build() { - return PackagingPipeline.buildStandard() + static PackagingPipeline.Builder build(Optional pkg) { + var builder = PackagingPipeline.buildStandard() .task(LinuxAppImageTaskID.LAUNCHER_LIB) .addDependent(PrimaryTaskID.BUILD_APPLICATION_IMAGE) .applicationAction(LinuxPackagingPipeline::writeLauncherLib).add() .task(LinuxAppImageTaskID.LAUNCHER_ICONS) .addDependent(BuildApplicationTaskID.CONTENT) .applicationAction(LinuxPackagingPipeline::writeLauncherIcons).add(); + + pkg.ifPresent(_ -> { + builder.task(LinuxAppImageTaskID.LAUNCHER_ICONS).noaction().add(); + }); + + return builder; } private static void writeLauncherLib( @@ -68,8 +77,8 @@ final class LinuxPackagingPipeline { private static void writeLauncherIcons( AppImageBuildEnv env) throws IOException { - for (var launcher : env.app().launchers()) { - createLauncherIconResource(env.app(), launcher, env.env()::createResource).ifPresent(iconResource -> { + env.app().launchers().stream().filter(Launcher::hasCustomIcon).forEach(launcher -> { + createLauncherIconResource(launcher, env.env()::createResource).ifPresent(iconResource -> { String iconFileName = launcher.executableName() + ".png"; Path iconTarget = env.resolvedLayout().desktopIntegrationDirectory().resolve(iconFileName); try { @@ -78,7 +87,7 @@ final class LinuxPackagingPipeline { throw new UncheckedIOException(ex); } }); - } + }); } static final LinuxApplicationLayout APPLICATION_LAYOUT = LinuxApplicationLayout.create( diff --git a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmBundler.java b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmBundler.java index 2337a286011..c134aa91d6a 100644 --- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmBundler.java +++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxRpmBundler.java @@ -27,6 +27,7 @@ package jdk.jpackage.internal; import java.nio.file.Path; import java.util.Map; +import java.util.Optional; import jdk.jpackage.internal.model.LinuxRpmPackage; import jdk.jpackage.internal.model.PackagerException; import jdk.jpackage.internal.model.StandardPackageType; @@ -52,12 +53,14 @@ public class LinuxRpmBundler extends LinuxPackageBundler { @Override public Path execute(Map params, Path outputParentDir) throws PackagerException { + var pkg = LinuxFromParams.RPM_PACKAGE.fetchFrom(params); + return Packager.build().outputDir(outputParentDir) - .pkg(LinuxFromParams.RPM_PACKAGE.fetchFrom(params)) + .pkg(pkg) .env(BuildEnvFromParams.BUILD_ENV.fetchFrom(params)) - .pipelineBuilderMutatorFactory((env, pkg, outputDir) -> { + .pipelineBuilderMutatorFactory((env, _, outputDir) -> { return new LinuxRpmPackager(env, pkg, outputDir, sysEnv.orElseThrow()); - }).execute(LinuxPackagingPipeline.build()); + }).execute(LinuxPackagingPipeline.build(Optional.of(pkg))); } @Override diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java index e2d8750e39c..72c33ef6475 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacFromParams.java @@ -92,7 +92,9 @@ final class MacFromParams { final var superAppBuilder = createApplicationBuilder(params, toFunction(launcherParams -> { var launcher = launcherFromParams.create(launcherParams); return MacLauncher.create(launcher); - }), APPLICATION_LAYOUT, RUNTIME_BUNDLE_LAYOUT, predefinedRuntimeLayout.map(RuntimeLayout::unresolve)); + }), (MacLauncher _, Launcher launcher) -> { + return MacLauncher.create(launcher); + }, APPLICATION_LAYOUT, RUNTIME_BUNDLE_LAYOUT, predefinedRuntimeLayout.map(RuntimeLayout::unresolve)); if (hasPredefinedAppImage(params)) { // Set the main launcher start up info. diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java index 9b5ed5b3b08..76a5fc1a50c 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationBuilder.java @@ -32,7 +32,9 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Predicate; import jdk.jpackage.internal.model.AppImageLayout; import jdk.jpackage.internal.model.Application; import jdk.jpackage.internal.model.ApplicationLaunchers; @@ -40,7 +42,9 @@ import jdk.jpackage.internal.model.ConfigException; import jdk.jpackage.internal.model.ExternalApplication; import jdk.jpackage.internal.model.ExternalApplication.LauncherInfo; import jdk.jpackage.internal.model.Launcher; +import jdk.jpackage.internal.model.LauncherIcon; import jdk.jpackage.internal.model.LauncherStartupInfo; +import jdk.jpackage.internal.model.ResourceDirLauncherIcon; import jdk.jpackage.internal.model.RuntimeBuilder; final class ApplicationBuilder { @@ -168,6 +172,97 @@ final class ApplicationBuilder { return this; } + static ApplicationLaunchers normalizeIcons( + ApplicationLaunchers appLaunchers, Optional resourceDir, BiFunction launcherOverrideCtor) { + + Objects.requireNonNull(resourceDir); + + return normalizeLauncherProperty(appLaunchers, Launcher::hasDefaultIcon, (T launcher) -> { + return resourceDir.flatMap(dir -> { + var resource = LauncherBuilder.createLauncherIconResource(launcher, _ -> { + return new OverridableResource() + .setResourceDir(dir) + .setSourceOrder(OverridableResource.Source.ResourceDir); + }); + if (resource.probe() == OverridableResource.Source.ResourceDir) { + return Optional.of(ResourceDirLauncherIcon.create(resource.getPublicName().toString())); + } else { + return Optional.empty(); + } + }); + }, launcher -> { + return launcher.icon().orElseThrow(); + }, (launcher, icon) -> { + return launcherOverrideCtor.apply(launcher, overrideIcon(launcher, icon)); + }); + } + + static ApplicationLaunchers normalizeLauncherProperty( + ApplicationLaunchers appLaunchers, + Predicate needsNormalization, + Function> normalizedPropertyValueFinder, + BiFunction propertyOverrider) { + + return normalizeLauncherProperty( + appLaunchers, + needsNormalization, + normalizedPropertyValueFinder, + launcher -> { + return normalizedPropertyValueFinder.apply(launcher).orElseThrow(); + }, + propertyOverrider); + } + + static ApplicationLaunchers normalizeLauncherProperty( + ApplicationLaunchers appLaunchers, + Predicate needsNormalization, + Function> normalizedPropertyValueFinder, + Function normalizedPropertyValueGetter, + BiFunction propertyOverrider) { + + Objects.requireNonNull(appLaunchers); + Objects.requireNonNull(needsNormalization); + Objects.requireNonNull(normalizedPropertyValueFinder); + Objects.requireNonNull(normalizedPropertyValueGetter); + Objects.requireNonNull(propertyOverrider); + + boolean[] modified = new boolean[1]; + + @SuppressWarnings("unchecked") + var newLaunchers = appLaunchers.asList().stream().map(launcher -> { + return (U)launcher; + }).map(launcher -> { + if (needsNormalization.test(launcher)) { + return normalizedPropertyValueFinder.apply(launcher).map(normalizedPropertyValue -> { + modified[0] = true; + return propertyOverrider.apply(launcher, normalizedPropertyValue); + }).orElse(launcher); + } else { + return launcher; + } + }).toList(); + + var newMainLauncher = newLaunchers.getFirst(); + if (!needsNormalization.test(newMainLauncher)) { + // The main launcher doesn't require normalization. + newLaunchers = newLaunchers.stream().map(launcher -> { + if (needsNormalization.test(launcher)) { + var normalizedPropertyValue = normalizedPropertyValueGetter.apply(newMainLauncher); + modified[0] = true; + return propertyOverrider.apply(launcher, normalizedPropertyValue); + } else { + return launcher; + } + }).toList(); + } + + if (modified[0]) { + return ApplicationLaunchers.fromList(newLaunchers).orElseThrow(); + } else { + return appLaunchers; + } + } + static Launcher overrideLauncherStartupInfo(Launcher launcher, LauncherStartupInfo startupInfo) { return new Launcher.Stub( launcher.name(), @@ -195,6 +290,18 @@ final class ApplicationBuilder { app.extraAppImageFileData()); } + private static Launcher overrideIcon(Launcher launcher, LauncherIcon icon) { + return new Launcher.Stub( + launcher.name(), + launcher.startupInfo(), + launcher.fileAssociations(), + launcher.isService(), + launcher.description(), + Optional.of(icon), + launcher.defaultIconResourceName(), + launcher.extraAppImageFileData()); + } + record MainLauncherStartupInfo(String qualifiedClassName) implements LauncherStartupInfo { @Override public List javaOptions() { diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java index cda5b6c79ef..3d2ffbfdc7c 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ApplicationImageUtils.java @@ -26,7 +26,6 @@ package jdk.jpackage.internal; import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; -import static jdk.jpackage.internal.util.function.ThrowingSupplier.toSupplier; import java.io.IOException; import java.nio.file.Files; @@ -43,44 +42,36 @@ import jdk.jpackage.internal.PackagingPipeline.ApplicationImageTaskAction; import jdk.jpackage.internal.model.Application; import jdk.jpackage.internal.model.ApplicationLayout; import jdk.jpackage.internal.model.CustomLauncherIcon; +import jdk.jpackage.internal.model.DefaultLauncherIcon; import jdk.jpackage.internal.model.Launcher; +import jdk.jpackage.internal.model.ResourceDirLauncherIcon; import jdk.jpackage.internal.util.FileUtils; -import jdk.jpackage.internal.util.PathUtils; final class ApplicationImageUtils { - static Optional createLauncherIconResource(Application app, - Launcher launcher, + static Optional createLauncherIconResource(Launcher launcher, Function resourceSupplier) { - final String defaultIconName = launcher.defaultIconResourceName(); - final String resourcePublicName = launcher.executableName() + PathUtils.getSuffix(Path.of(defaultIconName)); - if (!launcher.hasIcon()) { - return Optional.empty(); - } + return launcher.icon().map(icon -> { + var resource = LauncherBuilder.createLauncherIconResource(launcher, resourceSupplier); - OverridableResource resource = resourceSupplier.apply(defaultIconName) - .setCategory("icon") - .setPublicName(resourcePublicName); - - launcher.icon().flatMap(CustomLauncherIcon::fromLauncherIcon).map(CustomLauncherIcon::path).ifPresent(resource::setExternal); - - if (launcher.hasDefaultIcon() && app.mainLauncher().orElseThrow() != launcher) { - // No icon explicitly configured for this launcher. - // Dry-run resource creation to figure out its source. - final Path nullPath = null; - if (toSupplier(() -> resource.saveToFile(nullPath)).get() != OverridableResource.Source.ResourceDir) { - // No icon in resource dir for this launcher, inherit icon - // configured for the main launcher. - return createLauncherIconResource( - app, app.mainLauncher().orElseThrow(), - resourceSupplier - ).map(r -> r.setLogPublicName(resourcePublicName)); + switch (icon) { + case DefaultLauncherIcon _ -> { + resource.setSourceOrder(OverridableResource.Source.DefaultResource); + } + case ResourceDirLauncherIcon v -> { + resource.setSourceOrder(OverridableResource.Source.ResourceDir); + resource.setPublicName(v.name()); + } + case CustomLauncherIcon v -> { + resource.setSourceOrder(OverridableResource.Source.External); + resource.setExternal(v.path()); + } } - } - return Optional.of(resource); + return resource; + }); } static ApplicationImageTaskAction createWriteRuntimeAction() { diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java index 8cfab61c9c0..df9cc528439 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java @@ -47,6 +47,7 @@ import static jdk.jpackage.internal.StandardBundlerParam.NAME; import static jdk.jpackage.internal.StandardBundlerParam.PREDEFINED_APP_IMAGE; import static jdk.jpackage.internal.StandardBundlerParam.PREDEFINED_APP_IMAGE_FILE; import static jdk.jpackage.internal.StandardBundlerParam.PREDEFINED_RUNTIME_IMAGE; +import static jdk.jpackage.internal.StandardBundlerParam.RESOURCE_DIR; import static jdk.jpackage.internal.StandardBundlerParam.SOURCE_DIR; import static jdk.jpackage.internal.StandardBundlerParam.VENDOR; import static jdk.jpackage.internal.StandardBundlerParam.VERSION; @@ -60,6 +61,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.BiFunction; import java.util.function.Function; import jdk.jpackage.internal.model.Application; import jdk.jpackage.internal.model.ApplicationLaunchers; @@ -76,14 +78,16 @@ import jdk.jpackage.internal.util.function.ThrowingFunction; final class FromParams { - static ApplicationBuilder createApplicationBuilder(Map params, + static ApplicationBuilder createApplicationBuilder(Map params, Function, Launcher> launcherMapper, + BiFunction launcherOverrideCtor, ApplicationLayout appLayout) throws ConfigException, IOException { - return createApplicationBuilder(params, launcherMapper, appLayout, RuntimeLayout.DEFAULT, Optional.of(RuntimeLayout.DEFAULT)); + return createApplicationBuilder(params, launcherMapper, launcherOverrideCtor, appLayout, RuntimeLayout.DEFAULT, Optional.of(RuntimeLayout.DEFAULT)); } - static ApplicationBuilder createApplicationBuilder(Map params, + static ApplicationBuilder createApplicationBuilder(Map params, Function, Launcher> launcherMapper, + BiFunction launcherOverrideCtor, ApplicationLayout appLayout, RuntimeLayout runtimeLayout, Optional predefinedRuntimeLayout) throws ConfigException, IOException { @@ -133,7 +137,9 @@ final class FromParams { jlinkOptionsBuilder.apply(); }); - appBuilder.launchers(launchers).runtimeBuilder(runtimeBuilderBuilder.create()); + final var normalizedLaunchers = ApplicationBuilder.normalizeIcons(launchers, RESOURCE_DIR.findIn(params), launcherOverrideCtor); + + appBuilder.launchers(normalizedLaunchers).runtimeBuilder(runtimeBuilderBuilder.create()); } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherBuilder.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherBuilder.java index 5ce98165a4a..0f6b5d6ac8d 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherBuilder.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/LauncherBuilder.java @@ -32,14 +32,18 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.function.Function; import jdk.internal.util.OperatingSystem; import jdk.jpackage.internal.model.ConfigException; import jdk.jpackage.internal.model.CustomLauncherIcon; +import jdk.jpackage.internal.model.DefaultLauncherIcon; import jdk.jpackage.internal.model.FileAssociation; import jdk.jpackage.internal.model.Launcher; import jdk.jpackage.internal.model.Launcher.Stub; +import jdk.jpackage.internal.util.PathUtils; import jdk.jpackage.internal.model.LauncherIcon; import jdk.jpackage.internal.model.LauncherStartupInfo; +import jdk.jpackage.internal.model.ResourceDirLauncherIcon; final class LauncherBuilder { @@ -110,6 +114,15 @@ final class LauncherBuilder { return Optional.ofNullable(name).orElseGet(() -> startupInfo.simpleClassName()); } + static OverridableResource createLauncherIconResource(Launcher launcher, + Function resourceSupplier) { + + var defaultIconResourceName = launcher.defaultIconResourceName(); + return resourceSupplier.apply(defaultIconResourceName) + .setPublicName(launcher.executableName() + PathUtils.getSuffix(Path.of(defaultIconResourceName))) + .setCategory("icon"); + } + static void validateIcon(Path icon) throws ConfigException { switch (OperatingSystem.current()) { case WINDOWS -> { diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/CustomLauncherIcon.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/CustomLauncherIcon.java index 13216535680..5819c42fcda 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/CustomLauncherIcon.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/CustomLauncherIcon.java @@ -29,11 +29,11 @@ import java.util.Objects; import java.util.Optional; /** - * Custom application launcher icon. + * Custom application launcher icon sourced from an external file. *

          * Use {@link #create(Path)} method to create an instance of this type. */ -public interface CustomLauncherIcon extends LauncherIcon { +public sealed interface CustomLauncherIcon extends LauncherIcon { /** * Returns path to icon file. diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DefaultLauncherIcon.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DefaultLauncherIcon.java index 4275b84ba80..51847349458 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DefaultLauncherIcon.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/DefaultLauncherIcon.java @@ -29,11 +29,11 @@ import java.util.Optional; /** * Default application launcher icon. *

          - * Default icon is either loaded from the resources of {@link jdk.jpackage} module or picked from the resource directory. + * Default icon is loaded from the resources of {@link jdk.jpackage} module. *

          * Use {@link #INSTANCE} field to get an instance of this type. */ -public interface DefaultLauncherIcon extends LauncherIcon { +public sealed interface DefaultLauncherIcon extends LauncherIcon { /** * Returns the given icon as {@link DefaultLauncherIcon} type or an empty {@link Optional} instance @@ -53,5 +53,9 @@ public interface DefaultLauncherIcon extends LauncherIcon { /** * Singleton. */ - public static DefaultLauncherIcon INSTANCE = new DefaultLauncherIcon() {}; + public static DefaultLauncherIcon INSTANCE = new Details.Impl(); + + static final class Details { + private static final class Impl implements DefaultLauncherIcon {} + } } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/Launcher.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/Launcher.java index ac60b503fe4..4c729072839 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/Launcher.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/Launcher.java @@ -151,16 +151,18 @@ public interface Launcher { } /** - * Returns true if this launcher has a custom icon. + * Returns true if this launcher has non-default icon. + *

          + * A custom icon can be sourced from an external file or from the resource directory. * - * @return true if this launcher has a custom icon + * @return true if this launcher has non-default icon * @see CustomLauncherIcon * @see #icon() * @see #hasDefaultIcon() * @see #hasIcon() */ default boolean hasCustomIcon() { - return icon().flatMap(CustomLauncherIcon::fromLauncherIcon).isPresent(); + return !hasDefaultIcon() && icon().isPresent(); } /** diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/LauncherIcon.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/LauncherIcon.java index bd7a9955b90..dee20013c31 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/LauncherIcon.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/LauncherIcon.java @@ -27,5 +27,5 @@ package jdk.jpackage.internal.model; /** * Application launcher icon. */ -public interface LauncherIcon { +public sealed interface LauncherIcon permits DefaultLauncherIcon, ResourceDirLauncherIcon, CustomLauncherIcon { } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ResourceDirLauncherIcon.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ResourceDirLauncherIcon.java new file mode 100644 index 00000000000..835fcb4b6bd --- /dev/null +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/model/ResourceDirLauncherIcon.java @@ -0,0 +1,73 @@ +/* + * 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 jdk.jpackage.internal.model; + +import java.util.Objects; +import java.util.Optional; + +/** + * Custom application launcher icon sourced from the resource directory. + *

          + * Use {@link #create(String)} method to create an instance of this type. + */ +public sealed interface ResourceDirLauncherIcon extends LauncherIcon { + + /** + * Returns name of the resource referencing an icon file in the resource directory. + * @return name of the resource referencing an icon file in the resource directory + */ + String name(); + + /** + * Returns the given icon as {@link ResourceDirLauncherIcon} type or an empty {@link Optional} instance + * if the given icon object is not an instance of {@link ResourceDirLauncherIcon} type. + * + * @param icon application launcher icon object or null + * @return the given icon as {@link ResourceDirLauncherIcon} type or an empty {@link Optional} instance + */ + public static Optional fromLauncherIcon(LauncherIcon icon) { + if (icon instanceof ResourceDirLauncherIcon customIcon) { + return Optional.of(customIcon); + } else { + return Optional.empty(); + } + } + + /** + * Creates object of type {@link ResourceDirLauncherIcon} from the name of the resource referencing an icon file in the resource directory. + * @param name name of the resource referencing an icon file in the resource directory + * @return {@link ResourceDirLauncherIcon} instance + */ + public static ResourceDirLauncherIcon create(String name) { + Objects.requireNonNull(name); + return new Stub(name); + } + + /** + * Default implementation of {@link ResourceDirLauncherIcon} type. + */ + record Stub(String name) implements ResourceDirLauncherIcon { + } +} diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/CompositeProxy.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/CompositeProxy.java index 4fe5fe9039e..39a9d319468 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/CompositeProxy.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/CompositeProxy.java @@ -25,14 +25,17 @@ package jdk.jpackage.internal.util; import static java.util.stream.Collectors.toMap; +import static java.util.stream.Collectors.toSet; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -291,26 +294,119 @@ public final class CompositeProxy { return proxy; } - private static Map, Object> createInterfaceDispatch(Class[] interfaces, Object[] slices) { + private record InterfaceDispatchBuilder(Set> interfaces, Collection slices) { - final Map, Object> interfaceDispatch = Stream.of(interfaces).collect(toMap(x -> x, iface -> { - return Stream.of(slices).filter(obj -> { - return Set.of(obj.getClass().getInterfaces()).contains(iface); - }).reduce((a, b) -> { - throw new IllegalArgumentException( - String.format("both [%s] and [%s] slices implement %s", a, b, iface)); - }).orElseThrow(() -> createInterfaceNotImplementedException(List.of(iface))); - })); + InterfaceDispatchBuilder { + Objects.requireNonNull(interfaces); + Objects.requireNonNull(slices); - if (interfaceDispatch.size() != interfaces.length) { - final List> missingInterfaces = new ArrayList<>(Set.of(interfaces)); - missingInterfaces.removeAll(interfaceDispatch.keySet()); - throw createInterfaceNotImplementedException(missingInterfaces); + if (interfaces.isEmpty()) { + throw new IllegalArgumentException("No interfaces to dispatch"); + } + + if (slices.isEmpty()) { + throw createInterfaceNotImplementedException(interfaces); + } } - return Stream.of(interfaces).flatMap(iface -> { + InterfaceDispatchBuilder(Result result) { + this(result.unservedInterfaces(), result.unusedSlices()); + } + + Map, List> createDispatchGroups() { + return interfaces.stream().collect(toMap(x -> x, iface -> { + return slices.stream().filter(obj -> { + return Stream.of(obj.getClass().getInterfaces()).flatMap(sliceIface -> { + return unfoldInterface(sliceIface); + }).anyMatch(Predicate.isEqual(iface)); + }).toList(); + })); + } + + Result createDispatch() { + var groups = createDispatchGroups(); + + var dispatch = groups.entrySet().stream().filter(e -> { + return e.getValue().size() == 1; + }).collect(toMap(Map.Entry::getKey, e -> { + return e.getValue().getFirst(); + })); + + var unservedInterfaces = groups.entrySet().stream().filter(e -> { + return e.getValue().size() != 1; + }).map(Map.Entry::getKey).collect(toSet()); + + var usedSliceIdentities = dispatch.values().stream() + .map(IdentityWrapper::new) + .collect(toSet()); + + var unusedSliceIdentities = new HashSet<>(toIdentitySet(slices)); + unusedSliceIdentities.removeAll(usedSliceIdentities); + + return new Result(dispatch, unservedInterfaces, unusedSliceIdentities.stream().map(IdentityWrapper::value).toList()); + } + + private record Result(Map, Object> dispatch, Set> unservedInterfaces, Collection unusedSlices) { + + Result { + Objects.requireNonNull(dispatch); + Objects.requireNonNull(unservedInterfaces); + Objects.requireNonNull(unusedSlices); + + if (!Collections.disjoint(dispatch.keySet(), unservedInterfaces)) { + throw new IllegalArgumentException(); + } + + if (!Collections.disjoint(toIdentitySet(dispatch.values()), toIdentitySet(unusedSlices))) { + throw new IllegalArgumentException(); + } + } + } + + private static Collection> toIdentitySet(Collection v) { + return v.stream().map(IdentityWrapper::new).collect(toSet()); + } + } + + private static Map, Object> createInterfaceDispatch(Class[] interfaces, Object[] slices) { + + if (interfaces.length == 0) { + return Collections.emptyMap(); + } + + Map, Object> dispatch = new HashMap<>(); + + var builder = new InterfaceDispatchBuilder(Set.of(interfaces), List.of(slices)); + for (;;) { + var result = builder.createDispatch(); + if (result.dispatch().isEmpty()) { + var unserved = builder.createDispatchGroups(); + for (var e : unserved.entrySet()) { + var iface = e.getKey(); + var ifaceSlices = e.getValue(); + if (ifaceSlices.size() > 1) { + throw new IllegalArgumentException( + String.format("multiple slices %s implement %s", ifaceSlices, iface)); + } + } + + var unservedInterfaces = unserved.entrySet().stream().filter(e -> { + return e.getValue().isEmpty(); + }).map(Map.Entry::getKey).toList(); + throw createInterfaceNotImplementedException(unservedInterfaces); + } else { + dispatch.putAll(result.dispatch()); + if (result.unservedInterfaces().isEmpty()) { + break; + } + } + + builder = new InterfaceDispatchBuilder(result); + } + + return dispatch.keySet().stream().flatMap(iface -> { return unfoldInterface(iface).map(unfoldedIface -> { - return Map.entry(unfoldedIface, interfaceDispatch.get(iface)); + return Map.entry(unfoldedIface, dispatch.get(iface)); }); }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); } @@ -321,7 +417,7 @@ public final class CompositeProxy { } private static IllegalArgumentException createInterfaceNotImplementedException( - Collection> missingInterfaces) { + Collection> missingInterfaces) { return new IllegalArgumentException(String.format("none of the slices implement %s", missingInterfaces)); } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromParams.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromParams.java index 29c1b665f86..2d4225f5a5b 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromParams.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinFromParams.java @@ -41,6 +41,7 @@ import java.io.IOException; import java.util.Map; import java.util.UUID; import jdk.jpackage.internal.model.ConfigException; +import jdk.jpackage.internal.model.Launcher; import jdk.jpackage.internal.model.WinApplication; import jdk.jpackage.internal.model.WinExePackage; import jdk.jpackage.internal.model.WinLauncher; @@ -66,7 +67,9 @@ final class WinFromParams { return WinLauncher.create(launcher, new WinLauncherMixin.Stub(isConsole, startMenuShortcut, desktopShortcut)); - }), APPLICATION_LAYOUT).create(); + }), (WinLauncher winLauncher, Launcher launcher) -> { + return WinLauncher.create(launcher, winLauncher); + }, APPLICATION_LAYOUT).create(); return WinApplication.create(app); } diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinPackagingPipeline.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinPackagingPipeline.java index 2fa7dd895c3..f359a61ce7b 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinPackagingPipeline.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WinPackagingPipeline.java @@ -56,7 +56,7 @@ final class WinPackagingPipeline { private static void rebrandLaunchers(AppImageBuildEnv env) throws IOException, PackagerException { for (var launcher : env.app().launchers()) { - final var iconTarget = createLauncherIconResource(env.app(), launcher, env.env()::createResource).map(iconResource -> { + final var iconTarget = createLauncherIconResource(launcher, env.env()::createResource).map(iconResource -> { var iconDir = env.env().buildRoot().resolve("icons"); var theIconTarget = iconDir.resolve(launcher.executableName() + ".ico"); try { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java index 576e294874a..eb9cb4b0cb6 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/FileAssociations.java @@ -32,7 +32,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.TreeMap; -import jdk.jpackage.internal.util.PathUtils; public final class FileAssociations { @@ -75,13 +74,6 @@ public final class FileAssociations { return this; } - Path getLinuxIconFileName() { - if (icon == null) { - return null; - } - return Path.of(getMime().replace('/', '-') + PathUtils.getSuffix(icon)); - } - Path getPropertiesFile() { return file; } @@ -94,6 +86,10 @@ public final class FileAssociations { return "application/x-jpackage-" + suffixName; } + boolean hasIcon() { + return icon != null; + } + public void applyTo(PackageTest test) { test.notForTypes(PackageType.MAC_DMG, () -> { test.addInitializer(cmd -> { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java index 79652a9828e..9d0c97160f7 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherIconVerifier.java @@ -66,18 +66,11 @@ public final class LauncherIconVerifier { } public void applyTo(JPackageCommand cmd) throws IOException { - final String curLauncherName; - final String label; - if (launcherName == null) { - curLauncherName = cmd.name(); - label = "main"; - } else { - curLauncherName = launcherName; - label = String.format("[%s]", launcherName); - } + final String label = Optional.ofNullable(launcherName).map(v -> { + return String.format("[%s]", v); + }).orElse("main"); - Path iconPath = cmd.appLayout().desktopIntegrationDirectory().resolve( - curLauncherName + TKit.ICON_SUFFIX); + Path iconPath = cmd.appLayout().desktopIntegrationDirectory().resolve(iconFileName(cmd)); if (TKit.isWindows()) { TKit.assertPathExists(iconPath, false); @@ -99,6 +92,14 @@ public final class LauncherIconVerifier { } } + private Path iconFileName(JPackageCommand cmd) { + if (TKit.isLinux()) { + return LinuxHelper.getLauncherIconFileName(cmd, launcherName); + } else { + return Path.of(Optional.ofNullable(launcherName).orElseGet(cmd::name) + TKit.ICON_SUFFIX); + } + } + private String launcherName; private Path expectedIcon; private boolean expectedDefault; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java index 55cb38f21cf..489788b565a 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java @@ -204,7 +204,7 @@ public final class LauncherVerifier { verifier.setExpectedIcon(icon); } }, () -> { - // No "icon" property in the property file + // No "icon" property in the property file. iconInResourceDir(cmd, name).ifPresentOrElse(verifier::setExpectedIcon, () -> { // No icon for this additional launcher in the resource directory. mainLauncherIcon.ifPresentOrElse(verifier::setExpectedIcon, verifier::setExpectedDefaultIcon); @@ -212,6 +212,29 @@ public final class LauncherVerifier { }); } + if (TKit.isLinux()) { + // On Linux, a launcher may have an icon only if it has a corresponding .desktop file. + // In case of "app-image" packaging there are no .desktop files, but jpackage will add icon files + // in the app image anyways so that in two-step packaging jpackage can pick the icons for .desktop files. + // jpackage should not add the default icon to the app image in case of "app-image" packaging. + if (cmd.isImagePackageType()) { + // This is "app-image" packaging. Let's see if, in two-step packaging, + // jpackage creates a .desktop file for this launcher. + if (!withLinuxDesktopFile(cmd.createMutableCopy().setPackageType(PackageType.LINUX_RPM))) { + // No .desktop file in the "future" package for this launcher, + // then don't expect an icon in the app image produced by the `cmd`. + verifier.setExpectedNoIcon(); + } else if (verifier.expectDefaultIcon()) { + // A .desktop file in the "future" package for this launcher, + // but it will use the default icon. + // Don't expect an icon in the app image produced by the `cmd`. + verifier.setExpectedNoIcon(); + } + } else if (!withLinuxDesktopFile(cmd)) { + verifier.setExpectedNoIcon(); + } + } + return verifier; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 9776ab5c4c8..4bc8295eaf8 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -22,11 +22,11 @@ */ package jdk.jpackage.test; -import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import static java.util.Collections.unmodifiableSortedSet; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; +import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import java.io.IOException; import java.io.UncheckedIOException; @@ -45,6 +45,7 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -90,9 +91,7 @@ public final class LinuxHelper { public static Path getDesktopFile(JPackageCommand cmd, String launcherName) { cmd.verifyIsOfType(PackageType.LINUX); - String desktopFileName = String.format("%s-%s.desktop", getPackageName( - cmd), Optional.ofNullable(launcherName).orElseGet( - () -> cmd.name()).replaceAll("\\s+", "_")); + var desktopFileName = getLauncherDesktopFileName(cmd, launcherName); return cmd.appLayout().desktopIntegrationDirectory().resolve( desktopFileName); } @@ -204,6 +203,20 @@ public final class LinuxHelper { } } + private static Path getFaIconFileName(JPackageCommand cmd, String mimeType) { + return Path.of(mimeType.replace('/', '-') + ".png"); + } + + static Path getLauncherDesktopFileName(JPackageCommand cmd, String launcherName) { + return Path.of(String.format("%s-%s.desktop", getPackageName(cmd), + Optional.ofNullable(launcherName).orElseGet(cmd::name).replaceAll("\\s+", "_"))); + } + + static Path getLauncherIconFileName(JPackageCommand cmd, String launcherName) { + return Path.of(String.format("%s.png", + Optional.ofNullable(launcherName).orElseGet(cmd::name).replaceAll("\\s+", "_"))); + } + static PackageHandlers createDebPackageHandlers() { return new PackageHandlers(LinuxHelper::installDeb, LinuxHelper::uninstallDeb, LinuxHelper::unpackDeb); } @@ -423,7 +436,12 @@ public final class LinuxHelper { }); } - static void verifyDesktopFiles(JPackageCommand cmd, boolean installed) { + static void verifyDesktopIntegrationFiles(JPackageCommand cmd, boolean installed) { + verifyDesktopFiles(cmd, installed); + verifyAllIconsReferenced(cmd); + } + + private static void verifyDesktopFiles(JPackageCommand cmd, boolean installed) { final var desktopFiles = getDesktopFiles(cmd); try { if (installed) { @@ -479,6 +497,39 @@ public final class LinuxHelper { }).map(packageDir::relativize); } + private static void verifyAllIconsReferenced(JPackageCommand cmd) { + + var installCmd = Optional.ofNullable(cmd.unpackedPackageDirectory()).map(_ -> { + return cmd.createMutableCopy().setUnpackedPackageLocation(null); + }).orElse(cmd); + + var installedIconFiles = relativePackageFilesInSubdirectory( + installCmd, + ApplicationLayout::desktopIntegrationDirectory + ).filter(path -> { + return ".png".equals(PathUtils.getSuffix(path)); + }).map(installCmd.appLayout().desktopIntegrationDirectory()::resolve).collect(toSet()); + + var referencedIcons = getDesktopFiles(cmd).stream().map(path -> { + return new DesktopFile(path, false); + }).mapMulti((desktopFile, sink) -> { + desktopFile.findQuotedValue("Icon").map(Path::of).ifPresent(sink); + desktopFile.find("MimeType").ifPresent(str -> { + Stream.of(str.split(";")) + .map(mimeType -> { + return getFaIconFileName(cmd, mimeType); + }) + .map(installCmd.appLayout().desktopIntegrationDirectory()::resolve) + .forEach(sink); + }); + }).collect(toSet()); + + var unreferencedIconFiles = Comm.compare(installedIconFiles, referencedIcons).unique1().stream().sorted().toList(); + + // Verify that all package icon (.png) files are referenced from package .desktop files. + TKit.assertEquals(List.of(), unreferencedIconFiles, "Check there are no unreferenced icon files in the package"); + } + private static String launcherNameFromDesktopFile(JPackageCommand cmd, Optional predefinedAppImage, Path desktopFile) { Objects.requireNonNull(cmd); Objects.requireNonNull(predefinedAppImage); @@ -661,16 +712,19 @@ public final class LinuxHelper { }); test.addBundleVerifier(cmd -> { - final Path mimeTypeIconFileName = fa.getLinuxIconFileName(); - if (mimeTypeIconFileName != null) { - // Verify there are xdg registration commands for mime icon file. - Path mimeTypeIcon = cmd.appLayout().desktopIntegrationDirectory().resolve( - mimeTypeIconFileName); + Optional.of(fa).filter(FileAssociations::hasIcon) + .map(FileAssociations::getMime) + .map(mimeType -> { + return getFaIconFileName(cmd, mimeType); + }).ifPresent(mimeTypeIconFileName -> { + // Verify there are xdg registration commands for mime icon file. + Path mimeTypeIcon = cmd.appLayout().desktopIntegrationDirectory().resolve( + mimeTypeIconFileName); - Map> scriptlets = getScriptlets(cmd); - scriptlets.entrySet().stream().forEach(e -> verifyIconInScriptlet( - e.getKey(), e.getValue(), mimeTypeIcon)); - } + Map> scriptlets = getScriptlets(cmd); + scriptlets.entrySet().stream().forEach(e -> verifyIconInScriptlet( + e.getKey(), e.getValue(), mimeTypeIcon)); + }); }); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java index 3226811fe36..2e73f43b58d 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java @@ -784,7 +784,7 @@ public final class PackageTest extends RunnablePackageTest { } if (isOfType(cmd, LINUX)) { - LinuxHelper.verifyDesktopFiles(cmd, true); + LinuxHelper.verifyDesktopIntegrationFiles(cmd, true); } } @@ -865,7 +865,7 @@ public final class PackageTest extends RunnablePackageTest { } if (isOfType(cmd, LINUX)) { - LinuxHelper.verifyDesktopFiles(cmd, false); + LinuxHelper.verifyDesktopIntegrationFiles(cmd, false); } } diff --git a/test/jdk/tools/jpackage/share/IconTest.java b/test/jdk/tools/jpackage/share/IconTest.java index 03726e524dc..12458eda34b 100644 --- a/test/jdk/tools/jpackage/share/IconTest.java +++ b/test/jdk/tools/jpackage/share/IconTest.java @@ -409,6 +409,14 @@ public class IconTest { iconType = mainLauncherIconType; } + if (TKit.isLinux()) { + var noDefaultIcon = cmd.isImagePackageType() || !cmd.hasArgument("--linux-shortcut"); + + if (noDefaultIcon && iconType == IconType.DefaultIcon) { + iconType = IconType.NoIcon; + } + } + return iconType; } From 05ee55efcf138a28c895c395c49934390d10ee45 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Tue, 28 Oct 2025 06:33:41 +0000 Subject: [PATCH 315/561] 8369219: JNI::RegisterNatives causes a memory leak in CodeCache Reviewed-by: shade, apangin, dlong --- src/hotspot/share/code/nmethod.cpp | 2 +- .../NativeWrapperCollection.java | 101 ++++++++++++++++++ .../libnativeWrapperCollection.cpp | 44 ++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 test/hotspot/jtreg/gc/NativeWrapperCollection/NativeWrapperCollection.java create mode 100644 test/hotspot/jtreg/gc/NativeWrapperCollection/libnativeWrapperCollection.cpp diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 8e6a1797480..53c75c7ae43 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -2638,7 +2638,7 @@ void nmethod::metadata_do(MetadataClosure* f) { // Main purpose is to reduce code cache pressure and get rid of // nmethods that don't seem to be all that relevant any longer. bool nmethod::is_cold() { - if (!MethodFlushing || is_native_method() || is_not_installed()) { + if (!MethodFlushing || is_not_installed()) { // No heuristic unloading at all return false; } diff --git a/test/hotspot/jtreg/gc/NativeWrapperCollection/NativeWrapperCollection.java b/test/hotspot/jtreg/gc/NativeWrapperCollection/NativeWrapperCollection.java new file mode 100644 index 00000000000..d963b25e331 --- /dev/null +++ b/test/hotspot/jtreg/gc/NativeWrapperCollection/NativeWrapperCollection.java @@ -0,0 +1,101 @@ +/* + * 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. + * + * 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 gc.NativeWrapperCollection; + +/* + * @test NativeWrapperCollection + * @summary Test that native wrappers are collected after becoming not entrant + * @requires vm.compiler1.enabled + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm/native -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * gc.NativeWrapperCollection.NativeWrapperCollection + */ + +import java.lang.reflect.Method; +import java.util.Iterator; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.dcmd.JMXExecutor; +import jdk.test.lib.dcmd.CommandExecutor; +import jdk.test.whitebox.WhiteBox; + +public class NativeWrapperCollection { + + static { + System.loadLibrary("nativeWrapperCollection"); + } + + private static final WhiteBox WB = WhiteBox.getWhiteBox(); + + static native void method(); + static native void callRegisterNatives(int index); + + public static void main(String[] args) throws Exception { + Method method = NativeWrapperCollection.class.getDeclaredMethod("method"); + + callRegisterNatives(0); + + WB.enqueueMethodForCompilation(method, 1 /* compLevel */); + while (WB.isMethodQueuedForCompilation(method)) { + Thread.sleep(50 /* ms */); + } + + callRegisterNatives(1); + + WB.enqueueMethodForCompilation(method, 1 /* compLevel */); + while (WB.isMethodQueuedForCompilation(method)) { + Thread.sleep(50 /* ms */); + } + + WB.fullGC(); // mark the nmethod as not on stack + WB.fullGC(); // reclaim the nmethod + + OutputAnalyzer output = new JMXExecutor().execute("Compiler.codelist"); + Iterator lines = output.asLines().iterator(); + + boolean foundOne = false; + while (lines.hasNext()) { + String line = lines.next(); + if (!line.contains("NativeWrapperCollection.method")) { + continue; + } + if (foundOne) { + throw new AssertionError("Expected one CodeCache entry for " + + "'NativeWrapperCollection.method', found at least 2"); + } + + String[] parts = line.split(" "); + int codeState = Integer.parseInt(parts[2]); + if (codeState == 1 /* not_entrant */) { + throw new AssertionError("Unexpected not-entrant entry for " + + "'NativeWrapperCollection.method'"); + } + + // Found one NativeWrapperCollection.method, exactly one is + // expected + foundOne = true; + } + } +} diff --git a/test/hotspot/jtreg/gc/NativeWrapperCollection/libnativeWrapperCollection.cpp b/test/hotspot/jtreg/gc/NativeWrapperCollection/libnativeWrapperCollection.cpp new file mode 100644 index 00000000000..0626cf8d401 --- /dev/null +++ b/test/hotspot/jtreg/gc/NativeWrapperCollection/libnativeWrapperCollection.cpp @@ -0,0 +1,44 @@ +/* + * 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. + * + * 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. + */ + +#include "jni.h" + +static void method0(JNIEnv* env, jclass cls) {} +static void method1(JNIEnv* env, jclass cls) {} + +extern "C" { + +JNIEXPORT void JNICALL +Java_gc_NativeWrapperCollection_NativeWrapperCollection_callRegisterNatives +(JNIEnv *env, jclass cls, jint index) { + JNINativeMethod nativeMethods[] = { + { + (char*) "method", // name + (char*) "()V", // sig + (void*) (index == 0 ? method0 : method1) // native method ptr + } + }; + env->RegisterNatives(cls, nativeMethods, 1); +} + +} From d5ce66698d2f15c5f8316110a6118a10baa4013d Mon Sep 17 00:00:00 2001 From: Emanuel Peter Date: Tue, 28 Oct 2025 06:42:05 +0000 Subject: [PATCH 316/561] 8370220: C2: rename methods and improve documentation around get_ctrl and idom lazy updating/forwarding of ctrl and idom via dead ctrl nodes Reviewed-by: chagedorn, thartmann --- .../gc/shenandoah/c2/shenandoahSupport.cpp | 8 +- src/hotspot/share/opto/loopPredicate.cpp | 2 +- src/hotspot/share/opto/loopTransform.cpp | 4 +- src/hotspot/share/opto/loopUnswitch.cpp | 9 +- src/hotspot/share/opto/loopnode.cpp | 22 ++-- src/hotspot/share/opto/loopnode.hpp | 120 +++++++++++++----- src/hotspot/share/opto/loopopts.cpp | 11 +- src/hotspot/share/opto/split_if.cpp | 9 +- 8 files changed, 122 insertions(+), 63 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp index 8210718126b..35ec9ed5c8c 100644 --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp @@ -859,8 +859,8 @@ static void hide_strip_mined_loop(OuterStripMinedLoopNode* outer, CountedLoopNod phase->register_control(new_outer, phase->get_loop(outer), outer->in(LoopNode::EntryControl)); Node* new_le = new IfNode(le->in(0), le->in(1), le->_prob, le->_fcnt); phase->register_control(new_le, phase->get_loop(le), le->in(0)); - phase->lazy_replace(outer, new_outer); - phase->lazy_replace(le, new_le); + phase->replace_node_and_forward_ctrl(outer, new_outer); + phase->replace_node_and_forward_ctrl(le, new_le); inner->clear_strip_mined(); } @@ -1324,7 +1324,7 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) { Node* backedge = head->in(LoopNode::LoopBackControl); Node* new_head = new LoopNode(entry, backedge); phase->register_control(new_head, phase->get_loop(entry), entry); - phase->lazy_replace(head, new_head); + phase->replace_node_and_forward_ctrl(head, new_head); } } @@ -1777,7 +1777,7 @@ void MemoryGraphFixer::collect_memory_nodes() { if (u->adr_type() == TypePtr::BOTTOM) { fix_memory_uses(u, n, n, c); } else if (_phase->C->get_alias_index(u->adr_type()) == _alias) { - _phase->lazy_replace(u, n); + _phase->igvn().replace_node(u, n); --i; --imax; } } diff --git a/src/hotspot/share/opto/loopPredicate.cpp b/src/hotspot/share/opto/loopPredicate.cpp index 561f3ce75cb..61a7ed29c3e 100644 --- a/src/hotspot/share/opto/loopPredicate.cpp +++ b/src/hotspot/share/opto/loopPredicate.cpp @@ -127,7 +127,7 @@ IfTrueNode* PhaseIdealLoop::create_new_if_for_predicate(const ParsePredicateSucc } // Move nodes pinned on the projection or whose control is set to // the projection to the region. - lazy_replace(uncommon_proj_orig, uncommon_trap); + replace_node_and_forward_ctrl(uncommon_proj_orig, uncommon_trap); } else { // Find region's edge corresponding to uncommon_proj for (; proj_index < uncommon_trap->req(); proj_index++) diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp index f92833e9e1c..94c781d82c2 100644 --- a/src/hotspot/share/opto/loopTransform.cpp +++ b/src/hotspot/share/opto/loopTransform.cpp @@ -4071,7 +4071,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { Node* outer_sfpt = head->outer_safepoint(); Node* in = outer_sfpt->in(0); Node* outer_out = head->outer_loop_exit(); - lazy_replace(outer_out, in); + replace_node_and_forward_ctrl(outer_out, in); _igvn.replace_input_of(outer_sfpt, 0, C->top()); } @@ -4080,7 +4080,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { // state of the loop. It's safe in this case to replace it with the // result_mem. _igvn.replace_node(store->in(MemNode::Memory), result_mem); - lazy_replace(exit, result_ctrl); + replace_node_and_forward_ctrl(exit, result_ctrl); _igvn.replace_node(store, result_mem); // Any uses the increment outside of the loop become the loop limit. _igvn.replace_node(head->incr(), head->limit()); diff --git a/src/hotspot/share/opto/loopUnswitch.cpp b/src/hotspot/share/opto/loopUnswitch.cpp index f79afee3103..287f8354dc1 100644 --- a/src/hotspot/share/opto/loopUnswitch.cpp +++ b/src/hotspot/share/opto/loopUnswitch.cpp @@ -520,11 +520,12 @@ IfTrueNode* PhaseIdealLoop::create_new_if_for_multiversion(IfTrueNode* multivers region->add_req(new_if_false); register_control(region, lp, new_multiversion_slow_proj); - // Hook region into slow_path, in stead of the multiversion_slow_proj. + // Hook region into slow_path, instead of the multiversion_slow_proj. // This also moves all other dependencies of the multiversion_slow_proj to the region. - // The lazy_replace ensures that any get_ctrl that used to have multiversion_slow_proj - // as their control are forwarded to the new region node as their control. - lazy_replace(multiversion_slow_proj, region); + // The replace_node_and_forward_ctrl ensures that any get_ctrl that used to have + // multiversion_slow_proj as their control are forwarded to the new region node as + // their control. + replace_node_and_forward_ctrl(multiversion_slow_proj, region); return new_if_true; } diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index e8058edb4e5..b6c4d1b8574 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -1709,8 +1709,8 @@ LoopNode* PhaseIdealLoop::create_inner_head(IdealLoopTree* loop, BaseCountedLoop set_loop(new_inner_exit, loop); set_idom(new_inner_head, idom(head), dom_depth(head)); set_idom(new_inner_exit, idom(exit_test), dom_depth(exit_test)); - lazy_replace(head, new_inner_head); - lazy_replace(exit_test, new_inner_exit); + replace_node_and_forward_ctrl(head, new_inner_head); + replace_node_and_forward_ctrl(exit_test, new_inner_exit); loop->_head = new_inner_head; return new_inner_head; } @@ -2382,7 +2382,7 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_ return false; } if (is_deleteable_safept(backedge_sfpt)) { - lazy_replace(backedge_sfpt, iftrue); + replace_node_and_forward_ctrl(backedge_sfpt, iftrue); if (loop->_safepts != nullptr) { loop->_safepts->yank(backedge_sfpt); } @@ -2483,8 +2483,8 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_ set_loop(iff2, get_loop(iffalse)); // Lazy update of 'get_ctrl' mechanism. - lazy_replace(iffalse, iff2); - lazy_replace(iftrue, ift2); + replace_node_and_forward_ctrl(iffalse, iff2); + replace_node_and_forward_ctrl(iftrue, ift2); // Swap names iffalse = iff2; @@ -2499,7 +2499,7 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_ set_idom(iftrue, le, dd+1); set_idom(iffalse, le, dd+1); assert(iff->outcnt() == 0, "should be dead now"); - lazy_replace( iff, le ); // fix 'get_ctrl' + replace_node_and_forward_ctrl(iff, le); // fix 'get_ctrl' Node* entry_control = init_control; bool strip_mine_loop = iv_bt == T_INT && @@ -2525,7 +2525,7 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_ loop->_head = l; // Fix all data nodes placed at the old loop head. // Uses the lazy-update mechanism of 'get_ctrl'. - lazy_replace( x, l ); + replace_node_and_forward_ctrl(x, l); set_idom(l, entry_control, dom_depth(entry_control) + 1); if (iv_bt == T_INT && (LoopStripMiningIter == 0 || strip_mine_loop)) { @@ -2551,7 +2551,7 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_ register_control(sfpt_clone, outer_ilt, iffalse, body_populated); set_idom(outer_le, sfpt_clone, dom_depth(sfpt_clone)); } - lazy_replace(sfpt, sfpt->in(TypeFunc::Control)); + replace_node_and_forward_ctrl(sfpt, sfpt->in(TypeFunc::Control)); if (loop->_safepts != nullptr) { loop->_safepts->yank(sfpt); } @@ -3516,7 +3516,7 @@ void OuterStripMinedLoopNode::transform_to_counted_loop(PhaseIterGVN* igvn, Phas if (iloop == nullptr) { igvn->replace_node(outer_le, new_end); } else { - iloop->lazy_replace(outer_le, new_end); + iloop->replace_node_and_forward_ctrl(outer_le, new_end); } // the backedge of the inner loop must be rewired to the new loop end Node* backedge = cle->proj_out(true); @@ -4487,7 +4487,7 @@ void IdealLoopTree::remove_safepoints(PhaseIdealLoop* phase, bool keep_one) { Node* n = sfpts->at(i); assert(phase->get_loop(n) == this, ""); if (n != keep && phase->is_deleteable_safept(n)) { - phase->lazy_replace(n, n->in(TypeFunc::Control)); + phase->replace_node_and_forward_ctrl(n, n->in(TypeFunc::Control)); } } } @@ -6145,7 +6145,7 @@ void PhaseIdealLoop::build_loop_early( VectorSet &visited, Node_List &worklist, if( !_verify_only && !_verify_me && ilt->_has_sfpt && n->Opcode() == Op_SafePoint && is_deleteable_safept(n)) { Node *in = n->in(TypeFunc::Control); - lazy_replace(n,in); // Pull safepoint now + replace_node_and_forward_ctrl(n, in); // Pull safepoint now if (ilt->_safepts != nullptr) { ilt->_safepts->yank(n); } diff --git a/src/hotspot/share/opto/loopnode.hpp b/src/hotspot/share/opto/loopnode.hpp index 1101de81595..aee934b0d11 100644 --- a/src/hotspot/share/opto/loopnode.hpp +++ b/src/hotspot/share/opto/loopnode.hpp @@ -890,6 +890,9 @@ class PhaseIdealLoop : public PhaseTransform { friend class AutoNodeBudget; // Map loop membership for CFG nodes, and ctrl for non-CFG nodes. + // + // Exception: dead CFG nodes may instead have a ctrl/idom forwarding + // installed. See: forward_ctrl Node_List _loop_or_ctrl; // Pre-computed def-use info @@ -956,7 +959,13 @@ class PhaseIdealLoop : public PhaseTransform { public: // Set/get control node out. Set lower bit to distinguish from IdealLoopTree - // Returns true if "n" is a data node, false if it's a control node. + // Returns true if "n" is a data node, false if it's a CFG node. + // + // Exception: + // control nodes that are dead because of "replace_node_and_forward_ctrl" + // or have otherwise modified their ctrl state by "forward_ctrl". + // They return "true", because they have a ctrl "forwarding" to the other ctrl node they + // were replaced with. bool has_ctrl(const Node* n) const { return ((intptr_t)_loop_or_ctrl[n->_idx]) & 1; } private: @@ -1070,17 +1079,18 @@ public: } set_ctrl(n, ctrl); } - // Control nodes can be replaced or subsumed. During this pass they - // get their replacement Node in slot 1. Instead of updating the block - // location of all Nodes in the subsumed block, we lazily do it. As we - // pull such a subsumed block out of the array, we write back the final - // correct block. + + // Retrieves the ctrl for a data node i. Node* get_ctrl(const Node* i) { - assert(has_node(i), ""); - Node *n = get_ctrl_no_update(i); + assert(has_node(i) && has_ctrl(i), "must be data node with ctrl"); + Node* n = get_ctrl_no_update(i); + // We store the found ctrl in the side-table again. In most cases, + // this is a no-op, since we just read from _loop_or_ctrl. But in cases + // where there was a ctrl forwarding via dead ctrl nodes, this shortens the path. + // See: forward_ctrl _loop_or_ctrl.map(i->_idx, (Node*)((intptr_t)n + 1)); - assert(has_node(i) && has_ctrl(i), ""); - assert(n == find_non_split_ctrl(n), "must return legal ctrl" ); + assert(has_node(i) && has_ctrl(i), "must still be data node with ctrl"); + assert(n == find_non_split_ctrl(n), "must return legal ctrl"); return n; } @@ -1097,24 +1107,34 @@ public: } } +private: Node* get_ctrl_no_update_helper(const Node* i) const { - assert(has_ctrl(i), "should be control, not loop"); + // We expect only data nodes (which must have a ctrl set), or + // dead ctrl nodes that have a ctrl "forwarding". + // See: forward_ctrl. + assert(has_ctrl(i), "only data nodes or ctrl nodes with ctrl forwarding expected"); return (Node*)(((intptr_t)_loop_or_ctrl[i->_idx]) & ~1); } + // Compute the ctrl of node i, jumping over ctrl forwardings. Node* get_ctrl_no_update(const Node* i) const { - assert( has_ctrl(i), "" ); - Node *n = get_ctrl_no_update_helper(i); - if (!n->in(0)) { - // Skip dead CFG nodes + assert(has_ctrl(i), "only data nodes expected"); + Node* n = get_ctrl_no_update_helper(i); + if (n->in(0) == nullptr) { + // We encountered a dead CFG node. + // If everything went right, this dead CFG node should have had a ctrl + // forwarding installed, using "forward_ctrl". We now have to jump from + // the old (dead) ctrl node to the new (live) ctrl node, in possibly + // multiple ctrl forwarding steps. do { n = get_ctrl_no_update_helper(n); - } while (!n->in(0)); + } while (n->in(0) == nullptr); n = find_non_split_ctrl(n); } return n; } +public: // Check for loop being set // "n" must be a control node. Returns true if "n" is known to be in a loop. bool has_loop( Node *n ) const { @@ -1125,19 +1145,43 @@ public: void set_loop( Node *n, IdealLoopTree *loop ) { _loop_or_ctrl.map(n->_idx, (Node*)loop); } - // Lazy-dazy update of 'get_ctrl' and 'idom_at' mechanisms. Replace - // the 'old_node' with 'new_node'. Kill old-node. Add a reference - // from old_node to new_node to support the lazy update. Reference - // replaces loop reference, since that is not needed for dead node. - void lazy_update(Node *old_node, Node *new_node) { + + // Install a ctrl "forwarding" from an old (dead) control node. + // This is a "lazy" update of the "get_ctrl" and "idom" mechanism: + // - Install a forwarding from old_node (dead ctrl) to new_node. + // - When querying "get_ctrl": jump from data node over possibly + // multiple dead ctrl nodes with ctrl forwarding to eventually + // reach a live ctrl node. Shorten the path to avoid chasing the + // forwarding in the future. + // - When querying "idom": from some node get its old idom, which + // may be dead but has an idom forwarding to the new and live + // idom. Shorten the path to avoid chasing the forwarding in the + // future. + // Note: while the "idom" information is stored in the "_idom" + // side-table, the idom forwarding piggybacks on the ctrl + // forwarding on "_loop_or_ctrl". + // Using "forward_ctrl" allows us to only edit the entry for the old + // dead node now, and we do not have to update all the nodes that had + // the old_node as their "get_ctrl" or "idom". We clean up the forwarding + // links when we query "get_ctrl" or "idom" for these nodes the next time. + void forward_ctrl(Node* old_node, Node* new_node) { + assert(!has_ctrl(old_node) && old_node->is_CFG() && old_node->in(0) == nullptr, + "must be dead ctrl (CFG) node"); + assert(!has_ctrl(new_node) && new_node->is_CFG() && new_node->in(0) != nullptr, + "must be live ctrl (CFG) node"); assert(old_node != new_node, "no cycles please"); // Re-use the side array slot for this node to provide the // forwarding pointer. _loop_or_ctrl.map(old_node->_idx, (Node*)((intptr_t)new_node + 1)); + assert(has_ctrl(old_node), "must have installed ctrl forwarding"); } - void lazy_replace(Node *old_node, Node *new_node) { + + // Replace the old ctrl node with a new ctrl node. + // - Update the node inputs of all uses. + // - Lazily update the ctrl and idom info of all uses, via a ctrl/idom forwarding. + void replace_node_and_forward_ctrl(Node* old_node, Node* new_node) { _igvn.replace_node(old_node, new_node); - lazy_update(old_node, new_node); + forward_ctrl(old_node, new_node); } private: @@ -1208,29 +1252,41 @@ private: Node* insert_convert_node_if_needed(BasicType target, Node* input); -public: Node* idom_no_update(Node* d) const { return idom_no_update(d->_idx); } - Node* idom_no_update(uint didx) const { - assert(didx < _idom_size, "oob"); - Node* n = _idom[didx]; + Node* idom_no_update(uint node_idx) const { + assert(node_idx < _idom_size, "oob"); + Node* n = _idom[node_idx]; assert(n != nullptr,"Bad immediate dominator info."); while (n->in(0) == nullptr) { // Skip dead CFG nodes + // We encountered a dead CFG node. + // If everything went right, this dead CFG node should have had an idom + // forwarding installed, using "forward_ctrl". We now have to jump from + // the old (dead) idom node to the new (live) idom node, in possibly + // multiple idom forwarding steps. + // Note that we piggyback on "_loop_or_ctrl" to do the forwarding, + // since we forward both "get_ctrl" and "idom" from the dead to the + // new live ctrl/idom nodes. n = (Node*)(((intptr_t)_loop_or_ctrl[n->_idx]) & ~1); assert(n != nullptr,"Bad immediate dominator info."); } return n; } - Node *idom(Node* d) const { - return idom(d->_idx); +public: + Node* idom(Node* n) const { + return idom(n->_idx); } - Node *idom(uint didx) const { - Node *n = idom_no_update(didx); - _idom[didx] = n; // Lazily remove dead CFG nodes from table. + Node* idom(uint node_idx) const { + Node* n = idom_no_update(node_idx); + // We store the found idom in the side-table again. In most cases, + // this is a no-op, since we just read from _idom. But in cases where + // there was an idom forwarding via dead idom nodes, this shortens the path. + // See: forward_ctrl + _idom[node_idx] = n; return n; } diff --git a/src/hotspot/share/opto/loopopts.cpp b/src/hotspot/share/opto/loopopts.cpp index ae7b318ece4..71e52f373f7 100644 --- a/src/hotspot/share/opto/loopopts.cpp +++ b/src/hotspot/share/opto/loopopts.cpp @@ -2742,12 +2742,13 @@ void PhaseIdealLoop::fix_ctrl_uses(const Node_List& body, const IdealLoopTree* l } assert(use->is_Proj(), "loop exit should be projection"); - // lazy_replace() below moves all nodes that are: + // replace_node_and_forward_ctrl() below moves all nodes that are: // - control dependent on the loop exit or // - have control set to the loop exit - // below the post-loop merge point. lazy_replace() takes a dead control as first input. To make it - // possible to use it, the loop exit projection is cloned and becomes the new exit projection. The initial one - // becomes dead and is "replaced" by the region. + // below the post-loop merge point. + // replace_node_and_forward_ctrl() takes a dead control as first input. + // To make it possible to use it, the loop exit projection is cloned and becomes the + // new exit projection. The initial one becomes dead and is "replaced" by the region. Node* use_clone = use->clone(); register_control(use_clone, use_loop, idom(use), dom_depth(use)); // Now finish up 'r' @@ -2756,7 +2757,7 @@ void PhaseIdealLoop::fix_ctrl_uses(const Node_List& body, const IdealLoopTree* l _igvn.register_new_node_with_optimizer(r); set_loop(r, use_loop); set_idom(r, (side_by_side_idom == nullptr) ? newuse->in(0) : side_by_side_idom, dd_r); - lazy_replace(use, r); + replace_node_and_forward_ctrl(use, r); // Map the (cloned) old use to the new merge point old_new.map(use_clone->_idx, r); } // End of if a loop-exit test diff --git a/src/hotspot/share/opto/split_if.cpp b/src/hotspot/share/opto/split_if.cpp index bede04c6b2c..425c0c9e99d 100644 --- a/src/hotspot/share/opto/split_if.cpp +++ b/src/hotspot/share/opto/split_if.cpp @@ -655,7 +655,7 @@ void PhaseIdealLoop::do_split_if(Node* iff, RegionNode** new_false_region, Regio // Replace in the graph with lazy-update mechanism new_iff->set_req(0, new_iff); // hook self so it does not go dead - lazy_replace(ifp, ifpx); + replace_node_and_forward_ctrl(ifp, ifpx); new_iff->set_req(0, region); // Record bits for later xforms @@ -669,9 +669,10 @@ void PhaseIdealLoop::do_split_if(Node* iff, RegionNode** new_false_region, Regio } _igvn.remove_dead_node(new_iff); // Lazy replace IDOM info with the region's dominator - lazy_replace(iff, region_dom); - lazy_update(region, region_dom); // idom must be update before handle_uses - region->set_req(0, nullptr); // Break the self-cycle. Required for lazy_update to work on region + replace_node_and_forward_ctrl(iff, region_dom); + // Break the self-cycle. Required for forward_ctrl to work on region. + region->set_req(0, nullptr); + forward_ctrl(region, region_dom); // idom must be updated before handle_use // Now make the original merge point go dead, by handling all its uses. small_cache region_cache; From f82cc22bfe675ca263270a932f9cc12e837a7f65 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Tue, 28 Oct 2025 08:53:43 +0000 Subject: [PATCH 317/561] 8369428: Include method name in 'does not override or implement' diagnostics Reviewed-by: vromero, liach --- .../share/classes/com/sun/tools/javac/comp/Attr.java | 2 +- .../share/classes/com/sun/tools/javac/comp/Check.java | 2 +- .../com/sun/tools/javac/resources/compiler.properties | 9 ++++++--- test/langtools/tools/javac/OverrideChecks/Private.out | 2 +- .../tools/javac/annotations/6359949/T6359949a.out | 2 +- .../CrashEmptyEnumConstructorTest.java | 2 +- .../langtools/tools/javac/annotations/neg/OverrideNo.out | 2 +- .../tools/javac/defaultMethods/private/Private02.out | 2 +- .../tools/javac/defaultMethods/private/Private08.out | 2 +- .../tools/javac/lvti/BadLocalVarInferenceTest.out | 2 +- 10 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index f780df025bd..719b804ea5f 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1183,7 +1183,7 @@ public class Attr extends JCTree.Visitor { Errors.DefaultAllowedInIntfAnnotationMember); } if (isDefaultMethod || (tree.sym.flags() & (ABSTRACT | NATIVE)) == 0) - log.error(tree.pos(), Errors.MissingMethBodyOrDeclAbstract); + log.error(tree.pos(), Errors.MissingMethBodyOrDeclAbstract(tree.sym, owner)); } else { if ((tree.sym.flags() & (ABSTRACT|DEFAULT|PRIVATE)) == ABSTRACT) { if ((owner.flags() & INTERFACE) != 0) { diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 3d9eff107da..da7db138604 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -2080,7 +2080,7 @@ public class Check { } } log.error(pos, - explicitOverride ? (m.isStatic() ? Errors.StaticMethodsCannotBeAnnotatedWithOverride : Errors.MethodDoesNotOverrideSuperclass) : + explicitOverride ? (m.isStatic() ? Errors.StaticMethodsCannotBeAnnotatedWithOverride(m, m.enclClass()) : Errors.MethodDoesNotOverrideSuperclass(m, m.enclClass())) : Errors.AnonymousDiamondMethodDoesNotOverrideSuperclass(Fragments.DiamondAnonymousMethodsImplicitlyOverride)); } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index a226b2f5960..1d18635f14b 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -905,14 +905,17 @@ compiler.err.limit.string.overflow=\ compiler.err.malformed.fp.lit=\ malformed floating-point literal +# 0: symbol, 1: symbol compiler.err.method.does.not.override.superclass=\ - method does not override or implement a method from a supertype + {0} in {1} does not override or implement a method from a supertype +# 0: symbol, 1: symbol compiler.err.static.methods.cannot.be.annotated.with.override=\ - static methods cannot be annotated with @Override + static method {0} in {1} cannot be annotated with @Override +# 0: symbol, 1: symbol compiler.err.missing.meth.body.or.decl.abstract=\ - missing method body, or declare abstract + method {0} in {1} is missing a method body, or should be declared abstract compiler.err.missing.ret.stmt=\ missing return statement diff --git a/test/langtools/tools/javac/OverrideChecks/Private.out b/test/langtools/tools/javac/OverrideChecks/Private.out index f49ef46a255..2ccbecd6d3a 100644 --- a/test/langtools/tools/javac/OverrideChecks/Private.out +++ b/test/langtools/tools/javac/OverrideChecks/Private.out @@ -1,2 +1,2 @@ -Private.java:14:5: compiler.err.method.does.not.override.superclass +Private.java:14:5: compiler.err.method.does.not.override.superclass: m(), Bar 1 error diff --git a/test/langtools/tools/javac/annotations/6359949/T6359949a.out b/test/langtools/tools/javac/annotations/6359949/T6359949a.out index f179ca1bc1a..2c2aed1da27 100644 --- a/test/langtools/tools/javac/annotations/6359949/T6359949a.out +++ b/test/langtools/tools/javac/annotations/6359949/T6359949a.out @@ -1,2 +1,2 @@ -T6359949a.java:15:5: compiler.err.static.methods.cannot.be.annotated.with.override +T6359949a.java:15:5: compiler.err.static.methods.cannot.be.annotated.with.override: example(), Test 1 error diff --git a/test/langtools/tools/javac/annotations/crash_empty_enum_const/CrashEmptyEnumConstructorTest.java b/test/langtools/tools/javac/annotations/crash_empty_enum_const/CrashEmptyEnumConstructorTest.java index 29340dd720e..865c53a19c3 100644 --- a/test/langtools/tools/javac/annotations/crash_empty_enum_const/CrashEmptyEnumConstructorTest.java +++ b/test/langtools/tools/javac/annotations/crash_empty_enum_const/CrashEmptyEnumConstructorTest.java @@ -92,7 +92,7 @@ public class CrashEmptyEnumConstructorTest extends TestRunner { """); List expected = List.of( - "E.java:3: error: missing method body, or declare abstract", + "E.java:3: error: method E(String) in E is missing a method body, or should be declared abstract", " E(String one);", " ^", "1 error"); diff --git a/test/langtools/tools/javac/annotations/neg/OverrideNo.out b/test/langtools/tools/javac/annotations/neg/OverrideNo.out index 2af05a13fc3..34f4fe08e2a 100644 --- a/test/langtools/tools/javac/annotations/neg/OverrideNo.out +++ b/test/langtools/tools/javac/annotations/neg/OverrideNo.out @@ -1,2 +1,2 @@ -OverrideNo.java:16:5: compiler.err.method.does.not.override.superclass +OverrideNo.java:16:5: compiler.err.method.does.not.override.superclass: f(), overrideNo.B 1 error diff --git a/test/langtools/tools/javac/defaultMethods/private/Private02.out b/test/langtools/tools/javac/defaultMethods/private/Private02.out index cc61d11113f..ba6fb69fdbc 100644 --- a/test/langtools/tools/javac/defaultMethods/private/Private02.out +++ b/test/langtools/tools/javac/defaultMethods/private/Private02.out @@ -1,4 +1,4 @@ Private02.java:13:31: compiler.err.illegal.combination.of.modifiers: abstract, private Private02.java:16:22: compiler.err.already.defined: kindname.method, foo(int), kindname.interface, Private02.I -Private02.java:12:22: compiler.err.missing.meth.body.or.decl.abstract +Private02.java:12:22: compiler.err.missing.meth.body.or.decl.abstract: foo(java.lang.String), Private02.I 3 errors diff --git a/test/langtools/tools/javac/defaultMethods/private/Private08.out b/test/langtools/tools/javac/defaultMethods/private/Private08.out index f259aae76ba..bf1e68c5e73 100644 --- a/test/langtools/tools/javac/defaultMethods/private/Private08.out +++ b/test/langtools/tools/javac/defaultMethods/private/Private08.out @@ -2,7 +2,7 @@ Private08.java:13:28: compiler.err.illegal.combination.of.modifiers: public, pri Private08.java:14:30: compiler.err.illegal.combination.of.modifiers: abstract, private Private08.java:15:29: compiler.err.illegal.combination.of.modifiers: private, default Private08.java:16:24: compiler.err.mod.not.allowed.here: protected -Private08.java:17:22: compiler.err.missing.meth.body.or.decl.abstract +Private08.java:17:22: compiler.err.missing.meth.body.or.decl.abstract: missingBody(), Private08.I Private08.java:22:33: compiler.err.report.access: foo(), private, Private08.I Private08.java:27:21: compiler.err.override.weaker.access: (compiler.misc.clashes.with: doo(), Private08_01.J, doo(), Private08.I), public Private08.java:25:13: compiler.err.non-static.cant.be.ref: kindname.variable, super diff --git a/test/langtools/tools/javac/lvti/BadLocalVarInferenceTest.out b/test/langtools/tools/javac/lvti/BadLocalVarInferenceTest.out index 9e7cab9633d..d9e7ce5a552 100644 --- a/test/langtools/tools/javac/lvti/BadLocalVarInferenceTest.out +++ b/test/langtools/tools/javac/lvti/BadLocalVarInferenceTest.out @@ -5,7 +5,7 @@ BadLocalVarInferenceTest.java:22:13: compiler.err.cant.infer.local.var.type: g, BadLocalVarInferenceTest.java:23:13: compiler.err.cant.infer.local.var.type: d, (compiler.misc.local.self.ref) BadLocalVarInferenceTest.java:24:13: compiler.err.cant.infer.local.var.type: k, (compiler.misc.local.array.missing.target) BadLocalVarInferenceTest.java:25:29: compiler.err.does.not.override.abstract: compiler.misc.anonymous.class: BadLocalVarInferenceTest$1, m(java.lang.Object), BadLocalVarInferenceTest.Foo -BadLocalVarInferenceTest.java:26:13: compiler.err.method.does.not.override.superclass +BadLocalVarInferenceTest.java:26:13: compiler.err.method.does.not.override.superclass: m(java.lang.String), compiler.misc.anonymous.class: BadLocalVarInferenceTest$1 BadLocalVarInferenceTest.java:29:27: compiler.err.cant.resolve.location.args: kindname.method, charAt, , int, (compiler.misc.location.1: kindname.variable, x, java.lang.Object) BadLocalVarInferenceTest.java:30:13: compiler.err.cant.infer.local.var.type: t, (compiler.misc.local.cant.infer.void) 10 errors From 9625993611bb6acf84d428bea4a65d33b9d66e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20H=C3=A4ssig?= Date: Tue, 28 Oct 2025 08:59:08 +0000 Subject: [PATCH 318/561] 8370579: PPC: fix inswri immediate argument order Reviewed-by: mdoerr, mbaesken --- src/hotspot/cpu/ppc/ppc.ad | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 03dbd0e780b..75566b2dd80 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -12381,27 +12381,27 @@ instruct countTrailingZerosL_cnttzd(iRegIdst dst, iRegLsrc src) %{ %} // Expand nodes for byte_reverse_int. -instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ - effect(DEF dst, USE src, USE pos, USE shift); +instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 n, immI16 b) %{ + effect(DEF dst, USE src, USE n, USE b); predicate(false); - format %{ "INSRWI $dst, $src, $pos, $shift" %} + format %{ "INSRWI $dst, $src, $n, $b" %} size(4); ins_encode %{ - __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); + __ insrwi($dst$$Register, $src$$Register, $n$$constant, $b$$constant); %} ins_pipe(pipe_class_default); %} // As insrwi_a, but with USE_DEF. -instruct insrwi(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ - effect(USE_DEF dst, USE src, USE pos, USE shift); +instruct insrwi(iRegIdst dst, iRegIsrc src, immI16 n, immI16 b) %{ + effect(USE_DEF dst, USE src, USE n, USE b); predicate(false); - format %{ "INSRWI $dst, $src, $pos, $shift" %} + format %{ "INSRWI $dst, $src, $n, $b" %} size(4); ins_encode %{ - __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); + __ insrwi($dst$$Register, $src$$Register, $n$$constant, $b$$constant); %} ins_pipe(pipe_class_default); %} @@ -12423,12 +12423,12 @@ instruct bytes_reverse_int_Ex(iRegIdst dst, iRegIsrc src) %{ iRegLdst tmpI3; urShiftI_reg_imm(tmpI1, src, imm24); - insrwi_a(dst, tmpI1, imm24, imm8); + insrwi_a(dst, tmpI1, imm8, imm24); urShiftI_reg_imm(tmpI2, src, imm16); - insrwi(dst, tmpI2, imm8, imm16); + insrwi(dst, tmpI2, imm16, imm8); urShiftI_reg_imm(tmpI3, src, imm8); insrwi(dst, tmpI3, imm8, imm8); - insrwi(dst, src, imm0, imm8); + insrwi(dst, src, imm8, imm0); %} %} @@ -12546,7 +12546,7 @@ instruct bytes_reverse_ushort_Ex(iRegIdst dst, iRegIsrc src) %{ immI16 imm8 %{ (int) 8 %} urShiftI_reg_imm(dst, src, imm8); - insrwi(dst, src, imm16, imm8); + insrwi(dst, src, imm8, imm16); %} %} @@ -12575,7 +12575,7 @@ instruct bytes_reverse_short_Ex(iRegIdst dst, iRegIsrc src) %{ iRegLdst tmpI1; urShiftI_reg_imm(tmpI1, src, imm8); - insrwi(tmpI1, src, imm16, imm8); + insrwi(tmpI1, src, imm8, imm16); extsh(dst, tmpI1); %} %} From 19920df81d2d68307bde286f7d5a0674fabff6c0 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 28 Oct 2025 12:17:19 +0000 Subject: [PATCH 319/561] 8370417: Parallel: TestAlwaysPreTouchBehavior.java fails with NUMA Reviewed-by: iveresov, jsikstro, tschatzl --- src/hotspot/share/gc/parallel/mutableNUMASpace.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp index 36412ce5efe..566d6469686 100644 --- a/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp +++ b/src/hotspot/share/gc/parallel/mutableNUMASpace.cpp @@ -25,6 +25,7 @@ #include "gc/parallel/mutableNUMASpace.hpp" #include "gc/shared/collectedHeap.hpp" #include "gc/shared/gc_globals.hpp" +#include "gc/shared/pretouchTask.hpp" #include "gc/shared/spaceDecorator.hpp" #include "gc/shared/workerThread.hpp" #include "memory/allocation.inline.hpp" @@ -388,6 +389,14 @@ void MutableNUMASpace::initialize(MemRegion mr, bias_region(bottom_region, ls->lgrp_id()); bias_region(top_region, ls->lgrp_id()); + if (AlwaysPreTouch) { + PretouchTask::pretouch("ParallelGC PreTouch bottom_region", (char*)bottom_region.start(), (char*)bottom_region.end(), + page_size(), pretouch_workers); + + PretouchTask::pretouch("ParallelGC PreTouch top_region", (char*)top_region.start(), (char*)top_region.end(), + page_size(), pretouch_workers); + } + // Clear space (set top = bottom) but never mangle. s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle, MutableSpace::DontSetupPages); } From 307637a4973801abb9969fad41b017aa6a153973 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Tue, 28 Oct 2025 13:21:45 +0000 Subject: [PATCH 320/561] 8370806: Parallel: Revise logs in PSYoungGen::compute_desired_sizes Reviewed-by: tschatzl --- src/hotspot/share/gc/parallel/psYoungGen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/parallel/psYoungGen.cpp b/src/hotspot/share/gc/parallel/psYoungGen.cpp index b2cce11398d..edcbf7647fc 100644 --- a/src/hotspot/share/gc/parallel/psYoungGen.cpp +++ b/src/hotspot/share/gc/parallel/psYoungGen.cpp @@ -356,7 +356,7 @@ void PSYoungGen::compute_desired_sizes(bool is_survivor_overflowing, // Keep survivor and adjust eden to meet min-gen-size eden_size = min_gen_size() - 2 * survivor_size; } else if (max_gen_size() < new_gen_size) { - log_info(gc, ergo)("Requested sizes exceeds MaxNewSize (K): %zu vs %zu)", new_gen_size/K, max_gen_size()/K); + log_info(gc, ergo)("Requested sizes exceeds MaxNewSize (K): %zu vs %zu", new_gen_size/K, max_gen_size()/K); // New capacity would exceed max; need to revise these desired sizes. // Favor survivor over eden in order to reduce promotion (overflow). if (2 * survivor_size >= max_gen_size()) { From 5c5367c3124ed8c950539a6a90c631727146c5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Casta=C3=B1eda=20Lozano?= Date: Tue, 28 Oct 2025 13:31:12 +0000 Subject: [PATCH 321/561] 8370569: IGV: dump more graph properties at bytecode parsing Reviewed-by: chagedorn, snatarajan --- src/hotspot/share/opto/idealGraphPrinter.cpp | 19 +++++++ src/hotspot/share/opto/idealGraphPrinter.hpp | 4 ++ src/hotspot/share/opto/parse2.cpp | 4 +- .../hotspot/igv/coordinator/GraphNode.java | 6 ++- .../com/sun/hotspot/igv/data/InputGraph.java | 7 +-- .../sun/hotspot/igv/settings/Settings.java | 4 +- .../sun/hotspot/igv/settings/ViewPanel.form | 53 ++++++++++++------- .../sun/hotspot/igv/settings/ViewPanel.java | 51 +++++++++++------- .../hotspot/igv/view/EditorTopComponent.java | 28 ++++++++-- 9 files changed, 127 insertions(+), 49 deletions(-) diff --git a/src/hotspot/share/opto/idealGraphPrinter.cpp b/src/hotspot/share/opto/idealGraphPrinter.cpp index 19eaf1b369e..de0fcbc8f31 100644 --- a/src/hotspot/share/opto/idealGraphPrinter.cpp +++ b/src/hotspot/share/opto/idealGraphPrinter.cpp @@ -399,6 +399,14 @@ void IdealGraphPrinter::set_traverse_outs(bool b) { _traverse_outs = b; } +const Parse* IdealGraphPrinter::parse() { + return _parse; +} + +void IdealGraphPrinter::set_parse(const Parse* parse) { + _parse = parse; +} + void IdealGraphPrinter::visit_node(Node* n, bool edges) { if (edges) { @@ -996,6 +1004,17 @@ void IdealGraphPrinter::print(const char* name, Node* node, GrowableArraymap() == nullptr) { + print_prop("map", "-"); + } else { + print_prop("map", _parse->map()->_idx); + } + print_prop("block", _parse->block()->rpo()); + stringStream shortStr; + _parse->flow()->method()->print_short_name(&shortStr); + print_prop("method", shortStr.freeze()); + } tail(PROPERTIES_ELEMENT); head(NODES_ELEMENT); diff --git a/src/hotspot/share/opto/idealGraphPrinter.hpp b/src/hotspot/share/opto/idealGraphPrinter.hpp index 7e68ce6c00f..df1c6b254d5 100644 --- a/src/hotspot/share/opto/idealGraphPrinter.hpp +++ b/src/hotspot/share/opto/idealGraphPrinter.hpp @@ -42,6 +42,7 @@ class Node; class InlineTree; class ciMethod; class JVMState; +class Parse; class IdealGraphPrinter : public CHeapObj { private: @@ -115,6 +116,7 @@ class IdealGraphPrinter : public CHeapObj { Compile *C; double _max_freq; bool _append; + const Parse* _parse; // Walk the native stack and print relevant C2 frames as IGV properties (if // graph_name == nullptr) or the graph name based on the highest C2 frame (if @@ -156,6 +158,8 @@ class IdealGraphPrinter : public CHeapObj { bool traverse_outs(); void set_traverse_outs(bool b); + const Parse* parse(); + void set_parse(const Parse* parser); void print_inlining(); void begin_method(); void end_method(); diff --git a/src/hotspot/share/opto/parse2.cpp b/src/hotspot/share/opto/parse2.cpp index 8b44d8b3491..cb8073144a5 100644 --- a/src/hotspot/share/opto/parse2.cpp +++ b/src/hotspot/share/opto/parse2.cpp @@ -2779,11 +2779,13 @@ void Parse::do_one_bytecode() { if (C->should_print_igv(perBytecode)) { IdealGraphPrinter* printer = C->igv_printer(); char buffer[256]; - jio_snprintf(buffer, sizeof(buffer), "Bytecode %d: %s, map: %d", bci(), Bytecodes::name(bc()), map() == nullptr ? -1 : map()->_idx); + jio_snprintf(buffer, sizeof(buffer), "Bytecode %d: %s", bci(), Bytecodes::name(bc())); bool old = printer->traverse_outs(); printer->set_traverse_outs(true); + printer->set_parse(this); printer->print_graph(buffer); printer->set_traverse_outs(old); + printer->set_parse(nullptr); } #endif } diff --git a/src/utils/IdealGraphVisualizer/Coordinator/src/main/java/com/sun/hotspot/igv/coordinator/GraphNode.java b/src/utils/IdealGraphVisualizer/Coordinator/src/main/java/com/sun/hotspot/igv/coordinator/GraphNode.java index 8cd94675bca..abc1784d8d9 100644 --- a/src/utils/IdealGraphVisualizer/Coordinator/src/main/java/com/sun/hotspot/igv/coordinator/GraphNode.java +++ b/src/utils/IdealGraphVisualizer/Coordinator/src/main/java/com/sun/hotspot/igv/coordinator/GraphNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -29,6 +29,8 @@ import com.sun.hotspot.igv.data.Properties; import com.sun.hotspot.igv.data.services.GraphViewer; import com.sun.hotspot.igv.util.PropertiesSheet; import com.sun.hotspot.igv.util.StringUtils; +import com.sun.hotspot.igv.view.EditorTopComponent; + import java.awt.Image; import javax.swing.Action; import org.openide.actions.OpenAction; @@ -86,7 +88,7 @@ public class GraphNode extends AbstractNode { @Override public String getDisplayName() { - return graph.getDisplayName(); + return EditorTopComponent.getGraphDisplayName(graph); } private GraphNode(InputGraph graph, InstanceContent content) { diff --git a/src/utils/IdealGraphVisualizer/Data/src/main/java/com/sun/hotspot/igv/data/InputGraph.java b/src/utils/IdealGraphVisualizer/Data/src/main/java/com/sun/hotspot/igv/data/InputGraph.java index 987c0e5576e..94c0b2ec446 100644 --- a/src/utils/IdealGraphVisualizer/Data/src/main/java/com/sun/hotspot/igv/data/InputGraph.java +++ b/src/utils/IdealGraphVisualizer/Data/src/main/java/com/sun/hotspot/igv/data/InputGraph.java @@ -257,11 +257,8 @@ public class InputGraph extends Properties.Entity implements FolderElement { @Override public String getDisplayName() { - if (isDiffGraph) { - return firstGraph.getDisplayName() + " Δ " + secondGraph.getDisplayName(); - } else { - return getIndex()+1 + ". " + getName(); - } + assert false : "Use EditorTopComponent::getGraphDisplayName() instead"; + return ""; } public int getIndex() { diff --git a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/Settings.java b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/Settings.java index 480fb43ea5b..b1b2c94361c 100644 --- a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/Settings.java +++ b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/Settings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -46,6 +46,8 @@ public class Settings { public static final String NODE_SHORT_TEXT_DEFAULT = "[idx] [name]"; public static final String NODE_TINY_TEXT = "nodeTinyText"; public static final String NODE_TINY_TEXT_DEFAULT = "[idx]"; + public static final String GRAPH_NAME_SUFFIX = "graphNameSuffix"; + public static final String GRAPH_NAME_SUFFIX_DEFAULT = "(map: [map], block #[block] at [method])"; public static final String DEFAULT_VIEW = "defaultView"; public static final int DEFAULT_VIEW_DEFAULT = DefaultView.SEA_OF_NODES; public static final String PORT = "port"; diff --git a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.form b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.form index 75240c9a150..466bb2a82db 100644 --- a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.form +++ b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.form @@ -28,7 +28,7 @@ - + @@ -47,14 +47,16 @@ + - + - + - + + @@ -70,24 +72,30 @@ - + - + - - - + + + - - - - + + + + + + + + + + @@ -133,9 +141,6 @@ - - - @@ -149,9 +154,6 @@ - - - @@ -173,6 +175,19 @@ + + + + + + + + + + + + + diff --git a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.java b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.java index c2293820c31..123131d7914 100644 --- a/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.java +++ b/src/utils/IdealGraphVisualizer/Settings/src/main/java/com/sun/hotspot/igv/settings/ViewPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -56,6 +56,8 @@ final class ViewPanel extends javax.swing.JPanel { jLabel5 = new javax.swing.JLabel(); nodeTinyTextField = new javax.swing.JTextField(); defaultViewComboBox = new javax.swing.JComboBox<>(); + graphNameSuffixField = new javax.swing.JTextField(); + jLabel6 = new javax.swing.JLabel(); org.openide.awt.Mnemonics.setLocalizedText(jLabel1, "Node Text"); @@ -70,17 +72,19 @@ final class ViewPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(jLabel4, "Short Node Text"); - nodeShortTextField.setBackground(new java.awt.Color(255, 255, 255)); nodeShortTextField.setToolTipText("Single-line format string for nodes in edge tooltips, slot tooltips, and node search bar. Properties are specified with brackets (example: \"[idx]\")."); org.openide.awt.Mnemonics.setLocalizedText(jLabel5, "Tiny Node Text"); - nodeTinyTextField.setBackground(new java.awt.Color(255, 255, 255)); nodeTinyTextField.setToolTipText("Single-line format string for node input lists. Properties are specified with brackets (example: \"[idx]\")."); defaultViewComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Sea of nodes", "Clustered sea of nodes", "Control-flow graph" })); defaultViewComboBox.setToolTipText("View shown by default when a graph is opened."); + graphNameSuffixField.setToolTipText("Single-line format string for node input lists. Properties are specified with brackets (example: \"[method]\")."); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel6, "Graph Name Suffix"); + org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -92,14 +96,16 @@ final class ViewPanel extends javax.swing.JPanel { .add(jLabel3) .add(jLabel2) .add(jLabel4) - .add(jLabel5)) - .add(39, 39, 39) + .add(jLabel5) + .add(jLabel6)) + .add(18, 18, 18) .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(nodeShortTextField) - .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE) + .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 663, Short.MAX_VALUE) .add(portSpinner) - .add(nodeTinyTextField) - .add(defaultViewComboBox, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .add(defaultViewComboBox, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(graphNameSuffixField) + .add(nodeTinyTextField)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( @@ -111,20 +117,25 @@ final class ViewPanel extends javax.swing.JPanel { .add(jLabel1)) .add(27, 27, 27) .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(jLabel4) - .add(nodeShortTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(nodeShortTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 18, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 27, Short.MAX_VALUE) .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) - .add(jLabel5) + .add(jLabel5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(nodeTinyTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(27, 27, 27) - .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) - .add(jLabel2) - .add(defaultViewComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 27, Short.MAX_VALUE) - .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(graphNameSuffixField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel6, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 18, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(27, 27, 27) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(defaultViewComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 18, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .add(27, 27, 27) + .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .add(jLabel3))) + .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 18, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) ); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); @@ -141,13 +152,14 @@ final class ViewPanel extends javax.swing.JPanel { .add(layout.createSequentialGroup() .addContainerGap() .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .addContainerGap(29, Short.MAX_VALUE)) + .addContainerGap(15, Short.MAX_VALUE)) ); }// //GEN-END:initComponents void load() { nodeTextArea.setText(Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT)); nodeShortTextField.setText(Settings.get().get(Settings.NODE_SHORT_TEXT, Settings.NODE_SHORT_TEXT_DEFAULT)); nodeTinyTextField.setText(Settings.get().get(Settings.NODE_TINY_TEXT, Settings.NODE_TINY_TEXT_DEFAULT)); + graphNameSuffixField.setText(Settings.get().get(Settings.GRAPH_NAME_SUFFIX, Settings.GRAPH_NAME_SUFFIX_DEFAULT)); defaultViewComboBox.setSelectedIndex(Settings.get().getInt(Settings.DEFAULT_VIEW, Settings.DefaultView.SEA_OF_NODES)); portSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT))); } @@ -156,6 +168,7 @@ final class ViewPanel extends javax.swing.JPanel { Settings.get().put(Settings.NODE_TEXT, nodeTextArea.getText()); Settings.get().put(Settings.NODE_SHORT_TEXT, nodeShortTextField.getText()); Settings.get().put(Settings.NODE_TINY_TEXT, nodeTinyTextField.getText()); + Settings.get().put(Settings.GRAPH_NAME_SUFFIX, graphNameSuffixField.getText()); Settings.get().putInt(Settings.DEFAULT_VIEW, defaultViewComboBox.getSelectedIndex()); Settings.get().put(Settings.PORT, portSpinner.getValue().toString()); } @@ -165,11 +178,13 @@ final class ViewPanel extends javax.swing.JPanel { } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox defaultViewComboBox; + private javax.swing.JTextField graphNameSuffixField; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField nodeShortTextField; diff --git a/src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/EditorTopComponent.java b/src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/EditorTopComponent.java index 35e440322d8..f1e6616a44f 100644 --- a/src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/EditorTopComponent.java +++ b/src/utils/IdealGraphVisualizer/View/src/main/java/com/sun/hotspot/igv/view/EditorTopComponent.java @@ -28,8 +28,10 @@ import com.sun.hotspot.igv.data.Group; import com.sun.hotspot.igv.data.InputGraph; import com.sun.hotspot.igv.data.InputLiveRange; import com.sun.hotspot.igv.data.InputNode; +import com.sun.hotspot.igv.data.Properties; import com.sun.hotspot.igv.data.services.InputGraphProvider; import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.settings.Settings; import com.sun.hotspot.igv.util.LookupHistory; import com.sun.hotspot.igv.util.RangeSlider; import com.sun.hotspot.igv.util.StringUtils; @@ -37,8 +39,14 @@ import com.sun.hotspot.igv.view.actions.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; -import java.util.*; +import java.util.Set; + import javax.swing.*; import javax.swing.border.Border; import org.openide.actions.RedoAction; @@ -132,7 +140,7 @@ public final class EditorTopComponent extends TopComponent implements TopCompone } diagramViewModel.addTitleCallback(changedGraph -> { - setDisplayName(changedGraph.getDisplayName()); + setDisplayName(getGraphDisplayName(changedGraph)); setToolTipText(diagramViewModel.getGroup().getDisplayName()); }); @@ -252,11 +260,25 @@ public final class EditorTopComponent extends TopComponent implements TopCompone } private void graphChanged(DiagramViewModel model) { - setDisplayName(model.getGraph().getDisplayName()); + setDisplayName(getGraphDisplayName(model.getGraph())); setToolTipText(model.getGroup().getDisplayName()); graphContent.set(Collections.singletonList(new EditorInputGraphProvider(this)), null); } + public static String getGraphDisplayName(InputGraph graph) { + if (graph.isDiffGraph()) { + return getGraphDisplayName(graph.getFirstGraph()) + " Δ " + + getGraphDisplayName(graph.getSecondGraph()); + } else { + String suffixTemplate = Settings.get().get(Settings.GRAPH_NAME_SUFFIX, + Settings.GRAPH_NAME_SUFFIX_DEFAULT); + String suffix = graph.getProperties().resolveString(suffixTemplate); + String emptySuffix = new Properties().resolveString(suffixTemplate); + String graphNameSuffix = suffix.equals(emptySuffix) ? "" : " " + suffix; + return graph.getIndex() + 1 + ". " + graph.getName() + graphNameSuffix; + } + } + public DiagramViewModel getModel() { return scene.getModel(); } From 5dd8a333960c7a7176503218e7a42173d376fc97 Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Tue, 28 Oct 2025 13:37:19 +0000 Subject: [PATCH 322/561] 8334898: Resolve static field/method references at CDS dump time Reviewed-by: iklam, adinn --- .../share/cds/aotConstantPoolResolver.cpp | 30 +++++++++++- src/hotspot/share/cds/classListWriter.cpp | 5 +- src/hotspot/share/cds/finalImageRecipes.cpp | 4 +- .../share/interpreter/interpreterRuntime.cpp | 1 + .../share/interpreter/linkResolver.cpp | 4 ++ .../share/interpreter/linkResolver.hpp | 1 + src/hotspot/share/oops/cpCache.cpp | 48 +++++++++---------- .../resolvedConstants/ResolvedConstants.java | 46 ++++++++++++++++-- 8 files changed, 107 insertions(+), 32 deletions(-) diff --git a/src/hotspot/share/cds/aotConstantPoolResolver.cpp b/src/hotspot/share/cds/aotConstantPoolResolver.cpp index 8b4e60dece2..ff47d00c484 100644 --- a/src/hotspot/share/cds/aotConstantPoolResolver.cpp +++ b/src/hotspot/share/cds/aotConstantPoolResolver.cpp @@ -224,6 +224,13 @@ void AOTConstantPoolResolver::preresolve_field_and_method_cp_entries(JavaThread* bcs.next(); Bytecodes::Code raw_bc = bcs.raw_code(); switch (raw_bc) { + case Bytecodes::_getstatic: + case Bytecodes::_putstatic: + maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); + if (HAS_PENDING_EXCEPTION) { + CLEAR_PENDING_EXCEPTION; // just ignore + } + break; case Bytecodes::_getfield: // no-fast bytecode case Bytecodes::_nofast_getfield: @@ -266,6 +273,7 @@ void AOTConstantPoolResolver::preresolve_field_and_method_cp_entries(JavaThread* case Bytecodes::_invokespecial: case Bytecodes::_invokevirtual: case Bytecodes::_invokeinterface: + case Bytecodes::_invokestatic: maybe_resolve_fmi_ref(ik, m, raw_bc, bcs.get_index_u2(), preresolve_list, THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; // just ignore @@ -302,13 +310,31 @@ void AOTConstantPoolResolver::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m } Klass* resolved_klass = cp->klass_ref_at(raw_index, bc, CHECK); + const char* is_static = ""; switch (bc) { + case Bytecodes::_getstatic: + case Bytecodes::_putstatic: + if (!VM_Version::supports_fast_class_init_checks()) { + return; // Do not resolve since interpreter lacks fast clinit barriers support + } + InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); + is_static = " *** static"; + break; + case Bytecodes::_getfield: case Bytecodes::_putfield: InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); break; + case Bytecodes::_invokestatic: + if (!VM_Version::supports_fast_class_init_checks()) { + return; // Do not resolve since interpreter lacks fast clinit barriers support + } + InterpreterRuntime::cds_resolve_invoke(bc, raw_index, cp, CHECK); + is_static = " *** static"; + break; + case Bytecodes::_invokevirtual: case Bytecodes::_invokespecial: case Bytecodes::_invokeinterface: @@ -328,11 +354,11 @@ void AOTConstantPoolResolver::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m bool resolved = cp->is_resolved(raw_index, bc); Symbol* name = cp->name_ref_at(raw_index, bc); Symbol* signature = cp->signature_ref_at(raw_index, bc); - log_trace(aot, resolve)("%s %s [%3d] %s -> %s.%s:%s", + log_trace(aot, resolve)("%s %s [%3d] %s -> %s.%s:%s%s", (resolved ? "Resolved" : "Failed to resolve"), Bytecodes::name(bc), cp_index, ik->external_name(), resolved_klass->external_name(), - name->as_C_string(), signature->as_C_string()); + name->as_C_string(), signature->as_C_string(), is_static); } } diff --git a/src/hotspot/share/cds/classListWriter.cpp b/src/hotspot/share/cds/classListWriter.cpp index 882bb84036f..8e1f298e8e3 100644 --- a/src/hotspot/share/cds/classListWriter.cpp +++ b/src/hotspot/share/cds/classListWriter.cpp @@ -277,7 +277,9 @@ void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) { if (field_entries != nullptr) { for (int i = 0; i < field_entries->length(); i++) { ResolvedFieldEntry* rfe = field_entries->adr_at(i); - if (rfe->is_resolved(Bytecodes::_getfield) || + if (rfe->is_resolved(Bytecodes::_getstatic) || + rfe->is_resolved(Bytecodes::_putstatic) || + rfe->is_resolved(Bytecodes::_getfield) || rfe->is_resolved(Bytecodes::_putfield)) { list.at_put(rfe->constant_pool_index(), true); print = true; @@ -292,6 +294,7 @@ void ClassListWriter::write_resolved_constants_for(InstanceKlass* ik) { if (rme->is_resolved(Bytecodes::_invokevirtual) || rme->is_resolved(Bytecodes::_invokespecial) || rme->is_resolved(Bytecodes::_invokeinterface) || + rme->is_resolved(Bytecodes::_invokestatic) || rme->is_resolved(Bytecodes::_invokehandle)) { list.at_put(rme->constant_pool_index(), true); print = true; diff --git a/src/hotspot/share/cds/finalImageRecipes.cpp b/src/hotspot/share/cds/finalImageRecipes.cpp index a9bbc398736..bf8a760904c 100644 --- a/src/hotspot/share/cds/finalImageRecipes.cpp +++ b/src/hotspot/share/cds/finalImageRecipes.cpp @@ -89,7 +89,9 @@ void FinalImageRecipes::record_recipes_for_constantpool() { if (field_entries != nullptr) { for (int i = 0; i < field_entries->length(); i++) { ResolvedFieldEntry* rfe = field_entries->adr_at(i); - if (rfe->is_resolved(Bytecodes::_getfield) || + if (rfe->is_resolved(Bytecodes::_getstatic) || + rfe->is_resolved(Bytecodes::_putstatic) || + rfe->is_resolved(Bytecodes::_getfield) || rfe->is_resolved(Bytecodes::_putfield)) { cp_indices.append(rfe->constant_pool_index()); flags |= CP_RESOLVE_FIELD_AND_METHOD; diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index cec8f70d655..70c4dd302d5 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -912,6 +912,7 @@ void InterpreterRuntime::cds_resolve_invoke(Bytecodes::Code bytecode, int method switch (bytecode) { case Bytecodes::_invokevirtual: LinkResolver::cds_resolve_virtual_call (call_info, link_info, CHECK); break; case Bytecodes::_invokeinterface: LinkResolver::cds_resolve_interface_call(call_info, link_info, CHECK); break; + case Bytecodes::_invokestatic: LinkResolver::cds_resolve_static_call (call_info, link_info, CHECK); break; case Bytecodes::_invokespecial: LinkResolver::cds_resolve_special_call (call_info, link_info, CHECK); break; default: fatal("Unimplemented: %s", Bytecodes::name(bytecode)); diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index 22199baef8e..d46ccdb4d1c 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -1126,6 +1126,10 @@ void LinkResolver::resolve_static_call(CallInfo& result, JFR_ONLY(Jfr::on_resolution(result, CHECK);) } +void LinkResolver::cds_resolve_static_call(CallInfo& result, const LinkInfo& link_info, TRAPS) { + resolve_static_call(result, link_info, /*initialize_class*/false, CHECK); +} + // throws linktime exceptions Method* LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) { diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp index 69bdf56137d..18fb4ee6ccb 100644 --- a/src/hotspot/share/interpreter/linkResolver.hpp +++ b/src/hotspot/share/interpreter/linkResolver.hpp @@ -328,6 +328,7 @@ class LinkResolver: AllStatic { static void cds_resolve_virtual_call (CallInfo& result, const LinkInfo& link_info, TRAPS); static void cds_resolve_interface_call(CallInfo& result, const LinkInfo& link_info, TRAPS); + static void cds_resolve_static_call(CallInfo& result, const LinkInfo& link_info, TRAPS); static void cds_resolve_special_call (CallInfo& result, const LinkInfo& link_info, TRAPS); // same as above for compile-time resolution; but returns null handle instead of throwing diff --git a/src/hotspot/share/oops/cpCache.cpp b/src/hotspot/share/oops/cpCache.cpp index f60229dbfff..75cdcb5310a 100644 --- a/src/hotspot/share/oops/cpCache.cpp +++ b/src/hotspot/share/oops/cpCache.cpp @@ -175,7 +175,8 @@ void ConstantPoolCache::set_direct_or_vtable_call(Bytecodes::Code invoke_code, } if (invoke_code == Bytecodes::_invokestatic) { assert(method->method_holder()->is_initialized() || - method->method_holder()->is_reentrant_initialization(JavaThread::current()), + method->method_holder()->is_reentrant_initialization(JavaThread::current()) || + (CDSConfig::is_dumping_archive() && VM_Version::supports_fast_class_init_checks()), "invalid class initialization state for invoke_static"); if (!VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) { @@ -428,8 +429,13 @@ void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() { ResolvedFieldEntry* rfi = _resolved_field_entries->adr_at(i); int cp_index = rfi->constant_pool_index(); bool archived = false; - bool resolved = rfi->is_resolved(Bytecodes::_getfield) || - rfi->is_resolved(Bytecodes::_putfield); + bool resolved = false; + + if (rfi->is_resolved(Bytecodes::_getfield) || rfi->is_resolved(Bytecodes::_putfield) || + ((rfi->is_resolved(Bytecodes::_getstatic) || rfi->is_resolved(Bytecodes::_putstatic)) && VM_Version::supports_fast_class_init_checks())) { + resolved = true; + } + if (resolved && !CDSConfig::is_dumping_preimage_static_archive() && AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { rfi->mark_and_relocate(); @@ -444,11 +450,12 @@ void ConstantPoolCache::remove_resolved_field_entries_if_non_deterministic() { Symbol* klass_name = cp->klass_name_at(klass_cp_index); Symbol* name = cp->uncached_name_ref_at(cp_index); Symbol* signature = cp->uncached_signature_ref_at(cp_index); - log.print("%s field CP entry [%3d]: %s => %s.%s:%s", + log.print("%s field CP entry [%3d]: %s => %s.%s:%s%s", (archived ? "archived" : "reverted"), cp_index, cp->pool_holder()->name()->as_C_string(), - klass_name->as_C_string(), name->as_C_string(), signature->as_C_string()); + klass_name->as_C_string(), name->as_C_string(), signature->as_C_string(), + rfi->is_resolved(Bytecodes::_getstatic) || rfi->is_resolved(Bytecodes::_putstatic) ? " *** static" : ""); } ArchiveBuilder::alloc_stats()->record_field_cp_entry(archived, resolved && !archived); } @@ -464,10 +471,8 @@ void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() { bool resolved = rme->is_resolved(Bytecodes::_invokevirtual) || rme->is_resolved(Bytecodes::_invokespecial) || rme->is_resolved(Bytecodes::_invokeinterface) || - rme->is_resolved(Bytecodes::_invokehandle); - - // Just for safety -- this should not happen, but do not archive if we ever see this. - resolved &= !(rme->is_resolved(Bytecodes::_invokestatic)); + rme->is_resolved(Bytecodes::_invokehandle) || + (rme->is_resolved(Bytecodes::_invokestatic) && VM_Version::supports_fast_class_init_checks()); if (resolved && !CDSConfig::is_dumping_preimage_static_archive() && can_archive_resolved_method(src_cp, rme)) { @@ -495,8 +500,8 @@ void ConstantPoolCache::remove_resolved_method_entries_if_non_deterministic() { resolved_klass->name()->as_C_string(), (rme->is_resolved(Bytecodes::_invokestatic) ? " *** static" : "")); } - ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived); } + ArchiveBuilder::alloc_stats()->record_method_cp_entry(archived, resolved && !archived); } } @@ -534,6 +539,7 @@ void ConstantPoolCache::remove_resolved_indy_entries_if_non_deterministic() { } bool ConstantPoolCache::can_archive_resolved_method(ConstantPool* src_cp, ResolvedMethodEntry* method_entry) { + LogStreamHandle(Trace, aot, resolve) log; InstanceKlass* pool_holder = constant_pool()->pool_holder(); if (pool_holder->defined_by_other_loaders()) { // Archiving resolved cp entries for classes from non-builtin loaders @@ -554,6 +560,12 @@ bool ConstantPoolCache::can_archive_resolved_method(ConstantPool* src_cp, Resolv if (method_entry->method()->is_continuation_native_intrinsic()) { return false; // FIXME: corresponding stub is generated on demand during method resolution (see LinkResolver::resolve_static_call). } + if (method_entry->is_resolved(Bytecodes::_invokehandle) && !CDSConfig::is_dumping_method_handles()) { + return false; + } + if (method_entry->method()->is_method_handle_intrinsic() && !CDSConfig::is_dumping_method_handles()) { + return false; + } } int cp_index = method_entry->constant_pool_index(); @@ -562,21 +574,7 @@ bool ConstantPoolCache::can_archive_resolved_method(ConstantPool* src_cp, Resolv if (!AOTConstantPoolResolver::is_resolution_deterministic(src_cp, cp_index)) { return false; } - - if (method_entry->is_resolved(Bytecodes::_invokeinterface) || - method_entry->is_resolved(Bytecodes::_invokevirtual) || - method_entry->is_resolved(Bytecodes::_invokespecial)) { - return true; - } else if (method_entry->is_resolved(Bytecodes::_invokehandle)) { - if (CDSConfig::is_dumping_method_handles()) { - // invokehandle depends on archived MethodType and LambdaForms. - return true; - } else { - return false; - } - } else { - return false; - } + return true; } #endif // INCLUDE_CDS diff --git a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java index 621d6383ff4..ea2c6fc88b4 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/resolvedConstants/ResolvedConstants.java @@ -58,6 +58,22 @@ * @run main/othervm -Dcds.app.tester.workflow=DYNAMIC -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. ResolvedConstants DYNAMIC */ +/* + * @test id=aot + * @summary Dump time resolution of constant pool entries (AOT workflow). + * @requires vm.cds + * @requires vm.cds.supports.aot.class.linking + * @requires vm.compMode != "Xcomp" + * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds/test-classes/ + * @build OldProvider OldClass OldConsumer StringConcatTestOld + * @build ResolvedConstants + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar + * ResolvedConstantsApp ResolvedConstantsFoo ResolvedConstantsBar + * MyInterface InterfaceWithClinit NormalClass + * OldProvider OldClass OldConsumer SubOfOldClass + * StringConcatTest StringConcatTestOld + * @run driver ResolvedConstants AOT --two-step-training + */ import java.util.function.Consumer; import jdk.test.lib.cds.CDSOptions; import jdk.test.lib.cds.CDSTestUtils; @@ -122,12 +138,15 @@ public class ResolvedConstants { .shouldMatch(ALWAYS("field.* ResolvedConstantsBar => ResolvedConstantsBar.a:I")) .shouldMatch(ALWAYS("field.* ResolvedConstantsBar => ResolvedConstantsFoo.a:I")) .shouldMatch(ALWAYS("field.* ResolvedConstantsFoo => ResolvedConstantsFoo.a:I")) + .shouldMatch(ALWAYS("field.* ResolvedConstantsApp => ResolvedConstantsApp.static_i:I")) // Resolve field references to child classes ONLY when using -XX:+AOTClassLinking + .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsFoo => ResolvedConstantsBar.static_b:I")) .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsFoo => ResolvedConstantsBar.a:I")) .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsFoo => ResolvedConstantsBar.b:I")) // Resolve field references to unrelated classes ONLY when using -XX:+AOTClassLinking + .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsApp => ResolvedConstantsBar.static_b:I")) .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsApp => ResolvedConstantsBar.a:I")) .shouldMatch(AOTLINK_ONLY("field.* ResolvedConstantsApp => ResolvedConstantsBar.b:I")); @@ -150,8 +169,8 @@ public class ResolvedConstants { .shouldMatch(ALWAYS("method.*: ResolvedConstantsApp ResolvedConstantsApp.privateInstanceCall:")) .shouldMatch(ALWAYS("method.*: ResolvedConstantsApp ResolvedConstantsApp.publicInstanceCall:")) - // Should not resolve references to static method - .shouldNotMatch(ALWAYS("method.*: ResolvedConstantsApp ResolvedConstantsApp.staticCall:")) + // Should resolve references to static method + .shouldMatch(ALWAYS("method.*: ResolvedConstantsApp ResolvedConstantsApp.staticCall:")) // Should resolve references to method in super type .shouldMatch(ALWAYS("method.*: ResolvedConstantsBar ResolvedConstantsFoo.doBar:")) @@ -164,7 +183,12 @@ public class ResolvedConstants { .shouldMatch(AOTLINK_ONLY("method.*: ResolvedConstantsApp java/io/PrintStream.println:")) .shouldMatch(AOTLINK_ONLY("method.*: ResolvedConstantsBar java/lang/Class.getName:")) - // Resole resolve methods in unrelated classes ONLY when using -XX:+AOTClassLinking + // Resolve method references to child classes ONLY when using -XX:+AOTClassLinking + .shouldMatch(AOTLINK_ONLY("method.* ResolvedConstantsFoo ResolvedConstantsBar.static_doit")) + .shouldMatch(AOTLINK_ONLY("method.* ResolvedConstantsFoo ResolvedConstantsBar.doit2")) + + // Resolve methods in unrelated classes ONLY when using -XX:+AOTClassLinking + .shouldMatch(AOTLINK_ONLY("method.*: ResolvedConstantsApp ResolvedConstantsBar.static_doit:")) .shouldMatch(AOTLINK_ONLY("method.*: ResolvedConstantsApp ResolvedConstantsBar.doit:")) // End --- @@ -203,11 +227,14 @@ class ResolvedConstantsApp implements Runnable { System.out.println("Hello ResolvedConstantsApp"); ResolvedConstantsApp app = new ResolvedConstantsApp(); ResolvedConstantsApp.staticCall(); + ResolvedConstantsApp.static_i ++; app.privateInstanceCall(); app.publicInstanceCall(); Object a = app; ((Runnable)a).run(); + ResolvedConstantsBar.static_b += 10; + ResolvedConstantsBar.static_doit(); ResolvedConstantsFoo foo = new ResolvedConstantsFoo(); ResolvedConstantsBar bar = new ResolvedConstantsBar(); bar.a ++; @@ -218,6 +245,7 @@ class ResolvedConstantsApp implements Runnable { StringConcatTest.test(); StringConcatTestOld.main(null); } + private static int static_i = 10; private static void staticCall() {} private void privateInstanceCall() {} public void publicInstanceCall() {} @@ -313,13 +341,21 @@ class ResolvedConstantsFoo { } void doBar(ResolvedConstantsBar bar) { + ResolvedConstantsBar.static_b += 1; + ResolvedConstantsBar.static_doit(); + bar.a ++; bar.b ++; + bar.doit2(); } } class ResolvedConstantsBar extends ResolvedConstantsFoo { + public static int static_b = 10; int b = 2; + public static void static_doit() { + } + void doit() { System.out.println("Hello ResolvedConstantsBar and " + ResolvedConstantsFoo.class.getName()); System.out.println("a = " + a); @@ -330,4 +366,8 @@ class ResolvedConstantsBar extends ResolvedConstantsFoo { ((ResolvedConstantsFoo)this).doBar(this); } + + void doit2() { + + } } From c3c0a676e53dbafd82e8614a20f6c47df7fc2108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96sterlund?= Date: Tue, 28 Oct 2025 13:41:38 +0000 Subject: [PATCH 323/561] 8370500: Change windows x64 implementation of os::current_stack_pointer() Reviewed-by: aboldtch, dholmes, kvn, adinn --- src/hotspot/cpu/x86/stubDeclarations_x86.hpp | 4 ---- src/hotspot/cpu/x86/stubGenerator_x86_64.cpp | 18 ----------------- src/hotspot/cpu/x86/stubGenerator_x86_64.hpp | 6 ------ .../os_cpu/windows_x86/os_windows_x86.cpp | 20 ++++++++++--------- 4 files changed, 11 insertions(+), 37 deletions(-) diff --git a/src/hotspot/cpu/x86/stubDeclarations_x86.hpp b/src/hotspot/cpu/x86/stubDeclarations_x86.hpp index 30a93fa4917..3e0e1d5bf07 100644 --- a/src/hotspot/cpu/x86/stubDeclarations_x86.hpp +++ b/src/hotspot/cpu/x86/stubDeclarations_x86.hpp @@ -41,10 +41,6 @@ do_stub(initial, verify_mxcsr) \ do_arch_entry(x86, initial, verify_mxcsr, verify_mxcsr_entry, \ verify_mxcsr_entry) \ - do_stub(initial, get_previous_sp) \ - do_arch_entry(x86, initial, get_previous_sp, \ - get_previous_sp_entry, \ - get_previous_sp_entry) \ do_stub(initial, f2i_fixup) \ do_arch_entry(x86, initial, f2i_fixup, f2i_fixup, f2i_fixup) \ do_stub(initial, f2l_fixup) \ diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp index 6eb641daaf9..efb0411aa39 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp @@ -541,22 +541,6 @@ address StubGenerator::generate_orderaccess_fence() { } -// Support for intptr_t get_previous_sp() -// -// This routine is used to find the previous stack pointer for the -// caller. -address StubGenerator::generate_get_previous_sp() { - StubId stub_id = StubId::stubgen_get_previous_sp_id; - StubCodeMark mark(this, stub_id); - address start = __ pc(); - - __ movptr(rax, rsp); - __ addptr(rax, 8); // return address is at the top of the stack. - __ ret(0); - - return start; -} - //---------------------------------------------------------------------------------------------------- // Support for void verify_mxcsr() // @@ -4083,8 +4067,6 @@ void StubGenerator::generate_initial_stubs() { StubRoutines::_catch_exception_entry = generate_catch_exception(); // platform dependent - StubRoutines::x86::_get_previous_sp_entry = generate_get_previous_sp(); - StubRoutines::x86::_verify_mxcsr_entry = generate_verify_mxcsr(); StubRoutines::x86::_f2i_fixup = generate_f2i_fixup(); diff --git a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp index 0887225d3e8..36315535d16 100644 --- a/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_64.hpp @@ -68,12 +68,6 @@ class StubGenerator: public StubCodeGenerator { // Support for intptr_t OrderAccess::fence() address generate_orderaccess_fence(); - // Support for intptr_t get_previous_sp() - // - // This routine is used to find the previous stack pointer for the - // caller. - address generate_get_previous_sp(); - //---------------------------------------------------------------------------------------------------- // Support for void verify_mxcsr() // diff --git a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp index 53f96479832..c688848c790 100644 --- a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp +++ b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp @@ -51,6 +51,8 @@ #include "utilities/vmError.hpp" #include "windbghelp.hpp" +#include + #undef REG_SP #undef REG_FP @@ -247,11 +249,15 @@ intptr_t* os::fetch_bcp_from_context(const void* ucVoid) { // Returns the current stack pointer. Accurate value needed for // os::verify_stack_alignment(). +// The function is intentionally not inlined. This way, the transfer of control +// into this method must be made with a call instruction. The MSVC +// _AddressOfReturnAddress() intrinsic returns the address of the return PC +// saved by that call instruction. Therefore, the stack pointer of the caller +// just before the call instruction, is acquired by skipping over the return PC +// slot in the stack. +__declspec(noinline) address os::current_stack_pointer() { - typedef address get_sp_func(); - get_sp_func* func = CAST_TO_FN_PTR(get_sp_func*, - StubRoutines::x86::get_previous_sp_entry()); - return (*func)(); + return ((address)_AddressOfReturnAddress()) + sizeof(void*); } bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread, @@ -408,11 +414,7 @@ void os::setup_fpu() { #ifndef PRODUCT void os::verify_stack_alignment() { - // The current_stack_pointer() calls generated get_previous_sp stub routine. - // Only enable the assert after the routine becomes available. - if (StubRoutines::initial_stubs_code() != nullptr) { - assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment"); - } + assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment"); } #endif From 69a9b4ceaf3852a299ee268a39e56575ad8207ab Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Tue, 28 Oct 2025 16:42:54 +0000 Subject: [PATCH 324/561] 8370064: Test runtime/NMT/CheckForProperDetailStackTrace.java fails on Windows when using stripped pdb files Reviewed-by: dholmes, clanger --- make/hotspot/lib/CompileJvm.gmk | 5 +++++ src/hotspot/share/prims/whitebox.cpp | 9 +++++++++ .../NMT/CheckForProperDetailStackTrace.java | 17 ++++++++++++++--- test/lib/jdk/test/whitebox/WhiteBox.java | 2 ++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/make/hotspot/lib/CompileJvm.gmk b/make/hotspot/lib/CompileJvm.gmk index b5a8b4ef2a1..fd574b9e42d 100644 --- a/make/hotspot/lib/CompileJvm.gmk +++ b/make/hotspot/lib/CompileJvm.gmk @@ -158,6 +158,10 @@ ifeq ($(call isTargetOs, windows), true) WIN_EXPORT_FILE := $(JVM_OUTPUTDIR)/win-exports.def endif + ifeq ($(SHIP_DEBUG_SYMBOLS), public) + CFLAGS_STRIPPED_DEBUGINFO := -DHAS_STRIPPED_DEBUGINFO + endif + JVM_LDFLAGS += -def:$(WIN_EXPORT_FILE) endif @@ -183,6 +187,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJVM, \ CFLAGS := $(JVM_CFLAGS), \ abstract_vm_version.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \ arguments.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \ + whitebox.cpp_CXXFLAGS := $(CFLAGS_STRIPPED_DEBUGINFO), \ DISABLED_WARNINGS_gcc := $(DISABLED_WARNINGS_gcc), \ DISABLED_WARNINGS_gcc_ad_$(HOTSPOT_TARGET_CPU_ARCH).cpp := nonnull, \ DISABLED_WARNINGS_gcc_bytecodeInterpreter.cpp := unused-label, \ diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index b4d100341e0..92f5356235a 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -509,6 +509,14 @@ WB_ENTRY(jboolean, WB_ConcurrentGCRunTo(JNIEnv* env, jobject o, jobject at)) return ConcurrentGCBreakpoints::run_to(c_name); WB_END +WB_ENTRY(jboolean, WB_HasExternalSymbolsStripped(JNIEnv* env, jobject o)) +#if defined(HAS_STRIPPED_DEBUGINFO) + return true; +#else + return false; +#endif +WB_END + #if INCLUDE_G1GC WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj)) @@ -2813,6 +2821,7 @@ static JNINativeMethod methods[] = { {CC"getVMLargePageSize", CC"()J", (void*)&WB_GetVMLargePageSize}, {CC"getHeapSpaceAlignment", CC"()J", (void*)&WB_GetHeapSpaceAlignment}, {CC"getHeapAlignment", CC"()J", (void*)&WB_GetHeapAlignment}, + {CC"hasExternalSymbolsStripped", CC"()Z", (void*)&WB_HasExternalSymbolsStripped}, {CC"countAliveClasses0", CC"(Ljava/lang/String;)I", (void*)&WB_CountAliveClasses }, {CC"getSymbolRefcount", CC"(Ljava/lang/String;)I", (void*)&WB_GetSymbolRefcount }, {CC"parseCommandLine0", diff --git a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java index 398d6b523ad..28af0692721 100644 --- a/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java +++ b/test/hotspot/jtreg/runtime/NMT/CheckForProperDetailStackTrace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -26,11 +26,14 @@ * @bug 8133747 8218458 * @summary Running with NMT detail should produce expected stack traces. * @library /test/lib + * @library / * @modules java.base/jdk.internal.misc * java.management * @requires vm.debug + * @build jdk.test.whitebox.WhiteBox * @compile ../modules/CompilerUtils.java - * @run driver CheckForProperDetailStackTrace + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI CheckForProperDetailStackTrace */ import jdk.test.lib.Platform; @@ -40,6 +43,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.regex.Matcher; import java.util.regex.Pattern; +import jdk.test.whitebox.WhiteBox; /** * We are checking for details that should be seen with NMT detail enabled. @@ -59,7 +63,10 @@ public class CheckForProperDetailStackTrace { private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); private static final Path MODS_DIR = Paths.get(TEST_CLASSES, "mods"); - private static final boolean expectSourceInformation = Platform.isLinux() || Platform.isWindows(); + // Windows has source information only in full pdbs, not in stripped pdbs + private static boolean expectSourceInformation = Platform.isLinux() || Platform.isWindows(); + + static WhiteBox wb = WhiteBox.getWhiteBox(); /* The stack trace we look for by default. Note that :: has been replaced by .* to make sure it matches even if the symbol is not unmangled. @@ -138,6 +145,10 @@ public class CheckForProperDetailStackTrace { throw new RuntimeException("Expected stack trace missing from output"); } + if (wb.hasExternalSymbolsStripped()) { + expectSourceInformation = false; + } + System.out.println("Looking for source information:"); if (expectSourceInformation) { if (!stackTraceMatches(".*moduleEntry.cpp.*", output)) { diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index d07dedd2a8c..e989b0aca88 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -78,6 +78,8 @@ public class WhiteBox { public native long getHeapSpaceAlignment(); public native long getHeapAlignment(); + public native boolean hasExternalSymbolsStripped(); + private native boolean isObjectInOldGen0(Object o); public boolean isObjectInOldGen(Object o) { Objects.requireNonNull(o); From 289f421f0f132685c2bd0e6cbc702040e067184e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20H=C3=BCbner?= Date: Tue, 28 Oct 2025 16:47:16 +0000 Subject: [PATCH 325/561] 8366488: JVM_FindClassFromClass should assert that from class is never null Reviewed-by: coleenp, dholmes --- src/hotspot/share/prims/jvm.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 6b464ae8e3e..a868f6337e2 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -825,13 +825,11 @@ JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, SystemDictionary::class_name_symbol(name, vmSymbols::java_lang_ClassNotFoundException(), CHECK_NULL); oop from_class_oop = JNIHandles::resolve(from); - Klass* from_class = (from_class_oop == nullptr) - ? (Klass*)nullptr - : java_lang_Class::as_Klass(from_class_oop); - oop class_loader = nullptr; - if (from_class != nullptr) { - class_loader = from_class->class_loader(); - } + assert(from_class_oop != nullptr, "must be"); + Klass* from_class = java_lang_Class::as_Klass(from_class_oop); + assert(from_class != nullptr, "must be"); + oop class_loader = from_class->class_loader(); + Handle h_loader(THREAD, class_loader); jclass result = find_class_from_class_loader(env, h_name, init, h_loader, true, thread); From 5ebc2c7212b21efe54c198f62f06e5edc68e8ec3 Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Tue, 28 Oct 2025 16:51:15 +0000 Subject: [PATCH 326/561] 8369995: Fix StringIndexOutOfBoundsException and implement extra logging and/or propagate errors in X509KeyManagerImpl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Jeliński Reviewed-by: wetmore, djelinski, abarashev --- .../sun/security/ssl/X509KeyManagerImpl.java | 46 ++-- .../ssl/X509KeyManager/NullCases.java | 210 +++++++++++++++--- .../X509KeyManagerNegativeTests.java | 187 ++++++++++++++++ 3 files changed, 395 insertions(+), 48 deletions(-) create mode 100644 test/jdk/sun/security/ssl/X509KeyManager/X509KeyManagerNegativeTests.java diff --git a/src/java.base/share/classes/sun/security/ssl/X509KeyManagerImpl.java b/src/java.base/share/classes/sun/security/ssl/X509KeyManagerImpl.java index e48096cc363..c607fe0f25d 100644 --- a/src/java.base/share/classes/sun/security/ssl/X509KeyManagerImpl.java +++ b/src/java.base/share/classes/sun/security/ssl/X509KeyManagerImpl.java @@ -33,8 +33,10 @@ import java.security.KeyStore.Builder; import java.security.KeyStore.Entry; import java.security.KeyStore.PrivateKeyEntry; import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; import java.security.Principal; import java.security.PrivateKey; +import java.security.UnrecoverableEntryException; import java.security.cert.X509Certificate; import java.util.*; import java.util.concurrent.atomic.AtomicLong; @@ -221,10 +223,17 @@ final class X509KeyManagerImpl extends X509KeyManagerCertChecking { // parse the alias int firstDot = alias.indexOf('.'); int secondDot = alias.indexOf('.', firstDot + 1); - if ((firstDot == -1) || (secondDot == firstDot)) { - // invalid alias + + if ((firstDot < 1) + || (secondDot - firstDot < 2) + || (alias.length() - secondDot < 2)) { + + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.warning("Invalid alias format: " + alias); + } return null; } + try { int builderIndex = Integer.parseInt (alias.substring(firstDot + 1, secondDot)); @@ -240,8 +249,16 @@ final class X509KeyManagerImpl extends X509KeyManagerCertChecking { entry = (PrivateKeyEntry)newEntry; entryCacheMap.put(alias, new SoftReference<>(entry)); return entry; - } catch (Exception e) { - // ignore + } catch (UnrecoverableEntryException | + KeyStoreException | + NumberFormatException | + NoSuchAlgorithmException | + IndexOutOfBoundsException e) { + // ignore and only log exception + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.warning("Exception thrown while getting an alias " + + alias + ": " + e); + } return null; } } @@ -278,8 +295,9 @@ final class X509KeyManagerImpl extends X509KeyManagerCertChecking { if (results != null) { for (EntryStatus status : results) { if (status.checkResult == CheckResult.OK) { - if (SSLLogger.isOn && SSLLogger.isOn("keymanager")) { - SSLLogger.fine("KeyMgr: choosing key: " + status); + if (SSLLogger.isOn + && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.fine("Choosing key: " + status); } return makeAlias(status); } @@ -294,15 +312,15 @@ final class X509KeyManagerImpl extends X509KeyManagerCertChecking { } } if (allResults == null) { - if (SSLLogger.isOn && SSLLogger.isOn("keymanager")) { - SSLLogger.fine("KeyMgr: no matching key found"); + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.fine("No matching key found"); } return null; } Collections.sort(allResults); - if (SSLLogger.isOn && SSLLogger.isOn("keymanager")) { + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { SSLLogger.fine( - "KeyMgr: no good matching key found, " + "No good matching key found, " + "returning best match out of", allResults); } return makeAlias(allResults.get(0)); @@ -340,14 +358,14 @@ final class X509KeyManagerImpl extends X509KeyManagerCertChecking { } } if (allResults == null || allResults.isEmpty()) { - if (SSLLogger.isOn && SSLLogger.isOn("keymanager")) { - SSLLogger.fine("KeyMgr: no matching alias found"); + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.fine("No matching alias found"); } return null; } Collections.sort(allResults); - if (SSLLogger.isOn && SSLLogger.isOn("keymanager")) { - SSLLogger.fine("KeyMgr: getting aliases", allResults); + if (SSLLogger.isOn && SSLLogger.isOn("ssl,keymanager")) { + SSLLogger.fine("Getting aliases", allResults); } return toAliases(allResults); } diff --git a/test/jdk/sun/security/ssl/X509KeyManager/NullCases.java b/test/jdk/sun/security/ssl/X509KeyManager/NullCases.java index fe577cf93f6..3b50fbd149f 100644 --- a/test/jdk/sun/security/ssl/X509KeyManager/NullCases.java +++ b/test/jdk/sun/security/ssl/X509KeyManager/NullCases.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6302126 6302321 6302271 6302304 + * @bug 6302126 6302321 6302271 6302304 8369995 * @summary KeyManagerFactory.init method throws unspecified exception * for NewSunX509 algorithm * X509KeyManager implementation for NewSunX509 throws unspecified @@ -32,50 +32,192 @@ * arrays instead of null * X509KeyManager implementation for NewSunX509 throws unspecified * NullPointerException + * Extra logging and/or propagate errors in X509KeyManagerImpl + * + * @library /test/lib /test/jdk/java/net/httpclient/lib + * @modules java.base/sun.security.x509 + * + * @run junit NullCases */ -import java.io.*; -import java.net.*; -import java.security.*; -import javax.net.ssl.*; + +import jdk.test.lib.Asserts; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.X509KeyManager; +import java.security.KeyPair; +import java.security.SecureRandom; +import java.security.KeyStore; +import java.security.PrivateKey; +import java.security.cert.Certificate; import java.security.cert.X509Certificate; -import java.util.*; +import static jdk.httpclient.test.lib.common.DynamicKeyStoreUtil.generateCert; +import static jdk.httpclient.test.lib.common.DynamicKeyStoreUtil.generateKeyStore; +import static jdk.httpclient.test.lib.common.DynamicKeyStoreUtil.generateRSAKeyPair; public class NullCases { - public static void main(String[] args) throws Exception { - KeyManagerFactory kmf; - X509KeyManager km; - char [] password = {' '}; - // check for bug 6302126 + private static KeyManagerFactory kmf; + private static X509KeyManager km; + + @BeforeAll + public static void beforeAll() throws Exception { kmf = KeyManagerFactory.getInstance("NewSunX509"); - kmf.init((KeyStore)null, password); - // check for 6302321 + // creating a new keystore + final SecureRandom secureRandom = new SecureRandom(); + final KeyPair keyPair = generateRSAKeyPair(secureRandom); + final X509Certificate originServerCert = + generateCert(keyPair, secureRandom, "subject"); + final KeyStore ks = generateKeyStore(keyPair.getPrivate(), + new Certificate[]{originServerCert}); + + kmf.init(ks, null); km = (X509KeyManager) kmf.getKeyManagers()[0]; - X509Certificate[] certs = km.getCertificateChain("doesnotexist"); - PrivateKey priv = km.getPrivateKey("doesnotexist"); - if (certs != null || priv != null) { - throw new Exception("Should return null if the alias can't be found"); - } + } + private X509KeyManager generateNullKm() throws Exception { + char[] password = {' '}; + kmf.init((KeyStore) null, password); + return (X509KeyManager) kmf.getKeyManagers()[0]; + } + + @Test + public void JDK6302126Test() throws Exception { + // check for bug 6302126 + + generateNullKm(); + } + + @Test + public void JDK6302304Test() throws Exception { + // check for bug 6302304 + + final X509KeyManager km = generateNullKm(); + + final String[] serverAliases = + km.getServerAliases(null, null); + Asserts.assertNull(serverAliases, + "Should return null if server alias not found"); + final String[] clientAliases = + km.getClientAliases(null, null); + Asserts.assertNull(clientAliases, + "Should return null if client alias not found"); + + final X509Certificate[] certs = + km.getCertificateChain(null); + final PrivateKey priv = + km.getPrivateKey(null); + Asserts.assertNull(certs, + "Should return null if the alias can't be found"); + Asserts.assertNull(priv, + "Should return null if the alias can't be found"); + + final String serverAlias = + km.chooseServerAlias(null, null, null); + Asserts.assertNull(serverAlias, + "Should return null if the alias can't be chosen"); + final String clientAlias = + km.chooseClientAlias(null, null, null); + Asserts.assertNull(clientAlias, + "Should return null if the alias can't be chosen"); + } + + @Test + public void JDK6302321Test() { + // check for bug 6302321 + + final X509Certificate[] certs = + km.getCertificateChain("doesnotexist"); + final PrivateKey priv = km.getPrivateKey("doesnotexist"); + Asserts.assertNull(certs, + "Should return null if the alias can't be found"); + Asserts.assertNull(priv, + "Should return null if the alias can't be found"); + } + + @Test + public void JDK6302271Test() { // check for 6302271 - String[] clis = km.getClientAliases("doesnotexist", null); - if (clis != null && clis.length == 0) { - throw new Exception("Should return null instead of empty array"); - } - String[] srvs = km.getServerAliases("doesnotexist", null); - if (srvs != null && srvs.length == 0) { - throw new Exception("Should return null instead of empty array"); - } - // check for 6302304 - km.getServerAliases(null, null); - km.getClientAliases(null, null); - km.getCertificateChain(null); - km.getPrivateKey(null); - km.chooseServerAlias(null, null, null); - km.chooseClientAlias(null, null, null); + final String[] clis = + km.getClientAliases("doesnotexist", null); + Asserts.assertFalse((clis != null && clis.length == 0), + "Should return null instead of empty array"); + + final String[] srvs = + km.getServerAliases("doesnotexist", null); + Asserts.assertFalse((srvs != null && srvs.length == 0), + "Should return null instead of empty array"); + } + + /** + * The following tests are testing JDK-8369995 + */ + + @Test + public void incompleteChainAndKeyTest() { + final X509Certificate[] certs = km.getCertificateChain("1.1"); + final PrivateKey priv = km.getPrivateKey("1.1"); + + Asserts.assertNull(certs, + "Should return null if the alias is incomplete"); + Asserts.assertNull(priv, + "Should return null if the alias is incomplete"); + } + + @Test + public void nonexistentBuilderTest() { + final X509Certificate[] certs = km.getCertificateChain("RSA.1.1"); + final PrivateKey priv = km.getPrivateKey("RSA.1.1"); + + Asserts.assertNull(certs, + "Should return null if builder doesn't exist"); + Asserts.assertNull(priv, + "Should return null if builder doesn't exist"); + } + + @Test + public void nonexistentKSTest() { + final X509Certificate[] certs = km.getCertificateChain("RSA.0.1"); + final PrivateKey priv = km.getPrivateKey("RSA.0.1"); + + Asserts.assertNull(certs, + "Should return null if KS doesn't exist"); + Asserts.assertNull(priv, + "Should return null if KS doesn't exist"); + } + + @Test + public void wrongNumberFormatTest() { + final X509Certificate[] certs = + km.getCertificateChain("RSA.not.exist"); + final PrivateKey priv = km.getPrivateKey("RSA.not.exist"); + + Asserts.assertNull(certs, + "Should return null if number format is wrong in alias"); + Asserts.assertNull(priv, + "Should return null if number format is wrong in alias"); + } + + @ParameterizedTest + @ValueSource(strings = {"1..1", "1..",".1.", "..1", ".9.123456789"}) + public void invalidAliasTest(final String alias) { + final X509Certificate[] certs = km.getCertificateChain(alias); + final PrivateKey priv = km.getPrivateKey(alias); + + Asserts.assertNull(certs, + String.format( + "Should return null if the alias is invalid <%s>", + alias)); + Asserts.assertNull(priv, + String.format( + "Should return null if the alias is invalid <%s>", + alias)); } } diff --git a/test/jdk/sun/security/ssl/X509KeyManager/X509KeyManagerNegativeTests.java b/test/jdk/sun/security/ssl/X509KeyManager/X509KeyManagerNegativeTests.java new file mode 100644 index 00000000000..d50e1ee36d9 --- /dev/null +++ b/test/jdk/sun/security/ssl/X509KeyManager/X509KeyManagerNegativeTests.java @@ -0,0 +1,187 @@ +/* + * 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. + */ + +import jdk.test.lib.Asserts; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.X509KeyManager; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.Key; +import java.security.KeyStore; +import java.security.KeyStoreSpi; +import java.security.Provider; +import java.security.Security; +import java.security.cert.Certificate; +import java.util.ConcurrentModificationException; +import java.util.Date; +import java.util.Enumeration; + +/* + * @test + * @bug 8369995 + * @summary X509KeyManagerImpl negative tests causing exceptions + * @library /test/lib + * @run junit/othervm X509KeyManagerNegativeTests + */ +public class X509KeyManagerNegativeTests { + private static X509KeyManager exceptionThrowingKM; + + @BeforeAll + public static void beforeAll() throws Exception { + + // initialising exception throwing ks + // cleaned up after the tests are complete + final KeyManagerFactory exceptionThrowingKMF = + KeyManagerFactory.getInstance("NewSunX509"); + + // adding dummy provider + Security.addProvider(new MyCustomKSProvider()); + final KeyStore exceptionThrowingKS = + KeyStore.getInstance("MyExceptionKS"); + exceptionThrowingKS.load(null, null); + + exceptionThrowingKMF + .init(exceptionThrowingKS, null); + exceptionThrowingKM = + (X509KeyManager) exceptionThrowingKMF.getKeyManagers()[0]; + } + + @AfterAll + public static void cleanup() { + // remove custom provider + Security.removeProvider("MyCustomKSProvider"); + } + + @Test + public void ksExceptionTest() { + Asserts.assertThrows(ConcurrentModificationException.class, + () -> exceptionThrowingKM.getCertificateChain("RSA.0.0")); + Asserts.assertThrows(ConcurrentModificationException.class, + () -> exceptionThrowingKM.getPrivateKey("RSA.0.0")); + } + + public static class MyCustomKSProvider extends Provider { + public MyCustomKSProvider() { + super("MyCustomKSProvider", + "1.0", + "My Custom KS Provider"); + put("KeyStore.MyExceptionKS", MyExceptionKS.class.getName()); + } + } + + public static class MyExceptionKS extends KeyStoreSpi { + + @Override + public KeyStore.Entry engineGetEntry(String alias, + KeyStore.ProtectionParameter param) + { + throw new ConcurrentModificationException("getEntry exception"); + } + + @Override + public Key engineGetKey(String alias, char[] password) { + return null; + } + + @Override + public Certificate[] engineGetCertificateChain(String alias) { + return null; + } + + @Override + public Certificate engineGetCertificate(String alias) { + return null; + } + + @Override + public Date engineGetCreationDate(String alias) { + return null; + } + + @Override + public Enumeration engineAliases() { + return null; + } + + @Override + public boolean engineContainsAlias(String alias) { + return false; + } + + @Override + public int engineSize() { + return 0; + } + + @Override + public boolean engineIsKeyEntry(String alias) { + return false; + } + + @Override + public boolean engineIsCertificateEntry(String alias) { + return false; + } + + @Override + public String engineGetCertificateAlias(Certificate cert) { + return null; + } + + @Override + public void engineStore(OutputStream stream, char[] password) { + } + + @Override + public void engineLoad(InputStream stream, char[] password) { + } + + @Override + public void engineSetKeyEntry(String alias, + Key key, + char[] password, + Certificate[] chain) { + } + + @Override + public void engineSetKeyEntry(String alias, + byte[] key, + Certificate[] chain) { + } + + @Override + public void engineSetCertificateEntry(String alias, + Certificate cert) { + } + + @Override + public void engineDeleteEntry(String alias) { + } + } +} From 86f60f608198c2fa5cbbe945d9396326b6944401 Mon Sep 17 00:00:00 2001 From: Anton Seoane Ampudia Date: Tue, 28 Oct 2025 17:49:23 +0000 Subject: [PATCH 327/561] 8351149: Remove dead IA32/X32/!AMD64 code blocks after 32-bit x86 removal Reviewed-by: stefank, ayang, kvn --- src/hotspot/cpu/zero/vm_version_zero.cpp | 5 +- src/hotspot/os/bsd/os_bsd.cpp | 16 +-- src/hotspot/os/linux/os_linux.cpp | 121 ++---------------- src/hotspot/os/windows/os_windows.cpp | 2 - .../os_cpu/linux_zero/os_linux_zero.cpp | 12 +- src/hotspot/share/adlc/output_c.cpp | 2 +- src/hotspot/share/c1/c1_CodeStubs.hpp | 2 +- src/hotspot/share/c1/c1_LIRAssembler.cpp | 16 --- .../mode/shenandoahGenerationalMode.cpp | 2 +- .../gc/shenandoah/shenandoahArguments.cpp | 2 +- .../share/interpreter/abstractInterpreter.hpp | 2 +- .../share/interpreter/interpreterRuntime.cpp | 2 +- .../share/interpreter/interpreterRuntime.hpp | 4 +- .../share/jfr/utilities/jfrBigEndian.hpp | 2 +- src/hotspot/share/opto/chaitin.cpp | 7 - src/hotspot/share/opto/divnode.cpp | 4 - src/hotspot/share/opto/machnode.hpp | 2 +- src/hotspot/share/opto/mulnode.cpp | 8 -- .../share/runtime/abstract_vm_version.cpp | 1 - src/hotspot/share/utilities/debug.cpp | 1 - src/hotspot/share/utilities/macros.hpp | 10 +- .../hotspot/gtest/runtime/test_os_windows.cpp | 6 +- 22 files changed, 28 insertions(+), 201 deletions(-) diff --git a/src/hotspot/cpu/zero/vm_version_zero.cpp b/src/hotspot/cpu/zero/vm_version_zero.cpp index 35cbd296a26..e1c7567a306 100644 --- a/src/hotspot/cpu/zero/vm_version_zero.cpp +++ b/src/hotspot/cpu/zero/vm_version_zero.cpp @@ -116,9 +116,8 @@ void VM_Version::initialize() { } // Enable error context decoding on known platforms -#if defined(IA32) || defined(AMD64) || defined(ARM) || \ - defined(AARCH64) || defined(PPC) || defined(RISCV) || \ - defined(S390) +#if defined(AMD64) || defined(ARM) || defined(AARCH64) || \ + defined(PPC) || defined(RISCV) || defined(S390) if (FLAG_IS_DEFAULT(DecodeErrorContext)) { FLAG_SET_DEFAULT(DecodeErrorContext, true); } diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp index 8c5bbd58a84..ce68987610b 100644 --- a/src/hotspot/os/bsd/os_bsd.cpp +++ b/src/hotspot/os/bsd/os_bsd.cpp @@ -231,8 +231,6 @@ size_t os::rss() { // Cpu architecture string #if defined(ZERO) static char cpu_arch[] = ZERO_LIBARCH; -#elif defined(IA32) -static char cpu_arch[] = "i386"; #elif defined(AMD64) static char cpu_arch[] = "amd64"; #elif defined(ARM) @@ -1011,7 +1009,6 @@ bool os::dll_address_to_library_name(address addr, char* buf, // same architecture as Hotspot is running on void *os::Bsd::dlopen_helper(const char *filename, int mode, char *ebuf, int ebuflen) { -#ifndef IA32 bool ieee_handling = IEEE_subnormal_handling_OK(); if (!ieee_handling) { Events::log_dll_message(nullptr, "IEEE subnormal handling check failed before loading %s", filename); @@ -1034,14 +1031,9 @@ void *os::Bsd::dlopen_helper(const char *filename, int mode, char *ebuf, int ebu // numerical "accuracy", but we need to protect Java semantics first // and foremost. See JDK-8295159. - // This workaround is ineffective on IA32 systems because the MXCSR - // register (which controls flush-to-zero mode) is not stored in the - // legacy fenv. - fenv_t default_fenv; int rtn = fegetenv(&default_fenv); assert(rtn == 0, "fegetenv must succeed"); -#endif // IA32 void* result; JFR_ONLY(NativeLibraryLoadEvent load_event(filename, &result);) @@ -1061,7 +1053,6 @@ void *os::Bsd::dlopen_helper(const char *filename, int mode, char *ebuf, int ebu } else { Events::log_dll_message(nullptr, "Loaded shared library %s", filename); log_info(os)("shared library load of %s was successful", filename); -#ifndef IA32 if (! IEEE_subnormal_handling_OK()) { // We just dlopen()ed a library that mangled the floating-point // flags. Silently fix things now. @@ -1086,7 +1077,6 @@ void *os::Bsd::dlopen_helper(const char *filename, int mode, char *ebuf, int ebu assert(false, "fesetenv didn't work"); } } -#endif // IA32 } return result; @@ -1195,9 +1185,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { {EM_68K, EM_68K, ELFCLASS32, ELFDATA2MSB, (char*)"M68k"} }; - #if (defined IA32) - static Elf32_Half running_arch_code=EM_386; - #elif (defined AMD64) + #if (defined AMD64) static Elf32_Half running_arch_code=EM_X86_64; #elif (defined __powerpc64__) static Elf32_Half running_arch_code=EM_PPC64; @@ -1219,7 +1207,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { static Elf32_Half running_arch_code=EM_68K; #else #error Method os::dll_load requires that one of following is defined:\ - IA32, AMD64, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K + AMD64, __powerpc__, ARM, S390, ALPHA, MIPS, MIPSEL, PARISC, M68K #endif // Identify compatibility class for VM's architecture and library's architecture diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 772b170d11c..16b87210a29 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -1795,9 +1795,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { {EM_LOONGARCH, EM_LOONGARCH, ELFCLASS64, ELFDATA2LSB, (char*)"LoongArch"}, }; -#if (defined IA32) - static Elf32_Half running_arch_code=EM_386; -#elif (defined AMD64) || (defined X32) +#if (defined AMD64) static Elf32_Half running_arch_code=EM_X86_64; #elif (defined __sparc) && (defined _LP64) static Elf32_Half running_arch_code=EM_SPARCV9; @@ -1831,7 +1829,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { static Elf32_Half running_arch_code=EM_LOONGARCH; #else #error Method os::dll_load requires that one of following is defined:\ - AARCH64, ALPHA, ARM, AMD64, IA32, LOONGARCH64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, RISCV, S390, SH, __sparc + AARCH64, ALPHA, ARM, AMD64, LOONGARCH64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, RISCV, S390, SH, __sparc #endif // Identify compatibility class for VM's architecture and library's architecture @@ -1893,7 +1891,6 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { } void * os::Linux::dlopen_helper(const char *filename, char *ebuf, int ebuflen) { -#ifndef IA32 bool ieee_handling = IEEE_subnormal_handling_OK(); if (!ieee_handling) { Events::log_dll_message(nullptr, "IEEE subnormal handling check failed before loading %s", filename); @@ -1916,14 +1913,9 @@ void * os::Linux::dlopen_helper(const char *filename, char *ebuf, int ebuflen) { // numerical "accuracy", but we need to protect Java semantics first // and foremost. See JDK-8295159. - // This workaround is ineffective on IA32 systems because the MXCSR - // register (which controls flush-to-zero mode) is not stored in the - // legacy fenv. - fenv_t default_fenv; int rtn = fegetenv(&default_fenv); assert(rtn == 0, "fegetenv must succeed"); -#endif // IA32 void* result; JFR_ONLY(NativeLibraryLoadEvent load_event(filename, &result);) @@ -1943,7 +1935,6 @@ void * os::Linux::dlopen_helper(const char *filename, char *ebuf, int ebuflen) { } else { Events::log_dll_message(nullptr, "Loaded shared library %s", filename); log_info(os)("shared library load of %s was successful", filename); -#ifndef IA32 // Quickly test to make sure subnormals are correctly handled. if (! IEEE_subnormal_handling_OK()) { // We just dlopen()ed a library that mangled the floating-point flags. @@ -1969,7 +1960,6 @@ void * os::Linux::dlopen_helper(const char *filename, char *ebuf, int ebuflen) { assert(false, "fesetenv didn't work"); } } -#endif // IA32 } return result; } @@ -2613,7 +2603,7 @@ void os::print_memory_info(outputStream* st) { // before "flags" so if we find a second "model name", then the // "flags" field is considered missing. static bool print_model_name_and_flags(outputStream* st, char* buf, size_t buflen) { -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) // Other platforms have less repetitive cpuinfo files FILE *fp = os::fopen("/proc/cpuinfo", "r"); if (fp) { @@ -2672,7 +2662,7 @@ static void print_sys_devices_cpu_info(outputStream* st) { } // we miss the cpufreq entries on Power and s390x -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) _print_ascii_file_h("BIOS frequency limitation", "/sys/devices/system/cpu/cpu0/cpufreq/bios_limit", st); _print_ascii_file_h("Frequency switch latency (ns)", "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency", st); _print_ascii_file_h("Available cpu frequencies", "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", st); @@ -2725,7 +2715,7 @@ void os::jfr_report_memory_info() { #endif // INCLUDE_JFR -#if defined(AMD64) || defined(IA32) || defined(X32) +#if defined(AMD64) const char* search_string = "model name"; #elif defined(M68K) const char* search_string = "CPU"; @@ -2778,8 +2768,6 @@ void os::get_summary_cpu_info(char* cpuinfo, size_t length) { strncpy(cpuinfo, "x86_64", length); #elif defined(ARM) // Order wrt. AARCH64 is relevant! strncpy(cpuinfo, "ARM", length); -#elif defined(IA32) - strncpy(cpuinfo, "x86_32", length); #elif defined(PPC) strncpy(cpuinfo, "PPC64", length); #elif defined(RISCV) @@ -3079,14 +3067,9 @@ int os::Linux::sched_getcpu_syscall(void) { unsigned int cpu = 0; long retval = -1; -#if defined(IA32) - #ifndef SYS_getcpu - #define SYS_getcpu 318 - #endif - retval = syscall(SYS_getcpu, &cpu, nullptr, nullptr); -#elif defined(AMD64) -// Unfortunately we have to bring all these macros here from vsyscall.h -// to be able to compile on old linuxes. +#if defined(AMD64) + // Unfortunately we have to bring all these macros here from vsyscall.h + // to be able to compile on old linuxes. #define __NR_vgetcpu 2 #define VSYSCALL_START (-10UL << 20) #define VSYSCALL_SIZE 1024 @@ -4459,87 +4442,6 @@ void os::Linux::disable_numa(const char* reason, bool warning) { FLAG_SET_ERGO(UseNUMAInterleaving, false); } -#if defined(IA32) && !defined(ZERO) -/* - * Work-around (execute code at a high address) for broken NX emulation using CS limit, - * Red Hat patch "Exec-Shield" (IA32 only). - * - * Map and execute at a high VA to prevent CS lazy updates race with SMP MM - * invalidation.Further code generation by the JVM will no longer cause CS limit - * updates. - * - * Affects IA32: RHEL 5 & 6, Ubuntu 10.04 (LTS), 10.10, 11.04, 11.10, 12.04. - * @see JDK-8023956 - */ -static void workaround_expand_exec_shield_cs_limit() { - assert(os::Linux::initial_thread_stack_bottom() != nullptr, "sanity"); - size_t page_size = os::vm_page_size(); - - /* - * JDK-8197429 - * - * Expand the stack mapping to the end of the initial stack before - * attempting to install the codebuf. This is needed because newer - * Linux kernels impose a distance of a megabyte between stack - * memory and other memory regions. If we try to install the - * codebuf before expanding the stack the installation will appear - * to succeed but we'll get a segfault later if we expand the stack - * in Java code. - * - */ - if (os::is_primordial_thread()) { - address limit = os::Linux::initial_thread_stack_bottom(); - if (! DisablePrimordialThreadGuardPages) { - limit += StackOverflow::stack_red_zone_size() + - StackOverflow::stack_yellow_zone_size(); - } - os::Linux::expand_stack_to(limit); - } - - /* - * Take the highest VA the OS will give us and exec - * - * Although using -(pagesz) as mmap hint works on newer kernel as you would - * think, older variants affected by this work-around don't (search forward only). - * - * On the affected distributions, we understand the memory layout to be: - * - * TASK_LIMIT= 3G, main stack base close to TASK_LIMT. - * - * A few pages south main stack will do it. - * - * If we are embedded in an app other than launcher (initial != main stack), - * we don't have much control or understanding of the address space, just let it slide. - */ - char* hint = (char*)(os::Linux::initial_thread_stack_bottom() - - (StackOverflow::stack_guard_zone_size() + page_size)); - char* codebuf = os::attempt_reserve_memory_at(hint, page_size, mtThread); - - if (codebuf == nullptr) { - // JDK-8197429: There may be a stack gap of one megabyte between - // the limit of the stack and the nearest memory region: this is a - // Linux kernel workaround for CVE-2017-1000364. If we failed to - // map our codebuf, try again at an address one megabyte lower. - hint -= 1 * M; - codebuf = os::attempt_reserve_memory_at(hint, page_size, mtThread); - } - - if ((codebuf == nullptr) || (!os::commit_memory(codebuf, page_size, true))) { - return; // No matter, we tried, best effort. - } - - log_info(os)("[CS limit NX emulation work-around, exec code at: %p]", codebuf); - - // Some code to exec: the 'ret' instruction - codebuf[0] = 0xC3; - - // Call the code in the codebuf - __asm__ volatile("call *%0" : : "r"(codebuf)); - - // keep the page mapped so CS limit isn't reduced. -} -#endif // defined(IA32) && !defined(ZERO) - // this is called _after_ the global arguments have been parsed jint os::init_2(void) { @@ -4560,17 +4462,10 @@ jint os::init_2(void) { return JNI_ERR; } -#if defined(IA32) && !defined(ZERO) - // Need to ensure we've determined the process's initial stack to - // perform the workaround - Linux::capture_initial_stack(JavaThread::stack_size_at_create()); - workaround_expand_exec_shield_cs_limit(); -#else suppress_primordial_thread_resolution = Arguments::created_by_java_launcher(); if (!suppress_primordial_thread_resolution) { Linux::capture_initial_stack(JavaThread::stack_size_at_create()); } -#endif Linux::libpthread_init(); Linux::sched_getcpu_init(); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 7934c9d6ffb..5183a86846f 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -3150,7 +3150,6 @@ void os::large_page_init() { _large_page_size = os::win32::large_page_init_decide_size(); const size_t default_page_size = os::vm_page_size(); if (_large_page_size > default_page_size) { -#if !defined(IA32) if (EnableAllLargePageSizesForWindows) { size_t min_size = GetLargePageMinimum(); @@ -3159,7 +3158,6 @@ void os::large_page_init() { _page_sizes.add(page_size); } } -#endif _page_sizes.add(_large_page_size); } diff --git a/src/hotspot/os_cpu/linux_zero/os_linux_zero.cpp b/src/hotspot/os_cpu/linux_zero/os_linux_zero.cpp index 0ea379fec50..ee9c5e2dfb2 100644 --- a/src/hotspot/os_cpu/linux_zero/os_linux_zero.cpp +++ b/src/hotspot/os_cpu/linux_zero/os_linux_zero.cpp @@ -86,9 +86,7 @@ char* os::non_memory_address_word() { address os::Posix::ucontext_get_pc(const ucontext_t* uc) { if (DecodeErrorContext) { -#if defined(IA32) - return (address)uc->uc_mcontext.gregs[REG_EIP]; -#elif defined(AMD64) +#if defined(AMD64) return (address)uc->uc_mcontext.gregs[REG_RIP]; #elif defined(ARM) return (address)uc->uc_mcontext.arm_pc; @@ -117,9 +115,7 @@ void os::Posix::ucontext_set_pc(ucontext_t* uc, address pc) { intptr_t* os::Linux::ucontext_get_sp(const ucontext_t* uc) { if (DecodeErrorContext) { -#if defined(IA32) - return (intptr_t*)uc->uc_mcontext.gregs[REG_UESP]; -#elif defined(AMD64) +#if defined(AMD64) return (intptr_t*)uc->uc_mcontext.gregs[REG_RSP]; #elif defined(ARM) return (intptr_t*)uc->uc_mcontext.arm_sp; @@ -144,9 +140,7 @@ intptr_t* os::Linux::ucontext_get_sp(const ucontext_t* uc) { intptr_t* os::Linux::ucontext_get_fp(const ucontext_t* uc) { if (DecodeErrorContext) { -#if defined(IA32) - return (intptr_t*)uc->uc_mcontext.gregs[REG_EBP]; -#elif defined(AMD64) +#if defined(AMD64) return (intptr_t*)uc->uc_mcontext.gregs[REG_RBP]; #elif defined(ARM) return (intptr_t*)uc->uc_mcontext.arm_fp; diff --git a/src/hotspot/share/adlc/output_c.cpp b/src/hotspot/share/adlc/output_c.cpp index 110db7f0e98..9cbd6aaf66f 100644 --- a/src/hotspot/share/adlc/output_c.cpp +++ b/src/hotspot/share/adlc/output_c.cpp @@ -2323,7 +2323,7 @@ private: if (strcmp(rep_var,"$Register") == 0) return "as_Register"; if (strcmp(rep_var,"$KRegister") == 0) return "as_KRegister"; if (strcmp(rep_var,"$FloatRegister") == 0) return "as_FloatRegister"; -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) if (strcmp(rep_var,"$XMMRegister") == 0) return "as_XMMRegister"; #endif if (strcmp(rep_var,"$CondRegister") == 0) return "as_ConditionRegister"; diff --git a/src/hotspot/share/c1/c1_CodeStubs.hpp b/src/hotspot/share/c1/c1_CodeStubs.hpp index a02368487c5..9a462006bcc 100644 --- a/src/hotspot/share/c1/c1_CodeStubs.hpp +++ b/src/hotspot/share/c1/c1_CodeStubs.hpp @@ -138,7 +138,7 @@ class ConversionStub: public CodeStub { public: ConversionStub(Bytecodes::Code bytecode, LIR_Opr input, LIR_Opr result) : _bytecode(bytecode), _input(input), _result(result) { - NOT_IA32( ShouldNotReachHere(); ) // used only on x86-32 + ShouldNotReachHere(); } Bytecodes::Code bytecode() { return _bytecode; } diff --git a/src/hotspot/share/c1/c1_LIRAssembler.cpp b/src/hotspot/share/c1/c1_LIRAssembler.cpp index e6963c00c6a..e22b5103514 100644 --- a/src/hotspot/share/c1/c1_LIRAssembler.cpp +++ b/src/hotspot/share/c1/c1_LIRAssembler.cpp @@ -527,16 +527,6 @@ void LIR_Assembler::emit_op1(LIR_Op1* op) { safepoint_poll(op->in_opr(), op->info()); break; -#ifdef IA32 - case lir_fxch: - fxch(op->in_opr()->as_jint()); - break; - - case lir_fld: - fld(op->in_opr()->as_jint()); - break; -#endif // IA32 - case lir_branch: break; @@ -612,12 +602,6 @@ void LIR_Assembler::emit_op0(LIR_Op0* op) { osr_entry(); break; -#ifdef IA32 - case lir_fpop_raw: - fpop(); - break; -#endif // IA32 - case lir_breakpoint: breakpoint(); break; diff --git a/src/hotspot/share/gc/shenandoah/mode/shenandoahGenerationalMode.cpp b/src/hotspot/share/gc/shenandoah/mode/shenandoahGenerationalMode.cpp index fa784d5bb90..79c4ecabcf4 100644 --- a/src/hotspot/share/gc/shenandoah/mode/shenandoahGenerationalMode.cpp +++ b/src/hotspot/share/gc/shenandoah/mode/shenandoahGenerationalMode.cpp @@ -31,7 +31,7 @@ void ShenandoahGenerationalMode::initialize_flags() const { -#if !(defined AARCH64 || defined AMD64 || defined IA32 || defined PPC64 || defined RISCV64) +#if !(defined AARCH64 || defined AMD64 || defined PPC64 || defined RISCV64) vm_exit_during_initialization("Shenandoah Generational GC is not supported on this platform."); #endif diff --git a/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp index 1ff001c5abd..a7cf8e638dd 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahArguments.cpp @@ -39,7 +39,7 @@ #include "utilities/defaultStream.hpp" void ShenandoahArguments::initialize() { -#if !(defined AARCH64 || defined AMD64 || defined IA32 || defined PPC64 || defined RISCV64) +#if !(defined AARCH64 || defined AMD64 || defined PPC64 || defined RISCV64) vm_exit_during_initialization("Shenandoah GC is not supported on this platform."); #endif diff --git a/src/hotspot/share/interpreter/abstractInterpreter.hpp b/src/hotspot/share/interpreter/abstractInterpreter.hpp index 6f7523fd00a..23618cb037e 100644 --- a/src/hotspot/share/interpreter/abstractInterpreter.hpp +++ b/src/hotspot/share/interpreter/abstractInterpreter.hpp @@ -255,7 +255,7 @@ class AbstractInterpreter: AllStatic { return stackElementWords * i; } -#if !defined(ZERO) && (defined(IA32) || defined(AMD64)) +#if !defined(ZERO) && defined(AMD64) static Address::ScaleFactor stackElementScale() { return NOT_LP64(Address::times_4) LP64_ONLY(Address::times_8); } diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index 70c4dd302d5..6e067c77287 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -1460,7 +1460,7 @@ JRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* current, Met // preparing the same method will be sure to see non-null entry & mirror. JRT_END -#if defined(IA32) || defined(AMD64) || defined(ARM) +#if defined(AMD64) || defined(ARM) JRT_LEAF(void, InterpreterRuntime::popframe_move_outgoing_args(JavaThread* current, void* src_address, void* dest_address)) assert(current == JavaThread::current(), "pre-condition"); if (src_address == dest_address) { diff --git a/src/hotspot/share/interpreter/interpreterRuntime.hpp b/src/hotspot/share/interpreter/interpreterRuntime.hpp index 3cc7a938a6a..cdee0c9daa7 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.hpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.hpp @@ -146,8 +146,8 @@ private: Method* method, intptr_t* from, intptr_t* to); -#if defined(IA32) || defined(AMD64) || defined(ARM) - // Popframe support (only needed on x86, AMD64 and ARM) +#if defined(AMD64) || defined(ARM) + // Popframe support (only needed on AMD64 and ARM) static void popframe_move_outgoing_args(JavaThread* current, void* src_address, void* dest_address); #endif diff --git a/src/hotspot/share/jfr/utilities/jfrBigEndian.hpp b/src/hotspot/share/jfr/utilities/jfrBigEndian.hpp index 7661b35863c..cf849a7654c 100644 --- a/src/hotspot/share/jfr/utilities/jfrBigEndian.hpp +++ b/src/hotspot/share/jfr/utilities/jfrBigEndian.hpp @@ -101,7 +101,7 @@ inline R JfrBigEndian::read_unaligned(const address location) { } inline bool JfrBigEndian::platform_supports_unaligned_reads(void) { -#if defined(IA32) || defined(AMD64) || defined(PPC) || defined(S390) +#if defined(AMD64) || defined(PPC) || defined(S390) return true; #elif defined(ARM) || defined(AARCH64) || defined(RISCV) return false; diff --git a/src/hotspot/share/opto/chaitin.cpp b/src/hotspot/share/opto/chaitin.cpp index 903203bd094..8c8c2b0ed4e 100644 --- a/src/hotspot/share/opto/chaitin.cpp +++ b/src/hotspot/share/opto/chaitin.cpp @@ -975,7 +975,6 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { // ------------------- reg_pressure -------------------- // Each entry is reg_pressure_per_value,number_of_regs // RegL RegI RegFlags RegF RegD INTPRESSURE FLOATPRESSURE - // IA32 2 1 1 1 1 6 6 // SPARC 2 2 2 2 2 48 (24) 52 (26) // SPARCV9 2 2 2 2 2 48 (24) 52 (26) // AMD64 1 1 1 1 1 14 15 @@ -991,12 +990,6 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) { // Define platform specific register pressure #if defined(ARM32) lrg.set_reg_pressure(2); -#elif defined(IA32) - if( ireg == Op_RegL ) { - lrg.set_reg_pressure(2); - } else { - lrg.set_reg_pressure(1); - } #else lrg.set_reg_pressure(1); // normally one value per register #endif diff --git a/src/hotspot/share/opto/divnode.cpp b/src/hotspot/share/opto/divnode.cpp index 06ba1856941..cf5bc8ce643 100644 --- a/src/hotspot/share/opto/divnode.cpp +++ b/src/hotspot/share/opto/divnode.cpp @@ -938,15 +938,11 @@ const Type* DivDNode::Value(PhaseGVN* phase) const { if( t2 == TypeD::ONE ) return t1; - // IA32 would only execute this for non-strict FP, which is never the - // case now. -#if ! defined(IA32) // If divisor is a constant and not zero, divide them numbers if( t1->base() == Type::DoubleCon && t2->base() == Type::DoubleCon && t2->getd() != 0.0 ) // could be negative zero return TypeD::make( t1->getd()/t2->getd() ); -#endif // If the dividend is a constant zero // Note: if t1 and t2 are zero then result is NaN (JVMS page 213) diff --git a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp index 30ac9181bec..093f466678c 100644 --- a/src/hotspot/share/opto/machnode.hpp +++ b/src/hotspot/share/opto/machnode.hpp @@ -99,7 +99,7 @@ public: return ::as_FloatRegister(reg(ra_, node, idx)); } -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) KRegister as_KRegister(PhaseRegAlloc *ra_, const Node *node) const { return ::as_KRegister(reg(ra_, node)); } diff --git a/src/hotspot/share/opto/mulnode.cpp b/src/hotspot/share/opto/mulnode.cpp index 1e757c2be81..6940538e155 100644 --- a/src/hotspot/share/opto/mulnode.cpp +++ b/src/hotspot/share/opto/mulnode.cpp @@ -202,14 +202,6 @@ const Type* MulNode::Value(PhaseGVN* phase) const { if( t1 == Type::BOTTOM || t2 == Type::BOTTOM ) return bottom_type(); -#if defined(IA32) - // Can't trust native compilers to properly fold strict double - // multiplication with round-to-zero on this platform. - if (op == Op_MulD) { - return TypeD::DOUBLE; - } -#endif - return mul_ring(t1,t2); // Local flavor of type multiplication } diff --git a/src/hotspot/share/runtime/abstract_vm_version.cpp b/src/hotspot/share/runtime/abstract_vm_version.cpp index 7d460d83e1b..3860307f8df 100644 --- a/src/hotspot/share/runtime/abstract_vm_version.cpp +++ b/src/hotspot/share/runtime/abstract_vm_version.cpp @@ -204,7 +204,6 @@ const char* Abstract_VM_Version::vm_release() { #else #define CPU AARCH64_ONLY("aarch64") \ AMD64_ONLY("amd64") \ - IA32_ONLY("x86") \ S390_ONLY("s390") \ RISCV64_ONLY("riscv64") #endif // !ZERO diff --git a/src/hotspot/share/utilities/debug.cpp b/src/hotspot/share/utilities/debug.cpp index 6d8a82b6798..89c0a1ebc08 100644 --- a/src/hotspot/share/utilities/debug.cpp +++ b/src/hotspot/share/utilities/debug.cpp @@ -664,7 +664,6 @@ void help() { tty->print_cr(" pns(void* sp, void* fp, void* pc) - print native (i.e. mixed) stack trace, e.g."); #ifdef LINUX AMD64_ONLY( tty->print_cr(" pns($sp, $rbp, $pc) on Linux/amd64")); - IA32_ONLY( tty->print_cr(" pns($sp, $ebp, $pc) on Linux/x86")); AARCH64_ONLY(tty->print_cr(" pns($sp, $fp, $pc) on Linux/AArch64")); RISCV_ONLY( tty->print_cr(" pns($sp, $fp, $pc) on Linux/RISC-V")); PPC64_ONLY( tty->print_cr(" pns($sp, 0, $pc) on Linux/ppc64")); diff --git a/src/hotspot/share/utilities/macros.hpp b/src/hotspot/share/utilities/macros.hpp index a5caf316aa3..1d2e651d674 100644 --- a/src/hotspot/share/utilities/macros.hpp +++ b/src/hotspot/share/utilities/macros.hpp @@ -452,7 +452,7 @@ #define NOT_ZERO_RETURN #endif -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) #define X86 #define X86_ONLY(code) code #define NOT_X86(code) @@ -462,14 +462,6 @@ #define NOT_X86(code) code #endif -#ifdef IA32 -#define IA32_ONLY(code) code -#define NOT_IA32(code) -#else -#define IA32_ONLY(code) -#define NOT_IA32(code) code -#endif - #ifdef AMD64 #define AMD64_ONLY(code) code #define NOT_AMD64(code) diff --git a/test/hotspot/gtest/runtime/test_os_windows.cpp b/test/hotspot/gtest/runtime/test_os_windows.cpp index ad270848077..2d9a7e00b39 100644 --- a/test/hotspot/gtest/runtime/test_os_windows.cpp +++ b/test/hotspot/gtest/runtime/test_os_windows.cpp @@ -756,7 +756,6 @@ TEST_VM(os_windows, large_page_init_multiple_sizes) { size_t decided_large_page_size = os::win32::large_page_init_decide_size(); EXPECT_GT(decided_large_page_size, default_page_size) << "Large page size should be greater than the default page size for LargePageSizeInBytes = 4 * min_size"; -#if !defined(IA32) size_t page_size_count = 0; size_t page_size = os::page_sizes().largest(); @@ -773,7 +772,6 @@ TEST_VM(os_windows, large_page_init_multiple_sizes) { EXPECT_TRUE(page_size % min_size == 0) << "Each page size should be a multiple of the minimum large page size."; EXPECT_LE(page_size, large_page_size) << "Page size should not exceed the determined large page size."; } -#endif } TEST_VM(os_windows, large_page_init_decide_size) { @@ -809,11 +807,11 @@ TEST_VM(os_windows, large_page_init_decide_size) { EXPECT_EQ(decided_size, 2 * M) << "Expected decided size to be 2M when large page is 1M and OS reported size is 2M"; } -#if defined(IA32) || defined(AMD64) +#if defined(AMD64) FLAG_SET_CMDLINE(LargePageSizeInBytes, 5 * M); // Set large page size to 5MB if (!EnableAllLargePageSizesForWindows) { decided_size = os::win32::large_page_init_decide_size(); // Recalculate decided size - EXPECT_EQ(decided_size, 0) << "Expected decided size to be 0 for large pages bigger than 4mb on IA32 or AMD64"; + EXPECT_EQ(decided_size, 0) << "Expected decided size to be 0 for large pages bigger than 4mb on AMD64"; } #endif From 20e55fafb39dd74a044d7fda8a2b3409cc00bf54 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Tue, 28 Oct 2025 17:58:42 +0000 Subject: [PATCH 328/561] 8370687: Improve before constructor has been called error message Reviewed-by: vromero --- .../classes/com/sun/tools/javac/resources/compiler.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 1d18635f14b..d6358f6075d 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -397,11 +397,11 @@ compiler.err.cant.inherit.from.final=\ # 0: symbol or name compiler.err.cant.ref.before.ctor.called=\ - cannot reference {0} before supertype constructor has been called + reference to {0} may only appear after an explicit constructor invocation # 0: symbol or name compiler.err.cant.assign.initialized.before.ctor.called=\ - cannot assign initialized field ''{0}'' before supertype constructor has been called + assignment to initialized field ''{0}'' may only appear after an explicit constructor invocation compiler.err.cant.select.static.class.from.param.type=\ cannot select a static class from a parameterized type From 012b4eb6cea6e1756a589a6c17a805867ed60686 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Tue, 28 Oct 2025 19:56:56 +0000 Subject: [PATCH 329/561] 8370082: Intermediate objects clean up in ECDH, EdDSA, XDH, DHKEM, and HKDF Reviewed-by: ascarpino, abarashev, fandreuzzi --- .../com/sun/crypto/provider/DHKEM.java | 16 +++++++++-- .../crypto/provider/HKDFKeyDerivation.java | 15 ++++++++--- .../com/sun/crypto/provider/HmacCore.java | 3 ++- .../share/classes/javax/crypto/Mac.java | 1 + .../sun/security/ec/ECDHKeyAgreement.java | 8 +++++- .../sun/security/ec/XDHKeyAgreement.java | 19 +++++++++---- .../sun/security/ec/XDHPrivateKeyImpl.java | 6 ++++- .../sun/security/ec/ed/EdDSASignature.java | 27 ++++++++++++------- 8 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java index d86d161370f..b27320ed24b 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKEM.java @@ -78,14 +78,21 @@ public class DHKEM implements KEMSpi { byte[] pkEm = params.SerializePublicKey(pkE); byte[] pkRm = params.SerializePublicKey(pkR); byte[] kem_context = concat(pkEm, pkRm); + byte[] key = null; try { byte[] dh = params.DH(skE, pkR); - byte[] key = params.ExtractAndExpand(dh, kem_context); + key = params.ExtractAndExpand(dh, kem_context); return new KEM.Encapsulated( new SecretKeySpec(key, from, to - from, algorithm), pkEm, null); } catch (Exception e) { throw new ProviderException("internal error", e); + } finally { + // `key` has been cloned into the `SecretKeySpec` within the + // returned `KEM.Encapsulated`, so it can now be cleared. + if (key != null) { + Arrays.fill(key, (byte)0); + } } } @@ -98,17 +105,22 @@ public class DHKEM implements KEMSpi { if (encapsulation.length != params.Npk) { throw new DecapsulateException("incorrect encapsulation size"); } + byte[] key = null; try { PublicKey pkE = params.DeserializePublicKey(encapsulation); byte[] dh = params.DH(skR, pkE); byte[] pkRm = params.SerializePublicKey(pkR); byte[] kem_context = concat(encapsulation, pkRm); - byte[] key = params.ExtractAndExpand(dh, kem_context); + key = params.ExtractAndExpand(dh, kem_context); return new SecretKeySpec(key, from, to - from, algorithm); } catch (IOException | InvalidKeyException e) { throw new DecapsulateException("Cannot decapsulate", e); } catch (Exception e) { throw new ProviderException("internal error", e); + } finally { + if (key != null) { + Arrays.fill(key, (byte)0); + } } } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HKDFKeyDerivation.java b/src/java.base/share/classes/com/sun/crypto/provider/HKDFKeyDerivation.java index 9b4cf557598..5b39339778a 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HKDFKeyDerivation.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HKDFKeyDerivation.java @@ -25,6 +25,8 @@ package com.sun.crypto.provider; +import jdk.internal.access.SharedSecrets; + import javax.crypto.KDFSpi; import javax.crypto.Mac; import javax.crypto.SecretKey; @@ -123,8 +125,12 @@ abstract class HKDFKeyDerivation extends KDFSpi { + "empty"); } - return new SecretKeySpec(engineDeriveData(derivationSpec), alg); - + var data = engineDeriveData(derivationSpec); + try { + return new SecretKeySpec(data, alg); + } finally { + Arrays.fill(data, (byte)0); + } } /** @@ -346,7 +352,7 @@ abstract class HKDFKeyDerivation extends KDFSpi { "prk must be at least " + hmacLen + " bytes"); } - SecretKey pseudoRandomKey = new SecretKeySpec(prk, hmacAlgName); + SecretKeySpec pseudoRandomKey = new SecretKeySpec(prk, hmacAlgName); Mac hmacObj = Mac.getInstance(hmacAlgName); @@ -382,6 +388,9 @@ abstract class HKDFKeyDerivation extends KDFSpi { // sized the buffers to their largest possible size up-front, // but just in case... throw new ProviderException(sbe); + } finally { + SharedSecrets.getJavaxCryptoSpecAccess() + .clearSecretKeySpec(pseudoRandomKey); } return kdfOutput; } diff --git a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java index c6707fb9941..e841243c11b 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -233,6 +233,7 @@ abstract class HmacCore extends MacSpi implements Cloneable { md.update(tmp); md.digest(tmp, 0, tmp.length); + md.reset(); return tmp; } catch (DigestException e) { // should never occur diff --git a/src/java.base/share/classes/javax/crypto/Mac.java b/src/java.base/share/classes/javax/crypto/Mac.java index 82874693cf2..4405e39d7a0 100644 --- a/src/java.base/share/classes/javax/crypto/Mac.java +++ b/src/java.base/share/classes/javax/crypto/Mac.java @@ -627,6 +627,7 @@ public class Mac implements Cloneable { } byte[] mac = doFinal(); System.arraycopy(mac, 0, output, outOffset, macLen); + Arrays.fill(mac, (byte)0); } /** diff --git a/src/java.base/share/classes/sun/security/ec/ECDHKeyAgreement.java b/src/java.base/share/classes/sun/security/ec/ECDHKeyAgreement.java index 8f6bdb8d80a..714b06c93ba 100644 --- a/src/java.base/share/classes/sun/security/ec/ECDHKeyAgreement.java +++ b/src/java.base/share/classes/sun/security/ec/ECDHKeyAgreement.java @@ -52,6 +52,7 @@ import java.security.interfaces.ECPublicKey; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.ECParameterSpec; import java.security.spec.EllipticCurve; +import java.util.Arrays; import java.util.Optional; /** @@ -259,7 +260,12 @@ public final class ECDHKeyAgreement extends KeyAgreementSpi { throw new NoSuchAlgorithmException( "Unsupported secret key algorithm: " + algorithm); } - return new SecretKeySpec(engineGenerateSecret(), algorithm); + byte[] bytes = engineGenerateSecret(); + try { + return new SecretKeySpec(bytes, algorithm); + } finally { + Arrays.fill(bytes, (byte)0); + } } private static diff --git a/src/java.base/share/classes/sun/security/ec/XDHKeyAgreement.java b/src/java.base/share/classes/sun/security/ec/XDHKeyAgreement.java index 01dce4c53e9..d7ea1c674e7 100644 --- a/src/java.base/share/classes/sun/security/ec/XDHKeyAgreement.java +++ b/src/java.base/share/classes/sun/security/ec/XDHKeyAgreement.java @@ -41,11 +41,12 @@ import javax.crypto.KeyAgreementSpi; import javax.crypto.SecretKey; import javax.crypto.ShortBufferException; import javax.crypto.spec.SecretKeySpec; +import java.util.Arrays; import java.util.function.Function; public class XDHKeyAgreement extends KeyAgreementSpi { - private byte[] privateKey; + private XECPrivateKey privateKey; private byte[] secret; private XECOperations ops; private XECParameters lockedParams = null; @@ -101,15 +102,16 @@ public class XDHKeyAgreement extends KeyAgreementSpi { throw new InvalidKeyException ("Unsupported key type"); } - XECPrivateKey privateKey = (XECPrivateKey) key; + privateKey = (XECPrivateKey) key; XECParameters xecParams = XECParameters.get( InvalidKeyException::new, privateKey.getParams()); checkLockedParams(InvalidKeyException::new, xecParams); this.ops = new XECOperations(xecParams); - this.privateKey = privateKey.getScalar().orElseThrow( + byte[] tmp = privateKey.getScalar().orElseThrow( () -> new InvalidKeyException("No private key value") ); + Arrays.fill(tmp, (byte)0); secret = null; } @@ -144,9 +146,11 @@ public class XDHKeyAgreement extends KeyAgreementSpi { // The privateKey may be modified to a value that is equivalent for // the purposes of this algorithm. + byte[] scalar = this.privateKey.getScalar().get(); byte[] computedSecret = ops.encodedPointMultiply( - this.privateKey, + scalar, publicKey.getU()); + Arrays.fill(scalar, (byte)0); // test for contributory behavior if (allZero(computedSecret)) { @@ -213,7 +217,12 @@ public class XDHKeyAgreement extends KeyAgreementSpi { throw new NoSuchAlgorithmException( "Unsupported secret key algorithm: " + algorithm); } - return new SecretKeySpec(engineGenerateSecret(), algorithm); + byte[] bytes = engineGenerateSecret(); + try { + return new SecretKeySpec(bytes, algorithm); + } finally { + Arrays.fill(bytes, (byte)0); + } } static class X25519 extends XDHKeyAgreement { diff --git a/src/java.base/share/classes/sun/security/ec/XDHPrivateKeyImpl.java b/src/java.base/share/classes/sun/security/ec/XDHPrivateKeyImpl.java index 416a3e10af4..9b6a5676f4e 100644 --- a/src/java.base/share/classes/sun/security/ec/XDHPrivateKeyImpl.java +++ b/src/java.base/share/classes/sun/security/ec/XDHPrivateKeyImpl.java @@ -27,6 +27,7 @@ package sun.security.ec; import java.io.*; import java.security.interfaces.XECPrivateKey; +import java.util.Arrays; import java.util.Optional; import java.security.*; import java.security.spec.*; @@ -106,12 +107,15 @@ public final class XDHPrivateKeyImpl extends PKCS8Key implements XECPrivateKey { XECParameters params = paramSpec.getName().equalsIgnoreCase("X25519") ? XECParameters.X25519 : XECParameters.X448; + var kClone = k.clone(); try { return new XDHPublicKeyImpl(params, - new XECOperations(params).computePublic(k.clone())); + new XECOperations(params).computePublic(kClone)); } catch (InvalidKeyException e) { throw new ProviderException( "Unexpected error calculating public key", e); + } finally { + Arrays.fill(kClone, (byte)0); } } diff --git a/src/java.base/share/classes/sun/security/ec/ed/EdDSASignature.java b/src/java.base/share/classes/sun/security/ec/ed/EdDSASignature.java index 1757f9eb67d..6af39de34dc 100644 --- a/src/java.base/share/classes/sun/security/ec/ed/EdDSASignature.java +++ b/src/java.base/share/classes/sun/security/ec/ed/EdDSASignature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ import java.security.interfaces.EdECPublicKey; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.EdDSAParameterSpec; import java.security.spec.NamedParameterSpec; +import java.util.Arrays; import java.util.function.Function; public class EdDSASignature extends SignatureSpi { @@ -92,7 +93,7 @@ public class EdDSASignature extends SignatureSpi { } } - private byte[] privateKey; + private EdECPrivateKey privateKey; private AffinePoint publicKeyPoint; private byte[] publicKeyBytes; private EdDSAOperations ops; @@ -141,11 +142,13 @@ public class EdDSASignature extends SignatureSpi { if (!(privateKey instanceof EdECPrivateKey)) { throw new InvalidKeyException("Unsupported key type"); } - EdECPrivateKey edKey = (EdECPrivateKey) privateKey; + this.privateKey = (EdECPrivateKey) privateKey; + + initImpl(this.privateKey.getParams()); + byte[] tmp = this.privateKey.getBytes().orElseThrow( + () -> new InvalidKeyException("No private key value")); + Arrays.fill(tmp, (byte)0); - initImpl(edKey.getParams()); - this.privateKey = edKey.getBytes().orElseThrow( - () -> new InvalidKeyException("No private key value")); this.publicKeyPoint = null; this.publicKeyBytes = null; } @@ -199,10 +202,14 @@ public class EdDSASignature extends SignatureSpi { throw new SignatureException("Missing private key"); } ensureMessageInit(); - byte[] result = ops.sign(this.sigParams, this.privateKey, - message.getMessage()); - message = null; - return result; + byte[] bytes = this.privateKey.getBytes().get(); + try { + return ops.sign(this.sigParams, bytes, + message.getMessage()); + } finally { + Arrays.fill(bytes, (byte)0); + message = null; + } } @Override From d1860370635e1c96a9b6c497861e5573c23dd281 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Tue, 28 Oct 2025 20:59:49 +0000 Subject: [PATCH 330/561] 8370636: com/sun/jdi/TwoThreadsTest.java should wait for completion of all threads Reviewed-by: cjplummer, syan, sspitsyn --- test/jdk/com/sun/jdi/TwoThreadsTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/jdk/com/sun/jdi/TwoThreadsTest.java b/test/jdk/com/sun/jdi/TwoThreadsTest.java index e38783f3ea6..e5732ffd8d1 100644 --- a/test/jdk/com/sun/jdi/TwoThreadsTest.java +++ b/test/jdk/com/sun/jdi/TwoThreadsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -55,6 +55,13 @@ class TwoThreadsTarg implements Runnable { t1.start(); t2.start(); + // The threads might be virtual and daemon, so wait until completion. + try { + t1.join(); + t2.join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } } From 73f93920b950b4ce5fa177db50010e95265d6a7f Mon Sep 17 00:00:00 2001 From: Chad Rakoczy Date: Tue, 28 Oct 2025 21:07:11 +0000 Subject: [PATCH 331/561] 8369147: Various issues with new tests added by JDK-8316694 Reviewed-by: kvn, dlong --- test/hotspot/jtreg/ProblemList.txt | 11 +- .../whitebox/DeoptimizeRelocatedNMethod.java | 59 +------- .../compiler/whitebox/RelocateNMethod.java | 72 +-------- .../RelocateNMethodMultiplePaths.java | 138 +----------------- .../whitebox/StressNMethodRelocation.java | 30 ++-- .../NMethodRelocationTest.java | 1 + 6 files changed, 28 insertions(+), 283 deletions(-) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index b1c03553dfc..3dac8821165 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -79,16 +79,7 @@ compiler/c2/TestVerifyConstraintCasts.java 8355574 generic-all compiler/c2/aarch64/TestStaticCallStub.java 8359963 linux-aarch64,macosx-aarch64 -compiler/whitebox/DeoptimizeRelocatedNMethod.java#G1 8369147 generic-all -compiler/whitebox/DeoptimizeRelocatedNMethod.java#Parallel 8369147 generic-all -compiler/whitebox/DeoptimizeRelocatedNMethod.java#Serial 8369147 generic-all -compiler/whitebox/DeoptimizeRelocatedNMethod.java#ZGC 8369147 generic-all -compiler/whitebox/RelocateNMethod.java#G1 8369147 generic-all -compiler/whitebox/RelocateNMethod.java#Parallel 8369147 generic-all -compiler/whitebox/RelocateNMethod.java#Serial 8369147 generic-all -compiler/whitebox/RelocateNMethod.java#ZGC 8369147 generic-all -compiler/whitebox/StressNMethodRelocation.java 8369147,8369148,8369149 generic-all -serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java 8369150,8369151 generic-all +serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java 8369150 generic-all ############################################################################# diff --git a/test/hotspot/jtreg/compiler/whitebox/DeoptimizeRelocatedNMethod.java b/test/hotspot/jtreg/compiler/whitebox/DeoptimizeRelocatedNMethod.java index 25314051fdd..42f29044e8c 100644 --- a/test/hotspot/jtreg/compiler/whitebox/DeoptimizeRelocatedNMethod.java +++ b/test/hotspot/jtreg/compiler/whitebox/DeoptimizeRelocatedNMethod.java @@ -23,67 +23,14 @@ */ /* - * @test id=Serial + * @test * @bug 8316694 * @library /test/lib / * @modules java.base/jdk.internal.misc java.management * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Serial * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache -XX:+UseSerialGC - * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.DeoptimizeRelocatedNMethod - */ - -/* - * @test id=Parallel - * @bug 8316694 - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Parallel - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache -XX:+UseParallelGC - * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.DeoptimizeRelocatedNMethod - */ - -/* - * @test id=G1 - * @bug 8316694 - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.G1 - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache -XX:+UseG1GC - * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.DeoptimizeRelocatedNMethod - */ - -/* - * @test id=Shenandoah - * @bug 8316694 - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Shenandoah - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache -XX:+UseShenandoahGC - * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.DeoptimizeRelocatedNMethod - */ - -/* - * @test id=ZGC - * @bug 8316694 - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Z - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache -XX:+UseZGC + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.DeoptimizeRelocatedNMethod */ @@ -118,7 +65,7 @@ public class DeoptimizeRelocatedNMethod { NMethod origNmethod = NMethod.get(method, false); // Relocate nmethod and mark old for cleanup - WHITE_BOX.relocateNMethodFromMethod(method, BlobType.MethodProfiled.id); + WHITE_BOX.relocateNMethodFromMethod(method, BlobType.MethodNonProfiled.id); // Trigger GC to clean up old nmethod WHITE_BOX.fullGC(); diff --git a/test/hotspot/jtreg/compiler/whitebox/RelocateNMethod.java b/test/hotspot/jtreg/compiler/whitebox/RelocateNMethod.java index c18a8afa400..7c625496b8a 100644 --- a/test/hotspot/jtreg/compiler/whitebox/RelocateNMethod.java +++ b/test/hotspot/jtreg/compiler/whitebox/RelocateNMethod.java @@ -23,84 +23,18 @@ */ /* - * @test id=Serial + * @test * @bug 8316694 * @summary test that nmethod::relocate() correctly creates a new nmethod * @library /test/lib / * @modules java.base/jdk.internal.misc java.management - * * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Serial - * * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache - * -XX:+UseSerialGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod + * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod */ -/* - * @test id=Parallel - * @bug 8316694 - * @summary test that nmethod::relocate() correctly creates a new nmethod - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Parallel - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache - * -XX:+UseParallelGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod - */ - -/* - * @test id=G1 - * @bug 8316694 - * @summary test that nmethod::relocate() correctly creates a new nmethod - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.G1 - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache - * -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod - */ - -/* - * @test id=Shenandoah - * @bug 8316694 - * @summary test that nmethod::relocate() correctly creates a new nmethod - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Shenandoah - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache - * -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod - */ - -/* - * @test id=ZGC - * @bug 8316694 - * @summary test that nmethod::relocate() correctly creates a new nmethod - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @requires vm.opt.DeoptimizeALot != true - * @requires vm.gc.Z - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+SegmentedCodeCache - * -XX:+UseZGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.RelocateNMethod - */ package compiler.whitebox; @@ -132,7 +66,7 @@ public class RelocateNMethod extends CompilerWhiteBoxTest { checkCompiled(); NMethod origNmethod = NMethod.get(method, false); - WHITE_BOX.relocateNMethodFromMethod(method, BlobType.MethodProfiled.id); + WHITE_BOX.relocateNMethodFromMethod(method, BlobType.MethodNonProfiled.id); WHITE_BOX.fullGC(); diff --git a/test/hotspot/jtreg/compiler/whitebox/RelocateNMethodMultiplePaths.java b/test/hotspot/jtreg/compiler/whitebox/RelocateNMethodMultiplePaths.java index 49be3eff8c2..2a2a342da52 100644 --- a/test/hotspot/jtreg/compiler/whitebox/RelocateNMethodMultiplePaths.java +++ b/test/hotspot/jtreg/compiler/whitebox/RelocateNMethodMultiplePaths.java @@ -23,10 +23,9 @@ */ /* - * @test id=SerialC1 + * @test id=C1 * @bug 8316694 * @requires vm.debug == true - * @requires vm.gc.Serial * @summary test that relocated nmethod is correctly deoptimized * @library /test/lib / * @modules java.base/jdk.internal.misc java.management @@ -34,15 +33,14 @@ * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation -XX:TieredStopAtLevel=1 - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseSerialGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation + * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation * compiler.whitebox.RelocateNMethodMultiplePaths */ /* - * @test id=SerialC2 + * @test id=C2 * @bug 8316694 * @requires vm.debug == true - * @requires vm.gc.Serial * @summary test that relocated nmethod is correctly deoptimized * @library /test/lib / * @modules java.base/jdk.internal.misc java.management @@ -50,135 +48,7 @@ * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseSerialGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ParallelC1 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Parallel - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation -XX:TieredStopAtLevel=1 - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseParallelGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ParallelC2 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Parallel - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseParallelGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=G1C1 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.G1 - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation -XX:TieredStopAtLevel=1 - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=G1C2 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.G1 - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ShenandoahC1 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Shenandoah - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation -XX:TieredStopAtLevel=1 - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ShenandoahC2 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Shenandoah - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ZGCC1 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Z - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation -XX:TieredStopAtLevel=1 - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseZGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation - * compiler.whitebox.RelocateNMethodMultiplePaths - */ - -/* - * @test id=ZGCC2 - * @bug 8316694 - * @requires vm.debug == true - * @requires vm.gc.Z - * @summary test that relocated nmethod is correctly deoptimized - * @library /test/lib / - * @modules java.base/jdk.internal.misc java.management - * - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbatch -XX:+TieredCompilation - * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UseZGC -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation + * -XX:+SegmentedCodeCache -XX:-DeoptimizeRandom -XX:+DeoptimizeALot -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation * compiler.whitebox.RelocateNMethodMultiplePaths */ diff --git a/test/hotspot/jtreg/compiler/whitebox/StressNMethodRelocation.java b/test/hotspot/jtreg/compiler/whitebox/StressNMethodRelocation.java index 3b397f48306..efcc9f03fb9 100644 --- a/test/hotspot/jtreg/compiler/whitebox/StressNMethodRelocation.java +++ b/test/hotspot/jtreg/compiler/whitebox/StressNMethodRelocation.java @@ -28,11 +28,11 @@ * @library /test/lib / * @modules java.base/jdk.internal.misc * java.management + * @requires vm.compiler2.enabled & vm.opt.SegmentedCodeCache != false & vm.opt.TieredCompilation != false * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI - * -XX:+SegmentedCodeCache -XX:+UnlockExperimentalVMOptions - * -XX:+NMethodRelocation compiler.whitebox.StressNMethodRelocation + * -XX:+UnlockExperimentalVMOptions -XX:+NMethodRelocation compiler.whitebox.StressNMethodRelocation */ package compiler.whitebox; @@ -45,27 +45,27 @@ import jdk.test.whitebox.code.NMethod; import jdk.test.lib.compiler.InMemoryJavaCompiler; import java.lang.reflect.Method; -import java.util.Arrays; +import java.util.ArrayList; import java.util.EnumSet; import java.util.Random; public class StressNMethodRelocation { private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); private static final int C2_LEVEL = 4; - private static final int ACTIVE_METHODS = 1024; - private static TestMethod[] methods; + private static ArrayList methods; private static byte[] num1; private static byte[] num2; - private static long DURATION = 60_000; + private static long COMPILE_DURATION = 30_000; + private static long RUN_DURATION = 60_000; public static void main(String[] args) throws Exception { // Initialize defaults initNums(); // Generate compiled code - methods = new TestMethod[ACTIVE_METHODS]; + methods = new ArrayList<>(); generateCode(methods); // Create thread that runs compiled methods @@ -108,13 +108,15 @@ public class StressNMethodRelocation { num2 = genNum(random, digitCount); } - private static void generateCode(TestMethod[] m) throws Exception { + private static void generateCode(ArrayList m) throws Exception { byte[] result = new byte[num1.length + 1]; - for (int i = 0; i < ACTIVE_METHODS; ++i) { - m[i] = new TestMethod(); - m[i].profile(num1, num2, result); - m[i].compileWithC2(); + long startTime = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTime < COMPILE_DURATION) { + TestMethod testMethod = new TestMethod(); + testMethod.profile(num1, num2, result); + testMethod.compileWithC2(); + m.add(testMethod); } } @@ -194,7 +196,7 @@ public class StressNMethodRelocation { // Move nmethod back and forth between NonProfiled and Profiled code heaps public void run() { long startTime = System.currentTimeMillis(); - while (System.currentTimeMillis() - startTime < DURATION) { + while (System.currentTimeMillis() - startTime < RUN_DURATION) { // Relocate NonProfiled to Profiled CodeBlob[] nonProfiledBlobs = CodeBlob.getCodeBlobs(BlobType.MethodNonProfiled); for (CodeBlob blob : nonProfiledBlobs) { @@ -220,7 +222,7 @@ public class StressNMethodRelocation { public void run() { try { long startTime = System.currentTimeMillis(); - while (System.currentTimeMillis() - startTime < DURATION) { + while (System.currentTimeMillis() - startTime < RUN_DURATION) { callMethods(); } } catch (Exception e) { diff --git a/test/hotspot/jtreg/serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java b/test/hotspot/jtreg/serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java index b12e2c3455c..6c465b357d7 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java +++ b/test/hotspot/jtreg/serviceability/jvmti/NMethodRelocation/NMethodRelocationTest.java @@ -27,6 +27,7 @@ * @bug 8316694 * @summary Verify that nmethod relocation posts the correct JVMTI events * @requires vm.jvmti + * @requires vm.gc == "null" | vm.gc == "Serial" * @library /test/lib /test/hotspot/jtreg * @build jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox From 723d6f83a2f98849e5bd72d2e9be613d04eed576 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Tue, 28 Oct 2025 23:50:04 +0000 Subject: [PATCH 332/561] 8355631: The events might be generated after VM_DEATH event Reviewed-by: sspitsyn, dholmes --- .../share/prims/jvmtiEventController.cpp | 30 ++++- .../share/prims/jvmtiEventController.hpp | 9 ++ .../prims/jvmtiEventController.inline.hpp | 18 +++ src/hotspot/share/prims/jvmtiExport.cpp | 106 +++++++++++------- 4 files changed, 121 insertions(+), 42 deletions(-) diff --git a/src/hotspot/share/prims/jvmtiEventController.cpp b/src/hotspot/share/prims/jvmtiEventController.cpp index 873470db17d..2b44c069dc5 100644 --- a/src/hotspot/share/prims/jvmtiEventController.cpp +++ b/src/hotspot/share/prims/jvmtiEventController.cpp @@ -495,6 +495,10 @@ JvmtiEventControllerPrivate::recompute_env_enabled(JvmtiEnvBase* env) { break; } + if (JvmtiEventController::is_execution_finished()) { + now_enabled &= VM_DEATH_BIT; + } + // Set/reset the event enabled under the tagmap lock. set_enabled_events_with_lock(env, now_enabled); @@ -537,6 +541,10 @@ JvmtiEventControllerPrivate::recompute_env_thread_enabled(JvmtiEnvThreadState* e break; } + if (JvmtiEventController::is_execution_finished()) { + now_enabled &= VM_DEATH_BIT; + } + // if anything changed do update if (now_enabled != was_enabled) { @@ -1047,7 +1055,7 @@ JvmtiEventControllerPrivate::vm_init() { void JvmtiEventControllerPrivate::vm_death() { - // events are disabled (phase has changed) + // events are disabled, see JvmtiEventController::_execution_finished JvmtiEventControllerPrivate::recompute_enabled(); } @@ -1059,6 +1067,9 @@ JvmtiEventControllerPrivate::vm_death() { JvmtiEventEnabled JvmtiEventController::_universal_global_event_enabled; +volatile bool JvmtiEventController::_execution_finished = false; +volatile int JvmtiEventController::_in_callback_count = 0; + bool JvmtiEventController::is_global_event(jvmtiEvent event_type) { assert(is_valid_event_type(event_type), "invalid event type"); @@ -1207,8 +1218,23 @@ JvmtiEventController::vm_init() { void JvmtiEventController::vm_death() { + // No new event callbacks except vm_death can be called after this point. + AtomicAccess::store(&_execution_finished, true); if (JvmtiEnvBase::environments_might_exist()) { MutexLocker mu(JvmtiThreadState_lock); JvmtiEventControllerPrivate::vm_death(); } -} + + // Some events might be still in callback for daemons and VM internal threads. + const double start = os::elapsedTime(); + const double max_wait_time = 60; + // The first time we see the callback count reach zero we know all actual + // callbacks are complete. The count could rise again, but those "callbacks" + // will immediately see `execution_finished()` and return (dropping the count). + while (in_callback_count() > 0) { + os::naked_short_sleep(100); + if (os::elapsedTime() - start > max_wait_time) { + break; + } + } +} \ No newline at end of file diff --git a/src/hotspot/share/prims/jvmtiEventController.hpp b/src/hotspot/share/prims/jvmtiEventController.hpp index 3949f3a7b7d..bd8bf887924 100644 --- a/src/hotspot/share/prims/jvmtiEventController.hpp +++ b/src/hotspot/share/prims/jvmtiEventController.hpp @@ -197,6 +197,11 @@ private: // for all environments, global array indexed by jvmtiEvent static JvmtiEventEnabled _universal_global_event_enabled; + // These fields are used to synchronize stop posting events and + // wait until already executing callbacks are finished. + volatile static bool _execution_finished; + volatile static int _in_callback_count; + public: static bool is_enabled(jvmtiEvent event_type); @@ -245,6 +250,10 @@ public: static void vm_start(); static void vm_init(); static void vm_death(); + static bool is_execution_finished(); + static void inc_in_callback_count(); + static void dec_in_callback_count(); + static int in_callback_count(); }; #endif // SHARE_PRIMS_JVMTIEVENTCONTROLLER_HPP diff --git a/src/hotspot/share/prims/jvmtiEventController.inline.hpp b/src/hotspot/share/prims/jvmtiEventController.inline.hpp index dcebd40b4b5..c5dbdcc5f8e 100644 --- a/src/hotspot/share/prims/jvmtiEventController.inline.hpp +++ b/src/hotspot/share/prims/jvmtiEventController.inline.hpp @@ -108,4 +108,22 @@ inline bool JvmtiEventController::is_enabled(jvmtiEvent event_type) { return _universal_global_event_enabled.is_enabled(event_type); } +inline bool JvmtiEventController::is_execution_finished() { + return AtomicAccess::load(&_execution_finished); +} + +inline void JvmtiEventController::inc_in_callback_count() { + AtomicAccess::inc(&_in_callback_count); +} + +inline void JvmtiEventController::dec_in_callback_count() { + AtomicAccess::dec(&_in_callback_count); +} + +inline int JvmtiEventController::in_callback_count() { + int result = AtomicAccess::load(&_in_callback_count); + assert(result >= 0, "Should be positive"); + return result; +} + #endif // SHARE_PRIMS_JVMTIEVENTCONTROLLER_INLINE_HPP diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index 0884fce2ff7..b58a88dcbb5 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -97,7 +97,12 @@ public: JvmtiJavaThreadEventTransition(JavaThread *thread) : _rm(), _transition(thread), - _hm(thread) {}; + _hm(thread) { + JvmtiEventController::inc_in_callback_count(); + }; + ~JvmtiJavaThreadEventTransition() { + JvmtiEventController::dec_in_callback_count(); + } }; // For JavaThreads which are not in _thread_in_vm state @@ -111,6 +116,7 @@ private: public: JvmtiThreadEventTransition(Thread *thread) : _rm(), _hm(thread) { + JvmtiEventController::inc_in_callback_count(); if (thread->is_Java_thread()) { _jthread = JavaThread::cast(thread); _saved_state = _jthread->thread_state(); @@ -125,11 +131,26 @@ public: } ~JvmtiThreadEventTransition() { - if (_jthread != nullptr) + if (_jthread != nullptr) { ThreadStateTransition::transition_from_native(_jthread, _saved_state); + } + JvmtiEventController::dec_in_callback_count(); } }; +// The JVMTI_...__BLOCK are used to ensure that vm_death is the last posted event. +// The callbacks are not executed after _execution_finished is set to true +// and the _in_callback_count contains the number of callbacks still in progress. +#define JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) \ + JvmtiJavaThreadEventTransition jet(thread); \ + if (JvmtiEventController::is_execution_finished()) {\ + return; \ + } +#define JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) \ + JvmtiThreadEventTransition jet(thread); \ + if (JvmtiEventController::is_execution_finished()) { \ + return; \ + } /////////////////////////////////////////////////////////////// // @@ -662,7 +683,7 @@ void JvmtiExport::post_early_vm_start() { EVT_TRACE(JVMTI_EVENT_VM_START, ("Evt Early VM start event sent" )); JavaThread *thread = JavaThread::current(); JvmtiThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVMStart callback = env->callbacks()->VMStart; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env()); @@ -691,7 +712,7 @@ void JvmtiExport::post_vm_start() { EVT_TRACE(JVMTI_EVENT_VM_START, ("Evt VM start event sent" )); JvmtiThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVMStart callback = env->callbacks()->VMStart; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env()); @@ -741,7 +762,7 @@ void JvmtiExport::post_vm_initialized() { JavaThread *thread = JavaThread::current(); JvmtiThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVMInit callback = env->callbacks()->VMInit; if (callback != nullptr) { // We map the JvmtiEnv to its Agent to measure when and for how long @@ -769,6 +790,11 @@ void JvmtiExport::post_vm_death() { JvmtiTagMap::flush_all_object_free_events(); + // It is needed to disable event generation before setting DEAD phase and wait + // until already executing events are finished. + // The VM_DEATH should be the last posted event. + JvmtiEventController::vm_death(); + JvmtiEnvIterator it; for (JvmtiEnv* env = it.first(); env != nullptr; env = it.next(env)) { if (env->is_enabled(JVMTI_EVENT_VM_DEATH)) { @@ -776,6 +802,7 @@ void JvmtiExport::post_vm_death() { JavaThread *thread = JavaThread::current(); JvmtiEventMark jem(thread); + // JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK must not be used here JvmtiJavaThreadEventTransition jet(thread); jvmtiEventVMDeath callback = env->callbacks()->VMDeath; if (callback != nullptr) { @@ -785,7 +812,6 @@ void JvmtiExport::post_vm_death() { } JvmtiEnvBase::set_phase(JVMTI_PHASE_DEAD); - JvmtiEventController::vm_death(); } char** @@ -967,7 +993,7 @@ class JvmtiClassFileLoadHookPoster : public StackObj { JvmtiClassFileLoadEventMark jem(_thread, _h_name, _class_loader, _h_protection_domain, _class_being_redefined); - JvmtiJavaThreadEventTransition jet(_thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(_thread) jvmtiEventClassFileLoadHook callback = env->callbacks()->ClassFileLoadHook; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), @@ -1177,7 +1203,7 @@ void JvmtiExport::post_compiled_method_unload( ResourceMark rm(thread); JvmtiEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventCompiledMethodUnload callback = env->callbacks()->CompiledMethodUnload; if (callback != nullptr) { (*callback)(env->jvmti_external(), method, code_begin); @@ -1219,7 +1245,7 @@ void JvmtiExport::post_raw_breakpoint(JavaThread *thread, Method* method, addres JvmtiEnv *env = ets->get_env(); JvmtiLocationEventMark jem(thread, mh, location); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventBreakpoint callback = env->callbacks()->Breakpoint; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -1360,7 +1386,7 @@ void JvmtiExport::post_class_load(JavaThread *thread, Klass* klass) { JvmtiTrace::safe_get_thread_name(thread), klass==nullptr? "null" : klass->external_name() )); JvmtiClassEventMark jem(thread, klass); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventClassLoad callback = env->callbacks()->ClassLoad; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class()); @@ -1401,7 +1427,7 @@ void JvmtiExport::post_class_prepare(JavaThread *thread, Klass* klass) { JvmtiTrace::safe_get_thread_name(thread), klass==nullptr? "null" : klass->external_name() )); JvmtiClassEventMark jem(thread, klass); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventClassPrepare callback = env->callbacks()->ClassPrepare; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_class()); @@ -1444,7 +1470,7 @@ void JvmtiExport::post_class_unload_internal(const char* name) { EVT_TRACE(EXT_EVENT_CLASS_UNLOAD, ("[?] Evt Class Unload sent %s", name)); JvmtiEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiExtensionEvent callback = env->ext_callbacks()->ClassUnload; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), name); @@ -1490,7 +1516,7 @@ void JvmtiExport::post_thread_start(JavaThread *thread) { JvmtiTrace::safe_get_thread_name(thread) )); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventThreadStart callback = env->callbacks()->ThreadStart; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); @@ -1538,7 +1564,7 @@ void JvmtiExport::post_thread_end(JavaThread *thread) { JvmtiTrace::safe_get_thread_name(thread) )); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventThreadEnd callback = env->callbacks()->ThreadEnd; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); @@ -1568,7 +1594,7 @@ void JvmtiExport::post_vthread_start(jobject vthread) { EVT_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_START, ("[%p] Evt Virtual Thread Start event sent", vthread)); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVirtualThreadStart callback = env->callbacks()->VirtualThreadStart; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); @@ -1604,7 +1630,7 @@ void JvmtiExport::post_vthread_end(jobject vthread) { EVT_TRACE(JVMTI_EVENT_VIRTUAL_THREAD_END, ("[%p] Evt Virtual Thread End event sent", vthread)); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVirtualThreadEnd callback = env->callbacks()->VirtualThreadEnd; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), vthread); @@ -1639,7 +1665,7 @@ void JvmtiExport::post_vthread_mount(jobject vthread) { EVT_TRACE(EXT_EVENT_VIRTUAL_THREAD_MOUNT, ("[%p] Evt Virtual Thread Mount event sent", vthread)); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiExtensionEvent callback = env->ext_callbacks()->VirtualThreadMount; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); @@ -1674,7 +1700,7 @@ void JvmtiExport::post_vthread_unmount(jobject vthread) { EVT_TRACE(EXT_EVENT_VIRTUAL_THREAD_UNMOUNT, ("[%p] Evt Virtual Thread Unmount event sent", vthread)); JvmtiVirtualThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiExtensionEvent callback = env->ext_callbacks()->VirtualThreadUnmount; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread()); @@ -1787,7 +1813,7 @@ void JvmtiExport::post_resource_exhausted(jint resource_exhausted_flags, const c EVT_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Evt resource exhausted event sent" )); JvmtiThreadEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventResourceExhausted callback = env->callbacks()->ResourceExhausted; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), @@ -1827,7 +1853,7 @@ void JvmtiExport::post_method_entry(JavaThread *thread, Method* method, frame cu JvmtiEnv *env = ets->get_env(); JvmtiMethodEventMark jem(thread, mh); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMethodEntry callback = env->callbacks()->MethodEntry; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_methodID()); @@ -1914,7 +1940,7 @@ void JvmtiExport::post_method_exit_inner(JavaThread* thread, JvmtiEnv *env = ets->get_env(); JvmtiMethodEventMark jem(thread, mh); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMethodExit callback = env->callbacks()->MethodExit; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -1941,7 +1967,7 @@ void JvmtiExport::post_method_exit_inner(JavaThread* thread, // we also need to issue a frame pop event for this frame JvmtiEnv *env = ets->get_env(); JvmtiMethodEventMark jem(thread, mh); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventFramePop callback = env->callbacks()->FramePop; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -1989,7 +2015,7 @@ void JvmtiExport::post_single_step(JavaThread *thread, Method* method, address l JvmtiEnv *env = ets->get_env(); JvmtiLocationEventMark jem(thread, mh, location); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventSingleStep callback = env->callbacks()->SingleStep; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2077,7 +2103,7 @@ void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, addre catch_jmethodID = jem.to_jmethodID(current_mh); } - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventException callback = env->callbacks()->Exception; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2152,7 +2178,7 @@ void JvmtiExport::notice_unwind_due_to_exception(JavaThread *thread, Method* met JvmtiEnv *env = ets->get_env(); JvmtiExceptionEventMark jem(thread, mh, location, exception_handle); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventExceptionCatch callback = env->callbacks()->ExceptionCatch; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2238,7 +2264,7 @@ void JvmtiExport::post_field_access(JavaThread *thread, Method* method, JvmtiLocationEventMark jem(thread, mh, location); jclass field_jclass = jem.to_jclass(field_klass); jobject field_jobject = jem.to_jobject(object()); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventFieldAccess callback = env->callbacks()->FieldAccess; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2396,7 +2422,7 @@ void JvmtiExport::post_field_modification(JavaThread *thread, Method* method, JvmtiLocationEventMark jem(thread, mh, location); jclass field_jclass = jem.to_jclass(field_klass); jobject field_jobject = jem.to_jobject(object()); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventFieldModification callback = env->callbacks()->FieldModification; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2428,7 +2454,7 @@ void JvmtiExport::post_native_method_bind(Method* method, address* function_ptr) JvmtiTrace::safe_get_thread_name(thread) )); JvmtiMethodEventMark jem(thread, mh); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) JNIEnv* jni_env = (env->phase() == JVMTI_PHASE_PRIMORDIAL) ? nullptr : jem.jni_env(); jvmtiEventNativeMethodBind callback = env->callbacks()->NativeMethodBind; if (callback != nullptr) { @@ -2525,7 +2551,7 @@ void JvmtiExport::post_compiled_method_load(JvmtiEnv* env, nmethod *nm) { jvmtiCompiledMethodLoadInlineRecord* inlinerecord = create_inline_record(nm); // Pass inlining information through the void pointer JvmtiCompiledMethodLoadEventMark jem(thread, nm, inlinerecord); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) (*callback)(env->jvmti_external(), jem.jni_methodID(), jem.code_size(), jem.code_data(), jem.map_length(), jem.map(), jem.compile_info()); @@ -2552,7 +2578,7 @@ void JvmtiExport::post_dynamic_code_generated_internal(const char *name, const v ("[%s] dynamic code generated event sent for %s", JvmtiTrace::safe_get_thread_name(thread), name)); JvmtiEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char)); jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated; if (callback != nullptr) { @@ -2594,7 +2620,7 @@ void JvmtiExport::post_dynamic_code_generated(JvmtiEnv* env, const char *name, ("[%s] dynamic code generated event sent for %s", JvmtiTrace::safe_get_thread_name(thread), name)); JvmtiEventMark jem(thread); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jint length = (jint)pointer_delta(code_end, code_begin, sizeof(char)); jvmtiEventDynamicCodeGenerated callback = env->callbacks()->DynamicCodeGenerated; if (callback != nullptr) { @@ -2678,7 +2704,7 @@ void JvmtiExport::post_garbage_collection_finish() { EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, ("[%s] garbage collection finish event sent", JvmtiTrace::safe_get_thread_name(thread))); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) // JNIEnv is null here because this event is posted from VM Thread jvmtiEventGarbageCollectionFinish callback = env->callbacks()->GarbageCollectionFinish; if (callback != nullptr) { @@ -2699,7 +2725,7 @@ void JvmtiExport::post_garbage_collection_start() { EVT_TRACE(JVMTI_EVENT_GARBAGE_COLLECTION_START, ("[%s] garbage collection start event sent", JvmtiTrace::safe_get_thread_name(thread))); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) // JNIEnv is null here because this event is posted from VM Thread jvmtiEventGarbageCollectionStart callback = env->callbacks()->GarbageCollectionStart; if (callback != nullptr) { @@ -2720,7 +2746,7 @@ void JvmtiExport::post_data_dump() { EVT_TRACE(JVMTI_EVENT_DATA_DUMP_REQUEST, ("[%s] data dump request event sent", JvmtiTrace::safe_get_thread_name(thread))); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) // JNIEnv is null here because this event is posted from VM Thread jvmtiEventDataDumpRequest callback = env->callbacks()->DataDumpRequest; if (callback != nullptr) { @@ -2754,7 +2780,7 @@ void JvmtiExport::post_monitor_contended_enter(JavaThread *thread, ObjectMonitor JvmtiTrace::safe_get_thread_name(thread))); JvmtiMonitorEventMark jem(thread, h()); JvmtiEnv *env = ets->get_env(); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMonitorContendedEnter callback = env->callbacks()->MonitorContendedEnter; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object()); @@ -2788,7 +2814,7 @@ void JvmtiExport::post_monitor_contended_entered(JavaThread *thread, ObjectMonit JvmtiTrace::safe_get_thread_name(thread))); JvmtiMonitorEventMark jem(thread, h()); JvmtiEnv *env = ets->get_env(); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMonitorContendedEntered callback = env->callbacks()->MonitorContendedEntered; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), jem.jni_object()); @@ -2821,7 +2847,7 @@ void JvmtiExport::post_monitor_wait(JavaThread *thread, oop object, JvmtiTrace::safe_get_thread_name(thread))); JvmtiMonitorEventMark jem(thread, h()); JvmtiEnv *env = ets->get_env(); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMonitorWait callback = env->callbacks()->MonitorWait; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2855,7 +2881,7 @@ void JvmtiExport::post_monitor_waited(JavaThread *thread, ObjectMonitor *obj_mnt JvmtiTrace::safe_get_thread_name(thread))); JvmtiMonitorEventMark jem(thread, h()); JvmtiEnv *env = ets->get_env(); - JvmtiThreadEventTransition jet(thread); + JVMTI_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventMonitorWaited callback = env->callbacks()->MonitorWaited; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2898,7 +2924,7 @@ void JvmtiExport::post_vm_object_alloc(JavaThread *thread, oop object) { object==nullptr? "null" : object->klass()->external_name())); JvmtiObjectAllocEventMark jem(thread, h()); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventVMObjectAlloc callback = env->callbacks()->VMObjectAlloc; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), @@ -2936,7 +2962,7 @@ void JvmtiExport::post_sampled_object_alloc(JavaThread *thread, oop object) { JvmtiEnv *env = ets->get_env(); JvmtiObjectAllocEventMark jem(thread, h()); - JvmtiJavaThreadEventTransition jet(thread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(thread) jvmtiEventSampledObjectAlloc callback = env->callbacks()->SampledObjectAlloc; if (callback != nullptr) { (*callback)(env->jvmti_external(), jem.jni_env(), jem.jni_thread(), From a588c120fc2ec9d5c59c43cda7f247e0a84981ff Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Wed, 29 Oct 2025 01:28:20 +0000 Subject: [PATCH 333/561] 8368172: Make java.time.format.DateTimePrintContext immutable Reviewed-by: liach --- .../java/time/format/DateTimeFormatter.java | 4 +- .../time/format/DateTimeFormatterBuilder.java | 96 +++++++++---------- .../time/format/DateTimePrintContext.java | 35 ++----- 3 files changed, 56 insertions(+), 79 deletions(-) diff --git a/src/java.base/share/classes/java/time/format/DateTimeFormatter.java b/src/java.base/share/classes/java/time/format/DateTimeFormatter.java index 26192b8e178..16d7193c556 100644 --- a/src/java.base/share/classes/java/time/format/DateTimeFormatter.java +++ b/src/java.base/share/classes/java/time/format/DateTimeFormatter.java @@ -1904,11 +1904,11 @@ public final class DateTimeFormatter { try { DateTimePrintContext context = new DateTimePrintContext(temporal, this); if (appendable instanceof StringBuilder) { - printerParser.format(context, (StringBuilder) appendable); + printerParser.format(context, (StringBuilder) appendable, false); } else { // buffer output to avoid writing to appendable in case of error StringBuilder buf = new StringBuilder(32); - printerParser.format(context, buf); + printerParser.format(context, buf, false); appendable.append(buf); } } catch (IOException ex) { diff --git a/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java b/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java index 9f5b82775b9..4708094effb 100644 --- a/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java +++ b/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Alibaba Group Holding Limited. 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 @@ -2484,10 +2485,15 @@ public final class DateTimeFormatterBuilder { * * @param context the context to format using, not null * @param buf the buffer to append to, not null + * @param optional whether the enclosing formatter is optional. + * If true and this formatter is nested in an optional formatter + * and the data is not available, then no error is returned and + * nothing is appended to the buffer. If false and the data is not available + * then an exception is thrown or false is returned as appropriate. * @return false if unable to query the value from the date-time, true otherwise * @throws DateTimeException if the date-time cannot be printed successfully */ - boolean format(DateTimePrintContext context, StringBuilder buf); + boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional); /** * Parses text into date-time information. @@ -2537,21 +2543,13 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { int length = buf.length(); - if (optional) { - context.startOptional(); - } - try { - for (DateTimePrinterParser pp : printerParsers) { - if (pp.format(context, buf) == false) { - buf.setLength(length); // reset buffer - return true; - } - } - } finally { - if (optional) { - context.endOptional(); + boolean effectiveOptional = optional | this.optional; + for (DateTimePrinterParser pp : printerParsers) { + if (!pp.format(context, buf, effectiveOptional)) { + buf.setLength(length); // reset buffer + return true; } } return true; @@ -2620,9 +2618,9 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { int preLen = buf.length(); - if (printerParser.format(context, buf) == false) { + if (printerParser.format(context, buf, optional) == false) { return false; } int len = buf.length() - preLen; @@ -2689,7 +2687,7 @@ public final class DateTimeFormatterBuilder { LENIENT; @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { return true; // nothing to do here } @@ -2731,7 +2729,7 @@ public final class DateTimeFormatterBuilder { this.value = value; } - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { return true; } @@ -2757,7 +2755,7 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { buf.append(literal); return true; } @@ -2807,7 +2805,7 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { buf.append(literal); return true; } @@ -2919,8 +2917,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long valueLong = context.getValue(field); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long valueLong = context.getValue(field, optional); if (valueLong == null) { return false; } @@ -3374,8 +3372,8 @@ public final class DateTimeFormatterBuilder { }; @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long value = context.getValue(field); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long value = context.getValue(field, optional); if (value == null) { return false; } @@ -3563,8 +3561,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long value = context.getValue(field); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long value = context.getValue(field, optional); if (value == null) { return false; } @@ -3711,8 +3709,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long value = context.getValue(field); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long value = context.getValue(field, optional); if (value == null) { return false; } @@ -3724,7 +3722,7 @@ public final class DateTimeFormatterBuilder { text = provider.getText(chrono, field, value, textStyle, context.getLocale()); } if (text == null) { - return numberPrinterParser().format(context, buf); + return numberPrinterParser().format(context, buf, optional); } buf.append(text); return true; @@ -3806,9 +3804,9 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { // use INSTANT_SECONDS, thus this code is not bound by Instant.MAX - Long inSecs = context.getValue(INSTANT_SECONDS); + Long inSecs = context.getValue(INSTANT_SECONDS, optional); Long inNanos = null; if (context.getTemporal().isSupported(NANO_OF_SECOND)) { inNanos = context.getTemporal().getLong(NANO_OF_SECOND); @@ -3992,8 +3990,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long offsetSecs = context.getValue(OFFSET_SECONDS); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long offsetSecs = context.getValue(OFFSET_SECONDS, optional); if (offsetSecs == null) { return false; } @@ -4291,8 +4289,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long offsetSecs = context.getValue(OFFSET_SECONDS); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long offsetSecs = context.getValue(OFFSET_SECONDS, optional); if (offsetSecs == null) { return false; } @@ -4505,8 +4503,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - ZoneId zone = context.getValue(TemporalQueries.zoneId()); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + ZoneId zone = context.getValue(TemporalQueries.zoneId(), optional); if (zone == null) { return false; } @@ -4627,8 +4625,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - ZoneId zone = context.getValue(query); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + ZoneId zone = context.getValue(query, optional); if (zone == null) { return false; } @@ -5052,8 +5050,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Chronology chrono = context.getValue(TemporalQueries.chronology()); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Chronology chrono = context.getValue(TemporalQueries.chronology(), optional); if (chrono == null) { return false; } @@ -5149,9 +5147,9 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { Chronology chrono = Chronology.from(context.getTemporal()); - return formatter(context.getLocale(), chrono).toPrinterParser(false).format(context, buf); + return formatter(context.getLocale(), chrono).toPrinterParser(false).format(context, buf, optional); } @Override @@ -5260,8 +5258,8 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - return printerParser(context.getLocale()).format(context, buf); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + return printerParser(context.getLocale()).format(context, buf, optional); } @Override @@ -5364,12 +5362,12 @@ public final class DateTimeFormatterBuilder { } @Override - public boolean format(DateTimePrintContext context, StringBuilder buf) { - Long hod = context.getValue(HOUR_OF_DAY); + public boolean format(DateTimePrintContext context, StringBuilder buf, boolean optional) { + Long hod = context.getValue(HOUR_OF_DAY, optional); if (hod == null) { return false; } - Long moh = context.getValue(MINUTE_OF_HOUR); + Long moh = context.getValue(MINUTE_OF_HOUR, optional); long value = Math.floorMod(hod, 24) * 60 + (moh != null ? Math.floorMod(moh, 60) : 0); Locale locale = context.getLocale(); LocaleStore store = findDayPeriodStore(locale); diff --git a/src/java.base/share/classes/java/time/format/DateTimePrintContext.java b/src/java.base/share/classes/java/time/format/DateTimePrintContext.java index d755ba3ee78..051796b6a9c 100644 --- a/src/java.base/share/classes/java/time/format/DateTimePrintContext.java +++ b/src/java.base/share/classes/java/time/format/DateTimePrintContext.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Alibaba Group Holding Limited. 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 @@ -86,11 +87,6 @@ import java.util.Objects; *

          * This class provides a single wrapper to items used in the format. * - * @implSpec - * This class is a mutable context intended for use from a single thread. - * Usage of the class is thread-safe within standard printing as the framework creates - * a new instance of the class for each format and printing is single-threaded. - * * @since 1.8 */ final class DateTimePrintContext { @@ -103,10 +99,6 @@ final class DateTimePrintContext { * The formatter, not null. */ private final DateTimeFormatter formatter; - /** - * Whether the current formatter is optional. - */ - private int optional; /** * Creates a new instance of the context. @@ -115,7 +107,6 @@ final class DateTimePrintContext { * @param formatter the formatter controlling the format, not null */ DateTimePrintContext(TemporalAccessor temporal, DateTimeFormatter formatter) { - super(); this.temporal = adjust(temporal, formatter); this.formatter = formatter; } @@ -348,30 +339,17 @@ final class DateTimePrintContext { } //----------------------------------------------------------------------- - /** - * Starts the printing of an optional segment of the input. - */ - void startOptional() { - this.optional++; - } - - /** - * Ends the printing of an optional segment of the input. - */ - void endOptional() { - this.optional--; - } - /** * Gets a value using a query. * * @param query the query to use, not null + * @param optional whether the query is optional, true if the query may be missing * @return the result, null if not found and optional is true * @throws DateTimeException if the type is not available and the section is not optional */ - R getValue(TemporalQuery query) { + R getValue(TemporalQuery query, boolean optional) { R result = temporal.query(query); - if (result == null && optional == 0) { + if (result == null && !optional) { throw new DateTimeException("Unable to extract " + query + " from temporal " + temporal); } @@ -384,11 +362,12 @@ final class DateTimePrintContext { * This will return the value for the specified field. * * @param field the field to find, not null + * @param optional whether the field is optional, true if the field may be missing * @return the value, null if not found and optional is true * @throws DateTimeException if the field is not available and the section is not optional */ - Long getValue(TemporalField field) { - if (optional > 0 && !temporal.isSupported(field)) { + Long getValue(TemporalField field, boolean optional) { + if (optional && !temporal.isSupported(field)) { return null; } return temporal.getLong(field); From 769950674e4258e73d040ddeab042125870b55b1 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Wed, 29 Oct 2025 01:33:26 +0000 Subject: [PATCH 334/561] 8370775: ModulePatcher$JarResourceFinder.getByteBuffer() does not close the InputStream after reading the bytes Reviewed-by: alanb, fandreuzzi --- .../share/classes/jdk/internal/module/ModulePatcher.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java b/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java index ce837027faa..d24cc77600c 100644 --- a/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java +++ b/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -467,8 +467,10 @@ public final class ModulePatcher { } @Override public ByteBuffer getByteBuffer() throws IOException { - byte[] bytes = getInputStream().readAllBytes(); - return ByteBuffer.wrap(bytes); + try (InputStream in = getInputStream()) { + byte[] bytes = in.readAllBytes(); + return ByteBuffer.wrap(bytes); + } } @Override public InputStream getInputStream() throws IOException { From 297a625f1977a395ee9774772814924dbc79e708 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Wed, 29 Oct 2025 02:30:20 +0000 Subject: [PATCH 335/561] 8370854: Add sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java to the ProblemList Reviewed-by: weijun --- test/jdk/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index f95b3681723..60d59d4e444 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -637,6 +637,8 @@ sun/security/smartcardio/TestTransmit.java 8039280 generic- sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183 linux-ppc64le +sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java 8370852 generic-all + ############################################################################ # jdk_sound From 0687f120cc324f35fe43d811b6beb4184fd854ec Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Wed, 29 Oct 2025 03:23:38 +0000 Subject: [PATCH 336/561] 8368199: Add @AOTSafeClassInitializer to jdk.internal.access.SharedSecrets Reviewed-by: liach, heidinga --- src/hotspot/share/cds/cdsHeapVerifier.cpp | 105 +++++++++++++++++- src/hotspot/share/cds/cdsHeapVerifier.hpp | 18 +++ .../java/lang/invoke/MethodHandleImpl.java | 6 - .../java/lang/module/ModuleDescriptor.java | 6 - .../classes/java/lang/ref/Reference.java | 6 - src/java.base/share/classes/java/net/URI.java | 6 - src/java.base/share/classes/java/net/URL.java | 6 - .../jdk/internal/access/SharedSecrets.java | 15 ++- test/hotspot/jtreg/TEST.groups | 1 + .../appcds/aotCache/SharedSecretsTest.java | 92 +++++++++++++++ 10 files changed, 225 insertions(+), 36 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/aotCache/SharedSecretsTest.java diff --git a/src/hotspot/share/cds/cdsHeapVerifier.cpp b/src/hotspot/share/cds/cdsHeapVerifier.cpp index 3f72a7c6872..59b07190c09 100644 --- a/src/hotspot/share/cds/cdsHeapVerifier.cpp +++ b/src/hotspot/share/cds/cdsHeapVerifier.cpp @@ -28,6 +28,8 @@ #include "classfile/classLoaderDataGraph.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/moduleEntry.hpp" +#include "classfile/symbolTable.hpp" +#include "classfile/systemDictionary.hpp" #include "classfile/systemDictionaryShared.hpp" #include "classfile/vmSymbols.hpp" #include "logging/log.hpp" @@ -153,9 +155,103 @@ CDSHeapVerifier::CDSHeapVerifier() : _archived_objs(0), _problems(0) # undef ADD_EXCL + if (CDSConfig::is_initing_classes_at_dump_time()) { + add_shared_secret_accessors(); + } ClassLoaderDataGraph::classes_do(this); } +// We allow only "stateless" accessors in the SharedSecrets class to be AOT-initialized, for example, +// in the following pattern: +// +// class URL { +// static { +// SharedSecrets.setJavaNetURLAccess( +// new JavaNetURLAccess() { ... }); +// } +// +// This initializes the field SharedSecrets::javaNetUriAccess, whose type (the inner case in the +// above example) has no fields (static or otherwise) and is not a hidden class, so it cannot possibly +// capture any transient state from the assembly phase that might become invalid in the production run. +// +class CDSHeapVerifier::SharedSecretsAccessorFinder : public FieldClosure { + CDSHeapVerifier* _verifier; + InstanceKlass* _ik; +public: + SharedSecretsAccessorFinder(CDSHeapVerifier* verifier, InstanceKlass* ik) + : _verifier(verifier), _ik(ik) {} + + void do_field(fieldDescriptor* fd) { + if (fd->field_type() == T_OBJECT) { + oop static_obj_field = _ik->java_mirror()->obj_field(fd->offset()); + if (static_obj_field != nullptr) { + Klass* field_type = static_obj_field->klass(); + + if (!field_type->is_instance_klass()) { + ResourceMark rm; + log_error(aot, heap)("jdk.internal.access.SharedSecrets::%s must not be an array", + fd->name()->as_C_string()); + AOTMetaspace::unrecoverable_writing_error(); + } + + InstanceKlass* field_type_ik = InstanceKlass::cast(field_type); + if (has_any_fields(field_type_ik) || field_type_ik->is_hidden()) { + // If field_type_ik is a hidden class, the accessor is probably initialized using a + // Lambda, which may contain transient states. + ResourceMark rm; + log_error(aot, heap)("jdk.internal.access.SharedSecrets::%s (%s) must be stateless", + fd->name()->as_C_string(), field_type_ik->external_name()); + AOTMetaspace::unrecoverable_writing_error(); + } + + _verifier->add_shared_secret_accessor(static_obj_field); + } + } + } + + // Does k (or any of its supertypes) have at least one (static or non-static) field? + static bool has_any_fields(InstanceKlass* k) { + if (k->static_field_size() != 0 || k->nonstatic_field_size() != 0) { + return true; + } + + if (k->super() != nullptr && has_any_fields(k->super())) { + return true; + } + + Array* interfaces = k->local_interfaces(); + int num_interfaces = interfaces->length(); + for (int index = 0; index < num_interfaces; index++) { + if (has_any_fields(interfaces->at(index))) { + return true; + } + } + + return false; + } +}; + +// This function is for allowing the following pattern in the core libraries: +// +// public class URLClassPath { +// private static final JavaNetURLAccess JNUA = SharedSecrets.getJavaNetURLAccess(); +// +// SharedSecrets::javaNetUriAccess has no states so it can be safely AOT-initialized. During +// the production run, even if URLClassPath. is re-executed, it will get back the same +// instance of javaNetUriAccess as it did during the assembly phase. +// +// Note: this will forbid complex accessors such as SharedSecrets::javaObjectInputFilterAccess +// to be initialized during the AOT assembly phase. +void CDSHeapVerifier::add_shared_secret_accessors() { + TempNewSymbol klass_name = SymbolTable::new_symbol("jdk/internal/access/SharedSecrets"); + InstanceKlass* ik = SystemDictionary::find_instance_klass(Thread::current(), klass_name, + Handle()); + assert(ik != nullptr, "must have been loaded"); + + SharedSecretsAccessorFinder finder(this, ik); + ik->do_local_static_fields(&finder); +} + CDSHeapVerifier::~CDSHeapVerifier() { if (_problems > 0) { log_error(aot, heap)("Scanned %d objects. Found %d case(s) where " @@ -181,13 +277,12 @@ public: return; } - if (fd->signature()->equals("Ljdk/internal/access/JavaLangAccess;")) { - // A few classes have static fields that point to SharedSecrets.getJavaLangAccess(). - // This object carries no state and we can create a new one in the production run. - return; - } oop static_obj_field = _ik->java_mirror()->obj_field(fd->offset()); if (static_obj_field != nullptr) { + if (_verifier->is_shared_secret_accessor(static_obj_field)) { + return; + } + Klass* field_type = static_obj_field->klass(); if (_exclusions != nullptr) { for (const char** p = _exclusions; *p != nullptr; p++) { diff --git a/src/hotspot/share/cds/cdsHeapVerifier.hpp b/src/hotspot/share/cds/cdsHeapVerifier.hpp index 1cc03975c5c..88ef13c9e90 100644 --- a/src/hotspot/share/cds/cdsHeapVerifier.hpp +++ b/src/hotspot/share/cds/cdsHeapVerifier.hpp @@ -38,6 +38,7 @@ class Symbol; class CDSHeapVerifier : public KlassClosure { class CheckStaticFields; + class SharedSecretsAccessorFinder; class TraceFields; int _archived_objs; @@ -55,6 +56,7 @@ class CDSHeapVerifier : public KlassClosure { HeapShared::oop_hash> _table; GrowableArray _exclusions; + GrowableArray _shared_secret_accessors; void add_exclusion(const char** excl) { _exclusions.append(excl); @@ -70,6 +72,22 @@ class CDSHeapVerifier : public KlassClosure { } return nullptr; } + + void add_shared_secret_accessors(); + + void add_shared_secret_accessor(oop obj) { + _shared_secret_accessors.append(obj); + } + + bool is_shared_secret_accessor(oop obj) { + for (int i = 0; i < _shared_secret_accessors.length(); i++) { + if (_shared_secret_accessors.at(i) == obj) { + return true; + } + } + return false; + } + static int trace_to_root(outputStream* st, oop orig_obj, oop orig_field, HeapShared::CachedOopInfo* p); CDSHeapVerifier(); diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index cb1bf8294d2..5b8a4478be5 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -33,7 +33,6 @@ import jdk.internal.constant.MethodTypeDescImpl; import jdk.internal.foreign.abi.NativeEntryPoint; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; -import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; import jdk.internal.vm.annotation.ForceInline; import jdk.internal.vm.annotation.Hidden; @@ -1536,11 +1535,6 @@ abstract class MethodHandleImpl { } static { - runtimeSetup(); - } - - @AOTRuntimeSetup - private static void runtimeSetup() { SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() { @Override public Class getDeclaringClass(Object rmname) { diff --git a/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java b/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java index d5f4470d9c9..4f4e35c6727 100644 --- a/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java +++ b/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java @@ -54,7 +54,6 @@ import static java.util.Objects.*; import jdk.internal.module.Checks; import jdk.internal.module.ModuleInfo; -import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; @@ -2668,11 +2667,6 @@ public final class ModuleDescriptor } static { - runtimeSetup(); - } - - @AOTRuntimeSetup - private static void runtimeSetup() { /** * Setup the shared secret to allow code in other packages access * private package methods in java.lang.module. diff --git a/src/java.base/share/classes/java/lang/ref/Reference.java b/src/java.base/share/classes/java/lang/ref/Reference.java index 43d9f414b3c..88bdb99dfd6 100644 --- a/src/java.base/share/classes/java/lang/ref/Reference.java +++ b/src/java.base/share/classes/java/lang/ref/Reference.java @@ -25,7 +25,6 @@ package java.lang.ref; -import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; import jdk.internal.vm.annotation.ForceInline; import jdk.internal.vm.annotation.IntrinsicCandidate; @@ -291,11 +290,6 @@ public abstract sealed class Reference<@jdk.internal.RequiresIdentity T> } static { - runtimeSetup(); - } - - @AOTRuntimeSetup - private static void runtimeSetup() { // provide access in SharedSecrets SharedSecrets.setJavaLangRefAccess(new JavaLangRefAccess() { @Override diff --git a/src/java.base/share/classes/java/net/URI.java b/src/java.base/share/classes/java/net/URI.java index d130dc3b460..d568ab1c114 100644 --- a/src/java.base/share/classes/java/net/URI.java +++ b/src/java.base/share/classes/java/net/URI.java @@ -43,7 +43,6 @@ import java.text.Normalizer; import jdk.internal.access.JavaNetUriAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.util.Exceptions; -import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; import sun.nio.cs.UTF_8; @@ -3731,11 +3730,6 @@ public final class URI } static { - runtimeSetup(); - } - - @AOTRuntimeSetup - private static void runtimeSetup() { SharedSecrets.setJavaNetUriAccess( new JavaNetUriAccess() { public URI create(String scheme, String path) { diff --git a/src/java.base/share/classes/java/net/URL.java b/src/java.base/share/classes/java/net/URL.java index c82236b5b85..1e86f41fd3f 100644 --- a/src/java.base/share/classes/java/net/URL.java +++ b/src/java.base/share/classes/java/net/URL.java @@ -42,7 +42,6 @@ import java.util.ServiceLoader; import jdk.internal.access.JavaNetURLAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.misc.VM; -import jdk.internal.vm.annotation.AOTRuntimeSetup; import jdk.internal.vm.annotation.AOTSafeClassInitializer; import sun.net.util.IPAddressUtil; import static jdk.internal.util.Exceptions.filterNonSocketInfo; @@ -1747,11 +1746,6 @@ public final class URL implements java.io.Serializable { } static { - runtimeSetup(); - } - - @AOTRuntimeSetup - private static void runtimeSetup() { SharedSecrets.setJavaNetURLAccess( new JavaNetURLAccess() { @Override diff --git a/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java b/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java index e20a1e77423..b0a71529fa7 100644 --- a/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java +++ b/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java @@ -25,6 +25,7 @@ package jdk.internal.access; +import jdk.internal.vm.annotation.AOTSafeClassInitializer; import jdk.internal.vm.annotation.Stable; import javax.crypto.SealedObject; @@ -58,8 +59,20 @@ import javax.security.auth.x500.X500Principal; * increased complexity and lack of sustainability. * Use this only as a last resort! * + * + *

          Notes on the @AOTSafeClassInitializer annotation: + * + *

          All static fields in SharedSecrets that are initialized in the AOT + * assembly phase must be stateless (as checked by the HotSpot C++ class + * CDSHeapVerifier::SharedSecretsAccessorFinder) so they can be safely + * stored in the AOT cache. + * + *

          Static fields such as javaObjectInputFilterAccess point to a Lambda + * which is not stateless. The AOT assembly phase must not execute any Java + * code that would lead to the initialization of such fields, or else the AOT + * cache creation will fail. */ - +@AOTSafeClassInitializer public class SharedSecrets { // This field is not necessarily stable private static JavaAWTFontAccess javaAWTFontAccess; diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 18f27a96628..2f58670b90e 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -563,6 +563,7 @@ hotspot_aot_classlinking = \ -runtime/cds/appcds/resolvedConstants/AOTLinkedVarHandles.java \ -runtime/cds/appcds/resolvedConstants/ResolvedConstants.java \ -runtime/cds/appcds/RewriteBytecodesTest.java \ + -runtime/cds/appcds/SignedJar.java \ -runtime/cds/appcds/SpecifySysLoaderProp.java \ -runtime/cds/appcds/StaticArchiveWithLambda.java \ -runtime/cds/appcds/TestEpsilonGCWithCDS.java \ diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/SharedSecretsTest.java b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/SharedSecretsTest.java new file mode 100644 index 00000000000..5d6e909b751 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/SharedSecretsTest.java @@ -0,0 +1,92 @@ +/* + * 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. + * + * 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. + * + */ + +/* + * @test + * @summary Try to AOT-initialize SharedSecrets accessors that are not allowed. + * @bug 8368199 + * @requires vm.cds.supports.aot.class.linking + * @requires vm.debug + * @library /test/lib + * @build SharedSecretsTest + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar MyTestApp + * @run driver SharedSecretsTest AOT + */ + +import java.io.ObjectInputFilter; +import jdk.test.lib.cds.CDSAppTester; +import jdk.test.lib.helpers.ClassFileInstaller; +import jdk.test.lib.process.OutputAnalyzer; + +public class SharedSecretsTest { + static final String appJar = ClassFileInstaller.getJarPath("app.jar"); + static final String mainClass = "MyTestApp"; + + public static void main(String[] args) throws Exception { + Tester t = new Tester(mainClass); + t.setCheckExitValue(false); + t.runAOTAssemblyWorkflow(); + } + + static class Tester extends CDSAppTester { + public Tester(String name) { + super(name); + } + + @Override + public String classpath(RunMode runMode) { + return appJar; + } + + @Override + public String[] vmArgs(RunMode runMode) { + return new String[] { "-XX:AOTInitTestClass=" + mainClass}; + } + + @Override + public String[] appCommandLine(RunMode runMode) { + return new String[] { + mainClass, + }; + } + + @Override + public void checkExecution(OutputAnalyzer out, RunMode runMode) { + if (runMode == RunMode.ASSEMBLY) { + out.shouldMatch("jdk.internal.access.SharedSecrets::javaObjectInputFilterAccess .* must be stateless"); + out.shouldNotHaveExitValue(0); + } else { + out.shouldHaveExitValue(0); + } + } + } +} + +// We use -XX:AOTInitTestClass to force this class to be AOT-initialized in the assembly phase. It will +// cause the SharedSecrets::javaObjectInputFilterAccess to be initialized, which is not allowed. +class MyTestApp { + static Object foo = ObjectInputFilter.Config.createFilter(""); + public static void main(String args[]) { + } +} From c97d50d793df46292e38707956586dfaa4b77d32 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Wed, 29 Oct 2025 07:26:00 +0000 Subject: [PATCH 337/561] 8369508: Type annotations on anonymous new class creation expressions can't be retrieved Reviewed-by: vromero --- .../com/sun/tools/javac/comp/Annotate.java | 12 +++++++++++- .../classes/com/sun/tools/javac/comp/Attr.java | 16 ++++------------ .../typeAnnotations/NewClassTypeAnnotation.java | 12 ++++-------- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java index 9f56bec4cca..f5fdc1578b8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java @@ -332,6 +332,13 @@ public class Annotate { Assert.checkNonNull(c, "Failed to create annotation"); + if (env.info.isAnonymousNewClass) { + // Annotations on anonymous class instantiations should be attributed, + // but not attached to the enclosing element. They will be visited + // separately and attached to the synthetic class declaration. + continue; + } + if (a.type.isErroneous() || a.type.tsym.isAnnotationType()) { if (annotated.containsKey(a.type.tsym)) { ListBuffer l = annotated.get(a.type.tsym); @@ -1144,8 +1151,11 @@ public class Annotate { public void visitNewClass(JCNewClass tree) { scan(tree.encl); scan(tree.typeargs); - if (tree.def == null) { + try { + env.info.isAnonymousNewClass = tree.def != null; scan(tree.clazz); + } finally { + env.info.isAnonymousNewClass = false; } scan(tree.args); // the anonymous class instantiation if any will be visited separately. diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 719b804ea5f..617d8ca7077 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -2777,16 +2777,9 @@ public class Attr extends JCTree.Visitor { // Attribute clazz expression and store // symbol + type back into the attributed tree. - Type clazztype; - - try { - env.info.isAnonymousNewClass = tree.def != null; - clazztype = TreeInfo.isEnumInit(env.tree) ? - attribIdentAsEnumType(env, (JCIdent)clazz) : - attribType(clazz, env); - } finally { - env.info.isAnonymousNewClass = false; - } + Type clazztype = TreeInfo.isEnumInit(env.tree) ? + attribIdentAsEnumType(env, (JCIdent)clazz) : + attribType(clazz, env); clazztype = chk.checkDiamond(tree, clazztype); chk.validate(clazz, localEnv); @@ -5256,8 +5249,7 @@ public class Attr extends JCTree.Visitor { Type underlyingType = attribType(tree.underlyingType, env); Type annotatedType = underlyingType.preannotatedType(); - if (!env.info.isAnonymousNewClass) - annotate.annotateTypeSecondStage(tree, tree.annotations, annotatedType); + annotate.annotateTypeSecondStage(tree, tree.annotations, annotatedType); result = tree.type = annotatedType; } diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/NewClassTypeAnnotation.java b/test/langtools/tools/javac/annotations/typeAnnotations/NewClassTypeAnnotation.java index f99cb1c1a34..1f8f700fd82 100644 --- a/test/langtools/tools/javac/annotations/typeAnnotations/NewClassTypeAnnotation.java +++ b/test/langtools/tools/javac/annotations/typeAnnotations/NewClassTypeAnnotation.java @@ -31,7 +31,6 @@ * @run main NewClassTypeAnnotation */ import com.sun.source.tree.NewClassTree; -import com.sun.source.tree.Tree; import com.sun.source.util.TaskEvent; import com.sun.source.util.TaskListener; import com.sun.source.util.TreePathScanner; @@ -91,6 +90,7 @@ public class NewClassTypeAnnotation extends TestRunner { public void testMethod() { new Test<@TypeAnnotation String>(); + new Test<@TypeAnnotation String>() {}; } } """); @@ -112,11 +112,7 @@ public class NewClassTypeAnnotation extends TestRunner { @Override public Void visitNewClass(final NewClassTree node, final Void unused) { TypeMirror type = trees.getTypeMirror(getCurrentPath()); - System.err.println(">>> " + type); - for (Tree t : getCurrentPath()) { - System.err.println(t); - } - actual.add(String.format("Expression: %s, Type: %s", node, type)); + actual.add(String.format("Type: %s", type)); return null; } } @@ -144,8 +140,8 @@ public class NewClassTypeAnnotation extends TestRunner { List expected = List.of( - "Expression: new Test<@TypeAnnotation String>(), Type:" - + " test.Test"); + "Type: test.Test", + "Type: >"); if (!expected.equals(actual)) { throw new AssertionError("expected: " + expected + ", actual: " + actual); } From 20bcf0eddaee0a57142bcc614cc5415b53c16460 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Wed, 29 Oct 2025 08:59:12 +0000 Subject: [PATCH 338/561] 6400876: (bf) Remove sun.nio.ByteBuffered and related obsolete code Reviewed-by: djelinski, vyazici, alanb --- .../classes/jdk/internal/loader/Resource.java | 7 +-- .../share/classes/sun/nio/ByteBuffered.java | 60 ------------------- .../internal/jrtfs/ImageReaderBenchmark.java | 1 - 3 files changed, 1 insertion(+), 67 deletions(-) delete mode 100644 src/java.base/share/classes/sun/nio/ByteBuffered.java diff --git a/src/java.base/share/classes/jdk/internal/loader/Resource.java b/src/java.base/share/classes/jdk/internal/loader/Resource.java index b72f4df7d52..312dfc859aa 100644 --- a/src/java.base/share/classes/jdk/internal/loader/Resource.java +++ b/src/java.base/share/classes/jdk/internal/loader/Resource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -33,7 +33,6 @@ import java.security.CodeSigner; import java.util.jar.Manifest; import java.nio.ByteBuffer; import java.util.Arrays; -import sun.nio.ByteBuffered; /** * This class is used to represent a Resource that has been loaded @@ -130,10 +129,6 @@ public abstract class Resource { * @return Resource data or null. */ public ByteBuffer getByteBuffer() throws IOException { - InputStream in = cachedInputStream(); - if (in instanceof ByteBuffered) { - return ((ByteBuffered)in).getByteBuffer(); - } return null; } diff --git a/src/java.base/share/classes/sun/nio/ByteBuffered.java b/src/java.base/share/classes/sun/nio/ByteBuffered.java deleted file mode 100644 index a547cefeb89..00000000000 --- a/src/java.base/share/classes/sun/nio/ByteBuffered.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * 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 sun.nio; - -import java.nio.ByteBuffer; -import java.io.IOException; - -/** - * This is an interface to adapt existing APIs to use {@link java.nio.ByteBuffer - * ByteBuffers} as the underlying data format. Only the initial producer and - * final consumer have to be changed. - * - *

          - * For example, the Zip/Jar code supports {@link java.io.InputStream InputStreams}. - * To make the Zip code use {@link java.nio.MappedByteBuffer MappedByteBuffers} as - * the underlying data structure, it can create a class of InputStream that wraps - * the ByteBuffer, and implements the ByteBuffered interface. A co-operating class - * several layers away can ask the InputStream if it is an instance of ByteBuffered, - * then call the {@link #getByteBuffer()} method. - */ -public interface ByteBuffered { - - /** - * Returns the {@code ByteBuffer} behind this object, if this particular - * instance has one. An implementation of {@code getByteBuffer()} is allowed - * to return {@code null} for any reason. - * - * @return The {@code ByteBuffer}, if this particular instance has one, - * or {@code null} otherwise. - * - * @throws IOException - * If the ByteBuffer is no longer valid. - * - * @since 1.5 - */ - public ByteBuffer getByteBuffer() throws IOException; -} diff --git a/test/micro/org/openjdk/bench/jdk/internal/jrtfs/ImageReaderBenchmark.java b/test/micro/org/openjdk/bench/jdk/internal/jrtfs/ImageReaderBenchmark.java index 4f97e12171f..1b89b510fae 100644 --- a/test/micro/org/openjdk/bench/jdk/internal/jrtfs/ImageReaderBenchmark.java +++ b/test/micro/org/openjdk/bench/jdk/internal/jrtfs/ImageReaderBenchmark.java @@ -1062,7 +1062,6 @@ public class ImageReaderBenchmark { "/modules/java.base/jdk/internal/loader/URLClassPath$FileLoader.class", "/modules/java.base/jdk/internal/loader/Resource.class", "/modules/java.base/java/io/FileCleanable.class", - "/modules/java.base/sun/nio/ByteBuffered.class", "/modules/java.base/java/security/SecureClassLoader$CodeSourceKey.class", "/modules/java.base/java/security/PermissionCollection.class", "/modules/java.base/java/security/Permissions.class", From 5a2b0ca7fea7d1a283aa90696c3989ae189148ec Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Wed, 29 Oct 2025 09:03:34 +0000 Subject: [PATCH 339/561] 8339526: C2: store incorrectly removed for clone() transformed to series of loads/stores Reviewed-by: rcastanedalo, chagedorn --- src/hotspot/share/opto/arraycopynode.cpp | 9 ++ .../TestCloneUnknownClassAtParseTime.java | 92 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 test/hotspot/jtreg/compiler/arraycopy/TestCloneUnknownClassAtParseTime.java diff --git a/src/hotspot/share/opto/arraycopynode.cpp b/src/hotspot/share/opto/arraycopynode.cpp index 85b6bd21aec..c02aefc7943 100644 --- a/src/hotspot/share/opto/arraycopynode.cpp +++ b/src/hotspot/share/opto/arraycopynode.cpp @@ -212,6 +212,15 @@ Node* ArrayCopyNode::try_clone_instance(PhaseGVN *phase, bool can_reshape, int c } } + const TypeInstPtr* dest_type = phase->type(base_dest)->is_instptr(); + if (dest_type->instance_klass() != ik) { + // At parse time, the exact type of the object to clone was not known. That inexact type was captured by the CheckCastPP + // of the newly allocated cloned object (in dest). The exact type is now known (in src), but the type for the cloned object + // (dest) was not updated. When copying the fields below, Store nodes may write to offsets for fields that don't exist in + // the inexact class. The stores would then be assigned an incorrect slice. + return NodeSentinel; + } + assert(ik->nof_nonstatic_fields() <= ArrayCopyLoadStoreMaxElem, "too many fields"); BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); diff --git a/test/hotspot/jtreg/compiler/arraycopy/TestCloneUnknownClassAtParseTime.java b/test/hotspot/jtreg/compiler/arraycopy/TestCloneUnknownClassAtParseTime.java new file mode 100644 index 00000000000..1cd7cc21611 --- /dev/null +++ b/test/hotspot/jtreg/compiler/arraycopy/TestCloneUnknownClassAtParseTime.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2025 IBM Corporation. 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. + */ + +/** + * @test + * @bug 8339526 + * @summary C2: store incorrectly removed for clone() transformed to series of loads/stores + * @run main/othervm -XX:-BackgroundCompilation compiler.arraycopy.TestCloneUnknownClassAtParseTime + * @run main compiler.arraycopy.TestCloneUnknownClassAtParseTime + */ + +package compiler.arraycopy; + +public class TestCloneUnknownClassAtParseTime { + private static volatile int volatileField; + static A field; + + public static void main(String[] args) throws CloneNotSupportedException { + A a = new A(); + for (int i = 0; i < 20_000; i++) { + B b = (B)test1(-1); + if (b.field1 != 42 || b.field2 != 42|| b.field3 != 42) { + throw new RuntimeException("Clone wrongly initialized"); + } + inlined1(42); + field = a; + inlined2(); + } + } + + private static A test1(int i) throws CloneNotSupportedException { + int[] nonEscapingArray = new int[1]; + field = new B(42, 42, 42); + + if (i > 0) { + throw new RuntimeException("never taken"); + } + inlined1(i); + + nonEscapingArray[0] = 42; + return inlined2(); + } + + private static A inlined2() throws CloneNotSupportedException { + A a = field; + return (A)a.clone(); + } + + private static void inlined1(int i) { + if (i > 0) { + volatileField = 42; + } + } + + private static class A implements Cloneable { + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + } + + private static class B extends A { + int field1; + int field2; + int field3; + + B(int v1, int v2, int v3) { + field1 = v1; + field2 = v2; + field3 = v3; + } + } +} From 2758c6fda2f774d98ef0c24535a7f7e9fc722379 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Wed, 29 Oct 2025 09:11:02 +0000 Subject: [PATCH 340/561] 8368856: Add a method that performs saturating addition of a Duration to an Instant Reviewed-by: naoto, rriggs, scolebourne --- .../share/classes/java/time/Instant.java | 26 +++++++ .../java/time/tck/java/time/TCKInstant.java | 78 +++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/src/java.base/share/classes/java/time/Instant.java b/src/java.base/share/classes/java/time/Instant.java index db8db4aaa38..640743f0fb7 100644 --- a/src/java.base/share/classes/java/time/Instant.java +++ b/src/java.base/share/classes/java/time/Instant.java @@ -788,6 +788,32 @@ public final class Instant return (Instant) amountToAdd.addTo(this); } + /** + * Returns a copy of this instant with the specified duration added, with + * saturated semantics. + *

          + * If the result is "earlier" than {@link Instant#MIN}, this method returns + * {@code MIN}. If the result is "later" than {@link Instant#MAX}, it + * returns {@code MAX}. Otherwise it returns {@link #plus(TemporalAmount) plus(duration)}. + * + * @apiNote This method can be used to calculate a deadline from + * this instant and a timeout. Unlike {@code plus(duration)}, + * this method never throws {@link ArithmeticException} or {@link DateTimeException} + * due to numeric overflow or {@code Instant} range violation. + * + * @param duration the duration to add, not null + * @return an {@code Instant} based on this instant with the addition made, not null + * + * @since 26 + */ + public Instant plusSaturating(Duration duration) { + if (duration.isNegative()) { + return until(Instant.MIN).compareTo(duration) >= 0 ? Instant.MIN : plus(duration); + } else { + return until(Instant.MAX).compareTo(duration) <= 0 ? Instant.MAX : plus(duration); + } + } + /** * Returns a copy of this instant with the specified amount added. *

          diff --git a/test/jdk/java/time/tck/java/time/TCKInstant.java b/test/jdk/java/time/tck/java/time/TCKInstant.java index c666a1340d3..d92d46d62bd 100644 --- a/test/jdk/java/time/tck/java/time/TCKInstant.java +++ b/test/jdk/java/time/tck/java/time/TCKInstant.java @@ -106,6 +106,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Optional; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -1225,6 +1226,83 @@ public class TCKInstant extends AbstractDateTimeTest { t.plusNanos(-1); } + @DataProvider(name = "PlusSaturating") + Object[][] provider_plusSaturating() { + return new Object[][]{ + // 1. {edge or constant instants} x {edge or constant durations} + {Instant.MIN, Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.MIN, Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.MIN, Duration.ZERO, Optional.empty()}, + {Instant.MIN, Duration.ofSeconds(Long.MAX_VALUE, 999_999_999), Optional.of(Instant.MAX)}, + {Instant.EPOCH, Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.EPOCH, Duration.ZERO, Optional.empty()}, + {Instant.EPOCH, Duration.ofSeconds(Long.MAX_VALUE, 999_999_999), Optional.of(Instant.MAX)}, + {Instant.MAX, Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.MAX, Duration.ZERO, Optional.empty()}, + {Instant.MAX, Duration.ofSeconds(Long.MAX_VALUE, 999_999_999), Optional.of(Instant.MAX)}, + // 2. {edge or constant instants} x {normal durations} + {Instant.MIN, Duration.ofDays(-32), Optional.of(Instant.MIN)}, + {Instant.MIN, Duration.ofDays(32), Optional.empty()}, + {Instant.EPOCH, Duration.ofDays(-32), Optional.empty()}, + {Instant.EPOCH, Duration.ofDays(32), Optional.empty()}, + {Instant.MAX, Duration.ofDays(-32), Optional.empty()}, + {Instant.MAX, Duration.ofDays(32), Optional.of(Instant.MAX)}, + // 3. {normal instants with both positive and negative epoch seconds} x {edge or constant durations} + {Instant.parse("1950-01-01T00:00:00Z"), Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.parse("1950-01-01T00:00:00Z"), Duration.ZERO, Optional.empty()}, + {Instant.parse("1950-01-01T00:00:00Z"), Duration.ofSeconds(Long.MAX_VALUE, 999_999_999), Optional.of(Instant.MAX)}, + {Instant.parse("1990-01-01T00:00:00Z"), Duration.ofSeconds(Long.MIN_VALUE, 0), Optional.of(Instant.MIN)}, + {Instant.parse("1990-01-01T00:00:00Z"), Duration.ZERO, Optional.empty()}, + {Instant.parse("1990-01-01T00:00:00Z"), Duration.ofSeconds(Long.MAX_VALUE, 999_999_999), Optional.of(Instant.MAX)}, + // 4. {normal instants with both positive and negative epoch seconds} x {normal durations} + {Instant.parse("1950-01-01T00:00:00Z"), Duration.ofDays(-32), Optional.empty()}, + {Instant.parse("1950-01-01T00:00:00Z"), Duration.ofDays(32), Optional.empty()}, + {Instant.parse("1990-01-01T00:00:00Z"), Duration.ofDays(-32), Optional.empty()}, + {Instant.parse("1990-01-01T00:00:00Z"), Duration.ofDays(32), Optional.empty()}, + // 5. instant boundary + {Instant.MIN, Duration.between(Instant.MIN, Instant.MAX), Optional.of(Instant.MAX)}, + {Instant.EPOCH, Duration.between(Instant.EPOCH, Instant.MAX), Optional.of(Instant.MAX)}, + {Instant.EPOCH, Duration.between(Instant.EPOCH, Instant.MIN), Optional.of(Instant.MIN)}, + {Instant.MAX, Duration.between(Instant.MAX, Instant.MIN), Optional.of(Instant.MIN)} + }; + } + + @Test(dataProvider = "PlusSaturating") + public void plusSaturating(Instant i, Duration d, Optional value) { + var actual = i.plusSaturating(d); + try { + assertEquals(actual, i.plus(d)); + // If `value` is present, perform an additional check. It may be + // important to ensure that not only does the result of `plusSaturating` + // match that of `plus`, but that it also matches our expectation. + // Because if it doesn’t, then the test isn’t testing what we think + // it is, and needs to be fixed. + value.ifPresent(instant -> assertEquals(actual, instant)); + } catch (DateTimeException /* instant overflow */ + | ArithmeticException /* long overflow */ e) { + if (value.isEmpty()) { + throw new AssertionError(); + } + assertEquals(actual, value.get()); + } + } + + @DataProvider(name = "PlusSaturating_null") + Object[][] provider_plusSaturating_null() { + return new Object[][]{ + {Instant.MIN}, + {Instant.EPOCH}, + {Instant.MAX}, + // any non-random but also non-special instant + {Instant.parse("2025-10-13T20:47:50.369955Z")}, + }; + } + + @Test(expectedExceptions = NullPointerException.class, dataProvider = "PlusSaturating_null") + public void test_plusSaturating_null(Instant i) { + i.plusSaturating(null); + } + //----------------------------------------------------------------------- @DataProvider(name="Minus") Object[][] provider_minus() { From 8457f38f14182e2a55ff5d243cdacb06c9003c49 Mon Sep 17 00:00:00 2001 From: Anton Seoane Ampudia Date: Wed, 29 Oct 2025 09:37:34 +0000 Subject: [PATCH 341/561] 8347463: jdk/jfr/threading/TestManyVirtualThreads.java crashes with assert(oopDesc::is_oop_or_null(val)) Reviewed-by: dlong, rcastanedalo, mgronlun --- src/hotspot/share/opto/runtime.cpp | 5 +- src/hotspot/share/opto/runtime.hpp | 6 ++ ...TestReturnOopSetForJFRWriteCheckpoint.java | 67 +++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/intrinsics/TestReturnOopSetForJFRWriteCheckpoint.java diff --git a/src/hotspot/share/opto/runtime.cpp b/src/hotspot/share/opto/runtime.cpp index 9de9fe5da03..32acbe57951 100644 --- a/src/hotspot/share/opto/runtime.cpp +++ b/src/hotspot/share/opto/runtime.cpp @@ -857,8 +857,9 @@ static const TypeFunc* make_jfr_write_checkpoint_Type() { const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms, fields); // create result type (range) - fields = TypeTuple::fields(0); - const TypeTuple *range = TypeTuple::make(TypeFunc::Parms, fields); + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms] = TypeInstPtr::BOTTOM; + const TypeTuple *range = TypeTuple::make(TypeFunc::Parms + 1, fields); return TypeFunc::make(domain, range); } diff --git a/src/hotspot/share/opto/runtime.hpp b/src/hotspot/share/opto/runtime.hpp index 76e69fd9d36..eb2b49311cf 100644 --- a/src/hotspot/share/opto/runtime.hpp +++ b/src/hotspot/share/opto/runtime.hpp @@ -48,6 +48,12 @@ // it calls the C++ code "xxx_C". The generated nmethod is saved in the // CodeCache. Exception handlers use the nmethod to get the callee-save // register OopMaps. +// +// Please ensure the return type of the runtime call matches its signature, +// even if the return value is unused. This is crucial for correct handling +// of runtime calls that return an oop and may trigger deoptimization +// on return. See rematerialize_objects() in deoptimization.cpp. + class CallInfo; // diff --git a/test/hotspot/jtreg/compiler/intrinsics/TestReturnOopSetForJFRWriteCheckpoint.java b/test/hotspot/jtreg/compiler/intrinsics/TestReturnOopSetForJFRWriteCheckpoint.java new file mode 100644 index 00000000000..fd80b1630f3 --- /dev/null +++ b/test/hotspot/jtreg/compiler/intrinsics/TestReturnOopSetForJFRWriteCheckpoint.java @@ -0,0 +1,67 @@ +/* + * 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. + * + * 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 compiler.intrinsics; + +import compiler.lib.ir_framework.*; + +import jdk.jfr.Event; +import jdk.jfr.Recording; + +/** + * @test + * @summary Tests that the getEventWriter call to write_checkpoint correctly + * reports returning an oop + * @bug 8347463 + * @requires vm.hasJFR + * @library /test/lib / + * @run driver compiler.intrinsics.TestReturnOopSetForJFRWriteCheckpoint + */ +public class TestReturnOopSetForJFRWriteCheckpoint { + + private static class TestEvent extends Event { + } + + public static void main(String... args) { + TestFramework.run(); + } + + // Crash was due to the return_oop field not being set + // for the write_checkpoint call. Instead of explicitly checking for + // it, we look for an non-void return type (which comes hand-in-hand + // with the return_oop information). + @Test + @IR(failOn = { IRNode.STATIC_CALL_OF_METHOD, "write_checkpoint.*void"}) + public void testWriteCheckpointReturnType() { + try (Recording r = new Recording()) { + r.start(); + emitEvent(); + } + } + + @ForceInline + public void emitEvent() { + TestEvent t = new TestEvent(); + t.commit(); + } +} From bbe5e83c3910dc4986a1dccf6fcf31d15710c71d Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Wed, 29 Oct 2025 09:58:10 +0000 Subject: [PATCH 342/561] 8363925: Remove unused sun.nio.cs.ArrayEncoder::encode Reviewed-by: liach --- .../share/classes/java/lang/String.java | 9 +- .../classes/sun/nio/cs/ArrayEncoder.java | 24 ++--- .../share/classes/sun/nio/cs/CESU_8.java | 47 +-------- .../share/classes/sun/nio/cs/DoubleByte.java | 85 +---------------- .../share/classes/sun/nio/cs/HKSCS.java | 32 +------ .../share/classes/sun/nio/cs/SingleByte.java | 29 +----- .../sun/nio/cs/TestEncoderReplaceLatin1.java | 4 +- .../sun/nio/cs/TestEncoderReplaceUTF16.java | 4 +- test/jdk/sun/nio/cs/TestStringCoding.java | 95 ++++++++++++++----- 9 files changed, 99 insertions(+), 230 deletions(-) diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java index a18ac3250dc..52f908c9e98 100644 --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -914,11 +914,10 @@ public final class String return ba; } - int blen = (coder == LATIN1) ? ae.encodeFromLatin1(val, 0, len, ba) - : ae.encodeFromUTF16(val, 0, len, ba); - if (blen != -1) { - return trimArray(ba, blen); - } + int blen = coder == LATIN1 + ? ae.encodeFromLatin1(val, 0, len, ba, 0) + : ae.encodeFromUTF16(val, 0, len, ba, 0); + return trimArray(ba, blen); } byte[] ba = new byte[en]; diff --git a/src/java.base/share/classes/sun/nio/cs/ArrayEncoder.java b/src/java.base/share/classes/sun/nio/cs/ArrayEncoder.java index b4ced428b33..16a6d5df003 100644 --- a/src/java.base/share/classes/sun/nio/cs/ArrayEncoder.java +++ b/src/java.base/share/classes/sun/nio/cs/ArrayEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -25,25 +25,17 @@ package sun.nio.cs; -/* - * FastPath char[]/byte[] -> byte[] encoder, REPLACE on malformed input or - * unmappable input. +/** + * Fast-path for {@code byte[]}-to-{@code byte[]} encoding, + * {@link java.nio.charset.CodingErrorAction#REPLACE REPLACE} on malformed + * input, or unmappable input. */ - public interface ArrayEncoder { - // is only used by j.u.zip.ZipCoder for utf8 - int encode(char[] src, int off, int len, byte[] dst); + int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst, int dp); - default int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst) { - return -1; - } + int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst, int dp); - default int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { - return -1; - } + boolean isASCIICompatible(); - default boolean isASCIICompatible() { - return false; - } } diff --git a/src/java.base/share/classes/sun/nio/cs/CESU_8.java b/src/java.base/share/classes/sun/nio/cs/CESU_8.java index 9b907bcbc65..409b375ec88 100644 --- a/src/java.base/share/classes/sun/nio/cs/CESU_8.java +++ b/src/java.base/share/classes/sun/nio/cs/CESU_8.java @@ -394,8 +394,7 @@ class CESU_8 extends Unicode } } - private static class Encoder extends CharsetEncoder - implements ArrayEncoder { + private static class Encoder extends CharsetEncoder { private Encoder(Charset cs) { super(cs, 1.1f, 3.0f); @@ -544,48 +543,6 @@ class CESU_8 extends Unicode return encodeBufferLoop(src, dst); } - // returns -1 if there is malformed char(s) and the - // "action" for malformed input is not REPLACE. - public int encode(char[] sa, int sp, int len, byte[] da) { - int sl = sp + len; - int dp = 0; - - // Handle ASCII-only prefix - int n = JLA.encodeASCII(sa, sp, da, dp, Math.min(len, da.length)); - sp += n; - dp += n; - - while (sp < sl) { - char c = sa[sp++]; - if (c < 0x80) { - // Have at most seven bits - da[dp++] = (byte)c; - } else if (c < 0x800) { - // 2 bytes, 11 bits - da[dp++] = (byte)(0xc0 | (c >> 6)); - da[dp++] = (byte)(0x80 | (c & 0x3f)); - } else if (Character.isSurrogate(c)) { - if (sgp == null) - sgp = new Surrogate.Parser(); - int uc = sgp.parse(c, sa, sp - 1, sl); - if (uc < 0) { - if (malformedInputAction() != CodingErrorAction.REPLACE) - return -1; - da[dp++] = replacement()[0]; - } else { - to3Bytes(da, dp, Character.highSurrogate(uc)); - dp += 3; - to3Bytes(da, dp, Character.lowSurrogate(uc)); - dp += 3; - sp++; // 2 chars - } - } else { - // 3 bytes, 16 bits - to3Bytes(da, dp, c); - dp += 3; - } - } - return dp; - } } + } diff --git a/src/java.base/share/classes/sun/nio/cs/DoubleByte.java b/src/java.base/share/classes/sun/nio/cs/DoubleByte.java index 165e1e21c0f..0969669a35b 100644 --- a/src/java.base/share/classes/sun/nio/cs/DoubleByte.java +++ b/src/java.base/share/classes/sun/nio/cs/DoubleByte.java @@ -682,40 +682,7 @@ public class DoubleByte { } @Override - public int encode(char[] src, int sp, int len, byte[] dst) { - int dp = 0; - int sl = sp + len; - if (isASCIICompatible) { - int n = JLA.encodeASCII(src, sp, dst, dp, len); - sp += n; - dp += n; - } - while (sp < sl) { - char c = src[sp++]; - int bb = encodeChar(c); - if (bb == UNMAPPABLE_ENCODING) { - if (Character.isHighSurrogate(c) && sp < sl && - Character.isLowSurrogate(src[sp])) { - sp++; - } - dst[dp++] = repl[0]; - if (repl.length > 1) - dst[dp++] = repl[1]; - continue; - } //else - if (bb > MAX_SINGLEBYTE) { // DoubleByte - dst[dp++] = (byte)(bb >> 8); - dst[dp++] = (byte)bb; - } else { // SingleByte - dst[dp++] = (byte)bb; - } - } - return dp; - } - - @Override - public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + len; while (sp < sl) { char c = (char)(src[sp++] & 0xff); @@ -740,8 +707,7 @@ public class DoubleByte { } @Override - public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + len; while (sp < sl) { char c = StringUTF16.getChar(src, sp++); @@ -1000,49 +966,7 @@ public class DoubleByte { } @Override - public int encode(char[] src, int sp, int len, byte[] dst) { - int dp = 0; - int sl = sp + len; - while (sp < sl) { - char c = src[sp++]; - int bb = encodeChar(c); - - if (bb == UNMAPPABLE_ENCODING) { - if (Character.isHighSurrogate(c) && sp < sl && - Character.isLowSurrogate(src[sp])) { - sp++; - } - dst[dp++] = repl[0]; - if (repl.length > 1) - dst[dp++] = repl[1]; - continue; - } //else - if (bb > MAX_SINGLEBYTE) { // DoubleByte - if (currentState == SBCS) { - currentState = DBCS; - dst[dp++] = SO; - } - dst[dp++] = (byte)(bb >> 8); - dst[dp++] = (byte)bb; - } else { // SingleByte - if (currentState == DBCS) { - currentState = SBCS; - dst[dp++] = SI; - } - dst[dp++] = (byte)bb; - } - } - - if (currentState == DBCS) { - currentState = SBCS; - dst[dp++] = SI; - } - return dp; - } - - @Override - public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + len; while (sp < sl) { char c = (char)(src[sp++] & 0xff); @@ -1077,8 +1001,7 @@ public class DoubleByte { } @Override - public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + len; while (sp < sl) { char c = StringUTF16.getChar(src, sp++); diff --git a/src/java.base/share/classes/sun/nio/cs/HKSCS.java b/src/java.base/share/classes/sun/nio/cs/HKSCS.java index cfe9f879c04..f96fbf6be29 100644 --- a/src/java.base/share/classes/sun/nio/cs/HKSCS.java +++ b/src/java.base/share/classes/sun/nio/cs/HKSCS.java @@ -352,37 +352,9 @@ public class HKSCS { return encodeBufferLoop(src, dst); } - public int encode(char[] src, int sp, int len, byte[] dst) { - int dp = 0; + @Override + public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + len; - while (sp < sl) { - char c = src[sp++]; - int bb = encodeChar(c); - if (bb == UNMAPPABLE_ENCODING) { - if (!Character.isHighSurrogate(c) || sp == sl || - !Character.isLowSurrogate(src[sp]) || - (bb = encodeSupp(Character.toCodePoint(c, src[sp++]))) - == UNMAPPABLE_ENCODING) { - dst[dp++] = repl[0]; - if (repl.length > 1) - dst[dp++] = repl[1]; - continue; - } - } - if (bb > MAX_SINGLEBYTE) { // DoubleByte - dst[dp++] = (byte)(bb >> 8); - dst[dp++] = (byte)bb; - } else { // SingleByte - dst[dp++] = (byte)bb; - } - } - return dp; - } - - public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; - int sl = sp + len; - int dl = dst.length; while (sp < sl) { char c = StringUTF16.getChar(src, sp++); int bb = encodeChar(c); diff --git a/src/java.base/share/classes/sun/nio/cs/SingleByte.java b/src/java.base/share/classes/sun/nio/cs/SingleByte.java index 8efa6b295ff..a5bf06cb251 100644 --- a/src/java.base/share/classes/sun/nio/cs/SingleByte.java +++ b/src/java.base/share/classes/sun/nio/cs/SingleByte.java @@ -290,32 +290,8 @@ public class SingleByte repl = newReplacement[0]; } - public int encode(char[] src, int sp, int len, byte[] dst) { - int dp = 0; - int sl = sp + Math.min(len, dst.length); - while (sp < sl) { - char c = src[sp++]; - int b = encode(c); - if (b != UNMAPPABLE_ENCODING) { - dst[dp++] = (byte)b; - continue; - } - if (Character.isHighSurrogate(c) && sp < sl && - Character.isLowSurrogate(src[sp])) { - if (len > dst.length) { - sl++; - len--; - } - sp++; - } - dst[dp++] = repl; - } - return dp; - } - @Override - public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromLatin1(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + Math.min(len, dst.length); while (sp < sl) { char c = (char)(src[sp++] & 0xff); @@ -330,8 +306,7 @@ public class SingleByte } @Override - public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst) { - int dp = 0; + public int encodeFromUTF16(byte[] src, int sp, int len, byte[] dst, int dp) { int sl = sp + Math.min(len, dst.length); while (sp < sl) { char c = StringUTF16.getChar(src, sp++); diff --git a/test/jdk/sun/nio/cs/TestEncoderReplaceLatin1.java b/test/jdk/sun/nio/cs/TestEncoderReplaceLatin1.java index 401f3650734..972bc521bb6 100644 --- a/test/jdk/sun/nio/cs/TestEncoderReplaceLatin1.java +++ b/test/jdk/sun/nio/cs/TestEncoderReplaceLatin1.java @@ -192,7 +192,7 @@ class TestEncoderReplaceLatin1 { /** * Verifies {@linkplain CoderResult#isUnmappable() unmappable} character * {@linkplain CodingErrorAction#REPLACE replacement} using {@link - * ArrayEncoder#encodeFromLatin1(byte[], int, int, byte[]) + * ArrayEncoder#encodeFromLatin1(byte[], int, int, byte[], int) * ArrayEncoder::encodeFromLatin1}. */ private static void testArrayEncoderLatin1Replace(CharsetEncoder encoder, char unmappable, byte[] replacement) { @@ -202,7 +202,7 @@ class TestEncoderReplaceLatin1 { } byte[] sa = {(byte) unmappable}; byte[] da = new byte[replacement.length]; - int dp = arrayEncoder.encodeFromLatin1(sa, 0, 1, da); + int dp = arrayEncoder.encodeFromLatin1(sa, 0, 1, da, 0); assertTrue(dp == replacement.length && Arrays.equals(da, replacement), () -> { Object context = Map.of( "dp", dp, diff --git a/test/jdk/sun/nio/cs/TestEncoderReplaceUTF16.java b/test/jdk/sun/nio/cs/TestEncoderReplaceUTF16.java index a93dac16ab6..6ab49d91c6a 100644 --- a/test/jdk/sun/nio/cs/TestEncoderReplaceUTF16.java +++ b/test/jdk/sun/nio/cs/TestEncoderReplaceUTF16.java @@ -182,7 +182,7 @@ class TestEncoderReplaceUTF16 { /** * Verifies {@linkplain CoderResult#isUnmappable() unmappable} character * {@linkplain CodingErrorAction#REPLACE replacement} using {@link - * ArrayEncoder#encodeFromUTF16(byte[], int, int, byte[]) + * ArrayEncoder#encodeFromUTF16(byte[], int, int, byte[], int) * ArrayEncoder::encodeFromUTF16}. */ private static void testArrayEncoderUTF16Replace(CharsetEncoder encoder, byte[] unmappableUTF16Bytes, byte[] replacement) { @@ -191,7 +191,7 @@ class TestEncoderReplaceUTF16 { return; } byte[] da = new byte[replacement.length]; - int dp = arrayEncoder.encodeFromUTF16(unmappableUTF16Bytes, 0, unmappableUTF16Bytes.length >>> 1, da); + int dp = arrayEncoder.encodeFromUTF16(unmappableUTF16Bytes, 0, unmappableUTF16Bytes.length >>> 1, da, 0); assertTrue(dp == replacement.length && Arrays.equals(da, replacement), () -> { Object context = Map.of( "dp", dp, diff --git a/test/jdk/sun/nio/cs/TestStringCoding.java b/test/jdk/sun/nio/cs/TestStringCoding.java index d27efc35ada..d708ef180a2 100644 --- a/test/jdk/sun/nio/cs/TestStringCoding.java +++ b/test/jdk/sun/nio/cs/TestStringCoding.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* @test * @bug 6636323 6636319 7040220 7096080 7183053 8080248 8054307 * @summary Test if StringCoding and NIO result have the same de/encoding result + * @library /test/lib * @modules java.base/sun.nio.cs * @run main/othervm/timeout=2000 TestStringCoding * @key randomness @@ -32,6 +33,10 @@ import java.util.*; import java.nio.*; import java.nio.charset.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static jdk.test.lib.Asserts.assertEquals; public class TestStringCoding { public static void main(String[] args) throws Throwable { @@ -195,29 +200,70 @@ public class TestStringCoding { if (cs.name().equals("UTF-8") || // utf8 handles surrogates cs.name().equals("CESU-8")) // utf8 handles surrogates return; - enc.replaceWith(new byte[] { (byte)'A'}); - sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc; - String str = "ab\uD800\uDC00\uD800\uDC00cd"; - byte[] ba = new byte[str.length() - 2]; - int n = cae.encode(str.toCharArray(), 0, str.length(), ba); - if (n != 6 || !"abAAcd".equals(new String(ba, cs.name()))) - throw new RuntimeException("encode1(surrogates) failed -> " - + cs.name()); + // Configure the replacement sequence + enc.replaceWith(new byte[]{(byte) 'A'}); + + // Test `String::new(byte[], Charset)` with surrogate-pair + { + var srcStr = "ab\uD800\uDC00\uD800\uDC00cd"; + assertEquals(8, srcStr.length()); + var srcBuf = CharBuffer.wrap(srcStr.toCharArray(), 0, 8); + var dstBuf = ByteBuffer.allocate(6); + var cr = enc.encode(srcBuf, dstBuf, true); + if (cr.isError()) { + cr.throwException(); + } + var dstArr = dstBuf.array(); + assertEquals( + 6, dstBuf.position(), + "Was expecting 6 items, found: " + Map.of( + "position", dstBuf.position(), + "array", prettyPrintBytes(dstArr))); + var dstStr = new String(dstArr, cs); + assertEquals("abAAcd", dstStr); + } + + // Test `String::new(byte[], int, int, Charset)` with surrogate-pair + { + var srcStr = "ab\uD800\uDC00\uD800\uDC00cd"; + assertEquals(8, srcStr.length()); + var srcBuf = CharBuffer.wrap(srcStr.toCharArray(), 0, 8); + var dstBuf = ByteBuffer.allocate(8); + var cr = enc.encode(srcBuf, dstBuf, true); + if (cr.isError()) { + cr.throwException(); + } + var dstArr = dstBuf.array(); + assertEquals( + 6, dstBuf.position(), + "Was expecting 6 items, found: " + Map.of( + "position", dstBuf.position(), + "array", prettyPrintBytes(dstArr))); + var dstStr = new String(dstArr, 0, 6, cs); + assertEquals("abAAcd", dstStr); + } + + // Test `String::new(byte[], int, int, Charset)` with a dangling + // high- and low-surrogate + { + var srcStr = "ab\uD800B\uDC00Bcd"; + var srcBuf = CharBuffer.wrap(srcStr.toCharArray(), 0, 8); + var dstBuf = ByteBuffer.allocate(8); + var cr = enc.encode(srcBuf, dstBuf, true); + if (cr.isError()) { + cr.throwException(); + } + var dstArr = dstBuf.array(); + assertEquals( + 8, dstBuf.position(), + "Was expecting 8 items, found: " + Map.of( + "position", dstBuf.position(), + "array", prettyPrintBytes(dstArr))); + var dstStr = new String(dstArr, 0, 8, cs); + assertEquals("abABABcd", dstStr); + } - ba = new byte[str.length()]; - n = cae.encode(str.toCharArray(), 0, str.length(), ba); - if (n != 6 || !"abAAcd".equals(new String(ba, 0, n, - cs.name()))) - throw new RuntimeException("encode2(surrogates) failed -> " - + cs.name()); - str = "ab\uD800B\uDC00Bcd"; - ba = new byte[str.length()]; - n = cae.encode(str.toCharArray(), 0, str.length(), ba); - if (n != 8 || !"abABABcd".equals(new String(ba, 0, n, - cs.name()))) - throw new RuntimeException("encode3(surrogates) failed -> " - + cs.name()); /* sun.nio.cs.ArrayDeEncoder works on the assumption that the invoker (StringCoder) allocates enough output buf, utf8 and double-byte coder does not check the output buffer limit. @@ -242,4 +288,9 @@ public class TestStringCoding { } } } + + private static String prettyPrintBytes(byte[] bs) { + return "[" + HexFormat.ofDelimiter(", ").withPrefix("0x").formatHex(bs) + "]"; + } + } From d8515f084dcd537ccad98f9b15f257baeffae222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Wed, 29 Oct 2025 09:58:28 +0000 Subject: [PATCH 343/561] 8369983: Remove expired ZGC flags for JDK 26 Reviewed-by: ayang, aboldtch --- src/hotspot/share/runtime/arguments.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 0d92f22af79..abd7a442651 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -545,8 +545,6 @@ static SpecialFlag const special_jvm_flags[] = { { "UseOprofile", JDK_Version::jdk(25), JDK_Version::jdk(26), JDK_Version::jdk(27) }, #endif { "MetaspaceReclaimPolicy", JDK_Version::undefined(), JDK_Version::jdk(21), JDK_Version::undefined() }, - { "ZGenerational", JDK_Version::jdk(23), JDK_Version::jdk(24), JDK_Version::undefined() }, - { "ZMarkStackSpaceLimit", JDK_Version::undefined(), JDK_Version::jdk(25), JDK_Version::undefined() }, { "G1UpdateBufferSize", JDK_Version::undefined(), JDK_Version::jdk(26), JDK_Version::jdk(27) }, { "ShenandoahPacing", JDK_Version::jdk(25), JDK_Version::jdk(26), JDK_Version::jdk(27) }, #if defined(AARCH64) From 05ef8f4611fb9908f40ed8944da3429acdf82ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Casta=C3=B1eda=20Lozano?= Date: Wed, 29 Oct 2025 10:49:30 +0000 Subject: [PATCH 344/561] 8370853: IGV: SEGV in IdealGraphPrinter::print after JDK-8370569 Reviewed-by: dfenacci, aseoane, thartmann --- src/hotspot/share/opto/idealGraphPrinter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/share/opto/idealGraphPrinter.cpp b/src/hotspot/share/opto/idealGraphPrinter.cpp index de0fcbc8f31..9a35691f7ff 100644 --- a/src/hotspot/share/opto/idealGraphPrinter.cpp +++ b/src/hotspot/share/opto/idealGraphPrinter.cpp @@ -161,6 +161,7 @@ void IdealGraphPrinter::init(const char* file_name, bool use_multiple_files, boo _current_method = nullptr; _network_stream = nullptr; _append = append; + _parse = nullptr; if (file_name != nullptr) { init_file_stream(file_name, use_multiple_files); From 78f1c449da8582c880c7ffcb1e93e054560bcd5a Mon Sep 17 00:00:00 2001 From: Maheshkumar Bollapragada Date: Wed, 29 Oct 2025 10:58:09 +0000 Subject: [PATCH 345/561] 8370678: Update the Problemlisting for java/awt/Mixing/AWT_Mixing/OpaqueOverlapping.java Reviewed-by: honkar --- test/jdk/ProblemList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 60d59d4e444..d1644a56100 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -152,7 +152,7 @@ java/awt/event/InputEvent/EventWhenTest/EventWhenTest.java 8168646 generic-all java/awt/List/KeyEventsTest/KeyEventsTest.java 8201307 linux-all java/awt/Paint/ListRepaint.java 8201307 linux-all java/awt/Mixing/AWT_Mixing/HierarchyBoundsListenerMixingTest.java 8049405 macosx-all -java/awt/Mixing/AWT_Mixing/OpaqueOverlapping.java 8294264 windows-x64 +java/awt/Mixing/AWT_Mixing/OpaqueOverlapping.java 8370584 windows-x64 java/awt/Mixing/AWT_Mixing/OpaqueOverlappingChoice.java 8048171 generic-all java/awt/Mixing/AWT_Mixing/JMenuBarOverlapping.java 8159451 linux-all,windows-all,macosx-all java/awt/Mixing/AWT_Mixing/JSplitPaneOverlapping.java 6986109 generic-all From 3cbcda5ff3d86d65554a470571c5d72047e8d7f6 Mon Sep 17 00:00:00 2001 From: Matthew Donovan Date: Wed, 29 Oct 2025 11:05:06 +0000 Subject: [PATCH 346/561] 8359978: Test javax/net/ssl/SSLSocket/Tls13PacketSize.java failed again with java.net.SocketException: An established connection was aborted by the software in your host machine Reviewed-by: jnimeh, djelinski --- test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java b/test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java index 0e34f4865ab..16e009ed589 100644 --- a/test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java +++ b/test/jdk/javax/net/ssl/SSLSocket/Tls13PacketSize.java @@ -107,5 +107,10 @@ public class Tls13PacketSize extends SSLSocketTemplate { throw new Exception( "Server record plaintext exceeds 2^14 octets: " + extra); } + + int drained = 1; + while (drained < appData.length) { + drained += sslIS.read(appData, drained, appData.length - drained); + } } } From 4a0200caf98ecb9bd1e6fe2670e79b36616a45fe Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Wed, 29 Oct 2025 11:19:53 +0000 Subject: [PATCH 347/561] 8367561: Getting some "header" property from a file:// URL causes a file descriptor leak Reviewed-by: dfuchs, vyazici --- .../classes/sun/net/www/URLConnection.java | 26 ++- .../www/protocol/file/FileURLConnection.java | 123 +++++++++--- .../file/FileURLConnStreamLeakTest.java | 181 ++++++++++++++++++ .../www/protocol/file/GetInputStreamTest.java | 150 +++++++++++++++ 4 files changed, 443 insertions(+), 37 deletions(-) create mode 100644 test/jdk/sun/net/www/protocol/file/FileURLConnStreamLeakTest.java create mode 100644 test/jdk/sun/net/www/protocol/file/GetInputStreamTest.java diff --git a/src/java.base/share/classes/sun/net/www/URLConnection.java b/src/java.base/share/classes/sun/net/www/URLConnection.java index 66005ab9b2a..becbf88da73 100644 --- a/src/java.base/share/classes/sun/net/www/URLConnection.java +++ b/src/java.base/share/classes/sun/net/www/URLConnection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -101,9 +101,21 @@ public abstract class URLConnection extends java.net.URLConnection { return Collections.emptyMap(); } + /** + * This method is called whenever the headers related methods are called on the + * {@code URLConnection}. This method does any necessary checks and initializations + * to make sure that the headers can be served. If this {@code URLConnection} cannot + * serve the headers, then this method throws an {@code IOException}. + * + * @throws IOException if the headers cannot be served + */ + protected void ensureCanServeHeaders() throws IOException { + getInputStream(); + } + public String getHeaderField(String name) { try { - getInputStream(); + ensureCanServeHeaders(); } catch (Exception e) { return null; } @@ -111,13 +123,13 @@ public abstract class URLConnection extends java.net.URLConnection { } - Map> headerFields; + private Map> headerFields; @Override public Map> getHeaderFields() { if (headerFields == null) { try { - getInputStream(); + ensureCanServeHeaders(); if (properties == null) { headerFields = super.getHeaderFields(); } else { @@ -137,7 +149,7 @@ public abstract class URLConnection extends java.net.URLConnection { */ public String getHeaderFieldKey(int n) { try { - getInputStream(); + ensureCanServeHeaders(); } catch (Exception e) { return null; } @@ -152,7 +164,7 @@ public abstract class URLConnection extends java.net.URLConnection { */ public String getHeaderField(int n) { try { - getInputStream(); + ensureCanServeHeaders(); } catch (Exception e) { return null; } @@ -221,7 +233,7 @@ public abstract class URLConnection extends java.net.URLConnection { */ public int getContentLength() { try { - getInputStream(); + ensureCanServeHeaders(); } catch (Exception e) { return -1; } diff --git a/src/java.base/share/classes/sun/net/www/protocol/file/FileURLConnection.java b/src/java.base/share/classes/sun/net/www/protocol/file/FileURLConnection.java index fc947f8977f..8330c2b9b80 100644 --- a/src/java.base/share/classes/sun/net/www/protocol/file/FileURLConnection.java +++ b/src/java.base/share/classes/sun/net/www/protocol/file/FileURLConnection.java @@ -25,15 +25,30 @@ package sun.net.www.protocol.file; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FilePermission; +import java.io.IOException; +import java.io.InputStream; +import java.net.FileNameMap; import java.net.MalformedURLException; import java.net.URL; -import java.net.FileNameMap; -import java.io.*; -import java.text.Collator; import java.security.Permission; -import sun.net.www.*; -import java.util.*; +import java.text.Collator; import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; + +import sun.net.www.MessageHeader; +import sun.net.www.ParseUtil; +import sun.net.www.URLConnection; /** * Open a file input stream given a URL. @@ -67,25 +82,49 @@ public class FileURLConnection extends URLConnection { this.file = file; } - /* + /** + * If already connected, then this method is a no-op. + * If not already connected, then this method does + * readability checks for the File. + *

          + * If the File is a directory then the readability check + * is done by verifying that File.list() does not return + * null. On the other hand, if the File is not a directory, + * then this method constructs a temporary FileInputStream + * for the File and lets the FileInputStream's constructor + * implementation do the necessary readability checks. + * That temporary FileInputStream is closed before returning + * from this method. + *

          + * In either case, if the readability checks fail, then + * an IOException is thrown from this method and the + * FileURLConnection stays unconnected. + *

          + * A normal return from this method implies that the + * FileURLConnection is connected and the readability + * checks have passed for the File. + *

          * Note: the semantics of FileURLConnection object is that the * results of the various URLConnection calls, such as * getContentType, getInputStream or getContentLength reflect * whatever was true when connect was called. */ + @Override public void connect() throws IOException { if (!connected) { - isDirectory = file.isDirectory(); + // verify readability of the directory or the regular file if (isDirectory) { String[] fileList = file.list(); - if (fileList == null) + if (fileList == null) { throw new FileNotFoundException(file.getPath() + " exists, but is not accessible"); + } directoryListing = Arrays.asList(fileList); } else { - is = new BufferedInputStream(new FileInputStream(file.getPath())); + // let FileInputStream constructor do the necessary readability checks + // and propagate any failures + new FileInputStream(file.getPath()).close(); } - connected = true; } } @@ -112,9 +151,9 @@ public class FileURLConnection extends URLConnection { FileNameMap map = java.net.URLConnection.getFileNameMap(); String contentType = map.getContentTypeFor(file.getPath()); if (contentType != null) { - properties.add(CONTENT_TYPE, contentType); + properties.set(CONTENT_TYPE, contentType); } - properties.add(CONTENT_LENGTH, Long.toString(length)); + properties.set(CONTENT_LENGTH, Long.toString(length)); /* * Format the last-modified field into the preferred @@ -126,30 +165,34 @@ public class FileURLConnection extends URLConnection { SimpleDateFormat fo = new SimpleDateFormat ("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US); fo.setTimeZone(TimeZone.getTimeZone("GMT")); - properties.add(LAST_MODIFIED, fo.format(date)); + properties.set(LAST_MODIFIED, fo.format(date)); } } else { - properties.add(CONTENT_TYPE, TEXT_PLAIN); + properties.set(CONTENT_TYPE, TEXT_PLAIN); } initializedHeaders = true; } } - public Map> getHeaderFields() { + @Override + public Map> getHeaderFields() { initializeHeaders(); return super.getHeaderFields(); } + @Override public String getHeaderField(String name) { initializeHeaders(); return super.getHeaderField(name); } + @Override public String getHeaderField(int n) { initializeHeaders(); return super.getHeaderField(n); } + @Override public int getContentLength() { initializeHeaders(); if (length > Integer.MAX_VALUE) @@ -157,54 +200,74 @@ public class FileURLConnection extends URLConnection { return (int) length; } + @Override public long getContentLengthLong() { initializeHeaders(); return length; } + @Override public String getHeaderFieldKey(int n) { initializeHeaders(); return super.getHeaderFieldKey(n); } + @Override public MessageHeader getProperties() { initializeHeaders(); return super.getProperties(); } + @Override public long getLastModified() { initializeHeaders(); return lastModified; } + @Override public synchronized InputStream getInputStream() throws IOException { connect(); + // connect() does the necessary readability checks and is expected to + // throw IOException if any of those checks fail. A normal completion of connect() + // must mean that connect succeeded. + assert connected : "not connected"; - if (is == null) { - if (isDirectory) { + // a FileURLConnection only ever creates and provides a single InputStream + if (is != null) { + return is; + } - if (directoryListing == null) { - throw new FileNotFoundException(file.getPath()); - } + if (isDirectory) { + // a successful connect() implies the directoryListing is non-null + // if the file is a directory + assert directoryListing != null : "missing directory listing"; - directoryListing.sort(Collator.getInstance()); + directoryListing.sort(Collator.getInstance()); - StringBuilder sb = new StringBuilder(); - for (String fileName : directoryListing) { - sb.append(fileName); - sb.append("\n"); - } - // Put it into a (default) locale-specific byte-stream. - is = new ByteArrayInputStream(sb.toString().getBytes()); - } else { - throw new FileNotFoundException(file.getPath()); + StringBuilder sb = new StringBuilder(); + for (String fileName : directoryListing) { + sb.append(fileName); + sb.append("\n"); } + // Put it into a (default) locale-specific byte-stream. + is = new ByteArrayInputStream(sb.toString().getBytes()); + } else { + is = new BufferedInputStream(new FileInputStream(file.getPath())); } return is; } + @Override + protected synchronized void ensureCanServeHeaders() throws IOException { + // connect() (if not already connected) does the readability checks + // and throws an IOException if those checks fail. A successful + // completion from connect() implies the File is readable. + connect(); + } + + Permission permission; /* since getOutputStream isn't supported, only read permission is diff --git a/test/jdk/sun/net/www/protocol/file/FileURLConnStreamLeakTest.java b/test/jdk/sun/net/www/protocol/file/FileURLConnStreamLeakTest.java new file mode 100644 index 00000000000..3cf7755107c --- /dev/null +++ b/test/jdk/sun/net/www/protocol/file/FileURLConnStreamLeakTest.java @@ -0,0 +1,181 @@ +/* + * 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. + * + * 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.net.URLConnection; +import java.net.UnknownServiceException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/* + * @test + * @bug 8367561 + * @summary verify that the implementation of URLConnection APIs for "file:" + * protocol does not leak InputStream(s) + * @run junit/othervm ${test.main.class} + */ +class FileURLConnStreamLeakTest { + + private static final String FILE_URLCONNECTION_CLASSNAME = "sun.net.www.protocol.file.FileURLConnection"; + + private Path testFile; + // FileInputStream has a Cleaner which closes its underlying file descriptor. + // Here we keep reference to the URLConnection for the duration of each test method. + // This ensures that any FileInputStream this URLConnection may be retaining, won't be GCed + // until after the test method has checked for file descriptor leaks. + private URLConnection conn; + + @BeforeEach + void beforeEach() throws Exception { + final Path file = Files.createTempFile(Path.of("."), "8367561-", ".txt"); + Files.writeString(file, String.valueOf(System.currentTimeMillis())); + this.testFile = file; + this.conn = this.testFile.toUri().toURL().openConnection(); + assertNotNull(this.conn, "URLConnection for " + this.testFile + " is null"); + assertEquals(FILE_URLCONNECTION_CLASSNAME, conn.getClass().getName(), + "unexpected URLConnection type"); + } + + @AfterEach + void afterEach() throws Exception { + this.conn = null; + // the file should already have been deleted by the test method + Files.deleteIfExists(this.testFile); + } + + static List> urlConnOperations() { + return List.of( + URLConnection::getContentEncoding, + URLConnection::getContentLength, + URLConnection::getContentLengthLong, + URLConnection::getContentType, + URLConnection::getDate, + URLConnection::getExpiration, + URLConnection::getLastModified + ); + } + + @MethodSource("urlConnOperations") + @ParameterizedTest + void testURLConnOps(final Consumer connConsumer) throws IOException { + connConsumer.accept(this.conn); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderField() throws Exception { + final var _ = this.conn.getHeaderField(0); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFieldString() throws Exception { + final String val = this.conn.getHeaderField("foo"); + assertNull(val, "unexpected header field value: " + val); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFieldDate() throws Exception { + final var _ = this.conn.getHeaderFieldDate("bar", 42); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFieldInt() throws Exception { + final int val = this.conn.getHeaderFieldInt("hello", 42); + assertEquals(42, val, "unexpected header value"); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFieldKey() throws Exception { + final String val = this.conn.getHeaderFieldKey(42); + assertNull(val, "unexpected header value: " + val); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFieldLong() throws Exception { + final long val = this.conn.getHeaderFieldLong("foo", 42); + assertEquals(42, val, "unexpected header value"); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetHeaderFields() throws Exception { + final Map> headers = this.conn.getHeaderFields(); + assertNotNull(headers, "null headers"); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetInputStream() throws Exception { + try (final InputStream is = this.conn.getInputStream()) { + assertNotNull(is, "input stream is null"); + } + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } + + @Test + void testGetOutputStream() throws Exception { + // FileURLConnection only supports reading + assertThrows(UnknownServiceException.class, this.conn::getOutputStream); + // verify that the URLConnection isn't holding on to any file descriptors + // of this test file. + Files.delete(this.testFile); // must not fail + } +} + diff --git a/test/jdk/sun/net/www/protocol/file/GetInputStreamTest.java b/test/jdk/sun/net/www/protocol/file/GetInputStreamTest.java new file mode 100644 index 00000000000..25c1ee2e965 --- /dev/null +++ b/test/jdk/sun/net/www/protocol/file/GetInputStreamTest.java @@ -0,0 +1,150 @@ +/* + * 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. + * + * 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. + */ + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.text.Collator; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/* + * @test + * @summary verify the behaviour of URLConnection.getInputStream() + * for "file:" protocol + * @run junit ${test.main.class} + */ +class GetInputStreamTest { + + /** + * Calls URLConnection.getInputStream() on the URLConnection for a directory and verifies + * the contents returned by the InputStream. + */ + @Test + void testDirInputStream() throws Exception { + final Path dir = Files.createTempDirectory(Path.of("."), "fileurlconn-"); + final int numEntries = 3; + // write some files into that directory + for (int i = 1; i <= numEntries; i++) { + Files.writeString(dir.resolve(i + ".txt"), "" + i); + } + final String expectedDirListing = getDirListing(dir.toFile(), numEntries); + final URLConnection conn = dir.toUri().toURL().openConnection(); + assertNotNull(conn, "URLConnection is null for " + dir); + // call getInputStream() and verify that the streamed directory + // listing is the expected one + try (final InputStream is = conn.getInputStream()) { + assertNotNull(is, "InputStream is null for " + conn); + final String actual = new BufferedReader(new InputStreamReader(is)) + .readAllAsString(); + assertEquals(expectedDirListing, actual, + "unexpected content from input stream for dir " + dir); + } + // now that we successfully obtained the InputStream, read its content + // and closed it, call getInputStream() again and verify that it can no longer + // be used to read any more content. + try (final InputStream is = conn.getInputStream()) { + assertNotNull(is, "input stream is null for " + conn); + final int readByte = is.read(); + assertEquals(-1, readByte, "expected to have read EOF from the stream"); + } + } + + /** + * Calls URLConnection.getInputStream() on the URLConnection for a regular file and verifies + * the contents returned by the InputStream. + */ + @Test + void testRegularFileInputStream() throws Exception { + final Path dir = Files.createTempDirectory(Path.of("."), "fileurlconn-"); + final Path regularFile = dir.resolve("foo.txt"); + final String expectedContent = "bar"; + Files.writeString(regularFile, expectedContent); + + final URLConnection conn = regularFile.toUri().toURL().openConnection(); + assertNotNull(conn, "URLConnection is null for " + regularFile); + // get the input stream and verify the streamed content + try (final InputStream is = conn.getInputStream()) { + assertNotNull(is, "input stream is null for " + conn); + final String actual = new BufferedReader(new InputStreamReader(is)) + .readAllAsString(); + assertEquals(expectedContent, actual, + "unexpected content from input stream for file " + regularFile); + } + // now that we successfully obtained the InputStream, read its content + // and closed it, call getInputStream() again and verify that it can no longer + // be used to read any more content. + try (final InputStream is = conn.getInputStream()) { + assertNotNull(is, "input stream is null for " + conn); + // for regular files the FileURLConnection's InputStream throws a IOException + // when attempting to read after EOF + final IOException thrown = assertThrows(IOException.class, is::read); + final String exMessage = thrown.getMessage(); + assertEquals("Stream closed", exMessage, "unexpected exception message"); + } + } + + /** + * Verifies that URLConnection.getInputStream() for a non-existent file path + * throws FileNotFoundException. + */ + @Test + void testNonExistentFile() throws Exception { + final Path existentDir = Files.createTempDirectory(Path.of("."), "fileurlconn-"); + final Path nonExistent = existentDir.resolve("non-existent"); + final URLConnection conn = nonExistent.toUri().toURL().openConnection(); + assertNotNull(conn, "URLConnection is null for " + nonExistent); + final FileNotFoundException thrown = assertThrows(FileNotFoundException.class, + conn::getInputStream); + final String exMessage = thrown.getMessage(); + assertTrue(exMessage != null && exMessage.contains(nonExistent.getFileName().toString()), + "unexpected exception message: " + exMessage); + } + + private static String getDirListing(final File dir, final int numExpectedEntries) { + final List dirListing = Arrays.asList(dir.list()); + dirListing.sort(Collator.getInstance()); // same as what FileURLConnection does + + assertEquals(numExpectedEntries, dirListing.size(), + dir + " - expected " + numExpectedEntries + " entries but found: " + dirListing); + + final StringBuilder sb = new StringBuilder(); + for (String fileName : dirListing) { + sb.append(fileName); + sb.append("\n"); + } + return sb.toString(); + } +} From 6964cede0269327d2f13e446e307d531282cdaf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Wed, 29 Oct 2025 12:47:18 +0000 Subject: [PATCH 348/561] 8369346: Remove default value of and deprecate the MaxRAM flag Reviewed-by: ayang, lkorinth --- .../cpu/aarch64/c1_globals_aarch64.hpp | 1 - .../cpu/aarch64/c2_globals_aarch64.hpp | 1 - src/hotspot/cpu/arm/c1_globals_arm.hpp | 1 - src/hotspot/cpu/arm/c2_globals_arm.hpp | 5 --- src/hotspot/cpu/ppc/c1_globals_ppc.hpp | 1 - src/hotspot/cpu/ppc/c2_globals_ppc.hpp | 1 - src/hotspot/cpu/riscv/c1_globals_riscv.hpp | 1 - src/hotspot/cpu/riscv/c2_globals_riscv.hpp | 1 - src/hotspot/cpu/s390/c1_globals_s390.hpp | 1 - src/hotspot/cpu/s390/c2_globals_s390.hpp | 1 - src/hotspot/cpu/x86/c1_globals_x86.hpp | 1 - src/hotspot/cpu/x86/c2_globals_x86.hpp | 6 --- src/hotspot/os/windows/os_windows.cpp | 5 --- .../share/compiler/compiler_globals_pd.hpp | 2 - src/hotspot/share/gc/shared/gc_globals.hpp | 5 ++- src/hotspot/share/runtime/arguments.cpp | 35 +++++------------ src/java.base/share/man/java.md | 38 +++++++++---------- 17 files changed, 32 insertions(+), 74 deletions(-) diff --git a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp index a8a2fa8b2ee..938a64dd399 100644 --- a/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_globals_aarch64.hpp @@ -53,7 +53,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K ); define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true ); -define_pd_global(uint64_t,MaxRAM, 1ULL*G); define_pd_global(bool, CICompileOSR, true ); #endif // !COMPILER2 define_pd_global(bool, UseTypeProfile, false); diff --git a/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp b/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp index 94a80dec3ea..a0dea3643a1 100644 --- a/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c2_globals_aarch64.hpp @@ -55,7 +55,6 @@ define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multip define_pd_global(size_t, CodeCacheExpansionSize, 64*K); // Ergonomics related flags -define_pd_global(uint64_t,MaxRAM, 128ULL*G); define_pd_global(intx, RegisterCostAreaRatio, 16000); // Peephole and CISC spilling both break the graph, and so makes the diff --git a/src/hotspot/cpu/arm/c1_globals_arm.hpp b/src/hotspot/cpu/arm/c1_globals_arm.hpp index 396f206975b..1fe5f1a23ee 100644 --- a/src/hotspot/cpu/arm/c1_globals_arm.hpp +++ b/src/hotspot/cpu/arm/c1_globals_arm.hpp @@ -54,7 +54,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K ); define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true); -define_pd_global(uint64_t, MaxRAM, 1ULL*G); define_pd_global(bool, CICompileOSR, true ); #endif // COMPILER2 define_pd_global(bool, UseTypeProfile, false); diff --git a/src/hotspot/cpu/arm/c2_globals_arm.hpp b/src/hotspot/cpu/arm/c2_globals_arm.hpp index d739e67360a..0849bd594f0 100644 --- a/src/hotspot/cpu/arm/c2_globals_arm.hpp +++ b/src/hotspot/cpu/arm/c2_globals_arm.hpp @@ -80,9 +80,6 @@ define_pd_global(size_t, NonProfiledCodeHeapSize, 21*M); define_pd_global(size_t, ProfiledCodeHeapSize, 22*M); define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M ); define_pd_global(size_t, CodeCacheExpansionSize, 64*K); - -// Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 128ULL*G); #else // InitialCodeCacheSize derived from specjbb2000 run. define_pd_global(size_t, InitialCodeCacheSize, 1536*K); // Integral multiple of CodeCacheExpansionSize @@ -91,8 +88,6 @@ define_pd_global(size_t, NonProfiledCodeHeapSize, 13*M); define_pd_global(size_t, ProfiledCodeHeapSize, 14*M); define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M ); define_pd_global(size_t, CodeCacheExpansionSize, 32*K); -// Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 4ULL*G); #endif define_pd_global(size_t, CodeCacheMinBlockLength, 6); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); diff --git a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp index ab014287250..77d9acd1cd1 100644 --- a/src/hotspot/cpu/ppc/c1_globals_ppc.hpp +++ b/src/hotspot/cpu/ppc/c1_globals_ppc.hpp @@ -53,7 +53,6 @@ define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true); define_pd_global(size_t, NewSizeThreadIncrease, 16*K); -define_pd_global(uint64_t, MaxRAM, 1ULL*G); define_pd_global(size_t, InitialCodeCacheSize, 160*K); #endif // !COMPILER2 diff --git a/src/hotspot/cpu/ppc/c2_globals_ppc.hpp b/src/hotspot/cpu/ppc/c2_globals_ppc.hpp index 706255d035a..d5a0ff10994 100644 --- a/src/hotspot/cpu/ppc/c2_globals_ppc.hpp +++ b/src/hotspot/cpu/ppc/c2_globals_ppc.hpp @@ -86,7 +86,6 @@ define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M ); define_pd_global(size_t, CodeCacheExpansionSize, 64*K); // Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 128ULL*G); define_pd_global(size_t, CodeCacheMinBlockLength, 6); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); diff --git a/src/hotspot/cpu/riscv/c1_globals_riscv.hpp b/src/hotspot/cpu/riscv/c1_globals_riscv.hpp index d64b3b66fa2..b15bb5c23c3 100644 --- a/src/hotspot/cpu/riscv/c1_globals_riscv.hpp +++ b/src/hotspot/cpu/riscv/c1_globals_riscv.hpp @@ -53,7 +53,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K ); define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true ); -define_pd_global(uint64_t, MaxRAM, 1ULL*G); define_pd_global(bool, CICompileOSR, true ); #endif // !COMPILER2 define_pd_global(bool, UseTypeProfile, false); diff --git a/src/hotspot/cpu/riscv/c2_globals_riscv.hpp b/src/hotspot/cpu/riscv/c2_globals_riscv.hpp index 372865fc291..648c24ee98b 100644 --- a/src/hotspot/cpu/riscv/c2_globals_riscv.hpp +++ b/src/hotspot/cpu/riscv/c2_globals_riscv.hpp @@ -55,7 +55,6 @@ define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multip define_pd_global(size_t, CodeCacheExpansionSize, 64*K); // Ergonomics related flags -define_pd_global(uint64_t,MaxRAM, 128ULL*G); define_pd_global(intx, RegisterCostAreaRatio, 16000); // Peephole and CISC spilling both break the graph, and so makes the diff --git a/src/hotspot/cpu/s390/c1_globals_s390.hpp b/src/hotspot/cpu/s390/c1_globals_s390.hpp index 1b2b698a737..25e46cd1509 100644 --- a/src/hotspot/cpu/s390/c1_globals_s390.hpp +++ b/src/hotspot/cpu/s390/c1_globals_s390.hpp @@ -53,7 +53,6 @@ define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true); define_pd_global(size_t, NewSizeThreadIncrease, 16*K); -define_pd_global(uint64_t, MaxRAM, 1ULL*G); define_pd_global(size_t, InitialCodeCacheSize, 160*K); #endif // !COMPILER2 diff --git a/src/hotspot/cpu/s390/c2_globals_s390.hpp b/src/hotspot/cpu/s390/c2_globals_s390.hpp index f1e757889b0..431a36cda07 100644 --- a/src/hotspot/cpu/s390/c2_globals_s390.hpp +++ b/src/hotspot/cpu/s390/c2_globals_s390.hpp @@ -74,7 +74,6 @@ define_pd_global(size_t, NonNMethodCodeHeapSize, 5*M); define_pd_global(size_t, CodeCacheExpansionSize, 64*K); // Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 128ULL*G); define_pd_global(size_t, CodeCacheMinBlockLength, 4); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); diff --git a/src/hotspot/cpu/x86/c1_globals_x86.hpp b/src/hotspot/cpu/x86/c1_globals_x86.hpp index be5c443a695..978b233bb63 100644 --- a/src/hotspot/cpu/x86/c1_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c1_globals_x86.hpp @@ -52,7 +52,6 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K ); define_pd_global(size_t, CodeCacheMinBlockLength, 1 ); define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K); define_pd_global(bool, NeverActAsServerClassMachine, true ); -define_pd_global(uint64_t, MaxRAM, 1ULL*G); define_pd_global(bool, CICompileOSR, true ); #endif // !COMPILER2 define_pd_global(bool, UseTypeProfile, false); diff --git a/src/hotspot/cpu/x86/c2_globals_x86.hpp b/src/hotspot/cpu/x86/c2_globals_x86.hpp index a25f5da5e56..afd46a6fb08 100644 --- a/src/hotspot/cpu/x86/c2_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c2_globals_x86.hpp @@ -52,9 +52,6 @@ define_pd_global(intx, LoopUnrollLimit, 60); // InitialCodeCacheSize derived from specjbb2000 run. define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multiple of CodeCacheExpansionSize define_pd_global(size_t, CodeCacheExpansionSize, 64*K); - -// Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 128ULL*G); #else define_pd_global(intx, InteriorEntryAlignment, 4); define_pd_global(size_t, NewSizeThreadIncrease, 4*K); @@ -62,9 +59,6 @@ define_pd_global(intx, LoopUnrollLimit, 50); // Design center r // InitialCodeCacheSize derived from specjbb2000 run. define_pd_global(size_t, InitialCodeCacheSize, 2304*K); // Integral multiple of CodeCacheExpansionSize define_pd_global(size_t, CodeCacheExpansionSize, 32*K); - -// Ergonomics related flags -define_pd_global(uint64_t, MaxRAM, 4ULL*G); #endif // AMD64 define_pd_global(intx, RegisterCostAreaRatio, 16000); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 5183a86846f..c948135e8ca 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -4160,11 +4160,6 @@ void os::win32::initialize_system_info() { } _physical_memory = static_cast(ms.ullTotalPhys); - if (FLAG_IS_DEFAULT(MaxRAM)) { - // Adjust MaxRAM according to the maximum virtual address space available. - FLAG_SET_DEFAULT(MaxRAM, MIN2(MaxRAM, (uint64_t) ms.ullTotalVirtual)); - } - _is_windows_server = IsWindowsServer(); initialize_performance_counter(); diff --git a/src/hotspot/share/compiler/compiler_globals_pd.hpp b/src/hotspot/share/compiler/compiler_globals_pd.hpp index 90edd952c77..6a87fdaaaf1 100644 --- a/src/hotspot/share/compiler/compiler_globals_pd.hpp +++ b/src/hotspot/share/compiler/compiler_globals_pd.hpp @@ -72,12 +72,10 @@ define_pd_global(size_t, CodeCacheMinBlockLength, 1); define_pd_global(size_t, CodeCacheMinimumUseSpace, 200*K); #ifndef ZERO define_pd_global(bool, NeverActAsServerClassMachine, true); -define_pd_global(uint64_t,MaxRAM, 1ULL*G); #else // Zero runs without compilers. Do not let this code to force // the GC mode and default heap settings. define_pd_global(bool, NeverActAsServerClassMachine, false); -define_pd_global(uint64_t,MaxRAM, 128ULL*G); #endif #define CI_COMPILER_COUNT 0 #else diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 6f754dbc39d..938544b9a2c 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -268,8 +268,9 @@ product(bool, AlwaysActAsServerClassMachine, false, \ "Always act like a server-class machine") \ \ - product_pd(uint64_t, MaxRAM, \ - "Real memory size (in bytes) used to set maximum heap size") \ + product(uint64_t, MaxRAM, 0, \ + "(Deprecated) Real memory size (in bytes) used to set maximum " \ + "heap size") \ range(0, 0XFFFFFFFFFFFFFFFF) \ \ product(bool, AggressiveHeap, false, \ diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index abd7a442651..8f8fa6f2eee 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -536,6 +536,7 @@ static SpecialFlag const special_jvm_flags[] = { { "ParallelRefProcEnabled", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "ParallelRefProcBalancingEnabled", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "PSChunkLargeArrays", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, + { "MaxRAM", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, @@ -1511,44 +1512,28 @@ static size_t clamp_by_size_t_max(uint64_t value) { } void Arguments::set_heap_size() { - uint64_t physical_memory; - // Check if the user has configured any limit on the amount of RAM we may use. bool has_ram_limit = !FLAG_IS_DEFAULT(MaxRAMPercentage) || !FLAG_IS_DEFAULT(MinRAMPercentage) || !FLAG_IS_DEFAULT(InitialRAMPercentage) || !FLAG_IS_DEFAULT(MaxRAM); - if (CompilerConfig::should_set_client_emulation_mode_flags() && - FLAG_IS_DEFAULT(MaxRAM)) { - // Reduce the maximum available memory if client emulation mode is enabled. - FLAG_SET_DEFAULT(MaxRAM, 1ULL*G); - } - - if (has_ram_limit) { - if (!FLAG_IS_DEFAULT(MaxRAM)) { - // The user has configured MaxRAM, use that instead of physical memory - // reported by the OS. - physical_memory = MaxRAM; + if (FLAG_IS_DEFAULT(MaxRAM)) { + if (CompilerConfig::should_set_client_emulation_mode_flags()) { + // Limit the available memory if client emulation mode is enabled. + FLAG_SET_ERGO(MaxRAM, 1ULL*G); } else { - // The user has configured a limit, make sure MaxRAM reflects the physical - // memory limit that heap sizing takes into account. - physical_memory = os::physical_memory(); - FLAG_SET_ERGO(MaxRAM, physical_memory); + // Use the available physical memory on the system. + FLAG_SET_ERGO(MaxRAM, os::physical_memory()); } - } else { - // If the user did not specify any limit, choose the lowest of the available - // physical memory and MaxRAM. MaxRAM is typically set to 128GB on 64-bit - // architecture. - physical_memory = MIN2(os::physical_memory(), MaxRAM); } // If the maximum heap size has not been set with -Xmx, then set it as // fraction of the size of physical memory, respecting the maximum and // minimum sizes of the heap. if (FLAG_IS_DEFAULT(MaxHeapSize)) { - uint64_t min_memory = (uint64_t)(((double)physical_memory * MinRAMPercentage) / 100); - uint64_t max_memory = (uint64_t)(((double)physical_memory * MaxRAMPercentage) / 100); + uint64_t min_memory = (uint64_t)(((double)MaxRAM * MinRAMPercentage) / 100); + uint64_t max_memory = (uint64_t)(((double)MaxRAM * MaxRAMPercentage) / 100); const size_t reasonable_min = clamp_by_size_t_max(min_memory); size_t reasonable_max = clamp_by_size_t_max(max_memory); @@ -1635,7 +1620,7 @@ void Arguments::set_heap_size() { reasonable_minimum = limit_heap_by_allocatable_memory(reasonable_minimum); if (InitialHeapSize == 0) { - uint64_t initial_memory = (uint64_t)(((double)physical_memory * InitialRAMPercentage) / 100); + uint64_t initial_memory = (uint64_t)(((double)MaxRAM * InitialRAMPercentage) / 100); size_t reasonable_initial = clamp_by_size_t_max(initial_memory); reasonable_initial = limit_heap_by_allocatable_memory(reasonable_initial); diff --git a/src/java.base/share/man/java.md b/src/java.base/share/man/java.md index d628cfee817..1e9eaa67d6d 100644 --- a/src/java.base/share/man/java.md +++ b/src/java.base/share/man/java.md @@ -2566,25 +2566,6 @@ Java HotSpot VM. : Sets the maximum size (in bytes) of the heap for the young generation (nursery). The default value is set ergonomically. -`-XX:MaxRAM=`*size* -: Sets the maximum amount of memory that the JVM may use for the Java heap - before applying ergonomics heuristics. The default value is the maximum - amount of available memory to the JVM process or 128 GB, whichever is lower. - - The maximum amount of available memory to the JVM process is the minimum - of the machine's physical memory and any constraints set by the environment - (e.g. container). - - Specifying this option disables automatic use of compressed oops if - the combined result of this and other options influencing the maximum amount - of memory is larger than the range of memory addressable by compressed oops. - See `-XX:UseCompressedOops` for further information about compressed oops. - - The following example shows how to set the maximum amount of available - memory for sizing the Java heap to 2 GB: - - > `-XX:MaxRAM=2G` - `-XX:MaxRAMPercentage=`*percent* : Sets the maximum amount of memory that the JVM may use for the Java heap before applying ergonomics heuristics as a percentage of the maximum amount @@ -2951,6 +2932,25 @@ they're used. (`-XX:+UseParallelGC` or `-XX:+UseG1GC`). Other collectors employing multiple threads always perform reference processing in parallel. +`-XX:MaxRAM=`*size* +: Sets the maximum amount of memory that the JVM may use for the Java heap + before applying ergonomics heuristics. The default value is the amount of + available memory to the JVM process. + + The maximum amount of available memory to the JVM process is the minimum + of the machine's physical memory and any constraints set by the environment + (e.g. container). + + Specifying this option disables automatic use of compressed oops if + the combined result of this and other options influencing the maximum amount + of memory is larger than the range of memory addressable by compressed oops. + See `-XX:UseCompressedOops` for further information about compressed oops. + + The following example shows how to set the maximum amount of available + memory for sizing the Java heap to 2 GB: + + > `-XX:MaxRAM=2G` + ## Obsolete Java Options These `java` options are still accepted but ignored, and a warning is issued From 0f34b0203ad8e8e9d4a4dcdd9af2bafa60311fec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20H=C3=BCbner?= Date: Wed, 29 Oct 2025 12:57:06 +0000 Subject: [PATCH 349/561] 8365896: Remove unnecessary explicit buffer nul-termination after using os::snprintf Reviewed-by: dholmes, coleenp --- src/hotspot/cpu/zero/frame_zero.cpp | 2 -- src/hotspot/os/aix/os_aix.cpp | 2 +- src/hotspot/os/aix/porting_aix.cpp | 3 ++- src/hotspot/os/bsd/os_bsd.cpp | 2 +- src/hotspot/os/linux/os_linux.cpp | 2 +- src/hotspot/os/linux/os_perf_linux.cpp | 6 ------ src/hotspot/os/windows/os_windows.cpp | 4 ++-- src/hotspot/share/cds/filemap.cpp | 1 - src/hotspot/share/runtime/reflection.cpp | 8 ++++---- src/hotspot/share/services/diagnosticFramework.cpp | 6 +++--- 10 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/hotspot/cpu/zero/frame_zero.cpp b/src/hotspot/cpu/zero/frame_zero.cpp index 52ccad2fa68..69bbea2972a 100644 --- a/src/hotspot/cpu/zero/frame_zero.cpp +++ b/src/hotspot/cpu/zero/frame_zero.cpp @@ -245,8 +245,6 @@ void frame::zero_print_on_error(int frame_index, os::snprintf_checked(fieldbuf, buflen, "word[%d]", offset); os::snprintf_checked(valuebuf, buflen, PTR_FORMAT, *addr); zeroframe()->identify_word(frame_index, offset, fieldbuf, valuebuf, buflen); - fieldbuf[buflen - 1] = '\0'; - valuebuf[buflen - 1] = '\0'; // Print the result st->print_cr(" " PTR_FORMAT ": %-21s = %s", p2i(addr), fieldbuf, valuebuf); diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp index 0c0c2808fa1..5f81912c0d6 100644 --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -1054,7 +1054,7 @@ static void* dll_load_library(const char *filename, int *eno, char *ebuf, int eb error_report = "dlerror returned no error description"; } if (ebuf != nullptr && ebuflen > 0) { - os::snprintf_checked(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s", + os::snprintf_checked(ebuf, ebuflen, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s", filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report); } Events::log_dll_message(nullptr, "Loading shared library %s failed, %s", filename, error_report); diff --git a/src/hotspot/os/aix/porting_aix.cpp b/src/hotspot/os/aix/porting_aix.cpp index 402abd7d579..7311afc197b 100644 --- a/src/hotspot/os/aix/porting_aix.cpp +++ b/src/hotspot/os/aix/porting_aix.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2012, 2024 SAP SE. All rights reserved. + * 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 @@ -1154,7 +1155,7 @@ bool os::pd_dll_unload(void* libhandle, char* ebuf, int ebuflen) { error_report = "dlerror returned no error description"; } if (ebuf != nullptr && ebuflen > 0) { - os::snprintf_checked(ebuf, ebuflen - 1, "%s", error_report); + os::snprintf_checked(ebuf, ebuflen, "%s", error_report); } assert(false, "os::pd_dll_unload() ::dlclose() failed"); } diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp index ce68987610b..3e5fa8b84e1 100644 --- a/src/hotspot/os/bsd/os_bsd.cpp +++ b/src/hotspot/os/bsd/os_bsd.cpp @@ -2483,7 +2483,7 @@ bool os::pd_dll_unload(void* libhandle, char* ebuf, int ebuflen) { error_report = "dlerror returned no error description"; } if (ebuf != nullptr && ebuflen > 0) { - os::snprintf_checked(ebuf, ebuflen - 1, "%s", error_report); + os::snprintf_checked(ebuf, ebuflen, "%s", error_report); } } diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index 16b87210a29..8137347dd4f 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -5338,7 +5338,7 @@ bool os::pd_dll_unload(void* libhandle, char* ebuf, int ebuflen) { error_report = "dlerror returned no error description"; } if (ebuf != nullptr && ebuflen > 0) { - os::snprintf_checked(ebuf, ebuflen - 1, "%s", error_report); + os::snprintf_checked(ebuf, ebuflen, "%s", error_report); } } diff --git a/src/hotspot/os/linux/os_perf_linux.cpp b/src/hotspot/os/linux/os_perf_linux.cpp index 7caf8f98a00..5708194521f 100644 --- a/src/hotspot/os/linux/os_perf_linux.cpp +++ b/src/hotspot/os/linux/os_perf_linux.cpp @@ -705,11 +705,9 @@ bool SystemProcessInterface::SystemProcesses::ProcessIterator::is_valid_entry(st if (atoi(entry->d_name) != 0) { jio_snprintf(buffer, PATH_MAX, "/proc/%s", entry->d_name); - buffer[PATH_MAX - 1] = '\0'; if (is_dir(buffer)) { jio_snprintf(buffer, PATH_MAX, "/proc/%s/stat", entry->d_name); - buffer[PATH_MAX - 1] = '\0'; if (fsize(buffer, size) != OS_ERR) { return true; } @@ -724,7 +722,6 @@ void SystemProcessInterface::SystemProcesses::ProcessIterator::get_exe_name() { char buffer[PATH_MAX]; jio_snprintf(buffer, PATH_MAX, "/proc/%s/stat", _entry->d_name); - buffer[PATH_MAX - 1] = '\0'; if ((fp = os::fopen(buffer, "r")) != nullptr) { if (fgets(buffer, PATH_MAX, fp) != nullptr) { char* start, *end; @@ -752,7 +749,6 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::get_cmdline() { char* cmdline = nullptr; jio_snprintf(buffer, PATH_MAX, "/proc/%s/cmdline", _entry->d_name); - buffer[PATH_MAX - 1] = '\0'; if ((fp = os::fopen(buffer, "r")) != nullptr) { size_t size = 0; char dummy; @@ -787,7 +783,6 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::get_exe_path() { char buffer[PATH_MAX]; jio_snprintf(buffer, PATH_MAX, "/proc/%s/exe", _entry->d_name); - buffer[PATH_MAX - 1] = '\0'; return os::realpath(buffer, _exePath, PATH_MAX); } @@ -1001,7 +996,6 @@ int64_t NetworkPerformanceInterface::NetworkPerformance::read_counter(const char return -1; } - buf[num_bytes] = '\0'; int64_t value = strtoll(buf, nullptr, 10); return value; diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index c948135e8ca..ce2baeaf46c 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -1827,12 +1827,12 @@ void * os::dll_load(const char *name, char *ebuf, int ebuflen) { } if (lib_arch_str != nullptr) { - os::snprintf_checked(ebuf, ebuflen - 1, + os::snprintf_checked(ebuf, ebuflen, "Can't load %s-bit .dll on a %s-bit platform", lib_arch_str, running_arch_str); } else { // don't know what architecture this dll was build for - os::snprintf_checked(ebuf, ebuflen - 1, + os::snprintf_checked(ebuf, ebuflen, "Can't load this .dll (machine code=0x%x) on a %s-bit platform", lib_arch, running_arch_str); } diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 8c2175622e9..050c1708efb 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -117,7 +117,6 @@ template static void get_header_version(char (&header_version) [N]) { // Append the hash code as eight hex digits. os::snprintf_checked(&header_version[JVM_IDENT_MAX-9], 9, "%08x", hash); - header_version[JVM_IDENT_MAX-1] = 0; // Null terminate. } assert(header_version[JVM_IDENT_MAX-1] == 0, "must be"); diff --git a/src/hotspot/share/runtime/reflection.cpp b/src/hotspot/share/runtime/reflection.cpp index 7728643c640..d6c10c5c70c 100644 --- a/src/hotspot/share/runtime/reflection.cpp +++ b/src/hotspot/share/runtime/reflection.cpp @@ -546,7 +546,7 @@ char* Reflection::verify_class_access_msg(const Klass* current_class, size_t len = 100 + strlen(current_class_name) + 2*strlen(module_from_name) + strlen(new_class_name) + 2*strlen(module_to_name); msg = NEW_RESOURCE_ARRAY(char, len); - jio_snprintf(msg, len - 1, + jio_snprintf(msg, len, "class %s (in module %s) cannot access class %s (in module %s) because module %s does not read module %s", current_class_name, module_from_name, new_class_name, module_to_name, module_from_name, module_to_name); @@ -557,7 +557,7 @@ char* Reflection::verify_class_access_msg(const Klass* current_class, size_t len = 160 + strlen(current_class_name) + 2*strlen(module_from_name) + strlen(new_class_name) + 2*sizeof(uintx); msg = NEW_RESOURCE_ARRAY(char, len); - jio_snprintf(msg, len - 1, + jio_snprintf(msg, len, "class %s (in module %s) cannot access class %s (in unnamed module @0x%zx) because module %s does not read unnamed module @0x%zx", current_class_name, module_from_name, new_class_name, uintx(identity_hash), module_from_name, uintx(identity_hash)); @@ -573,7 +573,7 @@ char* Reflection::verify_class_access_msg(const Klass* current_class, size_t len = 118 + strlen(current_class_name) + 2*strlen(module_from_name) + strlen(new_class_name) + 2*strlen(module_to_name) + strlen(package_name); msg = NEW_RESOURCE_ARRAY(char, len); - jio_snprintf(msg, len - 1, + jio_snprintf(msg, len, "class %s (in module %s) cannot access class %s (in module %s) because module %s does not export %s to module %s", current_class_name, module_from_name, new_class_name, module_to_name, module_to_name, package_name, module_from_name); @@ -584,7 +584,7 @@ char* Reflection::verify_class_access_msg(const Klass* current_class, size_t len = 170 + strlen(current_class_name) + strlen(new_class_name) + 2*strlen(module_to_name) + strlen(package_name) + 2*sizeof(uintx); msg = NEW_RESOURCE_ARRAY(char, len); - jio_snprintf(msg, len - 1, + jio_snprintf(msg, len, "class %s (in unnamed module @0x%zx) cannot access class %s (in module %s) because module %s does not export %s to unnamed module @0x%zx", current_class_name, uintx(identity_hash), new_class_name, module_to_name, module_to_name, package_name, uintx(identity_hash)); diff --git a/src/hotspot/share/services/diagnosticFramework.cpp b/src/hotspot/share/services/diagnosticFramework.cpp index 7cf41750f5d..c37fe7b4e1e 100644 --- a/src/hotspot/share/services/diagnosticFramework.cpp +++ b/src/hotspot/share/services/diagnosticFramework.cpp @@ -208,7 +208,7 @@ void DCmdParser::parse(CmdLine* line, char delim, TRAPS) { strncpy(argbuf, iter.key_addr(), len); argbuf[len] = '\0'; - jio_snprintf(buf, buflen - 1, "Unknown argument '%s' in diagnostic command.", argbuf); + jio_snprintf(buf, buflen, "Unknown argument '%s' in diagnostic command.", argbuf); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } @@ -236,7 +236,7 @@ void DCmdParser::check(TRAPS) { GenDCmdArgument* arg = _arguments_list; while (arg != nullptr) { if (arg->is_mandatory() && !arg->has_value()) { - jio_snprintf(buf, buflen - 1, "The argument '%s' is mandatory.", arg->name()); + jio_snprintf(buf, buflen, "The argument '%s' is mandatory.", arg->name()); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } arg = arg->next(); @@ -244,7 +244,7 @@ void DCmdParser::check(TRAPS) { arg = _options; while (arg != nullptr) { if (arg->is_mandatory() && !arg->has_value()) { - jio_snprintf(buf, buflen - 1, "The option '%s' is mandatory.", arg->name()); + jio_snprintf(buf, buflen, "The option '%s' is mandatory.", arg->name()); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), buf); } arg = arg->next(); From 2c07214d7c075da5dd4a4e872aef29f58cef2bae Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Wed, 29 Oct 2025 13:12:58 +0000 Subject: [PATCH 350/561] 8368249: HttpClient: Translate exceptions thrown by sendAsync Reviewed-by: jpai --- .../jdk/internal/net/http/HttpClientImpl.java | 35 +++ .../HttpClientSendAsyncExceptionTest.java | 263 ++++++++++++++++++ 2 files changed, 298 insertions(+) create mode 100644 test/jdk/java/net/httpclient/HttpClientSendAsyncExceptionTest.java diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/HttpClientImpl.java b/src/java.net.http/share/classes/jdk/internal/net/http/HttpClientImpl.java index b73b92add63..6ea196a4d1c 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/HttpClientImpl.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/HttpClientImpl.java @@ -60,6 +60,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeSet; +import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.ExecutionException; @@ -75,6 +76,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock; import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; +import java.util.function.Function; import java.util.stream.Stream; import java.net.http.HttpClient; import java.net.http.HttpRequest; @@ -974,6 +976,12 @@ final class HttpClientImpl extends HttpClient implements Trackable { } throw ie; } catch (ExecutionException e) { + // Exceptions are often thrown from asynchronous code, and the + // stacktrace may not always contain the application classes. That + // makes it difficult to trace back to the application code which + // invoked the `HttpClient`. Here we instantiate/recreate the + // exceptions to capture the application's calling code in the + // stacktrace of the thrown exception. final Throwable throwable = e.getCause(); final String msg = throwable.getMessage(); @@ -1104,6 +1112,8 @@ final class HttpClientImpl extends HttpClient implements Trackable { res = registerPending(pending, res); if (exchangeExecutor != null) { + // We're called by `sendAsync()` - make sure we translate exceptions + res = translateSendAsyncExecFailure(res); // makes sure that any dependent actions happen in the CF default // executor. This is only needed for sendAsync(...), when // exchangeExecutor is non-null. @@ -1121,6 +1131,31 @@ final class HttpClientImpl extends HttpClient implements Trackable { } } + /** + * {@return a new {@code CompletableFuture} wrapping the + * {@link #sendAsync(HttpRequest, BodyHandler, PushPromiseHandler, Executor) sendAsync()} + * execution failures with, as per specification, {@link IOException}, if necessary} + */ + private static CompletableFuture> translateSendAsyncExecFailure( + CompletableFuture> responseFuture) { + return responseFuture + .handle((response, exception) -> { + if (exception == null) { + return MinimalFuture.completedFuture(response); + } + var unwrappedException = Utils.getCompletionCause(exception); + // Except `Error` and `CancellationException`, wrap failures inside an `IOException`. + // This is required to comply with the specification of `HttpClient::sendAsync`. + var translatedException = unwrappedException instanceof Error + || unwrappedException instanceof CancellationException + || unwrappedException instanceof IOException + ? unwrappedException + : new IOException(unwrappedException); + return MinimalFuture.>failedFuture(translatedException); + }) + .thenCompose(Function.identity()); + } + // Main loop for this client's selector private static final class SelectorManager extends Thread { diff --git a/test/jdk/java/net/httpclient/HttpClientSendAsyncExceptionTest.java b/test/jdk/java/net/httpclient/HttpClientSendAsyncExceptionTest.java new file mode 100644 index 00000000000..f4a1f3cca82 --- /dev/null +++ b/test/jdk/java/net/httpclient/HttpClientSendAsyncExceptionTest.java @@ -0,0 +1,263 @@ +/* + * 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. + * + * 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. + */ + +import jdk.httpclient.test.lib.common.HttpServerAdapters; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.net.ssl.SSLParameters; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.lang.reflect.Method; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpHeaders; +import java.net.http.HttpOption; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.UnsupportedProtocolVersionException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; + +import static java.net.http.HttpClient.Builder.NO_PROXY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/* + * @test + * @bug 8368249 + * @summary Verifies exceptions thrown by `HttpClient::sendAsync` + * @library /test/jdk/java/net/httpclient/lib /test/lib + * @run junit HttpClientSendAsyncExceptionTest + */ + +class HttpClientSendAsyncExceptionTest { + + @Test + void testClosedClient() { + var client = HttpClient.newHttpClient(); + client.close(); + var request = HttpRequest.newBuilder(URI.create("https://example.com")).GET().build(); + var responseBodyHandler = HttpResponse.BodyHandlers.discarding(); + var responseFuture = client.sendAsync(request, responseBodyHandler); + var exception = assertThrows(ExecutionException.class, responseFuture::get); + var cause = assertThrowableInstanceOf(IOException.class, exception.getCause()); + assertContains(cause.getMessage(), "closed"); + } + + @Test + void testH3IncompatClient() { + SSLParameters h3IncompatSslParameters = new SSLParameters(new String[0], new String[]{"foo"}); + try (var h3IncompatClient = HttpClient.newBuilder() + // Provide `SSLParameters` incompatible with QUIC's TLS requirements to disarm the HTTP/3 support + .sslParameters(h3IncompatSslParameters) + .build()) { + var h3Request = HttpRequest.newBuilder(URI.create("https://example.com")) + .GET() + .version(HttpClient.Version.HTTP_3) + .setOption(HttpOption.H3_DISCOVERY, HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY) + .build(); + var responseBodyHandler = HttpResponse.BodyHandlers.discarding(); + var responseFuture = h3IncompatClient.sendAsync(h3Request, responseBodyHandler); + var exception = assertThrows(ExecutionException.class, responseFuture::get); + var cause = assertThrowableInstanceOf(UnsupportedProtocolVersionException.class, exception.getCause()); + assertEquals("HTTP3 is not supported", cause.getMessage()); + } + } + + @Test + void testConnectMethod() { + try (var client = HttpClient.newHttpClient()) { + // The default `HttpRequest` builder does not allow `CONNECT`. + // Hence, we create our custom `HttpRequest` instance: + var connectRequest = new HttpRequest() { + + @Override + public Optional bodyPublisher() { + return Optional.empty(); + } + + @Override + public String method() { + return "CONNECT"; + } + + @Override + public Optional timeout() { + return Optional.empty(); + } + + @Override + public boolean expectContinue() { + return false; + } + + @Override + public URI uri() { + return URI.create("https://example.com"); + } + + @Override + public Optional version() { + return Optional.empty(); + } + + @Override + public HttpHeaders headers() { + return HttpHeaders.of(Collections.emptyMap(), (_, _) -> true); + } + + }; + var responseBodyHandler = HttpResponse.BodyHandlers.discarding(); + var exception = assertThrows( + IllegalArgumentException.class, + () -> client.sendAsync(connectRequest, responseBodyHandler)); + assertContains(exception.getMessage(), "Unsupported method CONNECT"); + } + } + + static List exceptionTestCases() { + + // `RuntimeException` + List testCases = new ArrayList<>(); + var runtimeException = new RuntimeException(); + testCases.add(new ExceptionTestCase( + "RuntimeException", + _ -> { throw runtimeException; }, + exception -> { + assertThrowableInstanceOf(IOException.class, exception); + assertThrowableSame(runtimeException, exception.getCause()); + })); + + // `Error` + var error = new Error(); + testCases.add(new ExceptionTestCase( + "Error", + _ -> { throw error; }, + exception -> assertThrowableSame(error, exception))); + + // `CancellationException` + var cancellationException = new CancellationException(); + testCases.add(new ExceptionTestCase( + "CancellationException", + _ -> { throw cancellationException; }, + exception -> assertThrowableSame(cancellationException, exception))); + + // `IOException` (needs sneaky throw) + var ioException = new IOException(); + testCases.add(new ExceptionTestCase( + "IOException", + _ -> { sneakyThrow(ioException); throw new AssertionError(); }, + exception -> assertThrowableSame(ioException, exception))); + + // `UncheckedIOException` + var uncheckedIOException = new UncheckedIOException(ioException); + testCases.add(new ExceptionTestCase( + "UncheckedIOException(IOException)", + _ -> { throw uncheckedIOException; }, + exception -> assertThrowableSame(uncheckedIOException, exception.getCause()))); + + return testCases; + + } + + private static T assertThrowableInstanceOf(Class expectedClass, Throwable actual) { + if (!expectedClass.isInstance(actual)) { + var message = "Was expecting `%s`".formatted(expectedClass.getCanonicalName()); + throw new AssertionError(message, actual); + } + return expectedClass.cast(actual); + } + + private static void assertThrowableSame(Throwable expected, Throwable actual) { + if (expected != actual) { + var message = "Was expecting `%s`".formatted(expected.getClass().getCanonicalName()); + throw new AssertionError(message, actual); + } + } + + private record ExceptionTestCase( + String description, + HttpResponse.BodyHandler throwingResponseBodyHandler, + Consumer exceptionVerifier) { + + @Override + public String toString() { + return description; + } + + } + + @SuppressWarnings("unchecked") + private static void sneakyThrow(Throwable throwable) throws T { + throw (T) throwable; + } + + @ParameterizedTest + @MethodSource("exceptionTestCases") + void testIOExceptionWrap(ExceptionTestCase testCase, TestInfo testInfo) throws Exception { + var version = HttpClient.Version.HTTP_1_1; + try (var server = HttpServerAdapters.HttpTestServer.create(version); + var client = HttpServerAdapters.createClientBuilderFor(version).proxy(NO_PROXY).build()) { + + // Configure the server to respond with 200 containing a single byte + var serverHandlerPath = "/%s/%s/".formatted( + testInfo.getTestClass().map(Class::getSimpleName).orElse("unknown-class"), + testInfo.getTestMethod().map(Method::getName).orElse("unknown-method")); + HttpServerAdapters.HttpTestHandler serverHandler = exchange -> { + try (exchange) { + exchange.sendResponseHeaders(200, 1); + exchange.getResponseBody().write(new byte[]{0}); + } + }; + server.addHandler(serverHandler, serverHandlerPath); + server.start(); + + // Verify the execution failure + var requestUri = URI.create("http://" + server.serverAuthority() + serverHandlerPath); + var request = HttpRequest.newBuilder(requestUri).version(version).build(); + // We need to make `sendAsync()` execution fail. + // There are several ways to achieve this. + // We choose to use a throwing response handler. + var responseFuture = client.sendAsync(request, testCase.throwingResponseBodyHandler); + var exception = assertThrows(ExecutionException.class, responseFuture::get); + testCase.exceptionVerifier.accept(exception.getCause()); + + } + + } + + private static void assertContains(String target, String expected) { + assertTrue(target.contains(expected), "does not contain `" + expected + "`: " + target); + } + +} From eab5644a96e20409f31622d2e6c33636a7a49768 Mon Sep 17 00:00:00 2001 From: Hamlin Li Date: Wed, 29 Oct 2025 15:00:16 +0000 Subject: [PATCH 351/561] 8370481: C2 SuperWord: Long/Integer.compareUnsigned return wrong value in SLP Reviewed-by: epeter, tonyp --- src/hotspot/share/opto/subnode.hpp | 1 + src/hotspot/share/opto/superword.cpp | 23 +- .../c2/irTests/TestVectorConditionalMove.java | 761 +++++++++++++++++- 3 files changed, 782 insertions(+), 3 deletions(-) diff --git a/src/hotspot/share/opto/subnode.hpp b/src/hotspot/share/opto/subnode.hpp index 5acf31b45c4..2c3d9cfd35e 100644 --- a/src/hotspot/share/opto/subnode.hpp +++ b/src/hotspot/share/opto/subnode.hpp @@ -331,6 +331,7 @@ struct BoolTest { mask negate( ) const { return negate_mask(_test); } // Return the negative mask for the given mask, for both signed and unsigned comparison. static mask negate_mask(mask btm) { return mask(btm ^ 4); } + static mask unsigned_mask(mask btm) { return mask(btm | unsigned_compare); } bool is_canonical( ) const { return (_test == BoolTest::ne || _test == BoolTest::lt || _test == BoolTest::le || _test == BoolTest::overflow); } bool is_less( ) const { return _test == BoolTest::lt || _test == BoolTest::le; } bool is_greater( ) const { return _test == BoolTest::gt || _test == BoolTest::ge; } diff --git a/src/hotspot/share/opto/superword.cpp b/src/hotspot/share/opto/superword.cpp index 6ab1ff37de9..cc4a94aa054 100644 --- a/src/hotspot/share/opto/superword.cpp +++ b/src/hotspot/share/opto/superword.cpp @@ -1698,7 +1698,9 @@ VTransformBoolTest PackSet::get_bool_test(const Node_List* bool_pack) const { CmpNode* cmp0 = bol->in(1)->as_Cmp(); assert(get_pack(cmp0) != nullptr, "Bool must have matching Cmp pack"); - if (cmp0->Opcode() == Op_CmpF || cmp0->Opcode() == Op_CmpD) { + switch (cmp0->Opcode()) { + case Op_CmpF: + case Op_CmpD: // If we have a Float or Double comparison, we must be careful with // handling NaN's correctly. CmpF and CmpD have a return code, as // they are based on the java bytecodes fcmpl/dcmpl: @@ -1742,7 +1744,24 @@ VTransformBoolTest PackSet::get_bool_test(const Node_List* bool_pack) const { mask = bol->_test.negate(); is_negated = true; } - } + break; + case Op_CmpU: + case Op_CmpUL: + // When we have CmpU->Bool, the mask of the Bool has no unsigned-ness information, + // but the mask is implicitly unsigned only because of the CmpU. Since we will replace + // the CmpU->Bool with a single VectorMaskCmp, we need to now make the unsigned-ness + // explicit. + mask = BoolTest::unsigned_mask(mask); + break; + case Op_CmpI: + case Op_CmpL: + // The mask of signed int/long scalar comparisons has the same semantics + // as the mask for vector elementwise int/long comparison with VectorMaskCmp. + break; + default: + // Other Cmp ops are not expected to get here. + ShouldNotReachHere(); + } // switch return VTransformBoolTest(mask, is_negated); } diff --git a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorConditionalMove.java b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorConditionalMove.java index ade409d01e5..6da8bd89245 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/TestVectorConditionalMove.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/TestVectorConditionalMove.java @@ -145,6 +145,7 @@ public class TestVectorConditionalMove { } // Extension: Compare 2 ILFD values, and pick from 2 ILFD values + // Signed comparison: I/L private int cmoveIGTforI(int a, int b, int c, int d) { return (a > b) ? c : d; } @@ -177,6 +178,144 @@ public class TestVectorConditionalMove { return (a > b) ? c : d; } + // Unsigned comparison: I/L + // I for I + private int cmoveUIGTforI(int a, int b, int c, int d) { + return Integer.compareUnsigned(a, b) > 0 ? c : d; + } + + private int cmoveUIGEforI(int a, int b, int c, int d) { + return Integer.compareUnsigned(a, b) >= 0 ? c : d; + } + + private int cmoveUILTforI(int a, int b, int c, int d) { + return Integer.compareUnsigned(a, b) < 0 ? c : d; + } + + private int cmoveUILEforI(int a, int b, int c, int d) { + return Integer.compareUnsigned(a, b) <= 0 ? c : d; + } + + // I for L + private long cmoveUIGTforL(int a, int b, long c, long d) { + return Integer.compareUnsigned(a, b) > 0 ? c : d; + } + + private long cmoveUIGEforL(int a, int b, long c, long d) { + return Integer.compareUnsigned(a, b) >= 0 ? c : d; + } + + private long cmoveUILTforL(int a, int b, long c, long d) { + return Integer.compareUnsigned(a, b) < 0 ? c : d; + } + + private long cmoveUILEforL(int a, int b, long c, long d) { + return Integer.compareUnsigned(a, b) <= 0 ? c : d; + } + + // I for F + private float cmoveUIGTforF(int a, int b, float c, float d) { + return Integer.compareUnsigned(a, b) > 0 ? c : d; + } + + private float cmoveUIGEforF(int a, int b, float c, float d) { + return Integer.compareUnsigned(a, b) >= 0 ? c : d; + } + + private float cmoveUILTforF(int a, int b, float c, float d) { + return Integer.compareUnsigned(a, b) < 0 ? c : d; + } + + private float cmoveUILEforF(int a, int b, float c, float d) { + return Integer.compareUnsigned(a, b) <= 0 ? c : d; + } + + // I for D + private double cmoveUIGTforD(int a, int b, double c, double d) { + return Integer.compareUnsigned(a, b) > 0 ? c : d; + } + + private double cmoveUIGEforD(int a, int b, double c, double d) { + return Integer.compareUnsigned(a, b) >= 0 ? c : d; + } + + private double cmoveUILTforD(int a, int b, double c, double d) { + return Integer.compareUnsigned(a, b) < 0 ? c : d; + } + + private double cmoveUILEforD(int a, int b, double c, double d) { + return Integer.compareUnsigned(a, b) <= 0 ? c : d; + } + + // L for I + private int cmoveULGTforI(long a, long b, int c, int d) { + return Long.compareUnsigned(a, b) > 0 ? c : d; + } + + private int cmoveULGEforI(long a, long b, int c, int d) { + return Long.compareUnsigned(a, b) >= 0 ? c : d; + } + + private int cmoveULLTforI(long a, long b, int c, int d) { + return Long.compareUnsigned(a, b) < 0 ? c : d; + } + + private int cmoveULLEforI(long a, long b, int c, int d) { + return Long.compareUnsigned(a, b) <= 0 ? c : d; + } + + // L for L + private long cmoveULGTforL(long a, long b, long c, long d) { + return Long.compareUnsigned(a, b) > 0 ? c : d; + } + + private long cmoveULGEforL(long a, long b, long c, long d) { + return Long.compareUnsigned(a, b) >= 0 ? c : d; + } + + private long cmoveULLTforL(long a, long b, long c, long d) { + return Long.compareUnsigned(a, b) < 0 ? c : d; + } + + private long cmoveULLEforL(long a, long b, long c, long d) { + return Long.compareUnsigned(a, b) <= 0 ? c : d; + } + + // L for F + private float cmoveULGTforF(long a, long b, float c, float d) { + return Long.compareUnsigned(a, b) > 0 ? c : d; + } + + private float cmoveULGEforF(long a, long b, float c, float d) { + return Long.compareUnsigned(a, b) >= 0 ? c : d; + } + + private float cmoveULLTforF(long a, long b, float c, float d) { + return Long.compareUnsigned(a, b) < 0 ? c : d; + } + + private float cmoveULLEforF(long a, long b, float c, float d) { + return Long.compareUnsigned(a, b) <= 0 ? c : d; + } + + // L for D + private double cmoveULGTforD(long a, long b, double c, double d) { + return Long.compareUnsigned(a, b) > 0 ? c : d; + } + + private double cmoveULGEforD(long a, long b, double c, double d) { + return Long.compareUnsigned(a, b) >= 0 ? c : d; + } + + private double cmoveULLTforD(long a, long b, double c, double d) { + return Long.compareUnsigned(a, b) < 0 ? c : d; + } + + private double cmoveULLEforD(long a, long b, double c, double d) { + return Long.compareUnsigned(a, b) <= 0 ? c : d; + } + + // Float comparison private int cmoveFGTforI(float a, float b, int c, int d) { return (a > b) ? c : d; } @@ -595,6 +734,7 @@ public class TestVectorConditionalMove { // do not float down into the branches, I compute a value, and store it to r2 (same as r, except that the // compilation does not know that). // So far, vectorization only works for CMoveF/D, with same data-width comparison (F/I for F, D/L for D). + // Signed comparison: I/L @Test @IR(failOn = {IRNode.STORE_VECTOR}) private static void testCMoveIGTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) { @@ -694,6 +834,411 @@ public class TestVectorConditionalMove { } } + // Unsigned comparison: I/L + // I fo I + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // I fo L + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // I fo F + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + private static void testCMoveUIGTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + private static void testCMoveUIGEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + private static void testCMoveUILTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) + private static void testCMoveUILEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // I fo D + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUIGEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveUILEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // L fo I + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) { + for (int i = 0; i < a.length; i++) { + int cc = c[i]; + int dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // L fo L + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) { + for (int i = 0; i < a.length; i++) { + long cc = c[i]; + long dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // L fo F + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULGEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(failOn = {IRNode.STORE_VECTOR}) + private static void testCMoveULLEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) { + for (int i = 0; i < a.length; i++) { + float cc = c[i]; + float dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + + // L fo D + @Test + @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4. + private static void testCMoveULGTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4. + private static void testCMoveULGEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4. + private static void testCMoveULLTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd; + } + } + + @Test + @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0", + IRNode.STORE_VECTOR, ">0"}, + applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true"}) + // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4. + private static void testCMoveULLEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) { + for (int i = 0; i < a.length; i++) { + double cc = c[i]; + double dd = d[i]; + r2[i] = cc + dd; + r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd; + } + } + @Test @IR(failOn = {IRNode.STORE_VECTOR}) private static void testCMoveFGTforI(float[] a, float[] b, int[] c, int[] d, int[] r, int[] r2) { @@ -977,7 +1522,8 @@ public class TestVectorConditionalMove { } @Warmup(0) - @Run(test = {"testCMoveIGTforI", + @Run(test = {// Signed + "testCMoveIGTforI", "testCMoveIGTforL", "testCMoveIGTforF", "testCMoveIGTforD", @@ -985,6 +1531,48 @@ public class TestVectorConditionalMove { "testCMoveLGTforL", "testCMoveLGTforF", "testCMoveLGTforD", + // Unsigned + // I for I + "testCMoveUIGTforI", + "testCMoveUIGEforI", + "testCMoveUILTforI", + "testCMoveUILEforI", + // I for L + "testCMoveUIGTforL", + "testCMoveUIGEforL", + "testCMoveUILTforL", + "testCMoveUILEforL", + // I for F + "testCMoveUIGTforF", + "testCMoveUIGEforF", + "testCMoveUILTforF", + "testCMoveUILEforF", + // I for D + "testCMoveUIGTforD", + "testCMoveUIGEforD", + "testCMoveUILTforD", + "testCMoveUILEforD", + // L for I + "testCMoveULGTforI", + "testCMoveULGEforI", + "testCMoveULLTforI", + "testCMoveULLEforI", + // L for L + "testCMoveULGTforL", + "testCMoveULGEforL", + "testCMoveULLTforL", + "testCMoveULLEforL", + // L for F + "testCMoveULGTforF", + "testCMoveULGEforF", + "testCMoveULLTforF", + "testCMoveULLEforF", + // L for D + "testCMoveULGTforD", + "testCMoveULGEforD", + "testCMoveULLTforD", + "testCMoveULLEforD", + // Float "testCMoveFGTforI", "testCMoveFGTforL", "testCMoveFGTforF", @@ -1034,6 +1622,7 @@ public class TestVectorConditionalMove { init(cD); init(dD); + // Signed testCMoveIGTforI(aI, bI, cI, dI, rI, rI); for (int i = 0; i < SIZE; i++) { Asserts.assertEquals(rI[i], cmoveIGTforI(aI[i], bI[i], cI[i], dI[i])); @@ -1074,6 +1663,176 @@ public class TestVectorConditionalMove { Asserts.assertEquals(rD[i], cmoveLGTforD(aL[i], bL[i], cD[i], dD[i])); } + // Unsigned + // I for I + testCMoveUIGTforI(aI, bI, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveUIGTforI(aI[i], bI[i], cI[i], dI[i])); + } + + testCMoveUIGEforI(aI, bI, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveUIGEforI(aI[i], bI[i], cI[i], dI[i])); + } + + testCMoveUILTforI(aI, bI, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveUILTforI(aI[i], bI[i], cI[i], dI[i])); + } + + testCMoveUILEforI(aI, bI, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveUILEforI(aI[i], bI[i], cI[i], dI[i])); + } + + // I for L + testCMoveUIGTforL(aI, bI, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveUIGTforL(aI[i], bI[i], cL[i], dL[i])); + } + + testCMoveUIGEforL(aI, bI, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveUIGEforL(aI[i], bI[i], cL[i], dL[i])); + } + + testCMoveUILTforL(aI, bI, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveUILTforL(aI[i], bI[i], cL[i], dL[i])); + } + + testCMoveUILEforL(aI, bI, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveUILEforL(aI[i], bI[i], cL[i], dL[i])); + } + + // I for F + testCMoveUIGTforF(aI, bI, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveUIGTforF(aI[i], bI[i], cF[i], dF[i])); + } + + testCMoveUIGEforF(aI, bI, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveUIGEforF(aI[i], bI[i], cF[i], dF[i])); + } + + testCMoveUILTforF(aI, bI, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveUILTforF(aI[i], bI[i], cF[i], dF[i])); + } + + testCMoveUILEforF(aI, bI, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveUILEforF(aI[i], bI[i], cF[i], dF[i])); + } + + // I for D + testCMoveUIGTforD(aI, bI, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveUIGTforD(aI[i], bI[i], cD[i], dD[i])); + } + + testCMoveUIGEforD(aI, bI, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveUIGEforD(aI[i], bI[i], cD[i], dD[i])); + } + + testCMoveUILTforD(aI, bI, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveUILTforD(aI[i], bI[i], cD[i], dD[i])); + } + + testCMoveUILEforD(aI, bI, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveUILEforD(aI[i], bI[i], cD[i], dD[i])); + } + + // L for I + testCMoveULGTforI(aL, bL, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveULGTforI(aL[i], bL[i], cI[i], dI[i])); + } + + testCMoveULGEforI(aL, bL, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveULGEforI(aL[i], bL[i], cI[i], dI[i])); + } + + testCMoveULLTforI(aL, bL, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveULLTforI(aL[i], bL[i], cI[i], dI[i])); + } + + testCMoveULLEforI(aL, bL, cI, dI, rI, rI); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rI[i], cmoveULLEforI(aL[i], bL[i], cI[i], dI[i])); + } + + // L for L + testCMoveULGTforL(aL, bL, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveULGTforL(aL[i], bL[i], cL[i], dL[i])); + } + + testCMoveULGEforL(aL, bL, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveULGEforL(aL[i], bL[i], cL[i], dL[i])); + } + + testCMoveULLTforL(aL, bL, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveULLTforL(aL[i], bL[i], cL[i], dL[i])); + } + + testCMoveULLEforL(aL, bL, cL, dL, rL, rL); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rL[i], cmoveULLEforL(aL[i], bL[i], cL[i], dL[i])); + } + + // L for F + testCMoveULGTforF(aL, bL, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveULGTforF(aL[i], bL[i], cF[i], dF[i])); + } + + testCMoveULGEforF(aL, bL, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveULGEforF(aL[i], bL[i], cF[i], dF[i])); + } + + testCMoveULLTforF(aL, bL, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveULLTforF(aL[i], bL[i], cF[i], dF[i])); + } + + testCMoveULLEforF(aL, bL, cF, dF, rF, rF); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rF[i], cmoveULLEforF(aL[i], bL[i], cF[i], dF[i])); + } + + // L for D + testCMoveULGTforD(aL, bL, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveULGTforD(aL[i], bL[i], cD[i], dD[i])); + } + + testCMoveULGEforD(aL, bL, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveULGEforD(aL[i], bL[i], cD[i], dD[i])); + } + + testCMoveULLTforD(aL, bL, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveULLTforD(aL[i], bL[i], cD[i], dD[i])); + } + + testCMoveULLEforD(aL, bL, cD, dD, rD, rD); + for (int i = 0; i < SIZE; i++) { + Asserts.assertEquals(rD[i], cmoveULLEforD(aL[i], bL[i], cD[i], dD[i])); + } + + // Float testCMoveFGTforI(aF, bF, cI, dI, rI, rI); for (int i = 0; i < SIZE; i++) { Asserts.assertEquals(rI[i], cmoveFGTforI(aF[i], bF[i], cI[i], dI[i])); From 28f2591bad49c4d1590325c3d315d850ab6bcc7d Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Wed, 29 Oct 2025 15:36:43 +0000 Subject: [PATCH 352/561] 8370568: Refer to Thread.interrupted as "interrupted status" consistently Reviewed-by: jpai, rriggs, alanb --- .../server/CompilerThreadPool.java | 4 +-- .../share/classes/java/lang/Object.java | 4 +-- .../share/classes/java/lang/Process.java | 2 +- .../share/classes/java/lang/Thread.java | 14 ++++---- .../classes/java/lang/VirtualThread.java | 10 +++--- .../classes/java/net/DatagramSocket.java | 8 ++--- .../share/classes/java/net/ServerSocket.java | 8 ++--- .../share/classes/java/net/Socket.java | 24 +++++++------ .../channels/ClosedByInterruptException.java | 2 +- .../java/nio/channels/DatagramChannel.java | 8 ++--- .../java/nio/channels/FileChannel.java | 16 ++++----- .../FileLockInterruptionException.java | 2 +- .../nio/channels/GatheringByteChannel.java | 4 +-- .../nio/channels/InterruptibleChannel.java | 8 ++--- .../nio/channels/ReadableByteChannel.java | 4 +-- .../nio/channels/ScatteringByteChannel.java | 6 ++-- .../classes/java/nio/channels/Selector.java | 4 +-- .../nio/channels/ServerSocketChannel.java | 4 +-- .../java/nio/channels/SocketChannel.java | 8 ++--- .../nio/channels/WritableByteChannel.java | 2 +- .../java/util/concurrent/ExecutorService.java | 4 +-- .../java/util/concurrent/ForkJoinPool.java | 6 ++-- .../java/util/concurrent/FutureTask.java | 2 +- .../java/util/concurrent/Semaphore.java | 4 +-- .../locks/AbstractQueuedLongSynchronizer.java | 8 ++--- .../locks/AbstractQueuedSynchronizer.java | 8 ++--- .../util/concurrent/locks/LockSupport.java | 14 ++++---- .../jdk/internal/misc/ThreadFlock.java | 2 +- .../classes/sun/nio/ch/Interruptible.java | 6 ++-- .../security/ssl/StatusResponseManager.java | 4 +-- .../share/classes/java/awt/Robot.java | 8 ++--- .../classes/java/net/http/HttpClient.java | 2 +- .../classes/java/net/http/HttpResponse.java | 2 +- .../internal/parsers/DOMParserImpl.java | 6 ++-- .../classes/com/sun/nio/sctp/SctpChannel.java | 14 ++++---- .../com/sun/nio/sctp/SctpMultiChannel.java | 6 ++-- .../com/sun/nio/sctp/SctpServerChannel.java | 4 +-- .../GetThreadState/GetThreadStateTest.java | 10 +++--- .../intrpthrd001/TestDescription.java | 4 +-- .../java.base/java/lang/Object.java | 4 +-- .../SP01/sp01t002/TestDescription.java | 4 +-- .../SP01/sp01t003/TestDescription.java | 4 +-- .../vmTestbase/nsk/share/gc/AllDiag.java | 4 +-- .../vmTestbase/nsk/share/gc/FinDiag.java | 4 +-- .../vmTestbase/nsk/share/runner/MemDiag.java | 4 +-- .../nio/sctp/SctpServerChannel/Accept.java | 2 +- .../java/lang/Thread/JoinWithDuration.java | 6 ++-- .../java/lang/Thread/SleepWithDuration.java | 6 ++-- .../lang/Thread/virtual/CustomScheduler.java | 4 +-- .../Thread/virtual/MonitorWaitNotify.java | 2 +- .../jdk/java/lang/Thread/virtual/Parking.java | 8 ++--- .../java/lang/Thread/virtual/ThreadAPI.java | 36 +++++++++---------- test/jdk/java/net/Socket/Timeouts.java | 6 ++-- .../net/httpclient/CancelRequestTest.java | 2 +- .../Channels/SocketChannelStreams.java | 6 ++-- .../DatagramChannel/InterruptibleOrNot.java | 18 +++++----- .../FileChannel/CloseDuringTransfer.java | 4 +-- .../FileChannel/ClosedByInterrupt.java | 6 ++-- .../java/nio/channels/Pipe/PipeInterrupt.java | 4 +-- .../channels/Selector/LotsOfInterrupts.java | 4 +-- .../channels/Selector/SelectWithConsumer.java | 12 +++---- .../channels/Selector/WakeupAfterClose.java | 4 +-- .../SocketChannel/AdaptorStreams.java | 8 ++--- .../nio/channels/vthread/SelectorOps.java | 4 +-- .../nio/file/Files/CallWithInterruptSet.java | 4 +-- .../java/nio/file/Files/InterruptCopy.java | 4 +-- .../CompletableFuture/LostInterrupt.java | 12 +++---- .../SwallowedInterruptedException.java | 6 ++-- .../concurrent/ExecutorService/CloseTest.java | 8 ++--- .../ExecutorService/InvokeTest.java | 8 ++--- .../StructuredTaskScopeTest.java | 14 ++++---- .../ThreadPerTaskExecutorTest.java | 8 ++--- .../util/concurrent/tck/JSR166TestCase.java | 6 ++-- .../util/concurrent/tck/StampedLockTest.java | 2 +- test/jdk/java/util/zip/InterruptibleZip.java | 4 +-- .../misc/ThreadFlock/ThreadFlockTest.java | 16 ++++----- .../ssl/StatusResponseManagerTests.java | 2 +- 77 files changed, 260 insertions(+), 256 deletions(-) diff --git a/make/langtools/tools/javacserver/server/CompilerThreadPool.java b/make/langtools/tools/javacserver/server/CompilerThreadPool.java index 1f9e3a195b6..460adcfba28 100644 --- a/make/langtools/tools/javacserver/server/CompilerThreadPool.java +++ b/make/langtools/tools/javacserver/server/CompilerThreadPool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2024, 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. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ public class CompilerThreadPool { } catch (InterruptedException ie) { // (Re-)Cancel if current thread also interrupted pool.shutdownNow(); - // Preserve interrupt status + // Preserve interrupted status Thread.currentThread().interrupt(); } } diff --git a/src/java.base/share/classes/java/lang/Object.java b/src/java.base/share/classes/java/lang/Object.java index 11dcab1b005..185882cc7cc 100644 --- a/src/java.base/share/classes/java/lang/Object.java +++ b/src/java.base/share/classes/java/lang/Object.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -383,7 +383,7 @@ public class Object { try { wait0(timeoutMillis); } catch (InterruptedException e) { - // virtual thread's interrupt status needs to be cleared + // virtual thread's interrupted status needs to be cleared vthread.getAndClearInterrupt(); throw e; } diff --git a/src/java.base/share/classes/java/lang/Process.java b/src/java.base/share/classes/java/lang/Process.java index 0a55343926f..577ee538326 100644 --- a/src/java.base/share/classes/java/lang/Process.java +++ b/src/java.base/share/classes/java/lang/Process.java @@ -774,7 +774,7 @@ public abstract class Process { * @implSpec * This implementation executes {@link #waitFor()} in a separate thread * repeatedly until it returns successfully. If the execution of - * {@code waitFor} is interrupted, the thread's interrupt status is preserved. + * {@code waitFor} is interrupted, the thread's interrupted status is preserved. *

          * When {@link #waitFor()} returns successfully the CompletableFuture is * {@linkplain java.util.concurrent.CompletableFuture#complete completed} regardless diff --git a/src/java.base/share/classes/java/lang/Thread.java b/src/java.base/share/classes/java/lang/Thread.java index 40f2dacadd2..ace29f30a56 100644 --- a/src/java.base/share/classes/java/lang/Thread.java +++ b/src/java.base/share/classes/java/lang/Thread.java @@ -228,7 +228,7 @@ public class Thread implements Runnable { // thread name private volatile String name; - // interrupt status (read/written by VM) + // interrupted status (read/written by VM) volatile boolean interrupted; // context ClassLoader @@ -355,7 +355,7 @@ public class Thread implements Runnable { /* The object in which this thread is blocked in an interruptible I/O * operation, if any. The blocker's interrupt method should be invoked - * after setting this thread's interrupt status. + * after setting this thread's interrupted status. */ private Interruptible nioBlocker; @@ -1535,22 +1535,22 @@ public class Thread implements Runnable { * Object#wait(long, int) wait(long, int)} methods of the {@link Object} * class, or of the {@link #join()}, {@link #join(long)}, {@link * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)} - * methods of this class, then its interrupt status will be cleared and it + * methods of this class, then its interrupted status will be cleared and it * will receive an {@link InterruptedException}. * *

          If this thread is blocked in an I/O operation upon an {@link * java.nio.channels.InterruptibleChannel InterruptibleChannel} - * then the channel will be closed, the thread's interrupt + * then the channel will be closed, the thread's interrupted * status will be set, and the thread will receive a {@link * java.nio.channels.ClosedByInterruptException}. * *

          If this thread is blocked in a {@link java.nio.channels.Selector} - * then the thread's interrupt status will be set and it will return + * then the thread's interrupted status will be set and it will return * immediately from the selection operation, possibly with a non-zero * value, just as if the selector's {@link * java.nio.channels.Selector#wakeup wakeup} method were invoked. * - *

          If none of the previous conditions hold then this thread's interrupt + *

          If none of the previous conditions hold then this thread's interrupted * status will be set.

          * *

          Interrupting a thread that is not alive need not have any effect. @@ -1560,7 +1560,7 @@ public class Thread implements Runnable { * will report it via {@link #interrupted()} and {@link #isInterrupted()}. */ public void interrupt() { - // Setting the interrupt status must be done before reading nioBlocker. + // Setting the interrupted status must be done before reading nioBlocker. interrupted = true; interrupt0(); // inform VM of interrupt diff --git a/src/java.base/share/classes/java/lang/VirtualThread.java b/src/java.base/share/classes/java/lang/VirtualThread.java index 19465eb32db..a23cbb72a6c 100644 --- a/src/java.base/share/classes/java/lang/VirtualThread.java +++ b/src/java.base/share/classes/java/lang/VirtualThread.java @@ -483,12 +483,12 @@ final class VirtualThread extends BaseVirtualThread { Thread carrier = Thread.currentCarrierThread(); setCarrierThread(carrier); - // sync up carrier thread interrupt status if needed + // sync up carrier thread interrupted status if needed if (interrupted) { carrier.setInterrupt(); } else if (carrier.isInterrupted()) { synchronized (interruptLock) { - // need to recheck interrupt status + // need to recheck interrupted status if (!interrupted) { carrier.clearInterrupt(); } @@ -721,7 +721,7 @@ final class VirtualThread extends BaseVirtualThread { /** * Parks until unparked or interrupted. If already unparked then the parking * permit is consumed and this method completes immediately (meaning it doesn't - * yield). It also completes immediately if the interrupt status is set. + * yield). It also completes immediately if the interrupted status is set. */ @Override void park() { @@ -756,7 +756,7 @@ final class VirtualThread extends BaseVirtualThread { * Parks up to the given waiting time or until unparked or interrupted. * If already unparked then the parking permit is consumed and this method * completes immediately (meaning it doesn't yield). It also completes immediately - * if the interrupt status is set or the waiting time is {@code <= 0}. + * if the interrupted status is set or the waiting time is {@code <= 0}. * * @param nanos the maximum number of nanoseconds to wait. */ @@ -799,7 +799,7 @@ final class VirtualThread extends BaseVirtualThread { /** * Parks the current carrier thread up to the given waiting time or until * unparked or interrupted. If the virtual thread is interrupted then the - * interrupt status will be propagated to the carrier thread. + * interrupted status will be propagated to the carrier thread. * @param timed true for a timed park, false for untimed * @param nanos the waiting time in nanoseconds */ diff --git a/src/java.base/share/classes/java/net/DatagramSocket.java b/src/java.base/share/classes/java/net/DatagramSocket.java index 87b52699993..20b4d8a96f1 100644 --- a/src/java.base/share/classes/java/net/DatagramSocket.java +++ b/src/java.base/share/classes/java/net/DatagramSocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -611,13 +611,13 @@ public class DatagramSocket implements java.io.Closeable { * with a {@link DatagramChannel DatagramChannel}. In that case, * interrupting a thread receiving a datagram packet will close the * underlying channel and cause this method to throw {@link - * java.nio.channels.ClosedByInterruptException} with the interrupt - * status set. + * java.nio.channels.ClosedByInterruptException} with the thread's + * interrupted status set. *

        • The datagram socket uses the system-default socket implementation and * a {@linkplain Thread#isVirtual() virtual thread} is receiving a * datagram packet. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. This method will then throw - * {@code SocketException} with the interrupt status set. + * {@code SocketException} with the thread's interrupted status set. * * * @param p the {@code DatagramPacket} into which to place diff --git a/src/java.base/share/classes/java/net/ServerSocket.java b/src/java.base/share/classes/java/net/ServerSocket.java index 945693ef65e..af7cedfd966 100644 --- a/src/java.base/share/classes/java/net/ServerSocket.java +++ b/src/java.base/share/classes/java/net/ServerSocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -406,13 +406,13 @@ public class ServerSocket implements java.io.Closeable { * with a {@link ServerSocketChannel ServerSocketChannel}. In that * case, interrupting a thread accepting a connection will close the * underlying channel and cause this method to throw {@link - * java.nio.channels.ClosedByInterruptException} with the interrupt - * status set. + * java.nio.channels.ClosedByInterruptException} with the thread's + * interrupted status set. *
        • The socket uses the system-default socket implementation and a * {@linkplain Thread#isVirtual() virtual thread} is accepting a * connection. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. This method will then throw - * {@code SocketException} with the interrupt status set. + * {@code SocketException} with the thread's interrupted status set. * * * @implNote diff --git a/src/java.base/share/classes/java/net/Socket.java b/src/java.base/share/classes/java/net/Socket.java index 692c3395f78..a2aee2e45a1 100644 --- a/src/java.base/share/classes/java/net/Socket.java +++ b/src/java.base/share/classes/java/net/Socket.java @@ -573,12 +573,13 @@ public class Socket implements java.io.Closeable { * a {@link SocketChannel SocketChannel}. * In that case, interrupting a thread establishing a connection will * close the underlying channel and cause this method to throw - * {@link ClosedByInterruptException} with the interrupt status set. + * {@link ClosedByInterruptException} with the thread's interrupted + * status set. *
        • The socket uses the system-default socket implementation and a * {@linkplain Thread#isVirtual() virtual thread} is establishing a * connection. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. This method will then throw - * {@code SocketException} with the interrupt status set. + * {@code SocketException} with the thread's interrupted status set. * * * @param endpoint the {@code SocketAddress} @@ -613,12 +614,13 @@ public class Socket implements java.io.Closeable { * a {@link SocketChannel SocketChannel}. * In that case, interrupting a thread establishing a connection will * close the underlying channel and cause this method to throw - * {@link ClosedByInterruptException} with the interrupt status set. + * {@link ClosedByInterruptException} with the thread's interrupted + * status set. *
        • The socket uses the system-default socket implementation and a * {@linkplain Thread#isVirtual() virtual thread} is establishing a * connection. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. This method will then throw - * {@code SocketException} with the interrupt status set. + * {@code SocketException} with the thread's interrupted status set. * * * @apiNote Establishing a TCP/IP connection is subject to connect timeout settings @@ -886,13 +888,14 @@ public class Socket implements java.io.Closeable { * a {@link SocketChannel SocketChannel}. * In that case, interrupting a thread reading from the input stream * will close the underlying channel and cause the read method to - * throw {@link ClosedByInterruptException} with the interrupt - * status set. + * throw {@link ClosedByInterruptException} with the thread's + * interrupted status set. *
        • The socket uses the system-default socket implementation and a * {@linkplain Thread#isVirtual() virtual thread} is reading from the * input stream. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. The read method will then - * throw {@code SocketException} with the interrupt status set. + * throw {@code SocketException} with the thread's interrupted + * status set. * * *

          Under abnormal conditions the underlying connection may be @@ -1026,13 +1029,14 @@ public class Socket implements java.io.Closeable { * a {@link SocketChannel SocketChannel}. * In that case, interrupting a thread writing to the output stream * will close the underlying channel and cause the write method to - * throw {@link ClosedByInterruptException} with the interrupt status - * set. + * throw {@link ClosedByInterruptException} with the thread's + * interrupted status set. *

        • The socket uses the system-default socket implementation and a * {@linkplain Thread#isVirtual() virtual thread} is writing to the * output stream. In that case, interrupting the virtual thread will * cause it to wakeup and close the socket. The write method will then - * throw {@code SocketException} with the interrupt status set. + * throw {@code SocketException} with the thread's interrupted + * status set. * * *

          Closing the returned {@link java.io.OutputStream OutputStream} diff --git a/src/java.base/share/classes/java/nio/channels/ClosedByInterruptException.java b/src/java.base/share/classes/java/nio/channels/ClosedByInterruptException.java index c612458c9e4..a2f62aaed32 100644 --- a/src/java.base/share/classes/java/nio/channels/ClosedByInterruptException.java +++ b/src/java.base/share/classes/java/nio/channels/ClosedByInterruptException.java @@ -28,7 +28,7 @@ package java.nio.channels; /** * Checked exception received by a thread when another thread interrupts it * while it is blocked in an I/O operation upon a channel. Before this - * exception is thrown the channel will have been closed and the interrupt + * exception is thrown the channel will have been closed and the interrupted * status of the previously-blocked thread will have been set. * * @since 1.4 diff --git a/src/java.base/share/classes/java/nio/channels/DatagramChannel.java b/src/java.base/share/classes/java/nio/channels/DatagramChannel.java index 392d9add37f..5e72efcdea6 100644 --- a/src/java.base/share/classes/java/nio/channels/DatagramChannel.java +++ b/src/java.base/share/classes/java/nio/channels/DatagramChannel.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -290,7 +290,7 @@ public abstract class DatagramChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws UnresolvedAddressException * If the given remote address is not fully resolved @@ -389,7 +389,7 @@ public abstract class DatagramChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -443,7 +443,7 @@ public abstract class DatagramChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws UnresolvedAddressException * If the given remote address is not fully resolved diff --git a/src/java.base/share/classes/java/nio/channels/FileChannel.java b/src/java.base/share/classes/java/nio/channels/FileChannel.java index 6e78eefcca6..e31d01b34c0 100644 --- a/src/java.base/share/classes/java/nio/channels/FileChannel.java +++ b/src/java.base/share/classes/java/nio/channels/FileChannel.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -662,7 +662,7 @@ public abstract class FileChannel * @throws ClosedByInterruptException * If another thread interrupts the current thread while the * transfer is in progress, thereby closing both channels and - * setting the current thread's interrupt status + * setting the current thread's interrupted status * * @throws IOException * If some other I/O error occurs @@ -732,7 +732,7 @@ public abstract class FileChannel * @throws ClosedByInterruptException * If another thread interrupts the current thread while the * transfer is in progress, thereby closing both channels and - * setting the current thread's interrupt status + * setting the current thread's interrupted status * * @throws IOException * If some other I/O error occurs @@ -780,7 +780,7 @@ public abstract class FileChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -829,7 +829,7 @@ public abstract class FileChannel * If another thread interrupts the current thread * while the write operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -1093,10 +1093,10 @@ public abstract class FileChannel * this method then an {@link AsynchronousCloseException} will be thrown. * *

          If the invoking thread is interrupted while waiting to acquire the - * lock then its interrupt status will be set and a {@link + * lock then its interrupted status will be set and a {@link * FileLockInterruptionException} will be thrown. If the invoker's - * interrupt status is set when this method is invoked then that exception - * will be thrown immediately; the thread's interrupt status will not be + * interrupted status is set when this method is invoked then that exception + * will be thrown immediately; the thread's interrupted status will not be * changed. * *

          The region specified by the {@code position} and {@code size} diff --git a/src/java.base/share/classes/java/nio/channels/FileLockInterruptionException.java b/src/java.base/share/classes/java/nio/channels/FileLockInterruptionException.java index 7ecae1b4a46..ae1f12f15fc 100644 --- a/src/java.base/share/classes/java/nio/channels/FileLockInterruptionException.java +++ b/src/java.base/share/classes/java/nio/channels/FileLockInterruptionException.java @@ -28,7 +28,7 @@ package java.nio.channels; /** * Checked exception received by a thread when another thread interrupts it * while it is waiting to acquire a file lock. Before this exception is thrown - * the interrupt status of the previously-blocked thread will have been set. + * the interrupted status of the previously-blocked thread will have been set. * * @since 1.4 */ diff --git a/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java b/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java index e2e97562dee..0b03b9c8196 100644 --- a/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/GatheringByteChannel.java @@ -123,7 +123,7 @@ public interface GatheringByteChannel * If another thread interrupts the current thread * while the write operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -161,7 +161,7 @@ public interface GatheringByteChannel * If another thread interrupts the current thread * while the write operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/java.base/share/classes/java/nio/channels/InterruptibleChannel.java b/src/java.base/share/classes/java/nio/channels/InterruptibleChannel.java index d13a37aeae4..c1c3628f7a4 100644 --- a/src/java.base/share/classes/java/nio/channels/InterruptibleChannel.java +++ b/src/java.base/share/classes/java/nio/channels/InterruptibleChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -45,11 +45,11 @@ import java.io.IOException; * another thread may invoke the blocked thread's {@link Thread#interrupt() * interrupt} method. This will cause the channel to be closed, the blocked * thread to receive a {@link ClosedByInterruptException}, and the blocked - * thread's interrupt status to be set. + * thread's interrupted status to be set. * - *

          If a thread's interrupt status is already set and it invokes a blocking + *

          If a thread's interrupted status is already set and it invokes a blocking * I/O operation upon a channel then the channel will be closed and the thread - * will immediately receive a {@link ClosedByInterruptException}; its interrupt + * will immediately receive a {@link ClosedByInterruptException}; its interrupted * status will remain set. * *

          A channel supports asynchronous closing and interruption if, and only diff --git a/src/java.base/share/classes/java/nio/channels/ReadableByteChannel.java b/src/java.base/share/classes/java/nio/channels/ReadableByteChannel.java index 7d544458390..37b3a5442bc 100644 --- a/src/java.base/share/classes/java/nio/channels/ReadableByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/ReadableByteChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -101,7 +101,7 @@ public interface ReadableByteChannel extends Channel { * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/java.base/share/classes/java/nio/channels/ScatteringByteChannel.java b/src/java.base/share/classes/java/nio/channels/ScatteringByteChannel.java index 27fce3c1e09..66ff5047d70 100644 --- a/src/java.base/share/classes/java/nio/channels/ScatteringByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/ScatteringByteChannel.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,7 +119,7 @@ public interface ScatteringByteChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -160,7 +160,7 @@ public interface ScatteringByteChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/java.base/share/classes/java/nio/channels/Selector.java b/src/java.base/share/classes/java/nio/channels/Selector.java index d8c0dc261bd..b90b8929a51 100644 --- a/src/java.base/share/classes/java/nio/channels/Selector.java +++ b/src/java.base/share/classes/java/nio/channels/Selector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -236,7 +236,7 @@ import java.util.function.Consumer; * *

        • By invoking the blocked thread's {@link * java.lang.Thread#interrupt() interrupt} method, in which case its - * interrupt status will be set and the selector's {@link #wakeup wakeup} + * interrupted status will be set and the selector's {@link #wakeup wakeup} * method will be invoked.

        • * * diff --git a/src/java.base/share/classes/java/nio/channels/ServerSocketChannel.java b/src/java.base/share/classes/java/nio/channels/ServerSocketChannel.java index b2ee728cf7f..6cf2520fd78 100644 --- a/src/java.base/share/classes/java/nio/channels/ServerSocketChannel.java +++ b/src/java.base/share/classes/java/nio/channels/ServerSocketChannel.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -328,7 +328,7 @@ public abstract class ServerSocketChannel * If another thread interrupts the current thread * while the accept operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws NotYetBoundException * If this channel's socket has not yet been bound diff --git a/src/java.base/share/classes/java/nio/channels/SocketChannel.java b/src/java.base/share/classes/java/nio/channels/SocketChannel.java index 26878ab4006..493f9e88ebf 100644 --- a/src/java.base/share/classes/java/nio/channels/SocketChannel.java +++ b/src/java.base/share/classes/java/nio/channels/SocketChannel.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -250,7 +250,7 @@ public abstract class SocketChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws UnresolvedAddressException * If the given remote address is an InetSocketAddress that is not fully @@ -485,7 +485,7 @@ public abstract class SocketChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws UnresolvedAddressException * If the given remote address is an InetSocketAddress that is not fully resolved @@ -542,7 +542,7 @@ public abstract class SocketChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java b/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java index 5284c72b37b..063cd5eb938 100644 --- a/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java +++ b/src/java.base/share/classes/java/nio/channels/WritableByteChannel.java @@ -98,7 +98,7 @@ public interface WritableByteChannel * If another thread interrupts the current thread * while the write operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/java.base/share/classes/java/util/concurrent/ExecutorService.java b/src/java.base/share/classes/java/util/concurrent/ExecutorService.java index f899b56b288..7b5ca34ac0d 100644 --- a/src/java.base/share/classes/java/util/concurrent/ExecutorService.java +++ b/src/java.base/share/classes/java/util/concurrent/ExecutorService.java @@ -133,7 +133,7 @@ import java.util.List; * } catch (InterruptedException ex) { * // (Re-)Cancel if current thread also interrupted * pool.shutdownNow(); - * // Preserve interrupt status + * // Preserve interrupted status * Thread.currentThread().interrupt(); * } * }} @@ -375,7 +375,7 @@ public interface ExecutorService extends Executor, AutoCloseable { *

          If interrupted while waiting, this method stops all executing tasks as * if by invoking {@link #shutdownNow()}. It then continues to wait until all * actively executing tasks have completed. Tasks that were awaiting - * execution are not executed. The interrupt status will be re-asserted + * execution are not executed. The interrupted status will be re-asserted * before this method returns. * *

          If already terminated, invoking this method has no effect. diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java index 482fe3cf801..1f2c8d2ffa6 100644 --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java @@ -875,7 +875,7 @@ public class ForkJoinPool extends AbstractExecutorService * ==================== * * Regular ForkJoinTasks manage task cancellation (method cancel) - * independently from the interrupt status of threads running + * independently from the interrupted status of threads running * tasks. Interrupts are issued internally only while * terminating, to wake up workers and cancel queued tasks. By * default, interrupts are cleared only when necessary to ensure @@ -900,7 +900,7 @@ public class ForkJoinPool extends AbstractExecutorService * with results accessed via join() differ from those via get(), * which differ from those invoked using pool submit methods by * non-workers (which comply with Future.get() specs). Internal - * usages of ForkJoinTasks ignore interrupt status when executing + * usages of ForkJoinTasks ignore interrupted status when executing * or awaiting completion. Otherwise, reporting task results or * exceptions is preferred to throwing InterruptedExceptions, * which are in turn preferred to timeouts. Similarly, completion @@ -4171,7 +4171,7 @@ public class ForkJoinPool extends AbstractExecutorService * method stops all executing tasks as if by invoking {@link * #shutdownNow()}. It then continues to wait until all actively * executing tasks have completed. Tasks that were awaiting - * execution are not executed. The interrupt status will be + * execution are not executed. The interrupted status will be * re-asserted before this method returns. * * @since 19 diff --git a/src/java.base/share/classes/java/util/concurrent/FutureTask.java b/src/java.base/share/classes/java/util/concurrent/FutureTask.java index 2ec97629105..a571cb77cce 100644 --- a/src/java.base/share/classes/java/util/concurrent/FutureTask.java +++ b/src/java.base/share/classes/java/util/concurrent/FutureTask.java @@ -69,7 +69,7 @@ public class FutureTask implements RunnableFuture { /* * Revision notes: This differs from previous versions of this * class that relied on AbstractQueuedSynchronizer, mainly to - * avoid surprising users about retaining interrupt status during + * avoid surprising users about retaining interrupted status during * cancellation races. Sync control in the current design relies * on a "state" field updated via CAS to track completion, along * with a simple Treiber stack to hold waiting threads. diff --git a/src/java.base/share/classes/java/util/concurrent/Semaphore.java b/src/java.base/share/classes/java/util/concurrent/Semaphore.java index 0e7a9ccc0b3..fce0c39cb78 100644 --- a/src/java.base/share/classes/java/util/concurrent/Semaphore.java +++ b/src/java.base/share/classes/java/util/concurrent/Semaphore.java @@ -334,7 +334,7 @@ public class Semaphore implements java.io.Serializable { * while waiting for a permit then it will continue to wait, but the * time at which the thread is assigned a permit may change compared to * the time it would have received the permit had no interruption - * occurred. When the thread does return from this method its interrupt + * occurred. When the thread does return from this method its interrupted * status will be set. */ public void acquireUninterruptibly() { @@ -494,7 +494,7 @@ public class Semaphore implements java.io.Serializable { *

          If the current thread is {@linkplain Thread#interrupt interrupted} * while waiting for permits then it will continue to wait and its * position in the queue is not affected. When the thread does return - * from this method its interrupt status will be set. + * from this method its interrupted status will be set. * * @param permits the number of permits to acquire * @throws IllegalArgumentException if {@code permits} is negative diff --git a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index c660af6a0ba..ba81123fc35 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -652,7 +652,7 @@ public abstract class AbstractQueuedLongSynchronizer /** * Acquires in exclusive mode, aborting if interrupted. - * Implemented by first checking interrupt status, then invoking + * Implemented by first checking interrupted status, then invoking * at least once {@link #tryAcquire}, returning on * success. Otherwise the thread is queued, possibly repeatedly * blocking and unblocking, invoking {@link #tryAcquire} @@ -674,7 +674,7 @@ public abstract class AbstractQueuedLongSynchronizer /** * Attempts to acquire in exclusive mode, aborting if interrupted, * and failing if the given timeout elapses. Implemented by first - * checking interrupt status, then invoking at least once {@link + * checking interrupted status, then invoking at least once {@link * #tryAcquire}, returning on success. Otherwise, the thread is * queued, possibly repeatedly blocking and unblocking, invoking * {@link #tryAcquire} until success or the thread is interrupted @@ -741,7 +741,7 @@ public abstract class AbstractQueuedLongSynchronizer /** * Acquires in shared mode, aborting if interrupted. Implemented - * by first checking interrupt status, then invoking at least once + * by first checking interrupted status, then invoking at least once * {@link #tryAcquireShared}, returning on success. Otherwise the * thread is queued, possibly repeatedly blocking and unblocking, * invoking {@link #tryAcquireShared} until success or the thread @@ -763,7 +763,7 @@ public abstract class AbstractQueuedLongSynchronizer /** * Attempts to acquire in shared mode, aborting if interrupted, and * failing if the given timeout elapses. Implemented by first - * checking interrupt status, then invoking at least once {@link + * checking interrupted status, then invoking at least once {@link * #tryAcquireShared}, returning on success. Otherwise, the * thread is queued, possibly repeatedly blocking and unblocking, * invoking {@link #tryAcquireShared} until success or the thread diff --git a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index 0ff216c80a0..c0779545083 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -1032,7 +1032,7 @@ public abstract class AbstractQueuedSynchronizer /** * Acquires in exclusive mode, aborting if interrupted. - * Implemented by first checking interrupt status, then invoking + * Implemented by first checking interrupted status, then invoking * at least once {@link #tryAcquire}, returning on * success. Otherwise the thread is queued, possibly repeatedly * blocking and unblocking, invoking {@link #tryAcquire} @@ -1054,7 +1054,7 @@ public abstract class AbstractQueuedSynchronizer /** * Attempts to acquire in exclusive mode, aborting if interrupted, * and failing if the given timeout elapses. Implemented by first - * checking interrupt status, then invoking at least once {@link + * checking interrupted status, then invoking at least once {@link * #tryAcquire}, returning on success. Otherwise, the thread is * queued, possibly repeatedly blocking and unblocking, invoking * {@link #tryAcquire} until success or the thread is interrupted @@ -1121,7 +1121,7 @@ public abstract class AbstractQueuedSynchronizer /** * Acquires in shared mode, aborting if interrupted. Implemented - * by first checking interrupt status, then invoking at least once + * by first checking interrupted status, then invoking at least once * {@link #tryAcquireShared}, returning on success. Otherwise the * thread is queued, possibly repeatedly blocking and unblocking, * invoking {@link #tryAcquireShared} until success or the thread @@ -1143,7 +1143,7 @@ public abstract class AbstractQueuedSynchronizer /** * Attempts to acquire in shared mode, aborting if interrupted, and * failing if the given timeout elapses. Implemented by first - * checking interrupt status, then invoking at least once {@link + * checking interrupted status, then invoking at least once {@link * #tryAcquireShared}, returning on success. Otherwise, the * thread is queued, possibly repeatedly blocking and unblocking, * invoking {@link #tryAcquireShared} until success or the thread diff --git a/src/java.base/share/classes/java/util/concurrent/locks/LockSupport.java b/src/java.base/share/classes/java/util/concurrent/locks/LockSupport.java index 917678b5f1e..38531c80a30 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/LockSupport.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/LockSupport.java @@ -121,7 +121,7 @@ import jdk.internal.misc.Unsafe; * } * * waiters.remove(); - * // ensure correct interrupt status on return + * // ensure correct interrupted status on return * if (wasInterrupted) * Thread.currentThread().interrupt(); * } @@ -207,7 +207,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread upon return. + * for example, the interrupted status of the thread upon return. * * @param blocker the synchronization object responsible for this * thread parking @@ -252,7 +252,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread, or the elapsed time + * for example, the interrupted status of the thread, or the elapsed time * upon return. * * @param blocker the synchronization object responsible for this @@ -300,7 +300,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread, or the current time + * for example, the interrupted status of the thread, or the current time * upon return. * * @param blocker the synchronization object responsible for this @@ -360,7 +360,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread upon return. + * for example, the interrupted status of the thread upon return. */ public static void park() { if (Thread.currentThread().isVirtual()) { @@ -395,7 +395,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread, or the elapsed time + * for example, the interrupted status of the thread, or the elapsed time * upon return. * * @param nanos the maximum number of nanoseconds to wait @@ -434,7 +434,7 @@ public final class LockSupport { *

          This method does not report which of these caused the * method to return. Callers should re-check the conditions which caused * the thread to park in the first place. Callers may also determine, - * for example, the interrupt status of the thread, or the current time + * for example, the interrupted status of the thread, or the current time * upon return. * * @param deadline the absolute time, in milliseconds from the Epoch, diff --git a/src/java.base/share/classes/jdk/internal/misc/ThreadFlock.java b/src/java.base/share/classes/jdk/internal/misc/ThreadFlock.java index 423ffa03d31..32f6d5d4905 100644 --- a/src/java.base/share/classes/jdk/internal/misc/ThreadFlock.java +++ b/src/java.base/share/classes/jdk/internal/misc/ThreadFlock.java @@ -379,7 +379,7 @@ public class ThreadFlock implements AutoCloseable { *

          This method may only be invoked by the flock owner. * *

          If interrupted then this method continues to wait until all threads - * finish, before completing with the interrupt status set. + * finish, before completing with the interrupted status set. * *

          A ThreadFlock is intended to be used in a structured manner. If * this method is called to close a flock before nested flocks are closed then it diff --git a/src/java.base/share/classes/sun/nio/ch/Interruptible.java b/src/java.base/share/classes/sun/nio/ch/Interruptible.java index b5d9a7d2b3f..25f762a1d6a 100644 --- a/src/java.base/share/classes/sun/nio/ch/Interruptible.java +++ b/src/java.base/share/classes/sun/nio/ch/Interruptible.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,14 +35,14 @@ public interface Interruptible { * Invoked by Thread.interrupt when the given Thread is interrupted. Thread.interrupt * invokes this method while holding the given Thread's interrupt lock. This method * is also invoked by AbstractInterruptibleChannel when beginning an I/O operation - * with the current thread's interrupt status set. This method must not block. + * with the current thread's interrupted status set. This method must not block. */ void interrupt(Thread target); /** * Invoked by Thread.interrupt after releasing the Thread's interrupt lock. * It may also be invoked by AbstractInterruptibleChannel or AbstractSelector when - * beginning an I/O operation with the current thread's interrupt status set, or at + * beginning an I/O operation with the current thread's interrupted status set, or at * the end of an I/O operation when any thread doing I/O on the channel (or selector) * has been interrupted. This method closes the channel (or wakes up the Selector) to * ensure that AsynchronousCloseException or ClosedByInterruptException is thrown. diff --git a/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java b/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java index 1383db1ce82..ec200c6e495 100644 --- a/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java +++ b/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -278,7 +278,7 @@ final class StatusResponseManager { } } } catch (InterruptedException intex) { - // Log and reset the interrupt state + // Log and reset the interrupted state Thread.currentThread().interrupt(); if (SSLLogger.isOn && SSLLogger.isOn("respmgr")) { SSLLogger.fine("Interrupt occurred while fetching: " + diff --git a/src/java.desktop/share/classes/java/awt/Robot.java b/src/java.desktop/share/classes/java/awt/Robot.java index 957e30126e1..e91cc582c4c 100644 --- a/src/java.desktop/share/classes/java/awt/Robot.java +++ b/src/java.desktop/share/classes/java/awt/Robot.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -717,8 +717,8 @@ public class Robot { * Sleeps for the specified time. *

          * If the invoking thread is interrupted while waiting, then it will return - * immediately with the interrupt status set. If the interrupted status is - * already set, this method returns immediately with the interrupt status + * immediately with the interrupted status set. If the interrupted status is + * already set, this method returns immediately with the interrupted status * set. * * @apiNote It is recommended to avoid calling this method on @@ -736,7 +736,7 @@ public class Robot { try { Thread.sleep(ms); } catch (final InterruptedException ignored) { - thread.interrupt(); // Preserve interrupt status + thread.interrupt(); // Preserve interrupted status } } } diff --git a/src/java.net.http/share/classes/java/net/http/HttpClient.java b/src/java.net.http/share/classes/java/net/http/HttpClient.java index 4ce77486e70..889ea56531e 100644 --- a/src/java.net.http/share/classes/java/net/http/HttpClient.java +++ b/src/java.net.http/share/classes/java/net/http/HttpClient.java @@ -933,7 +933,7 @@ public abstract class HttpClient implements AutoCloseable { *

          If interrupted while waiting, this method may attempt to stop all * operations by calling {@link #shutdownNow()}. It then continues to wait * until all actively executing operations have completed. - * The interrupt status will be re-asserted before this method returns. + * The interrupted status will be re-asserted before this method returns. * *

          If already terminated, invoking this method has no effect. * diff --git a/src/java.net.http/share/classes/java/net/http/HttpResponse.java b/src/java.net.http/share/classes/java/net/http/HttpResponse.java index 9843e4c7c5b..1889d9d7300 100644 --- a/src/java.net.http/share/classes/java/net/http/HttpResponse.java +++ b/src/java.net.http/share/classes/java/net/http/HttpResponse.java @@ -1330,7 +1330,7 @@ public interface HttpResponse { * @implNote The {@code read} method of the {@code InputStream} * returned by the default implementation of this method will * throw an {@code IOException} with the {@linkplain Thread#isInterrupted() - * thread interrupt status set} if the thread is interrupted + * thread interrupted status set} if the thread is interrupted * while blocking on read. In that case, the request will also be * cancelled and the {@code InputStream} will be closed. * diff --git a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java index 45fdbf878cb..9ca148b618b 100644 --- a/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java +++ b/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/parsers/DOMParserImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved. */ /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -926,7 +926,7 @@ extends AbstractDOMParser implements LSParser, DOMConfiguration { parse (source); fBusy = false; if (abortNow && currentThread.isInterrupted()) { - //reset interrupt state + //reset interrupted state abortNow = false; Thread.interrupted(); } @@ -983,7 +983,7 @@ extends AbstractDOMParser implements LSParser, DOMConfiguration { parse (xmlInputSource); fBusy = false; if (abortNow && currentThread.isInterrupted()) { - //reset interrupt state + //reset interrupted state abortNow = false; Thread.interrupted(); } diff --git a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpChannel.java b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpChannel.java index 30920864c98..312a143a8e4 100644 --- a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpChannel.java +++ b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -202,7 +202,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.UnresolvedAddressException * If the given remote address is not fully resolved @@ -422,7 +422,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.UnresolvedAddressException * If the given remote address is not fully resolved @@ -483,7 +483,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.UnresolvedAddressException * If the given remote address is not fully resolved @@ -552,7 +552,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the connect operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs @@ -776,7 +776,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.NotYetConnectedException * If this channel is not yet connected @@ -843,7 +843,7 @@ public abstract class SctpChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.NotYetConnectedException * If this channel is not yet connected diff --git a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpMultiChannel.java b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpMultiChannel.java index a44a5d9c142..54b5bb796b0 100644 --- a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpMultiChannel.java +++ b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpMultiChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -596,7 +596,7 @@ public abstract class SctpMultiChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws NotYetBoundException * If this channel is not yet bound @@ -682,7 +682,7 @@ public abstract class SctpMultiChannel * If another thread interrupts the current thread * while the read operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws IOException * If some other I/O error occurs diff --git a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpServerChannel.java b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpServerChannel.java index 27abbc71b29..816289bb380 100644 --- a/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpServerChannel.java +++ b/src/jdk.sctp/share/classes/com/sun/nio/sctp/SctpServerChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -132,7 +132,7 @@ public abstract class SctpServerChannel * If another thread interrupts the current thread * while the accept operation is in progress, thereby * closing the channel and setting the current thread's - * interrupt status + * interrupted status * * @throws java.nio.channels.NotYetBoundException * If this channel's socket has not yet been bound diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/GetThreadState/GetThreadStateTest.java b/test/hotspot/jtreg/serviceability/jvmti/vthread/GetThreadState/GetThreadStateTest.java index 9ec9ca1b8c2..7f524f80267 100644 --- a/test/hotspot/jtreg/serviceability/jvmti/vthread/GetThreadState/GetThreadStateTest.java +++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/GetThreadState/GetThreadStateTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -105,7 +105,7 @@ class GetThreadStateTest { int expected = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE; check(thread, expected); - // re-test with interrupt status set + // re-test with interrupted status set thread.interrupt(); check(thread, expected | JVMTI_THREAD_STATE_INTERRUPTED); } finally { @@ -143,7 +143,7 @@ class GetThreadStateTest { int expected = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER; await(thread, expected); - // re-test with interrupt status set + // re-test with interrupted status set thread.interrupt(); check(thread, expected | JVMTI_THREAD_STATE_INTERRUPTED); } @@ -192,7 +192,7 @@ class GetThreadStateTest { expected = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER; check(thread, expected); - // re-test with interrupt status set + // re-test with interrupted status set thread.interrupt(); check(thread, expected | JVMTI_THREAD_STATE_INTERRUPTED); } @@ -244,7 +244,7 @@ class GetThreadStateTest { expected = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER; check(thread, expected); - // re-test with interrupt status set + // re-test with interrupted status set thread.interrupt(); check(thread, expected | JVMTI_THREAD_STATE_INTERRUPTED); } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/InterruptThread/intrpthrd001/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/InterruptThread/intrpthrd001/TestDescription.java index f74b8cb6c78..f878dbede82 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/InterruptThread/intrpthrd001/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/InterruptThread/intrpthrd001/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ * - sleeping on Thread.sleep() * then agent part of the test calls InterruptThread for these threads * and the debugee checks that: - * - the running thread get interrupt status + * - the running thread get interrupted status * - the waiting and sleeping threads get InterruptedException * COMMENTS * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/bcinstr/BI04/bi04t002/newclass02/java.base/java/lang/Object.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/bcinstr/BI04/bi04t002/newclass02/java.base/java/lang/Object.java index 47e030945ab..a52a76895f5 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/bcinstr/BI04/bi04t002/newclass02/java.base/java/lang/Object.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/bcinstr/BI04/bi04t002/newclass02/java.base/java/lang/Object.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -383,7 +383,7 @@ public class Object { try { wait0(timeoutMillis); } catch (InterruptedException e) { - // virtual thread's interrupt status needs to be cleared + // virtual thread's interrupted status needs to be cleared vthread.getAndClearInterrupt(); throw e; } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t002/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t002/TestDescription.java index c8003af65ee..e095d4dc8a0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t002/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t002/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ * COMMENTS * Converted the test to use GetThreadState instead of GetThreadStatus. * Test fixed according to test bug: - * 4935244 TEST BUG: wrong interrupt status flag tests. + * 4935244 TEST BUG: wrong interrupted status flag tests. * Fixed according to test bug: * 6405644 TEST_BUG: no proper sync with agent thread in sp02t001/sp02t003 * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t003/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t003/TestDescription.java index 99509bf5107..04e5ff8ad35 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t003/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/sampling/SP01/sp01t003/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ * COMMENTS * Converted the test to use GetThreadState instead of GetThreadStatus. * Test fixed according to test bug: - * 4935244 TEST BUG: wrong interrupt status flag tests. + * 4935244 TEST BUG: wrong interrupted status flag tests. * Fixed according to test bug: * 6405644 TEST_BUG: no proper sync with agent thread in sp02t001/sp02t003 * diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/AllDiag.java b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/AllDiag.java index e9f9b42955e..ec93f3df2c0 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/AllDiag.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/AllDiag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -41,7 +41,7 @@ public class AllDiag implements Runnable { public void run() { AllMemoryObject.dumpStatistics(); - // Ensure that interrupt status is not lost + // Ensure that interrupted status is not lost if (Thread.currentThread().isInterrupted()) return; try { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/FinDiag.java b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/FinDiag.java index 58cda02b24f..1864687e122 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/gc/FinDiag.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/gc/FinDiag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -41,7 +41,7 @@ public class FinDiag implements Runnable { public void run() { FinMemoryObject.dumpStatistics(); - // Ensure that interrupt status is not lost + // Ensure that interrupted status is not lost if (Thread.currentThread().isInterrupted()) return; try { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/runner/MemDiag.java b/test/hotspot/jtreg/vmTestbase/nsk/share/runner/MemDiag.java index f361c62b5ae..19dce3d8c39 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/runner/MemDiag.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/runner/MemDiag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -39,7 +39,7 @@ public class MemDiag implements Runnable { public void run() { System.out.println(Runtime.getRuntime().freeMemory()); - // Ensure that interrupt status is not lost + // Ensure that interrupted status is not lost if (Thread.currentThread().isInterrupted()) return; try { diff --git a/test/jdk/com/sun/nio/sctp/SctpServerChannel/Accept.java b/test/jdk/com/sun/nio/sctp/SctpServerChannel/Accept.java index 56522a85f6b..c68bfd28945 100644 --- a/test/jdk/com/sun/nio/sctp/SctpServerChannel/Accept.java +++ b/test/jdk/com/sun/nio/sctp/SctpServerChannel/Accept.java @@ -190,7 +190,7 @@ public class Accept { /* TEST 5: AsynchronousCloseException */ debug("TEST 5: AsynchronousCloseException"); - /* reset thread interrupt status */ + /* reset thread interrupted status */ Thread.currentThread().interrupted(); ssc = SctpServerChannel.open().bind(null); diff --git a/test/jdk/java/lang/Thread/JoinWithDuration.java b/test/jdk/java/lang/Thread/JoinWithDuration.java index 0eae0daeb78..5eebacf2107 100644 --- a/test/jdk/java/lang/Thread/JoinWithDuration.java +++ b/test/jdk/java/lang/Thread/JoinWithDuration.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -100,7 +100,7 @@ class JoinWithDuration { } /** - * Test invoking join with interrupt status set. + * Test invoking join with interrupted status set. */ @Test void testJoinWithInterruptStatusSet() throws Exception { @@ -141,7 +141,7 @@ class JoinWithDuration { thread.join(Duration.ofMinutes(1)); fail(); } catch (InterruptedException e) { - // interrupt status should be cleared + // interrupted status should be cleared assertFalse(thread.isInterrupted()); } finally { LockSupport.unpark(thread); diff --git a/test/jdk/java/lang/Thread/SleepWithDuration.java b/test/jdk/java/lang/Thread/SleepWithDuration.java index 4db64957f64..00704cdcb7c 100644 --- a/test/jdk/java/lang/Thread/SleepWithDuration.java +++ b/test/jdk/java/lang/Thread/SleepWithDuration.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -53,7 +53,7 @@ class SleepWithDuration { } /** - * Test Thread.sleep with interrupt status set. + * Test Thread.sleep with interrupted status set. */ @Test void testSleepWithInterruptStatusSet() throws Exception { @@ -94,7 +94,7 @@ class SleepWithDuration { Thread.sleep(Duration.ofSeconds(60)); fail(); } catch (InterruptedException e) { - // interrupt status should be cleared + // interrupted status should be cleared assertFalse(Thread.interrupted()); } finally { wakerThread.join(); diff --git a/test/jdk/java/lang/Thread/virtual/CustomScheduler.java b/test/jdk/java/lang/Thread/virtual/CustomScheduler.java index 4289add0a3a..1b0a6b28e96 100644 --- a/test/jdk/java/lang/Thread/virtual/CustomScheduler.java +++ b/test/jdk/java/lang/Thread/virtual/CustomScheduler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, 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. * * This code is free software; you can redistribute it and/or modify it @@ -204,7 +204,7 @@ class CustomScheduler { } /** - * Test running task with the carrier interrupt status set. + * Test running task with the carrier's interrupted status set. */ @Test void testRunWithInterruptSet() throws Exception { diff --git a/test/jdk/java/lang/Thread/virtual/MonitorWaitNotify.java b/test/jdk/java/lang/Thread/virtual/MonitorWaitNotify.java index 47089d9d6df..5aecc659a31 100644 --- a/test/jdk/java/lang/Thread/virtual/MonitorWaitNotify.java +++ b/test/jdk/java/lang/Thread/virtual/MonitorWaitNotify.java @@ -419,7 +419,7 @@ class MonitorWaitNotify { } /** - * Testing invoking Object.wait with interrupt status set. + * Testing invoking Object.wait with interrupted status set. */ @ParameterizedTest @ValueSource(ints = { 0, 30000, Integer.MAX_VALUE }) diff --git a/test/jdk/java/lang/Thread/virtual/Parking.java b/test/jdk/java/lang/Thread/virtual/Parking.java index c337f36e7c2..4ee320ca99f 100644 --- a/test/jdk/java/lang/Thread/virtual/Parking.java +++ b/test/jdk/java/lang/Thread/virtual/Parking.java @@ -169,7 +169,7 @@ class Parking { } /** - * Park with interrupt status set. + * Park with interrupted status set. */ @Test void testPark8() throws Exception { @@ -196,7 +196,7 @@ class Parking { } /** - * Park while holding monitor and with interrupt status set. + * Park while holding monitor and with interrupted status set. */ @Test void testPark10() throws Exception { @@ -318,7 +318,7 @@ class Parking { } /** - * Park with parkNanos and interrupt status set. + * Park with parkNanos and interrupted status set. */ @Test void testParkNanos8() throws Exception { @@ -345,7 +345,7 @@ class Parking { } /** - * Park with parkNanos while holding monitor and with interrupt status set. + * Park with parkNanos while holding monitor and with interrupted status set. */ @Test void testParkNanos10() throws Exception { diff --git a/test/jdk/java/lang/Thread/virtual/ThreadAPI.java b/test/jdk/java/lang/Thread/virtual/ThreadAPI.java index 397514c3852..1089081d186 100644 --- a/test/jdk/java/lang/Thread/virtual/ThreadAPI.java +++ b/test/jdk/java/lang/Thread/virtual/ThreadAPI.java @@ -403,7 +403,7 @@ class ThreadAPI { } /** - * Test platform thread invoking Thread.join with interrupt status set. + * Test platform thread invoking Thread.join with interrupted status set. */ @Test void testJoin15() throws Exception { @@ -419,7 +419,7 @@ class ThreadAPI { } /** - * Test virtual thread invoking Thread.join with interrupt status set. + * Test virtual thread invoking Thread.join with interrupted status set. */ @Test void testJoin16() throws Exception { @@ -427,7 +427,7 @@ class ThreadAPI { } /** - * Test platform thread invoking timed-Thread.join with interrupt status set. + * Test platform thread invoking timed-Thread.join with interrupted status set. */ @Test void testJoin17() throws Exception { @@ -443,7 +443,7 @@ class ThreadAPI { } /** - * Test virtual thread invoking timed-Thread.join with interrupt status set. + * Test virtual thread invoking timed-Thread.join with interrupted status set. */ @Test void testJoin18() throws Exception { @@ -451,7 +451,7 @@ class ThreadAPI { } /** - * Test platform thread invoking timed-Thread.join with interrupt status set. + * Test platform thread invoking timed-Thread.join with interrupted status set. */ @Test void testJoin19() throws Exception { @@ -468,7 +468,7 @@ class ThreadAPI { } /** - * Test virtual thread invoking timed-Thread.join with interrupt status set. + * Test virtual thread invoking timed-Thread.join with interrupted status set. */ @Test void testJoin20() throws Exception { @@ -593,7 +593,7 @@ class ThreadAPI { } /** - * Test virtual thread with interrupt status set calling Thread.join to wait + * Test virtual thread with interrupted status set calling Thread.join to wait * for platform thread to terminate. */ @Test @@ -732,7 +732,7 @@ class ThreadAPI { assertFalse(me.isInterrupted()); me.interrupt(); assertTrue(me.isInterrupted()); - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status assertFalse(me.isInterrupted()); me.interrupt(); }); @@ -760,7 +760,7 @@ class ThreadAPI { } /** - * Test termination with interrupt status set. + * Test termination with interrupted status set. */ @Test void testInterrupt4() throws Exception { @@ -805,7 +805,7 @@ class ThreadAPI { Thread.sleep(60*1000); fail("sleep not interrupted"); } catch (InterruptedException e) { - // interrupt status should be reset + // interrupted status should be reset assertFalse(Thread.interrupted()); } } catch (Exception e) { @@ -839,7 +839,7 @@ class ThreadAPI { } /** - * Test trying to park with interrupt status set. + * Test trying to park with interrupted status set. */ @Test void testInterrupt8() throws Exception { @@ -852,7 +852,7 @@ class ThreadAPI { } /** - * Test trying to wait with interrupt status set. + * Test trying to wait with interrupted status set. */ @Test void testInterrupt9() throws Exception { @@ -871,7 +871,7 @@ class ThreadAPI { } /** - * Test trying to block with interrupt status set. + * Test trying to block with interrupted status set. */ @Test void testInterrupt10() throws Exception { @@ -1237,7 +1237,7 @@ class ThreadAPI { } /** - * Test Thread.sleep with interrupt status set. + * Test Thread.sleep with interrupted status set. */ @ParameterizedTest @MethodSource("sleepers") @@ -1256,7 +1256,7 @@ class ThreadAPI { } /** - * Test Thread.sleep with interrupt status set and a negative duration. + * Test Thread.sleep with interrupted status set and a negative duration. */ @Test void testSleep4() throws Exception { @@ -1292,7 +1292,7 @@ class ThreadAPI { sleeper.run(); fail("sleep was not interrupted"); } catch (InterruptedException e) { - // interrupt status should be cleared + // interrupted status should be cleared assertFalse(t.isInterrupted()); } }); @@ -1356,7 +1356,7 @@ class ThreadAPI { } /** - * Test Thread.sleep when pinned and with interrupt status set. + * Test Thread.sleep when pinned and with interrupted status set. */ @Test void testSleep9() throws Exception { @@ -1389,7 +1389,7 @@ class ThreadAPI { }); fail("sleep not interrupted"); } catch (InterruptedException e) { - // interrupt status should be cleared + // interrupted status should be cleared assertFalse(t.isInterrupted()); } }); diff --git a/test/jdk/java/net/Socket/Timeouts.java b/test/jdk/java/net/Socket/Timeouts.java index f8fcfb86d0f..17f3d9db809 100644 --- a/test/jdk/java/net/Socket/Timeouts.java +++ b/test/jdk/java/net/Socket/Timeouts.java @@ -442,7 +442,7 @@ class Timeouts { } /** - * Test timed accept with the thread interrupt status set. + * Test timed accept with the thread interrupted status set. */ @Test void testTimedAccept8() throws IOException { @@ -461,7 +461,7 @@ class Timeouts { checkDuration(startMillis, timeout-100, timeout+20_000); assertTrue(Thread.currentThread().isInterrupted()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } } @@ -488,7 +488,7 @@ class Timeouts { assertTrue(Thread.currentThread().isInterrupted()); } finally { interrupter.cancel(true); - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } } diff --git a/test/jdk/java/net/httpclient/CancelRequestTest.java b/test/jdk/java/net/httpclient/CancelRequestTest.java index bfc1eff9cf9..23e4a042179 100644 --- a/test/jdk/java/net/httpclient/CancelRequestTest.java +++ b/test/jdk/java/net/httpclient/CancelRequestTest.java @@ -607,7 +607,7 @@ public class CancelRequestTest implements HttpServerAdapters { } else if (failed instanceof IOException) { out.println(uriStr + ": got IOException: " + failed); // that could be OK if the main thread was interrupted - // from the main thread: the interrupt status could have + // from the main thread: the interrupted status could have // been caught by writing to the socket from the main // thread. if (interruptingThread.isDone() && interruptingThread.get() == main) { diff --git a/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java b/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java index 57142fb03d7..72c07392d7c 100644 --- a/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java +++ b/test/jdk/java/nio/channels/Channels/SocketChannelStreams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -130,7 +130,7 @@ public class SocketChannelStreams { } /** - * Test interrupt status set before read. + * Test interrupted status set before read. */ public void testRead7() throws Exception { withConnection((sc, peer) -> { @@ -220,7 +220,7 @@ public class SocketChannelStreams { } /** - * Test interrupt status set before write. + * Test interrupted status set before write. */ public void testWrite4() throws Exception { withConnection((sc, peer) -> { diff --git a/test/jdk/java/nio/channels/DatagramChannel/InterruptibleOrNot.java b/test/jdk/java/nio/channels/DatagramChannel/InterruptibleOrNot.java index e6fde147bd9..ace3e6343e8 100644 --- a/test/jdk/java/nio/channels/DatagramChannel/InterruptibleOrNot.java +++ b/test/jdk/java/nio/channels/DatagramChannel/InterruptibleOrNot.java @@ -61,7 +61,7 @@ public class InterruptibleOrNot { } /** - * Call DatagramChannel.receive with the interrupt status set, the DatagramChannel + * Call DatagramChannel.receive with the interrupted status set, the DatagramChannel * is interruptible. */ @Test @@ -72,7 +72,7 @@ public class InterruptibleOrNot { assertThrows(ClosedByInterruptException.class, () -> dc.receive(buf)); assertFalse(dc.isOpen()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } @@ -89,12 +89,12 @@ public class InterruptibleOrNot { assertThrows(ClosedByInterruptException.class, () -> dc.receive(buf)); assertFalse(dc.isOpen()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } /** - * Call DatagramChannel.receive with the interrupt status set, the DatagramChannel + * Call DatagramChannel.receive with the interrupted status set, the DatagramChannel * is not interruptible. */ @Test @@ -111,7 +111,7 @@ public class InterruptibleOrNot { assertThrows(AsynchronousCloseException.class, () -> dc.receive(buf)); assertFalse(dc.isOpen()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } @@ -136,12 +136,12 @@ public class InterruptibleOrNot { assertThrows(AsynchronousCloseException.class, () -> dc.receive(buf)); assertFalse(dc.isOpen()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } /** - * Call DatagramChannel.send with the interrupt status set, the DatagramChannel + * Call DatagramChannel.send with the interrupted status set, the DatagramChannel * is interruptible. */ @Test @@ -158,7 +158,7 @@ public class InterruptibleOrNot { } /** - * Call DatagramChannel.send with the interrupt status set, the DatagramChannel + * Call DatagramChannel.send with the interrupted status set, the DatagramChannel * is not interruptible. */ @Test @@ -171,7 +171,7 @@ public class InterruptibleOrNot { assertEquals(100, n); assertTrue(dc.isOpen()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } } diff --git a/test/jdk/java/nio/channels/FileChannel/CloseDuringTransfer.java b/test/jdk/java/nio/channels/FileChannel/CloseDuringTransfer.java index 3b1973782d6..d4c61bfd9e2 100644 --- a/test/jdk/java/nio/channels/FileChannel/CloseDuringTransfer.java +++ b/test/jdk/java/nio/channels/FileChannel/CloseDuringTransfer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -232,7 +232,7 @@ class CloseDuringTransfer { /** * Waits for the interrupt task submitted by scheduleInterrupt, and clears the - * current thread's interrupt status. + * current thread's interrupted status. */ private void finishInterrupt(Future interrupter) throws Exception { boolean done = false; diff --git a/test/jdk/java/nio/channels/FileChannel/ClosedByInterrupt.java b/test/jdk/java/nio/channels/FileChannel/ClosedByInterrupt.java index a14d111b6f0..66fbd57a05a 100644 --- a/test/jdk/java/nio/channels/FileChannel/ClosedByInterrupt.java +++ b/test/jdk/java/nio/channels/FileChannel/ClosedByInterrupt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -144,9 +144,9 @@ public class ClosedByInterrupt { } catch (ClosedByInterruptException e) { if (interruptible) { if (Thread.interrupted()) { - expected(e + " thrown and interrupt status set"); + expected(e + " thrown and interrupted status set"); } else { - unexpected(e + " thrown but interrupt status not set"); + unexpected(e + " thrown but interrupted status not set"); } } else { unexpected(e); diff --git a/test/jdk/java/nio/channels/Pipe/PipeInterrupt.java b/test/jdk/java/nio/channels/Pipe/PipeInterrupt.java index 53606b60487..b81823efd54 100644 --- a/test/jdk/java/nio/channels/Pipe/PipeInterrupt.java +++ b/test/jdk/java/nio/channels/Pipe/PipeInterrupt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 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. * * This code is free software; you can redistribute it and/or modify it @@ -55,7 +55,7 @@ public class PipeInterrupt { close(); if (interrupted) { if (!this.isInterrupted()) - exc = new RuntimeException("interrupt status reset"); + exc = new RuntimeException("interrupted status reset"); break; } } catch (IOException ioe) { diff --git a/test/jdk/java/nio/channels/Selector/LotsOfInterrupts.java b/test/jdk/java/nio/channels/Selector/LotsOfInterrupts.java index 98470dec160..5fea3d5c932 100644 --- a/test/jdk/java/nio/channels/Selector/LotsOfInterrupts.java +++ b/test/jdk/java/nio/channels/Selector/LotsOfInterrupts.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -64,7 +64,7 @@ public class LotsOfInterrupts { phaser.arriveAndAwaitAdvance(); sel.select(); - // clear interrupt status and consume wakeup + // clear interrupted status and consume wakeup Thread.interrupted(); sel.selectNow(); } diff --git a/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java b/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java index 41edb207239..1a2ada51bce 100644 --- a/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java +++ b/test/jdk/java/nio/channels/Selector/SelectWithConsumer.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -360,7 +360,7 @@ public class SelectWithConsumer { } /** - * Test invoking select with interrupt status set + * Test invoking select with interrupted status set */ public void testInterruptBeforeSelect() throws Exception { // select(Consumer) @@ -371,7 +371,7 @@ public class SelectWithConsumer { assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { - Thread.currentThread().interrupted(); // clear interrupt status + Thread.currentThread().interrupted(); // clear interrupted status } // select(Consumer, timeout) @@ -384,7 +384,7 @@ public class SelectWithConsumer { assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { - Thread.currentThread().interrupted(); // clear interrupt status + Thread.currentThread().interrupted(); // clear interrupted status } } @@ -400,7 +400,7 @@ public class SelectWithConsumer { assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { - Thread.currentThread().interrupted(); // clear interrupt status + Thread.currentThread().interrupted(); // clear interrupted status } // select(Consumer, timeout) @@ -411,7 +411,7 @@ public class SelectWithConsumer { assertTrue(Thread.currentThread().isInterrupted()); assertTrue(sel.isOpen()); } finally { - Thread.currentThread().interrupted(); // clear interrupt status + Thread.currentThread().interrupted(); // clear interrupted status } } diff --git a/test/jdk/java/nio/channels/Selector/WakeupAfterClose.java b/test/jdk/java/nio/channels/Selector/WakeupAfterClose.java index 92b1aef5c6d..965300c8a3a 100644 --- a/test/jdk/java/nio/channels/Selector/WakeupAfterClose.java +++ b/test/jdk/java/nio/channels/Selector/WakeupAfterClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -23,7 +23,7 @@ /* @test * @bug 6524172 - * @summary Invoking wakeup on closed Selector can throw NPE if close resets interrupt status + * @summary Invoking wakeup on closed Selector can throw NPE if close resets interrupted status */ import java.io.IOException; diff --git a/test/jdk/java/nio/channels/SocketChannel/AdaptorStreams.java b/test/jdk/java/nio/channels/SocketChannel/AdaptorStreams.java index 846d5cd22b6..3487ae45de1 100644 --- a/test/jdk/java/nio/channels/SocketChannel/AdaptorStreams.java +++ b/test/jdk/java/nio/channels/SocketChannel/AdaptorStreams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, 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. * * This code is free software; you can redistribute it and/or modify it @@ -106,7 +106,7 @@ public class AdaptorStreams { } /** - * Test interrupt status set before read + * Test interrupted status set before read */ public void testRead6() throws Exception { withConnection((sc, peer) -> { @@ -203,7 +203,7 @@ public class AdaptorStreams { } /** - * Test interrupt status set before timed read + * Test interrupted status set before timed read */ public void testTimedRead5() throws Exception { withConnection((sc, peer) -> { @@ -257,7 +257,7 @@ public class AdaptorStreams { } /** - * Test interrupt status set before write + * Test interrupted status set before write */ public void testWrite2() throws Exception { withConnection((sc, peer) -> { diff --git a/test/jdk/java/nio/channels/vthread/SelectorOps.java b/test/jdk/java/nio/channels/vthread/SelectorOps.java index 0c86cae6185..81821a85791 100644 --- a/test/jdk/java/nio/channels/vthread/SelectorOps.java +++ b/test/jdk/java/nio/channels/vthread/SelectorOps.java @@ -253,7 +253,7 @@ class SelectorOps { } /** - * Test calling select with interrupt status set. + * Test calling select with interrupted status set. */ @Test public void testInterruptBeforeSelect() throws Exception { @@ -270,7 +270,7 @@ class SelectorOps { } /** - * Test calling select with interrupt status set and thread is pinned. + * Test calling select with interrupted status set and thread is pinned. */ @Test public void testInterruptBeforeSelectWhenPinned() throws Exception { diff --git a/test/jdk/java/nio/file/Files/CallWithInterruptSet.java b/test/jdk/java/nio/file/Files/CallWithInterruptSet.java index 313862e65f3..3d7bfd2c518 100644 --- a/test/jdk/java/nio/file/Files/CallWithInterruptSet.java +++ b/test/jdk/java/nio/file/Files/CallWithInterruptSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,7 @@ * @test * @bug 8205612 * @run testng CallWithInterruptSet - * @summary Test invoking Files methods with the interrupt status set + * @summary Test invoking Files methods with the interrupted status set */ import java.io.InputStream; diff --git a/test/jdk/java/nio/file/Files/InterruptCopy.java b/test/jdk/java/nio/file/Files/InterruptCopy.java index f13a2877d91..81f5c0d86bc 100644 --- a/test/jdk/java/nio/file/Files/InterruptCopy.java +++ b/test/jdk/java/nio/file/Files/InterruptCopy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -120,7 +120,7 @@ public class InterruptCopy { } catch (IOException e) { boolean interrupted = Thread.interrupted(); if (!interrupted) - throw new RuntimeException("Interrupt status was not set"); + throw new RuntimeException("Interrupted status was not set"); System.out.println("Copy failed (this is expected)."); } try { diff --git a/test/jdk/java/util/concurrent/CompletableFuture/LostInterrupt.java b/test/jdk/java/util/concurrent/CompletableFuture/LostInterrupt.java index 0f5a462b630..e46b0d0ee5e 100644 --- a/test/jdk/java/util/concurrent/CompletableFuture/LostInterrupt.java +++ b/test/jdk/java/util/concurrent/CompletableFuture/LostInterrupt.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ import static java.util.concurrent.TimeUnit.DAYS; * @test * @bug 8254350 * @run main LostInterrupt - * @summary CompletableFuture.get may swallow interrupt status + * @summary CompletableFuture.get may swallow interrupted status * @key randomness */ @@ -38,9 +38,9 @@ import static java.util.concurrent.TimeUnit.DAYS; /** * Submits a task that completes immediately, then invokes CompletableFuture.get - * with the interrupt status set. CompletableFuture.get should either complete - * immediately with the interrupt status set, or else throw InterruptedException - * with the interrupt status cleared. + * with the interrupted status set. CompletableFuture.get should either complete + * immediately with the interrupted status set, or else throw InterruptedException + * with the interrupted status cleared. */ public class LostInterrupt { static final int ITERATIONS = 10_000; @@ -63,7 +63,7 @@ public class LostInterrupt { } catch (InterruptedException expected) { if (Thread.interrupted()) throw new AssertionError( - "interrupt status not cleared, run=" + i); + "interrupted status not cleared, run=" + i); } } } finally { diff --git a/test/jdk/java/util/concurrent/CompletableFuture/SwallowedInterruptedException.java b/test/jdk/java/util/concurrent/CompletableFuture/SwallowedInterruptedException.java index 93ae7305998..98ba7ce037c 100644 --- a/test/jdk/java/util/concurrent/CompletableFuture/SwallowedInterruptedException.java +++ b/test/jdk/java/util/concurrent/CompletableFuture/SwallowedInterruptedException.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -57,12 +57,12 @@ public class SwallowedInterruptedException { if (!Thread.currentThread().isInterrupted()) { fail.set(new AssertionError( - "Future.get completed with interrupt status not set")); + "Future.get completed with interrupted status not set")); } } catch (InterruptedException ex) { if (Thread.currentThread().isInterrupted()) { fail.set(new AssertionError( - "InterruptedException with interrupt status set")); + "InterruptedException with interrupted status set")); } } catch (Throwable ex) { fail.set(ex); diff --git a/test/jdk/java/util/concurrent/ExecutorService/CloseTest.java b/test/jdk/java/util/concurrent/ExecutorService/CloseTest.java index 162d4f7d1b4..129d388cf6d 100644 --- a/test/jdk/java/util/concurrent/ExecutorService/CloseTest.java +++ b/test/jdk/java/util/concurrent/ExecutorService/CloseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 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 @@ -207,7 +207,7 @@ class CloseTest { } /** - * Test invoking close with interrupt status set. + * Test invoking close with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -225,7 +225,7 @@ class CloseTest { executor.close(); assertTrue(Thread.currentThread().isInterrupted()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } assertTrue(executor.isShutdown()); assertTrue(executor.isTerminated()); @@ -259,7 +259,7 @@ class CloseTest { executor.close(); assertTrue(Thread.currentThread().isInterrupted()); } finally { - Thread.interrupted(); // clear interrupt status + Thread.interrupted(); // clear interrupted status } assertTrue(executor.isShutdown()); assertTrue(executor.isTerminated()); diff --git a/test/jdk/java/util/concurrent/ExecutorService/InvokeTest.java b/test/jdk/java/util/concurrent/ExecutorService/InvokeTest.java index a9a4eb0d8d7..901291450fc 100644 --- a/test/jdk/java/util/concurrent/ExecutorService/InvokeTest.java +++ b/test/jdk/java/util/concurrent/ExecutorService/InvokeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -284,7 +284,7 @@ class InvokeTest { } /** - * Test invokeAny with interrupt status set. + * Test invokeAny with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -530,7 +530,7 @@ class InvokeTest { } /** - * Test invokeAll with interrupt status set. + * Test invokeAll with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -555,7 +555,7 @@ class InvokeTest { } /** - * Test timed-invokeAll with interrupt status set. + * Test timed-invokeAll with interrupted status set. */ @ParameterizedTest @MethodSource("executors") diff --git a/test/jdk/java/util/concurrent/StructuredTaskScope/StructuredTaskScopeTest.java b/test/jdk/java/util/concurrent/StructuredTaskScope/StructuredTaskScopeTest.java index 79f4a935195..762f24dc89f 100644 --- a/test/jdk/java/util/concurrent/StructuredTaskScope/StructuredTaskScopeTest.java +++ b/test/jdk/java/util/concurrent/StructuredTaskScope/StructuredTaskScopeTest.java @@ -425,7 +425,7 @@ class StructuredTaskScopeTest { } /** - * Test join with interrupt status set. + * Test join with interrupted status set. */ @ParameterizedTest @MethodSource("factories") @@ -444,7 +444,7 @@ class StructuredTaskScopeTest { scope.join(); fail("join did not throw"); } catch (InterruptedException expected) { - assertFalse(Thread.interrupted()); // interrupt status should be cleared + assertFalse(Thread.interrupted()); // interrupted status should be cleared } } } @@ -470,7 +470,7 @@ class StructuredTaskScopeTest { scope.join(); fail("join did not throw"); } catch (InterruptedException expected) { - assertFalse(Thread.interrupted()); // interrupt status should be clear + assertFalse(Thread.interrupted()); // interrupted status should be clear } } } @@ -745,7 +745,7 @@ class StructuredTaskScopeTest { } /** - * Test close with interrupt status set. + * Test close with interrupted status set. */ @ParameterizedTest @MethodSource("factories") @@ -776,12 +776,12 @@ class StructuredTaskScopeTest { scope.join(); - // invoke close with interrupt status set + // invoke close with interrupted status set Thread.currentThread().interrupt(); try { scope.close(); } finally { - assertTrue(Thread.interrupted()); // clear interrupt status + assertTrue(Thread.interrupted()); // clear interrupted status assertTrue(done.get()); } } @@ -829,7 +829,7 @@ class StructuredTaskScopeTest { try { scope.close(); } finally { - assertTrue(Thread.interrupted()); // clear interrupt status + assertTrue(Thread.interrupted()); // clear interrupted status assertTrue(done.get()); } } diff --git a/test/jdk/java/util/concurrent/ThreadPerTaskExecutor/ThreadPerTaskExecutorTest.java b/test/jdk/java/util/concurrent/ThreadPerTaskExecutor/ThreadPerTaskExecutorTest.java index ff3b9566f5e..1427a72b931 100644 --- a/test/jdk/java/util/concurrent/ThreadPerTaskExecutor/ThreadPerTaskExecutorTest.java +++ b/test/jdk/java/util/concurrent/ThreadPerTaskExecutor/ThreadPerTaskExecutorTest.java @@ -228,7 +228,7 @@ class ThreadPerTaskExecutorTest { } /** - * Invoke close with interrupt status set. + * Invoke close with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -593,7 +593,7 @@ class ThreadPerTaskExecutorTest { } /** - * Test invokeAny with interrupt status set. + * Test invokeAny with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -822,7 +822,7 @@ class ThreadPerTaskExecutorTest { } /** - * Test untimed-invokeAll with interrupt status set. + * Test untimed-invokeAll with interrupted status set. */ @ParameterizedTest @MethodSource("executors") @@ -846,7 +846,7 @@ class ThreadPerTaskExecutorTest { } /** - * Test timed-invokeAll with interrupt status set. + * Test timed-invokeAll with interrupted status set. */ @ParameterizedTest @MethodSource("executors") diff --git a/test/jdk/java/util/concurrent/tck/JSR166TestCase.java b/test/jdk/java/util/concurrent/tck/JSR166TestCase.java index 18007f72ca8..80e6c98bfa7 100644 --- a/test/jdk/java/util/concurrent/tck/JSR166TestCase.java +++ b/test/jdk/java/util/concurrent/tck/JSR166TestCase.java @@ -832,7 +832,7 @@ public class JSR166TestCase extends TestCase { * by rethrowing, in the test harness thread, any exception recorded * earlier by threadRecordFailure. * - * Triggers test case failure if interrupt status is set in the main thread. + * Triggers test case failure if interrupted status is set in the main thread. */ public void tearDown() throws Exception { Throwable t = threadFailure.getAndSet(null); @@ -848,7 +848,7 @@ public class JSR166TestCase extends TestCase { } if (Thread.interrupted()) - tearDownFail("interrupt status set in main thread"); + tearDownFail("interrupted status set in main thread"); checkForkJoinPoolThreadLeaks(); } @@ -1460,7 +1460,7 @@ public class JSR166TestCase extends TestCase { /** * Spin-waits up to LONG_DELAY_MS milliseconds for the current thread to - * be interrupted. Clears the interrupt status before returning. + * be interrupted. Clears the interrupted status before returning. */ void awaitInterrupted() { for (long startTime = 0L; !Thread.interrupted(); ) { diff --git a/test/jdk/java/util/concurrent/tck/StampedLockTest.java b/test/jdk/java/util/concurrent/tck/StampedLockTest.java index 673047ccf12..8fe8aaca569 100644 --- a/test/jdk/java/util/concurrent/tck/StampedLockTest.java +++ b/test/jdk/java/util/concurrent/tck/StampedLockTest.java @@ -410,7 +410,7 @@ public class StampedLockTest extends JSR166TestCase { } /** - * Non-interruptible operations ignore and preserve interrupt status + * Non-interruptible operations ignore and preserve interrupted status */ public void testNonInterruptibleOperationsIgnoreInterrupts() { final StampedLock lock = new StampedLock(); diff --git a/test/jdk/java/util/zip/InterruptibleZip.java b/test/jdk/java/util/zip/InterruptibleZip.java index f7e2be4fdfb..5a4b9904db9 100644 --- a/test/jdk/java/util/zip/InterruptibleZip.java +++ b/test/jdk/java/util/zip/InterruptibleZip.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -45,7 +45,7 @@ public class InterruptibleZip { System.out.printf("interrupted=%s n=%d name=%s%n", interrupted, n, ze.getName()); if (! interrupted) { - throw new Error("Wrong interrupt status"); + throw new Error("Wrong interrupted status"); } if (n != buf.length) { throw new Error("Read error"); diff --git a/test/jdk/jdk/internal/misc/ThreadFlock/ThreadFlockTest.java b/test/jdk/jdk/internal/misc/ThreadFlock/ThreadFlockTest.java index ebc718d2203..3fc143f38c8 100644 --- a/test/jdk/jdk/internal/misc/ThreadFlock/ThreadFlockTest.java +++ b/test/jdk/jdk/internal/misc/ThreadFlock/ThreadFlockTest.java @@ -530,7 +530,7 @@ class ThreadFlockTest { } /** - * Test awaitAll with interrupt status set, should interrupt thread. + * Test awaitAll with interrupted status set, should interrupt thread. */ @ParameterizedTest @MethodSource("factories") @@ -550,17 +550,17 @@ class ThreadFlockTest { Thread thread = factory.newThread(awaitLatch); flock.start(thread); - // invoke awaitAll with interrupt status set. + // invoke awaitAll with interrupted status set. Thread.currentThread().interrupt(); try { flock.awaitAll(); fail("awaitAll did not throw"); } catch (InterruptedException e) { - // interrupt status should be clear + // interrupted status should be clear assertFalse(Thread.currentThread().isInterrupted()); } - // invoke awaitAll(Duration) with interrupt status set. + // invoke awaitAll(Duration) with interrupted status set. Thread.currentThread().interrupt(); try { flock.awaitAll(Duration.ofSeconds(30)); @@ -568,7 +568,7 @@ class ThreadFlockTest { } catch (TimeoutException e) { fail("TimeoutException not expected"); } catch (InterruptedException e) { - // interrupt status should be clear + // interrupted status should be clear assertFalse(Thread.currentThread().isInterrupted()); } @@ -609,7 +609,7 @@ class ThreadFlockTest { flock.awaitAll(); fail("awaitAll did not throw"); } catch (InterruptedException e) { - // interrupt status should be clear + // interrupted status should be clear assertFalse(Thread.currentThread().isInterrupted()); } @@ -620,7 +620,7 @@ class ThreadFlockTest { } catch (TimeoutException e) { fail("TimeoutException not expected"); } catch (InterruptedException e) { - // interrupt status should be clear + // interrupted status should be clear assertFalse(Thread.currentThread().isInterrupted()); } @@ -841,7 +841,7 @@ class ThreadFlockTest { } /** - * Test close with interrupt status set, should not interrupt threads. + * Test close with interrupted status set, should not interrupt threads. */ @ParameterizedTest @MethodSource("factories") diff --git a/test/jdk/sun/security/ssl/Stapling/java.base/sun/security/ssl/StatusResponseManagerTests.java b/test/jdk/sun/security/ssl/Stapling/java.base/sun/security/ssl/StatusResponseManagerTests.java index bdc1b538608..bcfc1290cf0 100644 --- a/test/jdk/sun/security/ssl/Stapling/java.base/sun/security/ssl/StatusResponseManagerTests.java +++ b/test/jdk/sun/security/ssl/Stapling/java.base/sun/security/ssl/StatusResponseManagerTests.java @@ -272,7 +272,7 @@ public class StatusResponseManagerTests { CertStatusRequest oReq = OCSPStatusRequest.EMPTY_OCSP; try { - // Force the interrupt flag to be set on the thread that + // Force the interrupted flag to be set on the thread that // performs the invokeAll in the SRM. Thread.currentThread().interrupt(); From 436dc687ba2ead1662a4e0125cea0966fac825e5 Mon Sep 17 00:00:00 2001 From: Artur Barashev Date: Wed, 29 Oct 2025 17:25:31 +0000 Subject: [PATCH 353/561] 8367059: DTLS: loss of NewSessionTicket message results in handshake failure Reviewed-by: jnimeh, djelinski --- .../sun/security/ssl/DTLSInputRecord.java | 40 ++- .../sun/security/ssl/SSLExtension.java | 2 +- .../security/ssl/SessionTicketExtension.java | 25 ++ .../net/ssl/DTLS/DTLSNoNewSessionTicket.java | 47 ++++ .../javax/net/ssl/DTLS/DTLSOverDatagram.java | 24 +- .../ssl/DTLS/PacketLossRetransmission.java | 239 ++++++++++++++++-- 6 files changed, 332 insertions(+), 45 deletions(-) create mode 100644 test/jdk/javax/net/ssl/DTLS/DTLSNoNewSessionTicket.java diff --git a/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java b/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java index 101a42a5407..4e82fd25a7b 100644 --- a/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java +++ b/src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java @@ -170,7 +170,7 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { // Buffer next epoch message if necessary. if (this.readEpoch < recordEpoch) { - // Discard the record younger than the current epcoh if: + // Discard the record younger than the current epoch if: // 1. it is not a handshake message, or // 3. it is not of next epoch. if ((contentType != ContentType.HANDSHAKE.id && @@ -1445,7 +1445,7 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { // if (expectCCSFlight) { // Have the ChangeCipherSpec/Finished flight been received? - boolean isReady = hasFinishedMessage(bufferedFragments); + boolean isReady = hasFinishedMessage(); if (SSLLogger.isOn && SSLLogger.isOn("verbose")) { SSLLogger.fine( "Has the final flight been received? " + isReady); @@ -1492,7 +1492,7 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { // // an abbreviated handshake // - if (hasFinishedMessage(bufferedFragments)) { + if (hasFinishedMessage()) { if (SSLLogger.isOn && SSLLogger.isOn("verbose")) { SSLLogger.fine("It's an abbreviated handshake."); } @@ -1565,7 +1565,7 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { } } - if (!hasFinishedMessage(bufferedFragments)) { + if (!hasFinishedMessage()) { // not yet have the ChangeCipherSpec/Finished messages if (SSLLogger.isOn && SSLLogger.isOn("verbose")) { SSLLogger.fine( @@ -1601,35 +1601,33 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { return false; } - // Looking for the ChangeCipherSpec and Finished messages. + // Looking for the ChangeCipherSpec, Finished and + // NewSessionTicket messages. // // As the cached Finished message should be a ciphertext, we don't // exactly know a ciphertext is a Finished message or not. According // to the spec of TLS/DTLS handshaking, a Finished message is always // sent immediately after a ChangeCipherSpec message. The first // ciphertext handshake message should be the expected Finished message. - private boolean hasFinishedMessage(Set fragments) { - + private boolean hasFinishedMessage() { boolean hasCCS = false; boolean hasFin = false; - for (RecordFragment fragment : fragments) { + + for (RecordFragment fragment : bufferedFragments) { if (fragment.contentType == ContentType.CHANGE_CIPHER_SPEC.id) { - if (hasFin) { - return true; - } hasCCS = true; - } else if (fragment.contentType == ContentType.HANDSHAKE.id) { - // Finished is the first expected message of a new epoch. - if (fragment.isCiphertext) { - if (hasCCS) { - return true; - } - hasFin = true; - } + } else if (fragment.contentType == ContentType.HANDSHAKE.id + && fragment.isCiphertext) { + hasFin = true; } } - return false; + // NewSessionTicket message presence in the Finished flight + // should only be expected on the client side, and only + // if stateless resumption is enabled. + return hasCCS && hasFin && (!tc.sslConfig.isClientMode + || !tc.handshakeContext.statelessResumption + || hasCompleted(SSLHandshake.NEW_SESSION_TICKET.id)); } // Is client CertificateVerify a mandatory message? @@ -1674,7 +1672,7 @@ final class DTLSInputRecord extends InputRecord implements DTLSRecord { int presentMsgSeq, int endMsgSeq) { // The caller should have checked the completion of the first - // present handshake message. Need not to check it again. + // present handshake message. Need not check it again. for (RecordFragment rFrag : fragments) { if ((rFrag.contentType != ContentType.HANDSHAKE.id) || rFrag.isCiphertext) { diff --git a/src/java.base/share/classes/sun/security/ssl/SSLExtension.java b/src/java.base/share/classes/sun/security/ssl/SSLExtension.java index 082914b4b4b..fb0490d70f1 100644 --- a/src/java.base/share/classes/sun/security/ssl/SSLExtension.java +++ b/src/java.base/share/classes/sun/security/ssl/SSLExtension.java @@ -286,7 +286,7 @@ enum SSLExtension implements SSLStringizer { ProtocolVersion.PROTOCOLS_10_12, SessionTicketExtension.shNetworkProducer, SessionTicketExtension.shOnLoadConsumer, - null, + SessionTicketExtension.shOnLoadAbsence, null, null, SessionTicketExtension.steStringizer), diff --git a/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java b/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java index 444af5d6dae..9a84bbad8fd 100644 --- a/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java +++ b/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java @@ -72,6 +72,8 @@ final class SessionTicketExtension { new T12SHSessionTicketProducer(); static final ExtensionConsumer shOnLoadConsumer = new T12SHSessionTicketConsumer(); + static final HandshakeAbsence shOnLoadAbsence = + new T12SHSessionTicketOnLoadAbsence(); static final SSLStringizer steStringizer = new SessionTicketStringizer(); // No need to compress a ticket if it can fit in a single packet. @@ -529,4 +531,27 @@ final class SessionTicketExtension { chc.statelessResumption = true; } } + + /** + * The absence processing if a "session_ticket" extension is + * not present in the ServerHello handshake message. + */ + private static final class T12SHSessionTicketOnLoadAbsence + implements HandshakeAbsence { + + @Override + public void absent(ConnectionContext context, + HandshakeMessage message) { + ClientHandshakeContext chc = (ClientHandshakeContext) context; + + // Disable stateless resumption if server doesn't send the extension. + if (chc.statelessResumption) { + if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { + SSLLogger.info( + "Server doesn't support stateless resumption"); + } + chc.statelessResumption = false; + } + } + } } diff --git a/test/jdk/javax/net/ssl/DTLS/DTLSNoNewSessionTicket.java b/test/jdk/javax/net/ssl/DTLS/DTLSNoNewSessionTicket.java new file mode 100644 index 00000000000..dba191d0193 --- /dev/null +++ b/test/jdk/javax/net/ssl/DTLS/DTLSNoNewSessionTicket.java @@ -0,0 +1,47 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8367059 + * @summary DTLS: loss of NewSessionTicket message results in handshake failure + * @modules java.base/sun.security.util + * @library /test/lib + * @build DTLSOverDatagram + * + * @comment Make sure client doesn't expect NewSessionTicket in the final + * flight if server doesn't send the "session_ticket" extension with + * ServerHello handshake message. + * + * @run main/othervm -Djdk.tls.client.enableSessionTicketExtension=false + * DTLSNoNewSessionTicket + * @run main/othervm -Djdk.tls.server.enableSessionTicketExtension=false + * DTLSNoNewSessionTicket + */ + +public class DTLSNoNewSessionTicket extends DTLSOverDatagram { + public static void main(String[] args) throws Exception { + var testCase = new DTLSNoNewSessionTicket(); + testCase.runTest(testCase); + } +} diff --git a/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java b/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java index 9780586cd57..89fe39a792c 100644 --- a/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java +++ b/test/jdk/javax/net/ssl/DTLS/DTLSOverDatagram.java @@ -21,9 +21,6 @@ * questions. */ -// SunJSSE does not support dynamic system properties, no way to re-use -// system properties in samevm/agentvm mode. - /* * @test * @bug 8043758 @@ -132,8 +129,15 @@ public class DTLSOverDatagram { * The remainder is support stuff for DTLS operations. */ SSLEngine createSSLEngine(boolean isClient) throws Exception { - SSLContext context = getDTLSContext(); - SSLEngine engine = context.createSSLEngine(); + SSLContext context = + isClient ? getClientDTLSContext() : getServerDTLSContext(); + + // Note: client and server ports are not to be used for network + // communication, but only to be set in client and server SSL engines. + // We must use the same context, host and port for initial and resuming + // sessions when testing session resumption (abbreviated handshake). + SSLEngine engine = context.createSSLEngine("localhost", + isClient ? 51111 : 52222); SSLParameters paras = engine.getSSLParameters(); paras.setMaximumPacketSize(MAXIMUM_PACKET_SIZE); @@ -507,7 +511,7 @@ public class DTLSOverDatagram { } // get DTSL context - SSLContext getDTLSContext() throws Exception { + static SSLContext getDTLSContext() throws Exception { String passphrase = "passphrase"; return SSLContextBuilder.builder() .trustStore(KeyStoreUtils.loadKeyStore(TRUST_FILENAME, passphrase)) @@ -517,6 +521,14 @@ public class DTLSOverDatagram { .build(); } + protected SSLContext getServerDTLSContext() throws Exception { + return getDTLSContext(); + } + + protected SSLContext getClientDTLSContext() throws Exception { + return getDTLSContext(); + } + /* * ============================================================= diff --git a/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java b/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java index 2dd0de830f1..828e4c316b2 100644 --- a/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java +++ b/test/jdk/javax/net/ssl/DTLS/PacketLossRetransmission.java @@ -21,56 +21,95 @@ * questions. */ -// SunJSSE does not support dynamic system properties, no way to re-use -// system properties in samevm/agentvm mode. - /* * @test - * @bug 8161086 + * @bug 8161086 8367059 * @summary DTLS handshaking fails if some messages were lost * @modules java.base/sun.security.util * @library /test/lib * @build DTLSOverDatagram * - * @run main/othervm PacketLossRetransmission client 1 client_hello - * @run main/othervm PacketLossRetransmission client 16 client_key_exchange - * @run main/othervm PacketLossRetransmission client 20 finished - * @run main/othervm PacketLossRetransmission client -1 change_cipher_spec - * @run main/othervm PacketLossRetransmission server 2 server_hello - * @run main/othervm PacketLossRetransmission server 3 hello_verify_request - * @run main/othervm PacketLossRetransmission server 11 certificate - * @run main/othervm PacketLossRetransmission server 12 server_key_exchange - * @run main/othervm PacketLossRetransmission server 14 server_hello_done - * @run main/othervm PacketLossRetransmission server 20 finished - * @run main/othervm PacketLossRetransmission server -1 change_cipher_spec + * @run main/othervm PacketLossRetransmission client full 1 client_hello + * @run main/othervm PacketLossRetransmission client full 16 client_key_exchange + * @run main/othervm PacketLossRetransmission client full 20 finished + * @run main/othervm PacketLossRetransmission client full -1 change_cipher_spec + * @run main/othervm PacketLossRetransmission server full 2 server_hello + * @run main/othervm PacketLossRetransmission server full 3 hello_verify_request + * @run main/othervm PacketLossRetransmission server full 11 certificate + * @run main/othervm PacketLossRetransmission server full 12 server_key_exchange + * @run main/othervm PacketLossRetransmission server full 14 server_hello_done + * @run main/othervm PacketLossRetransmission server full 20 finished + * @run main/othervm PacketLossRetransmission server full -1 change_cipher_spec + * @run main/othervm PacketLossRetransmission server full 4 new_session_ticket + * @run main/othervm PacketLossRetransmission client resume 1 client_hello + * @run main/othervm PacketLossRetransmission client resume 20 finished + * @run main/othervm PacketLossRetransmission client resume -1 change_cipher_spec + * @run main/othervm PacketLossRetransmission server resume 2 server_hello + * @run main/othervm PacketLossRetransmission server resume 3 hello_verify_request + * @run main/othervm PacketLossRetransmission server resume 20 finished + * @run main/othervm PacketLossRetransmission server resume -1 change_cipher_spec + * @run main/othervm PacketLossRetransmission server resume 4 new_session_ticket */ + +import java.nio.ByteBuffer; import java.util.List; -import java.util.ArrayList; import java.net.DatagramPacket; import java.net.SocketAddress; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLEngineResult; +import javax.net.ssl.SSLEngineResult.HandshakeStatus; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLSession; /** * Test that DTLS implementation is able to do retransmission internally * automatically if packet get lost. */ public class PacketLossRetransmission extends DTLSOverDatagram { + private static boolean isClient; private static byte handshakeType; private static final int TIMEOUT = 500; private boolean needPacketLoss = true; + private final SSLContext clientContext; + private final SSLContext serverContext; + + protected PacketLossRetransmission() throws Exception { + this.clientContext = getDTLSContext(); + this.serverContext = getDTLSContext(); + } public static void main(String[] args) throws Exception { isClient = args[0].equals("client"); - handshakeType = Byte.parseByte(args[1]); + boolean isResume = args[1].equals("resume"); + handshakeType = Byte.parseByte(args[2]); PacketLossRetransmission testCase = new PacketLossRetransmission(); testCase.setSocketTimeout(TIMEOUT); + + if (isResume) { + System.out.println("Starting initial handshake"); + // The initial session will populate the TLS session cache. + initialSession(testCase.createSSLEngine(true), + testCase.createSSLEngine(false)); + } + testCase.runTest(testCase); } + @Override + protected SSLContext getClientDTLSContext() throws Exception { + return clientContext; + } + + @Override + protected SSLContext getServerDTLSContext() throws Exception { + return serverContext; + } + @Override boolean produceHandshakePackets(SSLEngine engine, SocketAddress socketAddr, String side, List packets) throws Exception { @@ -90,4 +129,170 @@ public class PacketLossRetransmission extends DTLSOverDatagram { return finished; } + + private static void initialSession(SSLEngine clientEngine, + SSLEngine serverEngine) throws SSLException { + boolean clientDone = false; + boolean serverDone = false; + boolean cliDataReady = false; + boolean servDataReady = false; + SSLEngineResult clientResult; + SSLEngineResult serverResult; + SSLSession session = clientEngine.getSession(); + int appBufferMax = session.getApplicationBufferSize(); + int netBufferMax = session.getPacketBufferSize(); + ByteBuffer clientIn = ByteBuffer.allocate(appBufferMax + 50); + ByteBuffer serverIn = ByteBuffer.allocate(appBufferMax + 50); + ByteBuffer cTOs = ByteBuffer.allocateDirect(netBufferMax); + ByteBuffer sTOc = ByteBuffer.allocateDirect(netBufferMax); + HandshakeStatus hsStat; + final ByteBuffer clientOut = ByteBuffer.wrap( + "Hi Server, I'm Client".getBytes()); + final ByteBuffer serverOut = ByteBuffer.wrap( + "Hello Client, I'm Server".getBytes()); + + clientEngine.beginHandshake(); + serverEngine.beginHandshake(); + while (!clientDone && !serverDone) { + // Client processing + hsStat = clientEngine.getHandshakeStatus(); + log("Client HS Stat: " + hsStat); + switch (hsStat) { + case NOT_HANDSHAKING: + log("Closing client engine"); + clientEngine.closeOutbound(); + clientDone = true; + break; + case NEED_WRAP: + log(String.format("CTOS: p:%d, l:%d, c:%d", cTOs.position(), + cTOs.limit(), cTOs.capacity())); + clientResult = clientEngine.wrap(clientOut, cTOs); + log("client wrap: ", clientResult); + if (clientResult.getStatus() + == SSLEngineResult.Status.BUFFER_OVERFLOW) { + // Get a larger buffer and try again + int updateSize = 2 * netBufferMax; + log("Resizing buffer to " + updateSize + " bytes"); + cTOs = ByteBuffer.allocate(updateSize); + clientResult = clientEngine.wrap(clientOut, cTOs); + log("client wrap (resized): ", clientResult); + } + runDelegatedTasks(clientResult, clientEngine); + cTOs.flip(); + cliDataReady = true; + break; + case NEED_UNWRAP: + if (servDataReady) { + log(String.format("STOC: p:%d, l:%d, c:%d", + sTOc.position(), + sTOc.limit(), sTOc.capacity())); + clientResult = clientEngine.unwrap(sTOc, clientIn); + log("client unwrap: ", clientResult); + runDelegatedTasks(clientResult, clientEngine); + servDataReady = sTOc.hasRemaining(); + sTOc.compact(); + } else { + log("Server-to-client data not ready, skipping client" + + " unwrap"); + } + break; + case NEED_UNWRAP_AGAIN: + clientResult = clientEngine.unwrap(ByteBuffer.allocate(0), + clientIn); + log("client unwrap (again): ", clientResult); + runDelegatedTasks(clientResult, clientEngine); + break; + } + + // Server processing + hsStat = serverEngine.getHandshakeStatus(); + log("Server HS Stat: " + hsStat); + switch (hsStat) { + case NEED_WRAP: + log(String.format("STOC: p:%d, l:%d, c:%d", sTOc.position(), + sTOc.limit(), sTOc.capacity())); + serverResult = serverEngine.wrap(serverOut, sTOc); + log("server wrap: ", serverResult); + if (serverResult.getStatus() + == SSLEngineResult.Status.BUFFER_OVERFLOW) { + // Get a new buffer and try again + int updateSize = 2 * netBufferMax; + log("Resizing buffer to " + updateSize + " bytes"); + sTOc = ByteBuffer.allocate(updateSize); + serverResult = serverEngine.wrap(clientOut, sTOc); + log("server wrap (resized): ", serverResult); + } + runDelegatedTasks(serverResult, serverEngine); + sTOc.flip(); + servDataReady = true; + break; + case NOT_HANDSHAKING: + log("Closing server engine"); + serverEngine.closeOutbound(); + serverDone = true; + break; + case NEED_UNWRAP: + if (cliDataReady) { + log(String.format("CTOS: p:%d, l:%d, c:%d", + cTOs.position(), + cTOs.limit(), cTOs.capacity())); + serverResult = serverEngine.unwrap(cTOs, serverIn); + log("server unwrap: ", serverResult); + runDelegatedTasks(serverResult, serverEngine); + cliDataReady = cTOs.hasRemaining(); + cTOs.compact(); + } else { + log("Client-to-server data not ready, skipping server" + + " unwrap"); + } + break; + case NEED_UNWRAP_AGAIN: + serverResult = serverEngine.unwrap(ByteBuffer.allocate(0), + serverIn); + log("server unwrap (again): ", serverResult); + runDelegatedTasks(serverResult, serverEngine); + break; + } + } + } + + private static void log(String str) { + System.out.println(str); + } + + private static void log(String str, SSLEngineResult result) { + System.out.println("The format of the SSLEngineResult is: \n" + + "\t\"getStatus() / getHandshakeStatus()\" +\n" + + "\t\"bytesConsumed() / bytesProduced()\"\n"); + + HandshakeStatus hsStatus = result.getHandshakeStatus(); + + log(str + + result.getStatus() + "/" + hsStatus + ", " + + result.bytesConsumed() + "/" + result.bytesProduced() + + " bytes"); + + if (hsStatus == HandshakeStatus.FINISHED) { + log("\t...ready for application data"); + } + } + + private static void runDelegatedTasks(SSLEngineResult result, + SSLEngine engine) { + HandshakeStatus hsStatus = result.getHandshakeStatus(); + + if (hsStatus == HandshakeStatus.NEED_TASK) { + Runnable runnable; + while ((runnable = engine.getDelegatedTask()) != null) { + log("\trunning delegated task..."); + runnable.run(); + } + hsStatus = engine.getHandshakeStatus(); + if (hsStatus == HandshakeStatus.NEED_TASK) { + throw new RuntimeException( + "handshake shouldn't need additional tasks"); + } + log("\tnew HandshakeStatus: " + hsStatus); + } + } } From 6080ccd23239a5209dfb21bd0a413a116709af76 Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Wed, 29 Oct 2025 18:40:14 +0000 Subject: [PATCH 354/561] 8370797: Test runtime/ErrorHandling/AccessZeroNKlassHitsProtectionZone.java failed on macos 26 Reviewed-by: stuefe, kvn --- .../AccessZeroNKlassHitsProtectionZone.java | 6 ++++- .../jdk/test/lib/process/OutputAnalyzer.java | 23 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/test/hotspot/jtreg/runtime/ErrorHandling/AccessZeroNKlassHitsProtectionZone.java b/test/hotspot/jtreg/runtime/ErrorHandling/AccessZeroNKlassHitsProtectionZone.java index 0e36fdce7d8..a9d957bac18 100644 --- a/test/hotspot/jtreg/runtime/ErrorHandling/AccessZeroNKlassHitsProtectionZone.java +++ b/test/hotspot/jtreg/runtime/ErrorHandling/AccessZeroNKlassHitsProtectionZone.java @@ -142,7 +142,11 @@ public class AccessZeroNKlassHitsProtectionZone { for (forceBase = start; forceBase < end; forceBase += step) { String thisBaseString = String.format("0x%016X", forceBase).toLowerCase(); output = run_test(COH, CDS, thisBaseString); - if (output.contains("CompressedClassSpaceBaseAddress=" + thisBaseString + " given, but reserving class space failed.")) { + if (output.contains("CompressedClassSpaceBaseAddress=" + thisBaseString + " given, but reserving class space failed.") || + output.matches ("CompressedClassSpaceBaseAddress=" + thisBaseString + " given with shift .*, cannot be used to encode class pointers")) { + // possible output: + // CompressedClassSpaceBaseAddress=0x0000000c00000000 given, but reserving class space failed. + // CompressedClassSpaceBaseAddress=0x0000000d00000000 given with shift 6, cannot be used to encode class pointers // try next one } else if (output.contains("Successfully forced class space address to " + thisBaseString)) { break; diff --git a/test/lib/jdk/test/lib/process/OutputAnalyzer.java b/test/lib/jdk/test/lib/process/OutputAnalyzer.java index 3c5be74558b..fa5e30dd815 100644 --- a/test/lib/jdk/test/lib/process/OutputAnalyzer.java +++ b/test/lib/jdk/test/lib/process/OutputAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -354,6 +354,27 @@ public final class OutputAnalyzer { return this; } + /** + * Returns true if stdout matches the given pattern + */ + public boolean stdoutMatches(String regexp) { + return getStdout().matches(regexp); + } + + /** + * Returns true if stderr matches the given pattern + */ + public boolean stderrMatches(String regexp) { + return getStderr().matches(regexp); + } + + /** + * Returns true if either stdout or stderr matches the given pattern + */ + public boolean matches(String regexp) { + return stdoutMatches(regexp) || stderrMatches(regexp); + } + /** * Verify that the stdout and stderr contents of output buffer matches * the pattern From d62553d8dce7fe21942ec7a1268f536d9725b054 Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Wed, 29 Oct 2025 20:17:05 +0000 Subject: [PATCH 355/561] 8316274: javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java fails in Ubuntu 23.10 with Motif LAF Reviewed-by: honkar, prr --- .../TestButtonGroupFocusTraversal.java | 67 +++---------------- 1 file changed, 11 insertions(+), 56 deletions(-) diff --git a/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java b/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java index c115d44edbf..8dba2ae3e08 100644 --- a/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java +++ b/test/jdk/javax/swing/ButtonGroup/TestButtonGroupFocusTraversal.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,6 @@ * @run main TestButtonGroupFocusTraversal */ -import javax.swing.AbstractAction; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JFrame; @@ -43,9 +42,7 @@ import java.awt.Component; import java.awt.Container; import java.awt.FlowLayout; import java.awt.KeyboardFocusManager; -import java.awt.Point; import java.awt.Robot; -import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; public class TestButtonGroupFocusTraversal { @@ -53,25 +50,11 @@ public class TestButtonGroupFocusTraversal { private static JTextField textFieldFirst, textFieldLast; private static JToggleButton toggleButton1, toggleButton2; private static JCheckBox checkBox1, checkBox2; - private static boolean toggleButtonActionPerformed; - private static boolean checkboxActionPerformed; + private static volatile boolean toggleButtonActionPerformed; + private static volatile boolean checkboxActionPerformed; private static JRadioButton radioButton1, radioButton2; private static Robot robot; - private static void blockTillDisplayed(Component comp) { - Point p = null; - while (p == null) { - try { - p = comp.getLocationOnScreen(); - } catch (IllegalStateException e) { - try { - Thread.sleep(500); - } catch (InterruptedException ie) { - } - } - } - } - private static void createUI() throws Exception { SwingUtilities.invokeAndWait(new Runnable() { public void run() { @@ -84,33 +67,11 @@ public class TestButtonGroupFocusTraversal { checkBox1 = new JCheckBox("1"); checkBox2 = new JCheckBox("2"); - toggleButton1.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - toggleButtonActionPerformed = true; - } - }); + toggleButton1.addActionListener((_) -> toggleButtonActionPerformed = true); + toggleButton2.addActionListener((_) -> toggleButtonActionPerformed = true); - toggleButton2.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - toggleButtonActionPerformed = true; - } - }); - - checkBox1.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - checkboxActionPerformed = true; - } - }); - - checkBox2.setAction(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - checkboxActionPerformed = true; - } - }); + checkBox1.addActionListener((_) -> checkboxActionPerformed = true); + checkBox2.addActionListener((_) -> checkboxActionPerformed = true); ButtonGroup toggleGroup = new ButtonGroup(); toggleGroup.add(toggleButton1); @@ -128,7 +89,7 @@ public class TestButtonGroupFocusTraversal { radioButton2.setSelected(true); checkBox2.setSelected(true); - frame = new JFrame("Test"); + frame = new JFrame("TestButtonGroupFocusTraversal"); frame.setLayout(new FlowLayout()); Container pane = frame.getContentPane(); @@ -178,7 +139,7 @@ public class TestButtonGroupFocusTraversal { } private static void checkCheckboxActionPerformed() { - if (toggleButtonActionPerformed) { + if (checkboxActionPerformed) { throw new RuntimeException("Checkbox Action should not be" + "performed"); } @@ -196,19 +157,13 @@ public class TestButtonGroupFocusTraversal { createUI(); robot.waitForIdle(); - robot.delay(200); - - blockTillDisplayed(frame); + robot.delay(500); SwingUtilities.invokeAndWait(textFieldFirst::requestFocus); if (!textFieldFirst.equals(KeyboardFocusManager.getCurrentKeyboardFocusManager() .getFocusOwner())) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } + robot.delay(300); SwingUtilities.invokeAndWait(textFieldFirst::requestFocus); } From f3dfdfa3fdc97c2c850251d58f91134e0ae82240 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Wed, 29 Oct 2025 21:40:36 +0000 Subject: [PATCH 356/561] 8369013: Shenandoah: passive mode should support enabling ShenandoahCardBarrier Reviewed-by: wkemper --- .../shenandoah/mode/shenandoahPassiveMode.cpp | 5 -- .../gc/shenandoah/shenandoahDegeneratedGC.cpp | 6 ++ .../shenandoah/shenandoahGenerationalHeap.hpp | 5 +- .../share/gc/shenandoah/shenandoahHeap.cpp | 7 +++ .../share/gc/shenandoah/shenandoahHeap.hpp | 2 +- .../shenandoah/shenandoahScanRemembered.cpp | 16 +++++ .../shenandoah/shenandoahScanRemembered.hpp | 4 ++ .../TestPassiveModeWithCardBarrier.java | 59 +++++++++++++++++++ .../options/TestWrongBarrierEnable.java | 20 +++++-- 9 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 test/hotspot/jtreg/gc/shenandoah/options/TestPassiveModeWithCardBarrier.java diff --git a/src/hotspot/share/gc/shenandoah/mode/shenandoahPassiveMode.cpp b/src/hotspot/share/gc/shenandoah/mode/shenandoahPassiveMode.cpp index 20f8ecc43e8..4c0bc209d78 100644 --- a/src/hotspot/share/gc/shenandoah/mode/shenandoahPassiveMode.cpp +++ b/src/hotspot/share/gc/shenandoah/mode/shenandoahPassiveMode.cpp @@ -48,11 +48,6 @@ void ShenandoahPassiveMode::initialize_flags() const { SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCloneBarrier); SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahStackWatermarkBarrier); SHENANDOAH_ERGO_DISABLE_FLAG(ShenandoahCardBarrier); - - // Final configuration checks - // Passive mode does not instantiate the machinery to support the card table. - // Exit if the flag has been explicitly set. - SHENANDOAH_CHECK_FLAG_UNSET(ShenandoahCardBarrier); } ShenandoahHeuristics* ShenandoahPassiveMode::initialize_heuristics(ShenandoahSpaceInfo* space_info) const { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index 2b791619d2e..53b83edd47b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -95,6 +95,12 @@ void ShenandoahDegenGC::op_degenerated() { // some phase, we have to upgrade the Degenerate GC to Full GC. heap->clear_cancelled_gc(); + // If it's passive mode with ShenandoahCardBarrier turned on: clean the write table + // without swapping the tables since no scan happens in passive mode anyway + if (ShenandoahCardBarrier && !heap->mode()->is_generational()) { + heap->old_generation()->card_scan()->mark_write_table_as_clean(); + } + #ifdef ASSERT if (heap->mode()->is_generational()) { ShenandoahOldGeneration* old_generation = heap->old_generation(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp index d3584a6f9a0..4c8c9fe0118 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp @@ -25,7 +25,6 @@ #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONALHEAP #define SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONALHEAP -#include "gc/shenandoah/shenandoahAsserts.hpp" #include "gc/shenandoah/shenandoahHeap.hpp" #include "memory/universe.hpp" #include "utilities/checkedCast.hpp" @@ -44,13 +43,13 @@ public: void initialize_heuristics() override; static ShenandoahGenerationalHeap* heap() { - shenandoah_assert_generational(); + assert(ShenandoahCardBarrier, "Should have card barrier to use genenrational heap"); CollectedHeap* heap = Universe::heap(); return cast(heap); } static ShenandoahGenerationalHeap* cast(CollectedHeap* heap) { - shenandoah_assert_generational(); + assert(ShenandoahCardBarrier, "Should have card barrier to use genenrational heap"); return checked_cast(heap); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index cb22c794d85..344811449ab 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -248,6 +248,13 @@ jint ShenandoahHeap::initialize() { // Now we know the number of regions and heap sizes, initialize the heuristics. initialize_heuristics(); + // If ShenandoahCardBarrier is enabled but it's not generational mode + // it means we're under passive mode and we have to initialize old gen + // for the purpose of having card table. + if (ShenandoahCardBarrier && !(mode()->is_generational())) { + _old_generation = new ShenandoahOldGeneration(max_workers(), max_capacity()); + } + assert(_heap_region.byte_size() == heap_rs.size(), "Need to know reserved size for card table"); // diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index d6bc17b844b..eae975b9409 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -530,7 +530,7 @@ public: } ShenandoahOldGeneration* old_generation() const { - assert(mode()->is_generational(), "Old generation requires generational mode"); + assert(ShenandoahCardBarrier, "Card mark barrier should be on"); return _old_generation; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp index 4a0215f15f1..af6cd6d39ab 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.cpp @@ -123,6 +123,18 @@ void ShenandoahDirectCardMarkRememberedSet::mark_read_table_as_clean() { log_develop_debug(gc, barrier)("Cleaned read_table from " PTR_FORMAT " to " PTR_FORMAT, p2i(&(read_table[0])), p2i(end_bp)); } +void ShenandoahDirectCardMarkRememberedSet::mark_write_table_as_clean() { + CardValue* write_table = _card_table->write_byte_map(); + CardValue* bp = &(write_table)[0]; + CardValue* end_bp = &(write_table)[_card_table->last_valid_index()]; + + while (bp <= end_bp) { + *bp++ = CardTable::clean_card_val(); + } + + log_develop_debug(gc, barrier)("Cleaned write_table from " PTR_FORMAT " to " PTR_FORMAT, p2i(&(write_table[0])), p2i(end_bp)); +} + // No lock required because arguments align with card boundaries. void ShenandoahCardCluster::reset_object_range(HeapWord* from, HeapWord* to) { assert(((((unsigned long long) from) & (CardTable::card_size() - 1)) == 0) && @@ -330,6 +342,10 @@ void ShenandoahScanRemembered::mark_read_table_as_clean() { _rs->mark_read_table_as_clean(); } +void ShenandoahScanRemembered::mark_write_table_as_clean() { + _rs->mark_write_table_as_clean(); +} + void ShenandoahScanRemembered::reset_object_range(HeapWord* from, HeapWord* to) { _scc->reset_object_range(from, to); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp index 5df34159c0f..d04a768530f 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahScanRemembered.hpp @@ -244,6 +244,8 @@ public: // See comment in ShenandoahScanRemembered inline void mark_read_table_as_clean(); + inline void mark_write_table_as_clean(); + // Merge any dirty values from write table into the read table, while leaving // the write table unchanged. void merge_write_table(HeapWord* start, size_t word_count); @@ -769,6 +771,8 @@ public: // the "write" table. void mark_read_table_as_clean(); + void mark_write_table_as_clean(); + // Swaps read and write card tables pointers in effect setting a clean card // table for the next GC cycle. void swap_card_tables() { _rs->swap_card_tables(); } diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestPassiveModeWithCardBarrier.java b/test/hotspot/jtreg/gc/shenandoah/options/TestPassiveModeWithCardBarrier.java new file mode 100644 index 00000000000..64e0a0b2a93 --- /dev/null +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestPassiveModeWithCardBarrier.java @@ -0,0 +1,59 @@ +/* + * Copyright Amazon.com Inc. 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. + * + * 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. + * + */ + +/* + * @test + * @summary Test passive mode with card barrier with a gc heavy app. A simple hello world in TestSelectiveBarrierFlags + * does not always surface crashes + * @requires vm.gc.Shenandoah + * @library /test/lib + * + * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+UseShenandoahGC -Xmx128m -XX:ShenandoahGCMode=passive -XX:+ShenandoahCardBarrier TestPassiveModeWithCardBarrier + */ + +import java.util.*; +import java.util.concurrent.*; + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestPassiveModeWithCardBarrier { + public static void main(String[] args) throws Exception { + List junk = new ArrayList<>(); + int junkLength = 1000; + int totalRounds = 10; + int round = 0; + + while (round++ < totalRounds) { + for (int i = 0; i < junkLength; i++) { + junk.add(new byte[1024]); + } + + System.out.println(junk.hashCode()); + } + + // trigger a full gc in case it was all degen + System.gc(); + } +} diff --git a/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierEnable.java b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierEnable.java index 411c2b1003d..348aa5367e9 100644 --- a/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierEnable.java +++ b/test/hotspot/jtreg/gc/shenandoah/options/TestWrongBarrierEnable.java @@ -37,18 +37,30 @@ import jdk.test.lib.process.OutputAnalyzer; public class TestWrongBarrierEnable { public static void main(String[] args) throws Exception { - String[] concurrent = { "ShenandoahSATBBarrier" }; + String[] concurrent = { + "ShenandoahLoadRefBarrier", + "ShenandoahSATBBarrier", + "ShenandoahCASBarrier", + "ShenandoahCloneBarrier", + "ShenandoahStackWatermarkBarrier", + }; String[] generational = { "ShenandoahCardBarrier" }; - String[] all = { "ShenandoahSATBBarrier", "ShenandoahCardBarrier" }; + String[] all = { + "ShenandoahLoadRefBarrier", + "ShenandoahSATBBarrier", + "ShenandoahCASBarrier", + "ShenandoahCloneBarrier", + "ShenandoahStackWatermarkBarrier", + "ShenandoahCardBarrier" + }; shouldPassAll("-XX:ShenandoahGCHeuristics=adaptive", concurrent); shouldPassAll("-XX:ShenandoahGCHeuristics=static", concurrent); shouldPassAll("-XX:ShenandoahGCHeuristics=compact", concurrent); shouldPassAll("-XX:ShenandoahGCHeuristics=aggressive", concurrent); - shouldPassAll("-XX:ShenandoahGCMode=passive", concurrent); + shouldPassAll("-XX:ShenandoahGCMode=passive", all); shouldPassAll("-XX:ShenandoahGCMode=generational", all); shouldFailAll("-XX:ShenandoahGCMode=satb", generational); - shouldFailAll("-XX:ShenandoahGCMode=passive", generational); } private static void shouldFailAll(String h, String[] barriers) throws Exception { From 87a47721981bb84b1e22b5b2d8d24bc60c8b7223 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 30 Oct 2025 07:08:18 +0000 Subject: [PATCH 357/561] 8366968: Exhaustive switch expression rejected by for not covering all possible values Reviewed-by: abimpoudis --- .../javac/comp/ExhaustivenessComputer.java | 39 ++--- .../tools/javac/patterns/Exhaustiveness.java | 133 +++++++++++++++++- 2 files changed, 153 insertions(+), 19 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java index 7a8067ce983..3b66ac010cf 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ExhaustivenessComputer.java @@ -210,7 +210,6 @@ public class ExhaustivenessComputer { if (clazz.isSealed() && clazz.isAbstract() && //if a binding pattern for clazz already exists, no need to analyze it again: !existingBindings.contains(clazz)) { - ListBuffer bindings = new ListBuffer<>(); //do not reduce to types unrelated to the selector type: Type clazzErasure = types.erasure(clazz.type); if (components(selectorType).stream() @@ -230,30 +229,36 @@ public class ExhaustivenessComputer { return instantiated != null && types.isCastable(selectorType, instantiated); }); + //the set of pending permitted subtypes needed to cover clazz: + Set pendingPermitted = new HashSet<>(permitted); + for (PatternDescription pdOther : patterns) { if (pdOther instanceof BindingPattern bpOther) { - Set currentPermittedSubTypes = - allPermittedSubTypes(bpOther.type.tsym, s -> true); + //remove all types from pendingPermitted that we can + //cover using bpOther: - PERMITTED: for (Iterator it = permitted.iterator(); it.hasNext();) { - Symbol perm = it.next(); + //all types that are permitted subtypes of bpOther's type: + pendingPermitted.removeIf(pending -> types.isSubtype(types.erasure(pending.type), + types.erasure(bpOther.type))); - for (Symbol currentPermitted : currentPermittedSubTypes) { - if (types.isSubtype(types.erasure(currentPermitted.type), - types.erasure(perm.type))) { - it.remove(); - continue PERMITTED; - } - } - if (types.isSubtype(types.erasure(perm.type), - types.erasure(bpOther.type))) { - it.remove(); - } + if (bpOther.type.tsym.isAbstract()) { + //all types that are in a diamond hierarchy with bpOther's type + //i.e. there's a common subtype of the given type and bpOther's type: + Predicate check = + pending -> permitted.stream() + .filter(perm -> types.isSubtype(types.erasure(perm.type), + types.erasure(bpOther.type))) + .filter(perm -> types.isSubtype(types.erasure(perm.type), + types.erasure(pending.type))) + .findAny() + .isPresent(); + + pendingPermitted.removeIf(check); } } } - if (permitted.isEmpty()) { + if (pendingPermitted.isEmpty()) { toAdd.add(new BindingPattern(clazz.type)); } } diff --git a/test/langtools/tools/javac/patterns/Exhaustiveness.java b/test/langtools/tools/javac/patterns/Exhaustiveness.java index 3f86ada6e7e..f328765b579 100644 --- a/test/langtools/tools/javac/patterns/Exhaustiveness.java +++ b/test/langtools/tools/javac/patterns/Exhaustiveness.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -23,7 +23,7 @@ /** * @test - * @bug 8262891 8268871 8274363 8281100 8294670 8311038 8311815 8325215 8333169 8327368 + * @bug 8262891 8268871 8274363 8281100 8294670 8311038 8311815 8325215 8333169 8327368 8366968 * @summary Check exhaustiveness of switches over sealed types. * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api @@ -2182,6 +2182,135 @@ public class Exhaustiveness extends TestRunner { """); } + @Test //JDK-8366968 + public void testNonSealedDiamond(Path base) throws Exception { + doTest(base, + new String[0], + """ + class Demo { + + sealed interface Base permits Special, Value {} + + non-sealed interface Value extends Base {} + + sealed interface Special extends Base permits SpecialValue {} + + non-sealed interface SpecialValue extends Value, Special {} + + static int demo(final Base base) { + return switch (base) { + case Value value -> 0; + }; + + } + + } + """); + } + + @Test //JDK-8366968 + public void testNonSealedDiamond2(Path base) throws Exception { + doTest(base, + new String[0], + """ + class Demo { + + sealed interface Base permits Special, Value {} + + non-sealed interface Value extends Base {} + + non-sealed interface Special extends Base {} + + interface SpecialValue extends Value, Special {} + + static int demo(final Base base) { + return switch (base) { + case Value value -> 0; + }; + + } + + } + """, + "Demo.java:12:16: compiler.err.not.exhaustive", + "1 error"); + } + + @Test //JDK-8366968 + public void testNonAbstract(Path base) throws Exception { + doTest(base, + new String[0], + """ + class Demo { + sealed interface I permits Base, C3 { } + sealed class Base implements I permits C1, C2 { } + final class C1 extends Base { } + final class C2 extends Base { } + final class C3 implements I { } + + void method1(I i) { + switch (i) { + case C1 _ -> {} + case C2 _ -> {} + case C3 _ -> {} + } + } + } + """, + "Demo.java:9:9: compiler.err.not.exhaustive.statement", + "1 error"); + } + + @Test //JDK-8366968 + public void testNonSealedDiamondGeneric(Path base) throws Exception { + doTest(base, + new String[0], + """ + class Demo { + class SomeType {} + sealed interface Base permits Special, Value {} + non-sealed interface Value extends Base {} + sealed interface Special extends Base permits SpecialValue {} + non-sealed interface SpecialValue extends Value, Special {} + + static int demo(final Base base) { + return switch (base) { + case Value value -> 0; + }; + } + } + """); + } + + @Test //JDK-8366968 + public void testNonSealedDiamondMultiple(Path base) throws Exception { + doTest(base, + new String[0], + """ + class Demo { + + sealed interface Base permits Special, Value {} + + non-sealed interface Value extends Base {} + + sealed interface Special extends Base permits SpecialValue, Special2 {} + + non-sealed interface SpecialValue extends Value, Special {} + non-sealed interface Special2 extends Special {} + + static int demo(final Base base) { + return switch (base) { + case Value value -> 0; + }; + + } + + } + """, + "Demo.java:13:16: compiler.err.not.exhaustive", + "1 error"); + } + private void doTest(Path base, String[] libraryCode, String testCode, String... expectedErrors) throws IOException { doTest(base, libraryCode, testCode, false, expectedErrors); } From 17fd801b24162dfbac6d4e63ef5048a0fb146074 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Thu, 30 Oct 2025 07:35:26 +0000 Subject: [PATCH 358/561] 8370807: G1: Improve region attribute table method naming Reviewed-by: ayang, sjohanss, iwalulya --- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 2 +- src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 15 ++++++++------- .../share/gc/g1/g1CollectedHeap.inline.hpp | 18 +++++++++++++----- src/hotspot/share/gc/g1/g1CollectionSet.cpp | 5 ++--- src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp | 11 ++++------- src/hotspot/share/gc/g1/g1YoungCollector.cpp | 4 ++-- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index d37ae512023..b71a3dbd8d3 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -3159,9 +3159,9 @@ G1HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size, G1HeapRegio young_regions_cset_group()->add(new_alloc_region); } else { new_alloc_region->set_old(); + update_region_attr(new_alloc_region); } _policy->remset_tracker()->update_at_allocate(new_alloc_region); - register_region_with_region_attr(new_alloc_region); G1HeapRegionPrinter::alloc(new_alloc_region); return new_alloc_region; } diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index c5b7da613d0..9adcc16bd4e 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -645,16 +645,17 @@ public: size_t word_size, bool update_remsets); - // We register a region with the fast "in collection set" test. We - // simply set to true the array slot corresponding to this region. - void register_young_region_with_region_attr(G1HeapRegion* r) { - _region_attr.set_in_young(r->hrm_index(), r->has_pinned_objects()); - } + // The following methods update the region attribute table, i.e. a compact + // representation of per-region information that is regularly accessed + // during GC. + inline void register_young_region_with_region_attr(G1HeapRegion* r); inline void register_new_survivor_region_with_region_attr(G1HeapRegion* r); - inline void register_region_with_region_attr(G1HeapRegion* r); - inline void register_old_region_with_region_attr(G1HeapRegion* r); + inline void register_old_collection_set_region_with_region_attr(G1HeapRegion* r); inline void register_optional_region_with_region_attr(G1HeapRegion* r); + // Updates region state without overwriting the type in the region attribute table. + inline void update_region_attr(G1HeapRegion* r); + void clear_region_attr(const G1HeapRegion* hr) { _region_attr.clear(hr); } diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp index fdc8585dbc0..7e3f13ab890 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp @@ -191,18 +191,26 @@ void G1CollectedHeap::register_humongous_candidate_region_with_region_attr(uint _region_attr.set_humongous_candidate(index); } -void G1CollectedHeap::register_new_survivor_region_with_region_attr(G1HeapRegion* r) { - _region_attr.set_new_survivor_region(r->hrm_index()); +void G1CollectedHeap::register_young_region_with_region_attr(G1HeapRegion* r) { + assert(!is_in_cset(r), "should not already be registered as in collection set"); + _region_attr.set_in_young(r->hrm_index(), r->has_pinned_objects()); } -void G1CollectedHeap::register_region_with_region_attr(G1HeapRegion* r) { +void G1CollectedHeap::register_new_survivor_region_with_region_attr(G1HeapRegion* r) { + assert(!is_in_cset(r), "should not already be registered as in collection set"); + _region_attr.set_new_survivor_region(r->hrm_index(), r->has_pinned_objects()); +} + +void G1CollectedHeap::update_region_attr(G1HeapRegion* r) { _region_attr.set_remset_is_tracked(r->hrm_index(), r->rem_set()->is_tracked()); _region_attr.set_is_pinned(r->hrm_index(), r->has_pinned_objects()); } -void G1CollectedHeap::register_old_region_with_region_attr(G1HeapRegion* r) { +void G1CollectedHeap::register_old_collection_set_region_with_region_attr(G1HeapRegion* r) { + assert(!is_in_cset(r), "should not already be registered as in collection set"); + assert(r->is_old(), "must be"); assert(r->rem_set()->is_complete(), "must be"); - _region_attr.set_in_old(r->hrm_index(), true); + _region_attr.set_in_old(r->hrm_index(), true, r->has_pinned_objects()); _rem_set->exclude_region_from_scan(r->hrm_index()); } diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp index 037eb071072..c86152aa7e7 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp @@ -126,8 +126,7 @@ void G1CollectionSet::add_old_region(G1HeapRegion* hr) { assert(!hr->rem_set()->has_cset_group(), "Should have already uninstalled group remset"); - assert(!hr->in_collection_set(), "should not already be in the collection set"); - _g1h->register_old_region_with_region_attr(hr); + _g1h->register_old_collection_set_region_with_region_attr(hr); assert(_regions_cur_length < _regions_max_length, "Collection set now larger than maximum size."); _regions[_regions_cur_length++] = hr->hrm_index(); @@ -736,7 +735,7 @@ void G1CollectionSet::abandon_optional_collection_set(G1ParScanThreadStateSet* p // Clear collection set marker and make sure that the remembered set information // is correct as we still need it later. _g1h->clear_region_attr(r); - _g1h->register_region_with_region_attr(r); + _g1h->update_region_attr(r); r->clear_index_in_opt_cset(); }; diff --git a/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp b/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp index 6d9bcea0343..39c27d6739a 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp @@ -84,7 +84,6 @@ public: bool remset_is_tracked() const { return _remset_is_tracked != 0; } - void set_new_survivor() { _type = NewSurvivor; } bool is_pinned() const { return _is_pinned != 0; } void set_old() { _type = Old; } @@ -132,10 +131,10 @@ class G1HeapRegionAttrBiasedMappedArray : public G1BiasedMappedArrayset_new_survivor(); + set_by_index(index, G1HeapRegionAttr(G1HeapRegionAttr::NewSurvivor, true, region_is_pinned)); } void set_humongous_candidate(uintptr_t index) { @@ -170,12 +169,10 @@ class G1HeapRegionAttrBiasedMappedArray : public G1BiasedMappedArrayis_starts_humongous()) { - _g1h->register_region_with_region_attr(hr); + _g1h->update_region_attr(hr); return false; } @@ -436,7 +436,7 @@ class G1PrepareEvacuationTask : public WorkerTask { _worker_humongous_candidates++; // We will later handle the remembered sets of these regions. } else { - _g1h->register_region_with_region_attr(hr); + _g1h->update_region_attr(hr); } log_debug(gc, humongous)("Humongous region %u (object size %zu @ " PTR_FORMAT ") remset %zu code roots %zu " "marked %d pinned count %zu reclaim candidate %d type %s", From 5096dc8972f7e2885ba4b1d994be630c7fc3b3a6 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Thu, 30 Oct 2025 08:05:35 +0000 Subject: [PATCH 359/561] 8368739: [AIX] java/net/httpclient/http3/H3SimpleGet.java#useNioSelector and #with-continuations fail Reviewed-by: mdoerr, dfuchs --- .../net/httpclient/http3/H3SimpleGet.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/jdk/java/net/httpclient/http3/H3SimpleGet.java b/test/jdk/java/net/httpclient/http3/H3SimpleGet.java index bccd77e7e1d..e75ad04263a 100644 --- a/test/jdk/java/net/httpclient/http3/H3SimpleGet.java +++ b/test/jdk/java/net/httpclient/http3/H3SimpleGet.java @@ -26,6 +26,7 @@ * @bug 8087112 * @requires os.family != "windows" | ( os.name != "Windows 10" & os.name != "Windows Server 2016" * & os.name != "Windows Server 2019" ) + * @requires os.family != "aix" * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestUtil * jdk.httpclient.test.lib.http2.Http2TestServer @@ -45,6 +46,29 @@ * H3SimpleGet */ +/* + * @test id=with-continuations-aix + * @bug 8087112 + * @requires os.family == "aix" + * @library /test/lib /test/jdk/java/net/httpclient/lib + * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestUtil + * jdk.httpclient.test.lib.http2.Http2TestServer + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * H3SimpleGet + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * -Djdk.httpclient.retryOnStreamlimit=20 + * -Djdk.httpclient.redirects.retrylimit=21 + * -Dsimpleget.repeat=1 -Dsimpleget.chunks=1 -Dsimpleget.requests=1000 + * H3SimpleGet + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * -Dsimpleget.requests=150 + * -Dsimpleget.chunks=16384 + * -Djdk.httpclient.retryOnStreamlimit=5 + * -Djdk.httpclient.redirects.retrylimit=6 + * -Djdk.httpclient.quic.defaultMTU=8192 + * H3SimpleGet + */ + /* * @test id=without-continuation * @bug 8087112 @@ -75,6 +99,7 @@ /* * @test id=useNioSelector * @bug 8087112 + * @requires os.family != "aix" * @library /test/lib /test/jdk/java/net/httpclient/lib * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestUtil * jdk.httpclient.test.lib.http2.Http2TestServer @@ -97,6 +122,32 @@ * H3SimpleGet */ +/* + * @test id=useNioSelector-aix + * @bug 8087112 + * @requires os.family == "aix" + * @library /test/lib /test/jdk/java/net/httpclient/lib + * @build jdk.test.lib.net.SimpleSSLContext jdk.httpclient.test.lib.common.TestUtil + * jdk.httpclient.test.lib.http2.Http2TestServer + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * -Djdk.internal.httpclient.quic.useNioSelector=true + * H3SimpleGet + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * -Djdk.internal.httpclient.quic.useNioSelector=true + * -Djdk.httpclient.retryOnStreamlimit=20 + * -Djdk.httpclient.redirects.retrylimit=21 + * -Dsimpleget.repeat=1 -Dsimpleget.chunks=1 -Dsimpleget.requests=1000 + * H3SimpleGet + * @run testng/othervm/timeout=480 -XX:+HeapDumpOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError + * -Djdk.internal.httpclient.quic.useNioSelector=true + * -Dsimpleget.requests=150 + * -Dsimpleget.chunks=16384 + * -Djdk.httpclient.retryOnStreamlimit=5 + * -Djdk.httpclient.redirects.retrylimit=6 + * -Djdk.httpclient.quic.defaultMTU=8192 + * H3SimpleGet + */ + // Interesting additional settings for debugging and manual testing: // ----------------------------------------------------------------- // -Djdk.httpclient.HttpClient.log=requests,errors,quic:retransmit:control,http3 From d565c45e61bf741cdac5ede252277e4ebc17c104 Mon Sep 17 00:00:00 2001 From: Afshin Zafari Date: Thu, 30 Oct 2025 08:14:54 +0000 Subject: [PATCH 360/561] 8370261: Test runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java timed out Reviewed-by: dholmes, shade --- .../jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java index 106295960fd..7f0f1be929b 100644 --- a/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java +++ b/test/hotspot/jtreg/runtime/NMT/NMTPrintMallocSiteOfCorruptedMemory.java @@ -57,6 +57,7 @@ public class NMTPrintMallocSiteOfCorruptedMemory { ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(new String[] {"-Xbootclasspath/a:.", "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI", + "-XX:-CreateCoredumpOnCrash", "-XX:NativeMemoryTracking=detail", "-Djava.library.path=" + Utils.TEST_NATIVE_PATH, "NMTPrintMallocSiteOfCorruptedMemory", From 87e5341d78d206fa9e987340861cd5f1c0858891 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Thu, 30 Oct 2025 09:22:11 +0000 Subject: [PATCH 361/561] 8370804: G1: Make G1HeapRegionAttr::remset_is_tracked() conform to coding style Reviewed-by: iwalulya, sjohanss, fandreuzzi, ayang --- src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 8 ++--- src/hotspot/share/gc/g1/g1CollectedHeap.hpp | 2 +- .../share/gc/g1/g1CollectedHeap.inline.hpp | 2 +- src/hotspot/share/gc/g1/g1CollectionSet.cpp | 4 +-- src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp | 30 +++++++++---------- .../gc/g1/g1ParScanThreadState.inline.hpp | 6 ++-- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp index b71a3dbd8d3..84c16fe3e22 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp @@ -2548,15 +2548,15 @@ bool G1CollectedHeap::is_potential_eager_reclaim_candidate(G1HeapRegion* r) cons } #ifndef PRODUCT -void G1CollectedHeap::verify_region_attr_remset_is_tracked() { +void G1CollectedHeap::verify_region_attr_is_remset_tracked() { class VerifyRegionAttrRemSet : public G1HeapRegionClosure { public: virtual bool do_heap_region(G1HeapRegion* r) { G1CollectedHeap* g1h = G1CollectedHeap::heap(); - bool const remset_is_tracked = g1h->region_attr(r->bottom()).remset_is_tracked(); - assert(r->rem_set()->is_tracked() == remset_is_tracked, + const bool is_remset_tracked = g1h->region_attr(r->bottom()).is_remset_tracked(); + assert(r->rem_set()->is_tracked() == is_remset_tracked, "Region %u remset tracking status (%s) different to region attribute (%s)", - r->hrm_index(), BOOL_TO_STR(r->rem_set()->is_tracked()), BOOL_TO_STR(remset_is_tracked)); + r->hrm_index(), BOOL_TO_STR(r->rem_set()->is_tracked()), BOOL_TO_STR(is_remset_tracked)); return false; } } cl; diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp index 9adcc16bd4e..672800629cb 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp @@ -666,7 +666,7 @@ public: // Verify that the G1RegionAttr remset tracking corresponds to actual remset tracking // for all regions. - void verify_region_attr_remset_is_tracked() PRODUCT_RETURN; + void verify_region_attr_is_remset_tracked() PRODUCT_RETURN; void clear_bitmap_for_region(G1HeapRegion* hr); diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp index 7e3f13ab890..abd61e72d57 100644 --- a/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.inline.hpp @@ -202,7 +202,7 @@ void G1CollectedHeap::register_new_survivor_region_with_region_attr(G1HeapRegion } void G1CollectedHeap::update_region_attr(G1HeapRegion* r) { - _region_attr.set_remset_is_tracked(r->hrm_index(), r->rem_set()->is_tracked()); + _region_attr.set_is_remset_tracked(r->hrm_index(), r->rem_set()->is_tracked()); _region_attr.set_is_pinned(r->hrm_index(), r->has_pinned_objects()); } diff --git a/src/hotspot/share/gc/g1/g1CollectionSet.cpp b/src/hotspot/share/gc/g1/g1CollectionSet.cpp index c86152aa7e7..eb50b7ae5be 100644 --- a/src/hotspot/share/gc/g1/g1CollectionSet.cpp +++ b/src/hotspot/share/gc/g1/g1CollectionSet.cpp @@ -723,7 +723,7 @@ bool G1CollectionSet::finalize_optional_for_evacuation(double remaining_pause_ti stop_incremental_building(); - _g1h->verify_region_attr_remset_is_tracked(); + _g1h->verify_region_attr_is_remset_tracked(); return num_regions_selected > 0; } @@ -744,7 +744,7 @@ void G1CollectionSet::abandon_optional_collection_set(G1ParScanThreadStateSet* p _optional_groups.remove_selected(_optional_groups.length(), _optional_groups.num_regions()); } - _g1h->verify_region_attr_remset_is_tracked(); + _g1h->verify_region_attr_is_remset_tracked(); } #ifdef ASSERT diff --git a/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp b/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp index 39c27d6739a..0c5f14ba3b2 100644 --- a/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp +++ b/src/hotspot/share/gc/g1/g1HeapRegionAttr.hpp @@ -33,15 +33,15 @@ struct G1HeapRegionAttr { public: typedef int8_t region_type_t; - // remset_is_tracked_t is essentially bool, but we need precise control + // is_remset_tracked_t is essentially bool, but we need precise control // on the size, and sizeof(bool) is implementation specific. - typedef uint8_t remset_is_tracked_t; + typedef uint8_t is_remset_tracked_t; // _is_pinned_t is essentially bool, but we want precise control // on the size, and sizeof(bool) is implementation specific. typedef uint8_t is_pinned_t; private: - remset_is_tracked_t _remset_is_tracked; + is_remset_tracked_t _is_remset_tracked; region_type_t _type; is_pinned_t _is_pinned; @@ -63,8 +63,8 @@ public: static const region_type_t Old = 1; // The region is in the collection set and an old region. static const region_type_t Num = 2; - G1HeapRegionAttr(region_type_t type = NotInCSet, bool remset_is_tracked = false, bool is_pinned = false) : - _remset_is_tracked(remset_is_tracked ? 1 : 0), _type(type), _is_pinned(is_pinned ? 1 : 0) { + G1HeapRegionAttr(region_type_t type = NotInCSet, bool is_remset_tracked = false, bool is_pinned = false) : + _is_remset_tracked(is_remset_tracked ? 1 : 0), _type(type), _is_pinned(is_pinned ? 1 : 0) { assert(is_valid(), "Invalid type %d", _type); } @@ -82,7 +82,7 @@ public: } } - bool remset_is_tracked() const { return _remset_is_tracked != 0; } + bool is_remset_tracked() const { return _is_remset_tracked != 0; } bool is_pinned() const { return _is_pinned != 0; } @@ -92,7 +92,7 @@ public: _type = NotInCSet; } - void set_remset_is_tracked(bool value) { _remset_is_tracked = value ? 1 : 0; } + void set_is_remset_tracked(bool value) { _is_remset_tracked = value ? 1 : 0; } void set_is_pinned(bool value) { _is_pinned = value ? 1 : 0; } bool is_in_cset_or_humongous_candidate() const { return is_in_cset() || is_humongous_candidate(); } @@ -125,10 +125,10 @@ class G1HeapRegionAttrBiasedMappedArray : public G1BiasedMappedArrayis_humongous_candidate(); } - void set_remset_is_tracked(uintptr_t index, bool remset_is_tracked) { - get_ref_by_index(index)->set_remset_is_tracked(remset_is_tracked); + void set_is_remset_tracked(uintptr_t index, bool is_remset_tracked) { + get_ref_by_index(index)->set_is_remset_tracked(is_remset_tracked); } void set_is_pinned(uintptr_t index, bool is_pinned) { @@ -169,10 +169,10 @@ class G1HeapRegionAttrBiasedMappedArray : public G1BiasedMappedArray void G1ParScanThreadState::mark_card_if_tracked(G1HeapRegionA #ifdef ASSERT G1HeapRegion* const hr_obj = _g1h->heap_region_containing(o); - assert(region_attr.remset_is_tracked() == hr_obj->rem_set()->is_tracked(), + assert(region_attr.is_remset_tracked() == hr_obj->rem_set()->is_tracked(), "State flag indicating remset tracking disagrees (%s) with actual remembered set (%s) for region %u", - BOOL_TO_STR(region_attr.remset_is_tracked()), + BOOL_TO_STR(region_attr.is_remset_tracked()), BOOL_TO_STR(hr_obj->rem_set()->is_tracked()), hr_obj->hrm_index()); #endif - if (!region_attr.remset_is_tracked()) { + if (!region_attr.is_remset_tracked()) { return; } bool into_survivor = region_attr.is_new_survivor(); From 80fcfaf41aa2d6af30f15877e4466647dbca424e Mon Sep 17 00:00:00 2001 From: Roland Westrelin Date: Thu, 30 Oct 2025 10:34:37 +0000 Subject: [PATCH 362/561] 8369435: C2: transform (LShiftX (SubX con0 a), con1) into (SubX con0< TestMemorySegment_SubOfShift.java} | 14 +++---- 4 files changed, 64 insertions(+), 11 deletions(-) rename test/hotspot/jtreg/compiler/loopopts/superword/{TestMemorySegment_8359688.java => TestMemorySegment_SubOfShift.java} (86%) diff --git a/src/hotspot/share/opto/mulnode.cpp b/src/hotspot/share/opto/mulnode.cpp index 6940538e155..280781f686b 100644 --- a/src/hotspot/share/opto/mulnode.cpp +++ b/src/hotspot/share/opto/mulnode.cpp @@ -1080,6 +1080,19 @@ Node* LShiftNode::IdealIL(PhaseGVN* phase, bool can_reshape, BasicType bt) { } } } + // Check for "(con0 - X) << con1" + // Transform is legal, but check for profit. Avoid breaking 'i2s' + // and 'i2b' patterns which typically fold into 'StoreC/StoreB'. + if (add1_op == Op_Sub(bt) && (bt != T_INT || con < 16)) { // Left input is a sub? + // Left input is a sub from a constant? + const TypeInteger* t11 = phase->type(add1->in(1))->isa_integer(bt); + if (t11 != nullptr && t11->is_con()) { + // Compute X << con0 + Node* lsh = phase->transform(LShiftNode::make(add1->in(2), in(2), bt)); + // Compute (con1<integercon(java_shift_left(t11->get_con_as_long(bt), con, bt), bt), lsh, bt); + } + } // Check for "(x >> C1) << C2" if (add1_op == Op_RShift(bt) || add1_op == Op_URShift(bt)) { diff --git a/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java index 7db56e2a878..c7a35a5a265 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/LShiftINodeIdealizationTests.java @@ -65,6 +65,7 @@ public class LShiftINodeIdealizationTests { "testLShiftOfAndOfRShift", "testLShiftOfAndOfURShift", "testLShiftOfAndOfCon", + "testShiftOfSubConstant", }) public void runMethod() { int a = RunInfo.getRandom().nextInt(); @@ -122,6 +123,7 @@ public class LShiftINodeIdealizationTests { Asserts.assertEQ((a + a) << 31, testLargeShiftOfAddSameInput(a)); Asserts.assertEQ(((a + 1) << 1) + 1, testShiftOfAddConstant(a)); Asserts.assertEQ((a & ((1 << (32 - 10)) -1)) << 10, testLShiftOfAndOfCon(a)); + Asserts.assertEQ(((1 - a) << 1) + 1, testShiftOfSubConstant(a)); assertDoubleShiftResult(a); } @@ -359,17 +361,45 @@ public class LShiftINodeIdealizationTests { @Test @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) @Arguments( values = { Argument.NUMBER_42 }) - public void testStoreShort(int x) { + public void testStoreShort1(int x) { shortField = (short)(x + x); } @Test @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) @Arguments( values = { Argument.NUMBER_42 }) - public void testStoreByte(int x) { + public void testStoreByte1(int x) { byteField = (byte)(x + x); } + @Test + @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreShort2(int x) { + shortField = (short)(x + 1); + } + + @Test + @IR(counts = { IRNode.ADD_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreByte2(int x) { + byteField = (byte)(x + 1); + } + + @Test + @IR(counts = { IRNode.SUB_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreShort3(int x) { + shortField = (short)(1 - x); + } + + @Test + @IR(counts = { IRNode.SUB_I, "1"} , failOn = { IRNode.LSHIFT_I, IRNode.RSHIFT_I } ) + @Arguments( values = { Argument.NUMBER_42 }) + public void testStoreByte3(int x) { + byteField = (byte)(1 - x); + } + static int otherInput; @Test @@ -409,4 +439,10 @@ public class LShiftINodeIdealizationTests { public int testLShiftOfAndOfCon(int x) { return (x & ((1 << (32 - 10)) -1)) << 10; } + + @Test + @IR(counts = { IRNode.LSHIFT_I, "1", IRNode.SUB_I, "1" }, failOn = { IRNode.ADD_I }) + public int testShiftOfSubConstant(int x) { + return ((1 - x) << 1) + 1; + } } diff --git a/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java b/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java index f489a348eef..6e58d6a04fe 100644 --- a/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java +++ b/test/hotspot/jtreg/compiler/c2/irTests/LShiftLNodeIdealizationTests.java @@ -63,6 +63,7 @@ public class LShiftLNodeIdealizationTests { "testLShiftOfAndOfRShift", "testLShiftOfAndOfURShift", "testLShiftOfAndOfCon", + "testShiftOfSubConstant", }) public void runMethod() { long a = RunInfo.getRandom().nextLong(); @@ -118,6 +119,7 @@ public class LShiftLNodeIdealizationTests { Asserts.assertEQ((a + a) << 63, testLargeShiftOfAddSameInput(a)); Asserts.assertEQ(((a + 1) << 1) + 1, testShiftOfAddConstant(a)); Asserts.assertEQ((a & ((1L << (64 - 10)) -1)) << 10, testLShiftOfAndOfCon(a)); + Asserts.assertEQ(((1L - a) << 1) + 1, testShiftOfSubConstant(a)); assertDoubleShiftResult(a); } @@ -358,4 +360,10 @@ public class LShiftLNodeIdealizationTests { public long testLShiftOfAndOfCon(long x) { return (x & ((1L << (64 - 10)) -1)) << 10; } + + @Test + @IR(counts = { IRNode.LSHIFT_L, "1", IRNode.SUB_L, "1" }, failOn = { IRNode.ADD_L }) + public long testShiftOfSubConstant(long x) { + return ((1 - x) << 1) + 1; + } } diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8359688.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_SubOfShift.java similarity index 86% rename from test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8359688.java rename to test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_SubOfShift.java index cac69901a32..34741d0f2a7 100644 --- a/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_8359688.java +++ b/test/hotspot/jtreg/compiler/loopopts/superword/TestMemorySegment_SubOfShift.java @@ -30,17 +30,17 @@ import compiler.lib.ir_framework.*; /* * @test - * @bug 8324751 + * @bug 8324751 8369435 * @summary Reported issue: JDK-8359688: C2 SuperWord: missing RCE with MemorySegment * The examples are generated from TestAliasingFuzzer.java * So if you see something change here, you may want to investigate if we * can also tighten up the IR rules there. * @library /test/lib / - * @run driver compiler.loopopts.superword.TestMemorySegment_8359688 + * @run driver compiler.loopopts.superword.TestMemorySegment_SubOfShift */ -public class TestMemorySegment_8359688 { +public class TestMemorySegment_SubOfShift { public static MemorySegment b = MemorySegment.ofArray(new long[4 * 30_000]); @@ -61,17 +61,13 @@ public class TestMemorySegment_8359688 { @Test @Arguments(setup = "setup") - @IR(counts = {IRNode.STORE_VECTOR, "= 0", - IRNode.REPLICATE_L, "= 0", + @IR(counts = {IRNode.STORE_VECTOR, "> 0", + IRNode.REPLICATE_L, "= 1", ".*multiversion.*", "= 0"}, // AutoVectorization Predicate SUFFICES, there is no aliasing phase = CompilePhase.PRINT_IDEAL, applyIfPlatform = {"64-bit", "true"}, applyIf = {"AlignVector", "false"}, applyIfCPUFeatureOr = {"avx", "true", "asimd", "true"}) - // Does not manage to remove all RangeChecks -> no vectorization - // If you see this IR rule fail: investigate JDK-8359688, possibly close it and fix this IR rule! - // Also: consider renaming the file to something more descriptive: what have you fixed with this? - // And: you may now be able to tighten IR rules in TestAliasingFuzzer.java public static void test1(MemorySegment b, int ivLo, int ivHi, int invar) { for (int i = ivLo; i < ivHi; i++) { b.setAtIndex(ValueLayout.JAVA_LONG_UNALIGNED, 30_000L - (long)i + (long)invar, 42); From 795bf9f6d16d89f65076d4b37dddb309a91ce6ea Mon Sep 17 00:00:00 2001 From: Anton Seoane Ampudia Date: Thu, 30 Oct 2025 11:31:29 +0000 Subject: [PATCH 363/561] 8351159: Remaining cleanups in cpu/x86 after 32-bit x86 removal Reviewed-by: stefank, kvn --- .../cpu/x86/abstractInterpreter_x86.cpp | 26 - src/hotspot/cpu/x86/assembler_x86.cpp | 2 - src/hotspot/cpu/x86/c2_globals_x86.hpp | 12 +- src/hotspot/cpu/x86/c2_init_x86.cpp | 8 - src/hotspot/cpu/x86/compiledIC_x86.cpp | 3 +- src/hotspot/cpu/x86/compressedKlass_x86.cpp | 4 - src/hotspot/cpu/x86/copy_x86.hpp | 201 +- src/hotspot/cpu/x86/frame_x86.cpp | 21 +- src/hotspot/cpu/x86/frame_x86.hpp | 8 +- src/hotspot/cpu/x86/frame_x86.inline.hpp | 2 - src/hotspot/cpu/x86/interp_masm_x86.cpp | 4 +- src/hotspot/cpu/x86/jniTypes_x86.hpp | 28 +- .../cpu/x86/jvmciCodeInstaller_x86.cpp | 8 - src/hotspot/cpu/x86/methodHandles_x86.cpp | 4 - src/hotspot/cpu/x86/relocInfo_x86.cpp | 14 - src/hotspot/cpu/x86/relocInfo_x86.hpp | 6 +- src/hotspot/cpu/x86/vm_version_x86.cpp | 2 - src/hotspot/cpu/x86/x86.ad | 14670 ++++++++++++++- src/hotspot/cpu/x86/x86_64.ad | 14735 ---------------- .../os_cpu/bsd_x86/atomicAccess_bsd_x86.hpp | 48 - .../os_cpu/bsd_x86/globals_bsd_x86.hpp | 12 +- .../os_cpu/bsd_x86/orderAccess_bsd_x86.hpp | 6 +- src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp | 421 +- .../os_cpu/bsd_x86/os_bsd_x86.inline.hpp | 9 +- .../bsd_x86/prefetch_bsd_x86.inline.hpp | 8 +- .../linux_x86/atomicAccess_linux_x86.hpp | 49 - .../os_cpu/linux_x86/globals_linux_x86.hpp | 17 +- .../linux_x86/orderAccess_linux_x86.hpp | 14 +- src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp | 176 +- .../os_cpu/linux_x86/os_linux_x86.inline.hpp | 9 +- .../linux_x86/prefetch_linux_x86.inline.hpp | 8 +- .../os_cpu/windows_x86/os_windows_x86.cpp | 2 - 32 files changed, 14782 insertions(+), 15755 deletions(-) delete mode 100644 src/hotspot/cpu/x86/x86_64.ad diff --git a/src/hotspot/cpu/x86/abstractInterpreter_x86.cpp b/src/hotspot/cpu/x86/abstractInterpreter_x86.cpp index 6680b8c4c03..c112182fdee 100644 --- a/src/hotspot/cpu/x86/abstractInterpreter_x86.cpp +++ b/src/hotspot/cpu/x86/abstractInterpreter_x86.cpp @@ -120,27 +120,6 @@ void AbstractInterpreter::layout_activation(Method* method, method->method_holder()->java_mirror(); } -#ifndef _LP64 -int AbstractInterpreter::BasicType_as_index(BasicType type) { - int i = 0; - switch (type) { - case T_BOOLEAN: i = 0; break; - case T_CHAR : i = 1; break; - case T_BYTE : i = 2; break; - case T_SHORT : i = 3; break; - case T_INT : // fall through - case T_LONG : // fall through - case T_VOID : i = 4; break; - case T_FLOAT : i = 5; break; // have to treat float and double separately for SSE - case T_DOUBLE : i = 6; break; - case T_OBJECT : // fall through - case T_ARRAY : i = 7; break; - default : ShouldNotReachHere(); - } - assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, "index out of bounds"); - return i; -} -#else int AbstractInterpreter::BasicType_as_index(BasicType type) { int i = 0; switch (type) { @@ -161,7 +140,6 @@ int AbstractInterpreter::BasicType_as_index(BasicType type) { "index out of bounds"); return i; } -#endif // _LP64 // How much stack a method activation needs in words. int AbstractInterpreter::size_top_interpreter_activation(Method* method) { @@ -173,11 +151,7 @@ int AbstractInterpreter::size_top_interpreter_activation(Method* method) { const int overhead_size = -(frame::interpreter_frame_initial_sp_offset) + entry_size; -#ifndef _LP64 - const int stub_code = 4; // see generate_call_stub -#else const int stub_code = frame::entry_frame_after_call_words; -#endif const int method_stack = (method->max_locals() + method->max_stack()) * Interpreter::stackElementWords; diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp b/src/hotspot/cpu/x86/assembler_x86.cpp index fd62e9358bf..e3ba0ebb56a 100644 --- a/src/hotspot/cpu/x86/assembler_x86.cpp +++ b/src/hotspot/cpu/x86/assembler_x86.cpp @@ -2935,7 +2935,6 @@ void Assembler::mov(Register dst, Register src) { } void Assembler::movapd(XMMRegister dst, Address src) { - NOT_LP64(assert(VM_Version::supports_sse2(), "")); InstructionMark im(this); InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true); attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit); @@ -8071,7 +8070,6 @@ void Assembler::vandps(XMMRegister dst, XMMRegister nds, Address src, int vector } void Assembler::orpd(XMMRegister dst, XMMRegister src) { - NOT_LP64(assert(VM_Version::supports_sse2(), "")); InstructionAttr attributes(AVX_128bit, /* rex_w */ !_legacy_mode_dq, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true); attributes.set_rex_vex_w_reverted(); int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes); diff --git a/src/hotspot/cpu/x86/c2_globals_x86.hpp b/src/hotspot/cpu/x86/c2_globals_x86.hpp index afd46a6fb08..3f616cb4578 100644 --- a/src/hotspot/cpu/x86/c2_globals_x86.hpp +++ b/src/hotspot/cpu/x86/c2_globals_x86.hpp @@ -45,21 +45,13 @@ define_pd_global(intx, ConditionalMoveLimit, 3); define_pd_global(intx, FreqInlineSize, 325); define_pd_global(intx, MinJumpTableSize, 10); define_pd_global(intx, LoopPercentProfileLimit, 10); -#ifdef AMD64 define_pd_global(intx, InteriorEntryAlignment, 16); -define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); +define_pd_global(size_t, NewSizeThreadIncrease, ScaleForWordSize(4*K)); define_pd_global(intx, LoopUnrollLimit, 60); // InitialCodeCacheSize derived from specjbb2000 run. define_pd_global(size_t, InitialCodeCacheSize, 2496*K); // Integral multiple of CodeCacheExpansionSize define_pd_global(size_t, CodeCacheExpansionSize, 64*K); -#else -define_pd_global(intx, InteriorEntryAlignment, 4); -define_pd_global(size_t, NewSizeThreadIncrease, 4*K); -define_pd_global(intx, LoopUnrollLimit, 50); // Design center runs on 1.3.1 -// InitialCodeCacheSize derived from specjbb2000 run. -define_pd_global(size_t, InitialCodeCacheSize, 2304*K); // Integral multiple of CodeCacheExpansionSize -define_pd_global(size_t, CodeCacheExpansionSize, 32*K); -#endif // AMD64 + define_pd_global(intx, RegisterCostAreaRatio, 16000); // Peephole and CISC spilling both break the graph, and so makes the diff --git a/src/hotspot/cpu/x86/c2_init_x86.cpp b/src/hotspot/cpu/x86/c2_init_x86.cpp index b286c3a34f2..4d8db39bb0c 100644 --- a/src/hotspot/cpu/x86/c2_init_x86.cpp +++ b/src/hotspot/cpu/x86/c2_init_x86.cpp @@ -33,14 +33,6 @@ extern void reg_mask_init(); void Compile::pd_compiler2_init() { guarantee(CodeEntryAlignment >= InteriorEntryAlignment, "" ); - // QQQ presumably all 64bit cpu's support this. Seems like the ifdef could - // simply be left out. -#ifndef AMD64 - if (!VM_Version::supports_cmov()) { - ConditionalMoveLimit = 0; - } -#endif // AMD64 - if (UseAVX < 3) { int delta = XMMRegister::max_slots_per_register * XMMRegister::number_of_registers; int bottom = ConcreteRegisterImpl::max_fpr; diff --git a/src/hotspot/cpu/x86/compiledIC_x86.cpp b/src/hotspot/cpu/x86/compiledIC_x86.cpp index 53ad9aeec91..ae5521ce170 100644 --- a/src/hotspot/cpu/x86/compiledIC_x86.cpp +++ b/src/hotspot/cpu/x86/compiledIC_x86.cpp @@ -61,8 +61,7 @@ address CompiledDirectCall::emit_to_interp_stub(MacroAssembler *masm, address ma #undef __ int CompiledDirectCall::to_interp_stub_size() { - return NOT_LP64(10) // movl; jmp - LP64_ONLY(15); // movq (1+1+8); jmp (1+4) + return 15; // movq (1+1+8); jmp (1+4) } int CompiledDirectCall::to_trampoline_stub_size() { diff --git a/src/hotspot/cpu/x86/compressedKlass_x86.cpp b/src/hotspot/cpu/x86/compressedKlass_x86.cpp index e88b7a3d4e1..1151a6200ce 100644 --- a/src/hotspot/cpu/x86/compressedKlass_x86.cpp +++ b/src/hotspot/cpu/x86/compressedKlass_x86.cpp @@ -23,8 +23,6 @@ * */ -#ifdef _LP64 - #include "memory/metaspace.hpp" #include "oops/compressedKlass.hpp" #include "utilities/globalDefinitions.hpp" @@ -54,5 +52,3 @@ char* CompressedKlassPointers::reserve_address_space_for_compressed_classes(size return result; } - -#endif // _LP64 diff --git a/src/hotspot/cpu/x86/copy_x86.hpp b/src/hotspot/cpu/x86/copy_x86.hpp index 1798e74eb06..a110af3d00a 100644 --- a/src/hotspot/cpu/x86/copy_x86.hpp +++ b/src/hotspot/cpu/x86/copy_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -28,19 +28,11 @@ #include OS_CPU_HEADER(copy) static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) { -#ifdef AMD64 julong* to = (julong*) tohw; julong v = ((julong) value << 32) | value; while (count-- > 0) { *to++ = v; } -#else - juint* to = (juint*)tohw; - count *= HeapWordSize / BytesPerInt; - while (count-- > 0) { - *to++ = value; - } -#endif // AMD64 } static void pd_fill_to_aligned_words(HeapWord* tohw, size_t count, juint value) { @@ -60,52 +52,10 @@ static void pd_zero_to_bytes(void* to, size_t count) { } static void pd_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) { -#if defined AMD64 || defined _WINDOWS (void)memmove(to, from, count * HeapWordSize); -#else - // Includes a zero-count check. - intx temp = 0; - __asm__ volatile(" testl %6,%6 ;" - " jz 7f ;" - " cmpl %4,%5 ;" - " leal -4(%4,%6,4),%3;" - " jbe 1f ;" - " cmpl %7,%5 ;" - " jbe 4f ;" - "1: cmpl $32,%6 ;" - " ja 3f ;" - " subl %4,%1 ;" - "2: movl (%4),%3 ;" - " movl %7,(%5,%4,1) ;" - " addl $4,%0 ;" - " subl $1,%2 ;" - " jnz 2b ;" - " jmp 7f ;" - "3: rep; smovl ;" - " jmp 7f ;" - "4: cmpl $32,%2 ;" - " movl %7,%0 ;" - " leal -4(%5,%6,4),%1;" - " ja 6f ;" - " subl %4,%1 ;" - "5: movl (%4),%3 ;" - " movl %7,(%5,%4,1) ;" - " subl $4,%0 ;" - " subl $1,%2 ;" - " jnz 5b ;" - " jmp 7f ;" - "6: std ;" - " rep; smovl ;" - " cld ;" - "7: nop " - : "=S" (from), "=D" (to), "=c" (count), "=r" (temp) - : "0" (from), "1" (to), "2" (count), "3" (temp) - : "memory", "flags"); -#endif // AMD64 } static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) { -#ifdef AMD64 switch (count) { case 8: to[7] = from[7]; case 7: to[6] = from[6]; @@ -120,39 +70,10 @@ static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) (void)memcpy(to, from, count * HeapWordSize); break; } -#else -#if defined _WINDOWS - (void)memcpy(to, from, count * HeapWordSize); -#else - // Includes a zero-count check. - intx temp = 0; - __asm__ volatile(" testl %6,%6 ;" - " jz 3f ;" - " cmpl $32,%6 ;" - " ja 2f ;" - " subl %4,%1 ;" - "1: movl (%4),%3 ;" - " movl %7,(%5,%4,1);" - " addl $4,%0 ;" - " subl $1,%2 ;" - " jnz 1b ;" - " jmp 3f ;" - "2: rep; smovl ;" - "3: nop " - : "=S" (from), "=D" (to), "=c" (count), "=r" (temp) - : "0" (from), "1" (to), "2" (count), "3" (temp) - : "memory", "cc"); -#endif // _WINDOWS -#endif // AMD64 } static void pd_disjoint_words_atomic(const HeapWord* from, HeapWord* to, size_t count) { -#ifdef AMD64 shared_disjoint_words_atomic(from, to, count); -#else - // pd_disjoint_words is word-atomic in this implementation. - pd_disjoint_words(from, to, count); -#endif // AMD64 } static void pd_aligned_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) { @@ -164,82 +85,7 @@ static void pd_aligned_disjoint_words(const HeapWord* from, HeapWord* to, size_t } static void pd_conjoint_bytes(const void* from, void* to, size_t count) { -#if defined AMD64 || defined _WINDOWS (void)memmove(to, from, count); -#else - // Includes a zero-count check. - intx temp = 0; - __asm__ volatile(" testl %6,%6 ;" - " jz 13f ;" - " cmpl %4,%5 ;" - " leal -1(%4,%6),%3 ;" - " jbe 1f ;" - " cmpl %7,%5 ;" - " jbe 8f ;" - "1: cmpl $3,%6 ;" - " jbe 6f ;" - " movl %6,%3 ;" - " movl $4,%2 ;" - " subl %4,%2 ;" - " andl $3,%2 ;" - " jz 2f ;" - " subl %6,%3 ;" - " rep; smovb ;" - "2: movl %7,%2 ;" - " shrl $2,%2 ;" - " jz 5f ;" - " cmpl $32,%2 ;" - " ja 4f ;" - " subl %4,%1 ;" - "3: movl (%4),%%edx ;" - " movl %%edx,(%5,%4,1);" - " addl $4,%0 ;" - " subl $1,%2 ;" - " jnz 3b ;" - " addl %4,%1 ;" - " jmp 5f ;" - "4: rep; smovl ;" - "5: movl %7,%2 ;" - " andl $3,%2 ;" - " jz 13f ;" - "6: xorl %7,%3 ;" - "7: movb (%4,%7,1),%%dl ;" - " movb %%dl,(%5,%7,1) ;" - " addl $1,%3 ;" - " subl $1,%2 ;" - " jnz 7b ;" - " jmp 13f ;" - "8: std ;" - " cmpl $12,%2 ;" - " ja 9f ;" - " movl %7,%0 ;" - " leal -1(%6,%5),%1 ;" - " jmp 11f ;" - "9: xchgl %3,%2 ;" - " movl %6,%0 ;" - " addl $1,%2 ;" - " leal -1(%7,%5),%1 ;" - " andl $3,%2 ;" - " jz 10f ;" - " subl %6,%3 ;" - " rep; smovb ;" - "10: movl %7,%2 ;" - " subl $3,%0 ;" - " shrl $2,%2 ;" - " subl $3,%1 ;" - " rep; smovl ;" - " andl $3,%3 ;" - " jz 12f ;" - " movl %7,%2 ;" - " addl $3,%0 ;" - " addl $3,%1 ;" - "11: rep; smovb ;" - "12: cld ;" - "13: nop ;" - : "=S" (from), "=D" (to), "=c" (count), "=r" (temp) - : "0" (from), "1" (to), "2" (count), "3" (temp) - : "memory", "flags", "%edx"); -#endif // AMD64 } static void pd_conjoint_bytes_atomic(const void* from, void* to, size_t count) { @@ -253,49 +99,16 @@ static void pd_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t co } static void pd_conjoint_jints_atomic(const jint* from, jint* to, size_t count) { -#ifdef AMD64 _Copy_conjoint_jints_atomic(from, to, count); -#else - assert(HeapWordSize == BytesPerInt, "heapwords and jints must be the same size"); - // pd_conjoint_words is word-atomic in this implementation. - pd_conjoint_words((const HeapWord*)from, (HeapWord*)to, count); -#endif // AMD64 } static void pd_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) { -#ifdef AMD64 _Copy_conjoint_jlongs_atomic(from, to, count); -#else - // Guarantee use of fild/fistp or xmm regs via some asm code, because compilers won't. - if (from > to) { - while (count-- > 0) { - __asm__ volatile("fildll (%0); fistpll (%1)" - : - : "r" (from), "r" (to) - : "memory" ); - ++from; - ++to; - } - } else { - while (count-- > 0) { - __asm__ volatile("fildll (%0,%2,8); fistpll (%1,%2,8)" - : - : "r" (from), "r" (to), "r" (count) - : "memory" ); - } - } -#endif // AMD64 } static void pd_conjoint_oops_atomic(const oop* from, oop* to, size_t count) { -#ifdef AMD64 assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size"); _Copy_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count); -#else - assert(HeapWordSize == BytesPerOop, "heapwords and oops must be the same size"); - // pd_conjoint_words is word-atomic in this implementation. - pd_conjoint_words((const HeapWord*)from, (HeapWord*)to, count); -#endif // AMD64 } static void pd_arrayof_conjoint_bytes(const HeapWord* from, HeapWord* to, size_t count) { @@ -307,28 +120,16 @@ static void pd_arrayof_conjoint_jshorts(const HeapWord* from, HeapWord* to, size } static void pd_arrayof_conjoint_jints(const HeapWord* from, HeapWord* to, size_t count) { -#ifdef AMD64 _Copy_arrayof_conjoint_jints(from, to, count); -#else - pd_conjoint_jints_atomic((const jint*)from, (jint*)to, count); -#endif // AMD64 } static void pd_arrayof_conjoint_jlongs(const HeapWord* from, HeapWord* to, size_t count) { -#ifdef AMD64 _Copy_arrayof_conjoint_jlongs(from, to, count); -#else - pd_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count); -#endif // AMD64 } static void pd_arrayof_conjoint_oops(const HeapWord* from, HeapWord* to, size_t count) { -#ifdef AMD64 assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size"); _Copy_arrayof_conjoint_jlongs(from, to, count); -#else - pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count); -#endif // AMD64 } #endif // _WINDOWS diff --git a/src/hotspot/cpu/x86/frame_x86.cpp b/src/hotspot/cpu/x86/frame_x86.cpp index 5f52f2fabf2..1ff28516307 100644 --- a/src/hotspot/cpu/x86/frame_x86.cpp +++ b/src/hotspot/cpu/x86/frame_x86.cpp @@ -536,14 +536,9 @@ BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) // then ST0 is saved before EAX/EDX. See the note in generate_native_result tos_addr = (intptr_t*)sp(); if (type == T_FLOAT || type == T_DOUBLE) { - // QQQ seems like this code is equivalent on the two platforms -#ifdef AMD64 // This is times two because we do a push(ltos) after pushing XMM0 // and that takes two interpreter stack slots. tos_addr += 2 * Interpreter::stackElementWords; -#else - tos_addr += 2; -#endif // AMD64 } } else { tos_addr = (intptr_t*)interpreter_frame_tos_address(); @@ -569,19 +564,7 @@ BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) case T_SHORT : value_result->s = *(jshort*)tos_addr; break; case T_INT : value_result->i = *(jint*)tos_addr; break; case T_LONG : value_result->j = *(jlong*)tos_addr; break; - case T_FLOAT : { -#ifdef AMD64 - value_result->f = *(jfloat*)tos_addr; -#else - if (method->is_native()) { - jdouble d = *(jdouble*)tos_addr; // Result was in ST0 so need to convert to jfloat - value_result->f = (jfloat)d; - } else { - value_result->f = *(jfloat*)tos_addr; - } -#endif // AMD64 - break; - } + case T_FLOAT : value_result->f = *(jfloat*)tos_addr; break; case T_DOUBLE : value_result->d = *(jdouble*)tos_addr; break; case T_VOID : /* Nothing to do */ break; default : ShouldNotReachHere(); @@ -611,7 +594,6 @@ void frame::describe_pd(FrameValues& values, int frame_no) { DESCRIBE_FP_OFFSET(interpreter_frame_locals); DESCRIBE_FP_OFFSET(interpreter_frame_bcp); DESCRIBE_FP_OFFSET(interpreter_frame_initial_sp); -#ifdef AMD64 } else if (is_entry_frame()) { // This could be more descriptive if we use the enum in // stubGenerator to map to real names but it's most important to @@ -619,7 +601,6 @@ void frame::describe_pd(FrameValues& values, int frame_no) { for (int i = 0; i < entry_frame_after_call_words; i++) { values.describe(frame_no, fp() - i, err_msg("call_stub word fp - %d", i)); } -#endif // AMD64 } if (is_java_frame() || Continuation::is_continuation_enterSpecial(*this)) { diff --git a/src/hotspot/cpu/x86/frame_x86.hpp b/src/hotspot/cpu/x86/frame_x86.hpp index 19f37c42cf4..2d382c7e5e5 100644 --- a/src/hotspot/cpu/x86/frame_x86.hpp +++ b/src/hotspot/cpu/x86/frame_x86.hpp @@ -80,8 +80,7 @@ interpreter_frame_monitor_block_bottom_offset = interpreter_frame_initial_sp_offset, // Entry frames -#ifdef AMD64 -#ifdef _WIN64 +#ifdef _WINDOWS entry_frame_after_call_words = 28, entry_frame_call_wrapper_offset = 2, @@ -91,10 +90,7 @@ entry_frame_call_wrapper_offset = -6, arg_reg_save_area_bytes = 0, -#endif // _WIN64 -#else - entry_frame_call_wrapper_offset = 2, -#endif // AMD64 +#endif // _WINDOWS // size, in words, of frame metadata (e.g. pc and link) metadata_words = sender_sp_offset, diff --git a/src/hotspot/cpu/x86/frame_x86.inline.hpp b/src/hotspot/cpu/x86/frame_x86.inline.hpp index ca51fe66786..dcd766545d3 100644 --- a/src/hotspot/cpu/x86/frame_x86.inline.hpp +++ b/src/hotspot/cpu/x86/frame_x86.inline.hpp @@ -483,7 +483,6 @@ void frame::update_map_with_saved_link(RegisterMapT* map, intptr_t** link_addr) // we don't have to always save EBP/RBP on entry and exit to c2 compiled // code, on entry will be enough. map->set_location(rbp->as_VMReg(), (address) link_addr); -#ifdef AMD64 // this is weird "H" ought to be at a higher address however the // oopMaps seems to have the "H" regs at the same address and the // vanilla register. @@ -491,6 +490,5 @@ void frame::update_map_with_saved_link(RegisterMapT* map, intptr_t** link_addr) if (true) { map->set_location(rbp->as_VMReg()->next(), (address) link_addr); } -#endif // AMD64 } #endif // CPU_X86_FRAME_X86_INLINE_HPP diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp index a6b4efbe4f2..9720be17892 100644 --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp @@ -518,8 +518,8 @@ void InterpreterMacroAssembler::load_resolved_klass_at_index(Register klass, void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Label& ok_is_subtype) { assert(Rsub_klass != rax, "rax holds superklass"); - LP64_ONLY(assert(Rsub_klass != r14, "r14 holds locals");) - LP64_ONLY(assert(Rsub_klass != r13, "r13 holds bcp");) + assert(Rsub_klass != r14, "r14 holds locals"); + assert(Rsub_klass != r13, "r13 holds bcp"); assert(Rsub_klass != rcx, "rcx holds 2ndary super array length"); assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr"); diff --git a/src/hotspot/cpu/x86/jniTypes_x86.hpp b/src/hotspot/cpu/x86/jniTypes_x86.hpp index 5c925474796..a3a6c27b994 100644 --- a/src/hotspot/cpu/x86/jniTypes_x86.hpp +++ b/src/hotspot/cpu/x86/jniTypes_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -42,22 +42,12 @@ class JNITypes : AllStatic { // reverse the argument list constructed by JavaCallArguments (see // javaCalls.hpp). -private: - -#ifndef AMD64 - // 32bit Helper routines. - static inline void put_int2r(jint *from, intptr_t *to) { *(jint *)(to++) = from[1]; - *(jint *)(to ) = from[0]; } - static inline void put_int2r(jint *from, intptr_t *to, int& pos) { put_int2r(from, to + pos); pos += 2; } -#endif // AMD64 - public: // Ints are stored in native format in one JavaCallArgument slot at *to. static inline void put_int(jint from, intptr_t *to) { *(jint *)(to + 0 ) = from; } static inline void put_int(jint from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = from; } static inline void put_int(jint *from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = *from; } -#ifdef AMD64 // Longs are stored in native format in one JavaCallArgument slot at // *(to+1). static inline void put_long(jlong from, intptr_t *to) { @@ -73,13 +63,6 @@ public: *(jlong*) (to + 1 + pos) = *from; pos += 2; } -#else - // Longs are stored in big-endian word format in two JavaCallArgument slots at *to. - // The high half is in *to and the low half in *(to+1). - static inline void put_long(jlong from, intptr_t *to) { put_int2r((jint *)&from, to); } - static inline void put_long(jlong from, intptr_t *to, int& pos) { put_int2r((jint *)&from, to, pos); } - static inline void put_long(jlong *from, intptr_t *to, int& pos) { put_int2r((jint *) from, to, pos); } -#endif // AMD64 // Oops are stored in native format in one JavaCallArgument slot at *to. static inline void put_obj(const Handle& from_handle, intptr_t *to, int& pos) { *(to + pos++) = (intptr_t)from_handle.raw_value(); } @@ -91,7 +74,6 @@ public: static inline void put_float(jfloat *from, intptr_t *to, int& pos) { *(jfloat *)(to + pos++) = *from; } #undef _JNI_SLOT_OFFSET -#ifdef AMD64 #define _JNI_SLOT_OFFSET 1 // Doubles are stored in native word format in one JavaCallArgument // slot at *(to+1). @@ -108,14 +90,6 @@ public: *(jdouble*) (to + 1 + pos) = *from; pos += 2; } -#else -#define _JNI_SLOT_OFFSET 0 - // Doubles are stored in big-endian word format in two JavaCallArgument slots at *to. - // The high half is in *to and the low half in *(to+1). - static inline void put_double(jdouble from, intptr_t *to) { put_int2r((jint *)&from, to); } - static inline void put_double(jdouble from, intptr_t *to, int& pos) { put_int2r((jint *)&from, to, pos); } - static inline void put_double(jdouble *from, intptr_t *to, int& pos) { put_int2r((jint *) from, to, pos); } -#endif // AMD64 // The get_xxx routines, on the other hand, actually _do_ fetch diff --git a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp index 9e6a4789dc2..b9a66907e3b 100644 --- a/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp +++ b/src/hotspot/cpu/x86/jvmciCodeInstaller_x86.cpp @@ -77,14 +77,10 @@ void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle& obj, bool compre address pc = _instructions->start() + pc_offset; jobject value = JNIHandles::make_local(obj()); if (compressed) { -#ifdef _LP64 address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand); int oop_index = _oop_recorder->find_index(value); _instructions->relocate(pc, oop_Relocation::spec(oop_index), Assembler::narrow_oop_operand); JVMCI_event_3("relocating (narrow oop constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand)); -#else - JVMCI_ERROR("compressed oop on 32bit"); -#endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); *((jobject*) operand) = value; @@ -96,13 +92,9 @@ void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle& obj, bool compre void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, HotSpotCompiledCodeStream* stream, u1 tag, JVMCI_TRAPS) { address pc = _instructions->start() + pc_offset; if (tag == PATCH_NARROW_KLASS) { -#ifdef _LP64 address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand); *((narrowKlass*) operand) = record_narrow_metadata_reference(_instructions, operand, stream, tag, JVMCI_CHECK); JVMCI_event_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand)); -#else - JVMCI_ERROR("compressed Klass* on 32bit"); -#endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); *((void**) operand) = record_metadata_reference(_instructions, operand, stream, tag, JVMCI_CHECK); diff --git a/src/hotspot/cpu/x86/methodHandles_x86.cpp b/src/hotspot/cpu/x86/methodHandles_x86.cpp index b921a157a52..54376c6ad9a 100644 --- a/src/hotspot/cpu/x86/methodHandles_x86.cpp +++ b/src/hotspot/cpu/x86/methodHandles_x86.cpp @@ -561,7 +561,6 @@ void trace_method_handle_stub(const char* adaptername, for (int i = 0; i < saved_regs_count; i++) { Register r = as_Register(i); // The registers are stored in reverse order on the stack (by pusha). -#ifdef AMD64 int num_regs = UseAPX ? 32 : 16; assert(Register::available_gp_registers() == num_regs, "sanity"); if (r == rsp) { @@ -570,9 +569,6 @@ void trace_method_handle_stub(const char* adaptername, } else { ls.print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]); } -#else - ls.print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]); -#endif if ((i + 1) % 4 == 0) { ls.cr(); } else { diff --git a/src/hotspot/cpu/x86/relocInfo_x86.cpp b/src/hotspot/cpu/x86/relocInfo_x86.cpp index a447c5aca9d..6ab2d9f77a3 100644 --- a/src/hotspot/cpu/x86/relocInfo_x86.cpp +++ b/src/hotspot/cpu/x86/relocInfo_x86.cpp @@ -36,7 +36,6 @@ void Relocation::pd_set_data_value(address x, bool verify_only) { -#ifdef AMD64 typedef Assembler::WhichOperand WhichOperand; WhichOperand which = (WhichOperand) format(); // that is, disp32 or imm, call32, narrow oop assert(which == Assembler::disp32_operand || @@ -76,13 +75,6 @@ void Relocation::pd_set_data_value(address x, bool verify_only) { *(int32_t*) disp = checked_cast(x - next_ip); } } -#else - if (verify_only) { - guarantee(*pd_address_in_code() == x, "instructions must match"); - } else { - *pd_address_in_code() = x; - } -#endif // AMD64 } @@ -150,22 +142,17 @@ address* Relocation::pd_address_in_code() { assert(is_data(), "must be a DataRelocation"); typedef Assembler::WhichOperand WhichOperand; WhichOperand which = (WhichOperand) format(); // that is, disp32 or imm/imm32 -#ifdef AMD64 assert(which == Assembler::disp32_operand || which == Assembler::call32_operand || which == Assembler::imm_operand, "format unpacks ok"); // The "address" in the code is a displacement can't return it as // and address* since it is really a jint* guarantee(which == Assembler::imm_operand, "must be immediate operand"); -#else - assert(which == Assembler::disp32_operand || which == Assembler::imm_operand, "format unpacks ok"); -#endif // AMD64 return (address*) Assembler::locate_operand(addr(), which); } address Relocation::pd_get_address_from_code() { -#ifdef AMD64 // All embedded Intel addresses are stored in 32-bit words. // Since the addr points at the start of the instruction, // we must parse the instruction a bit to find the embedded word. @@ -182,7 +169,6 @@ address Relocation::pd_get_address_from_code() { address a = next_ip + *(int32_t*) disp; return a; } -#endif // AMD64 return *pd_address_in_code(); } diff --git a/src/hotspot/cpu/x86/relocInfo_x86.hpp b/src/hotspot/cpu/x86/relocInfo_x86.hpp index d3f213a6686..79b9ef10905 100644 --- a/src/hotspot/cpu/x86/relocInfo_x86.hpp +++ b/src/hotspot/cpu/x86/relocInfo_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -32,12 +32,8 @@ offset_unit = 1, // Encodes Assembler::disp32_operand vs. Assembler::imm32_operand. -#ifndef AMD64 - format_width = 1 -#else // vs Assembler::narrow_oop_operand and ZGC barrier encodings. format_width = 3 -#endif }; public: diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp b/src/hotspot/cpu/x86/vm_version_x86.cpp index 213e988a581..4961aed61c3 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.cpp +++ b/src/hotspot/cpu/x86/vm_version_x86.cpp @@ -1260,13 +1260,11 @@ void VM_Version::get_processor_features() { // Kyber Intrinsics // Currently we only have them for AVX512 -#ifdef _LP64 if (supports_evex() && supports_avx512bw()) { if (FLAG_IS_DEFAULT(UseKyberIntrinsics)) { UseKyberIntrinsics = true; } } else -#endif if (UseKyberIntrinsics) { warning("Intrinsics for ML-KEM are not available on this CPU."); FLAG_SET_DEFAULT(UseKyberIntrinsics, false); diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index efe0482e095..2f19e76baf2 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -22,7 +22,7 @@ // // -// X86 Common Architecture Description File +// X86 AMD64 Architecture Description File //----------REGISTER DEFINITION BLOCK------------------------------------------ // This information is used by the matcher and the register allocator to @@ -59,6 +59,166 @@ register %{ // // The encoding number is the actual bit-pattern placed into the opcodes. +// General Registers +// R8-R15 must be encoded with REX. (RSP, RBP, RSI, RDI need REX when +// used as byte registers) + +// Previously set RBX, RSI, and RDI as save-on-entry for java code +// Turn off SOE in java-code due to frequent use of uncommon-traps. +// Now that allocator is better, turn on RSI and RDI as SOE registers. + +reg_def RAX (SOC, SOC, Op_RegI, 0, rax->as_VMReg()); +reg_def RAX_H(SOC, SOC, Op_RegI, 0, rax->as_VMReg()->next()); + +reg_def RCX (SOC, SOC, Op_RegI, 1, rcx->as_VMReg()); +reg_def RCX_H(SOC, SOC, Op_RegI, 1, rcx->as_VMReg()->next()); + +reg_def RDX (SOC, SOC, Op_RegI, 2, rdx->as_VMReg()); +reg_def RDX_H(SOC, SOC, Op_RegI, 2, rdx->as_VMReg()->next()); + +reg_def RBX (SOC, SOE, Op_RegI, 3, rbx->as_VMReg()); +reg_def RBX_H(SOC, SOE, Op_RegI, 3, rbx->as_VMReg()->next()); + +reg_def RSP (NS, NS, Op_RegI, 4, rsp->as_VMReg()); +reg_def RSP_H(NS, NS, Op_RegI, 4, rsp->as_VMReg()->next()); + +// now that adapter frames are gone RBP is always saved and restored by the prolog/epilog code +reg_def RBP (NS, SOE, Op_RegI, 5, rbp->as_VMReg()); +reg_def RBP_H(NS, SOE, Op_RegI, 5, rbp->as_VMReg()->next()); + +#ifdef _WIN64 + +reg_def RSI (SOC, SOE, Op_RegI, 6, rsi->as_VMReg()); +reg_def RSI_H(SOC, SOE, Op_RegI, 6, rsi->as_VMReg()->next()); + +reg_def RDI (SOC, SOE, Op_RegI, 7, rdi->as_VMReg()); +reg_def RDI_H(SOC, SOE, Op_RegI, 7, rdi->as_VMReg()->next()); + +#else + +reg_def RSI (SOC, SOC, Op_RegI, 6, rsi->as_VMReg()); +reg_def RSI_H(SOC, SOC, Op_RegI, 6, rsi->as_VMReg()->next()); + +reg_def RDI (SOC, SOC, Op_RegI, 7, rdi->as_VMReg()); +reg_def RDI_H(SOC, SOC, Op_RegI, 7, rdi->as_VMReg()->next()); + +#endif + +reg_def R8 (SOC, SOC, Op_RegI, 8, r8->as_VMReg()); +reg_def R8_H (SOC, SOC, Op_RegI, 8, r8->as_VMReg()->next()); + +reg_def R9 (SOC, SOC, Op_RegI, 9, r9->as_VMReg()); +reg_def R9_H (SOC, SOC, Op_RegI, 9, r9->as_VMReg()->next()); + +reg_def R10 (SOC, SOC, Op_RegI, 10, r10->as_VMReg()); +reg_def R10_H(SOC, SOC, Op_RegI, 10, r10->as_VMReg()->next()); + +reg_def R11 (SOC, SOC, Op_RegI, 11, r11->as_VMReg()); +reg_def R11_H(SOC, SOC, Op_RegI, 11, r11->as_VMReg()->next()); + +reg_def R12 (SOC, SOE, Op_RegI, 12, r12->as_VMReg()); +reg_def R12_H(SOC, SOE, Op_RegI, 12, r12->as_VMReg()->next()); + +reg_def R13 (SOC, SOE, Op_RegI, 13, r13->as_VMReg()); +reg_def R13_H(SOC, SOE, Op_RegI, 13, r13->as_VMReg()->next()); + +reg_def R14 (SOC, SOE, Op_RegI, 14, r14->as_VMReg()); +reg_def R14_H(SOC, SOE, Op_RegI, 14, r14->as_VMReg()->next()); + +reg_def R15 (SOC, SOE, Op_RegI, 15, r15->as_VMReg()); +reg_def R15_H(SOC, SOE, Op_RegI, 15, r15->as_VMReg()->next()); + +reg_def R16 (SOC, SOC, Op_RegI, 16, r16->as_VMReg()); +reg_def R16_H(SOC, SOC, Op_RegI, 16, r16->as_VMReg()->next()); + +reg_def R17 (SOC, SOC, Op_RegI, 17, r17->as_VMReg()); +reg_def R17_H(SOC, SOC, Op_RegI, 17, r17->as_VMReg()->next()); + +reg_def R18 (SOC, SOC, Op_RegI, 18, r18->as_VMReg()); +reg_def R18_H(SOC, SOC, Op_RegI, 18, r18->as_VMReg()->next()); + +reg_def R19 (SOC, SOC, Op_RegI, 19, r19->as_VMReg()); +reg_def R19_H(SOC, SOC, Op_RegI, 19, r19->as_VMReg()->next()); + +reg_def R20 (SOC, SOC, Op_RegI, 20, r20->as_VMReg()); +reg_def R20_H(SOC, SOC, Op_RegI, 20, r20->as_VMReg()->next()); + +reg_def R21 (SOC, SOC, Op_RegI, 21, r21->as_VMReg()); +reg_def R21_H(SOC, SOC, Op_RegI, 21, r21->as_VMReg()->next()); + +reg_def R22 (SOC, SOC, Op_RegI, 22, r22->as_VMReg()); +reg_def R22_H(SOC, SOC, Op_RegI, 22, r22->as_VMReg()->next()); + +reg_def R23 (SOC, SOC, Op_RegI, 23, r23->as_VMReg()); +reg_def R23_H(SOC, SOC, Op_RegI, 23, r23->as_VMReg()->next()); + +reg_def R24 (SOC, SOC, Op_RegI, 24, r24->as_VMReg()); +reg_def R24_H(SOC, SOC, Op_RegI, 24, r24->as_VMReg()->next()); + +reg_def R25 (SOC, SOC, Op_RegI, 25, r25->as_VMReg()); +reg_def R25_H(SOC, SOC, Op_RegI, 25, r25->as_VMReg()->next()); + +reg_def R26 (SOC, SOC, Op_RegI, 26, r26->as_VMReg()); +reg_def R26_H(SOC, SOC, Op_RegI, 26, r26->as_VMReg()->next()); + +reg_def R27 (SOC, SOC, Op_RegI, 27, r27->as_VMReg()); +reg_def R27_H(SOC, SOC, Op_RegI, 27, r27->as_VMReg()->next()); + +reg_def R28 (SOC, SOC, Op_RegI, 28, r28->as_VMReg()); +reg_def R28_H(SOC, SOC, Op_RegI, 28, r28->as_VMReg()->next()); + +reg_def R29 (SOC, SOC, Op_RegI, 29, r29->as_VMReg()); +reg_def R29_H(SOC, SOC, Op_RegI, 29, r29->as_VMReg()->next()); + +reg_def R30 (SOC, SOC, Op_RegI, 30, r30->as_VMReg()); +reg_def R30_H(SOC, SOC, Op_RegI, 30, r30->as_VMReg()->next()); + +reg_def R31 (SOC, SOC, Op_RegI, 31, r31->as_VMReg()); +reg_def R31_H(SOC, SOC, Op_RegI, 31, r31->as_VMReg()->next()); + +// Floating Point Registers + +// Specify priority of register selection within phases of register +// allocation. Highest priority is first. A useful heuristic is to +// give registers a low priority when they are required by machine +// instructions, like EAX and EDX on I486, and choose no-save registers +// before save-on-call, & save-on-call before save-on-entry. Registers +// which participate in fixed calling sequences should come last. +// Registers which are used as pairs must fall on an even boundary. + +alloc_class chunk0(R10, R10_H, + R11, R11_H, + R8, R8_H, + R9, R9_H, + R12, R12_H, + RCX, RCX_H, + RBX, RBX_H, + RDI, RDI_H, + RDX, RDX_H, + RSI, RSI_H, + RAX, RAX_H, + RBP, RBP_H, + R13, R13_H, + R14, R14_H, + R15, R15_H, + R16, R16_H, + R17, R17_H, + R18, R18_H, + R19, R19_H, + R20, R20_H, + R21, R21_H, + R22, R22_H, + R23, R23_H, + R24, R24_H, + R25, R25_H, + R26, R26_H, + R27, R27_H, + R28, R28_H, + R29, R29_H, + R30, R30_H, + R31, R31_H, + RSP, RSP_H); + // XMM registers. 512-bit registers or 8 words each, labeled (a)-p. // Word a in each register holds a Float, words ab hold a Double. // The whole registers are used in SSE4.2 version intrinsics, @@ -643,6 +803,198 @@ reg_def K7 (SOC, SOC, Op_RegI, 7, k7->as_VMReg()); reg_def K7_H (SOC, SOC, Op_RegI, 7, k7->as_VMReg()->next()); +//----------Architecture Description Register Classes-------------------------- +// Several register classes are automatically defined based upon information in +// this architecture description. +// 1) reg_class inline_cache_reg ( /* as def'd in frame section */ ) +// 2) reg_class stack_slots( /* one chunk of stack-based "registers" */ ) +// + +// Empty register class. +reg_class no_reg(); + +// Class for all pointer/long registers including APX extended GPRs. +reg_class all_reg(RAX, RAX_H, + RDX, RDX_H, + RBP, RBP_H, + RDI, RDI_H, + RSI, RSI_H, + RCX, RCX_H, + RBX, RBX_H, + RSP, RSP_H, + R8, R8_H, + R9, R9_H, + R10, R10_H, + R11, R11_H, + R12, R12_H, + R13, R13_H, + R14, R14_H, + R15, R15_H, + R16, R16_H, + R17, R17_H, + R18, R18_H, + R19, R19_H, + R20, R20_H, + R21, R21_H, + R22, R22_H, + R23, R23_H, + R24, R24_H, + R25, R25_H, + R26, R26_H, + R27, R27_H, + R28, R28_H, + R29, R29_H, + R30, R30_H, + R31, R31_H); + +// Class for all int registers including APX extended GPRs. +reg_class all_int_reg(RAX + RDX, + RBP, + RDI, + RSI, + RCX, + RBX, + R8, + R9, + R10, + R11, + R12, + R13, + R14, + R16, + R17, + R18, + R19, + R20, + R21, + R22, + R23, + R24, + R25, + R26, + R27, + R28, + R29, + R30, + R31); + +// Class for all pointer registers +reg_class any_reg %{ + return _ANY_REG_mask; +%} + +// Class for all pointer registers (excluding RSP) +reg_class ptr_reg %{ + return _PTR_REG_mask; +%} + +// Class for all pointer registers (excluding RSP and RBP) +reg_class ptr_reg_no_rbp %{ + return _PTR_REG_NO_RBP_mask; +%} + +// Class for all pointer registers (excluding RAX and RSP) +reg_class ptr_no_rax_reg %{ + return _PTR_NO_RAX_REG_mask; +%} + +// Class for all pointer registers (excluding RAX, RBX, and RSP) +reg_class ptr_no_rax_rbx_reg %{ + return _PTR_NO_RAX_RBX_REG_mask; +%} + +// Class for all long registers (excluding RSP) +reg_class long_reg %{ + return _LONG_REG_mask; +%} + +// Class for all long registers (excluding RAX, RDX and RSP) +reg_class long_no_rax_rdx_reg %{ + return _LONG_NO_RAX_RDX_REG_mask; +%} + +// Class for all long registers (excluding RCX and RSP) +reg_class long_no_rcx_reg %{ + return _LONG_NO_RCX_REG_mask; +%} + +// Class for all long registers (excluding RBP and R13) +reg_class long_no_rbp_r13_reg %{ + return _LONG_NO_RBP_R13_REG_mask; +%} + +// Class for all int registers (excluding RSP) +reg_class int_reg %{ + return _INT_REG_mask; +%} + +// Class for all int registers (excluding RAX, RDX, and RSP) +reg_class int_no_rax_rdx_reg %{ + return _INT_NO_RAX_RDX_REG_mask; +%} + +// Class for all int registers (excluding RCX and RSP) +reg_class int_no_rcx_reg %{ + return _INT_NO_RCX_REG_mask; +%} + +// Class for all int registers (excluding RBP and R13) +reg_class int_no_rbp_r13_reg %{ + return _INT_NO_RBP_R13_REG_mask; +%} + +// Singleton class for RAX pointer register +reg_class ptr_rax_reg(RAX, RAX_H); + +// Singleton class for RBX pointer register +reg_class ptr_rbx_reg(RBX, RBX_H); + +// Singleton class for RSI pointer register +reg_class ptr_rsi_reg(RSI, RSI_H); + +// Singleton class for RBP pointer register +reg_class ptr_rbp_reg(RBP, RBP_H); + +// Singleton class for RDI pointer register +reg_class ptr_rdi_reg(RDI, RDI_H); + +// Singleton class for stack pointer +reg_class ptr_rsp_reg(RSP, RSP_H); + +// Singleton class for TLS pointer +reg_class ptr_r15_reg(R15, R15_H); + +// Singleton class for RAX long register +reg_class long_rax_reg(RAX, RAX_H); + +// Singleton class for RCX long register +reg_class long_rcx_reg(RCX, RCX_H); + +// Singleton class for RDX long register +reg_class long_rdx_reg(RDX, RDX_H); + +// Singleton class for R11 long register +reg_class long_r11_reg(R11, R11_H); + +// Singleton class for RAX int register +reg_class int_rax_reg(RAX); + +// Singleton class for RBX int register +reg_class int_rbx_reg(RBX); + +// Singleton class for RCX int register +reg_class int_rcx_reg(RCX); + +// Singleton class for RDX int register +reg_class int_rdx_reg(RDX); + +// Singleton class for RDI int register +reg_class int_rdi_reg(RDI); + +// Singleton class for instruction pointer +// reg_class ip_reg(RIP); + alloc_class chunk1(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, XMM0i, XMM0j, XMM0k, XMM0l, XMM0m, XMM0n, XMM0o, XMM0p, XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h, XMM1i, XMM1j, XMM1k, XMM1l, XMM1m, XMM1n, XMM1o, XMM1p, XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h, XMM2i, XMM2j, XMM2k, XMM2l, XMM2m, XMM2n, XMM2o, XMM2p, @@ -703,7 +1055,6 @@ reg_class vectmask_reg_K7(K7, K7_H); // flags allocation class should be last. alloc_class chunk3(RFLAGS); - // Singleton class for condition codes reg_class int_flags(RFLAGS); @@ -1093,6 +1444,7 @@ reg_class_dynamic vectorz_reg (vectorz_reg_evex, vectorz_reg_legacy, %{ VM_Ver reg_class_dynamic vectorz_reg_vl(vectorz_reg_evex, vectorz_reg_legacy, %{ VM_Version::supports_evex() && VM_Version::supports_avx512vl() %} ); reg_class xmm0_reg(XMM0, XMM0b, XMM0c, XMM0d); + %} @@ -1100,6 +1452,1287 @@ reg_class xmm0_reg(XMM0, XMM0b, XMM0c, XMM0d); // This is a block of C++ code which provides values, functions, and // definitions necessary in the rest of the architecture description +source_hpp %{ + +#include "peephole_x86_64.hpp" + +bool castLL_is_imm32(const Node* n); + +%} + +source %{ + +bool castLL_is_imm32(const Node* n) { + assert(n->is_CastLL(), "must be a CastLL"); + const TypeLong* t = n->bottom_type()->is_long(); + return (t->_lo == min_jlong || Assembler::is_simm32(t->_lo)) && (t->_hi == max_jlong || Assembler::is_simm32(t->_hi)); +} + +%} + +// Register masks +source_hpp %{ + +extern RegMask _ANY_REG_mask; +extern RegMask _PTR_REG_mask; +extern RegMask _PTR_REG_NO_RBP_mask; +extern RegMask _PTR_NO_RAX_REG_mask; +extern RegMask _PTR_NO_RAX_RBX_REG_mask; +extern RegMask _LONG_REG_mask; +extern RegMask _LONG_NO_RAX_RDX_REG_mask; +extern RegMask _LONG_NO_RCX_REG_mask; +extern RegMask _LONG_NO_RBP_R13_REG_mask; +extern RegMask _INT_REG_mask; +extern RegMask _INT_NO_RAX_RDX_REG_mask; +extern RegMask _INT_NO_RCX_REG_mask; +extern RegMask _INT_NO_RBP_R13_REG_mask; +extern RegMask _FLOAT_REG_mask; + +extern RegMask _STACK_OR_PTR_REG_mask; +extern RegMask _STACK_OR_LONG_REG_mask; +extern RegMask _STACK_OR_INT_REG_mask; + +inline const RegMask& STACK_OR_PTR_REG_mask() { return _STACK_OR_PTR_REG_mask; } +inline const RegMask& STACK_OR_LONG_REG_mask() { return _STACK_OR_LONG_REG_mask; } +inline const RegMask& STACK_OR_INT_REG_mask() { return _STACK_OR_INT_REG_mask; } + +%} + +source %{ +#define RELOC_IMM64 Assembler::imm_operand +#define RELOC_DISP32 Assembler::disp32_operand + +#define __ masm-> + +RegMask _ANY_REG_mask; +RegMask _PTR_REG_mask; +RegMask _PTR_REG_NO_RBP_mask; +RegMask _PTR_NO_RAX_REG_mask; +RegMask _PTR_NO_RAX_RBX_REG_mask; +RegMask _LONG_REG_mask; +RegMask _LONG_NO_RAX_RDX_REG_mask; +RegMask _LONG_NO_RCX_REG_mask; +RegMask _LONG_NO_RBP_R13_REG_mask; +RegMask _INT_REG_mask; +RegMask _INT_NO_RAX_RDX_REG_mask; +RegMask _INT_NO_RCX_REG_mask; +RegMask _INT_NO_RBP_R13_REG_mask; +RegMask _FLOAT_REG_mask; +RegMask _STACK_OR_PTR_REG_mask; +RegMask _STACK_OR_LONG_REG_mask; +RegMask _STACK_OR_INT_REG_mask; + +static bool need_r12_heapbase() { + return UseCompressedOops; +} + +void reg_mask_init() { + constexpr Register egprs[] = {r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31}; + + // _ALL_REG_mask is generated by adlc from the all_reg register class below. + // We derive a number of subsets from it. + _ANY_REG_mask.assignFrom(_ALL_REG_mask); + + if (PreserveFramePointer) { + _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + } + if (need_r12_heapbase()) { + _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); + _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); + } + + _PTR_REG_mask.assignFrom(_ANY_REG_mask); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); + if (!UseAPX) { + for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { + _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next())); + } + } + + _STACK_OR_PTR_REG_mask.assignFrom(_PTR_REG_mask); + _STACK_OR_PTR_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); + + _PTR_REG_NO_RBP_mask.assignFrom(_PTR_REG_mask); + _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + + _PTR_NO_RAX_REG_mask.assignFrom(_PTR_REG_mask); + _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + + _PTR_NO_RAX_RBX_REG_mask.assignFrom(_PTR_NO_RAX_REG_mask); + _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg())); + _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); + + + _LONG_REG_mask.assignFrom(_PTR_REG_mask); + _STACK_OR_LONG_REG_mask.assignFrom(_LONG_REG_mask); + _STACK_OR_LONG_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); + + _LONG_NO_RAX_RDX_REG_mask.assignFrom(_LONG_REG_mask); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); + + _LONG_NO_RCX_REG_mask.assignFrom(_LONG_REG_mask); + _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); + _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); + + _LONG_NO_RBP_R13_REG_mask.assignFrom(_LONG_REG_mask); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); + _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); + + _INT_REG_mask.assignFrom(_ALL_INT_REG_mask); + if (!UseAPX) { + for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { + _INT_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); + } + } + + if (PreserveFramePointer) { + _INT_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + } + if (need_r12_heapbase()) { + _INT_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); + } + + _STACK_OR_INT_REG_mask.assignFrom(_INT_REG_mask); + _STACK_OR_INT_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); + + _INT_NO_RAX_RDX_REG_mask.assignFrom(_INT_REG_mask); + _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + + _INT_NO_RCX_REG_mask.assignFrom(_INT_REG_mask); + _INT_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); + + _INT_NO_RBP_R13_REG_mask.assignFrom(_INT_REG_mask); + _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); + + // _FLOAT_REG_LEGACY_mask/_FLOAT_REG_EVEX_mask is generated by adlc + // from the float_reg_legacy/float_reg_evex register class. + _FLOAT_REG_mask.assignFrom(VM_Version::supports_evex() ? _FLOAT_REG_EVEX_mask : _FLOAT_REG_LEGACY_mask); +} + +static bool generate_vzeroupper(Compile* C) { + return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper +} + +static int clear_avx_size() { + return generate_vzeroupper(Compile::current()) ? 3: 0; // vzeroupper +} + +// !!!!! Special hack to get all types of calls to specify the byte offset +// from the start of the call to the point where the return address +// will point. +int MachCallStaticJavaNode::ret_addr_offset() +{ + int offset = 5; // 5 bytes from start of call to where return address points + offset += clear_avx_size(); + return offset; +} + +int MachCallDynamicJavaNode::ret_addr_offset() +{ + int offset = 15; // 15 bytes from start of call to where return address points + offset += clear_avx_size(); + return offset; +} + +int MachCallRuntimeNode::ret_addr_offset() { + int offset = 13; // movq r10,#addr; callq (r10) + if (this->ideal_Opcode() != Op_CallLeafVector) { + offset += clear_avx_size(); + } + return offset; +} +// +// Compute padding required for nodes which need alignment +// + +// The address of the call instruction needs to be 4-byte aligned to +// ensure that it does not span a cache line so that it can be patched. +int CallStaticJavaDirectNode::compute_padding(int current_offset) const +{ + current_offset += clear_avx_size(); // skip vzeroupper + current_offset += 1; // skip call opcode byte + return align_up(current_offset, alignment_required()) - current_offset; +} + +// The address of the call instruction needs to be 4-byte aligned to +// ensure that it does not span a cache line so that it can be patched. +int CallDynamicJavaDirectNode::compute_padding(int current_offset) const +{ + current_offset += clear_avx_size(); // skip vzeroupper + current_offset += 11; // skip movq instruction + call opcode byte + return align_up(current_offset, alignment_required()) - current_offset; +} + +// This could be in MacroAssembler but it's fairly C2 specific +static void emit_cmpfp_fixup(MacroAssembler* masm) { + Label exit; + __ jccb(Assembler::noParity, exit); + __ pushf(); + // + // comiss/ucomiss instructions set ZF,PF,CF flags and + // zero OF,AF,SF for NaN values. + // Fixup flags by zeroing ZF,PF so that compare of NaN + // values returns 'less than' result (CF is set). + // Leave the rest of flags unchanged. + // + // 7 6 5 4 3 2 1 0 + // |S|Z|r|A|r|P|r|C| (r - reserved bit) + // 0 0 1 0 1 0 1 1 (0x2B) + // + __ andq(Address(rsp, 0), 0xffffff2b); + __ popf(); + __ bind(exit); +} + +static void emit_cmpfp3(MacroAssembler* masm, Register dst) { + Label done; + __ movl(dst, -1); + __ jcc(Assembler::parity, done); + __ jcc(Assembler::below, done); + __ setcc(Assembler::notEqual, dst); + __ bind(done); +} + +// Math.min() # Math.max() +// -------------------------- +// ucomis[s/d] # +// ja -> b # a +// jp -> NaN # NaN +// jb -> a # b +// je # +// |-jz -> a | b # a & b +// | -> a # +static void emit_fp_min_max(MacroAssembler* masm, XMMRegister dst, + XMMRegister a, XMMRegister b, + XMMRegister xmmt, Register rt, + bool min, bool single) { + + Label nan, zero, below, above, done; + + if (single) + __ ucomiss(a, b); + else + __ ucomisd(a, b); + + if (dst->encoding() != (min ? b : a)->encoding()) + __ jccb(Assembler::above, above); // CF=0 & ZF=0 + else + __ jccb(Assembler::above, done); + + __ jccb(Assembler::parity, nan); // PF=1 + __ jccb(Assembler::below, below); // CF=1 + + // equal + __ vpxor(xmmt, xmmt, xmmt, Assembler::AVX_128bit); + if (single) { + __ ucomiss(a, xmmt); + __ jccb(Assembler::equal, zero); + + __ movflt(dst, a); + __ jmp(done); + } + else { + __ ucomisd(a, xmmt); + __ jccb(Assembler::equal, zero); + + __ movdbl(dst, a); + __ jmp(done); + } + + __ bind(zero); + if (min) + __ vpor(dst, a, b, Assembler::AVX_128bit); + else + __ vpand(dst, a, b, Assembler::AVX_128bit); + + __ jmp(done); + + __ bind(above); + if (single) + __ movflt(dst, min ? b : a); + else + __ movdbl(dst, min ? b : a); + + __ jmp(done); + + __ bind(nan); + if (single) { + __ movl(rt, 0x7fc00000); // Float.NaN + __ movdl(dst, rt); + } + else { + __ mov64(rt, 0x7ff8000000000000L); // Double.NaN + __ movdq(dst, rt); + } + __ jmp(done); + + __ bind(below); + if (single) + __ movflt(dst, min ? a : b); + else + __ movdbl(dst, min ? a : b); + + __ bind(done); +} + +//============================================================================= +const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::EMPTY; + +int ConstantTable::calculate_table_base_offset() const { + return 0; // absolute addressing, no offset +} + +bool MachConstantBaseNode::requires_postalloc_expand() const { return false; } +void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { + ShouldNotReachHere(); +} + +void MachConstantBaseNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const { + // Empty encoding +} + +uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const { + return 0; +} + +#ifndef PRODUCT +void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const { + st->print("# MachConstantBaseNode (empty encoding)"); +} +#endif + + +//============================================================================= +#ifndef PRODUCT +void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const { + Compile* C = ra_->C; + + int framesize = C->output()->frame_size_in_bytes(); + int bangsize = C->output()->bang_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove wordSize for return addr which is already pushed. + framesize -= wordSize; + + if (C->output()->need_stack_bang(bangsize)) { + framesize -= wordSize; + st->print("# stack bang (%d bytes)", bangsize); + st->print("\n\t"); + st->print("pushq rbp\t# Save rbp"); + if (PreserveFramePointer) { + st->print("\n\t"); + st->print("movq rbp, rsp\t# Save the caller's SP into rbp"); + } + if (framesize) { + st->print("\n\t"); + st->print("subq rsp, #%d\t# Create frame",framesize); + } + } else { + st->print("subq rsp, #%d\t# Create frame",framesize); + st->print("\n\t"); + framesize -= wordSize; + st->print("movq [rsp + #%d], rbp\t# Save rbp",framesize); + if (PreserveFramePointer) { + st->print("\n\t"); + st->print("movq rbp, rsp\t# Save the caller's SP into rbp"); + if (framesize > 0) { + st->print("\n\t"); + st->print("addq rbp, #%d", framesize); + } + } + } + + if (VerifyStackAtCalls) { + st->print("\n\t"); + framesize -= wordSize; + st->print("movq [rsp + #%d], 0xbadb100d\t# Majik cookie for stack depth check",framesize); +#ifdef ASSERT + st->print("\n\t"); + st->print("# stack alignment check"); +#endif + } + if (C->stub_function() != nullptr) { + st->print("\n\t"); + st->print("cmpl [r15_thread + #disarmed_guard_value_offset], #disarmed_guard_value\t"); + st->print("\n\t"); + st->print("je fast_entry\t"); + st->print("\n\t"); + st->print("call #nmethod_entry_barrier_stub\t"); + st->print("\n\tfast_entry:"); + } + st->cr(); +} +#endif + +void MachPrologNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { + Compile* C = ra_->C; + + int framesize = C->output()->frame_size_in_bytes(); + int bangsize = C->output()->bang_size_in_bytes(); + + if (C->clinit_barrier_on_entry()) { + assert(VM_Version::supports_fast_class_init_checks(), "sanity"); + assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started"); + + Label L_skip_barrier; + Register klass = rscratch1; + + __ mov_metadata(klass, C->method()->holder()->constant_encoding()); + __ clinit_barrier(klass, &L_skip_barrier /*L_fast_path*/); + + __ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub())); // slow path + + __ bind(L_skip_barrier); + } + + __ verified_entry(framesize, C->output()->need_stack_bang(bangsize)?bangsize:0, false, C->stub_function() != nullptr); + + C->output()->set_frame_complete(__ offset()); + + if (C->has_mach_constant_base_node()) { + // NOTE: We set the table base offset here because users might be + // emitted before MachConstantBaseNode. + ConstantTable& constant_table = C->output()->constant_table(); + constant_table.set_table_base_offset(constant_table.calculate_table_base_offset()); + } +} + +uint MachPrologNode::size(PhaseRegAlloc* ra_) const +{ + return MachNode::size(ra_); // too many variables; just compute it + // the hard way +} + +int MachPrologNode::reloc() const +{ + return 0; // a large enough number +} + +//============================================================================= +#ifndef PRODUCT +void MachEpilogNode::format(PhaseRegAlloc* ra_, outputStream* st) const +{ + Compile* C = ra_->C; + if (generate_vzeroupper(C)) { + st->print("vzeroupper"); + st->cr(); st->print("\t"); + } + + int framesize = C->output()->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove word for return adr already pushed + // and RBP + framesize -= 2*wordSize; + + if (framesize) { + st->print_cr("addq rsp, %d\t# Destroy frame", framesize); + st->print("\t"); + } + + st->print_cr("popq rbp"); + if (do_polling() && C->is_method_compilation()) { + st->print("\t"); + st->print_cr("cmpq rsp, poll_offset[r15_thread] \n\t" + "ja #safepoint_stub\t" + "# Safepoint: poll for GC"); + } +} +#endif + +void MachEpilogNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const +{ + Compile* C = ra_->C; + + if (generate_vzeroupper(C)) { + // Clear upper bits of YMM registers when current compiled code uses + // wide vectors to avoid AVX <-> SSE transition penalty during call. + __ vzeroupper(); + } + + int framesize = C->output()->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove word for return adr already pushed + // and RBP + framesize -= 2*wordSize; + + // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here + + if (framesize) { + __ addq(rsp, framesize); + } + + __ popq(rbp); + + if (StackReservedPages > 0 && C->has_reserved_stack_access()) { + __ reserved_stack_check(); + } + + if (do_polling() && C->is_method_compilation()) { + Label dummy_label; + Label* code_stub = &dummy_label; + if (!C->output()->in_scratch_emit_size()) { + C2SafepointPollStub* stub = new (C->comp_arena()) C2SafepointPollStub(__ offset()); + C->output()->add_stub(stub); + code_stub = &stub->entry(); + } + __ relocate(relocInfo::poll_return_type); + __ safepoint_poll(*code_stub, true /* at_return */, true /* in_nmethod */); + } +} + +uint MachEpilogNode::size(PhaseRegAlloc* ra_) const +{ + return MachNode::size(ra_); // too many variables; just compute it + // the hard way +} + +int MachEpilogNode::reloc() const +{ + return 2; // a large enough number +} + +const Pipeline* MachEpilogNode::pipeline() const +{ + return MachNode::pipeline_class(); +} + +//============================================================================= + +enum RC { + rc_bad, + rc_int, + rc_kreg, + rc_float, + rc_stack +}; + +static enum RC rc_class(OptoReg::Name reg) +{ + if( !OptoReg::is_valid(reg) ) return rc_bad; + + if (OptoReg::is_stack(reg)) return rc_stack; + + VMReg r = OptoReg::as_VMReg(reg); + + if (r->is_Register()) return rc_int; + + if (r->is_KRegister()) return rc_kreg; + + assert(r->is_XMMRegister(), "must be"); + return rc_float; +} + +// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad. +static void vec_mov_helper(C2_MacroAssembler *masm, int src_lo, int dst_lo, + int src_hi, int dst_hi, uint ireg, outputStream* st); + +void vec_spill_helper(C2_MacroAssembler *masm, bool is_load, + int stack_offset, int reg, uint ireg, outputStream* st); + +static void vec_stack_to_stack_helper(C2_MacroAssembler *masm, int src_offset, + int dst_offset, uint ireg, outputStream* st) { + if (masm) { + switch (ireg) { + case Op_VecS: + __ movq(Address(rsp, -8), rax); + __ movl(rax, Address(rsp, src_offset)); + __ movl(Address(rsp, dst_offset), rax); + __ movq(rax, Address(rsp, -8)); + break; + case Op_VecD: + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); + break; + case Op_VecX: + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); + __ pushq(Address(rsp, src_offset+8)); + __ popq (Address(rsp, dst_offset+8)); + break; + case Op_VecY: + __ vmovdqu(Address(rsp, -32), xmm0); + __ vmovdqu(xmm0, Address(rsp, src_offset)); + __ vmovdqu(Address(rsp, dst_offset), xmm0); + __ vmovdqu(xmm0, Address(rsp, -32)); + break; + case Op_VecZ: + __ evmovdquq(Address(rsp, -64), xmm0, 2); + __ evmovdquq(xmm0, Address(rsp, src_offset), 2); + __ evmovdquq(Address(rsp, dst_offset), xmm0, 2); + __ evmovdquq(xmm0, Address(rsp, -64), 2); + break; + default: + ShouldNotReachHere(); + } +#ifndef PRODUCT + } else { + switch (ireg) { + case Op_VecS: + st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" + "movl rax, [rsp + #%d]\n\t" + "movl [rsp + #%d], rax\n\t" + "movq rax, [rsp - #8]", + src_offset, dst_offset); + break; + case Op_VecD: + st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset); + break; + case Op_VecX: + st->print("pushq [rsp + #%d]\t# 128-bit mem-mem spill\n\t" + "popq [rsp + #%d]\n\t" + "pushq [rsp + #%d]\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset, src_offset+8, dst_offset+8); + break; + case Op_VecY: + st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" + "vmovdqu xmm0, [rsp + #%d]\n\t" + "vmovdqu [rsp + #%d], xmm0\n\t" + "vmovdqu xmm0, [rsp - #32]", + src_offset, dst_offset); + break; + case Op_VecZ: + st->print("vmovdqu [rsp - #64], xmm0\t# 512-bit mem-mem spill\n\t" + "vmovdqu xmm0, [rsp + #%d]\n\t" + "vmovdqu [rsp + #%d], xmm0\n\t" + "vmovdqu xmm0, [rsp - #64]", + src_offset, dst_offset); + break; + default: + ShouldNotReachHere(); + } +#endif + } +} + +uint MachSpillCopyNode::implementation(C2_MacroAssembler* masm, + PhaseRegAlloc* ra_, + bool do_size, + outputStream* st) const { + assert(masm != nullptr || st != nullptr, "sanity"); + // Get registers to move + OptoReg::Name src_second = ra_->get_reg_second(in(1)); + OptoReg::Name src_first = ra_->get_reg_first(in(1)); + OptoReg::Name dst_second = ra_->get_reg_second(this); + OptoReg::Name dst_first = ra_->get_reg_first(this); + + enum RC src_second_rc = rc_class(src_second); + enum RC src_first_rc = rc_class(src_first); + enum RC dst_second_rc = rc_class(dst_second); + enum RC dst_first_rc = rc_class(dst_first); + + assert(OptoReg::is_valid(src_first) && OptoReg::is_valid(dst_first), + "must move at least 1 register" ); + + if (src_first == dst_first && src_second == dst_second) { + // Self copy, no move + return 0; + } + if (bottom_type()->isa_vect() != nullptr && bottom_type()->isa_vectmask() == nullptr) { + uint ireg = ideal_reg(); + assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); + assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ ), "sanity"); + if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { + // mem -> mem + int src_offset = ra_->reg2offset(src_first); + int dst_offset = ra_->reg2offset(dst_first); + vec_stack_to_stack_helper(masm, src_offset, dst_offset, ireg, st); + } else if (src_first_rc == rc_float && dst_first_rc == rc_float ) { + vec_mov_helper(masm, src_first, dst_first, src_second, dst_second, ireg, st); + } else if (src_first_rc == rc_float && dst_first_rc == rc_stack ) { + int stack_offset = ra_->reg2offset(dst_first); + vec_spill_helper(masm, false, stack_offset, src_first, ireg, st); + } else if (src_first_rc == rc_stack && dst_first_rc == rc_float ) { + int stack_offset = ra_->reg2offset(src_first); + vec_spill_helper(masm, true, stack_offset, dst_first, ireg, st); + } else { + ShouldNotReachHere(); + } + return 0; + } + if (src_first_rc == rc_stack) { + // mem -> + if (dst_first_rc == rc_stack) { + // mem -> mem + assert(src_second != dst_first, "overlap"); + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int src_offset = ra_->reg2offset(src_first); + int dst_offset = ra_->reg2offset(dst_first); + if (masm) { + __ pushq(Address(rsp, src_offset)); + __ popq (Address(rsp, dst_offset)); +#ifndef PRODUCT + } else { + st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" + "popq [rsp + #%d]", + src_offset, dst_offset); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + // No pushl/popl, so: + int src_offset = ra_->reg2offset(src_first); + int dst_offset = ra_->reg2offset(dst_first); + if (masm) { + __ movq(Address(rsp, -8), rax); + __ movl(rax, Address(rsp, src_offset)); + __ movl(Address(rsp, dst_offset), rax); + __ movq(rax, Address(rsp, -8)); +#ifndef PRODUCT + } else { + st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" + "movl rax, [rsp + #%d]\n\t" + "movl [rsp + #%d], rax\n\t" + "movq rax, [rsp - #8]", + src_offset, dst_offset); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_int) { + // mem -> gpr + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(src_first); + if (masm) { + __ movq(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); +#ifndef PRODUCT + } else { + st->print("movq %s, [rsp + #%d]\t# spill", + Matcher::regName[dst_first], + offset); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + int offset = ra_->reg2offset(src_first); + if (masm) { + __ movl(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); +#ifndef PRODUCT + } else { + st->print("movl %s, [rsp + #%d]\t# spill", + Matcher::regName[dst_first], + offset); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_float) { + // mem-> xmm + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(src_first); + if (masm) { + __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); +#ifndef PRODUCT + } else { + st->print("%s %s, [rsp + #%d]\t# spill", + UseXmmLoadAndClearUpper ? "movsd " : "movlpd", + Matcher::regName[dst_first], + offset); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + int offset = ra_->reg2offset(src_first); + if (masm) { + __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); +#ifndef PRODUCT + } else { + st->print("movss %s, [rsp + #%d]\t# spill", + Matcher::regName[dst_first], + offset); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_kreg) { + // mem -> kreg + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(src_first); + if (masm) { + __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); +#ifndef PRODUCT + } else { + st->print("kmovq %s, [rsp + #%d]\t# spill", + Matcher::regName[dst_first], + offset); +#endif + } + } + return 0; + } + } else if (src_first_rc == rc_int) { + // gpr -> + if (dst_first_rc == rc_stack) { + // gpr -> mem + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(dst_first); + if (masm) { + __ movq(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movq [rsp + #%d], %s\t# spill", + offset, + Matcher::regName[src_first]); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + int offset = ra_->reg2offset(dst_first); + if (masm) { + __ movl(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movl [rsp + #%d], %s\t# spill", + offset, + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_int) { + // gpr -> gpr + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ movq(as_Register(Matcher::_regEncode[dst_first]), + as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + return 0; + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + if (masm) { + __ movl(as_Register(Matcher::_regEncode[dst_first]), + as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movl %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + return 0; + } + } else if (dst_first_rc == rc_float) { + // gpr -> xmm + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ movdq( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movdq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + if (masm) { + __ movdl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movdl %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_kreg) { + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); + #ifndef PRODUCT + } else { + st->print("kmovq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); + #endif + } + } + Unimplemented(); + return 0; + } + } else if (src_first_rc == rc_float) { + // xmm -> + if (dst_first_rc == rc_stack) { + // xmm -> mem + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(dst_first); + if (masm) { + __ movdbl( Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movsd [rsp + #%d], %s\t# spill", + offset, + Matcher::regName[src_first]); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + int offset = ra_->reg2offset(dst_first); + if (masm) { + __ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movss [rsp + #%d], %s\t# spill", + offset, + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_int) { + // xmm -> gpr + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ movdq( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movdq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + if (masm) { + __ movdl( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("movdl %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_float) { + // xmm -> xmm + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("%s %s, %s\t# spill", + UseXmmRegToRegMoveAll ? "movapd" : "movsd ", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } else { + // 32-bit + assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); + assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); + if (masm) { + __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("%s %s, %s\t# spill", + UseXmmRegToRegMoveAll ? "movaps" : "movss ", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_kreg) { + assert(false, "Illegal spilling"); + return 0; + } + } else if (src_first_rc == rc_kreg) { + if (dst_first_rc == rc_stack) { + // mem -> kreg + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + int offset = ra_->reg2offset(dst_first); + if (masm) { + __ kmov(Address(rsp, offset), as_KRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("kmovq [rsp + #%d] , %s\t# spill", + offset, + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_int) { + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ kmov(as_Register(Matcher::_regEncode[dst_first]), as_KRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("kmovq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } + Unimplemented(); + return 0; + } else if (dst_first_rc == rc_kreg) { + if ((src_first & 1) == 0 && src_first + 1 == src_second && + (dst_first & 1) == 0 && dst_first + 1 == dst_second) { + // 64-bit + if (masm) { + __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), as_KRegister(Matcher::_regEncode[src_first])); +#ifndef PRODUCT + } else { + st->print("kmovq %s, %s\t# spill", + Matcher::regName[dst_first], + Matcher::regName[src_first]); +#endif + } + } + return 0; + } else if (dst_first_rc == rc_float) { + assert(false, "Illegal spill"); + return 0; + } + } + + assert(0," foo "); + Unimplemented(); + return 0; +} + +#ifndef PRODUCT +void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const { + implementation(nullptr, ra_, false, st); +} +#endif + +void MachSpillCopyNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { + implementation(masm, ra_, false, nullptr); +} + +uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const { + return MachNode::size(ra_); +} + +//============================================================================= +#ifndef PRODUCT +void BoxLockNode::format(PhaseRegAlloc* ra_, outputStream* st) const +{ + int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); + int reg = ra_->get_reg_first(this); + st->print("leaq %s, [rsp + #%d]\t# box lock", + Matcher::regName[reg], offset); +} +#endif + +void BoxLockNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const +{ + int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); + int reg = ra_->get_encode(this); + + __ lea(as_Register(reg), Address(rsp, offset)); +} + +uint BoxLockNode::size(PhaseRegAlloc *ra_) const +{ + int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); + if (ra_->get_encode(this) > 15) { + return (offset < 0x80) ? 6 : 9; // REX2 + } else { + return (offset < 0x80) ? 5 : 8; // REX + } +} + +//============================================================================= +#ifndef PRODUCT +void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const +{ + if (UseCompressedClassPointers) { + st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass"); + st->print_cr("\tcmpl rscratch1, [rax + CompiledICData::speculated_klass_offset()]\t # Inline cache check"); + } else { + st->print_cr("movq rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass"); + st->print_cr("\tcmpq rscratch1, [rax + CompiledICData::speculated_klass_offset()]\t # Inline cache check"); + } + st->print_cr("\tjne SharedRuntime::_ic_miss_stub"); +} +#endif + +void MachUEPNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const +{ + __ ic_check(InteriorEntryAlignment); +} + +uint MachUEPNode::size(PhaseRegAlloc* ra_) const +{ + return MachNode::size(ra_); // too many variables; just compute it + // the hard way +} + + +//============================================================================= + +bool Matcher::supports_vector_calling_convention(void) { + return EnableVectorSupport; +} + +OptoRegPair Matcher::vector_return_value(uint ideal_reg) { + assert(EnableVectorSupport, "sanity"); + int lo = XMM0_num; + int hi = XMM0b_num; + if (ideal_reg == Op_VecX) hi = XMM0d_num; + else if (ideal_reg == Op_VecY) hi = XMM0h_num; + else if (ideal_reg == Op_VecZ) hi = XMM0p_num; + return OptoRegPair(hi, lo); +} + +// Is this branch offset short enough that a short branch can be used? +// +// NOTE: If the platform does not provide any short branch variants, then +// this method should return false for offset 0. +bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) { + // The passed offset is relative to address of the branch. + // On 86 a branch displacement is calculated relative to address + // of a next instruction. + offset -= br_size; + + // the short version of jmpConUCF2 contains multiple branches, + // making the reach slightly less + if (rule == jmpConUCF2_rule) + return (-126 <= offset && offset <= 125); + return (-128 <= offset && offset <= 127); +} + +// Return whether or not this register is ever used as an argument. +// This function is used on startup to build the trampoline stubs in +// generateOptoStub. Registers not mentioned will be killed by the VM +// call in the trampoline, and arguments in those registers not be +// available to the callee. +bool Matcher::can_be_java_arg(int reg) +{ + return + reg == RDI_num || reg == RDI_H_num || + reg == RSI_num || reg == RSI_H_num || + reg == RDX_num || reg == RDX_H_num || + reg == RCX_num || reg == RCX_H_num || + reg == R8_num || reg == R8_H_num || + reg == R9_num || reg == R9_H_num || + reg == R12_num || reg == R12_H_num || + reg == XMM0_num || reg == XMM0b_num || + reg == XMM1_num || reg == XMM1b_num || + reg == XMM2_num || reg == XMM2b_num || + reg == XMM3_num || reg == XMM3b_num || + reg == XMM4_num || reg == XMM4b_num || + reg == XMM5_num || reg == XMM5b_num || + reg == XMM6_num || reg == XMM6b_num || + reg == XMM7_num || reg == XMM7b_num; +} + +bool Matcher::is_spillable_arg(int reg) +{ + return can_be_java_arg(reg); +} + +uint Matcher::int_pressure_limit() +{ + return (INTPRESSURE == -1) ? _INT_REG_mask.size() : INTPRESSURE; +} + +uint Matcher::float_pressure_limit() +{ + // After experiment around with different values, the following default threshold + // works best for LCM's register pressure scheduling on x64. + uint dec_count = VM_Version::supports_evex() ? 4 : 2; + uint default_float_pressure_threshold = _FLOAT_REG_mask.size() - dec_count; + return (FLOATPRESSURE == -1) ? default_float_pressure_threshold : FLOATPRESSURE; +} + +bool Matcher::use_asm_for_ldiv_by_con( jlong divisor ) { + // In 64 bit mode a code which use multiply when + // devisor is constant is faster than hardware + // DIV instruction (it uses MulHiL). + return false; +} + +// Register for DIVI projection of divmodI +const RegMask& Matcher::divI_proj_mask() { + return INT_RAX_REG_mask(); +} + +// Register for MODI projection of divmodI +const RegMask& Matcher::modI_proj_mask() { + return INT_RDX_REG_mask(); +} + +// Register for DIVL projection of divmodL +const RegMask& Matcher::divL_proj_mask() { + return LONG_RAX_REG_mask(); +} + +// Register for MODL projection of divmodL +const RegMask& Matcher::modL_proj_mask() { + return LONG_RDX_REG_mask(); +} + +%} + source_hpp %{ // Header information of the source block. // Method declarations/definitions which are used outside @@ -2708,7 +4341,206 @@ static inline jlong high_bit_set(BasicType bt) { %} +//----------ENCODING BLOCK----------------------------------------------------- +// This block specifies the encoding classes used by the compiler to +// output byte streams. Encoding classes are parameterized macros +// used by Machine Instruction Nodes in order to generate the bit +// encoding of the instruction. Operands specify their base encoding +// interface with the interface keyword. There are currently +// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, & +// COND_INTER. REG_INTER causes an operand to generate a function +// which returns its register number when queried. CONST_INTER causes +// an operand to generate a function which returns the value of the +// constant when queried. MEMORY_INTER causes an operand to generate +// four functions which return the Base Register, the Index Register, +// the Scale Value, and the Offset Value of the operand when queried. +// COND_INTER causes an operand to generate six functions which return +// the encoding code (ie - encoding bits for the instruction) +// associated with each basic boolean condition for a conditional +// instruction. +// +// Instructions specify two basic values for encoding. Again, a +// function is available to check if the constant displacement is an +// oop. They use the ins_encode keyword to specify their encoding +// classes (which must be a sequence of enc_class names, and their +// parameters, specified in the encoding block), and they use the +// opcode keyword to specify, in order, their primary, secondary, and +// tertiary opcode. Only the opcode sections which a particular +// instruction needs for encoding need to be specified. encode %{ + enc_class cdql_enc(no_rax_rdx_RegI div) + %{ + // Full implementation of Java idiv and irem; checks for + // special case as described in JVM spec., p.243 & p.271. + // + // normal case special case + // + // input : rax: dividend min_int + // reg: divisor -1 + // + // output: rax: quotient (= rax idiv reg) min_int + // rdx: remainder (= rax irem reg) 0 + // + // Code sequnce: + // + // 0: 3d 00 00 00 80 cmp $0x80000000,%eax + // 5: 75 07/08 jne e + // 7: 33 d2 xor %edx,%edx + // [div >= 8 -> offset + 1] + // [REX_B] + // 9: 83 f9 ff cmp $0xffffffffffffffff,$div + // c: 74 03/04 je 11 + // 000000000000000e : + // e: 99 cltd + // [div >= 8 -> offset + 1] + // [REX_B] + // f: f7 f9 idiv $div + // 0000000000000011 : + Label normal; + Label done; + + // cmp $0x80000000,%eax + __ cmpl(as_Register(RAX_enc), 0x80000000); + + // jne e + __ jccb(Assembler::notEqual, normal); + + // xor %edx,%edx + __ xorl(as_Register(RDX_enc), as_Register(RDX_enc)); + + // cmp $0xffffffffffffffff,%ecx + __ cmpl($div$$Register, -1); + + // je 11 + __ jccb(Assembler::equal, done); + + // + // cltd + __ bind(normal); + __ cdql(); + + // idivl + // + __ idivl($div$$Register); + __ bind(done); + %} + + enc_class cdqq_enc(no_rax_rdx_RegL div) + %{ + // Full implementation of Java ldiv and lrem; checks for + // special case as described in JVM spec., p.243 & p.271. + // + // normal case special case + // + // input : rax: dividend min_long + // reg: divisor -1 + // + // output: rax: quotient (= rax idiv reg) min_long + // rdx: remainder (= rax irem reg) 0 + // + // Code sequnce: + // + // 0: 48 ba 00 00 00 00 00 mov $0x8000000000000000,%rdx + // 7: 00 00 80 + // a: 48 39 d0 cmp %rdx,%rax + // d: 75 08 jne 17 + // f: 33 d2 xor %edx,%edx + // 11: 48 83 f9 ff cmp $0xffffffffffffffff,$div + // 15: 74 05 je 1c + // 0000000000000017 : + // 17: 48 99 cqto + // 19: 48 f7 f9 idiv $div + // 000000000000001c : + Label normal; + Label done; + + // mov $0x8000000000000000,%rdx + __ mov64(as_Register(RDX_enc), 0x8000000000000000); + + // cmp %rdx,%rax + __ cmpq(as_Register(RAX_enc), as_Register(RDX_enc)); + + // jne 17 + __ jccb(Assembler::notEqual, normal); + + // xor %edx,%edx + __ xorl(as_Register(RDX_enc), as_Register(RDX_enc)); + + // cmp $0xffffffffffffffff,$div + __ cmpq($div$$Register, -1); + + // je 1e + __ jccb(Assembler::equal, done); + + // + // cqto + __ bind(normal); + __ cdqq(); + + // idivq (note: must be emitted by the user of this rule) + // + __ idivq($div$$Register); + __ bind(done); + %} + + enc_class clear_avx %{ + DEBUG_ONLY(int off0 = __ offset()); + if (generate_vzeroupper(Compile::current())) { + // Clear upper bits of YMM registers to avoid AVX <-> SSE transition penalty + // Clear upper bits of YMM registers when current compiled code uses + // wide vectors to avoid AVX <-> SSE transition penalty during call. + __ vzeroupper(); + } + DEBUG_ONLY(int off1 = __ offset()); + assert(off1 - off0 == clear_avx_size(), "correct size prediction"); + %} + + enc_class Java_To_Runtime(method meth) %{ + __ lea(r10, RuntimeAddress((address)$meth$$method)); + __ call(r10); + __ post_call_nop(); + %} + + enc_class Java_Static_Call(method meth) + %{ + // JAVA STATIC CALL + // CALL to fixup routine. Fixup routine uses ScopeDesc info to + // determine who we intended to call. + if (!_method) { + __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, $meth$$method))); + } else if (_method->intrinsic_id() == vmIntrinsicID::_ensureMaterializedForStackWalk) { + // The NOP here is purely to ensure that eliding a call to + // JVM_EnsureMaterializedForStackWalk doesn't change the code size. + __ addr_nop_5(); + __ block_comment("call JVM_EnsureMaterializedForStackWalk (elided)"); + } else { + int method_index = resolved_method_index(masm); + RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index) + : static_call_Relocation::spec(method_index); + address mark = __ pc(); + int call_offset = __ offset(); + __ call(AddressLiteral(CAST_FROM_FN_PTR(address, $meth$$method), rspec)); + if (CodeBuffer::supports_shared_stubs() && _method->can_be_statically_bound()) { + // Calls of the same statically bound method can share + // a stub to the interpreter. + __ code()->shared_stub_to_interp_for(_method, call_offset); + } else { + // Emit stubs for static call. + address stub = CompiledDirectCall::emit_to_interp_stub(masm, mark); + __ clear_inst_mark(); + if (stub == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return; + } + } + } + __ post_call_nop(); + %} + + enc_class Java_Dynamic_Call(method meth) %{ + __ ic_call((address)$meth$$method, resolved_method_index(masm)); + __ post_call_nop(); + %} enc_class call_epilog %{ if (VerifyStackAtCalls) { @@ -2725,6 +4557,1501 @@ encode %{ %} +//----------FRAME-------------------------------------------------------------- +// Definition of frame structure and management information. +// +// S T A C K L A Y O U T Allocators stack-slot number +// | (to get allocators register number +// G Owned by | | v add OptoReg::stack0()) +// r CALLER | | +// o | +--------+ pad to even-align allocators stack-slot +// w V | pad0 | numbers; owned by CALLER +// t -----------+--------+----> Matcher::_in_arg_limit, unaligned +// h ^ | in | 5 +// | | args | 4 Holes in incoming args owned by SELF +// | | | | 3 +// | | +--------+ +// V | | old out| Empty on Intel, window on Sparc +// | old |preserve| Must be even aligned. +// | SP-+--------+----> Matcher::_old_SP, even aligned +// | | in | 3 area for Intel ret address +// Owned by |preserve| Empty on Sparc. +// SELF +--------+ +// | | pad2 | 2 pad to align old SP +// | +--------+ 1 +// | | locks | 0 +// | +--------+----> OptoReg::stack0(), even aligned +// | | pad1 | 11 pad to align new SP +// | +--------+ +// | | | 10 +// | | spills | 9 spills +// V | | 8 (pad0 slot for callee) +// -----------+--------+----> Matcher::_out_arg_limit, unaligned +// ^ | out | 7 +// | | args | 6 Holes in outgoing args owned by CALLEE +// Owned by +--------+ +// CALLEE | new out| 6 Empty on Intel, window on Sparc +// | new |preserve| Must be even-aligned. +// | SP-+--------+----> Matcher::_new_SP, even aligned +// | | | +// +// Note 1: Only region 8-11 is determined by the allocator. Region 0-5 is +// known from SELF's arguments and the Java calling convention. +// Region 6-7 is determined per call site. +// Note 2: If the calling convention leaves holes in the incoming argument +// area, those holes are owned by SELF. Holes in the outgoing area +// are owned by the CALLEE. Holes should not be necessary in the +// incoming area, as the Java calling convention is completely under +// the control of the AD file. Doubles can be sorted and packed to +// avoid holes. Holes in the outgoing arguments may be necessary for +// varargs C calling conventions. +// Note 3: Region 0-3 is even aligned, with pad2 as needed. Region 3-5 is +// even aligned with pad0 as needed. +// Region 6 is even aligned. Region 6-7 is NOT even aligned; +// region 6-11 is even aligned; it may be padded out more so that +// the region from SP to FP meets the minimum stack alignment. +// Note 4: For I2C adapters, the incoming FP may not meet the minimum stack +// alignment. Region 11, pad1, may be dynamically extended so that +// SP meets the minimum alignment. + +frame +%{ + // These three registers define part of the calling convention + // between compiled code and the interpreter. + inline_cache_reg(RAX); // Inline Cache Register + + // Optional: name the operand used by cisc-spilling to access + // [stack_pointer + offset] + cisc_spilling_operand_name(indOffset32); + + // Number of stack slots consumed by locking an object + sync_stack_slots(2); + + // Compiled code's Frame Pointer + frame_pointer(RSP); + + // Interpreter stores its frame pointer in a register which is + // stored to the stack by I2CAdaptors. + // I2CAdaptors convert from interpreted java to compiled java. + interpreter_frame_pointer(RBP); + + // Stack alignment requirement + stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes) + + // Number of outgoing stack slots killed above the out_preserve_stack_slots + // for calls to C. Supports the var-args backing area for register parms. + varargs_C_out_slots_killed(frame::arg_reg_save_area_bytes/BytesPerInt); + + // The after-PROLOG location of the return address. Location of + // return address specifies a type (REG or STACK) and a number + // representing the register number (i.e. - use a register name) or + // stack slot. + // Ret Addr is on stack in slot 0 if no locks or verification or alignment. + // Otherwise, it is above the locks and verification slot and alignment word + return_addr(STACK - 2 + + align_up((Compile::current()->in_preserve_stack_slots() + + Compile::current()->fixed_slots()), + stack_alignment_in_slots())); + + // Location of compiled Java return values. Same as C for now. + return_value + %{ + assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, + "only return normal values"); + + static const int lo[Op_RegL + 1] = { + 0, + 0, + RAX_num, // Op_RegN + RAX_num, // Op_RegI + RAX_num, // Op_RegP + XMM0_num, // Op_RegF + XMM0_num, // Op_RegD + RAX_num // Op_RegL + }; + static const int hi[Op_RegL + 1] = { + 0, + 0, + OptoReg::Bad, // Op_RegN + OptoReg::Bad, // Op_RegI + RAX_H_num, // Op_RegP + OptoReg::Bad, // Op_RegF + XMM0b_num, // Op_RegD + RAX_H_num // Op_RegL + }; + // Excluded flags and vector registers. + assert(ARRAY_SIZE(hi) == _last_machine_leaf - 8, "missing type"); + return OptoRegPair(hi[ideal_reg], lo[ideal_reg]); + %} +%} + +//----------ATTRIBUTES--------------------------------------------------------- +//----------Operand Attributes------------------------------------------------- +op_attrib op_cost(0); // Required cost attribute + +//----------Instruction Attributes--------------------------------------------- +ins_attrib ins_cost(100); // Required cost attribute +ins_attrib ins_size(8); // Required size attribute (in bits) +ins_attrib ins_short_branch(0); // Required flag: is this instruction + // a non-matching short branch variant + // of some long branch? +ins_attrib ins_alignment(1); // Required alignment attribute (must + // be a power of 2) specifies the + // alignment that some part of the + // instruction (not necessarily the + // start) requires. If > 1, a + // compute_padding() function must be + // provided for the instruction + +// Whether this node is expanded during code emission into a sequence of +// instructions and the first instruction can perform an implicit null check. +ins_attrib ins_is_late_expanded_null_check_candidate(false); + +//----------OPERANDS----------------------------------------------------------- +// Operand definitions must precede instruction definitions for correct parsing +// in the ADLC because operands constitute user defined types which are used in +// instruction definitions. + +//----------Simple Operands---------------------------------------------------- +// Immediate Operands +// Integer Immediate +operand immI() +%{ + match(ConI); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Constant for test vs zero +operand immI_0() +%{ + predicate(n->get_int() == 0); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +// Constant for increment +operand immI_1() +%{ + predicate(n->get_int() == 1); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +// Constant for decrement +operand immI_M1() +%{ + predicate(n->get_int() == -1); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +operand immI_2() +%{ + predicate(n->get_int() == 2); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +operand immI_4() +%{ + predicate(n->get_int() == 4); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +operand immI_8() +%{ + predicate(n->get_int() == 8); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +// Valid scale values for addressing modes +operand immI2() +%{ + predicate(0 <= n->get_int() && (n->get_int() <= 3)); + match(ConI); + + format %{ %} + interface(CONST_INTER); +%} + +operand immU7() +%{ + predicate((0 <= n->get_int()) && (n->get_int() <= 0x7F)); + match(ConI); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +operand immI8() +%{ + predicate((-0x80 <= n->get_int()) && (n->get_int() < 0x80)); + match(ConI); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +operand immU8() +%{ + predicate((0 <= n->get_int()) && (n->get_int() <= 255)); + match(ConI); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +operand immI16() +%{ + predicate((-32768 <= n->get_int()) && (n->get_int() <= 32767)); + match(ConI); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Int Immediate non-negative +operand immU31() +%{ + predicate(n->get_int() >= 0); + match(ConI); + + op_cost(0); + format %{ %} + interface(CONST_INTER); +%} + +// Pointer Immediate +operand immP() +%{ + match(ConP); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Null Pointer Immediate +operand immP0() +%{ + predicate(n->get_ptr() == 0); + match(ConP); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +// Pointer Immediate +operand immN() %{ + match(ConN); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +operand immNKlass() %{ + match(ConNKlass); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Null Pointer Immediate +operand immN0() %{ + predicate(n->get_narrowcon() == 0); + match(ConN); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +operand immP31() +%{ + predicate(n->as_Type()->type()->reloc() == relocInfo::none + && (n->get_ptr() >> 31) == 0); + match(ConP); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + + +// Long Immediate +operand immL() +%{ + match(ConL); + + op_cost(20); + format %{ %} + interface(CONST_INTER); +%} + +// Long Immediate 8-bit +operand immL8() +%{ + predicate(-0x80L <= n->get_long() && n->get_long() < 0x80L); + match(ConL); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +// Long Immediate 32-bit unsigned +operand immUL32() +%{ + predicate(n->get_long() == (unsigned int) (n->get_long())); + match(ConL); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Long Immediate 32-bit signed +operand immL32() +%{ + predicate(n->get_long() == (int) (n->get_long())); + match(ConL); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +operand immL_Pow2() +%{ + predicate(is_power_of_2((julong)n->get_long())); + match(ConL); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +operand immL_NotPow2() +%{ + predicate(is_power_of_2((julong)~n->get_long())); + match(ConL); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +// Long Immediate zero +operand immL0() +%{ + predicate(n->get_long() == 0L); + match(ConL); + + op_cost(10); + format %{ %} + interface(CONST_INTER); +%} + +// Constant for increment +operand immL1() +%{ + predicate(n->get_long() == 1); + match(ConL); + + format %{ %} + interface(CONST_INTER); +%} + +// Constant for decrement +operand immL_M1() +%{ + predicate(n->get_long() == -1); + match(ConL); + + format %{ %} + interface(CONST_INTER); +%} + +// Long Immediate: low 32-bit mask +operand immL_32bits() +%{ + predicate(n->get_long() == 0xFFFFFFFFL); + match(ConL); + op_cost(20); + + format %{ %} + interface(CONST_INTER); +%} + +// Int Immediate: 2^n-1, positive +operand immI_Pow2M1() +%{ + predicate((n->get_int() > 0) + && is_power_of_2((juint)n->get_int() + 1)); + match(ConI); + + op_cost(20); + format %{ %} + interface(CONST_INTER); +%} + +// Float Immediate zero +operand immF0() +%{ + predicate(jint_cast(n->getf()) == 0); + match(ConF); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +// Float Immediate +operand immF() +%{ + match(ConF); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +// Half Float Immediate +operand immH() +%{ + match(ConH); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +// Double Immediate zero +operand immD0() +%{ + predicate(jlong_cast(n->getd()) == 0); + match(ConD); + + op_cost(5); + format %{ %} + interface(CONST_INTER); +%} + +// Double Immediate +operand immD() +%{ + match(ConD); + + op_cost(15); + format %{ %} + interface(CONST_INTER); +%} + +// Immediates for special shifts (sign extend) + +// Constants for increment +operand immI_16() +%{ + predicate(n->get_int() == 16); + match(ConI); + + format %{ %} + interface(CONST_INTER); +%} + +operand immI_24() +%{ + predicate(n->get_int() == 24); + match(ConI); + + format %{ %} + interface(CONST_INTER); +%} + +// Constant for byte-wide masking +operand immI_255() +%{ + predicate(n->get_int() == 255); + match(ConI); + + format %{ %} + interface(CONST_INTER); +%} + +// Constant for short-wide masking +operand immI_65535() +%{ + predicate(n->get_int() == 65535); + match(ConI); + + format %{ %} + interface(CONST_INTER); +%} + +// Constant for byte-wide masking +operand immL_255() +%{ + predicate(n->get_long() == 255); + match(ConL); + + format %{ %} + interface(CONST_INTER); +%} + +// Constant for short-wide masking +operand immL_65535() +%{ + predicate(n->get_long() == 65535); + match(ConL); + + format %{ %} + interface(CONST_INTER); +%} + +operand kReg() +%{ + constraint(ALLOC_IN_RC(vectmask_reg)); + match(RegVectMask); + format %{%} + interface(REG_INTER); +%} + +// Register Operands +// Integer Register +operand rRegI() +%{ + constraint(ALLOC_IN_RC(int_reg)); + match(RegI); + + match(rax_RegI); + match(rbx_RegI); + match(rcx_RegI); + match(rdx_RegI); + match(rdi_RegI); + + format %{ %} + interface(REG_INTER); +%} + +// Special Registers +operand rax_RegI() +%{ + constraint(ALLOC_IN_RC(int_rax_reg)); + match(RegI); + match(rRegI); + + format %{ "RAX" %} + interface(REG_INTER); +%} + +// Special Registers +operand rbx_RegI() +%{ + constraint(ALLOC_IN_RC(int_rbx_reg)); + match(RegI); + match(rRegI); + + format %{ "RBX" %} + interface(REG_INTER); +%} + +operand rcx_RegI() +%{ + constraint(ALLOC_IN_RC(int_rcx_reg)); + match(RegI); + match(rRegI); + + format %{ "RCX" %} + interface(REG_INTER); +%} + +operand rdx_RegI() +%{ + constraint(ALLOC_IN_RC(int_rdx_reg)); + match(RegI); + match(rRegI); + + format %{ "RDX" %} + interface(REG_INTER); +%} + +operand rdi_RegI() +%{ + constraint(ALLOC_IN_RC(int_rdi_reg)); + match(RegI); + match(rRegI); + + format %{ "RDI" %} + interface(REG_INTER); +%} + +operand no_rax_rdx_RegI() +%{ + constraint(ALLOC_IN_RC(int_no_rax_rdx_reg)); + match(RegI); + match(rbx_RegI); + match(rcx_RegI); + match(rdi_RegI); + + format %{ %} + interface(REG_INTER); +%} + +operand no_rbp_r13_RegI() +%{ + constraint(ALLOC_IN_RC(int_no_rbp_r13_reg)); + match(RegI); + match(rRegI); + match(rax_RegI); + match(rbx_RegI); + match(rcx_RegI); + match(rdx_RegI); + match(rdi_RegI); + + format %{ %} + interface(REG_INTER); +%} + +// Pointer Register +operand any_RegP() +%{ + constraint(ALLOC_IN_RC(any_reg)); + match(RegP); + match(rax_RegP); + match(rbx_RegP); + match(rdi_RegP); + match(rsi_RegP); + match(rbp_RegP); + match(r15_RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +operand rRegP() +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(RegP); + match(rax_RegP); + match(rbx_RegP); + match(rdi_RegP); + match(rsi_RegP); + match(rbp_RegP); // See Q&A below about + match(r15_RegP); // r15_RegP and rbp_RegP. + + format %{ %} + interface(REG_INTER); +%} + +operand rRegN() %{ + constraint(ALLOC_IN_RC(int_reg)); + match(RegN); + + format %{ %} + interface(REG_INTER); +%} + +// Question: Why is r15_RegP (the read-only TLS register) a match for rRegP? +// Answer: Operand match rules govern the DFA as it processes instruction inputs. +// It's fine for an instruction input that expects rRegP to match a r15_RegP. +// The output of an instruction is controlled by the allocator, which respects +// register class masks, not match rules. Unless an instruction mentions +// r15_RegP or any_RegP explicitly as its output, r15 will not be considered +// by the allocator as an input. +// The same logic applies to rbp_RegP being a match for rRegP: If PreserveFramePointer==true, +// the RBP is used as a proper frame pointer and is not included in ptr_reg. As a +// result, RBP is not included in the output of the instruction either. + +// This operand is not allowed to use RBP even if +// RBP is not used to hold the frame pointer. +operand no_rbp_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_reg_no_rbp)); + match(RegP); + match(rbx_RegP); + match(rsi_RegP); + match(rdi_RegP); + + format %{ %} + interface(REG_INTER); +%} + +// Special Registers +// Return a pointer value +operand rax_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_rax_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +// Special Registers +// Return a compressed pointer value +operand rax_RegN() +%{ + constraint(ALLOC_IN_RC(int_rax_reg)); + match(RegN); + match(rRegN); + + format %{ %} + interface(REG_INTER); +%} + +// Used in AtomicAdd +operand rbx_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_rbx_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +operand rsi_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_rsi_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +operand rbp_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_rbp_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +// Used in rep stosq +operand rdi_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_rdi_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +operand r15_RegP() +%{ + constraint(ALLOC_IN_RC(ptr_r15_reg)); + match(RegP); + match(rRegP); + + format %{ %} + interface(REG_INTER); +%} + +operand rRegL() +%{ + constraint(ALLOC_IN_RC(long_reg)); + match(RegL); + match(rax_RegL); + match(rdx_RegL); + + format %{ %} + interface(REG_INTER); +%} + +// Special Registers +operand no_rax_rdx_RegL() +%{ + constraint(ALLOC_IN_RC(long_no_rax_rdx_reg)); + match(RegL); + match(rRegL); + + format %{ %} + interface(REG_INTER); +%} + +operand rax_RegL() +%{ + constraint(ALLOC_IN_RC(long_rax_reg)); + match(RegL); + match(rRegL); + + format %{ "RAX" %} + interface(REG_INTER); +%} + +operand rcx_RegL() +%{ + constraint(ALLOC_IN_RC(long_rcx_reg)); + match(RegL); + match(rRegL); + + format %{ %} + interface(REG_INTER); +%} + +operand rdx_RegL() +%{ + constraint(ALLOC_IN_RC(long_rdx_reg)); + match(RegL); + match(rRegL); + + format %{ %} + interface(REG_INTER); +%} + +operand r11_RegL() +%{ + constraint(ALLOC_IN_RC(long_r11_reg)); + match(RegL); + match(rRegL); + + format %{ %} + interface(REG_INTER); +%} + +operand no_rbp_r13_RegL() +%{ + constraint(ALLOC_IN_RC(long_no_rbp_r13_reg)); + match(RegL); + match(rRegL); + match(rax_RegL); + match(rcx_RegL); + match(rdx_RegL); + + format %{ %} + interface(REG_INTER); +%} + +// Flags register, used as output of compare instructions +operand rFlagsReg() +%{ + constraint(ALLOC_IN_RC(int_flags)); + match(RegFlags); + + format %{ "RFLAGS" %} + interface(REG_INTER); +%} + +// Flags register, used as output of FLOATING POINT compare instructions +operand rFlagsRegU() +%{ + constraint(ALLOC_IN_RC(int_flags)); + match(RegFlags); + + format %{ "RFLAGS_U" %} + interface(REG_INTER); +%} + +operand rFlagsRegUCF() %{ + constraint(ALLOC_IN_RC(int_flags)); + match(RegFlags); + predicate(false); + + format %{ "RFLAGS_U_CF" %} + interface(REG_INTER); +%} + +// Float register operands +operand regF() %{ + constraint(ALLOC_IN_RC(float_reg)); + match(RegF); + + format %{ %} + interface(REG_INTER); +%} + +// Float register operands +operand legRegF() %{ + constraint(ALLOC_IN_RC(float_reg_legacy)); + match(RegF); + + format %{ %} + interface(REG_INTER); +%} + +// Float register operands +operand vlRegF() %{ + constraint(ALLOC_IN_RC(float_reg_vl)); + match(RegF); + + format %{ %} + interface(REG_INTER); +%} + +// Double register operands +operand regD() %{ + constraint(ALLOC_IN_RC(double_reg)); + match(RegD); + + format %{ %} + interface(REG_INTER); +%} + +// Double register operands +operand legRegD() %{ + constraint(ALLOC_IN_RC(double_reg_legacy)); + match(RegD); + + format %{ %} + interface(REG_INTER); +%} + +// Double register operands +operand vlRegD() %{ + constraint(ALLOC_IN_RC(double_reg_vl)); + match(RegD); + + format %{ %} + interface(REG_INTER); +%} + +//----------Memory Operands---------------------------------------------------- +// Direct Memory Operand +// operand direct(immP addr) +// %{ +// match(addr); + +// format %{ "[$addr]" %} +// interface(MEMORY_INTER) %{ +// base(0xFFFFFFFF); +// index(0x4); +// scale(0x0); +// disp($addr); +// %} +// %} + +// Indirect Memory Operand +operand indirect(any_RegP reg) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(reg); + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp(0x0); + %} +%} + +// Indirect Memory Plus Short Offset Operand +operand indOffset8(any_RegP reg, immL8 off) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP reg off); + + format %{ "[$reg + $off (8-bit)]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Long Offset Operand +operand indOffset32(any_RegP reg, immL32 off) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP reg off); + + format %{ "[$reg + $off (32-bit)]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Index Register Plus Offset Operand +operand indIndexOffset(any_RegP reg, rRegL lreg, immL32 off) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (AddP reg lreg) off); + + op_cost(10); + format %{"[$reg + $off + $lreg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Index Register Plus Offset Operand +operand indIndex(any_RegP reg, rRegL lreg) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP reg lreg); + + op_cost(10); + format %{"[$reg + $lreg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale(0x0); + disp(0x0); + %} +%} + +// Indirect Memory Times Scale Plus Index Register +operand indIndexScale(any_RegP reg, rRegL lreg, immI2 scale) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP reg (LShiftL lreg scale)); + + op_cost(10); + format %{"[$reg + $lreg << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale($scale); + disp(0x0); + %} +%} + +operand indPosIndexScale(any_RegP reg, rRegI idx, immI2 scale) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + predicate(n->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); + match(AddP reg (LShiftL (ConvI2L idx) scale)); + + op_cost(10); + format %{"[$reg + pos $idx << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($idx); + scale($scale); + disp(0x0); + %} +%} + +// Indirect Memory Times Scale Plus Index Register Plus Offset Operand +operand indIndexScaleOffset(any_RegP reg, immL32 off, rRegL lreg, immI2 scale) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (AddP reg (LShiftL lreg scale)) off); + + op_cost(10); + format %{"[$reg + $off + $lreg << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale($scale); + disp($off); + %} +%} + +// Indirect Memory Plus Positive Index Register Plus Offset Operand +operand indPosIndexOffset(any_RegP reg, immL32 off, rRegI idx) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + predicate(n->in(2)->in(3)->as_Type()->type()->is_long()->_lo >= 0); + match(AddP (AddP reg (ConvI2L idx)) off); + + op_cost(10); + format %{"[$reg + $off + $idx]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($idx); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand +operand indPosIndexScaleOffset(any_RegP reg, immL32 off, rRegI idx, immI2 scale) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + predicate(n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); + match(AddP (AddP reg (LShiftL (ConvI2L idx) scale)) off); + + op_cost(10); + format %{"[$reg + $off + $idx << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($idx); + scale($scale); + disp($off); + %} +%} + +// Indirect Narrow Oop Plus Offset Operand +// Note: x86 architecture doesn't support "scale * index + offset" without a base +// we can't free r12 even with CompressedOops::base() == nullptr. +operand indCompressedOopOffset(rRegN reg, immL32 off) %{ + predicate(UseCompressedOops && (CompressedOops::shift() == Address::times_8)); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (DecodeN reg) off); + + op_cost(10); + format %{"[R12 + $reg << 3 + $off] (compressed oop addressing)" %} + interface(MEMORY_INTER) %{ + base(0xc); // R12 + index($reg); + scale(0x3); + disp($off); + %} +%} + +// Indirect Memory Operand +operand indirectNarrow(rRegN reg) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(DecodeN reg); + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp(0x0); + %} +%} + +// Indirect Memory Plus Short Offset Operand +operand indOffset8Narrow(rRegN reg, immL8 off) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (DecodeN reg) off); + + format %{ "[$reg + $off (8-bit)]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Long Offset Operand +operand indOffset32Narrow(rRegN reg, immL32 off) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (DecodeN reg) off); + + format %{ "[$reg + $off (32-bit)]" %} + interface(MEMORY_INTER) %{ + base($reg); + index(0x4); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Index Register Plus Offset Operand +operand indIndexOffsetNarrow(rRegN reg, rRegL lreg, immL32 off) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (AddP (DecodeN reg) lreg) off); + + op_cost(10); + format %{"[$reg + $off + $lreg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Plus Index Register Plus Offset Operand +operand indIndexNarrow(rRegN reg, rRegL lreg) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (DecodeN reg) lreg); + + op_cost(10); + format %{"[$reg + $lreg]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale(0x0); + disp(0x0); + %} +%} + +// Indirect Memory Times Scale Plus Index Register +operand indIndexScaleNarrow(rRegN reg, rRegL lreg, immI2 scale) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (DecodeN reg) (LShiftL lreg scale)); + + op_cost(10); + format %{"[$reg + $lreg << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale($scale); + disp(0x0); + %} +%} + +// Indirect Memory Times Scale Plus Index Register Plus Offset Operand +operand indIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegL lreg, immI2 scale) +%{ + predicate(CompressedOops::shift() == 0); + constraint(ALLOC_IN_RC(ptr_reg)); + match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off); + + op_cost(10); + format %{"[$reg + $off + $lreg << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($lreg); + scale($scale); + disp($off); + %} +%} + +// Indirect Memory Times Plus Positive Index Register Plus Offset Operand +operand indPosIndexOffsetNarrow(rRegN reg, immL32 off, rRegI idx) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + predicate(CompressedOops::shift() == 0 && n->in(2)->in(3)->as_Type()->type()->is_long()->_lo >= 0); + match(AddP (AddP (DecodeN reg) (ConvI2L idx)) off); + + op_cost(10); + format %{"[$reg + $off + $idx]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($idx); + scale(0x0); + disp($off); + %} +%} + +// Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand +operand indPosIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegI idx, immI2 scale) +%{ + constraint(ALLOC_IN_RC(ptr_reg)); + predicate(CompressedOops::shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); + match(AddP (AddP (DecodeN reg) (LShiftL (ConvI2L idx) scale)) off); + + op_cost(10); + format %{"[$reg + $off + $idx << $scale]" %} + interface(MEMORY_INTER) %{ + base($reg); + index($idx); + scale($scale); + disp($off); + %} +%} + +//----------Special Memory Operands-------------------------------------------- +// Stack Slot Operand - This operand is used for loading and storing temporary +// values on the stack where a match requires a value to +// flow through memory. +operand stackSlotP(sRegP reg) +%{ + constraint(ALLOC_IN_RC(stack_slots)); + // No match rule because this operand is only generated in matching + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base(0x4); // RSP + index(0x4); // No Index + scale(0x0); // No Scale + disp($reg); // Stack Offset + %} +%} + +operand stackSlotI(sRegI reg) +%{ + constraint(ALLOC_IN_RC(stack_slots)); + // No match rule because this operand is only generated in matching + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base(0x4); // RSP + index(0x4); // No Index + scale(0x0); // No Scale + disp($reg); // Stack Offset + %} +%} + +operand stackSlotF(sRegF reg) +%{ + constraint(ALLOC_IN_RC(stack_slots)); + // No match rule because this operand is only generated in matching + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base(0x4); // RSP + index(0x4); // No Index + scale(0x0); // No Scale + disp($reg); // Stack Offset + %} +%} + +operand stackSlotD(sRegD reg) +%{ + constraint(ALLOC_IN_RC(stack_slots)); + // No match rule because this operand is only generated in matching + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base(0x4); // RSP + index(0x4); // No Index + scale(0x0); // No Scale + disp($reg); // Stack Offset + %} +%} +operand stackSlotL(sRegL reg) +%{ + constraint(ALLOC_IN_RC(stack_slots)); + // No match rule because this operand is only generated in matching + + format %{ "[$reg]" %} + interface(MEMORY_INTER) %{ + base(0x4); // RSP + index(0x4); // No Index + scale(0x0); // No Scale + disp($reg); // Stack Offset + %} +%} + +//----------Conditional Branch Operands---------------------------------------- +// Comparison Op - This is the operation of the comparison, and is limited to +// the following set of codes: +// L (<), LE (<=), G (>), GE (>=), E (==), NE (!=) +// +// Other attributes of the comparison, such as unsignedness, are specified +// by the comparison instruction that sets a condition code flags register. +// That result is represented by a flags operand whose subtype is appropriate +// to the unsignedness (etc.) of the comparison. +// +// Later, the instruction which matches both the Comparison Op (a Bool) and +// the flags (produced by the Cmp) specifies the coding of the comparison op +// by matching a specific subtype of Bool operand below, such as cmpOpU. + +// Comparison Code +operand cmpOp() +%{ + match(Bool); + + format %{ "" %} + interface(COND_INTER) %{ + equal(0x4, "e"); + not_equal(0x5, "ne"); + less(0xC, "l"); + greater_equal(0xD, "ge"); + less_equal(0xE, "le"); + greater(0xF, "g"); + overflow(0x0, "o"); + no_overflow(0x1, "no"); + %} +%} + +// Comparison Code, unsigned compare. Used by FP also, with +// C2 (unordered) turned into GT or LT already. The other bits +// C0 and C3 are turned into Carry & Zero flags. +operand cmpOpU() +%{ + match(Bool); + + format %{ "" %} + interface(COND_INTER) %{ + equal(0x4, "e"); + not_equal(0x5, "ne"); + less(0x2, "b"); + greater_equal(0x3, "ae"); + less_equal(0x6, "be"); + greater(0x7, "a"); + overflow(0x0, "o"); + no_overflow(0x1, "no"); + %} +%} + + +// Floating comparisons that don't require any fixup for the unordered case, +// If both inputs of the comparison are the same, ZF is always set so we +// don't need to use cmpOpUCF2 for eq/ne +operand cmpOpUCF() %{ + match(Bool); + predicate(n->as_Bool()->_test._test == BoolTest::lt || + n->as_Bool()->_test._test == BoolTest::ge || + n->as_Bool()->_test._test == BoolTest::le || + n->as_Bool()->_test._test == BoolTest::gt || + n->in(1)->in(1) == n->in(1)->in(2)); + format %{ "" %} + interface(COND_INTER) %{ + equal(0xb, "np"); + not_equal(0xa, "p"); + less(0x2, "b"); + greater_equal(0x3, "ae"); + less_equal(0x6, "be"); + greater(0x7, "a"); + overflow(0x0, "o"); + no_overflow(0x1, "no"); + %} +%} + + +// Floating comparisons that can be fixed up with extra conditional jumps +operand cmpOpUCF2() %{ + match(Bool); + predicate((n->as_Bool()->_test._test == BoolTest::ne || + n->as_Bool()->_test._test == BoolTest::eq) && + n->in(1)->in(1) != n->in(1)->in(2)); + format %{ "" %} + interface(COND_INTER) %{ + equal(0x4, "e"); + not_equal(0x5, "ne"); + less(0x2, "b"); + greater_equal(0x3, "ae"); + less_equal(0x6, "be"); + greater(0x7, "a"); + overflow(0x0, "o"); + no_overflow(0x1, "no"); + %} +%} + // Operands for bound floating pointer register arguments operand rxmm0() %{ constraint(ALLOC_IN_RC(xmm0_reg)); @@ -2733,11 +6060,6 @@ operand rxmm0() %{ interface(REG_INTER); %} -//----------OPERANDS----------------------------------------------------------- -// Operand definitions must precede instruction definitions for correct parsing -// in the ADLC because operands constitute user defined types which are used in -// instruction definitions. - // Vectors // Dummy generic vector class. Should be used for all vector operands. @@ -2860,7 +6182,503 @@ operand legVecZ() %{ interface(REG_INTER); %} -// INSTRUCTIONS -- Platform independent definitions (same for 32- and 64-bit) +//----------OPERAND CLASSES---------------------------------------------------- +// Operand Classes are groups of operands that are used as to simplify +// instruction definitions by not requiring the AD writer to specify separate +// instructions for every form of operand when the instruction accepts +// multiple operand types with the same basic encoding and format. The classic +// case of this is memory operands. + +opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex, + indIndexScale, indPosIndexScale, indIndexScaleOffset, indPosIndexOffset, indPosIndexScaleOffset, + indCompressedOopOffset, + indirectNarrow, indOffset8Narrow, indOffset32Narrow, + indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow, + indIndexScaleOffsetNarrow, indPosIndexOffsetNarrow, indPosIndexScaleOffsetNarrow); + +//----------PIPELINE----------------------------------------------------------- +// Rules which define the behavior of the target architectures pipeline. +pipeline %{ + +//----------ATTRIBUTES--------------------------------------------------------- +attributes %{ + variable_size_instructions; // Fixed size instructions + max_instructions_per_bundle = 3; // Up to 3 instructions per bundle + instruction_unit_size = 1; // An instruction is 1 bytes long + instruction_fetch_unit_size = 16; // The processor fetches one line + instruction_fetch_units = 1; // of 16 bytes +%} + +//----------RESOURCES---------------------------------------------------------- +// Resources are the functional units available to the machine + +// Generic P2/P3 pipeline +// 3 decoders, only D0 handles big operands; a "bundle" is the limit of +// 3 instructions decoded per cycle. +// 2 load/store ops per cycle, 1 branch, 1 FPU, +// 3 ALU op, only ALU0 handles mul instructions. +resources( D0, D1, D2, DECODE = D0 | D1 | D2, + MS0, MS1, MS2, MEM = MS0 | MS1 | MS2, + BR, FPU, + ALU0, ALU1, ALU2, ALU = ALU0 | ALU1 | ALU2); + +//----------PIPELINE DESCRIPTION----------------------------------------------- +// Pipeline Description specifies the stages in the machine's pipeline + +// Generic P2/P3 pipeline +pipe_desc(S0, S1, S2, S3, S4, S5); + +//----------PIPELINE CLASSES--------------------------------------------------- +// Pipeline Classes describe the stages in which input and output are +// referenced by the hardware pipeline. + +// Naming convention: ialu or fpu +// Then: _reg +// Then: _reg if there is a 2nd register +// Then: _long if it's a pair of instructions implementing a long +// Then: _fat if it requires the big decoder +// Or: _mem if it requires the big decoder and a memory unit. + +// Integer ALU reg operation +pipe_class ialu_reg(rRegI dst) +%{ + single_instruction; + dst : S4(write); + dst : S3(read); + DECODE : S0; // any decoder + ALU : S3; // any alu +%} + +// Long ALU reg operation +pipe_class ialu_reg_long(rRegL dst) +%{ + instruction_count(2); + dst : S4(write); + dst : S3(read); + DECODE : S0(2); // any 2 decoders + ALU : S3(2); // both alus +%} + +// Integer ALU reg operation using big decoder +pipe_class ialu_reg_fat(rRegI dst) +%{ + single_instruction; + dst : S4(write); + dst : S3(read); + D0 : S0; // big decoder only + ALU : S3; // any alu +%} + +// Integer ALU reg-reg operation +pipe_class ialu_reg_reg(rRegI dst, rRegI src) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + DECODE : S0; // any decoder + ALU : S3; // any alu +%} + +// Integer ALU reg-reg operation +pipe_class ialu_reg_reg_fat(rRegI dst, memory src) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + D0 : S0; // big decoder only + ALU : S3; // any alu +%} + +// Integer ALU reg-mem operation +pipe_class ialu_reg_mem(rRegI dst, memory mem) +%{ + single_instruction; + dst : S5(write); + mem : S3(read); + D0 : S0; // big decoder only + ALU : S4; // any alu + MEM : S3; // any mem +%} + +// Integer mem operation (prefetch) +pipe_class ialu_mem(memory mem) +%{ + single_instruction; + mem : S3(read); + D0 : S0; // big decoder only + MEM : S3; // any mem +%} + +// Integer Store to Memory +pipe_class ialu_mem_reg(memory mem, rRegI src) +%{ + single_instruction; + mem : S3(read); + src : S5(read); + D0 : S0; // big decoder only + ALU : S4; // any alu + MEM : S3; +%} + +// // Long Store to Memory +// pipe_class ialu_mem_long_reg(memory mem, rRegL src) +// %{ +// instruction_count(2); +// mem : S3(read); +// src : S5(read); +// D0 : S0(2); // big decoder only; twice +// ALU : S4(2); // any 2 alus +// MEM : S3(2); // Both mems +// %} + +// Integer Store to Memory +pipe_class ialu_mem_imm(memory mem) +%{ + single_instruction; + mem : S3(read); + D0 : S0; // big decoder only + ALU : S4; // any alu + MEM : S3; +%} + +// Integer ALU0 reg-reg operation +pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + D0 : S0; // Big decoder only + ALU0 : S3; // only alu0 +%} + +// Integer ALU0 reg-mem operation +pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) +%{ + single_instruction; + dst : S5(write); + mem : S3(read); + D0 : S0; // big decoder only + ALU0 : S4; // ALU0 only + MEM : S3; // any mem +%} + +// Integer ALU reg-reg operation +pipe_class ialu_cr_reg_reg(rFlagsReg cr, rRegI src1, rRegI src2) +%{ + single_instruction; + cr : S4(write); + src1 : S3(read); + src2 : S3(read); + DECODE : S0; // any decoder + ALU : S3; // any alu +%} + +// Integer ALU reg-imm operation +pipe_class ialu_cr_reg_imm(rFlagsReg cr, rRegI src1) +%{ + single_instruction; + cr : S4(write); + src1 : S3(read); + DECODE : S0; // any decoder + ALU : S3; // any alu +%} + +// Integer ALU reg-mem operation +pipe_class ialu_cr_reg_mem(rFlagsReg cr, rRegI src1, memory src2) +%{ + single_instruction; + cr : S4(write); + src1 : S3(read); + src2 : S3(read); + D0 : S0; // big decoder only + ALU : S4; // any alu + MEM : S3; +%} + +// Conditional move reg-reg +pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y) +%{ + instruction_count(4); + y : S4(read); + q : S3(read); + p : S3(read); + DECODE : S0(4); // any decoder +%} + +// Conditional move reg-reg +pipe_class pipe_cmov_reg( rRegI dst, rRegI src, rFlagsReg cr) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + cr : S3(read); + DECODE : S0; // any decoder +%} + +// Conditional move reg-mem +pipe_class pipe_cmov_mem( rFlagsReg cr, rRegI dst, memory src) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + cr : S3(read); + DECODE : S0; // any decoder + MEM : S3; +%} + +// Conditional move reg-reg long +pipe_class pipe_cmov_reg_long( rFlagsReg cr, rRegL dst, rRegL src) +%{ + single_instruction; + dst : S4(write); + src : S3(read); + cr : S3(read); + DECODE : S0(2); // any 2 decoders +%} + +// Float reg-reg operation +pipe_class fpu_reg(regD dst) +%{ + instruction_count(2); + dst : S3(read); + DECODE : S0(2); // any 2 decoders + FPU : S3; +%} + +// Float reg-reg operation +pipe_class fpu_reg_reg(regD dst, regD src) +%{ + instruction_count(2); + dst : S4(write); + src : S3(read); + DECODE : S0(2); // any 2 decoders + FPU : S3; +%} + +// Float reg-reg operation +pipe_class fpu_reg_reg_reg(regD dst, regD src1, regD src2) +%{ + instruction_count(3); + dst : S4(write); + src1 : S3(read); + src2 : S3(read); + DECODE : S0(3); // any 3 decoders + FPU : S3(2); +%} + +// Float reg-reg operation +pipe_class fpu_reg_reg_reg_reg(regD dst, regD src1, regD src2, regD src3) +%{ + instruction_count(4); + dst : S4(write); + src1 : S3(read); + src2 : S3(read); + src3 : S3(read); + DECODE : S0(4); // any 3 decoders + FPU : S3(2); +%} + +// Float reg-reg operation +pipe_class fpu_reg_mem_reg_reg(regD dst, memory src1, regD src2, regD src3) +%{ + instruction_count(4); + dst : S4(write); + src1 : S3(read); + src2 : S3(read); + src3 : S3(read); + DECODE : S1(3); // any 3 decoders + D0 : S0; // Big decoder only + FPU : S3(2); + MEM : S3; +%} + +// Float reg-mem operation +pipe_class fpu_reg_mem(regD dst, memory mem) +%{ + instruction_count(2); + dst : S5(write); + mem : S3(read); + D0 : S0; // big decoder only + DECODE : S1; // any decoder for FPU POP + FPU : S4; + MEM : S3; // any mem +%} + +// Float reg-mem operation +pipe_class fpu_reg_reg_mem(regD dst, regD src1, memory mem) +%{ + instruction_count(3); + dst : S5(write); + src1 : S3(read); + mem : S3(read); + D0 : S0; // big decoder only + DECODE : S1(2); // any decoder for FPU POP + FPU : S4; + MEM : S3; // any mem +%} + +// Float mem-reg operation +pipe_class fpu_mem_reg(memory mem, regD src) +%{ + instruction_count(2); + src : S5(read); + mem : S3(read); + DECODE : S0; // any decoder for FPU PUSH + D0 : S1; // big decoder only + FPU : S4; + MEM : S3; // any mem +%} + +pipe_class fpu_mem_reg_reg(memory mem, regD src1, regD src2) +%{ + instruction_count(3); + src1 : S3(read); + src2 : S3(read); + mem : S3(read); + DECODE : S0(2); // any decoder for FPU PUSH + D0 : S1; // big decoder only + FPU : S4; + MEM : S3; // any mem +%} + +pipe_class fpu_mem_reg_mem(memory mem, regD src1, memory src2) +%{ + instruction_count(3); + src1 : S3(read); + src2 : S3(read); + mem : S4(read); + DECODE : S0; // any decoder for FPU PUSH + D0 : S0(2); // big decoder only + FPU : S4; + MEM : S3(2); // any mem +%} + +pipe_class fpu_mem_mem(memory dst, memory src1) +%{ + instruction_count(2); + src1 : S3(read); + dst : S4(read); + D0 : S0(2); // big decoder only + MEM : S3(2); // any mem +%} + +pipe_class fpu_mem_mem_mem(memory dst, memory src1, memory src2) +%{ + instruction_count(3); + src1 : S3(read); + src2 : S3(read); + dst : S4(read); + D0 : S0(3); // big decoder only + FPU : S4; + MEM : S3(3); // any mem +%} + +pipe_class fpu_mem_reg_con(memory mem, regD src1) +%{ + instruction_count(3); + src1 : S4(read); + mem : S4(read); + DECODE : S0; // any decoder for FPU PUSH + D0 : S0(2); // big decoder only + FPU : S4; + MEM : S3(2); // any mem +%} + +// Float load constant +pipe_class fpu_reg_con(regD dst) +%{ + instruction_count(2); + dst : S5(write); + D0 : S0; // big decoder only for the load + DECODE : S1; // any decoder for FPU POP + FPU : S4; + MEM : S3; // any mem +%} + +// Float load constant +pipe_class fpu_reg_reg_con(regD dst, regD src) +%{ + instruction_count(3); + dst : S5(write); + src : S3(read); + D0 : S0; // big decoder only for the load + DECODE : S1(2); // any decoder for FPU POP + FPU : S4; + MEM : S3; // any mem +%} + +// UnConditional branch +pipe_class pipe_jmp(label labl) +%{ + single_instruction; + BR : S3; +%} + +// Conditional branch +pipe_class pipe_jcc(cmpOp cmp, rFlagsReg cr, label labl) +%{ + single_instruction; + cr : S1(read); + BR : S3; +%} + +// Allocation idiom +pipe_class pipe_cmpxchg(rRegP dst, rRegP heap_ptr) +%{ + instruction_count(1); force_serialization; + fixed_latency(6); + heap_ptr : S3(read); + DECODE : S0(3); + D0 : S2; + MEM : S3; + ALU : S3(2); + dst : S5(write); + BR : S5; +%} + +// Generic big/slow expanded idiom +pipe_class pipe_slow() +%{ + instruction_count(10); multiple_bundles; force_serialization; + fixed_latency(100); + D0 : S0(2); + MEM : S3(2); +%} + +// The real do-nothing guy +pipe_class empty() +%{ + instruction_count(0); +%} + +// Define the class for the Nop node +define +%{ + MachNop = empty; +%} + +%} + +//----------INSTRUCTIONS------------------------------------------------------- +// +// match -- States which machine-independent subtree may be replaced +// by this instruction. +// ins_cost -- The estimated cost of this instruction is used by instruction +// selection to identify a minimum cost tree of machine +// instructions that matches a tree of machine-independent +// instructions. +// format -- A string providing the disassembly for this instruction. +// The value of an instruction's operand may be inserted +// by referring to it with a '$' prefix. +// opcode -- Three instruction opcodes may be provided. These are referred +// to within an encode class as $primary, $secondary, and $tertiary +// rrspectively. The primary opcode is commonly used to +// indicate the type of machine instruction, while secondary +// and tertiary are often used for prefix options or addressing +// modes. +// ins_encode -- A list of encode classes with parameters. The encode class +// name must have been defined in an 'enc_class' specification +// in the encode section of the architecture description. // ============================================================================ @@ -2878,6 +6696,10516 @@ instruct ShouldNotReachHere() %{ // ============================================================================ +// Dummy reg-to-reg vector moves. Removed during post-selection cleanup. +// Load Float +instruct MoveF2VL(vlRegF dst, regF src) %{ + match(Set dst src); + format %{ "movss $dst,$src\t! load float (4 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Float +instruct MoveF2LEG(legRegF dst, regF src) %{ + match(Set dst src); + format %{ "movss $dst,$src\t# if src != dst load float (4 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Float +instruct MoveVL2F(regF dst, vlRegF src) %{ + match(Set dst src); + format %{ "movss $dst,$src\t! load float (4 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Float +instruct MoveLEG2F(regF dst, legRegF src) %{ + match(Set dst src); + format %{ "movss $dst,$src\t# if src != dst load float (4 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Double +instruct MoveD2VL(vlRegD dst, regD src) %{ + match(Set dst src); + format %{ "movsd $dst,$src\t! load double (8 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Double +instruct MoveD2LEG(legRegD dst, regD src) %{ + match(Set dst src); + format %{ "movsd $dst,$src\t# if src != dst load double (8 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Double +instruct MoveVL2D(regD dst, vlRegD src) %{ + match(Set dst src); + format %{ "movsd $dst,$src\t! load double (8 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +// Load Double +instruct MoveLEG2D(regD dst, legRegD src) %{ + match(Set dst src); + format %{ "movsd $dst,$src\t# if src != dst load double (8 bytes)" %} + ins_encode %{ + ShouldNotReachHere(); + %} + ins_pipe( fpu_reg_reg ); +%} + +//----------Load/Store/Move Instructions--------------------------------------- +//----------Load Instructions-------------------------------------------------- + +// Load Byte (8 bit signed) +instruct loadB(rRegI dst, memory mem) +%{ + match(Set dst (LoadB mem)); + + ins_cost(125); + format %{ "movsbl $dst, $mem\t# byte" %} + + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Byte (8 bit signed) into Long Register +instruct loadB2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadB mem))); + + ins_cost(125); + format %{ "movsbq $dst, $mem\t# byte -> long" %} + + ins_encode %{ + __ movsbq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8 bit UNsigned) +instruct loadUB(rRegI dst, memory mem) +%{ + match(Set dst (LoadUB mem)); + + ins_cost(125); + format %{ "movzbl $dst, $mem\t# ubyte" %} + + ins_encode %{ + __ movzbl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8 bit UNsigned) into Long Register +instruct loadUB2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUB mem))); + + ins_cost(125); + format %{ "movzbq $dst, $mem\t# ubyte -> long" %} + + ins_encode %{ + __ movzbq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register +instruct loadUB2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{ + match(Set dst (ConvI2L (AndI (LoadUB mem) mask))); + effect(KILL cr); + + format %{ "movzbq $dst, $mem\t# ubyte & 32-bit mask -> long\n\t" + "andl $dst, right_n_bits($mask, 8)" %} + ins_encode %{ + Register Rdst = $dst$$Register; + __ movzbq(Rdst, $mem$$Address); + __ andl(Rdst, $mask$$constant & right_n_bits(8)); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Short (16 bit signed) +instruct loadS(rRegI dst, memory mem) +%{ + match(Set dst (LoadS mem)); + + ins_cost(125); + format %{ "movswl $dst, $mem\t# short" %} + + ins_encode %{ + __ movswl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Short (16 bit signed) to Byte (8 bit signed) +instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ + match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour)); + + ins_cost(125); + format %{ "movsbl $dst, $mem\t# short -> byte" %} + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Short (16 bit signed) into Long Register +instruct loadS2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadS mem))); + + ins_cost(125); + format %{ "movswq $dst, $mem\t# short -> long" %} + + ins_encode %{ + __ movswq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) +instruct loadUS(rRegI dst, memory mem) +%{ + match(Set dst (LoadUS mem)); + + ins_cost(125); + format %{ "movzwl $dst, $mem\t# ushort/char" %} + + ins_encode %{ + __ movzwl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed) +instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ + match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour)); + + ins_cost(125); + format %{ "movsbl $dst, $mem\t# ushort -> byte" %} + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) into Long Register +instruct loadUS2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadUS mem))); + + ins_cost(125); + format %{ "movzwq $dst, $mem\t# ushort/char -> long" %} + + ins_encode %{ + __ movzwq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) with mask 0xFF into Long Register +instruct loadUS2L_immI_255(rRegL dst, memory mem, immI_255 mask) %{ + match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); + + format %{ "movzbq $dst, $mem\t# ushort/char & 0xFF -> long" %} + ins_encode %{ + __ movzbq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Short/Char (16 bit UNsigned) with 32-bit mask into Long Register +instruct loadUS2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{ + match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); + effect(KILL cr); + + format %{ "movzwq $dst, $mem\t# ushort/char & 32-bit mask -> long\n\t" + "andl $dst, right_n_bits($mask, 16)" %} + ins_encode %{ + Register Rdst = $dst$$Register; + __ movzwq(Rdst, $mem$$Address); + __ andl(Rdst, $mask$$constant & right_n_bits(16)); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer +instruct loadI(rRegI dst, memory mem) +%{ + match(Set dst (LoadI mem)); + + ins_cost(125); + format %{ "movl $dst, $mem\t# int" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Integer (32 bit signed) to Byte (8 bit signed) +instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{ + match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour)); + + ins_cost(125); + format %{ "movsbl $dst, $mem\t# int -> byte" %} + ins_encode %{ + __ movsbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned) +instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{ + match(Set dst (AndI (LoadI mem) mask)); + + ins_cost(125); + format %{ "movzbl $dst, $mem\t# int -> ubyte" %} + ins_encode %{ + __ movzbl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer (32 bit signed) to Short (16 bit signed) +instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{ + match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen)); + + ins_cost(125); + format %{ "movswl $dst, $mem\t# int -> short" %} + ins_encode %{ + __ movswl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned) +instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{ + match(Set dst (AndI (LoadI mem) mask)); + + ins_cost(125); + format %{ "movzwl $dst, $mem\t# int -> ushort/char" %} + ins_encode %{ + __ movzwl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer into Long Register +instruct loadI2L(rRegL dst, memory mem) +%{ + match(Set dst (ConvI2L (LoadI mem))); + + ins_cost(125); + format %{ "movslq $dst, $mem\t# int -> long" %} + + ins_encode %{ + __ movslq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Integer with mask 0xFF into Long Register +instruct loadI2L_immI_255(rRegL dst, memory mem, immI_255 mask) %{ + match(Set dst (ConvI2L (AndI (LoadI mem) mask))); + + format %{ "movzbq $dst, $mem\t# int & 0xFF -> long" %} + ins_encode %{ + __ movzbq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer with mask 0xFFFF into Long Register +instruct loadI2L_immI_65535(rRegL dst, memory mem, immI_65535 mask) %{ + match(Set dst (ConvI2L (AndI (LoadI mem) mask))); + + format %{ "movzwq $dst, $mem\t# int & 0xFFFF -> long" %} + ins_encode %{ + __ movzwq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Integer with a 31-bit mask into Long Register +instruct loadI2L_immU31(rRegL dst, memory mem, immU31 mask, rFlagsReg cr) %{ + match(Set dst (ConvI2L (AndI (LoadI mem) mask))); + effect(KILL cr); + + format %{ "movl $dst, $mem\t# int & 31-bit mask -> long\n\t" + "andl $dst, $mask" %} + ins_encode %{ + Register Rdst = $dst$$Register; + __ movl(Rdst, $mem$$Address); + __ andl(Rdst, $mask$$constant); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Unsigned Integer into Long Register +instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) +%{ + match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); + + ins_cost(125); + format %{ "movl $dst, $mem\t# uint -> long" %} + + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); +%} + +// Load Long +instruct loadL(rRegL dst, memory mem) +%{ + match(Set dst (LoadL mem)); + + ins_cost(125); + format %{ "movq $dst, $mem\t# long" %} + + ins_encode %{ + __ movq($dst$$Register, $mem$$Address); + %} + + ins_pipe(ialu_reg_mem); // XXX +%} + +// Load Range +instruct loadRange(rRegI dst, memory mem) +%{ + match(Set dst (LoadRange mem)); + + ins_cost(125); // XXX + format %{ "movl $dst, $mem\t# range" %} + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Pointer +instruct loadP(rRegP dst, memory mem) +%{ + match(Set dst (LoadP mem)); + predicate(n->as_Load()->barrier_data() == 0); + + ins_cost(125); // XXX + format %{ "movq $dst, $mem\t# ptr" %} + ins_encode %{ + __ movq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); // XXX +%} + +// Load Compressed Pointer +instruct loadN(rRegN dst, memory mem) +%{ + predicate(n->as_Load()->barrier_data() == 0); + match(Set dst (LoadN mem)); + + ins_cost(125); // XXX + format %{ "movl $dst, $mem\t# compressed ptr" %} + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); // XXX +%} + + +// Load Klass Pointer +instruct loadKlass(rRegP dst, memory mem) +%{ + match(Set dst (LoadKlass mem)); + + ins_cost(125); // XXX + format %{ "movq $dst, $mem\t# class" %} + ins_encode %{ + __ movq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); // XXX +%} + +// Load narrow Klass Pointer +instruct loadNKlass(rRegN dst, memory mem) +%{ + predicate(!UseCompactObjectHeaders); + match(Set dst (LoadNKlass mem)); + + ins_cost(125); // XXX + format %{ "movl $dst, $mem\t# compressed klass ptr" %} + ins_encode %{ + __ movl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_mem); // XXX +%} + +instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr) +%{ + predicate(UseCompactObjectHeaders); + match(Set dst (LoadNKlass mem)); + effect(KILL cr); + ins_cost(125); + format %{ + "movl $dst, $mem\t# compressed klass ptr, shifted\n\t" + "shrl $dst, markWord::klass_shift_at_offset" + %} + ins_encode %{ + if (UseAPX) { + __ eshrl($dst$$Register, $mem$$Address, markWord::klass_shift_at_offset, false); + } + else { + __ movl($dst$$Register, $mem$$Address); + __ shrl($dst$$Register, markWord::klass_shift_at_offset); + } + %} + ins_pipe(ialu_reg_mem); +%} + +// Load Float +instruct loadF(regF dst, memory mem) +%{ + match(Set dst (LoadF mem)); + + ins_cost(145); // XXX + format %{ "movss $dst, $mem\t# float" %} + ins_encode %{ + __ movflt($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +// Load Double +instruct loadD_partial(regD dst, memory mem) +%{ + predicate(!UseXmmLoadAndClearUpper); + match(Set dst (LoadD mem)); + + ins_cost(145); // XXX + format %{ "movlpd $dst, $mem\t# double" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct loadD(regD dst, memory mem) +%{ + predicate(UseXmmLoadAndClearUpper); + match(Set dst (LoadD mem)); + + ins_cost(145); // XXX + format %{ "movsd $dst, $mem\t# double" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, $mem$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +// max = java.lang.Math.max(float a, float b) +instruct maxF_avx10_reg(regF dst, regF a, regF b) %{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (MaxF a b)); + format %{ "maxF $dst, $a, $b" %} + ins_encode %{ + __ eminmaxss($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MAX_COMPARE_SIGN); + %} + ins_pipe( pipe_slow ); +%} + +// max = java.lang.Math.max(float a, float b) +instruct maxF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp, legRegF btmp) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); + match(Set dst (MaxF a b)); + effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); + format %{ "maxF $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} + ins_encode %{ + __ vminmax_fp(Op_MaxV, T_FLOAT, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); + %} + ins_pipe( pipe_slow ); +%} + +instruct maxF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xtmp, rRegI rtmp, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); + match(Set dst (MaxF a b)); + effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); + + format %{ "maxF_reduction $dst, $a, $b \t!using $xtmp and $rtmp as TEMP" %} + ins_encode %{ + emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, + false /*min*/, true /*single*/); + %} + ins_pipe( pipe_slow ); +%} + +// max = java.lang.Math.max(double a, double b) +instruct maxD_avx10_reg(regD dst, regD a, regD b) %{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (MaxD a b)); + format %{ "maxD $dst, $a, $b" %} + ins_encode %{ + __ eminmaxsd($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MAX_COMPARE_SIGN); + %} + ins_pipe( pipe_slow ); +%} + +// max = java.lang.Math.max(double a, double b) +instruct maxD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp, legRegD btmp) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); + match(Set dst (MaxD a b)); + effect(USE a, USE b, TEMP atmp, TEMP btmp, TEMP tmp); + format %{ "maxD $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} + ins_encode %{ + __ vminmax_fp(Op_MaxV, T_DOUBLE, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); + %} + ins_pipe( pipe_slow ); +%} + +instruct maxD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xtmp, rRegL rtmp, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); + match(Set dst (MaxD a b)); + effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); + + format %{ "maxD_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} + ins_encode %{ + emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, + false /*min*/, false /*single*/); + %} + ins_pipe( pipe_slow ); +%} + +// max = java.lang.Math.min(float a, float b) +instruct minF_avx10_reg(regF dst, regF a, regF b) %{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (MinF a b)); + format %{ "minF $dst, $a, $b" %} + ins_encode %{ + __ eminmaxss($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MIN_COMPARE_SIGN); + %} + ins_pipe( pipe_slow ); +%} + +// min = java.lang.Math.min(float a, float b) +instruct minF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp, legRegF btmp) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); + match(Set dst (MinF a b)); + effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); + format %{ "minF $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} + ins_encode %{ + __ vminmax_fp(Op_MinV, T_FLOAT, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); + %} + ins_pipe( pipe_slow ); +%} + +instruct minF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xtmp, rRegI rtmp, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); + match(Set dst (MinF a b)); + effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); + + format %{ "minF_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} + ins_encode %{ + emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, + true /*min*/, true /*single*/); + %} + ins_pipe( pipe_slow ); +%} + +// max = java.lang.Math.min(double a, double b) +instruct minD_avx10_reg(regD dst, regD a, regD b) %{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (MinD a b)); + format %{ "minD $dst, $a, $b" %} + ins_encode %{ + __ eminmaxsd($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MIN_COMPARE_SIGN); + %} + ins_pipe( pipe_slow ); +%} + +// min = java.lang.Math.min(double a, double b) +instruct minD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp, legRegD btmp) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); + match(Set dst (MinD a b)); + effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); + format %{ "minD $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} + ins_encode %{ + __ vminmax_fp(Op_MinV, T_DOUBLE, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); + %} + ins_pipe( pipe_slow ); +%} + +instruct minD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xtmp, rRegL rtmp, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); + match(Set dst (MinD a b)); + effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); + + format %{ "maxD_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} + ins_encode %{ + emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, + true /*min*/, false /*single*/); + %} + ins_pipe( pipe_slow ); +%} + +// Load Effective Address +instruct leaP8(rRegP dst, indOffset8 mem) +%{ + match(Set dst mem); + + ins_cost(110); // XXX + format %{ "leaq $dst, $mem\t# ptr 8" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaP32(rRegP dst, indOffset32 mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr 32" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxOff(rRegP dst, indIndexOffset mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxoff" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxScale(rRegP dst, indIndexScale mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxscale" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPPosIdxScale(rRegP dst, indPosIndexScale mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxscale" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxScaleOff(rRegP dst, indIndexScaleOffset mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxscaleoff" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPPosIdxOff(rRegP dst, indPosIndexOffset mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr posidxoff" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPPosIdxScaleOff(rRegP dst, indPosIndexScaleOffset mem) +%{ + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr posidxscaleoff" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +// Load Effective Address which uses Narrow (32-bits) oop +instruct leaPCompressedOopOffset(rRegP dst, indCompressedOopOffset mem) +%{ + predicate(UseCompressedOops && (CompressedOops::shift() != 0)); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr compressedoopoff32" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaP8Narrow(rRegP dst, indOffset8Narrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); // XXX + format %{ "leaq $dst, $mem\t# ptr off8narrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaP32Narrow(rRegP dst, indOffset32Narrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr off32narrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxOffNarrow(rRegP dst, indIndexOffsetNarrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxoffnarrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxScaleNarrow(rRegP dst, indIndexScaleNarrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxscalenarrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPIdxScaleOffNarrow(rRegP dst, indIndexScaleOffsetNarrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr idxscaleoffnarrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPPosIdxOffNarrow(rRegP dst, indPosIndexOffsetNarrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr posidxoffnarrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct leaPPosIdxScaleOffNarrow(rRegP dst, indPosIndexScaleOffsetNarrow mem) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst mem); + + ins_cost(110); + format %{ "leaq $dst, $mem\t# ptr posidxscaleoffnarrow" %} + ins_encode %{ + __ leaq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg_reg_fat); +%} + +instruct loadConI(rRegI dst, immI src) +%{ + match(Set dst src); + + format %{ "movl $dst, $src\t# int" %} + ins_encode %{ + __ movl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg_fat); // XXX +%} + +instruct loadConI0(rRegI dst, immI_0 src, rFlagsReg cr) +%{ + match(Set dst src); + effect(KILL cr); + + ins_cost(50); + format %{ "xorl $dst, $dst\t# int" %} + ins_encode %{ + __ xorl($dst$$Register, $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConL(rRegL dst, immL src) +%{ + match(Set dst src); + + ins_cost(150); + format %{ "movq $dst, $src\t# long" %} + ins_encode %{ + __ mov64($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConL0(rRegL dst, immL0 src, rFlagsReg cr) +%{ + match(Set dst src); + effect(KILL cr); + + ins_cost(50); + format %{ "xorl $dst, $dst\t# long" %} + ins_encode %{ + __ xorl($dst$$Register, $dst$$Register); + %} + ins_pipe(ialu_reg); // XXX +%} + +instruct loadConUL32(rRegL dst, immUL32 src) +%{ + match(Set dst src); + + ins_cost(60); + format %{ "movl $dst, $src\t# long (unsigned 32-bit)" %} + ins_encode %{ + __ movl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConL32(rRegL dst, immL32 src) +%{ + match(Set dst src); + + ins_cost(70); + format %{ "movq $dst, $src\t# long (32-bit)" %} + ins_encode %{ + __ movq($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConP(rRegP dst, immP con) %{ + match(Set dst con); + + format %{ "movq $dst, $con\t# ptr" %} + ins_encode %{ + __ mov64($dst$$Register, $con$$constant, $con->constant_reloc(), RELOC_IMM64); + %} + ins_pipe(ialu_reg_fat); // XXX +%} + +instruct loadConP0(rRegP dst, immP0 src, rFlagsReg cr) +%{ + match(Set dst src); + effect(KILL cr); + + ins_cost(50); + format %{ "xorl $dst, $dst\t# ptr" %} + ins_encode %{ + __ xorl($dst$$Register, $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConP31(rRegP dst, immP31 src, rFlagsReg cr) +%{ + match(Set dst src); + effect(KILL cr); + + ins_cost(60); + format %{ "movl $dst, $src\t# ptr (positive 32-bit)" %} + ins_encode %{ + __ movl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConF(regF dst, immF con) %{ + match(Set dst con); + ins_cost(125); + format %{ "movss $dst, [$constantaddress]\t# load from constant table: float=$con" %} + ins_encode %{ + __ movflt($dst$$XMMRegister, $constantaddress($con)); + %} + ins_pipe(pipe_slow); +%} + +instruct loadConH(regF dst, immH con) %{ + match(Set dst con); + ins_cost(125); + format %{ "movss $dst, [$constantaddress]\t# load from constant table: halffloat=$con" %} + ins_encode %{ + __ movflt($dst$$XMMRegister, $constantaddress($con)); + %} + ins_pipe(pipe_slow); +%} + +instruct loadConN0(rRegN dst, immN0 src, rFlagsReg cr) %{ + match(Set dst src); + effect(KILL cr); + format %{ "xorq $dst, $src\t# compressed null pointer" %} + ins_encode %{ + __ xorq($dst$$Register, $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct loadConN(rRegN dst, immN src) %{ + match(Set dst src); + + ins_cost(125); + format %{ "movl $dst, $src\t# compressed ptr" %} + ins_encode %{ + address con = (address)$src$$constant; + if (con == nullptr) { + ShouldNotReachHere(); + } else { + __ set_narrow_oop($dst$$Register, (jobject)$src$$constant); + } + %} + ins_pipe(ialu_reg_fat); // XXX +%} + +instruct loadConNKlass(rRegN dst, immNKlass src) %{ + match(Set dst src); + + ins_cost(125); + format %{ "movl $dst, $src\t# compressed klass ptr" %} + ins_encode %{ + address con = (address)$src$$constant; + if (con == nullptr) { + ShouldNotReachHere(); + } else { + __ set_narrow_klass($dst$$Register, (Klass*)$src$$constant); + } + %} + ins_pipe(ialu_reg_fat); // XXX +%} + +instruct loadConF0(regF dst, immF0 src) +%{ + match(Set dst src); + ins_cost(100); + + format %{ "xorps $dst, $dst\t# float 0.0" %} + ins_encode %{ + __ xorps($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +// Use the same format since predicate() can not be used here. +instruct loadConD(regD dst, immD con) %{ + match(Set dst con); + ins_cost(125); + format %{ "movsd $dst, [$constantaddress]\t# load from constant table: double=$con" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, $constantaddress($con)); + %} + ins_pipe(pipe_slow); +%} + +instruct loadConD0(regD dst, immD0 src) +%{ + match(Set dst src); + ins_cost(100); + + format %{ "xorpd $dst, $dst\t# double 0.0" %} + ins_encode %{ + __ xorpd($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct loadSSI(rRegI dst, stackSlotI src) +%{ + match(Set dst src); + + ins_cost(125); + format %{ "movl $dst, $src\t# int stk" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct loadSSL(rRegL dst, stackSlotL src) +%{ + match(Set dst src); + + ins_cost(125); + format %{ "movq $dst, $src\t# long stk" %} + ins_encode %{ + __ movq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct loadSSP(rRegP dst, stackSlotP src) +%{ + match(Set dst src); + + ins_cost(125); + format %{ "movq $dst, $src\t# ptr stk" %} + ins_encode %{ + __ movq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct loadSSF(regF dst, stackSlotF src) +%{ + match(Set dst src); + + ins_cost(125); + format %{ "movss $dst, $src\t# float stk" %} + ins_encode %{ + __ movflt($dst$$XMMRegister, Address(rsp, $src$$disp)); + %} + ins_pipe(pipe_slow); // XXX +%} + +// Use the same format since predicate() can not be used here. +instruct loadSSD(regD dst, stackSlotD src) +%{ + match(Set dst src); + + ins_cost(125); + format %{ "movsd $dst, $src\t# double stk" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); + %} + ins_pipe(pipe_slow); // XXX +%} + +// Prefetch instructions for allocation. +// Must be safe to execute with invalid address (cannot fault). + +instruct prefetchAlloc( memory mem ) %{ + predicate(AllocatePrefetchInstr==3); + match(PrefetchAllocation mem); + ins_cost(125); + + format %{ "PREFETCHW $mem\t# Prefetch allocation into level 1 cache and mark modified" %} + ins_encode %{ + __ prefetchw($mem$$Address); + %} + ins_pipe(ialu_mem); +%} + +instruct prefetchAllocNTA( memory mem ) %{ + predicate(AllocatePrefetchInstr==0); + match(PrefetchAllocation mem); + ins_cost(125); + + format %{ "PREFETCHNTA $mem\t# Prefetch allocation to non-temporal cache for write" %} + ins_encode %{ + __ prefetchnta($mem$$Address); + %} + ins_pipe(ialu_mem); +%} + +instruct prefetchAllocT0( memory mem ) %{ + predicate(AllocatePrefetchInstr==1); + match(PrefetchAllocation mem); + ins_cost(125); + + format %{ "PREFETCHT0 $mem\t# Prefetch allocation to level 1 and 2 caches for write" %} + ins_encode %{ + __ prefetcht0($mem$$Address); + %} + ins_pipe(ialu_mem); +%} + +instruct prefetchAllocT2( memory mem ) %{ + predicate(AllocatePrefetchInstr==2); + match(PrefetchAllocation mem); + ins_cost(125); + + format %{ "PREFETCHT2 $mem\t# Prefetch allocation to level 2 cache for write" %} + ins_encode %{ + __ prefetcht2($mem$$Address); + %} + ins_pipe(ialu_mem); +%} + +//----------Store Instructions------------------------------------------------- + +// Store Byte +instruct storeB(memory mem, rRegI src) +%{ + match(Set mem (StoreB mem src)); + + ins_cost(125); // XXX + format %{ "movb $mem, $src\t# byte" %} + ins_encode %{ + __ movb($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Store Char/Short +instruct storeC(memory mem, rRegI src) +%{ + match(Set mem (StoreC mem src)); + + ins_cost(125); // XXX + format %{ "movw $mem, $src\t# char/short" %} + ins_encode %{ + __ movw($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Store Integer +instruct storeI(memory mem, rRegI src) +%{ + match(Set mem (StoreI mem src)); + + ins_cost(125); // XXX + format %{ "movl $mem, $src\t# int" %} + ins_encode %{ + __ movl($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Store Long +instruct storeL(memory mem, rRegL src) +%{ + match(Set mem (StoreL mem src)); + + ins_cost(125); // XXX + format %{ "movq $mem, $src\t# long" %} + ins_encode %{ + __ movq($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); // XXX +%} + +// Store Pointer +instruct storeP(memory mem, any_RegP src) +%{ + predicate(n->as_Store()->barrier_data() == 0); + match(Set mem (StoreP mem src)); + + ins_cost(125); // XXX + format %{ "movq $mem, $src\t# ptr" %} + ins_encode %{ + __ movq($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmP0(memory mem, immP0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr) && n->as_Store()->barrier_data() == 0); + match(Set mem (StoreP mem zero)); + + ins_cost(125); // XXX + format %{ "movq $mem, R12\t# ptr (R12_heapbase==0)" %} + ins_encode %{ + __ movq($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +// Store Null Pointer, mark word, or other simple pointer constant. +instruct storeImmP(memory mem, immP31 src) +%{ + predicate(n->as_Store()->barrier_data() == 0); + match(Set mem (StoreP mem src)); + + ins_cost(150); // XXX + format %{ "movq $mem, $src\t# ptr" %} + ins_encode %{ + __ movq($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Compressed Pointer +instruct storeN(memory mem, rRegN src) +%{ + predicate(n->as_Store()->barrier_data() == 0); + match(Set mem (StoreN mem src)); + + ins_cost(125); // XXX + format %{ "movl $mem, $src\t# compressed ptr" %} + ins_encode %{ + __ movl($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeNKlass(memory mem, rRegN src) +%{ + match(Set mem (StoreNKlass mem src)); + + ins_cost(125); // XXX + format %{ "movl $mem, $src\t# compressed klass ptr" %} + ins_encode %{ + __ movl($mem$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmN0(memory mem, immN0 zero) +%{ + predicate(CompressedOops::base() == nullptr && n->as_Store()->barrier_data() == 0); + match(Set mem (StoreN mem zero)); + + ins_cost(125); // XXX + format %{ "movl $mem, R12\t# compressed ptr (R12_heapbase==0)" %} + ins_encode %{ + __ movl($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmN(memory mem, immN src) +%{ + predicate(n->as_Store()->barrier_data() == 0); + match(Set mem (StoreN mem src)); + + ins_cost(150); // XXX + format %{ "movl $mem, $src\t# compressed ptr" %} + ins_encode %{ + address con = (address)$src$$constant; + if (con == nullptr) { + __ movl($mem$$Address, 0); + } else { + __ set_narrow_oop($mem$$Address, (jobject)$src$$constant); + } + %} + ins_pipe(ialu_mem_imm); +%} + +instruct storeImmNKlass(memory mem, immNKlass src) +%{ + match(Set mem (StoreNKlass mem src)); + + ins_cost(150); // XXX + format %{ "movl $mem, $src\t# compressed klass ptr" %} + ins_encode %{ + __ set_narrow_klass($mem$$Address, (Klass*)$src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Integer Immediate +instruct storeImmI0(memory mem, immI_0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreI mem zero)); + + ins_cost(125); // XXX + format %{ "movl $mem, R12\t# int (R12_heapbase==0)" %} + ins_encode %{ + __ movl($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmI(memory mem, immI src) +%{ + match(Set mem (StoreI mem src)); + + ins_cost(150); + format %{ "movl $mem, $src\t# int" %} + ins_encode %{ + __ movl($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Long Immediate +instruct storeImmL0(memory mem, immL0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreL mem zero)); + + ins_cost(125); // XXX + format %{ "movq $mem, R12\t# long (R12_heapbase==0)" %} + ins_encode %{ + __ movq($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmL(memory mem, immL32 src) +%{ + match(Set mem (StoreL mem src)); + + ins_cost(150); + format %{ "movq $mem, $src\t# long" %} + ins_encode %{ + __ movq($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Short/Char Immediate +instruct storeImmC0(memory mem, immI_0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreC mem zero)); + + ins_cost(125); // XXX + format %{ "movw $mem, R12\t# short/char (R12_heapbase==0)" %} + ins_encode %{ + __ movw($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmI16(memory mem, immI16 src) +%{ + predicate(UseStoreImmI16); + match(Set mem (StoreC mem src)); + + ins_cost(150); + format %{ "movw $mem, $src\t# short/char" %} + ins_encode %{ + __ movw($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Byte Immediate +instruct storeImmB0(memory mem, immI_0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreB mem zero)); + + ins_cost(125); // XXX + format %{ "movb $mem, R12\t# short/char (R12_heapbase==0)" %} + ins_encode %{ + __ movb($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeImmB(memory mem, immI8 src) +%{ + match(Set mem (StoreB mem src)); + + ins_cost(150); // XXX + format %{ "movb $mem, $src\t# byte" %} + ins_encode %{ + __ movb($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Float +instruct storeF(memory mem, regF src) +%{ + match(Set mem (StoreF mem src)); + + ins_cost(95); // XXX + format %{ "movss $mem, $src\t# float" %} + ins_encode %{ + __ movflt($mem$$Address, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +// Store immediate Float value (it is faster than store from XMM register) +instruct storeF0(memory mem, immF0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreF mem zero)); + + ins_cost(25); // XXX + format %{ "movl $mem, R12\t# float 0. (R12_heapbase==0)" %} + ins_encode %{ + __ movl($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeF_imm(memory mem, immF src) +%{ + match(Set mem (StoreF mem src)); + + ins_cost(50); + format %{ "movl $mem, $src\t# float" %} + ins_encode %{ + __ movl($mem$$Address, jint_cast($src$$constant)); + %} + ins_pipe(ialu_mem_imm); +%} + +// Store Double +instruct storeD(memory mem, regD src) +%{ + match(Set mem (StoreD mem src)); + + ins_cost(95); // XXX + format %{ "movsd $mem, $src\t# double" %} + ins_encode %{ + __ movdbl($mem$$Address, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +// Store immediate double 0.0 (it is faster than store from XMM register) +instruct storeD0_imm(memory mem, immD0 src) +%{ + predicate(!UseCompressedOops || (CompressedOops::base() != nullptr)); + match(Set mem (StoreD mem src)); + + ins_cost(50); + format %{ "movq $mem, $src\t# double 0." %} + ins_encode %{ + __ movq($mem$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct storeD0(memory mem, immD0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); + match(Set mem (StoreD mem zero)); + + ins_cost(25); // XXX + format %{ "movq $mem, R12\t# double 0. (R12_heapbase==0)" %} + ins_encode %{ + __ movq($mem$$Address, r12); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeSSI(stackSlotI dst, rRegI src) +%{ + match(Set dst src); + + ins_cost(100); + format %{ "movl $dst, $src\t# int stk" %} + ins_encode %{ + __ movl($dst$$Address, $src$$Register); + %} + ins_pipe( ialu_mem_reg ); +%} + +instruct storeSSL(stackSlotL dst, rRegL src) +%{ + match(Set dst src); + + ins_cost(100); + format %{ "movq $dst, $src\t# long stk" %} + ins_encode %{ + __ movq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeSSP(stackSlotP dst, rRegP src) +%{ + match(Set dst src); + + ins_cost(100); + format %{ "movq $dst, $src\t# ptr stk" %} + ins_encode %{ + __ movq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct storeSSF(stackSlotF dst, regF src) +%{ + match(Set dst src); + + ins_cost(95); // XXX + format %{ "movss $dst, $src\t# float stk" %} + ins_encode %{ + __ movflt(Address(rsp, $dst$$disp), $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct storeSSD(stackSlotD dst, regD src) +%{ + match(Set dst src); + + ins_cost(95); // XXX + format %{ "movsd $dst, $src\t# double stk" %} + ins_encode %{ + __ movdbl(Address(rsp, $dst$$disp), $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct cacheWB(indirect addr) +%{ + predicate(VM_Version::supports_data_cache_line_flush()); + match(CacheWB addr); + + ins_cost(100); + format %{"cache wb $addr" %} + ins_encode %{ + assert($addr->index_position() < 0, "should be"); + assert($addr$$disp == 0, "should be"); + __ cache_wb(Address($addr$$base$$Register, 0)); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct cacheWBPreSync() +%{ + predicate(VM_Version::supports_data_cache_line_flush()); + match(CacheWBPreSync); + + ins_cost(100); + format %{"cache wb presync" %} + ins_encode %{ + __ cache_wbsync(true); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct cacheWBPostSync() +%{ + predicate(VM_Version::supports_data_cache_line_flush()); + match(CacheWBPostSync); + + ins_cost(100); + format %{"cache wb postsync" %} + ins_encode %{ + __ cache_wbsync(false); + %} + ins_pipe(pipe_slow); // XXX +%} + +//----------BSWAP Instructions------------------------------------------------- +instruct bytes_reverse_int(rRegI dst) %{ + match(Set dst (ReverseBytesI dst)); + + format %{ "bswapl $dst" %} + ins_encode %{ + __ bswapl($dst$$Register); + %} + ins_pipe( ialu_reg ); +%} + +instruct bytes_reverse_long(rRegL dst) %{ + match(Set dst (ReverseBytesL dst)); + + format %{ "bswapq $dst" %} + ins_encode %{ + __ bswapq($dst$$Register); + %} + ins_pipe( ialu_reg); +%} + +instruct bytes_reverse_unsigned_short(rRegI dst, rFlagsReg cr) %{ + match(Set dst (ReverseBytesUS dst)); + effect(KILL cr); + + format %{ "bswapl $dst\n\t" + "shrl $dst,16\n\t" %} + ins_encode %{ + __ bswapl($dst$$Register); + __ shrl($dst$$Register, 16); + %} + ins_pipe( ialu_reg ); +%} + +instruct bytes_reverse_short(rRegI dst, rFlagsReg cr) %{ + match(Set dst (ReverseBytesS dst)); + effect(KILL cr); + + format %{ "bswapl $dst\n\t" + "sar $dst,16\n\t" %} + ins_encode %{ + __ bswapl($dst$$Register); + __ sarl($dst$$Register, 16); + %} + ins_pipe( ialu_reg ); +%} + +//---------- Zeros Count Instructions ------------------------------------------ + +instruct countLeadingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{ + predicate(UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosI src)); + effect(KILL cr); + + format %{ "lzcntl $dst, $src\t# count leading zeros (int)" %} + ins_encode %{ + __ lzcntl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct countLeadingZerosI_mem(rRegI dst, memory src, rFlagsReg cr) %{ + predicate(UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosI (LoadI src))); + effect(KILL cr); + ins_cost(175); + format %{ "lzcntl $dst, $src\t# count leading zeros (int)" %} + ins_encode %{ + __ lzcntl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, rFlagsReg cr) %{ + predicate(!UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosI src)); + effect(KILL cr); + + format %{ "bsrl $dst, $src\t# count leading zeros (int)\n\t" + "jnz skip\n\t" + "movl $dst, -1\n" + "skip:\n\t" + "negl $dst\n\t" + "addl $dst, 31" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Register Rsrc = $src$$Register; + Label skip; + __ bsrl(Rdst, Rsrc); + __ jccb(Assembler::notZero, skip); + __ movl(Rdst, -1); + __ bind(skip); + __ negl(Rdst); + __ addl(Rdst, BitsPerInt - 1); + %} + ins_pipe(ialu_reg); +%} + +instruct countLeadingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{ + predicate(UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosL src)); + effect(KILL cr); + + format %{ "lzcntq $dst, $src\t# count leading zeros (long)" %} + ins_encode %{ + __ lzcntq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct countLeadingZerosL_mem(rRegI dst, memory src, rFlagsReg cr) %{ + predicate(UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosL (LoadL src))); + effect(KILL cr); + ins_cost(175); + format %{ "lzcntq $dst, $src\t# count leading zeros (long)" %} + ins_encode %{ + __ lzcntq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct countLeadingZerosL_bsr(rRegI dst, rRegL src, rFlagsReg cr) %{ + predicate(!UseCountLeadingZerosInstruction); + match(Set dst (CountLeadingZerosL src)); + effect(KILL cr); + + format %{ "bsrq $dst, $src\t# count leading zeros (long)\n\t" + "jnz skip\n\t" + "movl $dst, -1\n" + "skip:\n\t" + "negl $dst\n\t" + "addl $dst, 63" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Register Rsrc = $src$$Register; + Label skip; + __ bsrq(Rdst, Rsrc); + __ jccb(Assembler::notZero, skip); + __ movl(Rdst, -1); + __ bind(skip); + __ negl(Rdst); + __ addl(Rdst, BitsPerLong - 1); + %} + ins_pipe(ialu_reg); +%} + +instruct countTrailingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{ + predicate(UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosI src)); + effect(KILL cr); + + format %{ "tzcntl $dst, $src\t# count trailing zeros (int)" %} + ins_encode %{ + __ tzcntl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct countTrailingZerosI_mem(rRegI dst, memory src, rFlagsReg cr) %{ + predicate(UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosI (LoadI src))); + effect(KILL cr); + ins_cost(175); + format %{ "tzcntl $dst, $src\t# count trailing zeros (int)" %} + ins_encode %{ + __ tzcntl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct countTrailingZerosI_bsf(rRegI dst, rRegI src, rFlagsReg cr) %{ + predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosI src)); + effect(KILL cr); + + format %{ "bsfl $dst, $src\t# count trailing zeros (int)\n\t" + "jnz done\n\t" + "movl $dst, 32\n" + "done:" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Label done; + __ bsfl(Rdst, $src$$Register); + __ jccb(Assembler::notZero, done); + __ movl(Rdst, BitsPerInt); + __ bind(done); + %} + ins_pipe(ialu_reg); +%} + +instruct countTrailingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{ + predicate(UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosL src)); + effect(KILL cr); + + format %{ "tzcntq $dst, $src\t# count trailing zeros (long)" %} + ins_encode %{ + __ tzcntq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct countTrailingZerosL_mem(rRegI dst, memory src, rFlagsReg cr) %{ + predicate(UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosL (LoadL src))); + effect(KILL cr); + ins_cost(175); + format %{ "tzcntq $dst, $src\t# count trailing zeros (long)" %} + ins_encode %{ + __ tzcntq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct countTrailingZerosL_bsf(rRegI dst, rRegL src, rFlagsReg cr) %{ + predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosL src)); + effect(KILL cr); + + format %{ "bsfq $dst, $src\t# count trailing zeros (long)\n\t" + "jnz done\n\t" + "movl $dst, 64\n" + "done:" %} + ins_encode %{ + Register Rdst = $dst$$Register; + Label done; + __ bsfq(Rdst, $src$$Register); + __ jccb(Assembler::notZero, done); + __ movl(Rdst, BitsPerLong); + __ bind(done); + %} + ins_pipe(ialu_reg); +%} + +//--------------- Reverse Operation Instructions ---------------- +instruct bytes_reversebit_int(rRegI dst, rRegI src, rRegI rtmp, rFlagsReg cr) %{ + predicate(!VM_Version::supports_gfni()); + match(Set dst (ReverseI src)); + effect(TEMP dst, TEMP rtmp, KILL cr); + format %{ "reverse_int $dst $src\t! using $rtmp as TEMP" %} + ins_encode %{ + __ reverseI($dst$$Register, $src$$Register, xnoreg, xnoreg, $rtmp$$Register); + %} + ins_pipe( ialu_reg ); +%} + +instruct bytes_reversebit_int_gfni(rRegI dst, rRegI src, vlRegF xtmp1, vlRegF xtmp2, rRegL rtmp, rFlagsReg cr) %{ + predicate(VM_Version::supports_gfni()); + match(Set dst (ReverseI src)); + effect(TEMP dst, TEMP xtmp1, TEMP xtmp2, TEMP rtmp, KILL cr); + format %{ "reverse_int $dst $src\t! using $rtmp, $xtmp1 and $xtmp2 as TEMP" %} + ins_encode %{ + __ reverseI($dst$$Register, $src$$Register, $xtmp1$$XMMRegister, $xtmp2$$XMMRegister, $rtmp$$Register); + %} + ins_pipe( ialu_reg ); +%} + +instruct bytes_reversebit_long(rRegL dst, rRegL src, rRegL rtmp1, rRegL rtmp2, rFlagsReg cr) %{ + predicate(!VM_Version::supports_gfni()); + match(Set dst (ReverseL src)); + effect(TEMP dst, TEMP rtmp1, TEMP rtmp2, KILL cr); + format %{ "reverse_long $dst $src\t! using $rtmp1 and $rtmp2 as TEMP" %} + ins_encode %{ + __ reverseL($dst$$Register, $src$$Register, xnoreg, xnoreg, $rtmp1$$Register, $rtmp2$$Register); + %} + ins_pipe( ialu_reg ); +%} + +instruct bytes_reversebit_long_gfni(rRegL dst, rRegL src, vlRegD xtmp1, vlRegD xtmp2, rRegL rtmp, rFlagsReg cr) %{ + predicate(VM_Version::supports_gfni()); + match(Set dst (ReverseL src)); + effect(TEMP dst, TEMP xtmp1, TEMP xtmp2, TEMP rtmp, KILL cr); + format %{ "reverse_long $dst $src\t! using $rtmp, $xtmp1 and $xtmp2 as TEMP" %} + ins_encode %{ + __ reverseL($dst$$Register, $src$$Register, $xtmp1$$XMMRegister, $xtmp2$$XMMRegister, $rtmp$$Register, noreg); + %} + ins_pipe( ialu_reg ); +%} + +//---------- Population Count Instructions ------------------------------------- + +instruct popCountI(rRegI dst, rRegI src, rFlagsReg cr) %{ + predicate(UsePopCountInstruction); + match(Set dst (PopCountI src)); + effect(KILL cr); + + format %{ "popcnt $dst, $src" %} + ins_encode %{ + __ popcntl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct popCountI_mem(rRegI dst, memory mem, rFlagsReg cr) %{ + predicate(UsePopCountInstruction); + match(Set dst (PopCountI (LoadI mem))); + effect(KILL cr); + + format %{ "popcnt $dst, $mem" %} + ins_encode %{ + __ popcntl($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg); +%} + +// Note: Long.bitCount(long) returns an int. +instruct popCountL(rRegI dst, rRegL src, rFlagsReg cr) %{ + predicate(UsePopCountInstruction); + match(Set dst (PopCountL src)); + effect(KILL cr); + + format %{ "popcnt $dst, $src" %} + ins_encode %{ + __ popcntq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Note: Long.bitCount(long) returns an int. +instruct popCountL_mem(rRegI dst, memory mem, rFlagsReg cr) %{ + predicate(UsePopCountInstruction); + match(Set dst (PopCountL (LoadL mem))); + effect(KILL cr); + + format %{ "popcnt $dst, $mem" %} + ins_encode %{ + __ popcntq($dst$$Register, $mem$$Address); + %} + ins_pipe(ialu_reg); +%} + + +//----------MemBar Instructions----------------------------------------------- +// Memory barrier flavors + +instruct membar_acquire() +%{ + match(MemBarAcquire); + match(LoadFence); + ins_cost(0); + + size(0); + format %{ "MEMBAR-acquire ! (empty encoding)" %} + ins_encode(); + ins_pipe(empty); +%} + +instruct membar_acquire_lock() +%{ + match(MemBarAcquireLock); + ins_cost(0); + + size(0); + format %{ "MEMBAR-acquire (prior CMPXCHG in FastLock so empty encoding)" %} + ins_encode(); + ins_pipe(empty); +%} + +instruct membar_release() +%{ + match(MemBarRelease); + match(StoreFence); + ins_cost(0); + + size(0); + format %{ "MEMBAR-release ! (empty encoding)" %} + ins_encode(); + ins_pipe(empty); +%} + +instruct membar_release_lock() +%{ + match(MemBarReleaseLock); + ins_cost(0); + + size(0); + format %{ "MEMBAR-release (a FastUnlock follows so empty encoding)" %} + ins_encode(); + ins_pipe(empty); +%} + +instruct membar_volatile(rFlagsReg cr) %{ + match(MemBarVolatile); + effect(KILL cr); + ins_cost(400); + + format %{ + $$template + $$emit$$"lock addl [rsp + #0], 0\t! membar_volatile" + %} + ins_encode %{ + __ membar(Assembler::StoreLoad); + %} + ins_pipe(pipe_slow); +%} + +instruct unnecessary_membar_volatile() +%{ + match(MemBarVolatile); + predicate(Matcher::post_store_load_barrier(n)); + ins_cost(0); + + size(0); + format %{ "MEMBAR-volatile (unnecessary so empty encoding)" %} + ins_encode(); + ins_pipe(empty); +%} + +instruct membar_storestore() %{ + match(MemBarStoreStore); + match(StoreStoreFence); + ins_cost(0); + + size(0); + format %{ "MEMBAR-storestore (empty encoding)" %} + ins_encode( ); + ins_pipe(empty); +%} + +//----------Move Instructions-------------------------------------------------- + +instruct castX2P(rRegP dst, rRegL src) +%{ + match(Set dst (CastX2P src)); + + format %{ "movq $dst, $src\t# long->ptr" %} + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ movptr($dst$$Register, $src$$Register); + } + %} + ins_pipe(ialu_reg_reg); // XXX +%} + +instruct castP2X(rRegL dst, rRegP src) +%{ + match(Set dst (CastP2X src)); + + format %{ "movq $dst, $src\t# ptr -> long" %} + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ movptr($dst$$Register, $src$$Register); + } + %} + ins_pipe(ialu_reg_reg); // XXX +%} + +// Convert oop into int for vectors alignment masking +instruct convP2I(rRegI dst, rRegP src) +%{ + match(Set dst (ConvL2I (CastP2X src))); + + format %{ "movl $dst, $src\t# ptr -> int" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); // XXX +%} + +// Convert compressed oop into int for vectors alignment masking +// in case of 32bit oops (heap < 4Gb). +instruct convN2I(rRegI dst, rRegN src) +%{ + predicate(CompressedOops::shift() == 0); + match(Set dst (ConvL2I (CastP2X (DecodeN src)))); + + format %{ "movl $dst, $src\t# compressed ptr -> int" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); // XXX +%} + +// Convert oop pointer into compressed form +instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ + predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); + match(Set dst (EncodeP src)); + effect(KILL cr); + format %{ "encode_heap_oop $dst,$src" %} + ins_encode %{ + Register s = $src$$Register; + Register d = $dst$$Register; + if (s != d) { + __ movq(d, s); + } + __ encode_heap_oop(d); + %} + ins_pipe(ialu_reg_long); +%} + +instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ + predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); + match(Set dst (EncodeP src)); + effect(KILL cr); + format %{ "encode_heap_oop_not_null $dst,$src" %} + ins_encode %{ + __ encode_heap_oop_not_null($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_long); +%} + +instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ + predicate(n->bottom_type()->is_ptr()->ptr() != TypePtr::NotNull && + n->bottom_type()->is_ptr()->ptr() != TypePtr::Constant); + match(Set dst (DecodeN src)); + effect(KILL cr); + format %{ "decode_heap_oop $dst,$src" %} + ins_encode %{ + Register s = $src$$Register; + Register d = $dst$$Register; + if (s != d) { + __ movq(d, s); + } + __ decode_heap_oop(d); + %} + ins_pipe(ialu_reg_long); +%} + +instruct decodeHeapOop_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{ + predicate(n->bottom_type()->is_ptr()->ptr() == TypePtr::NotNull || + n->bottom_type()->is_ptr()->ptr() == TypePtr::Constant); + match(Set dst (DecodeN src)); + effect(KILL cr); + format %{ "decode_heap_oop_not_null $dst,$src" %} + ins_encode %{ + Register s = $src$$Register; + Register d = $dst$$Register; + if (s != d) { + __ decode_heap_oop_not_null(d, s); + } else { + __ decode_heap_oop_not_null(d); + } + %} + ins_pipe(ialu_reg_long); +%} + +instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ + match(Set dst (EncodePKlass src)); + effect(TEMP dst, KILL cr); + format %{ "encode_and_move_klass_not_null $dst,$src" %} + ins_encode %{ + __ encode_and_move_klass_not_null($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_long); +%} + +instruct decodeKlass_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{ + match(Set dst (DecodeNKlass src)); + effect(TEMP dst, KILL cr); + format %{ "decode_and_move_klass_not_null $dst,$src" %} + ins_encode %{ + __ decode_and_move_klass_not_null($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_long); +%} + +//----------Conditional Move--------------------------------------------------- +// Jump +// dummy instruction for generating temp registers +instruct jumpXtnd_offset(rRegL switch_val, immI2 shift, rRegI dest) %{ + match(Jump (LShiftL switch_val shift)); + ins_cost(350); + predicate(false); + effect(TEMP dest); + + format %{ "leaq $dest, [$constantaddress]\n\t" + "jmp [$dest + $switch_val << $shift]\n\t" %} + ins_encode %{ + // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 + // to do that and the compiler is using that register as one it can allocate. + // So we build it all by hand. + // Address index(noreg, switch_reg, (Address::ScaleFactor)$shift$$constant); + // ArrayAddress dispatch(table, index); + Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant); + __ lea($dest$$Register, $constantaddress); + __ jmp(dispatch); + %} + ins_pipe(pipe_jmp); +%} + +instruct jumpXtnd_addr(rRegL switch_val, immI2 shift, immL32 offset, rRegI dest) %{ + match(Jump (AddL (LShiftL switch_val shift) offset)); + ins_cost(350); + effect(TEMP dest); + + format %{ "leaq $dest, [$constantaddress]\n\t" + "jmp [$dest + $switch_val << $shift + $offset]\n\t" %} + ins_encode %{ + // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 + // to do that and the compiler is using that register as one it can allocate. + // So we build it all by hand. + // Address index(noreg, switch_reg, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant); + // ArrayAddress dispatch(table, index); + Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant); + __ lea($dest$$Register, $constantaddress); + __ jmp(dispatch); + %} + ins_pipe(pipe_jmp); +%} + +instruct jumpXtnd(rRegL switch_val, rRegI dest) %{ + match(Jump switch_val); + ins_cost(350); + effect(TEMP dest); + + format %{ "leaq $dest, [$constantaddress]\n\t" + "jmp [$dest + $switch_val]\n\t" %} + ins_encode %{ + // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 + // to do that and the compiler is using that register as one it can allocate. + // So we build it all by hand. + // Address index(noreg, switch_reg, Address::times_1); + // ArrayAddress dispatch(table, index); + Address dispatch($dest$$Register, $switch_val$$Register, Address::times_1); + __ lea($dest$$Register, $constantaddress); + __ jmp(dispatch); + %} + ins_pipe(pipe_jmp); +%} + +// Conditional move +instruct cmovI_imm_01(rRegI dst, immI_1 src, rFlagsReg cr, cmpOp cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); + match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# signed, int" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovI_reg(rRegI dst, rRegI src, rFlagsReg cr, cmpOp cop) +%{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# signed, int" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_reg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr, cmpOp cop) +%{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_imm_01U(rRegI dst, immI_1 src, rFlagsRegU cr, cmpOpU cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); + match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# unsigned, int" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovI_regU(cmpOpU cop, rFlagsRegU cr, rRegI dst, rRegI src) %{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_regU_ndd(rRegI dst, cmpOpU cop, rFlagsRegU cr, rRegI src1, rRegI src2) %{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_imm_01UCF(rRegI dst, immI_1 src, rFlagsRegUCF cr, cmpOpUCF cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); + match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# unsigned, int" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovI_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovI_regU(cop, cr, dst, src); + %} +%} + +instruct cmovI_regUCF_ndd(rRegI dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegI src1, rRegI src2) %{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovpl $dst, $src\n\t" + "cmovnel $dst, $src" %} + ins_encode %{ + __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpl $dst, $src1, $src2\n\t" + "cmovnel $dst, $src2" %} + ins_encode %{ + __ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the +// inputs of the CMove +instruct cmovI_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); + effect(TEMP dst); + + ins_cost(200); // XXX + format %{ "cmovpl $dst, $src\n\t" + "cmovnel $dst, $src" %} + ins_encode %{ + __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// We need this special handling for only eq / neq comparison since NaN == NaN is false, +// and parity flag bit is set if any of the operand is a NaN. +instruct cmovI_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveI (Binary cop cr) (Binary src2 src1))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpl $dst, $src1, $src2\n\t" + "cmovnel $dst, $src2" %} + ins_encode %{ + __ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move +instruct cmovI_mem(cmpOp cop, rFlagsReg cr, rRegI dst, memory src) %{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); + + ins_cost(250); // XXX + format %{ "cmovl$cop $dst, $src\t# signed, int" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +// Conditional move +instruct cmovI_rReg_rReg_mem_ndd(rRegI dst, cmpOp cop, rFlagsReg cr, rRegI src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); + + ins_cost(250); + format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +// Conditional move +instruct cmovI_memU(cmpOpU cop, rFlagsRegU cr, rRegI dst, memory src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); + + ins_cost(250); // XXX + format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +instruct cmovI_memUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegI dst, memory src) %{ + predicate(!UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); + ins_cost(250); + expand %{ + cmovI_memU(cop, cr, dst, src); + %} +%} + +instruct cmovI_rReg_rReg_memU_ndd(rRegI dst, cmpOpU cop, rFlagsRegU cr, rRegI src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); + + ins_cost(250); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +instruct cmovI_rReg_rReg_memUCF_ndd(rRegI dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegI src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); + ins_cost(250); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +// Conditional move +instruct cmovN_reg(rRegN dst, rRegN src, rFlagsReg cr, cmpOp cop) +%{ + predicate(!UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# signed, compressed ptr" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move ndd +instruct cmovN_reg_ndd(rRegN dst, rRegN src1, rRegN src2, rFlagsReg cr, cmpOp cop) +%{ + predicate(UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, compressed ptr ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move +instruct cmovN_regU(cmpOpU cop, rFlagsRegU cr, rRegN dst, rRegN src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovl$cop $dst, $src\t# unsigned, compressed ptr" %} + ins_encode %{ + __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovN_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ + predicate(!UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovN_regU(cop, cr, dst, src); + %} +%} + +// Conditional move ndd +instruct cmovN_regU_ndd(rRegN dst, cmpOpU cop, rFlagsRegU cr, rRegN src1, rRegN src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, compressed ptr ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovN_regUCF_ndd(rRegN dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegN src1, rRegN src2) %{ + predicate(UseAPX); + match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); + ins_cost(200); + format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, compressed ptr ndd" %} + ins_encode %{ + __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovN_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ + predicate(n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovpl $dst, $src\n\t" + "cmovnel $dst, $src" %} + ins_encode %{ + __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the +// inputs of the CMove +instruct cmovN_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ + predicate(n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveN (Binary cop cr) (Binary src dst))); + + ins_cost(200); // XXX + format %{ "cmovpl $dst, $src\n\t" + "cmovnel $dst, $src" %} + ins_encode %{ + __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move +instruct cmovP_reg(rRegP dst, rRegP src, rFlagsReg cr, cmpOp cop) +%{ + predicate(!UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# signed, ptr" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); // XXX +%} + +// Conditional move ndd +instruct cmovP_reg_ndd(rRegP dst, rRegP src1, rRegP src2, rFlagsReg cr, cmpOp cop) +%{ + predicate(UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, ptr ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Conditional move +instruct cmovP_regU(cmpOpU cop, rFlagsRegU cr, rRegP dst, rRegP src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# unsigned, ptr" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); // XXX +%} + +// Conditional move ndd +instruct cmovP_regU_ndd(rRegP dst, cmpOpU cop, rFlagsRegU cr, rRegP src1, rRegP src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, ptr ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovP_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ + predicate(!UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovP_regU(cop, cr, dst, src); + %} +%} + +instruct cmovP_regUCF_ndd(rRegP dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegP src1, rRegP src2) %{ + predicate(UseAPX); + match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, ptr ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovP_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovpq $dst, $src\n\t" + "cmovneq $dst, $src" %} + ins_encode %{ + __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovP_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpq $dst, $src1, $src2\n\t" + "cmovneq $dst, $src2" %} + ins_encode %{ + __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the +// inputs of the CMove +instruct cmovP_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveP (Binary cop cr) (Binary src dst))); + + ins_cost(200); // XXX + format %{ "cmovpq $dst, $src\n\t" + "cmovneq $dst, $src" %} + ins_encode %{ + __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovP_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveP (Binary cop cr) (Binary src2 src1))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpq $dst, $src1, $src2\n\t" + "cmovneq $dst, $src2" %} + ins_encode %{ + __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_imm_01(rRegL dst, immL1 src, rFlagsReg cr, cmpOp cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); + match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# signed, long" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovL_reg(cmpOp cop, rFlagsReg cr, rRegL dst, rRegL src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# signed, long" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); // XXX +%} + +instruct cmovL_reg_ndd(rRegL dst, cmpOp cop, rFlagsReg cr, rRegL src1, rRegL src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_mem(cmpOp cop, rFlagsReg cr, rRegL dst, memory src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# signed, long" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); + %} + ins_pipe(pipe_cmov_mem); // XXX +%} + +instruct cmovL_rReg_rReg_mem_ndd(rRegL dst, cmpOp cop, rFlagsReg cr, rRegL src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +instruct cmovL_imm_01U(rRegL dst, immL1 src, rFlagsRegU cr, cmpOpU cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); + match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# unsigned, long" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovL_regU(cmpOpU cop, rFlagsRegU cr, rRegL dst, rRegL src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# unsigned, long" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); // XXX +%} + +instruct cmovL_regU_ndd(rRegL dst, cmpOpU cop, rFlagsRegU cr, rRegL src1, rRegL src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_imm_01UCF(rRegL dst, immL1 src, rFlagsRegUCF cr, cmpOpUCF cop) +%{ + predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); + match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); + + ins_cost(100); // XXX + format %{ "setbn$cop $dst\t# unsigned, long" %} + ins_encode %{ + Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); + __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct cmovL_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovL_regU(cop, cr, dst, src); + %} +%} + +instruct cmovL_regUCF_ndd(rRegL dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegL src1, rRegL src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "cmovpq $dst, $src\n\t" + "cmovneq $dst, $src" %} + ins_encode %{ + __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpq $dst, $src1, $src2\n\t" + "cmovneq $dst, $src2" %} + ins_encode %{ + __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the +// inputs of the CMove +instruct cmovL_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ + predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); + + ins_cost(200); // XXX + format %{ "cmovpq $dst, $src\n\t" + "cmovneq $dst, $src" %} + ins_encode %{ + __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{ + predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); + match(Set dst (CMoveL (Binary cop cr) (Binary src2 src1))); + effect(TEMP dst); + + ins_cost(200); + format %{ "ecmovpq $dst, $src1, $src2\n\t" + "cmovneq $dst, $src2" %} + ins_encode %{ + __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); + __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovL_memU(cmpOpU cop, rFlagsRegU cr, rRegL dst, memory src) +%{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); + + ins_cost(200); // XXX + format %{ "cmovq$cop $dst, $src\t# unsigned, long" %} + ins_encode %{ + __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); + %} + ins_pipe(pipe_cmov_mem); // XXX +%} + +instruct cmovL_memUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegL dst, memory src) %{ + predicate(!UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); + ins_cost(200); + expand %{ + cmovL_memU(cop, cr, dst, src); + %} +%} + +instruct cmovL_rReg_rReg_memU_ndd(rRegL dst, cmpOpU cop, rFlagsRegU cr, rRegL src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); + + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +instruct cmovL_rReg_rReg_memUCF_ndd(rRegL dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegL src1, memory src2) +%{ + predicate(UseAPX); + match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); + ins_cost(200); + format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} + ins_encode %{ + __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(pipe_cmov_mem); +%} + +instruct cmovF_reg(cmpOp cop, rFlagsReg cr, regF dst, regF src) +%{ + match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "jn$cop skip\t# signed cmove float\n\t" + "movss $dst, $src\n" + "skip:" %} + ins_encode %{ + Label Lskip; + // Invert sense of branch from sense of CMOV + __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); + __ movflt($dst$$XMMRegister, $src$$XMMRegister); + __ bind(Lskip); + %} + ins_pipe(pipe_slow); +%} + +instruct cmovF_regU(cmpOpU cop, rFlagsRegU cr, regF dst, regF src) +%{ + match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "jn$cop skip\t# unsigned cmove float\n\t" + "movss $dst, $src\n" + "skip:" %} + ins_encode %{ + Label Lskip; + // Invert sense of branch from sense of CMOV + __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); + __ movflt($dst$$XMMRegister, $src$$XMMRegister); + __ bind(Lskip); + %} + ins_pipe(pipe_slow); +%} + +instruct cmovF_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, regF dst, regF src) %{ + match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovF_regU(cop, cr, dst, src); + %} +%} + +instruct cmovD_reg(cmpOp cop, rFlagsReg cr, regD dst, regD src) +%{ + match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "jn$cop skip\t# signed cmove double\n\t" + "movsd $dst, $src\n" + "skip:" %} + ins_encode %{ + Label Lskip; + // Invert sense of branch from sense of CMOV + __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); + __ movdbl($dst$$XMMRegister, $src$$XMMRegister); + __ bind(Lskip); + %} + ins_pipe(pipe_slow); +%} + +instruct cmovD_regU(cmpOpU cop, rFlagsRegU cr, regD dst, regD src) +%{ + match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); + + ins_cost(200); // XXX + format %{ "jn$cop skip\t# unsigned cmove double\n\t" + "movsd $dst, $src\n" + "skip:" %} + ins_encode %{ + Label Lskip; + // Invert sense of branch from sense of CMOV + __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); + __ movdbl($dst$$XMMRegister, $src$$XMMRegister); + __ bind(Lskip); + %} + ins_pipe(pipe_slow); +%} + +instruct cmovD_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, regD dst, regD src) %{ + match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); + ins_cost(200); + expand %{ + cmovD_regU(cop, cr, dst, src); + %} +%} + +//----------Arithmetic Instructions-------------------------------------------- +//----------Addition Instructions---------------------------------------------- + +instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + format %{ "addl $dst, $src\t# int" %} + ins_encode %{ + __ addl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eaddl($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "addl $dst, $src\t# int" %} + ins_encode %{ + __ addl($dst$$Register, $src$$constant); + %} + ins_pipe( ialu_reg ); +%} + +instruct addI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eaddl($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe( ialu_reg ); +%} + +instruct addI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddI (LoadI src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eaddl($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe( ialu_reg ); +%} + +instruct addI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddI dst (LoadI src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); // XXX + format %{ "addl $dst, $src\t# int" %} + ins_encode %{ + __ addl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct addI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddI src1 (LoadI src2))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eaddl($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct addI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (AddI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); // XXX + format %{ "addl $dst, $src\t# int" %} + ins_encode %{ + __ addl($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct addI_mem_imm(memory dst, immI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (AddI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + + ins_cost(125); // XXX + format %{ "addl $dst, $src\t# int" %} + ins_encode %{ + __ addl($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct incI_rReg(rRegI dst, immI_1 src, rFlagsReg cr) +%{ + predicate(!UseAPX && UseIncDec); + match(Set dst (AddI dst src)); + effect(KILL cr); + + format %{ "incl $dst\t# int" %} + ins_encode %{ + __ incrementl($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct incI_rReg_ndd(rRegI dst, rRegI src, immI_1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddI src val)); + effect(KILL cr); + + format %{ "eincl $dst, $src\t# int ndd" %} + ins_encode %{ + __ eincl($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct incI_rReg_mem_ndd(rRegI dst, memory src, immI_1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddI (LoadI src) val)); + effect(KILL cr); + + format %{ "eincl $dst, $src\t# int ndd" %} + ins_encode %{ + __ eincl($dst$$Register, $src$$Address, false); + %} + ins_pipe(ialu_reg); +%} + +instruct incI_mem(memory dst, immI_1 src, rFlagsReg cr) +%{ + predicate(UseIncDec); + match(Set dst (StoreI dst (AddI (LoadI dst) src))); + effect(KILL cr); + + ins_cost(125); // XXX + format %{ "incl $dst\t# int" %} + ins_encode %{ + __ incrementl($dst$$Address); + %} + ins_pipe(ialu_mem_imm); +%} + +// XXX why does that use AddI +instruct decI_rReg(rRegI dst, immI_M1 src, rFlagsReg cr) +%{ + predicate(!UseAPX && UseIncDec); + match(Set dst (AddI dst src)); + effect(KILL cr); + + format %{ "decl $dst\t# int" %} + ins_encode %{ + __ decrementl($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct decI_rReg_ndd(rRegI dst, rRegI src, immI_M1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddI src val)); + effect(KILL cr); + + format %{ "edecl $dst, $src\t# int ndd" %} + ins_encode %{ + __ edecl($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct decI_rReg_mem_ndd(rRegI dst, memory src, immI_M1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddI (LoadI src) val)); + effect(KILL cr); + + format %{ "edecl $dst, $src\t# int ndd" %} + ins_encode %{ + __ edecl($dst$$Register, $src$$Address, false); + %} + ins_pipe(ialu_reg); +%} + +// XXX why does that use AddI +instruct decI_mem(memory dst, immI_M1 src, rFlagsReg cr) +%{ + predicate(UseIncDec); + match(Set dst (StoreI dst (AddI (LoadI dst) src))); + effect(KILL cr); + + ins_cost(125); // XXX + format %{ "decl $dst\t# int" %} + ins_encode %{ + __ decrementl($dst$$Address); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct leaI_rReg_immI2_immI(rRegI dst, rRegI index, immI2 scale, immI disp) +%{ + predicate(VM_Version::supports_fast_2op_lea()); + match(Set dst (AddI (LShiftI index scale) disp)); + + format %{ "leal $dst, [$index << $scale + $disp]\t# int" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leal($dst$$Register, Address(noreg, $index$$Register, scale, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaI_rReg_rReg_immI(rRegI dst, rRegI base, rRegI index, immI disp) +%{ + predicate(VM_Version::supports_fast_3op_lea()); + match(Set dst (AddI (AddI base index) disp)); + + format %{ "leal $dst, [$base + $index + $disp]\t# int" %} + ins_encode %{ + __ leal($dst$$Register, Address($base$$Register, $index$$Register, Address::times_1, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaI_rReg_rReg_immI2(rRegI dst, no_rbp_r13_RegI base, rRegI index, immI2 scale) +%{ + predicate(VM_Version::supports_fast_2op_lea()); + match(Set dst (AddI base (LShiftI index scale))); + + format %{ "leal $dst, [$base + $index << $scale]\t# int" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leal($dst$$Register, Address($base$$Register, $index$$Register, scale)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaI_rReg_rReg_immI2_immI(rRegI dst, rRegI base, rRegI index, immI2 scale, immI disp) +%{ + predicate(VM_Version::supports_fast_3op_lea()); + match(Set dst (AddI (AddI base (LShiftI index scale)) disp)); + + format %{ "leal $dst, [$base + $index << $scale + $disp]\t# int" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leal($dst$$Register, Address($base$$Register, $index$$Register, scale, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "addq $dst, $src\t# long" %} + ins_encode %{ + __ addq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eaddq($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "addq $dst, $src\t# long" %} + ins_encode %{ + __ addq($dst$$Register, $src$$constant); + %} + ins_pipe( ialu_reg ); +%} + +instruct addL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eaddq($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe( ialu_reg ); +%} + +instruct addL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eaddq($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe( ialu_reg ); +%} + +instruct addL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AddL dst (LoadL src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); // XXX + format %{ "addq $dst, $src\t# long" %} + ins_encode %{ + __ addq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct addL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AddL src1 (LoadL src2))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eaddq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct addL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (AddL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); // XXX + format %{ "addq $dst, $src\t# long" %} + ins_encode %{ + __ addq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct addL_mem_imm(memory dst, immL32 src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (AddL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(125); // XXX + format %{ "addq $dst, $src\t# long" %} + ins_encode %{ + __ addq($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct incL_rReg(rRegL dst, immL1 src, rFlagsReg cr) +%{ + predicate(!UseAPX && UseIncDec); + match(Set dst (AddL dst src)); + effect(KILL cr); + + format %{ "incq $dst\t# long" %} + ins_encode %{ + __ incrementq($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct incL_rReg_ndd(rRegL dst, rRegI src, immL1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddL src val)); + effect(KILL cr); + + format %{ "eincq $dst, $src\t# long ndd" %} + ins_encode %{ + __ eincq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct incL_rReg_mem_ndd(rRegL dst, memory src, immL1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddL (LoadL src) val)); + effect(KILL cr); + + format %{ "eincq $dst, $src\t# long ndd" %} + ins_encode %{ + __ eincq($dst$$Register, $src$$Address, false); + %} + ins_pipe(ialu_reg); +%} + +instruct incL_mem(memory dst, immL1 src, rFlagsReg cr) +%{ + predicate(UseIncDec); + match(Set dst (StoreL dst (AddL (LoadL dst) src))); + effect(KILL cr); + + ins_cost(125); // XXX + format %{ "incq $dst\t# long" %} + ins_encode %{ + __ incrementq($dst$$Address); + %} + ins_pipe(ialu_mem_imm); +%} + +// XXX why does that use AddL +instruct decL_rReg(rRegL dst, immL_M1 src, rFlagsReg cr) +%{ + predicate(!UseAPX && UseIncDec); + match(Set dst (AddL dst src)); + effect(KILL cr); + + format %{ "decq $dst\t# long" %} + ins_encode %{ + __ decrementq($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct decL_rReg_ndd(rRegL dst, rRegL src, immL_M1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddL src val)); + effect(KILL cr); + + format %{ "edecq $dst, $src\t# long ndd" %} + ins_encode %{ + __ edecq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct decL_rReg_mem_ndd(rRegL dst, memory src, immL_M1 val, rFlagsReg cr) +%{ + predicate(UseAPX && UseIncDec); + match(Set dst (AddL (LoadL src) val)); + effect(KILL cr); + + format %{ "edecq $dst, $src\t# long ndd" %} + ins_encode %{ + __ edecq($dst$$Register, $src$$Address, false); + %} + ins_pipe(ialu_reg); +%} + +// XXX why does that use AddL +instruct decL_mem(memory dst, immL_M1 src, rFlagsReg cr) +%{ + predicate(UseIncDec); + match(Set dst (StoreL dst (AddL (LoadL dst) src))); + effect(KILL cr); + + ins_cost(125); // XXX + format %{ "decq $dst\t# long" %} + ins_encode %{ + __ decrementq($dst$$Address); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct leaL_rReg_immI2_immL32(rRegL dst, rRegL index, immI2 scale, immL32 disp) +%{ + predicate(VM_Version::supports_fast_2op_lea()); + match(Set dst (AddL (LShiftL index scale) disp)); + + format %{ "leaq $dst, [$index << $scale + $disp]\t# long" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leaq($dst$$Register, Address(noreg, $index$$Register, scale, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_rReg_immL32(rRegL dst, rRegL base, rRegL index, immL32 disp) +%{ + predicate(VM_Version::supports_fast_3op_lea()); + match(Set dst (AddL (AddL base index) disp)); + + format %{ "leaq $dst, [$base + $index + $disp]\t# long" %} + ins_encode %{ + __ leaq($dst$$Register, Address($base$$Register, $index$$Register, Address::times_1, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_rReg_immI2(rRegL dst, no_rbp_r13_RegL base, rRegL index, immI2 scale) +%{ + predicate(VM_Version::supports_fast_2op_lea()); + match(Set dst (AddL base (LShiftL index scale))); + + format %{ "leaq $dst, [$base + $index << $scale]\t# long" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leaq($dst$$Register, Address($base$$Register, $index$$Register, scale)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_rReg_immI2_immL32(rRegL dst, rRegL base, rRegL index, immI2 scale, immL32 disp) +%{ + predicate(VM_Version::supports_fast_3op_lea()); + match(Set dst (AddL (AddL base (LShiftL index scale)) disp)); + + format %{ "leaq $dst, [$base + $index << $scale + $disp]\t# long" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($scale$$constant); + __ leaq($dst$$Register, Address($base$$Register, $index$$Register, scale, $disp$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addP_rReg(rRegP dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (AddP dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "addq $dst, $src\t# ptr" %} + ins_encode %{ + __ addq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct addP_rReg_imm(rRegP dst, immL32 src, rFlagsReg cr) +%{ + match(Set dst (AddP dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "addq $dst, $src\t# ptr" %} + ins_encode %{ + __ addq($dst$$Register, $src$$constant); + %} + ins_pipe( ialu_reg ); +%} + +// XXX addP mem ops ???? + +instruct checkCastPP(rRegP dst) +%{ + match(Set dst (CheckCastPP dst)); + + size(0); + format %{ "# checkcastPP of $dst" %} + ins_encode(/* empty encoding */); + ins_pipe(empty); +%} + +instruct castPP(rRegP dst) +%{ + match(Set dst (CastPP dst)); + + size(0); + format %{ "# castPP of $dst" %} + ins_encode(/* empty encoding */); + ins_pipe(empty); +%} + +instruct castII(rRegI dst) +%{ + predicate(VerifyConstraintCasts == 0); + match(Set dst (CastII dst)); + + size(0); + format %{ "# castII of $dst" %} + ins_encode(/* empty encoding */); + ins_cost(0); + ins_pipe(empty); +%} + +instruct castII_checked(rRegI dst, rFlagsReg cr) +%{ + predicate(VerifyConstraintCasts > 0); + match(Set dst (CastII dst)); + + effect(KILL cr); + format %{ "# cast_checked_II $dst" %} + ins_encode %{ + __ verify_int_in_range(_idx, bottom_type()->is_int(), $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct castLL(rRegL dst) +%{ + predicate(VerifyConstraintCasts == 0); + match(Set dst (CastLL dst)); + + size(0); + format %{ "# castLL of $dst" %} + ins_encode(/* empty encoding */); + ins_cost(0); + ins_pipe(empty); +%} + +instruct castLL_checked_L32(rRegL dst, rFlagsReg cr) +%{ + predicate(VerifyConstraintCasts > 0 && castLL_is_imm32(n)); + match(Set dst (CastLL dst)); + + effect(KILL cr); + format %{ "# cast_checked_LL $dst" %} + ins_encode %{ + __ verify_long_in_range(_idx, bottom_type()->is_long(), $dst$$Register, noreg); + %} + ins_pipe(pipe_slow); +%} + +instruct castLL_checked(rRegL dst, rRegL tmp, rFlagsReg cr) +%{ + predicate(VerifyConstraintCasts > 0 && !castLL_is_imm32(n)); + match(Set dst (CastLL dst)); + + effect(KILL cr, TEMP tmp); + format %{ "# cast_checked_LL $dst\tusing $tmp as TEMP" %} + ins_encode %{ + __ verify_long_in_range(_idx, bottom_type()->is_long(), $dst$$Register, $tmp$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct castFF(regF dst) +%{ + match(Set dst (CastFF dst)); + + size(0); + format %{ "# castFF of $dst" %} + ins_encode(/* empty encoding */); + ins_cost(0); + ins_pipe(empty); +%} + +instruct castHH(regF dst) +%{ + match(Set dst (CastHH dst)); + + size(0); + format %{ "# castHH of $dst" %} + ins_encode(/* empty encoding */); + ins_cost(0); + ins_pipe(empty); +%} + +instruct castDD(regD dst) +%{ + match(Set dst (CastDD dst)); + + size(0); + format %{ "# castDD of $dst" %} + ins_encode(/* empty encoding */); + ins_cost(0); + ins_pipe(empty); +%} + +// XXX No flag versions for CompareAndSwap{P,I,L} because matcher can't match them +instruct compareAndSwapP(rRegI res, + memory mem_ptr, + rax_RegP oldval, rRegP newval, + rFlagsReg cr) +%{ + predicate(n->as_LoadStore()->barrier_data() == 0); + match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapP mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgq $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgq($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndSwapL(rRegI res, + memory mem_ptr, + rax_RegL oldval, rRegL newval, + rFlagsReg cr) +%{ + match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapL mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgq $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgq($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndSwapI(rRegI res, + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapI mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgl $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgl($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndSwapB(rRegI res, + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set res (CompareAndSwapB mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapB mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgb $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgb($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndSwapS(rRegI res, + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set res (CompareAndSwapS mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapS mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgw $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgw($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndSwapN(rRegI res, + memory mem_ptr, + rax_RegN oldval, rRegN newval, + rFlagsReg cr) %{ + predicate(n->as_LoadStore()->barrier_data() == 0); + match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval))); + match(Set res (WeakCompareAndSwapN mem_ptr (Binary oldval newval))); + effect(KILL cr, KILL oldval); + + format %{ "cmpxchgl $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" + "setcc $res \t# emits sete + movzbl or setzue for APX" %} + ins_encode %{ + __ lock(); + __ cmpxchgl($newval$$Register, $mem_ptr$$Address); + __ setcc(Assembler::equal, $res$$Register); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeB( + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set oldval (CompareAndExchangeB mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgb $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgb($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeS( + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set oldval (CompareAndExchangeS mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgw $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgw($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeI( + memory mem_ptr, + rax_RegI oldval, rRegI newval, + rFlagsReg cr) +%{ + match(Set oldval (CompareAndExchangeI mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgl $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgl($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeL( + memory mem_ptr, + rax_RegL oldval, rRegL newval, + rFlagsReg cr) +%{ + match(Set oldval (CompareAndExchangeL mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgq $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgq($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeN( + memory mem_ptr, + rax_RegN oldval, rRegN newval, + rFlagsReg cr) %{ + predicate(n->as_LoadStore()->barrier_data() == 0); + match(Set oldval (CompareAndExchangeN mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgl $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgl($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct compareAndExchangeP( + memory mem_ptr, + rax_RegP oldval, rRegP newval, + rFlagsReg cr) +%{ + predicate(n->as_LoadStore()->barrier_data() == 0); + match(Set oldval (CompareAndExchangeP mem_ptr (Binary oldval newval))); + effect(KILL cr); + + format %{ "cmpxchgq $mem_ptr,$newval\t# " + "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} + ins_encode %{ + __ lock(); + __ cmpxchgq($newval$$Register, $mem_ptr$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xaddB_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddB mem add)); + effect(KILL cr); + format %{ "addb_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addb($mem$$Address, $add$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddB_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddB mem add)); + effect(KILL cr); + format %{ "addb_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addb($mem$$Address, $add$$constant); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddB(memory mem, rRegI newval, rFlagsReg cr) %{ + predicate(!n->as_LoadStore()->result_not_used()); + match(Set newval (GetAndAddB mem newval)); + effect(KILL cr); + format %{ "xaddb_lock $mem, $newval" %} + ins_encode %{ + __ lock(); + __ xaddb($mem$$Address, $newval$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddS_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddS mem add)); + effect(KILL cr); + format %{ "addw_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addw($mem$$Address, $add$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddS_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ + predicate(UseStoreImmI16 && n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddS mem add)); + effect(KILL cr); + format %{ "addw_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addw($mem$$Address, $add$$constant); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddS(memory mem, rRegI newval, rFlagsReg cr) %{ + predicate(!n->as_LoadStore()->result_not_used()); + match(Set newval (GetAndAddS mem newval)); + effect(KILL cr); + format %{ "xaddw_lock $mem, $newval" %} + ins_encode %{ + __ lock(); + __ xaddw($mem$$Address, $newval$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddI_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddI mem add)); + effect(KILL cr); + format %{ "addl_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addl($mem$$Address, $add$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddI_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddI mem add)); + effect(KILL cr); + format %{ "addl_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addl($mem$$Address, $add$$constant); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddI(memory mem, rRegI newval, rFlagsReg cr) %{ + predicate(!n->as_LoadStore()->result_not_used()); + match(Set newval (GetAndAddI mem newval)); + effect(KILL cr); + format %{ "xaddl_lock $mem, $newval" %} + ins_encode %{ + __ lock(); + __ xaddl($mem$$Address, $newval$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddL_reg_no_res(memory mem, Universe dummy, rRegL add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddL mem add)); + effect(KILL cr); + format %{ "addq_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addq($mem$$Address, $add$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddL_imm_no_res(memory mem, Universe dummy, immL32 add, rFlagsReg cr) %{ + predicate(n->as_LoadStore()->result_not_used()); + match(Set dummy (GetAndAddL mem add)); + effect(KILL cr); + format %{ "addq_lock $mem, $add" %} + ins_encode %{ + __ lock(); + __ addq($mem$$Address, $add$$constant); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xaddL(memory mem, rRegL newval, rFlagsReg cr) %{ + predicate(!n->as_LoadStore()->result_not_used()); + match(Set newval (GetAndAddL mem newval)); + effect(KILL cr); + format %{ "xaddq_lock $mem, $newval" %} + ins_encode %{ + __ lock(); + __ xaddq($mem$$Address, $newval$$Register); + %} + ins_pipe(pipe_cmpxchg); +%} + +instruct xchgB( memory mem, rRegI newval) %{ + match(Set newval (GetAndSetB mem newval)); + format %{ "XCHGB $newval,[$mem]" %} + ins_encode %{ + __ xchgb($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xchgS( memory mem, rRegI newval) %{ + match(Set newval (GetAndSetS mem newval)); + format %{ "XCHGW $newval,[$mem]" %} + ins_encode %{ + __ xchgw($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xchgI( memory mem, rRegI newval) %{ + match(Set newval (GetAndSetI mem newval)); + format %{ "XCHGL $newval,[$mem]" %} + ins_encode %{ + __ xchgl($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xchgL( memory mem, rRegL newval) %{ + match(Set newval (GetAndSetL mem newval)); + format %{ "XCHGL $newval,[$mem]" %} + ins_encode %{ + __ xchgq($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xchgP( memory mem, rRegP newval) %{ + match(Set newval (GetAndSetP mem newval)); + predicate(n->as_LoadStore()->barrier_data() == 0); + format %{ "XCHGQ $newval,[$mem]" %} + ins_encode %{ + __ xchgq($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +instruct xchgN( memory mem, rRegN newval) %{ + predicate(n->as_LoadStore()->barrier_data() == 0); + match(Set newval (GetAndSetN mem newval)); + format %{ "XCHGL $newval,$mem]" %} + ins_encode %{ + __ xchgl($newval$$Register, $mem$$Address); + %} + ins_pipe( pipe_cmpxchg ); +%} + +//----------Abs Instructions------------------------------------------- + +// Integer Absolute Instructions +instruct absI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (AbsI src)); + effect(TEMP dst, KILL cr); + format %{ "xorl $dst, $dst\t# abs int\n\t" + "subl $dst, $src\n\t" + "cmovll $dst, $src" %} + ins_encode %{ + __ xorl($dst$$Register, $dst$$Register); + __ subl($dst$$Register, $src$$Register); + __ cmovl(Assembler::less, $dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg_reg); +%} + +// Long Absolute Instructions +instruct absL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (AbsL src)); + effect(TEMP dst, KILL cr); + format %{ "xorl $dst, $dst\t# abs long\n\t" + "subq $dst, $src\n\t" + "cmovlq $dst, $src" %} + ins_encode %{ + __ xorl($dst$$Register, $dst$$Register); + __ subq($dst$$Register, $src$$Register); + __ cmovq(Assembler::less, $dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg_reg); +%} + +//----------Subtraction Instructions------------------------------------------- + +// Integer Subtraction Instructions +instruct subI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "subl $dst, $src\t# int" %} + ins_encode %{ + __ subl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ esubl($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ esubl($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI (LoadI src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ esubl($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubI dst (LoadI src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "subl $dst, $src\t# int" %} + ins_encode %{ + __ subl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI src1 (LoadI src2))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "esubl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ esubl($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subI_rReg_mem_rReg_ndd(rRegI dst, memory src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI (LoadI src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "esubl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ esubl($dst$$Register, $src1$$Address, $src2$$Register, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (SubI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "subl $dst, $src\t# int" %} + ins_encode %{ + __ subl($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "subq $dst, $src\t# long" %} + ins_encode %{ + __ subq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ esubq($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ esubq($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + format %{ "esubq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ esubq($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct subL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubL dst (LoadL src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "subq $dst, $src\t# long" %} + ins_encode %{ + __ subq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL src1 (LoadL src2))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "esubq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ esubq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subL_rReg_mem_rReg_ndd(rRegL dst, memory src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "esubq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ esubq($dst$$Register, $src1$$Address, $src2$$Register, false); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct subL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (SubL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); + + ins_cost(150); + format %{ "subq $dst, $src\t# long" %} + ins_encode %{ + __ subq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Subtract from a pointer +// XXX hmpf??? +instruct subP_rReg(rRegP dst, rRegI src, immI_0 zero, rFlagsReg cr) +%{ + match(Set dst (AddP dst (SubI zero src))); + effect(KILL cr); + + format %{ "subq $dst, $src\t# ptr - int" %} + ins_encode %{ + __ subq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct negI_rReg(rRegI dst, immI_0 zero, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubI zero dst)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negl $dst\t# int" %} + ins_encode %{ + __ negl($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct negI_rReg_ndd(rRegI dst, rRegI src, immI_0 zero, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubI zero src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "enegl $dst, $src\t# int ndd" %} + ins_encode %{ + __ enegl($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct negI_rReg_2(rRegI dst, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (NegI dst)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negl $dst\t# int" %} + ins_encode %{ + __ negl($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct negI_rReg_2_ndd(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (NegI src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "enegl $dst, $src\t# int ndd" %} + ins_encode %{ + __ enegl($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct negI_mem(memory dst, immI_0 zero, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (SubI zero (LoadI dst)))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negl $dst\t# int" %} + ins_encode %{ + __ negl($dst$$Address); + %} + ins_pipe(ialu_reg); +%} + +instruct negL_rReg(rRegL dst, immL0 zero, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (SubL zero dst)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negq $dst\t# long" %} + ins_encode %{ + __ negq($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct negL_rReg_ndd(rRegL dst, rRegL src, immL0 zero, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (SubL zero src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "enegq $dst, $src\t# long ndd" %} + ins_encode %{ + __ enegq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct negL_rReg_2(rRegL dst, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (NegL dst)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negq $dst\t# int" %} + ins_encode %{ + __ negq($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct negL_rReg_2_ndd(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (NegL src)); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "enegq $dst, $src\t# long ndd" %} + ins_encode %{ + __ enegq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg); +%} + +instruct negL_mem(memory dst, immL0 zero, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (SubL zero (LoadL dst)))); + effect(KILL cr); + flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); + + format %{ "negq $dst\t# long" %} + ins_encode %{ + __ negq($dst$$Address); + %} + ins_pipe(ialu_reg); +%} + +//----------Multiplication/Division Instructions------------------------------- +// Integer Multiplication Instructions +// Multiply Register + +instruct mulI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (MulI dst src)); + effect(KILL cr); + + ins_cost(300); + format %{ "imull $dst, $src\t# int" %} + ins_encode %{ + __ imull($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (MulI src1 src2)); + effect(KILL cr); + + ins_cost(300); + format %{ "eimull $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eimull($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulI_rReg_imm(rRegI dst, rRegI src, immI imm, rFlagsReg cr) +%{ + match(Set dst (MulI src imm)); + effect(KILL cr); + + ins_cost(300); + format %{ "imull $dst, $src, $imm\t# int" %} + ins_encode %{ + __ imull($dst$$Register, $src$$Register, $imm$$constant); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulI_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (MulI dst (LoadI src))); + effect(KILL cr); + + ins_cost(350); + format %{ "imull $dst, $src\t# int" %} + ins_encode %{ + __ imull($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (MulI src1 (LoadI src2))); + effect(KILL cr); + + ins_cost(350); + format %{ "eimull $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eimull($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulI_mem_imm(rRegI dst, memory src, immI imm, rFlagsReg cr) +%{ + match(Set dst (MulI (LoadI src) imm)); + effect(KILL cr); + + ins_cost(300); + format %{ "imull $dst, $src, $imm\t# int" %} + ins_encode %{ + __ imull($dst$$Register, $src$$Address, $imm$$constant); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulAddS2I_rReg(rRegI dst, rRegI src1, rRegI src2, rRegI src3, rFlagsReg cr) +%{ + match(Set dst (MulAddS2I (Binary dst src1) (Binary src2 src3))); + effect(KILL cr, KILL src2); + + expand %{ mulI_rReg(dst, src1, cr); + mulI_rReg(src2, src3, cr); + addI_rReg(dst, src2, cr); %} +%} + +instruct mulL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (MulL dst src)); + effect(KILL cr); + + ins_cost(300); + format %{ "imulq $dst, $src\t# long" %} + ins_encode %{ + __ imulq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (MulL src1 src2)); + effect(KILL cr); + + ins_cost(300); + format %{ "eimulq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eimulq($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulL_rReg_imm(rRegL dst, rRegL src, immL32 imm, rFlagsReg cr) +%{ + match(Set dst (MulL src imm)); + effect(KILL cr); + + ins_cost(300); + format %{ "imulq $dst, $src, $imm\t# long" %} + ins_encode %{ + __ imulq($dst$$Register, $src$$Register, $imm$$constant); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct mulL_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (MulL dst (LoadL src))); + effect(KILL cr); + + ins_cost(350); + format %{ "imulq $dst, $src\t# long" %} + ins_encode %{ + __ imulq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (MulL src1 (LoadL src2))); + effect(KILL cr); + + ins_cost(350); + format %{ "eimulq $dst, $src1, $src2 \t# long" %} + ins_encode %{ + __ eimulq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulL_mem_imm(rRegL dst, memory src, immL32 imm, rFlagsReg cr) +%{ + match(Set dst (MulL (LoadL src) imm)); + effect(KILL cr); + + ins_cost(300); + format %{ "imulq $dst, $src, $imm\t# long" %} + ins_encode %{ + __ imulq($dst$$Register, $src$$Address, $imm$$constant); + %} + ins_pipe(ialu_reg_mem_alu0); +%} + +instruct mulHiL_rReg(rdx_RegL dst, rRegL src, rax_RegL rax, rFlagsReg cr) +%{ + match(Set dst (MulHiL src rax)); + effect(USE_KILL rax, KILL cr); + + ins_cost(300); + format %{ "imulq RDX:RAX, RAX, $src\t# mulhi" %} + ins_encode %{ + __ imulq($src$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct umulHiL_rReg(rdx_RegL dst, rRegL src, rax_RegL rax, rFlagsReg cr) +%{ + match(Set dst (UMulHiL src rax)); + effect(USE_KILL rax, KILL cr); + + ins_cost(300); + format %{ "mulq RDX:RAX, RAX, $src\t# umulhi" %} + ins_encode %{ + __ mulq($src$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, + rFlagsReg cr) +%{ + match(Set rax (DivI rax div)); + effect(KILL rdx, KILL cr); + + ins_cost(30*100+10*100); // XXX + format %{ "cmpl rax, 0x80000000\t# idiv\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpl $div, -1\n\t" + "je,s done\n" + "normal: cdql\n\t" + "idivl $div\n" + "done:" %} + ins_encode(cdql_enc(div)); + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct divL_rReg(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, + rFlagsReg cr) +%{ + match(Set rax (DivL rax div)); + effect(KILL rdx, KILL cr); + + ins_cost(30*100+10*100); // XXX + format %{ "movq rdx, 0x8000000000000000\t# ldiv\n\t" + "cmpq rax, rdx\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpq $div, -1\n\t" + "je,s done\n" + "normal: cdqq\n\t" + "idivq $div\n" + "done:" %} + ins_encode(cdqq_enc(div)); + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct udivI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, rFlagsReg cr) +%{ + match(Set rax (UDivI rax div)); + effect(KILL rdx, KILL cr); + + ins_cost(300); + format %{ "udivl $rax,$rax,$div\t# UDivI\n" %} + ins_encode %{ + __ udivI($rax$$Register, $div$$Register, $rdx$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct udivL_rReg(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, rFlagsReg cr) +%{ + match(Set rax (UDivL rax div)); + effect(KILL rdx, KILL cr); + + ins_cost(300); + format %{ "udivq $rax,$rax,$div\t# UDivL\n" %} + ins_encode %{ + __ udivL($rax$$Register, $div$$Register, $rdx$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +// Integer DIVMOD with Register, both quotient and mod results +instruct divModI_rReg_divmod(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, + rFlagsReg cr) +%{ + match(DivModI rax div); + effect(KILL cr); + + ins_cost(30*100+10*100); // XXX + format %{ "cmpl rax, 0x80000000\t# idiv\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpl $div, -1\n\t" + "je,s done\n" + "normal: cdql\n\t" + "idivl $div\n" + "done:" %} + ins_encode(cdql_enc(div)); + ins_pipe(pipe_slow); +%} + +// Long DIVMOD with Register, both quotient and mod results +instruct divModL_rReg_divmod(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, + rFlagsReg cr) +%{ + match(DivModL rax div); + effect(KILL cr); + + ins_cost(30*100+10*100); // XXX + format %{ "movq rdx, 0x8000000000000000\t# ldiv\n\t" + "cmpq rax, rdx\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpq $div, -1\n\t" + "je,s done\n" + "normal: cdqq\n\t" + "idivq $div\n" + "done:" %} + ins_encode(cdqq_enc(div)); + ins_pipe(pipe_slow); +%} + +// Unsigned integer DIVMOD with Register, both quotient and mod results +instruct udivModI_rReg_divmod(rax_RegI rax, no_rax_rdx_RegI tmp, rdx_RegI rdx, + no_rax_rdx_RegI div, rFlagsReg cr) +%{ + match(UDivModI rax div); + effect(TEMP tmp, KILL cr); + + ins_cost(300); + format %{ "udivl $rax,$rax,$div\t# begin UDivModI\n\t" + "umodl $rdx,$rax,$div\t! using $tmp as TEMP # end UDivModI\n" + %} + ins_encode %{ + __ udivmodI($rax$$Register, $div$$Register, $rdx$$Register, $tmp$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Unsigned long DIVMOD with Register, both quotient and mod results +instruct udivModL_rReg_divmod(rax_RegL rax, no_rax_rdx_RegL tmp, rdx_RegL rdx, + no_rax_rdx_RegL div, rFlagsReg cr) +%{ + match(UDivModL rax div); + effect(TEMP tmp, KILL cr); + + ins_cost(300); + format %{ "udivq $rax,$rax,$div\t# begin UDivModL\n\t" + "umodq $rdx,$rax,$div\t! using $tmp as TEMP # end UDivModL\n" + %} + ins_encode %{ + __ udivmodL($rax$$Register, $div$$Register, $rdx$$Register, $tmp$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct modI_rReg(rdx_RegI rdx, rax_RegI rax, no_rax_rdx_RegI div, + rFlagsReg cr) +%{ + match(Set rdx (ModI rax div)); + effect(KILL rax, KILL cr); + + ins_cost(300); // XXX + format %{ "cmpl rax, 0x80000000\t# irem\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpl $div, -1\n\t" + "je,s done\n" + "normal: cdql\n\t" + "idivl $div\n" + "done:" %} + ins_encode(cdql_enc(div)); + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct modL_rReg(rdx_RegL rdx, rax_RegL rax, no_rax_rdx_RegL div, + rFlagsReg cr) +%{ + match(Set rdx (ModL rax div)); + effect(KILL rax, KILL cr); + + ins_cost(300); // XXX + format %{ "movq rdx, 0x8000000000000000\t# lrem\n\t" + "cmpq rax, rdx\n\t" + "jne,s normal\n\t" + "xorl rdx, rdx\n\t" + "cmpq $div, -1\n\t" + "je,s done\n" + "normal: cdqq\n\t" + "idivq $div\n" + "done:" %} + ins_encode(cdqq_enc(div)); + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct umodI_rReg(rdx_RegI rdx, rax_RegI rax, no_rax_rdx_RegI div, rFlagsReg cr) +%{ + match(Set rdx (UModI rax div)); + effect(KILL rax, KILL cr); + + ins_cost(300); + format %{ "umodl $rdx,$rax,$div\t# UModI\n" %} + ins_encode %{ + __ umodI($rax$$Register, $div$$Register, $rdx$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct umodL_rReg(rdx_RegL rdx, rax_RegL rax, no_rax_rdx_RegL div, rFlagsReg cr) +%{ + match(Set rdx (UModL rax div)); + effect(KILL rax, KILL cr); + + ins_cost(300); + format %{ "umodq $rdx,$rax,$div\t# UModL\n" %} + ins_encode %{ + __ umodL($rax$$Register, $div$$Register, $rdx$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +// Integer Shift Instructions +// Shift Left by one, two, three +instruct salI_rReg_immI2(rRegI dst, immI2 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (LShiftI dst shift)); + effect(KILL cr); + + format %{ "sall $dst, $shift" %} + ins_encode %{ + __ sall($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by one, two, three +instruct salI_rReg_immI2_ndd(rRegI dst, rRegI src, immI2 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftI src shift)); + effect(KILL cr); + + format %{ "esall $dst, $src, $shift\t# int(ndd)" %} + ins_encode %{ + __ esall($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (LShiftI dst shift)); + effect(KILL cr); + + format %{ "sall $dst, $shift" %} + ins_encode %{ + __ sall($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftI src shift)); + effect(KILL cr); + + format %{ "esall $dst, $src, $shift\t# int (ndd)" %} + ins_encode %{ + __ esall($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct salI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftI (LoadI src) shift)); + effect(KILL cr); + + format %{ "esall $dst, $src, $shift\t# int (ndd)" %} + ins_encode %{ + __ esall($dst$$Register, $src$$Address, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (LShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "sall $dst, $shift" %} + ins_encode %{ + __ sall($dst$$Address, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Shift Left by variable +instruct salI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (LShiftI dst shift)); + effect(KILL cr); + + format %{ "sall $dst, $shift" %} + ins_encode %{ + __ sall($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Shift Left by variable +instruct salI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreI dst (LShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "sall $dst, $shift" %} + ins_encode %{ + __ sall($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct salI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (LShiftI src shift)); + + format %{ "shlxl $dst, $src, $shift" %} + ins_encode %{ + __ shlxl($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct salI_mem_rReg(rRegI dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (LShiftI (LoadI src) shift)); + ins_cost(175); + format %{ "shlxl $dst, $src, $shift" %} + ins_encode %{ + __ shlxl($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (RShiftI dst shift)); + effect(KILL cr); + + format %{ "sarl $dst, $shift" %} + ins_encode %{ + __ sarl($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (RShiftI src shift)); + effect(KILL cr); + + format %{ "esarl $dst, $src, $shift\t# int (ndd)" %} + ins_encode %{ + __ esarl($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct sarI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (RShiftI (LoadI src) shift)); + effect(KILL cr); + + format %{ "esarl $dst, $src, $shift\t# int (ndd)" %} + ins_encode %{ + __ esarl($dst$$Register, $src$$Address, $shift$$constant, false); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (RShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "sarl $dst, $shift" %} + ins_encode %{ + __ sarl($dst$$Address, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by variable +instruct sarI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (RShiftI dst shift)); + effect(KILL cr); + + format %{ "sarl $dst, $shift" %} + ins_encode %{ + __ sarl($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Arithmetic Shift Right by variable +instruct sarI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreI dst (RShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "sarl $dst, $shift" %} + ins_encode %{ + __ sarl($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct sarI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (RShiftI src shift)); + + format %{ "sarxl $dst, $src, $shift" %} + ins_encode %{ + __ sarxl($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct sarI_mem_rReg(rRegI dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (RShiftI (LoadI src) shift)); + ins_cost(175); + format %{ "sarxl $dst, $src, $shift" %} + ins_encode %{ + __ sarxl($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (URShiftI dst shift)); + effect(KILL cr); + + format %{ "shrl $dst, $shift" %} + ins_encode %{ + __ shrl($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (URShiftI src shift)); + effect(KILL cr); + + format %{ "eshrl $dst, $src, $shift\t # int (ndd)" %} + ins_encode %{ + __ eshrl($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct shrI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (URShiftI (LoadI src) shift)); + effect(KILL cr); + + format %{ "eshrl $dst, $src, $shift\t # int (ndd)" %} + ins_encode %{ + __ eshrl($dst$$Register, $src$$Address, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (URShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "shrl $dst, $shift" %} + ins_encode %{ + __ shrl($dst$$Address, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Logical Shift Right by variable +instruct shrI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (URShiftI dst shift)); + effect(KILL cr); + + format %{ "shrl $dst, $shift" %} + ins_encode %{ + __ shrl($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Logical Shift Right by variable +instruct shrI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreI dst (URShiftI (LoadI dst) shift))); + effect(KILL cr); + + format %{ "shrl $dst, $shift" %} + ins_encode %{ + __ shrl($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct shrI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (URShiftI src shift)); + + format %{ "shrxl $dst, $src, $shift" %} + ins_encode %{ + __ shrxl($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct shrI_mem_rReg(rRegI dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (URShiftI (LoadI src) shift)); + ins_cost(175); + format %{ "shrxl $dst, $src, $shift" %} + ins_encode %{ + __ shrxl($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Long Shift Instructions +// Shift Left by one, two, three +instruct salL_rReg_immI2(rRegL dst, immI2 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (LShiftL dst shift)); + effect(KILL cr); + + format %{ "salq $dst, $shift" %} + ins_encode %{ + __ salq($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by one, two, three +instruct salL_rReg_immI2_ndd(rRegL dst, rRegL src, immI2 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftL src shift)); + effect(KILL cr); + + format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ esalq($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salL_rReg_imm(rRegL dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (LShiftL dst shift)); + effect(KILL cr); + + format %{ "salq $dst, $shift" %} + ins_encode %{ + __ salq($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salL_rReg_imm_ndd(rRegL dst, rRegL src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftL src shift)); + effect(KILL cr); + + format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ esalq($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct salL_rReg_mem_imm_ndd(rRegL dst, memory src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (LShiftL (LoadL src) shift)); + effect(KILL cr); + + format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ esalq($dst$$Register, $src$$Address, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Shift Left by 8-bit immediate +instruct salL_mem_imm(memory dst, immI8 shift, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (LShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "salq $dst, $shift" %} + ins_encode %{ + __ salq($dst$$Address, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Shift Left by variable +instruct salL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (LShiftL dst shift)); + effect(KILL cr); + + format %{ "salq $dst, $shift" %} + ins_encode %{ + __ salq($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Shift Left by variable +instruct salL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreL dst (LShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "salq $dst, $shift" %} + ins_encode %{ + __ salq($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct salL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (LShiftL src shift)); + + format %{ "shlxq $dst, $src, $shift" %} + ins_encode %{ + __ shlxq($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct salL_mem_rReg(rRegL dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (LShiftL (LoadL src) shift)); + ins_cost(175); + format %{ "shlxq $dst, $src, $shift" %} + ins_encode %{ + __ shlxq($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarL_rReg_imm(rRegL dst, immI shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (RShiftL dst shift)); + effect(KILL cr); + + format %{ "sarq $dst, $shift" %} + ins_encode %{ + __ sarq($dst$$Register, (unsigned char)($shift$$constant & 0x3F)); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarL_rReg_imm_ndd(rRegL dst, rRegL src, immI shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (RShiftL src shift)); + effect(KILL cr); + + format %{ "esarq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ esarq($dst$$Register, $src$$Register, (unsigned char)($shift$$constant & 0x3F), false); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct sarL_rReg_mem_imm_ndd(rRegL dst, memory src, immI shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (RShiftL (LoadL src) shift)); + effect(KILL cr); + + format %{ "esarq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ esarq($dst$$Register, $src$$Address, (unsigned char)($shift$$constant & 0x3F), false); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by 8-bit immediate +instruct sarL_mem_imm(memory dst, immI shift, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (RShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "sarq $dst, $shift" %} + ins_encode %{ + __ sarq($dst$$Address, (unsigned char)($shift$$constant & 0x3F)); + %} + ins_pipe(ialu_mem_imm); +%} + +// Arithmetic Shift Right by variable +instruct sarL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (RShiftL dst shift)); + effect(KILL cr); + + format %{ "sarq $dst, $shift" %} + ins_encode %{ + __ sarq($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Arithmetic Shift Right by variable +instruct sarL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreL dst (RShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "sarq $dst, $shift" %} + ins_encode %{ + __ sarq($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct sarL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (RShiftL src shift)); + + format %{ "sarxq $dst, $src, $shift" %} + ins_encode %{ + __ sarxq($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct sarL_mem_rReg(rRegL dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (RShiftL (LoadL src) shift)); + ins_cost(175); + format %{ "sarxq $dst, $src, $shift" %} + ins_encode %{ + __ sarxq($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrL_rReg_imm(rRegL dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (URShiftL dst shift)); + effect(KILL cr); + + format %{ "shrq $dst, $shift" %} + ins_encode %{ + __ shrq($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrL_rReg_imm_ndd(rRegL dst, rRegL src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (URShiftL src shift)); + effect(KILL cr); + + format %{ "eshrq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ eshrq($dst$$Register, $src$$Register, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct shrL_rReg_mem_imm_ndd(rRegL dst, memory src, immI8 shift, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (URShiftL (LoadL src) shift)); + effect(KILL cr); + + format %{ "eshrq $dst, $src, $shift\t# long (ndd)" %} + ins_encode %{ + __ eshrq($dst$$Register, $src$$Address, $shift$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Logical Shift Right by 8-bit immediate +instruct shrL_mem_imm(memory dst, immI8 shift, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (URShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "shrq $dst, $shift" %} + ins_encode %{ + __ shrq($dst$$Address, $shift$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Logical Shift Right by variable +instruct shrL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (URShiftL dst shift)); + effect(KILL cr); + + format %{ "shrq $dst, $shift" %} + ins_encode %{ + __ shrq($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Logical Shift Right by variable +instruct shrL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2()); + match(Set dst (StoreL dst (URShiftL (LoadL dst) shift))); + effect(KILL cr); + + format %{ "shrq $dst, $shift" %} + ins_encode %{ + __ shrq($dst$$Address); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct shrL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (URShiftL src shift)); + + format %{ "shrxq $dst, $src, $shift" %} + ins_encode %{ + __ shrxq($dst$$Register, $src$$Register, $shift$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct shrL_mem_rReg(rRegL dst, memory src, rRegI shift) +%{ + predicate(VM_Version::supports_bmi2()); + match(Set dst (URShiftL (LoadL src) shift)); + ins_cost(175); + format %{ "shrxq $dst, $src, $shift" %} + ins_encode %{ + __ shrxq($dst$$Register, $src$$Address, $shift$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +// Logical Shift Right by 24, followed by Arithmetic Shift Left by 24. +// This idiom is used by the compiler for the i2b bytecode. +instruct i2b(rRegI dst, rRegI src, immI_24 twentyfour) +%{ + match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour)); + + format %{ "movsbl $dst, $src\t# i2b" %} + ins_encode %{ + __ movsbl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Logical Shift Right by 16, followed by Arithmetic Shift Left by 16. +// This idiom is used by the compiler the i2s bytecode. +instruct i2s(rRegI dst, rRegI src, immI_16 sixteen) +%{ + match(Set dst (RShiftI (LShiftI src sixteen) sixteen)); + + format %{ "movswl $dst, $src\t# i2s" %} + ins_encode %{ + __ movswl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// ROL/ROR instructions + +// Rotate left by constant. +instruct rolI_immI8_legacy(rRegI dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateLeft dst shift)); + effect(KILL cr); + format %{ "roll $dst, $shift" %} + ins_encode %{ + __ roll($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct rolI_immI8(rRegI dst, rRegI src, immI8 shift) +%{ + predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateLeft src shift)); + format %{ "rolxl $dst, $src, $shift" %} + ins_encode %{ + int shift = 32 - ($shift$$constant & 31); + __ rorxl($dst$$Register, $src$$Register, shift); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct rolI_mem_immI8(rRegI dst, memory src, immI8 shift) +%{ + predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateLeft (LoadI src) shift)); + ins_cost(175); + format %{ "rolxl $dst, $src, $shift" %} + ins_encode %{ + int shift = 32 - ($shift$$constant & 31); + __ rorxl($dst$$Register, $src$$Address, shift); + %} + ins_pipe(ialu_reg_mem); +%} + +// Rotate Left by variable +instruct rolI_rReg_Var(rRegI dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!UseAPX && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateLeft dst shift)); + effect(KILL cr); + format %{ "roll $dst, $shift" %} + ins_encode %{ + __ roll($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Left by variable +instruct rolI_rReg_Var_ndd(rRegI dst, rRegI src, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(UseAPX && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateLeft src shift)); + effect(KILL cr); + + format %{ "eroll $dst, $src, $shift\t# rotate left (int ndd)" %} + ins_encode %{ + __ eroll($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Right by constant. +instruct rorI_immI8_legacy(rRegI dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateRight dst shift)); + effect(KILL cr); + format %{ "rorl $dst, $shift" %} + ins_encode %{ + __ rorl($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Rotate Right by constant. +instruct rorI_immI8(rRegI dst, rRegI src, immI8 shift) +%{ + predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateRight src shift)); + format %{ "rorxl $dst, $src, $shift" %} + ins_encode %{ + __ rorxl($dst$$Register, $src$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct rorI_mem_immI8(rRegI dst, memory src, immI8 shift) +%{ + predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateRight (LoadI src) shift)); + ins_cost(175); + format %{ "rorxl $dst, $src, $shift" %} + ins_encode %{ + __ rorxl($dst$$Register, $src$$Address, $shift$$constant); + %} + ins_pipe(ialu_reg_mem); +%} + +// Rotate Right by variable +instruct rorI_rReg_Var(rRegI dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!UseAPX && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateRight dst shift)); + effect(KILL cr); + format %{ "rorl $dst, $shift" %} + ins_encode %{ + __ rorl($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Right by variable +instruct rorI_rReg_Var_ndd(rRegI dst, rRegI src, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(UseAPX && n->bottom_type()->basic_type() == T_INT); + match(Set dst (RotateRight src shift)); + effect(KILL cr); + + format %{ "erorl $dst, $src, $shift\t# rotate right(int ndd)" %} + ins_encode %{ + __ erorl($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Left by constant. +instruct rolL_immI8_legacy(rRegL dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateLeft dst shift)); + effect(KILL cr); + format %{ "rolq $dst, $shift" %} + ins_encode %{ + __ rolq($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct rolL_immI8(rRegL dst, rRegL src, immI8 shift) +%{ + predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateLeft src shift)); + format %{ "rolxq $dst, $src, $shift" %} + ins_encode %{ + int shift = 64 - ($shift$$constant & 63); + __ rorxq($dst$$Register, $src$$Register, shift); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct rolL_mem_immI8(rRegL dst, memory src, immI8 shift) +%{ + predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateLeft (LoadL src) shift)); + ins_cost(175); + format %{ "rolxq $dst, $src, $shift" %} + ins_encode %{ + int shift = 64 - ($shift$$constant & 63); + __ rorxq($dst$$Register, $src$$Address, shift); + %} + ins_pipe(ialu_reg_mem); +%} + +// Rotate Left by variable +instruct rolL_rReg_Var(rRegL dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!UseAPX && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateLeft dst shift)); + effect(KILL cr); + format %{ "rolq $dst, $shift" %} + ins_encode %{ + __ rolq($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Left by variable +instruct rolL_rReg_Var_ndd(rRegL dst, rRegL src, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(UseAPX && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateLeft src shift)); + effect(KILL cr); + + format %{ "erolq $dst, $src, $shift\t# rotate left(long ndd)" %} + ins_encode %{ + __ erolq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Right by constant. +instruct rorL_immI8_legacy(rRegL dst, immI8 shift, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateRight dst shift)); + effect(KILL cr); + format %{ "rorq $dst, $shift" %} + ins_encode %{ + __ rorq($dst$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg); +%} + +// Rotate Right by constant +instruct rorL_immI8(rRegL dst, rRegL src, immI8 shift) +%{ + predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateRight src shift)); + format %{ "rorxq $dst, $src, $shift" %} + ins_encode %{ + __ rorxq($dst$$Register, $src$$Register, $shift$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct rorL_mem_immI8(rRegL dst, memory src, immI8 shift) +%{ + predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateRight (LoadL src) shift)); + ins_cost(175); + format %{ "rorxq $dst, $src, $shift" %} + ins_encode %{ + __ rorxq($dst$$Register, $src$$Address, $shift$$constant); + %} + ins_pipe(ialu_reg_mem); +%} + +// Rotate Right by variable +instruct rorL_rReg_Var(rRegL dst, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(!UseAPX && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateRight dst shift)); + effect(KILL cr); + format %{ "rorq $dst, $shift" %} + ins_encode %{ + __ rorq($dst$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Rotate Right by variable +instruct rorL_rReg_Var_ndd(rRegL dst, rRegL src, rcx_RegI shift, rFlagsReg cr) +%{ + predicate(UseAPX && n->bottom_type()->basic_type() == T_LONG); + match(Set dst (RotateRight src shift)); + effect(KILL cr); + + format %{ "erorq $dst, $src, $shift\t# rotate right(long ndd)" %} + ins_encode %{ + __ erorq($dst$$Register, $src$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +//----------------------------- CompressBits/ExpandBits ------------------------ + +instruct compressBitsL_reg(rRegL dst, rRegL src, rRegL mask) %{ + predicate(n->bottom_type()->isa_long()); + match(Set dst (CompressBits src mask)); + format %{ "pextq $dst, $src, $mask\t! parallel bit extract" %} + ins_encode %{ + __ pextq($dst$$Register, $src$$Register, $mask$$Register); + %} + ins_pipe( pipe_slow ); +%} + +instruct expandBitsL_reg(rRegL dst, rRegL src, rRegL mask) %{ + predicate(n->bottom_type()->isa_long()); + match(Set dst (ExpandBits src mask)); + format %{ "pdepq $dst, $src, $mask\t! parallel bit deposit" %} + ins_encode %{ + __ pdepq($dst$$Register, $src$$Register, $mask$$Register); + %} + ins_pipe( pipe_slow ); +%} + +instruct compressBitsL_mem(rRegL dst, rRegL src, memory mask) %{ + predicate(n->bottom_type()->isa_long()); + match(Set dst (CompressBits src (LoadL mask))); + format %{ "pextq $dst, $src, $mask\t! parallel bit extract" %} + ins_encode %{ + __ pextq($dst$$Register, $src$$Register, $mask$$Address); + %} + ins_pipe( pipe_slow ); +%} + +instruct expandBitsL_mem(rRegL dst, rRegL src, memory mask) %{ + predicate(n->bottom_type()->isa_long()); + match(Set dst (ExpandBits src (LoadL mask))); + format %{ "pdepq $dst, $src, $mask\t! parallel bit deposit" %} + ins_encode %{ + __ pdepq($dst$$Register, $src$$Register, $mask$$Address); + %} + ins_pipe( pipe_slow ); +%} + + +// Logical Instructions + +// Integer Logical Instructions + +// And Instructions +// And Register with Register +instruct andI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andl $dst, $src\t# int" %} + ins_encode %{ + __ andl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// And Register with Register using New Data Destination (NDD) +instruct andI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eandl($dst$$Register, $src1$$Register, $src2$$Register, false); + + %} + ins_pipe(ialu_reg_reg); +%} + +// And Register with Immediate 255 +instruct andI_rReg_imm255(rRegI dst, rRegI src, immI_255 mask) +%{ + match(Set dst (AndI src mask)); + + format %{ "movzbl $dst, $src\t# int & 0xFF" %} + ins_encode %{ + __ movzbl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Immediate 255 and promote to long +instruct andI2L_rReg_imm255(rRegL dst, rRegI src, immI_255 mask) +%{ + match(Set dst (ConvI2L (AndI src mask))); + + format %{ "movzbl $dst, $src\t# int & 0xFF -> long" %} + ins_encode %{ + __ movzbl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Immediate 65535 +instruct andI_rReg_imm65535(rRegI dst, rRegI src, immI_65535 mask) +%{ + match(Set dst (AndI src mask)); + + format %{ "movzwl $dst, $src\t# int & 0xFFFF" %} + ins_encode %{ + __ movzwl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Immediate 65535 and promote to long +instruct andI2L_rReg_imm65535(rRegL dst, rRegI src, immI_65535 mask) +%{ + match(Set dst (ConvI2L (AndI src mask))); + + format %{ "movzwl $dst, $src\t# int & 0xFFFF -> long" %} + ins_encode %{ + __ movzwl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Can skip int2long conversions after AND with small bitmask +instruct convI2LAndI_reg_immIbitmask(rRegL dst, rRegI src, immI_Pow2M1 mask, rRegI tmp, rFlagsReg cr) +%{ + predicate(VM_Version::supports_bmi2()); + ins_cost(125); + effect(TEMP tmp, KILL cr); + match(Set dst (ConvI2L (AndI src mask))); + format %{ "bzhiq $dst, $src, $mask \t# using $tmp as TEMP, int & immI_Pow2M1 -> long" %} + ins_encode %{ + __ movl($tmp$$Register, exact_log2($mask$$constant + 1)); + __ bzhiq($dst$$Register, $src$$Register, $tmp$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// And Register with Immediate +instruct andI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andl $dst, $src\t# int" %} + ins_encode %{ + __ andl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct andI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eandl($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct andI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndI (LoadI src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eandl($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Memory +instruct andI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndI dst (LoadI src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "andl $dst, $src\t# int" %} + ins_encode %{ + __ andl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct andI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndI src1 (LoadI src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "eandl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eandl($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// And Memory with Register +instruct andB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreB dst (AndI (LoadB dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "andb $dst, $src\t# byte" %} + ins_encode %{ + __ andb($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct andI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (AndI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "andl $dst, $src\t# int" %} + ins_encode %{ + __ andl($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// And Memory with Immediate +instruct andI_mem_imm(memory dst, immI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (AndI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "andl $dst, $src\t# int" %} + ins_encode %{ + __ andl($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// BMI1 instructions +instruct andnI_rReg_rReg_mem(rRegI dst, rRegI src1, memory src2, immI_M1 minus_1, rFlagsReg cr) %{ + match(Set dst (AndI (XorI src1 minus_1) (LoadI src2))); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "andnl $dst, $src1, $src2" %} + + ins_encode %{ + __ andnl($dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct andnI_rReg_rReg_rReg(rRegI dst, rRegI src1, rRegI src2, immI_M1 minus_1, rFlagsReg cr) %{ + match(Set dst (AndI (XorI src1 minus_1) src2)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andnl $dst, $src1, $src2" %} + + ins_encode %{ + __ andnl($dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct blsiI_rReg_rReg(rRegI dst, rRegI src, immI_0 imm_zero, rFlagsReg cr) %{ + match(Set dst (AndI (SubI imm_zero src) src)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsil $dst, $src" %} + + ins_encode %{ + __ blsil($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct blsiI_rReg_mem(rRegI dst, memory src, immI_0 imm_zero, rFlagsReg cr) %{ + match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) )); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsil $dst, $src" %} + + ins_encode %{ + __ blsil($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct blsmskI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsmskl $dst, $src" %} + + ins_encode %{ + __ blsmskl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct blsmskI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (XorI (AddI src minus_1) src)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsmskl $dst, $src" %} + + ins_encode %{ + __ blsmskl($dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg); +%} + +instruct blsrI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (AndI (AddI src minus_1) src) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsrl $dst, $src" %} + + ins_encode %{ + __ blsrl($dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg_mem); +%} + +instruct blsrI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsrl $dst, $src" %} + + ins_encode %{ + __ blsrl($dst$$Register, $src$$Address); + %} + + ins_pipe(ialu_reg); +%} + +// Or Instructions +// Or Register with Register +instruct orI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "orl $dst, $src\t# int" %} + ins_encode %{ + __ orl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Or Register with Register using New Data Destination (NDD) +instruct orI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eorl($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Or Register with Immediate +instruct orI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "orl $dst, $src\t# int" %} + ins_encode %{ + __ orl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct orI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eorl($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct orI_rReg_imm_rReg_ndd(rRegI dst, immI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorl $dst, $src2, $src1\t# int ndd" %} + ins_encode %{ + __ eorl($dst$$Register, $src2$$Register, $src1$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct orI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrI (LoadI src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eorl($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Or Register with Memory +instruct orI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrI dst (LoadI src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "orl $dst, $src\t# int" %} + ins_encode %{ + __ orl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct orI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrI src1 (LoadI src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "eorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ eorl($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// Or Memory with Register +instruct orB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreB dst (OrI (LoadB dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "orb $dst, $src\t# byte" %} + ins_encode %{ + __ orb($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct orI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (OrI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "orl $dst, $src\t# int" %} + ins_encode %{ + __ orl($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Or Memory with Immediate +instruct orI_mem_imm(memory dst, immI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (OrI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "orl $dst, $src\t# int" %} + ins_encode %{ + __ orl($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +// Xor Instructions +// Xor Register with Register +instruct xorI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (XorI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "xorl $dst, $src\t# int" %} + ins_encode %{ + __ xorl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Xor Register with Register using New Data Destination (NDD) +instruct xorI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "exorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ exorl($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Xor Register with Immediate -1 +instruct xorI_rReg_im1(rRegI dst, immI_M1 imm) +%{ + predicate(!UseAPX); + match(Set dst (XorI dst imm)); + + format %{ "notl $dst" %} + ins_encode %{ + __ notl($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct xorI_rReg_im1_ndd(rRegI dst, rRegI src, immI_M1 imm) +%{ + match(Set dst (XorI src imm)); + predicate(UseAPX); + + format %{ "enotl $dst, $src" %} + ins_encode %{ + __ enotl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Xor Register with Immediate +instruct xorI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) +%{ + // Strict predicate check to make selection of xorI_rReg_im1 cost agnostic if immI src is -1. + predicate(!UseAPX && n->in(2)->bottom_type()->is_int()->get_con() != -1); + match(Set dst (XorI dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "xorl $dst, $src\t# int" %} + ins_encode %{ + __ xorl($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct xorI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) +%{ + // Strict predicate check to make selection of xorI_rReg_im1_ndd cost agnostic if immI src2 is -1. + predicate(UseAPX && n->in(2)->bottom_type()->is_int()->get_con() != -1); + match(Set dst (XorI src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "exorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ exorl($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Xor Memory with Immediate +instruct xorI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorI (LoadI src1) src2)); + effect(KILL cr); + ins_cost(150); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "exorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ exorl($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Xor Register with Memory +instruct xorI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (XorI dst (LoadI src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "xorl $dst, $src\t# int" %} + ins_encode %{ + __ xorl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct xorI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorI src1 (LoadI src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "exorl $dst, $src1, $src2\t# int ndd" %} + ins_encode %{ + __ exorl($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// Xor Memory with Register +instruct xorB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreB dst (XorI (LoadB dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "xorb $dst, $src\t# byte" %} + ins_encode %{ + __ xorb($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct xorI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (XorI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "xorl $dst, $src\t# int" %} + ins_encode %{ + __ xorl($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Xor Memory with Immediate +instruct xorI_mem_imm(memory dst, immI src, rFlagsReg cr) +%{ + match(Set dst (StoreI dst (XorI (LoadI dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "xorl $dst, $src\t# int" %} + ins_encode %{ + __ xorl($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + + +// Long Logical Instructions + +// And Instructions +// And Register with Register +instruct andL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andq $dst, $src\t# long" %} + ins_encode %{ + __ andq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// And Register with Register using New Data Destination (NDD) +instruct andL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eandq($dst$$Register, $src1$$Register, $src2$$Register, false); + + %} + ins_pipe(ialu_reg_reg); +%} + +// And Register with Immediate 255 +instruct andL_rReg_imm255(rRegL dst, rRegL src, immL_255 mask) +%{ + match(Set dst (AndL src mask)); + + format %{ "movzbl $dst, $src\t# long & 0xFF" %} + ins_encode %{ + // movzbl zeroes out the upper 32-bit and does not need REX.W + __ movzbl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Immediate 65535 +instruct andL_rReg_imm65535(rRegL dst, rRegL src, immL_65535 mask) +%{ + match(Set dst (AndL src mask)); + + format %{ "movzwl $dst, $src\t# long & 0xFFFF" %} + ins_encode %{ + // movzwl zeroes out the upper 32-bit and does not need REX.W + __ movzwl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Immediate +instruct andL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andq $dst, $src\t# long" %} + ins_encode %{ + __ andq($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct andL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eandq($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct andL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eandq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eandq($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// And Register with Memory +instruct andL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (AndL dst (LoadL src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "andq $dst, $src\t# long" %} + ins_encode %{ + __ andq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct andL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (AndL src1 (LoadL src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "eandq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eandq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// And Memory with Register +instruct andL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (AndL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "andq $dst, $src\t# long" %} + ins_encode %{ + __ andq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// And Memory with Immediate +instruct andL_mem_imm(memory dst, immL32 src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (AndL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "andq $dst, $src\t# long" %} + ins_encode %{ + __ andq($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct btrL_mem_imm(memory dst, immL_NotPow2 con, rFlagsReg cr) +%{ + // con should be a pure 64-bit immediate given that not(con) is a power of 2 + // because AND/OR works well enough for 8/32-bit values. + predicate(log2i_graceful(~n->in(3)->in(2)->get_long()) > 30); + + match(Set dst (StoreL dst (AndL (LoadL dst) con))); + effect(KILL cr); + + ins_cost(125); + format %{ "btrq $dst, log2(not($con))\t# long" %} + ins_encode %{ + __ btrq($dst$$Address, log2i_exact((julong)~$con$$constant)); + %} + ins_pipe(ialu_mem_imm); +%} + +// BMI1 instructions +instruct andnL_rReg_rReg_mem(rRegL dst, rRegL src1, memory src2, immL_M1 minus_1, rFlagsReg cr) %{ + match(Set dst (AndL (XorL src1 minus_1) (LoadL src2))); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "andnq $dst, $src1, $src2" %} + + ins_encode %{ + __ andnq($dst$$Register, $src1$$Register, $src2$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct andnL_rReg_rReg_rReg(rRegL dst, rRegL src1, rRegL src2, immL_M1 minus_1, rFlagsReg cr) %{ + match(Set dst (AndL (XorL src1 minus_1) src2)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "andnq $dst, $src1, $src2" %} + + ins_encode %{ + __ andnq($dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct blsiL_rReg_rReg(rRegL dst, rRegL src, immL0 imm_zero, rFlagsReg cr) %{ + match(Set dst (AndL (SubL imm_zero src) src)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsiq $dst, $src" %} + + ins_encode %{ + __ blsiq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct blsiL_rReg_mem(rRegL dst, memory src, immL0 imm_zero, rFlagsReg cr) %{ + match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) )); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsiq $dst, $src" %} + + ins_encode %{ + __ blsiq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct blsmskL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsmskq $dst, $src" %} + + ins_encode %{ + __ blsmskq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct blsmskL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (XorL (AddL src minus_1) src)); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsmskq $dst, $src" %} + + ins_encode %{ + __ blsmskq($dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg); +%} + +instruct blsrL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (AndL (AddL src minus_1) src) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + format %{ "blsrq $dst, $src" %} + + ins_encode %{ + __ blsrq($dst$$Register, $src$$Register); + %} + + ins_pipe(ialu_reg); +%} + +instruct blsrL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) +%{ + match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src)) ); + predicate(UseBMI1Instructions); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); + + ins_cost(125); + format %{ "blsrq $dst, $src" %} + + ins_encode %{ + __ blsrq($dst$$Register, $src$$Address); + %} + + ins_pipe(ialu_reg); +%} + +// Or Instructions +// Or Register with Register +instruct orL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Or Register with Register using New Data Destination (NDD) +instruct orL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src1$$Register, $src2$$Register, false); + + %} + ins_pipe(ialu_reg_reg); +%} + +// Use any_RegP to match R15 (TLS register) without spilling. +instruct orL_rReg_castP2X(rRegL dst, any_RegP src, rFlagsReg cr) %{ + match(Set dst (OrL dst (CastP2X src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct orL_rReg_castP2X_ndd(rRegL dst, any_RegP src1, any_RegP src2, rFlagsReg cr) %{ + match(Set dst (OrL src1 (CastP2X src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Or Register with Immediate +instruct orL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct orL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +instruct orL_rReg_imm_rReg_ndd(rRegL dst, immL32 src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorq $dst, $src2, $src1\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src2$$Register, $src1$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Or Memory with Immediate +instruct orL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "eorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Or Register with Memory +instruct orL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (OrL dst (LoadL src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct orL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (OrL src1 (LoadL src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "eorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ eorq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// Or Memory with Register +instruct orL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (OrL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Or Memory with Immediate +instruct orL_mem_imm(memory dst, immL32 src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (OrL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "orq $dst, $src\t# long" %} + ins_encode %{ + __ orq($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct btsL_mem_imm(memory dst, immL_Pow2 con, rFlagsReg cr) +%{ + // con should be a pure 64-bit power of 2 immediate + // because AND/OR works well enough for 8/32-bit values. + predicate(log2i_graceful(n->in(3)->in(2)->get_long()) > 31); + + match(Set dst (StoreL dst (OrL (LoadL dst) con))); + effect(KILL cr); + + ins_cost(125); + format %{ "btsq $dst, log2($con)\t# long" %} + ins_encode %{ + __ btsq($dst$$Address, log2i_exact((julong)$con$$constant)); + %} + ins_pipe(ialu_mem_imm); +%} + +// Xor Instructions +// Xor Register with Register +instruct xorL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (XorL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "xorq $dst, $src\t# long" %} + ins_encode %{ + __ xorq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Xor Register with Register using New Data Destination (NDD) +instruct xorL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "exorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ exorq($dst$$Register, $src1$$Register, $src2$$Register, false); + %} + ins_pipe(ialu_reg_reg); +%} + +// Xor Register with Immediate -1 +instruct xorL_rReg_im1(rRegL dst, immL_M1 imm) +%{ + predicate(!UseAPX); + match(Set dst (XorL dst imm)); + + format %{ "notq $dst" %} + ins_encode %{ + __ notq($dst$$Register); + %} + ins_pipe(ialu_reg); +%} + +instruct xorL_rReg_im1_ndd(rRegL dst,rRegL src, immL_M1 imm) +%{ + predicate(UseAPX); + match(Set dst (XorL src imm)); + + format %{ "enotq $dst, $src" %} + ins_encode %{ + __ enotq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg); +%} + +// Xor Register with Immediate +instruct xorL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) +%{ + // Strict predicate check to make selection of xorL_rReg_im1 cost agnostic if immL32 src is -1. + predicate(!UseAPX && n->in(2)->bottom_type()->is_long()->get_con() != -1L); + match(Set dst (XorL dst src)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "xorq $dst, $src\t# long" %} + ins_encode %{ + __ xorq($dst$$Register, $src$$constant); + %} + ins_pipe(ialu_reg); +%} + +instruct xorL_rReg_rReg_imm(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) +%{ + // Strict predicate check to make selection of xorL_rReg_im1_ndd cost agnostic if immL32 src2 is -1. + predicate(UseAPX && n->in(2)->bottom_type()->is_long()->get_con() != -1L); + match(Set dst (XorL src1 src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + format %{ "exorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ exorq($dst$$Register, $src1$$Register, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Xor Memory with Immediate +instruct xorL_rReg_mem_imm(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorL (LoadL src1) src2)); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + ins_cost(150); + + format %{ "exorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ exorq($dst$$Register, $src1$$Address, $src2$$constant, false); + %} + ins_pipe(ialu_reg); +%} + +// Xor Register with Memory +instruct xorL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) +%{ + predicate(!UseAPX); + match(Set dst (XorL dst (LoadL src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "xorq $dst, $src\t# long" %} + ins_encode %{ + __ xorq($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct xorL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) +%{ + predicate(UseAPX); + match(Set dst (XorL src1 (LoadL src2))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "exorq $dst, $src1, $src2\t# long ndd" %} + ins_encode %{ + __ exorq($dst$$Register, $src1$$Register, $src2$$Address, false); + %} + ins_pipe(ialu_reg_mem); +%} + +// Xor Memory with Register +instruct xorL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (XorL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(150); + format %{ "xorq $dst, $src\t# long" %} + ins_encode %{ + __ xorq($dst$$Address, $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +// Xor Memory with Immediate +instruct xorL_mem_imm(memory dst, immL32 src, rFlagsReg cr) +%{ + match(Set dst (StoreL dst (XorL (LoadL dst) src))); + effect(KILL cr); + flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); + + ins_cost(125); + format %{ "xorq $dst, $src\t# long" %} + ins_encode %{ + __ xorq($dst$$Address, $src$$constant); + %} + ins_pipe(ialu_mem_imm); +%} + +instruct cmpLTMask(rRegI dst, rRegI p, rRegI q, rFlagsReg cr) +%{ + match(Set dst (CmpLTMask p q)); + effect(KILL cr); + + ins_cost(400); + format %{ "cmpl $p, $q\t# cmpLTMask\n\t" + "setcc $dst \t# emits setlt + movzbl or setzul for APX" + "negl $dst" %} + ins_encode %{ + __ cmpl($p$$Register, $q$$Register); + __ setcc(Assembler::less, $dst$$Register); + __ negl($dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpLTMask0(rRegI dst, immI_0 zero, rFlagsReg cr) +%{ + match(Set dst (CmpLTMask dst zero)); + effect(KILL cr); + + ins_cost(100); + format %{ "sarl $dst, #31\t# cmpLTMask0" %} + ins_encode %{ + __ sarl($dst$$Register, 31); + %} + ins_pipe(ialu_reg); +%} + +/* Better to save a register than avoid a branch */ +instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr) +%{ + match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q))); + effect(KILL cr); + ins_cost(300); + format %{ "subl $p,$q\t# cadd_cmpLTMask\n\t" + "jge done\n\t" + "addl $p,$y\n" + "done: " %} + ins_encode %{ + Register Rp = $p$$Register; + Register Rq = $q$$Register; + Register Ry = $y$$Register; + Label done; + __ subl(Rp, Rq); + __ jccb(Assembler::greaterEqual, done); + __ addl(Rp, Ry); + __ bind(done); + %} + ins_pipe(pipe_cmplt); +%} + +/* Better to save a register than avoid a branch */ +instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr) +%{ + match(Set y (AndI (CmpLTMask p q) y)); + effect(KILL cr); + + ins_cost(300); + + format %{ "cmpl $p, $q\t# and_cmpLTMask\n\t" + "jlt done\n\t" + "xorl $y, $y\n" + "done: " %} + ins_encode %{ + Register Rp = $p$$Register; + Register Rq = $q$$Register; + Register Ry = $y$$Register; + Label done; + __ cmpl(Rp, Rq); + __ jccb(Assembler::less, done); + __ xorl(Ry, Ry); + __ bind(done); + %} + ins_pipe(pipe_cmplt); +%} + + +//---------- FP Instructions------------------------------------------------ + +// Really expensive, avoid +instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2) +%{ + match(Set cr (CmpF src1 src2)); + + ins_cost(500); + format %{ "ucomiss $src1, $src2\n\t" + "jnp,s exit\n\t" + "pushfq\t# saw NaN, set CF\n\t" + "andq [rsp], #0xffffff2b\n\t" + "popfq\n" + "exit:" %} + ins_encode %{ + __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); + emit_cmpfp_fixup(masm); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpF_cc_reg_CF(rFlagsRegUCF cr, regF src1, regF src2) %{ + match(Set cr (CmpF src1 src2)); + + ins_cost(100); + format %{ "ucomiss $src1, $src2" %} + ins_encode %{ + __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpF_cc_memCF(rFlagsRegUCF cr, regF src1, memory src2) %{ + match(Set cr (CmpF src1 (LoadF src2))); + + ins_cost(100); + format %{ "ucomiss $src1, $src2" %} + ins_encode %{ + __ ucomiss($src1$$XMMRegister, $src2$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src, immF con) %{ + match(Set cr (CmpF src con)); + ins_cost(100); + format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con" %} + ins_encode %{ + __ ucomiss($src$$XMMRegister, $constantaddress($con)); + %} + ins_pipe(pipe_slow); +%} + +// Really expensive, avoid +instruct cmpD_cc_reg(rFlagsRegU cr, regD src1, regD src2) +%{ + match(Set cr (CmpD src1 src2)); + + ins_cost(500); + format %{ "ucomisd $src1, $src2\n\t" + "jnp,s exit\n\t" + "pushfq\t# saw NaN, set CF\n\t" + "andq [rsp], #0xffffff2b\n\t" + "popfq\n" + "exit:" %} + ins_encode %{ + __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); + emit_cmpfp_fixup(masm); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpD_cc_reg_CF(rFlagsRegUCF cr, regD src1, regD src2) %{ + match(Set cr (CmpD src1 src2)); + + ins_cost(100); + format %{ "ucomisd $src1, $src2 test" %} + ins_encode %{ + __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpD_cc_memCF(rFlagsRegUCF cr, regD src1, memory src2) %{ + match(Set cr (CmpD src1 (LoadD src2))); + + ins_cost(100); + format %{ "ucomisd $src1, $src2" %} + ins_encode %{ + __ ucomisd($src1$$XMMRegister, $src2$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src, immD con) %{ + match(Set cr (CmpD src con)); + ins_cost(100); + format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con" %} + ins_encode %{ + __ ucomisd($src$$XMMRegister, $constantaddress($con)); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpF_reg(rRegI dst, regF src1, regF src2, rFlagsReg cr) +%{ + match(Set dst (CmpF3 src1 src2)); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomiss $src1, $src2\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpF_mem(rRegI dst, regF src1, memory src2, rFlagsReg cr) +%{ + match(Set dst (CmpF3 src1 (LoadF src2))); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomiss $src1, $src2\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomiss($src1$$XMMRegister, $src2$$Address); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpF_imm(rRegI dst, regF src, immF con, rFlagsReg cr) %{ + match(Set dst (CmpF3 src con)); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomiss($src$$XMMRegister, $constantaddress($con)); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpD_reg(rRegI dst, regD src1, regD src2, rFlagsReg cr) +%{ + match(Set dst (CmpD3 src1 src2)); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomisd $src1, $src2\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpD_mem(rRegI dst, regD src1, memory src2, rFlagsReg cr) +%{ + match(Set dst (CmpD3 src1 (LoadD src2))); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomisd $src1, $src2\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomisd($src1$$XMMRegister, $src2$$Address); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +// Compare into -1,0,1 +instruct cmpD_imm(rRegI dst, regD src, immD con, rFlagsReg cr) %{ + match(Set dst (CmpD3 src con)); + effect(KILL cr); + + ins_cost(275); + format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con\n\t" + "movl $dst, #-1\n\t" + "jp,s done\n\t" + "jb,s done\n\t" + "setne $dst\n\t" + "movzbl $dst, $dst\n" + "done:" %} + ins_encode %{ + __ ucomisd($src$$XMMRegister, $constantaddress($con)); + emit_cmpfp3(masm, $dst$$Register); + %} + ins_pipe(pipe_slow); +%} + +//----------Arithmetic Conversion Instructions--------------------------------- + +instruct convF2D_reg_reg(regD dst, regF src) +%{ + match(Set dst (ConvF2D src)); + + format %{ "cvtss2sd $dst, $src" %} + ins_encode %{ + __ cvtss2sd ($dst$$XMMRegister, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convF2D_reg_mem(regD dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvF2D (LoadF src))); + + format %{ "cvtss2sd $dst, $src" %} + ins_encode %{ + __ cvtss2sd ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convD2F_reg_reg(regF dst, regD src) +%{ + match(Set dst (ConvD2F src)); + + format %{ "cvtsd2ss $dst, $src" %} + ins_encode %{ + __ cvtsd2ss ($dst$$XMMRegister, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convD2F_reg_mem(regF dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvD2F (LoadD src))); + + format %{ "cvtsd2ss $dst, $src" %} + ins_encode %{ + __ cvtsd2ss ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +// XXX do mem variants +instruct convF2I_reg_reg(rRegI dst, regF src, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx10_2()); + match(Set dst (ConvF2I src)); + effect(KILL cr); + format %{ "convert_f2i $dst, $src" %} + ins_encode %{ + __ convertF2I(T_INT, T_FLOAT, $dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convF2I_reg_reg_avx10(rRegI dst, regF src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvF2I src)); + format %{ "evcvttss2sisl $dst, $src" %} + ins_encode %{ + __ evcvttss2sisl($dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convF2I_reg_mem_avx10(rRegI dst, memory src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvF2I (LoadF src))); + format %{ "evcvttss2sisl $dst, $src" %} + ins_encode %{ + __ evcvttss2sisl($dst$$Register, $src$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct convF2L_reg_reg(rRegL dst, regF src, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx10_2()); + match(Set dst (ConvF2L src)); + effect(KILL cr); + format %{ "convert_f2l $dst, $src"%} + ins_encode %{ + __ convertF2I(T_LONG, T_FLOAT, $dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convF2L_reg_reg_avx10(rRegL dst, regF src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvF2L src)); + format %{ "evcvttss2sisq $dst, $src" %} + ins_encode %{ + __ evcvttss2sisq($dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convF2L_reg_mem_avx10(rRegL dst, memory src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvF2L (LoadF src))); + format %{ "evcvttss2sisq $dst, $src" %} + ins_encode %{ + __ evcvttss2sisq($dst$$Register, $src$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2I_reg_reg(rRegI dst, regD src, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx10_2()); + match(Set dst (ConvD2I src)); + effect(KILL cr); + format %{ "convert_d2i $dst, $src"%} + ins_encode %{ + __ convertF2I(T_INT, T_DOUBLE, $dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2I_reg_reg_avx10(rRegI dst, regD src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvD2I src)); + format %{ "evcvttsd2sisl $dst, $src" %} + ins_encode %{ + __ evcvttsd2sisl($dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2I_reg_mem_avx10(rRegI dst, memory src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvD2I (LoadD src))); + format %{ "evcvttsd2sisl $dst, $src" %} + ins_encode %{ + __ evcvttsd2sisl($dst$$Register, $src$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2L_reg_reg(rRegL dst, regD src, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx10_2()); + match(Set dst (ConvD2L src)); + effect(KILL cr); + format %{ "convert_d2l $dst, $src"%} + ins_encode %{ + __ convertF2I(T_LONG, T_DOUBLE, $dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2L_reg_reg_avx10(rRegL dst, regD src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvD2L src)); + format %{ "evcvttsd2sisq $dst, $src" %} + ins_encode %{ + __ evcvttsd2sisq($dst$$Register, $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct convD2L_reg_mem_avx10(rRegL dst, memory src) +%{ + predicate(VM_Version::supports_avx10_2()); + match(Set dst (ConvD2L (LoadD src))); + format %{ "evcvttsd2sisq $dst, $src" %} + ins_encode %{ + __ evcvttsd2sisq($dst$$Register, $src$$Address); + %} + ins_pipe(pipe_slow); +%} + +instruct round_double_reg(rRegL dst, regD src, rRegL rtmp, rcx_RegL rcx, rFlagsReg cr) +%{ + match(Set dst (RoundD src)); + effect(TEMP dst, TEMP rtmp, TEMP rcx, KILL cr); + format %{ "round_double $dst,$src \t! using $rtmp and $rcx as TEMP"%} + ins_encode %{ + __ round_double($dst$$Register, $src$$XMMRegister, $rtmp$$Register, $rcx$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct round_float_reg(rRegI dst, regF src, rRegL rtmp, rcx_RegL rcx, rFlagsReg cr) +%{ + match(Set dst (RoundF src)); + effect(TEMP dst, TEMP rtmp, TEMP rcx, KILL cr); + format %{ "round_float $dst,$src" %} + ins_encode %{ + __ round_float($dst$$Register, $src$$XMMRegister, $rtmp$$Register, $rcx$$Register); + %} + ins_pipe(pipe_slow); +%} + +instruct convI2F_reg_reg(vlRegF dst, rRegI src) +%{ + predicate(!UseXmmI2F); + match(Set dst (ConvI2F src)); + + format %{ "cvtsi2ssl $dst, $src\t# i2f" %} + ins_encode %{ + if (UseAVX > 0) { + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + } + __ cvtsi2ssl ($dst$$XMMRegister, $src$$Register); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convI2F_reg_mem(regF dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvI2F (LoadI src))); + + format %{ "cvtsi2ssl $dst, $src\t# i2f" %} + ins_encode %{ + __ cvtsi2ssl ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convI2D_reg_reg(vlRegD dst, rRegI src) +%{ + predicate(!UseXmmI2D); + match(Set dst (ConvI2D src)); + + format %{ "cvtsi2sdl $dst, $src\t# i2d" %} + ins_encode %{ + if (UseAVX > 0) { + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + } + __ cvtsi2sdl ($dst$$XMMRegister, $src$$Register); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convI2D_reg_mem(regD dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvI2D (LoadI src))); + + format %{ "cvtsi2sdl $dst, $src\t# i2d" %} + ins_encode %{ + __ cvtsi2sdl ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convXI2F_reg(regF dst, rRegI src) +%{ + predicate(UseXmmI2F); + match(Set dst (ConvI2F src)); + + format %{ "movdl $dst, $src\n\t" + "cvtdq2psl $dst, $dst\t# i2f" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convXI2D_reg(regD dst, rRegI src) +%{ + predicate(UseXmmI2D); + match(Set dst (ConvI2D src)); + + format %{ "movdl $dst, $src\n\t" + "cvtdq2pdl $dst, $dst\t# i2d" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convL2F_reg_reg(vlRegF dst, rRegL src) +%{ + match(Set dst (ConvL2F src)); + + format %{ "cvtsi2ssq $dst, $src\t# l2f" %} + ins_encode %{ + if (UseAVX > 0) { + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + } + __ cvtsi2ssq ($dst$$XMMRegister, $src$$Register); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convL2F_reg_mem(regF dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvL2F (LoadL src))); + + format %{ "cvtsi2ssq $dst, $src\t# l2f" %} + ins_encode %{ + __ cvtsi2ssq ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convL2D_reg_reg(vlRegD dst, rRegL src) +%{ + match(Set dst (ConvL2D src)); + + format %{ "cvtsi2sdq $dst, $src\t# l2d" %} + ins_encode %{ + if (UseAVX > 0) { + __ pxor($dst$$XMMRegister, $dst$$XMMRegister); + } + __ cvtsi2sdq ($dst$$XMMRegister, $src$$Register); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convL2D_reg_mem(regD dst, memory src) +%{ + predicate(UseAVX == 0); + match(Set dst (ConvL2D (LoadL src))); + + format %{ "cvtsi2sdq $dst, $src\t# l2d" %} + ins_encode %{ + __ cvtsi2sdq ($dst$$XMMRegister, $src$$Address); + %} + ins_pipe(pipe_slow); // XXX +%} + +instruct convI2L_reg_reg(rRegL dst, rRegI src) +%{ + match(Set dst (ConvI2L src)); + + ins_cost(125); + format %{ "movslq $dst, $src\t# i2l" %} + ins_encode %{ + __ movslq($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +// Zero-extend convert int to long +instruct convI2L_reg_reg_zex(rRegL dst, rRegI src, immL_32bits mask) +%{ + match(Set dst (AndL (ConvI2L src) mask)); + + format %{ "movl $dst, $src\t# i2l zero-extend\n\t" %} + ins_encode %{ + if ($dst$$reg != $src$$reg) { + __ movl($dst$$Register, $src$$Register); + } + %} + ins_pipe(ialu_reg_reg); +%} + +// Zero-extend convert int to long +instruct convI2L_reg_mem_zex(rRegL dst, memory src, immL_32bits mask) +%{ + match(Set dst (AndL (ConvI2L (LoadI src)) mask)); + + format %{ "movl $dst, $src\t# i2l zero-extend\n\t" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Address); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct zerox_long_reg_reg(rRegL dst, rRegL src, immL_32bits mask) +%{ + match(Set dst (AndL src mask)); + + format %{ "movl $dst, $src\t# zero-extend long" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct convL2I_reg_reg(rRegI dst, rRegL src) +%{ + match(Set dst (ConvL2I src)); + + format %{ "movl $dst, $src\t# l2i" %} + ins_encode %{ + __ movl($dst$$Register, $src$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + + +instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{ + match(Set dst (MoveF2I src)); + effect(DEF dst, USE src); + + ins_cost(125); + format %{ "movl $dst, $src\t# MoveF2I_stack_reg" %} + ins_encode %{ + __ movl($dst$$Register, Address(rsp, $src$$disp)); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{ + match(Set dst (MoveI2F src)); + effect(DEF dst, USE src); + + ins_cost(125); + format %{ "movss $dst, $src\t# MoveI2F_stack_reg" %} + ins_encode %{ + __ movflt($dst$$XMMRegister, Address(rsp, $src$$disp)); + %} + ins_pipe(pipe_slow); +%} + +instruct MoveD2L_stack_reg(rRegL dst, stackSlotD src) %{ + match(Set dst (MoveD2L src)); + effect(DEF dst, USE src); + + ins_cost(125); + format %{ "movq $dst, $src\t# MoveD2L_stack_reg" %} + ins_encode %{ + __ movq($dst$$Register, Address(rsp, $src$$disp)); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct MoveL2D_stack_reg_partial(regD dst, stackSlotL src) %{ + predicate(!UseXmmLoadAndClearUpper); + match(Set dst (MoveL2D src)); + effect(DEF dst, USE src); + + ins_cost(125); + format %{ "movlpd $dst, $src\t# MoveL2D_stack_reg" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); + %} + ins_pipe(pipe_slow); +%} + +instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{ + predicate(UseXmmLoadAndClearUpper); + match(Set dst (MoveL2D src)); + effect(DEF dst, USE src); + + ins_cost(125); + format %{ "movsd $dst, $src\t# MoveL2D_stack_reg" %} + ins_encode %{ + __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); + %} + ins_pipe(pipe_slow); +%} + + +instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{ + match(Set dst (MoveF2I src)); + effect(DEF dst, USE src); + + ins_cost(95); // XXX + format %{ "movss $dst, $src\t# MoveF2I_reg_stack" %} + ins_encode %{ + __ movflt(Address(rsp, $dst$$disp), $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{ + match(Set dst (MoveI2F src)); + effect(DEF dst, USE src); + + ins_cost(100); + format %{ "movl $dst, $src\t# MoveI2F_reg_stack" %} + ins_encode %{ + __ movl(Address(rsp, $dst$$disp), $src$$Register); + %} + ins_pipe( ialu_mem_reg ); +%} + +instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{ + match(Set dst (MoveD2L src)); + effect(DEF dst, USE src); + + ins_cost(95); // XXX + format %{ "movsd $dst, $src\t# MoveL2D_reg_stack" %} + ins_encode %{ + __ movdbl(Address(rsp, $dst$$disp), $src$$XMMRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct MoveL2D_reg_stack(stackSlotD dst, rRegL src) %{ + match(Set dst (MoveL2D src)); + effect(DEF dst, USE src); + + ins_cost(100); + format %{ "movq $dst, $src\t# MoveL2D_reg_stack" %} + ins_encode %{ + __ movq(Address(rsp, $dst$$disp), $src$$Register); + %} + ins_pipe(ialu_mem_reg); +%} + +instruct MoveF2I_reg_reg(rRegI dst, regF src) %{ + match(Set dst (MoveF2I src)); + effect(DEF dst, USE src); + ins_cost(85); + format %{ "movd $dst,$src\t# MoveF2I" %} + ins_encode %{ + __ movdl($dst$$Register, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct MoveD2L_reg_reg(rRegL dst, regD src) %{ + match(Set dst (MoveD2L src)); + effect(DEF dst, USE src); + ins_cost(85); + format %{ "movd $dst,$src\t# MoveD2L" %} + ins_encode %{ + __ movdq($dst$$Register, $src$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct MoveI2F_reg_reg(regF dst, rRegI src) %{ + match(Set dst (MoveI2F src)); + effect(DEF dst, USE src); + ins_cost(100); + format %{ "movd $dst,$src\t# MoveI2F" %} + ins_encode %{ + __ movdl($dst$$XMMRegister, $src$$Register); + %} + ins_pipe( pipe_slow ); +%} + +instruct MoveL2D_reg_reg(regD dst, rRegL src) %{ + match(Set dst (MoveL2D src)); + effect(DEF dst, USE src); + ins_cost(100); + format %{ "movd $dst,$src\t# MoveL2D" %} + ins_encode %{ + __ movdq($dst$$XMMRegister, $src$$Register); + %} + ins_pipe( pipe_slow ); +%} + +// Fast clearing of an array +// Small non-constant lenght ClearArray for non-AVX512 targets. +instruct rep_stos(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, + Universe dummy, rFlagsReg cr) +%{ + predicate(!((ClearArrayNode*)n)->is_large() && (UseAVX <= 2)); + match(Set dummy (ClearArray cnt base)); + effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr); + + format %{ $$template + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"cmp InitArrayShortSize,rcx\n\t" + $$emit$$"jg LARGE\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"js DONE\t# Zero length\n\t" + $$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge LOOP\n\t" + $$emit$$"jmp DONE\n\t" + $$emit$$"# LARGE:\n\t" + if (UseFastStosb) { + $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" + $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t" + } else if (UseXMMForObjInit) { + $$emit$$"mov rdi,rax\n\t" + $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" + $$emit$$"jmpq L_zero_64_bytes\n\t" + $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" + $$emit$$"add 0x40,rax\n\t" + $$emit$$"# L_zero_64_bytes:\n\t" + $$emit$$"sub 0x8,rcx\n\t" + $$emit$$"jge L_loop\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jl L_tail\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"add 0x20,rax\n\t" + $$emit$$"sub 0x4,rcx\n\t" + $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jle L_end\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" + $$emit$$"vmovq xmm0,(rax)\n\t" + $$emit$$"add 0x8,rax\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge L_sloop\n\t" + $$emit$$"# L_end:\n\t" + } else { + $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t" + } + $$emit$$"# DONE" + %} + ins_encode %{ + __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, + $tmp$$XMMRegister, false, knoreg); + %} + ins_pipe(pipe_slow); +%} + +// Small non-constant length ClearArray for AVX512 targets. +instruct rep_stos_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegI zero, + Universe dummy, rFlagsReg cr) +%{ + predicate(!((ClearArrayNode*)n)->is_large() && (UseAVX > 2)); + match(Set dummy (ClearArray cnt base)); + ins_cost(125); + effect(USE_KILL cnt, USE_KILL base, TEMP tmp, TEMP ktmp, KILL zero, KILL cr); + + format %{ $$template + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"cmp InitArrayShortSize,rcx\n\t" + $$emit$$"jg LARGE\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"js DONE\t# Zero length\n\t" + $$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge LOOP\n\t" + $$emit$$"jmp DONE\n\t" + $$emit$$"# LARGE:\n\t" + if (UseFastStosb) { + $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" + $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t" + } else if (UseXMMForObjInit) { + $$emit$$"mov rdi,rax\n\t" + $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" + $$emit$$"jmpq L_zero_64_bytes\n\t" + $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" + $$emit$$"add 0x40,rax\n\t" + $$emit$$"# L_zero_64_bytes:\n\t" + $$emit$$"sub 0x8,rcx\n\t" + $$emit$$"jge L_loop\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jl L_tail\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"add 0x20,rax\n\t" + $$emit$$"sub 0x4,rcx\n\t" + $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jle L_end\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" + $$emit$$"vmovq xmm0,(rax)\n\t" + $$emit$$"add 0x8,rax\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge L_sloop\n\t" + $$emit$$"# L_end:\n\t" + } else { + $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t" + } + $$emit$$"# DONE" + %} + ins_encode %{ + __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, + $tmp$$XMMRegister, false, $ktmp$$KRegister); + %} + ins_pipe(pipe_slow); +%} + +// Large non-constant length ClearArray for non-AVX512 targets. +instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, + Universe dummy, rFlagsReg cr) +%{ + predicate((UseAVX <=2) && ((ClearArrayNode*)n)->is_large()); + match(Set dummy (ClearArray cnt base)); + effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr); + + format %{ $$template + if (UseFastStosb) { + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" + $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--" + } else if (UseXMMForObjInit) { + $$emit$$"mov rdi,rax\t# ClearArray:\n\t" + $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" + $$emit$$"jmpq L_zero_64_bytes\n\t" + $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" + $$emit$$"add 0x40,rax\n\t" + $$emit$$"# L_zero_64_bytes:\n\t" + $$emit$$"sub 0x8,rcx\n\t" + $$emit$$"jge L_loop\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jl L_tail\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"add 0x20,rax\n\t" + $$emit$$"sub 0x4,rcx\n\t" + $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jle L_end\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" + $$emit$$"vmovq xmm0,(rax)\n\t" + $$emit$$"add 0x8,rax\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge L_sloop\n\t" + $$emit$$"# L_end:\n\t" + } else { + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--" + } + %} + ins_encode %{ + __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, + $tmp$$XMMRegister, true, knoreg); + %} + ins_pipe(pipe_slow); +%} + +// Large non-constant length ClearArray for AVX512 targets. +instruct rep_stos_large_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegI zero, + Universe dummy, rFlagsReg cr) +%{ + predicate((UseAVX > 2) && ((ClearArrayNode*)n)->is_large()); + match(Set dummy (ClearArray cnt base)); + effect(USE_KILL cnt, USE_KILL base, TEMP tmp, TEMP ktmp, KILL zero, KILL cr); + + format %{ $$template + if (UseFastStosb) { + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" + $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--" + } else if (UseXMMForObjInit) { + $$emit$$"mov rdi,rax\t# ClearArray:\n\t" + $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" + $$emit$$"jmpq L_zero_64_bytes\n\t" + $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" + $$emit$$"add 0x40,rax\n\t" + $$emit$$"# L_zero_64_bytes:\n\t" + $$emit$$"sub 0x8,rcx\n\t" + $$emit$$"jge L_loop\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jl L_tail\n\t" + $$emit$$"vmovdqu ymm0,(rax)\n\t" + $$emit$$"add 0x20,rax\n\t" + $$emit$$"sub 0x4,rcx\n\t" + $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" + $$emit$$"add 0x4,rcx\n\t" + $$emit$$"jle L_end\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" + $$emit$$"vmovq xmm0,(rax)\n\t" + $$emit$$"add 0x8,rax\n\t" + $$emit$$"dec rcx\n\t" + $$emit$$"jge L_sloop\n\t" + $$emit$$"# L_end:\n\t" + } else { + $$emit$$"xorq rax, rax\t# ClearArray:\n\t" + $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--" + } + %} + ins_encode %{ + __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, + $tmp$$XMMRegister, true, $ktmp$$KRegister); + %} + ins_pipe(pipe_slow); +%} + +// Small constant length ClearArray for AVX512 targets. +instruct rep_stos_im(immL cnt, rRegP base, regD tmp, rRegI zero, kReg ktmp, Universe dummy, rFlagsReg cr) +%{ + predicate(!((ClearArrayNode*)n)->is_large() && (MaxVectorSize >= 32) && VM_Version::supports_avx512vl()); + match(Set dummy (ClearArray cnt base)); + ins_cost(100); + effect(TEMP tmp, TEMP zero, TEMP ktmp, KILL cr); + format %{ "clear_mem_imm $base , $cnt \n\t" %} + ins_encode %{ + __ clear_mem($base$$Register, $cnt$$constant, $zero$$Register, $tmp$$XMMRegister, $ktmp$$KRegister); + %} + ins_pipe(pipe_slow); +%} + +instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::LL, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareL_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::LL, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::UU, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::UU, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareLU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::LU, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareLU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, + rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::LU, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareUL(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, + rax_RegI result, legRegD tmp1, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str2$$Register, $str1$$Register, + $cnt2$$Register, $cnt1$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::UL, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compareUL_evex(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, + rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); + match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); + + format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} + ins_encode %{ + __ string_compare($str2$$Register, $str1$$Register, + $cnt2$$Register, $cnt1$$Register, $result$$Register, + $tmp1$$XMMRegister, StrIntrinsicNode::UL, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +// fast search of substring with known size. +instruct string_indexof_conL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, + rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf byte[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} + ins_encode %{ + int icnt2 = (int)$int_cnt2$$constant; + if (icnt2 >= 16) { + // IndexOf for constant substrings with size >= 16 elements + // which don't need to be loaded through stack. + __ string_indexofC8($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); + } else { + // Small strings are loaded through stack if they cross page boundary. + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); + } + %} + ins_pipe( pipe_slow ); +%} + +// fast search of substring with known size. +instruct string_indexof_conU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, + rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf char[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} + ins_encode %{ + int icnt2 = (int)$int_cnt2$$constant; + if (icnt2 >= 8) { + // IndexOf for constant substrings with size >= 8 elements + // which don't need to be loaded through stack. + __ string_indexofC8($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); + } else { + // Small strings are loaded through stack if they cross page boundary. + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); + } + %} + ins_pipe( pipe_slow ); +%} + +// fast search of substring with known size. +instruct string_indexof_conUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, + rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf char[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} + ins_encode %{ + int icnt2 = (int)$int_cnt2$$constant; + if (icnt2 >= 8) { + // IndexOf for constant substrings with size >= 8 elements + // which don't need to be loaded through stack. + __ string_indexofC8($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); + } else { + // Small strings are loaded through stack if they cross page boundary. + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + icnt2, $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); + } + %} + ins_pipe( pipe_slow ); +%} + +instruct string_indexofL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, + rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} + ins_encode %{ + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + (-1), $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_indexofU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, + rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} + ins_encode %{ + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + (-1), $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_indexofUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, + rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL)); + match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); + effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); + + format %{ "String IndexOf char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} + ins_encode %{ + __ string_indexof($str1$$Register, $str2$$Register, + $cnt1$$Register, $cnt2$$Register, + (-1), $result$$Register, + $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_indexof_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch, + rbx_RegI result, legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfCharNode*)n)->encoding() == StrIntrinsicNode::U)); + match(Set result (StrIndexOfChar (Binary str1 cnt1) ch)); + effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, USE_KILL str1, USE_KILL cnt1, USE_KILL ch, TEMP tmp, KILL cr); + format %{ "StringUTF16 IndexOf char[] $str1,$cnt1,$ch -> $result // KILL all" %} + ins_encode %{ + __ string_indexof_char($str1$$Register, $cnt1$$Register, $ch$$Register, $result$$Register, + $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, $tmp$$Register); + %} + ins_pipe( pipe_slow ); +%} + +instruct stringL_indexof_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch, + rbx_RegI result, legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, rcx_RegI tmp, rFlagsReg cr) +%{ + predicate(UseSSE42Intrinsics && (((StrIndexOfCharNode*)n)->encoding() == StrIntrinsicNode::L)); + match(Set result (StrIndexOfChar (Binary str1 cnt1) ch)); + effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, USE_KILL str1, USE_KILL cnt1, USE_KILL ch, TEMP tmp, KILL cr); + format %{ "StringLatin1 IndexOf char[] $str1,$cnt1,$ch -> $result // KILL all" %} + ins_encode %{ + __ stringL_indexof_char($str1$$Register, $cnt1$$Register, $ch$$Register, $result$$Register, + $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, $tmp$$Register); + %} + ins_pipe( pipe_slow ); +%} + +// fast string equals +instruct string_equals(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, + legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw()); + match(Set result (StrEquals (Binary str1 str2) cnt)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); + + format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp1, $tmp2, $tmp3" %} + ins_encode %{ + __ arrays_equals(false, $str1$$Register, $str2$$Register, + $cnt$$Register, $result$$Register, $tmp3$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_equals_evex(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, + legRegD tmp1, legRegD tmp2, kReg ktmp, rbx_RegI tmp3, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw()); + match(Set result (StrEquals (Binary str1 str2) cnt)); + effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); + + format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp1, $tmp2, $tmp3" %} + ins_encode %{ + __ arrays_equals(false, $str1$$Register, $str2$$Register, + $cnt$$Register, $result$$Register, $tmp3$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +// fast array equals +instruct array_equalsB(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, + legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + match(Set result (AryEq ary1 ary2)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "Array Equals byte[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} + ins_encode %{ + __ arrays_equals(true, $ary1$$Register, $ary2$$Register, + $tmp3$$Register, $result$$Register, $tmp4$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct array_equalsB_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, + legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); + match(Set result (AryEq ary1 ary2)); + effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "Array Equals byte[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} + ins_encode %{ + __ arrays_equals(true, $ary1$$Register, $ary2$$Register, + $tmp3$$Register, $result$$Register, $tmp4$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct array_equalsC(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, + legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) +%{ + predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + match(Set result (AryEq ary1 ary2)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "Array Equals char[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} + ins_encode %{ + __ arrays_equals(true, $ary1$$Register, $ary2$$Register, + $tmp3$$Register, $result$$Register, $tmp4$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, true /* char */, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct array_equalsC_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, + legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) +%{ + predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); + match(Set result (AryEq ary1 ary2)); + effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); + + format %{ "Array Equals char[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} + ins_encode %{ + __ arrays_equals(true, $ary1$$Register, $ary2$$Register, + $tmp3$$Register, $result$$Register, $tmp4$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, true /* char */, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct arrays_hashcode(rdi_RegP ary1, rdx_RegI cnt1, rbx_RegI result, immU8 basic_type, + legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, legRegD tmp_vec4, + legRegD tmp_vec5, legRegD tmp_vec6, legRegD tmp_vec7, legRegD tmp_vec8, + legRegD tmp_vec9, legRegD tmp_vec10, legRegD tmp_vec11, legRegD tmp_vec12, + legRegD tmp_vec13, rRegI tmp1, rRegI tmp2, rRegI tmp3, rFlagsReg cr) +%{ + predicate(UseAVX >= 2); + match(Set result (VectorizedHashCode (Binary ary1 cnt1) (Binary result basic_type))); + effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, TEMP tmp_vec4, TEMP tmp_vec5, TEMP tmp_vec6, + TEMP tmp_vec7, TEMP tmp_vec8, TEMP tmp_vec9, TEMP tmp_vec10, TEMP tmp_vec11, TEMP tmp_vec12, + TEMP tmp_vec13, TEMP tmp1, TEMP tmp2, TEMP tmp3, USE_KILL ary1, USE_KILL cnt1, + USE basic_type, KILL cr); + + format %{ "Array HashCode array[] $ary1,$cnt1,$result,$basic_type -> $result // KILL all" %} + ins_encode %{ + __ arrays_hashcode($ary1$$Register, $cnt1$$Register, $result$$Register, + $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, + $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, + $tmp_vec4$$XMMRegister, $tmp_vec5$$XMMRegister, $tmp_vec6$$XMMRegister, + $tmp_vec7$$XMMRegister, $tmp_vec8$$XMMRegister, $tmp_vec9$$XMMRegister, + $tmp_vec10$$XMMRegister, $tmp_vec11$$XMMRegister, $tmp_vec12$$XMMRegister, + $tmp_vec13$$XMMRegister, (BasicType)$basic_type$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct count_positives(rsi_RegP ary1, rcx_RegI len, rax_RegI result, + legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr,) +%{ + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); + match(Set result (CountPositives ary1 len)); + effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); + + format %{ "countPositives byte[] $ary1,$len -> $result // KILL $tmp1, $tmp2, $tmp3" %} + ins_encode %{ + __ count_positives($ary1$$Register, $len$$Register, + $result$$Register, $tmp3$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, knoreg, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct count_positives_evex(rsi_RegP ary1, rcx_RegI len, rax_RegI result, + legRegD tmp1, legRegD tmp2, kReg ktmp1, kReg ktmp2, rbx_RegI tmp3, rFlagsReg cr,) +%{ + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); + match(Set result (CountPositives ary1 len)); + effect(TEMP tmp1, TEMP tmp2, TEMP ktmp1, TEMP ktmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); + + format %{ "countPositives byte[] $ary1,$len -> $result // KILL $tmp1, $tmp2, $tmp3" %} + ins_encode %{ + __ count_positives($ary1$$Register, $len$$Register, + $result$$Register, $tmp3$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, $ktmp1$$KRegister, $ktmp2$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +// fast char[] to byte[] compression +instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, + legRegD tmp4, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); + match(Set result (StrCompressedCopy src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, + USE_KILL len, KILL tmp5, KILL cr); + + format %{ "String Compress $src,$dst -> $result // KILL RAX, RCX, RDX" %} + ins_encode %{ + __ char_array_compress($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, + $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, + knoreg, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_compress_evex(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, + legRegD tmp4, kReg ktmp1, kReg ktmp2, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); + match(Set result (StrCompressedCopy src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ktmp1, TEMP ktmp2, USE_KILL src, USE_KILL dst, + USE_KILL len, KILL tmp5, KILL cr); + + format %{ "String Compress $src,$dst -> $result // KILL RAX, RCX, RDX" %} + ins_encode %{ + __ char_array_compress($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, + $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, + $ktmp1$$KRegister, $ktmp2$$KRegister); + %} + ins_pipe( pipe_slow ); +%} +// fast byte[] to char[] inflation +instruct string_inflate(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, + legRegD tmp1, rcx_RegI tmp2, rFlagsReg cr) %{ + predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); + match(Set dummy (StrInflatedCopy src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); + + format %{ "String Inflate $src,$dst // KILL $tmp1, $tmp2" %} + ins_encode %{ + __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$Register, knoreg); + %} + ins_pipe( pipe_slow ); +%} + +instruct string_inflate_evex(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, + legRegD tmp1, kReg ktmp, rcx_RegI tmp2, rFlagsReg cr) %{ + predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); + match(Set dummy (StrInflatedCopy src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); + + format %{ "String Inflate $src,$dst // KILL $tmp1, $tmp2" %} + ins_encode %{ + __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$Register, $ktmp$$KRegister); + %} + ins_pipe( pipe_slow ); +%} + +// encode char[] to byte[] in ISO_8859_1 +instruct encode_iso_array(rsi_RegP src, rdi_RegP dst, rdx_RegI len, + legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, + rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ + predicate(!((EncodeISOArrayNode*)n)->is_ascii()); + match(Set result (EncodeISOArray src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); + + format %{ "Encode iso array $src,$dst,$len -> $result // KILL RCX, RDX, $tmp1, $tmp2, $tmp3, $tmp4, RSI, RDI " %} + ins_encode %{ + __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, + $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, false); + %} + ins_pipe( pipe_slow ); +%} + +// encode char[] to byte[] in ASCII +instruct encode_ascii_array(rsi_RegP src, rdi_RegP dst, rdx_RegI len, + legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, + rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ + predicate(((EncodeISOArrayNode*)n)->is_ascii()); + match(Set result (EncodeISOArray src (Binary dst len))); + effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); + + format %{ "Encode ascii array $src,$dst,$len -> $result // KILL RCX, RDX, $tmp1, $tmp2, $tmp3, $tmp4, RSI, RDI " %} + ins_encode %{ + __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, + $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, + $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, true); + %} + ins_pipe( pipe_slow ); +%} + +//----------Overflow Math Instructions----------------------------------------- + +instruct overflowAddI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) +%{ + match(Set cr (OverflowAddI op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "addl $op1, $op2\t# overflow check int" %} + + ins_encode %{ + __ addl($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowAddI_rReg_imm(rFlagsReg cr, rax_RegI op1, immI op2) +%{ + match(Set cr (OverflowAddI op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "addl $op1, $op2\t# overflow check int" %} + + ins_encode %{ + __ addl($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowAddL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) +%{ + match(Set cr (OverflowAddL op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "addq $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ addq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowAddL_rReg_imm(rFlagsReg cr, rax_RegL op1, immL32 op2) +%{ + match(Set cr (OverflowAddL op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "addq $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ addq($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowSubI_rReg(rFlagsReg cr, rRegI op1, rRegI op2) +%{ + match(Set cr (OverflowSubI op1 op2)); + + format %{ "cmpl $op1, $op2\t# overflow check int" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowSubI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2) +%{ + match(Set cr (OverflowSubI op1 op2)); + + format %{ "cmpl $op1, $op2\t# overflow check int" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowSubL_rReg(rFlagsReg cr, rRegL op1, rRegL op2) +%{ + match(Set cr (OverflowSubL op1 op2)); + + format %{ "cmpq $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowSubL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2) +%{ + match(Set cr (OverflowSubL op1 op2)); + + format %{ "cmpq $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowNegI_rReg(rFlagsReg cr, immI_0 zero, rax_RegI op2) +%{ + match(Set cr (OverflowSubI zero op2)); + effect(DEF cr, USE_KILL op2); + + format %{ "negl $op2\t# overflow check int" %} + ins_encode %{ + __ negl($op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowNegL_rReg(rFlagsReg cr, immL0 zero, rax_RegL op2) +%{ + match(Set cr (OverflowSubL zero op2)); + effect(DEF cr, USE_KILL op2); + + format %{ "negq $op2\t# overflow check long" %} + ins_encode %{ + __ negq($op2$$Register); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct overflowMulI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) +%{ + match(Set cr (OverflowMulI op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "imull $op1, $op2\t# overflow check int" %} + ins_encode %{ + __ imull($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct overflowMulI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2, rRegI tmp) +%{ + match(Set cr (OverflowMulI op1 op2)); + effect(DEF cr, TEMP tmp, USE op1, USE op2); + + format %{ "imull $tmp, $op1, $op2\t# overflow check int" %} + ins_encode %{ + __ imull($tmp$$Register, $op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct overflowMulL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) +%{ + match(Set cr (OverflowMulL op1 op2)); + effect(DEF cr, USE_KILL op1, USE op2); + + format %{ "imulq $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ imulq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + +instruct overflowMulL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2, rRegL tmp) +%{ + match(Set cr (OverflowMulL op1 op2)); + effect(DEF cr, TEMP tmp, USE op1, USE op2); + + format %{ "imulq $tmp, $op1, $op2\t# overflow check long" %} + ins_encode %{ + __ imulq($tmp$$Register, $op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_reg_reg_alu0); +%} + + +//----------Control Flow Instructions------------------------------------------ +// Signed compare Instructions + +// XXX more variants!! +instruct compI_rReg(rFlagsReg cr, rRegI op1, rRegI op2) +%{ + match(Set cr (CmpI op1 op2)); + effect(DEF cr, USE op1, USE op2); + + format %{ "cmpl $op1, $op2" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2) +%{ + match(Set cr (CmpI op1 op2)); + + format %{ "cmpl $op1, $op2" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compI_rReg_mem(rFlagsReg cr, rRegI op1, memory op2) +%{ + match(Set cr (CmpI op1 (LoadI op2))); + + ins_cost(500); // XXX + format %{ "cmpl $op1, $op2" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testI_reg(rFlagsReg cr, rRegI src, immI_0 zero) +%{ + match(Set cr (CmpI src zero)); + + format %{ "testl $src, $src" %} + ins_encode %{ + __ testl($src$$Register, $src$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testI_reg_imm(rFlagsReg cr, rRegI src, immI con, immI_0 zero) +%{ + match(Set cr (CmpI (AndI src con) zero)); + + format %{ "testl $src, $con" %} + ins_encode %{ + __ testl($src$$Register, $con$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testI_reg_reg(rFlagsReg cr, rRegI src1, rRegI src2, immI_0 zero) +%{ + match(Set cr (CmpI (AndI src1 src2) zero)); + + format %{ "testl $src1, $src2" %} + ins_encode %{ + __ testl($src1$$Register, $src2$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testI_reg_mem(rFlagsReg cr, rRegI src, memory mem, immI_0 zero) +%{ + match(Set cr (CmpI (AndI src (LoadI mem)) zero)); + + format %{ "testl $src, $mem" %} + ins_encode %{ + __ testl($src$$Register, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +// Unsigned compare Instructions; really, same as signed except they +// produce an rFlagsRegU instead of rFlagsReg. +instruct compU_rReg(rFlagsRegU cr, rRegI op1, rRegI op2) +%{ + match(Set cr (CmpU op1 op2)); + + format %{ "cmpl $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compU_rReg_imm(rFlagsRegU cr, rRegI op1, immI op2) +%{ + match(Set cr (CmpU op1 op2)); + + format %{ "cmpl $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compU_rReg_mem(rFlagsRegU cr, rRegI op1, memory op2) +%{ + match(Set cr (CmpU op1 (LoadI op2))); + + ins_cost(500); // XXX + format %{ "cmpl $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpl($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testU_reg(rFlagsRegU cr, rRegI src, immI_0 zero) +%{ + match(Set cr (CmpU src zero)); + + format %{ "testl $src, $src\t# unsigned" %} + ins_encode %{ + __ testl($src$$Register, $src$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compP_rReg(rFlagsRegU cr, rRegP op1, rRegP op2) +%{ + match(Set cr (CmpP op1 op2)); + + format %{ "cmpq $op1, $op2\t# ptr" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compP_rReg_mem(rFlagsRegU cr, rRegP op1, memory op2) +%{ + match(Set cr (CmpP op1 (LoadP op2))); + predicate(n->in(2)->as_Load()->barrier_data() == 0); + + ins_cost(500); // XXX + format %{ "cmpq $op1, $op2\t# ptr" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +// XXX this is generalized by compP_rReg_mem??? +// Compare raw pointer (used in out-of-heap check). +// Only works because non-oop pointers must be raw pointers +// and raw pointers have no anti-dependencies. +instruct compP_mem_rReg(rFlagsRegU cr, rRegP op1, memory op2) +%{ + predicate(n->in(2)->in(2)->bottom_type()->reloc() == relocInfo::none && + n->in(2)->as_Load()->barrier_data() == 0); + match(Set cr (CmpP op1 (LoadP op2))); + + format %{ "cmpq $op1, $op2\t# raw ptr" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +// This will generate a signed flags result. This should be OK since +// any compare to a zero should be eq/neq. +instruct testP_reg(rFlagsReg cr, rRegP src, immP0 zero) +%{ + match(Set cr (CmpP src zero)); + + format %{ "testq $src, $src\t# ptr" %} + ins_encode %{ + __ testq($src$$Register, $src$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +// This will generate a signed flags result. This should be OK since +// any compare to a zero should be eq/neq. +instruct testP_mem(rFlagsReg cr, memory op, immP0 zero) +%{ + predicate((!UseCompressedOops || (CompressedOops::base() != nullptr)) && + n->in(1)->as_Load()->barrier_data() == 0); + match(Set cr (CmpP (LoadP op) zero)); + + ins_cost(500); // XXX + format %{ "testq $op, 0xffffffffffffffff\t# ptr" %} + ins_encode %{ + __ testq($op$$Address, 0xFFFFFFFF); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testP_mem_reg0(rFlagsReg cr, memory mem, immP0 zero) +%{ + predicate(UseCompressedOops && (CompressedOops::base() == nullptr) && + n->in(1)->as_Load()->barrier_data() == 0); + match(Set cr (CmpP (LoadP mem) zero)); + + format %{ "cmpq R12, $mem\t# ptr (R12_heapbase==0)" %} + ins_encode %{ + __ cmpq(r12, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct compN_rReg(rFlagsRegU cr, rRegN op1, rRegN op2) +%{ + match(Set cr (CmpN op1 op2)); + + format %{ "cmpl $op1, $op2\t# compressed ptr" %} + ins_encode %{ __ cmpl($op1$$Register, $op2$$Register); %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compN_rReg_mem(rFlagsRegU cr, rRegN src, memory mem) +%{ + predicate(n->in(2)->as_Load()->barrier_data() == 0); + match(Set cr (CmpN src (LoadN mem))); + + format %{ "cmpl $src, $mem\t# compressed ptr" %} + ins_encode %{ + __ cmpl($src$$Register, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct compN_rReg_imm(rFlagsRegU cr, rRegN op1, immN op2) %{ + match(Set cr (CmpN op1 op2)); + + format %{ "cmpl $op1, $op2\t# compressed ptr" %} + ins_encode %{ + __ cmp_narrow_oop($op1$$Register, (jobject)$op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compN_mem_imm(rFlagsRegU cr, memory mem, immN src) +%{ + predicate(n->in(2)->as_Load()->barrier_data() == 0); + match(Set cr (CmpN src (LoadN mem))); + + format %{ "cmpl $mem, $src\t# compressed ptr" %} + ins_encode %{ + __ cmp_narrow_oop($mem$$Address, (jobject)$src$$constant); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct compN_rReg_imm_klass(rFlagsRegU cr, rRegN op1, immNKlass op2) %{ + match(Set cr (CmpN op1 op2)); + + format %{ "cmpl $op1, $op2\t# compressed klass ptr" %} + ins_encode %{ + __ cmp_narrow_klass($op1$$Register, (Klass*)$op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compN_mem_imm_klass(rFlagsRegU cr, memory mem, immNKlass src) +%{ + predicate(!UseCompactObjectHeaders); + match(Set cr (CmpN src (LoadNKlass mem))); + + format %{ "cmpl $mem, $src\t# compressed klass ptr" %} + ins_encode %{ + __ cmp_narrow_klass($mem$$Address, (Klass*)$src$$constant); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{ + match(Set cr (CmpN src zero)); + + format %{ "testl $src, $src\t# compressed ptr" %} + ins_encode %{ __ testl($src$$Register, $src$$Register); %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testN_mem(rFlagsReg cr, memory mem, immN0 zero) +%{ + predicate(CompressedOops::base() != nullptr && + n->in(1)->as_Load()->barrier_data() == 0); + match(Set cr (CmpN (LoadN mem) zero)); + + ins_cost(500); // XXX + format %{ "testl $mem, 0xffffffff\t# compressed ptr" %} + ins_encode %{ + __ cmpl($mem$$Address, (int)0xFFFFFFFF); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testN_mem_reg0(rFlagsReg cr, memory mem, immN0 zero) +%{ + predicate(CompressedOops::base() == nullptr && + n->in(1)->as_Load()->barrier_data() == 0); + match(Set cr (CmpN (LoadN mem) zero)); + + format %{ "cmpl R12, $mem\t# compressed ptr (R12_heapbase==0)" %} + ins_encode %{ + __ cmpl(r12, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +// Yanked all unsigned pointer compare operations. +// Pointer compares are done with CmpP which is already unsigned. + +instruct compL_rReg(rFlagsReg cr, rRegL op1, rRegL op2) +%{ + match(Set cr (CmpL op1 op2)); + + format %{ "cmpq $op1, $op2" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2) +%{ + match(Set cr (CmpL op1 op2)); + + format %{ "cmpq $op1, $op2" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compL_rReg_mem(rFlagsReg cr, rRegL op1, memory op2) +%{ + match(Set cr (CmpL op1 (LoadL op2))); + + format %{ "cmpq $op1, $op2" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testL_reg(rFlagsReg cr, rRegL src, immL0 zero) +%{ + match(Set cr (CmpL src zero)); + + format %{ "testq $src, $src" %} + ins_encode %{ + __ testq($src$$Register, $src$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testL_reg_imm(rFlagsReg cr, rRegL src, immL32 con, immL0 zero) +%{ + match(Set cr (CmpL (AndL src con) zero)); + + format %{ "testq $src, $con\t# long" %} + ins_encode %{ + __ testq($src$$Register, $con$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testL_reg_reg(rFlagsReg cr, rRegL src1, rRegL src2, immL0 zero) +%{ + match(Set cr (CmpL (AndL src1 src2) zero)); + + format %{ "testq $src1, $src2\t# long" %} + ins_encode %{ + __ testq($src1$$Register, $src2$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct testL_reg_mem(rFlagsReg cr, rRegL src, memory mem, immL0 zero) +%{ + match(Set cr (CmpL (AndL src (LoadL mem)) zero)); + + format %{ "testq $src, $mem" %} + ins_encode %{ + __ testq($src$$Register, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testL_reg_mem2(rFlagsReg cr, rRegP src, memory mem, immL0 zero) +%{ + match(Set cr (CmpL (AndL (CastP2X src) (LoadL mem)) zero)); + + format %{ "testq $src, $mem" %} + ins_encode %{ + __ testq($src$$Register, $mem$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +// Manifest a CmpU result in an integer register. Very painful. +// This is the test to avoid. +instruct cmpU3_reg_reg(rRegI dst, rRegI src1, rRegI src2, rFlagsReg flags) +%{ + match(Set dst (CmpU3 src1 src2)); + effect(KILL flags); + + ins_cost(275); // XXX + format %{ "cmpl $src1, $src2\t# CmpL3\n\t" + "movl $dst, -1\n\t" + "jb,u done\n\t" + "setcc $dst \t# emits setne + movzbl or setzune for APX" + "done:" %} + ins_encode %{ + Label done; + __ cmpl($src1$$Register, $src2$$Register); + __ movl($dst$$Register, -1); + __ jccb(Assembler::below, done); + __ setcc(Assembler::notZero, $dst$$Register); + __ bind(done); + %} + ins_pipe(pipe_slow); +%} + +// Manifest a CmpL result in an integer register. Very painful. +// This is the test to avoid. +instruct cmpL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags) +%{ + match(Set dst (CmpL3 src1 src2)); + effect(KILL flags); + + ins_cost(275); // XXX + format %{ "cmpq $src1, $src2\t# CmpL3\n\t" + "movl $dst, -1\n\t" + "jl,s done\n\t" + "setcc $dst \t# emits setne + movzbl or setzune for APX" + "done:" %} + ins_encode %{ + Label done; + __ cmpq($src1$$Register, $src2$$Register); + __ movl($dst$$Register, -1); + __ jccb(Assembler::less, done); + __ setcc(Assembler::notZero, $dst$$Register); + __ bind(done); + %} + ins_pipe(pipe_slow); +%} + +// Manifest a CmpUL result in an integer register. Very painful. +// This is the test to avoid. +instruct cmpUL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags) +%{ + match(Set dst (CmpUL3 src1 src2)); + effect(KILL flags); + + ins_cost(275); // XXX + format %{ "cmpq $src1, $src2\t# CmpL3\n\t" + "movl $dst, -1\n\t" + "jb,u done\n\t" + "setcc $dst \t# emits setne + movzbl or setzune for APX" + "done:" %} + ins_encode %{ + Label done; + __ cmpq($src1$$Register, $src2$$Register); + __ movl($dst$$Register, -1); + __ jccb(Assembler::below, done); + __ setcc(Assembler::notZero, $dst$$Register); + __ bind(done); + %} + ins_pipe(pipe_slow); +%} + +// Unsigned long compare Instructions; really, same as signed long except they +// produce an rFlagsRegU instead of rFlagsReg. +instruct compUL_rReg(rFlagsRegU cr, rRegL op1, rRegL op2) +%{ + match(Set cr (CmpUL op1 op2)); + + format %{ "cmpq $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Register); + %} + ins_pipe(ialu_cr_reg_reg); +%} + +instruct compUL_rReg_imm(rFlagsRegU cr, rRegL op1, immL32 op2) +%{ + match(Set cr (CmpUL op1 op2)); + + format %{ "cmpq $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$constant); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compUL_rReg_mem(rFlagsRegU cr, rRegL op1, memory op2) +%{ + match(Set cr (CmpUL op1 (LoadL op2))); + + format %{ "cmpq $op1, $op2\t# unsigned" %} + ins_encode %{ + __ cmpq($op1$$Register, $op2$$Address); + %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testUL_reg(rFlagsRegU cr, rRegL src, immL0 zero) +%{ + match(Set cr (CmpUL src zero)); + + format %{ "testq $src, $src\t# unsigned" %} + ins_encode %{ + __ testq($src$$Register, $src$$Register); + %} + ins_pipe(ialu_cr_reg_imm); +%} + +instruct compB_mem_imm(rFlagsReg cr, memory mem, immI8 imm) +%{ + match(Set cr (CmpI (LoadB mem) imm)); + + ins_cost(125); + format %{ "cmpb $mem, $imm" %} + ins_encode %{ __ cmpb($mem$$Address, $imm$$constant); %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testUB_mem_imm(rFlagsReg cr, memory mem, immU7 imm, immI_0 zero) +%{ + match(Set cr (CmpI (AndI (LoadUB mem) imm) zero)); + + ins_cost(125); + format %{ "testb $mem, $imm\t# ubyte" %} + ins_encode %{ __ testb($mem$$Address, $imm$$constant); %} + ins_pipe(ialu_cr_reg_mem); +%} + +instruct testB_mem_imm(rFlagsReg cr, memory mem, immI8 imm, immI_0 zero) +%{ + match(Set cr (CmpI (AndI (LoadB mem) imm) zero)); + + ins_cost(125); + format %{ "testb $mem, $imm\t# byte" %} + ins_encode %{ __ testb($mem$$Address, $imm$$constant); %} + ins_pipe(ialu_cr_reg_mem); +%} + +//----------Max and Min-------------------------------------------------------- +// Min Instructions + +instruct cmovI_reg_g(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + effect(USE_DEF dst, USE src, USE cr); + + format %{ "cmovlgt $dst, $src\t# min" %} + ins_encode %{ + __ cmovl(Assembler::greater, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_reg_g_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + effect(DEF dst, USE src1, USE src2, USE cr); + + format %{ "ecmovlgt $dst, $src1, $src2\t# min ndd" %} + ins_encode %{ + __ ecmovl(Assembler::greater, $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct minI_rReg(rRegI dst, rRegI src) +%{ + predicate(!UseAPX); + match(Set dst (MinI dst src)); + + ins_cost(200); + expand %{ + rFlagsReg cr; + compI_rReg(cr, dst, src); + cmovI_reg_g(dst, src, cr); + %} +%} + +instruct minI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2) +%{ + predicate(UseAPX); + match(Set dst (MinI src1 src2)); + effect(DEF dst, USE src1, USE src2); + + ins_cost(200); + expand %{ + rFlagsReg cr; + compI_rReg(cr, src1, src2); + cmovI_reg_g_ndd(dst, src1, src2, cr); + %} +%} + +instruct cmovI_reg_l(rRegI dst, rRegI src, rFlagsReg cr) +%{ + predicate(!UseAPX); + effect(USE_DEF dst, USE src, USE cr); + + format %{ "cmovllt $dst, $src\t# max" %} + ins_encode %{ + __ cmovl(Assembler::less, $dst$$Register, $src$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct cmovI_reg_l_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) +%{ + predicate(UseAPX); + effect(DEF dst, USE src1, USE src2, USE cr); + + format %{ "ecmovllt $dst, $src1, $src2\t# max ndd" %} + ins_encode %{ + __ ecmovl(Assembler::less, $dst$$Register, $src1$$Register, $src2$$Register); + %} + ins_pipe(pipe_cmov_reg); +%} + +instruct maxI_rReg(rRegI dst, rRegI src) +%{ + predicate(!UseAPX); + match(Set dst (MaxI dst src)); + + ins_cost(200); + expand %{ + rFlagsReg cr; + compI_rReg(cr, dst, src); + cmovI_reg_l(dst, src, cr); + %} +%} + +instruct maxI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2) +%{ + predicate(UseAPX); + match(Set dst (MaxI src1 src2)); + effect(DEF dst, USE src1, USE src2); + + ins_cost(200); + expand %{ + rFlagsReg cr; + compI_rReg(cr, src1, src2); + cmovI_reg_l_ndd(dst, src1, src2, cr); + %} +%} + +// ============================================================================ +// Branch Instructions + +// Jump Direct - Label defines a relative address from JMP+1 +instruct jmpDir(label labl) +%{ + match(Goto); + effect(USE labl); + + ins_cost(300); + format %{ "jmp $labl" %} + size(5); + ins_encode %{ + Label* L = $labl$$label; + __ jmp(*L, false); // Always long jump + %} + ins_pipe(pipe_jmp); +%} + +// Jump Direct Conditional - Label defines a relative address from Jcc+1 +instruct jmpCon(cmpOp cop, rFlagsReg cr, label labl) +%{ + match(If cop cr); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop $labl" %} + size(6); + ins_encode %{ + Label* L = $labl$$label; + __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump + %} + ins_pipe(pipe_jcc); +%} + +// Jump Direct Conditional - Label defines a relative address from Jcc+1 +instruct jmpLoopEnd(cmpOp cop, rFlagsReg cr, label labl) +%{ + match(CountedLoopEnd cop cr); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop $labl\t# loop end" %} + size(6); + ins_encode %{ + Label* L = $labl$$label; + __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump + %} + ins_pipe(pipe_jcc); +%} + +// Jump Direct Conditional - using unsigned comparison +instruct jmpConU(cmpOpU cop, rFlagsRegU cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop,u $labl" %} + size(6); + ins_encode %{ + Label* L = $labl$$label; + __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump + %} + ins_pipe(pipe_jcc); +%} + +instruct jmpConUCF(cmpOpUCF cop, rFlagsRegUCF cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(200); + format %{ "j$cop,u $labl" %} + size(6); + ins_encode %{ + Label* L = $labl$$label; + __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump + %} + ins_pipe(pipe_jcc); +%} + +instruct jmpConUCF2(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(200); + format %{ $$template + if ($cop$$cmpcode == Assembler::notEqual) { + $$emit$$"jp,u $labl\n\t" + $$emit$$"j$cop,u $labl" + } else { + $$emit$$"jp,u done\n\t" + $$emit$$"j$cop,u $labl\n\t" + $$emit$$"done:" + } + %} + ins_encode %{ + Label* l = $labl$$label; + if ($cop$$cmpcode == Assembler::notEqual) { + __ jcc(Assembler::parity, *l, false); + __ jcc(Assembler::notEqual, *l, false); + } else if ($cop$$cmpcode == Assembler::equal) { + Label done; + __ jccb(Assembler::parity, done); + __ jcc(Assembler::equal, *l, false); + __ bind(done); + } else { + ShouldNotReachHere(); + } + %} + ins_pipe(pipe_jcc); +%} + +// ============================================================================ +// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary +// superklass array for an instance of the superklass. Set a hidden +// internal cache on a hit (cache is checked with exposed code in +// gen_subtype_check()). Return NZ for a miss or zero for a hit. The +// encoding ALSO sets flags. + +instruct partialSubtypeCheck(rdi_RegP result, + rsi_RegP sub, rax_RegP super, rcx_RegI rcx, + rFlagsReg cr) +%{ + match(Set result (PartialSubtypeCheck sub super)); + predicate(!UseSecondarySupersTable); + effect(KILL rcx, KILL cr); + + ins_cost(1100); // slightly larger than the next version + format %{ "movq rdi, [$sub + in_bytes(Klass::secondary_supers_offset())]\n\t" + "movl rcx, [rdi + Array::length_offset_in_bytes()]\t# length to scan\n\t" + "addq rdi, Array::base_offset_in_bytes()\t# Skip to start of data; set NZ in case count is zero\n\t" + "repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t" + "jne,s miss\t\t# Missed: rdi not-zero\n\t" + "movq [$sub + in_bytes(Klass::secondary_super_cache_offset())], $super\t# Hit: update cache\n\t" + "xorq $result, $result\t\t Hit: rdi zero\n\t" + "miss:\t" %} + + ins_encode %{ + Label miss; + // NB: Callers may assume that, when $result is a valid register, + // check_klass_subtype_slow_path_linear sets it to a nonzero + // value. + __ check_klass_subtype_slow_path_linear($sub$$Register, $super$$Register, + $rcx$$Register, $result$$Register, + nullptr, &miss, + /*set_cond_codes:*/ true); + __ xorptr($result$$Register, $result$$Register); + __ bind(miss); + %} + + ins_pipe(pipe_slow); +%} + +// ============================================================================ +// Two versions of hashtable-based partialSubtypeCheck, both used when +// we need to search for a super class in the secondary supers array. +// The first is used when we don't know _a priori_ the class being +// searched for. The second, far more common, is used when we do know: +// this is used for instanceof, checkcast, and any case where C2 can +// determine it by constant propagation. + +instruct partialSubtypeCheckVarSuper(rsi_RegP sub, rax_RegP super, rdi_RegP result, + rdx_RegL temp1, rcx_RegL temp2, rbx_RegP temp3, r11_RegL temp4, + rFlagsReg cr) +%{ + match(Set result (PartialSubtypeCheck sub super)); + predicate(UseSecondarySupersTable); + effect(KILL cr, TEMP temp1, TEMP temp2, TEMP temp3, TEMP temp4); + + ins_cost(1000); + format %{ "partialSubtypeCheck $result, $sub, $super" %} + + ins_encode %{ + __ lookup_secondary_supers_table_var($sub$$Register, $super$$Register, $temp1$$Register, $temp2$$Register, + $temp3$$Register, $temp4$$Register, $result$$Register); + %} + + ins_pipe(pipe_slow); +%} + +instruct partialSubtypeCheckConstSuper(rsi_RegP sub, rax_RegP super_reg, immP super_con, rdi_RegP result, + rdx_RegL temp1, rcx_RegL temp2, rbx_RegP temp3, r11_RegL temp4, + rFlagsReg cr) +%{ + match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con))); + predicate(UseSecondarySupersTable); + effect(KILL cr, TEMP temp1, TEMP temp2, TEMP temp3, TEMP temp4); + + ins_cost(700); // smaller than the next version + format %{ "partialSubtypeCheck $result, $sub, $super_reg, $super_con" %} + + ins_encode %{ + u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot(); + if (InlineSecondarySupersTest) { + __ lookup_secondary_supers_table_const($sub$$Register, $super_reg$$Register, $temp1$$Register, $temp2$$Register, + $temp3$$Register, $temp4$$Register, $result$$Register, + super_klass_slot); + } else { + __ call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot))); + } + %} + + ins_pipe(pipe_slow); +%} + +// ============================================================================ +// Branch Instructions -- short offset versions +// +// These instructions are used to replace jumps of a long offset (the default +// match) with jumps of a shorter offset. These instructions are all tagged +// with the ins_short_branch attribute, which causes the ADLC to suppress the +// match rules in general matching. Instead, the ADLC generates a conversion +// method in the MachNode which can be used to do in-place replacement of the +// long variant with the shorter variant. The compiler will determine if a +// branch can be taken by the is_short_branch_offset() predicate in the machine +// specific code section of the file. + +// Jump Direct - Label defines a relative address from JMP+1 +instruct jmpDir_short(label labl) %{ + match(Goto); + effect(USE labl); + + ins_cost(300); + format %{ "jmp,s $labl" %} + size(2); + ins_encode %{ + Label* L = $labl$$label; + __ jmpb(*L); + %} + ins_pipe(pipe_jmp); + ins_short_branch(1); +%} + +// Jump Direct Conditional - Label defines a relative address from Jcc+1 +instruct jmpCon_short(cmpOp cop, rFlagsReg cr, label labl) %{ + match(If cop cr); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop,s $labl" %} + size(2); + ins_encode %{ + Label* L = $labl$$label; + __ jccb((Assembler::Condition)($cop$$cmpcode), *L); + %} + ins_pipe(pipe_jcc); + ins_short_branch(1); +%} + +// Jump Direct Conditional - Label defines a relative address from Jcc+1 +instruct jmpLoopEnd_short(cmpOp cop, rFlagsReg cr, label labl) %{ + match(CountedLoopEnd cop cr); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop,s $labl\t# loop end" %} + size(2); + ins_encode %{ + Label* L = $labl$$label; + __ jccb((Assembler::Condition)($cop$$cmpcode), *L); + %} + ins_pipe(pipe_jcc); + ins_short_branch(1); +%} + +// Jump Direct Conditional - using unsigned comparison +instruct jmpConU_short(cmpOpU cop, rFlagsRegU cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop,us $labl" %} + size(2); + ins_encode %{ + Label* L = $labl$$label; + __ jccb((Assembler::Condition)($cop$$cmpcode), *L); + %} + ins_pipe(pipe_jcc); + ins_short_branch(1); +%} + +instruct jmpConUCF_short(cmpOpUCF cop, rFlagsRegUCF cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(300); + format %{ "j$cop,us $labl" %} + size(2); + ins_encode %{ + Label* L = $labl$$label; + __ jccb((Assembler::Condition)($cop$$cmpcode), *L); + %} + ins_pipe(pipe_jcc); + ins_short_branch(1); +%} + +instruct jmpConUCF2_short(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ + match(If cop cmp); + effect(USE labl); + + ins_cost(300); + format %{ $$template + if ($cop$$cmpcode == Assembler::notEqual) { + $$emit$$"jp,u,s $labl\n\t" + $$emit$$"j$cop,u,s $labl" + } else { + $$emit$$"jp,u,s done\n\t" + $$emit$$"j$cop,u,s $labl\n\t" + $$emit$$"done:" + } + %} + size(4); + ins_encode %{ + Label* l = $labl$$label; + if ($cop$$cmpcode == Assembler::notEqual) { + __ jccb(Assembler::parity, *l); + __ jccb(Assembler::notEqual, *l); + } else if ($cop$$cmpcode == Assembler::equal) { + Label done; + __ jccb(Assembler::parity, done); + __ jccb(Assembler::equal, *l); + __ bind(done); + } else { + ShouldNotReachHere(); + } + %} + ins_pipe(pipe_jcc); + ins_short_branch(1); +%} + +// ============================================================================ +// inlined locking and unlocking + +instruct cmpFastLockLightweight(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI rax_reg, rRegP tmp) %{ + match(Set cr (FastLock object box)); + effect(TEMP rax_reg, TEMP tmp, USE_KILL box); + ins_cost(300); + format %{ "fastlock $object,$box\t! kills $box,$rax_reg,$tmp" %} + ins_encode %{ + __ fast_lock_lightweight($object$$Register, $box$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); + %} + ins_pipe(pipe_slow); +%} + +instruct cmpFastUnlockLightweight(rFlagsReg cr, rRegP object, rax_RegP rax_reg, rRegP tmp) %{ + match(Set cr (FastUnlock object rax_reg)); + effect(TEMP tmp, USE_KILL rax_reg); + ins_cost(300); + format %{ "fastunlock $object,$rax_reg\t! kills $rax_reg,$tmp" %} + ins_encode %{ + __ fast_unlock_lightweight($object$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); + %} + ins_pipe(pipe_slow); +%} + + +// ============================================================================ +// Safepoint Instructions +instruct safePoint_poll_tls(rFlagsReg cr, rRegP poll) +%{ + match(SafePoint poll); + effect(KILL cr, USE poll); + + format %{ "testl rax, [$poll]\t" + "# Safepoint: poll for GC" %} + ins_cost(125); + ins_encode %{ + __ relocate(relocInfo::poll_type); + address pre_pc = __ pc(); + __ testl(rax, Address($poll$$Register, 0)); + assert(nativeInstruction_at(pre_pc)->is_safepoint_poll(), "must emit test %%eax [reg]"); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct mask_all_evexL(kReg dst, rRegL src) %{ + match(Set dst (MaskAll src)); + format %{ "mask_all_evexL $dst, $src \t! mask all operation" %} + ins_encode %{ + int mask_len = Matcher::vector_length(this); + __ vector_maskall_operation($dst$$KRegister, $src$$Register, mask_len); + %} + ins_pipe( pipe_slow ); +%} + +instruct mask_all_evexI_GT32(kReg dst, rRegI src, rRegL tmp) %{ + predicate(Matcher::vector_length(n) > 32); + match(Set dst (MaskAll src)); + effect(TEMP tmp); + format %{ "mask_all_evexI_GT32 $dst, $src \t! using $tmp as TEMP" %} + ins_encode %{ + int mask_len = Matcher::vector_length(this); + __ movslq($tmp$$Register, $src$$Register); + __ vector_maskall_operation($dst$$KRegister, $tmp$$Register, mask_len); + %} + ins_pipe( pipe_slow ); +%} + +// ============================================================================ +// Procedure Call/Return Instructions +// Call Java Static Instruction +// Note: If this code changes, the corresponding ret_addr_offset() and +// compute_padding() functions will have to be adjusted. +instruct CallStaticJavaDirect(method meth) %{ + match(CallStaticJava); + effect(USE meth); + + ins_cost(300); + format %{ "call,static " %} + opcode(0xE8); /* E8 cd */ + ins_encode(clear_avx, Java_Static_Call(meth), call_epilog); + ins_pipe(pipe_slow); + ins_alignment(4); +%} + +// Call Java Dynamic Instruction +// Note: If this code changes, the corresponding ret_addr_offset() and +// compute_padding() functions will have to be adjusted. +instruct CallDynamicJavaDirect(method meth) +%{ + match(CallDynamicJava); + effect(USE meth); + + ins_cost(300); + format %{ "movq rax, #Universe::non_oop_word()\n\t" + "call,dynamic " %} + ins_encode(clear_avx, Java_Dynamic_Call(meth), call_epilog); + ins_pipe(pipe_slow); + ins_alignment(4); +%} + +// Call Runtime Instruction +instruct CallRuntimeDirect(method meth) +%{ + match(CallRuntime); + effect(USE meth); + + ins_cost(300); + format %{ "call,runtime " %} + ins_encode(clear_avx, Java_To_Runtime(meth)); + ins_pipe(pipe_slow); +%} + +// Call runtime without safepoint +instruct CallLeafDirect(method meth) +%{ + match(CallLeaf); + effect(USE meth); + + ins_cost(300); + format %{ "call_leaf,runtime " %} + ins_encode(clear_avx, Java_To_Runtime(meth)); + ins_pipe(pipe_slow); +%} + +// Call runtime without safepoint and with vector arguments +instruct CallLeafDirectVector(method meth) +%{ + match(CallLeafVector); + effect(USE meth); + + ins_cost(300); + format %{ "call_leaf,vector " %} + ins_encode(Java_To_Runtime(meth)); + ins_pipe(pipe_slow); +%} + +// Call runtime without safepoint +instruct CallLeafNoFPDirect(method meth) +%{ + match(CallLeafNoFP); + effect(USE meth); + + ins_cost(300); + format %{ "call_leaf_nofp,runtime " %} + ins_encode(clear_avx, Java_To_Runtime(meth)); + ins_pipe(pipe_slow); +%} + +// Return Instruction +// Remove the return address & jump to it. +// Notice: We always emit a nop after a ret to make sure there is room +// for safepoint patching +instruct Ret() +%{ + match(Return); + + format %{ "ret" %} + ins_encode %{ + __ ret(0); + %} + ins_pipe(pipe_jmp); +%} + +// Tail Call; Jump from runtime stub to Java code. +// Also known as an 'interprocedural jump'. +// Target of jump will eventually return to caller. +// TailJump below removes the return address. +// Don't use rbp for 'jump_target' because a MachEpilogNode has already been +// emitted just above the TailCall which has reset rbp to the caller state. +instruct TailCalljmpInd(no_rbp_RegP jump_target, rbx_RegP method_ptr) +%{ + match(TailCall jump_target method_ptr); + + ins_cost(300); + format %{ "jmp $jump_target\t# rbx holds method" %} + ins_encode %{ + __ jmp($jump_target$$Register); + %} + ins_pipe(pipe_jmp); +%} + +// Tail Jump; remove the return address; jump to target. +// TailCall above leaves the return address around. +instruct tailjmpInd(no_rbp_RegP jump_target, rax_RegP ex_oop) +%{ + match(TailJump jump_target ex_oop); + + ins_cost(300); + format %{ "popq rdx\t# pop return address\n\t" + "jmp $jump_target" %} + ins_encode %{ + __ popq(as_Register(RDX_enc)); + __ jmp($jump_target$$Register); + %} + ins_pipe(pipe_jmp); +%} + +// Forward exception. +instruct ForwardExceptionjmp() +%{ + match(ForwardException); + + format %{ "jmp forward_exception_stub" %} + ins_encode %{ + __ jump(RuntimeAddress(StubRoutines::forward_exception_entry()), noreg); + %} + ins_pipe(pipe_jmp); +%} + +// Create exception oop: created by stack-crawling runtime code. +// Created exception is now available to this handler, and is setup +// just prior to jumping to this handler. No code emitted. +instruct CreateException(rax_RegP ex_oop) +%{ + match(Set ex_oop (CreateEx)); + + size(0); + // use the following format syntax + format %{ "# exception oop is in rax; no code emitted" %} + ins_encode(); + ins_pipe(empty); +%} + +// Rethrow exception: +// The exception oop will come in the first argument position. +// Then JUMP (not call) to the rethrow stub code. +instruct RethrowException() +%{ + match(Rethrow); + + // use the following format syntax + format %{ "jmp rethrow_stub" %} + ins_encode %{ + __ jump(RuntimeAddress(OptoRuntime::rethrow_stub()), noreg); + %} + ins_pipe(pipe_jmp); +%} + +// ============================================================================ +// This name is KNOWN by the ADLC and cannot be changed. +// The ADLC forces a 'TypeRawPtr::BOTTOM' output type +// for this guy. +instruct tlsLoadP(r15_RegP dst) %{ + match(Set dst (ThreadLocal)); + effect(DEF dst); + + size(0); + format %{ "# TLS is in R15" %} + ins_encode( /*empty encoding*/ ); + ins_pipe(ialu_reg_reg); +%} + instruct addF_reg(regF dst, regF src) %{ predicate(UseAVX == 0); match(Set dst (AddF dst src)); @@ -10939,3 +25267,329 @@ instruct vector_minmax_HF_reg(vec dst, vec src1, vec src2, kReg ktmp, vec xtmp1, %} ins_pipe( pipe_slow ); %} + +//----------PEEPHOLE RULES----------------------------------------------------- +// These must follow all instruction definitions as they use the names +// defined in the instructions definitions. +// +// peeppredicate ( rule_predicate ); +// // the predicate unless which the peephole rule will be ignored +// +// peepmatch ( root_instr_name [preceding_instruction]* ); +// +// peepprocedure ( procedure_name ); +// // provide a procedure name to perform the optimization, the procedure should +// // reside in the architecture dependent peephole file, the method has the +// // signature of MachNode* (Block*, int, PhaseRegAlloc*, (MachNode*)(*)(), int...) +// // with the arguments being the basic block, the current node index inside the +// // block, the register allocator, the functions upon invoked return a new node +// // defined in peepreplace, and the rules of the nodes appearing in the +// // corresponding peepmatch, the function return true if successful, else +// // return false +// +// peepconstraint %{ +// (instruction_number.operand_name relational_op instruction_number.operand_name +// [, ...] ); +// // instruction numbers are zero-based using left to right order in peepmatch +// +// peepreplace ( instr_name ( [instruction_number.operand_name]* ) ); +// // provide an instruction_number.operand_name for each operand that appears +// // in the replacement instruction's match rule +// +// ---------VM FLAGS--------------------------------------------------------- +// +// All peephole optimizations can be turned off using -XX:-OptoPeephole +// +// Each peephole rule is given an identifying number starting with zero and +// increasing by one in the order seen by the parser. An individual peephole +// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=# +// on the command-line. +// +// ---------CURRENT LIMITATIONS---------------------------------------------- +// +// Only transformations inside a basic block (do we need more for peephole) +// +// ---------EXAMPLE---------------------------------------------------------- +// +// // pertinent parts of existing instructions in architecture description +// instruct movI(rRegI dst, rRegI src) +// %{ +// match(Set dst (CopyI src)); +// %} +// +// instruct incI_rReg(rRegI dst, immI_1 src, rFlagsReg cr) +// %{ +// match(Set dst (AddI dst src)); +// effect(KILL cr); +// %} +// +// instruct leaI_rReg_immI(rRegI dst, immI_1 src) +// %{ +// match(Set dst (AddI dst src)); +// %} +// +// 1. Simple replacement +// - Only match adjacent instructions in same basic block +// - Only equality constraints +// - Only constraints between operands, not (0.dest_reg == RAX_enc) +// - Only one replacement instruction +// +// // Change (inc mov) to lea +// peephole %{ +// // lea should only be emitted when beneficial +// peeppredicate( VM_Version::supports_fast_2op_lea() ); +// // increment preceded by register-register move +// peepmatch ( incI_rReg movI ); +// // require that the destination register of the increment +// // match the destination register of the move +// peepconstraint ( 0.dst == 1.dst ); +// // construct a replacement instruction that sets +// // the destination to ( move's source register + one ) +// peepreplace ( leaI_rReg_immI( 0.dst 1.src 0.src ) ); +// %} +// +// 2. Procedural replacement +// - More flexible finding relevent nodes +// - More flexible constraints +// - More flexible transformations +// - May utilise architecture-dependent API more effectively +// - Currently only one replacement instruction due to adlc parsing capabilities +// +// // Change (inc mov) to lea +// peephole %{ +// // lea should only be emitted when beneficial +// peeppredicate( VM_Version::supports_fast_2op_lea() ); +// // the rule numbers of these nodes inside are passed into the function below +// peepmatch ( incI_rReg movI ); +// // the method that takes the responsibility of transformation +// peepprocedure ( inc_mov_to_lea ); +// // the replacement is a leaI_rReg_immI, a lambda upon invoked creating this +// // node is passed into the function above +// peepreplace ( leaI_rReg_immI() ); +// %} + +// These instructions is not matched by the matcher but used by the peephole +instruct leaI_rReg_rReg_peep(rRegI dst, rRegI src1, rRegI src2) +%{ + predicate(false); + match(Set dst (AddI src1 src2)); + format %{ "leal $dst, [$src1 + $src2]" %} + ins_encode %{ + Register dst = $dst$$Register; + Register src1 = $src1$$Register; + Register src2 = $src2$$Register; + if (src1 != rbp && src1 != r13) { + __ leal(dst, Address(src1, src2, Address::times_1)); + } else { + assert(src2 != rbp && src2 != r13, ""); + __ leal(dst, Address(src2, src1, Address::times_1)); + } + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaI_rReg_immI_peep(rRegI dst, rRegI src1, immI src2) +%{ + predicate(false); + match(Set dst (AddI src1 src2)); + format %{ "leal $dst, [$src1 + $src2]" %} + ins_encode %{ + __ leal($dst$$Register, Address($src1$$Register, $src2$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaI_rReg_immI2_peep(rRegI dst, rRegI src, immI2 shift) +%{ + predicate(false); + match(Set dst (LShiftI src shift)); + format %{ "leal $dst, [$src << $shift]" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($shift$$constant); + Register src = $src$$Register; + if (scale == Address::times_2 && src != rbp && src != r13) { + __ leal($dst$$Register, Address(src, src, Address::times_1)); + } else { + __ leal($dst$$Register, Address(noreg, src, scale)); + } + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_rReg_peep(rRegL dst, rRegL src1, rRegL src2) +%{ + predicate(false); + match(Set dst (AddL src1 src2)); + format %{ "leaq $dst, [$src1 + $src2]" %} + ins_encode %{ + Register dst = $dst$$Register; + Register src1 = $src1$$Register; + Register src2 = $src2$$Register; + if (src1 != rbp && src1 != r13) { + __ leaq(dst, Address(src1, src2, Address::times_1)); + } else { + assert(src2 != rbp && src2 != r13, ""); + __ leaq(dst, Address(src2, src1, Address::times_1)); + } + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_immL32_peep(rRegL dst, rRegL src1, immL32 src2) +%{ + predicate(false); + match(Set dst (AddL src1 src2)); + format %{ "leaq $dst, [$src1 + $src2]" %} + ins_encode %{ + __ leaq($dst$$Register, Address($src1$$Register, $src2$$constant)); + %} + ins_pipe(ialu_reg_reg); +%} + +instruct leaL_rReg_immI2_peep(rRegL dst, rRegL src, immI2 shift) +%{ + predicate(false); + match(Set dst (LShiftL src shift)); + format %{ "leaq $dst, [$src << $shift]" %} + ins_encode %{ + Address::ScaleFactor scale = static_cast($shift$$constant); + Register src = $src$$Register; + if (scale == Address::times_2 && src != rbp && src != r13) { + __ leaq($dst$$Register, Address(src, src, Address::times_1)); + } else { + __ leaq($dst$$Register, Address(noreg, src, scale)); + } + %} + ins_pipe(ialu_reg_reg); +%} + +// These peephole rules replace mov + I pairs (where I is one of {add, inc, dec, +// sal}) with lea instructions. The {add, sal} rules are beneficial in +// processors with at least partial ALU support for lea +// (supports_fast_2op_lea()), whereas the {inc, dec} rules are only generally +// beneficial for processors with full ALU support +// (VM_Version::supports_fast_3op_lea()) and Intel Cascade Lake. + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (addI_rReg); + peepprocedure (lea_coalesce_reg); + peepreplace (leaI_rReg_rReg_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (addI_rReg_imm); + peepprocedure (lea_coalesce_imm); + peepreplace (leaI_rReg_immI_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_3op_lea() || + VM_Version::is_intel_cascade_lake()); + peepmatch (incI_rReg); + peepprocedure (lea_coalesce_imm); + peepreplace (leaI_rReg_immI_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_3op_lea() || + VM_Version::is_intel_cascade_lake()); + peepmatch (decI_rReg); + peepprocedure (lea_coalesce_imm); + peepreplace (leaI_rReg_immI_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (salI_rReg_immI2); + peepprocedure (lea_coalesce_imm); + peepreplace (leaI_rReg_immI2_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (addL_rReg); + peepprocedure (lea_coalesce_reg); + peepreplace (leaL_rReg_rReg_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (addL_rReg_imm); + peepprocedure (lea_coalesce_imm); + peepreplace (leaL_rReg_immL32_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_3op_lea() || + VM_Version::is_intel_cascade_lake()); + peepmatch (incL_rReg); + peepprocedure (lea_coalesce_imm); + peepreplace (leaL_rReg_immL32_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_3op_lea() || + VM_Version::is_intel_cascade_lake()); + peepmatch (decL_rReg); + peepprocedure (lea_coalesce_imm); + peepreplace (leaL_rReg_immL32_peep()); +%} + +peephole +%{ + peeppredicate(VM_Version::supports_fast_2op_lea()); + peepmatch (salL_rReg_immI2); + peepprocedure (lea_coalesce_imm); + peepreplace (leaL_rReg_immI2_peep()); +%} + +peephole +%{ + peepmatch (leaPCompressedOopOffset); + peepprocedure (lea_remove_redundant); +%} + +peephole +%{ + peepmatch (leaP8Narrow); + peepprocedure (lea_remove_redundant); +%} + +peephole +%{ + peepmatch (leaP32Narrow); + peepprocedure (lea_remove_redundant); +%} + +// These peephole rules matches instructions which set flags and are followed by a testI/L_reg +// The test instruction is redudanent in case the downstream instuctions (like JCC or CMOV) only use flags that are already set by the previous instruction + +//int variant +peephole +%{ + peepmatch (testI_reg); + peepprocedure (test_may_remove); +%} + +//long variant +peephole +%{ + peepmatch (testL_reg); + peepprocedure (test_may_remove); +%} + + +//----------SMARTSPILL RULES--------------------------------------------------- +// These must follow all instruction definitions as they use the names +// defined in the instructions definitions. diff --git a/src/hotspot/cpu/x86/x86_64.ad b/src/hotspot/cpu/x86/x86_64.ad deleted file mode 100644 index 62306b562d6..00000000000 --- a/src/hotspot/cpu/x86/x86_64.ad +++ /dev/null @@ -1,14735 +0,0 @@ -// -// Copyright (c) 2003, 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. -// -// 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. -// -// - -// AMD64 Architecture Description File - -//----------REGISTER DEFINITION BLOCK------------------------------------------ -// This information is used by the matcher and the register allocator to -// describe individual registers and classes of registers within the target -// architecture. - -register %{ -//----------Architecture Description Register Definitions---------------------- -// General Registers -// "reg_def" name ( register save type, C convention save type, -// ideal register type, encoding ); -// Register Save Types: -// -// NS = No-Save: The register allocator assumes that these registers -// can be used without saving upon entry to the method, & -// that they do not need to be saved at call sites. -// -// SOC = Save-On-Call: The register allocator assumes that these registers -// can be used without saving upon entry to the method, -// but that they must be saved at call sites. -// -// SOE = Save-On-Entry: The register allocator assumes that these registers -// must be saved before using them upon entry to the -// method, but they do not need to be saved at call -// sites. -// -// AS = Always-Save: The register allocator assumes that these registers -// must be saved before using them upon entry to the -// method, & that they must be saved at call sites. -// -// Ideal Register Type is used to determine how to save & restore a -// register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get -// spilled with LoadP/StoreP. If the register supports both, use Op_RegI. -// -// The encoding number is the actual bit-pattern placed into the opcodes. - -// General Registers -// R8-R15 must be encoded with REX. (RSP, RBP, RSI, RDI need REX when -// used as byte registers) - -// Previously set RBX, RSI, and RDI as save-on-entry for java code -// Turn off SOE in java-code due to frequent use of uncommon-traps. -// Now that allocator is better, turn on RSI and RDI as SOE registers. - -reg_def RAX (SOC, SOC, Op_RegI, 0, rax->as_VMReg()); -reg_def RAX_H(SOC, SOC, Op_RegI, 0, rax->as_VMReg()->next()); - -reg_def RCX (SOC, SOC, Op_RegI, 1, rcx->as_VMReg()); -reg_def RCX_H(SOC, SOC, Op_RegI, 1, rcx->as_VMReg()->next()); - -reg_def RDX (SOC, SOC, Op_RegI, 2, rdx->as_VMReg()); -reg_def RDX_H(SOC, SOC, Op_RegI, 2, rdx->as_VMReg()->next()); - -reg_def RBX (SOC, SOE, Op_RegI, 3, rbx->as_VMReg()); -reg_def RBX_H(SOC, SOE, Op_RegI, 3, rbx->as_VMReg()->next()); - -reg_def RSP (NS, NS, Op_RegI, 4, rsp->as_VMReg()); -reg_def RSP_H(NS, NS, Op_RegI, 4, rsp->as_VMReg()->next()); - -// now that adapter frames are gone RBP is always saved and restored by the prolog/epilog code -reg_def RBP (NS, SOE, Op_RegI, 5, rbp->as_VMReg()); -reg_def RBP_H(NS, SOE, Op_RegI, 5, rbp->as_VMReg()->next()); - -#ifdef _WIN64 - -reg_def RSI (SOC, SOE, Op_RegI, 6, rsi->as_VMReg()); -reg_def RSI_H(SOC, SOE, Op_RegI, 6, rsi->as_VMReg()->next()); - -reg_def RDI (SOC, SOE, Op_RegI, 7, rdi->as_VMReg()); -reg_def RDI_H(SOC, SOE, Op_RegI, 7, rdi->as_VMReg()->next()); - -#else - -reg_def RSI (SOC, SOC, Op_RegI, 6, rsi->as_VMReg()); -reg_def RSI_H(SOC, SOC, Op_RegI, 6, rsi->as_VMReg()->next()); - -reg_def RDI (SOC, SOC, Op_RegI, 7, rdi->as_VMReg()); -reg_def RDI_H(SOC, SOC, Op_RegI, 7, rdi->as_VMReg()->next()); - -#endif - -reg_def R8 (SOC, SOC, Op_RegI, 8, r8->as_VMReg()); -reg_def R8_H (SOC, SOC, Op_RegI, 8, r8->as_VMReg()->next()); - -reg_def R9 (SOC, SOC, Op_RegI, 9, r9->as_VMReg()); -reg_def R9_H (SOC, SOC, Op_RegI, 9, r9->as_VMReg()->next()); - -reg_def R10 (SOC, SOC, Op_RegI, 10, r10->as_VMReg()); -reg_def R10_H(SOC, SOC, Op_RegI, 10, r10->as_VMReg()->next()); - -reg_def R11 (SOC, SOC, Op_RegI, 11, r11->as_VMReg()); -reg_def R11_H(SOC, SOC, Op_RegI, 11, r11->as_VMReg()->next()); - -reg_def R12 (SOC, SOE, Op_RegI, 12, r12->as_VMReg()); -reg_def R12_H(SOC, SOE, Op_RegI, 12, r12->as_VMReg()->next()); - -reg_def R13 (SOC, SOE, Op_RegI, 13, r13->as_VMReg()); -reg_def R13_H(SOC, SOE, Op_RegI, 13, r13->as_VMReg()->next()); - -reg_def R14 (SOC, SOE, Op_RegI, 14, r14->as_VMReg()); -reg_def R14_H(SOC, SOE, Op_RegI, 14, r14->as_VMReg()->next()); - -reg_def R15 (SOC, SOE, Op_RegI, 15, r15->as_VMReg()); -reg_def R15_H(SOC, SOE, Op_RegI, 15, r15->as_VMReg()->next()); - -reg_def R16 (SOC, SOC, Op_RegI, 16, r16->as_VMReg()); -reg_def R16_H(SOC, SOC, Op_RegI, 16, r16->as_VMReg()->next()); - -reg_def R17 (SOC, SOC, Op_RegI, 17, r17->as_VMReg()); -reg_def R17_H(SOC, SOC, Op_RegI, 17, r17->as_VMReg()->next()); - -reg_def R18 (SOC, SOC, Op_RegI, 18, r18->as_VMReg()); -reg_def R18_H(SOC, SOC, Op_RegI, 18, r18->as_VMReg()->next()); - -reg_def R19 (SOC, SOC, Op_RegI, 19, r19->as_VMReg()); -reg_def R19_H(SOC, SOC, Op_RegI, 19, r19->as_VMReg()->next()); - -reg_def R20 (SOC, SOC, Op_RegI, 20, r20->as_VMReg()); -reg_def R20_H(SOC, SOC, Op_RegI, 20, r20->as_VMReg()->next()); - -reg_def R21 (SOC, SOC, Op_RegI, 21, r21->as_VMReg()); -reg_def R21_H(SOC, SOC, Op_RegI, 21, r21->as_VMReg()->next()); - -reg_def R22 (SOC, SOC, Op_RegI, 22, r22->as_VMReg()); -reg_def R22_H(SOC, SOC, Op_RegI, 22, r22->as_VMReg()->next()); - -reg_def R23 (SOC, SOC, Op_RegI, 23, r23->as_VMReg()); -reg_def R23_H(SOC, SOC, Op_RegI, 23, r23->as_VMReg()->next()); - -reg_def R24 (SOC, SOC, Op_RegI, 24, r24->as_VMReg()); -reg_def R24_H(SOC, SOC, Op_RegI, 24, r24->as_VMReg()->next()); - -reg_def R25 (SOC, SOC, Op_RegI, 25, r25->as_VMReg()); -reg_def R25_H(SOC, SOC, Op_RegI, 25, r25->as_VMReg()->next()); - -reg_def R26 (SOC, SOC, Op_RegI, 26, r26->as_VMReg()); -reg_def R26_H(SOC, SOC, Op_RegI, 26, r26->as_VMReg()->next()); - -reg_def R27 (SOC, SOC, Op_RegI, 27, r27->as_VMReg()); -reg_def R27_H(SOC, SOC, Op_RegI, 27, r27->as_VMReg()->next()); - -reg_def R28 (SOC, SOC, Op_RegI, 28, r28->as_VMReg()); -reg_def R28_H(SOC, SOC, Op_RegI, 28, r28->as_VMReg()->next()); - -reg_def R29 (SOC, SOC, Op_RegI, 29, r29->as_VMReg()); -reg_def R29_H(SOC, SOC, Op_RegI, 29, r29->as_VMReg()->next()); - -reg_def R30 (SOC, SOC, Op_RegI, 30, r30->as_VMReg()); -reg_def R30_H(SOC, SOC, Op_RegI, 30, r30->as_VMReg()->next()); - -reg_def R31 (SOC, SOC, Op_RegI, 31, r31->as_VMReg()); -reg_def R31_H(SOC, SOC, Op_RegI, 31, r31->as_VMReg()->next()); - -// Floating Point Registers - -// Specify priority of register selection within phases of register -// allocation. Highest priority is first. A useful heuristic is to -// give registers a low priority when they are required by machine -// instructions, like EAX and EDX on I486, and choose no-save registers -// before save-on-call, & save-on-call before save-on-entry. Registers -// which participate in fixed calling sequences should come last. -// Registers which are used as pairs must fall on an even boundary. - -alloc_class chunk0(R10, R10_H, - R11, R11_H, - R8, R8_H, - R9, R9_H, - R12, R12_H, - RCX, RCX_H, - RBX, RBX_H, - RDI, RDI_H, - RDX, RDX_H, - RSI, RSI_H, - RAX, RAX_H, - RBP, RBP_H, - R13, R13_H, - R14, R14_H, - R15, R15_H, - R16, R16_H, - R17, R17_H, - R18, R18_H, - R19, R19_H, - R20, R20_H, - R21, R21_H, - R22, R22_H, - R23, R23_H, - R24, R24_H, - R25, R25_H, - R26, R26_H, - R27, R27_H, - R28, R28_H, - R29, R29_H, - R30, R30_H, - R31, R31_H, - RSP, RSP_H); - - -//----------Architecture Description Register Classes-------------------------- -// Several register classes are automatically defined based upon information in -// this architecture description. -// 1) reg_class inline_cache_reg ( /* as def'd in frame section */ ) -// 2) reg_class stack_slots( /* one chunk of stack-based "registers" */ ) -// - -// Empty register class. -reg_class no_reg(); - -// Class for all pointer/long registers including APX extended GPRs. -reg_class all_reg(RAX, RAX_H, - RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - RSP, RSP_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R12, R12_H, - R13, R13_H, - R14, R14_H, - R15, R15_H, - R16, R16_H, - R17, R17_H, - R18, R18_H, - R19, R19_H, - R20, R20_H, - R21, R21_H, - R22, R22_H, - R23, R23_H, - R24, R24_H, - R25, R25_H, - R26, R26_H, - R27, R27_H, - R28, R28_H, - R29, R29_H, - R30, R30_H, - R31, R31_H); - -// Class for all int registers including APX extended GPRs. -reg_class all_int_reg(RAX - RDX, - RBP, - RDI, - RSI, - RCX, - RBX, - R8, - R9, - R10, - R11, - R12, - R13, - R14, - R16, - R17, - R18, - R19, - R20, - R21, - R22, - R23, - R24, - R25, - R26, - R27, - R28, - R29, - R30, - R31); - -// Class for all pointer registers -reg_class any_reg %{ - return _ANY_REG_mask; -%} - -// Class for all pointer registers (excluding RSP) -reg_class ptr_reg %{ - return _PTR_REG_mask; -%} - -// Class for all pointer registers (excluding RSP and RBP) -reg_class ptr_reg_no_rbp %{ - return _PTR_REG_NO_RBP_mask; -%} - -// Class for all pointer registers (excluding RAX and RSP) -reg_class ptr_no_rax_reg %{ - return _PTR_NO_RAX_REG_mask; -%} - -// Class for all pointer registers (excluding RAX, RBX, and RSP) -reg_class ptr_no_rax_rbx_reg %{ - return _PTR_NO_RAX_RBX_REG_mask; -%} - -// Class for all long registers (excluding RSP) -reg_class long_reg %{ - return _LONG_REG_mask; -%} - -// Class for all long registers (excluding RAX, RDX and RSP) -reg_class long_no_rax_rdx_reg %{ - return _LONG_NO_RAX_RDX_REG_mask; -%} - -// Class for all long registers (excluding RCX and RSP) -reg_class long_no_rcx_reg %{ - return _LONG_NO_RCX_REG_mask; -%} - -// Class for all long registers (excluding RBP and R13) -reg_class long_no_rbp_r13_reg %{ - return _LONG_NO_RBP_R13_REG_mask; -%} - -// Class for all int registers (excluding RSP) -reg_class int_reg %{ - return _INT_REG_mask; -%} - -// Class for all int registers (excluding RAX, RDX, and RSP) -reg_class int_no_rax_rdx_reg %{ - return _INT_NO_RAX_RDX_REG_mask; -%} - -// Class for all int registers (excluding RCX and RSP) -reg_class int_no_rcx_reg %{ - return _INT_NO_RCX_REG_mask; -%} - -// Class for all int registers (excluding RBP and R13) -reg_class int_no_rbp_r13_reg %{ - return _INT_NO_RBP_R13_REG_mask; -%} - -// Singleton class for RAX pointer register -reg_class ptr_rax_reg(RAX, RAX_H); - -// Singleton class for RBX pointer register -reg_class ptr_rbx_reg(RBX, RBX_H); - -// Singleton class for RSI pointer register -reg_class ptr_rsi_reg(RSI, RSI_H); - -// Singleton class for RBP pointer register -reg_class ptr_rbp_reg(RBP, RBP_H); - -// Singleton class for RDI pointer register -reg_class ptr_rdi_reg(RDI, RDI_H); - -// Singleton class for stack pointer -reg_class ptr_rsp_reg(RSP, RSP_H); - -// Singleton class for TLS pointer -reg_class ptr_r15_reg(R15, R15_H); - -// Singleton class for RAX long register -reg_class long_rax_reg(RAX, RAX_H); - -// Singleton class for RCX long register -reg_class long_rcx_reg(RCX, RCX_H); - -// Singleton class for RDX long register -reg_class long_rdx_reg(RDX, RDX_H); - -// Singleton class for R11 long register -reg_class long_r11_reg(R11, R11_H); - -// Singleton class for RAX int register -reg_class int_rax_reg(RAX); - -// Singleton class for RBX int register -reg_class int_rbx_reg(RBX); - -// Singleton class for RCX int register -reg_class int_rcx_reg(RCX); - -// Singleton class for RDX int register -reg_class int_rdx_reg(RDX); - -// Singleton class for RDI int register -reg_class int_rdi_reg(RDI); - -// Singleton class for instruction pointer -// reg_class ip_reg(RIP); - -%} - -//----------SOURCE BLOCK------------------------------------------------------- -// This is a block of C++ code which provides values, functions, and -// definitions necessary in the rest of the architecture description - -source_hpp %{ - -#include "peephole_x86_64.hpp" - -bool castLL_is_imm32(const Node* n); - -%} - -source %{ - -bool castLL_is_imm32(const Node* n) { - assert(n->is_CastLL(), "must be a CastLL"); - const TypeLong* t = n->bottom_type()->is_long(); - return (t->_lo == min_jlong || Assembler::is_simm32(t->_lo)) && (t->_hi == max_jlong || Assembler::is_simm32(t->_hi)); -} - -%} - -// Register masks -source_hpp %{ - -extern RegMask _ANY_REG_mask; -extern RegMask _PTR_REG_mask; -extern RegMask _PTR_REG_NO_RBP_mask; -extern RegMask _PTR_NO_RAX_REG_mask; -extern RegMask _PTR_NO_RAX_RBX_REG_mask; -extern RegMask _LONG_REG_mask; -extern RegMask _LONG_NO_RAX_RDX_REG_mask; -extern RegMask _LONG_NO_RCX_REG_mask; -extern RegMask _LONG_NO_RBP_R13_REG_mask; -extern RegMask _INT_REG_mask; -extern RegMask _INT_NO_RAX_RDX_REG_mask; -extern RegMask _INT_NO_RCX_REG_mask; -extern RegMask _INT_NO_RBP_R13_REG_mask; -extern RegMask _FLOAT_REG_mask; - -extern RegMask _STACK_OR_PTR_REG_mask; -extern RegMask _STACK_OR_LONG_REG_mask; -extern RegMask _STACK_OR_INT_REG_mask; - -inline const RegMask& STACK_OR_PTR_REG_mask() { return _STACK_OR_PTR_REG_mask; } -inline const RegMask& STACK_OR_LONG_REG_mask() { return _STACK_OR_LONG_REG_mask; } -inline const RegMask& STACK_OR_INT_REG_mask() { return _STACK_OR_INT_REG_mask; } - -%} - -source %{ -#define RELOC_IMM64 Assembler::imm_operand -#define RELOC_DISP32 Assembler::disp32_operand - -#define __ masm-> - -RegMask _ANY_REG_mask; -RegMask _PTR_REG_mask; -RegMask _PTR_REG_NO_RBP_mask; -RegMask _PTR_NO_RAX_REG_mask; -RegMask _PTR_NO_RAX_RBX_REG_mask; -RegMask _LONG_REG_mask; -RegMask _LONG_NO_RAX_RDX_REG_mask; -RegMask _LONG_NO_RCX_REG_mask; -RegMask _LONG_NO_RBP_R13_REG_mask; -RegMask _INT_REG_mask; -RegMask _INT_NO_RAX_RDX_REG_mask; -RegMask _INT_NO_RCX_REG_mask; -RegMask _INT_NO_RBP_R13_REG_mask; -RegMask _FLOAT_REG_mask; -RegMask _STACK_OR_PTR_REG_mask; -RegMask _STACK_OR_LONG_REG_mask; -RegMask _STACK_OR_INT_REG_mask; - -static bool need_r12_heapbase() { - return UseCompressedOops; -} - -void reg_mask_init() { - constexpr Register egprs[] = {r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30, r31}; - - // _ALL_REG_mask is generated by adlc from the all_reg register class below. - // We derive a number of subsets from it. - _ANY_REG_mask.assignFrom(_ALL_REG_mask); - - if (PreserveFramePointer) { - _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _ANY_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); - } - if (need_r12_heapbase()) { - _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); - _ANY_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); - } - - _PTR_REG_mask.assignFrom(_ANY_REG_mask); - _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg())); - _PTR_REG_mask.remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); - _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg())); - _PTR_REG_mask.remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); - if (!UseAPX) { - for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { - _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); - _PTR_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg()->next())); - } - } - - _STACK_OR_PTR_REG_mask.assignFrom(_PTR_REG_mask); - _STACK_OR_PTR_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - - _PTR_REG_NO_RBP_mask.assignFrom(_PTR_REG_mask); - _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _PTR_REG_NO_RBP_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); - - _PTR_NO_RAX_REG_mask.assignFrom(_PTR_REG_mask); - _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _PTR_NO_RAX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); - - _PTR_NO_RAX_RBX_REG_mask.assignFrom(_PTR_NO_RAX_REG_mask); - _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg())); - _PTR_NO_RAX_RBX_REG_mask.remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); - - - _LONG_REG_mask.assignFrom(_PTR_REG_mask); - _STACK_OR_LONG_REG_mask.assignFrom(_LONG_REG_mask); - _STACK_OR_LONG_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - - _LONG_NO_RAX_RDX_REG_mask.assignFrom(_LONG_REG_mask); - _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); - _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); - _LONG_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); - - _LONG_NO_RCX_REG_mask.assignFrom(_LONG_REG_mask); - _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); - _LONG_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); - - _LONG_NO_RBP_R13_REG_mask.assignFrom(_LONG_REG_mask); - _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); - _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); - _LONG_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg()->next())); - - _INT_REG_mask.assignFrom(_ALL_INT_REG_mask); - if (!UseAPX) { - for (uint i = 0; i < sizeof(egprs)/sizeof(Register); i++) { - _INT_REG_mask.remove(OptoReg::as_OptoReg(egprs[i]->as_VMReg())); - } - } - - if (PreserveFramePointer) { - _INT_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - } - if (need_r12_heapbase()) { - _INT_REG_mask.remove(OptoReg::as_OptoReg(r12->as_VMReg())); - } - - _STACK_OR_INT_REG_mask.assignFrom(_INT_REG_mask); - _STACK_OR_INT_REG_mask.or_with(STACK_OR_STACK_SLOTS_mask()); - - _INT_NO_RAX_RDX_REG_mask.assignFrom(_INT_REG_mask); - _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rax->as_VMReg())); - _INT_NO_RAX_RDX_REG_mask.remove(OptoReg::as_OptoReg(rdx->as_VMReg())); - - _INT_NO_RCX_REG_mask.assignFrom(_INT_REG_mask); - _INT_NO_RCX_REG_mask.remove(OptoReg::as_OptoReg(rcx->as_VMReg())); - - _INT_NO_RBP_R13_REG_mask.assignFrom(_INT_REG_mask); - _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(rbp->as_VMReg())); - _INT_NO_RBP_R13_REG_mask.remove(OptoReg::as_OptoReg(r13->as_VMReg())); - - // _FLOAT_REG_LEGACY_mask/_FLOAT_REG_EVEX_mask is generated by adlc - // from the float_reg_legacy/float_reg_evex register class. - _FLOAT_REG_mask.assignFrom(VM_Version::supports_evex() ? _FLOAT_REG_EVEX_mask : _FLOAT_REG_LEGACY_mask); -} - -static bool generate_vzeroupper(Compile* C) { - return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper -} - -static int clear_avx_size() { - return generate_vzeroupper(Compile::current()) ? 3: 0; // vzeroupper -} - -// !!!!! Special hack to get all types of calls to specify the byte offset -// from the start of the call to the point where the return address -// will point. -int MachCallStaticJavaNode::ret_addr_offset() -{ - int offset = 5; // 5 bytes from start of call to where return address points - offset += clear_avx_size(); - return offset; -} - -int MachCallDynamicJavaNode::ret_addr_offset() -{ - int offset = 15; // 15 bytes from start of call to where return address points - offset += clear_avx_size(); - return offset; -} - -int MachCallRuntimeNode::ret_addr_offset() { - int offset = 13; // movq r10,#addr; callq (r10) - if (this->ideal_Opcode() != Op_CallLeafVector) { - offset += clear_avx_size(); - } - return offset; -} -// -// Compute padding required for nodes which need alignment -// - -// The address of the call instruction needs to be 4-byte aligned to -// ensure that it does not span a cache line so that it can be patched. -int CallStaticJavaDirectNode::compute_padding(int current_offset) const -{ - current_offset += clear_avx_size(); // skip vzeroupper - current_offset += 1; // skip call opcode byte - return align_up(current_offset, alignment_required()) - current_offset; -} - -// The address of the call instruction needs to be 4-byte aligned to -// ensure that it does not span a cache line so that it can be patched. -int CallDynamicJavaDirectNode::compute_padding(int current_offset) const -{ - current_offset += clear_avx_size(); // skip vzeroupper - current_offset += 11; // skip movq instruction + call opcode byte - return align_up(current_offset, alignment_required()) - current_offset; -} - -// This could be in MacroAssembler but it's fairly C2 specific -static void emit_cmpfp_fixup(MacroAssembler* masm) { - Label exit; - __ jccb(Assembler::noParity, exit); - __ pushf(); - // - // comiss/ucomiss instructions set ZF,PF,CF flags and - // zero OF,AF,SF for NaN values. - // Fixup flags by zeroing ZF,PF so that compare of NaN - // values returns 'less than' result (CF is set). - // Leave the rest of flags unchanged. - // - // 7 6 5 4 3 2 1 0 - // |S|Z|r|A|r|P|r|C| (r - reserved bit) - // 0 0 1 0 1 0 1 1 (0x2B) - // - __ andq(Address(rsp, 0), 0xffffff2b); - __ popf(); - __ bind(exit); -} - -static void emit_cmpfp3(MacroAssembler* masm, Register dst) { - Label done; - __ movl(dst, -1); - __ jcc(Assembler::parity, done); - __ jcc(Assembler::below, done); - __ setcc(Assembler::notEqual, dst); - __ bind(done); -} - -// Math.min() # Math.max() -// -------------------------- -// ucomis[s/d] # -// ja -> b # a -// jp -> NaN # NaN -// jb -> a # b -// je # -// |-jz -> a | b # a & b -// | -> a # -static void emit_fp_min_max(MacroAssembler* masm, XMMRegister dst, - XMMRegister a, XMMRegister b, - XMMRegister xmmt, Register rt, - bool min, bool single) { - - Label nan, zero, below, above, done; - - if (single) - __ ucomiss(a, b); - else - __ ucomisd(a, b); - - if (dst->encoding() != (min ? b : a)->encoding()) - __ jccb(Assembler::above, above); // CF=0 & ZF=0 - else - __ jccb(Assembler::above, done); - - __ jccb(Assembler::parity, nan); // PF=1 - __ jccb(Assembler::below, below); // CF=1 - - // equal - __ vpxor(xmmt, xmmt, xmmt, Assembler::AVX_128bit); - if (single) { - __ ucomiss(a, xmmt); - __ jccb(Assembler::equal, zero); - - __ movflt(dst, a); - __ jmp(done); - } - else { - __ ucomisd(a, xmmt); - __ jccb(Assembler::equal, zero); - - __ movdbl(dst, a); - __ jmp(done); - } - - __ bind(zero); - if (min) - __ vpor(dst, a, b, Assembler::AVX_128bit); - else - __ vpand(dst, a, b, Assembler::AVX_128bit); - - __ jmp(done); - - __ bind(above); - if (single) - __ movflt(dst, min ? b : a); - else - __ movdbl(dst, min ? b : a); - - __ jmp(done); - - __ bind(nan); - if (single) { - __ movl(rt, 0x7fc00000); // Float.NaN - __ movdl(dst, rt); - } - else { - __ mov64(rt, 0x7ff8000000000000L); // Double.NaN - __ movdq(dst, rt); - } - __ jmp(done); - - __ bind(below); - if (single) - __ movflt(dst, min ? a : b); - else - __ movdbl(dst, min ? a : b); - - __ bind(done); -} - -//============================================================================= -const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::EMPTY; - -int ConstantTable::calculate_table_base_offset() const { - return 0; // absolute addressing, no offset -} - -bool MachConstantBaseNode::requires_postalloc_expand() const { return false; } -void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { - ShouldNotReachHere(); -} - -void MachConstantBaseNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const { - // Empty encoding -} - -uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const { - return 0; -} - -#ifndef PRODUCT -void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const { - st->print("# MachConstantBaseNode (empty encoding)"); -} -#endif - - -//============================================================================= -#ifndef PRODUCT -void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const { - Compile* C = ra_->C; - - int framesize = C->output()->frame_size_in_bytes(); - int bangsize = C->output()->bang_size_in_bytes(); - assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); - // Remove wordSize for return addr which is already pushed. - framesize -= wordSize; - - if (C->output()->need_stack_bang(bangsize)) { - framesize -= wordSize; - st->print("# stack bang (%d bytes)", bangsize); - st->print("\n\t"); - st->print("pushq rbp\t# Save rbp"); - if (PreserveFramePointer) { - st->print("\n\t"); - st->print("movq rbp, rsp\t# Save the caller's SP into rbp"); - } - if (framesize) { - st->print("\n\t"); - st->print("subq rsp, #%d\t# Create frame",framesize); - } - } else { - st->print("subq rsp, #%d\t# Create frame",framesize); - st->print("\n\t"); - framesize -= wordSize; - st->print("movq [rsp + #%d], rbp\t# Save rbp",framesize); - if (PreserveFramePointer) { - st->print("\n\t"); - st->print("movq rbp, rsp\t# Save the caller's SP into rbp"); - if (framesize > 0) { - st->print("\n\t"); - st->print("addq rbp, #%d", framesize); - } - } - } - - if (VerifyStackAtCalls) { - st->print("\n\t"); - framesize -= wordSize; - st->print("movq [rsp + #%d], 0xbadb100d\t# Majik cookie for stack depth check",framesize); -#ifdef ASSERT - st->print("\n\t"); - st->print("# stack alignment check"); -#endif - } - if (C->stub_function() != nullptr) { - st->print("\n\t"); - st->print("cmpl [r15_thread + #disarmed_guard_value_offset], #disarmed_guard_value\t"); - st->print("\n\t"); - st->print("je fast_entry\t"); - st->print("\n\t"); - st->print("call #nmethod_entry_barrier_stub\t"); - st->print("\n\tfast_entry:"); - } - st->cr(); -} -#endif - -void MachPrologNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { - Compile* C = ra_->C; - - int framesize = C->output()->frame_size_in_bytes(); - int bangsize = C->output()->bang_size_in_bytes(); - - if (C->clinit_barrier_on_entry()) { - assert(VM_Version::supports_fast_class_init_checks(), "sanity"); - assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started"); - - Label L_skip_barrier; - Register klass = rscratch1; - - __ mov_metadata(klass, C->method()->holder()->constant_encoding()); - __ clinit_barrier(klass, &L_skip_barrier /*L_fast_path*/); - - __ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub())); // slow path - - __ bind(L_skip_barrier); - } - - __ verified_entry(framesize, C->output()->need_stack_bang(bangsize)?bangsize:0, false, C->stub_function() != nullptr); - - C->output()->set_frame_complete(__ offset()); - - if (C->has_mach_constant_base_node()) { - // NOTE: We set the table base offset here because users might be - // emitted before MachConstantBaseNode. - ConstantTable& constant_table = C->output()->constant_table(); - constant_table.set_table_base_offset(constant_table.calculate_table_base_offset()); - } -} - -uint MachPrologNode::size(PhaseRegAlloc* ra_) const -{ - return MachNode::size(ra_); // too many variables; just compute it - // the hard way -} - -int MachPrologNode::reloc() const -{ - return 0; // a large enough number -} - -//============================================================================= -#ifndef PRODUCT -void MachEpilogNode::format(PhaseRegAlloc* ra_, outputStream* st) const -{ - Compile* C = ra_->C; - if (generate_vzeroupper(C)) { - st->print("vzeroupper"); - st->cr(); st->print("\t"); - } - - int framesize = C->output()->frame_size_in_bytes(); - assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); - // Remove word for return adr already pushed - // and RBP - framesize -= 2*wordSize; - - if (framesize) { - st->print_cr("addq rsp, %d\t# Destroy frame", framesize); - st->print("\t"); - } - - st->print_cr("popq rbp"); - if (do_polling() && C->is_method_compilation()) { - st->print("\t"); - st->print_cr("cmpq rsp, poll_offset[r15_thread] \n\t" - "ja #safepoint_stub\t" - "# Safepoint: poll for GC"); - } -} -#endif - -void MachEpilogNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const -{ - Compile* C = ra_->C; - - if (generate_vzeroupper(C)) { - // Clear upper bits of YMM registers when current compiled code uses - // wide vectors to avoid AVX <-> SSE transition penalty during call. - __ vzeroupper(); - } - - int framesize = C->output()->frame_size_in_bytes(); - assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); - // Remove word for return adr already pushed - // and RBP - framesize -= 2*wordSize; - - // Note that VerifyStackAtCalls' Majik cookie does not change the frame size popped here - - if (framesize) { - __ addq(rsp, framesize); - } - - __ popq(rbp); - - if (StackReservedPages > 0 && C->has_reserved_stack_access()) { - __ reserved_stack_check(); - } - - if (do_polling() && C->is_method_compilation()) { - Label dummy_label; - Label* code_stub = &dummy_label; - if (!C->output()->in_scratch_emit_size()) { - C2SafepointPollStub* stub = new (C->comp_arena()) C2SafepointPollStub(__ offset()); - C->output()->add_stub(stub); - code_stub = &stub->entry(); - } - __ relocate(relocInfo::poll_return_type); - __ safepoint_poll(*code_stub, true /* at_return */, true /* in_nmethod */); - } -} - -uint MachEpilogNode::size(PhaseRegAlloc* ra_) const -{ - return MachNode::size(ra_); // too many variables; just compute it - // the hard way -} - -int MachEpilogNode::reloc() const -{ - return 2; // a large enough number -} - -const Pipeline* MachEpilogNode::pipeline() const -{ - return MachNode::pipeline_class(); -} - -//============================================================================= - -enum RC { - rc_bad, - rc_int, - rc_kreg, - rc_float, - rc_stack -}; - -static enum RC rc_class(OptoReg::Name reg) -{ - if( !OptoReg::is_valid(reg) ) return rc_bad; - - if (OptoReg::is_stack(reg)) return rc_stack; - - VMReg r = OptoReg::as_VMReg(reg); - - if (r->is_Register()) return rc_int; - - if (r->is_KRegister()) return rc_kreg; - - assert(r->is_XMMRegister(), "must be"); - return rc_float; -} - -// Next two methods are shared by 32- and 64-bit VM. They are defined in x86.ad. -static void vec_mov_helper(C2_MacroAssembler *masm, int src_lo, int dst_lo, - int src_hi, int dst_hi, uint ireg, outputStream* st); - -void vec_spill_helper(C2_MacroAssembler *masm, bool is_load, - int stack_offset, int reg, uint ireg, outputStream* st); - -static void vec_stack_to_stack_helper(C2_MacroAssembler *masm, int src_offset, - int dst_offset, uint ireg, outputStream* st) { - if (masm) { - switch (ireg) { - case Op_VecS: - __ movq(Address(rsp, -8), rax); - __ movl(rax, Address(rsp, src_offset)); - __ movl(Address(rsp, dst_offset), rax); - __ movq(rax, Address(rsp, -8)); - break; - case Op_VecD: - __ pushq(Address(rsp, src_offset)); - __ popq (Address(rsp, dst_offset)); - break; - case Op_VecX: - __ pushq(Address(rsp, src_offset)); - __ popq (Address(rsp, dst_offset)); - __ pushq(Address(rsp, src_offset+8)); - __ popq (Address(rsp, dst_offset+8)); - break; - case Op_VecY: - __ vmovdqu(Address(rsp, -32), xmm0); - __ vmovdqu(xmm0, Address(rsp, src_offset)); - __ vmovdqu(Address(rsp, dst_offset), xmm0); - __ vmovdqu(xmm0, Address(rsp, -32)); - break; - case Op_VecZ: - __ evmovdquq(Address(rsp, -64), xmm0, 2); - __ evmovdquq(xmm0, Address(rsp, src_offset), 2); - __ evmovdquq(Address(rsp, dst_offset), xmm0, 2); - __ evmovdquq(xmm0, Address(rsp, -64), 2); - break; - default: - ShouldNotReachHere(); - } -#ifndef PRODUCT - } else { - switch (ireg) { - case Op_VecS: - st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" - "movl rax, [rsp + #%d]\n\t" - "movl [rsp + #%d], rax\n\t" - "movq rax, [rsp - #8]", - src_offset, dst_offset); - break; - case Op_VecD: - st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" - "popq [rsp + #%d]", - src_offset, dst_offset); - break; - case Op_VecX: - st->print("pushq [rsp + #%d]\t# 128-bit mem-mem spill\n\t" - "popq [rsp + #%d]\n\t" - "pushq [rsp + #%d]\n\t" - "popq [rsp + #%d]", - src_offset, dst_offset, src_offset+8, dst_offset+8); - break; - case Op_VecY: - st->print("vmovdqu [rsp - #32], xmm0\t# 256-bit mem-mem spill\n\t" - "vmovdqu xmm0, [rsp + #%d]\n\t" - "vmovdqu [rsp + #%d], xmm0\n\t" - "vmovdqu xmm0, [rsp - #32]", - src_offset, dst_offset); - break; - case Op_VecZ: - st->print("vmovdqu [rsp - #64], xmm0\t# 512-bit mem-mem spill\n\t" - "vmovdqu xmm0, [rsp + #%d]\n\t" - "vmovdqu [rsp + #%d], xmm0\n\t" - "vmovdqu xmm0, [rsp - #64]", - src_offset, dst_offset); - break; - default: - ShouldNotReachHere(); - } -#endif - } -} - -uint MachSpillCopyNode::implementation(C2_MacroAssembler* masm, - PhaseRegAlloc* ra_, - bool do_size, - outputStream* st) const { - assert(masm != nullptr || st != nullptr, "sanity"); - // Get registers to move - OptoReg::Name src_second = ra_->get_reg_second(in(1)); - OptoReg::Name src_first = ra_->get_reg_first(in(1)); - OptoReg::Name dst_second = ra_->get_reg_second(this); - OptoReg::Name dst_first = ra_->get_reg_first(this); - - enum RC src_second_rc = rc_class(src_second); - enum RC src_first_rc = rc_class(src_first); - enum RC dst_second_rc = rc_class(dst_second); - enum RC dst_first_rc = rc_class(dst_first); - - assert(OptoReg::is_valid(src_first) && OptoReg::is_valid(dst_first), - "must move at least 1 register" ); - - if (src_first == dst_first && src_second == dst_second) { - // Self copy, no move - return 0; - } - if (bottom_type()->isa_vect() != nullptr && bottom_type()->isa_vectmask() == nullptr) { - uint ireg = ideal_reg(); - assert((src_first_rc != rc_int && dst_first_rc != rc_int), "sanity"); - assert((ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ ), "sanity"); - if( src_first_rc == rc_stack && dst_first_rc == rc_stack ) { - // mem -> mem - int src_offset = ra_->reg2offset(src_first); - int dst_offset = ra_->reg2offset(dst_first); - vec_stack_to_stack_helper(masm, src_offset, dst_offset, ireg, st); - } else if (src_first_rc == rc_float && dst_first_rc == rc_float ) { - vec_mov_helper(masm, src_first, dst_first, src_second, dst_second, ireg, st); - } else if (src_first_rc == rc_float && dst_first_rc == rc_stack ) { - int stack_offset = ra_->reg2offset(dst_first); - vec_spill_helper(masm, false, stack_offset, src_first, ireg, st); - } else if (src_first_rc == rc_stack && dst_first_rc == rc_float ) { - int stack_offset = ra_->reg2offset(src_first); - vec_spill_helper(masm, true, stack_offset, dst_first, ireg, st); - } else { - ShouldNotReachHere(); - } - return 0; - } - if (src_first_rc == rc_stack) { - // mem -> - if (dst_first_rc == rc_stack) { - // mem -> mem - assert(src_second != dst_first, "overlap"); - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int src_offset = ra_->reg2offset(src_first); - int dst_offset = ra_->reg2offset(dst_first); - if (masm) { - __ pushq(Address(rsp, src_offset)); - __ popq (Address(rsp, dst_offset)); -#ifndef PRODUCT - } else { - st->print("pushq [rsp + #%d]\t# 64-bit mem-mem spill\n\t" - "popq [rsp + #%d]", - src_offset, dst_offset); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - // No pushl/popl, so: - int src_offset = ra_->reg2offset(src_first); - int dst_offset = ra_->reg2offset(dst_first); - if (masm) { - __ movq(Address(rsp, -8), rax); - __ movl(rax, Address(rsp, src_offset)); - __ movl(Address(rsp, dst_offset), rax); - __ movq(rax, Address(rsp, -8)); -#ifndef PRODUCT - } else { - st->print("movq [rsp - #8], rax\t# 32-bit mem-mem spill\n\t" - "movl rax, [rsp + #%d]\n\t" - "movl [rsp + #%d], rax\n\t" - "movq rax, [rsp - #8]", - src_offset, dst_offset); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_int) { - // mem -> gpr - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(src_first); - if (masm) { - __ movq(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); -#ifndef PRODUCT - } else { - st->print("movq %s, [rsp + #%d]\t# spill", - Matcher::regName[dst_first], - offset); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - int offset = ra_->reg2offset(src_first); - if (masm) { - __ movl(as_Register(Matcher::_regEncode[dst_first]), Address(rsp, offset)); -#ifndef PRODUCT - } else { - st->print("movl %s, [rsp + #%d]\t# spill", - Matcher::regName[dst_first], - offset); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_float) { - // mem-> xmm - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(src_first); - if (masm) { - __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); -#ifndef PRODUCT - } else { - st->print("%s %s, [rsp + #%d]\t# spill", - UseXmmLoadAndClearUpper ? "movsd " : "movlpd", - Matcher::regName[dst_first], - offset); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - int offset = ra_->reg2offset(src_first); - if (masm) { - __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); -#ifndef PRODUCT - } else { - st->print("movss %s, [rsp + #%d]\t# spill", - Matcher::regName[dst_first], - offset); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_kreg) { - // mem -> kreg - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(src_first); - if (masm) { - __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), Address(rsp, offset)); -#ifndef PRODUCT - } else { - st->print("kmovq %s, [rsp + #%d]\t# spill", - Matcher::regName[dst_first], - offset); -#endif - } - } - return 0; - } - } else if (src_first_rc == rc_int) { - // gpr -> - if (dst_first_rc == rc_stack) { - // gpr -> mem - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(dst_first); - if (masm) { - __ movq(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movq [rsp + #%d], %s\t# spill", - offset, - Matcher::regName[src_first]); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - int offset = ra_->reg2offset(dst_first); - if (masm) { - __ movl(Address(rsp, offset), as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movl [rsp + #%d], %s\t# spill", - offset, - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_int) { - // gpr -> gpr - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ movq(as_Register(Matcher::_regEncode[dst_first]), - as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - return 0; - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - if (masm) { - __ movl(as_Register(Matcher::_regEncode[dst_first]), - as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movl %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - return 0; - } - } else if (dst_first_rc == rc_float) { - // gpr -> xmm - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ movdq( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movdq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - if (masm) { - __ movdl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movdl %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_kreg) { - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), as_Register(Matcher::_regEncode[src_first])); - #ifndef PRODUCT - } else { - st->print("kmovq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); - #endif - } - } - Unimplemented(); - return 0; - } - } else if (src_first_rc == rc_float) { - // xmm -> - if (dst_first_rc == rc_stack) { - // xmm -> mem - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(dst_first); - if (masm) { - __ movdbl( Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movsd [rsp + #%d], %s\t# spill", - offset, - Matcher::regName[src_first]); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - int offset = ra_->reg2offset(dst_first); - if (masm) { - __ movflt(Address(rsp, offset), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movss [rsp + #%d], %s\t# spill", - offset, - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_int) { - // xmm -> gpr - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ movdq( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movdq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - if (masm) { - __ movdl( as_Register(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("movdl %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_float) { - // xmm -> xmm - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ movdbl( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("%s %s, %s\t# spill", - UseXmmRegToRegMoveAll ? "movapd" : "movsd ", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } else { - // 32-bit - assert(!((src_first & 1) == 0 && src_first + 1 == src_second), "no transform"); - assert(!((dst_first & 1) == 0 && dst_first + 1 == dst_second), "no transform"); - if (masm) { - __ movflt( as_XMMRegister(Matcher::_regEncode[dst_first]), as_XMMRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("%s %s, %s\t# spill", - UseXmmRegToRegMoveAll ? "movaps" : "movss ", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_kreg) { - assert(false, "Illegal spilling"); - return 0; - } - } else if (src_first_rc == rc_kreg) { - if (dst_first_rc == rc_stack) { - // mem -> kreg - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - int offset = ra_->reg2offset(dst_first); - if (masm) { - __ kmov(Address(rsp, offset), as_KRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("kmovq [rsp + #%d] , %s\t# spill", - offset, - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_int) { - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ kmov(as_Register(Matcher::_regEncode[dst_first]), as_KRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("kmovq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } - Unimplemented(); - return 0; - } else if (dst_first_rc == rc_kreg) { - if ((src_first & 1) == 0 && src_first + 1 == src_second && - (dst_first & 1) == 0 && dst_first + 1 == dst_second) { - // 64-bit - if (masm) { - __ kmov(as_KRegister(Matcher::_regEncode[dst_first]), as_KRegister(Matcher::_regEncode[src_first])); -#ifndef PRODUCT - } else { - st->print("kmovq %s, %s\t# spill", - Matcher::regName[dst_first], - Matcher::regName[src_first]); -#endif - } - } - return 0; - } else if (dst_first_rc == rc_float) { - assert(false, "Illegal spill"); - return 0; - } - } - - assert(0," foo "); - Unimplemented(); - return 0; -} - -#ifndef PRODUCT -void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream* st) const { - implementation(nullptr, ra_, false, st); -} -#endif - -void MachSpillCopyNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { - implementation(masm, ra_, false, nullptr); -} - -uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const { - return MachNode::size(ra_); -} - -//============================================================================= -#ifndef PRODUCT -void BoxLockNode::format(PhaseRegAlloc* ra_, outputStream* st) const -{ - int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); - int reg = ra_->get_reg_first(this); - st->print("leaq %s, [rsp + #%d]\t# box lock", - Matcher::regName[reg], offset); -} -#endif - -void BoxLockNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const -{ - int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); - int reg = ra_->get_encode(this); - - __ lea(as_Register(reg), Address(rsp, offset)); -} - -uint BoxLockNode::size(PhaseRegAlloc *ra_) const -{ - int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); - if (ra_->get_encode(this) > 15) { - return (offset < 0x80) ? 6 : 9; // REX2 - } else { - return (offset < 0x80) ? 5 : 8; // REX - } -} - -//============================================================================= -#ifndef PRODUCT -void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const -{ - if (UseCompressedClassPointers) { - st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass"); - st->print_cr("\tcmpl rscratch1, [rax + CompiledICData::speculated_klass_offset()]\t # Inline cache check"); - } else { - st->print_cr("movq rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass"); - st->print_cr("\tcmpq rscratch1, [rax + CompiledICData::speculated_klass_offset()]\t # Inline cache check"); - } - st->print_cr("\tjne SharedRuntime::_ic_miss_stub"); -} -#endif - -void MachUEPNode::emit(C2_MacroAssembler* masm, PhaseRegAlloc* ra_) const -{ - __ ic_check(InteriorEntryAlignment); -} - -uint MachUEPNode::size(PhaseRegAlloc* ra_) const -{ - return MachNode::size(ra_); // too many variables; just compute it - // the hard way -} - - -//============================================================================= - -bool Matcher::supports_vector_calling_convention(void) { - return EnableVectorSupport; -} - -OptoRegPair Matcher::vector_return_value(uint ideal_reg) { - assert(EnableVectorSupport, "sanity"); - int lo = XMM0_num; - int hi = XMM0b_num; - if (ideal_reg == Op_VecX) hi = XMM0d_num; - else if (ideal_reg == Op_VecY) hi = XMM0h_num; - else if (ideal_reg == Op_VecZ) hi = XMM0p_num; - return OptoRegPair(hi, lo); -} - -// Is this branch offset short enough that a short branch can be used? -// -// NOTE: If the platform does not provide any short branch variants, then -// this method should return false for offset 0. -bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) { - // The passed offset is relative to address of the branch. - // On 86 a branch displacement is calculated relative to address - // of a next instruction. - offset -= br_size; - - // the short version of jmpConUCF2 contains multiple branches, - // making the reach slightly less - if (rule == jmpConUCF2_rule) - return (-126 <= offset && offset <= 125); - return (-128 <= offset && offset <= 127); -} - -// Return whether or not this register is ever used as an argument. -// This function is used on startup to build the trampoline stubs in -// generateOptoStub. Registers not mentioned will be killed by the VM -// call in the trampoline, and arguments in those registers not be -// available to the callee. -bool Matcher::can_be_java_arg(int reg) -{ - return - reg == RDI_num || reg == RDI_H_num || - reg == RSI_num || reg == RSI_H_num || - reg == RDX_num || reg == RDX_H_num || - reg == RCX_num || reg == RCX_H_num || - reg == R8_num || reg == R8_H_num || - reg == R9_num || reg == R9_H_num || - reg == R12_num || reg == R12_H_num || - reg == XMM0_num || reg == XMM0b_num || - reg == XMM1_num || reg == XMM1b_num || - reg == XMM2_num || reg == XMM2b_num || - reg == XMM3_num || reg == XMM3b_num || - reg == XMM4_num || reg == XMM4b_num || - reg == XMM5_num || reg == XMM5b_num || - reg == XMM6_num || reg == XMM6b_num || - reg == XMM7_num || reg == XMM7b_num; -} - -bool Matcher::is_spillable_arg(int reg) -{ - return can_be_java_arg(reg); -} - -uint Matcher::int_pressure_limit() -{ - return (INTPRESSURE == -1) ? _INT_REG_mask.size() : INTPRESSURE; -} - -uint Matcher::float_pressure_limit() -{ - // After experiment around with different values, the following default threshold - // works best for LCM's register pressure scheduling on x64. - uint dec_count = VM_Version::supports_evex() ? 4 : 2; - uint default_float_pressure_threshold = _FLOAT_REG_mask.size() - dec_count; - return (FLOATPRESSURE == -1) ? default_float_pressure_threshold : FLOATPRESSURE; -} - -bool Matcher::use_asm_for_ldiv_by_con( jlong divisor ) { - // In 64 bit mode a code which use multiply when - // devisor is constant is faster than hardware - // DIV instruction (it uses MulHiL). - return false; -} - -// Register for DIVI projection of divmodI -const RegMask& Matcher::divI_proj_mask() { - return INT_RAX_REG_mask(); -} - -// Register for MODI projection of divmodI -const RegMask& Matcher::modI_proj_mask() { - return INT_RDX_REG_mask(); -} - -// Register for DIVL projection of divmodL -const RegMask& Matcher::divL_proj_mask() { - return LONG_RAX_REG_mask(); -} - -// Register for MODL projection of divmodL -const RegMask& Matcher::modL_proj_mask() { - return LONG_RDX_REG_mask(); -} - -%} - -//----------ENCODING BLOCK----------------------------------------------------- -// This block specifies the encoding classes used by the compiler to -// output byte streams. Encoding classes are parameterized macros -// used by Machine Instruction Nodes in order to generate the bit -// encoding of the instruction. Operands specify their base encoding -// interface with the interface keyword. There are currently -// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, & -// COND_INTER. REG_INTER causes an operand to generate a function -// which returns its register number when queried. CONST_INTER causes -// an operand to generate a function which returns the value of the -// constant when queried. MEMORY_INTER causes an operand to generate -// four functions which return the Base Register, the Index Register, -// the Scale Value, and the Offset Value of the operand when queried. -// COND_INTER causes an operand to generate six functions which return -// the encoding code (ie - encoding bits for the instruction) -// associated with each basic boolean condition for a conditional -// instruction. -// -// Instructions specify two basic values for encoding. Again, a -// function is available to check if the constant displacement is an -// oop. They use the ins_encode keyword to specify their encoding -// classes (which must be a sequence of enc_class names, and their -// parameters, specified in the encoding block), and they use the -// opcode keyword to specify, in order, their primary, secondary, and -// tertiary opcode. Only the opcode sections which a particular -// instruction needs for encoding need to be specified. -encode %{ - enc_class cdql_enc(no_rax_rdx_RegI div) - %{ - // Full implementation of Java idiv and irem; checks for - // special case as described in JVM spec., p.243 & p.271. - // - // normal case special case - // - // input : rax: dividend min_int - // reg: divisor -1 - // - // output: rax: quotient (= rax idiv reg) min_int - // rdx: remainder (= rax irem reg) 0 - // - // Code sequnce: - // - // 0: 3d 00 00 00 80 cmp $0x80000000,%eax - // 5: 75 07/08 jne e - // 7: 33 d2 xor %edx,%edx - // [div >= 8 -> offset + 1] - // [REX_B] - // 9: 83 f9 ff cmp $0xffffffffffffffff,$div - // c: 74 03/04 je 11 - // 000000000000000e : - // e: 99 cltd - // [div >= 8 -> offset + 1] - // [REX_B] - // f: f7 f9 idiv $div - // 0000000000000011 : - Label normal; - Label done; - - // cmp $0x80000000,%eax - __ cmpl(as_Register(RAX_enc), 0x80000000); - - // jne e - __ jccb(Assembler::notEqual, normal); - - // xor %edx,%edx - __ xorl(as_Register(RDX_enc), as_Register(RDX_enc)); - - // cmp $0xffffffffffffffff,%ecx - __ cmpl($div$$Register, -1); - - // je 11 - __ jccb(Assembler::equal, done); - - // - // cltd - __ bind(normal); - __ cdql(); - - // idivl - // - __ idivl($div$$Register); - __ bind(done); - %} - - enc_class cdqq_enc(no_rax_rdx_RegL div) - %{ - // Full implementation of Java ldiv and lrem; checks for - // special case as described in JVM spec., p.243 & p.271. - // - // normal case special case - // - // input : rax: dividend min_long - // reg: divisor -1 - // - // output: rax: quotient (= rax idiv reg) min_long - // rdx: remainder (= rax irem reg) 0 - // - // Code sequnce: - // - // 0: 48 ba 00 00 00 00 00 mov $0x8000000000000000,%rdx - // 7: 00 00 80 - // a: 48 39 d0 cmp %rdx,%rax - // d: 75 08 jne 17 - // f: 33 d2 xor %edx,%edx - // 11: 48 83 f9 ff cmp $0xffffffffffffffff,$div - // 15: 74 05 je 1c - // 0000000000000017 : - // 17: 48 99 cqto - // 19: 48 f7 f9 idiv $div - // 000000000000001c : - Label normal; - Label done; - - // mov $0x8000000000000000,%rdx - __ mov64(as_Register(RDX_enc), 0x8000000000000000); - - // cmp %rdx,%rax - __ cmpq(as_Register(RAX_enc), as_Register(RDX_enc)); - - // jne 17 - __ jccb(Assembler::notEqual, normal); - - // xor %edx,%edx - __ xorl(as_Register(RDX_enc), as_Register(RDX_enc)); - - // cmp $0xffffffffffffffff,$div - __ cmpq($div$$Register, -1); - - // je 1e - __ jccb(Assembler::equal, done); - - // - // cqto - __ bind(normal); - __ cdqq(); - - // idivq (note: must be emitted by the user of this rule) - // - __ idivq($div$$Register); - __ bind(done); - %} - - enc_class clear_avx %{ - DEBUG_ONLY(int off0 = __ offset()); - if (generate_vzeroupper(Compile::current())) { - // Clear upper bits of YMM registers to avoid AVX <-> SSE transition penalty - // Clear upper bits of YMM registers when current compiled code uses - // wide vectors to avoid AVX <-> SSE transition penalty during call. - __ vzeroupper(); - } - DEBUG_ONLY(int off1 = __ offset()); - assert(off1 - off0 == clear_avx_size(), "correct size prediction"); - %} - - enc_class Java_To_Runtime(method meth) %{ - __ lea(r10, RuntimeAddress((address)$meth$$method)); - __ call(r10); - __ post_call_nop(); - %} - - enc_class Java_Static_Call(method meth) - %{ - // JAVA STATIC CALL - // CALL to fixup routine. Fixup routine uses ScopeDesc info to - // determine who we intended to call. - if (!_method) { - __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, $meth$$method))); - } else if (_method->intrinsic_id() == vmIntrinsicID::_ensureMaterializedForStackWalk) { - // The NOP here is purely to ensure that eliding a call to - // JVM_EnsureMaterializedForStackWalk doesn't change the code size. - __ addr_nop_5(); - __ block_comment("call JVM_EnsureMaterializedForStackWalk (elided)"); - } else { - int method_index = resolved_method_index(masm); - RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index) - : static_call_Relocation::spec(method_index); - address mark = __ pc(); - int call_offset = __ offset(); - __ call(AddressLiteral(CAST_FROM_FN_PTR(address, $meth$$method), rspec)); - if (CodeBuffer::supports_shared_stubs() && _method->can_be_statically_bound()) { - // Calls of the same statically bound method can share - // a stub to the interpreter. - __ code()->shared_stub_to_interp_for(_method, call_offset); - } else { - // Emit stubs for static call. - address stub = CompiledDirectCall::emit_to_interp_stub(masm, mark); - __ clear_inst_mark(); - if (stub == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return; - } - } - } - __ post_call_nop(); - %} - - enc_class Java_Dynamic_Call(method meth) %{ - __ ic_call((address)$meth$$method, resolved_method_index(masm)); - __ post_call_nop(); - %} - -%} - - - -//----------FRAME-------------------------------------------------------------- -// Definition of frame structure and management information. -// -// S T A C K L A Y O U T Allocators stack-slot number -// | (to get allocators register number -// G Owned by | | v add OptoReg::stack0()) -// r CALLER | | -// o | +--------+ pad to even-align allocators stack-slot -// w V | pad0 | numbers; owned by CALLER -// t -----------+--------+----> Matcher::_in_arg_limit, unaligned -// h ^ | in | 5 -// | | args | 4 Holes in incoming args owned by SELF -// | | | | 3 -// | | +--------+ -// V | | old out| Empty on Intel, window on Sparc -// | old |preserve| Must be even aligned. -// | SP-+--------+----> Matcher::_old_SP, even aligned -// | | in | 3 area for Intel ret address -// Owned by |preserve| Empty on Sparc. -// SELF +--------+ -// | | pad2 | 2 pad to align old SP -// | +--------+ 1 -// | | locks | 0 -// | +--------+----> OptoReg::stack0(), even aligned -// | | pad1 | 11 pad to align new SP -// | +--------+ -// | | | 10 -// | | spills | 9 spills -// V | | 8 (pad0 slot for callee) -// -----------+--------+----> Matcher::_out_arg_limit, unaligned -// ^ | out | 7 -// | | args | 6 Holes in outgoing args owned by CALLEE -// Owned by +--------+ -// CALLEE | new out| 6 Empty on Intel, window on Sparc -// | new |preserve| Must be even-aligned. -// | SP-+--------+----> Matcher::_new_SP, even aligned -// | | | -// -// Note 1: Only region 8-11 is determined by the allocator. Region 0-5 is -// known from SELF's arguments and the Java calling convention. -// Region 6-7 is determined per call site. -// Note 2: If the calling convention leaves holes in the incoming argument -// area, those holes are owned by SELF. Holes in the outgoing area -// are owned by the CALLEE. Holes should not be necessary in the -// incoming area, as the Java calling convention is completely under -// the control of the AD file. Doubles can be sorted and packed to -// avoid holes. Holes in the outgoing arguments may be necessary for -// varargs C calling conventions. -// Note 3: Region 0-3 is even aligned, with pad2 as needed. Region 3-5 is -// even aligned with pad0 as needed. -// Region 6 is even aligned. Region 6-7 is NOT even aligned; -// region 6-11 is even aligned; it may be padded out more so that -// the region from SP to FP meets the minimum stack alignment. -// Note 4: For I2C adapters, the incoming FP may not meet the minimum stack -// alignment. Region 11, pad1, may be dynamically extended so that -// SP meets the minimum alignment. - -frame -%{ - // These three registers define part of the calling convention - // between compiled code and the interpreter. - inline_cache_reg(RAX); // Inline Cache Register - - // Optional: name the operand used by cisc-spilling to access - // [stack_pointer + offset] - cisc_spilling_operand_name(indOffset32); - - // Number of stack slots consumed by locking an object - sync_stack_slots(2); - - // Compiled code's Frame Pointer - frame_pointer(RSP); - - // Interpreter stores its frame pointer in a register which is - // stored to the stack by I2CAdaptors. - // I2CAdaptors convert from interpreted java to compiled java. - interpreter_frame_pointer(RBP); - - // Stack alignment requirement - stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes) - - // Number of outgoing stack slots killed above the out_preserve_stack_slots - // for calls to C. Supports the var-args backing area for register parms. - varargs_C_out_slots_killed(frame::arg_reg_save_area_bytes/BytesPerInt); - - // The after-PROLOG location of the return address. Location of - // return address specifies a type (REG or STACK) and a number - // representing the register number (i.e. - use a register name) or - // stack slot. - // Ret Addr is on stack in slot 0 if no locks or verification or alignment. - // Otherwise, it is above the locks and verification slot and alignment word - return_addr(STACK - 2 + - align_up((Compile::current()->in_preserve_stack_slots() + - Compile::current()->fixed_slots()), - stack_alignment_in_slots())); - - // Location of compiled Java return values. Same as C for now. - return_value - %{ - assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, - "only return normal values"); - - static const int lo[Op_RegL + 1] = { - 0, - 0, - RAX_num, // Op_RegN - RAX_num, // Op_RegI - RAX_num, // Op_RegP - XMM0_num, // Op_RegF - XMM0_num, // Op_RegD - RAX_num // Op_RegL - }; - static const int hi[Op_RegL + 1] = { - 0, - 0, - OptoReg::Bad, // Op_RegN - OptoReg::Bad, // Op_RegI - RAX_H_num, // Op_RegP - OptoReg::Bad, // Op_RegF - XMM0b_num, // Op_RegD - RAX_H_num // Op_RegL - }; - // Excluded flags and vector registers. - assert(ARRAY_SIZE(hi) == _last_machine_leaf - 8, "missing type"); - return OptoRegPair(hi[ideal_reg], lo[ideal_reg]); - %} -%} - -//----------ATTRIBUTES--------------------------------------------------------- -//----------Operand Attributes------------------------------------------------- -op_attrib op_cost(0); // Required cost attribute - -//----------Instruction Attributes--------------------------------------------- -ins_attrib ins_cost(100); // Required cost attribute -ins_attrib ins_size(8); // Required size attribute (in bits) -ins_attrib ins_short_branch(0); // Required flag: is this instruction - // a non-matching short branch variant - // of some long branch? -ins_attrib ins_alignment(1); // Required alignment attribute (must - // be a power of 2) specifies the - // alignment that some part of the - // instruction (not necessarily the - // start) requires. If > 1, a - // compute_padding() function must be - // provided for the instruction - -// Whether this node is expanded during code emission into a sequence of -// instructions and the first instruction can perform an implicit null check. -ins_attrib ins_is_late_expanded_null_check_candidate(false); - -//----------OPERANDS----------------------------------------------------------- -// Operand definitions must precede instruction definitions for correct parsing -// in the ADLC because operands constitute user defined types which are used in -// instruction definitions. - -//----------Simple Operands---------------------------------------------------- -// Immediate Operands -// Integer Immediate -operand immI() -%{ - match(ConI); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Constant for test vs zero -operand immI_0() -%{ - predicate(n->get_int() == 0); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -// Constant for increment -operand immI_1() -%{ - predicate(n->get_int() == 1); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -// Constant for decrement -operand immI_M1() -%{ - predicate(n->get_int() == -1); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -operand immI_2() -%{ - predicate(n->get_int() == 2); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -operand immI_4() -%{ - predicate(n->get_int() == 4); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -operand immI_8() -%{ - predicate(n->get_int() == 8); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -// Valid scale values for addressing modes -operand immI2() -%{ - predicate(0 <= n->get_int() && (n->get_int() <= 3)); - match(ConI); - - format %{ %} - interface(CONST_INTER); -%} - -operand immU7() -%{ - predicate((0 <= n->get_int()) && (n->get_int() <= 0x7F)); - match(ConI); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -operand immI8() -%{ - predicate((-0x80 <= n->get_int()) && (n->get_int() < 0x80)); - match(ConI); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -operand immU8() -%{ - predicate((0 <= n->get_int()) && (n->get_int() <= 255)); - match(ConI); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -operand immI16() -%{ - predicate((-32768 <= n->get_int()) && (n->get_int() <= 32767)); - match(ConI); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Int Immediate non-negative -operand immU31() -%{ - predicate(n->get_int() >= 0); - match(ConI); - - op_cost(0); - format %{ %} - interface(CONST_INTER); -%} - -// Pointer Immediate -operand immP() -%{ - match(ConP); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Null Pointer Immediate -operand immP0() -%{ - predicate(n->get_ptr() == 0); - match(ConP); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -// Pointer Immediate -operand immN() %{ - match(ConN); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -operand immNKlass() %{ - match(ConNKlass); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Null Pointer Immediate -operand immN0() %{ - predicate(n->get_narrowcon() == 0); - match(ConN); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -operand immP31() -%{ - predicate(n->as_Type()->type()->reloc() == relocInfo::none - && (n->get_ptr() >> 31) == 0); - match(ConP); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - - -// Long Immediate -operand immL() -%{ - match(ConL); - - op_cost(20); - format %{ %} - interface(CONST_INTER); -%} - -// Long Immediate 8-bit -operand immL8() -%{ - predicate(-0x80L <= n->get_long() && n->get_long() < 0x80L); - match(ConL); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -// Long Immediate 32-bit unsigned -operand immUL32() -%{ - predicate(n->get_long() == (unsigned int) (n->get_long())); - match(ConL); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Long Immediate 32-bit signed -operand immL32() -%{ - predicate(n->get_long() == (int) (n->get_long())); - match(ConL); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -operand immL_Pow2() -%{ - predicate(is_power_of_2((julong)n->get_long())); - match(ConL); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -operand immL_NotPow2() -%{ - predicate(is_power_of_2((julong)~n->get_long())); - match(ConL); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -// Long Immediate zero -operand immL0() -%{ - predicate(n->get_long() == 0L); - match(ConL); - - op_cost(10); - format %{ %} - interface(CONST_INTER); -%} - -// Constant for increment -operand immL1() -%{ - predicate(n->get_long() == 1); - match(ConL); - - format %{ %} - interface(CONST_INTER); -%} - -// Constant for decrement -operand immL_M1() -%{ - predicate(n->get_long() == -1); - match(ConL); - - format %{ %} - interface(CONST_INTER); -%} - -// Long Immediate: low 32-bit mask -operand immL_32bits() -%{ - predicate(n->get_long() == 0xFFFFFFFFL); - match(ConL); - op_cost(20); - - format %{ %} - interface(CONST_INTER); -%} - -// Int Immediate: 2^n-1, positive -operand immI_Pow2M1() -%{ - predicate((n->get_int() > 0) - && is_power_of_2((juint)n->get_int() + 1)); - match(ConI); - - op_cost(20); - format %{ %} - interface(CONST_INTER); -%} - -// Float Immediate zero -operand immF0() -%{ - predicate(jint_cast(n->getf()) == 0); - match(ConF); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -// Float Immediate -operand immF() -%{ - match(ConF); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -// Half Float Immediate -operand immH() -%{ - match(ConH); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -// Double Immediate zero -operand immD0() -%{ - predicate(jlong_cast(n->getd()) == 0); - match(ConD); - - op_cost(5); - format %{ %} - interface(CONST_INTER); -%} - -// Double Immediate -operand immD() -%{ - match(ConD); - - op_cost(15); - format %{ %} - interface(CONST_INTER); -%} - -// Immediates for special shifts (sign extend) - -// Constants for increment -operand immI_16() -%{ - predicate(n->get_int() == 16); - match(ConI); - - format %{ %} - interface(CONST_INTER); -%} - -operand immI_24() -%{ - predicate(n->get_int() == 24); - match(ConI); - - format %{ %} - interface(CONST_INTER); -%} - -// Constant for byte-wide masking -operand immI_255() -%{ - predicate(n->get_int() == 255); - match(ConI); - - format %{ %} - interface(CONST_INTER); -%} - -// Constant for short-wide masking -operand immI_65535() -%{ - predicate(n->get_int() == 65535); - match(ConI); - - format %{ %} - interface(CONST_INTER); -%} - -// Constant for byte-wide masking -operand immL_255() -%{ - predicate(n->get_long() == 255); - match(ConL); - - format %{ %} - interface(CONST_INTER); -%} - -// Constant for short-wide masking -operand immL_65535() -%{ - predicate(n->get_long() == 65535); - match(ConL); - - format %{ %} - interface(CONST_INTER); -%} - -operand kReg() -%{ - constraint(ALLOC_IN_RC(vectmask_reg)); - match(RegVectMask); - format %{%} - interface(REG_INTER); -%} - -// Register Operands -// Integer Register -operand rRegI() -%{ - constraint(ALLOC_IN_RC(int_reg)); - match(RegI); - - match(rax_RegI); - match(rbx_RegI); - match(rcx_RegI); - match(rdx_RegI); - match(rdi_RegI); - - format %{ %} - interface(REG_INTER); -%} - -// Special Registers -operand rax_RegI() -%{ - constraint(ALLOC_IN_RC(int_rax_reg)); - match(RegI); - match(rRegI); - - format %{ "RAX" %} - interface(REG_INTER); -%} - -// Special Registers -operand rbx_RegI() -%{ - constraint(ALLOC_IN_RC(int_rbx_reg)); - match(RegI); - match(rRegI); - - format %{ "RBX" %} - interface(REG_INTER); -%} - -operand rcx_RegI() -%{ - constraint(ALLOC_IN_RC(int_rcx_reg)); - match(RegI); - match(rRegI); - - format %{ "RCX" %} - interface(REG_INTER); -%} - -operand rdx_RegI() -%{ - constraint(ALLOC_IN_RC(int_rdx_reg)); - match(RegI); - match(rRegI); - - format %{ "RDX" %} - interface(REG_INTER); -%} - -operand rdi_RegI() -%{ - constraint(ALLOC_IN_RC(int_rdi_reg)); - match(RegI); - match(rRegI); - - format %{ "RDI" %} - interface(REG_INTER); -%} - -operand no_rax_rdx_RegI() -%{ - constraint(ALLOC_IN_RC(int_no_rax_rdx_reg)); - match(RegI); - match(rbx_RegI); - match(rcx_RegI); - match(rdi_RegI); - - format %{ %} - interface(REG_INTER); -%} - -operand no_rbp_r13_RegI() -%{ - constraint(ALLOC_IN_RC(int_no_rbp_r13_reg)); - match(RegI); - match(rRegI); - match(rax_RegI); - match(rbx_RegI); - match(rcx_RegI); - match(rdx_RegI); - match(rdi_RegI); - - format %{ %} - interface(REG_INTER); -%} - -// Pointer Register -operand any_RegP() -%{ - constraint(ALLOC_IN_RC(any_reg)); - match(RegP); - match(rax_RegP); - match(rbx_RegP); - match(rdi_RegP); - match(rsi_RegP); - match(rbp_RegP); - match(r15_RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -operand rRegP() -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(RegP); - match(rax_RegP); - match(rbx_RegP); - match(rdi_RegP); - match(rsi_RegP); - match(rbp_RegP); // See Q&A below about - match(r15_RegP); // r15_RegP and rbp_RegP. - - format %{ %} - interface(REG_INTER); -%} - -operand rRegN() %{ - constraint(ALLOC_IN_RC(int_reg)); - match(RegN); - - format %{ %} - interface(REG_INTER); -%} - -// Question: Why is r15_RegP (the read-only TLS register) a match for rRegP? -// Answer: Operand match rules govern the DFA as it processes instruction inputs. -// It's fine for an instruction input that expects rRegP to match a r15_RegP. -// The output of an instruction is controlled by the allocator, which respects -// register class masks, not match rules. Unless an instruction mentions -// r15_RegP or any_RegP explicitly as its output, r15 will not be considered -// by the allocator as an input. -// The same logic applies to rbp_RegP being a match for rRegP: If PreserveFramePointer==true, -// the RBP is used as a proper frame pointer and is not included in ptr_reg. As a -// result, RBP is not included in the output of the instruction either. - -// This operand is not allowed to use RBP even if -// RBP is not used to hold the frame pointer. -operand no_rbp_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_reg_no_rbp)); - match(RegP); - match(rbx_RegP); - match(rsi_RegP); - match(rdi_RegP); - - format %{ %} - interface(REG_INTER); -%} - -// Special Registers -// Return a pointer value -operand rax_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_rax_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -// Special Registers -// Return a compressed pointer value -operand rax_RegN() -%{ - constraint(ALLOC_IN_RC(int_rax_reg)); - match(RegN); - match(rRegN); - - format %{ %} - interface(REG_INTER); -%} - -// Used in AtomicAdd -operand rbx_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_rbx_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -operand rsi_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_rsi_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -operand rbp_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_rbp_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -// Used in rep stosq -operand rdi_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_rdi_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -operand r15_RegP() -%{ - constraint(ALLOC_IN_RC(ptr_r15_reg)); - match(RegP); - match(rRegP); - - format %{ %} - interface(REG_INTER); -%} - -operand rRegL() -%{ - constraint(ALLOC_IN_RC(long_reg)); - match(RegL); - match(rax_RegL); - match(rdx_RegL); - - format %{ %} - interface(REG_INTER); -%} - -// Special Registers -operand no_rax_rdx_RegL() -%{ - constraint(ALLOC_IN_RC(long_no_rax_rdx_reg)); - match(RegL); - match(rRegL); - - format %{ %} - interface(REG_INTER); -%} - -operand rax_RegL() -%{ - constraint(ALLOC_IN_RC(long_rax_reg)); - match(RegL); - match(rRegL); - - format %{ "RAX" %} - interface(REG_INTER); -%} - -operand rcx_RegL() -%{ - constraint(ALLOC_IN_RC(long_rcx_reg)); - match(RegL); - match(rRegL); - - format %{ %} - interface(REG_INTER); -%} - -operand rdx_RegL() -%{ - constraint(ALLOC_IN_RC(long_rdx_reg)); - match(RegL); - match(rRegL); - - format %{ %} - interface(REG_INTER); -%} - -operand r11_RegL() -%{ - constraint(ALLOC_IN_RC(long_r11_reg)); - match(RegL); - match(rRegL); - - format %{ %} - interface(REG_INTER); -%} - -operand no_rbp_r13_RegL() -%{ - constraint(ALLOC_IN_RC(long_no_rbp_r13_reg)); - match(RegL); - match(rRegL); - match(rax_RegL); - match(rcx_RegL); - match(rdx_RegL); - - format %{ %} - interface(REG_INTER); -%} - -// Flags register, used as output of compare instructions -operand rFlagsReg() -%{ - constraint(ALLOC_IN_RC(int_flags)); - match(RegFlags); - - format %{ "RFLAGS" %} - interface(REG_INTER); -%} - -// Flags register, used as output of FLOATING POINT compare instructions -operand rFlagsRegU() -%{ - constraint(ALLOC_IN_RC(int_flags)); - match(RegFlags); - - format %{ "RFLAGS_U" %} - interface(REG_INTER); -%} - -operand rFlagsRegUCF() %{ - constraint(ALLOC_IN_RC(int_flags)); - match(RegFlags); - predicate(false); - - format %{ "RFLAGS_U_CF" %} - interface(REG_INTER); -%} - -// Float register operands -operand regF() %{ - constraint(ALLOC_IN_RC(float_reg)); - match(RegF); - - format %{ %} - interface(REG_INTER); -%} - -// Float register operands -operand legRegF() %{ - constraint(ALLOC_IN_RC(float_reg_legacy)); - match(RegF); - - format %{ %} - interface(REG_INTER); -%} - -// Float register operands -operand vlRegF() %{ - constraint(ALLOC_IN_RC(float_reg_vl)); - match(RegF); - - format %{ %} - interface(REG_INTER); -%} - -// Double register operands -operand regD() %{ - constraint(ALLOC_IN_RC(double_reg)); - match(RegD); - - format %{ %} - interface(REG_INTER); -%} - -// Double register operands -operand legRegD() %{ - constraint(ALLOC_IN_RC(double_reg_legacy)); - match(RegD); - - format %{ %} - interface(REG_INTER); -%} - -// Double register operands -operand vlRegD() %{ - constraint(ALLOC_IN_RC(double_reg_vl)); - match(RegD); - - format %{ %} - interface(REG_INTER); -%} - -//----------Memory Operands---------------------------------------------------- -// Direct Memory Operand -// operand direct(immP addr) -// %{ -// match(addr); - -// format %{ "[$addr]" %} -// interface(MEMORY_INTER) %{ -// base(0xFFFFFFFF); -// index(0x4); -// scale(0x0); -// disp($addr); -// %} -// %} - -// Indirect Memory Operand -operand indirect(any_RegP reg) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(reg); - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp(0x0); - %} -%} - -// Indirect Memory Plus Short Offset Operand -operand indOffset8(any_RegP reg, immL8 off) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP reg off); - - format %{ "[$reg + $off (8-bit)]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Long Offset Operand -operand indOffset32(any_RegP reg, immL32 off) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP reg off); - - format %{ "[$reg + $off (32-bit)]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Index Register Plus Offset Operand -operand indIndexOffset(any_RegP reg, rRegL lreg, immL32 off) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (AddP reg lreg) off); - - op_cost(10); - format %{"[$reg + $off + $lreg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Index Register Plus Offset Operand -operand indIndex(any_RegP reg, rRegL lreg) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP reg lreg); - - op_cost(10); - format %{"[$reg + $lreg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale(0x0); - disp(0x0); - %} -%} - -// Indirect Memory Times Scale Plus Index Register -operand indIndexScale(any_RegP reg, rRegL lreg, immI2 scale) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP reg (LShiftL lreg scale)); - - op_cost(10); - format %{"[$reg + $lreg << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale($scale); - disp(0x0); - %} -%} - -operand indPosIndexScale(any_RegP reg, rRegI idx, immI2 scale) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - predicate(n->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); - match(AddP reg (LShiftL (ConvI2L idx) scale)); - - op_cost(10); - format %{"[$reg + pos $idx << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($idx); - scale($scale); - disp(0x0); - %} -%} - -// Indirect Memory Times Scale Plus Index Register Plus Offset Operand -operand indIndexScaleOffset(any_RegP reg, immL32 off, rRegL lreg, immI2 scale) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (AddP reg (LShiftL lreg scale)) off); - - op_cost(10); - format %{"[$reg + $off + $lreg << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale($scale); - disp($off); - %} -%} - -// Indirect Memory Plus Positive Index Register Plus Offset Operand -operand indPosIndexOffset(any_RegP reg, immL32 off, rRegI idx) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - predicate(n->in(2)->in(3)->as_Type()->type()->is_long()->_lo >= 0); - match(AddP (AddP reg (ConvI2L idx)) off); - - op_cost(10); - format %{"[$reg + $off + $idx]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($idx); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand -operand indPosIndexScaleOffset(any_RegP reg, immL32 off, rRegI idx, immI2 scale) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - predicate(n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); - match(AddP (AddP reg (LShiftL (ConvI2L idx) scale)) off); - - op_cost(10); - format %{"[$reg + $off + $idx << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($idx); - scale($scale); - disp($off); - %} -%} - -// Indirect Narrow Oop Plus Offset Operand -// Note: x86 architecture doesn't support "scale * index + offset" without a base -// we can't free r12 even with CompressedOops::base() == nullptr. -operand indCompressedOopOffset(rRegN reg, immL32 off) %{ - predicate(UseCompressedOops && (CompressedOops::shift() == Address::times_8)); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN reg) off); - - op_cost(10); - format %{"[R12 + $reg << 3 + $off] (compressed oop addressing)" %} - interface(MEMORY_INTER) %{ - base(0xc); // R12 - index($reg); - scale(0x3); - disp($off); - %} -%} - -// Indirect Memory Operand -operand indirectNarrow(rRegN reg) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(DecodeN reg); - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp(0x0); - %} -%} - -// Indirect Memory Plus Short Offset Operand -operand indOffset8Narrow(rRegN reg, immL8 off) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN reg) off); - - format %{ "[$reg + $off (8-bit)]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Long Offset Operand -operand indOffset32Narrow(rRegN reg, immL32 off) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN reg) off); - - format %{ "[$reg + $off (32-bit)]" %} - interface(MEMORY_INTER) %{ - base($reg); - index(0x4); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Index Register Plus Offset Operand -operand indIndexOffsetNarrow(rRegN reg, rRegL lreg, immL32 off) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (AddP (DecodeN reg) lreg) off); - - op_cost(10); - format %{"[$reg + $off + $lreg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Plus Index Register Plus Offset Operand -operand indIndexNarrow(rRegN reg, rRegL lreg) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN reg) lreg); - - op_cost(10); - format %{"[$reg + $lreg]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale(0x0); - disp(0x0); - %} -%} - -// Indirect Memory Times Scale Plus Index Register -operand indIndexScaleNarrow(rRegN reg, rRegL lreg, immI2 scale) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (DecodeN reg) (LShiftL lreg scale)); - - op_cost(10); - format %{"[$reg + $lreg << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale($scale); - disp(0x0); - %} -%} - -// Indirect Memory Times Scale Plus Index Register Plus Offset Operand -operand indIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegL lreg, immI2 scale) -%{ - predicate(CompressedOops::shift() == 0); - constraint(ALLOC_IN_RC(ptr_reg)); - match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off); - - op_cost(10); - format %{"[$reg + $off + $lreg << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($lreg); - scale($scale); - disp($off); - %} -%} - -// Indirect Memory Times Plus Positive Index Register Plus Offset Operand -operand indPosIndexOffsetNarrow(rRegN reg, immL32 off, rRegI idx) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - predicate(CompressedOops::shift() == 0 && n->in(2)->in(3)->as_Type()->type()->is_long()->_lo >= 0); - match(AddP (AddP (DecodeN reg) (ConvI2L idx)) off); - - op_cost(10); - format %{"[$reg + $off + $idx]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($idx); - scale(0x0); - disp($off); - %} -%} - -// Indirect Memory Times Scale Plus Positive Index Register Plus Offset Operand -operand indPosIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegI idx, immI2 scale) -%{ - constraint(ALLOC_IN_RC(ptr_reg)); - predicate(CompressedOops::shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0); - match(AddP (AddP (DecodeN reg) (LShiftL (ConvI2L idx) scale)) off); - - op_cost(10); - format %{"[$reg + $off + $idx << $scale]" %} - interface(MEMORY_INTER) %{ - base($reg); - index($idx); - scale($scale); - disp($off); - %} -%} - -//----------Special Memory Operands-------------------------------------------- -// Stack Slot Operand - This operand is used for loading and storing temporary -// values on the stack where a match requires a value to -// flow through memory. -operand stackSlotP(sRegP reg) -%{ - constraint(ALLOC_IN_RC(stack_slots)); - // No match rule because this operand is only generated in matching - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base(0x4); // RSP - index(0x4); // No Index - scale(0x0); // No Scale - disp($reg); // Stack Offset - %} -%} - -operand stackSlotI(sRegI reg) -%{ - constraint(ALLOC_IN_RC(stack_slots)); - // No match rule because this operand is only generated in matching - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base(0x4); // RSP - index(0x4); // No Index - scale(0x0); // No Scale - disp($reg); // Stack Offset - %} -%} - -operand stackSlotF(sRegF reg) -%{ - constraint(ALLOC_IN_RC(stack_slots)); - // No match rule because this operand is only generated in matching - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base(0x4); // RSP - index(0x4); // No Index - scale(0x0); // No Scale - disp($reg); // Stack Offset - %} -%} - -operand stackSlotD(sRegD reg) -%{ - constraint(ALLOC_IN_RC(stack_slots)); - // No match rule because this operand is only generated in matching - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base(0x4); // RSP - index(0x4); // No Index - scale(0x0); // No Scale - disp($reg); // Stack Offset - %} -%} -operand stackSlotL(sRegL reg) -%{ - constraint(ALLOC_IN_RC(stack_slots)); - // No match rule because this operand is only generated in matching - - format %{ "[$reg]" %} - interface(MEMORY_INTER) %{ - base(0x4); // RSP - index(0x4); // No Index - scale(0x0); // No Scale - disp($reg); // Stack Offset - %} -%} - -//----------Conditional Branch Operands---------------------------------------- -// Comparison Op - This is the operation of the comparison, and is limited to -// the following set of codes: -// L (<), LE (<=), G (>), GE (>=), E (==), NE (!=) -// -// Other attributes of the comparison, such as unsignedness, are specified -// by the comparison instruction that sets a condition code flags register. -// That result is represented by a flags operand whose subtype is appropriate -// to the unsignedness (etc.) of the comparison. -// -// Later, the instruction which matches both the Comparison Op (a Bool) and -// the flags (produced by the Cmp) specifies the coding of the comparison op -// by matching a specific subtype of Bool operand below, such as cmpOpU. - -// Comparison Code -operand cmpOp() -%{ - match(Bool); - - format %{ "" %} - interface(COND_INTER) %{ - equal(0x4, "e"); - not_equal(0x5, "ne"); - less(0xC, "l"); - greater_equal(0xD, "ge"); - less_equal(0xE, "le"); - greater(0xF, "g"); - overflow(0x0, "o"); - no_overflow(0x1, "no"); - %} -%} - -// Comparison Code, unsigned compare. Used by FP also, with -// C2 (unordered) turned into GT or LT already. The other bits -// C0 and C3 are turned into Carry & Zero flags. -operand cmpOpU() -%{ - match(Bool); - - format %{ "" %} - interface(COND_INTER) %{ - equal(0x4, "e"); - not_equal(0x5, "ne"); - less(0x2, "b"); - greater_equal(0x3, "ae"); - less_equal(0x6, "be"); - greater(0x7, "a"); - overflow(0x0, "o"); - no_overflow(0x1, "no"); - %} -%} - - -// Floating comparisons that don't require any fixup for the unordered case, -// If both inputs of the comparison are the same, ZF is always set so we -// don't need to use cmpOpUCF2 for eq/ne -operand cmpOpUCF() %{ - match(Bool); - predicate(n->as_Bool()->_test._test == BoolTest::lt || - n->as_Bool()->_test._test == BoolTest::ge || - n->as_Bool()->_test._test == BoolTest::le || - n->as_Bool()->_test._test == BoolTest::gt || - n->in(1)->in(1) == n->in(1)->in(2)); - format %{ "" %} - interface(COND_INTER) %{ - equal(0xb, "np"); - not_equal(0xa, "p"); - less(0x2, "b"); - greater_equal(0x3, "ae"); - less_equal(0x6, "be"); - greater(0x7, "a"); - overflow(0x0, "o"); - no_overflow(0x1, "no"); - %} -%} - - -// Floating comparisons that can be fixed up with extra conditional jumps -operand cmpOpUCF2() %{ - match(Bool); - predicate((n->as_Bool()->_test._test == BoolTest::ne || - n->as_Bool()->_test._test == BoolTest::eq) && - n->in(1)->in(1) != n->in(1)->in(2)); - format %{ "" %} - interface(COND_INTER) %{ - equal(0x4, "e"); - not_equal(0x5, "ne"); - less(0x2, "b"); - greater_equal(0x3, "ae"); - less_equal(0x6, "be"); - greater(0x7, "a"); - overflow(0x0, "o"); - no_overflow(0x1, "no"); - %} -%} - -//----------OPERAND CLASSES---------------------------------------------------- -// Operand Classes are groups of operands that are used as to simplify -// instruction definitions by not requiring the AD writer to specify separate -// instructions for every form of operand when the instruction accepts -// multiple operand types with the same basic encoding and format. The classic -// case of this is memory operands. - -opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex, - indIndexScale, indPosIndexScale, indIndexScaleOffset, indPosIndexOffset, indPosIndexScaleOffset, - indCompressedOopOffset, - indirectNarrow, indOffset8Narrow, indOffset32Narrow, - indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow, - indIndexScaleOffsetNarrow, indPosIndexOffsetNarrow, indPosIndexScaleOffsetNarrow); - -//----------PIPELINE----------------------------------------------------------- -// Rules which define the behavior of the target architectures pipeline. -pipeline %{ - -//----------ATTRIBUTES--------------------------------------------------------- -attributes %{ - variable_size_instructions; // Fixed size instructions - max_instructions_per_bundle = 3; // Up to 3 instructions per bundle - instruction_unit_size = 1; // An instruction is 1 bytes long - instruction_fetch_unit_size = 16; // The processor fetches one line - instruction_fetch_units = 1; // of 16 bytes -%} - -//----------RESOURCES---------------------------------------------------------- -// Resources are the functional units available to the machine - -// Generic P2/P3 pipeline -// 3 decoders, only D0 handles big operands; a "bundle" is the limit of -// 3 instructions decoded per cycle. -// 2 load/store ops per cycle, 1 branch, 1 FPU, -// 3 ALU op, only ALU0 handles mul instructions. -resources( D0, D1, D2, DECODE = D0 | D1 | D2, - MS0, MS1, MS2, MEM = MS0 | MS1 | MS2, - BR, FPU, - ALU0, ALU1, ALU2, ALU = ALU0 | ALU1 | ALU2); - -//----------PIPELINE DESCRIPTION----------------------------------------------- -// Pipeline Description specifies the stages in the machine's pipeline - -// Generic P2/P3 pipeline -pipe_desc(S0, S1, S2, S3, S4, S5); - -//----------PIPELINE CLASSES--------------------------------------------------- -// Pipeline Classes describe the stages in which input and output are -// referenced by the hardware pipeline. - -// Naming convention: ialu or fpu -// Then: _reg -// Then: _reg if there is a 2nd register -// Then: _long if it's a pair of instructions implementing a long -// Then: _fat if it requires the big decoder -// Or: _mem if it requires the big decoder and a memory unit. - -// Integer ALU reg operation -pipe_class ialu_reg(rRegI dst) -%{ - single_instruction; - dst : S4(write); - dst : S3(read); - DECODE : S0; // any decoder - ALU : S3; // any alu -%} - -// Long ALU reg operation -pipe_class ialu_reg_long(rRegL dst) -%{ - instruction_count(2); - dst : S4(write); - dst : S3(read); - DECODE : S0(2); // any 2 decoders - ALU : S3(2); // both alus -%} - -// Integer ALU reg operation using big decoder -pipe_class ialu_reg_fat(rRegI dst) -%{ - single_instruction; - dst : S4(write); - dst : S3(read); - D0 : S0; // big decoder only - ALU : S3; // any alu -%} - -// Integer ALU reg-reg operation -pipe_class ialu_reg_reg(rRegI dst, rRegI src) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - DECODE : S0; // any decoder - ALU : S3; // any alu -%} - -// Integer ALU reg-reg operation -pipe_class ialu_reg_reg_fat(rRegI dst, memory src) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - D0 : S0; // big decoder only - ALU : S3; // any alu -%} - -// Integer ALU reg-mem operation -pipe_class ialu_reg_mem(rRegI dst, memory mem) -%{ - single_instruction; - dst : S5(write); - mem : S3(read); - D0 : S0; // big decoder only - ALU : S4; // any alu - MEM : S3; // any mem -%} - -// Integer mem operation (prefetch) -pipe_class ialu_mem(memory mem) -%{ - single_instruction; - mem : S3(read); - D0 : S0; // big decoder only - MEM : S3; // any mem -%} - -// Integer Store to Memory -pipe_class ialu_mem_reg(memory mem, rRegI src) -%{ - single_instruction; - mem : S3(read); - src : S5(read); - D0 : S0; // big decoder only - ALU : S4; // any alu - MEM : S3; -%} - -// // Long Store to Memory -// pipe_class ialu_mem_long_reg(memory mem, rRegL src) -// %{ -// instruction_count(2); -// mem : S3(read); -// src : S5(read); -// D0 : S0(2); // big decoder only; twice -// ALU : S4(2); // any 2 alus -// MEM : S3(2); // Both mems -// %} - -// Integer Store to Memory -pipe_class ialu_mem_imm(memory mem) -%{ - single_instruction; - mem : S3(read); - D0 : S0; // big decoder only - ALU : S4; // any alu - MEM : S3; -%} - -// Integer ALU0 reg-reg operation -pipe_class ialu_reg_reg_alu0(rRegI dst, rRegI src) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - D0 : S0; // Big decoder only - ALU0 : S3; // only alu0 -%} - -// Integer ALU0 reg-mem operation -pipe_class ialu_reg_mem_alu0(rRegI dst, memory mem) -%{ - single_instruction; - dst : S5(write); - mem : S3(read); - D0 : S0; // big decoder only - ALU0 : S4; // ALU0 only - MEM : S3; // any mem -%} - -// Integer ALU reg-reg operation -pipe_class ialu_cr_reg_reg(rFlagsReg cr, rRegI src1, rRegI src2) -%{ - single_instruction; - cr : S4(write); - src1 : S3(read); - src2 : S3(read); - DECODE : S0; // any decoder - ALU : S3; // any alu -%} - -// Integer ALU reg-imm operation -pipe_class ialu_cr_reg_imm(rFlagsReg cr, rRegI src1) -%{ - single_instruction; - cr : S4(write); - src1 : S3(read); - DECODE : S0; // any decoder - ALU : S3; // any alu -%} - -// Integer ALU reg-mem operation -pipe_class ialu_cr_reg_mem(rFlagsReg cr, rRegI src1, memory src2) -%{ - single_instruction; - cr : S4(write); - src1 : S3(read); - src2 : S3(read); - D0 : S0; // big decoder only - ALU : S4; // any alu - MEM : S3; -%} - -// Conditional move reg-reg -pipe_class pipe_cmplt( rRegI p, rRegI q, rRegI y) -%{ - instruction_count(4); - y : S4(read); - q : S3(read); - p : S3(read); - DECODE : S0(4); // any decoder -%} - -// Conditional move reg-reg -pipe_class pipe_cmov_reg( rRegI dst, rRegI src, rFlagsReg cr) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - cr : S3(read); - DECODE : S0; // any decoder -%} - -// Conditional move reg-mem -pipe_class pipe_cmov_mem( rFlagsReg cr, rRegI dst, memory src) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - cr : S3(read); - DECODE : S0; // any decoder - MEM : S3; -%} - -// Conditional move reg-reg long -pipe_class pipe_cmov_reg_long( rFlagsReg cr, rRegL dst, rRegL src) -%{ - single_instruction; - dst : S4(write); - src : S3(read); - cr : S3(read); - DECODE : S0(2); // any 2 decoders -%} - -// Float reg-reg operation -pipe_class fpu_reg(regD dst) -%{ - instruction_count(2); - dst : S3(read); - DECODE : S0(2); // any 2 decoders - FPU : S3; -%} - -// Float reg-reg operation -pipe_class fpu_reg_reg(regD dst, regD src) -%{ - instruction_count(2); - dst : S4(write); - src : S3(read); - DECODE : S0(2); // any 2 decoders - FPU : S3; -%} - -// Float reg-reg operation -pipe_class fpu_reg_reg_reg(regD dst, regD src1, regD src2) -%{ - instruction_count(3); - dst : S4(write); - src1 : S3(read); - src2 : S3(read); - DECODE : S0(3); // any 3 decoders - FPU : S3(2); -%} - -// Float reg-reg operation -pipe_class fpu_reg_reg_reg_reg(regD dst, regD src1, regD src2, regD src3) -%{ - instruction_count(4); - dst : S4(write); - src1 : S3(read); - src2 : S3(read); - src3 : S3(read); - DECODE : S0(4); // any 3 decoders - FPU : S3(2); -%} - -// Float reg-reg operation -pipe_class fpu_reg_mem_reg_reg(regD dst, memory src1, regD src2, regD src3) -%{ - instruction_count(4); - dst : S4(write); - src1 : S3(read); - src2 : S3(read); - src3 : S3(read); - DECODE : S1(3); // any 3 decoders - D0 : S0; // Big decoder only - FPU : S3(2); - MEM : S3; -%} - -// Float reg-mem operation -pipe_class fpu_reg_mem(regD dst, memory mem) -%{ - instruction_count(2); - dst : S5(write); - mem : S3(read); - D0 : S0; // big decoder only - DECODE : S1; // any decoder for FPU POP - FPU : S4; - MEM : S3; // any mem -%} - -// Float reg-mem operation -pipe_class fpu_reg_reg_mem(regD dst, regD src1, memory mem) -%{ - instruction_count(3); - dst : S5(write); - src1 : S3(read); - mem : S3(read); - D0 : S0; // big decoder only - DECODE : S1(2); // any decoder for FPU POP - FPU : S4; - MEM : S3; // any mem -%} - -// Float mem-reg operation -pipe_class fpu_mem_reg(memory mem, regD src) -%{ - instruction_count(2); - src : S5(read); - mem : S3(read); - DECODE : S0; // any decoder for FPU PUSH - D0 : S1; // big decoder only - FPU : S4; - MEM : S3; // any mem -%} - -pipe_class fpu_mem_reg_reg(memory mem, regD src1, regD src2) -%{ - instruction_count(3); - src1 : S3(read); - src2 : S3(read); - mem : S3(read); - DECODE : S0(2); // any decoder for FPU PUSH - D0 : S1; // big decoder only - FPU : S4; - MEM : S3; // any mem -%} - -pipe_class fpu_mem_reg_mem(memory mem, regD src1, memory src2) -%{ - instruction_count(3); - src1 : S3(read); - src2 : S3(read); - mem : S4(read); - DECODE : S0; // any decoder for FPU PUSH - D0 : S0(2); // big decoder only - FPU : S4; - MEM : S3(2); // any mem -%} - -pipe_class fpu_mem_mem(memory dst, memory src1) -%{ - instruction_count(2); - src1 : S3(read); - dst : S4(read); - D0 : S0(2); // big decoder only - MEM : S3(2); // any mem -%} - -pipe_class fpu_mem_mem_mem(memory dst, memory src1, memory src2) -%{ - instruction_count(3); - src1 : S3(read); - src2 : S3(read); - dst : S4(read); - D0 : S0(3); // big decoder only - FPU : S4; - MEM : S3(3); // any mem -%} - -pipe_class fpu_mem_reg_con(memory mem, regD src1) -%{ - instruction_count(3); - src1 : S4(read); - mem : S4(read); - DECODE : S0; // any decoder for FPU PUSH - D0 : S0(2); // big decoder only - FPU : S4; - MEM : S3(2); // any mem -%} - -// Float load constant -pipe_class fpu_reg_con(regD dst) -%{ - instruction_count(2); - dst : S5(write); - D0 : S0; // big decoder only for the load - DECODE : S1; // any decoder for FPU POP - FPU : S4; - MEM : S3; // any mem -%} - -// Float load constant -pipe_class fpu_reg_reg_con(regD dst, regD src) -%{ - instruction_count(3); - dst : S5(write); - src : S3(read); - D0 : S0; // big decoder only for the load - DECODE : S1(2); // any decoder for FPU POP - FPU : S4; - MEM : S3; // any mem -%} - -// UnConditional branch -pipe_class pipe_jmp(label labl) -%{ - single_instruction; - BR : S3; -%} - -// Conditional branch -pipe_class pipe_jcc(cmpOp cmp, rFlagsReg cr, label labl) -%{ - single_instruction; - cr : S1(read); - BR : S3; -%} - -// Allocation idiom -pipe_class pipe_cmpxchg(rRegP dst, rRegP heap_ptr) -%{ - instruction_count(1); force_serialization; - fixed_latency(6); - heap_ptr : S3(read); - DECODE : S0(3); - D0 : S2; - MEM : S3; - ALU : S3(2); - dst : S5(write); - BR : S5; -%} - -// Generic big/slow expanded idiom -pipe_class pipe_slow() -%{ - instruction_count(10); multiple_bundles; force_serialization; - fixed_latency(100); - D0 : S0(2); - MEM : S3(2); -%} - -// The real do-nothing guy -pipe_class empty() -%{ - instruction_count(0); -%} - -// Define the class for the Nop node -define -%{ - MachNop = empty; -%} - -%} - -//----------INSTRUCTIONS------------------------------------------------------- -// -// match -- States which machine-independent subtree may be replaced -// by this instruction. -// ins_cost -- The estimated cost of this instruction is used by instruction -// selection to identify a minimum cost tree of machine -// instructions that matches a tree of machine-independent -// instructions. -// format -- A string providing the disassembly for this instruction. -// The value of an instruction's operand may be inserted -// by referring to it with a '$' prefix. -// opcode -- Three instruction opcodes may be provided. These are referred -// to within an encode class as $primary, $secondary, and $tertiary -// rrspectively. The primary opcode is commonly used to -// indicate the type of machine instruction, while secondary -// and tertiary are often used for prefix options or addressing -// modes. -// ins_encode -- A list of encode classes with parameters. The encode class -// name must have been defined in an 'enc_class' specification -// in the encode section of the architecture description. - -// Dummy reg-to-reg vector moves. Removed during post-selection cleanup. -// Load Float -instruct MoveF2VL(vlRegF dst, regF src) %{ - match(Set dst src); - format %{ "movss $dst,$src\t! load float (4 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Float -instruct MoveF2LEG(legRegF dst, regF src) %{ - match(Set dst src); - format %{ "movss $dst,$src\t# if src != dst load float (4 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Float -instruct MoveVL2F(regF dst, vlRegF src) %{ - match(Set dst src); - format %{ "movss $dst,$src\t! load float (4 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Float -instruct MoveLEG2F(regF dst, legRegF src) %{ - match(Set dst src); - format %{ "movss $dst,$src\t# if src != dst load float (4 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Double -instruct MoveD2VL(vlRegD dst, regD src) %{ - match(Set dst src); - format %{ "movsd $dst,$src\t! load double (8 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Double -instruct MoveD2LEG(legRegD dst, regD src) %{ - match(Set dst src); - format %{ "movsd $dst,$src\t# if src != dst load double (8 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Double -instruct MoveVL2D(regD dst, vlRegD src) %{ - match(Set dst src); - format %{ "movsd $dst,$src\t! load double (8 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -// Load Double -instruct MoveLEG2D(regD dst, legRegD src) %{ - match(Set dst src); - format %{ "movsd $dst,$src\t# if src != dst load double (8 bytes)" %} - ins_encode %{ - ShouldNotReachHere(); - %} - ins_pipe( fpu_reg_reg ); -%} - -//----------Load/Store/Move Instructions--------------------------------------- -//----------Load Instructions-------------------------------------------------- - -// Load Byte (8 bit signed) -instruct loadB(rRegI dst, memory mem) -%{ - match(Set dst (LoadB mem)); - - ins_cost(125); - format %{ "movsbl $dst, $mem\t# byte" %} - - ins_encode %{ - __ movsbl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Byte (8 bit signed) into Long Register -instruct loadB2L(rRegL dst, memory mem) -%{ - match(Set dst (ConvI2L (LoadB mem))); - - ins_cost(125); - format %{ "movsbq $dst, $mem\t# byte -> long" %} - - ins_encode %{ - __ movsbq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Byte (8 bit UNsigned) -instruct loadUB(rRegI dst, memory mem) -%{ - match(Set dst (LoadUB mem)); - - ins_cost(125); - format %{ "movzbl $dst, $mem\t# ubyte" %} - - ins_encode %{ - __ movzbl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Byte (8 bit UNsigned) into Long Register -instruct loadUB2L(rRegL dst, memory mem) -%{ - match(Set dst (ConvI2L (LoadUB mem))); - - ins_cost(125); - format %{ "movzbq $dst, $mem\t# ubyte -> long" %} - - ins_encode %{ - __ movzbq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register -instruct loadUB2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{ - match(Set dst (ConvI2L (AndI (LoadUB mem) mask))); - effect(KILL cr); - - format %{ "movzbq $dst, $mem\t# ubyte & 32-bit mask -> long\n\t" - "andl $dst, right_n_bits($mask, 8)" %} - ins_encode %{ - Register Rdst = $dst$$Register; - __ movzbq(Rdst, $mem$$Address); - __ andl(Rdst, $mask$$constant & right_n_bits(8)); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Short (16 bit signed) -instruct loadS(rRegI dst, memory mem) -%{ - match(Set dst (LoadS mem)); - - ins_cost(125); - format %{ "movswl $dst, $mem\t# short" %} - - ins_encode %{ - __ movswl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Short (16 bit signed) to Byte (8 bit signed) -instruct loadS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ - match(Set dst (RShiftI (LShiftI (LoadS mem) twentyfour) twentyfour)); - - ins_cost(125); - format %{ "movsbl $dst, $mem\t# short -> byte" %} - ins_encode %{ - __ movsbl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Short (16 bit signed) into Long Register -instruct loadS2L(rRegL dst, memory mem) -%{ - match(Set dst (ConvI2L (LoadS mem))); - - ins_cost(125); - format %{ "movswq $dst, $mem\t# short -> long" %} - - ins_encode %{ - __ movswq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Short/Char (16 bit UNsigned) -instruct loadUS(rRegI dst, memory mem) -%{ - match(Set dst (LoadUS mem)); - - ins_cost(125); - format %{ "movzwl $dst, $mem\t# ushort/char" %} - - ins_encode %{ - __ movzwl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Short/Char (16 bit UNsigned) to Byte (8 bit signed) -instruct loadUS2B(rRegI dst, memory mem, immI_24 twentyfour) %{ - match(Set dst (RShiftI (LShiftI (LoadUS mem) twentyfour) twentyfour)); - - ins_cost(125); - format %{ "movsbl $dst, $mem\t# ushort -> byte" %} - ins_encode %{ - __ movsbl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Short/Char (16 bit UNsigned) into Long Register -instruct loadUS2L(rRegL dst, memory mem) -%{ - match(Set dst (ConvI2L (LoadUS mem))); - - ins_cost(125); - format %{ "movzwq $dst, $mem\t# ushort/char -> long" %} - - ins_encode %{ - __ movzwq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Short/Char (16 bit UNsigned) with mask 0xFF into Long Register -instruct loadUS2L_immI_255(rRegL dst, memory mem, immI_255 mask) %{ - match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); - - format %{ "movzbq $dst, $mem\t# ushort/char & 0xFF -> long" %} - ins_encode %{ - __ movzbq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Short/Char (16 bit UNsigned) with 32-bit mask into Long Register -instruct loadUS2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{ - match(Set dst (ConvI2L (AndI (LoadUS mem) mask))); - effect(KILL cr); - - format %{ "movzwq $dst, $mem\t# ushort/char & 32-bit mask -> long\n\t" - "andl $dst, right_n_bits($mask, 16)" %} - ins_encode %{ - Register Rdst = $dst$$Register; - __ movzwq(Rdst, $mem$$Address); - __ andl(Rdst, $mask$$constant & right_n_bits(16)); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer -instruct loadI(rRegI dst, memory mem) -%{ - match(Set dst (LoadI mem)); - - ins_cost(125); - format %{ "movl $dst, $mem\t# int" %} - - ins_encode %{ - __ movl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Integer (32 bit signed) to Byte (8 bit signed) -instruct loadI2B(rRegI dst, memory mem, immI_24 twentyfour) %{ - match(Set dst (RShiftI (LShiftI (LoadI mem) twentyfour) twentyfour)); - - ins_cost(125); - format %{ "movsbl $dst, $mem\t# int -> byte" %} - ins_encode %{ - __ movsbl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer (32 bit signed) to Unsigned Byte (8 bit UNsigned) -instruct loadI2UB(rRegI dst, memory mem, immI_255 mask) %{ - match(Set dst (AndI (LoadI mem) mask)); - - ins_cost(125); - format %{ "movzbl $dst, $mem\t# int -> ubyte" %} - ins_encode %{ - __ movzbl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer (32 bit signed) to Short (16 bit signed) -instruct loadI2S(rRegI dst, memory mem, immI_16 sixteen) %{ - match(Set dst (RShiftI (LShiftI (LoadI mem) sixteen) sixteen)); - - ins_cost(125); - format %{ "movswl $dst, $mem\t# int -> short" %} - ins_encode %{ - __ movswl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer (32 bit signed) to Unsigned Short/Char (16 bit UNsigned) -instruct loadI2US(rRegI dst, memory mem, immI_65535 mask) %{ - match(Set dst (AndI (LoadI mem) mask)); - - ins_cost(125); - format %{ "movzwl $dst, $mem\t# int -> ushort/char" %} - ins_encode %{ - __ movzwl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer into Long Register -instruct loadI2L(rRegL dst, memory mem) -%{ - match(Set dst (ConvI2L (LoadI mem))); - - ins_cost(125); - format %{ "movslq $dst, $mem\t# int -> long" %} - - ins_encode %{ - __ movslq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Integer with mask 0xFF into Long Register -instruct loadI2L_immI_255(rRegL dst, memory mem, immI_255 mask) %{ - match(Set dst (ConvI2L (AndI (LoadI mem) mask))); - - format %{ "movzbq $dst, $mem\t# int & 0xFF -> long" %} - ins_encode %{ - __ movzbq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer with mask 0xFFFF into Long Register -instruct loadI2L_immI_65535(rRegL dst, memory mem, immI_65535 mask) %{ - match(Set dst (ConvI2L (AndI (LoadI mem) mask))); - - format %{ "movzwq $dst, $mem\t# int & 0xFFFF -> long" %} - ins_encode %{ - __ movzwq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Integer with a 31-bit mask into Long Register -instruct loadI2L_immU31(rRegL dst, memory mem, immU31 mask, rFlagsReg cr) %{ - match(Set dst (ConvI2L (AndI (LoadI mem) mask))); - effect(KILL cr); - - format %{ "movl $dst, $mem\t# int & 31-bit mask -> long\n\t" - "andl $dst, $mask" %} - ins_encode %{ - Register Rdst = $dst$$Register; - __ movl(Rdst, $mem$$Address); - __ andl(Rdst, $mask$$constant); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Unsigned Integer into Long Register -instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) -%{ - match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); - - ins_cost(125); - format %{ "movl $dst, $mem\t# uint -> long" %} - - ins_encode %{ - __ movl($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); -%} - -// Load Long -instruct loadL(rRegL dst, memory mem) -%{ - match(Set dst (LoadL mem)); - - ins_cost(125); - format %{ "movq $dst, $mem\t# long" %} - - ins_encode %{ - __ movq($dst$$Register, $mem$$Address); - %} - - ins_pipe(ialu_reg_mem); // XXX -%} - -// Load Range -instruct loadRange(rRegI dst, memory mem) -%{ - match(Set dst (LoadRange mem)); - - ins_cost(125); // XXX - format %{ "movl $dst, $mem\t# range" %} - ins_encode %{ - __ movl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Pointer -instruct loadP(rRegP dst, memory mem) -%{ - match(Set dst (LoadP mem)); - predicate(n->as_Load()->barrier_data() == 0); - - ins_cost(125); // XXX - format %{ "movq $dst, $mem\t# ptr" %} - ins_encode %{ - __ movq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); // XXX -%} - -// Load Compressed Pointer -instruct loadN(rRegN dst, memory mem) -%{ - predicate(n->as_Load()->barrier_data() == 0); - match(Set dst (LoadN mem)); - - ins_cost(125); // XXX - format %{ "movl $dst, $mem\t# compressed ptr" %} - ins_encode %{ - __ movl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); // XXX -%} - - -// Load Klass Pointer -instruct loadKlass(rRegP dst, memory mem) -%{ - match(Set dst (LoadKlass mem)); - - ins_cost(125); // XXX - format %{ "movq $dst, $mem\t# class" %} - ins_encode %{ - __ movq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); // XXX -%} - -// Load narrow Klass Pointer -instruct loadNKlass(rRegN dst, memory mem) -%{ - predicate(!UseCompactObjectHeaders); - match(Set dst (LoadNKlass mem)); - - ins_cost(125); // XXX - format %{ "movl $dst, $mem\t# compressed klass ptr" %} - ins_encode %{ - __ movl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_mem); // XXX -%} - -instruct loadNKlassCompactHeaders(rRegN dst, memory mem, rFlagsReg cr) -%{ - predicate(UseCompactObjectHeaders); - match(Set dst (LoadNKlass mem)); - effect(KILL cr); - ins_cost(125); - format %{ - "movl $dst, $mem\t# compressed klass ptr, shifted\n\t" - "shrl $dst, markWord::klass_shift_at_offset" - %} - ins_encode %{ - if (UseAPX) { - __ eshrl($dst$$Register, $mem$$Address, markWord::klass_shift_at_offset, false); - } - else { - __ movl($dst$$Register, $mem$$Address); - __ shrl($dst$$Register, markWord::klass_shift_at_offset); - } - %} - ins_pipe(ialu_reg_mem); -%} - -// Load Float -instruct loadF(regF dst, memory mem) -%{ - match(Set dst (LoadF mem)); - - ins_cost(145); // XXX - format %{ "movss $dst, $mem\t# float" %} - ins_encode %{ - __ movflt($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -// Load Double -instruct loadD_partial(regD dst, memory mem) -%{ - predicate(!UseXmmLoadAndClearUpper); - match(Set dst (LoadD mem)); - - ins_cost(145); // XXX - format %{ "movlpd $dst, $mem\t# double" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct loadD(regD dst, memory mem) -%{ - predicate(UseXmmLoadAndClearUpper); - match(Set dst (LoadD mem)); - - ins_cost(145); // XXX - format %{ "movsd $dst, $mem\t# double" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, $mem$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -// max = java.lang.Math.max(float a, float b) -instruct maxF_avx10_reg(regF dst, regF a, regF b) %{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (MaxF a b)); - format %{ "maxF $dst, $a, $b" %} - ins_encode %{ - __ eminmaxss($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MAX_COMPARE_SIGN); - %} - ins_pipe( pipe_slow ); -%} - -// max = java.lang.Math.max(float a, float b) -instruct maxF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp, legRegF btmp) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); - match(Set dst (MaxF a b)); - effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); - format %{ "maxF $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} - ins_encode %{ - __ vminmax_fp(Op_MaxV, T_FLOAT, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); - %} - ins_pipe( pipe_slow ); -%} - -instruct maxF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xtmp, rRegI rtmp, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); - match(Set dst (MaxF a b)); - effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); - - format %{ "maxF_reduction $dst, $a, $b \t!using $xtmp and $rtmp as TEMP" %} - ins_encode %{ - emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, - false /*min*/, true /*single*/); - %} - ins_pipe( pipe_slow ); -%} - -// max = java.lang.Math.max(double a, double b) -instruct maxD_avx10_reg(regD dst, regD a, regD b) %{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (MaxD a b)); - format %{ "maxD $dst, $a, $b" %} - ins_encode %{ - __ eminmaxsd($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MAX_COMPARE_SIGN); - %} - ins_pipe( pipe_slow ); -%} - -// max = java.lang.Math.max(double a, double b) -instruct maxD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp, legRegD btmp) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); - match(Set dst (MaxD a b)); - effect(USE a, USE b, TEMP atmp, TEMP btmp, TEMP tmp); - format %{ "maxD $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} - ins_encode %{ - __ vminmax_fp(Op_MaxV, T_DOUBLE, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); - %} - ins_pipe( pipe_slow ); -%} - -instruct maxD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xtmp, rRegL rtmp, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); - match(Set dst (MaxD a b)); - effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); - - format %{ "maxD_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} - ins_encode %{ - emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, - false /*min*/, false /*single*/); - %} - ins_pipe( pipe_slow ); -%} - -// max = java.lang.Math.min(float a, float b) -instruct minF_avx10_reg(regF dst, regF a, regF b) %{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (MinF a b)); - format %{ "minF $dst, $a, $b" %} - ins_encode %{ - __ eminmaxss($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MIN_COMPARE_SIGN); - %} - ins_pipe( pipe_slow ); -%} - -// min = java.lang.Math.min(float a, float b) -instruct minF_reg(legRegF dst, legRegF a, legRegF b, legRegF tmp, legRegF atmp, legRegF btmp) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); - match(Set dst (MinF a b)); - effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); - format %{ "minF $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} - ins_encode %{ - __ vminmax_fp(Op_MinV, T_FLOAT, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); - %} - ins_pipe( pipe_slow ); -%} - -instruct minF_reduction_reg(legRegF dst, legRegF a, legRegF b, legRegF xtmp, rRegI rtmp, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); - match(Set dst (MinF a b)); - effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); - - format %{ "minF_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} - ins_encode %{ - emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, - true /*min*/, true /*single*/); - %} - ins_pipe( pipe_slow ); -%} - -// max = java.lang.Math.min(double a, double b) -instruct minD_avx10_reg(regD dst, regD a, regD b) %{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (MinD a b)); - format %{ "minD $dst, $a, $b" %} - ins_encode %{ - __ eminmaxsd($dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, AVX10_MINMAX_MIN_COMPARE_SIGN); - %} - ins_pipe( pipe_slow ); -%} - -// min = java.lang.Math.min(double a, double b) -instruct minD_reg(legRegD dst, legRegD a, legRegD b, legRegD tmp, legRegD atmp, legRegD btmp) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && !VLoopReductions::is_reduction(n)); - match(Set dst (MinD a b)); - effect(USE a, USE b, TEMP tmp, TEMP atmp, TEMP btmp); - format %{ "minD $dst, $a, $b \t! using $tmp, $atmp and $btmp as TEMP" %} - ins_encode %{ - __ vminmax_fp(Op_MinV, T_DOUBLE, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $tmp$$XMMRegister, $atmp$$XMMRegister, $btmp$$XMMRegister, Assembler::AVX_128bit); - %} - ins_pipe( pipe_slow ); -%} - -instruct minD_reduction_reg(legRegD dst, legRegD a, legRegD b, legRegD xtmp, rRegL rtmp, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx10_2() && UseAVX > 0 && VLoopReductions::is_reduction(n)); - match(Set dst (MinD a b)); - effect(USE a, USE b, TEMP xtmp, TEMP rtmp, KILL cr); - - format %{ "maxD_reduction $dst, $a, $b \t! using $xtmp and $rtmp as TEMP" %} - ins_encode %{ - emit_fp_min_max(masm, $dst$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $xtmp$$XMMRegister, $rtmp$$Register, - true /*min*/, false /*single*/); - %} - ins_pipe( pipe_slow ); -%} - -// Load Effective Address -instruct leaP8(rRegP dst, indOffset8 mem) -%{ - match(Set dst mem); - - ins_cost(110); // XXX - format %{ "leaq $dst, $mem\t# ptr 8" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaP32(rRegP dst, indOffset32 mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr 32" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxOff(rRegP dst, indIndexOffset mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxoff" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxScale(rRegP dst, indIndexScale mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxscale" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPPosIdxScale(rRegP dst, indPosIndexScale mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxscale" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxScaleOff(rRegP dst, indIndexScaleOffset mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxscaleoff" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPPosIdxOff(rRegP dst, indPosIndexOffset mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr posidxoff" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPPosIdxScaleOff(rRegP dst, indPosIndexScaleOffset mem) -%{ - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr posidxscaleoff" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -// Load Effective Address which uses Narrow (32-bits) oop -instruct leaPCompressedOopOffset(rRegP dst, indCompressedOopOffset mem) -%{ - predicate(UseCompressedOops && (CompressedOops::shift() != 0)); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr compressedoopoff32" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaP8Narrow(rRegP dst, indOffset8Narrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); // XXX - format %{ "leaq $dst, $mem\t# ptr off8narrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaP32Narrow(rRegP dst, indOffset32Narrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr off32narrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxOffNarrow(rRegP dst, indIndexOffsetNarrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxoffnarrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxScaleNarrow(rRegP dst, indIndexScaleNarrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxscalenarrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPIdxScaleOffNarrow(rRegP dst, indIndexScaleOffsetNarrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr idxscaleoffnarrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPPosIdxOffNarrow(rRegP dst, indPosIndexOffsetNarrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr posidxoffnarrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct leaPPosIdxScaleOffNarrow(rRegP dst, indPosIndexScaleOffsetNarrow mem) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst mem); - - ins_cost(110); - format %{ "leaq $dst, $mem\t# ptr posidxscaleoffnarrow" %} - ins_encode %{ - __ leaq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg_reg_fat); -%} - -instruct loadConI(rRegI dst, immI src) -%{ - match(Set dst src); - - format %{ "movl $dst, $src\t# int" %} - ins_encode %{ - __ movl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg_fat); // XXX -%} - -instruct loadConI0(rRegI dst, immI_0 src, rFlagsReg cr) -%{ - match(Set dst src); - effect(KILL cr); - - ins_cost(50); - format %{ "xorl $dst, $dst\t# int" %} - ins_encode %{ - __ xorl($dst$$Register, $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConL(rRegL dst, immL src) -%{ - match(Set dst src); - - ins_cost(150); - format %{ "movq $dst, $src\t# long" %} - ins_encode %{ - __ mov64($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConL0(rRegL dst, immL0 src, rFlagsReg cr) -%{ - match(Set dst src); - effect(KILL cr); - - ins_cost(50); - format %{ "xorl $dst, $dst\t# long" %} - ins_encode %{ - __ xorl($dst$$Register, $dst$$Register); - %} - ins_pipe(ialu_reg); // XXX -%} - -instruct loadConUL32(rRegL dst, immUL32 src) -%{ - match(Set dst src); - - ins_cost(60); - format %{ "movl $dst, $src\t# long (unsigned 32-bit)" %} - ins_encode %{ - __ movl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConL32(rRegL dst, immL32 src) -%{ - match(Set dst src); - - ins_cost(70); - format %{ "movq $dst, $src\t# long (32-bit)" %} - ins_encode %{ - __ movq($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConP(rRegP dst, immP con) %{ - match(Set dst con); - - format %{ "movq $dst, $con\t# ptr" %} - ins_encode %{ - __ mov64($dst$$Register, $con$$constant, $con->constant_reloc(), RELOC_IMM64); - %} - ins_pipe(ialu_reg_fat); // XXX -%} - -instruct loadConP0(rRegP dst, immP0 src, rFlagsReg cr) -%{ - match(Set dst src); - effect(KILL cr); - - ins_cost(50); - format %{ "xorl $dst, $dst\t# ptr" %} - ins_encode %{ - __ xorl($dst$$Register, $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConP31(rRegP dst, immP31 src, rFlagsReg cr) -%{ - match(Set dst src); - effect(KILL cr); - - ins_cost(60); - format %{ "movl $dst, $src\t# ptr (positive 32-bit)" %} - ins_encode %{ - __ movl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConF(regF dst, immF con) %{ - match(Set dst con); - ins_cost(125); - format %{ "movss $dst, [$constantaddress]\t# load from constant table: float=$con" %} - ins_encode %{ - __ movflt($dst$$XMMRegister, $constantaddress($con)); - %} - ins_pipe(pipe_slow); -%} - -instruct loadConH(regF dst, immH con) %{ - match(Set dst con); - ins_cost(125); - format %{ "movss $dst, [$constantaddress]\t# load from constant table: halffloat=$con" %} - ins_encode %{ - __ movflt($dst$$XMMRegister, $constantaddress($con)); - %} - ins_pipe(pipe_slow); -%} - -instruct loadConN0(rRegN dst, immN0 src, rFlagsReg cr) %{ - match(Set dst src); - effect(KILL cr); - format %{ "xorq $dst, $src\t# compressed null pointer" %} - ins_encode %{ - __ xorq($dst$$Register, $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct loadConN(rRegN dst, immN src) %{ - match(Set dst src); - - ins_cost(125); - format %{ "movl $dst, $src\t# compressed ptr" %} - ins_encode %{ - address con = (address)$src$$constant; - if (con == nullptr) { - ShouldNotReachHere(); - } else { - __ set_narrow_oop($dst$$Register, (jobject)$src$$constant); - } - %} - ins_pipe(ialu_reg_fat); // XXX -%} - -instruct loadConNKlass(rRegN dst, immNKlass src) %{ - match(Set dst src); - - ins_cost(125); - format %{ "movl $dst, $src\t# compressed klass ptr" %} - ins_encode %{ - address con = (address)$src$$constant; - if (con == nullptr) { - ShouldNotReachHere(); - } else { - __ set_narrow_klass($dst$$Register, (Klass*)$src$$constant); - } - %} - ins_pipe(ialu_reg_fat); // XXX -%} - -instruct loadConF0(regF dst, immF0 src) -%{ - match(Set dst src); - ins_cost(100); - - format %{ "xorps $dst, $dst\t# float 0.0" %} - ins_encode %{ - __ xorps($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -// Use the same format since predicate() can not be used here. -instruct loadConD(regD dst, immD con) %{ - match(Set dst con); - ins_cost(125); - format %{ "movsd $dst, [$constantaddress]\t# load from constant table: double=$con" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, $constantaddress($con)); - %} - ins_pipe(pipe_slow); -%} - -instruct loadConD0(regD dst, immD0 src) -%{ - match(Set dst src); - ins_cost(100); - - format %{ "xorpd $dst, $dst\t# double 0.0" %} - ins_encode %{ - __ xorpd($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct loadSSI(rRegI dst, stackSlotI src) -%{ - match(Set dst src); - - ins_cost(125); - format %{ "movl $dst, $src\t# int stk" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct loadSSL(rRegL dst, stackSlotL src) -%{ - match(Set dst src); - - ins_cost(125); - format %{ "movq $dst, $src\t# long stk" %} - ins_encode %{ - __ movq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct loadSSP(rRegP dst, stackSlotP src) -%{ - match(Set dst src); - - ins_cost(125); - format %{ "movq $dst, $src\t# ptr stk" %} - ins_encode %{ - __ movq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct loadSSF(regF dst, stackSlotF src) -%{ - match(Set dst src); - - ins_cost(125); - format %{ "movss $dst, $src\t# float stk" %} - ins_encode %{ - __ movflt($dst$$XMMRegister, Address(rsp, $src$$disp)); - %} - ins_pipe(pipe_slow); // XXX -%} - -// Use the same format since predicate() can not be used here. -instruct loadSSD(regD dst, stackSlotD src) -%{ - match(Set dst src); - - ins_cost(125); - format %{ "movsd $dst, $src\t# double stk" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); - %} - ins_pipe(pipe_slow); // XXX -%} - -// Prefetch instructions for allocation. -// Must be safe to execute with invalid address (cannot fault). - -instruct prefetchAlloc( memory mem ) %{ - predicate(AllocatePrefetchInstr==3); - match(PrefetchAllocation mem); - ins_cost(125); - - format %{ "PREFETCHW $mem\t# Prefetch allocation into level 1 cache and mark modified" %} - ins_encode %{ - __ prefetchw($mem$$Address); - %} - ins_pipe(ialu_mem); -%} - -instruct prefetchAllocNTA( memory mem ) %{ - predicate(AllocatePrefetchInstr==0); - match(PrefetchAllocation mem); - ins_cost(125); - - format %{ "PREFETCHNTA $mem\t# Prefetch allocation to non-temporal cache for write" %} - ins_encode %{ - __ prefetchnta($mem$$Address); - %} - ins_pipe(ialu_mem); -%} - -instruct prefetchAllocT0( memory mem ) %{ - predicate(AllocatePrefetchInstr==1); - match(PrefetchAllocation mem); - ins_cost(125); - - format %{ "PREFETCHT0 $mem\t# Prefetch allocation to level 1 and 2 caches for write" %} - ins_encode %{ - __ prefetcht0($mem$$Address); - %} - ins_pipe(ialu_mem); -%} - -instruct prefetchAllocT2( memory mem ) %{ - predicate(AllocatePrefetchInstr==2); - match(PrefetchAllocation mem); - ins_cost(125); - - format %{ "PREFETCHT2 $mem\t# Prefetch allocation to level 2 cache for write" %} - ins_encode %{ - __ prefetcht2($mem$$Address); - %} - ins_pipe(ialu_mem); -%} - -//----------Store Instructions------------------------------------------------- - -// Store Byte -instruct storeB(memory mem, rRegI src) -%{ - match(Set mem (StoreB mem src)); - - ins_cost(125); // XXX - format %{ "movb $mem, $src\t# byte" %} - ins_encode %{ - __ movb($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Store Char/Short -instruct storeC(memory mem, rRegI src) -%{ - match(Set mem (StoreC mem src)); - - ins_cost(125); // XXX - format %{ "movw $mem, $src\t# char/short" %} - ins_encode %{ - __ movw($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Store Integer -instruct storeI(memory mem, rRegI src) -%{ - match(Set mem (StoreI mem src)); - - ins_cost(125); // XXX - format %{ "movl $mem, $src\t# int" %} - ins_encode %{ - __ movl($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Store Long -instruct storeL(memory mem, rRegL src) -%{ - match(Set mem (StoreL mem src)); - - ins_cost(125); // XXX - format %{ "movq $mem, $src\t# long" %} - ins_encode %{ - __ movq($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); // XXX -%} - -// Store Pointer -instruct storeP(memory mem, any_RegP src) -%{ - predicate(n->as_Store()->barrier_data() == 0); - match(Set mem (StoreP mem src)); - - ins_cost(125); // XXX - format %{ "movq $mem, $src\t# ptr" %} - ins_encode %{ - __ movq($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmP0(memory mem, immP0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr) && n->as_Store()->barrier_data() == 0); - match(Set mem (StoreP mem zero)); - - ins_cost(125); // XXX - format %{ "movq $mem, R12\t# ptr (R12_heapbase==0)" %} - ins_encode %{ - __ movq($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -// Store Null Pointer, mark word, or other simple pointer constant. -instruct storeImmP(memory mem, immP31 src) -%{ - predicate(n->as_Store()->barrier_data() == 0); - match(Set mem (StoreP mem src)); - - ins_cost(150); // XXX - format %{ "movq $mem, $src\t# ptr" %} - ins_encode %{ - __ movq($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Compressed Pointer -instruct storeN(memory mem, rRegN src) -%{ - predicate(n->as_Store()->barrier_data() == 0); - match(Set mem (StoreN mem src)); - - ins_cost(125); // XXX - format %{ "movl $mem, $src\t# compressed ptr" %} - ins_encode %{ - __ movl($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeNKlass(memory mem, rRegN src) -%{ - match(Set mem (StoreNKlass mem src)); - - ins_cost(125); // XXX - format %{ "movl $mem, $src\t# compressed klass ptr" %} - ins_encode %{ - __ movl($mem$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmN0(memory mem, immN0 zero) -%{ - predicate(CompressedOops::base() == nullptr && n->as_Store()->barrier_data() == 0); - match(Set mem (StoreN mem zero)); - - ins_cost(125); // XXX - format %{ "movl $mem, R12\t# compressed ptr (R12_heapbase==0)" %} - ins_encode %{ - __ movl($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmN(memory mem, immN src) -%{ - predicate(n->as_Store()->barrier_data() == 0); - match(Set mem (StoreN mem src)); - - ins_cost(150); // XXX - format %{ "movl $mem, $src\t# compressed ptr" %} - ins_encode %{ - address con = (address)$src$$constant; - if (con == nullptr) { - __ movl($mem$$Address, 0); - } else { - __ set_narrow_oop($mem$$Address, (jobject)$src$$constant); - } - %} - ins_pipe(ialu_mem_imm); -%} - -instruct storeImmNKlass(memory mem, immNKlass src) -%{ - match(Set mem (StoreNKlass mem src)); - - ins_cost(150); // XXX - format %{ "movl $mem, $src\t# compressed klass ptr" %} - ins_encode %{ - __ set_narrow_klass($mem$$Address, (Klass*)$src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Integer Immediate -instruct storeImmI0(memory mem, immI_0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreI mem zero)); - - ins_cost(125); // XXX - format %{ "movl $mem, R12\t# int (R12_heapbase==0)" %} - ins_encode %{ - __ movl($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmI(memory mem, immI src) -%{ - match(Set mem (StoreI mem src)); - - ins_cost(150); - format %{ "movl $mem, $src\t# int" %} - ins_encode %{ - __ movl($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Long Immediate -instruct storeImmL0(memory mem, immL0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreL mem zero)); - - ins_cost(125); // XXX - format %{ "movq $mem, R12\t# long (R12_heapbase==0)" %} - ins_encode %{ - __ movq($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmL(memory mem, immL32 src) -%{ - match(Set mem (StoreL mem src)); - - ins_cost(150); - format %{ "movq $mem, $src\t# long" %} - ins_encode %{ - __ movq($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Short/Char Immediate -instruct storeImmC0(memory mem, immI_0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreC mem zero)); - - ins_cost(125); // XXX - format %{ "movw $mem, R12\t# short/char (R12_heapbase==0)" %} - ins_encode %{ - __ movw($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmI16(memory mem, immI16 src) -%{ - predicate(UseStoreImmI16); - match(Set mem (StoreC mem src)); - - ins_cost(150); - format %{ "movw $mem, $src\t# short/char" %} - ins_encode %{ - __ movw($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Byte Immediate -instruct storeImmB0(memory mem, immI_0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreB mem zero)); - - ins_cost(125); // XXX - format %{ "movb $mem, R12\t# short/char (R12_heapbase==0)" %} - ins_encode %{ - __ movb($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeImmB(memory mem, immI8 src) -%{ - match(Set mem (StoreB mem src)); - - ins_cost(150); // XXX - format %{ "movb $mem, $src\t# byte" %} - ins_encode %{ - __ movb($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Float -instruct storeF(memory mem, regF src) -%{ - match(Set mem (StoreF mem src)); - - ins_cost(95); // XXX - format %{ "movss $mem, $src\t# float" %} - ins_encode %{ - __ movflt($mem$$Address, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -// Store immediate Float value (it is faster than store from XMM register) -instruct storeF0(memory mem, immF0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreF mem zero)); - - ins_cost(25); // XXX - format %{ "movl $mem, R12\t# float 0. (R12_heapbase==0)" %} - ins_encode %{ - __ movl($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeF_imm(memory mem, immF src) -%{ - match(Set mem (StoreF mem src)); - - ins_cost(50); - format %{ "movl $mem, $src\t# float" %} - ins_encode %{ - __ movl($mem$$Address, jint_cast($src$$constant)); - %} - ins_pipe(ialu_mem_imm); -%} - -// Store Double -instruct storeD(memory mem, regD src) -%{ - match(Set mem (StoreD mem src)); - - ins_cost(95); // XXX - format %{ "movsd $mem, $src\t# double" %} - ins_encode %{ - __ movdbl($mem$$Address, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -// Store immediate double 0.0 (it is faster than store from XMM register) -instruct storeD0_imm(memory mem, immD0 src) -%{ - predicate(!UseCompressedOops || (CompressedOops::base() != nullptr)); - match(Set mem (StoreD mem src)); - - ins_cost(50); - format %{ "movq $mem, $src\t# double 0." %} - ins_encode %{ - __ movq($mem$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct storeD0(memory mem, immD0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr)); - match(Set mem (StoreD mem zero)); - - ins_cost(25); // XXX - format %{ "movq $mem, R12\t# double 0. (R12_heapbase==0)" %} - ins_encode %{ - __ movq($mem$$Address, r12); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeSSI(stackSlotI dst, rRegI src) -%{ - match(Set dst src); - - ins_cost(100); - format %{ "movl $dst, $src\t# int stk" %} - ins_encode %{ - __ movl($dst$$Address, $src$$Register); - %} - ins_pipe( ialu_mem_reg ); -%} - -instruct storeSSL(stackSlotL dst, rRegL src) -%{ - match(Set dst src); - - ins_cost(100); - format %{ "movq $dst, $src\t# long stk" %} - ins_encode %{ - __ movq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeSSP(stackSlotP dst, rRegP src) -%{ - match(Set dst src); - - ins_cost(100); - format %{ "movq $dst, $src\t# ptr stk" %} - ins_encode %{ - __ movq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct storeSSF(stackSlotF dst, regF src) -%{ - match(Set dst src); - - ins_cost(95); // XXX - format %{ "movss $dst, $src\t# float stk" %} - ins_encode %{ - __ movflt(Address(rsp, $dst$$disp), $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct storeSSD(stackSlotD dst, regD src) -%{ - match(Set dst src); - - ins_cost(95); // XXX - format %{ "movsd $dst, $src\t# double stk" %} - ins_encode %{ - __ movdbl(Address(rsp, $dst$$disp), $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct cacheWB(indirect addr) -%{ - predicate(VM_Version::supports_data_cache_line_flush()); - match(CacheWB addr); - - ins_cost(100); - format %{"cache wb $addr" %} - ins_encode %{ - assert($addr->index_position() < 0, "should be"); - assert($addr$$disp == 0, "should be"); - __ cache_wb(Address($addr$$base$$Register, 0)); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct cacheWBPreSync() -%{ - predicate(VM_Version::supports_data_cache_line_flush()); - match(CacheWBPreSync); - - ins_cost(100); - format %{"cache wb presync" %} - ins_encode %{ - __ cache_wbsync(true); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct cacheWBPostSync() -%{ - predicate(VM_Version::supports_data_cache_line_flush()); - match(CacheWBPostSync); - - ins_cost(100); - format %{"cache wb postsync" %} - ins_encode %{ - __ cache_wbsync(false); - %} - ins_pipe(pipe_slow); // XXX -%} - -//----------BSWAP Instructions------------------------------------------------- -instruct bytes_reverse_int(rRegI dst) %{ - match(Set dst (ReverseBytesI dst)); - - format %{ "bswapl $dst" %} - ins_encode %{ - __ bswapl($dst$$Register); - %} - ins_pipe( ialu_reg ); -%} - -instruct bytes_reverse_long(rRegL dst) %{ - match(Set dst (ReverseBytesL dst)); - - format %{ "bswapq $dst" %} - ins_encode %{ - __ bswapq($dst$$Register); - %} - ins_pipe( ialu_reg); -%} - -instruct bytes_reverse_unsigned_short(rRegI dst, rFlagsReg cr) %{ - match(Set dst (ReverseBytesUS dst)); - effect(KILL cr); - - format %{ "bswapl $dst\n\t" - "shrl $dst,16\n\t" %} - ins_encode %{ - __ bswapl($dst$$Register); - __ shrl($dst$$Register, 16); - %} - ins_pipe( ialu_reg ); -%} - -instruct bytes_reverse_short(rRegI dst, rFlagsReg cr) %{ - match(Set dst (ReverseBytesS dst)); - effect(KILL cr); - - format %{ "bswapl $dst\n\t" - "sar $dst,16\n\t" %} - ins_encode %{ - __ bswapl($dst$$Register); - __ sarl($dst$$Register, 16); - %} - ins_pipe( ialu_reg ); -%} - -//---------- Zeros Count Instructions ------------------------------------------ - -instruct countLeadingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{ - predicate(UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosI src)); - effect(KILL cr); - - format %{ "lzcntl $dst, $src\t# count leading zeros (int)" %} - ins_encode %{ - __ lzcntl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct countLeadingZerosI_mem(rRegI dst, memory src, rFlagsReg cr) %{ - predicate(UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosI (LoadI src))); - effect(KILL cr); - ins_cost(175); - format %{ "lzcntl $dst, $src\t# count leading zeros (int)" %} - ins_encode %{ - __ lzcntl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct countLeadingZerosI_bsr(rRegI dst, rRegI src, rFlagsReg cr) %{ - predicate(!UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosI src)); - effect(KILL cr); - - format %{ "bsrl $dst, $src\t# count leading zeros (int)\n\t" - "jnz skip\n\t" - "movl $dst, -1\n" - "skip:\n\t" - "negl $dst\n\t" - "addl $dst, 31" %} - ins_encode %{ - Register Rdst = $dst$$Register; - Register Rsrc = $src$$Register; - Label skip; - __ bsrl(Rdst, Rsrc); - __ jccb(Assembler::notZero, skip); - __ movl(Rdst, -1); - __ bind(skip); - __ negl(Rdst); - __ addl(Rdst, BitsPerInt - 1); - %} - ins_pipe(ialu_reg); -%} - -instruct countLeadingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{ - predicate(UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosL src)); - effect(KILL cr); - - format %{ "lzcntq $dst, $src\t# count leading zeros (long)" %} - ins_encode %{ - __ lzcntq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct countLeadingZerosL_mem(rRegI dst, memory src, rFlagsReg cr) %{ - predicate(UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosL (LoadL src))); - effect(KILL cr); - ins_cost(175); - format %{ "lzcntq $dst, $src\t# count leading zeros (long)" %} - ins_encode %{ - __ lzcntq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct countLeadingZerosL_bsr(rRegI dst, rRegL src, rFlagsReg cr) %{ - predicate(!UseCountLeadingZerosInstruction); - match(Set dst (CountLeadingZerosL src)); - effect(KILL cr); - - format %{ "bsrq $dst, $src\t# count leading zeros (long)\n\t" - "jnz skip\n\t" - "movl $dst, -1\n" - "skip:\n\t" - "negl $dst\n\t" - "addl $dst, 63" %} - ins_encode %{ - Register Rdst = $dst$$Register; - Register Rsrc = $src$$Register; - Label skip; - __ bsrq(Rdst, Rsrc); - __ jccb(Assembler::notZero, skip); - __ movl(Rdst, -1); - __ bind(skip); - __ negl(Rdst); - __ addl(Rdst, BitsPerLong - 1); - %} - ins_pipe(ialu_reg); -%} - -instruct countTrailingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{ - predicate(UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosI src)); - effect(KILL cr); - - format %{ "tzcntl $dst, $src\t# count trailing zeros (int)" %} - ins_encode %{ - __ tzcntl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct countTrailingZerosI_mem(rRegI dst, memory src, rFlagsReg cr) %{ - predicate(UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosI (LoadI src))); - effect(KILL cr); - ins_cost(175); - format %{ "tzcntl $dst, $src\t# count trailing zeros (int)" %} - ins_encode %{ - __ tzcntl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct countTrailingZerosI_bsf(rRegI dst, rRegI src, rFlagsReg cr) %{ - predicate(!UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosI src)); - effect(KILL cr); - - format %{ "bsfl $dst, $src\t# count trailing zeros (int)\n\t" - "jnz done\n\t" - "movl $dst, 32\n" - "done:" %} - ins_encode %{ - Register Rdst = $dst$$Register; - Label done; - __ bsfl(Rdst, $src$$Register); - __ jccb(Assembler::notZero, done); - __ movl(Rdst, BitsPerInt); - __ bind(done); - %} - ins_pipe(ialu_reg); -%} - -instruct countTrailingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{ - predicate(UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosL src)); - effect(KILL cr); - - format %{ "tzcntq $dst, $src\t# count trailing zeros (long)" %} - ins_encode %{ - __ tzcntq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct countTrailingZerosL_mem(rRegI dst, memory src, rFlagsReg cr) %{ - predicate(UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosL (LoadL src))); - effect(KILL cr); - ins_cost(175); - format %{ "tzcntq $dst, $src\t# count trailing zeros (long)" %} - ins_encode %{ - __ tzcntq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct countTrailingZerosL_bsf(rRegI dst, rRegL src, rFlagsReg cr) %{ - predicate(!UseCountTrailingZerosInstruction); - match(Set dst (CountTrailingZerosL src)); - effect(KILL cr); - - format %{ "bsfq $dst, $src\t# count trailing zeros (long)\n\t" - "jnz done\n\t" - "movl $dst, 64\n" - "done:" %} - ins_encode %{ - Register Rdst = $dst$$Register; - Label done; - __ bsfq(Rdst, $src$$Register); - __ jccb(Assembler::notZero, done); - __ movl(Rdst, BitsPerLong); - __ bind(done); - %} - ins_pipe(ialu_reg); -%} - -//--------------- Reverse Operation Instructions ---------------- -instruct bytes_reversebit_int(rRegI dst, rRegI src, rRegI rtmp, rFlagsReg cr) %{ - predicate(!VM_Version::supports_gfni()); - match(Set dst (ReverseI src)); - effect(TEMP dst, TEMP rtmp, KILL cr); - format %{ "reverse_int $dst $src\t! using $rtmp as TEMP" %} - ins_encode %{ - __ reverseI($dst$$Register, $src$$Register, xnoreg, xnoreg, $rtmp$$Register); - %} - ins_pipe( ialu_reg ); -%} - -instruct bytes_reversebit_int_gfni(rRegI dst, rRegI src, vlRegF xtmp1, vlRegF xtmp2, rRegL rtmp, rFlagsReg cr) %{ - predicate(VM_Version::supports_gfni()); - match(Set dst (ReverseI src)); - effect(TEMP dst, TEMP xtmp1, TEMP xtmp2, TEMP rtmp, KILL cr); - format %{ "reverse_int $dst $src\t! using $rtmp, $xtmp1 and $xtmp2 as TEMP" %} - ins_encode %{ - __ reverseI($dst$$Register, $src$$Register, $xtmp1$$XMMRegister, $xtmp2$$XMMRegister, $rtmp$$Register); - %} - ins_pipe( ialu_reg ); -%} - -instruct bytes_reversebit_long(rRegL dst, rRegL src, rRegL rtmp1, rRegL rtmp2, rFlagsReg cr) %{ - predicate(!VM_Version::supports_gfni()); - match(Set dst (ReverseL src)); - effect(TEMP dst, TEMP rtmp1, TEMP rtmp2, KILL cr); - format %{ "reverse_long $dst $src\t! using $rtmp1 and $rtmp2 as TEMP" %} - ins_encode %{ - __ reverseL($dst$$Register, $src$$Register, xnoreg, xnoreg, $rtmp1$$Register, $rtmp2$$Register); - %} - ins_pipe( ialu_reg ); -%} - -instruct bytes_reversebit_long_gfni(rRegL dst, rRegL src, vlRegD xtmp1, vlRegD xtmp2, rRegL rtmp, rFlagsReg cr) %{ - predicate(VM_Version::supports_gfni()); - match(Set dst (ReverseL src)); - effect(TEMP dst, TEMP xtmp1, TEMP xtmp2, TEMP rtmp, KILL cr); - format %{ "reverse_long $dst $src\t! using $rtmp, $xtmp1 and $xtmp2 as TEMP" %} - ins_encode %{ - __ reverseL($dst$$Register, $src$$Register, $xtmp1$$XMMRegister, $xtmp2$$XMMRegister, $rtmp$$Register, noreg); - %} - ins_pipe( ialu_reg ); -%} - -//---------- Population Count Instructions ------------------------------------- - -instruct popCountI(rRegI dst, rRegI src, rFlagsReg cr) %{ - predicate(UsePopCountInstruction); - match(Set dst (PopCountI src)); - effect(KILL cr); - - format %{ "popcnt $dst, $src" %} - ins_encode %{ - __ popcntl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct popCountI_mem(rRegI dst, memory mem, rFlagsReg cr) %{ - predicate(UsePopCountInstruction); - match(Set dst (PopCountI (LoadI mem))); - effect(KILL cr); - - format %{ "popcnt $dst, $mem" %} - ins_encode %{ - __ popcntl($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg); -%} - -// Note: Long.bitCount(long) returns an int. -instruct popCountL(rRegI dst, rRegL src, rFlagsReg cr) %{ - predicate(UsePopCountInstruction); - match(Set dst (PopCountL src)); - effect(KILL cr); - - format %{ "popcnt $dst, $src" %} - ins_encode %{ - __ popcntq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// Note: Long.bitCount(long) returns an int. -instruct popCountL_mem(rRegI dst, memory mem, rFlagsReg cr) %{ - predicate(UsePopCountInstruction); - match(Set dst (PopCountL (LoadL mem))); - effect(KILL cr); - - format %{ "popcnt $dst, $mem" %} - ins_encode %{ - __ popcntq($dst$$Register, $mem$$Address); - %} - ins_pipe(ialu_reg); -%} - - -//----------MemBar Instructions----------------------------------------------- -// Memory barrier flavors - -instruct membar_acquire() -%{ - match(MemBarAcquire); - match(LoadFence); - ins_cost(0); - - size(0); - format %{ "MEMBAR-acquire ! (empty encoding)" %} - ins_encode(); - ins_pipe(empty); -%} - -instruct membar_acquire_lock() -%{ - match(MemBarAcquireLock); - ins_cost(0); - - size(0); - format %{ "MEMBAR-acquire (prior CMPXCHG in FastLock so empty encoding)" %} - ins_encode(); - ins_pipe(empty); -%} - -instruct membar_release() -%{ - match(MemBarRelease); - match(StoreFence); - ins_cost(0); - - size(0); - format %{ "MEMBAR-release ! (empty encoding)" %} - ins_encode(); - ins_pipe(empty); -%} - -instruct membar_release_lock() -%{ - match(MemBarReleaseLock); - ins_cost(0); - - size(0); - format %{ "MEMBAR-release (a FastUnlock follows so empty encoding)" %} - ins_encode(); - ins_pipe(empty); -%} - -instruct membar_volatile(rFlagsReg cr) %{ - match(MemBarVolatile); - effect(KILL cr); - ins_cost(400); - - format %{ - $$template - $$emit$$"lock addl [rsp + #0], 0\t! membar_volatile" - %} - ins_encode %{ - __ membar(Assembler::StoreLoad); - %} - ins_pipe(pipe_slow); -%} - -instruct unnecessary_membar_volatile() -%{ - match(MemBarVolatile); - predicate(Matcher::post_store_load_barrier(n)); - ins_cost(0); - - size(0); - format %{ "MEMBAR-volatile (unnecessary so empty encoding)" %} - ins_encode(); - ins_pipe(empty); -%} - -instruct membar_storestore() %{ - match(MemBarStoreStore); - match(StoreStoreFence); - ins_cost(0); - - size(0); - format %{ "MEMBAR-storestore (empty encoding)" %} - ins_encode( ); - ins_pipe(empty); -%} - -//----------Move Instructions-------------------------------------------------- - -instruct castX2P(rRegP dst, rRegL src) -%{ - match(Set dst (CastX2P src)); - - format %{ "movq $dst, $src\t# long->ptr" %} - ins_encode %{ - if ($dst$$reg != $src$$reg) { - __ movptr($dst$$Register, $src$$Register); - } - %} - ins_pipe(ialu_reg_reg); // XXX -%} - -instruct castP2X(rRegL dst, rRegP src) -%{ - match(Set dst (CastP2X src)); - - format %{ "movq $dst, $src\t# ptr -> long" %} - ins_encode %{ - if ($dst$$reg != $src$$reg) { - __ movptr($dst$$Register, $src$$Register); - } - %} - ins_pipe(ialu_reg_reg); // XXX -%} - -// Convert oop into int for vectors alignment masking -instruct convP2I(rRegI dst, rRegP src) -%{ - match(Set dst (ConvL2I (CastP2X src))); - - format %{ "movl $dst, $src\t# ptr -> int" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); // XXX -%} - -// Convert compressed oop into int for vectors alignment masking -// in case of 32bit oops (heap < 4Gb). -instruct convN2I(rRegI dst, rRegN src) -%{ - predicate(CompressedOops::shift() == 0); - match(Set dst (ConvL2I (CastP2X (DecodeN src)))); - - format %{ "movl $dst, $src\t# compressed ptr -> int" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); // XXX -%} - -// Convert oop pointer into compressed form -instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ - predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); - match(Set dst (EncodeP src)); - effect(KILL cr); - format %{ "encode_heap_oop $dst,$src" %} - ins_encode %{ - Register s = $src$$Register; - Register d = $dst$$Register; - if (s != d) { - __ movq(d, s); - } - __ encode_heap_oop(d); - %} - ins_pipe(ialu_reg_long); -%} - -instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ - predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); - match(Set dst (EncodeP src)); - effect(KILL cr); - format %{ "encode_heap_oop_not_null $dst,$src" %} - ins_encode %{ - __ encode_heap_oop_not_null($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_long); -%} - -instruct decodeHeapOop(rRegP dst, rRegN src, rFlagsReg cr) %{ - predicate(n->bottom_type()->is_ptr()->ptr() != TypePtr::NotNull && - n->bottom_type()->is_ptr()->ptr() != TypePtr::Constant); - match(Set dst (DecodeN src)); - effect(KILL cr); - format %{ "decode_heap_oop $dst,$src" %} - ins_encode %{ - Register s = $src$$Register; - Register d = $dst$$Register; - if (s != d) { - __ movq(d, s); - } - __ decode_heap_oop(d); - %} - ins_pipe(ialu_reg_long); -%} - -instruct decodeHeapOop_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{ - predicate(n->bottom_type()->is_ptr()->ptr() == TypePtr::NotNull || - n->bottom_type()->is_ptr()->ptr() == TypePtr::Constant); - match(Set dst (DecodeN src)); - effect(KILL cr); - format %{ "decode_heap_oop_not_null $dst,$src" %} - ins_encode %{ - Register s = $src$$Register; - Register d = $dst$$Register; - if (s != d) { - __ decode_heap_oop_not_null(d, s); - } else { - __ decode_heap_oop_not_null(d); - } - %} - ins_pipe(ialu_reg_long); -%} - -instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{ - match(Set dst (EncodePKlass src)); - effect(TEMP dst, KILL cr); - format %{ "encode_and_move_klass_not_null $dst,$src" %} - ins_encode %{ - __ encode_and_move_klass_not_null($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_long); -%} - -instruct decodeKlass_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{ - match(Set dst (DecodeNKlass src)); - effect(TEMP dst, KILL cr); - format %{ "decode_and_move_klass_not_null $dst,$src" %} - ins_encode %{ - __ decode_and_move_klass_not_null($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_long); -%} - -//----------Conditional Move--------------------------------------------------- -// Jump -// dummy instruction for generating temp registers -instruct jumpXtnd_offset(rRegL switch_val, immI2 shift, rRegI dest) %{ - match(Jump (LShiftL switch_val shift)); - ins_cost(350); - predicate(false); - effect(TEMP dest); - - format %{ "leaq $dest, [$constantaddress]\n\t" - "jmp [$dest + $switch_val << $shift]\n\t" %} - ins_encode %{ - // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 - // to do that and the compiler is using that register as one it can allocate. - // So we build it all by hand. - // Address index(noreg, switch_reg, (Address::ScaleFactor)$shift$$constant); - // ArrayAddress dispatch(table, index); - Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant); - __ lea($dest$$Register, $constantaddress); - __ jmp(dispatch); - %} - ins_pipe(pipe_jmp); -%} - -instruct jumpXtnd_addr(rRegL switch_val, immI2 shift, immL32 offset, rRegI dest) %{ - match(Jump (AddL (LShiftL switch_val shift) offset)); - ins_cost(350); - effect(TEMP dest); - - format %{ "leaq $dest, [$constantaddress]\n\t" - "jmp [$dest + $switch_val << $shift + $offset]\n\t" %} - ins_encode %{ - // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 - // to do that and the compiler is using that register as one it can allocate. - // So we build it all by hand. - // Address index(noreg, switch_reg, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant); - // ArrayAddress dispatch(table, index); - Address dispatch($dest$$Register, $switch_val$$Register, (Address::ScaleFactor) $shift$$constant, (int) $offset$$constant); - __ lea($dest$$Register, $constantaddress); - __ jmp(dispatch); - %} - ins_pipe(pipe_jmp); -%} - -instruct jumpXtnd(rRegL switch_val, rRegI dest) %{ - match(Jump switch_val); - ins_cost(350); - effect(TEMP dest); - - format %{ "leaq $dest, [$constantaddress]\n\t" - "jmp [$dest + $switch_val]\n\t" %} - ins_encode %{ - // We could use jump(ArrayAddress) except that the macro assembler needs to use r10 - // to do that and the compiler is using that register as one it can allocate. - // So we build it all by hand. - // Address index(noreg, switch_reg, Address::times_1); - // ArrayAddress dispatch(table, index); - Address dispatch($dest$$Register, $switch_val$$Register, Address::times_1); - __ lea($dest$$Register, $constantaddress); - __ jmp(dispatch); - %} - ins_pipe(pipe_jmp); -%} - -// Conditional move -instruct cmovI_imm_01(rRegI dst, immI_1 src, rFlagsReg cr, cmpOp cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); - match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# signed, int" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovI_reg(rRegI dst, rRegI src, rFlagsReg cr, cmpOp cop) -%{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovl$cop $dst, $src\t# signed, int" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_reg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr, cmpOp cop) -%{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_imm_01U(rRegI dst, immI_1 src, rFlagsRegU cr, cmpOpU cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); - match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# unsigned, int" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovI_regU(cmpOpU cop, rFlagsRegU cr, rRegI dst, rRegI src) %{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_regU_ndd(rRegI dst, cmpOpU cop, rFlagsRegU cr, rRegI src1, rRegI src2) %{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_imm_01UCF(rRegI dst, immI_1 src, rFlagsRegUCF cr, cmpOpUCF cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_int() == 0); - match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# unsigned, int" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovI_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovI_regU(cop, cr, dst, src); - %} -%} - -instruct cmovI_regUCF_ndd(rRegI dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegI src1, rRegI src2) %{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveI (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovpl $dst, $src\n\t" - "cmovnel $dst, $src" %} - ins_encode %{ - __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 src2))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpl $dst, $src1, $src2\n\t" - "cmovnel $dst, $src2" %} - ins_encode %{ - __ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the -// inputs of the CMove -instruct cmovI_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveI (Binary cop cr) (Binary src dst))); - effect(TEMP dst); - - ins_cost(200); // XXX - format %{ "cmovpl $dst, $src\n\t" - "cmovnel $dst, $src" %} - ins_encode %{ - __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// We need this special handling for only eq / neq comparison since NaN == NaN is false, -// and parity flag bit is set if any of the operand is a NaN. -instruct cmovI_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegI dst, rRegI src1, rRegI src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveI (Binary cop cr) (Binary src2 src1))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpl $dst, $src1, $src2\n\t" - "cmovnel $dst, $src2" %} - ins_encode %{ - __ ecmovl(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Conditional move -instruct cmovI_mem(cmpOp cop, rFlagsReg cr, rRegI dst, memory src) %{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); - - ins_cost(250); // XXX - format %{ "cmovl$cop $dst, $src\t# signed, int" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -// Conditional move -instruct cmovI_rReg_rReg_mem_ndd(rRegI dst, cmpOp cop, rFlagsReg cr, rRegI src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); - - ins_cost(250); - format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -// Conditional move -instruct cmovI_memU(cmpOpU cop, rFlagsRegU cr, rRegI dst, memory src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); - - ins_cost(250); // XXX - format %{ "cmovl$cop $dst, $src\t# unsigned, int" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -instruct cmovI_memUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegI dst, memory src) %{ - predicate(!UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary dst (LoadI src)))); - ins_cost(250); - expand %{ - cmovI_memU(cop, cr, dst, src); - %} -%} - -instruct cmovI_rReg_rReg_memU_ndd(rRegI dst, cmpOpU cop, rFlagsRegU cr, rRegI src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); - - ins_cost(250); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -instruct cmovI_rReg_rReg_memUCF_ndd(rRegI dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegI src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveI (Binary cop cr) (Binary src1 (LoadI src2)))); - ins_cost(250); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, int ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -// Conditional move -instruct cmovN_reg(rRegN dst, rRegN src, rFlagsReg cr, cmpOp cop) -%{ - predicate(!UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovl$cop $dst, $src\t# signed, compressed ptr" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Conditional move ndd -instruct cmovN_reg_ndd(rRegN dst, rRegN src1, rRegN src2, rFlagsReg cr, cmpOp cop) -%{ - predicate(UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# signed, compressed ptr ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Conditional move -instruct cmovN_regU(cmpOpU cop, rFlagsRegU cr, rRegN dst, rRegN src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovl$cop $dst, $src\t# unsigned, compressed ptr" %} - ins_encode %{ - __ cmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovN_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ - predicate(!UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovN_regU(cop, cr, dst, src); - %} -%} - -// Conditional move ndd -instruct cmovN_regU_ndd(rRegN dst, cmpOpU cop, rFlagsRegU cr, rRegN src1, rRegN src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, compressed ptr ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovN_regUCF_ndd(rRegN dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegN src1, rRegN src2) %{ - predicate(UseAPX); - match(Set dst (CMoveN (Binary cop cr) (Binary src1 src2))); - ins_cost(200); - format %{ "ecmovl$cop $dst, $src1, $src2\t# unsigned, compressed ptr ndd" %} - ins_encode %{ - __ ecmovl((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovN_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ - predicate(n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveN (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovpl $dst, $src\n\t" - "cmovnel $dst, $src" %} - ins_encode %{ - __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the -// inputs of the CMove -instruct cmovN_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegN dst, rRegN src) %{ - predicate(n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveN (Binary cop cr) (Binary src dst))); - - ins_cost(200); // XXX - format %{ "cmovpl $dst, $src\n\t" - "cmovnel $dst, $src" %} - ins_encode %{ - __ cmovl(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovl(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Conditional move -instruct cmovP_reg(rRegP dst, rRegP src, rFlagsReg cr, cmpOp cop) -%{ - predicate(!UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# signed, ptr" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); // XXX -%} - -// Conditional move ndd -instruct cmovP_reg_ndd(rRegP dst, rRegP src1, rRegP src2, rFlagsReg cr, cmpOp cop) -%{ - predicate(UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, ptr ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Conditional move -instruct cmovP_regU(cmpOpU cop, rFlagsRegU cr, rRegP dst, rRegP src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# unsigned, ptr" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); // XXX -%} - -// Conditional move ndd -instruct cmovP_regU_ndd(rRegP dst, cmpOpU cop, rFlagsRegU cr, rRegP src1, rRegP src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, ptr ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovP_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ - predicate(!UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovP_regU(cop, cr, dst, src); - %} -%} - -instruct cmovP_regUCF_ndd(rRegP dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegP src1, rRegP src2) %{ - predicate(UseAPX); - match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, ptr ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovP_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveP (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovpq $dst, $src\n\t" - "cmovneq $dst, $src" %} - ins_encode %{ - __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovP_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveP (Binary cop cr) (Binary src1 src2))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpq $dst, $src1, $src2\n\t" - "cmovneq $dst, $src2" %} - ins_encode %{ - __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the -// inputs of the CMove -instruct cmovP_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveP (Binary cop cr) (Binary src dst))); - - ins_cost(200); // XXX - format %{ "cmovpq $dst, $src\n\t" - "cmovneq $dst, $src" %} - ins_encode %{ - __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovP_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegP dst, rRegP src1, rRegP src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveP (Binary cop cr) (Binary src2 src1))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpq $dst, $src1, $src2\n\t" - "cmovneq $dst, $src2" %} - ins_encode %{ - __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_imm_01(rRegL dst, immL1 src, rFlagsReg cr, cmpOp cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); - match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# signed, long" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovL_reg(cmpOp cop, rFlagsReg cr, rRegL dst, rRegL src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# signed, long" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); // XXX -%} - -instruct cmovL_reg_ndd(rRegL dst, cmpOp cop, rFlagsReg cr, rRegL src1, rRegL src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_mem(cmpOp cop, rFlagsReg cr, rRegL dst, memory src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# signed, long" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); - %} - ins_pipe(pipe_cmov_mem); // XXX -%} - -instruct cmovL_rReg_rReg_mem_ndd(rRegL dst, cmpOp cop, rFlagsReg cr, rRegL src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# signed, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -instruct cmovL_imm_01U(rRegL dst, immL1 src, rFlagsRegU cr, cmpOpU cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); - match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# unsigned, long" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovL_regU(cmpOpU cop, rFlagsRegU cr, rRegL dst, rRegL src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# unsigned, long" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); // XXX -%} - -instruct cmovL_regU_ndd(rRegL dst, cmpOpU cop, rFlagsRegU cr, rRegL src1, rRegL src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_imm_01UCF(rRegL dst, immL1 src, rFlagsRegUCF cr, cmpOpUCF cop) -%{ - predicate(n->in(2)->in(2)->is_Con() && n->in(2)->in(2)->get_long() == 0); - match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); - - ins_cost(100); // XXX - format %{ "setbn$cop $dst\t# unsigned, long" %} - ins_encode %{ - Assembler::Condition cond = (Assembler::Condition)($cop$$cmpcode); - __ setb(MacroAssembler::negate_condition(cond), $dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct cmovL_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovL_regU(cop, cr, dst, src); - %} -%} - -instruct cmovL_regUCF_ndd(rRegL dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegL src1, rRegL src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_regUCF2_ne(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveL (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "cmovpq $dst, $src\n\t" - "cmovneq $dst, $src" %} - ins_encode %{ - __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_regUCF2_ne_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::ne); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 src2))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpq $dst, $src1, $src2\n\t" - "cmovneq $dst, $src2" %} - ins_encode %{ - __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -// Since (x == y) == !(x != y), we can flip the sense of the test by flipping the -// inputs of the CMove -instruct cmovL_regUCF2_eq(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src) %{ - predicate(!UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveL (Binary cop cr) (Binary src dst))); - - ins_cost(200); // XXX - format %{ "cmovpq $dst, $src\n\t" - "cmovneq $dst, $src" %} - ins_encode %{ - __ cmovq(Assembler::parity, $dst$$Register, $src$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_regUCF2_eq_ndd(cmpOpUCF2 cop, rFlagsRegUCF cr, rRegL dst, rRegL src1, rRegL src2) %{ - predicate(UseAPX && n->in(1)->in(1)->as_Bool()->_test._test == BoolTest::eq); - match(Set dst (CMoveL (Binary cop cr) (Binary src2 src1))); - effect(TEMP dst); - - ins_cost(200); - format %{ "ecmovpq $dst, $src1, $src2\n\t" - "cmovneq $dst, $src2" %} - ins_encode %{ - __ ecmovq(Assembler::parity, $dst$$Register, $src1$$Register, $src2$$Register); - __ cmovq(Assembler::notEqual, $dst$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovL_memU(cmpOpU cop, rFlagsRegU cr, rRegL dst, memory src) -%{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); - - ins_cost(200); // XXX - format %{ "cmovq$cop $dst, $src\t# unsigned, long" %} - ins_encode %{ - __ cmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src$$Address); - %} - ins_pipe(pipe_cmov_mem); // XXX -%} - -instruct cmovL_memUCF(cmpOpUCF cop, rFlagsRegUCF cr, rRegL dst, memory src) %{ - predicate(!UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary dst (LoadL src)))); - ins_cost(200); - expand %{ - cmovL_memU(cop, cr, dst, src); - %} -%} - -instruct cmovL_rReg_rReg_memU_ndd(rRegL dst, cmpOpU cop, rFlagsRegU cr, rRegL src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); - - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -instruct cmovL_rReg_rReg_memUCF_ndd(rRegL dst, cmpOpUCF cop, rFlagsRegUCF cr, rRegL src1, memory src2) -%{ - predicate(UseAPX); - match(Set dst (CMoveL (Binary cop cr) (Binary src1 (LoadL src2)))); - ins_cost(200); - format %{ "ecmovq$cop $dst, $src1, $src2\t# unsigned, long ndd" %} - ins_encode %{ - __ ecmovq((Assembler::Condition)($cop$$cmpcode), $dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(pipe_cmov_mem); -%} - -instruct cmovF_reg(cmpOp cop, rFlagsReg cr, regF dst, regF src) -%{ - match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "jn$cop skip\t# signed cmove float\n\t" - "movss $dst, $src\n" - "skip:" %} - ins_encode %{ - Label Lskip; - // Invert sense of branch from sense of CMOV - __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); - __ movflt($dst$$XMMRegister, $src$$XMMRegister); - __ bind(Lskip); - %} - ins_pipe(pipe_slow); -%} - -instruct cmovF_regU(cmpOpU cop, rFlagsRegU cr, regF dst, regF src) -%{ - match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "jn$cop skip\t# unsigned cmove float\n\t" - "movss $dst, $src\n" - "skip:" %} - ins_encode %{ - Label Lskip; - // Invert sense of branch from sense of CMOV - __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); - __ movflt($dst$$XMMRegister, $src$$XMMRegister); - __ bind(Lskip); - %} - ins_pipe(pipe_slow); -%} - -instruct cmovF_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, regF dst, regF src) %{ - match(Set dst (CMoveF (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovF_regU(cop, cr, dst, src); - %} -%} - -instruct cmovD_reg(cmpOp cop, rFlagsReg cr, regD dst, regD src) -%{ - match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "jn$cop skip\t# signed cmove double\n\t" - "movsd $dst, $src\n" - "skip:" %} - ins_encode %{ - Label Lskip; - // Invert sense of branch from sense of CMOV - __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); - __ movdbl($dst$$XMMRegister, $src$$XMMRegister); - __ bind(Lskip); - %} - ins_pipe(pipe_slow); -%} - -instruct cmovD_regU(cmpOpU cop, rFlagsRegU cr, regD dst, regD src) -%{ - match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); - - ins_cost(200); // XXX - format %{ "jn$cop skip\t# unsigned cmove double\n\t" - "movsd $dst, $src\n" - "skip:" %} - ins_encode %{ - Label Lskip; - // Invert sense of branch from sense of CMOV - __ jccb((Assembler::Condition)($cop$$cmpcode^1), Lskip); - __ movdbl($dst$$XMMRegister, $src$$XMMRegister); - __ bind(Lskip); - %} - ins_pipe(pipe_slow); -%} - -instruct cmovD_regUCF(cmpOpUCF cop, rFlagsRegUCF cr, regD dst, regD src) %{ - match(Set dst (CMoveD (Binary cop cr) (Binary dst src))); - ins_cost(200); - expand %{ - cmovD_regU(cop, cr, dst, src); - %} -%} - -//----------Arithmetic Instructions-------------------------------------------- -//----------Addition Instructions---------------------------------------------- - -instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - format %{ "addl $dst, $src\t# int" %} - ins_encode %{ - __ addl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eaddl($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "addl $dst, $src\t# int" %} - ins_encode %{ - __ addl($dst$$Register, $src$$constant); - %} - ins_pipe( ialu_reg ); -%} - -instruct addI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eaddl($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe( ialu_reg ); -%} - -instruct addI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddI (LoadI src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eaddl($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe( ialu_reg ); -%} - -instruct addI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddI dst (LoadI src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); // XXX - format %{ "addl $dst, $src\t# int" %} - ins_encode %{ - __ addl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct addI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddI src1 (LoadI src2))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "eaddl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eaddl($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct addI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (AddI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); // XXX - format %{ "addl $dst, $src\t# int" %} - ins_encode %{ - __ addl($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct addI_mem_imm(memory dst, immI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (AddI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - - ins_cost(125); // XXX - format %{ "addl $dst, $src\t# int" %} - ins_encode %{ - __ addl($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct incI_rReg(rRegI dst, immI_1 src, rFlagsReg cr) -%{ - predicate(!UseAPX && UseIncDec); - match(Set dst (AddI dst src)); - effect(KILL cr); - - format %{ "incl $dst\t# int" %} - ins_encode %{ - __ incrementl($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct incI_rReg_ndd(rRegI dst, rRegI src, immI_1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddI src val)); - effect(KILL cr); - - format %{ "eincl $dst, $src\t# int ndd" %} - ins_encode %{ - __ eincl($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct incI_rReg_mem_ndd(rRegI dst, memory src, immI_1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddI (LoadI src) val)); - effect(KILL cr); - - format %{ "eincl $dst, $src\t# int ndd" %} - ins_encode %{ - __ eincl($dst$$Register, $src$$Address, false); - %} - ins_pipe(ialu_reg); -%} - -instruct incI_mem(memory dst, immI_1 src, rFlagsReg cr) -%{ - predicate(UseIncDec); - match(Set dst (StoreI dst (AddI (LoadI dst) src))); - effect(KILL cr); - - ins_cost(125); // XXX - format %{ "incl $dst\t# int" %} - ins_encode %{ - __ incrementl($dst$$Address); - %} - ins_pipe(ialu_mem_imm); -%} - -// XXX why does that use AddI -instruct decI_rReg(rRegI dst, immI_M1 src, rFlagsReg cr) -%{ - predicate(!UseAPX && UseIncDec); - match(Set dst (AddI dst src)); - effect(KILL cr); - - format %{ "decl $dst\t# int" %} - ins_encode %{ - __ decrementl($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct decI_rReg_ndd(rRegI dst, rRegI src, immI_M1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddI src val)); - effect(KILL cr); - - format %{ "edecl $dst, $src\t# int ndd" %} - ins_encode %{ - __ edecl($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct decI_rReg_mem_ndd(rRegI dst, memory src, immI_M1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddI (LoadI src) val)); - effect(KILL cr); - - format %{ "edecl $dst, $src\t# int ndd" %} - ins_encode %{ - __ edecl($dst$$Register, $src$$Address, false); - %} - ins_pipe(ialu_reg); -%} - -// XXX why does that use AddI -instruct decI_mem(memory dst, immI_M1 src, rFlagsReg cr) -%{ - predicate(UseIncDec); - match(Set dst (StoreI dst (AddI (LoadI dst) src))); - effect(KILL cr); - - ins_cost(125); // XXX - format %{ "decl $dst\t# int" %} - ins_encode %{ - __ decrementl($dst$$Address); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct leaI_rReg_immI2_immI(rRegI dst, rRegI index, immI2 scale, immI disp) -%{ - predicate(VM_Version::supports_fast_2op_lea()); - match(Set dst (AddI (LShiftI index scale) disp)); - - format %{ "leal $dst, [$index << $scale + $disp]\t# int" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leal($dst$$Register, Address(noreg, $index$$Register, scale, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaI_rReg_rReg_immI(rRegI dst, rRegI base, rRegI index, immI disp) -%{ - predicate(VM_Version::supports_fast_3op_lea()); - match(Set dst (AddI (AddI base index) disp)); - - format %{ "leal $dst, [$base + $index + $disp]\t# int" %} - ins_encode %{ - __ leal($dst$$Register, Address($base$$Register, $index$$Register, Address::times_1, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaI_rReg_rReg_immI2(rRegI dst, no_rbp_r13_RegI base, rRegI index, immI2 scale) -%{ - predicate(VM_Version::supports_fast_2op_lea()); - match(Set dst (AddI base (LShiftI index scale))); - - format %{ "leal $dst, [$base + $index << $scale]\t# int" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leal($dst$$Register, Address($base$$Register, $index$$Register, scale)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaI_rReg_rReg_immI2_immI(rRegI dst, rRegI base, rRegI index, immI2 scale, immI disp) -%{ - predicate(VM_Version::supports_fast_3op_lea()); - match(Set dst (AddI (AddI base (LShiftI index scale)) disp)); - - format %{ "leal $dst, [$base + $index << $scale + $disp]\t# int" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leal($dst$$Register, Address($base$$Register, $index$$Register, scale, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "addq $dst, $src\t# long" %} - ins_encode %{ - __ addq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eaddq($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "addq $dst, $src\t# long" %} - ins_encode %{ - __ addq($dst$$Register, $src$$constant); - %} - ins_pipe( ialu_reg ); -%} - -instruct addL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eaddq($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe( ialu_reg ); -%} - -instruct addL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eaddq($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe( ialu_reg ); -%} - -instruct addL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AddL dst (LoadL src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); // XXX - format %{ "addq $dst, $src\t# long" %} - ins_encode %{ - __ addq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct addL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AddL src1 (LoadL src2))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "eaddq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eaddq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct addL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (AddL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); // XXX - format %{ "addq $dst, $src\t# long" %} - ins_encode %{ - __ addq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct addL_mem_imm(memory dst, immL32 src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (AddL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(125); // XXX - format %{ "addq $dst, $src\t# long" %} - ins_encode %{ - __ addq($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct incL_rReg(rRegL dst, immL1 src, rFlagsReg cr) -%{ - predicate(!UseAPX && UseIncDec); - match(Set dst (AddL dst src)); - effect(KILL cr); - - format %{ "incq $dst\t# long" %} - ins_encode %{ - __ incrementq($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct incL_rReg_ndd(rRegL dst, rRegI src, immL1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddL src val)); - effect(KILL cr); - - format %{ "eincq $dst, $src\t# long ndd" %} - ins_encode %{ - __ eincq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct incL_rReg_mem_ndd(rRegL dst, memory src, immL1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddL (LoadL src) val)); - effect(KILL cr); - - format %{ "eincq $dst, $src\t# long ndd" %} - ins_encode %{ - __ eincq($dst$$Register, $src$$Address, false); - %} - ins_pipe(ialu_reg); -%} - -instruct incL_mem(memory dst, immL1 src, rFlagsReg cr) -%{ - predicate(UseIncDec); - match(Set dst (StoreL dst (AddL (LoadL dst) src))); - effect(KILL cr); - - ins_cost(125); // XXX - format %{ "incq $dst\t# long" %} - ins_encode %{ - __ incrementq($dst$$Address); - %} - ins_pipe(ialu_mem_imm); -%} - -// XXX why does that use AddL -instruct decL_rReg(rRegL dst, immL_M1 src, rFlagsReg cr) -%{ - predicate(!UseAPX && UseIncDec); - match(Set dst (AddL dst src)); - effect(KILL cr); - - format %{ "decq $dst\t# long" %} - ins_encode %{ - __ decrementq($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct decL_rReg_ndd(rRegL dst, rRegL src, immL_M1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddL src val)); - effect(KILL cr); - - format %{ "edecq $dst, $src\t# long ndd" %} - ins_encode %{ - __ edecq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct decL_rReg_mem_ndd(rRegL dst, memory src, immL_M1 val, rFlagsReg cr) -%{ - predicate(UseAPX && UseIncDec); - match(Set dst (AddL (LoadL src) val)); - effect(KILL cr); - - format %{ "edecq $dst, $src\t# long ndd" %} - ins_encode %{ - __ edecq($dst$$Register, $src$$Address, false); - %} - ins_pipe(ialu_reg); -%} - -// XXX why does that use AddL -instruct decL_mem(memory dst, immL_M1 src, rFlagsReg cr) -%{ - predicate(UseIncDec); - match(Set dst (StoreL dst (AddL (LoadL dst) src))); - effect(KILL cr); - - ins_cost(125); // XXX - format %{ "decq $dst\t# long" %} - ins_encode %{ - __ decrementq($dst$$Address); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct leaL_rReg_immI2_immL32(rRegL dst, rRegL index, immI2 scale, immL32 disp) -%{ - predicate(VM_Version::supports_fast_2op_lea()); - match(Set dst (AddL (LShiftL index scale) disp)); - - format %{ "leaq $dst, [$index << $scale + $disp]\t# long" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leaq($dst$$Register, Address(noreg, $index$$Register, scale, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_rReg_immL32(rRegL dst, rRegL base, rRegL index, immL32 disp) -%{ - predicate(VM_Version::supports_fast_3op_lea()); - match(Set dst (AddL (AddL base index) disp)); - - format %{ "leaq $dst, [$base + $index + $disp]\t# long" %} - ins_encode %{ - __ leaq($dst$$Register, Address($base$$Register, $index$$Register, Address::times_1, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_rReg_immI2(rRegL dst, no_rbp_r13_RegL base, rRegL index, immI2 scale) -%{ - predicate(VM_Version::supports_fast_2op_lea()); - match(Set dst (AddL base (LShiftL index scale))); - - format %{ "leaq $dst, [$base + $index << $scale]\t# long" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leaq($dst$$Register, Address($base$$Register, $index$$Register, scale)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_rReg_immI2_immL32(rRegL dst, rRegL base, rRegL index, immI2 scale, immL32 disp) -%{ - predicate(VM_Version::supports_fast_3op_lea()); - match(Set dst (AddL (AddL base (LShiftL index scale)) disp)); - - format %{ "leaq $dst, [$base + $index << $scale + $disp]\t# long" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($scale$$constant); - __ leaq($dst$$Register, Address($base$$Register, $index$$Register, scale, $disp$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addP_rReg(rRegP dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (AddP dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "addq $dst, $src\t# ptr" %} - ins_encode %{ - __ addq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct addP_rReg_imm(rRegP dst, immL32 src, rFlagsReg cr) -%{ - match(Set dst (AddP dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "addq $dst, $src\t# ptr" %} - ins_encode %{ - __ addq($dst$$Register, $src$$constant); - %} - ins_pipe( ialu_reg ); -%} - -// XXX addP mem ops ???? - -instruct checkCastPP(rRegP dst) -%{ - match(Set dst (CheckCastPP dst)); - - size(0); - format %{ "# checkcastPP of $dst" %} - ins_encode(/* empty encoding */); - ins_pipe(empty); -%} - -instruct castPP(rRegP dst) -%{ - match(Set dst (CastPP dst)); - - size(0); - format %{ "# castPP of $dst" %} - ins_encode(/* empty encoding */); - ins_pipe(empty); -%} - -instruct castII(rRegI dst) -%{ - predicate(VerifyConstraintCasts == 0); - match(Set dst (CastII dst)); - - size(0); - format %{ "# castII of $dst" %} - ins_encode(/* empty encoding */); - ins_cost(0); - ins_pipe(empty); -%} - -instruct castII_checked(rRegI dst, rFlagsReg cr) -%{ - predicate(VerifyConstraintCasts > 0); - match(Set dst (CastII dst)); - - effect(KILL cr); - format %{ "# cast_checked_II $dst" %} - ins_encode %{ - __ verify_int_in_range(_idx, bottom_type()->is_int(), $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct castLL(rRegL dst) -%{ - predicate(VerifyConstraintCasts == 0); - match(Set dst (CastLL dst)); - - size(0); - format %{ "# castLL of $dst" %} - ins_encode(/* empty encoding */); - ins_cost(0); - ins_pipe(empty); -%} - -instruct castLL_checked_L32(rRegL dst, rFlagsReg cr) -%{ - predicate(VerifyConstraintCasts > 0 && castLL_is_imm32(n)); - match(Set dst (CastLL dst)); - - effect(KILL cr); - format %{ "# cast_checked_LL $dst" %} - ins_encode %{ - __ verify_long_in_range(_idx, bottom_type()->is_long(), $dst$$Register, noreg); - %} - ins_pipe(pipe_slow); -%} - -instruct castLL_checked(rRegL dst, rRegL tmp, rFlagsReg cr) -%{ - predicate(VerifyConstraintCasts > 0 && !castLL_is_imm32(n)); - match(Set dst (CastLL dst)); - - effect(KILL cr, TEMP tmp); - format %{ "# cast_checked_LL $dst\tusing $tmp as TEMP" %} - ins_encode %{ - __ verify_long_in_range(_idx, bottom_type()->is_long(), $dst$$Register, $tmp$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct castFF(regF dst) -%{ - match(Set dst (CastFF dst)); - - size(0); - format %{ "# castFF of $dst" %} - ins_encode(/* empty encoding */); - ins_cost(0); - ins_pipe(empty); -%} - -instruct castHH(regF dst) -%{ - match(Set dst (CastHH dst)); - - size(0); - format %{ "# castHH of $dst" %} - ins_encode(/* empty encoding */); - ins_cost(0); - ins_pipe(empty); -%} - -instruct castDD(regD dst) -%{ - match(Set dst (CastDD dst)); - - size(0); - format %{ "# castDD of $dst" %} - ins_encode(/* empty encoding */); - ins_cost(0); - ins_pipe(empty); -%} - -// XXX No flag versions for CompareAndSwap{P,I,L} because matcher can't match them -instruct compareAndSwapP(rRegI res, - memory mem_ptr, - rax_RegP oldval, rRegP newval, - rFlagsReg cr) -%{ - predicate(n->as_LoadStore()->barrier_data() == 0); - match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapP mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgq $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgq($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndSwapL(rRegI res, - memory mem_ptr, - rax_RegL oldval, rRegL newval, - rFlagsReg cr) -%{ - match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapL mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgq $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgq($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndSwapI(rRegI res, - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapI mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgl $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgl($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndSwapB(rRegI res, - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set res (CompareAndSwapB mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapB mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgb $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgb($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndSwapS(rRegI res, - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set res (CompareAndSwapS mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapS mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgw $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgw($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndSwapN(rRegI res, - memory mem_ptr, - rax_RegN oldval, rRegN newval, - rFlagsReg cr) %{ - predicate(n->as_LoadStore()->barrier_data() == 0); - match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval))); - match(Set res (WeakCompareAndSwapN mem_ptr (Binary oldval newval))); - effect(KILL cr, KILL oldval); - - format %{ "cmpxchgl $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" - "setcc $res \t# emits sete + movzbl or setzue for APX" %} - ins_encode %{ - __ lock(); - __ cmpxchgl($newval$$Register, $mem_ptr$$Address); - __ setcc(Assembler::equal, $res$$Register); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeB( - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set oldval (CompareAndExchangeB mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgb $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgb($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeS( - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set oldval (CompareAndExchangeS mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgw $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgw($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeI( - memory mem_ptr, - rax_RegI oldval, rRegI newval, - rFlagsReg cr) -%{ - match(Set oldval (CompareAndExchangeI mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgl $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgl($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeL( - memory mem_ptr, - rax_RegL oldval, rRegL newval, - rFlagsReg cr) -%{ - match(Set oldval (CompareAndExchangeL mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgq $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgq($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeN( - memory mem_ptr, - rax_RegN oldval, rRegN newval, - rFlagsReg cr) %{ - predicate(n->as_LoadStore()->barrier_data() == 0); - match(Set oldval (CompareAndExchangeN mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgl $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgl($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct compareAndExchangeP( - memory mem_ptr, - rax_RegP oldval, rRegP newval, - rFlagsReg cr) -%{ - predicate(n->as_LoadStore()->barrier_data() == 0); - match(Set oldval (CompareAndExchangeP mem_ptr (Binary oldval newval))); - effect(KILL cr); - - format %{ "cmpxchgq $mem_ptr,$newval\t# " - "If rax == $mem_ptr then store $newval into $mem_ptr\n\t" %} - ins_encode %{ - __ lock(); - __ cmpxchgq($newval$$Register, $mem_ptr$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xaddB_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddB mem add)); - effect(KILL cr); - format %{ "addb_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addb($mem$$Address, $add$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddB_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddB mem add)); - effect(KILL cr); - format %{ "addb_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addb($mem$$Address, $add$$constant); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddB(memory mem, rRegI newval, rFlagsReg cr) %{ - predicate(!n->as_LoadStore()->result_not_used()); - match(Set newval (GetAndAddB mem newval)); - effect(KILL cr); - format %{ "xaddb_lock $mem, $newval" %} - ins_encode %{ - __ lock(); - __ xaddb($mem$$Address, $newval$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddS_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddS mem add)); - effect(KILL cr); - format %{ "addw_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addw($mem$$Address, $add$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddS_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ - predicate(UseStoreImmI16 && n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddS mem add)); - effect(KILL cr); - format %{ "addw_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addw($mem$$Address, $add$$constant); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddS(memory mem, rRegI newval, rFlagsReg cr) %{ - predicate(!n->as_LoadStore()->result_not_used()); - match(Set newval (GetAndAddS mem newval)); - effect(KILL cr); - format %{ "xaddw_lock $mem, $newval" %} - ins_encode %{ - __ lock(); - __ xaddw($mem$$Address, $newval$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddI_reg_no_res(memory mem, Universe dummy, rRegI add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddI mem add)); - effect(KILL cr); - format %{ "addl_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addl($mem$$Address, $add$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddI_imm_no_res(memory mem, Universe dummy, immI add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddI mem add)); - effect(KILL cr); - format %{ "addl_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addl($mem$$Address, $add$$constant); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddI(memory mem, rRegI newval, rFlagsReg cr) %{ - predicate(!n->as_LoadStore()->result_not_used()); - match(Set newval (GetAndAddI mem newval)); - effect(KILL cr); - format %{ "xaddl_lock $mem, $newval" %} - ins_encode %{ - __ lock(); - __ xaddl($mem$$Address, $newval$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddL_reg_no_res(memory mem, Universe dummy, rRegL add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddL mem add)); - effect(KILL cr); - format %{ "addq_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addq($mem$$Address, $add$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddL_imm_no_res(memory mem, Universe dummy, immL32 add, rFlagsReg cr) %{ - predicate(n->as_LoadStore()->result_not_used()); - match(Set dummy (GetAndAddL mem add)); - effect(KILL cr); - format %{ "addq_lock $mem, $add" %} - ins_encode %{ - __ lock(); - __ addq($mem$$Address, $add$$constant); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xaddL(memory mem, rRegL newval, rFlagsReg cr) %{ - predicate(!n->as_LoadStore()->result_not_used()); - match(Set newval (GetAndAddL mem newval)); - effect(KILL cr); - format %{ "xaddq_lock $mem, $newval" %} - ins_encode %{ - __ lock(); - __ xaddq($mem$$Address, $newval$$Register); - %} - ins_pipe(pipe_cmpxchg); -%} - -instruct xchgB( memory mem, rRegI newval) %{ - match(Set newval (GetAndSetB mem newval)); - format %{ "XCHGB $newval,[$mem]" %} - ins_encode %{ - __ xchgb($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xchgS( memory mem, rRegI newval) %{ - match(Set newval (GetAndSetS mem newval)); - format %{ "XCHGW $newval,[$mem]" %} - ins_encode %{ - __ xchgw($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xchgI( memory mem, rRegI newval) %{ - match(Set newval (GetAndSetI mem newval)); - format %{ "XCHGL $newval,[$mem]" %} - ins_encode %{ - __ xchgl($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xchgL( memory mem, rRegL newval) %{ - match(Set newval (GetAndSetL mem newval)); - format %{ "XCHGL $newval,[$mem]" %} - ins_encode %{ - __ xchgq($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xchgP( memory mem, rRegP newval) %{ - match(Set newval (GetAndSetP mem newval)); - predicate(n->as_LoadStore()->barrier_data() == 0); - format %{ "XCHGQ $newval,[$mem]" %} - ins_encode %{ - __ xchgq($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -instruct xchgN( memory mem, rRegN newval) %{ - predicate(n->as_LoadStore()->barrier_data() == 0); - match(Set newval (GetAndSetN mem newval)); - format %{ "XCHGL $newval,$mem]" %} - ins_encode %{ - __ xchgl($newval$$Register, $mem$$Address); - %} - ins_pipe( pipe_cmpxchg ); -%} - -//----------Abs Instructions------------------------------------------- - -// Integer Absolute Instructions -instruct absI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (AbsI src)); - effect(TEMP dst, KILL cr); - format %{ "xorl $dst, $dst\t# abs int\n\t" - "subl $dst, $src\n\t" - "cmovll $dst, $src" %} - ins_encode %{ - __ xorl($dst$$Register, $dst$$Register); - __ subl($dst$$Register, $src$$Register); - __ cmovl(Assembler::less, $dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg_reg); -%} - -// Long Absolute Instructions -instruct absL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (AbsL src)); - effect(TEMP dst, KILL cr); - format %{ "xorl $dst, $dst\t# abs long\n\t" - "subq $dst, $src\n\t" - "cmovlq $dst, $src" %} - ins_encode %{ - __ xorl($dst$$Register, $dst$$Register); - __ subq($dst$$Register, $src$$Register); - __ cmovq(Assembler::less, $dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg_reg); -%} - -//----------Subtraction Instructions------------------------------------------- - -// Integer Subtraction Instructions -instruct subI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "subl $dst, $src\t# int" %} - ins_encode %{ - __ subl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ esubl($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ esubl($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI (LoadI src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ esubl($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubI dst (LoadI src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "subl $dst, $src\t# int" %} - ins_encode %{ - __ subl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI src1 (LoadI src2))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "esubl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ esubl($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subI_rReg_mem_rReg_ndd(rRegI dst, memory src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI (LoadI src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "esubl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ esubl($dst$$Register, $src1$$Address, $src2$$Register, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (SubI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "subl $dst, $src\t# int" %} - ins_encode %{ - __ subl($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "subq $dst, $src\t# long" %} - ins_encode %{ - __ subq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ esubq($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ esubq($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - format %{ "esubq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ esubq($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct subL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubL dst (LoadL src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "subq $dst, $src\t# long" %} - ins_encode %{ - __ subq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL src1 (LoadL src2))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "esubq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ esubq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subL_rReg_mem_rReg_ndd(rRegL dst, memory src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "esubq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ esubq($dst$$Register, $src1$$Address, $src2$$Register, false); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct subL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (SubL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_carry_flag, PD::Flag_sets_parity_flag); - - ins_cost(150); - format %{ "subq $dst, $src\t# long" %} - ins_encode %{ - __ subq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Subtract from a pointer -// XXX hmpf??? -instruct subP_rReg(rRegP dst, rRegI src, immI_0 zero, rFlagsReg cr) -%{ - match(Set dst (AddP dst (SubI zero src))); - effect(KILL cr); - - format %{ "subq $dst, $src\t# ptr - int" %} - ins_encode %{ - __ subq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct negI_rReg(rRegI dst, immI_0 zero, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubI zero dst)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negl $dst\t# int" %} - ins_encode %{ - __ negl($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct negI_rReg_ndd(rRegI dst, rRegI src, immI_0 zero, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubI zero src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "enegl $dst, $src\t# int ndd" %} - ins_encode %{ - __ enegl($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct negI_rReg_2(rRegI dst, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (NegI dst)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negl $dst\t# int" %} - ins_encode %{ - __ negl($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct negI_rReg_2_ndd(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (NegI src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "enegl $dst, $src\t# int ndd" %} - ins_encode %{ - __ enegl($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct negI_mem(memory dst, immI_0 zero, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (SubI zero (LoadI dst)))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negl $dst\t# int" %} - ins_encode %{ - __ negl($dst$$Address); - %} - ins_pipe(ialu_reg); -%} - -instruct negL_rReg(rRegL dst, immL0 zero, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (SubL zero dst)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negq $dst\t# long" %} - ins_encode %{ - __ negq($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct negL_rReg_ndd(rRegL dst, rRegL src, immL0 zero, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (SubL zero src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "enegq $dst, $src\t# long ndd" %} - ins_encode %{ - __ enegq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct negL_rReg_2(rRegL dst, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (NegL dst)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negq $dst\t# int" %} - ins_encode %{ - __ negq($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct negL_rReg_2_ndd(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (NegL src)); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "enegq $dst, $src\t# long ndd" %} - ins_encode %{ - __ enegq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg); -%} - -instruct negL_mem(memory dst, immL0 zero, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (SubL zero (LoadL dst)))); - effect(KILL cr); - flag(PD::Flag_sets_overflow_flag, PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag); - - format %{ "negq $dst\t# long" %} - ins_encode %{ - __ negq($dst$$Address); - %} - ins_pipe(ialu_reg); -%} - -//----------Multiplication/Division Instructions------------------------------- -// Integer Multiplication Instructions -// Multiply Register - -instruct mulI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (MulI dst src)); - effect(KILL cr); - - ins_cost(300); - format %{ "imull $dst, $src\t# int" %} - ins_encode %{ - __ imull($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (MulI src1 src2)); - effect(KILL cr); - - ins_cost(300); - format %{ "eimull $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eimull($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulI_rReg_imm(rRegI dst, rRegI src, immI imm, rFlagsReg cr) -%{ - match(Set dst (MulI src imm)); - effect(KILL cr); - - ins_cost(300); - format %{ "imull $dst, $src, $imm\t# int" %} - ins_encode %{ - __ imull($dst$$Register, $src$$Register, $imm$$constant); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulI_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (MulI dst (LoadI src))); - effect(KILL cr); - - ins_cost(350); - format %{ "imull $dst, $src\t# int" %} - ins_encode %{ - __ imull($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (MulI src1 (LoadI src2))); - effect(KILL cr); - - ins_cost(350); - format %{ "eimull $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eimull($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulI_mem_imm(rRegI dst, memory src, immI imm, rFlagsReg cr) -%{ - match(Set dst (MulI (LoadI src) imm)); - effect(KILL cr); - - ins_cost(300); - format %{ "imull $dst, $src, $imm\t# int" %} - ins_encode %{ - __ imull($dst$$Register, $src$$Address, $imm$$constant); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulAddS2I_rReg(rRegI dst, rRegI src1, rRegI src2, rRegI src3, rFlagsReg cr) -%{ - match(Set dst (MulAddS2I (Binary dst src1) (Binary src2 src3))); - effect(KILL cr, KILL src2); - - expand %{ mulI_rReg(dst, src1, cr); - mulI_rReg(src2, src3, cr); - addI_rReg(dst, src2, cr); %} -%} - -instruct mulL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (MulL dst src)); - effect(KILL cr); - - ins_cost(300); - format %{ "imulq $dst, $src\t# long" %} - ins_encode %{ - __ imulq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (MulL src1 src2)); - effect(KILL cr); - - ins_cost(300); - format %{ "eimulq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eimulq($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulL_rReg_imm(rRegL dst, rRegL src, immL32 imm, rFlagsReg cr) -%{ - match(Set dst (MulL src imm)); - effect(KILL cr); - - ins_cost(300); - format %{ "imulq $dst, $src, $imm\t# long" %} - ins_encode %{ - __ imulq($dst$$Register, $src$$Register, $imm$$constant); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct mulL_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (MulL dst (LoadL src))); - effect(KILL cr); - - ins_cost(350); - format %{ "imulq $dst, $src\t# long" %} - ins_encode %{ - __ imulq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (MulL src1 (LoadL src2))); - effect(KILL cr); - - ins_cost(350); - format %{ "eimulq $dst, $src1, $src2 \t# long" %} - ins_encode %{ - __ eimulq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulL_mem_imm(rRegL dst, memory src, immL32 imm, rFlagsReg cr) -%{ - match(Set dst (MulL (LoadL src) imm)); - effect(KILL cr); - - ins_cost(300); - format %{ "imulq $dst, $src, $imm\t# long" %} - ins_encode %{ - __ imulq($dst$$Register, $src$$Address, $imm$$constant); - %} - ins_pipe(ialu_reg_mem_alu0); -%} - -instruct mulHiL_rReg(rdx_RegL dst, rRegL src, rax_RegL rax, rFlagsReg cr) -%{ - match(Set dst (MulHiL src rax)); - effect(USE_KILL rax, KILL cr); - - ins_cost(300); - format %{ "imulq RDX:RAX, RAX, $src\t# mulhi" %} - ins_encode %{ - __ imulq($src$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct umulHiL_rReg(rdx_RegL dst, rRegL src, rax_RegL rax, rFlagsReg cr) -%{ - match(Set dst (UMulHiL src rax)); - effect(USE_KILL rax, KILL cr); - - ins_cost(300); - format %{ "mulq RDX:RAX, RAX, $src\t# umulhi" %} - ins_encode %{ - __ mulq($src$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, - rFlagsReg cr) -%{ - match(Set rax (DivI rax div)); - effect(KILL rdx, KILL cr); - - ins_cost(30*100+10*100); // XXX - format %{ "cmpl rax, 0x80000000\t# idiv\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpl $div, -1\n\t" - "je,s done\n" - "normal: cdql\n\t" - "idivl $div\n" - "done:" %} - ins_encode(cdql_enc(div)); - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct divL_rReg(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, - rFlagsReg cr) -%{ - match(Set rax (DivL rax div)); - effect(KILL rdx, KILL cr); - - ins_cost(30*100+10*100); // XXX - format %{ "movq rdx, 0x8000000000000000\t# ldiv\n\t" - "cmpq rax, rdx\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpq $div, -1\n\t" - "je,s done\n" - "normal: cdqq\n\t" - "idivq $div\n" - "done:" %} - ins_encode(cdqq_enc(div)); - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct udivI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, rFlagsReg cr) -%{ - match(Set rax (UDivI rax div)); - effect(KILL rdx, KILL cr); - - ins_cost(300); - format %{ "udivl $rax,$rax,$div\t# UDivI\n" %} - ins_encode %{ - __ udivI($rax$$Register, $div$$Register, $rdx$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct udivL_rReg(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, rFlagsReg cr) -%{ - match(Set rax (UDivL rax div)); - effect(KILL rdx, KILL cr); - - ins_cost(300); - format %{ "udivq $rax,$rax,$div\t# UDivL\n" %} - ins_encode %{ - __ udivL($rax$$Register, $div$$Register, $rdx$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -// Integer DIVMOD with Register, both quotient and mod results -instruct divModI_rReg_divmod(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, - rFlagsReg cr) -%{ - match(DivModI rax div); - effect(KILL cr); - - ins_cost(30*100+10*100); // XXX - format %{ "cmpl rax, 0x80000000\t# idiv\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpl $div, -1\n\t" - "je,s done\n" - "normal: cdql\n\t" - "idivl $div\n" - "done:" %} - ins_encode(cdql_enc(div)); - ins_pipe(pipe_slow); -%} - -// Long DIVMOD with Register, both quotient and mod results -instruct divModL_rReg_divmod(rax_RegL rax, rdx_RegL rdx, no_rax_rdx_RegL div, - rFlagsReg cr) -%{ - match(DivModL rax div); - effect(KILL cr); - - ins_cost(30*100+10*100); // XXX - format %{ "movq rdx, 0x8000000000000000\t# ldiv\n\t" - "cmpq rax, rdx\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpq $div, -1\n\t" - "je,s done\n" - "normal: cdqq\n\t" - "idivq $div\n" - "done:" %} - ins_encode(cdqq_enc(div)); - ins_pipe(pipe_slow); -%} - -// Unsigned integer DIVMOD with Register, both quotient and mod results -instruct udivModI_rReg_divmod(rax_RegI rax, no_rax_rdx_RegI tmp, rdx_RegI rdx, - no_rax_rdx_RegI div, rFlagsReg cr) -%{ - match(UDivModI rax div); - effect(TEMP tmp, KILL cr); - - ins_cost(300); - format %{ "udivl $rax,$rax,$div\t# begin UDivModI\n\t" - "umodl $rdx,$rax,$div\t! using $tmp as TEMP # end UDivModI\n" - %} - ins_encode %{ - __ udivmodI($rax$$Register, $div$$Register, $rdx$$Register, $tmp$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Unsigned long DIVMOD with Register, both quotient and mod results -instruct udivModL_rReg_divmod(rax_RegL rax, no_rax_rdx_RegL tmp, rdx_RegL rdx, - no_rax_rdx_RegL div, rFlagsReg cr) -%{ - match(UDivModL rax div); - effect(TEMP tmp, KILL cr); - - ins_cost(300); - format %{ "udivq $rax,$rax,$div\t# begin UDivModL\n\t" - "umodq $rdx,$rax,$div\t! using $tmp as TEMP # end UDivModL\n" - %} - ins_encode %{ - __ udivmodL($rax$$Register, $div$$Register, $rdx$$Register, $tmp$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct modI_rReg(rdx_RegI rdx, rax_RegI rax, no_rax_rdx_RegI div, - rFlagsReg cr) -%{ - match(Set rdx (ModI rax div)); - effect(KILL rax, KILL cr); - - ins_cost(300); // XXX - format %{ "cmpl rax, 0x80000000\t# irem\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpl $div, -1\n\t" - "je,s done\n" - "normal: cdql\n\t" - "idivl $div\n" - "done:" %} - ins_encode(cdql_enc(div)); - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct modL_rReg(rdx_RegL rdx, rax_RegL rax, no_rax_rdx_RegL div, - rFlagsReg cr) -%{ - match(Set rdx (ModL rax div)); - effect(KILL rax, KILL cr); - - ins_cost(300); // XXX - format %{ "movq rdx, 0x8000000000000000\t# lrem\n\t" - "cmpq rax, rdx\n\t" - "jne,s normal\n\t" - "xorl rdx, rdx\n\t" - "cmpq $div, -1\n\t" - "je,s done\n" - "normal: cdqq\n\t" - "idivq $div\n" - "done:" %} - ins_encode(cdqq_enc(div)); - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct umodI_rReg(rdx_RegI rdx, rax_RegI rax, no_rax_rdx_RegI div, rFlagsReg cr) -%{ - match(Set rdx (UModI rax div)); - effect(KILL rax, KILL cr); - - ins_cost(300); - format %{ "umodl $rdx,$rax,$div\t# UModI\n" %} - ins_encode %{ - __ umodI($rax$$Register, $div$$Register, $rdx$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct umodL_rReg(rdx_RegL rdx, rax_RegL rax, no_rax_rdx_RegL div, rFlagsReg cr) -%{ - match(Set rdx (UModL rax div)); - effect(KILL rax, KILL cr); - - ins_cost(300); - format %{ "umodq $rdx,$rax,$div\t# UModL\n" %} - ins_encode %{ - __ umodL($rax$$Register, $div$$Register, $rdx$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -// Integer Shift Instructions -// Shift Left by one, two, three -instruct salI_rReg_immI2(rRegI dst, immI2 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (LShiftI dst shift)); - effect(KILL cr); - - format %{ "sall $dst, $shift" %} - ins_encode %{ - __ sall($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by one, two, three -instruct salI_rReg_immI2_ndd(rRegI dst, rRegI src, immI2 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftI src shift)); - effect(KILL cr); - - format %{ "esall $dst, $src, $shift\t# int(ndd)" %} - ins_encode %{ - __ esall($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (LShiftI dst shift)); - effect(KILL cr); - - format %{ "sall $dst, $shift" %} - ins_encode %{ - __ sall($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftI src shift)); - effect(KILL cr); - - format %{ "esall $dst, $src, $shift\t# int (ndd)" %} - ins_encode %{ - __ esall($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct salI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftI (LoadI src) shift)); - effect(KILL cr); - - format %{ "esall $dst, $src, $shift\t# int (ndd)" %} - ins_encode %{ - __ esall($dst$$Register, $src$$Address, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (LShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "sall $dst, $shift" %} - ins_encode %{ - __ sall($dst$$Address, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Shift Left by variable -instruct salI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (LShiftI dst shift)); - effect(KILL cr); - - format %{ "sall $dst, $shift" %} - ins_encode %{ - __ sall($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Shift Left by variable -instruct salI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreI dst (LShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "sall $dst, $shift" %} - ins_encode %{ - __ sall($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct salI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (LShiftI src shift)); - - format %{ "shlxl $dst, $src, $shift" %} - ins_encode %{ - __ shlxl($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct salI_mem_rReg(rRegI dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (LShiftI (LoadI src) shift)); - ins_cost(175); - format %{ "shlxl $dst, $src, $shift" %} - ins_encode %{ - __ shlxl($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (RShiftI dst shift)); - effect(KILL cr); - - format %{ "sarl $dst, $shift" %} - ins_encode %{ - __ sarl($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (RShiftI src shift)); - effect(KILL cr); - - format %{ "esarl $dst, $src, $shift\t# int (ndd)" %} - ins_encode %{ - __ esarl($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct sarI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (RShiftI (LoadI src) shift)); - effect(KILL cr); - - format %{ "esarl $dst, $src, $shift\t# int (ndd)" %} - ins_encode %{ - __ esarl($dst$$Register, $src$$Address, $shift$$constant, false); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (RShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "sarl $dst, $shift" %} - ins_encode %{ - __ sarl($dst$$Address, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by variable -instruct sarI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (RShiftI dst shift)); - effect(KILL cr); - - format %{ "sarl $dst, $shift" %} - ins_encode %{ - __ sarl($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Arithmetic Shift Right by variable -instruct sarI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreI dst (RShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "sarl $dst, $shift" %} - ins_encode %{ - __ sarl($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct sarI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (RShiftI src shift)); - - format %{ "sarxl $dst, $src, $shift" %} - ins_encode %{ - __ sarxl($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct sarI_mem_rReg(rRegI dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (RShiftI (LoadI src) shift)); - ins_cost(175); - format %{ "sarxl $dst, $src, $shift" %} - ins_encode %{ - __ sarxl($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrI_rReg_imm(rRegI dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (URShiftI dst shift)); - effect(KILL cr); - - format %{ "shrl $dst, $shift" %} - ins_encode %{ - __ shrl($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrI_rReg_imm_ndd(rRegI dst, rRegI src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (URShiftI src shift)); - effect(KILL cr); - - format %{ "eshrl $dst, $src, $shift\t # int (ndd)" %} - ins_encode %{ - __ eshrl($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct shrI_rReg_mem_imm_ndd(rRegI dst, memory src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (URShiftI (LoadI src) shift)); - effect(KILL cr); - - format %{ "eshrl $dst, $src, $shift\t # int (ndd)" %} - ins_encode %{ - __ eshrl($dst$$Register, $src$$Address, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrI_mem_imm(memory dst, immI8 shift, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (URShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "shrl $dst, $shift" %} - ins_encode %{ - __ shrl($dst$$Address, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Logical Shift Right by variable -instruct shrI_rReg_CL(rRegI dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (URShiftI dst shift)); - effect(KILL cr); - - format %{ "shrl $dst, $shift" %} - ins_encode %{ - __ shrl($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Logical Shift Right by variable -instruct shrI_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreI dst (URShiftI (LoadI dst) shift))); - effect(KILL cr); - - format %{ "shrl $dst, $shift" %} - ins_encode %{ - __ shrl($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct shrI_rReg_rReg(rRegI dst, rRegI src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (URShiftI src shift)); - - format %{ "shrxl $dst, $src, $shift" %} - ins_encode %{ - __ shrxl($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct shrI_mem_rReg(rRegI dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (URShiftI (LoadI src) shift)); - ins_cost(175); - format %{ "shrxl $dst, $src, $shift" %} - ins_encode %{ - __ shrxl($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Long Shift Instructions -// Shift Left by one, two, three -instruct salL_rReg_immI2(rRegL dst, immI2 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (LShiftL dst shift)); - effect(KILL cr); - - format %{ "salq $dst, $shift" %} - ins_encode %{ - __ salq($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by one, two, three -instruct salL_rReg_immI2_ndd(rRegL dst, rRegL src, immI2 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftL src shift)); - effect(KILL cr); - - format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ esalq($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salL_rReg_imm(rRegL dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (LShiftL dst shift)); - effect(KILL cr); - - format %{ "salq $dst, $shift" %} - ins_encode %{ - __ salq($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salL_rReg_imm_ndd(rRegL dst, rRegL src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftL src shift)); - effect(KILL cr); - - format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ esalq($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct salL_rReg_mem_imm_ndd(rRegL dst, memory src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (LShiftL (LoadL src) shift)); - effect(KILL cr); - - format %{ "esalq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ esalq($dst$$Register, $src$$Address, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Shift Left by 8-bit immediate -instruct salL_mem_imm(memory dst, immI8 shift, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (LShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "salq $dst, $shift" %} - ins_encode %{ - __ salq($dst$$Address, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Shift Left by variable -instruct salL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (LShiftL dst shift)); - effect(KILL cr); - - format %{ "salq $dst, $shift" %} - ins_encode %{ - __ salq($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Shift Left by variable -instruct salL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreL dst (LShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "salq $dst, $shift" %} - ins_encode %{ - __ salq($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct salL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (LShiftL src shift)); - - format %{ "shlxq $dst, $src, $shift" %} - ins_encode %{ - __ shlxq($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct salL_mem_rReg(rRegL dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (LShiftL (LoadL src) shift)); - ins_cost(175); - format %{ "shlxq $dst, $src, $shift" %} - ins_encode %{ - __ shlxq($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarL_rReg_imm(rRegL dst, immI shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (RShiftL dst shift)); - effect(KILL cr); - - format %{ "sarq $dst, $shift" %} - ins_encode %{ - __ sarq($dst$$Register, (unsigned char)($shift$$constant & 0x3F)); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarL_rReg_imm_ndd(rRegL dst, rRegL src, immI shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (RShiftL src shift)); - effect(KILL cr); - - format %{ "esarq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ esarq($dst$$Register, $src$$Register, (unsigned char)($shift$$constant & 0x3F), false); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct sarL_rReg_mem_imm_ndd(rRegL dst, memory src, immI shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (RShiftL (LoadL src) shift)); - effect(KILL cr); - - format %{ "esarq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ esarq($dst$$Register, $src$$Address, (unsigned char)($shift$$constant & 0x3F), false); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by 8-bit immediate -instruct sarL_mem_imm(memory dst, immI shift, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (RShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "sarq $dst, $shift" %} - ins_encode %{ - __ sarq($dst$$Address, (unsigned char)($shift$$constant & 0x3F)); - %} - ins_pipe(ialu_mem_imm); -%} - -// Arithmetic Shift Right by variable -instruct sarL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (RShiftL dst shift)); - effect(KILL cr); - - format %{ "sarq $dst, $shift" %} - ins_encode %{ - __ sarq($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Arithmetic Shift Right by variable -instruct sarL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreL dst (RShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "sarq $dst, $shift" %} - ins_encode %{ - __ sarq($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct sarL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (RShiftL src shift)); - - format %{ "sarxq $dst, $src, $shift" %} - ins_encode %{ - __ sarxq($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct sarL_mem_rReg(rRegL dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (RShiftL (LoadL src) shift)); - ins_cost(175); - format %{ "sarxq $dst, $src, $shift" %} - ins_encode %{ - __ sarxq($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrL_rReg_imm(rRegL dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (URShiftL dst shift)); - effect(KILL cr); - - format %{ "shrq $dst, $shift" %} - ins_encode %{ - __ shrq($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrL_rReg_imm_ndd(rRegL dst, rRegL src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (URShiftL src shift)); - effect(KILL cr); - - format %{ "eshrq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ eshrq($dst$$Register, $src$$Register, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct shrL_rReg_mem_imm_ndd(rRegL dst, memory src, immI8 shift, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (URShiftL (LoadL src) shift)); - effect(KILL cr); - - format %{ "eshrq $dst, $src, $shift\t# long (ndd)" %} - ins_encode %{ - __ eshrq($dst$$Register, $src$$Address, $shift$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Logical Shift Right by 8-bit immediate -instruct shrL_mem_imm(memory dst, immI8 shift, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (URShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "shrq $dst, $shift" %} - ins_encode %{ - __ shrq($dst$$Address, $shift$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Logical Shift Right by variable -instruct shrL_rReg_CL(rRegL dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (URShiftL dst shift)); - effect(KILL cr); - - format %{ "shrq $dst, $shift" %} - ins_encode %{ - __ shrq($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Logical Shift Right by variable -instruct shrL_mem_CL(memory dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2()); - match(Set dst (StoreL dst (URShiftL (LoadL dst) shift))); - effect(KILL cr); - - format %{ "shrq $dst, $shift" %} - ins_encode %{ - __ shrq($dst$$Address); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct shrL_rReg_rReg(rRegL dst, rRegL src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (URShiftL src shift)); - - format %{ "shrxq $dst, $src, $shift" %} - ins_encode %{ - __ shrxq($dst$$Register, $src$$Register, $shift$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct shrL_mem_rReg(rRegL dst, memory src, rRegI shift) -%{ - predicate(VM_Version::supports_bmi2()); - match(Set dst (URShiftL (LoadL src) shift)); - ins_cost(175); - format %{ "shrxq $dst, $src, $shift" %} - ins_encode %{ - __ shrxq($dst$$Register, $src$$Address, $shift$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -// Logical Shift Right by 24, followed by Arithmetic Shift Left by 24. -// This idiom is used by the compiler for the i2b bytecode. -instruct i2b(rRegI dst, rRegI src, immI_24 twentyfour) -%{ - match(Set dst (RShiftI (LShiftI src twentyfour) twentyfour)); - - format %{ "movsbl $dst, $src\t# i2b" %} - ins_encode %{ - __ movsbl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Logical Shift Right by 16, followed by Arithmetic Shift Left by 16. -// This idiom is used by the compiler the i2s bytecode. -instruct i2s(rRegI dst, rRegI src, immI_16 sixteen) -%{ - match(Set dst (RShiftI (LShiftI src sixteen) sixteen)); - - format %{ "movswl $dst, $src\t# i2s" %} - ins_encode %{ - __ movswl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// ROL/ROR instructions - -// Rotate left by constant. -instruct rolI_immI8_legacy(rRegI dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateLeft dst shift)); - effect(KILL cr); - format %{ "roll $dst, $shift" %} - ins_encode %{ - __ roll($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct rolI_immI8(rRegI dst, rRegI src, immI8 shift) -%{ - predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateLeft src shift)); - format %{ "rolxl $dst, $src, $shift" %} - ins_encode %{ - int shift = 32 - ($shift$$constant & 31); - __ rorxl($dst$$Register, $src$$Register, shift); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct rolI_mem_immI8(rRegI dst, memory src, immI8 shift) -%{ - predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateLeft (LoadI src) shift)); - ins_cost(175); - format %{ "rolxl $dst, $src, $shift" %} - ins_encode %{ - int shift = 32 - ($shift$$constant & 31); - __ rorxl($dst$$Register, $src$$Address, shift); - %} - ins_pipe(ialu_reg_mem); -%} - -// Rotate Left by variable -instruct rolI_rReg_Var(rRegI dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!UseAPX && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateLeft dst shift)); - effect(KILL cr); - format %{ "roll $dst, $shift" %} - ins_encode %{ - __ roll($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Left by variable -instruct rolI_rReg_Var_ndd(rRegI dst, rRegI src, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(UseAPX && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateLeft src shift)); - effect(KILL cr); - - format %{ "eroll $dst, $src, $shift\t# rotate left (int ndd)" %} - ins_encode %{ - __ eroll($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Right by constant. -instruct rorI_immI8_legacy(rRegI dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateRight dst shift)); - effect(KILL cr); - format %{ "rorl $dst, $shift" %} - ins_encode %{ - __ rorl($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Rotate Right by constant. -instruct rorI_immI8(rRegI dst, rRegI src, immI8 shift) -%{ - predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateRight src shift)); - format %{ "rorxl $dst, $src, $shift" %} - ins_encode %{ - __ rorxl($dst$$Register, $src$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct rorI_mem_immI8(rRegI dst, memory src, immI8 shift) -%{ - predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateRight (LoadI src) shift)); - ins_cost(175); - format %{ "rorxl $dst, $src, $shift" %} - ins_encode %{ - __ rorxl($dst$$Register, $src$$Address, $shift$$constant); - %} - ins_pipe(ialu_reg_mem); -%} - -// Rotate Right by variable -instruct rorI_rReg_Var(rRegI dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!UseAPX && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateRight dst shift)); - effect(KILL cr); - format %{ "rorl $dst, $shift" %} - ins_encode %{ - __ rorl($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Right by variable -instruct rorI_rReg_Var_ndd(rRegI dst, rRegI src, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(UseAPX && n->bottom_type()->basic_type() == T_INT); - match(Set dst (RotateRight src shift)); - effect(KILL cr); - - format %{ "erorl $dst, $src, $shift\t# rotate right(int ndd)" %} - ins_encode %{ - __ erorl($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Left by constant. -instruct rolL_immI8_legacy(rRegL dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateLeft dst shift)); - effect(KILL cr); - format %{ "rolq $dst, $shift" %} - ins_encode %{ - __ rolq($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct rolL_immI8(rRegL dst, rRegL src, immI8 shift) -%{ - predicate(!UseAPX && VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateLeft src shift)); - format %{ "rolxq $dst, $src, $shift" %} - ins_encode %{ - int shift = 64 - ($shift$$constant & 63); - __ rorxq($dst$$Register, $src$$Register, shift); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct rolL_mem_immI8(rRegL dst, memory src, immI8 shift) -%{ - predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateLeft (LoadL src) shift)); - ins_cost(175); - format %{ "rolxq $dst, $src, $shift" %} - ins_encode %{ - int shift = 64 - ($shift$$constant & 63); - __ rorxq($dst$$Register, $src$$Address, shift); - %} - ins_pipe(ialu_reg_mem); -%} - -// Rotate Left by variable -instruct rolL_rReg_Var(rRegL dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!UseAPX && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateLeft dst shift)); - effect(KILL cr); - format %{ "rolq $dst, $shift" %} - ins_encode %{ - __ rolq($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Left by variable -instruct rolL_rReg_Var_ndd(rRegL dst, rRegL src, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(UseAPX && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateLeft src shift)); - effect(KILL cr); - - format %{ "erolq $dst, $src, $shift\t# rotate left(long ndd)" %} - ins_encode %{ - __ erolq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Right by constant. -instruct rorL_immI8_legacy(rRegL dst, immI8 shift, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateRight dst shift)); - effect(KILL cr); - format %{ "rorq $dst, $shift" %} - ins_encode %{ - __ rorq($dst$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg); -%} - -// Rotate Right by constant -instruct rorL_immI8(rRegL dst, rRegL src, immI8 shift) -%{ - predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateRight src shift)); - format %{ "rorxq $dst, $src, $shift" %} - ins_encode %{ - __ rorxq($dst$$Register, $src$$Register, $shift$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct rorL_mem_immI8(rRegL dst, memory src, immI8 shift) -%{ - predicate(VM_Version::supports_bmi2() && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateRight (LoadL src) shift)); - ins_cost(175); - format %{ "rorxq $dst, $src, $shift" %} - ins_encode %{ - __ rorxq($dst$$Register, $src$$Address, $shift$$constant); - %} - ins_pipe(ialu_reg_mem); -%} - -// Rotate Right by variable -instruct rorL_rReg_Var(rRegL dst, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(!UseAPX && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateRight dst shift)); - effect(KILL cr); - format %{ "rorq $dst, $shift" %} - ins_encode %{ - __ rorq($dst$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Rotate Right by variable -instruct rorL_rReg_Var_ndd(rRegL dst, rRegL src, rcx_RegI shift, rFlagsReg cr) -%{ - predicate(UseAPX && n->bottom_type()->basic_type() == T_LONG); - match(Set dst (RotateRight src shift)); - effect(KILL cr); - - format %{ "erorq $dst, $src, $shift\t# rotate right(long ndd)" %} - ins_encode %{ - __ erorq($dst$$Register, $src$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -//----------------------------- CompressBits/ExpandBits ------------------------ - -instruct compressBitsL_reg(rRegL dst, rRegL src, rRegL mask) %{ - predicate(n->bottom_type()->isa_long()); - match(Set dst (CompressBits src mask)); - format %{ "pextq $dst, $src, $mask\t! parallel bit extract" %} - ins_encode %{ - __ pextq($dst$$Register, $src$$Register, $mask$$Register); - %} - ins_pipe( pipe_slow ); -%} - -instruct expandBitsL_reg(rRegL dst, rRegL src, rRegL mask) %{ - predicate(n->bottom_type()->isa_long()); - match(Set dst (ExpandBits src mask)); - format %{ "pdepq $dst, $src, $mask\t! parallel bit deposit" %} - ins_encode %{ - __ pdepq($dst$$Register, $src$$Register, $mask$$Register); - %} - ins_pipe( pipe_slow ); -%} - -instruct compressBitsL_mem(rRegL dst, rRegL src, memory mask) %{ - predicate(n->bottom_type()->isa_long()); - match(Set dst (CompressBits src (LoadL mask))); - format %{ "pextq $dst, $src, $mask\t! parallel bit extract" %} - ins_encode %{ - __ pextq($dst$$Register, $src$$Register, $mask$$Address); - %} - ins_pipe( pipe_slow ); -%} - -instruct expandBitsL_mem(rRegL dst, rRegL src, memory mask) %{ - predicate(n->bottom_type()->isa_long()); - match(Set dst (ExpandBits src (LoadL mask))); - format %{ "pdepq $dst, $src, $mask\t! parallel bit deposit" %} - ins_encode %{ - __ pdepq($dst$$Register, $src$$Register, $mask$$Address); - %} - ins_pipe( pipe_slow ); -%} - - -// Logical Instructions - -// Integer Logical Instructions - -// And Instructions -// And Register with Register -instruct andI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andl $dst, $src\t# int" %} - ins_encode %{ - __ andl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// And Register with Register using New Data Destination (NDD) -instruct andI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eandl($dst$$Register, $src1$$Register, $src2$$Register, false); - - %} - ins_pipe(ialu_reg_reg); -%} - -// And Register with Immediate 255 -instruct andI_rReg_imm255(rRegI dst, rRegI src, immI_255 mask) -%{ - match(Set dst (AndI src mask)); - - format %{ "movzbl $dst, $src\t# int & 0xFF" %} - ins_encode %{ - __ movzbl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Immediate 255 and promote to long -instruct andI2L_rReg_imm255(rRegL dst, rRegI src, immI_255 mask) -%{ - match(Set dst (ConvI2L (AndI src mask))); - - format %{ "movzbl $dst, $src\t# int & 0xFF -> long" %} - ins_encode %{ - __ movzbl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Immediate 65535 -instruct andI_rReg_imm65535(rRegI dst, rRegI src, immI_65535 mask) -%{ - match(Set dst (AndI src mask)); - - format %{ "movzwl $dst, $src\t# int & 0xFFFF" %} - ins_encode %{ - __ movzwl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Immediate 65535 and promote to long -instruct andI2L_rReg_imm65535(rRegL dst, rRegI src, immI_65535 mask) -%{ - match(Set dst (ConvI2L (AndI src mask))); - - format %{ "movzwl $dst, $src\t# int & 0xFFFF -> long" %} - ins_encode %{ - __ movzwl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// Can skip int2long conversions after AND with small bitmask -instruct convI2LAndI_reg_immIbitmask(rRegL dst, rRegI src, immI_Pow2M1 mask, rRegI tmp, rFlagsReg cr) -%{ - predicate(VM_Version::supports_bmi2()); - ins_cost(125); - effect(TEMP tmp, KILL cr); - match(Set dst (ConvI2L (AndI src mask))); - format %{ "bzhiq $dst, $src, $mask \t# using $tmp as TEMP, int & immI_Pow2M1 -> long" %} - ins_encode %{ - __ movl($tmp$$Register, exact_log2($mask$$constant + 1)); - __ bzhiq($dst$$Register, $src$$Register, $tmp$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// And Register with Immediate -instruct andI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andl $dst, $src\t# int" %} - ins_encode %{ - __ andl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct andI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eandl($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct andI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndI (LoadI src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eandl($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Memory -instruct andI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndI dst (LoadI src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "andl $dst, $src\t# int" %} - ins_encode %{ - __ andl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct andI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndI src1 (LoadI src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "eandl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eandl($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// And Memory with Register -instruct andB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreB dst (AndI (LoadB dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "andb $dst, $src\t# byte" %} - ins_encode %{ - __ andb($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct andI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (AndI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "andl $dst, $src\t# int" %} - ins_encode %{ - __ andl($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// And Memory with Immediate -instruct andI_mem_imm(memory dst, immI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (AndI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "andl $dst, $src\t# int" %} - ins_encode %{ - __ andl($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// BMI1 instructions -instruct andnI_rReg_rReg_mem(rRegI dst, rRegI src1, memory src2, immI_M1 minus_1, rFlagsReg cr) %{ - match(Set dst (AndI (XorI src1 minus_1) (LoadI src2))); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "andnl $dst, $src1, $src2" %} - - ins_encode %{ - __ andnl($dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct andnI_rReg_rReg_rReg(rRegI dst, rRegI src1, rRegI src2, immI_M1 minus_1, rFlagsReg cr) %{ - match(Set dst (AndI (XorI src1 minus_1) src2)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andnl $dst, $src1, $src2" %} - - ins_encode %{ - __ andnl($dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct blsiI_rReg_rReg(rRegI dst, rRegI src, immI_0 imm_zero, rFlagsReg cr) %{ - match(Set dst (AndI (SubI imm_zero src) src)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsil $dst, $src" %} - - ins_encode %{ - __ blsil($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct blsiI_rReg_mem(rRegI dst, memory src, immI_0 imm_zero, rFlagsReg cr) %{ - match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) )); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsil $dst, $src" %} - - ins_encode %{ - __ blsil($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct blsmskI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsmskl $dst, $src" %} - - ins_encode %{ - __ blsmskl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct blsmskI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (XorI (AddI src minus_1) src)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsmskl $dst, $src" %} - - ins_encode %{ - __ blsmskl($dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg); -%} - -instruct blsrI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (AndI (AddI src minus_1) src) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsrl $dst, $src" %} - - ins_encode %{ - __ blsrl($dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg_mem); -%} - -instruct blsrI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsrl $dst, $src" %} - - ins_encode %{ - __ blsrl($dst$$Register, $src$$Address); - %} - - ins_pipe(ialu_reg); -%} - -// Or Instructions -// Or Register with Register -instruct orI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "orl $dst, $src\t# int" %} - ins_encode %{ - __ orl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Or Register with Register using New Data Destination (NDD) -instruct orI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eorl($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Or Register with Immediate -instruct orI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "orl $dst, $src\t# int" %} - ins_encode %{ - __ orl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct orI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eorl($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct orI_rReg_imm_rReg_ndd(rRegI dst, immI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorl $dst, $src2, $src1\t# int ndd" %} - ins_encode %{ - __ eorl($dst$$Register, $src2$$Register, $src1$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct orI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrI (LoadI src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eorl($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Or Register with Memory -instruct orI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrI dst (LoadI src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "orl $dst, $src\t# int" %} - ins_encode %{ - __ orl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct orI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrI src1 (LoadI src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "eorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ eorl($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// Or Memory with Register -instruct orB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreB dst (OrI (LoadB dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "orb $dst, $src\t# byte" %} - ins_encode %{ - __ orb($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct orI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (OrI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "orl $dst, $src\t# int" %} - ins_encode %{ - __ orl($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Or Memory with Immediate -instruct orI_mem_imm(memory dst, immI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (OrI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "orl $dst, $src\t# int" %} - ins_encode %{ - __ orl($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -// Xor Instructions -// Xor Register with Register -instruct xorI_rReg(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (XorI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "xorl $dst, $src\t# int" %} - ins_encode %{ - __ xorl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Xor Register with Register using New Data Destination (NDD) -instruct xorI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "exorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ exorl($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Xor Register with Immediate -1 -instruct xorI_rReg_im1(rRegI dst, immI_M1 imm) -%{ - predicate(!UseAPX); - match(Set dst (XorI dst imm)); - - format %{ "notl $dst" %} - ins_encode %{ - __ notl($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct xorI_rReg_im1_ndd(rRegI dst, rRegI src, immI_M1 imm) -%{ - match(Set dst (XorI src imm)); - predicate(UseAPX); - - format %{ "enotl $dst, $src" %} - ins_encode %{ - __ enotl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// Xor Register with Immediate -instruct xorI_rReg_imm(rRegI dst, immI src, rFlagsReg cr) -%{ - // Strict predicate check to make selection of xorI_rReg_im1 cost agnostic if immI src is -1. - predicate(!UseAPX && n->in(2)->bottom_type()->is_int()->get_con() != -1); - match(Set dst (XorI dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "xorl $dst, $src\t# int" %} - ins_encode %{ - __ xorl($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct xorI_rReg_rReg_imm_ndd(rRegI dst, rRegI src1, immI src2, rFlagsReg cr) -%{ - // Strict predicate check to make selection of xorI_rReg_im1_ndd cost agnostic if immI src2 is -1. - predicate(UseAPX && n->in(2)->bottom_type()->is_int()->get_con() != -1); - match(Set dst (XorI src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "exorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ exorl($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Xor Memory with Immediate -instruct xorI_rReg_mem_imm_ndd(rRegI dst, memory src1, immI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorI (LoadI src1) src2)); - effect(KILL cr); - ins_cost(150); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "exorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ exorl($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Xor Register with Memory -instruct xorI_rReg_mem(rRegI dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (XorI dst (LoadI src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "xorl $dst, $src\t# int" %} - ins_encode %{ - __ xorl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct xorI_rReg_rReg_mem_ndd(rRegI dst, rRegI src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorI src1 (LoadI src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "exorl $dst, $src1, $src2\t# int ndd" %} - ins_encode %{ - __ exorl($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// Xor Memory with Register -instruct xorB_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreB dst (XorI (LoadB dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "xorb $dst, $src\t# byte" %} - ins_encode %{ - __ xorb($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct xorI_mem_rReg(memory dst, rRegI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (XorI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "xorl $dst, $src\t# int" %} - ins_encode %{ - __ xorl($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Xor Memory with Immediate -instruct xorI_mem_imm(memory dst, immI src, rFlagsReg cr) -%{ - match(Set dst (StoreI dst (XorI (LoadI dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "xorl $dst, $src\t# int" %} - ins_encode %{ - __ xorl($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - - -// Long Logical Instructions - -// And Instructions -// And Register with Register -instruct andL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andq $dst, $src\t# long" %} - ins_encode %{ - __ andq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// And Register with Register using New Data Destination (NDD) -instruct andL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eandq($dst$$Register, $src1$$Register, $src2$$Register, false); - - %} - ins_pipe(ialu_reg_reg); -%} - -// And Register with Immediate 255 -instruct andL_rReg_imm255(rRegL dst, rRegL src, immL_255 mask) -%{ - match(Set dst (AndL src mask)); - - format %{ "movzbl $dst, $src\t# long & 0xFF" %} - ins_encode %{ - // movzbl zeroes out the upper 32-bit and does not need REX.W - __ movzbl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Immediate 65535 -instruct andL_rReg_imm65535(rRegL dst, rRegL src, immL_65535 mask) -%{ - match(Set dst (AndL src mask)); - - format %{ "movzwl $dst, $src\t# long & 0xFFFF" %} - ins_encode %{ - // movzwl zeroes out the upper 32-bit and does not need REX.W - __ movzwl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Immediate -instruct andL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andq $dst, $src\t# long" %} - ins_encode %{ - __ andq($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct andL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eandq($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct andL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eandq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eandq($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// And Register with Memory -instruct andL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (AndL dst (LoadL src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "andq $dst, $src\t# long" %} - ins_encode %{ - __ andq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct andL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (AndL src1 (LoadL src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "eandq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eandq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// And Memory with Register -instruct andL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (AndL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "andq $dst, $src\t# long" %} - ins_encode %{ - __ andq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// And Memory with Immediate -instruct andL_mem_imm(memory dst, immL32 src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (AndL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "andq $dst, $src\t# long" %} - ins_encode %{ - __ andq($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct btrL_mem_imm(memory dst, immL_NotPow2 con, rFlagsReg cr) -%{ - // con should be a pure 64-bit immediate given that not(con) is a power of 2 - // because AND/OR works well enough for 8/32-bit values. - predicate(log2i_graceful(~n->in(3)->in(2)->get_long()) > 30); - - match(Set dst (StoreL dst (AndL (LoadL dst) con))); - effect(KILL cr); - - ins_cost(125); - format %{ "btrq $dst, log2(not($con))\t# long" %} - ins_encode %{ - __ btrq($dst$$Address, log2i_exact((julong)~$con$$constant)); - %} - ins_pipe(ialu_mem_imm); -%} - -// BMI1 instructions -instruct andnL_rReg_rReg_mem(rRegL dst, rRegL src1, memory src2, immL_M1 minus_1, rFlagsReg cr) %{ - match(Set dst (AndL (XorL src1 minus_1) (LoadL src2))); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "andnq $dst, $src1, $src2" %} - - ins_encode %{ - __ andnq($dst$$Register, $src1$$Register, $src2$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct andnL_rReg_rReg_rReg(rRegL dst, rRegL src1, rRegL src2, immL_M1 minus_1, rFlagsReg cr) %{ - match(Set dst (AndL (XorL src1 minus_1) src2)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "andnq $dst, $src1, $src2" %} - - ins_encode %{ - __ andnq($dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct blsiL_rReg_rReg(rRegL dst, rRegL src, immL0 imm_zero, rFlagsReg cr) %{ - match(Set dst (AndL (SubL imm_zero src) src)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsiq $dst, $src" %} - - ins_encode %{ - __ blsiq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct blsiL_rReg_mem(rRegL dst, memory src, immL0 imm_zero, rFlagsReg cr) %{ - match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) )); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsiq $dst, $src" %} - - ins_encode %{ - __ blsiq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct blsmskL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsmskq $dst, $src" %} - - ins_encode %{ - __ blsmskq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct blsmskL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (XorL (AddL src minus_1) src)); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_clears_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsmskq $dst, $src" %} - - ins_encode %{ - __ blsmskq($dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg); -%} - -instruct blsrL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (AndL (AddL src minus_1) src) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - format %{ "blsrq $dst, $src" %} - - ins_encode %{ - __ blsrq($dst$$Register, $src$$Register); - %} - - ins_pipe(ialu_reg); -%} - -instruct blsrL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) -%{ - match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src)) ); - predicate(UseBMI1Instructions); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_clears_overflow_flag); - - ins_cost(125); - format %{ "blsrq $dst, $src" %} - - ins_encode %{ - __ blsrq($dst$$Register, $src$$Address); - %} - - ins_pipe(ialu_reg); -%} - -// Or Instructions -// Or Register with Register -instruct orL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Or Register with Register using New Data Destination (NDD) -instruct orL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src1$$Register, $src2$$Register, false); - - %} - ins_pipe(ialu_reg_reg); -%} - -// Use any_RegP to match R15 (TLS register) without spilling. -instruct orL_rReg_castP2X(rRegL dst, any_RegP src, rFlagsReg cr) %{ - match(Set dst (OrL dst (CastP2X src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct orL_rReg_castP2X_ndd(rRegL dst, any_RegP src1, any_RegP src2, rFlagsReg cr) %{ - match(Set dst (OrL src1 (CastP2X src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Or Register with Immediate -instruct orL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct orL_rReg_rReg_imm_ndd(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -instruct orL_rReg_imm_rReg_ndd(rRegL dst, immL32 src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorq $dst, $src2, $src1\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src2$$Register, $src1$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Or Memory with Immediate -instruct orL_rReg_mem_imm_ndd(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "eorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Or Register with Memory -instruct orL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (OrL dst (LoadL src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct orL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (OrL src1 (LoadL src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "eorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ eorq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// Or Memory with Register -instruct orL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (OrL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Or Memory with Immediate -instruct orL_mem_imm(memory dst, immL32 src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (OrL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "orq $dst, $src\t# long" %} - ins_encode %{ - __ orq($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct btsL_mem_imm(memory dst, immL_Pow2 con, rFlagsReg cr) -%{ - // con should be a pure 64-bit power of 2 immediate - // because AND/OR works well enough for 8/32-bit values. - predicate(log2i_graceful(n->in(3)->in(2)->get_long()) > 31); - - match(Set dst (StoreL dst (OrL (LoadL dst) con))); - effect(KILL cr); - - ins_cost(125); - format %{ "btsq $dst, log2($con)\t# long" %} - ins_encode %{ - __ btsq($dst$$Address, log2i_exact((julong)$con$$constant)); - %} - ins_pipe(ialu_mem_imm); -%} - -// Xor Instructions -// Xor Register with Register -instruct xorL_rReg(rRegL dst, rRegL src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (XorL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "xorq $dst, $src\t# long" %} - ins_encode %{ - __ xorq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Xor Register with Register using New Data Destination (NDD) -instruct xorL_rReg_ndd(rRegL dst, rRegL src1, rRegL src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "exorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ exorq($dst$$Register, $src1$$Register, $src2$$Register, false); - %} - ins_pipe(ialu_reg_reg); -%} - -// Xor Register with Immediate -1 -instruct xorL_rReg_im1(rRegL dst, immL_M1 imm) -%{ - predicate(!UseAPX); - match(Set dst (XorL dst imm)); - - format %{ "notq $dst" %} - ins_encode %{ - __ notq($dst$$Register); - %} - ins_pipe(ialu_reg); -%} - -instruct xorL_rReg_im1_ndd(rRegL dst,rRegL src, immL_M1 imm) -%{ - predicate(UseAPX); - match(Set dst (XorL src imm)); - - format %{ "enotq $dst, $src" %} - ins_encode %{ - __ enotq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg); -%} - -// Xor Register with Immediate -instruct xorL_rReg_imm(rRegL dst, immL32 src, rFlagsReg cr) -%{ - // Strict predicate check to make selection of xorL_rReg_im1 cost agnostic if immL32 src is -1. - predicate(!UseAPX && n->in(2)->bottom_type()->is_long()->get_con() != -1L); - match(Set dst (XorL dst src)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "xorq $dst, $src\t# long" %} - ins_encode %{ - __ xorq($dst$$Register, $src$$constant); - %} - ins_pipe(ialu_reg); -%} - -instruct xorL_rReg_rReg_imm(rRegL dst, rRegL src1, immL32 src2, rFlagsReg cr) -%{ - // Strict predicate check to make selection of xorL_rReg_im1_ndd cost agnostic if immL32 src2 is -1. - predicate(UseAPX && n->in(2)->bottom_type()->is_long()->get_con() != -1L); - match(Set dst (XorL src1 src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - format %{ "exorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ exorq($dst$$Register, $src1$$Register, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Xor Memory with Immediate -instruct xorL_rReg_mem_imm(rRegL dst, memory src1, immL32 src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorL (LoadL src1) src2)); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - ins_cost(150); - - format %{ "exorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ exorq($dst$$Register, $src1$$Address, $src2$$constant, false); - %} - ins_pipe(ialu_reg); -%} - -// Xor Register with Memory -instruct xorL_rReg_mem(rRegL dst, memory src, rFlagsReg cr) -%{ - predicate(!UseAPX); - match(Set dst (XorL dst (LoadL src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "xorq $dst, $src\t# long" %} - ins_encode %{ - __ xorq($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct xorL_rReg_rReg_mem_ndd(rRegL dst, rRegL src1, memory src2, rFlagsReg cr) -%{ - predicate(UseAPX); - match(Set dst (XorL src1 (LoadL src2))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "exorq $dst, $src1, $src2\t# long ndd" %} - ins_encode %{ - __ exorq($dst$$Register, $src1$$Register, $src2$$Address, false); - %} - ins_pipe(ialu_reg_mem); -%} - -// Xor Memory with Register -instruct xorL_mem_rReg(memory dst, rRegL src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (XorL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(150); - format %{ "xorq $dst, $src\t# long" %} - ins_encode %{ - __ xorq($dst$$Address, $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -// Xor Memory with Immediate -instruct xorL_mem_imm(memory dst, immL32 src, rFlagsReg cr) -%{ - match(Set dst (StoreL dst (XorL (LoadL dst) src))); - effect(KILL cr); - flag(PD::Flag_sets_sign_flag, PD::Flag_sets_zero_flag, PD::Flag_sets_parity_flag, PD::Flag_clears_overflow_flag, PD::Flag_clears_carry_flag); - - ins_cost(125); - format %{ "xorq $dst, $src\t# long" %} - ins_encode %{ - __ xorq($dst$$Address, $src$$constant); - %} - ins_pipe(ialu_mem_imm); -%} - -instruct cmpLTMask(rRegI dst, rRegI p, rRegI q, rFlagsReg cr) -%{ - match(Set dst (CmpLTMask p q)); - effect(KILL cr); - - ins_cost(400); - format %{ "cmpl $p, $q\t# cmpLTMask\n\t" - "setcc $dst \t# emits setlt + movzbl or setzul for APX" - "negl $dst" %} - ins_encode %{ - __ cmpl($p$$Register, $q$$Register); - __ setcc(Assembler::less, $dst$$Register); - __ negl($dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpLTMask0(rRegI dst, immI_0 zero, rFlagsReg cr) -%{ - match(Set dst (CmpLTMask dst zero)); - effect(KILL cr); - - ins_cost(100); - format %{ "sarl $dst, #31\t# cmpLTMask0" %} - ins_encode %{ - __ sarl($dst$$Register, 31); - %} - ins_pipe(ialu_reg); -%} - -/* Better to save a register than avoid a branch */ -instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr) -%{ - match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q))); - effect(KILL cr); - ins_cost(300); - format %{ "subl $p,$q\t# cadd_cmpLTMask\n\t" - "jge done\n\t" - "addl $p,$y\n" - "done: " %} - ins_encode %{ - Register Rp = $p$$Register; - Register Rq = $q$$Register; - Register Ry = $y$$Register; - Label done; - __ subl(Rp, Rq); - __ jccb(Assembler::greaterEqual, done); - __ addl(Rp, Ry); - __ bind(done); - %} - ins_pipe(pipe_cmplt); -%} - -/* Better to save a register than avoid a branch */ -instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr) -%{ - match(Set y (AndI (CmpLTMask p q) y)); - effect(KILL cr); - - ins_cost(300); - - format %{ "cmpl $p, $q\t# and_cmpLTMask\n\t" - "jlt done\n\t" - "xorl $y, $y\n" - "done: " %} - ins_encode %{ - Register Rp = $p$$Register; - Register Rq = $q$$Register; - Register Ry = $y$$Register; - Label done; - __ cmpl(Rp, Rq); - __ jccb(Assembler::less, done); - __ xorl(Ry, Ry); - __ bind(done); - %} - ins_pipe(pipe_cmplt); -%} - - -//---------- FP Instructions------------------------------------------------ - -// Really expensive, avoid -instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2) -%{ - match(Set cr (CmpF src1 src2)); - - ins_cost(500); - format %{ "ucomiss $src1, $src2\n\t" - "jnp,s exit\n\t" - "pushfq\t# saw NaN, set CF\n\t" - "andq [rsp], #0xffffff2b\n\t" - "popfq\n" - "exit:" %} - ins_encode %{ - __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); - emit_cmpfp_fixup(masm); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpF_cc_reg_CF(rFlagsRegUCF cr, regF src1, regF src2) %{ - match(Set cr (CmpF src1 src2)); - - ins_cost(100); - format %{ "ucomiss $src1, $src2" %} - ins_encode %{ - __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpF_cc_memCF(rFlagsRegUCF cr, regF src1, memory src2) %{ - match(Set cr (CmpF src1 (LoadF src2))); - - ins_cost(100); - format %{ "ucomiss $src1, $src2" %} - ins_encode %{ - __ ucomiss($src1$$XMMRegister, $src2$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpF_cc_immCF(rFlagsRegUCF cr, regF src, immF con) %{ - match(Set cr (CmpF src con)); - ins_cost(100); - format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con" %} - ins_encode %{ - __ ucomiss($src$$XMMRegister, $constantaddress($con)); - %} - ins_pipe(pipe_slow); -%} - -// Really expensive, avoid -instruct cmpD_cc_reg(rFlagsRegU cr, regD src1, regD src2) -%{ - match(Set cr (CmpD src1 src2)); - - ins_cost(500); - format %{ "ucomisd $src1, $src2\n\t" - "jnp,s exit\n\t" - "pushfq\t# saw NaN, set CF\n\t" - "andq [rsp], #0xffffff2b\n\t" - "popfq\n" - "exit:" %} - ins_encode %{ - __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); - emit_cmpfp_fixup(masm); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpD_cc_reg_CF(rFlagsRegUCF cr, regD src1, regD src2) %{ - match(Set cr (CmpD src1 src2)); - - ins_cost(100); - format %{ "ucomisd $src1, $src2 test" %} - ins_encode %{ - __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpD_cc_memCF(rFlagsRegUCF cr, regD src1, memory src2) %{ - match(Set cr (CmpD src1 (LoadD src2))); - - ins_cost(100); - format %{ "ucomisd $src1, $src2" %} - ins_encode %{ - __ ucomisd($src1$$XMMRegister, $src2$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpD_cc_immCF(rFlagsRegUCF cr, regD src, immD con) %{ - match(Set cr (CmpD src con)); - ins_cost(100); - format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con" %} - ins_encode %{ - __ ucomisd($src$$XMMRegister, $constantaddress($con)); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpF_reg(rRegI dst, regF src1, regF src2, rFlagsReg cr) -%{ - match(Set dst (CmpF3 src1 src2)); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomiss $src1, $src2\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomiss($src1$$XMMRegister, $src2$$XMMRegister); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpF_mem(rRegI dst, regF src1, memory src2, rFlagsReg cr) -%{ - match(Set dst (CmpF3 src1 (LoadF src2))); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomiss $src1, $src2\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomiss($src1$$XMMRegister, $src2$$Address); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpF_imm(rRegI dst, regF src, immF con, rFlagsReg cr) %{ - match(Set dst (CmpF3 src con)); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomiss $src, [$constantaddress]\t# load from constant table: float=$con\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomiss($src$$XMMRegister, $constantaddress($con)); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpD_reg(rRegI dst, regD src1, regD src2, rFlagsReg cr) -%{ - match(Set dst (CmpD3 src1 src2)); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomisd $src1, $src2\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomisd($src1$$XMMRegister, $src2$$XMMRegister); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpD_mem(rRegI dst, regD src1, memory src2, rFlagsReg cr) -%{ - match(Set dst (CmpD3 src1 (LoadD src2))); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomisd $src1, $src2\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomisd($src1$$XMMRegister, $src2$$Address); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -// Compare into -1,0,1 -instruct cmpD_imm(rRegI dst, regD src, immD con, rFlagsReg cr) %{ - match(Set dst (CmpD3 src con)); - effect(KILL cr); - - ins_cost(275); - format %{ "ucomisd $src, [$constantaddress]\t# load from constant table: double=$con\n\t" - "movl $dst, #-1\n\t" - "jp,s done\n\t" - "jb,s done\n\t" - "setne $dst\n\t" - "movzbl $dst, $dst\n" - "done:" %} - ins_encode %{ - __ ucomisd($src$$XMMRegister, $constantaddress($con)); - emit_cmpfp3(masm, $dst$$Register); - %} - ins_pipe(pipe_slow); -%} - -//----------Arithmetic Conversion Instructions--------------------------------- - -instruct convF2D_reg_reg(regD dst, regF src) -%{ - match(Set dst (ConvF2D src)); - - format %{ "cvtss2sd $dst, $src" %} - ins_encode %{ - __ cvtss2sd ($dst$$XMMRegister, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convF2D_reg_mem(regD dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvF2D (LoadF src))); - - format %{ "cvtss2sd $dst, $src" %} - ins_encode %{ - __ cvtss2sd ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convD2F_reg_reg(regF dst, regD src) -%{ - match(Set dst (ConvD2F src)); - - format %{ "cvtsd2ss $dst, $src" %} - ins_encode %{ - __ cvtsd2ss ($dst$$XMMRegister, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convD2F_reg_mem(regF dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvD2F (LoadD src))); - - format %{ "cvtsd2ss $dst, $src" %} - ins_encode %{ - __ cvtsd2ss ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -// XXX do mem variants -instruct convF2I_reg_reg(rRegI dst, regF src, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx10_2()); - match(Set dst (ConvF2I src)); - effect(KILL cr); - format %{ "convert_f2i $dst, $src" %} - ins_encode %{ - __ convertF2I(T_INT, T_FLOAT, $dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convF2I_reg_reg_avx10(rRegI dst, regF src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvF2I src)); - format %{ "evcvttss2sisl $dst, $src" %} - ins_encode %{ - __ evcvttss2sisl($dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convF2I_reg_mem_avx10(rRegI dst, memory src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvF2I (LoadF src))); - format %{ "evcvttss2sisl $dst, $src" %} - ins_encode %{ - __ evcvttss2sisl($dst$$Register, $src$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct convF2L_reg_reg(rRegL dst, regF src, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx10_2()); - match(Set dst (ConvF2L src)); - effect(KILL cr); - format %{ "convert_f2l $dst, $src"%} - ins_encode %{ - __ convertF2I(T_LONG, T_FLOAT, $dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convF2L_reg_reg_avx10(rRegL dst, regF src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvF2L src)); - format %{ "evcvttss2sisq $dst, $src" %} - ins_encode %{ - __ evcvttss2sisq($dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convF2L_reg_mem_avx10(rRegL dst, memory src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvF2L (LoadF src))); - format %{ "evcvttss2sisq $dst, $src" %} - ins_encode %{ - __ evcvttss2sisq($dst$$Register, $src$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2I_reg_reg(rRegI dst, regD src, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx10_2()); - match(Set dst (ConvD2I src)); - effect(KILL cr); - format %{ "convert_d2i $dst, $src"%} - ins_encode %{ - __ convertF2I(T_INT, T_DOUBLE, $dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2I_reg_reg_avx10(rRegI dst, regD src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvD2I src)); - format %{ "evcvttsd2sisl $dst, $src" %} - ins_encode %{ - __ evcvttsd2sisl($dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2I_reg_mem_avx10(rRegI dst, memory src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvD2I (LoadD src))); - format %{ "evcvttsd2sisl $dst, $src" %} - ins_encode %{ - __ evcvttsd2sisl($dst$$Register, $src$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2L_reg_reg(rRegL dst, regD src, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx10_2()); - match(Set dst (ConvD2L src)); - effect(KILL cr); - format %{ "convert_d2l $dst, $src"%} - ins_encode %{ - __ convertF2I(T_LONG, T_DOUBLE, $dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2L_reg_reg_avx10(rRegL dst, regD src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvD2L src)); - format %{ "evcvttsd2sisq $dst, $src" %} - ins_encode %{ - __ evcvttsd2sisq($dst$$Register, $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct convD2L_reg_mem_avx10(rRegL dst, memory src) -%{ - predicate(VM_Version::supports_avx10_2()); - match(Set dst (ConvD2L (LoadD src))); - format %{ "evcvttsd2sisq $dst, $src" %} - ins_encode %{ - __ evcvttsd2sisq($dst$$Register, $src$$Address); - %} - ins_pipe(pipe_slow); -%} - -instruct round_double_reg(rRegL dst, regD src, rRegL rtmp, rcx_RegL rcx, rFlagsReg cr) -%{ - match(Set dst (RoundD src)); - effect(TEMP dst, TEMP rtmp, TEMP rcx, KILL cr); - format %{ "round_double $dst,$src \t! using $rtmp and $rcx as TEMP"%} - ins_encode %{ - __ round_double($dst$$Register, $src$$XMMRegister, $rtmp$$Register, $rcx$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct round_float_reg(rRegI dst, regF src, rRegL rtmp, rcx_RegL rcx, rFlagsReg cr) -%{ - match(Set dst (RoundF src)); - effect(TEMP dst, TEMP rtmp, TEMP rcx, KILL cr); - format %{ "round_float $dst,$src" %} - ins_encode %{ - __ round_float($dst$$Register, $src$$XMMRegister, $rtmp$$Register, $rcx$$Register); - %} - ins_pipe(pipe_slow); -%} - -instruct convI2F_reg_reg(vlRegF dst, rRegI src) -%{ - predicate(!UseXmmI2F); - match(Set dst (ConvI2F src)); - - format %{ "cvtsi2ssl $dst, $src\t# i2f" %} - ins_encode %{ - if (UseAVX > 0) { - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - } - __ cvtsi2ssl ($dst$$XMMRegister, $src$$Register); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convI2F_reg_mem(regF dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvI2F (LoadI src))); - - format %{ "cvtsi2ssl $dst, $src\t# i2f" %} - ins_encode %{ - __ cvtsi2ssl ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convI2D_reg_reg(vlRegD dst, rRegI src) -%{ - predicate(!UseXmmI2D); - match(Set dst (ConvI2D src)); - - format %{ "cvtsi2sdl $dst, $src\t# i2d" %} - ins_encode %{ - if (UseAVX > 0) { - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - } - __ cvtsi2sdl ($dst$$XMMRegister, $src$$Register); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convI2D_reg_mem(regD dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvI2D (LoadI src))); - - format %{ "cvtsi2sdl $dst, $src\t# i2d" %} - ins_encode %{ - __ cvtsi2sdl ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convXI2F_reg(regF dst, rRegI src) -%{ - predicate(UseXmmI2F); - match(Set dst (ConvI2F src)); - - format %{ "movdl $dst, $src\n\t" - "cvtdq2psl $dst, $dst\t# i2f" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ cvtdq2ps($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convXI2D_reg(regD dst, rRegI src) -%{ - predicate(UseXmmI2D); - match(Set dst (ConvI2D src)); - - format %{ "movdl $dst, $src\n\t" - "cvtdq2pdl $dst, $dst\t# i2d" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - __ cvtdq2pd($dst$$XMMRegister, $dst$$XMMRegister); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convL2F_reg_reg(vlRegF dst, rRegL src) -%{ - match(Set dst (ConvL2F src)); - - format %{ "cvtsi2ssq $dst, $src\t# l2f" %} - ins_encode %{ - if (UseAVX > 0) { - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - } - __ cvtsi2ssq ($dst$$XMMRegister, $src$$Register); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convL2F_reg_mem(regF dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvL2F (LoadL src))); - - format %{ "cvtsi2ssq $dst, $src\t# l2f" %} - ins_encode %{ - __ cvtsi2ssq ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convL2D_reg_reg(vlRegD dst, rRegL src) -%{ - match(Set dst (ConvL2D src)); - - format %{ "cvtsi2sdq $dst, $src\t# l2d" %} - ins_encode %{ - if (UseAVX > 0) { - __ pxor($dst$$XMMRegister, $dst$$XMMRegister); - } - __ cvtsi2sdq ($dst$$XMMRegister, $src$$Register); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convL2D_reg_mem(regD dst, memory src) -%{ - predicate(UseAVX == 0); - match(Set dst (ConvL2D (LoadL src))); - - format %{ "cvtsi2sdq $dst, $src\t# l2d" %} - ins_encode %{ - __ cvtsi2sdq ($dst$$XMMRegister, $src$$Address); - %} - ins_pipe(pipe_slow); // XXX -%} - -instruct convI2L_reg_reg(rRegL dst, rRegI src) -%{ - match(Set dst (ConvI2L src)); - - ins_cost(125); - format %{ "movslq $dst, $src\t# i2l" %} - ins_encode %{ - __ movslq($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -// Zero-extend convert int to long -instruct convI2L_reg_reg_zex(rRegL dst, rRegI src, immL_32bits mask) -%{ - match(Set dst (AndL (ConvI2L src) mask)); - - format %{ "movl $dst, $src\t# i2l zero-extend\n\t" %} - ins_encode %{ - if ($dst$$reg != $src$$reg) { - __ movl($dst$$Register, $src$$Register); - } - %} - ins_pipe(ialu_reg_reg); -%} - -// Zero-extend convert int to long -instruct convI2L_reg_mem_zex(rRegL dst, memory src, immL_32bits mask) -%{ - match(Set dst (AndL (ConvI2L (LoadI src)) mask)); - - format %{ "movl $dst, $src\t# i2l zero-extend\n\t" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Address); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct zerox_long_reg_reg(rRegL dst, rRegL src, immL_32bits mask) -%{ - match(Set dst (AndL src mask)); - - format %{ "movl $dst, $src\t# zero-extend long" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct convL2I_reg_reg(rRegI dst, rRegL src) -%{ - match(Set dst (ConvL2I src)); - - format %{ "movl $dst, $src\t# l2i" %} - ins_encode %{ - __ movl($dst$$Register, $src$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - - -instruct MoveF2I_stack_reg(rRegI dst, stackSlotF src) %{ - match(Set dst (MoveF2I src)); - effect(DEF dst, USE src); - - ins_cost(125); - format %{ "movl $dst, $src\t# MoveF2I_stack_reg" %} - ins_encode %{ - __ movl($dst$$Register, Address(rsp, $src$$disp)); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{ - match(Set dst (MoveI2F src)); - effect(DEF dst, USE src); - - ins_cost(125); - format %{ "movss $dst, $src\t# MoveI2F_stack_reg" %} - ins_encode %{ - __ movflt($dst$$XMMRegister, Address(rsp, $src$$disp)); - %} - ins_pipe(pipe_slow); -%} - -instruct MoveD2L_stack_reg(rRegL dst, stackSlotD src) %{ - match(Set dst (MoveD2L src)); - effect(DEF dst, USE src); - - ins_cost(125); - format %{ "movq $dst, $src\t# MoveD2L_stack_reg" %} - ins_encode %{ - __ movq($dst$$Register, Address(rsp, $src$$disp)); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct MoveL2D_stack_reg_partial(regD dst, stackSlotL src) %{ - predicate(!UseXmmLoadAndClearUpper); - match(Set dst (MoveL2D src)); - effect(DEF dst, USE src); - - ins_cost(125); - format %{ "movlpd $dst, $src\t# MoveL2D_stack_reg" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); - %} - ins_pipe(pipe_slow); -%} - -instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{ - predicate(UseXmmLoadAndClearUpper); - match(Set dst (MoveL2D src)); - effect(DEF dst, USE src); - - ins_cost(125); - format %{ "movsd $dst, $src\t# MoveL2D_stack_reg" %} - ins_encode %{ - __ movdbl($dst$$XMMRegister, Address(rsp, $src$$disp)); - %} - ins_pipe(pipe_slow); -%} - - -instruct MoveF2I_reg_stack(stackSlotI dst, regF src) %{ - match(Set dst (MoveF2I src)); - effect(DEF dst, USE src); - - ins_cost(95); // XXX - format %{ "movss $dst, $src\t# MoveF2I_reg_stack" %} - ins_encode %{ - __ movflt(Address(rsp, $dst$$disp), $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct MoveI2F_reg_stack(stackSlotF dst, rRegI src) %{ - match(Set dst (MoveI2F src)); - effect(DEF dst, USE src); - - ins_cost(100); - format %{ "movl $dst, $src\t# MoveI2F_reg_stack" %} - ins_encode %{ - __ movl(Address(rsp, $dst$$disp), $src$$Register); - %} - ins_pipe( ialu_mem_reg ); -%} - -instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{ - match(Set dst (MoveD2L src)); - effect(DEF dst, USE src); - - ins_cost(95); // XXX - format %{ "movsd $dst, $src\t# MoveL2D_reg_stack" %} - ins_encode %{ - __ movdbl(Address(rsp, $dst$$disp), $src$$XMMRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct MoveL2D_reg_stack(stackSlotD dst, rRegL src) %{ - match(Set dst (MoveL2D src)); - effect(DEF dst, USE src); - - ins_cost(100); - format %{ "movq $dst, $src\t# MoveL2D_reg_stack" %} - ins_encode %{ - __ movq(Address(rsp, $dst$$disp), $src$$Register); - %} - ins_pipe(ialu_mem_reg); -%} - -instruct MoveF2I_reg_reg(rRegI dst, regF src) %{ - match(Set dst (MoveF2I src)); - effect(DEF dst, USE src); - ins_cost(85); - format %{ "movd $dst,$src\t# MoveF2I" %} - ins_encode %{ - __ movdl($dst$$Register, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct MoveD2L_reg_reg(rRegL dst, regD src) %{ - match(Set dst (MoveD2L src)); - effect(DEF dst, USE src); - ins_cost(85); - format %{ "movd $dst,$src\t# MoveD2L" %} - ins_encode %{ - __ movdq($dst$$Register, $src$$XMMRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct MoveI2F_reg_reg(regF dst, rRegI src) %{ - match(Set dst (MoveI2F src)); - effect(DEF dst, USE src); - ins_cost(100); - format %{ "movd $dst,$src\t# MoveI2F" %} - ins_encode %{ - __ movdl($dst$$XMMRegister, $src$$Register); - %} - ins_pipe( pipe_slow ); -%} - -instruct MoveL2D_reg_reg(regD dst, rRegL src) %{ - match(Set dst (MoveL2D src)); - effect(DEF dst, USE src); - ins_cost(100); - format %{ "movd $dst,$src\t# MoveL2D" %} - ins_encode %{ - __ movdq($dst$$XMMRegister, $src$$Register); - %} - ins_pipe( pipe_slow ); -%} - -// Fast clearing of an array -// Small non-constant lenght ClearArray for non-AVX512 targets. -instruct rep_stos(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, - Universe dummy, rFlagsReg cr) -%{ - predicate(!((ClearArrayNode*)n)->is_large() && (UseAVX <= 2)); - match(Set dummy (ClearArray cnt base)); - effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr); - - format %{ $$template - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"cmp InitArrayShortSize,rcx\n\t" - $$emit$$"jg LARGE\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"js DONE\t# Zero length\n\t" - $$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge LOOP\n\t" - $$emit$$"jmp DONE\n\t" - $$emit$$"# LARGE:\n\t" - if (UseFastStosb) { - $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" - $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t" - } else if (UseXMMForObjInit) { - $$emit$$"mov rdi,rax\n\t" - $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" - $$emit$$"jmpq L_zero_64_bytes\n\t" - $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" - $$emit$$"add 0x40,rax\n\t" - $$emit$$"# L_zero_64_bytes:\n\t" - $$emit$$"sub 0x8,rcx\n\t" - $$emit$$"jge L_loop\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jl L_tail\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"add 0x20,rax\n\t" - $$emit$$"sub 0x4,rcx\n\t" - $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jle L_end\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" - $$emit$$"vmovq xmm0,(rax)\n\t" - $$emit$$"add 0x8,rax\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge L_sloop\n\t" - $$emit$$"# L_end:\n\t" - } else { - $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t" - } - $$emit$$"# DONE" - %} - ins_encode %{ - __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, - $tmp$$XMMRegister, false, knoreg); - %} - ins_pipe(pipe_slow); -%} - -// Small non-constant length ClearArray for AVX512 targets. -instruct rep_stos_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegI zero, - Universe dummy, rFlagsReg cr) -%{ - predicate(!((ClearArrayNode*)n)->is_large() && (UseAVX > 2)); - match(Set dummy (ClearArray cnt base)); - ins_cost(125); - effect(USE_KILL cnt, USE_KILL base, TEMP tmp, TEMP ktmp, KILL zero, KILL cr); - - format %{ $$template - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"cmp InitArrayShortSize,rcx\n\t" - $$emit$$"jg LARGE\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"js DONE\t# Zero length\n\t" - $$emit$$"mov rax,(rdi,rcx,8)\t# LOOP\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge LOOP\n\t" - $$emit$$"jmp DONE\n\t" - $$emit$$"# LARGE:\n\t" - if (UseFastStosb) { - $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" - $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--\n\t" - } else if (UseXMMForObjInit) { - $$emit$$"mov rdi,rax\n\t" - $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" - $$emit$$"jmpq L_zero_64_bytes\n\t" - $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" - $$emit$$"add 0x40,rax\n\t" - $$emit$$"# L_zero_64_bytes:\n\t" - $$emit$$"sub 0x8,rcx\n\t" - $$emit$$"jge L_loop\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jl L_tail\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"add 0x20,rax\n\t" - $$emit$$"sub 0x4,rcx\n\t" - $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jle L_end\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" - $$emit$$"vmovq xmm0,(rax)\n\t" - $$emit$$"add 0x8,rax\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge L_sloop\n\t" - $$emit$$"# L_end:\n\t" - } else { - $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--\n\t" - } - $$emit$$"# DONE" - %} - ins_encode %{ - __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, - $tmp$$XMMRegister, false, $ktmp$$KRegister); - %} - ins_pipe(pipe_slow); -%} - -// Large non-constant length ClearArray for non-AVX512 targets. -instruct rep_stos_large(rcx_RegL cnt, rdi_RegP base, regD tmp, rax_RegI zero, - Universe dummy, rFlagsReg cr) -%{ - predicate((UseAVX <=2) && ((ClearArrayNode*)n)->is_large()); - match(Set dummy (ClearArray cnt base)); - effect(USE_KILL cnt, USE_KILL base, TEMP tmp, KILL zero, KILL cr); - - format %{ $$template - if (UseFastStosb) { - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" - $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--" - } else if (UseXMMForObjInit) { - $$emit$$"mov rdi,rax\t# ClearArray:\n\t" - $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" - $$emit$$"jmpq L_zero_64_bytes\n\t" - $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" - $$emit$$"add 0x40,rax\n\t" - $$emit$$"# L_zero_64_bytes:\n\t" - $$emit$$"sub 0x8,rcx\n\t" - $$emit$$"jge L_loop\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jl L_tail\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"add 0x20,rax\n\t" - $$emit$$"sub 0x4,rcx\n\t" - $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jle L_end\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" - $$emit$$"vmovq xmm0,(rax)\n\t" - $$emit$$"add 0x8,rax\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge L_sloop\n\t" - $$emit$$"# L_end:\n\t" - } else { - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--" - } - %} - ins_encode %{ - __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, - $tmp$$XMMRegister, true, knoreg); - %} - ins_pipe(pipe_slow); -%} - -// Large non-constant length ClearArray for AVX512 targets. -instruct rep_stos_large_evex(rcx_RegL cnt, rdi_RegP base, legRegD tmp, kReg ktmp, rax_RegI zero, - Universe dummy, rFlagsReg cr) -%{ - predicate((UseAVX > 2) && ((ClearArrayNode*)n)->is_large()); - match(Set dummy (ClearArray cnt base)); - effect(USE_KILL cnt, USE_KILL base, TEMP tmp, TEMP ktmp, KILL zero, KILL cr); - - format %{ $$template - if (UseFastStosb) { - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"shlq rcx,3\t# Convert doublewords to bytes\n\t" - $$emit$$"rep stosb\t# Store rax to *rdi++ while rcx--" - } else if (UseXMMForObjInit) { - $$emit$$"mov rdi,rax\t# ClearArray:\n\t" - $$emit$$"vpxor ymm0,ymm0,ymm0\n\t" - $$emit$$"jmpq L_zero_64_bytes\n\t" - $$emit$$"# L_loop:\t# 64-byte LOOP\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"vmovdqu ymm0,0x20(rax)\n\t" - $$emit$$"add 0x40,rax\n\t" - $$emit$$"# L_zero_64_bytes:\n\t" - $$emit$$"sub 0x8,rcx\n\t" - $$emit$$"jge L_loop\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jl L_tail\n\t" - $$emit$$"vmovdqu ymm0,(rax)\n\t" - $$emit$$"add 0x20,rax\n\t" - $$emit$$"sub 0x4,rcx\n\t" - $$emit$$"# L_tail:\t# Clearing tail bytes\n\t" - $$emit$$"add 0x4,rcx\n\t" - $$emit$$"jle L_end\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"# L_sloop:\t# 8-byte short loop\n\t" - $$emit$$"vmovq xmm0,(rax)\n\t" - $$emit$$"add 0x8,rax\n\t" - $$emit$$"dec rcx\n\t" - $$emit$$"jge L_sloop\n\t" - $$emit$$"# L_end:\n\t" - } else { - $$emit$$"xorq rax, rax\t# ClearArray:\n\t" - $$emit$$"rep stosq\t# Store rax to *rdi++ while rcx--" - } - %} - ins_encode %{ - __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register, - $tmp$$XMMRegister, true, $ktmp$$KRegister); - %} - ins_pipe(pipe_slow); -%} - -// Small constant length ClearArray for AVX512 targets. -instruct rep_stos_im(immL cnt, rRegP base, regD tmp, rRegI zero, kReg ktmp, Universe dummy, rFlagsReg cr) -%{ - predicate(!((ClearArrayNode*)n)->is_large() && (MaxVectorSize >= 32) && VM_Version::supports_avx512vl()); - match(Set dummy (ClearArray cnt base)); - ins_cost(100); - effect(TEMP tmp, TEMP zero, TEMP ktmp, KILL cr); - format %{ "clear_mem_imm $base , $cnt \n\t" %} - ins_encode %{ - __ clear_mem($base$$Register, $cnt$$constant, $zero$$Register, $tmp$$XMMRegister, $ktmp$$KRegister); - %} - ins_pipe(pipe_slow); -%} - -instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::LL, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareL_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::LL, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::UU, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::UU, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareLU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::LU, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareLU_evex(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2, - rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::LU, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareUL(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, - rax_RegI result, legRegD tmp1, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str2$$Register, $str1$$Register, - $cnt2$$Register, $cnt1$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::UL, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compareUL_evex(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2, - rax_RegI result, legRegD tmp1, kReg ktmp, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL); - match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp1, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr); - - format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL $tmp1" %} - ins_encode %{ - __ string_compare($str2$$Register, $str1$$Register, - $cnt2$$Register, $cnt1$$Register, $result$$Register, - $tmp1$$XMMRegister, StrIntrinsicNode::UL, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -// fast search of substring with known size. -instruct string_indexof_conL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, - rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf byte[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} - ins_encode %{ - int icnt2 = (int)$int_cnt2$$constant; - if (icnt2 >= 16) { - // IndexOf for constant substrings with size >= 16 elements - // which don't need to be loaded through stack. - __ string_indexofC8($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); - } else { - // Small strings are loaded through stack if they cross page boundary. - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); - } - %} - ins_pipe( pipe_slow ); -%} - -// fast search of substring with known size. -instruct string_indexof_conU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, - rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf char[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} - ins_encode %{ - int icnt2 = (int)$int_cnt2$$constant; - if (icnt2 >= 8) { - // IndexOf for constant substrings with size >= 8 elements - // which don't need to be loaded through stack. - __ string_indexofC8($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); - } else { - // Small strings are loaded through stack if they cross page boundary. - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); - } - %} - ins_pipe( pipe_slow ); -%} - -// fast search of substring with known size. -instruct string_indexof_conUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2, - rbx_RegI result, legRegD tmp_vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf char[] $str1,$cnt1,$str2,$int_cnt2 -> $result // KILL $tmp_vec, $cnt1, $cnt2, $tmp" %} - ins_encode %{ - int icnt2 = (int)$int_cnt2$$constant; - if (icnt2 >= 8) { - // IndexOf for constant substrings with size >= 8 elements - // which don't need to be loaded through stack. - __ string_indexofC8($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); - } else { - // Small strings are loaded through stack if they cross page boundary. - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - icnt2, $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); - } - %} - ins_pipe( pipe_slow ); -%} - -instruct string_indexofL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, - rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf byte[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} - ins_encode %{ - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - (-1), $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::LL); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_indexofU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, - rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} - ins_encode %{ - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - (-1), $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UU); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_indexofUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2, - rbx_RegI result, legRegD tmp_vec, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL)); - match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); - effect(TEMP tmp_vec, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL tmp, KILL cr); - - format %{ "String IndexOf char[] $str1,$cnt1,$str2,$cnt2 -> $result // KILL all" %} - ins_encode %{ - __ string_indexof($str1$$Register, $str2$$Register, - $cnt1$$Register, $cnt2$$Register, - (-1), $result$$Register, - $tmp_vec$$XMMRegister, $tmp$$Register, StrIntrinsicNode::UL); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_indexof_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch, - rbx_RegI result, legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfCharNode*)n)->encoding() == StrIntrinsicNode::U)); - match(Set result (StrIndexOfChar (Binary str1 cnt1) ch)); - effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, USE_KILL str1, USE_KILL cnt1, USE_KILL ch, TEMP tmp, KILL cr); - format %{ "StringUTF16 IndexOf char[] $str1,$cnt1,$ch -> $result // KILL all" %} - ins_encode %{ - __ string_indexof_char($str1$$Register, $cnt1$$Register, $ch$$Register, $result$$Register, - $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, $tmp$$Register); - %} - ins_pipe( pipe_slow ); -%} - -instruct stringL_indexof_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch, - rbx_RegI result, legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, rcx_RegI tmp, rFlagsReg cr) -%{ - predicate(UseSSE42Intrinsics && (((StrIndexOfCharNode*)n)->encoding() == StrIntrinsicNode::L)); - match(Set result (StrIndexOfChar (Binary str1 cnt1) ch)); - effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, USE_KILL str1, USE_KILL cnt1, USE_KILL ch, TEMP tmp, KILL cr); - format %{ "StringLatin1 IndexOf char[] $str1,$cnt1,$ch -> $result // KILL all" %} - ins_encode %{ - __ stringL_indexof_char($str1$$Register, $cnt1$$Register, $ch$$Register, $result$$Register, - $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, $tmp$$Register); - %} - ins_pipe( pipe_slow ); -%} - -// fast string equals -instruct string_equals(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, - legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw()); - match(Set result (StrEquals (Binary str1 str2) cnt)); - effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); - - format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp1, $tmp2, $tmp3" %} - ins_encode %{ - __ arrays_equals(false, $str1$$Register, $str2$$Register, - $cnt$$Register, $result$$Register, $tmp3$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_equals_evex(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result, - legRegD tmp1, legRegD tmp2, kReg ktmp, rbx_RegI tmp3, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw()); - match(Set result (StrEquals (Binary str1 str2) cnt)); - effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr); - - format %{ "String Equals $str1,$str2,$cnt -> $result // KILL $tmp1, $tmp2, $tmp3" %} - ins_encode %{ - __ arrays_equals(false, $str1$$Register, $str2$$Register, - $cnt$$Register, $result$$Register, $tmp3$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -// fast array equals -instruct array_equalsB(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, - legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); - match(Set result (AryEq ary1 ary2)); - effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); - - format %{ "Array Equals byte[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} - ins_encode %{ - __ arrays_equals(true, $ary1$$Register, $ary2$$Register, - $tmp3$$Register, $result$$Register, $tmp4$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct array_equalsB_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, - legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL); - match(Set result (AryEq ary1 ary2)); - effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); - - format %{ "Array Equals byte[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} - ins_encode %{ - __ arrays_equals(true, $ary1$$Register, $ary2$$Register, - $tmp3$$Register, $result$$Register, $tmp4$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, false /* char */, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct array_equalsC(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, - legRegD tmp1, legRegD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) -%{ - predicate(!VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); - match(Set result (AryEq ary1 ary2)); - effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); - - format %{ "Array Equals char[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} - ins_encode %{ - __ arrays_equals(true, $ary1$$Register, $ary2$$Register, - $tmp3$$Register, $result$$Register, $tmp4$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, true /* char */, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct array_equalsC_evex(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result, - legRegD tmp1, legRegD tmp2, kReg ktmp, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr) -%{ - predicate(VM_Version::supports_avx512vlbw() && ((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU); - match(Set result (AryEq ary1 ary2)); - effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL ary1, USE_KILL ary2, KILL tmp3, KILL tmp4, KILL cr); - - format %{ "Array Equals char[] $ary1,$ary2 -> $result // KILL $tmp1, $tmp2, $tmp3, $tmp4" %} - ins_encode %{ - __ arrays_equals(true, $ary1$$Register, $ary2$$Register, - $tmp3$$Register, $result$$Register, $tmp4$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, true /* char */, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -instruct arrays_hashcode(rdi_RegP ary1, rdx_RegI cnt1, rbx_RegI result, immU8 basic_type, - legRegD tmp_vec1, legRegD tmp_vec2, legRegD tmp_vec3, legRegD tmp_vec4, - legRegD tmp_vec5, legRegD tmp_vec6, legRegD tmp_vec7, legRegD tmp_vec8, - legRegD tmp_vec9, legRegD tmp_vec10, legRegD tmp_vec11, legRegD tmp_vec12, - legRegD tmp_vec13, rRegI tmp1, rRegI tmp2, rRegI tmp3, rFlagsReg cr) -%{ - predicate(UseAVX >= 2); - match(Set result (VectorizedHashCode (Binary ary1 cnt1) (Binary result basic_type))); - effect(TEMP tmp_vec1, TEMP tmp_vec2, TEMP tmp_vec3, TEMP tmp_vec4, TEMP tmp_vec5, TEMP tmp_vec6, - TEMP tmp_vec7, TEMP tmp_vec8, TEMP tmp_vec9, TEMP tmp_vec10, TEMP tmp_vec11, TEMP tmp_vec12, - TEMP tmp_vec13, TEMP tmp1, TEMP tmp2, TEMP tmp3, USE_KILL ary1, USE_KILL cnt1, - USE basic_type, KILL cr); - - format %{ "Array HashCode array[] $ary1,$cnt1,$result,$basic_type -> $result // KILL all" %} - ins_encode %{ - __ arrays_hashcode($ary1$$Register, $cnt1$$Register, $result$$Register, - $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, - $tmp_vec1$$XMMRegister, $tmp_vec2$$XMMRegister, $tmp_vec3$$XMMRegister, - $tmp_vec4$$XMMRegister, $tmp_vec5$$XMMRegister, $tmp_vec6$$XMMRegister, - $tmp_vec7$$XMMRegister, $tmp_vec8$$XMMRegister, $tmp_vec9$$XMMRegister, - $tmp_vec10$$XMMRegister, $tmp_vec11$$XMMRegister, $tmp_vec12$$XMMRegister, - $tmp_vec13$$XMMRegister, (BasicType)$basic_type$$constant); - %} - ins_pipe( pipe_slow ); -%} - -instruct count_positives(rsi_RegP ary1, rcx_RegI len, rax_RegI result, - legRegD tmp1, legRegD tmp2, rbx_RegI tmp3, rFlagsReg cr,) -%{ - predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); - match(Set result (CountPositives ary1 len)); - effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); - - format %{ "countPositives byte[] $ary1,$len -> $result // KILL $tmp1, $tmp2, $tmp3" %} - ins_encode %{ - __ count_positives($ary1$$Register, $len$$Register, - $result$$Register, $tmp3$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, knoreg, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct count_positives_evex(rsi_RegP ary1, rcx_RegI len, rax_RegI result, - legRegD tmp1, legRegD tmp2, kReg ktmp1, kReg ktmp2, rbx_RegI tmp3, rFlagsReg cr,) -%{ - predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); - match(Set result (CountPositives ary1 len)); - effect(TEMP tmp1, TEMP tmp2, TEMP ktmp1, TEMP ktmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr); - - format %{ "countPositives byte[] $ary1,$len -> $result // KILL $tmp1, $tmp2, $tmp3" %} - ins_encode %{ - __ count_positives($ary1$$Register, $len$$Register, - $result$$Register, $tmp3$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, $ktmp1$$KRegister, $ktmp2$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -// fast char[] to byte[] compression -instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, - legRegD tmp4, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); - match(Set result (StrCompressedCopy src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, - USE_KILL len, KILL tmp5, KILL cr); - - format %{ "String Compress $src,$dst -> $result // KILL RAX, RCX, RDX" %} - ins_encode %{ - __ char_array_compress($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, - $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, - knoreg, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_compress_evex(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legRegD tmp1, legRegD tmp2, legRegD tmp3, - legRegD tmp4, kReg ktmp1, kReg ktmp2, rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); - match(Set result (StrCompressedCopy src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP ktmp1, TEMP ktmp2, USE_KILL src, USE_KILL dst, - USE_KILL len, KILL tmp5, KILL cr); - - format %{ "String Compress $src,$dst -> $result // KILL RAX, RCX, RDX" %} - ins_encode %{ - __ char_array_compress($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, - $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, - $ktmp1$$KRegister, $ktmp2$$KRegister); - %} - ins_pipe( pipe_slow ); -%} -// fast byte[] to char[] inflation -instruct string_inflate(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, - legRegD tmp1, rcx_RegI tmp2, rFlagsReg cr) %{ - predicate(!VM_Version::supports_avx512vlbw() || !VM_Version::supports_bmi2()); - match(Set dummy (StrInflatedCopy src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); - - format %{ "String Inflate $src,$dst // KILL $tmp1, $tmp2" %} - ins_encode %{ - __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$Register, knoreg); - %} - ins_pipe( pipe_slow ); -%} - -instruct string_inflate_evex(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len, - legRegD tmp1, kReg ktmp, rcx_RegI tmp2, rFlagsReg cr) %{ - predicate(VM_Version::supports_avx512vlbw() && VM_Version::supports_bmi2()); - match(Set dummy (StrInflatedCopy src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, TEMP ktmp, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr); - - format %{ "String Inflate $src,$dst // KILL $tmp1, $tmp2" %} - ins_encode %{ - __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$Register, $ktmp$$KRegister); - %} - ins_pipe( pipe_slow ); -%} - -// encode char[] to byte[] in ISO_8859_1 -instruct encode_iso_array(rsi_RegP src, rdi_RegP dst, rdx_RegI len, - legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, - rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(!((EncodeISOArrayNode*)n)->is_ascii()); - match(Set result (EncodeISOArray src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); - - format %{ "Encode iso array $src,$dst,$len -> $result // KILL RCX, RDX, $tmp1, $tmp2, $tmp3, $tmp4, RSI, RDI " %} - ins_encode %{ - __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, - $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, false); - %} - ins_pipe( pipe_slow ); -%} - -// encode char[] to byte[] in ASCII -instruct encode_ascii_array(rsi_RegP src, rdi_RegP dst, rdx_RegI len, - legRegD tmp1, legRegD tmp2, legRegD tmp3, legRegD tmp4, - rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{ - predicate(((EncodeISOArrayNode*)n)->is_ascii()); - match(Set result (EncodeISOArray src (Binary dst len))); - effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr); - - format %{ "Encode ascii array $src,$dst,$len -> $result // KILL RCX, RDX, $tmp1, $tmp2, $tmp3, $tmp4, RSI, RDI " %} - ins_encode %{ - __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register, - $tmp1$$XMMRegister, $tmp2$$XMMRegister, $tmp3$$XMMRegister, - $tmp4$$XMMRegister, $tmp5$$Register, $result$$Register, true); - %} - ins_pipe( pipe_slow ); -%} - -//----------Overflow Math Instructions----------------------------------------- - -instruct overflowAddI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) -%{ - match(Set cr (OverflowAddI op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "addl $op1, $op2\t# overflow check int" %} - - ins_encode %{ - __ addl($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowAddI_rReg_imm(rFlagsReg cr, rax_RegI op1, immI op2) -%{ - match(Set cr (OverflowAddI op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "addl $op1, $op2\t# overflow check int" %} - - ins_encode %{ - __ addl($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowAddL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) -%{ - match(Set cr (OverflowAddL op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "addq $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ addq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowAddL_rReg_imm(rFlagsReg cr, rax_RegL op1, immL32 op2) -%{ - match(Set cr (OverflowAddL op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "addq $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ addq($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowSubI_rReg(rFlagsReg cr, rRegI op1, rRegI op2) -%{ - match(Set cr (OverflowSubI op1 op2)); - - format %{ "cmpl $op1, $op2\t# overflow check int" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowSubI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2) -%{ - match(Set cr (OverflowSubI op1 op2)); - - format %{ "cmpl $op1, $op2\t# overflow check int" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowSubL_rReg(rFlagsReg cr, rRegL op1, rRegL op2) -%{ - match(Set cr (OverflowSubL op1 op2)); - - format %{ "cmpq $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowSubL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2) -%{ - match(Set cr (OverflowSubL op1 op2)); - - format %{ "cmpq $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowNegI_rReg(rFlagsReg cr, immI_0 zero, rax_RegI op2) -%{ - match(Set cr (OverflowSubI zero op2)); - effect(DEF cr, USE_KILL op2); - - format %{ "negl $op2\t# overflow check int" %} - ins_encode %{ - __ negl($op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowNegL_rReg(rFlagsReg cr, immL0 zero, rax_RegL op2) -%{ - match(Set cr (OverflowSubL zero op2)); - effect(DEF cr, USE_KILL op2); - - format %{ "negq $op2\t# overflow check long" %} - ins_encode %{ - __ negq($op2$$Register); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct overflowMulI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) -%{ - match(Set cr (OverflowMulI op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "imull $op1, $op2\t# overflow check int" %} - ins_encode %{ - __ imull($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct overflowMulI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2, rRegI tmp) -%{ - match(Set cr (OverflowMulI op1 op2)); - effect(DEF cr, TEMP tmp, USE op1, USE op2); - - format %{ "imull $tmp, $op1, $op2\t# overflow check int" %} - ins_encode %{ - __ imull($tmp$$Register, $op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct overflowMulL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) -%{ - match(Set cr (OverflowMulL op1 op2)); - effect(DEF cr, USE_KILL op1, USE op2); - - format %{ "imulq $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ imulq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - -instruct overflowMulL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2, rRegL tmp) -%{ - match(Set cr (OverflowMulL op1 op2)); - effect(DEF cr, TEMP tmp, USE op1, USE op2); - - format %{ "imulq $tmp, $op1, $op2\t# overflow check long" %} - ins_encode %{ - __ imulq($tmp$$Register, $op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_reg_reg_alu0); -%} - - -//----------Control Flow Instructions------------------------------------------ -// Signed compare Instructions - -// XXX more variants!! -instruct compI_rReg(rFlagsReg cr, rRegI op1, rRegI op2) -%{ - match(Set cr (CmpI op1 op2)); - effect(DEF cr, USE op1, USE op2); - - format %{ "cmpl $op1, $op2" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2) -%{ - match(Set cr (CmpI op1 op2)); - - format %{ "cmpl $op1, $op2" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compI_rReg_mem(rFlagsReg cr, rRegI op1, memory op2) -%{ - match(Set cr (CmpI op1 (LoadI op2))); - - ins_cost(500); // XXX - format %{ "cmpl $op1, $op2" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testI_reg(rFlagsReg cr, rRegI src, immI_0 zero) -%{ - match(Set cr (CmpI src zero)); - - format %{ "testl $src, $src" %} - ins_encode %{ - __ testl($src$$Register, $src$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testI_reg_imm(rFlagsReg cr, rRegI src, immI con, immI_0 zero) -%{ - match(Set cr (CmpI (AndI src con) zero)); - - format %{ "testl $src, $con" %} - ins_encode %{ - __ testl($src$$Register, $con$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testI_reg_reg(rFlagsReg cr, rRegI src1, rRegI src2, immI_0 zero) -%{ - match(Set cr (CmpI (AndI src1 src2) zero)); - - format %{ "testl $src1, $src2" %} - ins_encode %{ - __ testl($src1$$Register, $src2$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testI_reg_mem(rFlagsReg cr, rRegI src, memory mem, immI_0 zero) -%{ - match(Set cr (CmpI (AndI src (LoadI mem)) zero)); - - format %{ "testl $src, $mem" %} - ins_encode %{ - __ testl($src$$Register, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -// Unsigned compare Instructions; really, same as signed except they -// produce an rFlagsRegU instead of rFlagsReg. -instruct compU_rReg(rFlagsRegU cr, rRegI op1, rRegI op2) -%{ - match(Set cr (CmpU op1 op2)); - - format %{ "cmpl $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compU_rReg_imm(rFlagsRegU cr, rRegI op1, immI op2) -%{ - match(Set cr (CmpU op1 op2)); - - format %{ "cmpl $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compU_rReg_mem(rFlagsRegU cr, rRegI op1, memory op2) -%{ - match(Set cr (CmpU op1 (LoadI op2))); - - ins_cost(500); // XXX - format %{ "cmpl $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpl($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testU_reg(rFlagsRegU cr, rRegI src, immI_0 zero) -%{ - match(Set cr (CmpU src zero)); - - format %{ "testl $src, $src\t# unsigned" %} - ins_encode %{ - __ testl($src$$Register, $src$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compP_rReg(rFlagsRegU cr, rRegP op1, rRegP op2) -%{ - match(Set cr (CmpP op1 op2)); - - format %{ "cmpq $op1, $op2\t# ptr" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compP_rReg_mem(rFlagsRegU cr, rRegP op1, memory op2) -%{ - match(Set cr (CmpP op1 (LoadP op2))); - predicate(n->in(2)->as_Load()->barrier_data() == 0); - - ins_cost(500); // XXX - format %{ "cmpq $op1, $op2\t# ptr" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -// XXX this is generalized by compP_rReg_mem??? -// Compare raw pointer (used in out-of-heap check). -// Only works because non-oop pointers must be raw pointers -// and raw pointers have no anti-dependencies. -instruct compP_mem_rReg(rFlagsRegU cr, rRegP op1, memory op2) -%{ - predicate(n->in(2)->in(2)->bottom_type()->reloc() == relocInfo::none && - n->in(2)->as_Load()->barrier_data() == 0); - match(Set cr (CmpP op1 (LoadP op2))); - - format %{ "cmpq $op1, $op2\t# raw ptr" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -// This will generate a signed flags result. This should be OK since -// any compare to a zero should be eq/neq. -instruct testP_reg(rFlagsReg cr, rRegP src, immP0 zero) -%{ - match(Set cr (CmpP src zero)); - - format %{ "testq $src, $src\t# ptr" %} - ins_encode %{ - __ testq($src$$Register, $src$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -// This will generate a signed flags result. This should be OK since -// any compare to a zero should be eq/neq. -instruct testP_mem(rFlagsReg cr, memory op, immP0 zero) -%{ - predicate((!UseCompressedOops || (CompressedOops::base() != nullptr)) && - n->in(1)->as_Load()->barrier_data() == 0); - match(Set cr (CmpP (LoadP op) zero)); - - ins_cost(500); // XXX - format %{ "testq $op, 0xffffffffffffffff\t# ptr" %} - ins_encode %{ - __ testq($op$$Address, 0xFFFFFFFF); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testP_mem_reg0(rFlagsReg cr, memory mem, immP0 zero) -%{ - predicate(UseCompressedOops && (CompressedOops::base() == nullptr) && - n->in(1)->as_Load()->barrier_data() == 0); - match(Set cr (CmpP (LoadP mem) zero)); - - format %{ "cmpq R12, $mem\t# ptr (R12_heapbase==0)" %} - ins_encode %{ - __ cmpq(r12, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct compN_rReg(rFlagsRegU cr, rRegN op1, rRegN op2) -%{ - match(Set cr (CmpN op1 op2)); - - format %{ "cmpl $op1, $op2\t# compressed ptr" %} - ins_encode %{ __ cmpl($op1$$Register, $op2$$Register); %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compN_rReg_mem(rFlagsRegU cr, rRegN src, memory mem) -%{ - predicate(n->in(2)->as_Load()->barrier_data() == 0); - match(Set cr (CmpN src (LoadN mem))); - - format %{ "cmpl $src, $mem\t# compressed ptr" %} - ins_encode %{ - __ cmpl($src$$Register, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct compN_rReg_imm(rFlagsRegU cr, rRegN op1, immN op2) %{ - match(Set cr (CmpN op1 op2)); - - format %{ "cmpl $op1, $op2\t# compressed ptr" %} - ins_encode %{ - __ cmp_narrow_oop($op1$$Register, (jobject)$op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compN_mem_imm(rFlagsRegU cr, memory mem, immN src) -%{ - predicate(n->in(2)->as_Load()->barrier_data() == 0); - match(Set cr (CmpN src (LoadN mem))); - - format %{ "cmpl $mem, $src\t# compressed ptr" %} - ins_encode %{ - __ cmp_narrow_oop($mem$$Address, (jobject)$src$$constant); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct compN_rReg_imm_klass(rFlagsRegU cr, rRegN op1, immNKlass op2) %{ - match(Set cr (CmpN op1 op2)); - - format %{ "cmpl $op1, $op2\t# compressed klass ptr" %} - ins_encode %{ - __ cmp_narrow_klass($op1$$Register, (Klass*)$op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compN_mem_imm_klass(rFlagsRegU cr, memory mem, immNKlass src) -%{ - predicate(!UseCompactObjectHeaders); - match(Set cr (CmpN src (LoadNKlass mem))); - - format %{ "cmpl $mem, $src\t# compressed klass ptr" %} - ins_encode %{ - __ cmp_narrow_klass($mem$$Address, (Klass*)$src$$constant); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testN_reg(rFlagsReg cr, rRegN src, immN0 zero) %{ - match(Set cr (CmpN src zero)); - - format %{ "testl $src, $src\t# compressed ptr" %} - ins_encode %{ __ testl($src$$Register, $src$$Register); %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testN_mem(rFlagsReg cr, memory mem, immN0 zero) -%{ - predicate(CompressedOops::base() != nullptr && - n->in(1)->as_Load()->barrier_data() == 0); - match(Set cr (CmpN (LoadN mem) zero)); - - ins_cost(500); // XXX - format %{ "testl $mem, 0xffffffff\t# compressed ptr" %} - ins_encode %{ - __ cmpl($mem$$Address, (int)0xFFFFFFFF); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testN_mem_reg0(rFlagsReg cr, memory mem, immN0 zero) -%{ - predicate(CompressedOops::base() == nullptr && - n->in(1)->as_Load()->barrier_data() == 0); - match(Set cr (CmpN (LoadN mem) zero)); - - format %{ "cmpl R12, $mem\t# compressed ptr (R12_heapbase==0)" %} - ins_encode %{ - __ cmpl(r12, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -// Yanked all unsigned pointer compare operations. -// Pointer compares are done with CmpP which is already unsigned. - -instruct compL_rReg(rFlagsReg cr, rRegL op1, rRegL op2) -%{ - match(Set cr (CmpL op1 op2)); - - format %{ "cmpq $op1, $op2" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2) -%{ - match(Set cr (CmpL op1 op2)); - - format %{ "cmpq $op1, $op2" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compL_rReg_mem(rFlagsReg cr, rRegL op1, memory op2) -%{ - match(Set cr (CmpL op1 (LoadL op2))); - - format %{ "cmpq $op1, $op2" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testL_reg(rFlagsReg cr, rRegL src, immL0 zero) -%{ - match(Set cr (CmpL src zero)); - - format %{ "testq $src, $src" %} - ins_encode %{ - __ testq($src$$Register, $src$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testL_reg_imm(rFlagsReg cr, rRegL src, immL32 con, immL0 zero) -%{ - match(Set cr (CmpL (AndL src con) zero)); - - format %{ "testq $src, $con\t# long" %} - ins_encode %{ - __ testq($src$$Register, $con$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testL_reg_reg(rFlagsReg cr, rRegL src1, rRegL src2, immL0 zero) -%{ - match(Set cr (CmpL (AndL src1 src2) zero)); - - format %{ "testq $src1, $src2\t# long" %} - ins_encode %{ - __ testq($src1$$Register, $src2$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct testL_reg_mem(rFlagsReg cr, rRegL src, memory mem, immL0 zero) -%{ - match(Set cr (CmpL (AndL src (LoadL mem)) zero)); - - format %{ "testq $src, $mem" %} - ins_encode %{ - __ testq($src$$Register, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testL_reg_mem2(rFlagsReg cr, rRegP src, memory mem, immL0 zero) -%{ - match(Set cr (CmpL (AndL (CastP2X src) (LoadL mem)) zero)); - - format %{ "testq $src, $mem" %} - ins_encode %{ - __ testq($src$$Register, $mem$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -// Manifest a CmpU result in an integer register. Very painful. -// This is the test to avoid. -instruct cmpU3_reg_reg(rRegI dst, rRegI src1, rRegI src2, rFlagsReg flags) -%{ - match(Set dst (CmpU3 src1 src2)); - effect(KILL flags); - - ins_cost(275); // XXX - format %{ "cmpl $src1, $src2\t# CmpL3\n\t" - "movl $dst, -1\n\t" - "jb,u done\n\t" - "setcc $dst \t# emits setne + movzbl or setzune for APX" - "done:" %} - ins_encode %{ - Label done; - __ cmpl($src1$$Register, $src2$$Register); - __ movl($dst$$Register, -1); - __ jccb(Assembler::below, done); - __ setcc(Assembler::notZero, $dst$$Register); - __ bind(done); - %} - ins_pipe(pipe_slow); -%} - -// Manifest a CmpL result in an integer register. Very painful. -// This is the test to avoid. -instruct cmpL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags) -%{ - match(Set dst (CmpL3 src1 src2)); - effect(KILL flags); - - ins_cost(275); // XXX - format %{ "cmpq $src1, $src2\t# CmpL3\n\t" - "movl $dst, -1\n\t" - "jl,s done\n\t" - "setcc $dst \t# emits setne + movzbl or setzune for APX" - "done:" %} - ins_encode %{ - Label done; - __ cmpq($src1$$Register, $src2$$Register); - __ movl($dst$$Register, -1); - __ jccb(Assembler::less, done); - __ setcc(Assembler::notZero, $dst$$Register); - __ bind(done); - %} - ins_pipe(pipe_slow); -%} - -// Manifest a CmpUL result in an integer register. Very painful. -// This is the test to avoid. -instruct cmpUL3_reg_reg(rRegI dst, rRegL src1, rRegL src2, rFlagsReg flags) -%{ - match(Set dst (CmpUL3 src1 src2)); - effect(KILL flags); - - ins_cost(275); // XXX - format %{ "cmpq $src1, $src2\t# CmpL3\n\t" - "movl $dst, -1\n\t" - "jb,u done\n\t" - "setcc $dst \t# emits setne + movzbl or setzune for APX" - "done:" %} - ins_encode %{ - Label done; - __ cmpq($src1$$Register, $src2$$Register); - __ movl($dst$$Register, -1); - __ jccb(Assembler::below, done); - __ setcc(Assembler::notZero, $dst$$Register); - __ bind(done); - %} - ins_pipe(pipe_slow); -%} - -// Unsigned long compare Instructions; really, same as signed long except they -// produce an rFlagsRegU instead of rFlagsReg. -instruct compUL_rReg(rFlagsRegU cr, rRegL op1, rRegL op2) -%{ - match(Set cr (CmpUL op1 op2)); - - format %{ "cmpq $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Register); - %} - ins_pipe(ialu_cr_reg_reg); -%} - -instruct compUL_rReg_imm(rFlagsRegU cr, rRegL op1, immL32 op2) -%{ - match(Set cr (CmpUL op1 op2)); - - format %{ "cmpq $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$constant); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compUL_rReg_mem(rFlagsRegU cr, rRegL op1, memory op2) -%{ - match(Set cr (CmpUL op1 (LoadL op2))); - - format %{ "cmpq $op1, $op2\t# unsigned" %} - ins_encode %{ - __ cmpq($op1$$Register, $op2$$Address); - %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testUL_reg(rFlagsRegU cr, rRegL src, immL0 zero) -%{ - match(Set cr (CmpUL src zero)); - - format %{ "testq $src, $src\t# unsigned" %} - ins_encode %{ - __ testq($src$$Register, $src$$Register); - %} - ins_pipe(ialu_cr_reg_imm); -%} - -instruct compB_mem_imm(rFlagsReg cr, memory mem, immI8 imm) -%{ - match(Set cr (CmpI (LoadB mem) imm)); - - ins_cost(125); - format %{ "cmpb $mem, $imm" %} - ins_encode %{ __ cmpb($mem$$Address, $imm$$constant); %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testUB_mem_imm(rFlagsReg cr, memory mem, immU7 imm, immI_0 zero) -%{ - match(Set cr (CmpI (AndI (LoadUB mem) imm) zero)); - - ins_cost(125); - format %{ "testb $mem, $imm\t# ubyte" %} - ins_encode %{ __ testb($mem$$Address, $imm$$constant); %} - ins_pipe(ialu_cr_reg_mem); -%} - -instruct testB_mem_imm(rFlagsReg cr, memory mem, immI8 imm, immI_0 zero) -%{ - match(Set cr (CmpI (AndI (LoadB mem) imm) zero)); - - ins_cost(125); - format %{ "testb $mem, $imm\t# byte" %} - ins_encode %{ __ testb($mem$$Address, $imm$$constant); %} - ins_pipe(ialu_cr_reg_mem); -%} - -//----------Max and Min-------------------------------------------------------- -// Min Instructions - -instruct cmovI_reg_g(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - effect(USE_DEF dst, USE src, USE cr); - - format %{ "cmovlgt $dst, $src\t# min" %} - ins_encode %{ - __ cmovl(Assembler::greater, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_reg_g_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - effect(DEF dst, USE src1, USE src2, USE cr); - - format %{ "ecmovlgt $dst, $src1, $src2\t# min ndd" %} - ins_encode %{ - __ ecmovl(Assembler::greater, $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct minI_rReg(rRegI dst, rRegI src) -%{ - predicate(!UseAPX); - match(Set dst (MinI dst src)); - - ins_cost(200); - expand %{ - rFlagsReg cr; - compI_rReg(cr, dst, src); - cmovI_reg_g(dst, src, cr); - %} -%} - -instruct minI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2) -%{ - predicate(UseAPX); - match(Set dst (MinI src1 src2)); - effect(DEF dst, USE src1, USE src2); - - ins_cost(200); - expand %{ - rFlagsReg cr; - compI_rReg(cr, src1, src2); - cmovI_reg_g_ndd(dst, src1, src2, cr); - %} -%} - -instruct cmovI_reg_l(rRegI dst, rRegI src, rFlagsReg cr) -%{ - predicate(!UseAPX); - effect(USE_DEF dst, USE src, USE cr); - - format %{ "cmovllt $dst, $src\t# max" %} - ins_encode %{ - __ cmovl(Assembler::less, $dst$$Register, $src$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct cmovI_reg_l_ndd(rRegI dst, rRegI src1, rRegI src2, rFlagsReg cr) -%{ - predicate(UseAPX); - effect(DEF dst, USE src1, USE src2, USE cr); - - format %{ "ecmovllt $dst, $src1, $src2\t# max ndd" %} - ins_encode %{ - __ ecmovl(Assembler::less, $dst$$Register, $src1$$Register, $src2$$Register); - %} - ins_pipe(pipe_cmov_reg); -%} - -instruct maxI_rReg(rRegI dst, rRegI src) -%{ - predicate(!UseAPX); - match(Set dst (MaxI dst src)); - - ins_cost(200); - expand %{ - rFlagsReg cr; - compI_rReg(cr, dst, src); - cmovI_reg_l(dst, src, cr); - %} -%} - -instruct maxI_rReg_ndd(rRegI dst, rRegI src1, rRegI src2) -%{ - predicate(UseAPX); - match(Set dst (MaxI src1 src2)); - effect(DEF dst, USE src1, USE src2); - - ins_cost(200); - expand %{ - rFlagsReg cr; - compI_rReg(cr, src1, src2); - cmovI_reg_l_ndd(dst, src1, src2, cr); - %} -%} - -// ============================================================================ -// Branch Instructions - -// Jump Direct - Label defines a relative address from JMP+1 -instruct jmpDir(label labl) -%{ - match(Goto); - effect(USE labl); - - ins_cost(300); - format %{ "jmp $labl" %} - size(5); - ins_encode %{ - Label* L = $labl$$label; - __ jmp(*L, false); // Always long jump - %} - ins_pipe(pipe_jmp); -%} - -// Jump Direct Conditional - Label defines a relative address from Jcc+1 -instruct jmpCon(cmpOp cop, rFlagsReg cr, label labl) -%{ - match(If cop cr); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop $labl" %} - size(6); - ins_encode %{ - Label* L = $labl$$label; - __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump - %} - ins_pipe(pipe_jcc); -%} - -// Jump Direct Conditional - Label defines a relative address from Jcc+1 -instruct jmpLoopEnd(cmpOp cop, rFlagsReg cr, label labl) -%{ - match(CountedLoopEnd cop cr); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop $labl\t# loop end" %} - size(6); - ins_encode %{ - Label* L = $labl$$label; - __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump - %} - ins_pipe(pipe_jcc); -%} - -// Jump Direct Conditional - using unsigned comparison -instruct jmpConU(cmpOpU cop, rFlagsRegU cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop,u $labl" %} - size(6); - ins_encode %{ - Label* L = $labl$$label; - __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump - %} - ins_pipe(pipe_jcc); -%} - -instruct jmpConUCF(cmpOpUCF cop, rFlagsRegUCF cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(200); - format %{ "j$cop,u $labl" %} - size(6); - ins_encode %{ - Label* L = $labl$$label; - __ jcc((Assembler::Condition)($cop$$cmpcode), *L, false); // Always long jump - %} - ins_pipe(pipe_jcc); -%} - -instruct jmpConUCF2(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(200); - format %{ $$template - if ($cop$$cmpcode == Assembler::notEqual) { - $$emit$$"jp,u $labl\n\t" - $$emit$$"j$cop,u $labl" - } else { - $$emit$$"jp,u done\n\t" - $$emit$$"j$cop,u $labl\n\t" - $$emit$$"done:" - } - %} - ins_encode %{ - Label* l = $labl$$label; - if ($cop$$cmpcode == Assembler::notEqual) { - __ jcc(Assembler::parity, *l, false); - __ jcc(Assembler::notEqual, *l, false); - } else if ($cop$$cmpcode == Assembler::equal) { - Label done; - __ jccb(Assembler::parity, done); - __ jcc(Assembler::equal, *l, false); - __ bind(done); - } else { - ShouldNotReachHere(); - } - %} - ins_pipe(pipe_jcc); -%} - -// ============================================================================ -// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary -// superklass array for an instance of the superklass. Set a hidden -// internal cache on a hit (cache is checked with exposed code in -// gen_subtype_check()). Return NZ for a miss or zero for a hit. The -// encoding ALSO sets flags. - -instruct partialSubtypeCheck(rdi_RegP result, - rsi_RegP sub, rax_RegP super, rcx_RegI rcx, - rFlagsReg cr) -%{ - match(Set result (PartialSubtypeCheck sub super)); - predicate(!UseSecondarySupersTable); - effect(KILL rcx, KILL cr); - - ins_cost(1100); // slightly larger than the next version - format %{ "movq rdi, [$sub + in_bytes(Klass::secondary_supers_offset())]\n\t" - "movl rcx, [rdi + Array::length_offset_in_bytes()]\t# length to scan\n\t" - "addq rdi, Array::base_offset_in_bytes()\t# Skip to start of data; set NZ in case count is zero\n\t" - "repne scasq\t# Scan *rdi++ for a match with rax while rcx--\n\t" - "jne,s miss\t\t# Missed: rdi not-zero\n\t" - "movq [$sub + in_bytes(Klass::secondary_super_cache_offset())], $super\t# Hit: update cache\n\t" - "xorq $result, $result\t\t Hit: rdi zero\n\t" - "miss:\t" %} - - ins_encode %{ - Label miss; - // NB: Callers may assume that, when $result is a valid register, - // check_klass_subtype_slow_path_linear sets it to a nonzero - // value. - __ check_klass_subtype_slow_path_linear($sub$$Register, $super$$Register, - $rcx$$Register, $result$$Register, - nullptr, &miss, - /*set_cond_codes:*/ true); - __ xorptr($result$$Register, $result$$Register); - __ bind(miss); - %} - - ins_pipe(pipe_slow); -%} - -// ============================================================================ -// Two versions of hashtable-based partialSubtypeCheck, both used when -// we need to search for a super class in the secondary supers array. -// The first is used when we don't know _a priori_ the class being -// searched for. The second, far more common, is used when we do know: -// this is used for instanceof, checkcast, and any case where C2 can -// determine it by constant propagation. - -instruct partialSubtypeCheckVarSuper(rsi_RegP sub, rax_RegP super, rdi_RegP result, - rdx_RegL temp1, rcx_RegL temp2, rbx_RegP temp3, r11_RegL temp4, - rFlagsReg cr) -%{ - match(Set result (PartialSubtypeCheck sub super)); - predicate(UseSecondarySupersTable); - effect(KILL cr, TEMP temp1, TEMP temp2, TEMP temp3, TEMP temp4); - - ins_cost(1000); - format %{ "partialSubtypeCheck $result, $sub, $super" %} - - ins_encode %{ - __ lookup_secondary_supers_table_var($sub$$Register, $super$$Register, $temp1$$Register, $temp2$$Register, - $temp3$$Register, $temp4$$Register, $result$$Register); - %} - - ins_pipe(pipe_slow); -%} - -instruct partialSubtypeCheckConstSuper(rsi_RegP sub, rax_RegP super_reg, immP super_con, rdi_RegP result, - rdx_RegL temp1, rcx_RegL temp2, rbx_RegP temp3, r11_RegL temp4, - rFlagsReg cr) -%{ - match(Set result (PartialSubtypeCheck sub (Binary super_reg super_con))); - predicate(UseSecondarySupersTable); - effect(KILL cr, TEMP temp1, TEMP temp2, TEMP temp3, TEMP temp4); - - ins_cost(700); // smaller than the next version - format %{ "partialSubtypeCheck $result, $sub, $super_reg, $super_con" %} - - ins_encode %{ - u1 super_klass_slot = ((Klass*)$super_con$$constant)->hash_slot(); - if (InlineSecondarySupersTest) { - __ lookup_secondary_supers_table_const($sub$$Register, $super_reg$$Register, $temp1$$Register, $temp2$$Register, - $temp3$$Register, $temp4$$Register, $result$$Register, - super_klass_slot); - } else { - __ call(RuntimeAddress(StubRoutines::lookup_secondary_supers_table_stub(super_klass_slot))); - } - %} - - ins_pipe(pipe_slow); -%} - -// ============================================================================ -// Branch Instructions -- short offset versions -// -// These instructions are used to replace jumps of a long offset (the default -// match) with jumps of a shorter offset. These instructions are all tagged -// with the ins_short_branch attribute, which causes the ADLC to suppress the -// match rules in general matching. Instead, the ADLC generates a conversion -// method in the MachNode which can be used to do in-place replacement of the -// long variant with the shorter variant. The compiler will determine if a -// branch can be taken by the is_short_branch_offset() predicate in the machine -// specific code section of the file. - -// Jump Direct - Label defines a relative address from JMP+1 -instruct jmpDir_short(label labl) %{ - match(Goto); - effect(USE labl); - - ins_cost(300); - format %{ "jmp,s $labl" %} - size(2); - ins_encode %{ - Label* L = $labl$$label; - __ jmpb(*L); - %} - ins_pipe(pipe_jmp); - ins_short_branch(1); -%} - -// Jump Direct Conditional - Label defines a relative address from Jcc+1 -instruct jmpCon_short(cmpOp cop, rFlagsReg cr, label labl) %{ - match(If cop cr); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop,s $labl" %} - size(2); - ins_encode %{ - Label* L = $labl$$label; - __ jccb((Assembler::Condition)($cop$$cmpcode), *L); - %} - ins_pipe(pipe_jcc); - ins_short_branch(1); -%} - -// Jump Direct Conditional - Label defines a relative address from Jcc+1 -instruct jmpLoopEnd_short(cmpOp cop, rFlagsReg cr, label labl) %{ - match(CountedLoopEnd cop cr); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop,s $labl\t# loop end" %} - size(2); - ins_encode %{ - Label* L = $labl$$label; - __ jccb((Assembler::Condition)($cop$$cmpcode), *L); - %} - ins_pipe(pipe_jcc); - ins_short_branch(1); -%} - -// Jump Direct Conditional - using unsigned comparison -instruct jmpConU_short(cmpOpU cop, rFlagsRegU cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop,us $labl" %} - size(2); - ins_encode %{ - Label* L = $labl$$label; - __ jccb((Assembler::Condition)($cop$$cmpcode), *L); - %} - ins_pipe(pipe_jcc); - ins_short_branch(1); -%} - -instruct jmpConUCF_short(cmpOpUCF cop, rFlagsRegUCF cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(300); - format %{ "j$cop,us $labl" %} - size(2); - ins_encode %{ - Label* L = $labl$$label; - __ jccb((Assembler::Condition)($cop$$cmpcode), *L); - %} - ins_pipe(pipe_jcc); - ins_short_branch(1); -%} - -instruct jmpConUCF2_short(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ - match(If cop cmp); - effect(USE labl); - - ins_cost(300); - format %{ $$template - if ($cop$$cmpcode == Assembler::notEqual) { - $$emit$$"jp,u,s $labl\n\t" - $$emit$$"j$cop,u,s $labl" - } else { - $$emit$$"jp,u,s done\n\t" - $$emit$$"j$cop,u,s $labl\n\t" - $$emit$$"done:" - } - %} - size(4); - ins_encode %{ - Label* l = $labl$$label; - if ($cop$$cmpcode == Assembler::notEqual) { - __ jccb(Assembler::parity, *l); - __ jccb(Assembler::notEqual, *l); - } else if ($cop$$cmpcode == Assembler::equal) { - Label done; - __ jccb(Assembler::parity, done); - __ jccb(Assembler::equal, *l); - __ bind(done); - } else { - ShouldNotReachHere(); - } - %} - ins_pipe(pipe_jcc); - ins_short_branch(1); -%} - -// ============================================================================ -// inlined locking and unlocking - -instruct cmpFastLockLightweight(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI rax_reg, rRegP tmp) %{ - match(Set cr (FastLock object box)); - effect(TEMP rax_reg, TEMP tmp, USE_KILL box); - ins_cost(300); - format %{ "fastlock $object,$box\t! kills $box,$rax_reg,$tmp" %} - ins_encode %{ - __ fast_lock_lightweight($object$$Register, $box$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); - %} - ins_pipe(pipe_slow); -%} - -instruct cmpFastUnlockLightweight(rFlagsReg cr, rRegP object, rax_RegP rax_reg, rRegP tmp) %{ - match(Set cr (FastUnlock object rax_reg)); - effect(TEMP tmp, USE_KILL rax_reg); - ins_cost(300); - format %{ "fastunlock $object,$rax_reg\t! kills $rax_reg,$tmp" %} - ins_encode %{ - __ fast_unlock_lightweight($object$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); - %} - ins_pipe(pipe_slow); -%} - - -// ============================================================================ -// Safepoint Instructions -instruct safePoint_poll_tls(rFlagsReg cr, rRegP poll) -%{ - match(SafePoint poll); - effect(KILL cr, USE poll); - - format %{ "testl rax, [$poll]\t" - "# Safepoint: poll for GC" %} - ins_cost(125); - ins_encode %{ - __ relocate(relocInfo::poll_type); - address pre_pc = __ pc(); - __ testl(rax, Address($poll$$Register, 0)); - assert(nativeInstruction_at(pre_pc)->is_safepoint_poll(), "must emit test %%eax [reg]"); - %} - ins_pipe(ialu_reg_mem); -%} - -instruct mask_all_evexL(kReg dst, rRegL src) %{ - match(Set dst (MaskAll src)); - format %{ "mask_all_evexL $dst, $src \t! mask all operation" %} - ins_encode %{ - int mask_len = Matcher::vector_length(this); - __ vector_maskall_operation($dst$$KRegister, $src$$Register, mask_len); - %} - ins_pipe( pipe_slow ); -%} - -instruct mask_all_evexI_GT32(kReg dst, rRegI src, rRegL tmp) %{ - predicate(Matcher::vector_length(n) > 32); - match(Set dst (MaskAll src)); - effect(TEMP tmp); - format %{ "mask_all_evexI_GT32 $dst, $src \t! using $tmp as TEMP" %} - ins_encode %{ - int mask_len = Matcher::vector_length(this); - __ movslq($tmp$$Register, $src$$Register); - __ vector_maskall_operation($dst$$KRegister, $tmp$$Register, mask_len); - %} - ins_pipe( pipe_slow ); -%} - -// ============================================================================ -// Procedure Call/Return Instructions -// Call Java Static Instruction -// Note: If this code changes, the corresponding ret_addr_offset() and -// compute_padding() functions will have to be adjusted. -instruct CallStaticJavaDirect(method meth) %{ - match(CallStaticJava); - effect(USE meth); - - ins_cost(300); - format %{ "call,static " %} - opcode(0xE8); /* E8 cd */ - ins_encode(clear_avx, Java_Static_Call(meth), call_epilog); - ins_pipe(pipe_slow); - ins_alignment(4); -%} - -// Call Java Dynamic Instruction -// Note: If this code changes, the corresponding ret_addr_offset() and -// compute_padding() functions will have to be adjusted. -instruct CallDynamicJavaDirect(method meth) -%{ - match(CallDynamicJava); - effect(USE meth); - - ins_cost(300); - format %{ "movq rax, #Universe::non_oop_word()\n\t" - "call,dynamic " %} - ins_encode(clear_avx, Java_Dynamic_Call(meth), call_epilog); - ins_pipe(pipe_slow); - ins_alignment(4); -%} - -// Call Runtime Instruction -instruct CallRuntimeDirect(method meth) -%{ - match(CallRuntime); - effect(USE meth); - - ins_cost(300); - format %{ "call,runtime " %} - ins_encode(clear_avx, Java_To_Runtime(meth)); - ins_pipe(pipe_slow); -%} - -// Call runtime without safepoint -instruct CallLeafDirect(method meth) -%{ - match(CallLeaf); - effect(USE meth); - - ins_cost(300); - format %{ "call_leaf,runtime " %} - ins_encode(clear_avx, Java_To_Runtime(meth)); - ins_pipe(pipe_slow); -%} - -// Call runtime without safepoint and with vector arguments -instruct CallLeafDirectVector(method meth) -%{ - match(CallLeafVector); - effect(USE meth); - - ins_cost(300); - format %{ "call_leaf,vector " %} - ins_encode(Java_To_Runtime(meth)); - ins_pipe(pipe_slow); -%} - -// Call runtime without safepoint -instruct CallLeafNoFPDirect(method meth) -%{ - match(CallLeafNoFP); - effect(USE meth); - - ins_cost(300); - format %{ "call_leaf_nofp,runtime " %} - ins_encode(clear_avx, Java_To_Runtime(meth)); - ins_pipe(pipe_slow); -%} - -// Return Instruction -// Remove the return address & jump to it. -// Notice: We always emit a nop after a ret to make sure there is room -// for safepoint patching -instruct Ret() -%{ - match(Return); - - format %{ "ret" %} - ins_encode %{ - __ ret(0); - %} - ins_pipe(pipe_jmp); -%} - -// Tail Call; Jump from runtime stub to Java code. -// Also known as an 'interprocedural jump'. -// Target of jump will eventually return to caller. -// TailJump below removes the return address. -// Don't use rbp for 'jump_target' because a MachEpilogNode has already been -// emitted just above the TailCall which has reset rbp to the caller state. -instruct TailCalljmpInd(no_rbp_RegP jump_target, rbx_RegP method_ptr) -%{ - match(TailCall jump_target method_ptr); - - ins_cost(300); - format %{ "jmp $jump_target\t# rbx holds method" %} - ins_encode %{ - __ jmp($jump_target$$Register); - %} - ins_pipe(pipe_jmp); -%} - -// Tail Jump; remove the return address; jump to target. -// TailCall above leaves the return address around. -instruct tailjmpInd(no_rbp_RegP jump_target, rax_RegP ex_oop) -%{ - match(TailJump jump_target ex_oop); - - ins_cost(300); - format %{ "popq rdx\t# pop return address\n\t" - "jmp $jump_target" %} - ins_encode %{ - __ popq(as_Register(RDX_enc)); - __ jmp($jump_target$$Register); - %} - ins_pipe(pipe_jmp); -%} - -// Forward exception. -instruct ForwardExceptionjmp() -%{ - match(ForwardException); - - format %{ "jmp forward_exception_stub" %} - ins_encode %{ - __ jump(RuntimeAddress(StubRoutines::forward_exception_entry()), noreg); - %} - ins_pipe(pipe_jmp); -%} - -// Create exception oop: created by stack-crawling runtime code. -// Created exception is now available to this handler, and is setup -// just prior to jumping to this handler. No code emitted. -instruct CreateException(rax_RegP ex_oop) -%{ - match(Set ex_oop (CreateEx)); - - size(0); - // use the following format syntax - format %{ "# exception oop is in rax; no code emitted" %} - ins_encode(); - ins_pipe(empty); -%} - -// Rethrow exception: -// The exception oop will come in the first argument position. -// Then JUMP (not call) to the rethrow stub code. -instruct RethrowException() -%{ - match(Rethrow); - - // use the following format syntax - format %{ "jmp rethrow_stub" %} - ins_encode %{ - __ jump(RuntimeAddress(OptoRuntime::rethrow_stub()), noreg); - %} - ins_pipe(pipe_jmp); -%} - -// ============================================================================ -// This name is KNOWN by the ADLC and cannot be changed. -// The ADLC forces a 'TypeRawPtr::BOTTOM' output type -// for this guy. -instruct tlsLoadP(r15_RegP dst) %{ - match(Set dst (ThreadLocal)); - effect(DEF dst); - - size(0); - format %{ "# TLS is in R15" %} - ins_encode( /*empty encoding*/ ); - ins_pipe(ialu_reg_reg); -%} - - -//----------PEEPHOLE RULES----------------------------------------------------- -// These must follow all instruction definitions as they use the names -// defined in the instructions definitions. -// -// peeppredicate ( rule_predicate ); -// // the predicate unless which the peephole rule will be ignored -// -// peepmatch ( root_instr_name [preceding_instruction]* ); -// -// peepprocedure ( procedure_name ); -// // provide a procedure name to perform the optimization, the procedure should -// // reside in the architecture dependent peephole file, the method has the -// // signature of MachNode* (Block*, int, PhaseRegAlloc*, (MachNode*)(*)(), int...) -// // with the arguments being the basic block, the current node index inside the -// // block, the register allocator, the functions upon invoked return a new node -// // defined in peepreplace, and the rules of the nodes appearing in the -// // corresponding peepmatch, the function return true if successful, else -// // return false -// -// peepconstraint %{ -// (instruction_number.operand_name relational_op instruction_number.operand_name -// [, ...] ); -// // instruction numbers are zero-based using left to right order in peepmatch -// -// peepreplace ( instr_name ( [instruction_number.operand_name]* ) ); -// // provide an instruction_number.operand_name for each operand that appears -// // in the replacement instruction's match rule -// -// ---------VM FLAGS--------------------------------------------------------- -// -// All peephole optimizations can be turned off using -XX:-OptoPeephole -// -// Each peephole rule is given an identifying number starting with zero and -// increasing by one in the order seen by the parser. An individual peephole -// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=# -// on the command-line. -// -// ---------CURRENT LIMITATIONS---------------------------------------------- -// -// Only transformations inside a basic block (do we need more for peephole) -// -// ---------EXAMPLE---------------------------------------------------------- -// -// // pertinent parts of existing instructions in architecture description -// instruct movI(rRegI dst, rRegI src) -// %{ -// match(Set dst (CopyI src)); -// %} -// -// instruct incI_rReg(rRegI dst, immI_1 src, rFlagsReg cr) -// %{ -// match(Set dst (AddI dst src)); -// effect(KILL cr); -// %} -// -// instruct leaI_rReg_immI(rRegI dst, immI_1 src) -// %{ -// match(Set dst (AddI dst src)); -// %} -// -// 1. Simple replacement -// - Only match adjacent instructions in same basic block -// - Only equality constraints -// - Only constraints between operands, not (0.dest_reg == RAX_enc) -// - Only one replacement instruction -// -// // Change (inc mov) to lea -// peephole %{ -// // lea should only be emitted when beneficial -// peeppredicate( VM_Version::supports_fast_2op_lea() ); -// // increment preceded by register-register move -// peepmatch ( incI_rReg movI ); -// // require that the destination register of the increment -// // match the destination register of the move -// peepconstraint ( 0.dst == 1.dst ); -// // construct a replacement instruction that sets -// // the destination to ( move's source register + one ) -// peepreplace ( leaI_rReg_immI( 0.dst 1.src 0.src ) ); -// %} -// -// 2. Procedural replacement -// - More flexible finding relevent nodes -// - More flexible constraints -// - More flexible transformations -// - May utilise architecture-dependent API more effectively -// - Currently only one replacement instruction due to adlc parsing capabilities -// -// // Change (inc mov) to lea -// peephole %{ -// // lea should only be emitted when beneficial -// peeppredicate( VM_Version::supports_fast_2op_lea() ); -// // the rule numbers of these nodes inside are passed into the function below -// peepmatch ( incI_rReg movI ); -// // the method that takes the responsibility of transformation -// peepprocedure ( inc_mov_to_lea ); -// // the replacement is a leaI_rReg_immI, a lambda upon invoked creating this -// // node is passed into the function above -// peepreplace ( leaI_rReg_immI() ); -// %} - -// These instructions is not matched by the matcher but used by the peephole -instruct leaI_rReg_rReg_peep(rRegI dst, rRegI src1, rRegI src2) -%{ - predicate(false); - match(Set dst (AddI src1 src2)); - format %{ "leal $dst, [$src1 + $src2]" %} - ins_encode %{ - Register dst = $dst$$Register; - Register src1 = $src1$$Register; - Register src2 = $src2$$Register; - if (src1 != rbp && src1 != r13) { - __ leal(dst, Address(src1, src2, Address::times_1)); - } else { - assert(src2 != rbp && src2 != r13, ""); - __ leal(dst, Address(src2, src1, Address::times_1)); - } - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaI_rReg_immI_peep(rRegI dst, rRegI src1, immI src2) -%{ - predicate(false); - match(Set dst (AddI src1 src2)); - format %{ "leal $dst, [$src1 + $src2]" %} - ins_encode %{ - __ leal($dst$$Register, Address($src1$$Register, $src2$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaI_rReg_immI2_peep(rRegI dst, rRegI src, immI2 shift) -%{ - predicate(false); - match(Set dst (LShiftI src shift)); - format %{ "leal $dst, [$src << $shift]" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($shift$$constant); - Register src = $src$$Register; - if (scale == Address::times_2 && src != rbp && src != r13) { - __ leal($dst$$Register, Address(src, src, Address::times_1)); - } else { - __ leal($dst$$Register, Address(noreg, src, scale)); - } - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_rReg_peep(rRegL dst, rRegL src1, rRegL src2) -%{ - predicate(false); - match(Set dst (AddL src1 src2)); - format %{ "leaq $dst, [$src1 + $src2]" %} - ins_encode %{ - Register dst = $dst$$Register; - Register src1 = $src1$$Register; - Register src2 = $src2$$Register; - if (src1 != rbp && src1 != r13) { - __ leaq(dst, Address(src1, src2, Address::times_1)); - } else { - assert(src2 != rbp && src2 != r13, ""); - __ leaq(dst, Address(src2, src1, Address::times_1)); - } - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_immL32_peep(rRegL dst, rRegL src1, immL32 src2) -%{ - predicate(false); - match(Set dst (AddL src1 src2)); - format %{ "leaq $dst, [$src1 + $src2]" %} - ins_encode %{ - __ leaq($dst$$Register, Address($src1$$Register, $src2$$constant)); - %} - ins_pipe(ialu_reg_reg); -%} - -instruct leaL_rReg_immI2_peep(rRegL dst, rRegL src, immI2 shift) -%{ - predicate(false); - match(Set dst (LShiftL src shift)); - format %{ "leaq $dst, [$src << $shift]" %} - ins_encode %{ - Address::ScaleFactor scale = static_cast($shift$$constant); - Register src = $src$$Register; - if (scale == Address::times_2 && src != rbp && src != r13) { - __ leaq($dst$$Register, Address(src, src, Address::times_1)); - } else { - __ leaq($dst$$Register, Address(noreg, src, scale)); - } - %} - ins_pipe(ialu_reg_reg); -%} - -// These peephole rules replace mov + I pairs (where I is one of {add, inc, dec, -// sal}) with lea instructions. The {add, sal} rules are beneficial in -// processors with at least partial ALU support for lea -// (supports_fast_2op_lea()), whereas the {inc, dec} rules are only generally -// beneficial for processors with full ALU support -// (VM_Version::supports_fast_3op_lea()) and Intel Cascade Lake. - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (addI_rReg); - peepprocedure (lea_coalesce_reg); - peepreplace (leaI_rReg_rReg_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (addI_rReg_imm); - peepprocedure (lea_coalesce_imm); - peepreplace (leaI_rReg_immI_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_3op_lea() || - VM_Version::is_intel_cascade_lake()); - peepmatch (incI_rReg); - peepprocedure (lea_coalesce_imm); - peepreplace (leaI_rReg_immI_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_3op_lea() || - VM_Version::is_intel_cascade_lake()); - peepmatch (decI_rReg); - peepprocedure (lea_coalesce_imm); - peepreplace (leaI_rReg_immI_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (salI_rReg_immI2); - peepprocedure (lea_coalesce_imm); - peepreplace (leaI_rReg_immI2_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (addL_rReg); - peepprocedure (lea_coalesce_reg); - peepreplace (leaL_rReg_rReg_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (addL_rReg_imm); - peepprocedure (lea_coalesce_imm); - peepreplace (leaL_rReg_immL32_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_3op_lea() || - VM_Version::is_intel_cascade_lake()); - peepmatch (incL_rReg); - peepprocedure (lea_coalesce_imm); - peepreplace (leaL_rReg_immL32_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_3op_lea() || - VM_Version::is_intel_cascade_lake()); - peepmatch (decL_rReg); - peepprocedure (lea_coalesce_imm); - peepreplace (leaL_rReg_immL32_peep()); -%} - -peephole -%{ - peeppredicate(VM_Version::supports_fast_2op_lea()); - peepmatch (salL_rReg_immI2); - peepprocedure (lea_coalesce_imm); - peepreplace (leaL_rReg_immI2_peep()); -%} - -peephole -%{ - peepmatch (leaPCompressedOopOffset); - peepprocedure (lea_remove_redundant); -%} - -peephole -%{ - peepmatch (leaP8Narrow); - peepprocedure (lea_remove_redundant); -%} - -peephole -%{ - peepmatch (leaP32Narrow); - peepprocedure (lea_remove_redundant); -%} - -// These peephole rules matches instructions which set flags and are followed by a testI/L_reg -// The test instruction is redudanent in case the downstream instuctions (like JCC or CMOV) only use flags that are already set by the previous instruction - -//int variant -peephole -%{ - peepmatch (testI_reg); - peepprocedure (test_may_remove); -%} - -//long variant -peephole -%{ - peepmatch (testL_reg); - peepprocedure (test_may_remove); -%} - - -//----------SMARTSPILL RULES--------------------------------------------------- -// These must follow all instruction definitions as they use the names -// defined in the instructions definitions. diff --git a/src/hotspot/os_cpu/bsd_x86/atomicAccess_bsd_x86.hpp b/src/hotspot/os_cpu/bsd_x86/atomicAccess_bsd_x86.hpp index 975580fbd71..1024c6b1418 100644 --- a/src/hotspot/os_cpu/bsd_x86/atomicAccess_bsd_x86.hpp +++ b/src/hotspot/os_cpu/bsd_x86/atomicAccess_bsd_x86.hpp @@ -93,7 +93,6 @@ inline T AtomicAccess::PlatformCmpxchg<4>::operator()(T volatile* dest, return exchange_value; } -#ifdef AMD64 template<> template inline D AtomicAccess::PlatformAdd<8>::fetch_then_add(D volatile* dest, I add_value, @@ -135,51 +134,6 @@ inline T AtomicAccess::PlatformCmpxchg<8>::operator()(T volatile* dest, return exchange_value; } -#else // !AMD64 - -extern "C" { - // defined in bsd_x86.s - int64_t _Atomic_cmpxchg_long(int64_t, volatile int64_t*, int64_t); - void _Atomic_move_long(const volatile int64_t* src, volatile int64_t* dst); -} - -template<> -template -inline T AtomicAccess::PlatformCmpxchg<8>::operator()(T volatile* dest, - T compare_value, - T exchange_value, - atomic_memory_order /* order */) const { - STATIC_ASSERT(8 == sizeof(T)); - return cmpxchg_using_helper(_Atomic_cmpxchg_long, dest, compare_value, exchange_value); -} - -// No direct support for 8-byte xchg; emulate using cmpxchg. -template<> -struct AtomicAccess::PlatformXchg<8> : AtomicAccess::XchgUsingCmpxchg<8> {}; - -// No direct support for 8-byte add; emulate using cmpxchg. -template<> -struct AtomicAccess::PlatformAdd<8> : AtomicAccess::AddUsingCmpxchg<8> {}; - -template<> -template -inline T AtomicAccess::PlatformLoad<8>::operator()(T const volatile* src) const { - STATIC_ASSERT(8 == sizeof(T)); - volatile int64_t dest; - _Atomic_move_long(reinterpret_cast(src), reinterpret_cast(&dest)); - return PrimitiveConversions::cast(dest); -} - -template<> -template -inline void AtomicAccess::PlatformStore<8>::operator()(T volatile* dest, - T store_value) const { - STATIC_ASSERT(8 == sizeof(T)); - _Atomic_move_long(reinterpret_cast(&store_value), reinterpret_cast(dest)); -} - -#endif // AMD64 - template<> struct AtomicAccess::PlatformOrderedStore<1, RELEASE_X_FENCE> { @@ -216,7 +170,6 @@ struct AtomicAccess::PlatformOrderedStore<4, RELEASE_X_FENCE> } }; -#ifdef AMD64 template<> struct AtomicAccess::PlatformOrderedStore<8, RELEASE_X_FENCE> { @@ -228,6 +181,5 @@ struct AtomicAccess::PlatformOrderedStore<8, RELEASE_X_FENCE> : "memory"); } }; -#endif // AMD64 #endif // OS_CPU_BSD_X86_ATOMICACCESS_BSD_X86_HPP diff --git a/src/hotspot/os_cpu/bsd_x86/globals_bsd_x86.hpp b/src/hotspot/os_cpu/bsd_x86/globals_bsd_x86.hpp index f67bb15c69e..1625f313b29 100644 --- a/src/hotspot/os_cpu/bsd_x86/globals_bsd_x86.hpp +++ b/src/hotspot/os_cpu/bsd_x86/globals_bsd_x86.hpp @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,19 +29,9 @@ // Sets the default values for platform dependent flags used by the runtime system. // (see globals.hpp) // -#ifdef AMD64 define_pd_global(intx, CompilerThreadStackSize, 1024); define_pd_global(intx, ThreadStackSize, 1024); // 0 => use system default define_pd_global(intx, VMThreadStackSize, 1024); -#else -define_pd_global(intx, CompilerThreadStackSize, 512); -// ThreadStackSize 320 allows a couple of test cases to run while -// keeping the number of threads that can be created high. System -// default ThreadStackSize appears to be 512 which is too big. -define_pd_global(intx, ThreadStackSize, 320); -define_pd_global(intx, VMThreadStackSize, 512); -#endif // AMD64 - define_pd_global(size_t, JVMInvokeMethodSlack, 8192); diff --git a/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp b/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp index 90e2574abf2..f980c341c8f 100644 --- a/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp +++ b/src/hotspot/os_cpu/bsd_x86/orderAccess_bsd_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -51,11 +51,7 @@ inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { // always use locked addl since mfence is sometimes expensive -#ifdef AMD64 __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory"); -#else - __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); -#endif compiler_barrier(); } diff --git a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp index ecc2e5a7f00..420e7b4cd8d 100644 --- a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp +++ b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp @@ -86,56 +86,34 @@ # define OS_X_10_9_0_KERNEL_MAJOR_VERSION 13 #endif -#ifdef AMD64 #define SPELL_REG_SP "rsp" #define SPELL_REG_FP "rbp" #define REG_BCP context_r13 -#else -#define SPELL_REG_SP "esp" -#define SPELL_REG_FP "ebp" -#endif // AMD64 #ifdef __FreeBSD__ # define context_trapno uc_mcontext.mc_trapno -# ifdef AMD64 -# define context_pc uc_mcontext.mc_rip -# define context_sp uc_mcontext.mc_rsp -# define context_fp uc_mcontext.mc_rbp -# define context_rip uc_mcontext.mc_rip -# define context_rsp uc_mcontext.mc_rsp -# define context_rbp uc_mcontext.mc_rbp -# define context_rax uc_mcontext.mc_rax -# define context_rbx uc_mcontext.mc_rbx -# define context_rcx uc_mcontext.mc_rcx -# define context_rdx uc_mcontext.mc_rdx -# define context_rsi uc_mcontext.mc_rsi -# define context_rdi uc_mcontext.mc_rdi -# define context_r8 uc_mcontext.mc_r8 -# define context_r9 uc_mcontext.mc_r9 -# define context_r10 uc_mcontext.mc_r10 -# define context_r11 uc_mcontext.mc_r11 -# define context_r12 uc_mcontext.mc_r12 -# define context_r13 uc_mcontext.mc_r13 -# define context_r14 uc_mcontext.mc_r14 -# define context_r15 uc_mcontext.mc_r15 -# define context_flags uc_mcontext.mc_flags -# define context_err uc_mcontext.mc_err -# else -# define context_pc uc_mcontext.mc_eip -# define context_sp uc_mcontext.mc_esp -# define context_fp uc_mcontext.mc_ebp -# define context_eip uc_mcontext.mc_eip -# define context_esp uc_mcontext.mc_esp -# define context_eax uc_mcontext.mc_eax -# define context_ebx uc_mcontext.mc_ebx -# define context_ecx uc_mcontext.mc_ecx -# define context_edx uc_mcontext.mc_edx -# define context_ebp uc_mcontext.mc_ebp -# define context_esi uc_mcontext.mc_esi -# define context_edi uc_mcontext.mc_edi -# define context_eflags uc_mcontext.mc_eflags -# define context_trapno uc_mcontext.mc_trapno -# endif +# define context_pc uc_mcontext.mc_rip +# define context_sp uc_mcontext.mc_rsp +# define context_fp uc_mcontext.mc_rbp +# define context_rip uc_mcontext.mc_rip +# define context_rsp uc_mcontext.mc_rsp +# define context_rbp uc_mcontext.mc_rbp +# define context_rax uc_mcontext.mc_rax +# define context_rbx uc_mcontext.mc_rbx +# define context_rcx uc_mcontext.mc_rcx +# define context_rdx uc_mcontext.mc_rdx +# define context_rsi uc_mcontext.mc_rsi +# define context_rdi uc_mcontext.mc_rdi +# define context_r8 uc_mcontext.mc_r8 +# define context_r9 uc_mcontext.mc_r9 +# define context_r10 uc_mcontext.mc_r10 +# define context_r11 uc_mcontext.mc_r11 +# define context_r12 uc_mcontext.mc_r12 +# define context_r13 uc_mcontext.mc_r13 +# define context_r14 uc_mcontext.mc_r14 +# define context_r15 uc_mcontext.mc_r15 +# define context_flags uc_mcontext.mc_flags +# define context_err uc_mcontext.mc_err #endif #ifdef __APPLE__ @@ -146,133 +124,82 @@ #define DU3_PREFIX(s, m) s ## . ## m # endif -# ifdef AMD64 -# define context_pc context_rip -# define context_sp context_rsp -# define context_fp context_rbp -# define context_rip uc_mcontext->DU3_PREFIX(ss,rip) -# define context_rsp uc_mcontext->DU3_PREFIX(ss,rsp) -# define context_rax uc_mcontext->DU3_PREFIX(ss,rax) -# define context_rbx uc_mcontext->DU3_PREFIX(ss,rbx) -# define context_rcx uc_mcontext->DU3_PREFIX(ss,rcx) -# define context_rdx uc_mcontext->DU3_PREFIX(ss,rdx) -# define context_rbp uc_mcontext->DU3_PREFIX(ss,rbp) -# define context_rsi uc_mcontext->DU3_PREFIX(ss,rsi) -# define context_rdi uc_mcontext->DU3_PREFIX(ss,rdi) -# define context_r8 uc_mcontext->DU3_PREFIX(ss,r8) -# define context_r9 uc_mcontext->DU3_PREFIX(ss,r9) -# define context_r10 uc_mcontext->DU3_PREFIX(ss,r10) -# define context_r11 uc_mcontext->DU3_PREFIX(ss,r11) -# define context_r12 uc_mcontext->DU3_PREFIX(ss,r12) -# define context_r13 uc_mcontext->DU3_PREFIX(ss,r13) -# define context_r14 uc_mcontext->DU3_PREFIX(ss,r14) -# define context_r15 uc_mcontext->DU3_PREFIX(ss,r15) -# define context_flags uc_mcontext->DU3_PREFIX(ss,rflags) -# define context_trapno uc_mcontext->DU3_PREFIX(es,trapno) -# define context_err uc_mcontext->DU3_PREFIX(es,err) -# else -# define context_pc context_eip -# define context_sp context_esp -# define context_fp context_ebp -# define context_eip uc_mcontext->DU3_PREFIX(ss,eip) -# define context_esp uc_mcontext->DU3_PREFIX(ss,esp) -# define context_eax uc_mcontext->DU3_PREFIX(ss,eax) -# define context_ebx uc_mcontext->DU3_PREFIX(ss,ebx) -# define context_ecx uc_mcontext->DU3_PREFIX(ss,ecx) -# define context_edx uc_mcontext->DU3_PREFIX(ss,edx) -# define context_ebp uc_mcontext->DU3_PREFIX(ss,ebp) -# define context_esi uc_mcontext->DU3_PREFIX(ss,esi) -# define context_edi uc_mcontext->DU3_PREFIX(ss,edi) -# define context_eflags uc_mcontext->DU3_PREFIX(ss,eflags) -# define context_trapno uc_mcontext->DU3_PREFIX(es,trapno) -# endif +# define context_pc context_rip +# define context_sp context_rsp +# define context_fp context_rbp +# define context_rip uc_mcontext->DU3_PREFIX(ss,rip) +# define context_rsp uc_mcontext->DU3_PREFIX(ss,rsp) +# define context_rax uc_mcontext->DU3_PREFIX(ss,rax) +# define context_rbx uc_mcontext->DU3_PREFIX(ss,rbx) +# define context_rcx uc_mcontext->DU3_PREFIX(ss,rcx) +# define context_rdx uc_mcontext->DU3_PREFIX(ss,rdx) +# define context_rbp uc_mcontext->DU3_PREFIX(ss,rbp) +# define context_rsi uc_mcontext->DU3_PREFIX(ss,rsi) +# define context_rdi uc_mcontext->DU3_PREFIX(ss,rdi) +# define context_r8 uc_mcontext->DU3_PREFIX(ss,r8) +# define context_r9 uc_mcontext->DU3_PREFIX(ss,r9) +# define context_r10 uc_mcontext->DU3_PREFIX(ss,r10) +# define context_r11 uc_mcontext->DU3_PREFIX(ss,r11) +# define context_r12 uc_mcontext->DU3_PREFIX(ss,r12) +# define context_r13 uc_mcontext->DU3_PREFIX(ss,r13) +# define context_r14 uc_mcontext->DU3_PREFIX(ss,r14) +# define context_r15 uc_mcontext->DU3_PREFIX(ss,r15) +# define context_flags uc_mcontext->DU3_PREFIX(ss,rflags) +# define context_trapno uc_mcontext->DU3_PREFIX(es,trapno) +# define context_err uc_mcontext->DU3_PREFIX(es,err) #endif #ifdef __OpenBSD__ # define context_trapno sc_trapno -# ifdef AMD64 -# define context_pc sc_rip -# define context_sp sc_rsp -# define context_fp sc_rbp -# define context_rip sc_rip -# define context_rsp sc_rsp -# define context_rbp sc_rbp -# define context_rax sc_rax -# define context_rbx sc_rbx -# define context_rcx sc_rcx -# define context_rdx sc_rdx -# define context_rsi sc_rsi -# define context_rdi sc_rdi -# define context_r8 sc_r8 -# define context_r9 sc_r9 -# define context_r10 sc_r10 -# define context_r11 sc_r11 -# define context_r12 sc_r12 -# define context_r13 sc_r13 -# define context_r14 sc_r14 -# define context_r15 sc_r15 -# define context_flags sc_rflags -# define context_err sc_err -# else -# define context_pc sc_eip -# define context_sp sc_esp -# define context_fp sc_ebp -# define context_eip sc_eip -# define context_esp sc_esp -# define context_eax sc_eax -# define context_ebx sc_ebx -# define context_ecx sc_ecx -# define context_edx sc_edx -# define context_ebp sc_ebp -# define context_esi sc_esi -# define context_edi sc_edi -# define context_eflags sc_eflags -# define context_trapno sc_trapno -# endif +# define context_pc sc_rip +# define context_sp sc_rsp +# define context_fp sc_rbp +# define context_rip sc_rip +# define context_rsp sc_rsp +# define context_rbp sc_rbp +# define context_rax sc_rax +# define context_rbx sc_rbx +# define context_rcx sc_rcx +# define context_rdx sc_rdx +# define context_rsi sc_rsi +# define context_rdi sc_rdi +# define context_r8 sc_r8 +# define context_r9 sc_r9 +# define context_r10 sc_r10 +# define context_r11 sc_r11 +# define context_r12 sc_r12 +# define context_r13 sc_r13 +# define context_r14 sc_r14 +# define context_r15 sc_r15 +# define context_flags sc_rflags +# define context_err sc_err #endif #ifdef __NetBSD__ # define context_trapno uc_mcontext.__gregs[_REG_TRAPNO] -# ifdef AMD64 -# define __register_t __greg_t -# define context_pc uc_mcontext.__gregs[_REG_RIP] -# define context_sp uc_mcontext.__gregs[_REG_URSP] -# define context_fp uc_mcontext.__gregs[_REG_RBP] -# define context_rip uc_mcontext.__gregs[_REG_RIP] -# define context_rsp uc_mcontext.__gregs[_REG_URSP] -# define context_rax uc_mcontext.__gregs[_REG_RAX] -# define context_rbx uc_mcontext.__gregs[_REG_RBX] -# define context_rcx uc_mcontext.__gregs[_REG_RCX] -# define context_rdx uc_mcontext.__gregs[_REG_RDX] -# define context_rbp uc_mcontext.__gregs[_REG_RBP] -# define context_rsi uc_mcontext.__gregs[_REG_RSI] -# define context_rdi uc_mcontext.__gregs[_REG_RDI] -# define context_r8 uc_mcontext.__gregs[_REG_R8] -# define context_r9 uc_mcontext.__gregs[_REG_R9] -# define context_r10 uc_mcontext.__gregs[_REG_R10] -# define context_r11 uc_mcontext.__gregs[_REG_R11] -# define context_r12 uc_mcontext.__gregs[_REG_R12] -# define context_r13 uc_mcontext.__gregs[_REG_R13] -# define context_r14 uc_mcontext.__gregs[_REG_R14] -# define context_r15 uc_mcontext.__gregs[_REG_R15] -# define context_flags uc_mcontext.__gregs[_REG_RFL] -# define context_err uc_mcontext.__gregs[_REG_ERR] -# else -# define context_pc uc_mcontext.__gregs[_REG_EIP] -# define context_sp uc_mcontext.__gregs[_REG_UESP] -# define context_fp uc_mcontext.__gregs[_REG_EBP] -# define context_eip uc_mcontext.__gregs[_REG_EIP] -# define context_esp uc_mcontext.__gregs[_REG_UESP] -# define context_eax uc_mcontext.__gregs[_REG_EAX] -# define context_ebx uc_mcontext.__gregs[_REG_EBX] -# define context_ecx uc_mcontext.__gregs[_REG_ECX] -# define context_edx uc_mcontext.__gregs[_REG_EDX] -# define context_ebp uc_mcontext.__gregs[_REG_EBP] -# define context_esi uc_mcontext.__gregs[_REG_ESI] -# define context_edi uc_mcontext.__gregs[_REG_EDI] -# define context_eflags uc_mcontext.__gregs[_REG_EFL] -# define context_trapno uc_mcontext.__gregs[_REG_TRAPNO] -# endif +# define __register_t __greg_t +# define context_pc uc_mcontext.__gregs[_REG_RIP] +# define context_sp uc_mcontext.__gregs[_REG_URSP] +# define context_fp uc_mcontext.__gregs[_REG_RBP] +# define context_rip uc_mcontext.__gregs[_REG_RIP] +# define context_rsp uc_mcontext.__gregs[_REG_URSP] +# define context_rax uc_mcontext.__gregs[_REG_RAX] +# define context_rbx uc_mcontext.__gregs[_REG_RBX] +# define context_rcx uc_mcontext.__gregs[_REG_RCX] +# define context_rdx uc_mcontext.__gregs[_REG_RDX] +# define context_rbp uc_mcontext.__gregs[_REG_RBP] +# define context_rsi uc_mcontext.__gregs[_REG_RSI] +# define context_rdi uc_mcontext.__gregs[_REG_RDI] +# define context_r8 uc_mcontext.__gregs[_REG_R8] +# define context_r9 uc_mcontext.__gregs[_REG_R9] +# define context_r10 uc_mcontext.__gregs[_REG_R10] +# define context_r11 uc_mcontext.__gregs[_REG_R11] +# define context_r12 uc_mcontext.__gregs[_REG_R12] +# define context_r13 uc_mcontext.__gregs[_REG_R13] +# define context_r14 uc_mcontext.__gregs[_REG_R14] +# define context_r15 uc_mcontext.__gregs[_REG_R15] +# define context_flags uc_mcontext.__gregs[_REG_RFL] +# define context_err uc_mcontext.__gregs[_REG_ERR] #endif address os::current_stack_pointer() { @@ -468,13 +395,11 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, } stub = SharedRuntime::handle_unsafe_access(thread, next_pc); } - } else -#ifdef AMD64 - if (sig == SIGFPE && - (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV - // Workaround for macOS ARM incorrectly reporting FPE_FLTINV for "div by 0" - // instead of the expected FPE_FLTDIV when running x86_64 binary under Rosetta emulation - MACOS_ONLY(|| (VM_Version::is_cpu_emulated() && info->si_code == FPE_FLTINV)))) { + } else if (sig == SIGFPE && + (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV + // Workaround for macOS ARM incorrectly reporting FPE_FLTINV for "div by 0" + // instead of the expected FPE_FLTDIV when running x86_64 binary under Rosetta emulation + MACOS_ONLY(|| (VM_Version::is_cpu_emulated() && info->si_code == FPE_FLTINV)))) { stub = SharedRuntime:: continuation_for_implicit_exception(thread, @@ -502,34 +427,6 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, fatal("please update this code."); } #endif /* __APPLE__ */ - -#else - if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) { - // HACK: si_code does not work on bsd 2.2.12-20!!! - int op = pc[0]; - if (op == 0xDB) { - // FIST - // TODO: The encoding of D2I in x86_32.ad can cause an exception - // prior to the fist instruction if there was an invalid operation - // pending. We want to dismiss that exception. From the win_32 - // side it also seems that if it really was the fist causing - // the exception that we do the d2i by hand with different - // rounding. Seems kind of weird. - // NOTE: that we take the exception at the NEXT floating point instruction. - assert(pc[0] == 0xDB, "not a FIST opcode"); - assert(pc[1] == 0x14, "not a FIST opcode"); - assert(pc[2] == 0x24, "not a FIST opcode"); - return true; - } else if (op == 0xF7) { - // IDIV - stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO); - } else { - // TODO: handle more cases if we are using other x86 instructions - // that can generate SIGFPE signal on bsd. - tty->print_cr("unknown opcode 0x%X with SIGFPE.", op); - fatal("please update this code."); - } -#endif // AMD64 } else if ((sig == SIGSEGV || sig == SIGBUS) && MacroAssembler::uses_implicit_null_check(info->si_addr)) { // Determination of interpreter/vtable stub/compiled code null exception @@ -556,81 +453,6 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, } } -#ifndef AMD64 - // Execution protection violation - // - // This should be kept as the last step in the triage. We don't - // have a dedicated trap number for a no-execute fault, so be - // conservative and allow other handlers the first shot. - // - // Note: We don't test that info->si_code == SEGV_ACCERR here. - // this si_code is so generic that it is almost meaningless; and - // the si_code for this condition may change in the future. - // Furthermore, a false-positive should be harmless. - if (UnguardOnExecutionViolation > 0 && - stub == nullptr && - (sig == SIGSEGV || sig == SIGBUS) && - uc->context_trapno == trap_page_fault) { - size_t page_size = os::vm_page_size(); - address addr = (address) info->si_addr; - address pc = os::Posix::ucontext_get_pc(uc); - // Make sure the pc and the faulting address are sane. - // - // If an instruction spans a page boundary, and the page containing - // the beginning of the instruction is executable but the following - // page is not, the pc and the faulting address might be slightly - // different - we still want to unguard the 2nd page in this case. - // - // 15 bytes seems to be a (very) safe value for max instruction size. - bool pc_is_near_addr = - (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15); - bool instr_spans_page_boundary = - (align_down((intptr_t) pc ^ (intptr_t) addr, - (intptr_t) page_size) > 0); - - if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) { - static volatile address last_addr = - (address) os::non_memory_address_word(); - - // In conservative mode, don't unguard unless the address is in the VM - if (addr != last_addr && - (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { - - // Set memory to RWX and retry - address page_start = align_down(addr, page_size); - bool res = os::protect_memory((char*) page_start, page_size, - os::MEM_PROT_RWX); - - log_debug(os)("Execution protection violation " - "at " INTPTR_FORMAT - ", unguarding " INTPTR_FORMAT ": %s, errno=%d", p2i(addr), - p2i(page_start), (res ? "success" : "failed"), errno); - stub = pc; - - // Set last_addr so if we fault again at the same address, we don't end - // up in an endless loop. - // - // There are two potential complications here. Two threads trapping at - // the same address at the same time could cause one of the threads to - // think it already unguarded, and abort the VM. Likely very rare. - // - // The other race involves two threads alternately trapping at - // different addresses and failing to unguard the page, resulting in - // an endless loop. This condition is probably even more unlikely than - // the first. - // - // Although both cases could be avoided by using locks or thread local - // last_addr, these solutions are unnecessary complication: this - // handler is a best-effort safety net, not a complete solution. It is - // disabled by default and should only be used as a workaround in case - // we missed any no-execute-unsafe VM code. - - last_addr = addr; - } - } - } -#endif // !AMD64 - if (stub != nullptr) { // save all thread context in case we need to restore it if (thread != nullptr) thread->set_saved_exception_pc(pc); @@ -646,10 +468,6 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, extern "C" void fixcw(); void os::Bsd::init_thread_fpu_state(void) { -#ifndef AMD64 - // Set fpu to 53 bit precision. This happens too early to use a stub. - fixcw(); -#endif // !AMD64 } juint os::cpu_microcode_revision() { @@ -671,26 +489,12 @@ juint os::cpu_microcode_revision() { // HotSpot guard pages is added later. size_t os::_compiler_thread_min_stack_allowed = 48 * K; size_t os::_java_thread_min_stack_allowed = 48 * K; -#ifdef _LP64 size_t os::_vm_internal_thread_min_stack_allowed = 64 * K; -#else -size_t os::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -#endif // _LP64 - -#ifndef AMD64 -#ifdef __GNUC__ -#define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;}) -#endif -#endif // AMD64 // return default stack size for thr_type size_t os::Posix::default_stack_size(os::ThreadType thr_type) { // default stack size (compiler thread needs larger stack) -#ifdef AMD64 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M); -#else - size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K); -#endif // AMD64 return s; } @@ -803,7 +607,6 @@ void os::print_context(outputStream *st, const void *context) { const ucontext_t *uc = (const ucontext_t*)context; st->print_cr("Registers:"); -#ifdef AMD64 st->print( "RAX=" INTPTR_FORMAT, (intptr_t)uc->context_rax); st->print(", RBX=" INTPTR_FORMAT, (intptr_t)uc->context_rbx); st->print(", RCX=" INTPTR_FORMAT, (intptr_t)uc->context_rcx); @@ -829,26 +632,12 @@ void os::print_context(outputStream *st, const void *context) { st->print(", ERR=" INTPTR_FORMAT, (intptr_t)uc->context_err); st->cr(); st->print(" TRAPNO=" INTPTR_FORMAT, (intptr_t)uc->context_trapno); -#else - st->print( "EAX=" INTPTR_FORMAT, (intptr_t)uc->context_eax); - st->print(", EBX=" INTPTR_FORMAT, (intptr_t)uc->context_ebx); - st->print(", ECX=" INTPTR_FORMAT, (intptr_t)uc->context_ecx); - st->print(", EDX=" INTPTR_FORMAT, (intptr_t)uc->context_edx); - st->cr(); - st->print( "ESP=" INTPTR_FORMAT, (intptr_t)uc->context_esp); - st->print(", EBP=" INTPTR_FORMAT, (intptr_t)uc->context_ebp); - st->print(", ESI=" INTPTR_FORMAT, (intptr_t)uc->context_esi); - st->print(", EDI=" INTPTR_FORMAT, (intptr_t)uc->context_edi); - st->cr(); - st->print( "EIP=" INTPTR_FORMAT, (intptr_t)uc->context_eip); - st->print(", EFLAGS=" INTPTR_FORMAT, (intptr_t)uc->context_eflags); -#endif // AMD64 st->cr(); st->cr(); } void os::print_register_info(outputStream *st, const void *context, int& continuation) { - const int register_count = AMD64_ONLY(16) NOT_AMD64(8); + const int register_count = 16; int n = continuation; assert(n >= 0 && n <= register_count, "Invalid continuation value"); if (context == nullptr || n == register_count) { @@ -861,7 +650,6 @@ void os::print_register_info(outputStream *st, const void *context, int& continu continuation = n + 1; # define CASE_PRINT_REG(n, str, id) case n: st->print(str); print_location(st, uc->context_##id); switch (n) { -#ifdef AMD64 CASE_PRINT_REG( 0, "RAX=", rax); break; CASE_PRINT_REG( 1, "RBX=", rbx); break; CASE_PRINT_REG( 2, "RCX=", rcx); break; @@ -878,28 +666,13 @@ void os::print_register_info(outputStream *st, const void *context, int& continu CASE_PRINT_REG(13, "R13=", r13); break; CASE_PRINT_REG(14, "R14=", r14); break; CASE_PRINT_REG(15, "R15=", r15); break; -#else - CASE_PRINT_REG(0, "EAX=", eax); break; - CASE_PRINT_REG(1, "EBX=", ebx); break; - CASE_PRINT_REG(2, "ECX=", ecx); break; - CASE_PRINT_REG(3, "EDX=", edx); break; - CASE_PRINT_REG(4, "ESP=", esp); break; - CASE_PRINT_REG(5, "EBP=", ebp); break; - CASE_PRINT_REG(6, "ESI=", esi); break; - CASE_PRINT_REG(7, "EDI=", edi); break; -#endif // AMD64 - } + } # undef CASE_PRINT_REG ++n; } } void os::setup_fpu() { -#ifndef AMD64 - address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std(); - __asm__ volatile ( "fldcw (%0)" : - : "r" (fpu_cntrl) : "memory"); -#endif // !AMD64 } #ifndef PRODUCT diff --git a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.inline.hpp b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.inline.hpp index 5398a642d84..fa4b76c4d3d 100644 --- a/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.inline.hpp +++ b/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -39,18 +39,11 @@ inline size_t os::cds_core_region_alignment() { // See http://www.technovelty.org/code/c/reading-rdtsc.htl for details inline jlong os::rdtsc() { -#ifndef AMD64 - // 64 bit result in edx:eax - uint64_t res; - __asm__ __volatile__ ("rdtsc" : "=A" (res)); - return (jlong)res; -#else uint64_t res; uint32_t ts1, ts2; __asm__ __volatile__ ("rdtsc" : "=a" (ts1), "=d" (ts2)); res = ((uint64_t)ts1 | (uint64_t)ts2 << 32); return (jlong)res; -#endif // AMD64 } #endif // OS_CPU_BSD_X86_OS_BSD_X86_INLINE_HPP diff --git a/src/hotspot/os_cpu/bsd_x86/prefetch_bsd_x86.inline.hpp b/src/hotspot/os_cpu/bsd_x86/prefetch_bsd_x86.inline.hpp index cb0db2f360c..52cc405e211 100644 --- a/src/hotspot/os_cpu/bsd_x86/prefetch_bsd_x86.inline.hpp +++ b/src/hotspot/os_cpu/bsd_x86/prefetch_bsd_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -29,19 +29,13 @@ inline void Prefetch::read (const void *loc, intx interval) { -#ifdef AMD64 __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval)); -#endif // AMD64 } inline void Prefetch::write(void *loc, intx interval) { -#ifdef AMD64 - // Do not use the 3dnow prefetchw instruction. It isn't supported on em64t. // __asm__ ("prefetchw (%0,%1,1)" : : "r" (loc), "r" (interval)); __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval)); - -#endif // AMD64 } #endif // OS_CPU_BSD_X86_PREFETCH_BSD_X86_INLINE_HPP diff --git a/src/hotspot/os_cpu/linux_x86/atomicAccess_linux_x86.hpp b/src/hotspot/os_cpu/linux_x86/atomicAccess_linux_x86.hpp index c9af982525d..dd91444d0a3 100644 --- a/src/hotspot/os_cpu/linux_x86/atomicAccess_linux_x86.hpp +++ b/src/hotspot/os_cpu/linux_x86/atomicAccess_linux_x86.hpp @@ -93,8 +93,6 @@ inline T AtomicAccess::PlatformCmpxchg<4>::operator()(T volatile* dest, return exchange_value; } -#ifdef AMD64 - template<> template inline D AtomicAccess::PlatformAdd<8>::fetch_then_add(D volatile* dest, I add_value, @@ -135,51 +133,6 @@ inline T AtomicAccess::PlatformCmpxchg<8>::operator()(T volatile* dest, return exchange_value; } -#else // !AMD64 - -extern "C" { - // defined in linux_x86.s - int64_t _Atomic_cmpxchg_long(int64_t, volatile int64_t*, int64_t); - void _Atomic_move_long(const volatile int64_t* src, volatile int64_t* dst); -} - -template<> -template -inline T AtomicAccess::PlatformCmpxchg<8>::operator()(T volatile* dest, - T compare_value, - T exchange_value, - atomic_memory_order order) const { - STATIC_ASSERT(8 == sizeof(T)); - return cmpxchg_using_helper(_Atomic_cmpxchg_long, dest, compare_value, exchange_value); -} - -// No direct support for 8-byte xchg; emulate using cmpxchg. -template<> -struct AtomicAccess::PlatformXchg<8> : AtomicAccess::XchgUsingCmpxchg<8> {}; - -// No direct support for 8-byte add; emulate using cmpxchg. -template<> -struct AtomicAccess::PlatformAdd<8> : AtomicAccess::AddUsingCmpxchg<8> {}; - -template<> -template -inline T AtomicAccess::PlatformLoad<8>::operator()(T const volatile* src) const { - STATIC_ASSERT(8 == sizeof(T)); - volatile int64_t dest; - _Atomic_move_long(reinterpret_cast(src), reinterpret_cast(&dest)); - return PrimitiveConversions::cast(dest); -} - -template<> -template -inline void AtomicAccess::PlatformStore<8>::operator()(T volatile* dest, - T store_value) const { - STATIC_ASSERT(8 == sizeof(T)); - _Atomic_move_long(reinterpret_cast(&store_value), reinterpret_cast(dest)); -} - -#endif // AMD64 - template<> struct AtomicAccess::PlatformOrderedStore<1, RELEASE_X_FENCE> { @@ -216,7 +169,6 @@ struct AtomicAccess::PlatformOrderedStore<4, RELEASE_X_FENCE> } }; -#ifdef AMD64 template<> struct AtomicAccess::PlatformOrderedStore<8, RELEASE_X_FENCE> { @@ -228,6 +180,5 @@ struct AtomicAccess::PlatformOrderedStore<8, RELEASE_X_FENCE> : "memory"); } }; -#endif // AMD64 #endif // OS_CPU_LINUX_X86_ATOMICACCESS_LINUX_X86_HPP diff --git a/src/hotspot/os_cpu/linux_x86/globals_linux_x86.hpp b/src/hotspot/os_cpu/linux_x86/globals_linux_x86.hpp index 97a5732d00a..e48538ecc7c 100644 --- a/src/hotspot/os_cpu/linux_x86/globals_linux_x86.hpp +++ b/src/hotspot/os_cpu/linux_x86/globals_linux_x86.hpp @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,24 +28,9 @@ // Sets the default values for platform dependent flags used by the runtime system. // (see globals.hpp) -#ifdef AMD64 define_pd_global(intx, CompilerThreadStackSize, 1024); define_pd_global(intx, ThreadStackSize, 1024); // 0 => use system default define_pd_global(intx, VMThreadStackSize, 1024); -#else -// Some tests in debug VM mode run out of compile thread stack. -// Observed on some x86_32 VarHandles tests during escape analysis. -#ifdef ASSERT -define_pd_global(intx, CompilerThreadStackSize, 768); -#else -define_pd_global(intx, CompilerThreadStackSize, 512); -#endif -// ThreadStackSize 320 allows a couple of test cases to run while -// keeping the number of threads that can be created high. System -// default ThreadStackSize appears to be 512 which is too big. -define_pd_global(intx, ThreadStackSize, 320); -define_pd_global(intx, VMThreadStackSize, 512); -#endif // AMD64 define_pd_global(size_t, JVMInvokeMethodSlack, 8192); diff --git a/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp b/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp index a22f547c071..0c6aaacb502 100644 --- a/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp +++ b/src/hotspot/os_cpu/linux_x86/orderAccess_linux_x86.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -46,12 +46,8 @@ inline void OrderAccess::acquire() { compiler_barrier(); } inline void OrderAccess::release() { compiler_barrier(); } inline void OrderAccess::fence() { - // always use locked addl since mfence is sometimes expensive -#ifdef AMD64 + // always use locked addl since mfence is sometimes expensive __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory"); -#else - __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); -#endif compiler_barrier(); } @@ -60,13 +56,7 @@ inline void OrderAccess::cross_modify_fence_impl() { __asm__ volatile (".byte 0x0f, 0x01, 0xe8\n\t" : : :); //serialize } else { int idx = 0; -#ifdef AMD64 __asm__ volatile ("cpuid " : "+a" (idx) : : "ebx", "ecx", "edx", "memory"); -#else - // On some x86 systems EBX is a reserved register that cannot be - // clobbered, so we must protect it around the CPUID. - __asm__ volatile ("xchg %%esi, %%ebx; cpuid; xchg %%esi, %%ebx " : "+a" (idx) : : "esi", "ecx", "edx", "memory"); -#endif } } diff --git a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp index ff7fce234c4..a7f4e5ef688 100644 --- a/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp +++ b/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp @@ -72,24 +72,13 @@ # include # include # include -#ifndef AMD64 -# include -#endif -#ifdef AMD64 #define REG_SP REG_RSP #define REG_PC REG_RIP #define REG_FP REG_RBP #define REG_BCP REG_R13 #define SPELL_REG_SP "rsp" #define SPELL_REG_FP "rbp" -#else -#define REG_SP REG_UESP -#define REG_PC REG_EIP -#define REG_FP REG_EBP -#define SPELL_REG_SP "esp" -#define SPELL_REG_FP "ebp" -#endif // AMD64 address os::current_stack_pointer() { return (address)__builtin_frame_address(0); @@ -281,43 +270,14 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, } stub = SharedRuntime::handle_unsafe_access(thread, next_pc); } - } else -#ifdef AMD64 - if (sig == SIGFPE && - (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV)) { + } else if (sig == SIGFPE && + (info->si_code == FPE_INTDIV || info->si_code == FPE_FLTDIV)) { stub = SharedRuntime:: continuation_for_implicit_exception(thread, pc, SharedRuntime:: IMPLICIT_DIVIDE_BY_ZERO); -#else - if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) { - // HACK: si_code does not work on linux 2.2.12-20!!! - int op = pc[0]; - if (op == 0xDB) { - // FIST - // TODO: The encoding of D2I in x86_32.ad can cause an exception - // prior to the fist instruction if there was an invalid operation - // pending. We want to dismiss that exception. From the win_32 - // side it also seems that if it really was the fist causing - // the exception that we do the d2i by hand with different - // rounding. Seems kind of weird. - // NOTE: that we take the exception at the NEXT floating point instruction. - assert(pc[0] == 0xDB, "not a FIST opcode"); - assert(pc[1] == 0x14, "not a FIST opcode"); - assert(pc[2] == 0x24, "not a FIST opcode"); - return true; - } else if (op == 0xF7) { - // IDIV - stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO); - } else { - // TODO: handle more cases if we are using other x86 instructions - // that can generate SIGFPE signal on linux. - tty->print_cr("unknown opcode 0x%X with SIGFPE.", op); - fatal("please update this code."); - } -#endif // AMD64 } else if (sig == SIGSEGV && MacroAssembler::uses_implicit_null_check(info->si_addr)) { // Determination of interpreter/vtable stub/compiled code null exception @@ -344,81 +304,6 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, } } -#ifndef AMD64 - // Execution protection violation - // - // This should be kept as the last step in the triage. We don't - // have a dedicated trap number for a no-execute fault, so be - // conservative and allow other handlers the first shot. - // - // Note: We don't test that info->si_code == SEGV_ACCERR here. - // this si_code is so generic that it is almost meaningless; and - // the si_code for this condition may change in the future. - // Furthermore, a false-positive should be harmless. - if (UnguardOnExecutionViolation > 0 && - stub == nullptr && - (sig == SIGSEGV || sig == SIGBUS) && - uc->uc_mcontext.gregs[REG_TRAPNO] == trap_page_fault) { - size_t page_size = os::vm_page_size(); - address addr = (address) info->si_addr; - address pc = os::Posix::ucontext_get_pc(uc); - // Make sure the pc and the faulting address are sane. - // - // If an instruction spans a page boundary, and the page containing - // the beginning of the instruction is executable but the following - // page is not, the pc and the faulting address might be slightly - // different - we still want to unguard the 2nd page in this case. - // - // 15 bytes seems to be a (very) safe value for max instruction size. - bool pc_is_near_addr = - (pointer_delta((void*) addr, (void*) pc, sizeof(char)) < 15); - bool instr_spans_page_boundary = - (align_down((intptr_t) pc ^ (intptr_t) addr, - (intptr_t) page_size) > 0); - - if (pc == addr || (pc_is_near_addr && instr_spans_page_boundary)) { - static volatile address last_addr = - (address) os::non_memory_address_word(); - - // In conservative mode, don't unguard unless the address is in the VM - if (addr != last_addr && - (UnguardOnExecutionViolation > 1 || os::address_is_in_vm(addr))) { - - // Set memory to RWX and retry - address page_start = align_down(addr, page_size); - bool res = os::protect_memory((char*) page_start, page_size, - os::MEM_PROT_RWX); - - log_debug(os)("Execution protection violation " - "at " INTPTR_FORMAT - ", unguarding " INTPTR_FORMAT ": %s, errno=%d", p2i(addr), - p2i(page_start), (res ? "success" : "failed"), errno); - stub = pc; - - // Set last_addr so if we fault again at the same address, we don't end - // up in an endless loop. - // - // There are two potential complications here. Two threads trapping at - // the same address at the same time could cause one of the threads to - // think it already unguarded, and abort the VM. Likely very rare. - // - // The other race involves two threads alternately trapping at - // different addresses and failing to unguard the page, resulting in - // an endless loop. This condition is probably even more unlikely than - // the first. - // - // Although both cases could be avoided by using locks or thread local - // last_addr, these solutions are unnecessary complication: this - // handler is a best-effort safety net, not a complete solution. It is - // disabled by default and should only be used as a workaround in case - // we missed any no-execute-unsafe VM code. - - last_addr = addr; - } - } - } -#endif // !AMD64 - if (stub != nullptr) { // save all thread context in case we need to restore it if (thread != nullptr) thread->set_saved_exception_pc(pc); @@ -431,26 +316,13 @@ bool PosixSignals::pd_hotspot_signal_handler(int sig, siginfo_t* info, } void os::Linux::init_thread_fpu_state(void) { -#ifndef AMD64 - // set fpu to 53 bit precision - set_fpu_control_word(0x27f); -#endif // !AMD64 } int os::Linux::get_fpu_control_word(void) { -#ifdef AMD64 return 0; -#else - int fpu_control; - _FPU_GETCW(fpu_control); - return fpu_control & 0xffff; -#endif // AMD64 } void os::Linux::set_fpu_control_word(int fpu_control) { -#ifndef AMD64 - _FPU_SETCW(fpu_control); -#endif // !AMD64 } juint os::cpu_microcode_revision() { @@ -496,20 +368,12 @@ juint os::cpu_microcode_revision() { // HotSpot guard pages is added later. size_t os::_compiler_thread_min_stack_allowed = 48 * K; size_t os::_java_thread_min_stack_allowed = 40 * K; -#ifdef _LP64 size_t os::_vm_internal_thread_min_stack_allowed = 64 * K; -#else -size_t os::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K; -#endif // _LP64 // return default stack size for thr_type size_t os::Posix::default_stack_size(os::ThreadType thr_type) { // default stack size (compiler thread needs larger stack) -#ifdef AMD64 size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M); -#else - size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K); -#endif // AMD64 return s; } @@ -522,7 +386,6 @@ void os::print_context(outputStream *st, const void *context) { const ucontext_t *uc = (const ucontext_t*)context; st->print_cr("Registers:"); -#ifdef AMD64 st->print( "RAX=" INTPTR_FORMAT, (intptr_t)uc->uc_mcontext.gregs[REG_RAX]); st->print(", RBX=" INTPTR_FORMAT, (intptr_t)uc->uc_mcontext.gregs[REG_RBX]); st->print(", RCX=" INTPTR_FORMAT, (intptr_t)uc->uc_mcontext.gregs[REG_RCX]); @@ -564,27 +427,12 @@ void os::print_context(outputStream *st, const void *context) { } st->print(" MXCSR=" UINT32_FORMAT_X_0, uc->uc_mcontext.fpregs->mxcsr); } -#else - st->print( "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]); - st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]); - st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]); - st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]); - st->cr(); - st->print( "ESP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_UESP]); - st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]); - st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]); - st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]); - st->cr(); - st->print( "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]); - st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]); - st->print(", CR2=" UINT64_FORMAT_X_0, (uint64_t)uc->uc_mcontext.cr2); -#endif // AMD64 st->cr(); st->cr(); } void os::print_register_info(outputStream *st, const void *context, int& continuation) { - const int register_count = AMD64_ONLY(16) NOT_AMD64(8); + const int register_count = 16; int n = continuation; assert(n >= 0 && n <= register_count, "Invalid continuation value"); if (context == nullptr || n == register_count) { @@ -597,7 +445,6 @@ void os::print_register_info(outputStream *st, const void *context, int& continu continuation = n + 1; # define CASE_PRINT_REG(n, str, id) case n: st->print(str); print_location(st, uc->uc_mcontext.gregs[REG_##id]); switch (n) { -#ifdef AMD64 CASE_PRINT_REG( 0, "RAX=", RAX); break; CASE_PRINT_REG( 1, "RBX=", RBX); break; CASE_PRINT_REG( 2, "RCX=", RCX); break; @@ -614,16 +461,6 @@ void os::print_register_info(outputStream *st, const void *context, int& continu CASE_PRINT_REG(13, "R13=", R13); break; CASE_PRINT_REG(14, "R14=", R14); break; CASE_PRINT_REG(15, "R15=", R15); break; -#else - CASE_PRINT_REG(0, "EAX=", EAX); break; - CASE_PRINT_REG(1, "EBX=", EBX); break; - CASE_PRINT_REG(2, "ECX=", ECX); break; - CASE_PRINT_REG(3, "EDX=", EDX); break; - CASE_PRINT_REG(4, "ESP=", ESP); break; - CASE_PRINT_REG(5, "EBP=", EBP); break; - CASE_PRINT_REG(6, "ESI=", ESI); break; - CASE_PRINT_REG(7, "EDI=", EDI); break; -#endif // AMD64 } # undef CASE_PRINT_REG ++n; @@ -631,18 +468,11 @@ void os::print_register_info(outputStream *st, const void *context, int& continu } void os::setup_fpu() { -#ifndef AMD64 - address fpu_cntrl = StubRoutines::x86::addr_fpu_cntrl_wrd_std(); - __asm__ volatile ( "fldcw (%0)" : - : "r" (fpu_cntrl) : "memory"); -#endif // !AMD64 } #ifndef PRODUCT void os::verify_stack_alignment() { -#ifdef AMD64 assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment"); -#endif } #endif diff --git a/src/hotspot/os_cpu/linux_x86/os_linux_x86.inline.hpp b/src/hotspot/os_cpu/linux_x86/os_linux_x86.inline.hpp index 535f318cfbd..11c6c77644e 100644 --- a/src/hotspot/os_cpu/linux_x86/os_linux_x86.inline.hpp +++ b/src/hotspot/os_cpu/linux_x86/os_linux_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2019, 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. * * This code is free software; you can redistribute it and/or modify it @@ -29,18 +29,11 @@ // See http://www.technovelty.org/code/c/reading-rdtsc.htl for details inline jlong os::rdtsc() { -#ifndef AMD64 - // 64 bit result in edx:eax - uint64_t res; - __asm__ __volatile__ ("rdtsc" : "=A" (res)); - return (jlong)res; -#else uint64_t res; uint32_t ts1, ts2; __asm__ __volatile__ ("rdtsc" : "=a" (ts1), "=d" (ts2)); res = ((uint64_t)ts1 | (uint64_t)ts2 << 32); return (jlong)res; -#endif // AMD64 } #endif // OS_CPU_LINUX_X86_OS_LINUX_X86_INLINE_HPP diff --git a/src/hotspot/os_cpu/linux_x86/prefetch_linux_x86.inline.hpp b/src/hotspot/os_cpu/linux_x86/prefetch_linux_x86.inline.hpp index cf60c2cbd6b..bb4302e1ddb 100644 --- a/src/hotspot/os_cpu/linux_x86/prefetch_linux_x86.inline.hpp +++ b/src/hotspot/os_cpu/linux_x86/prefetch_linux_x86.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -29,19 +29,13 @@ inline void Prefetch::read (const void *loc, intx interval) { -#ifdef AMD64 __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval)); -#endif // AMD64 } inline void Prefetch::write(void *loc, intx interval) { -#ifdef AMD64 - // Do not use the 3dnow prefetchw instruction. It isn't supported on em64t. // __asm__ ("prefetchw (%0,%1,1)" : : "r" (loc), "r" (interval)); __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval)); - -#endif // AMD64 } #endif // OS_CPU_LINUX_X86_PREFETCH_LINUX_X86_INLINE_HPP diff --git a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp index c688848c790..e3291d3a6ca 100644 --- a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp +++ b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp @@ -162,7 +162,6 @@ bool os::win32::register_code_area(char *low, char *high) { return true; } -#if defined(_M_AMD64) //----------------------------------------------------------------------------- bool handle_FLT_exception(struct _EXCEPTION_POINTERS* exceptionInfo) { // handle exception caused by native method modifying control word @@ -197,7 +196,6 @@ bool handle_FLT_exception(struct _EXCEPTION_POINTERS* exceptionInfo) { return false; } -#endif address os::fetch_frame_from_context(const void* ucVoid, intptr_t** ret_sp, intptr_t** ret_fp) { From b166b0d0826435c7965f3f11e8f3cec1392e1e01 Mon Sep 17 00:00:00 2001 From: Francesco Andreuzzi Date: Thu, 30 Oct 2025 14:23:31 +0000 Subject: [PATCH 364/561] 8370730: Test serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java needs to be resilient about warnings Reviewed-by: sspitsyn, cjplummer --- .../serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java | 1 - 1 file changed, 1 deletion(-) diff --git a/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java index cb1596da08c..01ea18296e5 100644 --- a/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java +++ b/test/hotspot/jtreg/serviceability/attach/EarlyDynamicLoad/EarlyDynamicLoad.java @@ -75,7 +75,6 @@ public class EarlyDynamicLoad { OutputAnalyzer analyzer = new OutputAnalyzer(child); analyzer.shouldHaveExitValue(0); - analyzer.stderrShouldBeEmpty(); } @Test From a33aa65fbc70a91fe21e9016c393bb5a764cd75a Mon Sep 17 00:00:00 2001 From: Serguei Spitsyn Date: Thu, 30 Oct 2025 14:24:00 +0000 Subject: [PATCH 365/561] 8369609: calls from Continuations to invalidate_jvmti_stack must be more accurate Reviewed-by: pchilanomate, dholmes --- .../share/runtime/continuationFreezeThaw.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/runtime/continuationFreezeThaw.cpp b/src/hotspot/share/runtime/continuationFreezeThaw.cpp index 3e509e71551..78aa532b28b 100644 --- a/src/hotspot/share/runtime/continuationFreezeThaw.cpp +++ b/src/hotspot/share/runtime/continuationFreezeThaw.cpp @@ -1626,13 +1626,15 @@ static void invalidate_jvmti_stack(JavaThread* thread) { } static void jvmti_yield_cleanup(JavaThread* thread, ContinuationWrapper& cont) { - if (!cont.entry()->is_virtual_thread() && JvmtiExport::has_frame_pops(thread)) { - int num_frames = num_java_frames(cont); + if (!cont.entry()->is_virtual_thread()) { + if (JvmtiExport::has_frame_pops(thread)) { + int num_frames = num_java_frames(cont); - ContinuationWrapper::SafepointOp so(Thread::current(), cont); - JvmtiExport::continuation_yield_cleanup(JavaThread::current(), num_frames); + ContinuationWrapper::SafepointOp so(Thread::current(), cont); + JvmtiExport::continuation_yield_cleanup(thread, num_frames); + } + invalidate_jvmti_stack(thread); } - invalidate_jvmti_stack(thread); } static void jvmti_mount_end(JavaThread* current, ContinuationWrapper& cont, frame top) { @@ -2310,7 +2312,7 @@ NOINLINE intptr_t* Thaw::thaw_slow(stackChunkOop chunk, Continuation::t assert(_cont.chunk_invariant(), ""); - JVMTI_ONLY(invalidate_jvmti_stack(_thread)); + JVMTI_ONLY(if (!_cont.entry()->is_virtual_thread()) invalidate_jvmti_stack(_thread)); _thread->set_cont_fastpath(_fastpath); From bb9aeedd880d4ae81d301edbbc903c3cb53c0526 Mon Sep 17 00:00:00 2001 From: Kevin Walls Date: Thu, 30 Oct 2025 15:22:28 +0000 Subject: [PATCH 366/561] 8370908: Remove test javax/management/remote/mandatory/connection/DeadLockTest.java from ProblemList-Virtual Reviewed-by: cjplummer --- test/jdk/ProblemList-Virtual.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt index dffbd4a952e..d4af29c8f17 100644 --- a/test/jdk/ProblemList-Virtual.txt +++ b/test/jdk/ProblemList-Virtual.txt @@ -34,7 +34,5 @@ java/lang/ScopedValue/StressStackOverflow.java#default 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#no-TieredCompilation 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#TieredStopAtLevel1 8309646 generic-all -javax/management/remote/mandatory/connection/DeadLockTest.java 8309069 windows-x64 - javax/management/remote/mandatory/connection/ConnectionTest.java 8308352 windows-x64 From ed36b9bb6f3d429db6accfb3b096e50e7f2217ff Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Thu, 30 Oct 2025 15:34:46 +0000 Subject: [PATCH 367/561] 8370851: Mark hotspot and jdk tests incompatible with test thread factory Reviewed-by: alanb, kevinw, sspitsyn --- test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java | 2 ++ .../jigsaw/classpathtests/EmptyClassInBootClassPath.java | 3 ++- .../appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java | 3 ++- .../sun/management/ThreadMXBean/ThreadAllocatedMemory.java | 4 +++- test/jdk/com/sun/net/httpserver/bugs/B6431193.java | 5 +++-- .../lang/management/ManagementFactory/ProxyTypeMapping.java | 3 ++- .../lang/management/ManagementFactory/ValidateOpenTypes.java | 3 ++- .../lang/management/ThreadMXBean/LockedMonitorInNative.java | 3 ++- test/jdk/java/lang/management/ThreadMXBean/Locks.java | 3 ++- .../lang/management/ThreadMXBean/ResetPeakThreadCount.java | 4 ++-- .../jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java | 3 ++- .../java/lang/management/ThreadMXBean/ThreadUserTime.java | 3 ++- test/jdk/java/nio/channels/SocketChannel/ShortWrite.java | 3 ++- 13 files changed, 28 insertions(+), 14 deletions(-) diff --git a/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java b/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java index 6ef7977ef8c..4789631ce62 100644 --- a/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java +++ b/test/hotspot/jtreg/runtime/Thread/ThreadCountLimit.java @@ -24,6 +24,7 @@ /** * @test * @summary Stress test that reaches the process limit for thread count, or time limit. + * @requires test.thread.factory == null * @requires os.family != "aix" * @key stress * @library /test/lib @@ -33,6 +34,7 @@ /** * @test * @summary Stress test that reaches the process limit for thread count, or time limit. + * @requires test.thread.factory == null * @requires os.family == "aix" * @key stress * @library /test/lib diff --git a/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java b/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java index 32b435a34e4..c967176b22d 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/classpathtests/EmptyClassInBootClassPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019, 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. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ * app loader will load the class from the bootclasspath if the * "--limit-modules java.base" option is specified * @requires vm.cds & !vm.graal.enabled + * @requires test.thread.factory == null * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @modules java.base/jdk.internal.access * @compile ../../test-classes/EmptyClassHelper.java diff --git a/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java b/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java index c86d5302d05..add9987b382 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/jigsaw/modulepath/OptimizeModuleHandlingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ /** * @test * @requires vm.cds & !vm.graal.enabled & vm.cds.write.archived.java.heap + * @requires test.thread.factory == null * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @run driver OptimizeModuleHandlingTest * @summary test module path changes for optimization of diff --git a/test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java b/test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java index 3ff2a3baf17..0c185bf2dcc 100644 --- a/test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java +++ b/test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ * @bug 6173675 8231209 8304074 8313081 * @summary Basic test of ThreadMXBean.getThreadAllocatedBytes * @requires vm.gc.G1 + * @requires test.thread.factory != "Virtual" * @run main/othervm -XX:+UseG1GC ThreadAllocatedMemory */ @@ -34,6 +35,7 @@ * @bug 6173675 8231209 8304074 8313081 * @summary Basic test of ThreadMXBean.getThreadAllocatedBytes * @requires vm.gc.Serial + * @requires test.thread.factory != "Virtual" * @run main/othervm -XX:+UseSerialGC ThreadAllocatedMemory */ diff --git a/test/jdk/com/sun/net/httpserver/bugs/B6431193.java b/test/jdk/com/sun/net/httpserver/bugs/B6431193.java index 8b85aa4618c..f5b485d6a0a 100644 --- a/test/jdk/com/sun/net/httpserver/bugs/B6431193.java +++ b/test/jdk/com/sun/net/httpserver/bugs/B6431193.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -24,8 +24,9 @@ /** * @test * @bug 6431193 - * @library /test/lib * @summary The new HTTP server exits immediately + * @requires test.thread.factory != "Virtual" + * @library /test/lib * @run main B6431193 * @run main/othervm -Djava.net.preferIPv6Addresses=true B6431193 */ diff --git a/test/jdk/java/lang/management/ManagementFactory/ProxyTypeMapping.java b/test/jdk/java/lang/management/ManagementFactory/ProxyTypeMapping.java index ed95bc89f7f..f222f51571f 100644 --- a/test/jdk/java/lang/management/ManagementFactory/ProxyTypeMapping.java +++ b/test/jdk/java/lang/management/ManagementFactory/ProxyTypeMapping.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -27,6 +27,7 @@ * @summary Test type mapping of the platform MXBean proxy * returned from Management.newPlatformMXBeanProxy(). * @author Mandy Chung + * @requires test.thread.factory != "Virtual" * * @compile ProxyTypeMapping.java * @run main/othervm -verbose:gc ProxyTypeMapping diff --git a/test/jdk/java/lang/management/ManagementFactory/ValidateOpenTypes.java b/test/jdk/java/lang/management/ManagementFactory/ValidateOpenTypes.java index f5ada9fe497..ffe99c46f66 100644 --- a/test/jdk/java/lang/management/ManagementFactory/ValidateOpenTypes.java +++ b/test/jdk/java/lang/management/ManagementFactory/ValidateOpenTypes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -27,6 +27,7 @@ * @summary Validate open types mapped for the MXBeans in the platform * MBeanServer. * @author Mandy Chung + * @requires test.thread.factory != "Virtual" * * @compile ValidateOpenTypes.java * @run main/othervm -verbose:gc ValidateOpenTypes diff --git a/test/jdk/java/lang/management/ThreadMXBean/LockedMonitorInNative.java b/test/jdk/java/lang/management/ThreadMXBean/LockedMonitorInNative.java index e1e490aa040..ef6f136266a 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/LockedMonitorInNative.java +++ b/test/jdk/java/lang/management/ThreadMXBean/LockedMonitorInNative.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @test * @summary Test ThreadMXBean.getLockedMonitors returns information about an object * monitor lock entered with a synchronized native method or JNI MonitorEnter + * @requires test.thread.factory != "Virtual" * @run junit/othervm LockedMonitorInNative */ diff --git a/test/jdk/java/lang/management/ThreadMXBean/Locks.java b/test/jdk/java/lang/management/ThreadMXBean/Locks.java index 5b4d360ae21..3bfa333fabd 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/Locks.java +++ b/test/jdk/java/lang/management/ThreadMXBean/Locks.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -28,6 +28,7 @@ * and ThreadInfo.getLockOwnerName() * @author Mandy Chung * @author Jaroslav Bachorik + * @requires test.thread.factory != "Virtual" * * @library /test/lib * diff --git a/test/jdk/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java b/test/jdk/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java index 996b5c94fcb..35a563909e2 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java +++ b/test/jdk/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -28,7 +28,7 @@ * - ThreadMXBean.resetPeakThreadCount() * @author Mandy Chung * @author Jaroslav Bachorik - * + * @requires test.thread.factory != "Virtual" * @build ResetPeakThreadCount * @build ThreadDump * @run main/othervm ResetPeakThreadCount diff --git a/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java b/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java index f8cab540465..5def3f4ca57 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java +++ b/test/jdk/java/lang/management/ThreadMXBean/ThreadCpuTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -27,6 +27,7 @@ * @summary Basic test of ThreadMXBean.getThreadCpuTime and * getCurrentThreadCpuTime. * @author Mandy Chung + * @requires test.thread.factory != "Virtual" */ import java.lang.management.*; diff --git a/test/jdk/java/lang/management/ThreadMXBean/ThreadUserTime.java b/test/jdk/java/lang/management/ThreadMXBean/ThreadUserTime.java index 8f38ef8b1fb..ebbafa6541c 100644 --- a/test/jdk/java/lang/management/ThreadMXBean/ThreadUserTime.java +++ b/test/jdk/java/lang/management/ThreadMXBean/ThreadUserTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -27,6 +27,7 @@ * @summary Basic test of ThreadMXBean.getThreadUserTime and * getCurrentThreadUserTime. * @author Mandy Chung + * @requires test.thread.factory != "Virtual" */ import java.lang.management.*; diff --git a/test/jdk/java/nio/channels/SocketChannel/ShortWrite.java b/test/jdk/java/nio/channels/SocketChannel/ShortWrite.java index c1d7c33fc5d..5a6c4850aea 100644 --- a/test/jdk/java/nio/channels/SocketChannel/ShortWrite.java +++ b/test/jdk/java/nio/channels/SocketChannel/ShortWrite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, 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. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @bug 7176630 7074436 * @summary Check for short writes on SocketChannels configured in blocking mode * @key randomness + * @requires test.thread.factory != "Virtual" */ import java.net.*; From a2196e20608a1acd12c84ecfb8522bf1666545f4 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Thu, 30 Oct 2025 16:51:36 +0000 Subject: [PATCH 368/561] 4397513: Misleading "interface method" in InvocationHandler specification Reviewed-by: alanb, jpai --- .../java/lang/reflect/InvocationHandler.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/InvocationHandler.java b/src/java.base/share/classes/java/lang/reflect/InvocationHandler.java index 47c6c410241..4007595d632 100644 --- a/src/java.base/share/classes/java/lang/reflect/InvocationHandler.java +++ b/src/java.base/share/classes/java/lang/reflect/InvocationHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -54,41 +54,40 @@ public interface InvocationHandler { * @param proxy the proxy instance that the method was invoked on * * @param method the {@code Method} instance corresponding to - * the interface method invoked on the proxy instance. The declaring - * class of the {@code Method} object will be the interface that - * the method was declared in, which may be a superinterface of the - * proxy interface that the proxy class inherits the method through. + * the method invoked on the proxy instance; the declaring + * class of the {@code Method} object may be a proxy interface, + * one of their superinterfaces, or the {@code Object} class * * @param args an array of objects containing the values of the * arguments passed in the method invocation on the proxy instance, - * or {@code null} if interface method takes no arguments. + * or {@code null} if the invoked method takes no arguments. * Arguments of primitive types are wrapped in instances of the * appropriate primitive wrapper class, such as * {@code java.lang.Integer} or {@code java.lang.Boolean}. * * @return the value to return from the method invocation on the - * proxy instance. If the declared return type of the interface + * proxy instance. If the declared return type of the invoked * method is a primitive type, then the value returned by * this method must be an instance of the corresponding primitive * wrapper class; otherwise, it must be a type assignable to the * declared return type. If the value returned by this method is - * {@code null} and the interface method's return type is + * {@code null} and the invoked method's return type is * primitive, then a {@code NullPointerException} will be * thrown by the method invocation on the proxy instance. If the * value returned by this method is otherwise not compatible with - * the interface method's declared return type as described above, + * the invoked method's declared return type as described above, * a {@code ClassCastException} will be thrown by the method * invocation on the proxy instance. * * @throws Throwable the exception to throw from the method * invocation on the proxy instance. The exception's type must be * assignable either to any of the exception types declared in the - * {@code throws} clause of the interface method or to the + * {@code throws} clause of the invoked method or to the * unchecked exception types {@code java.lang.RuntimeException} * or {@code java.lang.Error}. If a checked exception is * thrown by this method that is not assignable to any of the * exception types declared in the {@code throws} clause of - * the interface method, then an + * the invoked method, then an * {@link UndeclaredThrowableException} containing the * exception that was thrown by this method will be thrown by the * method invocation on the proxy instance. From d18e815b94854406113344547f36358b5b5f6bb7 Mon Sep 17 00:00:00 2001 From: Koushik Thirupattur Date: Thu, 30 Oct 2025 17:24:11 +0000 Subject: [PATCH 369/561] 8368301: sun/security/util/math/intpoly compiler warnings Reviewed-by: mullan --- make/jdk/src/classes/build/tools/intpoly/FieldGen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java index 2bf8c5c0b20..fcc45db0219 100644 --- a/make/jdk/src/classes/build/tools/intpoly/FieldGen.java +++ b/make/jdk/src/classes/build/tools/intpoly/FieldGen.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -628,7 +628,7 @@ public class FieldGen { result.appendLine("private static final long CARRY_ADD = 1 << " + (params.getBitsPerLimb() - 1) + ";"); if (params.getBitsPerLimb() * params.getNumLimbs() != params.getPower()) { - result.appendLine("private static final int LIMB_MASK = -1 " + result.appendLine("private static final long LIMB_MASK = -1L " + ">>> (64 - BITS_PER_LIMB);"); } From 4b315111493ac65511890bc2127489ceee693915 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Thu, 30 Oct 2025 18:03:21 +0000 Subject: [PATCH 370/561] 8370160: NumericShaper allows illegal ranges Reviewed-by: serb, psadhukhan, kizune --- .../share/classes/java/awt/font/NumericShaper.java | 11 ++++++++++- .../jdk/java/awt/font/NumericShaper/NSEqualsTest.java | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/java.desktop/share/classes/java/awt/font/NumericShaper.java b/src/java.desktop/share/classes/java/awt/font/NumericShaper.java index 99b59cc2e0e..44b7b1a23fe 100644 --- a/src/java.desktop/share/classes/java/awt/font/NumericShaper.java +++ b/src/java.desktop/share/classes/java/awt/font/NumericShaper.java @@ -1441,6 +1441,9 @@ public final class NumericShaper implements java.io.Serializable { * EUROPEAN digits are encountered before any strong directional * text in the string, the context is presumed to be EUROPEAN, and * so the digits will not shape. + * Any bit set in the {@code ranges} bitmask which is not a + * recognised value is discarded. Similarly if two bits are + * specified where one takes precedence, the lesser one is discarded. * @param ranges the specified Unicode ranges * @return a shaper for the specified ranges */ @@ -1460,6 +1463,9 @@ public final class NumericShaper implements java.io.Serializable { * directional text in the string, the context is presumed to be * EUROPEAN, and so the digits will not shape. * + * If two ranges are specified where one takes precedence over the + * other the lesser range is discarded. + * * @param ranges the specified Unicode ranges * @return a contextual shaper for the specified ranges * @throws NullPointerException if {@code ranges} is {@code null}. @@ -1499,6 +1505,9 @@ public final class NumericShaper implements java.io.Serializable { * range is one of the provided ranges. The shaper uses {@code * defaultContext} as the starting context. * + * If two ranges are specified where one takes precedence over the + * other the lesser range is discarded. + * * @param ranges the specified Unicode ranges * @param defaultContext the starting context, such as * {@code NumericShaper.Range.EUROPEAN} @@ -1522,7 +1531,7 @@ public final class NumericShaper implements java.io.Serializable { */ private NumericShaper(int key, int mask) { this.key = key; - this.mask = mask; + this.mask = mask & (CONTEXTUAL_MASK | ALL_RANGES); if (((this.mask & ARABIC) != 0) && ((this.mask & EASTERN_ARABIC) != 0)) { this.mask &= ~ARABIC; } diff --git a/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java b/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java index 6af73b7efa2..cc1c078bf79 100644 --- a/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java +++ b/test/jdk/java/awt/font/NumericShaper/NSEqualsTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8365077 + * @bug 8365077 8370160 * @summary confirm that an instance which is created with Enum ranges is * equal to another instance which is created with equivalent traditional * ranges, and that in such a case the hashCodes are also equal. @@ -38,6 +38,12 @@ public class NSEqualsTest { public static void main(String[] args) { + // Invalid ranges should be discarded + NumericShaper cs1 = + NumericShaper.getContextualShaper(NumericShaper.ALL_RANGES); + NumericShaper cs2 = NumericShaper.getContextualShaper(-1); + printAndCompare(cs1, cs2); + for (Range r1 : Range.values()) { test(r1); for (Range r2 : Range.values()) { From 414e72869895562adcea5c21ff3e7252cef5b13f Mon Sep 17 00:00:00 2001 From: Phil Race Date: Thu, 30 Oct 2025 19:09:06 +0000 Subject: [PATCH 371/561] 8370141: [macOS] Crash after PrinterJob ends when Graphics.create() is used. Reviewed-by: serb, psadhukhan --- .../sun/java2d/OSXOffScreenSurfaceData.java | 6 +- .../classes/sun/java2d/OSXSurfaceData.java | 27 ++-- .../classes/sun/lwawt/macosx/CPrinterJob.java | 9 +- .../awt/PrintJob/PrintJobAfterEndTest.java | 104 ++++++++++++++ .../print/PrinterJob/PrintAfterEndTest.java | 127 ++++++++++++++++++ 5 files changed, 251 insertions(+), 22 deletions(-) create mode 100644 test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java create mode 100644 test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java diff --git a/src/java.desktop/macosx/classes/sun/java2d/OSXOffScreenSurfaceData.java b/src/java.desktop/macosx/classes/sun/java2d/OSXOffScreenSurfaceData.java index 77d7f66fed6..9685ee859ad 100644 --- a/src/java.desktop/macosx/classes/sun/java2d/OSXOffScreenSurfaceData.java +++ b/src/java.desktop/macosx/classes/sun/java2d/OSXOffScreenSurfaceData.java @@ -526,7 +526,7 @@ public final class OSXOffScreenSurfaceData extends OSXSurfaceData // implements * Only used by compositor code (private API) */ @Override - public BufferedImage copyArea(SunGraphics2D sg2d, int x, int y, int w, int h, BufferedImage dstImage) { + public synchronized BufferedImage copyArea(SunGraphics2D sg2d, int x, int y, int w, int h, BufferedImage dstImage) { // create the destination image if needed if (dstImage == null) { dstImage = getDeviceConfiguration().createCompatibleImage(w, h); @@ -541,7 +541,7 @@ public final class OSXOffScreenSurfaceData extends OSXSurfaceData // implements } @Override - public boolean xorSurfacePixels(SunGraphics2D sg2d, BufferedImage srcPixels, int x, int y, int w, int h, int colorXOR) { + public synchronized boolean xorSurfacePixels(SunGraphics2D sg2d, BufferedImage srcPixels, int x, int y, int w, int h, int colorXOR) { int type = this.bim.getType(); @@ -553,7 +553,7 @@ public final class OSXOffScreenSurfaceData extends OSXSurfaceData // implements native boolean xorSurfacePixels(SurfaceData src, int colorXOR, int x, int y, int w, int h); @Override - public void clearRect(BufferedImage bim, int w, int h) { + public synchronized void clearRect(BufferedImage bim, int w, int h) { OSXOffScreenSurfaceData offsd = (OSXOffScreenSurfaceData) (OSXOffScreenSurfaceData.createData(bim)); // offsd.clear(); if (offsd.clearSurfacePixels(w, h) == false) { diff --git a/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java b/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java index a56063c0049..1051fbda4cb 100644 --- a/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java +++ b/src/java.desktop/macosx/classes/sun/java2d/OSXSurfaceData.java @@ -197,11 +197,6 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { // END compositing support API - @Override - public void invalidate() { - // always valid - } - // graphics primitives drawing implementation: // certain primitives don't care about all the states (ex. drawing an image needs not involve setting current paint) @@ -988,13 +983,13 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { return pi.getWindingRule(); } - public void doLine(CRenderer renderer, SunGraphics2D sg2d, float x1, float y1, float x2, float y2) { + public synchronized void doLine(CRenderer renderer, SunGraphics2D sg2d, float x1, float y1, float x2, float y2) { // System.err.println("-- doLine x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2+" paint="+sg2d.paint); setupGraphicsState(sg2d, kLine, sg2d.font, 0, 0, fBounds.width, fBounds.height); renderer.doLine(this, x1, y1, x2, y2); } - public void doRect(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, boolean isfill) { + public synchronized void doRect(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, boolean isfill) { // System.err.println("-- doRect x="+x+" y="+y+" w="+width+" h="+height+" isfill="+isfill+" paint="+sg2d.paint); if ((isfill) && (isCustomPaint(sg2d))) { setupGraphicsState(sg2d, kRect, (int) x, (int) y, (int) width, (int) height); @@ -1004,7 +999,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doRect(this, x, y, width, height, isfill); } - public void doRoundRect(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, float arcW, float arcH, boolean isfill) { + public synchronized void doRoundRect(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, float arcW, float arcH, boolean isfill) { // System.err.println("--- doRoundRect"); if ((isfill) && (isCustomPaint(sg2d))) { setupGraphicsState(sg2d, kRoundRect, (int) x, (int) y, (int) width, (int) height); @@ -1014,7 +1009,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doRoundRect(this, x, y, width, height, arcW, arcH, isfill); } - public void doOval(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, boolean isfill) { + public synchronized void doOval(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, boolean isfill) { // System.err.println("--- doOval"); if ((isfill) && (isCustomPaint(sg2d))) { setupGraphicsState(sg2d, kOval, (int) x, (int) y, (int) width, (int) height); @@ -1024,7 +1019,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doOval(this, x, y, width, height, isfill); } - public void doArc(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, float startAngle, float arcAngle, int type, boolean isfill) { + public synchronized void doArc(CRenderer renderer, SunGraphics2D sg2d, float x, float y, float width, float height, float startAngle, float arcAngle, int type, boolean isfill) { // System.err.println("--- doArc"); if ((isfill) && (isCustomPaint(sg2d))) { setupGraphicsState(sg2d, kArc, (int) x, (int) y, (int) width, (int) height); @@ -1035,7 +1030,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doArc(this, x, y, width, height, startAngle, arcAngle, type, isfill); } - public void doPolygon(CRenderer renderer, SunGraphics2D sg2d, int[] xpoints, int[] ypoints, int npoints, boolean ispolygon, boolean isfill) { + public synchronized void doPolygon(CRenderer renderer, SunGraphics2D sg2d, int[] xpoints, int[] ypoints, int npoints, boolean ispolygon, boolean isfill) { // System.err.println("--- doPolygon"); if ((isfill) && (isCustomPaint(sg2d))) { @@ -1068,7 +1063,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { FloatBuffer shapeCoordinatesArray = null; IntBuffer shapeTypesArray = null; - public void drawfillShape(CRenderer renderer, SunGraphics2D sg2d, GeneralPath gp, boolean isfill, boolean shouldApplyOffset) { + public synchronized void drawfillShape(CRenderer renderer, SunGraphics2D sg2d, GeneralPath gp, boolean isfill, boolean shouldApplyOffset) { // System.err.println("--- drawfillShape"); if ((isfill) && (isCustomPaint(sg2d))) { @@ -1093,7 +1088,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doShape(this, shapeLength, shapeCoordinatesArray, shapeTypesArray, windingRule, isfill, shouldApplyOffset); } - public void blitImage(CRenderer renderer, SunGraphics2D sg2d, SurfaceData img, boolean fliph, boolean flipv, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, Color bgColor) { + public synchronized void blitImage(CRenderer renderer, SunGraphics2D sg2d, SurfaceData img, boolean fliph, boolean flipv, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, Color bgColor) { // System.err.println("--- blitImage sx="+sx+", sy="+sy+", sw="+sw+", sh="+sh+", img="+img); OSXOffScreenSurfaceData osxsd = (OSXOffScreenSurfaceData) img; synchronized (osxsd.getLockObject()) { @@ -1116,7 +1111,7 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { public void drawIntoCGContext(final long cgContext); } - public void drawString(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, String str, double x, double y) { + public synchronized void drawString(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, String str, double x, double y) { // System.err.println("--- drawString str=\""+str+"\""); // see . We don't want to call anything if the string is empty! if (str.length() == 0) { return; } @@ -1125,13 +1120,13 @@ public abstract class OSXSurfaceData extends BufImgSurfaceData { renderer.doDrawString(this, nativeStrikePtr, str, x, y); } - public void drawGlyphs(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, GlyphVector gv, float x, float y) { + public synchronized void drawGlyphs(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, GlyphVector gv, float x, float y) { // System.err.println("--- drawGlyphs"); setupGraphicsState(sg2d, kGlyphs, gv.getFont(), 0, 0, fBounds.width, fBounds.height); renderer.doDrawGlyphs(this, nativeStrikePtr, gv, x, y); } - public void drawUnicodes(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, char[] unicodes, int offset, int length, float x, float y) { + public synchronized void drawUnicodes(CTextPipe renderer, SunGraphics2D sg2d, long nativeStrikePtr, char[] unicodes, int offset, int length, float x, float y) { // System.err.println("--- drawUnicodes "+(new String(unicodes, offset, length))); setupGraphicsState(sg2d, kUnicodes, sg2d.font, 0, 0, fBounds.width, fBounds.height); if (length == 1) { diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java index 7b0c51f078f..11ac733be3a 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java @@ -821,7 +821,7 @@ public final class CPrinterJob extends RasterPrinterJob { if (defaultFont == null) { defaultFont = new Font("Dialog", Font.PLAIN, 12); } - Graphics2D delegate = new SunGraphics2D(sd, Color.black, Color.white, defaultFont); + SunGraphics2D delegate = new SunGraphics2D(sd, Color.black, Color.white, defaultFont); Graphics2D pathGraphics = new CPrinterGraphics(delegate, printerJob); // Just stores delegate into an ivar Rectangle2D pageFormatArea = getPageFormatArea(page); @@ -830,8 +830,11 @@ public final class CPrinterJob extends RasterPrinterJob { pathGraphics = new GrayscaleProxyGraphics2D(pathGraphics, printerJob); } painter.print(pathGraphics, FlipPageFormat.getOriginal(page), pageIndex); - delegate.dispose(); - delegate = null; + synchronized (sd) { + sd.invalidate(); + delegate.dispose(); + delegate = null; + } } catch (PrinterException pe) { throw new java.lang.reflect.UndeclaredThrowableException(pe); } }}; diff --git a/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java b/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java new file mode 100644 index 00000000000..e4ce07ac038 --- /dev/null +++ b/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java @@ -0,0 +1,104 @@ +/* + * 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. + * + * 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. + */ + + +/* + @test + @bug 8370141 + @summary Test no crash printing to Graphics after job is ended. + @key headful printer + @run main PrintJobAfterEndTest +*/ + +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.JobAttributes; +import java.awt.JobAttributes.DialogType; +import java.awt.JobAttributes.DestinationType; +import java.awt.PageAttributes; +import java.awt.PrintJob; +import java.awt.Toolkit; +import java.util.concurrent.CountDownLatch; + +public class PrintJobAfterEndTest { + + public static void main(String[] args) throws Exception { + + JobAttributes jobAttributes = new JobAttributes(); + jobAttributes.setDialog(DialogType.NONE); + jobAttributes.setDestination(DestinationType.FILE); + jobAttributes.setFileName("out.prn"); + + PageAttributes pageAttributes = new PageAttributes(); + + Frame f = new Frame(); + Toolkit tk = f.getToolkit(); + + for (int i = 0; i < 500; i++) { + PrintJob job = tk.getPrintJob(f, "Print Crash Test", jobAttributes, pageAttributes); + if (job != null) { + Graphics g = job.getGraphics(); + CountDownLatch latch = new CountDownLatch(1); + + Thread endThread = new Thread(() -> { + try { + latch.await(); + job.end(); + } catch (Throwable t) { + t.printStackTrace(); + } + }); + + Thread drawThread = new Thread(() -> { + try { + latch.await(); + g.clearRect(10, 10, 100, 100); + g.drawRect(0, 300, 200, 400); + g.fillRect(0, 300, 200, 400); + g.drawLine(0, 100, 200, 100); + g.drawString("Hello", 200, 200); + g.drawOval(200, 200, 200, 200); + int[] pts = new int[] { 10, 200, 100 }; + g.drawPolyline(pts, pts, pts.length); + g.drawPolygon(pts, pts, pts.length); + g.fillPolygon(pts, pts, pts.length); + } catch (Throwable t) { + t.printStackTrace(); + } + }); + + if ( i % 2 == 0) { + drawThread.start(); + endThread.start(); + } else { + endThread.start(); + drawThread.start(); + } + latch.countDown(); + + endThread.join(); + drawThread.join(); + } + } + } +} diff --git a/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java b/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java new file mode 100644 index 00000000000..a1d173681e7 --- /dev/null +++ b/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java @@ -0,0 +1,127 @@ +/* + * 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. + * + * 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. + */ + +/** + * @test + * @key printer + * @bug 8370141 + * @summary No crash when printing after job completed. + * @run main PrintAfterEndTest + */ + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.print.Pageable; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.standard.Destination; +import java.io.File; +import java.util.concurrent.CountDownLatch; + +public class PrintAfterEndTest implements Printable { + + volatile Graphics peekgraphics; + volatile Graphics pathgraphics; + + public static void main(String args[]) throws Exception { + + for (int i = 0; i < 500; i++) { + PrintAfterEndTest paet = new PrintAfterEndTest(); + paet.print(); + } + } + + void print() throws Exception { + PrinterJob pjob = PrinterJob.getPrinterJob(); + if (pjob == null || pjob.getPrintService() == null) { + System.out.println("Unable to create a PrintJob"); + return; + } + + CountDownLatch latch = new CountDownLatch(1); + HashPrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + File file = new File("out.prn"); + Destination destination = new Destination(file.toURI()); + aset.add(destination); + pjob.setPrintable(this); + pjob.print(aset); + + DrawRunnable tpeek = new DrawRunnable(peekgraphics, latch); + DrawRunnable tpath = new DrawRunnable(pathgraphics, latch); + tpeek.start(); + tpath.start(); + latch.countDown(); + tpeek.join(); + tpath.join(); + } + + static class DrawRunnable extends Thread { + + Graphics g; + CountDownLatch latch; + DrawRunnable(Graphics g, CountDownLatch latch) { + this.g = g; + this.latch = latch; + } + + public void run() { + if (g == null) { + return; + } + try { + latch.await(); + g.clearRect(10, 10, 100, 100); + g.drawRect(0, 300, 200, 400); + g.fillRect(0, 300, 200, 400); + g.drawLine(0, 100, 200, 100); + g.drawString("Hello", 200, 200); + g.drawOval(200, 200, 200, 200); + int[] pts = new int[] { 10, 200, 100 }; + g.drawPolyline(pts, pts, pts.length); + g.drawPolygon(pts, pts, pts.length); + g.fillPolygon(pts, pts, pts.length); + g.dispose(); + } catch (Throwable t) { + } + } + } + + public int print(Graphics g, PageFormat pf, int pageIndex) { + if (pageIndex > 0) { + return NO_SUCH_PAGE; + } + if (peekgraphics == null) { + peekgraphics = g.create(); + } else if (pathgraphics == null) { + pathgraphics = g.create(); + } + Graphics2D g2d = (Graphics2D)g; + g2d.translate(pf.getImageableX(), pf.getImageableY()); + g.drawString("random string", 100,20); + return PAGE_EXISTS; + } + +} From c49a94bf89876c4d6c777a9452618afa564c5c23 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Thu, 30 Oct 2025 19:09:34 +0000 Subject: [PATCH 372/561] 8370572: Cgroups hierarchical memory limit is not honored after JDK-8322420 Reviewed-by: simonis, sgehwolf --- .../os/linux/cgroupSubsystem_linux.hpp | 11 +++++++ .../os/linux/cgroupV1Subsystem_linux.cpp | 29 ++++++++++++------- .../os/linux/cgroupV1Subsystem_linux.hpp | 1 + 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp index 62a61432665..bf0ad03fc56 100644 --- a/src/hotspot/os/linux/cgroupSubsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupSubsystem_linux.hpp @@ -102,6 +102,17 @@ log_trace(os, container)(log_string " is: %s", retval); \ } +#define CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(controller, filename, key, log_string, retval) \ +{ \ + bool is_ok; \ + is_ok = controller->read_numerical_key_value(filename, key, &retval); \ + if (!is_ok) { \ + log_trace(os, container)(log_string " failed: %d", OSCONTAINER_ERROR); \ + return OSCONTAINER_ERROR; \ + } \ + log_trace(os, container)(log_string " is: " JULONG_FORMAT, retval); \ +} + class CgroupController: public CHeapObj { protected: char* _cgroup_path; diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp index 90f01565b84..87870e647eb 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.cpp @@ -124,6 +124,12 @@ void CgroupV1Controller::set_subsystem_path(const char* cgroup_path) { } } +jlong CgroupV1MemoryController::uses_mem_hierarchy() { + julong use_hierarchy; + CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.use_hierarchy", "Use Hierarchy", use_hierarchy); + return (jlong)use_hierarchy; +} + /* * The common case, containers, we have _root == _cgroup_path, and thus set the * controller path to the _mount_point. This is where the limits are exposed in @@ -160,13 +166,13 @@ void verbose_log(julong read_mem_limit, julong upper_mem_bound) { jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong upper_bound) { julong memlimit; CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.limit_in_bytes", "Memory Limit", memlimit); - if (memlimit >= upper_bound) { - verbose_log(memlimit, upper_bound); - return (jlong)-1; - } else { - verbose_log(memlimit, upper_bound); - return (jlong)memlimit; + if (memlimit >= upper_bound && uses_mem_hierarchy()) { + CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat", + "hierarchical_memory_limit", "Hierarchical Memory Limit", + memlimit); } + verbose_log(memlimit, upper_bound); + return (jlong)((memlimit < upper_bound) ? memlimit : -1); } /* read_mem_swap @@ -184,12 +190,13 @@ jlong CgroupV1MemoryController::read_memory_limit_in_bytes(julong upper_bound) { jlong CgroupV1MemoryController::read_mem_swap(julong upper_memsw_bound) { julong memswlimit; CONTAINER_READ_NUMBER_CHECKED(reader(), "/memory.memsw.limit_in_bytes", "Memory and Swap Limit", memswlimit); - if (memswlimit >= upper_memsw_bound) { - log_trace(os, container)("Memory and Swap Limit is: Unlimited"); - return (jlong)-1; - } else { - return (jlong)memswlimit; + if (memswlimit >= upper_memsw_bound && uses_mem_hierarchy()) { + CONTAINER_READ_NUMERICAL_KEY_VALUE_CHECKED(reader(), "/memory.stat", + "hierarchical_memsw_limit", "Hierarchical Memory and Swap Limit", + memswlimit); } + verbose_log(memswlimit, upper_memsw_bound); + return (jlong)((memswlimit < upper_memsw_bound) ? memswlimit : -1); } jlong CgroupV1MemoryController::memory_and_swap_limit_in_bytes(julong upper_mem_bound, julong upper_swap_bound) { diff --git a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp index 02b2c6a9fce..ce3184992e8 100644 --- a/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp +++ b/src/hotspot/os/linux/cgroupV1Subsystem_linux.hpp @@ -100,6 +100,7 @@ class CgroupV1MemoryController final : public CgroupMemoryController { const char* mount_point() override { return reader()->mount_point(); } const char* cgroup_path() override { return reader()->cgroup_path(); } private: + jlong uses_mem_hierarchy(); jlong read_mem_swappiness(); jlong read_mem_swap(julong upper_memsw_bound); From 566aa1267c7c9b0d1eb49dd9014461274c51280d Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Thu, 30 Oct 2025 20:38:30 +0000 Subject: [PATCH 373/561] 8370971: Problemlist jdkDoctypeBadcharsCheck.java and jdkCheckHtml.java Reviewed-by: dholmes --- test/docs/ProblemList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/docs/ProblemList.txt b/test/docs/ProblemList.txt index 83693eacbd1..4df8bbcc53c 100644 --- a/test/docs/ProblemList.txt +++ b/test/docs/ProblemList.txt @@ -41,3 +41,5 @@ ############################################################################# jdk/javadoc/doccheck/checks/jdkCheckLinks.java 8370249 generic-all +jdk/javadoc/doccheck/checks/jdkCheckHtml.java 8370970 generic-all +jdk/javadoc/doccheck/checks/jdkDoctypeBadcharsCheck.java 8370970 generic-all From c69e0eb2f98dc80eaefdb399dcfe86cdab32dbd5 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 30 Oct 2025 20:40:29 +0000 Subject: [PATCH 374/561] 8370726: GenShen: Misplaced assertion that old referent is marked during young collection Reviewed-by: xpeng, ysr --- .../gc/shenandoah/shenandoahGeneration.cpp | 2 +- .../shenandoahReferenceProcessor.cpp | 30 ++++++------------- .../shenandoahReferenceProcessor.hpp | 4 ++- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp index 0c55613efcc..8b0d2d4c8be 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp @@ -800,7 +800,7 @@ ShenandoahGeneration::ShenandoahGeneration(ShenandoahGenerationType type, size_t max_capacity) : _type(type), _task_queues(new ShenandoahObjToScanQueueSet(max_workers)), - _ref_processor(new ShenandoahReferenceProcessor(MAX2(max_workers, 1U))), + _ref_processor(new ShenandoahReferenceProcessor(this, MAX2(max_workers, 1U))), _affiliated_region_count(0), _humongous_waste(0), _evacuation_reserve(0), _used(0), _bytes_allocated_since_gc_start(0), _max_capacity(max_capacity), diff --git a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp index f37329d1c44..7187431c8f8 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.cpp @@ -223,13 +223,13 @@ void ShenandoahRefProcThreadLocal::set_discovered_list_head(oop head) { AlwaysClearPolicy ShenandoahReferenceProcessor::_always_clear_policy; -ShenandoahReferenceProcessor::ShenandoahReferenceProcessor(uint max_workers) : +ShenandoahReferenceProcessor::ShenandoahReferenceProcessor(ShenandoahGeneration* generation, uint max_workers) : _soft_reference_policy(&_always_clear_policy), _ref_proc_thread_locals(NEW_C_HEAP_ARRAY(ShenandoahRefProcThreadLocal, max_workers, mtGC)), _pending_list(nullptr), _pending_list_tail(&_pending_list), _iterate_discovered_list_id(0U), - _stats() { + _generation(generation) { for (size_t i = 0; i < max_workers; i++) { _ref_proc_thread_locals[i].reset(); } @@ -311,7 +311,7 @@ bool ShenandoahReferenceProcessor::should_discover(oop reference, ReferenceType return false; } - if (!heap->is_in_active_generation(referent)) { + if (!_generation->contains(referent)) { log_trace(gc,ref)("Referent outside of active generation: " PTR_FORMAT, p2i(referent)); return false; } @@ -329,31 +329,23 @@ bool ShenandoahReferenceProcessor::should_drop(oop reference, ReferenceType type return true; } - shenandoah_assert_mark_complete(raw_referent); - ShenandoahHeap* heap = ShenandoahHeap::heap(); // Check if the referent is still alive, in which case we should drop the reference. if (type == REF_PHANTOM) { - return heap->marking_context()->is_marked(raw_referent); + return _generation->complete_marking_context()->is_marked(raw_referent); } else { - return heap->marking_context()->is_marked_strong(raw_referent); + return _generation->complete_marking_context()->is_marked_strong(raw_referent); } } template void ShenandoahReferenceProcessor::make_inactive(oop reference, ReferenceType type) const { if (type == REF_FINAL) { -#ifdef ASSERT - auto referent = reference_referent_raw(reference); - auto heap = ShenandoahHeap::heap(); - shenandoah_assert_mark_complete(referent); - assert(reference_next(reference) == nullptr, "Already inactive"); - assert(heap->marking_context()->is_marked(referent), "only make inactive final refs with alive referents"); -#endif - // Don't clear referent. It is needed by the Finalizer thread to make the call // to finalize(). A FinalReference is instead made inactive by self-looping the // next field. An application can't call FinalReference.enqueue(), so there is // no race to worry about when setting the next field. + assert(reference_next(reference) == nullptr, "Already inactive"); + assert(_generation->complete_marking_context()->is_marked(reference_referent_raw(reference)), "only make inactive final refs with alive referents"); reference_set_next(reference, reference); } else { // Clear referent @@ -443,12 +435,8 @@ oop ShenandoahReferenceProcessor::drop(oop reference, ReferenceType type) { HeapWord* raw_referent = reference_referent_raw(reference); #ifdef ASSERT - if (raw_referent != nullptr) { - ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahHeapRegion* region = heap->heap_region_containing(raw_referent); - ShenandoahMarkingContext* ctx = heap->generation_for(region->affiliation())->complete_marking_context(); - assert(ctx->is_marked(raw_referent), "only drop references with alive referents"); - } + assert(raw_referent == nullptr || _generation->complete_marking_context()->is_marked(raw_referent), + "only drop references with alive referents"); #endif // Unlink and return next in list diff --git a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.hpp b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.hpp index 11099f1303d..be11a364ab7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahReferenceProcessor.hpp @@ -140,6 +140,8 @@ private: ReferenceProcessorStats _stats; + ShenandoahGeneration* _generation; + template bool is_inactive(oop reference, oop referent, ReferenceType type) const; bool is_strongly_live(oop referent) const; @@ -172,7 +174,7 @@ private: void clean_discovered_list(T* list); public: - ShenandoahReferenceProcessor(uint max_workers); + ShenandoahReferenceProcessor(ShenandoahGeneration* generation, uint max_workers); void reset_thread_locals(); void set_mark_closure(uint worker_id, ShenandoahMarkRefsSuperClosure* mark_closure); From c6eea8acf6eea7314a1615e5923ac7bf73e6da02 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 30 Oct 2025 21:10:01 +0000 Subject: [PATCH 375/561] 8370667: GenShen: Only make assertions about region pinning for collected generation Reviewed-by: xpeng, ysr --- .../heuristics/shenandoahGenerationalHeuristics.cpp | 2 +- src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp | 12 +++++++++--- src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp | 3 ++- .../share/gc/shenandoah/shenandoahOldGeneration.cpp | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp index a2cccec8423..cab6abc4e6f 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp @@ -45,7 +45,7 @@ void ShenandoahGenerationalHeuristics::choose_collection_set(ShenandoahCollectio // Check all pinned regions have updated status before choosing the collection set. - heap->assert_pinned_region_status(); + heap->assert_pinned_region_status(_generation); // Step 1. Build up the region candidates we care about, rejecting losers and accepting winners right away. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 344811449ab..befb6069409 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -2419,11 +2419,17 @@ void ShenandoahHeap::sync_pinned_region_status() { } #ifdef ASSERT -void ShenandoahHeap::assert_pinned_region_status() { +void ShenandoahHeap::assert_pinned_region_status() const { + assert_pinned_region_status(global_generation()); +} + +void ShenandoahHeap::assert_pinned_region_status(ShenandoahGeneration* generation) const { for (size_t i = 0; i < num_regions(); i++) { ShenandoahHeapRegion* r = get_region(i); - assert((r->is_pinned() && r->pin_count() > 0) || (!r->is_pinned() && r->pin_count() == 0), - "Region %zu pinning status is inconsistent", i); + if (generation->contains(r)) { + assert((r->is_pinned() && r->pin_count() > 0) || (!r->is_pinned() && r->pin_count() == 0), + "Region %zu pinning status is inconsistent", i); + } } } #endif diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index eae975b9409..e44bbd55e92 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -669,7 +669,8 @@ public: void unpin_object(JavaThread* thread, oop obj) override; void sync_pinned_region_status(); - void assert_pinned_region_status() NOT_DEBUG_RETURN; + void assert_pinned_region_status() const NOT_DEBUG_RETURN; + void assert_pinned_region_status(ShenandoahGeneration* generation) const NOT_DEBUG_RETURN; // ---------- CDS archive support diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp index 095aa0079ae..edaec02876a 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp @@ -494,7 +494,7 @@ void ShenandoahOldGeneration::prepare_regions_and_collection_set(bool concurrent ShenandoahFinalMarkUpdateRegionStateClosure cl(complete_marking_context()); parallel_heap_region_iterate(&cl); - heap->assert_pinned_region_status(); + heap->assert_pinned_region_status(this); } { From e293166e440df75f650ee280c300c085cd141d30 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Thu, 30 Oct 2025 21:14:09 +0000 Subject: [PATCH 376/561] 8370963: Errors in jpackage jtreg test descriptions Reviewed-by: almatvee --- test/jdk/tools/jpackage/TEST.properties | 3 +++ .../tools/jpackage/macosx/CustomInfoPListTest.java | 2 -- test/jdk/tools/jpackage/macosx/DmgContentTest.java | 1 - test/jdk/tools/jpackage/macosx/HostArchPkgTest.java | 1 - .../jpackage/macosx/SigningPackageTwoStepTest.java | 1 + .../macosx/SigningRuntimeImagePackageTest.java | 1 + .../share/RuntimeImageSymbolicLinksTest.java | 1 - test/jdk/tools/jpackage/share/RuntimeImageTest.java | 1 - .../jpackage/windows/WinInstallerResourceTest.java | 1 - .../jdk/tools/jpackage/windows/WinLongPathTest.java | 1 - .../tools/jpackage/windows/WinLongVersionTest.java | 13 ------------- .../tools/jpackage/windows/WinOSConditionTest.java | 2 -- test/jdk/tools/jpackage/windows/WinRenameTest.java | 1 - 13 files changed, 5 insertions(+), 24 deletions(-) diff --git a/test/jdk/tools/jpackage/TEST.properties b/test/jdk/tools/jpackage/TEST.properties index f6a0dc7dfc7..84d7dbea7ea 100644 --- a/test/jdk/tools/jpackage/TEST.properties +++ b/test/jdk/tools/jpackage/TEST.properties @@ -1,3 +1,6 @@ +# Assign "jpackagePlatformPackage" key on jpackage tests that output and +# optionally install native packages. Don't use the key with tests that output +# native packages but will never install them. keys = \ jpackagePlatformPackage diff --git a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java index d91f4e3504b..c0b7b6b6604 100644 --- a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java +++ b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java @@ -69,11 +69,9 @@ import jdk.jpackage.test.TKit; * @test * @summary jpackage with --type image --resource-dir "Info.plist" and "Runtime-Info.plist" * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @build CustomInfoPListTest * @requires (os.family == "mac") - * @requires (jpackage.test.SQETest == null) * @run main/othervm/timeout=1440 -Xmx512m jdk.jpackage.test.Main * --jpt-run=CustomInfoPListTest */ diff --git a/test/jdk/tools/jpackage/macosx/DmgContentTest.java b/test/jdk/tools/jpackage/macosx/DmgContentTest.java index f6c2fe63671..a2e1ab24651 100644 --- a/test/jdk/tools/jpackage/macosx/DmgContentTest.java +++ b/test/jdk/tools/jpackage/macosx/DmgContentTest.java @@ -38,7 +38,6 @@ import java.util.List; * @test * @summary jpackage with --type dmg --mac-dmg-content * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @build DmgContentTest * @requires (os.family == "mac") diff --git a/test/jdk/tools/jpackage/macosx/HostArchPkgTest.java b/test/jdk/tools/jpackage/macosx/HostArchPkgTest.java index 5c4a7ac0e8e..7498043c14f 100644 --- a/test/jdk/tools/jpackage/macosx/HostArchPkgTest.java +++ b/test/jdk/tools/jpackage/macosx/HostArchPkgTest.java @@ -47,7 +47,6 @@ import jdk.jpackage.test.Annotations.Test; * @build jdk.jpackage.test.* * @compile -Xlint:all -Werror HostArchPkgTest.java * @requires (os.family == "mac") - * @key jpackagePlatformPackage * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main * --jpt-run=HostArchPkgTest */ diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java index 16cf616cfd3..32311fd121e 100644 --- a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java @@ -66,6 +66,7 @@ import jdk.jpackage.test.TKit; * @build jdk.jpackage.test.* * @build SigningPackageTwoStepTest * @requires (jpackage.test.MacSignTests == "run") + * @requires (jpackage.test.SQETest == null) * @run main/othervm/timeout=720 -Xmx512m jdk.jpackage.test.Main * --jpt-run=SigningPackageTwoStepTest * --jpt-before-run=SigningBase.verifySignTestEnvReady diff --git a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java index efcaadc3fa8..856962d3b01 100644 --- a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java @@ -80,6 +80,7 @@ import jdk.jpackage.test.TKit; * @build jdk.jpackage.test.* * @build SigningRuntimeImagePackageTest * @requires (jpackage.test.MacSignTests == "run") + * @requires (jpackage.test.SQETest == null) * @run main/othervm/timeout=720 -Xmx512m jdk.jpackage.test.Main * --jpt-run=SigningRuntimeImagePackageTest * --jpt-before-run=SigningBase.verifySignTestEnvReady diff --git a/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java b/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java index c41ba92c740..a10328d9e6c 100644 --- a/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java +++ b/test/jdk/tools/jpackage/share/RuntimeImageSymbolicLinksTest.java @@ -40,7 +40,6 @@ import jdk.jpackage.test.Executor; * @test * @summary jpackage with --runtime-image * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @requires (os.family != "windows") * @build jdk.jpackage.test.* * @compile -Xlint:all -Werror RuntimeImageSymbolicLinksTest.java diff --git a/test/jdk/tools/jpackage/share/RuntimeImageTest.java b/test/jdk/tools/jpackage/share/RuntimeImageTest.java index 1110a813cde..f5811596f75 100644 --- a/test/jdk/tools/jpackage/share/RuntimeImageTest.java +++ b/test/jdk/tools/jpackage/share/RuntimeImageTest.java @@ -34,7 +34,6 @@ import jdk.jpackage.test.TKit; * @test * @summary jpackage with --runtime-image * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @compile -Xlint:all -Werror RuntimeImageTest.java * @run main/othervm/timeout=1400 jdk.jpackage.test.Main diff --git a/test/jdk/tools/jpackage/windows/WinInstallerResourceTest.java b/test/jdk/tools/jpackage/windows/WinInstallerResourceTest.java index bb2008bbda7..2da95c0ec9c 100644 --- a/test/jdk/tools/jpackage/windows/WinInstallerResourceTest.java +++ b/test/jdk/tools/jpackage/windows/WinInstallerResourceTest.java @@ -40,7 +40,6 @@ import jdk.jpackage.test.TKit; * @test * @summary jpackage with installer exe from the resource directory * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @compile -Xlint:all -Werror WinInstallerResourceTest.java * @requires (os.family == "windows") diff --git a/test/jdk/tools/jpackage/windows/WinLongPathTest.java b/test/jdk/tools/jpackage/windows/WinLongPathTest.java index e52441b961a..f9c7f5fe2b4 100644 --- a/test/jdk/tools/jpackage/windows/WinLongPathTest.java +++ b/test/jdk/tools/jpackage/windows/WinLongPathTest.java @@ -40,7 +40,6 @@ import jdk.jpackage.test.TKit; * @bug 8289771 * @summary jpackage with long paths on windows * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @requires (os.family == "windows") * @compile -Xlint:all -Werror WinLongPathTest.java diff --git a/test/jdk/tools/jpackage/windows/WinLongVersionTest.java b/test/jdk/tools/jpackage/windows/WinLongVersionTest.java index 586b69c1913..2ee76bcaa15 100644 --- a/test/jdk/tools/jpackage/windows/WinLongVersionTest.java +++ b/test/jdk/tools/jpackage/windows/WinLongVersionTest.java @@ -66,19 +66,6 @@ import org.w3c.dom.NodeList; * scenario must be uninstalled */ -/* - * @test - * @summary jpackage with long version number - * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage - * @requires (jpackage.test.SQETest != null) - * @build jdk.jpackage.test.* - * @requires (os.family == "windows") - * @compile -Xlint:all -Werror WinLongVersionTest.java - * @run main/othervm/timeout=540 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=WinLongVersionTest.test - */ - /* * @test * @summary jpackage with long version number diff --git a/test/jdk/tools/jpackage/windows/WinOSConditionTest.java b/test/jdk/tools/jpackage/windows/WinOSConditionTest.java index aea7e9e99b2..6a78f78e804 100644 --- a/test/jdk/tools/jpackage/windows/WinOSConditionTest.java +++ b/test/jdk/tools/jpackage/windows/WinOSConditionTest.java @@ -34,11 +34,9 @@ import jdk.jpackage.test.TKit; * @test * @summary jpackage test that installer blocks on Windows of older version * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @compile -Xlint:all -Werror WinOSConditionTest.java * @requires (os.family == "windows") - * @requires (jpackage.test.SQETest == null) * @run main/othervm/timeout=360 -Xmx512m jdk.jpackage.test.Main * --jpt-run=WinOSConditionTest */ diff --git a/test/jdk/tools/jpackage/windows/WinRenameTest.java b/test/jdk/tools/jpackage/windows/WinRenameTest.java index 59107c43921..ab67ec7f4f9 100644 --- a/test/jdk/tools/jpackage/windows/WinRenameTest.java +++ b/test/jdk/tools/jpackage/windows/WinRenameTest.java @@ -33,7 +33,6 @@ import jdk.jpackage.test.Annotations.Test; * @test * @summary jpackage test app can run after changing executable's extension * @library /test/jdk/tools/jpackage/helpers - * @key jpackagePlatformPackage * @build jdk.jpackage.test.* * @build WinRenameTest * @requires (os.family == "windows") From a5f3a6f21b68fe9b97cb1aa22f54173b192fbd10 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Thu, 30 Oct 2025 21:14:31 +0000 Subject: [PATCH 377/561] 8370956: ShortcutHintTest test fails when executed locally on Linux Reviewed-by: almatvee --- .../tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 4bc8295eaf8..1807d3ce256 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -438,7 +438,9 @@ public final class LinuxHelper { static void verifyDesktopIntegrationFiles(JPackageCommand cmd, boolean installed) { verifyDesktopFiles(cmd, installed); - verifyAllIconsReferenced(cmd); + if (installed) { + verifyAllIconsReferenced(cmd); + } } private static void verifyDesktopFiles(JPackageCommand cmd, boolean installed) { From 0e054667302614eaa8f969003bb89c93c2b4aef0 Mon Sep 17 00:00:00 2001 From: Kevin Walls Date: Thu, 30 Oct 2025 21:42:43 +0000 Subject: [PATCH 378/561] 8370955: Remove test javax/management/remote/mandatory/connection/ConnectionTest.java from ProblemList-Virtual Reviewed-by: sspitsyn --- test/jdk/ProblemList-Virtual.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/jdk/ProblemList-Virtual.txt b/test/jdk/ProblemList-Virtual.txt index d4af29c8f17..fc5f31e3ce8 100644 --- a/test/jdk/ProblemList-Virtual.txt +++ b/test/jdk/ProblemList-Virtual.txt @@ -34,5 +34,3 @@ java/lang/ScopedValue/StressStackOverflow.java#default 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#no-TieredCompilation 8309646 generic-all java/lang/ScopedValue/StressStackOverflow.java#TieredStopAtLevel1 8309646 generic-all -javax/management/remote/mandatory/connection/ConnectionTest.java 8308352 windows-x64 - From a926c216e0f56dfc4d129260f8bf028ade615756 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Thu, 30 Oct 2025 22:45:49 +0000 Subject: [PATCH 379/561] 8370965: Remove SigningPackageFromTwoStepAppImageTest test Reviewed-by: almatvee --- ...SigningPackageFromTwoStepAppImageTest.java | 195 ------------------ 1 file changed, 195 deletions(-) delete mode 100644 test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java deleted file mode 100644 index 6db1cb2faab..00000000000 --- a/test/jdk/tools/jpackage/macosx/SigningPackageFromTwoStepAppImageTest.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2022, 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. - * - * 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. - */ - -import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; - -import java.nio.file.Path; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.ApplicationLayout; -import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.MacHelper; -import jdk.jpackage.test.MacSign; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.TKit; - -/** - * Tests generation of dmg and pkg from signed predefined app image which was - * signed using two step process (generate app image and then signed using - * --app-image and --mac-sign). Test will generate pkg and verifies its - * signature. It verifies that dmg is not signed, but app image inside dmg - * is signed. This test requires that the machine is configured with test - * certificate for "Developer ID Installer: jpackage.openjdk.java.net" in - * jpackagerTest keychain with always allowed access to this keychain for user - * which runs test. - * note: - * "jpackage.openjdk.java.net" can be over-ridden by system property - * "jpackage.mac.signing.key.user.name", and - * "jpackagerTest" can be over-ridden by system property - * "jpackage.mac.signing.keychain" - */ - -/* - * @test - * @summary jpackage with --type pkg,dmg --app-image - * @library /test/jdk/tools/jpackage/helpers - * @library base - * @key jpackagePlatformPackage - * @build SigningBase - * @build jdk.jpackage.test.* - * @build SigningPackageFromTwoStepAppImageTest - * @requires (jpackage.test.MacSignTests == "run") - * @run main/othervm/timeout=720 -Xmx512m jdk.jpackage.test.Main - * --jpt-run=SigningPackageFromTwoStepAppImageTest - * --jpt-before-run=SigningBase.verifySignTestEnvReady - */ -public class SigningPackageFromTwoStepAppImageTest { - - private static void verifyPKG(JPackageCommand cmd) { - if (!cmd.hasArgument("--mac-sign")) { - return; // Nothing to check if not signed - } - - Path outputBundle = cmd.outputBundle(); - SigningBase.verifyPkgutil(outputBundle, true, SigningBase.DEFAULT_INDEX); - SigningBase.verifySpctl(outputBundle, "install", SigningBase.DEFAULT_INDEX); - } - - private static void verifyDMG(JPackageCommand cmd) { - // DMG always unsigned, so we will check it - Path outputBundle = cmd.outputBundle(); - SigningBase.verifyDMG(outputBundle); - } - - private static void verifyAppImageInDMG(JPackageCommand cmd) { - MacHelper.withExplodedDmg(cmd, dmgImage -> { - // We will be called with all folders in DMG since JDK-8263155, but - // we only need to verify app. - if (dmgImage.endsWith(cmd.name() + ".app")) { - Path launcherPath = ApplicationLayout.platformAppImage() - .resolveAt(dmgImage).launchersDirectory().resolve(cmd.name()); - SigningBase.verifyCodesign(launcherPath, true, SigningBase.DEFAULT_INDEX); - SigningBase.verifyCodesign(dmgImage, true, SigningBase.DEFAULT_INDEX); - SigningBase.verifySpctl(dmgImage, "exec", SigningBase.DEFAULT_INDEX); - } - }); - } - - @Test - // ({"sign or not", "signing-key or sign-identity"}) - // Sign and signing-key - @Parameter({"true", "true"}) - // Sign and sign-identity - @Parameter({"true", "false"}) - // Unsigned - @Parameter({"false", "true"}) - public void test(boolean signAppImage, boolean signingKey) throws Exception { - MacSign.withKeychain(toConsumer(keychain -> { - test(keychain, signAppImage, signingKey); - }), SigningBase.StandardKeychain.MAIN.keychain()); - } - - private void test(MacSign.ResolvedKeychain keychain, boolean signAppImage, boolean signingKey) throws Exception { - - Path appimageOutput = TKit.createTempDirectory("appimage"); - - // Generate app image. Signed or unsigned based on test - // parameter. We should able to sign predfined app images - // which are signed or unsigned. - JPackageCommand appImageCmd = JPackageCommand.helloAppImage() - .setArgumentValue("--dest", appimageOutput); - if (signAppImage) { - appImageCmd.addArguments("--mac-sign", - "--mac-signing-keychain", keychain.name()); - if (signingKey) { - appImageCmd.addArguments("--mac-signing-key-user-name", - SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); - } else { - appImageCmd.addArguments("--mac-app-image-sign-identity", - SigningBase.getAppCert(SigningBase.DEFAULT_INDEX)); - } - } - - // Generate app image - appImageCmd.executeAndAssertHelloAppImageCreated(); - - // Double check if it is signed or unsigned based on signAppImage - SigningBase.verifyAppImageSignature(appImageCmd, signAppImage); - - // Sign app image - JPackageCommand appImageSignedCmd = new JPackageCommand(); - appImageSignedCmd.setPackageType(PackageType.IMAGE) - .addArguments("--app-image", appImageCmd.outputBundle().toAbsolutePath()) - .addArguments("--mac-sign") - .addArguments("--mac-signing-keychain", keychain.name()); - if (signingKey) { - appImageSignedCmd.addArguments("--mac-signing-key-user-name", - SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); - } else { - appImageSignedCmd.addArguments("--mac-app-image-sign-identity", - SigningBase.getAppCert(SigningBase.DEFAULT_INDEX)); - } - appImageSignedCmd.executeAndAssertImageCreated(); - - // Should be signed app image - SigningBase.verifyAppImageSignature(appImageCmd, true); - - new PackageTest() - .forTypes(PackageType.MAC) - .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); - if (signAppImage) { - cmd.addArguments("--mac-sign", - "--mac-signing-keychain", - keychain.name()); - if (signingKey) { - cmd.addArguments("--mac-signing-key-user-name", - SigningBase.getDevName(SigningBase.DEFAULT_INDEX)); - } else { - cmd.addArguments("--mac-installer-sign-identity", - SigningBase.getInstallerCert(SigningBase.DEFAULT_INDEX)); - } - } - }) - .forTypes(PackageType.MAC_PKG) - .addBundleVerifier( - SigningPackageFromTwoStepAppImageTest::verifyPKG) - .forTypes(PackageType.MAC_DMG) - .addInitializer(cmd -> { - if (signAppImage && !signingKey) { - // jpackage throws expected error with - // --mac-installer-sign-identity and DMG type - cmd.removeArgument("--mac-sign"); - cmd.removeArgumentWithValue("--mac-signing-keychain"); - cmd.removeArgumentWithValue("--mac-installer-sign-identity"); - } - }) - .addBundleVerifier( - SigningPackageFromTwoStepAppImageTest::verifyDMG) - .addBundleVerifier( - SigningPackageFromTwoStepAppImageTest::verifyAppImageInDMG) - .run(); - } -} From dfa04f4aa5463de7812877553ea779da6467d373 Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen Date: Fri, 31 Oct 2025 00:04:11 +0000 Subject: [PATCH 380/561] 8370653: Fix race in CompressedClassSpaceSizeInJmapHeap.java Reviewed-by: phh, wkemper, ysr --- .../CompressedClassSpaceSizeInJmapHeap.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/hotspot/jtreg/gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java b/test/hotspot/jtreg/gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java index 3b89bf04d18..f042ac44af4 100644 --- a/test/hotspot/jtreg/gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java +++ b/test/hotspot/jtreg/gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java @@ -46,6 +46,7 @@ import java.nio.charset.Charset; import java.util.List; public class CompressedClassSpaceSizeInJmapHeap { + // Note that on some platforms it may require root privileges to run this test. public static void main(String[] args) throws Exception { SATestUtils.skipIfCannotAttach(); // throws SkippedException if attach not expected to work. @@ -67,8 +68,15 @@ public class CompressedClassSpaceSizeInJmapHeap { File err = new File("CompressedClassSpaceSizeInJmapHeap.stderr.txt"); pb.redirectError(err); - run(pb); - + // If we attempt to attach to LingeredApp before it has initialized, the heap dump request will fail, so we allow 3 tries + int allowedTries = 3; + int exitValue; + do { + exitValue = run(pb); + } while ((exitValue != 0) && (allowedTries-- > 0)); + if (exitValue != 0) { + throw new Exception("jmap -heap exited with error code: " + exitValue); + } OutputAnalyzer output = new OutputAnalyzer(read(out)); output.shouldContain("CompressedClassSpaceSize = 50331648 (48.0MB)"); out.delete(); @@ -76,12 +84,9 @@ public class CompressedClassSpaceSizeInJmapHeap { LingeredApp.stopApp(theApp); } - private static void run(ProcessBuilder pb) throws Exception { + private static int run(ProcessBuilder pb) throws Exception { OutputAnalyzer output = ProcessTools.executeProcess(pb); - int exitValue = output.getExitValue(); - if (exitValue != 0) { - throw new Exception("jmap -heap exited with error code: " + exitValue); - } + return output.getExitValue(); } private static String read(File f) throws Exception { From 3c1010b57f2f8258a2ccf59b9f86fc8debd71918 Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen Date: Fri, 31 Oct 2025 00:05:59 +0000 Subject: [PATCH 381/561] 8370646: TestLargeUTF8Length.java needs lots of memory Reviewed-by: phh, wkemper, ysr --- test/hotspot/jtreg/runtime/jni/checked/TestLargeUTF8Length.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/runtime/jni/checked/TestLargeUTF8Length.java b/test/hotspot/jtreg/runtime/jni/checked/TestLargeUTF8Length.java index 50f8385bb6d..27ec125317b 100644 --- a/test/hotspot/jtreg/runtime/jni/checked/TestLargeUTF8Length.java +++ b/test/hotspot/jtreg/runtime/jni/checked/TestLargeUTF8Length.java @@ -25,6 +25,7 @@ * @bug 8328877 * @summary Test warning for GetStringUTFLength and functionality of GetStringUTFLengthAsLong * @requires vm.bits == 64 + * @requires os.maxMemory > 15g * @library /test/lib * @modules java.management * @run main/native TestLargeUTF8Length launch From 6347f10bf1dd3959cc1f2aba32e72ca8d9d56e82 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Fri, 31 Oct 2025 00:07:47 +0000 Subject: [PATCH 382/561] 8370521: GenShen: Various code cleanup related to promotion Reviewed-by: fandreuzzi, kdnilsen, ysr --- .../heuristics/shenandoahOldHeuristics.cpp | 10 +++++-- .../gc/shenandoah/shenandoahCollectionSet.cpp | 6 ++-- .../gc/shenandoah/shenandoahCollectionSet.hpp | 12 ++++---- .../shenandoahCollectionSet.inline.hpp | 6 ++-- .../gc/shenandoah/shenandoahGeneration.cpp | 30 +++++++++++-------- .../gc/shenandoah/shenandoahGeneration.hpp | 2 +- .../shenandoah/shenandoahGenerationalHeap.cpp | 21 ++++++------- .../share/gc/shenandoah/shenandoahHeap.cpp | 2 +- .../share/gc/shenandoah/shenandoahOldGC.cpp | 6 ---- .../gc/shenandoah/shenandoahOldGeneration.cpp | 5 ++++ .../share/gc/shenandoah/shenandoahTrace.cpp | 6 ++-- .../gc/shenandoah/shenandoah_globals.hpp | 16 +++++----- 12 files changed, 65 insertions(+), 57 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp index 2361a50e76d..e963bcc35bb 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp @@ -141,7 +141,7 @@ bool ShenandoahOldHeuristics::prime_collection_set(ShenandoahCollectionSet* coll // If region r is evacuated to fragmented memory (to free memory within a partially used region), then we need // to decrease the capacity of the fragmented memory by the scaled loss. - size_t live_data_for_evacuation = r->get_live_data_bytes(); + const size_t live_data_for_evacuation = r->get_live_data_bytes(); size_t lost_available = r->free(); if ((lost_available > 0) && (excess_fragmented_available > 0)) { @@ -169,7 +169,9 @@ bool ShenandoahOldHeuristics::prime_collection_set(ShenandoahCollectionSet* coll // We were not able to account for the lost free memory within fragmented memory, so we need to take this // allocation out of unfragmented memory. Unfragmented memory does not need to account for loss of free. if (live_data_for_evacuation > unfragmented_available) { - // There is not room to evacuate this region or any that come after it in within the candidates array. + // There is no room to evacuate this region or any that come after it in within the candidates array. + log_debug(gc, cset)("Not enough unfragmented memory (%zu) to hold evacuees (%zu) from region: (%zu)", + unfragmented_available, live_data_for_evacuation, r->index()); break; } else { unfragmented_available -= live_data_for_evacuation; @@ -187,7 +189,9 @@ bool ShenandoahOldHeuristics::prime_collection_set(ShenandoahCollectionSet* coll evacuation_need = 0; } if (evacuation_need > unfragmented_available) { - // There is not room to evacuate this region or any that come after it in within the candidates array. + // There is no room to evacuate this region or any that come after it in within the candidates array. + log_debug(gc, cset)("Not enough unfragmented memory (%zu) to hold evacuees (%zu) from region: (%zu)", + unfragmented_available, live_data_for_evacuation, r->index()); break; } else { unfragmented_available -= evacuation_need; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp index 745d45ace1e..e58a7f40796 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.cpp @@ -225,9 +225,9 @@ void ShenandoahCollectionSet::summarize(size_t total_garbage, size_t immediate_g count()); if (garbage() > 0) { - const size_t young_evac_bytes = get_young_bytes_reserved_for_evacuation(); - const size_t promote_evac_bytes = get_young_bytes_to_be_promoted(); - const size_t old_evac_bytes = get_old_bytes_reserved_for_evacuation(); + const size_t young_evac_bytes = get_live_bytes_in_untenurable_regions(); + const size_t promote_evac_bytes = get_live_bytes_in_tenurable_regions(); + const size_t old_evac_bytes = get_live_bytes_in_old_regions(); const size_t total_evac_bytes = young_evac_bytes + promote_evac_bytes + old_evac_bytes; ls.print_cr("Evacuation Targets: " "YOUNG: " PROPERFMT ", " "PROMOTE: " PROPERFMT ", " "OLD: " PROPERFMT ", " "TOTAL: " PROPERFMT, diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp index d4a590a3d89..a1b77baa2d3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.hpp @@ -109,14 +109,14 @@ public: // Prints a summary of the collection set when gc+ergo=info void summarize(size_t total_garbage, size_t immediate_garbage, size_t immediate_regions) const; - // Returns the amount of live bytes in young regions in the collection set. It is not known how many of these bytes will be promoted. - inline size_t get_young_bytes_reserved_for_evacuation() const; + // Returns the amount of live bytes in young regions with an age below the tenuring threshold. + inline size_t get_live_bytes_in_untenurable_regions() const; // Returns the amount of live bytes in old regions in the collection set. - inline size_t get_old_bytes_reserved_for_evacuation() const; + inline size_t get_live_bytes_in_old_regions() const; - // Returns the amount of live bytes in young regions with an age above the tenuring threshold. - inline size_t get_young_bytes_to_be_promoted() const; + // Returns the amount of live bytes in young regions with an age at or above the tenuring threshold. + inline size_t get_live_bytes_in_tenurable_regions() const; // Returns the amount of free bytes in young regions in the collection set. size_t get_young_available_bytes_collected() const { return _young_available_bytes_collected; } @@ -125,7 +125,7 @@ public: inline size_t get_old_garbage() const; bool is_preselected(size_t region_idx) { - assert(_preselected_regions != nullptr, "Missing etsablish after abandon"); + assert(_preselected_regions != nullptr, "Missing establish after abandon"); return _preselected_regions[region_idx]; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp index 4adcec4fbb5..3ff5f2f81d7 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahCollectionSet.inline.hpp @@ -54,15 +54,15 @@ bool ShenandoahCollectionSet::is_in_loc(void* p) const { return _biased_cset_map[index] == 1; } -size_t ShenandoahCollectionSet::get_old_bytes_reserved_for_evacuation() const { +size_t ShenandoahCollectionSet::get_live_bytes_in_old_regions() const { return _old_bytes_to_evacuate; } -size_t ShenandoahCollectionSet::get_young_bytes_reserved_for_evacuation() const { +size_t ShenandoahCollectionSet::get_live_bytes_in_untenurable_regions() const { return _young_bytes_to_evacuate - _young_bytes_to_promote; } -size_t ShenandoahCollectionSet::get_young_bytes_to_be_promoted() const { +size_t ShenandoahCollectionSet::get_live_bytes_in_tenurable_regions() const { return _young_bytes_to_promote; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp index 8b0d2d4c8be..f74dffe50b0 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp @@ -382,11 +382,11 @@ void ShenandoahGeneration::adjust_evacuation_budgets(ShenandoahHeap* const heap, // available that results from a decrease in memory consumed by old evacuation is not necessarily available to be loaned // to young-gen. - size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); ShenandoahOldGeneration* const old_generation = heap->old_generation(); ShenandoahYoungGeneration* const young_generation = heap->young_generation(); - size_t old_evacuated = collection_set->get_old_bytes_reserved_for_evacuation(); + const size_t old_evacuated = collection_set->get_live_bytes_in_old_regions(); size_t old_evacuated_committed = (size_t) (ShenandoahOldEvacWaste * double(old_evacuated)); size_t old_evacuation_reserve = old_generation->get_evacuation_reserve(); @@ -399,14 +399,15 @@ void ShenandoahGeneration::adjust_evacuation_budgets(ShenandoahHeap* const heap, // Leave old_evac_reserve as previously configured } else if (old_evacuated_committed < old_evacuation_reserve) { // This happens if the old-gen collection consumes less than full budget. + log_debug(gc, cset)("Shrinking old evac reserve to match old_evac_commited: " PROPERFMT, PROPERFMTARGS(old_evacuated_committed)); old_evacuation_reserve = old_evacuated_committed; old_generation->set_evacuation_reserve(old_evacuation_reserve); } - size_t young_advance_promoted = collection_set->get_young_bytes_to_be_promoted(); + size_t young_advance_promoted = collection_set->get_live_bytes_in_tenurable_regions(); size_t young_advance_promoted_reserve_used = (size_t) (ShenandoahPromoEvacWaste * double(young_advance_promoted)); - size_t young_evacuated = collection_set->get_young_bytes_reserved_for_evacuation(); + size_t young_evacuated = collection_set->get_live_bytes_in_untenurable_regions(); size_t young_evacuated_reserve_used = (size_t) (ShenandoahEvacWaste * double(young_evacuated)); size_t total_young_available = young_generation->available_with_reserve(); @@ -524,7 +525,7 @@ inline void assert_no_in_place_promotions() { // that this allows us to more accurately budget memory to hold the results of evacuation. Memory for evacuation // of aged regions must be reserved in the old generation. Memory for evacuation of all other regions must be // reserved in the young generation. -size_t ShenandoahGeneration::select_aged_regions(size_t old_available) { +size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_reserve) { // There should be no regions configured for subsequent in-place-promotions carried over from the previous cycle. assert_no_in_place_promotions(); @@ -537,7 +538,6 @@ size_t ShenandoahGeneration::select_aged_regions(size_t old_available) { const size_t pip_used_threshold = (ShenandoahHeapRegion::region_size_bytes() * ShenandoahGenerationalMinPIPUsage) / 100; - size_t old_consumed = 0; size_t promo_potential = 0; size_t candidates = 0; @@ -560,7 +560,7 @@ size_t ShenandoahGeneration::select_aged_regions(size_t old_available) { } if (heap->is_tenurable(r)) { if ((r->garbage() < old_garbage_threshold) && (r->used() > pip_used_threshold)) { - // We prefer to promote this region in place because is has a small amount of garbage and a large usage. + // We prefer to promote this region in place because it has a small amount of garbage and a large usage. HeapWord* tams = ctx->top_at_mark_start(r); HeapWord* original_top = r->top(); if (!heap->is_concurrent_old_mark_in_progress() && tams == original_top) { @@ -620,17 +620,21 @@ size_t ShenandoahGeneration::select_aged_regions(size_t old_available) { // Note that we keep going even if one region is excluded from selection. // Subsequent regions may be selected if they have smaller live data. } + + log_info(gc, ergo)("Promotion potential of aged regions with sufficient garbage: " PROPERFMT, PROPERFMTARGS(promo_potential)); + // Sort in increasing order according to live data bytes. Note that candidates represents the number of regions // that qualify to be promoted by evacuation. + size_t old_consumed = 0; if (candidates > 0) { size_t selected_regions = 0; size_t selected_live = 0; QuickSort::sort(sorted_regions, candidates, compare_by_aged_live); for (size_t i = 0; i < candidates; i++) { ShenandoahHeapRegion* const region = sorted_regions[i]._region; - size_t region_live_data = sorted_regions[i]._live_data; - size_t promotion_need = (size_t) (region_live_data * ShenandoahPromoEvacWaste); - if (old_consumed + promotion_need <= old_available) { + const size_t region_live_data = sorted_regions[i]._live_data; + const size_t promotion_need = (size_t) (region_live_data * ShenandoahPromoEvacWaste); + if (old_consumed + promotion_need <= old_promotion_reserve) { old_consumed += promotion_need; candidate_regions_for_promotion_by_copy[region->index()] = true; selected_regions++; @@ -644,9 +648,9 @@ size_t ShenandoahGeneration::select_aged_regions(size_t old_available) { // We keep going even if one region is excluded from selection because we need to accumulate all eligible // regions that are not preselected into promo_potential } - log_debug(gc)("Preselected %zu regions containing %zu live bytes," - " consuming: %zu of budgeted: %zu", - selected_regions, selected_live, old_consumed, old_available); + log_debug(gc, ergo)("Preselected %zu regions containing " PROPERFMT " live data," + " consuming: " PROPERFMT " of budgeted: " PROPERFMT, + selected_regions, PROPERFMTARGS(selected_live), PROPERFMTARGS(old_consumed), PROPERFMTARGS(old_promotion_reserve)); } heap->old_generation()->set_pad_for_promote_in_place(promote_in_place_pad); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp index d2e25176c1f..b926a5a0913 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp @@ -97,7 +97,7 @@ private: // regions, which are marked in the preselected_regions() indicator // array of the heap's collection set, which should be initialized // to false. - size_t select_aged_regions(size_t old_available); + size_t select_aged_regions(size_t old_promotion_reserve); size_t available(size_t capacity) const; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 3db810a9d9d..5c7b65405cf 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -110,7 +110,6 @@ void ShenandoahGenerationalHeap::initialize_heuristics() { _generation_sizer.heap_size_changed(max_capacity()); size_t initial_capacity_young = _generation_sizer.max_young_size(); size_t max_capacity_young = _generation_sizer.max_young_size(); - size_t initial_capacity_old = max_capacity() - max_capacity_young; size_t max_capacity_old = max_capacity() - initial_capacity_young; _young_generation = new ShenandoahYoungGeneration(max_workers(), max_capacity_young); @@ -267,6 +266,7 @@ oop ShenandoahGenerationalHeap::try_evacuate_object(oop p, Thread* thread, Shena // the requested object does not fit within the current plab but the plab still has an "abundance" of memory, // where abundance is defined as >= ShenGenHeap::plab_min_size(). In the former case, we try shrinking the // desired PLAB size to the minimum and retry PLAB allocation to avoid cascading of shared memory allocations. + // Shrinking the desired PLAB size may allow us to eke out a small PLAB while staying beneath evacuation reserve. if (plab->words_remaining() < plab_min_size()) { ShenandoahThreadLocalData::set_plab_size(thread, plab_min_size()); copy = allocate_from_plab(thread, size, is_promotion); @@ -436,9 +436,8 @@ inline HeapWord* ShenandoahGenerationalHeap::allocate_from_plab(Thread* thread, // Establish a new PLAB and allocate size HeapWords within it. HeapWord* ShenandoahGenerationalHeap::allocate_from_plab_slow(Thread* thread, size_t size, bool is_promotion) { - // New object should fit the PLAB size - assert(mode()->is_generational(), "PLABs only relevant to generational GC"); + const size_t plab_min_size = this->plab_min_size(); // PLABs are aligned to card boundaries to avoid synchronization with concurrent // allocations in other PLABs. @@ -451,23 +450,24 @@ HeapWord* ShenandoahGenerationalHeap::allocate_from_plab_slow(Thread* thread, si } // Expand aggressively, doubling at each refill in this epoch, ceiling at plab_max_size() - size_t future_size = MIN2(cur_size * 2, plab_max_size()); + const size_t future_size = MIN2(cur_size * 2, plab_max_size()); // Doubling, starting at a card-multiple, should give us a card-multiple. (Ceiling and floor // are card multiples.) assert(is_aligned(future_size, CardTable::card_size_in_words()), "Card multiple by construction, future_size: %zu" - ", card_size: %zu, cur_size: %zu, max: %zu", - future_size, (size_t) CardTable::card_size_in_words(), cur_size, plab_max_size()); + ", card_size: %u, cur_size: %zu, max: %zu", + future_size, CardTable::card_size_in_words(), cur_size, plab_max_size()); // Record new heuristic value even if we take any shortcut. This captures // the case when moderately-sized objects always take a shortcut. At some point, // heuristics should catch up with them. Note that the requested cur_size may // not be honored, but we remember that this is the preferred size. - log_debug(gc, free)("Set new PLAB size: %zu", future_size); + log_debug(gc, plab)("Set next PLAB refill size: %zu bytes", future_size * HeapWordSize); ShenandoahThreadLocalData::set_plab_size(thread, future_size); + if (cur_size < size) { // The PLAB to be allocated is still not large enough to hold the object. Fall back to shared allocation. // This avoids retiring perfectly good PLABs in order to represent a single large object allocation. - log_debug(gc, free)("Current PLAB size (%zu) is too small for %zu", cur_size, size); + log_debug(gc, plab)("Current PLAB size (%zu) is too small for %zu", cur_size * HeapWordSize, size * HeapWordSize); return nullptr; } @@ -553,6 +553,7 @@ void ShenandoahGenerationalHeap::retire_plab(PLAB* plab, Thread* thread) { ShenandoahThreadLocalData::reset_plab_promoted(thread); ShenandoahThreadLocalData::set_plab_actual_size(thread, 0); if (not_promoted > 0) { + log_debug(gc, plab)("Retire PLAB, unexpend unpromoted: %zu", not_promoted * HeapWordSize); old_generation()->unexpend_promoted(not_promoted); } const size_t original_waste = plab->waste(); @@ -564,8 +565,8 @@ void ShenandoahGenerationalHeap::retire_plab(PLAB* plab, Thread* thread) { if (top != nullptr && plab->waste() > original_waste && is_in_old(top)) { // If retiring the plab created a filler object, then we need to register it with our card scanner so it can // safely walk the region backing the plab. - log_debug(gc)("retire_plab() is registering remnant of size %zu at " PTR_FORMAT, - plab->waste() - original_waste, p2i(top)); + log_debug(gc, plab)("retire_plab() is registering remnant of size %zu at " PTR_FORMAT, + (plab->waste() - original_waste) * HeapWordSize, p2i(top)); // No lock is necessary because the PLAB memory is aligned on card boundaries. old_generation()->card_scan()->register_object_without_lock(top); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index befb6069409..a058a7bd38d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -1271,7 +1271,7 @@ void ShenandoahHeap::evacuate_collection_set(ShenandoahGeneration* generation, b void ShenandoahHeap::concurrent_prepare_for_update_refs() { { - // Java threads take this lock while they are being attached and added to the list of thread. + // Java threads take this lock while they are being attached and added to the list of threads. // If another thread holds this lock before we update the gc state, it will receive a stale // gc state, but they will have been added to the list of java threads and so will be corrected // by the following handshake. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp index 3e9f3a490df..d980a9e3e0c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp @@ -69,12 +69,6 @@ void ShenandoahOldGC::op_final_mark() { heap->set_unload_classes(false); heap->prepare_concurrent_roots(); - // Believe verification following old-gen concurrent mark needs to be different than verification following - // young-gen concurrent mark, so am commenting this out for now: - // if (ShenandoahVerify) { - // heap->verifier()->verify_after_concmark(); - // } - if (VerifyAfterGC) { Universe::verify(); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp index edaec02876a..9c95dad6409 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp @@ -303,6 +303,8 @@ ShenandoahOldGeneration::configure_plab_for_current_thread(const ShenandoahAlloc if (can_promote(actual_size)) { // Assume the entirety of this PLAB will be used for promotion. This prevents promotion from overreach. // When we retire this plab, we'll unexpend what we don't really use. + log_debug(gc, plab)("Thread can promote using PLAB of %zu bytes. Expended: %zu, available: %zu", + actual_size, get_promoted_expended(), get_promoted_reserve()); expend_promoted(actual_size); ShenandoahThreadLocalData::enable_plab_promotions(thread); ShenandoahThreadLocalData::set_plab_actual_size(thread, actual_size); @@ -310,9 +312,12 @@ ShenandoahOldGeneration::configure_plab_for_current_thread(const ShenandoahAlloc // Disable promotions in this thread because entirety of this PLAB must be available to hold old-gen evacuations. ShenandoahThreadLocalData::disable_plab_promotions(thread); ShenandoahThreadLocalData::set_plab_actual_size(thread, 0); + log_debug(gc, plab)("Thread cannot promote using PLAB of %zu bytes. Expended: %zu, available: %zu, mixed evacuations? %s", + actual_size, get_promoted_expended(), get_promoted_reserve(), BOOL_TO_STR(ShenandoahHeap::heap()->collection_set()->has_old_regions())); } } else if (req.is_promotion()) { // Shared promotion. + log_debug(gc, plab)("Expend shared promotion of %zu bytes", actual_size); expend_promoted(actual_size); } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahTrace.cpp b/src/hotspot/share/gc/shenandoah/shenandoahTrace.cpp index a786f8ae216..bbb44348355 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahTrace.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahTrace.cpp @@ -37,9 +37,9 @@ void ShenandoahTracer::report_evacuation_info(const ShenandoahCollectionSet* cse e.set_cSetRegions(cset->count()); e.set_cSetUsedBefore(cset->used()); e.set_cSetUsedAfter(cset->live()); - e.set_collectedOld(cset->get_old_bytes_reserved_for_evacuation()); - e.set_collectedPromoted(cset->get_young_bytes_to_be_promoted()); - e.set_collectedYoung(cset->get_young_bytes_reserved_for_evacuation()); + e.set_collectedOld(cset->get_live_bytes_in_old_regions()); + e.set_collectedPromoted(cset->get_live_bytes_in_tenurable_regions()); + e.set_collectedYoung(cset->get_live_bytes_in_untenurable_regions()); e.set_regionsPromotedHumongous(regions_promoted_humongous); e.set_regionsPromotedRegular(regions_promoted_regular); e.set_regularPromotedGarbage(regular_promoted_garbage); diff --git a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp index d1531c51236..8bd59beb93b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoah_globals.hpp @@ -387,13 +387,13 @@ \ product(uintx, ShenandoahOldEvacRatioPercent, 75, EXPERIMENTAL, \ "The maximum proportion of evacuation from old-gen memory, " \ - "expressed as a percentage. The default value 75 denotes that no" \ - "more than 75% of the collection set evacuation workload may be " \ - "towards evacuation of old-gen heap regions. This limits both the"\ - "promotion of aged regions and the compaction of existing old " \ - "regions. A value of 75 denotes that the total evacuation work" \ - "may increase to up to four times the young gen evacuation work." \ - "A larger value allows quicker promotion and allows" \ + "expressed as a percentage. The default value 75 denotes that " \ + "no more than 75% of the collection set evacuation workload may " \ + "be towards evacuation of old-gen heap regions. This limits both "\ + "the promotion of aged regions and the compaction of existing " \ + "old regions. A value of 75 denotes that the total evacuation " \ + "work may increase to up to four times the young gen evacuation " \ + "work. A larger value allows quicker promotion and allows " \ "a smaller number of mixed evacuations to process " \ "the entire list of old-gen collection candidates at the cost " \ "of an increased disruption of the normal cadence of young-gen " \ @@ -401,7 +401,7 @@ "focus entirely on old-gen memory, allowing no young-gen " \ "regions to be collected, likely resulting in subsequent " \ "allocation failures because the allocation pool is not " \ - "replenished. A value of 0 allows a mixed evacuation to" \ + "replenished. A value of 0 allows a mixed evacuation to " \ "focus entirely on young-gen memory, allowing no old-gen " \ "regions to be collected, likely resulting in subsequent " \ "promotion failures and triggering of stop-the-world full GC " \ From 4f9f086847f531ab1791727d74955cfd8ec56811 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Fri, 31 Oct 2025 01:40:06 +0000 Subject: [PATCH 383/561] 8224852: JVM crash on watched field access from native code Reviewed-by: amenkov, sspitsyn --- src/hotspot/share/prims/jvmtiExport.cpp | 37 ++- .../FieldEventsFromJNI.java | 75 ++++++ .../libFieldEventsFromJNI.cpp | 213 ++++++++++++++++++ test/lib/jdk/test/lib/jvmti/jvmti_common.hpp | 18 ++ 4 files changed, 336 insertions(+), 7 deletions(-) create mode 100644 test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/FieldEventsFromJNI.java create mode 100644 test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/libFieldEventsFromJNI.cpp diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index b58a88dcbb5..4c3dc9ebf03 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -2207,6 +2207,11 @@ void JvmtiExport::post_field_access_by_jni(JavaThread *thread, oop obj, // We must be called with a Java context in order to provide reasonable // values for the klazz, method, and location fields. The callers of this // function don't make the call unless there is a Java context. + // The last java frame might be compiled in 2 cases: + // 1) Field events and interp_only mode are not enabled for this thread. + // This method is called from any thread. The thread filtering is done later. + // 2) The same JNI call is stll executing after event was enabled. + // In this case the last frame is only marked for deoptimization but still remains compiled. assert(thread->has_last_Java_frame(), "must be called with a Java context"); if (thread->should_hide_jvmti_events()) { @@ -2229,10 +2234,16 @@ void JvmtiExport::post_field_access_by_jni(JavaThread *thread, oop obj, assert(obj != nullptr, "non-static needs an object"); h_obj = Handle(thread, obj); } - post_field_access(thread, - thread->last_frame().interpreter_frame_method(), - thread->last_frame().interpreter_frame_bcp(), - klass, h_obj, fieldID); + + RegisterMap reg_map(thread, + RegisterMap::UpdateMap::skip, + RegisterMap::ProcessFrames::skip, + RegisterMap::WalkContinuation::skip); + javaVFrame *jvf = thread->last_java_vframe(®_map); + Method* method = jvf->method(); + address address = jvf->method()->code_base(); + + post_field_access(thread, method, address, klass, h_obj, fieldID); } void JvmtiExport::post_field_access(JavaThread *thread, Method* method, @@ -2293,6 +2304,11 @@ void JvmtiExport::post_field_modification_by_jni(JavaThread *thread, oop obj, // We must be called with a Java context in order to provide reasonable // values for the klazz, method, and location fields. The callers of this // function don't make the call unless there is a Java context. + // The last java frame might be compiled in 2 cases: + // 1) Field events and interp_only mode are not enabled for this thread. + // This method is called from any thread. The thread filtering is done later. + // 2) The same JNI call is stll executing after event was enabled. + // In this case the last frame is only marked for deoptimization but still remains compiled. assert(thread->has_last_Java_frame(), "must be called with Java context"); if (thread->should_hide_jvmti_events()) { @@ -2316,9 +2332,16 @@ void JvmtiExport::post_field_modification_by_jni(JavaThread *thread, oop obj, assert(obj != nullptr, "non-static needs an object"); h_obj = Handle(thread, obj); } - post_field_modification(thread, - thread->last_frame().interpreter_frame_method(), - thread->last_frame().interpreter_frame_bcp(), + + RegisterMap reg_map(thread, + RegisterMap::UpdateMap::skip, + RegisterMap::ProcessFrames::skip, + RegisterMap::WalkContinuation::skip); + javaVFrame *jvf = thread->last_java_vframe(®_map); + Method* method = jvf->method(); + address address = jvf->method()->code_base(); + + post_field_modification(thread, method, address, klass, h_obj, fieldID, sig_type, value); } diff --git a/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/FieldEventsFromJNI.java b/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/FieldEventsFromJNI.java new file mode 100644 index 00000000000..2e310deabed --- /dev/null +++ b/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/FieldEventsFromJNI.java @@ -0,0 +1,75 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @summary Test verifies that field access/modification events are correctly posted from JNI. + * @bug 8224852 + * @run main/othervm/native -agentlib:FieldEventsFromJNI FieldEventsFromJNI + */ +public class FieldEventsFromJNI { + + private String accessField = "accessFieldValue"; + private String modifyField = "modifyFieldValue"; + + private native void enableEventsAndAccessField(int numOfEventsExpected, Thread eventThread); + private native void enableEventsAndModifyField(int numOfEventsExpected, Thread eventThread); + + void javaMethod(int numOfEventsExpected, Thread eventThread) { + enableEventsAndAccessField(numOfEventsExpected, eventThread); + enableEventsAndModifyField(numOfEventsExpected, eventThread); + } + + final static Object lock = new Object(); + volatile static boolean isAnotherThreadStarted = false; + + public static void main(String[] args) throws InterruptedException { + System.loadLibrary("FieldEventsFromJNI"); + // anotherThread doesn't access fields, it is needed only to + // enable notification somewhere. + Thread anotherThread = new Thread(() -> { + isAnotherThreadStarted = true; + synchronized(lock) { + lock.notify(); + } + while(!Thread.currentThread().isInterrupted()) { + Thread.yield(); + } + }); + synchronized(lock) { + anotherThread.start(); + while (!isAnotherThreadStarted) { + lock.wait(); + } + } + + FieldEventsFromJNI testObject = new FieldEventsFromJNI(); + // Enable events while the thread is in the same JNI call. + testObject.javaMethod(1, Thread.currentThread()); + // Verify that field access from JNI doesn't fail if events are + // not enaled on this thread. + testObject.javaMethod(0, anotherThread); + anotherThread.interrupt(); + anotherThread.join(); + } +} diff --git a/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/libFieldEventsFromJNI.cpp b/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/libFieldEventsFromJNI.cpp new file mode 100644 index 00000000000..7e0728fb483 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/jvmti/events/FieldAccess/FieldEventsFromJNI/libFieldEventsFromJNI.cpp @@ -0,0 +1,213 @@ +/* + * 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. + * + * 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. + */ + +#include +#include + +#include "jvmti.h" +#include "jni.h" +#include "jvmti_common.hpp" + +jvmtiEnv* jvmti_env; + +// The event counters are used to check events from different threads. +static std::atomic access_cnt{0}; +static std::atomic modify_cnt{0}; + + +static const char* TEST_CLASS_NAME = "LFieldEventsFromJNI;"; + +static const char* ACCESS_FIELD_NAME = "accessField"; +static const char* ACCESS_METHOD_NAME = "enableEventsAndAccessField"; +static const char* MODIFY_FIELD_NAME = "modifyField"; +static const char* MODIFY_METHOD_NAME = "enableEventsAndModifyField"; + + +static void JNICALL +cbFieldAccess(jvmtiEnv *jvmti, JNIEnv* jni, jthread thread, jmethodID method, + jlocation location, jclass field_klass, jobject object, jfieldID field) { + char* m_name = get_method_name(jvmti, jni, method); + LOG("The field access triggered from method '%s'\n", m_name); + if (strcmp(m_name, ACCESS_METHOD_NAME) != 0) { + fatal(jni, "The method's name is incorrect."); + } + deallocate(jvmti,jni, m_name); + + LOG("The location is %" PRId64 "\n", (int64_t)location); + if (location != 0) { + fatal(jni, "The method's location should be 0 for jni call."); + } + + char* f_name = get_field_name(jvmti, jni, field_klass, field); + LOG("The field name '%s'\n", f_name); + if (strcmp(f_name, ACCESS_FIELD_NAME) != 0) { + fatal(jni, "The access field is incorrect."); + } + deallocate(jvmti,jni, f_name); + + char* obj_class_name = get_object_class_name(jvmti, jni, object); + LOG("The object class '%s'\n", obj_class_name); + if (strcmp(obj_class_name, TEST_CLASS_NAME) != 0) { + fatal(jni, "The fields's class name is incorrect."); + } + deallocate(jvmti,jni, obj_class_name); + + access_cnt++; +} + +static void JNICALL +cbFieldModification(jvmtiEnv *jvmti, JNIEnv* jni, jthread thread, jmethodID method, + jlocation location, jclass field_klass, jobject object, jfieldID field, + char signature_type, jvalue new_value) { + char* m_name = get_method_name(jvmti, jni, method); + LOG("The field modification triggered from method '%s'\n", m_name); + if (strcmp(m_name, MODIFY_METHOD_NAME) != 0) { + fatal(jni, "The method's name is incorrect."); + } + deallocate(jvmti,jni, m_name); + + LOG("The location is %" PRId64 "\n", (int64_t)location); + if (location != 0) { + fatal(jni, "The method's location should be 0 for jni call."); + } + + char* f_name = get_field_name(jvmti, jni, field_klass, field); + LOG("The field name '%s'\n", f_name); + if (strcmp(f_name, MODIFY_FIELD_NAME) != 0) { + fatal(jni, "The access field is incorrect."); + } + deallocate(jvmti,jni, f_name); + + char* obj_class_name = get_object_class_name(jvmti, jni, object); + LOG("The object class '%s'\n", obj_class_name); + if (strcmp(obj_class_name, TEST_CLASS_NAME) != 0) { + fatal(jni, "The fields's class name is incorrect."); + } + deallocate(jvmti,jni, obj_class_name); + + modify_cnt++; +} + +JNIEXPORT jint JNICALL +Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { + jvmtiEnv *jvmti = nullptr; + jint res = vm->GetEnv((void **)&jvmti, JVMTI_VERSION_21); + if (res != JNI_OK) { + return JNI_ERR; + } + jvmtiError err = JVMTI_ERROR_NONE; + jvmtiCapabilities capabilities; + (void)memset(&capabilities, 0, sizeof (capabilities)); + capabilities.can_generate_field_access_events = true; + capabilities.can_generate_field_modification_events = true; + err = jvmti->AddCapabilities(&capabilities); + check_jvmti_error(err, "AddCapabilities"); + jvmtiEventCallbacks callbacks; + (void)memset(&callbacks, 0, sizeof (callbacks)); + callbacks.FieldAccess = &cbFieldAccess; + callbacks.FieldModification = &cbFieldModification; + err = jvmti->SetEventCallbacks(&callbacks, (int)sizeof (jvmtiEventCallbacks)); + check_jvmti_error(err, "SetEventCallbacks"); + jvmti_env = jvmti; + return JNI_OK; +} + +extern "C" { +JNIEXPORT void JNICALL +Java_FieldEventsFromJNI_enableEventsAndAccessField( + JNIEnv *jni, jobject self, jint numOfEventsExpected, jthread eventThread) { + + jvmtiError err = JVMTI_ERROR_NONE; + + jclass cls = jni->GetObjectClass(self); + if (cls == nullptr) { + fatal(jni, "No class found"); + } + jfieldID fieldToRead = jni->GetFieldID(cls, ACCESS_FIELD_NAME, "Ljava/lang/String;"); + if (fieldToRead == nullptr) { + fatal(jni, "No field found"); + } + + // Set watch and access field without returning to calling java code + access_cnt = 0; + err = jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_ACCESS, eventThread); + check_jvmti_error(err, "SetEventNotificationMode"); + err = jvmti_env->SetFieldAccessWatch(cls, fieldToRead); + check_jvmti_error(err, "SetFieldAccessWatch"); + + jstring jvalue = (jstring)jni->GetObjectField(self, fieldToRead); + + err = jvmti_env->ClearFieldAccessWatch(cls, fieldToRead); + check_jvmti_error(err, "ClearFieldAccessWatch"); + err = jvmti_env->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_FIELD_ACCESS, eventThread); + check_jvmti_error(err, "SetEventNotificationMode"); + + const char* value_str = jni->GetStringUTFChars(jvalue, nullptr); + + if (access_cnt != numOfEventsExpected) { + char buffer[100]; + snprintf(buffer, sizeof(buffer), + "Incorrect field access count: %d. Should be %d.", + (int)access_cnt, numOfEventsExpected); + fatal(jni, buffer); + } + jni->ReleaseStringUTFChars(jvalue, value_str); +} + +JNIEXPORT void JNICALL +Java_FieldEventsFromJNI_enableEventsAndModifyField( + JNIEnv *jni, jobject self, jint numOfEventsExpected, jthread eventThread) { + jvmtiError err = JVMTI_ERROR_NONE; + jclass cls = jni->GetObjectClass(self); + if (cls == nullptr) { + fatal(jni, "No class found"); + } + jfieldID fieldToModify = jni->GetFieldID(cls, MODIFY_FIELD_NAME, "Ljava/lang/String;"); + if (fieldToModify == nullptr) { + fatal(jni, "No field found"); + } + + modify_cnt = 0; + err = jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_MODIFICATION, eventThread); + check_jvmti_error(err, "SetEventNotificationMode"); + err = jvmti_env->SetFieldModificationWatch(cls, fieldToModify); + check_jvmti_error(err, "SetFieldAccessWatch"); + jstring jvalue = jni->NewStringUTF("newValue"); + + jni->SetObjectField(self, fieldToModify, jvalue); + + err = jvmti_env->ClearFieldModificationWatch(cls, fieldToModify); + check_jvmti_error(err, "ClearFieldAccessWatch"); + err = jvmti_env->SetEventNotificationMode(JVMTI_DISABLE, JVMTI_EVENT_FIELD_MODIFICATION, eventThread); + check_jvmti_error(err, "SetEventNotificationMode"); + + if (modify_cnt != numOfEventsExpected) { + char buffer[100]; + snprintf(buffer, sizeof(buffer), + "Incorrect field modification count: %d. Should be %d.", + (int)modify_cnt, numOfEventsExpected); + fatal(jni, buffer); + } +} + +} diff --git a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp index e77abb400e0..11600bd524b 100644 --- a/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp +++ b/test/lib/jdk/test/lib/jvmti/jvmti_common.hpp @@ -324,6 +324,24 @@ get_method_name(jvmtiEnv *jvmti, JNIEnv* jni, jmethodID method) { return mname; } +static char* +get_field_name(jvmtiEnv *jvmti, JNIEnv* jni, jclass field_class, jfieldID field) { + char* name = nullptr; + jvmtiError err = jvmti->GetFieldName(field_class, field, &name, nullptr, nullptr); + check_jvmti_status(jni, err, "get_field_name: error in JVMTI GetFieldName call"); + return name; +} + +static char* +get_object_class_name(jvmtiEnv *jvmti, JNIEnv* jni, jobject object) { + char *obj_class_name = nullptr; + jclass object_class = jni->GetObjectClass(object); + jvmtiError err = jvmti->GetClassSignature(object_class, &obj_class_name, nullptr); + check_jvmti_error(err, "GetClassSignature"); + jni->DeleteLocalRef(object_class); + return obj_class_name; +} + static jclass find_class(jvmtiEnv *jvmti, JNIEnv *jni, jobject loader, const char* cname) { jclass *classes = nullptr; From fc5df4ac8f11f25611bd4def5b655578af27c882 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Fri, 31 Oct 2025 03:33:45 +0000 Subject: [PATCH 384/561] 8370465: Right to Left Orientation Issues with MenuItem Component Reviewed-by: kizune, honkar --- .../plaf/windows/WindowsIconFactory.java | 11 ++++++++-- .../swing/plaf/windows/WindowsMenuItemUI.java | 20 ++++++++++++++++--- .../swing/JMenuItem/RightLeftOrientation.java | 12 ++++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java index efa710391d5..915a361a3a1 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java @@ -914,8 +914,15 @@ public final class WindowsIconFactory implements Serializable } } if (icon != null) { - icon.paintIcon(c, g, x + VistaMenuItemCheckIconFactory.getIconWidth(), - y + OFFSET); + if (WindowsGraphicsUtils.isLeftToRight(c)) { + icon.paintIcon(c, g, + x + VistaMenuItemCheckIconFactory.getIconWidth(), + y + OFFSET); + } else { + icon.paintIcon(c, g, + x - VistaMenuItemCheckIconFactory.getIconWidth() + 2 * OFFSET, + y + OFFSET); + } } } private static WindowsMenuItemUIAccessor getAccessor( diff --git a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java index 041bdb5adaa..61f760d63c4 100644 --- a/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java +++ b/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java @@ -38,6 +38,7 @@ import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; +import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; @@ -201,8 +202,17 @@ public final class WindowsMenuItemUI extends BasicMenuItemUI { if (lh.getCheckIcon() != null && lh.useCheckAndArrow()) { Rectangle rect = lr.getTextRect(); - - rect.x += lh.getAfterCheckIconGap(); + if (menuItem.getComponentOrientation().isLeftToRight()) { + if (menuItem.getHorizontalTextPosition() != SwingConstants.LEADING + && menuItem.getHorizontalTextPosition() != SwingConstants.LEFT) { + rect.x += lh.getAfterCheckIconGap(); + } + } else { + if (menuItem.getHorizontalTextPosition() != SwingConstants.LEADING + && menuItem.getHorizontalTextPosition() != SwingConstants.RIGHT) { + rect.x -= lh.getAfterCheckIconGap(); + } + } lr.setTextRect(rect); } @@ -218,7 +228,11 @@ public final class WindowsMenuItemUI extends BasicMenuItemUI { } if (lh.getCheckIcon() != null && lh.useCheckAndArrow()) { Rectangle rect = lr.getAccRect(); - rect.x += lh.getAfterCheckIconGap(); + if (menuItem.getComponentOrientation().isLeftToRight()) { + rect.x += lh.getAfterCheckIconGap(); + } else { + rect.x -= lh.getAfterCheckIconGap(); + } lr.setAccRect(rect); } SwingUtilities3.paintAccText(g, lh, lr, disabledForeground, diff --git a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java index 7080f03ad2a..247d8b52541 100644 --- a/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java +++ b/test/jdk/javax/swing/JMenuItem/RightLeftOrientation.java @@ -45,7 +45,7 @@ /* * @test id=windows - * @bug 4211052 + * @bug 4211052 8370465 * @requires (os.family == "windows") * @summary Verifies if menu items lay out correctly when their * ComponentOrientation property is set to RIGHT_TO_LEFT. @@ -155,6 +155,16 @@ public class RightLeftOrientation { menuItem.setHorizontalTextPosition(SwingConstants.LEADING); menu.add(menuItem); + menuItem = new JMenuItem("Text to the left", new MyMenuItemIcon()); + menuItem.setComponentOrientation(o); + menuItem.setHorizontalTextPosition(SwingConstants.LEFT); + menu.add(menuItem); + + menuItem = new JMenuItem("Text to the right", new MyMenuItemIcon()); + menuItem.setComponentOrientation(o); + menuItem.setHorizontalTextPosition(SwingConstants.RIGHT); + menu.add(menuItem); + menuItem = new JRadioButtonMenuItem("Radio Button Menu Item"); menuItem.setComponentOrientation(o); menuItem.setSelected(true); From c6cc7a7b2a45a892c4a5a7a24e1fdbc5f9325f4a Mon Sep 17 00:00:00 2001 From: "Tagir F. Valeev" Date: Fri, 31 Oct 2025 05:33:59 +0000 Subject: [PATCH 385/561] 8368178: Add specialization of SequencedCollection methods to standard list factories Reviewed-by: smarks --- .../share/classes/java/util/Collections.java | 22 +++++++++++++++++++ .../java/util/ImmutableCollections.java | 11 ++++++++++ test/jdk/java/util/Collection/MOAT.java | 8 ++++++- test/jdk/java/util/Collections/NCopies.java | 11 +++++++++- test/jdk/java/util/List/ListFactories.java | 22 ++++++++++++++++++- 5 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/Collections.java b/src/java.base/share/classes/java/util/Collections.java index f18e17890b9..c48dbd8cf6c 100644 --- a/src/java.base/share/classes/java/util/Collections.java +++ b/src/java.base/share/classes/java/util/Collections.java @@ -4943,6 +4943,11 @@ public final class Collections { Objects.requireNonNull(action); } + @Override + public List reversed() { + return this; + } + @Override public Spliterator spliterator() { return Spliterators.emptySpliterator(); } @@ -5310,6 +5315,18 @@ public final class Collections { public void sort(Comparator c) { } @Override + public List reversed() { + return this; + } + @Override + public E getFirst() { + return element; + } + @Override + public E getLast() { + return element; + } + @Override public Spliterator spliterator() { return singletonSpliterator(element); } @@ -5552,6 +5569,11 @@ public final class Collections { return a; } + @Override + public List reversed() { + return this; + } + public List subList(int fromIndex, int toIndex) { if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); diff --git a/src/java.base/share/classes/java/util/ImmutableCollections.java b/src/java.base/share/classes/java/util/ImmutableCollections.java index 38cc45122a2..1dd7808da20 100644 --- a/src/java.base/share/classes/java/util/ImmutableCollections.java +++ b/src/java.base/share/classes/java/util/ImmutableCollections.java @@ -612,6 +612,17 @@ class ImmutableCollections { throw outOfBounds(index); } + @Override + public E getFirst() { + return e0; + } + + @Override + @SuppressWarnings("unchecked") + public E getLast() { + return e1 == EMPTY ? e0 : (E)e1; + } + @Override public int indexOf(Object o) { Objects.requireNonNull(o); diff --git a/test/jdk/java/util/Collection/MOAT.java b/test/jdk/java/util/Collection/MOAT.java index e87b071d80a..ab9e4b4309d 100644 --- a/test/jdk/java/util/Collection/MOAT.java +++ b/test/jdk/java/util/Collection/MOAT.java @@ -26,7 +26,7 @@ * @bug 6207984 6272521 6192552 6269713 6197726 6260652 5073546 4137464 * 4155650 4216399 4294891 6282555 6318622 6355327 6383475 6420753 * 6431845 4802633 6570566 6570575 6570631 6570924 6691185 6691215 - * 4802647 7123424 8024709 8193128 8327858 + * 4802647 7123424 8024709 8193128 8327858 8368178 * @summary Run many tests on many Collection and Map implementations * @author Martin Buchholz * @modules java.base/java.util:open @@ -472,8 +472,10 @@ public class MOAT { private static void testEmptyList(List c) { testEmptyCollection(c); + THROWS(NoSuchElementException.class, c::getFirst, c::getLast); equal(c.hashCode(), 1); equal2(c, Collections.emptyList()); + equal2(c, c.reversed()); } private static void testEmptySet(Set c) { @@ -1232,6 +1234,10 @@ public class MOAT { var t = new ArrayList<>(l); check(t.equals(l)); check(l.equals(t)); + if (!l.isEmpty()) { + equal(l.getFirst(), l.get(0)); + equal(l.getLast(), l.get(l.size() - 1)); + } } private static void testCollection(Collection c) { diff --git a/test/jdk/java/util/Collections/NCopies.java b/test/jdk/java/util/Collections/NCopies.java index e415127f006..48ba92ad842 100644 --- a/test/jdk/java/util/Collections/NCopies.java +++ b/test/jdk/java/util/Collections/NCopies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -135,6 +135,13 @@ public class NCopies { check(Collections.nCopies(0, null).equals(Collections.nCopies(0, "non-null"))); } + private static void checkReversed() { + List copies = Collections.nCopies(10, "content"); + check(copies.equals(copies.reversed())); + List empty = Collections.nCopies(0, "content"); + check(empty.equals(empty.reversed())); + } + public static void main(String[] args) { try { List empty = Collections.nCopies(0, "foo"); @@ -149,6 +156,8 @@ public class NCopies { checkEquals(); + checkReversed(); + } catch (Throwable t) { unexpected(t); } System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); diff --git a/test/jdk/java/util/List/ListFactories.java b/test/jdk/java/util/List/ListFactories.java index 9b1d4a55150..f02fcb95921 100644 --- a/test/jdk/java/util/List/ListFactories.java +++ b/test/jdk/java/util/List/ListFactories.java @@ -33,6 +33,8 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.NoSuchElementException; +import java.util.function.Consumer; import java.util.stream.Stream; import org.testng.annotations.DataProvider; @@ -45,7 +47,7 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertThrows; import static org.testng.Assert.fail; /* @@ -383,4 +385,22 @@ public class ListFactories { fail("ListIterator operation succeeded on Iterator"); } catch (ClassCastException|UnsupportedOperationException ignore) { } } + + @Test(dataProvider = "all") + public void getFirst(List act, List exp) { + if (!act.isEmpty()) { + assertEquals(act.getFirst(), exp.getFirst()); + } else { + assertThrows(NoSuchElementException.class, act::getFirst); + } + } + + @Test(dataProvider = "all") + public void getLast(List act, List exp) { + if (!act.isEmpty()) { + assertEquals(act.getLast(), exp.getLast()); + } else { + assertThrows(NoSuchElementException.class, act::getLast); + } + } } From c47ea1211189d67a0b9ef1a893dacabbc606dae5 Mon Sep 17 00:00:00 2001 From: Thomas Schatzl Date: Fri, 31 Oct 2025 06:38:42 +0000 Subject: [PATCH 386/561] 8370889: G1: Inline G1PrepareEvacuationTask::sample_card_set_size() Reviewed-by: fandreuzzi, ayang, iwalulya --- src/hotspot/share/gc/g1/g1YoungCollector.cpp | 26 +++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1YoungCollector.cpp b/src/hotspot/share/gc/g1/g1YoungCollector.cpp index 539e5a54353..a8530f43aed 100644 --- a/src/hotspot/share/gc/g1/g1YoungCollector.cpp +++ b/src/hotspot/share/gc/g1/g1YoungCollector.cpp @@ -290,15 +290,7 @@ class G1PrepareEvacuationTask : public WorkerTask { uint _worker_humongous_total; uint _worker_humongous_candidates; - G1MonotonicArenaMemoryStats _card_set_stats; - - void sample_card_set_size(G1HeapRegion* hr) { - // Sample card set sizes for humongous before GC: this makes the policy to give - // back memory to the OS keep the most recent amount of memory for these regions. - if (hr->is_starts_humongous()) { - _card_set_stats.add(hr->rem_set()->card_set_memory_stats()); - } - } + G1MonotonicArenaMemoryStats _humongous_card_set_stats; bool humongous_region_is_candidate(G1HeapRegion* region) const { assert(region->is_starts_humongous(), "Must start a humongous object"); @@ -411,7 +403,8 @@ class G1PrepareEvacuationTask : public WorkerTask { _g1h(g1h), _parent_task(parent_task), _worker_humongous_total(0), - _worker_humongous_candidates(0) { } + _worker_humongous_candidates(0), + _humongous_card_set_stats() { } ~G1PrepareRegionsClosure() { _parent_task->add_humongous_candidates(_worker_humongous_candidates); @@ -422,8 +415,6 @@ class G1PrepareEvacuationTask : public WorkerTask { // First prepare the region for scanning _g1h->rem_set()->prepare_region_for_scan(hr); - sample_card_set_size(hr); - // Now check if region is a humongous candidate if (!hr->is_starts_humongous()) { _g1h->update_region_attr(hr); @@ -438,6 +429,11 @@ class G1PrepareEvacuationTask : public WorkerTask { } else { _g1h->update_region_attr(hr); } + + // Sample card set sizes for humongous regions before GC: this makes the policy + // to give back memory to the OS keep the most recent amount of memory for these regions. + _humongous_card_set_stats.add(hr->rem_set()->card_set_memory_stats()); + log_debug(gc, humongous)("Humongous region %u (object size %zu @ " PTR_FORMAT ") remset %zu code roots %zu " "marked %d pinned count %zu reclaim candidate %d type %s", index, @@ -456,8 +452,8 @@ class G1PrepareEvacuationTask : public WorkerTask { return false; } - G1MonotonicArenaMemoryStats card_set_stats() const { - return _card_set_stats; + G1MonotonicArenaMemoryStats humongous_card_set_stats() const { + return _humongous_card_set_stats; } }; @@ -481,7 +477,7 @@ public: _g1h->heap_region_par_iterate_from_worker_offset(&cl, &_claimer, worker_id); MutexLocker x(G1RareEvent_lock, Mutex::_no_safepoint_check_flag); - _all_card_set_stats.add(cl.card_set_stats()); + _all_card_set_stats.add(cl.humongous_card_set_stats()); } void add_humongous_candidates(uint candidates) { From 4913b548a79a981816718def38d059b5175f6f59 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Fri, 31 Oct 2025 08:46:59 +0000 Subject: [PATCH 387/561] 8370950: Inline CollectedHeap::fill_args_check Reviewed-by: fandreuzzi, tschatzl --- src/hotspot/share/gc/shared/collectedHeap.cpp | 12 ++++-------- src/hotspot/share/gc/shared/collectedHeap.hpp | 1 - 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp index ea20b8ce4b2..bed6a2f22e6 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.cpp +++ b/src/hotspot/share/gc/shared/collectedHeap.cpp @@ -449,12 +449,6 @@ void CollectedHeap::zap_filler_array_with(HeapWord* start, size_t words, juint v } #ifdef ASSERT -void CollectedHeap::fill_args_check(HeapWord* start, size_t words) -{ - assert(words >= min_fill_size(), "too small to fill"); - assert(is_object_aligned(words), "unaligned size"); -} - void CollectedHeap::zap_filler_array(HeapWord* start, size_t words, bool zap) { if (ZapFillerObjects && zap) { @@ -500,14 +494,16 @@ CollectedHeap::fill_with_object_impl(HeapWord* start, size_t words, bool zap) void CollectedHeap::fill_with_object(HeapWord* start, size_t words, bool zap) { - DEBUG_ONLY(fill_args_check(start, words);) + assert(words >= min_fill_size(), "too small to fill"); + assert(is_object_aligned(words), "unaligned size"); HandleMark hm(Thread::current()); // Free handles before leaving. fill_with_object_impl(start, words, zap); } void CollectedHeap::fill_with_objects(HeapWord* start, size_t words, bool zap) { - DEBUG_ONLY(fill_args_check(start, words);) + assert(words >= min_fill_size(), "too small to fill"); + assert(is_object_aligned(words), "unaligned size"); HandleMark hm(Thread::current()); // Free handles before leaving. // Multiple objects may be required depending on the filler array maximum size. Fill diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp index 05160912283..2ed1275bbb9 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -168,7 +168,6 @@ class CollectedHeap : public CHeapObj { protected: static inline void zap_filler_array_with(HeapWord* start, size_t words, juint value); - DEBUG_ONLY(static void fill_args_check(HeapWord* start, size_t words);) DEBUG_ONLY(static void zap_filler_array(HeapWord* start, size_t words, bool zap = true);) // Fill with a single array; caller must ensure filler_array_min_size() <= From 4ca88aa2e8f486ffa7c6f4050ca3462e5e6f3418 Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Fri, 31 Oct 2025 09:51:45 +0000 Subject: [PATCH 388/561] 8370852: Test sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java fails after JDK-8369995 Reviewed-by: coffeys, wetmore --- test/jdk/ProblemList.txt | 2 - .../SSLLogger/DebugPropertyValuesTest.java | 59 +++++++++++-------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index d1644a56100..f7b8939ac6a 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -637,8 +637,6 @@ sun/security/smartcardio/TestTransmit.java 8039280 generic- sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183 linux-ppc64le -sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java 8370852 generic-all - ############################################################################ # jdk_sound diff --git a/test/jdk/sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java b/test/jdk/sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java index 726cc516267..fbd20e588d1 100644 --- a/test/jdk/sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java +++ b/test/jdk/sun/security/ssl/SSLLogger/DebugPropertyValuesTest.java @@ -23,7 +23,7 @@ /** * @test - * @bug 8350582 8340312 + * @bug 8350582 8340312 8369995 * @library /test/lib /javax/net/ssl/templates * @summary Correct the parsing of the ssl value in javax.net.debug * @run junit DebugPropertyValuesTest @@ -50,24 +50,27 @@ import jdk.test.lib.process.OutputAnalyzer; public class DebugPropertyValuesTest extends SSLSocketTemplate { private static final Path LOG_FILE = Path.of("logging.conf"); - private static final HashMap> debugMessages = new HashMap<>(); + private static final HashMap> debugMessages = + new HashMap<>(); private static final String DATE_REGEX = "\\d{4}-\\d{2}-\\d{2}"; static { - - debugMessages.put("handshake", List.of("Produced ClientHello handshake message", "supported_versions")); - debugMessages.put("keymanager", List.of("choosing key:")); + debugMessages.put("keymanager", List.of("Choosing key:")); debugMessages.put("packet", List.of("Raw write")); - debugMessages.put("plaintext", List.of("Plaintext before ENCRYPTION")); + debugMessages.put("plaintext", + List.of("Plaintext before ENCRYPTION")); debugMessages.put("record", List.of("handshake, length =", "WRITE:")); debugMessages.put("session", List.of("Session initialized:")); - debugMessages.put("sslctx", List.of("trigger seeding of SecureRandom")); + debugMessages.put("sslctx", + List.of("trigger seeding of SecureRandom")); debugMessages.put("ssl", List.of("jdk.tls.keyLimits:")); - debugMessages.put("trustmanager", List.of("adding as trusted certificates")); - debugMessages.put("verbose", List.of("Ignore unsupported cipher suite:")); + debugMessages.put("trustmanager", + List.of("adding as trusted certificates")); + debugMessages.put("verbose", + List.of("Ignore unsupported cipher suite:")); debugMessages.put("handshake-expand", List.of("\"logger\".*: \"javax.net.ssl\",", "\"specifics\" : \\[", @@ -114,15 +117,18 @@ public class DebugPropertyValuesTest extends SSLSocketTemplate { "record", "session", "ssl", "sslctx", "trustmanager", "verbose")), // allow expand option for more verbose output - Arguments.of(List.of("-Djavax.net.debug=ssl,handshake,expand"), - List.of("handshake", "handshake-expand", "keymanager", - "record", "session", "record-expand", "ssl", - "sslctx", "trustmanager", "verbose")), + Arguments.of( + List.of("-Djavax.net.debug=ssl,handshake,expand"), + List.of("handshake", "handshake-expand", + "keymanager", "record", "session", + "record-expand", "ssl", "sslctx", + "trustmanager", "verbose")), // filtering on record option, with expand Arguments.of(List.of("-Djavax.net.debug=ssl:record,expand"), - List.of("handshake", "handshake-expand", "keymanager", - "record", "record-expand", "session", "ssl", - "sslctx", "trustmanager", "verbose")), + List.of("handshake", "handshake-expand", + "keymanager", "record", "record-expand", + "session", "ssl", "sslctx", "trustmanager", + "verbose")), // this test is equivalent to ssl:record mode Arguments.of(List.of("-Djavax.net.debug=ssl,record"), List.of("handshake", "keymanager", "record", @@ -147,30 +153,33 @@ public class DebugPropertyValuesTest extends SSLSocketTemplate { "record", "session", "ssl", "sslctx", "trustmanager", "verbose")), // plaintext is valid for record option - Arguments.of(List.of("-Djavax.net.debug=ssl:record:plaintext"), + Arguments.of( + List.of("-Djavax.net.debug=ssl:record:plaintext"), List.of("handshake", "keymanager", "plaintext", "record", "session", "ssl", "sslctx", "trustmanager", "verbose")), Arguments.of(List.of("-Djavax.net.debug=ssl:trustmanager"), - List.of("handshake", "keymanager", "record", "session", - "ssl", "sslctx", "trustmanager", "verbose")), + List.of("handshake", "keymanager", "record", + "session", "ssl", "sslctx", "trustmanager", + "verbose")), Arguments.of(List.of("-Djavax.net.debug=ssl:sslctx"), - List.of("handshake", "keymanager", "record", "session", - "ssl", "sslctx", "trustmanager", "verbose")), + List.of("handshake", "keymanager", "record", + "session", "ssl", "sslctx", "trustmanager", + "verbose")), // help message test. Should exit without running test Arguments.of(List.of("-Djavax.net.debug=help"), List.of("help")), // add in javax.net.debug sanity test Arguments.of(List.of("-Djavax.net.debug=ssl:trustmanager", "-Djava.security.debug=all"), - List.of("handshake", "java.security.debug", "keymanager", - "record", "session", "ssl", "sslctx", - "trustmanager", "verbose")), + List.of("handshake", "java.security.debug", + "keymanager", "record", "session", "ssl", + "sslctx", "trustmanager", "verbose")), // empty invokes System.Logger use Arguments.of(List.of("-Djavax.net.debug", "-Djava.util.logging.config.file=" + LOG_FILE), List.of("handshake", "javax.net.debug.logger", - "keymanager", "packet", "plaintext", + "keymanager", "packet", "plaintext", "record", "session", "ssl", "sslctx", "trustmanager", "verbose")) ); From 8e3620a344f83a21191bb70cf2af24e9ae1952ce Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 31 Oct 2025 09:52:02 +0000 Subject: [PATCH 389/561] 8370237: AssertionError in Annotate.fromAnnotations with -Xdoclint and type annotations Reviewed-by: jlahoda --- .../tools/javac/parser/ReferenceParser.java | 5 +++++ .../tools/doclint/CrashInAnnotateTest.out | 10 ++++----- .../doclint/CrashInTypeAnnotateTest.java | 21 +++++++++++++++++++ .../tools/doclint/CrashInTypeAnnotateTest.out | 2 ++ 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 test/langtools/tools/doclint/CrashInTypeAnnotateTest.java create mode 100644 test/langtools/tools/doclint/CrashInTypeAnnotateTest.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/ReferenceParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/ReferenceParser.java index acc655df276..2f6d68f2128 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/ReferenceParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/ReferenceParser.java @@ -211,6 +211,11 @@ public class ReferenceParser { if (p.token().kind != TokenKind.EOF) { throw new ParseException(beginIndex + p.token().pos, "dc.ref.unexpected.input"); } + Tree typeAnno = new TypeAnnotationFinder().scan(tree, null); + if (typeAnno != null) { + int annoPos = ((JCTree) typeAnno).getStartPosition(); + throw new ParseException(beginIndex + annoPos, "dc.ref.annotations.not.allowed"); + } checkDiags(dh, beginIndex); return tree; } finally { diff --git a/test/langtools/tools/doclint/CrashInAnnotateTest.out b/test/langtools/tools/doclint/CrashInAnnotateTest.out index 0275032554e..3db434db105 100644 --- a/test/langtools/tools/doclint/CrashInAnnotateTest.out +++ b/test/langtools/tools/doclint/CrashInAnnotateTest.out @@ -1,7 +1,7 @@ CrashInAnnotateTest.java:10:20: compiler.err.proc.messager: annotations not allowed -CrashInAnnotateTest.java:11:37: compiler.err.proc.messager: syntax error in reference +CrashInAnnotateTest.java:11:12: compiler.err.proc.messager: annotations not allowed CrashInAnnotateTest.java:16:39: compiler.err.proc.messager: annotations not allowed -CrashInAnnotateTest.java:21:23: compiler.err.proc.messager: syntax error in reference -CrashInAnnotateTest.java:24:54: compiler.err.proc.messager: syntax error in reference -CrashInAnnotateTest.java:25:37: compiler.err.proc.messager: syntax error in reference -6 errors \ No newline at end of file +CrashInAnnotateTest.java:21:12: compiler.err.proc.messager: annotations not allowed +CrashInAnnotateTest.java:24:12: compiler.err.proc.messager: annotations not allowed +CrashInAnnotateTest.java:25:12: compiler.err.proc.messager: annotations not allowed +6 errors diff --git a/test/langtools/tools/doclint/CrashInTypeAnnotateTest.java b/test/langtools/tools/doclint/CrashInTypeAnnotateTest.java new file mode 100644 index 00000000000..8f6401f415e --- /dev/null +++ b/test/langtools/tools/doclint/CrashInTypeAnnotateTest.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8370237 + * @summary AssertionError in Annotate.fromAnnotations with -Xdoclint and type annotations + * @compile/fail/ref=CrashInTypeAnnotateTest.out -Xdoclint:all,-missing -XDrawDiagnostics CrashInTypeAnnotateTest.java + */ + +import java.util.List; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE_PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +@interface A {} + +/** {@link List<@A String>} + */ +class CrashInTypeAnnotateTest { +} diff --git a/test/langtools/tools/doclint/CrashInTypeAnnotateTest.out b/test/langtools/tools/doclint/CrashInTypeAnnotateTest.out new file mode 100644 index 00000000000..c192ecc80d4 --- /dev/null +++ b/test/langtools/tools/doclint/CrashInTypeAnnotateTest.out @@ -0,0 +1,2 @@ +CrashInTypeAnnotateTest.java:18:17: compiler.err.proc.messager: annotations not allowed +1 error From 02f8874c2d105a86cbfd3b84b591fefb4e509806 Mon Sep 17 00:00:00 2001 From: Marc Chevalier Date: Fri, 31 Oct 2025 11:00:06 +0000 Subject: [PATCH 390/561] 8361608: C2: assert(opaq->outcnt() == 1 && opaq->in(1) == limit) failed Co-authored-by: Christian Hagedorn Reviewed-by: chagedorn, rcastanedalo --- src/hotspot/share/opto/loopTransform.cpp | 15 +- src/hotspot/share/opto/loopnode.cpp | 18 ++ .../TooStrictAssertForUnrollAfterPeeling.java | 194 ++++++++++++++++++ 3 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/TooStrictAssertForUnrollAfterPeeling.java diff --git a/src/hotspot/share/opto/loopTransform.cpp b/src/hotspot/share/opto/loopTransform.cpp index 94c781d82c2..0c03a85d64c 100644 --- a/src/hotspot/share/opto/loopTransform.cpp +++ b/src/hotspot/share/opto/loopTransform.cpp @@ -1970,8 +1970,19 @@ void PhaseIdealLoop::do_unroll(IdealLoopTree *loop, Node_List &old_new, bool adj if (opaq == nullptr) { return; } - // Zero-trip test uses an 'opaque' node which is not shared. - assert(opaq->outcnt() == 1 && opaq->in(1) == limit, ""); + // Zero-trip test uses an 'opaque' node which is not shared, otherwise bail out. + if (opaq->outcnt() != 1 || opaq->in(1) != limit) { +#ifdef ASSERT + // In rare cases, loop cloning (as for peeling, for instance) can break this by replacing + // limit and the input of opaq by equivalent but distinct phis. + // Next IGVN should clean it up. Let's try to detect we are in such a case. + Unique_Node_List& worklist = loop->_phase->_igvn._worklist; + assert(C->major_progress(), "The operation that replaced limit and opaq->in(1) (e.g. peeling) should have set major_progress"); + assert(opaq->in(1)->is_Phi() && limit->is_Phi(), "Nodes limit and opaq->in(1) should have been replaced by PhiNodes by fix_data_uses from clone_loop."); + assert(worklist.member(opaq->in(1)) && worklist.member(limit), "Nodes limit and opaq->in(1) differ and should have been recorded for IGVN."); +#endif + return; + } } C->set_major_progress(); diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index b6c4d1b8574..54cf3e31266 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -4765,6 +4765,24 @@ void PhaseIdealLoop::eliminate_useless_zero_trip_guard() { Node* opaque = head->is_canonical_loop_entry(); if (opaque != nullptr) { useful_zero_trip_guard_opaques_nodes.push(opaque); +#ifdef ASSERT + // See PhaseIdealLoop::do_unroll + // This property is required in do_unroll, but it may not hold after cloning a loop. + // In such a case, we bail out from unrolling, and rely on IGVN to clean up the graph. + // We are here before loop cloning (before iteration_split), so if this property + // does not hold, it must come from the previous round of loop optimizations, meaning + // that IGVN failed to clean it: we will catch that here. + // On the other hand, if this assert passes, a bailout in do_unroll means that + // this property was broken in the current round of loop optimization (between here + // and do_unroll), so we give a chance to IGVN to make the property true again. + if (head->is_main_loop()) { + assert(opaque->outcnt() == 1, "opaque node should not be shared"); + assert(opaque->in(1) == head->limit(), "After IGVN cleanup, input of opaque node must be the limit."); + } + if (head->is_post_loop()) { + assert(opaque->outcnt() == 1, "opaque node should not be shared"); + } +#endif } } } diff --git a/test/hotspot/jtreg/compiler/loopopts/TooStrictAssertForUnrollAfterPeeling.java b/test/hotspot/jtreg/compiler/loopopts/TooStrictAssertForUnrollAfterPeeling.java new file mode 100644 index 00000000000..edfab8822b5 --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TooStrictAssertForUnrollAfterPeeling.java @@ -0,0 +1,194 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8361608 + * @summary crash during unrolling in some rare cases where loop cloning + * (typically from peeling) breaks an invariant in do_unroll + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions + * -XX:+StressLoopPeeling + * -XX:CompileCommand=compileonly,compiler.loopopts.TooStrictAssertForUnrollAfterPeeling::test1 + * -XX:-TieredCompilation + * -Xbatch + * -XX:PerMethodTrapLimit=0 + * compiler.loopopts.TooStrictAssertForUnrollAfterPeeling + * + * @run main/othervm -XX:CompileOnly=compiler.loopopts.TooStrictAssertForUnrollAfterPeeling::test2 + * -XX:-TieredCompilation + * -Xbatch + * -XX:PerMethodTrapLimit=0 + * -XX:CompileCommand=inline,compiler.loopopts.TooStrictAssertForUnrollAfterPeeling::foo2 + * compiler.loopopts.TooStrictAssertForUnrollAfterPeeling + * + * @run main/othervm -XX:CompileOnly=compiler.loopopts.TooStrictAssertForUnrollAfterPeeling::test3 + * -XX:-TieredCompilation + * -Xbatch + * -XX:PerMethodTrapLimit=0 + * -XX:CompileCommand=inline,compiler.loopopts.TooStrictAssertForUnrollAfterPeeling::foo3 + * -XX:-RangeCheckElimination + * compiler.loopopts.TooStrictAssertForUnrollAfterPeeling + * + * @run main compiler.loopopts.TooStrictAssertForUnrollAfterPeeling + */ +package compiler.loopopts; + + +/* Cases 2 and 3 can use the additional flags + * -XX:+UnlockDiagnosticVMOptions + * -XX:-LoopMultiversioning + * -XX:-RangeCheckElimination + * -XX:-SplitIfBlocks + * -XX:-UseOnStackReplacement + * -XX:LoopMaxUnroll=2 + * to disable more optimizations and give a simpler graph, while still reproducing. It can be useful to debug, investigate... + */ +public class TooStrictAssertForUnrollAfterPeeling { + static int iArr[] = new int[400]; + static boolean flag; + + public static void main(String[] args) { + run1(); + run2(); + run3(); + } + + // Case 1 + + public static void run1() { + for (int i = 1; i < 1000; i++) { + test1(); + } + } + + static long test1() { + int s = 0; + int iArr[] = new int[400]; + for (int i = 0; i < 70; i++) {} + + for (int i = 0; i < 36; i++) { + for (int j = 0; j < 3; j++) { + s += iArr[0] = 7; + if (s != 0) { + return s + foo1(iArr); + } + } + } + return 0; + } + + public static long foo1(int[] a) { + long sum = 0; + for (int i = 0; i < a.length; i++) { + sum += a[i]; + } + return sum; + } + + // Case 2 + + public static void run2() { + for (int i = 1; i < 10000; i++) { + test2(); + } + } + + // Lx: Optimized in loop opts round x. + + static int test2() { + int x = 5; + for (int i = 1; i < 37; i++) { // L3: Peeled + for (int a = 0; a < 2; a++) { // L2: Max unrolled + for (int b = 0; b < 300; b++) { + } // L1: Empty -> removed + } + int j = 1; + x *= 12; + while (++j < 5) { // L1: Max unrolled: peel + unroll + iArr[0] += 2; + if (iArr[0] > 0) { + // foo(): everything outside loop. + return foo2(iArr); + } + } + } + return 3; + } + + public static int foo2(int[] a) { + int sum = 0; + for (int i = 0; i < a.length; i++) { // L2: Pre/main/post, L3: Unrolled -> hit assert! + for (int j = 0; j < 34; j++) { + } // L1: Empty -> removed + if (flag) { + // Ensure not directly unrolled in L2 but only in L3. + return 3; + } + sum += a[i]; + } + return sum; + } + + public static void run3() { + for (int i = 1; i < 10000; i++) { + test3(); + } + } + + // Case 3 + + static int test3() { + int x = 5; + for (int i = 1; i < 37; i++) { // L3: Peeled + for (int a = 0; a < 2; a++) { // L2: Max unrolled + for (int b = 0; b < 300; b++) { + } // L1: Empty -> removed + } + int j = 1; + x *= 12; + while (++j < 5) { // L1: Max unrolled: peel + unroll + iArr[0] += 2; + if (iArr[0] > 0) { + // foo(): everything outside loop. + return foo3(iArr, x); + } + } + } + return 3; + } + + public static int foo3(int[] a, int limit) { + int sum = 0; + for (int i = 0; i < limit; i++) { // L2: Pre/main/post, L3: Unrolled -> hit assert! + for (int j = 0; j < 34; j++) { + } // L1: Empty -> removed + if (flag) { + // Ensure not directly unrolled in L2 but only in L3. + return 3; + } + sum += a[i]; + } + return sum; + } +} From 8ca485cf98889d1757170a4ec883c93c888a7140 Mon Sep 17 00:00:00 2001 From: Marc Chevalier Date: Fri, 31 Oct 2025 11:02:29 +0000 Subject: [PATCH 391/561] 8370077: C2: make Compile::_major_progress a boolean Reviewed-by: chagedorn, kvn, dlong, epeter --- src/hotspot/share/opto/compile.hpp | 19 ++++++++++++++----- src/hotspot/share/opto/loopnode.cpp | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/opto/compile.hpp b/src/hotspot/share/opto/compile.hpp index 66a5497a7ad..845dcf07512 100644 --- a/src/hotspot/share/opto/compile.hpp +++ b/src/hotspot/share/opto/compile.hpp @@ -322,7 +322,16 @@ class Compile : public Phase { bool _merge_stores_phase; // Phase for merging stores, after post loop opts phase. bool _allow_macro_nodes; // True if we allow creation of macro nodes. - int _major_progress; // Count of something big happening + /* If major progress is set: + * Marks that the loop tree information (get_ctrl, idom, get_loop, etc.) could be invalid, and we need to rebuild the loop tree. + * It also indicates that the graph was changed in a way that is promising to be able to apply more loop optimization. + * If major progress is not set: + * Loop tree information is valid. + * If major progress is not set at the end of a loop opts phase, then we can stop loop opts, because we do not expect any further progress if we did more loop opts phases. + * + * This is not 100% accurate, the semantics of major progress has become less clear over time, but this is the general idea. + */ + bool _major_progress; bool _inlining_progress; // progress doing incremental inlining? bool _inlining_incrementally;// Are we doing incremental inlining (post parse) bool _do_cleanup; // Cleanup is needed before proceeding with incremental inlining @@ -583,16 +592,16 @@ public: // Control of this compilation. int fixed_slots() const { assert(_fixed_slots >= 0, ""); return _fixed_slots; } void set_fixed_slots(int n) { _fixed_slots = n; } - int major_progress() const { return _major_progress; } void set_inlining_progress(bool z) { _inlining_progress = z; } int inlining_progress() const { return _inlining_progress; } void set_inlining_incrementally(bool z) { _inlining_incrementally = z; } int inlining_incrementally() const { return _inlining_incrementally; } void set_do_cleanup(bool z) { _do_cleanup = z; } int do_cleanup() const { return _do_cleanup; } - void set_major_progress() { _major_progress++; } - void restore_major_progress(int progress) { _major_progress += progress; } - void clear_major_progress() { _major_progress = 0; } + bool major_progress() const { return _major_progress; } + void set_major_progress() { _major_progress = true; } + void restore_major_progress(bool progress) { _major_progress = _major_progress || progress; } + void clear_major_progress() { _major_progress = false; } int max_inline_size() const { return _max_inline_size; } void set_freq_inline_size(int n) { _freq_inline_size = n; } int freq_inline_size() const { return _freq_inline_size; } diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index 54cf3e31266..d04eb34acee 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -4952,7 +4952,7 @@ void PhaseIdealLoop::build_and_optimize() { bool do_max_unroll = (_mode == LoopOptsMaxUnroll); - int old_progress = C->major_progress(); + bool old_progress = C->major_progress(); uint orig_worklist_size = _igvn._worklist.size(); // Reset major-progress flag for the driver's heuristics @@ -5333,7 +5333,7 @@ void PhaseIdealLoop::print_statistics() { // Build a verify-only PhaseIdealLoop, and see that it agrees with "this". void PhaseIdealLoop::verify() const { ResourceMark rm; - int old_progress = C->major_progress(); + bool old_progress = C->major_progress(); bool success = true; PhaseIdealLoop phase_verify(_igvn, this); From 67a81c476f1e3c0d6aeca0d0aa2148efcb70a180 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Fri, 31 Oct 2025 13:33:11 +0000 Subject: [PATCH 392/561] 8370943: Support heap expansion during startup in Serial and Parallel Reviewed-by: fandreuzzi, eosterlund, tschatzl --- .../share/gc/parallel/parallelScavengeHeap.cpp | 13 +++++++++++-- src/hotspot/share/gc/parallel/psYoungGen.cpp | 3 +-- src/hotspot/share/gc/serial/defNewGeneration.cpp | 3 +-- src/hotspot/share/gc/serial/serialHeap.cpp | 11 +++++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp index f1baa4c4ff7..2e7d8011869 100644 --- a/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp +++ b/src/hotspot/share/gc/parallel/parallelScavengeHeap.cpp @@ -51,6 +51,7 @@ #include "runtime/cpuTimeCounters.hpp" #include "runtime/globals_extension.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/init.hpp" #include "runtime/java.hpp" #include "runtime/vmThread.hpp" #include "services/memoryManager.hpp" @@ -324,6 +325,14 @@ HeapWord* ParallelScavengeHeap::mem_allocate_work(size_t size, bool is_tlab) { return result; } + if (!is_init_completed()) { + // Can't do GC; try heap expansion to satisfy the request. + result = expand_heap_and_allocate(size, is_tlab); + if (result != nullptr) { + return result; + } + } + gc_count = total_collections(); } @@ -394,8 +403,8 @@ bool ParallelScavengeHeap::check_gc_overhead_limit() { } HeapWord* ParallelScavengeHeap::expand_heap_and_allocate(size_t size, bool is_tlab) { - assert(SafepointSynchronize::is_at_safepoint(), "precondition"); - // We just finished a young/full gc, try everything to satisfy this allocation request. + assert(Heap_lock->is_locked(), "precondition"); + HeapWord* result = young_gen()->expand_and_allocate(size); if (result == nullptr && !is_tlab) { diff --git a/src/hotspot/share/gc/parallel/psYoungGen.cpp b/src/hotspot/share/gc/parallel/psYoungGen.cpp index edcbf7647fc..593df38e985 100644 --- a/src/hotspot/share/gc/parallel/psYoungGen.cpp +++ b/src/hotspot/share/gc/parallel/psYoungGen.cpp @@ -301,8 +301,7 @@ bool PSYoungGen::try_expand_to_hold(size_t word_size) { } HeapWord* PSYoungGen::expand_and_allocate(size_t word_size) { - assert(SafepointSynchronize::is_at_safepoint(), "precondition"); - assert(Thread::current()->is_VM_thread(), "precondition"); + assert(Heap_lock->is_locked(), "precondition"); { size_t available_word_size = pointer_delta(virtual_space()->reserved_high_addr(), diff --git a/src/hotspot/share/gc/serial/defNewGeneration.cpp b/src/hotspot/share/gc/serial/defNewGeneration.cpp index 413d80bebf4..0b2ba44c780 100644 --- a/src/hotspot/share/gc/serial/defNewGeneration.cpp +++ b/src/hotspot/share/gc/serial/defNewGeneration.cpp @@ -844,8 +844,7 @@ void DefNewGeneration::print_on(outputStream* st) const { } HeapWord* DefNewGeneration::expand_and_allocate(size_t word_size) { - assert(SafepointSynchronize::is_at_safepoint(), "precondition"); - assert(Thread::current()->is_VM_thread(), "precondition"); + assert(Heap_lock->is_locked(), "precondition"); size_t eden_free_bytes = eden()->free(); size_t requested_bytes = word_size * HeapWordSize; diff --git a/src/hotspot/share/gc/serial/serialHeap.cpp b/src/hotspot/share/gc/serial/serialHeap.cpp index 8022b317ca6..1d62af65ebd 100644 --- a/src/hotspot/share/gc/serial/serialHeap.cpp +++ b/src/hotspot/share/gc/serial/serialHeap.cpp @@ -67,6 +67,7 @@ #include "memory/universe.hpp" #include "oops/oop.inline.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/init.hpp" #include "runtime/java.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/threads.hpp" @@ -268,6 +269,8 @@ size_t SerialHeap::max_capacity() const { } HeapWord* SerialHeap::expand_heap_and_allocate(size_t size, bool is_tlab) { + assert(Heap_lock->is_locked(), "precondition"); + HeapWord* result = _young_gen->expand_and_allocate(size); if (result == nullptr && !is_tlab) { @@ -316,6 +319,14 @@ HeapWord* SerialHeap::mem_allocate_work(size_t size, bool is_tlab) { break; } + if (!is_init_completed()) { + // Can't do GC; try heap expansion to satisfy the request. + result = expand_heap_and_allocate(size, is_tlab); + if (result != nullptr) { + return result; + } + } + gc_count_before = total_collections(); } From 2158719aab5f3ab652225113b5205070e9241995 Mon Sep 17 00:00:00 2001 From: Sergey Kuksenko Date: Fri, 31 Oct 2025 14:00:55 +0000 Subject: [PATCH 393/561] 8370150: Add StrictMath microbenchmarks to cover FDLIBM algorithms Reviewed-by: rgiulietti --- .../bench/java/lang/StrictMathExtraBench.java | 674 ++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 test/micro/org/openjdk/bench/java/lang/StrictMathExtraBench.java diff --git a/test/micro/org/openjdk/bench/java/lang/StrictMathExtraBench.java b/test/micro/org/openjdk/bench/java/lang/StrictMathExtraBench.java new file mode 100644 index 00000000000..4e016fc2045 --- /dev/null +++ b/test/micro/org/openjdk/bench/java/lang/StrictMathExtraBench.java @@ -0,0 +1,674 @@ +/* + * 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. + * + * 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 org.openjdk.bench.java.lang; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Fork(3) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@BenchmarkMode(Mode.AverageTime) +public class StrictMathExtraBench { + + public static final int SIZE = 1022; + + private static final Random rnd = new Random(42); + + @State(Scope.Thread) + public static class RangeState { + final double[] values = new double[SIZE]; + final double min, max; + final boolean signed; + + public RangeState(boolean signed, double min, double max) { + this.min = min; + this.max = max; + this.signed = signed; + } + + public RangeState(double min, double max) { + this(true, min, max); + } + + @Setup + public void setup() { + for (int i = 0; i < values.length; i++) { + values[i] = rnd.nextDouble(min, max); + if (signed & rnd.nextBoolean()) { + values[i] = -values[i]; + } + } + } + } + + public static class RangeSubnormal extends RangeState { + public RangeSubnormal() { + super(0, Double.MIN_NORMAL); + } + } + + public static class RangeNormal extends RangeState { + public RangeNormal() { + super(Double.MIN_NORMAL, Double.MAX_VALUE); + } + } + + public static class RangePositiveSubnormal extends RangeState { + public RangePositiveSubnormal() { + super(false, 0, Double.MIN_NORMAL); + } + } + + public static class RangePositiveNormal extends RangeState { + public RangePositiveNormal() { + super(false, Double.MIN_NORMAL, Double.MAX_VALUE); + } + } + + public static class RangePiQuarter extends RangeState { + public RangePiQuarter() { + super(Double.MIN_NORMAL, Math.PI / 4); + } + } + + public static class RangePiQuarterTo3PiQuarter extends RangeState { + public RangePiQuarterTo3PiQuarter() { + super(Math.PI / 4, 3 * Math.PI / 4); + } + } + + public static class Range3PiQuarterToPiHalfTwo19 extends RangeState { + public Range3PiQuarterToPiHalfTwo19() { + super(3 * Math.PI / 4, 0x1.0p19 * Math.PI / 2); + } + } + + public static class RangeBeyondPiHalfTwo19 extends RangeState { + public RangeBeyondPiHalfTwo19() { + super(0x1.0p19 * Math.PI / 2, Double.MAX_VALUE); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sin_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sin_pi_quarter(Blackhole bh, RangePiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sin_3pi_quarter(Blackhole bh, RangePiQuarterTo3PiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sin_pi_half_two19(Blackhole bh, Range3PiQuarterToPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sin_beyond_pi_half_two19(Blackhole bh, RangeBeyondPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cos_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cos_pi_quarter(Blackhole bh, RangePiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cos_3pi_quarter(Blackhole bh, RangePiQuarterTo3PiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cos_pi_half_two19(Blackhole bh, Range3PiQuarterToPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cos_beyond_pi_half_two19(Blackhole bh, RangeBeyondPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tan_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tan_pi_quarter(Blackhole bh, RangePiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tan_3pi_quarter(Blackhole bh, RangePiQuarterTo3PiQuarter r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tan_pi_half_two19(Blackhole bh, Range3PiQuarterToPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tan_beyond_pi_half_two19(Blackhole bh, RangeBeyondPiHalfTwo19 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tan(v)); + } + } + + public static class RangeHalf extends RangeState { + public RangeHalf() { + super(Double.MIN_NORMAL, 0.5); + } + } + + public static class RangeHalfToOne extends RangeState { + public RangeHalfToOne() { + super(0.5, 1.0); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void asin_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.asin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void asin_half(Blackhole bh, RangeHalf r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.asin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void asin_one(Blackhole bh, RangeHalfToOne r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.asin(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void acos_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.acos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void acos_half(Blackhole bh, RangeHalf r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.acos(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void acos_one(Blackhole bh, RangeHalfToOne r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.acos(v)); + } + } + + public static class RangeTwo66 extends RangeState { + public RangeTwo66() { + super(Double.MIN_NORMAL, 0x1.0p66); + } + } + + public static class RangeBeyondTwo66 extends RangeState { + public RangeBeyondTwo66() { + super(0x1.0p66, Double.MAX_VALUE); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void atan_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.atan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void atan_two66(Blackhole bh, RangeTwo66 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.atan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void atan_beyond_two66(Blackhole bh, RangeBeyondTwo66 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.atan(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void atan2_subnormal(Blackhole bh, RangeSubnormal r0, RangeSubnormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.atan2(values0[i], values1[i])); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void atan2_normal(Blackhole bh, RangeNormal r0, RangeNormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.atan2(values0[i], values1[i])); + } + } + + private static final double LN2 = Math.log(2)/Math.log(Math.E); + + public static class RangeHalfLn2 extends RangeState { + public RangeHalfLn2() { + super(Double.MIN_NORMAL, LN2 / 2); + } + } + + public static class RangeBeyondHalfLn2 extends RangeState { + public RangeBeyondHalfLn2() { + super(LN2 / 2, Double.MAX_VALUE); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void exp_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.exp(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void exp_half_ln2(Blackhole bh, RangeHalfLn2 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.exp(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void exp_beyond_half_ln2(Blackhole bh, RangeBeyondHalfLn2 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.exp(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log_subnormal(Blackhole bh, RangePositiveSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log_normal(Blackhole bh, RangePositiveNormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log10_subnormal(Blackhole bh, RangePositiveSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log10(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log10_normal(Blackhole bh, RangePositiveNormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log10(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log1p_subnormal(Blackhole bh, RangePositiveSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log1p(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void log1p_normal(Blackhole bh, RangePositiveNormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.log1p(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cbrt_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cbrt(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cbrt_normal(Blackhole bh, RangeNormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cbrt(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void pow_subnormal(Blackhole bh, RangeSubnormal r0, RangeSubnormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.pow(values0[i], values1[i])); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void pow_normal(Blackhole bh, RangeNormal r0, RangeNormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.pow(values0[i], values1[i])); + } + } + + public static class Range22 extends RangeState { + public Range22() { + super(Double.MIN_NORMAL, 22); + } + } + + public static class RangeBeyond22 extends RangeState { + public RangeBeyond22() { + super(22, Double.MAX_VALUE); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sinh_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sinh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sinh_22(Blackhole bh, RangeTwoNeg54 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sinh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void sinh_beyond_22(Blackhole bh, RangeBeyond22 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.sinh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cosh_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cosh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cosh_22(Blackhole bh, RangeTwoNeg54 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cosh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void cosh_beyond_22(Blackhole bh, RangeBeyond22 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.cosh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tanh_subnormal(Blackhole bh, RangeSubnormal r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tanh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void tanh_22(Blackhole bh, RangeTwoNeg54 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.tanh(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void hypot_subnormal(Blackhole bh, RangeSubnormal r0, RangeSubnormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.hypot(values0[i], values1[i])); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void hypot_normal(Blackhole bh, RangeNormal r0, RangeNormal r1) { + double[] values0 = r0.values; + double[] values1 = r1.values; + for (int i = 0; i < values0.length; i++) { + bh.consume(StrictMath.hypot(values0[i], values1[i])); + } + } + + public static class RangeTwoNeg54 extends RangeState { + public RangeTwoNeg54() { + super(Double.MIN_NORMAL, 0x1.0p-54); + } + } + + public static class RangeTwoNeg54ToHalfLn2 extends RangeState { + public RangeTwoNeg54ToHalfLn2() { + super(0x1.0p-54, LN2 / 2); + } + } + + public static class RangeHalfLn2To56Ln2 extends RangeState { + public RangeHalfLn2To56Ln2() { + super(LN2 / 2, 56 * LN2); + } + } + + public static class RangeBeyond56Ln2 extends RangeState { + public RangeBeyond56Ln2() { + super(56 * LN2, Double.MAX_VALUE); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void expm1_two_neg_54(Blackhole bh, RangeTwoNeg54 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.expm1(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void expm1_half_ln2(Blackhole bh, RangeTwoNeg54ToHalfLn2 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.expm1(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void expm1_56ln2(Blackhole bh, RangeHalfLn2To56Ln2 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.expm1(v)); + } + } + + @Benchmark + @OperationsPerInvocation(SIZE) + public void expm1_beyond_56ln2(Blackhole bh, RangeBeyond56Ln2 r) { + double[] values = r.values; + for (double v : values) { + bh.consume(StrictMath.expm1(v)); + } + } + +} From 16dafc00eca8acb0fdabf2f373bb5f84bd293086 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Fri, 31 Oct 2025 14:10:52 +0000 Subject: [PATCH 394/561] 8370393: Cleanup handling of ancient Windows versions from GetJavaProperties java_props_md Reviewed-by: clanger, rriggs --- .../windows/native/libjava/java_props_md.c | 55 +------------------ 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/src/java.base/windows/native/libjava/java_props_md.c b/src/java.base/windows/native/libjava/java_props_md.c index 9495faf81e5..75587a09d0b 100644 --- a/src/java.base/windows/native/libjava/java_props_md.c +++ b/src/java.base/windows/native/libjava/java_props_md.c @@ -419,17 +419,6 @@ GetJavaProperties(JNIEnv* env) * Operating system dwMajorVersion dwMinorVersion * ================== ============== ============== * - * Windows 95 4 0 - * Windows 98 4 10 - * Windows ME 4 90 - * Windows 3.51 3 51 - * Windows NT 4.0 4 0 - * Windows 2000 5 0 - * Windows XP 32 bit 5 1 - * Windows Server 2003 family 5 2 - * Windows XP 64 bit 5 2 - * where ((&ver.wServicePackMinor) + 2) = 1 - * and si.wProcessorArchitecture = 9 * Windows Vista family 6 0 (VER_NT_WORKSTATION) * Windows Server 2008 6 0 (!VER_NT_WORKSTATION) * Windows 7 6 1 (VER_NT_WORKSTATION) @@ -452,61 +441,19 @@ GetJavaProperties(JNIEnv* env) * versions are released. */ switch (platformId) { - case VER_PLATFORM_WIN32_WINDOWS: - if (majorVersion == 4) { - switch (minorVersion) { - case 0: sprops.os_name = "Windows 95"; break; - case 10: sprops.os_name = "Windows 98"; break; - case 90: sprops.os_name = "Windows Me"; break; - default: sprops.os_name = "Windows 9X (unknown)"; break; - } - } else { - sprops.os_name = "Windows 9X (unknown)"; - } - break; case VER_PLATFORM_WIN32_NT: - if (majorVersion <= 4) { - sprops.os_name = "Windows NT"; - } else if (majorVersion == 5) { - switch (minorVersion) { - case 0: sprops.os_name = "Windows 2000"; break; - case 1: sprops.os_name = "Windows XP"; break; - case 2: - /* - * From MSDN OSVERSIONINFOEX and SYSTEM_INFO documentation: - * - * "Because the version numbers for Windows Server 2003 - * and Windows XP 6u4 bit are identical, you must also test - * whether the wProductType member is VER_NT_WORKSTATION. - * and si.wProcessorArchitecture is - * PROCESSOR_ARCHITECTURE_AMD64 (which is 9) - * If it is, the operating system is Windows XP 64 bit; - * otherwise, it is Windows Server 2003." - */ - if (is_workstation && is_64bit) { - sprops.os_name = "Windows XP"; /* 64 bit */ - } else { - sprops.os_name = "Windows 2003"; - } - break; - default: sprops.os_name = "Windows NT (unknown)"; break; - } - } else if (majorVersion == 6) { + if (majorVersion == 6) { /* * See table in MSDN OSVERSIONINFOEX documentation. */ if (is_workstation) { switch (minorVersion) { - case 0: sprops.os_name = "Windows Vista"; break; - case 1: sprops.os_name = "Windows 7"; break; case 2: sprops.os_name = "Windows 8"; break; case 3: sprops.os_name = "Windows 8.1"; break; default: sprops.os_name = "Windows NT (unknown)"; } } else { switch (minorVersion) { - case 0: sprops.os_name = "Windows Server 2008"; break; - case 1: sprops.os_name = "Windows Server 2008 R2"; break; case 2: sprops.os_name = "Windows Server 2012"; break; case 3: sprops.os_name = "Windows Server 2012 R2"; break; default: sprops.os_name = "Windows NT (unknown)"; From 8236800deb5b99a027b0944f6c512c0f31d030df Mon Sep 17 00:00:00 2001 From: Chad Rakoczy Date: Fri, 31 Oct 2025 14:11:13 +0000 Subject: [PATCH 395/561] 8370527: Memory leak after 8316694: Implement relocation of nmethod within CodeCache Reviewed-by: shade, eastigeevich, kvn --- src/hotspot/share/code/nmethod.cpp | 27 ++--- src/hotspot/share/code/nmethod.hpp | 31 +++-- src/hotspot/share/runtime/vmStructs.cpp | 1 + .../classes/sun/jvm/hotspot/code/NMethod.java | 110 ++++++++++-------- 4 files changed, 96 insertions(+), 73 deletions(-) diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index 53c75c7ae43..d91af9b4991 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1147,12 +1147,12 @@ nmethod* nmethod::new_nmethod(const methodHandle& method, #if INCLUDE_JVMCI + align_up(speculations_len , oopSize) #endif - + align_up(debug_info->data_size() , oopSize) - + ImmutableDataReferencesCounterSize; + + align_up(debug_info->data_size() , oopSize); // First, allocate space for immutable data in C heap. address immutable_data = nullptr; if (immutable_data_size > 0) { + immutable_data_size += ImmutableDataRefCountSize; immutable_data = (address)os::malloc(immutable_data_size, mtCode); if (immutable_data == nullptr) { vm_exit_out_of_memory(immutable_data_size, OOM_MALLOC_ERROR, "nmethod: no space for immutable data"); @@ -1323,7 +1323,7 @@ nmethod::nmethod( #if INCLUDE_JVMCI _speculations_offset = 0; #endif - _immutable_data_reference_counter_offset = 0; + _immutable_data_ref_count_offset = 0; code_buffer->copy_code_and_locs_to(this); code_buffer->copy_values_to(this); @@ -1456,12 +1456,12 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. #if INCLUDE_JVMCI _speculations_offset = nm._speculations_offset; #endif - _immutable_data_reference_counter_offset = nm._immutable_data_reference_counter_offset; + _immutable_data_ref_count_offset = nm._immutable_data_ref_count_offset; // Increment number of references to immutable data to share it between nmethods if (_immutable_data_size > 0) { _immutable_data = nm._immutable_data; - set_immutable_data_references_counter(get_immutable_data_references_counter() + 1); + inc_immutable_data_ref_count(); } else { _immutable_data = blob_end(); } @@ -1754,12 +1754,11 @@ nmethod::nmethod( #if INCLUDE_JVMCI _speculations_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize); - _immutable_data_reference_counter_offset = _speculations_offset + align_up(speculations_len, oopSize); - DEBUG_ONLY( int immutable_data_end_offset = _immutable_data_reference_counter_offset + ImmutableDataReferencesCounterSize; ) + _immutable_data_ref_count_offset = _speculations_offset + align_up(speculations_len, oopSize); #else - _immutable_data_reference_counter_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize); - DEBUG_ONLY( int immutable_data_end_offset = _immutable_data_reference_counter_offset + ImmutableDataReferencesCounterSize; ) + _immutable_data_ref_count_offset = _scopes_data_offset + align_up(debug_info->data_size(), oopSize); #endif + DEBUG_ONLY( int immutable_data_end_offset = _immutable_data_ref_count_offset + ImmutableDataRefCountSize; ) assert(immutable_data_end_offset <= immutable_data_size, "wrong read-only data size: %d > %d", immutable_data_end_offset, immutable_data_size); @@ -1791,7 +1790,7 @@ nmethod::nmethod( memcpy(speculations_begin(), speculations, speculations_len); } #endif - set_immutable_data_references_counter(1); + init_immutable_data_ref_count(); post_init(); @@ -2424,12 +2423,8 @@ void nmethod::purge(bool unregister_nmethod) { delete[] _compiled_ic_data; if (_immutable_data != blob_end()) { - int reference_count = get_immutable_data_references_counter(); - assert(reference_count > 0, "immutable data has no references"); - - set_immutable_data_references_counter(reference_count - 1); - // Free memory if this is the last nmethod referencing immutable data - if (reference_count == 0) { + // Free memory if this was the last nmethod referencing immutable data + if (dec_immutable_data_ref_count() == 0) { os::free(_immutable_data); } diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index bce0181a3ec..34accf428b6 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -29,6 +29,7 @@ #include "code/pcDesc.hpp" #include "oops/metadata.hpp" #include "oops/method.hpp" +#include "runtime/mutexLocker.hpp" class AbstractCompiler; class CompiledDirectCall; @@ -168,7 +169,7 @@ class nmethod : public CodeBlob { friend class JVMCINMethodData; friend class DeoptimizationScope; - #define ImmutableDataReferencesCounterSize ((int)sizeof(int)) + #define ImmutableDataRefCountSize ((int)sizeof(int)) private: @@ -250,7 +251,7 @@ class nmethod : public CodeBlob { #if INCLUDE_JVMCI int _speculations_offset; #endif - int _immutable_data_reference_counter_offset; + int _immutable_data_ref_count_offset; // location in frame (offset for sp) that deopt can store the original // pc during a deopt. @@ -647,11 +648,11 @@ public: #if INCLUDE_JVMCI address scopes_data_end () const { return _immutable_data + _speculations_offset ; } address speculations_begin () const { return _immutable_data + _speculations_offset ; } - address speculations_end () const { return _immutable_data + _immutable_data_reference_counter_offset ; } + address speculations_end () const { return _immutable_data + _immutable_data_ref_count_offset ; } #else - address scopes_data_end () const { return _immutable_data + _immutable_data_reference_counter_offset ; } + address scopes_data_end () const { return _immutable_data + _immutable_data_ref_count_offset ; } #endif - address immutable_data_references_counter_begin () const { return _immutable_data + _immutable_data_reference_counter_offset ; } + address immutable_data_ref_count_begin () const { return _immutable_data + _immutable_data_ref_count_offset ; } // Sizes int immutable_data_size() const { return _immutable_data_size; } @@ -962,8 +963,24 @@ public: bool load_reported() const { return _load_reported; } void set_load_reported() { _load_reported = true; } - inline int get_immutable_data_references_counter() { return *((int*)immutable_data_references_counter_begin()); } - inline void set_immutable_data_references_counter(int count) { *((int*)immutable_data_references_counter_begin()) = count; } + inline void init_immutable_data_ref_count() { + assert(is_not_installed(), "should be called in nmethod constructor"); + *((int*)immutable_data_ref_count_begin()) = 1; + } + + inline int inc_immutable_data_ref_count() { + assert_lock_strong(CodeCache_lock); + int* ref_count = (int*)immutable_data_ref_count_begin(); + assert(*ref_count > 0, "Must be positive"); + return ++(*ref_count); + } + + inline int dec_immutable_data_ref_count() { + assert_lock_strong(CodeCache_lock); + int* ref_count = (int*)immutable_data_ref_count_begin(); + assert(*ref_count > 0, "Must be positive"); + return --(*ref_count); + } static void add_delayed_compiled_method_load_event(nmethod* nm) NOT_CDS_RETURN; diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index 85f921ef3e3..a7342448522 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -538,6 +538,7 @@ nonstatic_field(nmethod, _deopt_handler_offset, int) \ nonstatic_field(nmethod, _orig_pc_offset, int) \ nonstatic_field(nmethod, _stub_offset, int) \ + nonstatic_field(nmethod, _immutable_data_ref_count_offset, int) \ nonstatic_field(nmethod, _scopes_pcs_offset, int) \ nonstatic_field(nmethod, _scopes_data_offset, int) \ nonstatic_field(nmethod, _handler_table_offset, u2) \ diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java index 939b47fdd2a..91302dba0f6 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java @@ -37,7 +37,7 @@ import sun.jvm.hotspot.utilities.Observer; public class NMethod extends CodeBlob { private static long pcDescSize; - private static long immutableDataReferencesCounterSize; + private static long immutableDataRefCountSize; private static AddressField methodField; /** != InvocationEntryBci if this nmethod is an on-stack replacement method */ private static CIntegerField entryBCIField; @@ -55,6 +55,7 @@ public class NMethod extends CodeBlob { private static CIntField nulChkTableOffsetField; private static CIntegerField scopesPCsOffsetField; private static CIntegerField scopesDataOffsetField; + private static CIntegerField immutableDataRefCountOffsetField; /** Offsets for entry points */ /** Entry point with class check */ @@ -90,6 +91,7 @@ public class NMethod extends CodeBlob { stubOffsetField = type.getCIntegerField("_stub_offset"); scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); scopesDataOffsetField = type.getCIntegerField("_scopes_data_offset"); + immutableDataRefCountOffsetField = type.getCIntegerField("_immutable_data_ref_count_offset"); handlerTableOffsetField = new CIntField(type.getCIntegerField("_handler_table_offset"), 0); nulChkTableOffsetField = new CIntField(type.getCIntegerField("_nul_chk_table_offset"), 0); entryOffsetField = new CIntField(type.getCIntegerField("_entry_offset"), 0); @@ -97,7 +99,7 @@ public class NMethod extends CodeBlob { osrEntryPointField = type.getAddressField("_osr_entry_point"); compLevelField = new CIntField(type.getCIntegerField("_comp_level"), 0); pcDescSize = db.lookupType("PcDesc").getSize(); - immutableDataReferencesCounterSize = VM.getVM().getIntSize(); + immutableDataRefCountSize = VM.getVM().getIntSize(); } public NMethod(Address addr) { @@ -119,45 +121,46 @@ public class NMethod extends CodeBlob { public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } /** Boundaries for different parts */ - public Address constantsBegin() { return contentBegin(); } - public Address constantsEnd() { return codeBegin(); } - public Address instsBegin() { return codeBegin(); } - public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } - public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptHandlerOffset()); } - public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address stubEnd() { return dataBegin(); } - public Address oopsBegin() { return dataBegin(); } - public Address oopsEnd() { return dataEnd(); } + public Address constantsBegin() { return contentBegin(); } + public Address constantsEnd() { return codeBegin(); } + public Address instsBegin() { return codeBegin(); } + public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } + public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptHandlerOffset()); } + public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address stubEnd() { return dataBegin(); } + public Address oopsBegin() { return dataBegin(); } + public Address oopsEnd() { return dataEnd(); } - public Address immutableDataBegin() { return immutableDataField.getValue(addr); } - public Address immutableDataEnd() { return immutableDataBegin().addOffsetTo(getImmutableDataSize()); } - public Address dependenciesBegin() { return immutableDataBegin(); } - public Address dependenciesEnd() { return immutableDataBegin().addOffsetTo(getHandlerTableOffset()); } - public Address handlerTableBegin() { return immutableDataBegin().addOffsetTo(getHandlerTableOffset()); } - public Address handlerTableEnd() { return immutableDataBegin().addOffsetTo(getNulChkTableOffset()); } - public Address nulChkTableBegin() { return immutableDataBegin().addOffsetTo(getNulChkTableOffset()); } - public Address nulChkTableEnd() { return immutableDataBegin().addOffsetTo(getScopesDataOffset()); } - public Address scopesDataBegin() { return immutableDataBegin().addOffsetTo(getScopesDataOffset()); } - public Address scopesDataEnd() { return immutableDataBegin().addOffsetTo(getScopesPCsOffset()); } - public Address scopesPCsBegin() { return immutableDataBegin().addOffsetTo(getScopesPCsOffset()); } - public Address scopesPCsEnd() { return immutableDataEnd().addOffsetTo(-immutableDataReferencesCounterSize); } + public Address immutableDataBegin() { return immutableDataField.getValue(addr); } + public Address immutableDataEnd() { return immutableDataBegin().addOffsetTo(getImmutableDataSize()); } + public Address dependenciesBegin() { return immutableDataBegin(); } + public Address dependenciesEnd() { return immutableDataBegin().addOffsetTo(getHandlerTableOffset()); } + public Address handlerTableBegin() { return immutableDataBegin().addOffsetTo(getHandlerTableOffset()); } + public Address handlerTableEnd() { return immutableDataBegin().addOffsetTo(getNulChkTableOffset()); } + public Address nulChkTableBegin() { return immutableDataBegin().addOffsetTo(getNulChkTableOffset()); } + public Address nulChkTableEnd() { return immutableDataBegin().addOffsetTo(getScopesDataOffset()); } + public Address scopesDataBegin() { return immutableDataBegin().addOffsetTo(getScopesDataOffset()); } + public Address scopesDataEnd() { return immutableDataBegin().addOffsetTo(getScopesPCsOffset()); } + public Address scopesPCsBegin() { return immutableDataBegin().addOffsetTo(getScopesPCsOffset()); } + public Address scopesPCsEnd() { return immutableDataBegin().addOffsetTo(getImmutableDataRefCountOffset()); } + public Address immutableDataRefCountBegin() { return immutableDataBegin().addOffsetTo(getImmutableDataRefCountOffset()); } - public Address metadataBegin() { return mutableDataBegin().addOffsetTo(getRelocationSize()); } - public Address metadataEnd() { return mutableDataEnd(); } + public Address metadataBegin() { return mutableDataBegin().addOffsetTo(getRelocationSize()); } + public Address metadataEnd() { return mutableDataEnd(); } - public int getImmutableDataSize() { return (int) immutableDataSizeField.getValue(addr); } - public int constantsSize() { return (int) constantsEnd() .minus(constantsBegin()); } - public int instsSize() { return (int) instsEnd() .minus(instsBegin()); } - public int stubSize() { return (int) stubEnd() .minus(stubBegin()); } - public int oopsSize() { return (int) oopsEnd() .minus(oopsBegin()); } - public int metadataSize() { return (int) metadataEnd() .minus(metadataBegin()); } - public int scopesDataSize() { return (int) scopesDataEnd() .minus(scopesDataBegin()); } - public int scopesPCsSize() { return (int) scopesPCsEnd() .minus(scopesPCsBegin()); } - public int dependenciesSize() { return (int) dependenciesEnd().minus(dependenciesBegin()); } - public int handlerTableSize() { return (int) handlerTableEnd().minus(handlerTableBegin()); } - public int nulChkTableSize() { return (int) nulChkTableEnd() .minus(nulChkTableBegin()); } - public int origPCOffset() { return (int) origPCOffsetField.getValue(addr); } + public int getImmutableDataSize() { return (int) immutableDataSizeField.getValue(addr); } + public int constantsSize() { return (int) constantsEnd() .minus(constantsBegin()); } + public int instsSize() { return (int) instsEnd() .minus(instsBegin()); } + public int stubSize() { return (int) stubEnd() .minus(stubBegin()); } + public int oopsSize() { return (int) oopsEnd() .minus(oopsBegin()); } + public int metadataSize() { return (int) metadataEnd() .minus(metadataBegin()); } + public int scopesDataSize() { return (int) scopesDataEnd() .minus(scopesDataBegin()); } + public int scopesPCsSize() { return (int) scopesPCsEnd() .minus(scopesPCsBegin()); } + public int dependenciesSize() { return (int) dependenciesEnd().minus(dependenciesBegin()); } + public int handlerTableSize() { return (int) handlerTableEnd().minus(handlerTableBegin()); } + public int nulChkTableSize() { return (int) nulChkTableEnd() .minus(nulChkTableBegin()); } + public int origPCOffset() { return (int) origPCOffsetField.getValue(addr); } public int totalSize() { return @@ -165,14 +168,20 @@ public class NMethod extends CodeBlob { instsSize() + stubSize(); } + public int immutableDataSize() { - return + int size = scopesDataSize() + scopesPCsSize() + dependenciesSize() + handlerTableSize() + - nulChkTableSize() + - (int) immutableDataReferencesCounterSize; + nulChkTableSize(); + + if (size > 0) { + size += (int) immutableDataRefCountSize; + } + + return size; } public boolean constantsContains (Address addr) { return constantsBegin() .lessThanOrEqual(addr) && constantsEnd() .greaterThan(addr); } @@ -479,13 +488,14 @@ public class NMethod extends CodeBlob { // Internals only below this point // - private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } - private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } - private int getDeoptHandlerOffset() { return (int) deoptHandlerOffsetField .getValue(addr); } - private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } - private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } - private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } - private int getHandlerTableOffset() { return (int) handlerTableOffsetField.getValue(addr); } - private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } - private int getCompLevel() { return (int) compLevelField .getValue(addr); } + private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } + private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } + private int getDeoptHandlerOffset() { return (int) deoptHandlerOffsetField .getValue(addr); } + private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } + private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } + private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } + private int getHandlerTableOffset() { return (int) handlerTableOffsetField .getValue(addr); } + private int getNulChkTableOffset() { return (int) nulChkTableOffsetField .getValue(addr); } + private int getCompLevel() { return (int) compLevelField .getValue(addr); } + private int getImmutableDataRefCountOffset() { return (int) immutableDataRefCountOffsetField .getValue(addr); } } From 1781b186b51900b758dd55cc356eaaf12b28481b Mon Sep 17 00:00:00 2001 From: Mark Powers Date: Fri, 31 Oct 2025 17:52:48 +0000 Subject: [PATCH 396/561] 8343232: PKCS#12 KeyStore support for RFC 9879: Use of Password-Based Message Authentication Code 1 (PBMAC1) Reviewed-by: weijun, mullan --- .../sun/crypto/provider/PBES2Parameters.java | 103 +---- .../sun/crypto/provider/PBKDF2KeyImpl.java | 2 +- .../classes/sun/security/pkcs12/MacData.java | 389 +++++++++++++----- .../sun/security/pkcs12/PBMAC1Parameters.java | 140 +++++++ .../sun/security/pkcs12/PKCS12KeyStore.java | 140 +------ .../classes/sun/security/util/KeyUtil.java | 3 + .../classes/sun/security/util/KnownOIDs.java | 3 +- .../sun/security/util/PBKDF2Parameters.java | 212 ++++++++++ .../share/conf/security/java.security | 5 +- test/jdk/sun/security/pkcs12/PBMAC1Test.java | 223 ++++++++++ .../security/pkcs12/ParamsPreferences.java | 8 +- 11 files changed, 925 insertions(+), 303 deletions(-) create mode 100644 src/java.base/share/classes/sun/security/pkcs12/PBMAC1Parameters.java create mode 100644 src/java.base/share/classes/sun/security/util/PBKDF2Parameters.java create mode 100644 test/jdk/sun/security/pkcs12/PBMAC1Test.java diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java index 64b276a1c79..9d33b6689d2 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBES2Parameters.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidParameterSpecException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEParameterSpec; +import sun.security.util.PBKDF2Parameters; import sun.security.util.*; /** @@ -93,7 +94,7 @@ import sun.security.util.*; abstract class PBES2Parameters extends AlgorithmParametersSpi { private static final ObjectIdentifier pkcs5PBKDF2_OID = - ObjectIdentifier.of(KnownOIDs.PBKDF2WithHmacSHA1); + ObjectIdentifier.of(KnownOIDs.PBKDF2); private static final ObjectIdentifier pkcs5PBES2_OID = ObjectIdentifier.of(KnownOIDs.PBES2); private static final ObjectIdentifier aes128CBC_OID = @@ -224,77 +225,32 @@ abstract class PBES2Parameters extends AlgorithmParametersSpi { // next DerValue as the real PBES2-params. if (kdf.getTag() == DerValue.tag_ObjectId) { pBES2_params = pBES2_params.data.getDerValue(); + if (pBES2_params.tag != DerValue.tag_Sequence) { + throw new IOException("PBE parameter parsing error: " + + "not an ASN.1 SEQUENCE tag"); + } kdf = pBES2_params.data.getDerValue(); } - String kdfAlgo = parseKDF(kdf); - - if (pBES2_params.tag != DerValue.tag_Sequence) { - throw new IOException("PBE parameter parsing error: " - + "not an ASN.1 SEQUENCE tag"); - } - String cipherAlgo = parseES(pBES2_params.data.getDerValue()); - - this.pbes2AlgorithmName = "PBEWith" + kdfAlgo + "And" + cipherAlgo; - } - - private String parseKDF(DerValue keyDerivationFunc) throws IOException { - - if (!pkcs5PBKDF2_OID.equals(keyDerivationFunc.data.getOID())) { + if (!pkcs5PBKDF2_OID.equals(kdf.data.getOID())) { throw new IOException("PBE parameter parsing error: " + "expecting the object identifier for PBKDF2"); } - if (keyDerivationFunc.tag != DerValue.tag_Sequence) { + if (kdf.tag != DerValue.tag_Sequence) { throw new IOException("PBE parameter parsing error: " + "not an ASN.1 SEQUENCE tag"); } - DerValue pBKDF2_params = keyDerivationFunc.data.getDerValue(); - if (pBKDF2_params.tag != DerValue.tag_Sequence) { - throw new IOException("PBE parameter parsing error: " - + "not an ASN.1 SEQUENCE tag"); - } - DerValue specified = pBKDF2_params.data.getDerValue(); - // the 'specified' ASN.1 CHOICE for 'salt' is supported - if (specified.tag == DerValue.tag_OctetString) { - salt = specified.getOctetString(); - } else { - // the 'otherSource' ASN.1 CHOICE for 'salt' is not supported - throw new IOException("PBE parameter parsing error: " - + "not an ASN.1 OCTET STRING tag"); - } - iCount = pBKDF2_params.data.getInteger(); + DerValue pBKDF2_params = kdf.data.getDerValue(); - // keyLength INTEGER (1..MAX) OPTIONAL, - var ksDer = pBKDF2_params.data.getOptional(DerValue.tag_Integer); - if (ksDer.isPresent()) { - keysize = ksDer.get().getInteger() * 8; // keysize (in bits) - } + var kdfParams = new PBKDF2Parameters(pBKDF2_params); + String kdfAlgo = kdfParams.getPrfAlgo(); + salt = kdfParams.getSalt(); + iCount = kdfParams.getIterationCount(); + keysize = kdfParams.getKeyLength(); - // prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 - String kdfAlgo; - var prfDer = pBKDF2_params.data.getOptional(DerValue.tag_Sequence); - if (prfDer.isPresent()) { - DerValue prf = prfDer.get(); - kdfAlgo_OID = prf.data.getOID(); - KnownOIDs o = KnownOIDs.findMatch(kdfAlgo_OID.toString()); - if (o == null || (!o.stdName().equals("HmacSHA1") && - !o.stdName().equals("HmacSHA224") && - !o.stdName().equals("HmacSHA256") && - !o.stdName().equals("HmacSHA384") && - !o.stdName().equals("HmacSHA512") && - !o.stdName().equals("HmacSHA512/224") && - !o.stdName().equals("HmacSHA512/256"))) { - throw new IOException("PBE parameter parsing error: " - + "expecting the object identifier for a HmacSHA key " - + "derivation function"); - } - kdfAlgo = o.stdName(); - prf.data.getOptional(DerValue.tag_Null); - prf.data.atEnd(); - } else { - kdfAlgo = "HmacSHA1"; - } - return kdfAlgo; + String cipherAlgo = parseES(pBES2_params.data.getDerValue()); + + this.pbes2AlgorithmName = "PBEWith" + kdfAlgo + "And" + cipherAlgo; } private String parseES(DerValue encryptionScheme) throws IOException { @@ -345,26 +301,9 @@ abstract class PBES2Parameters extends AlgorithmParametersSpi { DerOutputStream pBES2_params = new DerOutputStream(); - DerOutputStream keyDerivationFunc = new DerOutputStream(); - keyDerivationFunc.putOID(pkcs5PBKDF2_OID); - - DerOutputStream pBKDF2_params = new DerOutputStream(); - pBKDF2_params.putOctetString(salt); // choice: 'specified OCTET STRING' - pBKDF2_params.putInteger(iCount); - - if (keysize > 0) { - pBKDF2_params.putInteger(keysize / 8); // derived key length (in octets) - } - - DerOutputStream prf = new DerOutputStream(); - // algorithm is id-hmacWith - prf.putOID(kdfAlgo_OID); - // parameters is 'NULL' - prf.putNull(); - pBKDF2_params.write(DerValue.tag_Sequence, prf); - - keyDerivationFunc.write(DerValue.tag_Sequence, pBKDF2_params); - pBES2_params.write(DerValue.tag_Sequence, keyDerivationFunc); + // keysize encoded as octets + pBES2_params.writeBytes(PBKDF2Parameters.encode(salt, iCount, + keysize/8, kdfAlgo_OID)); DerOutputStream encryptionScheme = new DerOutputStream(); // algorithm is id-aes128-CBC or id-aes256-CBC diff --git a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java index 6a0ecb6d462..9f3e041eebc 100644 --- a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java @@ -55,7 +55,7 @@ import sun.security.util.PBEUtil; * @author Valerie Peng * */ -final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { +public final class PBKDF2KeyImpl implements javax.crypto.interfaces.PBEKey { @java.io.Serial private static final long serialVersionUID = -2234868909660948157L; diff --git a/src/java.base/share/classes/sun/security/pkcs12/MacData.java b/src/java.base/share/classes/sun/security/pkcs12/MacData.java index 9a712f28ccc..d45b50ad704 100644 --- a/src/java.base/share/classes/sun/security/pkcs12/MacData.java +++ b/src/java.base/share/classes/sun/security/pkcs12/MacData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -25,32 +25,58 @@ package sun.security.pkcs12; -import java.io.*; +import java.io.IOException; import java.security.*; +import java.security.spec.InvalidKeySpecException; +import static java.util.Locale.ENGLISH; +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; -import sun.security.util.DerInputStream; -import sun.security.util.DerOutputStream; -import sun.security.util.DerValue; -import sun.security.x509.AlgorithmId; import sun.security.pkcs.ParsingException; +import sun.security.util.*; +import sun.security.x509.AlgorithmId; /** - * A MacData type, as defined in PKCS#12. + * The MacData type, as defined in PKCS#12. + * + * The ASN.1 definition is as follows: + * + *

          + *
          + * MacData ::= SEQUENCE {
          + *     mac        DigestInfo,
          + *     macSalt    OCTET STRING,
          + *     iterations INTEGER DEFAULT 1
          + *      -- Note: The default is for historical reasons and its use is
          + *      -- deprecated.
          + * }
          + *
          + * DigestInfo ::= SEQUENCE {
          + *     digestAlgorithm DigestAlgorithmIdentifier,
          + *     digest OCTET STRING
          + * }
          + *
          + * 
          * * @author Sharon Liu */ class MacData { - private final String digestAlgorithmName; - private AlgorithmParameters digestAlgorithmParams; + private static final Debug debug = Debug.getInstance("pkcs12"); + private final String macAlgorithm; private final byte[] digest; private final byte[] macSalt; private final int iterations; - // the ASN.1 encoded contents of this class - private byte[] encoded = null; + // The following three fields are for PBMAC1. + private final int keyLength; + private final String kdfHmac; + private final String hmac; /** * Parses a PKCS#12 MAC data. @@ -70,103 +96,276 @@ class MacData { // Parse the DigestAlgorithmIdentifier. AlgorithmId digestAlgorithmId = AlgorithmId.parse(digestInfo[0]); - this.digestAlgorithmName = digestAlgorithmId.getName(); - this.digestAlgorithmParams = digestAlgorithmId.getParameters(); + String digestAlgorithmName = digestAlgorithmId.getName(); + // Get the digest. this.digest = digestInfo[1].getOctetString(); - // Get the salt. - this.macSalt = macData[1].getOctetString(); + if (digestAlgorithmName.equals("PBMAC1")) { + PBMAC1Parameters algParams; - // Iterations is optional. The default value is 1. - if (macData.length > 2) { - this.iterations = macData[2].getInteger(); + algParams = new PBMAC1Parameters(digestAlgorithmId + .getEncodedParams()); + + this.iterations = algParams.getKdfParams().getIterationCount(); + this.macSalt = algParams.getKdfParams().getSalt(); + this.kdfHmac = algParams.getKdfParams().getPrfAlgo(); + this.keyLength = algParams.getKdfParams().getKeyLength(); + + // Implementations MUST NOT accept params that omit keyLength. + if (this.keyLength == -1) { + throw new IOException("error: missing keyLength field"); + } + this.hmac = algParams.getHmac(); + this.macAlgorithm = "pbewith" + this.kdfHmac + "and" + this.hmac; } else { - this.iterations = 1; + this.kdfHmac = null; + this.hmac = null; + this.keyLength = -1; + this.macSalt = macData[1].getOctetString(); + if (macData.length > 2) { + this.iterations = macData[2].getInteger(); + } else { + this.iterations = 1; + } + // Remove "-" from digest algorithm names + this.macAlgorithm = "hmacpbe" + + digestAlgorithmName.replace("-", ""); } } - MacData(String algName, byte[] digest, byte[] salt, int iterations) - throws NoSuchAlgorithmException - { - if (algName == null) - throw new NullPointerException("the algName parameter " + - "must be non-null"); - - AlgorithmId algid = AlgorithmId.get(algName); - this.digestAlgorithmName = algid.getName(); - this.digestAlgorithmParams = algid.getParameters(); - - if (digest == null) { - throw new NullPointerException("the digest " + - "parameter must be non-null"); - } else if (digest.length == 0) { - throw new IllegalArgumentException("the digest " + - "parameter must not be empty"); - } else { - this.digest = digest.clone(); - } - - this.macSalt = salt; - this.iterations = iterations; - - // delay the generation of ASN.1 encoding until - // getEncoded() is called - this.encoded = null; - - } - - String getDigestAlgName() { - return digestAlgorithmName; - } - - byte[] getSalt() { - return macSalt; - } - - int getIterations() { - return iterations; - } - - byte[] getDigest() { - return digest; - } - /** - * Returns the ASN.1 encoding of this object. - * @return the ASN.1 encoding. - * @exception IOException if error occurs when constructing its - * ASN.1 encoding. + * Computes a MAC on the data. + * + * This is a two-step process: first generate a key and then use the + * key to generate the MAC. PBMAC1 and non-PBMAC1 keys use different + * key factories. PBMAC1 uses a pseudorandom function (kdfHmac) + * to generate keys while non-PBMAC1 does not. The MAC is computed + * according to the specified hmac algorithm. + * + * @param macAlgorithm the algorithm used to compute the MAC + * @param password the password used to generate the key + * @param params a PBEParameterSpec object + * @param data the data on which the MAC is computed + * @param kdfHmac the pseudorandom function used to compute the key + * for PBMAC1 + * @param hmac the algorithm used to compute the MAC + * @param keyLength the length of the key generated by the pseudorandom + * function + * + * @return the computed MAC as a byte array + * + * @exception NoSuchAlgorithmException if either kdfHmac or hmac is + * unknown to the Mac or SecretKeyFactory */ - public byte[] getEncoded() throws NoSuchAlgorithmException - { - if (this.encoded != null) - return this.encoded.clone(); + private static byte[] calculateMac(String macAlgorithm, char[] password, + PBEParameterSpec params, byte[] data, + String kdfHmac, String hmac, int keyLength) + throws InvalidAlgorithmParameterException, InvalidKeyException, + InvalidKeySpecException, NoSuchAlgorithmException { + SecretKeyFactory skf; + SecretKey pbeKey = null; + Mac m; - DerOutputStream out = new DerOutputStream(); - DerOutputStream tmp = new DerOutputStream(); + PBEKeySpec keySpec; - DerOutputStream tmp2 = new DerOutputStream(); - // encode encryption algorithm - AlgorithmId algid = AlgorithmId.get(digestAlgorithmName); - algid.encode(tmp2); + /* + * The Hmac has to be extracted from the algorithm name for + * PBMAC1 algorithms. For non-PBMAC1 macAlgorithms, the name + * and Hmac are the same. + * + * The prefix used in Algorithm names is guaranteed to be lowercase. + */ + if (macAlgorithm.startsWith("pbewith")) { + m = Mac.getInstance(hmac); + int len = keyLength == -1 ? m.getMacLength()*8 : keyLength; + skf = SecretKeyFactory.getInstance("PBKDF2With" +kdfHmac); + keySpec = new PBEKeySpec(password, params.getSalt(), + params.getIterationCount(), len); + } else { + m = Mac.getInstance(macAlgorithm); + skf = SecretKeyFactory.getInstance("PBE"); + keySpec = new PBEKeySpec(password); + } - // encode digest data - tmp2.putOctetString(digest); - - tmp.write(DerValue.tag_Sequence, tmp2); - - // encode salt - tmp.putOctetString(macSalt); - - // encode iterations - tmp.putInteger(iterations); - - // wrap everything into a SEQUENCE - out.write(DerValue.tag_Sequence, tmp); - this.encoded = out.toByteArray(); - - return this.encoded.clone(); + try { + pbeKey = skf.generateSecret(keySpec); + if (macAlgorithm.startsWith("pbewith")) { + m.init(pbeKey); + } else { + m.init(pbeKey, params); + } + m.update(data); + return m.doFinal(); + } finally { + keySpec.clearPassword(); + KeyUtil.destroySecretKeys(pbeKey); + } } + /** + * Verify Mac on the data. + * + * Calculate Mac on the data and compare with Mac found in input stream. + * + * @param password the password used to generate the key + * @param data the data on which the MAC is computed + * + * @exception UnrecoverableKeyException if calculated Mac and + * Mac found in input stream are different + */ + void verifyMac(char[] password, byte[] data) + throws InvalidAlgorithmParameterException, InvalidKeyException, + InvalidKeySpecException, NoSuchAlgorithmException, + UnrecoverableKeyException { + + byte[] macResult = calculateMac(this.macAlgorithm, password, + new PBEParameterSpec(this.macSalt, this.iterations), + data, this.kdfHmac, this.hmac, this.keyLength); + + if (debug != null) { + debug.println("Checking keystore integrity " + + "(" + this.macAlgorithm + " iterations: " + + this.iterations + ")"); + } + + if (!MessageDigest.isEqual(this.digest, macResult)) { + throw new UnrecoverableKeyException("Failed PKCS12" + + " integrity checking"); + } + } + + /* + * Gathers parameters and generates a MAC of the data + * + * @param password the password used to generate the key + * @param data the data on which the MAC is computed + * @param macAlgorithm the algorithm used to compute the MAC + * @param macIterationCount the iteration count + * @param salt the salt + * + * @exception IOException if the MAC cannot be calculated + * + * @return the computed MAC as a byte array + */ + static byte[] generateMac(char[] passwd, byte[] data, + String macAlgorithm, int macIterationCount, byte[] salt) + throws IOException, NoSuchAlgorithmException { + final PBEParameterSpec params; + String algName; + String kdfHmac; + String hmac; + + macAlgorithm = macAlgorithm.toLowerCase(ENGLISH); + // The prefix used in Algorithm names is guaranteed to be lowercase. + if (macAlgorithm.startsWith("pbewith")) { + algName = "PBMAC1"; + kdfHmac = MacData.parseKdfHmac(macAlgorithm); + hmac = MacData.parseHmac(macAlgorithm); + if (hmac == null) { + hmac = kdfHmac; + } + } else if (macAlgorithm.startsWith("hmacpbe")) { + algName = macAlgorithm.substring(7); + kdfHmac = null; + hmac = macAlgorithm; + } else { + throw new ParsingException("unexpected algorithm '" + + macAlgorithm + "'"); + } + + params = new PBEParameterSpec(salt, macIterationCount); + + try { + byte[] macResult = calculateMac(macAlgorithm, passwd, params, data, + kdfHmac, hmac, -1); + + DerOutputStream bytes = new DerOutputStream(); + bytes.write(encode(algName, macResult, params, kdfHmac, hmac, + macResult.length)); + return bytes.toByteArray(); + } catch (InvalidKeySpecException | InvalidKeyException | + InvalidAlgorithmParameterException e) { + throw new IOException("calculateMac failed: " + e, e); + } + } + + String getMacAlgorithm() { + return this.macAlgorithm; + } + + int getIterations() { + return this.iterations; + } + + /** + * Returns the ASN.1 encoding. + * @return the ASN.1 encoding + * @exception NoSuchAlgorithmException if error occurs when constructing its + * ASN.1 encoding. + */ + static byte[] encode(String algName, byte[] digest, PBEParameterSpec p, + String kdfHmac, String hmac, int keyLength) + throws IOException, NoSuchAlgorithmException { + + final int iterations = p.getIterationCount(); + final byte[] macSalt = p.getSalt(); + + DerOutputStream tmp = new DerOutputStream(); + DerOutputStream out = new DerOutputStream(); + + if (algName.equals("PBMAC1")) { + DerOutputStream tmp1 = new DerOutputStream(); + DerOutputStream tmp2 = new DerOutputStream(); + + // id-PBMAC1 OBJECT IDENTIFIER ::= { pkcs-5 14 } + tmp2.putOID(ObjectIdentifier.of(KnownOIDs.PBMAC1)); + tmp2.writeBytes(PBMAC1Parameters.encode(macSalt, iterations, + keyLength, kdfHmac, hmac)); + + tmp1.write(DerValue.tag_Sequence, tmp2); + tmp1.putOctetString(digest); + + tmp.write(DerValue.tag_Sequence, tmp1); + tmp.putOctetString( + new byte[]{ 'N', 'O', 'T', ' ', 'U', 'S', 'E', 'D' }); + // Unused, but must have non-zero positive value. + tmp.putInteger(1); + } else { + final AlgorithmId digestAlgorithm = AlgorithmId.get(algName); + DerOutputStream tmp2 = new DerOutputStream(); + + tmp2.write(digestAlgorithm); + tmp2.putOctetString(digest); + + // wrap into a SEQUENCE + tmp.write(DerValue.tag_Sequence, tmp2); + tmp.putOctetString(macSalt); + tmp.putInteger(iterations); + } + // wrap everything into a SEQUENCE + out.write(DerValue.tag_Sequence, tmp); + return out.toByteArray(); + } + + private static String parseKdfHmac(String text) { + int index1 = text.indexOf("with") + 4; + int index2 = text.indexOf("and"); + if (index1 == 3) { // -1 + 4 + return null; + } else if (index2 == -1) { + return text.substring(index1); + } else { + return text.substring(index1, index2); + } + } + + private static String parseHmac(String text) { + int index1 = text.indexOf("and") + 3; + if (index1 == 2) { // -1 + 3 + return null; + } else { + return text.substring(index1); + } + } } diff --git a/src/java.base/share/classes/sun/security/pkcs12/PBMAC1Parameters.java b/src/java.base/share/classes/sun/security/pkcs12/PBMAC1Parameters.java new file mode 100644 index 00000000000..2c3c6fa8171 --- /dev/null +++ b/src/java.base/share/classes/sun/security/pkcs12/PBMAC1Parameters.java @@ -0,0 +1,140 @@ +/* + * 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 sun.security.pkcs12; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; + +import sun.security.util.*; +import sun.security.x509.AlgorithmId; + +/** + * This class implements the parameter set used with password-based + * mac scheme 1 (PBMAC1), which is defined in PKCS#5 as follows: + * + *
          + * -- PBMAC1
          + *
          + * PBMAC1Algorithms ALGORITHM-IDENTIFIER ::=
          + *   { {PBMAC1-params IDENTIFIED BY id-PBMAC1}, ...}
          + *
          + * id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14}
          + *
          + * PBMAC1-params ::= SEQUENCE {
          + *   keyDerivationFunc AlgorithmIdentifier {{PBMAC1-KDFs}},
          + *   messageAuthScheme AlgorithmIdentifier {{PBMAC1-MACs}} }
          + *
          + * PBMAC1-KDFs ALGORITHM-IDENTIFIER ::=
          + *   { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }
          + *
          + * PBMAC1-MACs ALGORITHM-IDENTIFIER ::= { ... }
          + *
          + * -- PBKDF2
          + *
          + * See sun.security.util.PBKDF2Parameters.
          + *
          + * 
          + * + * @since 26 + */ +final class PBMAC1Parameters { + + static final ObjectIdentifier pkcs5PBKDF2_OID = + ObjectIdentifier.of(KnownOIDs.PBKDF2); + + private final String hmacAlgo; + private final PBKDF2Parameters kdfParams; + + PBMAC1Parameters(byte[] encoded) throws IOException { + DerValue pBMAC1_params = new DerValue(encoded); + if (pBMAC1_params.tag != DerValue.tag_Sequence) { + throw new IOException("PBMAC1 parameter parsing error: " + + "not an ASN.1 SEQUENCE tag"); + } + DerValue[] info = new DerInputStream(pBMAC1_params.toByteArray()) + .getSequence(2); + if (info.length != 2) { + throw new IOException("PBMAC1 parameter parsing error: " + + "expected length not 2"); + } + ObjectIdentifier OID = info[1].data.getOID(); + KnownOIDs o = KnownOIDs.findMatch(OID.toString()); + if (o == null || (!o.stdName().equals("HmacSHA1") && + !o.stdName().equals("HmacSHA224") && + !o.stdName().equals("HmacSHA256") && + !o.stdName().equals("HmacSHA384") && + !o.stdName().equals("HmacSHA512") && + !o.stdName().equals("HmacSHA512/224") && + !o.stdName().equals("HmacSHA512/256"))) { + throw new IOException("PBMAC1 parameter parsing error: " + + "expecting the object identifier for a HmacSHA key " + + "derivation function"); + } + // Hmac function used to compute the MAC + this.hmacAlgo = o.stdName(); + + //DerValue kdf = pBMAC1_params.data.getDerValue(); + DerValue kdf = info[0]; + + if (!pkcs5PBKDF2_OID.equals(kdf.data.getOID())) { + throw new IOException("PBKDF2 parameter parsing error: " + + "expecting the object identifier for PBKDF2"); + } + if (kdf.tag != DerValue.tag_Sequence) { + throw new IOException("PBKDF2 parameter parsing error: " + + "not an ASN.1 SEQUENCE tag"); + } + DerValue pBKDF2_params = kdf.data.getDerValue(); + + this.kdfParams = new PBKDF2Parameters(pBKDF2_params); + } + + /* + * Encode PBMAC1 parameters from components. + */ + static byte[] encode(byte[] salt, int iterationCount, int keyLength, + String kdfHmac, String hmac) throws NoSuchAlgorithmException { + + DerOutputStream out = new DerOutputStream(); + + // keyDerivationFunc AlgorithmIdentifier {{PBMAC1-KDFs}} + out.writeBytes(PBKDF2Parameters.encode(salt, + iterationCount, keyLength, kdfHmac)); + + // messageAuthScheme AlgorithmIdentifier {{PBMAC1-MACs}} + out.write(AlgorithmId.get(hmac)); + return new DerOutputStream().write(DerValue.tag_Sequence, out) + .toByteArray(); + } + + PBKDF2Parameters getKdfParams() { + return this.kdfParams; + } + + String getHmac() { + return this.hmacAlgo; + } +} diff --git a/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java b/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java index bee89856756..f85ba0f9c4b 100644 --- a/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java +++ b/src/java.base/share/classes/sun/security/pkcs12/PKCS12KeyStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -26,52 +26,36 @@ package sun.security.pkcs12; import java.io.*; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.Key; -import java.security.KeyFactory; -import java.security.KeyStore; -import java.security.KeyStoreSpi; -import java.security.KeyStoreException; -import java.security.PKCS12Attribute; -import java.security.PrivateKey; -import java.security.UnrecoverableEntryException; -import java.security.UnrecoverableKeyException; -import java.security.SecureRandom; -import java.security.Security; +import java.security.*; import java.security.cert.Certificate; +import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.security.cert.CertificateException; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidParameterSpecException; import java.security.spec.KeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.util.*; - -import static java.nio.charset.StandardCharsets.UTF_8; - -import java.security.AlgorithmParameters; -import java.security.InvalidAlgorithmParameterException; -import javax.crypto.spec.PBEParameterSpec; -import javax.crypto.spec.PBEKeySpec; -import javax.crypto.spec.SecretKeySpec; -import javax.crypto.SecretKeyFactory; -import javax.crypto.SecretKey; import javax.crypto.Cipher; -import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +import javax.crypto.spec.SecretKeySpec; import javax.security.auth.DestroyFailedException; import javax.security.auth.x500.X500Principal; import jdk.internal.access.SharedSecrets; -import sun.security.tools.KeyStoreUtil; -import sun.security.util.*; import sun.security.pkcs.ContentInfo; -import sun.security.x509.AlgorithmId; import sun.security.pkcs.EncryptedPrivateKeyInfo; import sun.security.provider.JavaKeyStore.JKS; +import sun.security.tools.KeyStoreUtil; +import sun.security.util.*; +import sun.security.x509.AlgorithmId; import sun.security.x509.AuthorityKeyIdentifierExtension; +import static java.nio.charset.StandardCharsets.UTF_8; + /** * This class provides the keystore implementation referred to as "PKCS12". @@ -366,7 +350,7 @@ public final class PKCS12KeyStore extends KeyStoreSpi { try { cipher.init(Cipher.DECRYPT_MODE, skey, algParams); } finally { - destroyPBEKey(skey); + KeyUtil.destroySecretKeys(skey); } byte[] keyInfo = cipher.doFinal(encryptedKey); /* @@ -855,17 +839,6 @@ public final class PKCS12KeyStore extends KeyStoreSpi { return skey; } - /* - * Destroy the key obtained from getPBEKey(). - */ - private void destroyPBEKey(SecretKey key) { - try { - key.destroy(); - } catch (DestroyFailedException e) { - // Accept this - } - } - /* * Encrypt private key or secret key using Password-based encryption (PBE) * as defined in PKCS#5. @@ -915,7 +888,7 @@ public final class PKCS12KeyStore extends KeyStoreSpi { try { cipher.init(Cipher.ENCRYPT_MODE, skey, algParams); } finally { - destroyPBEKey(skey); + KeyUtil.destroySecretKeys(skey); } byte[] encryptedKey = cipher.doFinal(data); algid = new AlgorithmId(pbeOID, cipher.getParameters()); @@ -1265,7 +1238,8 @@ public final class PKCS12KeyStore extends KeyStoreSpi { macIterationCount = defaultMacIterationCount(); } if (password != null && !macAlgorithm.equalsIgnoreCase("NONE")) { - byte[] macData = calculateMac(password, authenticatedSafe); + byte[] macData = MacData.generateMac(password, authenticatedSafe, + macAlgorithm, macIterationCount, getSalt()); pfx.write(macData); } // write PFX to output stream @@ -1480,48 +1454,6 @@ public final class PKCS12KeyStore extends KeyStoreSpi { } } - /* - * Calculate MAC using HMAC algorithm (required for password integrity) - * - * Hash-based MAC algorithm combines secret key with message digest to - * create a message authentication code (MAC) - */ - private byte[] calculateMac(char[] passwd, byte[] data) - throws IOException - { - byte[] mData; - String algName = macAlgorithm.substring(7); - - try { - // Generate a random salt. - byte[] salt = getSalt(); - - // generate MAC (MAC key is generated within JCE) - Mac m = Mac.getInstance(macAlgorithm); - PBEParameterSpec params = - new PBEParameterSpec(salt, macIterationCount); - SecretKey key = getPBEKey(passwd); - try { - m.init(key, params); - } finally { - destroyPBEKey(key); - } - m.update(data); - byte[] macResult = m.doFinal(); - - // encode as MacData - MacData macData = new MacData(algName, macResult, salt, - macIterationCount); - DerOutputStream bytes = new DerOutputStream(); - bytes.write(macData.getEncoded()); - mData = bytes.toByteArray(); - } catch (Exception e) { - throw new IOException("calculateMac failed: " + e, e); - } - return mData; - } - - /* * Validate Certificate Chain */ @@ -1890,7 +1822,7 @@ public final class PKCS12KeyStore extends KeyStoreSpi { try { cipher.init(Cipher.ENCRYPT_MODE, skey, algParams); } finally { - destroyPBEKey(skey); + KeyUtil.destroySecretKeys(skey); } encryptedData = cipher.doFinal(data); @@ -2100,7 +2032,7 @@ public final class PKCS12KeyStore extends KeyStoreSpi { try { cipher.init(Cipher.DECRYPT_MODE, skey, algParams); } finally { - destroyPBEKey(skey); + KeyUtil.destroySecretKeys(skey); } loadSafeContents(new DerInputStream(cipher.doFinal(rawData))); return null; @@ -2135,39 +2067,11 @@ public final class PKCS12KeyStore extends KeyStoreSpi { "MAC iteration count too large: " + ic); } - String algName = - macData.getDigestAlgName().toUpperCase(Locale.ENGLISH); - - // Change SHA-1 to SHA1 - algName = algName.replace("-", ""); - - macAlgorithm = "HmacPBE" + algName; + // Store MAC algorithm of keystore that was just loaded. + macAlgorithm = macData.getMacAlgorithm(); macIterationCount = ic; - - // generate MAC (MAC key is created within JCE) - Mac m = Mac.getInstance(macAlgorithm); - PBEParameterSpec params = - new PBEParameterSpec(macData.getSalt(), ic); - RetryWithZero.run(pass -> { - SecretKey key = getPBEKey(pass); - try { - m.init(key, params); - } finally { - destroyPBEKey(key); - } - m.update(authSafeData); - byte[] macResult = m.doFinal(); - - if (debug != null) { - debug.println("Checking keystore integrity " + - "(" + m.getAlgorithm() + " iterations: " + ic + ")"); - } - - if (!MessageDigest.isEqual(macData.getDigest(), macResult)) { - throw new UnrecoverableKeyException("Failed PKCS12" + - " integrity checking"); - } + macData.verifyMac(pass, authSafeData); return (Void) null; }, password); } catch (Exception e) { diff --git a/src/java.base/share/classes/sun/security/util/KeyUtil.java b/src/java.base/share/classes/sun/security/util/KeyUtil.java index 7a58ac0d4e9..dd27b5f02d8 100644 --- a/src/java.base/share/classes/sun/security/util/KeyUtil.java +++ b/src/java.base/share/classes/sun/security/util/KeyUtil.java @@ -40,6 +40,7 @@ import javax.crypto.spec.SecretKeySpec; import javax.security.auth.DestroyFailedException; import jdk.internal.access.SharedSecrets; +import com.sun.crypto.provider.PBKDF2KeyImpl; import sun.security.jca.JCAUtil; import sun.security.x509.AlgorithmId; @@ -469,6 +470,8 @@ public final class KeyUtil { if (k instanceof SecretKeySpec sk) { SharedSecrets.getJavaxCryptoSpecAccess() .clearSecretKeySpec(sk); + } else if (k instanceof PBKDF2KeyImpl p2k) { + p2k.clear(); } else { try { k.destroy(); diff --git a/src/java.base/share/classes/sun/security/util/KnownOIDs.java b/src/java.base/share/classes/sun/security/util/KnownOIDs.java index cbb0c1e0b57..6c90801f69b 100644 --- a/src/java.base/share/classes/sun/security/util/KnownOIDs.java +++ b/src/java.base/share/classes/sun/security/util/KnownOIDs.java @@ -208,8 +208,9 @@ public enum KnownOIDs { PBEWithMD5AndRC2("1.2.840.113549.1.5.6"), PBEWithSHA1AndDES("1.2.840.113549.1.5.10"), PBEWithSHA1AndRC2("1.2.840.113549.1.5.11"), - PBKDF2WithHmacSHA1("1.2.840.113549.1.5.12"), + PBKDF2("1.2.840.113549.1.5.12", "PBKDF2WithHmacSHA1"), PBES2("1.2.840.113549.1.5.13"), + PBMAC1("1.2.840.113549.1.5.14"), // PKCS7 1.2.840.113549.1.7.* PKCS7("1.2.840.113549.1.7"), diff --git a/src/java.base/share/classes/sun/security/util/PBKDF2Parameters.java b/src/java.base/share/classes/sun/security/util/PBKDF2Parameters.java new file mode 100644 index 00000000000..07d4c70fecb --- /dev/null +++ b/src/java.base/share/classes/sun/security/util/PBKDF2Parameters.java @@ -0,0 +1,212 @@ +/* + * 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 sun.security.util; + +import java.io.IOException; + +import sun.security.util.KnownOIDs; +import sun.security.x509.AlgorithmId; + +/** + * This class implements the parameter set used with password-based + * key derivation function 2 (PBKDF2), which is defined in PKCS#5 as follows: + * + *
          + *
          + * PBKDF2Algorithms ALGORITHM-IDENTIFIER ::=
          + *   { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ...}
          + *
          + * id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12}
          + *
          + * PBKDF2-params ::= SEQUENCE {
          + *     salt CHOICE {
          + *       specified OCTET STRING,
          + *       otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}
          + *     },
          + *     iterationCount INTEGER (1..MAX),
          + *     keyLength INTEGER (1..MAX) OPTIONAL,
          + *     prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1
          + * }
          + *
          + * PBKDF2-SaltSources ALGORITHM-IDENTIFIER ::= { ... }
          + *
          + * PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= {
          + *     {NULL IDENTIFIED BY id-hmacWithSHA1} |
          + *     {NULL IDENTIFIED BY id-hmacWithSHA224} |
          + *     {NULL IDENTIFIED BY id-hmacWithSHA256} |
          + *     {NULL IDENTIFIED BY id-hmacWithSHA384} |
          + *     {NULL IDENTIFIED BY id-hmacWithSHA512}, ... }
          + *
          + * algid-hmacWithSHA1 AlgorithmIdentifier {{PBKDF2-PRFs}} ::=
          + *     {algorithm id-hmacWithSHA1, parameters NULL : NULL}
          + *
          + * id-hmacWithSHA1 OBJECT IDENTIFIER ::= {digestAlgorithm 7}
          + *
          + * For more information, see
          + * RFC 8018:
          + * PKCS #5: Password-Based Cryptography Specification.
          + *
          + * 
          + */ +public final class PBKDF2Parameters { + + private final byte[] salt; + + private final int iterationCount; + + // keyLength in bits, or -1 if not present + private final int keyLength; + + private final String prfAlgo; + + /** + * Initialize PBKDF2Parameters from a DER encoded + * parameter block. + * + * @param pBKDF2_params the DER encoding of the parameter block + * + * @throws IOException for parsing errors in the input stream + */ + public PBKDF2Parameters(DerValue pBKDF2_params) throws IOException { + + if (pBKDF2_params.tag != DerValue.tag_Sequence) { + throw new IOException("PBKDF2 parameter parsing error: " + + "not an ASN.1 SEQUENCE tag"); + } + DerValue specified = pBKDF2_params.data.getDerValue(); + // the 'specified' ASN.1 CHOICE for 'salt' is supported + if (specified.tag == DerValue.tag_OctetString) { + salt = specified.getOctetString(); + } else { + // the 'otherSource' ASN.1 CHOICE for 'salt' is not supported + throw new IOException("PBKDF2 parameter parsing error: " + + "not an ASN.1 OCTET STRING tag"); + } + iterationCount = pBKDF2_params.data.getInteger(); + + // keyLength INTEGER (1..MAX) OPTIONAL, + var ksDer = pBKDF2_params.data.getOptional(DerValue.tag_Integer); + if (ksDer.isPresent()) { + keyLength = ksDer.get().getInteger() * 8; // keyLength (in bits) + } else { + keyLength = -1; + } + + // prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 + var prfDer = pBKDF2_params.data.getOptional(DerValue.tag_Sequence); + if (prfDer.isPresent()) { + DerValue prf = prfDer.get(); + // the pseudorandom function (default is HmacSHA1) + ObjectIdentifier kdfAlgo_OID = prf.data.getOID(); + KnownOIDs o = KnownOIDs.findMatch(kdfAlgo_OID.toString()); + if (o == null || (!o.stdName().equals("HmacSHA1") && + !o.stdName().equals("HmacSHA224") && + !o.stdName().equals("HmacSHA256") && + !o.stdName().equals("HmacSHA384") && + !o.stdName().equals("HmacSHA512") && + !o.stdName().equals("HmacSHA512/224") && + !o.stdName().equals("HmacSHA512/256"))) { + throw new IOException("PBKDF2 parameter parsing error: " + + "expecting the object identifier for a HmacSHA " + + "pseudorandom function"); + } + prfAlgo = o.stdName(); + prf.data.getOptional(DerValue.tag_Null); + prf.data.atEnd(); + } else { + prfAlgo = "HmacSHA1"; + } + } + + public static byte[] encode(byte[] salt, int iterationCount, + int keyLength, String kdfHmac) { + ObjectIdentifier prf = + ObjectIdentifier.of(KnownOIDs.findMatch(kdfHmac)); + return PBKDF2Parameters.encode(salt, iterationCount, keyLength, prf); + } + + /* + * Encode PBKDF2 parameters from components. + * The outer algorithm ID is also encoded in addition to the parameters. + */ + public static byte[] encode(byte[] salt, int iterationCount, + int keyLength, ObjectIdentifier prf) { + assert keyLength != -1; + + DerOutputStream out = new DerOutputStream(); + DerOutputStream tmp0 = new DerOutputStream(); + + tmp0.putOctetString(salt); + tmp0.putInteger(iterationCount); + tmp0.putInteger(keyLength); + + // prf AlgorithmIdentifier {{PBKDF2-PRFs}} + tmp0.write(new AlgorithmId(prf)); + + // id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} + out.putOID(ObjectIdentifier.of(KnownOIDs.PBKDF2)); + out.write(DerValue.tag_Sequence, tmp0); + + return new DerOutputStream().write(DerValue.tag_Sequence, out) + .toByteArray(); + } + + /** + * Returns the salt. + * + * @return the salt + */ + public byte[] getSalt() { + return this.salt; + } + + /** + * Returns the iteration count. + * + * @return the iteration count + */ + public int getIterationCount() { + return this.iterationCount; + } + + /** + * Returns size of key generated by PBKDF2, or -1 if not found/set. + * + * @return size of key generated by PBKDF2, or -1 if not found/set + */ + public int getKeyLength() { + return this.keyLength; + } + + /** + * Returns name of Hmac. + * + * @return name of Hmac + */ + public String getPrfAlgo() { + return this.prfAlgo; + } +} diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security index 2464361b9ef..3d26c1dcd96 100644 --- a/src/java.base/share/conf/security/java.security +++ b/src/java.base/share/conf/security/java.security @@ -1341,8 +1341,9 @@ jceks.key.serialFilter = java.base/java.lang.Enum;java.base/java.security.KeyRep #keystore.pkcs12.keyPbeIterationCount = 10000 # The algorithm used to calculate the optional MacData at the end of a PKCS12 -# file. This can be any HmacPBE algorithm defined in the Mac section of the -# Java Security Standard Algorithm Names Specification. When set to "NONE", +# file. This can be any HmacPBE or PBEWith algorithm defined in +# the Mac section of the Java Security Standard Algorithm Names Specification, +# for example, HmacPBESHA256 or PBEWithHmacSHA256. When set to "NONE", # no Mac is generated. The default value is "HmacPBESHA256". #keystore.pkcs12.macAlgorithm = HmacPBESHA256 diff --git a/test/jdk/sun/security/pkcs12/PBMAC1Test.java b/test/jdk/sun/security/pkcs12/PBMAC1Test.java new file mode 100644 index 00000000000..acb0f73a2d2 --- /dev/null +++ b/test/jdk/sun/security/pkcs12/PBMAC1Test.java @@ -0,0 +1,223 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8343232 + * @summary Verify correctness of the structure of PKCS12 PBMAC1 + * keystores created with various property values. + * Verify that keystores load correctly from an input stream. + * @modules java.base/sun.security.util + * @library /test/lib + */ +import jdk.test.lib.Asserts; +import jdk.test.lib.security.DerUtils; +import sun.security.util.KnownOIDs; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +public class PBMAC1Test { + + static final char[] PASSWORD = "1234".toCharArray(); + + public static void main(String[] args) throws Exception { + create(); + migrate(); + overflow(); + } + + // PBMAC1 inside PKCS12 + //0019:008B [2] SEQUENCE + //001C:007B [20] SEQUENCE + //001E:0057 [200] SEQUENCE + //0020:000B [2000] OID 1.2.840.113549.1.5.14 (PBMAC1) + //002B:004A [2001] SEQUENCE + //002D:003A [20010] SEQUENCE + //002F:000B [200100] OID 1.2.840.113549.1.5.12 (PBKDF2) + //003A:002D [200101] SEQUENCE + //003C:0016 [2001010] OCTET STRING (20 bytes of salt) + //0052:0004 [2001011] INTEGER 10000 + //0056:0003 [2001012] INTEGER 32 + //0059:000E [2001013] SEQUENCE + //005B:000A [20010130] OID 1.2.840.113549.2.9 (HmacSHA256) + //0065:0002 [20010131] NULL + //0067:000E [20011] SEQUENCE + //0069:000A [200110] OID 1.2.840.113549.2.9 (HmacSHA256) + //0073:0002 [200111] NULL + //0075:0022 [201] OCTET STRING (32 bytes of mac) + //0097:000A [21] OCTET STRING (8 bytes of useless salt) + //00A1:0003 [22] INTEGER 1 + static void create() throws Exception { + System.setProperty("keystore.pkcs12.macAlgorithm", "pbewithhmacsha256"); + var der = emptyP12(); + DerUtils.checkAlg(der, "2000", KnownOIDs.PBMAC1); + DerUtils.checkAlg(der, "200100", KnownOIDs.PBKDF2); + DerUtils.checkAlg(der, "20010130", KnownOIDs.HmacSHA256); + DerUtils.checkAlg(der, "200110", KnownOIDs.HmacSHA256); + DerUtils.checkInt(der, "2001011", 10000); + DerUtils.checkInt(der, "2001012", 32); + + System.setProperty("keystore.pkcs12.macAlgorithm", "PBEWITHHMACSHA512"); + der = emptyP12(); + DerUtils.checkAlg(der, "2000", KnownOIDs.PBMAC1); + DerUtils.checkAlg(der, "200100", KnownOIDs.PBKDF2); + DerUtils.checkAlg(der, "20010130", KnownOIDs.HmacSHA512); + DerUtils.checkAlg(der, "200110", KnownOIDs.HmacSHA512); + DerUtils.checkInt(der, "2001011", 10000); + DerUtils.checkInt(der, "2001012", 64); + + System.setProperty("keystore.pkcs12.macAlgorithm", "PBEWiThHmAcSHA512/224"); + der = emptyP12(); + DerUtils.checkAlg(der, "2000", KnownOIDs.PBMAC1); + DerUtils.checkAlg(der, "200100", KnownOIDs.PBKDF2); + DerUtils.checkAlg(der, "20010130", KnownOIDs.HmacSHA512$224); + DerUtils.checkAlg(der, "200110", KnownOIDs.HmacSHA512$224); + DerUtils.checkInt(der, "2001011", 10000); + DerUtils.checkInt(der, "2001012", 28); + + // As strange as I can... + System.setProperty("keystore.pkcs12.macAlgorithm", + "PBEWithHmacSHA512/224AndHmacSHA3-384"); + der = emptyP12(); + DerUtils.checkAlg(der, "2000", KnownOIDs.PBMAC1); + DerUtils.checkAlg(der, "200100", KnownOIDs.PBKDF2); + DerUtils.checkAlg(der, "20010130", KnownOIDs.HmacSHA512$224); + DerUtils.checkAlg(der, "200110", KnownOIDs.HmacSHA3_384); + DerUtils.checkInt(der, "2001011", 10000); + DerUtils.checkInt(der, "2001012", 48); + + // Bad alg names + System.setProperty("keystore.pkcs12.macAlgorithm", "PBEWithHmacSHA456"); + var reason = Asserts.assertThrows(NoSuchAlgorithmException.class, + () -> emptyP12()).getMessage(); + Asserts.assertTrue(reason.contains("Algorithm hmacsha456 not available"), reason); + } + + static void migrate() throws Exception { + // A pkcs12 file using PBEWithHmacSHA256 but key length is 8 + var sha2p12 = """ + MIGhAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBiDB5MFUGCSqGSIb3DQEFDjBIMDgGCSqGSIb3DQEF + DDArBBSV6e5xI+9AYtGHQlDI0X4pmvWLBQICJxACAQgwDAYIKoZIhvcNAgkFADAMBggqhkiG9w0C + CQUABCAaaSO6JgEh1lDo1pvAC0CF5HqgIFBvzt1+GZlgFy7xFQQITk9UIFVTRUQCAQE= + """; + var der = Base64.getMimeDecoder().decode(sha2p12); + DerUtils.checkInt(der, "2001012", 8); // key length used to be 8 + + der = loadAndStore(sha2p12); + DerUtils.checkAlg(der, "20010130", KnownOIDs.HmacSHA256); + DerUtils.checkAlg(der, "200110", KnownOIDs.HmacSHA256); + DerUtils.checkInt(der, "2001012", 32); // key length changed to 32 + } + + static void overflow() throws Exception { + + // Cannot create new + System.setProperty("keystore.pkcs12.macIterationCount", "5000001"); + System.setProperty("keystore.pkcs12.macAlgorithm", "pbewithhmacsha256"); + Asserts.assertThrows(IllegalArgumentException.class, PBMAC1Test::emptyP12); + System.clearProperty("keystore.pkcs12.macAlgorithm"); + Asserts.assertThrows(IllegalArgumentException.class, PBMAC1Test::emptyP12); + + // IC=5000001 using old algorithm + var bigICt = """ + MGYCAQMwEQYJKoZIhvcNAQcBoAQEAjAAME4wMTANBglghkgBZQMEAgEFAAQgyLBK5h9/E/2o7l2A + eALbI1otiS8kT3C41Ef3T38OMjUEFIic7isrAJNr+3+8fUbnMtmB0qytAgNMS0E= + """; + + // IC=5000000 using old algorithm + var smallICt = """ + MGYCAQMwEQYJKoZIhvcNAQcBoAQEAjAAME4wMTANBglghkgBZQMEAgEFAAQgR61YZLW6H81rkGTk + XfuU138mkIugdoQBhuNsnvWuBtQEFJ0wmMlpoUiji8PlvwCrmMbqWW4XAgNMS0A= + """; + + // IC=5000001 using PBMAC1 + var bigICp = """ + MIGiAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBiTB6MFYGCSqGSIb3DQEFDjBJMDkGCSqGSIb3DQEF + DDAsBBQFNf/gHCO5jNT429D6Q5gxTKHqVAIDTEtBAgEgMAwGCCqGSIb3DQIJBQAwDAYIKoZIhvcN + AgkFAAQgwEVMcyMPQXJSXUIbWqNWjMArtnXDlNUGnKD+19B7QFkECE5PVCBVU0VEAgEB + """; + + // IC=5000000 using PBMAC1 + var smallICp = """ + MIGiAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBiTB6MFYGCSqGSIb3DQEFDjBJMDkGCSqGSIb3DQEF + DDAsBBS/ZFfC7swsDHvaCXwyQkuMrZ7dbgIDTEtAAgEgMAwGCCqGSIb3DQIJBQAwDAYIKoZIhvcN + AgkFAAQgCRvE7LDbzkcYOVv/7iBv0KB3DoUkwnpTI0nsonVfv9UECE5PVCBVU0VEAgEB"""; + + loadAndStore(smallICp); + loadAndStore(smallICt); + + Asserts.assertTrue(Asserts.assertThrows(IOException.class, () -> loadAndStore(bigICp)) + .getMessage().contains("MAC iteration count too large: 5000001")); + Asserts.assertTrue(Asserts.assertThrows(IOException.class, () -> loadAndStore(bigICt)) + .getMessage().contains("MAC iteration count too large: 5000001")); + + // Incorrect Salt + var incorrectSalt = """ + MIGdAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBhDB1MFEGCSqGSIb3DQEFDjBEMDYGCSqGSIb3DQEF + DDApBBSakVhBLltKvqUj6EAxvWqJi+gc7AICJxACASAwCgYIKoZIhvcNAgkwCgYIKoZIhvcNAgkE + IG+euEHE8iN/2C7txbCjCJ9mU4TgEsHPsC9L3Rxa7malBAhOT1QgVVNFRAIBAQ=="""; + Asserts.assertTrue(Asserts.assertThrows(IOException.class, () -> loadAndStore(incorrectSalt)) + .getMessage().contains("Integrity check failed")); + + // Incorrect Iteration Count + var incorrectIC = """ + MIGdAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBhDB1MFEGCSqGSIb3DQEFDjBEMDYGCSqGSIb3DQEF + DDApBBSZkVhBLltKvqUj6EAxvWqJi+gc7AICKBACASAwCgYIKoZIhvcNAgkwCgYIKoZIhvcNAgkE + IG+euEHE8iN/2C7txbCjCJ9mU4TgEsHPsC9L3Rxa7malBAhOT1QgVVNFRAIBAQ=="""; + Asserts.assertTrue(Asserts.assertThrows(IOException.class, () -> loadAndStore(incorrectIC)) + .getMessage().contains("Integrity check failed")); + + // Missing Key Length + var missingKeyLength = """ + MIGaAgEDMBEGCSqGSIb3DQEHAaAEBAIwADCBgTByME4GCSqGSIb3DQEFDjBBMDMGCSqGSIb3DQEF + DDAmBBSZkVhBLltKvqUj6EAxvWqJi+gc7AICJxAwCgYIKoZIhvcNAgkwCgYIKoZIhvcNAgkEIG+e + uEHE8iN/2C7txbCjCJ9mU4TgEsHPsC9L3Rxa7malBAhOT1QgVVNFRAIBAQ=="""; + Asserts.assertTrue(Asserts.assertThrows(IOException.class, () -> loadAndStore(missingKeyLength)) + .getMessage().contains("missing keyLength field")); + } + + static byte[] emptyP12() throws Exception { + var ks = KeyStore.getInstance("pkcs12"); + ks.load(null, null); + var os = new ByteArrayOutputStream(); + ks.store(os, PASSWORD); + return os.toByteArray(); + } + + static byte[] loadAndStore(String data) throws Exception { + var bytes = Base64.getMimeDecoder().decode(data); + var ks = KeyStore.getInstance("PKCS12"); + ks.load(new ByteArrayInputStream(bytes), PASSWORD); + var baos = new ByteArrayOutputStream(); + ks.store(baos, PASSWORD); + var newBytes = baos.toByteArray(); + var bais = new ByteArrayInputStream(newBytes); + ks.load(bais, PASSWORD); + return newBytes; + } +} diff --git a/test/jdk/sun/security/pkcs12/ParamsPreferences.java b/test/jdk/sun/security/pkcs12/ParamsPreferences.java index 4bedca56a78..c40bd4f4b70 100644 --- a/test/jdk/sun/security/pkcs12/ParamsPreferences.java +++ b/test/jdk/sun/security/pkcs12/ParamsPreferences.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2021, 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. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ import static sun.security.util.KnownOIDs.*; /* * @test - * @bug 8076190 8242151 8153005 8266293 + * @bug 8076190 8242151 8153005 8266293 8343232 * @library /test/lib * @modules java.base/sun.security.pkcs * java.base/sun.security.util @@ -244,7 +244,7 @@ public class ParamsPreferences { checkAlg(data, "110c10", EncryptedData); checkAlg(data, "110c110110", certAlg); if (certAlg == PBES2) { - checkAlg(data, "110c11011100", PBKDF2WithHmacSHA1); + checkAlg(data, "110c11011100", PBKDF2); checkAlg(data, "110c1101110130", (KnownOIDs)args[i++]); checkAlg(data, "110c11011110", (KnownOIDs)args[i++]); checkInt(data, "110c110111011", (int) args[i++]); @@ -257,7 +257,7 @@ public class ParamsPreferences { KnownOIDs keyAlg = (KnownOIDs)args[i++]; checkAlg(data, "110c010c01000", keyAlg); if (keyAlg == PBES2) { - checkAlg(data, "110c010c0100100", PBKDF2WithHmacSHA1); + checkAlg(data, "110c010c0100100", PBKDF2); checkAlg(data, "110c010c010010130", (KnownOIDs)args[i++]); checkAlg(data, "110c010c0100110", (KnownOIDs)args[i++]); checkInt(data, "110c010c01001011", (int) args[i++]); From ec059c0e85bc612f430269d9e110dc7ecbdce342 Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen Date: Fri, 31 Oct 2025 21:02:28 +0000 Subject: [PATCH 397/561] 8365880: Shenandoah: Unify memory usage accounting in ShenandoahFreeSet Reviewed-by: wkemper --- .../heuristics/shenandoahGlobalHeuristics.cpp | 6 +- .../heuristics/shenandoahOldHeuristics.cpp | 9 +- .../share/gc/shenandoah/shenandoahFreeSet.cpp | 1807 ++++++++++++++--- .../share/gc/shenandoah/shenandoahFreeSet.hpp | 447 +++- .../share/gc/shenandoah/shenandoahFullGC.cpp | 40 +- .../share/gc/shenandoah/shenandoahFullGC.hpp | 3 +- .../gc/shenandoah/shenandoahGeneration.cpp | 299 ++- .../gc/shenandoah/shenandoahGeneration.hpp | 91 +- .../shenandoah/shenandoahGenerationSizer.cpp | 208 -- .../shenandoah/shenandoahGenerationSizer.hpp | 93 - .../shenandoahGenerationalControlThread.cpp | 10 +- .../shenandoahGenerationalEvacuationTask.cpp | 55 +- .../shenandoahGenerationalFullGC.cpp | 31 +- .../shenandoahGenerationalFullGC.hpp | 14 - .../shenandoah/shenandoahGenerationalHeap.cpp | 94 +- .../shenandoah/shenandoahGenerationalHeap.hpp | 5 +- .../shenandoah/shenandoahGlobalGeneration.cpp | 31 +- .../shenandoah/shenandoahGlobalGeneration.hpp | 20 +- .../share/gc/shenandoah/shenandoahHeap.cpp | 112 +- .../share/gc/shenandoah/shenandoahHeap.hpp | 11 +- .../gc/shenandoah/shenandoahHeapRegion.cpp | 26 +- .../gc/shenandoah/shenandoahHeapRegion.hpp | 5 +- .../shenandoahHeapRegion.inline.hpp | 17 + .../gc/shenandoah/shenandoahMarkBitMap.hpp | 2 +- .../gc/shenandoah/shenandoahMemoryPool.cpp | 10 +- .../share/gc/shenandoah/shenandoahOldGC.cpp | 14 - .../gc/shenandoah/shenandoahOldGeneration.cpp | 64 +- .../gc/shenandoah/shenandoahOldGeneration.hpp | 14 +- .../gc/shenandoah/shenandoahSimpleBitMap.cpp | 2 +- .../gc/shenandoah/shenandoahSimpleBitMap.hpp | 11 +- .../shenandoahSimpleBitMap.inline.hpp | 2 + .../gc/shenandoah/shenandoahVerifier.cpp | 132 +- .../gc/shenandoah/shenandoahVerifier.hpp | 5 +- .../shenandoah/shenandoahYoungGeneration.cpp | 40 +- .../shenandoah/shenandoahYoungGeneration.hpp | 14 +- .../gc/shenandoah/vmStructs_shenandoah.hpp | 8 +- ...Generation.java => ShenandoahFreeSet.java} | 8 +- .../hotspot/gc/shenandoah/ShenandoahHeap.java | 10 +- .../test_shenandoahOldGeneration.cpp | 2 +- .../test_shenandoahOldHeuristic.cpp | 3 +- .../jtreg/gc/shenandoah/TestSieveObjects.java | 15 +- .../mxbeans/TestChurnNotifications.java | 8 +- 42 files changed, 2451 insertions(+), 1347 deletions(-) delete mode 100644 src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.cpp delete mode 100644 src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.hpp rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/{ShenandoahGeneration.java => ShenandoahFreeSet.java} (89%) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp index 93f9b18ad9f..51805b205dd 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahGlobalHeuristics.cpp @@ -88,9 +88,10 @@ void ShenandoahGlobalHeuristics::choose_global_collection_set(ShenandoahCollecti size_t min_garbage = (free_target > actual_free) ? (free_target - actual_free) : 0; log_info(gc, ergo)("Adaptive CSet Selection for GLOBAL. Max Young Evacuation: %zu" - "%s, Max Old Evacuation: %zu%s, Actual Free: %zu%s.", + "%s, Max Old Evacuation: %zu%s, Max Either Evacuation: %zu%s, Actual Free: %zu%s.", byte_size_in_proper_unit(max_young_cset), proper_unit_for_byte_size(max_young_cset), byte_size_in_proper_unit(max_old_cset), proper_unit_for_byte_size(max_old_cset), + byte_size_in_proper_unit(unaffiliated_young_memory), proper_unit_for_byte_size(unaffiliated_young_memory), byte_size_in_proper_unit(actual_free), proper_unit_for_byte_size(actual_free)); for (size_t idx = 0; idx < size; idx++) { @@ -133,9 +134,8 @@ void ShenandoahGlobalHeuristics::choose_global_collection_set(ShenandoahCollecti cset->add_region(r); } } - if (regions_transferred_to_old > 0) { - heap->generation_sizer()->force_transfer_to_old(regions_transferred_to_old); + assert(young_evac_reserve > regions_transferred_to_old * region_size_bytes, "young reserve cannot be negative"); heap->young_generation()->set_evacuation_reserve(young_evac_reserve - regions_transferred_to_old * region_size_bytes); heap->old_generation()->set_evacuation_reserve(old_evac_reserve + regions_transferred_to_old * region_size_bytes); } diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp index e963bcc35bb..1e4d40cfa46 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahOldHeuristics.cpp @@ -606,12 +606,12 @@ void ShenandoahOldHeuristics::set_trigger_if_old_is_fragmented(size_t first_old_ } void ShenandoahOldHeuristics::set_trigger_if_old_is_overgrown() { - size_t old_used = _old_generation->used() + _old_generation->get_humongous_waste(); + // used() includes humongous waste + size_t old_used = _old_generation->used(); size_t trigger_threshold = _old_generation->usage_trigger_threshold(); // Detects unsigned arithmetic underflow assert(old_used <= _heap->capacity(), - "Old used (%zu, %zu) must not be more than heap capacity (%zu)", - _old_generation->used(), _old_generation->get_humongous_waste(), _heap->capacity()); + "Old used (%zu) must not be more than heap capacity (%zu)", _old_generation->used(), _heap->capacity()); if (old_used > trigger_threshold) { _growth_trigger = true; } @@ -683,7 +683,8 @@ bool ShenandoahOldHeuristics::should_start_gc() { if (_growth_trigger) { // Growth may be falsely triggered during mixed evacuations, before the mixed-evacuation candidates have been // evacuated. Before acting on a false trigger, we check to confirm the trigger condition is still satisfied. - const size_t current_usage = _old_generation->used() + _old_generation->get_humongous_waste(); + // _old_generation->used() includes humongous waste. + const size_t current_usage = _old_generation->used(); const size_t trigger_threshold = _old_generation->usage_trigger_threshold(); const size_t heap_size = heap->capacity(); const size_t ignore_threshold = (ShenandoahIgnoreOldGrowthBelowPercentage * heap_size) / 100; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp index 69827d72f44..8dccf5a057c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp @@ -56,7 +56,8 @@ private: ShenandoahRegionPartitions* _partitions; ShenandoahFreeSetPartitionId _partition; public: - explicit ShenandoahLeftRightIterator(ShenandoahRegionPartitions* partitions, ShenandoahFreeSetPartitionId partition, bool use_empty = false) + explicit ShenandoahLeftRightIterator(ShenandoahRegionPartitions* partitions, + ShenandoahFreeSetPartitionId partition, bool use_empty = false) : _idx(0), _end(0), _partitions(partitions), _partition(partition) { _idx = use_empty ? _partitions->leftmost_empty(_partition) : _partitions->leftmost(_partition); _end = use_empty ? _partitions->rightmost_empty(_partition) : _partitions->rightmost(_partition); @@ -87,7 +88,8 @@ private: ShenandoahRegionPartitions* _partitions; ShenandoahFreeSetPartitionId _partition; public: - explicit ShenandoahRightLeftIterator(ShenandoahRegionPartitions* partitions, ShenandoahFreeSetPartitionId partition, bool use_empty = false) + explicit ShenandoahRightLeftIterator(ShenandoahRegionPartitions* partitions, + ShenandoahFreeSetPartitionId partition, bool use_empty = false) : _idx(0), _end(0), _partitions(partitions), _partition(partition) { _idx = use_empty ? _partitions->rightmost_empty(_partition) : _partitions->rightmost(_partition); _end = use_empty ? _partitions->leftmost_empty(_partition) : _partitions->leftmost(_partition); @@ -166,9 +168,61 @@ ShenandoahRegionPartitions::ShenandoahRegionPartitions(size_t max_regions, Shena _free_set(free_set), _membership{ ShenandoahSimpleBitMap(max_regions), ShenandoahSimpleBitMap(max_regions) , ShenandoahSimpleBitMap(max_regions) } { + initialize_old_collector(); make_all_regions_unavailable(); } +void ShenandoahFreeSet::account_for_pip_regions(size_t mutator_regions, size_t mutator_bytes, + size_t collector_regions, size_t collector_bytes) { + shenandoah_assert_heaplocked(); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + + // We have removed all of these regions from their respective partition. Each pip region is "in" the NotFree partition. + // We want to account for all pip pad memory as if it had been consumed from within the Mutator partition. + // + // After we finish promote in place, the pad memory will be deallocated and made available within the OldCollector + // region. At that time, we will transfer the used memory from the Mutator partition to the OldCollector parttion, + // and then we will unallocate the pad memory. + + + _partitions.decrease_region_counts(ShenandoahFreeSetPartitionId::Mutator, mutator_regions); + _partitions.decrease_region_counts(ShenandoahFreeSetPartitionId::Collector, collector_regions); + + // Increase used by remnant fill objects placed in both Mutator and Collector partitions + _partitions.increase_used(ShenandoahFreeSetPartitionId::Mutator, mutator_bytes); + _partitions.increase_used(ShenandoahFreeSetPartitionId::Collector, collector_bytes); + + // Now transfer all of the memory contained within Collector pip regions from the Collector to the Mutator. + // Each of these regions is treated as fully used, even though some of the region's memory may be artifically used, + // to be recycled and put into allocatable OldCollector partition after the region has been promoted in place. + _partitions.transfer_used_capacity_from_to(ShenandoahFreeSetPartitionId::Collector, ShenandoahFreeSetPartitionId::Mutator, + collector_regions); + + // Conservatively, act as if we've promoted from both Mutator and Collector partitions + recompute_total_affiliated(); + recompute_total_young_used(); + recompute_total_global_used(); +} + +ShenandoahFreeSetPartitionId ShenandoahFreeSet::prepare_to_promote_in_place(size_t idx, size_t bytes) { + shenandoah_assert_heaplocked(); + size_t min_remnant_size = PLAB::min_size() * HeapWordSize; + ShenandoahFreeSetPartitionId p = _partitions.membership(idx); + if (bytes >= min_remnant_size) { + assert((p == ShenandoahFreeSetPartitionId::Mutator) || (p == ShenandoahFreeSetPartitionId::Collector), + "PIP region must be associated with young"); + _partitions.raw_clear_membership(idx, p); + } else { + assert(p == ShenandoahFreeSetPartitionId::NotFree, "We did not fill this region and do not need to adjust used"); + } + return p; +} + inline bool ShenandoahFreeSet::can_allocate_from(ShenandoahHeapRegion *r) const { return r->is_empty() || (r->is_trash() && !_heap->is_concurrent_weak_root_in_progress()); } @@ -196,6 +250,54 @@ inline bool ShenandoahFreeSet::has_alloc_capacity(ShenandoahHeapRegion *r) const return alloc_capacity(r) > 0; } +// This is used for unit testing. Do not use in production code. +void ShenandoahFreeSet::resize_old_collector_capacity(size_t regions) { + shenandoah_assert_heaplocked(); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + size_t original_old_regions = _partitions.get_capacity(ShenandoahFreeSetPartitionId::OldCollector) / region_size_bytes; + size_t unaffiliated_mutator_regions = _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator); + size_t unaffiliated_collector_regions = _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::Collector); + size_t unaffiliated_old_collector_regions = _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::OldCollector); + if (regions > original_old_regions) { + size_t regions_to_transfer = regions - original_old_regions; + if (regions_to_transfer <= unaffiliated_mutator_regions + unaffiliated_collector_regions) { + size_t regions_from_mutator = + (regions_to_transfer > unaffiliated_mutator_regions)? unaffiliated_mutator_regions: regions_to_transfer; + regions_to_transfer -= regions_from_mutator; + size_t regions_from_collector = regions_to_transfer; + if (regions_from_mutator > 0) { + transfer_empty_regions_from_to(ShenandoahFreeSetPartitionId::Mutator, ShenandoahFreeSetPartitionId::OldCollector, + regions_from_mutator); + } + if (regions_from_collector > 0) { + transfer_empty_regions_from_to(ShenandoahFreeSetPartitionId::Collector, ShenandoahFreeSetPartitionId::OldCollector, + regions_from_mutator); + } + } else { + fatal("Could not resize old for unit test"); + } + } else if (regions < original_old_regions) { + size_t regions_to_transfer = original_old_regions - regions; + if (regions_to_transfer <= unaffiliated_old_collector_regions) { + transfer_empty_regions_from_to(ShenandoahFreeSetPartitionId::OldCollector, ShenandoahFreeSetPartitionId::Mutator, + regions_to_transfer); + } else { + fatal("Could not resize old for unit test"); + } + } + // else, old generation is already appropriately sized +} + +void ShenandoahFreeSet::reset_bytes_allocated_since_gc_start(size_t initial_bytes_allocated) { + shenandoah_assert_heaplocked(); + _mutator_bytes_allocated_since_gc_start = initial_bytes_allocated; +} + +void ShenandoahFreeSet::increase_bytes_allocated(size_t bytes) { + shenandoah_assert_heaplocked(); + _mutator_bytes_allocated_since_gc_start += bytes; +} + inline idx_t ShenandoahRegionPartitions::leftmost(ShenandoahFreeSetPartitionId which_partition) const { assert (which_partition < NumPartitions, "selected free partition must be valid"); idx_t idx = _leftmosts[int(which_partition)]; @@ -218,6 +320,12 @@ inline idx_t ShenandoahRegionPartitions::rightmost(ShenandoahFreeSetPartitionId return idx; } +void ShenandoahRegionPartitions::initialize_old_collector() { + _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] = 0; + _region_counts[int(ShenandoahFreeSetPartitionId::OldCollector)] = 0; + _empty_region_counts[int(ShenandoahFreeSetPartitionId::OldCollector)] = 0; +} + void ShenandoahRegionPartitions::make_all_regions_unavailable() { shenandoah_assert_heaplocked(); for (size_t partition_id = 0; partition_id < IntNumPartitions; partition_id++) { @@ -227,15 +335,19 @@ void ShenandoahRegionPartitions::make_all_regions_unavailable() { _leftmosts_empty[partition_id] = _max; _rightmosts_empty[partition_id] = -1;; _capacity[partition_id] = 0; + _region_counts[partition_id] = 0; + _empty_region_counts[partition_id] = 0; _used[partition_id] = 0; + _humongous_waste[partition_id] = 0; _available[partition_id] = FreeSetUnderConstruction; } - _region_counts[int(ShenandoahFreeSetPartitionId::Mutator)] = _region_counts[int(ShenandoahFreeSetPartitionId::Collector)] = 0; } void ShenandoahRegionPartitions::establish_mutator_intervals(idx_t mutator_leftmost, idx_t mutator_rightmost, idx_t mutator_leftmost_empty, idx_t mutator_rightmost_empty, - size_t mutator_region_count, size_t mutator_used) { + size_t total_mutator_regions, size_t empty_mutator_regions, + size_t mutator_region_count, size_t mutator_used, + size_t mutator_humongous_waste_bytes) { shenandoah_assert_heaplocked(); _leftmosts[int(ShenandoahFreeSetPartitionId::Mutator)] = mutator_leftmost; @@ -245,10 +357,13 @@ void ShenandoahRegionPartitions::establish_mutator_intervals(idx_t mutator_leftm _region_counts[int(ShenandoahFreeSetPartitionId::Mutator)] = mutator_region_count; _used[int(ShenandoahFreeSetPartitionId::Mutator)] = mutator_used; - _capacity[int(ShenandoahFreeSetPartitionId::Mutator)] = mutator_region_count * _region_size_bytes; + _capacity[int(ShenandoahFreeSetPartitionId::Mutator)] = total_mutator_regions * _region_size_bytes; + _humongous_waste[int(ShenandoahFreeSetPartitionId::Mutator)] = mutator_humongous_waste_bytes; _available[int(ShenandoahFreeSetPartitionId::Mutator)] = _capacity[int(ShenandoahFreeSetPartitionId::Mutator)] - _used[int(ShenandoahFreeSetPartitionId::Mutator)]; + _empty_region_counts[int(ShenandoahFreeSetPartitionId::Mutator)] = empty_mutator_regions; + _leftmosts[int(ShenandoahFreeSetPartitionId::Collector)] = _max; _rightmosts[int(ShenandoahFreeSetPartitionId::Collector)] = -1; _leftmosts_empty[int(ShenandoahFreeSetPartitionId::Collector)] = _max; @@ -257,13 +372,20 @@ void ShenandoahRegionPartitions::establish_mutator_intervals(idx_t mutator_leftm _region_counts[int(ShenandoahFreeSetPartitionId::Collector)] = 0; _used[int(ShenandoahFreeSetPartitionId::Collector)] = 0; _capacity[int(ShenandoahFreeSetPartitionId::Collector)] = 0; + _humongous_waste[int(ShenandoahFreeSetPartitionId::Collector)] = 0; _available[int(ShenandoahFreeSetPartitionId::Collector)] = 0; + + _empty_region_counts[int(ShenandoahFreeSetPartitionId::Collector)] = 0; } -void ShenandoahRegionPartitions::establish_old_collector_intervals(idx_t old_collector_leftmost, idx_t old_collector_rightmost, +void ShenandoahRegionPartitions::establish_old_collector_intervals(idx_t old_collector_leftmost, + idx_t old_collector_rightmost, idx_t old_collector_leftmost_empty, idx_t old_collector_rightmost_empty, - size_t old_collector_region_count, size_t old_collector_used) { + size_t total_old_collector_region_count, + size_t old_collector_empty, size_t old_collector_regions, + size_t old_collector_used, + size_t old_collector_humongous_waste_bytes) { shenandoah_assert_heaplocked(); _leftmosts[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_leftmost; @@ -271,11 +393,14 @@ void ShenandoahRegionPartitions::establish_old_collector_intervals(idx_t old_col _leftmosts_empty[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_leftmost_empty; _rightmosts_empty[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_rightmost_empty; - _region_counts[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_region_count; + _region_counts[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_regions; _used[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_used; - _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_region_count * _region_size_bytes; + _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] = total_old_collector_region_count * _region_size_bytes; + _humongous_waste[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_humongous_waste_bytes; _available[int(ShenandoahFreeSetPartitionId::OldCollector)] = _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] - _used[int(ShenandoahFreeSetPartitionId::OldCollector)]; + + _empty_region_counts[int(ShenandoahFreeSetPartitionId::OldCollector)] = old_collector_empty; } void ShenandoahRegionPartitions::increase_used(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { @@ -289,15 +414,125 @@ void ShenandoahRegionPartitions::increase_used(ShenandoahFreeSetPartitionId whic _used[int(which_partition)], _capacity[int(which_partition)], bytes); } -inline void ShenandoahRegionPartitions::shrink_interval_if_range_modifies_either_boundary( - ShenandoahFreeSetPartitionId partition, idx_t low_idx, idx_t high_idx) { +void ShenandoahRegionPartitions::decrease_used(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + assert (_used[int(which_partition)] >= bytes, "Must not use less than zero after decrease"); + _used[int(which_partition)] -= bytes; + _available[int(which_partition)] += bytes; +} + +void ShenandoahRegionPartitions::increase_humongous_waste(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + _humongous_waste[int(which_partition)] += bytes; +} + +size_t ShenandoahRegionPartitions::get_humongous_waste(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "Partition must be valid"); + return _humongous_waste[int(which_partition)];; +} + +void ShenandoahRegionPartitions::set_capacity_of(ShenandoahFreeSetPartitionId which_partition, size_t value) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "selected free set must be valid"); + _capacity[int(which_partition)] = value; + _available[int(which_partition)] = value - _used[int(which_partition)]; +} + + +void ShenandoahRegionPartitions::increase_capacity(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + _capacity[int(which_partition)] += bytes; + _available[int(which_partition)] += bytes; +} + +void ShenandoahRegionPartitions::transfer_used_capacity_from_to(ShenandoahFreeSetPartitionId from_partition, + ShenandoahFreeSetPartitionId to_partition, size_t regions) { + shenandoah_assert_heaplocked(); + size_t bytes = regions * ShenandoahHeapRegion::region_size_bytes(); + assert (from_partition < NumPartitions, "Partition must be valid"); + assert (to_partition < NumPartitions, "Partition must be valid"); + assert(_capacity[int(from_partition)] >= bytes, "Cannot remove more capacity bytes than are present"); + assert(_used[int(from_partition)] >= bytes, "Cannot transfer used bytes that are not used"); + + // available is unaffected by transfer + _capacity[int(from_partition)] -= bytes; + _used[int(from_partition)] -= bytes; + _capacity[int(to_partition)] += bytes; + _used[int(to_partition)] += bytes; +} + +void ShenandoahRegionPartitions::decrease_capacity(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + assert(_capacity[int(which_partition)] >= bytes, "Cannot remove more capacity bytes than are present"); + assert(_available[int(which_partition)] >= bytes, "Cannot shrink capacity unless capacity is unused"); + _capacity[int(which_partition)] -= bytes; + _available[int(which_partition)] -= bytes; +} + +void ShenandoahRegionPartitions::increase_available(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + _available[int(which_partition)] += bytes; +} + +void ShenandoahRegionPartitions::decrease_available(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + assert(_available[int(which_partition)] >= bytes, "Cannot remove more available bytes than are present"); + _available[int(which_partition)] -= bytes; +} + +size_t ShenandoahRegionPartitions::get_available(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "Partition must be valid"); + return _available[int(which_partition)];; +} + +void ShenandoahRegionPartitions::increase_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions) { + _region_counts[int(which_partition)] += regions; +} + +void ShenandoahRegionPartitions::decrease_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions) { + assert(_region_counts[int(which_partition)] >= regions, "Cannot remove more regions than are present"); + _region_counts[int(which_partition)] -= regions; +} + +void ShenandoahRegionPartitions::increase_empty_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions) { + _empty_region_counts[int(which_partition)] += regions; +} + +void ShenandoahRegionPartitions::decrease_empty_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions) { + assert(_empty_region_counts[int(which_partition)] >= regions, "Cannot remove more regions than are present"); + _empty_region_counts[int(which_partition)] -= regions; +} + +void ShenandoahRegionPartitions::one_region_is_no_longer_empty(ShenandoahFreeSetPartitionId partition) { + decrease_empty_region_counts(partition, (size_t) 1); +} + +// All members of partition between low_idx and high_idx inclusive have been removed. +void ShenandoahRegionPartitions::shrink_interval_if_range_modifies_either_boundary( + ShenandoahFreeSetPartitionId partition, idx_t low_idx, idx_t high_idx, size_t num_regions) { assert((low_idx <= high_idx) && (low_idx >= 0) && (high_idx < _max), "Range must span legal index values"); + size_t span = high_idx + 1 - low_idx; + bool regions_are_contiguous = (span == num_regions); if (low_idx == leftmost(partition)) { assert (!_membership[int(partition)].is_set(low_idx), "Do not shrink interval if region not removed"); if (high_idx + 1 == _max) { - _leftmosts[int(partition)] = _max; + if (regions_are_contiguous) { + _leftmosts[int(partition)] = _max; + } else { + _leftmosts[int(partition)] = find_index_of_next_available_region(partition, low_idx + 1); + } } else { - _leftmosts[int(partition)] = find_index_of_next_available_region(partition, high_idx + 1); + if (regions_are_contiguous) { + _leftmosts[int(partition)] = find_index_of_next_available_region(partition, high_idx + 1); + } else { + _leftmosts[int(partition)] = find_index_of_next_available_region(partition, low_idx + 1); + } } if (_leftmosts_empty[int(partition)] < _leftmosts[int(partition)]) { // This gets us closer to where we need to be; we'll scan further when leftmosts_empty is requested. @@ -307,9 +542,17 @@ inline void ShenandoahRegionPartitions::shrink_interval_if_range_modifies_either if (high_idx == _rightmosts[int(partition)]) { assert (!_membership[int(partition)].is_set(high_idx), "Do not shrink interval if region not removed"); if (low_idx == 0) { - _rightmosts[int(partition)] = -1; + if (regions_are_contiguous) { + _rightmosts[int(partition)] = -1; + } else { + _rightmosts[int(partition)] = find_index_of_previous_available_region(partition, high_idx - 1); + } } else { - _rightmosts[int(partition)] = find_index_of_previous_available_region(partition, low_idx - 1); + if (regions_are_contiguous) { + _rightmosts[int(partition)] = find_index_of_previous_available_region(partition, low_idx - 1); + } else { + _rightmosts[int(partition)] = find_index_of_previous_available_region(partition, high_idx - 1); + } } if (_rightmosts_empty[int(partition)] > _rightmosts[int(partition)]) { // This gets us closer to where we need to be; we'll scan further when rightmosts_empty is requested. @@ -324,12 +567,55 @@ inline void ShenandoahRegionPartitions::shrink_interval_if_range_modifies_either } } -inline void ShenandoahRegionPartitions::shrink_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, idx_t idx) { - shrink_interval_if_range_modifies_either_boundary(partition, idx, idx); +void ShenandoahRegionPartitions::establish_interval(ShenandoahFreeSetPartitionId partition, idx_t low_idx, + idx_t high_idx, idx_t low_empty_idx, idx_t high_empty_idx) { +#ifdef ASSERT + assert (partition < NumPartitions, "invalid partition"); + if (low_idx != max()) { + assert((low_idx <= high_idx) && (low_idx >= 0) && (high_idx < _max), "Range must span legal index values"); + assert (in_free_set(partition, low_idx), "Must be in partition of established interval"); + assert (in_free_set(partition, high_idx), "Must be in partition of established interval"); + } + if (low_empty_idx != max()) { + ShenandoahHeapRegion* r = ShenandoahHeap::heap()->get_region(low_empty_idx); + assert (in_free_set(partition, low_empty_idx) && (r->is_trash() || r->free() == _region_size_bytes), + "Must be empty and in partition of established interval"); + r = ShenandoahHeap::heap()->get_region(high_empty_idx); + assert (in_free_set(partition, high_empty_idx), "Must be in partition of established interval"); + } +#endif + + _leftmosts[int(partition)] = low_idx; + _rightmosts[int(partition)] = high_idx; + _leftmosts_empty[int(partition)] = low_empty_idx; + _rightmosts_empty[int(partition)] = high_empty_idx; } -inline void ShenandoahRegionPartitions::expand_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, - idx_t idx, size_t region_available) { +inline void ShenandoahRegionPartitions::shrink_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, + idx_t idx) { + shrink_interval_if_range_modifies_either_boundary(partition, idx, idx, 1); +} + +// Some members of partition between low_idx and high_idx inclusive have been added. +void ShenandoahRegionPartitions:: +expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId partition, idx_t low_idx, idx_t high_idx, + idx_t low_empty_idx, idx_t high_empty_idx) { + if (_leftmosts[int(partition)] > low_idx) { + _leftmosts[int(partition)] = low_idx; + } + if (_rightmosts[int(partition)] < high_idx) { + _rightmosts[int(partition)] = high_idx; + } + if (_leftmosts_empty[int(partition)] > low_empty_idx) { + _leftmosts_empty[int(partition)] = low_empty_idx; + } + if (_rightmosts_empty[int(partition)] < high_empty_idx) { + _rightmosts_empty[int(partition)] = high_empty_idx; + } +} + +void ShenandoahRegionPartitions::expand_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, + idx_t idx, size_t region_available) { if (_leftmosts[int(partition)] > idx) { _leftmosts[int(partition)] = idx; } @@ -355,15 +641,23 @@ void ShenandoahRegionPartitions::retire_range_from_partition( assert (partition < NumPartitions, "Cannot remove from free partitions if not already free"); for (idx_t idx = low_idx; idx <= high_idx; idx++) { +#ifdef ASSERT + ShenandoahHeapRegion* r = ShenandoahHeap::heap()->get_region(idx); assert (in_free_set(partition, idx), "Must be in partition to remove from partition"); + assert(r->is_empty() || r->is_trash(), "Region must be empty or trash"); +#endif _membership[int(partition)].clear_bit(idx); } - _region_counts[int(partition)] -= high_idx + 1 - low_idx; - shrink_interval_if_range_modifies_either_boundary(partition, low_idx, high_idx); + size_t num_regions = high_idx + 1 - low_idx; + decrease_region_counts(partition, num_regions); + decrease_empty_region_counts(partition, num_regions); + shrink_interval_if_range_modifies_either_boundary(partition, low_idx, high_idx, num_regions); } -void ShenandoahRegionPartitions::retire_from_partition(ShenandoahFreeSetPartitionId partition, idx_t idx, size_t used_bytes) { +size_t ShenandoahRegionPartitions::retire_from_partition(ShenandoahFreeSetPartitionId partition, + idx_t idx, size_t used_bytes) { + size_t waste_bytes = 0; // Note: we may remove from free partition even if region is not entirely full, such as when available < PLAB::min_size() assert (idx < _max, "index is sane: %zu < %zu", idx, _max); assert (partition < NumPartitions, "Cannot remove from free partitions if not already free"); @@ -371,13 +665,28 @@ void ShenandoahRegionPartitions::retire_from_partition(ShenandoahFreeSetPartitio if (used_bytes < _region_size_bytes) { // Count the alignment pad remnant of memory as used when we retire this region - increase_used(partition, _region_size_bytes - used_bytes); + size_t fill_padding = _region_size_bytes - used_bytes; + waste_bytes = fill_padding; + increase_used(partition, fill_padding); } _membership[int(partition)].clear_bit(idx); + decrease_region_counts(partition, 1); shrink_interval_if_boundary_modified(partition, idx); - _region_counts[int(partition)]--; + + // This region is fully used, whether or not top() equals end(). It + // is retired and no more memory will be allocated from within it. + + return waste_bytes; } +void ShenandoahRegionPartitions::unretire_to_partition(ShenandoahHeapRegion* r, ShenandoahFreeSetPartitionId which_partition) { + shenandoah_assert_heaplocked(); + make_free(r->index(), which_partition, r->free()); +} + + +// The caller is responsible for increasing capacity and available and used in which_partition, and decreasing the +// same quantities for the original partition void ShenandoahRegionPartitions::make_free(idx_t idx, ShenandoahFreeSetPartitionId which_partition, size_t available) { shenandoah_assert_heaplocked(); assert (idx < _max, "index is sane: %zu < %zu", idx, _max); @@ -386,11 +695,7 @@ void ShenandoahRegionPartitions::make_free(idx_t idx, ShenandoahFreeSetPartition assert (available <= _region_size_bytes, "Available cannot exceed region size"); _membership[int(which_partition)].set_bit(idx); - _capacity[int(which_partition)] += _region_size_bytes; - _used[int(which_partition)] += _region_size_bytes - available; - _available[int(which_partition)] += available; expand_interval_if_boundary_modified(which_partition, idx, available); - _region_counts[int(which_partition)]++; } bool ShenandoahRegionPartitions::is_mutator_partition(ShenandoahFreeSetPartitionId p) { @@ -409,9 +714,10 @@ bool ShenandoahRegionPartitions::available_implies_empty(size_t available_in_reg return (available_in_region == _region_size_bytes); } - -void ShenandoahRegionPartitions::move_from_partition_to_partition(idx_t idx, ShenandoahFreeSetPartitionId orig_partition, - ShenandoahFreeSetPartitionId new_partition, size_t available) { +// Do not adjust capacities, available, or used. Return used delta. +size_t ShenandoahRegionPartitions:: +move_from_partition_to_partition_with_deferred_accounting(idx_t idx, ShenandoahFreeSetPartitionId orig_partition, + ShenandoahFreeSetPartitionId new_partition, size_t available) { ShenandoahHeapRegion* r = ShenandoahHeap::heap()->get_region(idx); shenandoah_assert_heaplocked(); assert (idx < _max, "index is sane: %zu < %zu", idx, _max); @@ -449,37 +755,37 @@ void ShenandoahRegionPartitions::move_from_partition_to_partition(idx_t idx, She _membership[int(orig_partition)].clear_bit(idx); _membership[int(new_partition)].set_bit(idx); + return used; +} +void ShenandoahRegionPartitions::move_from_partition_to_partition(idx_t idx, ShenandoahFreeSetPartitionId orig_partition, + ShenandoahFreeSetPartitionId new_partition, size_t available) { + size_t used = move_from_partition_to_partition_with_deferred_accounting(idx, orig_partition, new_partition, available); + + // We decreased used, which increases available, but then we decrease available by full region size below + decrease_used(orig_partition, used); + _region_counts[int(orig_partition)]--; _capacity[int(orig_partition)] -= _region_size_bytes; - _used[int(orig_partition)] -= used; - _available[int(orig_partition)] -= available; + _available[int(orig_partition)] -= _region_size_bytes; shrink_interval_if_boundary_modified(orig_partition, idx); - _capacity[int(new_partition)] += _region_size_bytes;; - _used[int(new_partition)] += used; - _available[int(new_partition)] += available; + _capacity[int(new_partition)] += _region_size_bytes; + _available[int(new_partition)] += _region_size_bytes; + _region_counts[int(new_partition)]++; + // We increased availableby full region size above, but decrease it by used within this region now. + increase_used(new_partition, used); expand_interval_if_boundary_modified(new_partition, idx, available); - _region_counts[int(orig_partition)]--; - _region_counts[int(new_partition)]++; + if (available == _region_size_bytes) { + _empty_region_counts[int(orig_partition)]--; + _empty_region_counts[int(new_partition)]++; + } } const char* ShenandoahRegionPartitions::partition_membership_name(idx_t idx) const { return partition_name(membership(idx)); } -inline ShenandoahFreeSetPartitionId ShenandoahRegionPartitions::membership(idx_t idx) const { - assert (idx < _max, "index is sane: %zu < %zu", idx, _max); - ShenandoahFreeSetPartitionId result = ShenandoahFreeSetPartitionId::NotFree; - for (uint partition_id = 0; partition_id < UIntNumPartitions; partition_id++) { - if (_membership[partition_id].is_set(idx)) { - assert(result == ShenandoahFreeSetPartitionId::NotFree, "Region should reside in only one partition"); - result = (ShenandoahFreeSetPartitionId) partition_id; - } - } - return result; -} - #ifdef ASSERT inline bool ShenandoahRegionPartitions::partition_id_matches(idx_t idx, ShenandoahFreeSetPartitionId test_partition) const { assert (idx < _max, "index is sane: %zu < %zu", idx, _max); @@ -532,7 +838,8 @@ inline idx_t ShenandoahRegionPartitions::find_index_of_next_available_cluster_of idx_t rightmost_idx = rightmost(which_partition); idx_t leftmost_idx = leftmost(which_partition); if ((rightmost_idx < leftmost_idx) || (start_index > rightmost_idx)) return _max; - idx_t result = _membership[int(which_partition)].find_first_consecutive_set_bits(start_index, rightmost_idx + 1, cluster_size); + idx_t result = + _membership[int(which_partition)].find_first_consecutive_set_bits(start_index, rightmost_idx + 1, cluster_size); if (result > rightmost_idx) { result = _max; } @@ -594,7 +901,19 @@ idx_t ShenandoahRegionPartitions::rightmost_empty(ShenandoahFreeSetPartitionId w #ifdef ASSERT -void ShenandoahRegionPartitions::assert_bounds() { +void ShenandoahRegionPartitions::assert_bounds(bool validate_totals) { + + size_t capacities[UIntNumPartitions]; + size_t used[UIntNumPartitions]; + size_t regions[UIntNumPartitions]; + size_t humongous_waste[UIntNumPartitions]; + + // We don't know whether young retired regions belonged to Mutator or Collector before they were retired. + // We just tally the total, and divide it to make matches work if possible. + size_t young_retired_regions = 0; + size_t young_retired_used = 0; + size_t young_retired_capacity = 0; + size_t young_humongous_waste = 0; idx_t leftmosts[UIntNumPartitions]; idx_t rightmosts[UIntNumPartitions]; @@ -606,21 +925,64 @@ void ShenandoahRegionPartitions::assert_bounds() { empty_leftmosts[i] = _max; rightmosts[i] = -1; empty_rightmosts[i] = -1; + capacities[i] = 0; + used[i] = 0; + regions[i] = 0; + humongous_waste[i] = 0; } for (idx_t i = 0; i < _max; i++) { ShenandoahFreeSetPartitionId partition = membership(i); + size_t capacity = _free_set->alloc_capacity(i); switch (partition) { case ShenandoahFreeSetPartitionId::NotFree: - break; + { + assert(!validate_totals || (capacity != _region_size_bytes), "Should not be retired if empty"); + ShenandoahHeapRegion* r = ShenandoahHeap::heap()->get_region(i); + if (r->is_humongous()) { + if (r->is_old()) { + regions[int(ShenandoahFreeSetPartitionId::OldCollector)]++; + used[int(ShenandoahFreeSetPartitionId::OldCollector)] += _region_size_bytes; + capacities[int(ShenandoahFreeSetPartitionId::OldCollector)] += _region_size_bytes; + humongous_waste[int(ShenandoahFreeSetPartitionId::OldCollector)] += capacity; + } else { + assert(r->is_young(), "Must be young if not old"); + young_retired_regions++; + // Count entire region as used even if there is some waste. + young_retired_used += _region_size_bytes; + young_retired_capacity += _region_size_bytes; + young_humongous_waste += capacity; + } + } else { + assert(r->is_cset() || (capacity < PLAB::min_size() * HeapWordSize), + "Expect retired remnant size to be smaller than min plab size"); + // This region has been retired already or it is in the cset. In either case, we set capacity to zero + // so that the entire region will be counted as used. We count young cset regions as "retired". + capacity = 0; + if (r->is_old()) { + regions[int(ShenandoahFreeSetPartitionId::OldCollector)]++; + used[int(ShenandoahFreeSetPartitionId::OldCollector)] += _region_size_bytes - capacity; + capacities[int(ShenandoahFreeSetPartitionId::OldCollector)] += _region_size_bytes; + } else { + assert(r->is_young(), "Must be young if not old"); + young_retired_regions++; + young_retired_used += _region_size_bytes - capacity; + young_retired_capacity += _region_size_bytes; + } + } + } + break; case ShenandoahFreeSetPartitionId::Mutator: case ShenandoahFreeSetPartitionId::Collector: case ShenandoahFreeSetPartitionId::OldCollector: { - size_t capacity = _free_set->alloc_capacity(i); - bool is_empty = (capacity == _region_size_bytes); assert(capacity > 0, "free regions must have allocation capacity"); + bool is_empty = (capacity == _region_size_bytes); + regions[int(partition)]++; + used[int(partition)] += _region_size_bytes - capacity; + capacities[int(partition)] += _region_size_bytes; + if (i < leftmosts[int(partition)]) { leftmosts[int(partition)] = i; } @@ -659,19 +1021,19 @@ void ShenandoahRegionPartitions::assert_bounds() { idx_t beg_off = leftmosts[int(ShenandoahFreeSetPartitionId::Mutator)]; idx_t end_off = rightmosts[int(ShenandoahFreeSetPartitionId::Mutator)]; assert (beg_off >= leftmost(ShenandoahFreeSetPartitionId::Mutator), - "free regions before the leftmost: %zd, bound %zd", + "Mutator free regions before the leftmost: %zd, bound %zd", beg_off, leftmost(ShenandoahFreeSetPartitionId::Mutator)); assert (end_off <= rightmost(ShenandoahFreeSetPartitionId::Mutator), - "free regions past the rightmost: %zd, bound %zd", + "Mutator free regions past the rightmost: %zd, bound %zd", end_off, rightmost(ShenandoahFreeSetPartitionId::Mutator)); beg_off = empty_leftmosts[int(ShenandoahFreeSetPartitionId::Mutator)]; end_off = empty_rightmosts[int(ShenandoahFreeSetPartitionId::Mutator)]; assert (beg_off >= leftmost_empty(ShenandoahFreeSetPartitionId::Mutator), - "free empty regions before the leftmost: %zd, bound %zd", + "Mutator free empty regions before the leftmost: %zd, bound %zd", beg_off, leftmost_empty(ShenandoahFreeSetPartitionId::Mutator)); assert (end_off <= rightmost_empty(ShenandoahFreeSetPartitionId::Mutator), - "free empty regions past the rightmost: %zd, bound %zd", + "Mutator free empty regions past the rightmost: %zd, bound %zd", end_off, rightmost_empty(ShenandoahFreeSetPartitionId::Mutator)); // Performance invariants. Failing these would not break the free partition, but performance would suffer. @@ -682,87 +1044,225 @@ void ShenandoahRegionPartitions::assert_bounds() { assert (leftmost(ShenandoahFreeSetPartitionId::Collector) == _max || partition_id_matches(leftmost(ShenandoahFreeSetPartitionId::Collector), ShenandoahFreeSetPartitionId::Collector), - "leftmost region should be free: %zd", leftmost(ShenandoahFreeSetPartitionId::Collector)); + "Collector leftmost region should be free: %zd", leftmost(ShenandoahFreeSetPartitionId::Collector)); assert (leftmost(ShenandoahFreeSetPartitionId::Collector) == _max || partition_id_matches(rightmost(ShenandoahFreeSetPartitionId::Collector), ShenandoahFreeSetPartitionId::Collector), - "rightmost region should be free: %zd", rightmost(ShenandoahFreeSetPartitionId::Collector)); + "Collector rightmost region should be free: %zd", rightmost(ShenandoahFreeSetPartitionId::Collector)); // If Collector partition is empty, leftmosts will both equal max, rightmosts will both equal zero. // Likewise for empty region partitions. beg_off = leftmosts[int(ShenandoahFreeSetPartitionId::Collector)]; end_off = rightmosts[int(ShenandoahFreeSetPartitionId::Collector)]; assert (beg_off >= leftmost(ShenandoahFreeSetPartitionId::Collector), - "free regions before the leftmost: %zd, bound %zd", + "Collector free regions before the leftmost: %zd, bound %zd", beg_off, leftmost(ShenandoahFreeSetPartitionId::Collector)); assert (end_off <= rightmost(ShenandoahFreeSetPartitionId::Collector), - "free regions past the rightmost: %zd, bound %zd", + "Collector free regions past the rightmost: %zd, bound %zd", end_off, rightmost(ShenandoahFreeSetPartitionId::Collector)); beg_off = empty_leftmosts[int(ShenandoahFreeSetPartitionId::Collector)]; end_off = empty_rightmosts[int(ShenandoahFreeSetPartitionId::Collector)]; assert (beg_off >= _leftmosts_empty[int(ShenandoahFreeSetPartitionId::Collector)], - "free empty regions before the leftmost: %zd, bound %zd", + "Collector free empty regions before the leftmost: %zd, bound %zd", beg_off, leftmost_empty(ShenandoahFreeSetPartitionId::Collector)); assert (end_off <= _rightmosts_empty[int(ShenandoahFreeSetPartitionId::Collector)], - "free empty regions past the rightmost: %zd, bound %zd", + "Collector free empty regions past the rightmost: %zd, bound %zd", end_off, rightmost_empty(ShenandoahFreeSetPartitionId::Collector)); // Performance invariants. Failing these would not break the free partition, but performance would suffer. - assert (leftmost(ShenandoahFreeSetPartitionId::OldCollector) <= _max, "leftmost in bounds: %zd < %zd", + assert (leftmost(ShenandoahFreeSetPartitionId::OldCollector) <= _max, "OldCollector leftmost in bounds: %zd < %zd", leftmost(ShenandoahFreeSetPartitionId::OldCollector), _max); - assert (rightmost(ShenandoahFreeSetPartitionId::OldCollector) < _max, "rightmost in bounds: %zd < %zd", + assert (rightmost(ShenandoahFreeSetPartitionId::OldCollector) < _max, "OldCollector rightmost in bounds: %zd < %zd", rightmost(ShenandoahFreeSetPartitionId::OldCollector), _max); assert (leftmost(ShenandoahFreeSetPartitionId::OldCollector) == _max || partition_id_matches(leftmost(ShenandoahFreeSetPartitionId::OldCollector), ShenandoahFreeSetPartitionId::OldCollector), - "leftmost region should be free: %zd", leftmost(ShenandoahFreeSetPartitionId::OldCollector)); + "OldCollector leftmost region should be free: %zd", leftmost(ShenandoahFreeSetPartitionId::OldCollector)); assert (leftmost(ShenandoahFreeSetPartitionId::OldCollector) == _max || partition_id_matches(rightmost(ShenandoahFreeSetPartitionId::OldCollector), ShenandoahFreeSetPartitionId::OldCollector), - "rightmost region should be free: %zd", rightmost(ShenandoahFreeSetPartitionId::OldCollector)); + "OldCollector rightmost region should be free: %zd", rightmost(ShenandoahFreeSetPartitionId::OldCollector)); // If OldCollector partition is empty, leftmosts will both equal max, rightmosts will both equal zero. // Likewise for empty region partitions. beg_off = leftmosts[int(ShenandoahFreeSetPartitionId::OldCollector)]; end_off = rightmosts[int(ShenandoahFreeSetPartitionId::OldCollector)]; assert (beg_off >= leftmost(ShenandoahFreeSetPartitionId::OldCollector), - "free regions before the leftmost: %zd, bound %zd", + "OldCollector free regions before the leftmost: %zd, bound %zd", beg_off, leftmost(ShenandoahFreeSetPartitionId::OldCollector)); assert (end_off <= rightmost(ShenandoahFreeSetPartitionId::OldCollector), - "free regions past the rightmost: %zd, bound %zd", + "OldCollector free regions past the rightmost: %zd, bound %zd", end_off, rightmost(ShenandoahFreeSetPartitionId::OldCollector)); beg_off = empty_leftmosts[int(ShenandoahFreeSetPartitionId::OldCollector)]; end_off = empty_rightmosts[int(ShenandoahFreeSetPartitionId::OldCollector)]; assert (beg_off >= _leftmosts_empty[int(ShenandoahFreeSetPartitionId::OldCollector)], - "free empty regions before the leftmost: %zd, bound %zd", + "OldCollector free empty regions before the leftmost: %zd, bound %zd", beg_off, leftmost_empty(ShenandoahFreeSetPartitionId::OldCollector)); assert (end_off <= _rightmosts_empty[int(ShenandoahFreeSetPartitionId::OldCollector)], - "free empty regions past the rightmost: %zd, bound %zd", + "OldCollector free empty regions past the rightmost: %zd, bound %zd", end_off, rightmost_empty(ShenandoahFreeSetPartitionId::OldCollector)); + + if (validate_totals) { + // young_retired_regions need to be added to either Mutator or Collector partitions, 100% used. + // Give enough of young_retired_regions, young_retired_capacity, young_retired_user + // to the Mutator partition to top it off so that it matches the running totals. + // + // Give any remnants to the Collector partition. After topping off the Collector partition, its values + // should also match running totals. + + assert(young_retired_regions * _region_size_bytes == young_retired_capacity, "sanity"); + assert(young_retired_capacity == young_retired_used, "sanity"); + + + assert(capacities[int(ShenandoahFreeSetPartitionId::OldCollector)] + == _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)], "Old collector capacities must match"); + assert(used[int(ShenandoahFreeSetPartitionId::OldCollector)] + == _used[int(ShenandoahFreeSetPartitionId::OldCollector)], "Old collector used must match"); + assert(regions[int(ShenandoahFreeSetPartitionId::OldCollector)] + == _capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] / _region_size_bytes, "Old collector regions must match"); + assert(_capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] + >= _used[int(ShenandoahFreeSetPartitionId::OldCollector)], "Old Collector capacity must be >= used"); + assert(_available[int(ShenandoahFreeSetPartitionId::OldCollector)] == + (_capacity[int(ShenandoahFreeSetPartitionId::OldCollector)] - _used[int(ShenandoahFreeSetPartitionId::OldCollector)]), + "Old Collector available must equal capacity minus used"); + assert(_humongous_waste[int(ShenandoahFreeSetPartitionId::OldCollector)] == + humongous_waste[int(ShenandoahFreeSetPartitionId::OldCollector)], "Old Collector humongous waste must match"); + + assert(_capacity[int(ShenandoahFreeSetPartitionId::Mutator)] >= capacities[int(ShenandoahFreeSetPartitionId::Mutator)], + "Capacity total must be >= counted tally"); + size_t mutator_capacity_shortfall = + _capacity[int(ShenandoahFreeSetPartitionId::Mutator)] - capacities[int(ShenandoahFreeSetPartitionId::Mutator)]; + assert(mutator_capacity_shortfall <= young_retired_capacity, "sanity"); + capacities[int(ShenandoahFreeSetPartitionId::Mutator)] += mutator_capacity_shortfall; + young_retired_capacity -= mutator_capacity_shortfall; + capacities[int(ShenandoahFreeSetPartitionId::Collector)] += young_retired_capacity; + + + assert(_used[int(ShenandoahFreeSetPartitionId::Mutator)] >= used[int(ShenandoahFreeSetPartitionId::Mutator)], + "Used total must be >= counted tally"); + size_t mutator_used_shortfall = + _used[int(ShenandoahFreeSetPartitionId::Mutator)] - used[int(ShenandoahFreeSetPartitionId::Mutator)]; + assert(mutator_used_shortfall <= young_retired_used, "sanity"); + used[int(ShenandoahFreeSetPartitionId::Mutator)] += mutator_used_shortfall; + young_retired_used -= mutator_used_shortfall; + used[int(ShenandoahFreeSetPartitionId::Collector)] += young_retired_used; + + assert(_capacity[int(ShenandoahFreeSetPartitionId::Mutator)] / _region_size_bytes + >= regions[int(ShenandoahFreeSetPartitionId::Mutator)], "Region total must be >= counted tally"); + size_t mutator_regions_shortfall = (_capacity[int(ShenandoahFreeSetPartitionId::Mutator)] / _region_size_bytes + - regions[int(ShenandoahFreeSetPartitionId::Mutator)]); + assert(mutator_regions_shortfall <= young_retired_regions, "sanity"); + regions[int(ShenandoahFreeSetPartitionId::Mutator)] += mutator_regions_shortfall; + young_retired_regions -= mutator_regions_shortfall; + regions[int(ShenandoahFreeSetPartitionId::Collector)] += young_retired_regions; + + assert(capacities[int(ShenandoahFreeSetPartitionId::Collector)] == _capacity[int(ShenandoahFreeSetPartitionId::Collector)], + "Collector capacities must match"); + assert(used[int(ShenandoahFreeSetPartitionId::Collector)] == _used[int(ShenandoahFreeSetPartitionId::Collector)], + "Collector used must match"); + assert(regions[int(ShenandoahFreeSetPartitionId::Collector)] + == _capacity[int(ShenandoahFreeSetPartitionId::Collector)] / _region_size_bytes, "Collector regions must match"); + assert(_capacity[int(ShenandoahFreeSetPartitionId::Collector)] >= _used[int(ShenandoahFreeSetPartitionId::Collector)], + "Collector Capacity must be >= used"); + assert(_available[int(ShenandoahFreeSetPartitionId::Collector)] == + (_capacity[int(ShenandoahFreeSetPartitionId::Collector)] - _used[int(ShenandoahFreeSetPartitionId::Collector)]), + "Collector Available must equal capacity minus used"); + + assert(capacities[int(ShenandoahFreeSetPartitionId::Mutator)] == _capacity[int(ShenandoahFreeSetPartitionId::Mutator)], + "Mutator capacities must match"); + assert(used[int(ShenandoahFreeSetPartitionId::Mutator)] == _used[int(ShenandoahFreeSetPartitionId::Mutator)], + "Mutator used must match"); + assert(regions[int(ShenandoahFreeSetPartitionId::Mutator)] + == _capacity[int(ShenandoahFreeSetPartitionId::Mutator)] / _region_size_bytes, "Mutator regions must match"); + assert(_capacity[int(ShenandoahFreeSetPartitionId::Mutator)] >= _used[int(ShenandoahFreeSetPartitionId::Mutator)], + "Mutator capacity must be >= used"); + assert(_available[int(ShenandoahFreeSetPartitionId::Mutator)] == + (_capacity[int(ShenandoahFreeSetPartitionId::Mutator)] - _used[int(ShenandoahFreeSetPartitionId::Mutator)]), + "Mutator available must equal capacity minus used"); + assert(_humongous_waste[int(ShenandoahFreeSetPartitionId::Mutator)] == young_humongous_waste, + "Mutator humongous waste must match"); + } } #endif ShenandoahFreeSet::ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions) : _heap(heap), _partitions(max_regions, this), - _alloc_bias_weight(0) + _total_humongous_waste(0), + _alloc_bias_weight(0), + _total_young_used(0), + _total_old_used(0), + _total_global_used(0), + _young_affiliated_regions(0), + _old_affiliated_regions(0), + _global_affiliated_regions(0), + _young_unaffiliated_regions(0), + _global_unaffiliated_regions(0), + _total_young_regions(0), + _total_global_regions(0), + _mutator_bytes_allocated_since_gc_start(0) { clear_internal(); } +// was pip_pad_bytes void ShenandoahFreeSet::add_promoted_in_place_region_to_old_collector(ShenandoahHeapRegion* region) { shenandoah_assert_heaplocked(); size_t plab_min_size_in_bytes = ShenandoahGenerationalHeap::heap()->plab_min_size() * HeapWordSize; - size_t idx = region->index(); - size_t capacity = alloc_capacity(region); - assert(_partitions.membership(idx) == ShenandoahFreeSetPartitionId::NotFree, + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + size_t available_in_region = alloc_capacity(region); + size_t region_index = region->index(); + ShenandoahFreeSetPartitionId p = _partitions.membership(region_index); + assert(_partitions.membership(region_index) == ShenandoahFreeSetPartitionId::NotFree, "Regions promoted in place should have been excluded from Mutator partition"); - if (capacity >= plab_min_size_in_bytes) { - _partitions.make_free(idx, ShenandoahFreeSetPartitionId::OldCollector, capacity); - _heap->old_generation()->augment_promoted_reserve(capacity); + + // If region had been retired, its end-of-region alignment pad had been counted as used within the Mutator partition + size_t used_while_awaiting_pip = region_size_bytes; + size_t used_after_pip = region_size_bytes; + if (available_in_region >= plab_min_size_in_bytes) { + used_after_pip -= available_in_region; + } else { + if (available_in_region >= ShenandoahHeap::min_fill_size() * HeapWordSize) { + size_t fill_words = available_in_region / HeapWordSize; + ShenandoahHeap::heap()->old_generation()->card_scan()->register_object(region->top()); + region->allocate_fill(fill_words); + } + available_in_region = 0; } + + assert(p == ShenandoahFreeSetPartitionId::NotFree, "pip region must be NotFree"); + assert(region->is_young(), "pip region must be young"); + + // Though this region may have been promoted in place from the Collector region, its usage is now accounted within + // the Mutator partition. + _partitions.decrease_used(ShenandoahFreeSetPartitionId::Mutator, used_while_awaiting_pip); + + // decrease capacity adjusts available + _partitions.decrease_capacity(ShenandoahFreeSetPartitionId::Mutator, region_size_bytes); + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::OldCollector, region_size_bytes); + _partitions.increase_used(ShenandoahFreeSetPartitionId::OldCollector, used_after_pip); + region->set_affiliation(ShenandoahAffiliation::OLD_GENERATION); + if (available_in_region > 0) { + assert(available_in_region >= plab_min_size_in_bytes, "enforced above"); + _partitions.increase_region_counts(ShenandoahFreeSetPartitionId::OldCollector, 1); + // make_free() adjusts bounds for OldCollector partition + _partitions.make_free(region_index, ShenandoahFreeSetPartitionId::OldCollector, available_in_region); + _heap->old_generation()->augment_promoted_reserve(available_in_region); + assert(available_in_region != region_size_bytes, "Nothing to promote in place"); + } + // else, leave this region as NotFree + + recompute_total_used(); + // Conservatively, assume that pip regions came from both Mutator and Collector + recompute_total_affiliated(); + _partitions.assert_bounds(true); } HeapWord* ShenandoahFreeSet::allocate_from_partition_with_affiliation(ShenandoahAffiliation affiliation, @@ -1034,7 +1534,6 @@ HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, Shenandoah log_debug(gc, free)("Using new region (%zu) for %s (" PTR_FORMAT ").", r->index(), ShenandoahAllocRequest::alloc_type_to_string(req.type()), p2i(&req)); assert(!r->is_affiliated(), "New region %zu should be unaffiliated", r->index()); - r->set_affiliation(req.affiliation()); if (r->is_old()) { // Any OLD region allocated during concurrent coalesce-and-fill does not need to be coalesced and filled because @@ -1046,8 +1545,6 @@ HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, Shenandoah r->end_preemptible_coalesce_and_fill(); _heap->old_generation()->clear_cards_for(r); } - _heap->generation_for(r->affiliation())->increment_affiliated_region_count(); - #ifdef ASSERT ShenandoahMarkingContext* const ctx = _heap->marking_context(); assert(ctx->top_at_mark_start(r) == r->bottom(), "Newly established allocation region starts with TAMS equal to bottom"); @@ -1120,6 +1617,7 @@ HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, Shenandoah if (req.is_mutator_alloc()) { assert(req.is_young(), "Mutator allocations always come from young generation."); _partitions.increase_used(ShenandoahFreeSetPartitionId::Mutator, req.actual_size() * HeapWordSize); + increase_bytes_allocated(req.actual_size() * HeapWordSize); } else { assert(req.is_gc_alloc(), "Should be gc_alloc since req wasn't mutator alloc"); @@ -1128,19 +1626,38 @@ HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, Shenandoah // PLABs be made parsable at the end of evacuation. This is enabled by retiring all plabs at end of evacuation. r->set_update_watermark(r->top()); if (r->is_old()) { - _partitions.increase_used(ShenandoahFreeSetPartitionId::OldCollector, req.actual_size() * HeapWordSize); + _partitions.increase_used(ShenandoahFreeSetPartitionId::OldCollector, (req.actual_size() + req.waste()) * HeapWordSize); assert(req.type() != ShenandoahAllocRequest::_alloc_gclab, "old-gen allocations use PLAB or shared allocation"); // for plabs, we'll sort the difference between evac and promotion usage when we retire the plab } else { - _partitions.increase_used(ShenandoahFreeSetPartitionId::Collector, req.actual_size() * HeapWordSize); + _partitions.increase_used(ShenandoahFreeSetPartitionId::Collector, (req.actual_size() + req.waste()) * HeapWordSize); } } } - static const size_t min_capacity = (size_t) (ShenandoahHeapRegion::region_size_bytes() * (1.0 - 1.0 / ShenandoahEvacWaste)); size_t ac = alloc_capacity(r); - - if (((result == nullptr) && (ac < min_capacity)) || (alloc_capacity(r) < PLAB::min_size() * HeapWordSize)) { + ShenandoahFreeSetPartitionId orig_partition; + ShenandoahGeneration* request_generation = nullptr; + if (req.is_mutator_alloc()) { + request_generation = _heap->mode()->is_generational()? _heap->young_generation(): _heap->global_generation(); + orig_partition = ShenandoahFreeSetPartitionId::Mutator; + } else if (req.type() == ShenandoahAllocRequest::_alloc_gclab) { + request_generation = _heap->mode()->is_generational()? _heap->young_generation(): _heap->global_generation(); + orig_partition = ShenandoahFreeSetPartitionId::Collector; + } else if (req.type() == ShenandoahAllocRequest::_alloc_plab) { + request_generation = _heap->old_generation(); + orig_partition = ShenandoahFreeSetPartitionId::OldCollector; + } else { + assert(req.type() == ShenandoahAllocRequest::_alloc_shared_gc, "Unexpected allocation type"); + if (req.is_old()) { + request_generation = _heap->old_generation(); + orig_partition = ShenandoahFreeSetPartitionId::OldCollector; + } else { + request_generation = _heap->mode()->is_generational()? _heap->young_generation(): _heap->global_generation(); + orig_partition = ShenandoahFreeSetPartitionId::Collector; + } + } + if (alloc_capacity(r) < PLAB::min_size() * HeapWordSize) { // Regardless of whether this allocation succeeded, if the remaining memory is less than PLAB:min_size(), retire this region. // Note that retire_from_partition() increases used to account for waste. @@ -1148,24 +1665,56 @@ HeapWord* ShenandoahFreeSet::try_allocate_in(ShenandoahHeapRegion* r, Shenandoah // then retire the region so that subsequent searches can find available memory more quickly. size_t idx = r->index(); - ShenandoahFreeSetPartitionId orig_partition; - if (req.is_mutator_alloc()) { - orig_partition = ShenandoahFreeSetPartitionId::Mutator; - } else if (req.type() == ShenandoahAllocRequest::_alloc_gclab) { - orig_partition = ShenandoahFreeSetPartitionId::Collector; - } else if (req.type() == ShenandoahAllocRequest::_alloc_plab) { - orig_partition = ShenandoahFreeSetPartitionId::OldCollector; - } else { - assert(req.type() == ShenandoahAllocRequest::_alloc_shared_gc, "Unexpected allocation type"); - if (req.is_old()) { - orig_partition = ShenandoahFreeSetPartitionId::OldCollector; - } else { - orig_partition = ShenandoahFreeSetPartitionId::Collector; - } + if ((result != nullptr) && in_new_region) { + _partitions.one_region_is_no_longer_empty(orig_partition); } - _partitions.retire_from_partition(orig_partition, idx, r->used()); - _partitions.assert_bounds(); + size_t waste_bytes = _partitions.retire_from_partition(orig_partition, idx, r->used()); + if (req.is_mutator_alloc() && (waste_bytes > 0)) { + increase_bytes_allocated(waste_bytes); + } + } else if ((result != nullptr) && in_new_region) { + _partitions.one_region_is_no_longer_empty(orig_partition); } + + switch (orig_partition) { + case ShenandoahFreeSetPartitionId::Mutator: + recompute_total_used(); + if (in_new_region) { + recompute_total_affiliated(); + } + break; + case ShenandoahFreeSetPartitionId::Collector: + recompute_total_used(); + if (in_new_region) { + recompute_total_affiliated(); + } + break; + case ShenandoahFreeSetPartitionId::OldCollector: + recompute_total_used(); + if (in_new_region) { + recompute_total_affiliated(); + } + break; + case ShenandoahFreeSetPartitionId::NotFree: + default: + assert(false, "won't happen"); + } + _partitions.assert_bounds(true); return result; } @@ -1235,67 +1784,193 @@ HeapWord* ShenandoahFreeSet::allocate_contiguous(ShenandoahAllocRequest& req, bo end++; } - size_t remainder = words_size & ShenandoahHeapRegion::region_size_words_mask(); - // Initialize regions: - for (idx_t i = beg; i <= end; i++) { - ShenandoahHeapRegion* r = _heap->get_region(i); - r->try_recycle_under_lock(); - - assert(i == beg || _heap->get_region(i - 1)->index() + 1 == r->index(), "Should be contiguous"); - assert(r->is_empty(), "Should be empty"); - - r->set_affiliation(req.affiliation()); - - if (is_humongous) { + size_t total_used = 0; + const size_t used_words_in_last_region = words_size & ShenandoahHeapRegion::region_size_words_mask(); + size_t waste_bytes; + // Retire regions from free partition and initialize them. + if (is_humongous) { + // Humongous allocation retires all regions at once: no allocation is possible anymore. + // retire_range_from_partition() will adjust bounds on Mutator free set if appropriate and will recompute affiliated. + _partitions.retire_range_from_partition(ShenandoahFreeSetPartitionId::Mutator, beg, end); + for (idx_t i = beg; i <= end; i++) { + ShenandoahHeapRegion* r = _heap->get_region(i); + assert(i == beg || _heap->get_region(i - 1)->index() + 1 == r->index(), "Should be contiguous"); + r->try_recycle_under_lock(); + assert(r->is_empty(), "Should be empty"); + r->set_affiliation(req.affiliation()); if (i == beg) { r->make_humongous_start(); } else { r->make_humongous_cont(); } - } else { - r->make_regular_allocation(req.affiliation()); + if ((i == end) && (used_words_in_last_region > 0)) { + r->set_top(r->bottom() + used_words_in_last_region); + } else { + // if used_words_in_last_region is zero, then the end region is fully consumed. + r->set_top(r->end()); + } + r->set_update_watermark(r->bottom()); } - - // Trailing region may be non-full, record the remainder there - size_t used_words; - if ((i == end) && (remainder != 0)) { - used_words = remainder; - } else { - used_words = ShenandoahHeapRegion::region_size_words(); - } - r->set_update_watermark(r->bottom()); - r->set_top(r->bottom() + used_words); - } - generation->increase_affiliated_region_count(num); - - size_t total_used = 0; - if (is_humongous) { - // Humongous allocation retires all regions at once: no allocation is possible anymore. - _partitions.retire_range_from_partition(ShenandoahFreeSetPartitionId::Mutator, beg, end); total_used = ShenandoahHeapRegion::region_size_bytes() * num; + waste_bytes = + (used_words_in_last_region == 0)? 0: ShenandoahHeapRegion::region_size_bytes() - used_words_in_last_region * HeapWordSize; } else { // Non-humongous allocation retires only the regions that cannot be used for allocation anymore. + waste_bytes = 0; for (idx_t i = beg; i <= end; i++) { ShenandoahHeapRegion* r = _heap->get_region(i); - if (r->free() < PLAB::min_size() * HeapWordSize) { - _partitions.retire_from_partition(ShenandoahFreeSetPartitionId::Mutator, i, r->used()); + assert(i == beg || _heap->get_region(i - 1)->index() + 1 == r->index(), "Should be contiguous"); + assert(r->is_empty(), "Should be empty"); + r->try_recycle_under_lock(); + r->set_affiliation(req.affiliation()); + r->make_regular_allocation(req.affiliation()); + if ((i == end) && (used_words_in_last_region > 0)) { + r->set_top(r->bottom() + used_words_in_last_region); + } else { + // if used_words_in_last_region is zero, then the end region is fully consumed. + r->set_top(r->end()); } + r->set_update_watermark(r->bottom()); total_used += r->used(); + if (r->free() < PLAB::min_size() * HeapWordSize) { + // retire_from_partition() will adjust bounds on Mutator free set if appropriate and will recompute affiliated. + // It also increases used for the waste bytes, which includes bytes filled at retirement and bytes too small + // to be filled. Only the last iteration may have non-zero waste_bytes. + waste_bytes += _partitions.retire_from_partition(ShenandoahFreeSetPartitionId::Mutator, i, r->used()); + } + } + _partitions.decrease_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator, num); + if (waste_bytes > 0) { + // For humongous allocations, waste_bytes are included in total_used. Since this is not humongous, + // we need to account separately for the waste_bytes. + increase_bytes_allocated(waste_bytes); } } _partitions.increase_used(ShenandoahFreeSetPartitionId::Mutator, total_used); - _partitions.assert_bounds(); - + increase_bytes_allocated(total_used); req.set_actual_size(words_size); - if (remainder != 0 && is_humongous) { - req.set_waste(ShenandoahHeapRegion::region_size_words() - remainder); + // If !is_humongous, the "waste" is made availabe for new allocation + if (waste_bytes > 0) { + req.set_waste(waste_bytes / HeapWordSize); + if (is_humongous) { + _partitions.increase_humongous_waste(ShenandoahFreeSetPartitionId::Mutator, waste_bytes); + _total_humongous_waste += waste_bytes; + } } + + recompute_total_young_used(); + recompute_total_global_used(); + recompute_total_affiliated(); + _partitions.assert_bounds(true); return _heap->get_region(beg)->bottom(); } class ShenandoahRecycleTrashedRegionClosure final : public ShenandoahHeapRegionClosure { +private: + static const ssize_t SentinelUsed = -1; + static const ssize_t SentinelIndex = -1; + static const size_t MaxSavedRegions = 128; + + ShenandoahRegionPartitions* _partitions; + volatile size_t _recycled_region_count; + ssize_t _region_indices[MaxSavedRegions]; + ssize_t _region_used[MaxSavedRegions]; + + void get_lock_and_flush_buffer(size_t region_count, size_t overflow_region_used, size_t overflow_region_index) { + ShenandoahHeap* heap = ShenandoahHeap::heap(); + ShenandoahHeapLocker locker(heap->lock()); + size_t recycled_regions = AtomicAccess::load(&_recycled_region_count); + size_t region_tallies[int(ShenandoahRegionPartitions::NumPartitions)]; + size_t used_byte_tallies[int(ShenandoahRegionPartitions::NumPartitions)]; + for (int p = 0; p < int(ShenandoahRegionPartitions::NumPartitions); p++) { + region_tallies[p] = 0; + used_byte_tallies[p] = 0; + } + ShenandoahFreeSetPartitionId p = _partitions->membership(overflow_region_index); + used_byte_tallies[int(p)] += overflow_region_used; + if (region_count <= recycled_regions) { + // _recycled_region_count has not been decremented after I incremented it to obtain region_count, so I will + // try to flush the buffer. + + // Multiple worker threads may attempt to flush this buffer. The first thread to acquire the lock does the work. + // _recycled_region_count is only decreased while holding the heap lock. + if (region_count > recycled_regions) { + region_count = recycled_regions; + } + for (size_t i = 0; i < region_count; i++) { + ssize_t used; + // wait for other threads to finish updating their entries within the region buffer before processing entry + do { + used = _region_used[i]; + } while (used == SentinelUsed); + ssize_t index; + do { + index = _region_indices[i]; + } while (index == SentinelIndex); + + ShenandoahFreeSetPartitionId p = _partitions->membership(index); + assert(p != ShenandoahFreeSetPartitionId::NotFree, "Trashed regions should be in a free partition"); + used_byte_tallies[int(p)] += used; + region_tallies[int(p)]++; + } + if (region_count > 0) { + for (size_t i = 0; i < MaxSavedRegions; i++) { + _region_indices[i] = SentinelIndex; + _region_used[i] = SentinelUsed; + } + } + + // The almost last thing we do before releasing the lock is to set the _recycled_region_count to 0. What happens next? + // + // 1. Any worker thread that attempted to buffer a new region while we were flushing the buffer will have seen + // that _recycled_region_count > MaxSavedRegions. All such worker threads will first wait for the lock, then + // discover that the _recycled_region_count is zero, then, while holding the lock, they will process the + // region so it doesn't have to be placed into the buffer. This handles the large majority of cases. + // + // 2. However, there's a race that can happen, which will result in someewhat different behavior. Suppose + // this thread resets _recycled_region_count to 0. Then some other worker thread increments _recycled_region_count + // in order to stores its region into the buffer and suppose this happens before all of the other worker threads + // which are waiting to acquire the heap lock have finished their efforts to flush the buffer. If this happens, + // then the workers who are waiting to acquire the heap lock and flush the buffer will find that _recycled_region_count + // has decreased from the value it held when they last tried to increment its value. In this case, these worker + // threads will process their overflow region while holding the lock, but they will not attempt to process regions + // newly placed into the buffer. Otherwise, confusion could result. + // + // Assumption: all worker threads who are attempting to acquire lock and flush buffer will finish their efforts before + // the buffer once again overflows. + // How could we avoid depending on this assumption? + // 1. Let MaxSavedRegions be as large as number of regions, or at least as large as the collection set. + // 2. Keep a count of how many times the buffer has been flushed per instantation of the + // ShenandoahRecycleTrashedRegionClosure object, and only consult/update this value while holding the heap lock. + // Need to think about how this helps resolve the race. + _recycled_region_count = 0; + } else { + // Some other thread has already processed the buffer, resetting _recycled_region_count to zero. Its current value + // may be greater than zero because other workers may have accumulated entries into the buffer. But it is "extremely" + // unlikely that it will overflow again before all waiting workers have had a chance to clear their state. While I've + // got the heap lock, I'll go ahead and update the global state for my overflow region. I'll let other heap regions + // accumulate in the buffer to be processed when the buffer is once again full. + region_count = 0; + } + for (size_t p = 0; p < int(ShenandoahRegionPartitions::NumPartitions); p++) { + _partitions->decrease_used(ShenandoahFreeSetPartitionId(p), used_byte_tallies[p]); + } + } + public: - ShenandoahRecycleTrashedRegionClosure(): ShenandoahHeapRegionClosure() {} + ShenandoahRecycleTrashedRegionClosure(ShenandoahRegionPartitions* p): ShenandoahHeapRegionClosure() { + _partitions = p; + _recycled_region_count = 0; + for (size_t i = 0; i < MaxSavedRegions; i++) { + _region_indices[i] = SentinelIndex; + _region_used[i] = SentinelUsed; + } + } void heap_region_do(ShenandoahHeapRegion* r) { r->try_recycle(); @@ -1313,10 +1988,35 @@ void ShenandoahFreeSet::recycle_trash() { ShenandoahHeap* heap = ShenandoahHeap::heap(); heap->assert_gc_workers(heap->workers()->active_workers()); - ShenandoahRecycleTrashedRegionClosure closure; + ShenandoahRecycleTrashedRegionClosure closure(&_partitions); heap->parallel_heap_region_iterate(&closure); } +bool ShenandoahFreeSet::transfer_one_region_from_mutator_to_old_collector(size_t idx, size_t alloc_capacity) { + ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::heap(); + ShenandoahYoungGeneration* young_gen = gen_heap->young_generation(); + ShenandoahOldGeneration* old_gen = gen_heap->old_generation(); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + assert(alloc_capacity == region_size_bytes, "Region must be empty"); + if (young_unaffiliated_regions() > 0) { + _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, + ShenandoahFreeSetPartitionId::OldCollector, alloc_capacity); + gen_heap->old_generation()->augment_evacuation_reserve(alloc_capacity); + recompute_total_used(); + // Transferred region is unaffilliated, empty + recompute_total_affiliated(); + _partitions.assert_bounds(true); + return true; + } else { + return false; + } +} + bool ShenandoahFreeSet::flip_to_old_gc(ShenandoahHeapRegion* r) { const size_t idx = r->index(); @@ -1324,14 +2024,9 @@ bool ShenandoahFreeSet::flip_to_old_gc(ShenandoahHeapRegion* r) { assert(can_allocate_from(r), "Should not be allocated"); ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::heap(); - const size_t region_capacity = alloc_capacity(r); + const size_t region_alloc_capacity = alloc_capacity(r); - bool transferred = gen_heap->generation_sizer()->transfer_to_old(1); - if (transferred) { - _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, - ShenandoahFreeSetPartitionId::OldCollector, region_capacity); - _partitions.assert_bounds(); - _heap->old_generation()->augment_evacuation_reserve(region_capacity); + if (transfer_one_region_from_mutator_to_old_collector(idx, region_alloc_capacity)) { return true; } @@ -1361,15 +2056,20 @@ bool ShenandoahFreeSet::flip_to_old_gc(ShenandoahHeapRegion* r) { // 3. Move this usable region from the mutator partition to the old collector partition _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, - ShenandoahFreeSetPartitionId::OldCollector, region_capacity); - - _partitions.assert_bounds(); - + ShenandoahFreeSetPartitionId::OldCollector, region_alloc_capacity); + // Should have no effect on used, since flipped regions are trashed: zero used */ + // Transferred regions are not affiliated, because they are empty (trash) + recompute_total_affiliated(); + _partitions.assert_bounds(true); // 4. Do not adjust capacities for generations, we just swapped the regions that have already // been accounted for. However, we should adjust the evacuation reserves as those may have changed. shenandoah_assert_heaplocked(); const size_t reserve = _heap->old_generation()->get_evacuation_reserve(); - _heap->old_generation()->set_evacuation_reserve(reserve - unusable_capacity + region_capacity); + _heap->old_generation()->set_evacuation_reserve(reserve - unusable_capacity + region_alloc_capacity); return true; } } @@ -1387,8 +2087,15 @@ void ShenandoahFreeSet::flip_to_gc(ShenandoahHeapRegion* r) { size_t ac = alloc_capacity(r); _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, ShenandoahFreeSetPartitionId::Collector, ac); - _partitions.assert_bounds(); - + recompute_total_used(); + // Transfer only affects unaffiliated regions, which stay in young + recompute_total_affiliated(); + _partitions.assert_bounds(true); // We do not ensure that the region is no longer trash, relying on try_allocate_in(), which always comes next, // to recycle trash before attempting to allocate anything in the region. } @@ -1400,52 +2107,82 @@ void ShenandoahFreeSet::clear() { void ShenandoahFreeSet::clear_internal() { shenandoah_assert_heaplocked(); _partitions.make_all_regions_unavailable(); - + recompute_total_used(); + recompute_total_affiliated(); _alloc_bias_weight = 0; _partitions.set_bias_from_left_to_right(ShenandoahFreeSetPartitionId::Mutator, true); _partitions.set_bias_from_left_to_right(ShenandoahFreeSetPartitionId::Collector, false); _partitions.set_bias_from_left_to_right(ShenandoahFreeSetPartitionId::OldCollector, false); } -void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regions, size_t &old_cset_regions, +void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_trashed_regions, size_t &old_trashed_regions, size_t &first_old_region, size_t &last_old_region, size_t &old_region_count) { + // This resets all state information, removing all regions from all sets. clear_internal(); first_old_region = _heap->num_regions(); last_old_region = 0; old_region_count = 0; - old_cset_regions = 0; - young_cset_regions = 0; + old_trashed_regions = 0; + young_trashed_regions = 0; + + size_t old_cset_regions = 0; + size_t young_cset_regions = 0; size_t region_size_bytes = _partitions.region_size_bytes(); - size_t max_regions = _partitions.max_regions(); + size_t max_regions = _partitions.max(); size_t mutator_leftmost = max_regions; size_t mutator_rightmost = 0; size_t mutator_leftmost_empty = max_regions; size_t mutator_rightmost_empty = 0; - size_t mutator_regions = 0; - size_t mutator_used = 0; size_t old_collector_leftmost = max_regions; size_t old_collector_rightmost = 0; size_t old_collector_leftmost_empty = max_regions; size_t old_collector_rightmost_empty = 0; - size_t old_collector_regions = 0; + + size_t mutator_empty = 0; + size_t old_collector_empty = 0; + + // These two variables represent the total used within each partition, including humongous waste and retired regions + size_t mutator_used = 0; size_t old_collector_used = 0; + // These two variables represent memory that is wasted within humongous regions due to alignment padding + size_t mutator_humongous_waste = 0; + size_t old_collector_humongous_waste = 0; + + // These two variables track regions that have allocatable memory + size_t mutator_regions = 0; + size_t old_collector_regions = 0; + + // These two variables track regions that are not empty within each partition + size_t affiliated_mutator_regions = 0; + size_t affiliated_old_collector_regions = 0; + + // These two variables represent the total capacity of each partition, including retired regions + size_t total_mutator_regions = 0; + size_t total_old_collector_regions = 0; + + bool is_generational = _heap->mode()->is_generational(); size_t num_regions = _heap->num_regions(); for (size_t idx = 0; idx < num_regions; idx++) { ShenandoahHeapRegion* region = _heap->get_region(idx); if (region->is_trash()) { - // Trashed regions represent regions that had been in the collection partition but have not yet been "cleaned up". - // The cset regions are not "trashed" until we have finished update refs. + // Trashed regions represent immediate garbage identified by final mark and regions that had been in the collection + // partition but have not yet been "cleaned up" following update refs. if (region->is_old()) { - old_cset_regions++; + old_trashed_regions++; } else { assert(region->is_young(), "Trashed region should be old or young"); - young_cset_regions++; + young_trashed_regions++; } } else if (region->is_old()) { // count both humongous and regular regions, but don't count trash (cset) regions. @@ -1460,7 +2197,7 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi // Do not add regions that would almost surely fail allocation size_t ac = alloc_capacity(region); - if (ac > PLAB::min_size() * HeapWordSize) { + if (ac >= PLAB::min_size() * HeapWordSize) { if (region->is_trash() || !region->is_old()) { // Both young and old collected regions (trashed) are placed into the Mutator set _partitions.raw_assign_membership(idx, ShenandoahFreeSetPartitionId::Mutator); @@ -1471,14 +2208,18 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi mutator_rightmost = idx; } if (ac == region_size_bytes) { + mutator_empty++; if (idx < mutator_leftmost_empty) { mutator_leftmost_empty = idx; } if (idx > mutator_rightmost_empty) { mutator_rightmost_empty = idx; } + } else { + affiliated_mutator_regions++; } mutator_regions++; + total_mutator_regions++; mutator_used += (region_size_bytes - ac); } else { // !region->is_trash() && region is_old() @@ -1489,20 +2230,67 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi if (idx > old_collector_rightmost) { old_collector_rightmost = idx; } - if (ac == region_size_bytes) { - if (idx < old_collector_leftmost_empty) { - old_collector_leftmost_empty = idx; - } - if (idx > old_collector_rightmost_empty) { - old_collector_rightmost_empty = idx; - } - } + assert(ac != region_size_bytes, "Empty regions should be in mutator partition"); + affiliated_old_collector_regions++; old_collector_regions++; - old_collector_used += (region_size_bytes - ac); + total_old_collector_regions++; + old_collector_used += region_size_bytes - ac; + } + } else { + // This region does not have enough free to be part of the free set. Count all of its memory as used. + assert(_partitions.membership(idx) == ShenandoahFreeSetPartitionId::NotFree, "Region should have been retired"); + if (region->is_old()) { + old_collector_used += region_size_bytes; + total_old_collector_regions++; + affiliated_old_collector_regions++; + } else { + mutator_used += region_size_bytes; + total_mutator_regions++; + affiliated_mutator_regions++; + } + } + } else { + // This region does not allow allocation (it is retired or is humongous or is in cset). + // Retired and humongous regions generally have no alloc capacity, but cset regions may have large alloc capacity. + if (region->is_cset()) { + if (region->is_old()) { + old_cset_regions++; + } else { + young_cset_regions++; + } + } else { + assert(_partitions.membership(idx) == ShenandoahFreeSetPartitionId::NotFree, "Region should have been retired"); + size_t ac = alloc_capacity(region); + size_t humongous_waste_bytes = 0; + if (region->is_humongous_start()) { + oop obj = cast_to_oop(region->bottom()); + size_t byte_size = obj->size() * HeapWordSize; + size_t region_span = ShenandoahHeapRegion::required_regions(byte_size); + humongous_waste_bytes = region_span * ShenandoahHeapRegion::region_size_bytes() - byte_size; + } + if (region->is_old()) { + old_collector_used += region_size_bytes; + total_old_collector_regions++; + old_collector_humongous_waste += humongous_waste_bytes; + affiliated_old_collector_regions++; + } else { + mutator_used += region_size_bytes; + total_mutator_regions++; + mutator_humongous_waste += humongous_waste_bytes; + affiliated_mutator_regions++; } } } } + // At the start of evacuation, the cset regions are not counted as part of Mutator or OldCollector partitions. + + // At the end of GC, when we rebuild rebuild freeset (which happens before we have recycled the collection set), we treat + // all cset regions as part of capacity, as fully available, as unaffiliated. We place trashed regions into the Mutator + // partition. + + // No need to update generation sizes here. These are the sizes already recognized by the generations. These + // adjustments allow the freeset tallies to match the generation tallies. + log_debug(gc, free)(" At end of prep_to_rebuild, mutator_leftmost: %zu" ", mutator_rightmost: %zu" ", mutator_leftmost_empty: %zu" @@ -1511,7 +2299,6 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi ", mutator_used: %zu", mutator_leftmost, mutator_rightmost, mutator_leftmost_empty, mutator_rightmost_empty, mutator_regions, mutator_used); - log_debug(gc, free)(" old_collector_leftmost: %zu" ", old_collector_rightmost: %zu" ", old_collector_leftmost_empty: %zu" @@ -1520,16 +2307,42 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi ", old_collector_used: %zu", old_collector_leftmost, old_collector_rightmost, old_collector_leftmost_empty, old_collector_rightmost_empty, old_collector_regions, old_collector_used); - + log_debug(gc, free)(" total_mutator_regions: %zu, total_old_collector_regions: %zu" + ", mutator_empty: %zu, old_collector_empty: %zu", + total_mutator_regions, total_old_collector_regions, mutator_empty, old_collector_empty); idx_t rightmost_idx = (mutator_leftmost == max_regions)? -1: (idx_t) mutator_rightmost; idx_t rightmost_empty_idx = (mutator_leftmost_empty == max_regions)? -1: (idx_t) mutator_rightmost_empty; + _partitions.establish_mutator_intervals(mutator_leftmost, rightmost_idx, mutator_leftmost_empty, rightmost_empty_idx, - mutator_regions, mutator_used); + total_mutator_regions + young_cset_regions, mutator_empty, mutator_regions, + mutator_used + young_cset_regions * region_size_bytes, mutator_humongous_waste); rightmost_idx = (old_collector_leftmost == max_regions)? -1: (idx_t) old_collector_rightmost; rightmost_empty_idx = (old_collector_leftmost_empty == max_regions)? -1: (idx_t) old_collector_rightmost_empty; - _partitions.establish_old_collector_intervals(old_collector_leftmost, rightmost_idx, old_collector_leftmost_empty, - rightmost_empty_idx, old_collector_regions, old_collector_used); + _partitions.establish_old_collector_intervals(old_collector_leftmost, rightmost_idx, + old_collector_leftmost_empty, rightmost_empty_idx, + total_old_collector_regions + old_cset_regions, + old_collector_empty, old_collector_regions, + old_collector_used + old_cset_regions * region_size_bytes, + old_collector_humongous_waste); + _total_humongous_waste = mutator_humongous_waste + old_collector_humongous_waste; + _total_young_regions = total_mutator_regions + young_cset_regions; + _total_global_regions = _total_young_regions + total_old_collector_regions + old_cset_regions; + recompute_total_used(); + recompute_total_affiliated(); + _partitions.assert_bounds(true); +#ifdef ASSERT + if (_heap->mode()->is_generational()) { + assert(young_affiliated_regions() == _heap->young_generation()->get_affiliated_region_count(), "sanity"); + } else { + assert(young_affiliated_regions() == _heap->global_generation()->get_affiliated_region_count(), "sanity"); + } +#endif log_debug(gc, free)(" After find_regions_with_alloc_capacity(), Mutator range [%zd, %zd]," " Old Collector range [%zd, %zd]", _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator), @@ -1538,6 +2351,113 @@ void ShenandoahFreeSet::find_regions_with_alloc_capacity(size_t &young_cset_regi _partitions.rightmost(ShenandoahFreeSetPartitionId::OldCollector)); } +void ShenandoahFreeSet::transfer_humongous_regions_from_mutator_to_old_collector(size_t xfer_regions, + size_t humongous_waste_bytes) { + shenandoah_assert_heaplocked(); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + + _partitions.decrease_humongous_waste(ShenandoahFreeSetPartitionId::Mutator, humongous_waste_bytes); + _partitions.decrease_used(ShenandoahFreeSetPartitionId::Mutator, xfer_regions * region_size_bytes); + _partitions.decrease_capacity(ShenandoahFreeSetPartitionId::Mutator, xfer_regions * region_size_bytes); + + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::OldCollector, xfer_regions * region_size_bytes); + _partitions.increase_humongous_waste(ShenandoahFreeSetPartitionId::OldCollector, humongous_waste_bytes); + _partitions.increase_used(ShenandoahFreeSetPartitionId::OldCollector, xfer_regions * region_size_bytes); + + // _total_humongous_waste, _total_global_regions are unaffected by transfer + _total_young_regions -= xfer_regions; + recompute_total_young_used(); + recompute_total_old_used(); + recompute_total_affiliated(); + _partitions.assert_bounds(true); + // global_used is unaffected by this transfer + + // No need to adjust ranges because humongous regions are not allocatable +} + +void ShenandoahFreeSet::transfer_empty_regions_from_to(ShenandoahFreeSetPartitionId source, + ShenandoahFreeSetPartitionId dest, + size_t num_regions) { + assert(dest != source, "precondition"); + shenandoah_assert_heaplocked(); + const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + size_t transferred_regions = 0; + size_t used_transfer = 0; + idx_t source_low_idx = _partitions.max(); + idx_t source_high_idx = -1; + idx_t dest_low_idx = _partitions.max(); + idx_t dest_high_idx = -1; + ShenandoahLeftRightIterator iterator(&_partitions, source, true); + for (idx_t idx = iterator.current(); transferred_regions < num_regions && iterator.has_next(); idx = iterator.next()) { + // Note: can_allocate_from() denotes that region is entirely empty + if (can_allocate_from(idx)) { + if (idx < source_low_idx) { + source_low_idx = idx; + } + if (idx > source_high_idx) { + source_high_idx = idx; + } + if (idx < dest_low_idx) { + dest_low_idx = idx; + } + if (idx > dest_high_idx) { + dest_high_idx = idx; + } + used_transfer += _partitions.move_from_partition_to_partition_with_deferred_accounting(idx, source, dest, region_size_bytes); + transferred_regions++; + } + } + + // All transferred regions are empty. + assert(used_transfer == 0, "empty regions should have no used"); + _partitions.expand_interval_if_range_modifies_either_boundary(dest, dest_low_idx, + dest_high_idx, dest_low_idx, dest_high_idx); + _partitions.shrink_interval_if_range_modifies_either_boundary(source, source_low_idx, source_high_idx, + transferred_regions); + + _partitions.decrease_region_counts(source, transferred_regions); + _partitions.decrease_empty_region_counts(source, transferred_regions); + _partitions.decrease_capacity(source, transferred_regions * region_size_bytes); + + _partitions.increase_capacity(dest, transferred_regions * region_size_bytes); + _partitions.increase_region_counts(dest, transferred_regions); + _partitions.increase_empty_region_counts(dest, transferred_regions); + + // Since only empty regions are transferred, no need to recompute_total_used() + if (source == ShenandoahFreeSetPartitionId::OldCollector) { + assert((dest == ShenandoahFreeSetPartitionId::Collector) || (dest == ShenandoahFreeSetPartitionId::Mutator), "sanity"); + _total_young_regions += transferred_regions; + recompute_total_affiliated(); + } else { + assert((source == ShenandoahFreeSetPartitionId::Collector) || (source == ShenandoahFreeSetPartitionId::Mutator), "sanity"); + if (dest == ShenandoahFreeSetPartitionId::OldCollector) { + _total_young_regions -= transferred_regions; + recompute_total_affiliated(); + } else { + assert((dest == ShenandoahFreeSetPartitionId::Collector) || (dest == ShenandoahFreeSetPartitionId::Mutator), "sanity"); + // No adjustments to total_young_regions if transferring within young + recompute_total_affiliated(); + } + } + _partitions.assert_bounds(true); +} + // Returns number of regions transferred, adds transferred bytes to var argument bytes_transferred size_t ShenandoahFreeSet::transfer_empty_regions_from_collector_set_to_mutator_set(ShenandoahFreeSetPartitionId which_collector, size_t max_xfer_regions, @@ -1545,33 +2465,139 @@ size_t ShenandoahFreeSet::transfer_empty_regions_from_collector_set_to_mutator_s shenandoah_assert_heaplocked(); const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); size_t transferred_regions = 0; + size_t used_transfer = 0; + idx_t collector_low_idx = _partitions.max(); + idx_t collector_high_idx = -1; + idx_t mutator_low_idx = _partitions.max(); + idx_t mutator_high_idx = -1; ShenandoahLeftRightIterator iterator(&_partitions, which_collector, true); for (idx_t idx = iterator.current(); transferred_regions < max_xfer_regions && iterator.has_next(); idx = iterator.next()) { // Note: can_allocate_from() denotes that region is entirely empty if (can_allocate_from(idx)) { - _partitions.move_from_partition_to_partition(idx, which_collector, ShenandoahFreeSetPartitionId::Mutator, region_size_bytes); + if (idx < collector_low_idx) { + collector_low_idx = idx; + } + if (idx > collector_high_idx) { + collector_high_idx = idx; + } + if (idx < mutator_low_idx) { + mutator_low_idx = idx; + } + if (idx > mutator_high_idx) { + mutator_high_idx = idx; + } + used_transfer += _partitions.move_from_partition_to_partition_with_deferred_accounting(idx, which_collector, + ShenandoahFreeSetPartitionId::Mutator, + region_size_bytes); transferred_regions++; bytes_transferred += region_size_bytes; } } + // All transferred regions are empty. + assert(used_transfer == 0, "empty regions should have no used"); + _partitions.expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::Mutator, mutator_low_idx, + mutator_high_idx, mutator_low_idx, mutator_high_idx); + _partitions.shrink_interval_if_range_modifies_either_boundary(which_collector, collector_low_idx, collector_high_idx, + transferred_regions); + + _partitions.decrease_region_counts(which_collector, transferred_regions); + _partitions.decrease_empty_region_counts(which_collector, transferred_regions); + _partitions.decrease_capacity(which_collector, transferred_regions * region_size_bytes); + + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::Mutator, transferred_regions * region_size_bytes); + _partitions.increase_region_counts(ShenandoahFreeSetPartitionId::Mutator, transferred_regions); + _partitions.increase_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator, transferred_regions); + + if (which_collector == ShenandoahFreeSetPartitionId::OldCollector) { + _total_young_regions += transferred_regions; + recompute_total_affiliated(); + } else { + recompute_total_affiliated(); + } + _partitions.assert_bounds(true); return transferred_regions; } // Returns number of regions transferred, adds transferred bytes to var argument bytes_transferred -size_t ShenandoahFreeSet::transfer_non_empty_regions_from_collector_set_to_mutator_set(ShenandoahFreeSetPartitionId which_collector, - size_t max_xfer_regions, - size_t& bytes_transferred) { +size_t ShenandoahFreeSet:: +transfer_non_empty_regions_from_collector_set_to_mutator_set(ShenandoahFreeSetPartitionId which_collector, + size_t max_xfer_regions, size_t& bytes_transferred) { shenandoah_assert_heaplocked(); + size_t region_size_bytes = _partitions.region_size_bytes(); size_t transferred_regions = 0; + size_t used_transfer = 0; + idx_t collector_low_idx = _partitions.max(); + idx_t collector_high_idx = -1; + idx_t mutator_low_idx = _partitions.max(); + idx_t mutator_high_idx = -1; + ShenandoahLeftRightIterator iterator(&_partitions, which_collector, false); for (idx_t idx = iterator.current(); transferred_regions < max_xfer_regions && iterator.has_next(); idx = iterator.next()) { size_t ac = alloc_capacity(idx); if (ac > 0) { - _partitions.move_from_partition_to_partition(idx, which_collector, ShenandoahFreeSetPartitionId::Mutator, ac); + if (idx < collector_low_idx) { + collector_low_idx = idx; + } + if (idx > collector_high_idx) { + collector_high_idx = idx; + } + if (idx < mutator_low_idx) { + mutator_low_idx = idx; + } + if (idx > mutator_high_idx) { + mutator_high_idx = idx; + } + assert (ac < region_size_bytes, "Move empty regions with different function"); + used_transfer += _partitions.move_from_partition_to_partition_with_deferred_accounting(idx, which_collector, + ShenandoahFreeSetPartitionId::Mutator, + ac); transferred_regions++; bytes_transferred += ac; } } + // _empty_region_counts is unaffected, because we transfer only non-empty regions here. + + _partitions.decrease_used(which_collector, used_transfer); + _partitions.expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::Mutator, + mutator_low_idx, mutator_high_idx, _partitions.max(), -1); + _partitions.shrink_interval_if_range_modifies_either_boundary(which_collector, collector_low_idx, collector_high_idx, + transferred_regions); + + _partitions.decrease_region_counts(which_collector, transferred_regions); + _partitions.decrease_capacity(which_collector, transferred_regions * region_size_bytes); + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::Mutator, transferred_regions * region_size_bytes); + _partitions.increase_region_counts(ShenandoahFreeSetPartitionId::Mutator, transferred_regions); + _partitions.increase_used(ShenandoahFreeSetPartitionId::Mutator, used_transfer); + + if (which_collector == ShenandoahFreeSetPartitionId::OldCollector) { + _total_young_regions += transferred_regions; + } + // _total_global_regions unaffected by transfer + recompute_total_used(); + // All transfers are affiliated + if (which_collector == ShenandoahFreeSetPartitionId::OldCollector) { + recompute_total_affiliated(); + } else { + recompute_total_affiliated(); + } + _partitions.assert_bounds(true); return transferred_regions; } @@ -1598,9 +2624,6 @@ void ShenandoahFreeSet::move_regions_from_collector_to_mutator(size_t max_xfer_r transfer_empty_regions_from_collector_set_to_mutator_set(ShenandoahFreeSetPartitionId::OldCollector, max_xfer_regions, old_collector_xfer); max_xfer_regions -= old_collector_regions; - if (old_collector_regions > 0) { - ShenandoahGenerationalHeap::cast(_heap)->generation_sizer()->transfer_to_young(old_collector_regions); - } } // If there are any non-empty regions within Collector partition, we can also move them to the Mutator free partition @@ -1620,77 +2643,62 @@ void ShenandoahFreeSet::move_regions_from_collector_to_mutator(size_t max_xfer_r byte_size_in_proper_unit(old_collector_xfer), proper_unit_for_byte_size(old_collector_xfer)); } - // Overwrite arguments to represent the amount of memory in each generation that is about to be recycled -void ShenandoahFreeSet::prepare_to_rebuild(size_t &young_cset_regions, size_t &old_cset_regions, +void ShenandoahFreeSet::prepare_to_rebuild(size_t &young_trashed_regions, size_t &old_trashed_regions, size_t &first_old_region, size_t &last_old_region, size_t &old_region_count) { shenandoah_assert_heaplocked(); - // This resets all state information, removing all regions from all sets. - clear(); log_debug(gc, free)("Rebuilding FreeSet"); // This places regions that have alloc_capacity into the old_collector set if they identify as is_old() or the // mutator set otherwise. All trashed (cset) regions are affiliated young and placed in mutator set. - find_regions_with_alloc_capacity(young_cset_regions, old_cset_regions, first_old_region, last_old_region, old_region_count); + find_regions_with_alloc_capacity(young_trashed_regions, old_trashed_regions, + first_old_region, last_old_region, old_region_count); } -void ShenandoahFreeSet::establish_generation_sizes(size_t young_region_count, size_t old_region_count) { - assert(young_region_count + old_region_count == ShenandoahHeap::heap()->num_regions(), "Sanity"); - if (ShenandoahHeap::heap()->mode()->is_generational()) { - ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); - ShenandoahOldGeneration* old_gen = heap->old_generation(); - ShenandoahYoungGeneration* young_gen = heap->young_generation(); - size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); - - size_t original_old_capacity = old_gen->max_capacity(); - size_t new_old_capacity = old_region_count * region_size_bytes; - size_t new_young_capacity = young_region_count * region_size_bytes; - old_gen->set_capacity(new_old_capacity); - young_gen->set_capacity(new_young_capacity); - - if (new_old_capacity > original_old_capacity) { - size_t region_count = (new_old_capacity - original_old_capacity) / region_size_bytes; - log_info(gc, ergo)("Transfer %zu region(s) from %s to %s, yielding increased size: " PROPERFMT, - region_count, young_gen->name(), old_gen->name(), PROPERFMTARGS(new_old_capacity)); - } else if (new_old_capacity < original_old_capacity) { - size_t region_count = (original_old_capacity - new_old_capacity) / region_size_bytes; - log_info(gc, ergo)("Transfer %zu region(s) from %s to %s, yielding increased size: " PROPERFMT, - region_count, old_gen->name(), young_gen->name(), PROPERFMTARGS(new_young_capacity)); - } - // This balances generations, so clear any pending request to balance. - old_gen->set_region_balance(0); - } -} - -void ShenandoahFreeSet::finish_rebuild(size_t young_cset_regions, size_t old_cset_regions, size_t old_region_count, +void ShenandoahFreeSet::finish_rebuild(size_t young_trashed_regions, size_t old_trashed_regions, size_t old_region_count, bool have_evacuation_reserves) { shenandoah_assert_heaplocked(); size_t young_reserve(0), old_reserve(0); if (_heap->mode()->is_generational()) { - compute_young_and_old_reserves(young_cset_regions, old_cset_regions, have_evacuation_reserves, + compute_young_and_old_reserves(young_trashed_regions, old_trashed_regions, have_evacuation_reserves, young_reserve, old_reserve); } else { young_reserve = (_heap->max_capacity() / 100) * ShenandoahEvacReserve; old_reserve = 0; } - // Move some of the mutator regions in the Collector and OldCollector partitions in order to satisfy + // Move some of the mutator regions into the Collector and OldCollector partitions in order to satisfy // young_reserve and old_reserve. - reserve_regions(young_reserve, old_reserve, old_region_count); - size_t young_region_count = _heap->num_regions() - old_region_count; - establish_generation_sizes(young_region_count, old_region_count); + size_t young_used_regions, old_used_regions, young_used_bytes, old_used_bytes; + reserve_regions(young_reserve, old_reserve, old_region_count, young_used_regions, old_used_regions, + young_used_bytes, old_used_bytes); + _total_young_regions = _heap->num_regions() - old_region_count; + _total_global_regions = _heap->num_regions(); establish_old_collector_alloc_bias(); - _partitions.assert_bounds(); + _partitions.assert_bounds(true); log_status(); } -void ShenandoahFreeSet::compute_young_and_old_reserves(size_t young_cset_regions, size_t old_cset_regions, +/** + * Set young_reserve_result and old_reserve_result to the number of bytes that we desire to set aside to hold the + * results of evacuation to young and old collector spaces respectively during the next evacuation phase. Overwrite + * old_generation region balance in case the original value is incompatible with the current reality. + * + * These values are determined by how much memory is currently available within each generation, which is + * represented by: + * 1. Memory currently available within old and young + * 2. Trashed regions currently residing in young and old, which will become available momentarily + * 3. The value of old_generation->get_region_balance() which represents the number of regions that we plan + * to transfer from old generation to young generation. Prior to each invocation of compute_young_and_old_reserves(), + * this value should computed by ShenandoahGenerationalHeap::compute_old_generation_balance(). + */ +void ShenandoahFreeSet::compute_young_and_old_reserves(size_t young_trashed_regions, size_t old_trashed_regions, bool have_evacuation_reserves, size_t& young_reserve_result, size_t& old_reserve_result) const { shenandoah_assert_generational(); + shenandoah_assert_heaplocked(); const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); - ShenandoahOldGeneration* const old_generation = _heap->old_generation(); size_t old_available = old_generation->available(); size_t old_unaffiliated_regions = old_generation->free_unaffiliated_regions(); @@ -1699,18 +2707,23 @@ void ShenandoahFreeSet::compute_young_and_old_reserves(size_t young_cset_regions size_t young_unaffiliated_regions = young_generation->free_unaffiliated_regions(); // Add in the regions we anticipate to be freed by evacuation of the collection set - old_unaffiliated_regions += old_cset_regions; - young_unaffiliated_regions += young_cset_regions; + old_unaffiliated_regions += old_trashed_regions; + old_available += old_trashed_regions * region_size_bytes; + young_unaffiliated_regions += young_trashed_regions; // Consult old-region balance to make adjustments to current generation capacities and availability. - // The generation region transfers take place after we rebuild. - const ssize_t old_region_balance = old_generation->get_region_balance(); + // The generation region transfers take place after we rebuild. old_region_balance represents number of regions + // to transfer from old to young. + ssize_t old_region_balance = old_generation->get_region_balance(); if (old_region_balance != 0) { #ifdef ASSERT if (old_region_balance > 0) { - assert(old_region_balance <= checked_cast(old_unaffiliated_regions), "Cannot transfer regions that are affiliated"); + assert(old_region_balance <= checked_cast(old_unaffiliated_regions), + "Cannot transfer %zd regions that are affiliated (old_trashed: %zu, old_unaffiliated: %zu)", + old_region_balance, old_trashed_regions, old_unaffiliated_regions); } else { - assert(0 - old_region_balance <= checked_cast(young_unaffiliated_regions), "Cannot transfer regions that are affiliated"); + assert(0 - old_region_balance <= checked_cast(young_unaffiliated_regions), + "Cannot transfer regions that are affiliated"); } #endif @@ -1731,9 +2744,18 @@ void ShenandoahFreeSet::compute_young_and_old_reserves(size_t young_cset_regions const size_t old_evac_reserve = old_generation->get_evacuation_reserve(); young_reserve_result = young_generation->get_evacuation_reserve(); old_reserve_result = promoted_reserve + old_evac_reserve; - assert(old_reserve_result <= old_available, - "Cannot reserve (%zu + %zu) more OLD than is available: %zu", - promoted_reserve, old_evac_reserve, old_available); + if (old_reserve_result > old_available) { + // Try to transfer memory from young to old. + size_t old_deficit = old_reserve_result - old_available; + size_t old_region_deficit = (old_deficit + region_size_bytes - 1) / region_size_bytes; + if (young_unaffiliated_regions < old_region_deficit) { + old_region_deficit = young_unaffiliated_regions; + } + young_unaffiliated_regions -= old_region_deficit; + old_unaffiliated_regions += old_region_deficit; + old_region_balance -= old_region_deficit; + old_generation->set_region_balance(old_region_balance); + } } else { // We are rebuilding at end of GC, so we set aside budgets specified on command line (or defaults) young_reserve_result = (young_capacity * ShenandoahEvacReserve) / 100; @@ -1763,69 +2785,239 @@ void ShenandoahFreeSet::compute_young_and_old_reserves(size_t young_cset_regions // into the collector set or old collector set in order to assure that the memory available for allocations within // the collector set is at least to_reserve and the memory available for allocations within the old collector set // is at least to_reserve_old. -void ShenandoahFreeSet::reserve_regions(size_t to_reserve, size_t to_reserve_old, size_t &old_region_count) { +void ShenandoahFreeSet::reserve_regions(size_t to_reserve, size_t to_reserve_old, size_t &old_region_count, + size_t &young_used_regions, size_t &old_used_regions, + size_t &young_used_bytes, size_t &old_used_bytes) { + const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + + young_used_regions = 0; + old_used_regions = 0; + young_used_bytes = 0; + old_used_bytes = 0; + + idx_t mutator_low_idx = _partitions.max(); + idx_t mutator_high_idx = -1; + idx_t mutator_empty_low_idx = _partitions.max(); + idx_t mutator_empty_high_idx = -1; + + idx_t collector_low_idx = _partitions.max(); + idx_t collector_high_idx = -1; + idx_t collector_empty_low_idx = _partitions.max(); + idx_t collector_empty_high_idx = -1; + + idx_t old_collector_low_idx = _partitions.max(); + idx_t old_collector_high_idx = -1; + idx_t old_collector_empty_low_idx = _partitions.max(); + idx_t old_collector_empty_high_idx = -1; + + size_t used_to_collector = 0; + size_t used_to_old_collector = 0; + size_t regions_to_collector = 0; + size_t regions_to_old_collector = 0; + size_t empty_regions_to_collector = 0; + size_t empty_regions_to_old_collector = 0; + + size_t old_collector_available = _partitions.available_in(ShenandoahFreeSetPartitionId::OldCollector);; + size_t collector_available = _partitions.available_in(ShenandoahFreeSetPartitionId::Collector); + for (size_t i = _heap->num_regions(); i > 0; i--) { - size_t idx = i - 1; + idx_t idx = i - 1; ShenandoahHeapRegion* r = _heap->get_region(idx); - if (!_partitions.in_free_set(ShenandoahFreeSetPartitionId::Mutator, idx)) { - continue; - } + if (_partitions.in_free_set(ShenandoahFreeSetPartitionId::Mutator, idx)) { + // Note: trashed regions have region_size_bytes alloc capacity. + size_t ac = alloc_capacity(r); + assert (ac > 0, "Membership in free set implies has capacity"); + assert (!r->is_old() || r->is_trash(), "Except for trash, mutator_is_free regions should not be affiliated OLD"); - size_t ac = alloc_capacity(r); - assert (ac > 0, "Membership in free set implies has capacity"); - assert (!r->is_old() || r->is_trash(), "Except for trash, mutator_is_free regions should not be affiliated OLD"); + bool move_to_old_collector = old_collector_available < to_reserve_old; + bool move_to_collector = collector_available < to_reserve; - bool move_to_old_collector = _partitions.available_in(ShenandoahFreeSetPartitionId::OldCollector) < to_reserve_old; - bool move_to_collector = _partitions.available_in(ShenandoahFreeSetPartitionId::Collector) < to_reserve; + if (move_to_old_collector) { + // We give priority to OldCollector partition because we desire to pack OldCollector regions into higher + // addresses than Collector regions. Presumably, OldCollector regions are more "stable" and less likely to + // be collected in the near future. + if (r->is_trash() || !r->is_affiliated()) { + // OLD regions that have available memory are already in the old_collector free set. + assert(r->is_empty() || r->is_trash(), "Not affiliated implies region %zu is empty", r->index()); + if (idx < old_collector_low_idx) { + old_collector_low_idx = idx; + } + if (idx > old_collector_high_idx) { + old_collector_high_idx = idx; + } + if (idx < old_collector_empty_low_idx) { + old_collector_empty_low_idx = idx; + } + if (idx > old_collector_empty_high_idx) { + old_collector_empty_high_idx = idx; + } + used_to_old_collector += + _partitions.move_from_partition_to_partition_with_deferred_accounting(idx, ShenandoahFreeSetPartitionId::Mutator, + ShenandoahFreeSetPartitionId::OldCollector, ac); + old_collector_available += ac; + regions_to_old_collector++; + empty_regions_to_old_collector++; - if (!move_to_collector && !move_to_old_collector) { - // We've satisfied both to_reserve and to_reserved_old - break; - } + log_trace(gc, free)(" Shifting region %zu from mutator_free to old_collector_free", idx); + log_trace(gc, free)(" Shifted Mutator range [%zd, %zd]," + " Old Collector range [%zd, %zd]", + _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator), + _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator), + _partitions.leftmost(ShenandoahFreeSetPartitionId::OldCollector), + _partitions.rightmost(ShenandoahFreeSetPartitionId::OldCollector)); + old_region_count++; + continue; + } + } - if (move_to_old_collector) { - // We give priority to OldCollector partition because we desire to pack OldCollector regions into higher - // addresses than Collector regions. Presumably, OldCollector regions are more "stable" and less likely to - // be collected in the near future. - if (r->is_trash() || !r->is_affiliated()) { - // OLD regions that have available memory are already in the old_collector free set. - _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, - ShenandoahFreeSetPartitionId::OldCollector, ac); - log_trace(gc, free)(" Shifting region %zu from mutator_free to old_collector_free", idx); + if (move_to_collector) { + // Note: In a previous implementation, regions were only placed into the survivor space (collector_is_free) if + // they were entirely empty. This has the effect of causing new Mutator allocation to reside next to objects + // that have already survived at least one GC, mixing ephemeral with longer-lived objects in the same region. + // Any objects that have survived a GC are less likely to immediately become garbage, so a region that contains + // survivor objects is less likely to be selected for the collection set. This alternative implementation allows + // survivor regions to continue accumulating other survivor objects, and makes it more likely that ephemeral objects + // occupy regions comprised entirely of ephemeral objects. These regions are highly likely to be included in the next + // collection set, and they are easily evacuated because they have low density of live objects. + if (idx < collector_low_idx) { + collector_low_idx = idx; + } + if (idx > collector_high_idx) { + collector_high_idx = idx; + } + if (ac == region_size_bytes) { + if (idx < collector_empty_low_idx) { + collector_empty_low_idx = idx; + } + if (idx > collector_empty_high_idx) { + collector_empty_high_idx = idx; + } + empty_regions_to_collector++; + } + used_to_collector += + _partitions.move_from_partition_to_partition_with_deferred_accounting(idx, ShenandoahFreeSetPartitionId::Mutator, + ShenandoahFreeSetPartitionId::Collector, ac); + collector_available += ac; + regions_to_collector++; + if (ac != region_size_bytes) { + young_used_regions++; + young_used_bytes = region_size_bytes - ac; + } + + log_trace(gc, free)(" Shifting region %zu from mutator_free to collector_free", idx); log_trace(gc, free)(" Shifted Mutator range [%zd, %zd]," - " Old Collector range [%zd, %zd]", + " Collector range [%zd, %zd]", _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator), _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator), - _partitions.leftmost(ShenandoahFreeSetPartitionId::OldCollector), - _partitions.rightmost(ShenandoahFreeSetPartitionId::OldCollector)); - - old_region_count++; + _partitions.leftmost(ShenandoahFreeSetPartitionId::Collector), + _partitions.rightmost(ShenandoahFreeSetPartitionId::Collector)); continue; } - } - - if (move_to_collector) { - // Note: In a previous implementation, regions were only placed into the survivor space (collector_is_free) if - // they were entirely empty. This has the effect of causing new Mutator allocation to reside next to objects - // that have already survived at least one GC, mixing ephemeral with longer-lived objects in the same region. - // Any objects that have survived a GC are less likely to immediately become garbage, so a region that contains - // survivor objects is less likely to be selected for the collection set. This alternative implementation allows - // survivor regions to continue accumulating other survivor objects, and makes it more likely that ephemeral objects - // occupy regions comprised entirely of ephemeral objects. These regions are highly likely to be included in the next - // collection set, and they are easily evacuated because they have low density of live objects. - _partitions.move_from_partition_to_partition(idx, ShenandoahFreeSetPartitionId::Mutator, - ShenandoahFreeSetPartitionId::Collector, ac); - log_trace(gc, free)(" Shifting region %zu from mutator_free to collector_free", idx); - log_trace(gc, free)(" Shifted Mutator range [%zd, %zd]," - " Collector range [%zd, %zd]", - _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator), - _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator), - _partitions.leftmost(ShenandoahFreeSetPartitionId::Collector), - _partitions.rightmost(ShenandoahFreeSetPartitionId::Collector)); + // Mutator region is not moved to Collector or OldCollector. Still, do the accounting. + if (idx < mutator_low_idx) { + mutator_low_idx = idx; + } + if (idx > mutator_high_idx) { + mutator_high_idx = idx; + } + if ((ac == region_size_bytes) && (idx < mutator_empty_low_idx)) { + mutator_empty_low_idx = idx; + } + if ((ac == region_size_bytes) && (idx > mutator_empty_high_idx)) { + mutator_empty_high_idx = idx; + } + if (ac != region_size_bytes) { + young_used_regions++; + young_used_bytes += region_size_bytes - ac; + } + } else { + // Region is not in Mutator partition. Do the accounting. + ShenandoahFreeSetPartitionId p = _partitions.membership(idx); + size_t ac = alloc_capacity(r); + assert(ac != region_size_bytes, "Empty regions should be in Mutator partion at entry to reserve_regions"); + if (p == ShenandoahFreeSetPartitionId::Collector) { + if (ac != region_size_bytes) { + young_used_regions++; + young_used_bytes = region_size_bytes - ac; + } + // else, unaffiliated region has no used + } else if (p == ShenandoahFreeSetPartitionId::OldCollector) { + if (ac != region_size_bytes) { + old_used_regions++; + old_used_bytes = region_size_bytes - ac; + } + // else, unaffiliated region has no used + } else if (p == ShenandoahFreeSetPartitionId::NotFree) { + // This region has been retired + if (r->is_old()) { + old_used_regions++; + old_used_bytes += region_size_bytes - ac; + } else { + assert(r->is_young(), "Retired region should be old or young"); + young_used_regions++; + young_used_bytes += region_size_bytes - ac; + } + } else { + assert(p == ShenandoahFreeSetPartitionId::OldCollector, "Not mutator and not NotFree, so must be OldCollector"); + assert(!r->is_empty(), "Empty regions should be in Mutator partition at entry to reserve_regions"); + if (idx < old_collector_low_idx) { + old_collector_low_idx = idx; + } + if (idx > old_collector_high_idx) { + old_collector_high_idx = idx; + } + if (idx < old_collector_empty_low_idx) { + old_collector_empty_low_idx = idx; + } + if (idx > old_collector_empty_high_idx) { + old_collector_empty_high_idx = idx; + } + } } } + _partitions.decrease_used(ShenandoahFreeSetPartitionId::Mutator, used_to_old_collector + used_to_collector); + _partitions.decrease_region_counts(ShenandoahFreeSetPartitionId::Mutator, regions_to_old_collector + regions_to_collector); + _partitions.decrease_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator, + empty_regions_to_old_collector + empty_regions_to_collector); + // decrease_capacity() also decreases available + _partitions.decrease_capacity(ShenandoahFreeSetPartitionId::Mutator, + (regions_to_old_collector + regions_to_collector) * region_size_bytes); + // increase_capacity() also increases available + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::Collector, regions_to_collector * region_size_bytes); + _partitions.increase_region_counts(ShenandoahFreeSetPartitionId::Collector, regions_to_collector); + _partitions.increase_empty_region_counts(ShenandoahFreeSetPartitionId::Collector, empty_regions_to_collector); + // increase_capacity() also increases available + _partitions.increase_capacity(ShenandoahFreeSetPartitionId::OldCollector, regions_to_old_collector * region_size_bytes); + _partitions.increase_region_counts(ShenandoahFreeSetPartitionId::OldCollector, regions_to_old_collector); + _partitions.increase_empty_region_counts(ShenandoahFreeSetPartitionId::OldCollector, empty_regions_to_old_collector); + + if (used_to_collector > 0) { + _partitions.increase_used(ShenandoahFreeSetPartitionId::Collector, used_to_collector); + } + + if (used_to_old_collector > 0) { + _partitions.increase_used(ShenandoahFreeSetPartitionId::OldCollector, used_to_old_collector); + } + + _partitions.expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::Collector, + collector_low_idx, collector_high_idx, + collector_empty_low_idx, collector_empty_high_idx); + _partitions.expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::OldCollector, + old_collector_low_idx, old_collector_high_idx, + old_collector_empty_low_idx, old_collector_empty_high_idx); + _partitions.establish_interval(ShenandoahFreeSetPartitionId::Mutator, + mutator_low_idx, mutator_high_idx, mutator_empty_low_idx, mutator_empty_high_idx); + + recompute_total_used(); + recompute_total_affiliated(); + _partitions.assert_bounds(true); if (LogTarget(Info, gc, free)::is_enabled()) { size_t old_reserve = _partitions.available_in(ShenandoahFreeSetPartitionId::OldCollector); if (old_reserve < to_reserve_old) { @@ -1966,6 +3158,7 @@ void ShenandoahFreeSet::log_status() { size_t total_used = 0; size_t total_free = 0; size_t total_free_ext = 0; + size_t total_trashed_free = 0; for (idx_t idx = _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator); idx <= _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator); idx++) { @@ -1973,7 +3166,9 @@ void ShenandoahFreeSet::log_status() { ShenandoahHeapRegion *r = _heap->get_region(idx); size_t free = alloc_capacity(r); max = MAX2(max, free); - if (r->is_empty()) { + size_t used_in_region = r->used(); + if (r->is_empty() || r->is_trash()) { + used_in_region = 0; total_free_ext += free; if (last_idx + 1 == idx) { empty_contig++; @@ -1983,7 +3178,7 @@ void ShenandoahFreeSet::log_status() { } else { empty_contig = 0; } - total_used += r->used(); + total_used += used_in_region; total_free += free; max_contig = MAX2(max_contig, empty_contig); last_idx = idx; @@ -1991,12 +3186,13 @@ void ShenandoahFreeSet::log_status() { } size_t max_humongous = max_contig * ShenandoahHeapRegion::region_size_bytes(); + // capacity() is capacity of mutator + // used() is used of mutator size_t free = capacity() - used(); - // Since certain regions that belonged to the Mutator free partition at the time of most recent rebuild may have been // retired, the sum of used and capacities within regions that are still in the Mutator free partition may not match // my internally tracked values of used() and free(). - assert(free == total_free, "Free memory should match"); + assert(free == total_free, "Free memory (%zu) should match calculated memory (%zu)", free, total_free); ls.print("Free: %zu%s, Max: %zu%s regular, %zu%s humongous, ", byte_size_in_proper_unit(total_free), proper_unit_for_byte_size(total_free), byte_size_in_proper_unit(max), proper_unit_for_byte_size(max), @@ -2069,6 +3265,27 @@ void ShenandoahFreeSet::log_status() { } } +void ShenandoahFreeSet::decrease_humongous_waste_for_regular_bypass(ShenandoahHeapRegion*r, size_t waste) { + shenandoah_assert_heaplocked(); + assert(_partitions.membership(r->index()) == ShenandoahFreeSetPartitionId::NotFree, "Humongous regions should be NotFree"); + ShenandoahFreeSetPartitionId p = + r->is_old()? ShenandoahFreeSetPartitionId::OldCollector: ShenandoahFreeSetPartitionId::Mutator; + _partitions.decrease_humongous_waste(p, waste); + if (waste >= PLAB::min_size() * HeapWordSize) { + _partitions.decrease_used(p, waste); + _partitions.unretire_to_partition(r, p); + if (r->is_old()) { + recompute_total_used(); + } else { + recompute_total_used(); + } + } + _total_humongous_waste -= waste; +} + + HeapWord* ShenandoahFreeSet::allocate(ShenandoahAllocRequest& req, bool& in_new_region) { shenandoah_assert_heaplocked(); if (ShenandoahHeapRegion::requires_humongous(req.size())) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp index 8ad7055b3d6..11d93bf094a 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -35,8 +35,12 @@ enum class ShenandoahFreeSetPartitionId : uint8_t { Mutator, // Region is in the Mutator free set: available memory is available to mutators. Collector, // Region is in the Collector free set: available memory is reserved for evacuations. OldCollector, // Region is in the Old Collector free set: - // available memory is reserved for old evacuations and for promotions.. - NotFree // Region is in no free set: it has no available memory + // available memory is reserved for old evacuations and for promotions. + NotFree // Region is in no free set: it has no available memory. Consult region affiliation + // to determine whether this retired region is young or old. If young, the region + // is considered to be part of the Mutator partition. (When we retire from the + // Collector partition, we decrease total_region_count for Collector and increaese + // for Mutator, making similar adjustments to used (net impact on available is neutral). }; // ShenandoahRegionPartitions provides an abstraction to help organize the implementation of ShenandoahFreeSet. This @@ -45,64 +49,92 @@ enum class ShenandoahFreeSetPartitionId : uint8_t { // for which the ShenandoahFreeSetPartitionId is not equal to NotFree. class ShenandoahRegionPartitions { -private: +using idx_t = ShenandoahSimpleBitMap::idx_t; + +public: // We do not maintain counts, capacity, or used for regions that are not free. Informally, if a region is NotFree, it is // in no partition. NumPartitions represents the size of an array that may be indexed by Mutator or Collector. static constexpr ShenandoahFreeSetPartitionId NumPartitions = ShenandoahFreeSetPartitionId::NotFree; static constexpr int IntNumPartitions = int(ShenandoahFreeSetPartitionId::NotFree); static constexpr uint UIntNumPartitions = uint(ShenandoahFreeSetPartitionId::NotFree); - const ssize_t _max; // The maximum number of heap regions +private: + const idx_t _max; // The maximum number of heap regions const size_t _region_size_bytes; const ShenandoahFreeSet* _free_set; // For each partition, we maintain a bitmap of which regions are affiliated with his partition. ShenandoahSimpleBitMap _membership[UIntNumPartitions]; - // For each partition, we track an interval outside of which a region affiliated with that partition is guaranteed // not to be found. This makes searches for free space more efficient. For each partition p, _leftmosts[p] // represents its least index, and its _rightmosts[p] its greatest index. Empty intervals are indicated by the // canonical [_max, -1]. - ssize_t _leftmosts[UIntNumPartitions]; - ssize_t _rightmosts[UIntNumPartitions]; + idx_t _leftmosts[UIntNumPartitions]; + idx_t _rightmosts[UIntNumPartitions]; // Allocation for humongous objects needs to find regions that are entirely empty. For each partion p, _leftmosts_empty[p] // represents the first region belonging to this partition that is completely empty and _rightmosts_empty[p] represents the // last region that is completely empty. If there is no completely empty region in this partition, this is represented // by the canonical [_max, -1]. - ssize_t _leftmosts_empty[UIntNumPartitions]; - ssize_t _rightmosts_empty[UIntNumPartitions]; + idx_t _leftmosts_empty[UIntNumPartitions]; + idx_t _rightmosts_empty[UIntNumPartitions]; + + // For each partition p: + // _capacity[p] represents the total amount of memory within the partition, including retired regions, as adjusted + // by transfers of memory between partitions + // _used[p] represents the total amount of memory that has been allocated within this partition (either already + // allocated as of the rebuild, or allocated since the rebuild). + // _available[p] represents the total amount of memory that can be allocated within partition p, calculated from + // _capacity[p] minus _used[p], where the difference is computed and assigned under heap lock + // + // _region_counts[p] represents the number of regions associated with the partition which currently have available memory. + // When a region is retired from partition p, _region_counts[p] is decremented. + // total_region_counts[p] is _capacity[p] / RegionSizeBytes. + // _empty_region_counts[p] is number of regions associated with p which are entirely empty + // + // capacity and used values are expressed in bytes. + // + // When a region is retired, the used[p] is increased to account for alignment waste. capacity is unaffected. + // + // When a region is "flipped", we adjust capacities and region counts for original and destination partitions. We also + // adjust used values when flipping from mutator to collector. Flip to old collector does not need to adjust used because + // only empty regions can be flipped to old collector. + // + // All memory quantities (capacity, available, used) are represented in bytes. - // For each partition p, _capacity[p] represents the total amount of memory within the partition at the time - // of the most recent rebuild, _used[p] represents the total amount of memory that has been allocated within this - // partition (either already allocated as of the rebuild, or allocated since the rebuild). _capacity[p] and _used[p] - // are denoted in bytes. Note that some regions that had been assigned to a particular partition at rebuild time - // may have been retired following the rebuild. The tallies for these regions are still reflected in _capacity[p] - // and _used[p], even though the region may have been removed from the free set. size_t _capacity[UIntNumPartitions]; + size_t _used[UIntNumPartitions]; size_t _available[UIntNumPartitions]; + + // Measured in bytes. + size_t _allocated_since_gc_start[UIntNumPartitions]; + + // Some notes: + // total_region_counts[p] is _capacity[p] / region_size_bytes + // retired_regions[p] is total_region_counts[p] - _region_counts[p] + // _empty_region_counts[p] <= _region_counts[p] <= total_region_counts[p] + // affiliated regions is total_region_counts[p] - empty_region_counts[p] + // used_regions is affilaited_regions * region_size_bytes + // _available[p] is _capacity[p] - _used[p] size_t _region_counts[UIntNumPartitions]; + size_t _empty_region_counts[UIntNumPartitions]; + + // Humongous waste, in bytes, can exist in Mutator partition for recently allocated humongous objects + // and in OldCollector partition for humongous objects that have been promoted in place. + size_t _humongous_waste[UIntNumPartitions]; // For each partition p, _left_to_right_bias is true iff allocations are normally made from lower indexed regions // before higher indexed regions. bool _left_to_right_bias[UIntNumPartitions]; - // Shrink the intervals associated with partition when region idx is removed from this free set - inline void shrink_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, ssize_t idx); - - // Shrink the intervals associated with partition when regions low_idx through high_idx inclusive are removed from this free set - inline void shrink_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId partition, - ssize_t low_idx, ssize_t high_idx); - inline void expand_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, ssize_t idx, size_t capacity); - inline bool is_mutator_partition(ShenandoahFreeSetPartitionId p); inline bool is_young_collector_partition(ShenandoahFreeSetPartitionId p); inline bool is_old_collector_partition(ShenandoahFreeSetPartitionId p); inline bool available_implies_empty(size_t available); #ifndef PRODUCT - void dump_bitmap_row(ssize_t region_idx) const; - void dump_bitmap_range(ssize_t start_region_idx, ssize_t end_region_idx) const; + void dump_bitmap_row(idx_t region_idx) const; + void dump_bitmap_range(idx_t start_region_idx, idx_t end_region_idx) const; void dump_bitmap() const; #endif public: @@ -111,6 +143,11 @@ public: static const size_t FreeSetUnderConstruction = SIZE_MAX; + inline idx_t max() const { return _max; } + + // At initialization, reset OldCollector tallies + void initialize_old_collector(); + // Remove all regions from all partitions and reset all bounds void make_all_regions_unavailable(); @@ -119,70 +156,116 @@ public: _membership[int(p)].set_bit(idx); } + // Clear the partition id for a particular region without adjusting interval bounds or usage/capacity tallies + inline void raw_clear_membership(size_t idx, ShenandoahFreeSetPartitionId p) { + _membership[int(p)].clear_bit(idx); + } + + inline void one_region_is_no_longer_empty(ShenandoahFreeSetPartitionId partition); + // Set the Mutator intervals, usage, and capacity according to arguments. Reset the Collector intervals, used, capacity // to represent empty Collector free set. We use this at the end of rebuild_free_set() to avoid the overhead of making // many redundant incremental adjustments to the mutator intervals as the free set is being rebuilt. - void establish_mutator_intervals(ssize_t mutator_leftmost, ssize_t mutator_rightmost, - ssize_t mutator_leftmost_empty, ssize_t mutator_rightmost_empty, - size_t mutator_region_count, size_t mutator_used); + void establish_mutator_intervals(idx_t mutator_leftmost, idx_t mutator_rightmost, + idx_t mutator_leftmost_empty, idx_t mutator_rightmost_empty, + size_t total_mutator_regions, size_t empty_mutator_regions, + size_t mutator_region_count, size_t mutator_used, size_t mutator_humongous_words_waste); // Set the OldCollector intervals, usage, and capacity according to arguments. We use this at the end of rebuild_free_set() // to avoid the overhead of making many redundant incremental adjustments to the mutator intervals as the free set is being // rebuilt. - void establish_old_collector_intervals(ssize_t old_collector_leftmost, ssize_t old_collector_rightmost, - ssize_t old_collector_leftmost_empty, ssize_t old_collector_rightmost_empty, - size_t old_collector_region_count, size_t old_collector_used); + void establish_old_collector_intervals(idx_t old_collector_leftmost, idx_t old_collector_rightmost, + idx_t old_collector_leftmost_empty, idx_t old_collector_rightmost_empty, + size_t total_old_collector_region_count, size_t old_collector_empty, + size_t old_collector_regions, size_t old_collector_used, + size_t old_collector_humongous_words_waste); + + void establish_interval(ShenandoahFreeSetPartitionId partition, idx_t low_idx, idx_t high_idx, + idx_t low_empty_idx, idx_t high_empty_idx); + + // Shrink the intervals associated with partition when region idx is removed from this free set + inline void shrink_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, idx_t idx); + + // Shrink the intervals associated with partition when regions low_idx through high_idx inclusive are removed from this free set + void shrink_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId partition, + idx_t low_idx, idx_t high_idx, size_t num_regions); + + void expand_interval_if_boundary_modified(ShenandoahFreeSetPartitionId partition, idx_t idx, size_t capacity); + void expand_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId partition, + idx_t low_idx, idx_t high_idx, + idx_t low_empty_idx, idx_t high_empty_idx); // Retire region idx from within partition, , leaving its capacity and used as part of the original free partition's totals. // Requires that region idx is in in the Mutator or Collector partitions. Hereafter, identifies this region as NotFree. // Any remnant of available memory at the time of retirement is added to the original partition's total of used bytes. - void retire_from_partition(ShenandoahFreeSetPartitionId p, ssize_t idx, size_t used_bytes); + // Return the number of waste bytes (if any). + size_t retire_from_partition(ShenandoahFreeSetPartitionId p, idx_t idx, size_t used_bytes); // Retire all regions between low_idx and high_idx inclusive from within partition. Requires that each region idx is // in the same Mutator or Collector partition. Hereafter, identifies each region as NotFree. Assumes that each region // is now considered fully used, since the region is presumably used to represent a humongous object. - void retire_range_from_partition(ShenandoahFreeSetPartitionId partition, ssize_t low_idx, ssize_t high_idx); + void retire_range_from_partition(ShenandoahFreeSetPartitionId partition, idx_t low_idx, idx_t high_idx); + + void unretire_to_partition(ShenandoahHeapRegion* region, ShenandoahFreeSetPartitionId which_partition); // Place region idx into free set which_partition. Requires that idx is currently NotFree. - void make_free(ssize_t idx, ShenandoahFreeSetPartitionId which_partition, size_t region_capacity); + void make_free(idx_t idx, ShenandoahFreeSetPartitionId which_partition, size_t region_capacity); - // Place region idx into free partition new_partition, adjusting used and capacity totals for the original and new partition - // given that available bytes can still be allocated within this region. Requires that idx is currently not NotFree. - void move_from_partition_to_partition(ssize_t idx, ShenandoahFreeSetPartitionId orig_partition, + // Place region idx into free partition new_partition, not adjusting used and capacity totals for the original and new partition. + // available represents bytes that can still be allocated within this region. Requires that idx is currently not NotFree. + size_t move_from_partition_to_partition_with_deferred_accounting(idx_t idx, ShenandoahFreeSetPartitionId orig_partition, + ShenandoahFreeSetPartitionId new_partition, size_t available); + + // Place region idx into free partition new_partition, adjusting used and capacity totals for the original and new partition. + // available represents bytes that can still be allocated within this region. Requires that idx is currently not NotFree. + void move_from_partition_to_partition(idx_t idx, ShenandoahFreeSetPartitionId orig_partition, ShenandoahFreeSetPartitionId new_partition, size_t available); - const char* partition_membership_name(ssize_t idx) const; + void transfer_used_capacity_from_to(ShenandoahFreeSetPartitionId from_partition, ShenandoahFreeSetPartitionId to_partition, + size_t regions); + + const char* partition_membership_name(idx_t idx) const; // Return the index of the next available region >= start_index, or maximum_regions if not found. - inline ssize_t find_index_of_next_available_region(ShenandoahFreeSetPartitionId which_partition, ssize_t start_index) const; + inline idx_t find_index_of_next_available_region(ShenandoahFreeSetPartitionId which_partition, + idx_t start_index) const; // Return the index of the previous available region <= last_index, or -1 if not found. - inline ssize_t find_index_of_previous_available_region(ShenandoahFreeSetPartitionId which_partition, ssize_t last_index) const; + inline idx_t find_index_of_previous_available_region(ShenandoahFreeSetPartitionId which_partition, + idx_t last_index) const; // Return the index of the next available cluster of cluster_size regions >= start_index, or maximum_regions if not found. - inline ssize_t find_index_of_next_available_cluster_of_regions(ShenandoahFreeSetPartitionId which_partition, - ssize_t start_index, size_t cluster_size) const; + inline idx_t find_index_of_next_available_cluster_of_regions(ShenandoahFreeSetPartitionId which_partition, + idx_t start_index, size_t cluster_size) const; // Return the index of the previous available cluster of cluster_size regions <= last_index, or -1 if not found. - inline ssize_t find_index_of_previous_available_cluster_of_regions(ShenandoahFreeSetPartitionId which_partition, - ssize_t last_index, size_t cluster_size) const; + inline idx_t find_index_of_previous_available_cluster_of_regions(ShenandoahFreeSetPartitionId which_partition, + idx_t last_index, size_t cluster_size) const; - inline bool in_free_set(ShenandoahFreeSetPartitionId which_partition, ssize_t idx) const { + inline bool in_free_set(ShenandoahFreeSetPartitionId which_partition, idx_t idx) const { return _membership[int(which_partition)].is_set(idx); } // Returns the ShenandoahFreeSetPartitionId affiliation of region idx, NotFree if this region is not currently in any partition. // This does not enforce that free_set membership implies allocation capacity. - inline ShenandoahFreeSetPartitionId membership(ssize_t idx) const; + inline ShenandoahFreeSetPartitionId membership(idx_t idx) const { + assert (idx < _max, "index is sane: %zu < %zu", idx, _max); + ShenandoahFreeSetPartitionId result = ShenandoahFreeSetPartitionId::NotFree; + for (uint partition_id = 0; partition_id < UIntNumPartitions; partition_id++) { + if (_membership[partition_id].is_set(idx)) { + assert(result == ShenandoahFreeSetPartitionId::NotFree, "Region should reside in only one partition"); + result = (ShenandoahFreeSetPartitionId) partition_id; + } + } + return result; + } #ifdef ASSERT // Returns true iff region idx's membership is which_partition. If which_partition represents a free set, asserts // that the region has allocation capacity. - inline bool partition_id_matches(ssize_t idx, ShenandoahFreeSetPartitionId which_partition) const; + inline bool partition_id_matches(idx_t idx, ShenandoahFreeSetPartitionId which_partition) const; #endif - inline size_t max_regions() const { return _max; } - inline size_t region_size_bytes() const { return _region_size_bytes; }; // The following four methods return the left-most and right-most bounds on ranges of regions representing @@ -192,14 +275,54 @@ public: // leftmost() and leftmost_empty() return _max, rightmost() and rightmost_empty() return 0 // otherwise, expect the following: // 0 <= leftmost <= leftmost_empty <= rightmost_empty <= rightmost < _max - inline ssize_t leftmost(ShenandoahFreeSetPartitionId which_partition) const; - inline ssize_t rightmost(ShenandoahFreeSetPartitionId which_partition) const; - ssize_t leftmost_empty(ShenandoahFreeSetPartitionId which_partition); - ssize_t rightmost_empty(ShenandoahFreeSetPartitionId which_partition); + inline idx_t leftmost(ShenandoahFreeSetPartitionId which_partition) const; + inline idx_t rightmost(ShenandoahFreeSetPartitionId which_partition) const; + idx_t leftmost_empty(ShenandoahFreeSetPartitionId which_partition); + idx_t rightmost_empty(ShenandoahFreeSetPartitionId which_partition); inline bool is_empty(ShenandoahFreeSetPartitionId which_partition) const; + inline void increase_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions); + inline void decrease_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions); + inline size_t get_region_counts(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "selected free set must be valid"); + return _region_counts[int(which_partition)]; + } + + inline void increase_empty_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions); + inline void decrease_empty_region_counts(ShenandoahFreeSetPartitionId which_partition, size_t regions); + inline size_t get_empty_region_counts(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "selected free set must be valid"); + return _empty_region_counts[int(which_partition)]; + } + + inline void increase_capacity(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline void decrease_capacity(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline size_t get_capacity(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "Partition must be valid"); + return _capacity[int(which_partition)]; + } + + inline void increase_available(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline void decrease_available(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline size_t get_available(ShenandoahFreeSetPartitionId which_partition); + inline void increase_used(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline void decrease_used(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline size_t get_used(ShenandoahFreeSetPartitionId which_partition) { + assert (which_partition < NumPartitions, "Partition must be valid"); + return _used[int(which_partition)]; + } + + inline void increase_humongous_waste(ShenandoahFreeSetPartitionId which_partition, size_t bytes); + inline void decrease_humongous_waste(ShenandoahFreeSetPartitionId which_partition, size_t bytes) { + shenandoah_assert_heaplocked(); + assert (which_partition < NumPartitions, "Partition must be valid"); + assert(_humongous_waste[int(which_partition)] >= bytes, "Cannot decrease waste beyond what is there"); + _humongous_waste[int(which_partition)] -= bytes; + } + + inline size_t get_humongous_waste(ShenandoahFreeSetPartitionId which_partition); inline void set_bias_from_left_to_right(ShenandoahFreeSetPartitionId which_partition, bool value) { assert (which_partition < NumPartitions, "selected free set must be valid"); @@ -227,10 +350,17 @@ public: assert(_available[int(which_partition)] == _capacity[int(which_partition)] - _used[int(which_partition)], "Expect available (%zu) equals capacity (%zu) - used (%zu) for partition %s", _available[int(which_partition)], _capacity[int(which_partition)], _used[int(which_partition)], - partition_membership_name(ssize_t(which_partition))); + partition_membership_name(idx_t(which_partition))); return _available[int(which_partition)]; } + // Returns bytes of humongous waste + inline size_t humongous_waste(ShenandoahFreeSetPartitionId which_partition) const { + assert (which_partition < NumPartitions, "selected free set must be valid"); + // This may be called with or without the global heap lock. Changes to _humongous_waste[] are always made with heap lock. + return _humongous_waste[int(which_partition)]; + } + // Return available_in assuming caller does not hold the heap lock. In production builds, available is // returned without acquiring the lock. In debug builds, the global heap lock is acquired in order to // enforce a consistency assert. @@ -243,17 +373,12 @@ public: (_available[int(which_partition)] == _capacity[int(which_partition)] - _used[int(which_partition)]), "Expect available (%zu) equals capacity (%zu) - used (%zu) for partition %s", _available[int(which_partition)], _capacity[int(which_partition)], _used[int(which_partition)], - partition_membership_name(ssize_t(which_partition))); + partition_membership_name(idx_t(which_partition))); #endif return _available[int(which_partition)]; } - inline void set_capacity_of(ShenandoahFreeSetPartitionId which_partition, size_t value) { - shenandoah_assert_heaplocked(); - assert (which_partition < NumPartitions, "selected free set must be valid"); - _capacity[int(which_partition)] = value; - _available[int(which_partition)] = value - _used[int(which_partition)]; - } + inline void set_capacity_of(ShenandoahFreeSetPartitionId which_partition, size_t value); inline void set_used_by(ShenandoahFreeSetPartitionId which_partition, size_t value) { shenandoah_assert_heaplocked(); @@ -284,7 +409,7 @@ public: // idx >= leftmost && // idx <= rightmost // } - void assert_bounds() NOT_DEBUG_RETURN; + void assert_bounds(bool validate_totals) NOT_DEBUG_RETURN; }; // Publicly, ShenandoahFreeSet represents memory that is available to mutator threads. The public capacity(), used(), @@ -312,10 +437,13 @@ public: // during the next GC pass. class ShenandoahFreeSet : public CHeapObj { +using idx_t = ShenandoahSimpleBitMap::idx_t; private: ShenandoahHeap* const _heap; ShenandoahRegionPartitions _partitions; + size_t _total_humongous_waste; + HeapWord* allocate_aligned_plab(size_t size, ShenandoahAllocRequest& req, ShenandoahHeapRegion* r); // Return the address of memory allocated, setting in_new_region to true iff the allocation is taken @@ -330,6 +458,105 @@ private: const ssize_t INITIAL_ALLOC_BIAS_WEIGHT = 256; + // bytes used by young + size_t _total_young_used; + template + inline void recompute_total_young_used() { + if (UsedByMutatorChanged || UsedByCollectorChanged) { + shenandoah_assert_heaplocked(); + _total_young_used = (_partitions.used_by(ShenandoahFreeSetPartitionId::Mutator) + + _partitions.used_by(ShenandoahFreeSetPartitionId::Collector)); + } + } + + // bytes used by old + size_t _total_old_used; + template + inline void recompute_total_old_used() { + if (UsedByOldCollectorChanged) { + shenandoah_assert_heaplocked(); + _total_old_used =_partitions.used_by(ShenandoahFreeSetPartitionId::OldCollector); + } + } + +public: + // We make this public so that native code can see its value + // bytes used by global + size_t _total_global_used; +private: + // Prerequisite: _total_young_used and _total_old_used are valid + template + inline void recompute_total_global_used() { + if (UsedByMutatorChanged || UsedByCollectorChanged || UsedByOldCollectorChanged) { + shenandoah_assert_heaplocked(); + _total_global_used = _total_young_used + _total_old_used; + } + } + + template + inline void recompute_total_used() { + recompute_total_young_used(); + recompute_total_old_used(); + recompute_total_global_used(); + } + + size_t _young_affiliated_regions; + size_t _old_affiliated_regions; + size_t _global_affiliated_regions; + + size_t _young_unaffiliated_regions; + size_t _global_unaffiliated_regions; + + size_t _total_young_regions; + size_t _total_global_regions; + + size_t _mutator_bytes_allocated_since_gc_start; + + // If only affiliation changes are promote-in-place and generation sizes have not changed, + // we have AffiliatedChangesAreGlobalNeutral + // If only affiliation changes are non-empty regions moved from Mutator to Collector and young size has not changed, + // we have AffiliatedChangesAreYoungNeutral + // If only unaffiliated changes are empty regions from Mutator to/from Collector, we have UnaffiliatedChangesAreYoungNeutral + template + inline void recompute_total_affiliated() { + shenandoah_assert_heaplocked(); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + if (!UnaffiliatedChangesAreYoungNeutral && (MutatorEmptiesChanged || CollectorEmptiesChanged)) { + _young_unaffiliated_regions = (_partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator) + + _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::Collector)); + } + if (!AffiliatedChangesAreYoungNeutral && + (MutatorSizeChanged || CollectorSizeChanged || MutatorEmptiesChanged || CollectorEmptiesChanged)) { + _young_affiliated_regions = ((_partitions.get_capacity(ShenandoahFreeSetPartitionId::Mutator) + + _partitions.get_capacity(ShenandoahFreeSetPartitionId::Collector)) / region_size_bytes - + _young_unaffiliated_regions); + } + if (OldCollectorSizeChanged || OldCollectorEmptiesChanged) { + _old_affiliated_regions = (_partitions.get_capacity(ShenandoahFreeSetPartitionId::OldCollector) / region_size_bytes - + _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::OldCollector)); + } + if (!AffiliatedChangesAreGlobalNeutral && + (MutatorEmptiesChanged || CollectorEmptiesChanged || OldCollectorEmptiesChanged)) { + _global_unaffiliated_regions = + _young_unaffiliated_regions + _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::OldCollector); + } + if (!AffiliatedChangesAreGlobalNeutral && + (MutatorSizeChanged || CollectorSizeChanged || MutatorEmptiesChanged || CollectorEmptiesChanged || + OldCollectorSizeChanged || OldCollectorEmptiesChanged)) { + _global_affiliated_regions = _young_affiliated_regions + _old_affiliated_regions; + } +#ifdef ASSERT + if (ShenandoahHeap::heap()->mode()->is_generational()) { + assert(_young_affiliated_regions * ShenandoahHeapRegion::region_size_bytes() >= _total_young_used, "sanity"); + assert(_old_affiliated_regions * ShenandoahHeapRegion::region_size_bytes() >= _total_old_used, "sanity"); + } + assert(_global_affiliated_regions * ShenandoahHeapRegion::region_size_bytes() >= _total_global_used, "sanity"); +#endif + } + // Increases used memory for the partition if the allocation is successful. `in_new_region` will be set // if this is the first allocation in the region. HeapWord* try_allocate_in(ShenandoahHeapRegion* region, ShenandoahAllocRequest& req, bool& in_new_region); @@ -347,6 +574,8 @@ private: // Precondition: ShenandoahHeapRegion::requires_humongous(req.size()) HeapWord* allocate_contiguous(ShenandoahAllocRequest& req, bool is_humongous); + bool transfer_one_region_from_mutator_to_old_collector(size_t idx, size_t alloc_capacity); + // Change region r from the Mutator partition to the GC's Collector or OldCollector partition. This requires that the // region is entirely empty. // @@ -374,7 +603,8 @@ private: // Search for allocation in region with same affiliation as request, using given iterator. template - HeapWord* allocate_with_affiliation(Iter& iterator, ShenandoahAffiliation affiliation, ShenandoahAllocRequest& req, bool& in_new_region); + HeapWord* allocate_with_affiliation(Iter& iterator, ShenandoahAffiliation affiliation, + ShenandoahAllocRequest& req, bool& in_new_region); // Return true if the respective generation for this request has free regions. bool can_allocate_in_new_region(const ShenandoahAllocRequest& req); @@ -392,6 +622,10 @@ private: inline bool has_alloc_capacity(ShenandoahHeapRegion *r) const; + void transfer_empty_regions_from_to(ShenandoahFreeSetPartitionId source_partition, + ShenandoahFreeSetPartitionId dest_partition, + size_t num_regions); + size_t transfer_empty_regions_from_collector_set_to_mutator_set(ShenandoahFreeSetPartitionId which_collector, size_t max_xfer_regions, size_t& bytes_transferred); @@ -399,12 +633,8 @@ private: size_t max_xfer_regions, size_t& bytes_transferred); - // Determine whether we prefer to allocate from left to right or from right to left within the OldCollector free-set. void establish_old_collector_alloc_bias(); - - // Set max_capacity for young and old generations - void establish_generation_sizes(size_t young_region_count, size_t old_region_count); size_t get_usable_free_words(size_t free_bytes) const; // log status, assuming lock has already been acquired by the caller. @@ -415,10 +645,82 @@ public: ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions); + inline size_t max_regions() const { return _partitions.max(); } + ShenandoahFreeSetPartitionId membership(size_t index) const { return _partitions.membership(index); } + inline void shrink_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId partition, + idx_t low_idx, idx_t high_idx, size_t num_regions) { + return _partitions.shrink_interval_if_range_modifies_either_boundary(partition, low_idx, high_idx, num_regions); + } + + void reset_bytes_allocated_since_gc_start(size_t initial_bytes_allocated); + + void increase_bytes_allocated(size_t bytes); + + inline size_t get_bytes_allocated_since_gc_start() const { + return _mutator_bytes_allocated_since_gc_start; + } + // Public because ShenandoahRegionPartitions assertions require access. inline size_t alloc_capacity(ShenandoahHeapRegion *r) const; inline size_t alloc_capacity(size_t idx) const; + // Return bytes used by old + inline size_t old_used() { + return _total_old_used; + } + + ShenandoahFreeSetPartitionId prepare_to_promote_in_place(size_t idx, size_t bytes); + void account_for_pip_regions(size_t mutator_regions, size_t mutator_bytes, size_t collector_regions, size_t collector_bytes); + + // This is used for unit testing. Not for preoduction. Invokes exit() if old cannot be resized. + void resize_old_collector_capacity(size_t desired_regions); + + // Return bytes used by young + inline size_t young_used() { + return _total_young_used; + } + + // Return bytes used by global + inline size_t global_used() { + return _total_global_used; + } + + size_t global_unaffiliated_regions() { + return _global_unaffiliated_regions; + } + + size_t young_unaffiliated_regions() { + return _young_unaffiliated_regions; + } + + size_t old_unaffiliated_regions() { + return _partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::OldCollector); + } + + size_t young_affiliated_regions() { + return _young_affiliated_regions; + } + + size_t old_affiliated_regions() { + return _old_affiliated_regions; + } + + size_t global_affiliated_regions() { + return _global_affiliated_regions; + } + + size_t total_young_regions() { + return _total_young_regions; + } + + size_t total_old_regions() { + return _partitions.get_capacity(ShenandoahFreeSetPartitionId::OldCollector) / ShenandoahHeapRegion::region_size_bytes(); + } + + size_t total_global_regions() { + return _total_global_regions; + } + void clear(); // Examine the existing free set representation, capturing the current state into var arguments: @@ -464,6 +766,8 @@ public: // for evacuation, invoke this to make regions available for mutator allocations. void move_regions_from_collector_to_mutator(size_t cset_regions); + void transfer_humongous_regions_from_mutator_to_old_collector(size_t xfer_regions, size_t humongous_waste_words); + void recycle_trash(); // Acquire heap lock and log status, assuming heap lock is not acquired by the caller. @@ -482,6 +786,12 @@ public: inline size_t used() const { return _partitions.used_by(ShenandoahFreeSetPartitionId::Mutator); } inline size_t available() const { return _partitions.available_in_not_locked(ShenandoahFreeSetPartitionId::Mutator); } + inline size_t total_humongous_waste() const { return _total_humongous_waste; } + inline size_t humongous_waste_in_mutator() const { return _partitions.humongous_waste(ShenandoahFreeSetPartitionId::Mutator); } + inline size_t humongous_waste_in_old() const { return _partitions.humongous_waste(ShenandoahFreeSetPartitionId::OldCollector); } + + void decrease_humongous_waste_for_regular_bypass(ShenandoahHeapRegion* r, size_t waste); + HeapWord* allocate(ShenandoahAllocRequest& req, bool& in_new_region); /* @@ -539,7 +849,8 @@ public: // Ensure that Collector has at least to_reserve bytes of available memory, and OldCollector has at least old_reserve // bytes of available memory. On input, old_region_count holds the number of regions already present in the // OldCollector partition. Upon return, old_region_count holds the updated number of regions in the OldCollector partition. - void reserve_regions(size_t to_reserve, size_t old_reserve, size_t &old_region_count); + void reserve_regions(size_t to_reserve, size_t old_reserve, size_t &old_region_count, + size_t &young_used_regions, size_t &old_used_regions, size_t &young_used_bytes, size_t &old_used_bytes); // Reserve space for evacuations, with regions reserved for old evacuations placed to the right // of regions reserved of young evacuations. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp index 78218f5e403..027d7e02268 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.cpp @@ -237,7 +237,6 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { worker_slices[i] = new ShenandoahHeapRegionSet(); } - ShenandoahGenerationalHeap::TransferResult result; { // The rest of code performs region moves, where region status is undefined // until all phases run together. @@ -251,14 +250,7 @@ void ShenandoahFullGC::do_it(GCCause::Cause gc_cause) { phase4_compact_objects(worker_slices); - result = phase5_epilog(); - } - if (heap->mode()->is_generational()) { - LogTarget(Info, gc, ergo) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - result.print_on("Full GC", &ls); - } + phase5_epilog(); } // Resize metaspace @@ -984,23 +976,6 @@ public: r->set_live_data(live); r->reset_alloc_metadata(); } - - void update_generation_usage() { - if (_is_generational) { - _heap->old_generation()->establish_usage(_old_regions, _old_usage, _old_humongous_waste); - _heap->young_generation()->establish_usage(_young_regions, _young_usage, _young_humongous_waste); - } else { - assert(_old_regions == 0, "Old regions only expected in generational mode"); - assert(_old_usage == 0, "Old usage only expected in generational mode"); - assert(_old_humongous_waste == 0, "Old humongous waste only expected in generational mode"); - } - - // In generational mode, global usage should be the sum of young and old. This is also true - // for non-generational modes except that there are no old regions. - _heap->global_generation()->establish_usage(_old_regions + _young_regions, - _old_usage + _young_usage, - _old_humongous_waste + _young_humongous_waste); - } }; void ShenandoahFullGC::compact_humongous_objects() { @@ -1120,10 +1095,9 @@ void ShenandoahFullGC::phase4_compact_objects(ShenandoahHeapRegionSet** worker_s } } -ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() { +void ShenandoahFullGC::phase5_epilog() { GCTraceTime(Info, gc, phases) time("Phase 5: Full GC epilog", _gc_timer); ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahGenerationalHeap::TransferResult result; // Reset complete bitmap. We're about to reset the complete-top-at-mark-start pointer // and must ensure the bitmap is in sync. @@ -1138,12 +1112,6 @@ ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() { ShenandoahGCPhase phase(ShenandoahPhaseTimings::full_gc_copy_objects_rebuild); ShenandoahPostCompactClosure post_compact; heap->heap_region_iterate(&post_compact); - post_compact.update_generation_usage(); - - if (heap->mode()->is_generational()) { - ShenandoahGenerationalFullGC::balance_generations_after_gc(heap); - } - heap->collection_set()->clear(); size_t young_cset_regions, old_cset_regions; size_t first_old, last_old, num_old; @@ -1166,11 +1134,7 @@ ShenandoahGenerationalHeap::TransferResult ShenandoahFullGC::phase5_epilog() { _preserved_marks->restore(heap->workers()); _preserved_marks->reclaim(); - // We defer generation resizing actions until after cset regions have been recycled. We do this even following an - // abbreviated cycle. if (heap->mode()->is_generational()) { - result = ShenandoahGenerationalFullGC::balance_generations_after_rebuilding_free_set(); ShenandoahGenerationalFullGC::rebuild_remembered_set(heap); } - return result; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp index 8b8244f2ce3..c69c8cec8fc 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFullGC.hpp @@ -82,8 +82,7 @@ private: void phase2_calculate_target_addresses(ShenandoahHeapRegionSet** worker_slices); void phase3_update_references(); void phase4_compact_objects(ShenandoahHeapRegionSet** worker_slices); - ShenandoahGenerationalHeap::TransferResult phase5_epilog(); - + void phase5_epilog(); void distribute_slices(ShenandoahHeapRegionSet** worker_slices); void calculate_target_humongous_objects(); void compact_humongous_objects(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp index f74dffe50b0..ea421365614 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.cpp @@ -39,6 +39,8 @@ #include "gc/shenandoah/shenandoahYoungGeneration.hpp" #include "utilities/quickSort.hpp" +using idx_t = ShenandoahSimpleBitMap::idx_t; + template class ShenandoahResetBitmapClosure final : public ShenandoahHeapRegionClosure { private: @@ -147,19 +149,8 @@ ShenandoahHeuristics* ShenandoahGeneration::initialize_heuristics(ShenandoahMode return _heuristics; } -size_t ShenandoahGeneration::bytes_allocated_since_gc_start() const { - return AtomicAccess::load(&_bytes_allocated_since_gc_start); -} - -void ShenandoahGeneration::reset_bytes_allocated_since_gc_start(size_t initial_bytes_allocated) { - AtomicAccess::store(&_bytes_allocated_since_gc_start, initial_bytes_allocated); -} - -void ShenandoahGeneration::increase_allocated(size_t bytes) { - AtomicAccess::add(&_bytes_allocated_since_gc_start, bytes, memory_order_relaxed); -} - void ShenandoahGeneration::set_evacuation_reserve(size_t new_val) { + shenandoah_assert_heaplocked(); _evacuation_reserve = new_val; } @@ -271,7 +262,7 @@ void ShenandoahGeneration::compute_evacuation_budgets(ShenandoahHeap* const heap // maximum_young_evacuation_reserve is upper bound on memory to be evacuated out of young const size_t maximum_young_evacuation_reserve = (young_generation->max_capacity() * ShenandoahEvacReserve) / 100; - const size_t young_evacuation_reserve = MIN2(maximum_young_evacuation_reserve, young_generation->available_with_reserve()); + size_t young_evacuation_reserve = MIN2(maximum_young_evacuation_reserve, young_generation->available_with_reserve()); // maximum_old_evacuation_reserve is an upper bound on memory evacuated from old and evacuated to old (promoted), // clamped by the old generation space available. @@ -351,6 +342,11 @@ void ShenandoahGeneration::compute_evacuation_budgets(ShenandoahHeap* const heap const size_t consumed_by_advance_promotion = select_aged_regions(old_promo_reserve); assert(consumed_by_advance_promotion <= maximum_old_evacuation_reserve, "Cannot promote more than available old-gen memory"); + // If any regions have been selected for promotion in place, this has the effect of decreasing available within mutator + // and collector partitions, due to padding of remnant memory within each promoted in place region. This will affect + // young_evacuation_reserve but not old_evacuation_reserve or consumed_by_advance_promotion. So recompute. + young_evacuation_reserve = MIN2(young_evacuation_reserve, young_generation->available_with_reserve()); + // Note that unused old_promo_reserve might not be entirely consumed_by_advance_promotion. Do not transfer this // to old_evacuation_reserve because this memory is likely very fragmented, and we do not want to increase the likelihood // of old evacuation failure. @@ -435,7 +431,9 @@ void ShenandoahGeneration::adjust_evacuation_budgets(ShenandoahHeap* const heap, size_t excess_old = old_available - old_consumed; size_t unaffiliated_old_regions = old_generation->free_unaffiliated_regions(); size_t unaffiliated_old = unaffiliated_old_regions * region_size_bytes; - assert(old_available >= unaffiliated_old, "Unaffiliated old is a subset of old available"); + assert(old_available >= unaffiliated_old, + "Unaffiliated old (%zu is %zu * %zu) is a subset of old available (%zu)", + unaffiliated_old, unaffiliated_old_regions, region_size_bytes, old_available); // Make sure old_evac_committed is unaffiliated if (old_evacuated_committed > 0) { @@ -465,15 +463,10 @@ void ShenandoahGeneration::adjust_evacuation_budgets(ShenandoahHeap* const heap, size_t excess_regions = excess_old / region_size_bytes; regions_to_xfer = MIN2(excess_regions, unaffiliated_old_regions); } - if (regions_to_xfer > 0) { - bool result = ShenandoahGenerationalHeap::cast(heap)->generation_sizer()->transfer_to_young(regions_to_xfer); - assert(excess_old >= regions_to_xfer * region_size_bytes, - "Cannot transfer (%zu, %zu) more than excess old (%zu)", - regions_to_xfer, region_size_bytes, excess_old); excess_old -= regions_to_xfer * region_size_bytes; - log_debug(gc, ergo)("%s transferred %zu excess regions to young before start of evacuation", - result? "Successfully": "Unsuccessfully", regions_to_xfer); + log_debug(gc, ergo)("Before start of evacuation, total_promotion reserve is young_advance_promoted_reserve: %zu " + "plus excess: old: %zu", young_advance_promoted_reserve_used, excess_old); } // Add in the excess_old memory to hold unanticipated promotions, if any. If there are more unanticipated @@ -531,6 +524,8 @@ size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_rese assert_no_in_place_promotions(); auto const heap = ShenandoahGenerationalHeap::heap(); + ShenandoahYoungGeneration* young_gen = heap->young_generation(); + ShenandoahFreeSet* free_set = heap->free_set(); bool* const candidate_regions_for_promotion_by_copy = heap->collection_set()->preselected_regions(); ShenandoahMarkingContext* const ctx = heap->marking_context(); @@ -547,12 +542,28 @@ size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_rese // Sort the promotion-eligible regions in order of increasing live-data-bytes so that we can first reclaim regions that require // less evacuation effort. This prioritizes garbage first, expanding the allocation pool early before we reclaim regions that // have more live data. - const size_t num_regions = heap->num_regions(); + const idx_t num_regions = heap->num_regions(); ResourceMark rm; AgedRegionData* sorted_regions = NEW_RESOURCE_ARRAY(AgedRegionData, num_regions); - for (size_t i = 0; i < num_regions; i++) { + ShenandoahFreeSet* freeset = heap->free_set(); + + // Any region that is to be promoted in place needs to be retired from its Collector or Mutator partition. + idx_t pip_low_collector_idx = freeset->max_regions(); + idx_t pip_high_collector_idx = -1; + idx_t pip_low_mutator_idx = freeset->max_regions(); + idx_t pip_high_mutator_idx = -1; + size_t collector_regions_to_pip = 0; + size_t mutator_regions_to_pip = 0; + + size_t pip_mutator_regions = 0; + size_t pip_collector_regions = 0; + size_t pip_mutator_bytes = 0; + size_t pip_collector_bytes = 0; + + size_t min_remnant_size = PLAB::min_size() * HeapWordSize; + for (idx_t i = 0; i < num_regions; i++) { ShenandoahHeapRegion* const r = heap->get_region(i); if (r->is_empty() || !r->has_live() || !r->is_young() || !r->is_regular()) { // skip over regions that aren't regular young with some live data @@ -569,18 +580,54 @@ size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_rese // we use this field to indicate that this region should be promoted in place during the evacuation // phase. r->save_top_before_promote(); - - size_t remnant_size = r->free() / HeapWordSize; - if (remnant_size > ShenandoahHeap::min_fill_size()) { - ShenandoahHeap::fill_with_object(original_top, remnant_size); + size_t remnant_bytes = r->free(); + size_t remnant_words = remnant_bytes / HeapWordSize; + assert(ShenandoahHeap::min_fill_size() <= PLAB::min_size(), "Implementation makes invalid assumptions"); + if (remnant_words >= ShenandoahHeap::min_fill_size()) { + ShenandoahHeap::fill_with_object(original_top, remnant_words); // Fill the remnant memory within this region to assure no allocations prior to promote in place. Otherwise, // newly allocated objects will not be parsable when promote in place tries to register them. Furthermore, any // new allocations would not necessarily be eligible for promotion. This addresses both issues. r->set_top(r->end()); - promote_in_place_pad += remnant_size * HeapWordSize; + // The region r is either in the Mutator or Collector partition if remnant_words > heap()->plab_min_size. + // Otherwise, the region is in the NotFree partition. + ShenandoahFreeSetPartitionId p = free_set->membership(i); + if (p == ShenandoahFreeSetPartitionId::Mutator) { + mutator_regions_to_pip++; + if (i < pip_low_mutator_idx) { + pip_low_mutator_idx = i; + } + if (i > pip_high_mutator_idx) { + pip_high_mutator_idx = i; + } + pip_mutator_regions++; + pip_mutator_bytes += remnant_bytes; + } else if (p == ShenandoahFreeSetPartitionId::Collector) { + collector_regions_to_pip++; + if (i < pip_low_collector_idx) { + pip_low_collector_idx = i; + } + if (i > pip_high_collector_idx) { + pip_high_collector_idx = i; + } + pip_collector_regions++; + pip_collector_bytes += remnant_bytes; + } else { + assert((p == ShenandoahFreeSetPartitionId::NotFree) && (remnant_words < heap->plab_min_size()), + "Should be NotFree if not in Collector or Mutator partitions"); + // In this case, the memory is already counted as used and the region has already been retired. There is + // no need for further adjustments to used. Further, the remnant memory for this region will not be + // unallocated or made available to OldCollector after pip. + remnant_bytes = 0; + } + promote_in_place_pad += remnant_bytes; + free_set->prepare_to_promote_in_place(i, remnant_bytes); } else { - // Since the remnant is so small that it cannot be filled, we don't have to worry about any accidental - // allocations occurring within this region before the region is promoted in place. + // Since the remnant is so small that this region has already been retired, we don't have to worry about any + // accidental allocations occurring within this region before the region is promoted in place. + + // This region was already not in the Collector or Mutator set, so no need to remove it. + assert(free_set->membership(i) == ShenandoahFreeSetPartitionId::NotFree, "sanity"); } } // Else, we do not promote this region (either in place or by copy) because it has received new allocations. @@ -621,7 +668,21 @@ size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_rese // Subsequent regions may be selected if they have smaller live data. } - log_info(gc, ergo)("Promotion potential of aged regions with sufficient garbage: " PROPERFMT, PROPERFMTARGS(promo_potential)); + if (pip_mutator_regions + pip_collector_regions > 0) { + freeset->account_for_pip_regions(pip_mutator_regions, pip_mutator_bytes, pip_collector_regions, pip_collector_bytes); + } + + // Retire any regions that have been selected for promote in place + if (collector_regions_to_pip > 0) { + freeset->shrink_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::Collector, + pip_low_collector_idx, pip_high_collector_idx, + collector_regions_to_pip); + } + if (mutator_regions_to_pip > 0) { + freeset->shrink_interval_if_range_modifies_either_boundary(ShenandoahFreeSetPartitionId::Mutator, + pip_low_mutator_idx, pip_high_mutator_idx, + mutator_regions_to_pip); + } // Sort in increasing order according to live data bytes. Note that candidates represents the number of regions // that qualify to be promoted by evacuation. @@ -653,6 +714,8 @@ size_t ShenandoahGeneration::select_aged_regions(const size_t old_promotion_rese selected_regions, PROPERFMTARGS(selected_live), PROPERFMTARGS(old_consumed), PROPERFMTARGS(old_promotion_reserve)); } + log_info(gc, ergo)("Promotion potential of aged regions with sufficient garbage: " PROPERFMT, PROPERFMTARGS(promo_potential)); + heap->old_generation()->set_pad_for_promote_in_place(promote_in_place_pad); heap->old_generation()->set_promotion_potential(promo_potential); return old_consumed; @@ -754,9 +817,15 @@ void ShenandoahGeneration::prepare_regions_and_collection_set(bool concurrent) { // We are preparing for evacuation. At this time, we ignore cset region tallies. size_t first_old, last_old, num_old; - heap->free_set()->prepare_to_rebuild(young_cset_regions, old_cset_regions, first_old, last_old, num_old); + _free_set->prepare_to_rebuild(young_cset_regions, old_cset_regions, first_old, last_old, num_old); + + if (heap->mode()->is_generational()) { + ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::heap(); + gen_heap->compute_old_generation_balance(young_cset_regions, old_cset_regions); + } + // Free set construction uses reserve quantities, because they are known to be valid here - heap->free_set()->finish_rebuild(young_cset_regions, old_cset_regions, num_old, true); + _free_set->finish_rebuild(young_cset_regions, old_cset_regions, num_old, true); } } @@ -800,14 +869,12 @@ void ShenandoahGeneration::cancel_marking() { } ShenandoahGeneration::ShenandoahGeneration(ShenandoahGenerationType type, - uint max_workers, - size_t max_capacity) : + uint max_workers) : _type(type), _task_queues(new ShenandoahObjToScanQueueSet(max_workers)), _ref_processor(new ShenandoahReferenceProcessor(this, MAX2(max_workers, 1U))), - _affiliated_region_count(0), _humongous_waste(0), _evacuation_reserve(0), - _used(0), _bytes_allocated_since_gc_start(0), - _max_capacity(max_capacity), + _evacuation_reserve(0), + _free_set(nullptr), _heuristics(nullptr) { _is_marking_complete.set(); @@ -826,6 +893,11 @@ ShenandoahGeneration::~ShenandoahGeneration() { delete _task_queues; } +void ShenandoahGeneration::post_initialize(ShenandoahHeap* heap) { + _free_set = heap->free_set(); + assert(_free_set != nullptr, "bad initialization order"); +} + void ShenandoahGeneration::reserve_task_queues(uint workers) { _task_queues->reserve(workers); } @@ -853,159 +925,26 @@ void ShenandoahGeneration::scan_remembered_set(bool is_concurrent) { } } -size_t ShenandoahGeneration::increment_affiliated_region_count() { - shenandoah_assert_heaplocked_or_safepoint(); - // During full gc, multiple GC worker threads may change region affiliations without a lock. No lock is enforced - // on read and write of _affiliated_region_count. At the end of full gc, a single thread overwrites the count with - // a coherent value. - return AtomicAccess::add(&_affiliated_region_count, (size_t) 1); -} - -size_t ShenandoahGeneration::decrement_affiliated_region_count() { - shenandoah_assert_heaplocked_or_safepoint(); - // During full gc, multiple GC worker threads may change region affiliations without a lock. No lock is enforced - // on read and write of _affiliated_region_count. At the end of full gc, a single thread overwrites the count with - // a coherent value. - auto affiliated_region_count = AtomicAccess::sub(&_affiliated_region_count, (size_t) 1); - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (used() + _humongous_waste <= affiliated_region_count * ShenandoahHeapRegion::region_size_bytes()), - "used + humongous cannot exceed regions"); - return affiliated_region_count; -} - -size_t ShenandoahGeneration::decrement_affiliated_region_count_without_lock() { - return AtomicAccess::sub(&_affiliated_region_count, (size_t) 1); -} - -size_t ShenandoahGeneration::increase_affiliated_region_count(size_t delta) { - shenandoah_assert_heaplocked_or_safepoint(); - return AtomicAccess::add(&_affiliated_region_count, delta); -} - -size_t ShenandoahGeneration::decrease_affiliated_region_count(size_t delta) { - shenandoah_assert_heaplocked_or_safepoint(); - assert(AtomicAccess::load(&_affiliated_region_count) >= delta, "Affiliated region count cannot be negative"); - - auto const affiliated_region_count = AtomicAccess::sub(&_affiliated_region_count, delta); - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (_used + _humongous_waste <= affiliated_region_count * ShenandoahHeapRegion::region_size_bytes()), - "used + humongous cannot exceed regions"); - return affiliated_region_count; -} - -void ShenandoahGeneration::establish_usage(size_t num_regions, size_t num_bytes, size_t humongous_waste) { - assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at a safepoint"); - AtomicAccess::store(&_affiliated_region_count, num_regions); - AtomicAccess::store(&_used, num_bytes); - _humongous_waste = humongous_waste; -} - -void ShenandoahGeneration::increase_used(size_t bytes) { - AtomicAccess::add(&_used, bytes); -} - -void ShenandoahGeneration::increase_humongous_waste(size_t bytes) { - if (bytes > 0) { - AtomicAccess::add(&_humongous_waste, bytes); - } -} - -void ShenandoahGeneration::decrease_humongous_waste(size_t bytes) { - if (bytes > 0) { - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || (_humongous_waste >= bytes), - "Waste (%zu) cannot be negative (after subtracting %zu)", _humongous_waste, bytes); - AtomicAccess::sub(&_humongous_waste, bytes); - } -} - -void ShenandoahGeneration::decrease_used(size_t bytes) { - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (_used >= bytes), "cannot reduce bytes used by generation below zero"); - AtomicAccess::sub(&_used, bytes); -} - -size_t ShenandoahGeneration::used_regions() const { - return AtomicAccess::load(&_affiliated_region_count); -} - -size_t ShenandoahGeneration::free_unaffiliated_regions() const { - size_t result = max_capacity() / ShenandoahHeapRegion::region_size_bytes(); - auto const used_regions = this->used_regions(); - if (used_regions > result) { - result = 0; - } else { - result -= used_regions; - } - return result; -} - -size_t ShenandoahGeneration::used_regions_size() const { - return used_regions() * ShenandoahHeapRegion::region_size_bytes(); -} - size_t ShenandoahGeneration::available() const { - return available(max_capacity()); + size_t result = available(max_capacity()); + return result; } // For ShenandoahYoungGeneration, Include the young available that may have been reserved for the Collector. size_t ShenandoahGeneration::available_with_reserve() const { - return available(max_capacity()); + size_t result = available(max_capacity()); + return result; } size_t ShenandoahGeneration::soft_available() const { - return available(ShenandoahHeap::heap()->soft_max_capacity()); + size_t result = available(ShenandoahHeap::heap()->soft_max_capacity()); + return result; } size_t ShenandoahGeneration::available(size_t capacity) const { - size_t in_use = used() + get_humongous_waste(); - return in_use > capacity ? 0 : capacity - in_use; -} - -size_t ShenandoahGeneration::increase_capacity(size_t increment) { - shenandoah_assert_heaplocked_or_safepoint(); - - // We do not enforce that new capacity >= heap->max_size_for(this). The maximum generation size is treated as a rule of thumb - // which may be violated during certain transitions, such as when we are forcing transfers for the purpose of promoting regions - // in place. - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (_max_capacity + increment <= ShenandoahHeap::heap()->max_capacity()), "Generation cannot be larger than heap size"); - assert(increment % ShenandoahHeapRegion::region_size_bytes() == 0, "Generation capacity must be multiple of region size"); - _max_capacity += increment; - - // This detects arithmetic wraparound on _used - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (used_regions_size() >= used()), - "Affiliated regions must hold more than what is currently used"); - return _max_capacity; -} - -size_t ShenandoahGeneration::set_capacity(size_t byte_size) { - shenandoah_assert_heaplocked_or_safepoint(); - _max_capacity = byte_size; - return _max_capacity; -} - -size_t ShenandoahGeneration::decrease_capacity(size_t decrement) { - shenandoah_assert_heaplocked_or_safepoint(); - - // We do not enforce that new capacity >= heap->min_size_for(this). The minimum generation size is treated as a rule of thumb - // which may be violated during certain transitions, such as when we are forcing transfers for the purpose of promoting regions - // in place. - assert(decrement % ShenandoahHeapRegion::region_size_bytes() == 0, "Generation capacity must be multiple of region size"); - assert(_max_capacity >= decrement, "Generation capacity cannot be negative"); - - _max_capacity -= decrement; - - // This detects arithmetic wraparound on _used - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (used_regions_size() >= used()), - "Affiliated regions must hold more than what is currently used"); - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (_used <= _max_capacity), "Cannot use more than capacity"); - assert(ShenandoahHeap::heap()->is_full_gc_in_progress() || - (used_regions_size() <= _max_capacity), - "Cannot use more than capacity"); - return _max_capacity; + size_t in_use = used(); + size_t result = in_use > capacity ? 0 : capacity - in_use; + return result; } void ShenandoahGeneration::record_success_concurrent(bool abbreviated) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp index b926a5a0913..424a00f789d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGeneration.hpp @@ -27,6 +27,7 @@ #include "gc/shenandoah/heuristics/shenandoahSpaceInfo.hpp" #include "gc/shenandoah/shenandoahAffiliation.hpp" +#include "gc/shenandoah/shenandoahFreeSet.hpp" #include "gc/shenandoah/shenandoahGenerationType.hpp" #include "gc/shenandoah/shenandoahLock.hpp" #include "gc/shenandoah/shenandoahMarkingContext.hpp" @@ -40,7 +41,6 @@ class ShenandoahHeuristics; class ShenandoahMode; class ShenandoahReferenceProcessor; - class ShenandoahGeneration : public CHeapObj, public ShenandoahSpaceInfo { friend class VMStructs; private: @@ -52,26 +52,11 @@ private: ShenandoahReferenceProcessor* const _ref_processor; - volatile size_t _affiliated_region_count; - - // How much free memory is left in the last region of humongous objects. - // This is _not_ included in used, but it _is_ deducted from available, - // which gives the heuristics a more accurate view of how much memory remains - // for allocation. This figure is also included the heap status logging. - // The units are bytes. The value is only changed on a safepoint or under the - // heap lock. - size_t _humongous_waste; - // Bytes reserved within this generation to hold evacuated objects from the collection set size_t _evacuation_reserve; protected: - // Usage - - volatile size_t _used; - volatile size_t _bytes_allocated_since_gc_start; - size_t _max_capacity; - + ShenandoahFreeSet* _free_set; ShenandoahHeuristics* _heuristics; private: @@ -99,41 +84,43 @@ private: // to false. size_t select_aged_regions(size_t old_promotion_reserve); + // Return available assuming that we can allocate no more than capacity bytes within this generation. size_t available(size_t capacity) const; public: ShenandoahGeneration(ShenandoahGenerationType type, - uint max_workers, - size_t max_capacity); + uint max_workers); ~ShenandoahGeneration(); - bool is_young() const { return _type == YOUNG; } - bool is_old() const { return _type == OLD; } - bool is_global() const { return _type == GLOBAL || _type == NON_GEN; } + inline bool is_young() const { return _type == YOUNG; } + inline bool is_old() const { return _type == OLD; } + inline bool is_global() const { return _type == GLOBAL || _type == NON_GEN; } + inline ShenandoahGenerationType type() const { return _type; } // see description in field declaration void set_evacuation_reserve(size_t new_val); size_t get_evacuation_reserve() const; void augment_evacuation_reserve(size_t increment); - inline ShenandoahGenerationType type() const { return _type; } - virtual ShenandoahHeuristics* heuristics() const { return _heuristics; } ShenandoahReferenceProcessor* ref_processor() { return _ref_processor; } virtual ShenandoahHeuristics* initialize_heuristics(ShenandoahMode* gc_mode); - size_t max_capacity() const override { return _max_capacity; } - virtual size_t used_regions() const; - virtual size_t used_regions_size() const; - virtual size_t free_unaffiliated_regions() const; - size_t used() const override { return AtomicAccess::load(&_used); } + virtual void post_initialize(ShenandoahHeap* heap); + + virtual size_t bytes_allocated_since_gc_start() const override = 0; + virtual size_t used() const override = 0; + virtual size_t used_regions() const = 0; + virtual size_t used_regions_size() const = 0; + virtual size_t get_humongous_waste() const = 0; + virtual size_t free_unaffiliated_regions() const = 0; + virtual size_t get_affiliated_region_count() const = 0; + virtual size_t max_capacity() const override = 0; + size_t available() const override; size_t available_with_reserve() const; - size_t used_including_humongous_waste() const { - return used() + get_humongous_waste(); - } // Returns the memory available based on the _soft_ max heap capacity (soft_max_heap - used). // The soft max heap size may be adjusted lower than the max heap size to cause the trigger @@ -141,23 +128,6 @@ private: // max heap size will cause the adaptive heuristic to run more frequent cycles. size_t soft_available() const override; - size_t bytes_allocated_since_gc_start() const override; - - // Reset the bytes allocated within this generation since the start of GC. The argument initial_bytes_allocated - // is normally zero. In the case that some memory was allocated following the last allocation rate sample that - // precedes the start of GC, the number of bytes allocated is supplied as the initial value of bytes_allocated_since_gc_start. - // We will behave as if these bytes were allocated after the start of GC. - void reset_bytes_allocated_since_gc_start(size_t initial_bytes_allocated); - void increase_allocated(size_t bytes); - - // These methods change the capacity of the generation by adding or subtracting the given number of bytes from the current - // capacity, returning the capacity of the generation following the change. - size_t increase_capacity(size_t increment); - size_t decrease_capacity(size_t decrement); - - // Set the capacity of the generation, returning the value set - size_t set_capacity(size_t byte_size); - void log_status(const char* msg) const; // Used directly by FullGC @@ -217,29 +187,6 @@ private: // Scan remembered set at start of concurrent young-gen marking. void scan_remembered_set(bool is_concurrent); - // Return the updated value of affiliated_region_count - size_t increment_affiliated_region_count(); - - // Return the updated value of affiliated_region_count - size_t decrement_affiliated_region_count(); - // Same as decrement_affiliated_region_count, but w/o the need to hold heap lock before being called. - size_t decrement_affiliated_region_count_without_lock(); - - // Return the updated value of affiliated_region_count - size_t increase_affiliated_region_count(size_t delta); - - // Return the updated value of affiliated_region_count - size_t decrease_affiliated_region_count(size_t delta); - - void establish_usage(size_t num_regions, size_t num_bytes, size_t humongous_waste); - - void increase_used(size_t bytes); - void decrease_used(size_t bytes); - - void increase_humongous_waste(size_t bytes); - void decrease_humongous_waste(size_t bytes); - size_t get_humongous_waste() const { return _humongous_waste; } - virtual bool is_concurrent_mark_in_progress() = 0; void confirm_heuristics_mode(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.cpp deleted file mode 100644 index 17f3d2f199f..00000000000 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * 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. - * - * 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. - * - */ - -#include "gc/shared/gc_globals.hpp" -#include "gc/shenandoah/shenandoahGeneration.hpp" -#include "gc/shenandoah/shenandoahGenerationSizer.hpp" -#include "gc/shenandoah/shenandoahHeap.inline.hpp" -#include "gc/shenandoah/shenandoahHeapRegion.hpp" -#include "gc/shenandoah/shenandoahOldGeneration.hpp" -#include "gc/shenandoah/shenandoahYoungGeneration.hpp" -#include "logging/log.hpp" -#include "runtime/globals_extension.hpp" - - -ShenandoahGenerationSizer::ShenandoahGenerationSizer() - : _sizer_kind(SizerDefaults), - _min_desired_young_regions(0), - _max_desired_young_regions(0) { - - if (FLAG_IS_CMDLINE(NewRatio)) { - if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) { - log_warning(gc, ergo)("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio"); - } else { - _sizer_kind = SizerNewRatio; - return; - } - } - - if (NewSize > MaxNewSize) { - if (FLAG_IS_CMDLINE(MaxNewSize)) { - log_warning(gc, ergo)("NewSize (%zuk) is greater than the MaxNewSize (%zuk). " - "A new max generation size of %zuk will be used.", - NewSize/K, MaxNewSize/K, NewSize/K); - } - FLAG_SET_ERGO(MaxNewSize, NewSize); - } - - if (FLAG_IS_CMDLINE(NewSize)) { - _min_desired_young_regions = MAX2(uint(NewSize / ShenandoahHeapRegion::region_size_bytes()), 1U); - if (FLAG_IS_CMDLINE(MaxNewSize)) { - _max_desired_young_regions = MAX2(uint(MaxNewSize / ShenandoahHeapRegion::region_size_bytes()), 1U); - _sizer_kind = SizerMaxAndNewSize; - } else { - _sizer_kind = SizerNewSizeOnly; - } - } else if (FLAG_IS_CMDLINE(MaxNewSize)) { - _max_desired_young_regions = MAX2(uint(MaxNewSize / ShenandoahHeapRegion::region_size_bytes()), 1U); - _sizer_kind = SizerMaxNewSizeOnly; - } -} - -size_t ShenandoahGenerationSizer::calculate_min_young_regions(size_t heap_region_count) { - size_t min_young_regions = (heap_region_count * ShenandoahMinYoungPercentage) / 100; - return MAX2(min_young_regions, (size_t) 1U); -} - -size_t ShenandoahGenerationSizer::calculate_max_young_regions(size_t heap_region_count) { - size_t max_young_regions = (heap_region_count * ShenandoahMaxYoungPercentage) / 100; - return MAX2(max_young_regions, (size_t) 1U); -} - -void ShenandoahGenerationSizer::recalculate_min_max_young_length(size_t heap_region_count) { - assert(heap_region_count > 0, "Heap must be initialized"); - - switch (_sizer_kind) { - case SizerDefaults: - _min_desired_young_regions = calculate_min_young_regions(heap_region_count); - _max_desired_young_regions = calculate_max_young_regions(heap_region_count); - break; - case SizerNewSizeOnly: - _max_desired_young_regions = calculate_max_young_regions(heap_region_count); - _max_desired_young_regions = MAX2(_min_desired_young_regions, _max_desired_young_regions); - break; - case SizerMaxNewSizeOnly: - _min_desired_young_regions = calculate_min_young_regions(heap_region_count); - _min_desired_young_regions = MIN2(_min_desired_young_regions, _max_desired_young_regions); - break; - case SizerMaxAndNewSize: - // Do nothing. Values set on the command line, don't update them at runtime. - break; - case SizerNewRatio: - _min_desired_young_regions = MAX2(uint(heap_region_count / (NewRatio + 1)), 1U); - _max_desired_young_regions = _min_desired_young_regions; - break; - default: - ShouldNotReachHere(); - } - - assert(_min_desired_young_regions <= _max_desired_young_regions, "Invalid min/max young gen size values"); -} - -void ShenandoahGenerationSizer::heap_size_changed(size_t heap_size) { - recalculate_min_max_young_length(heap_size / ShenandoahHeapRegion::region_size_bytes()); -} - -bool ShenandoahGenerationSizer::transfer_regions(ShenandoahGeneration* src, ShenandoahGeneration* dst, size_t regions) const { - const size_t bytes_to_transfer = regions * ShenandoahHeapRegion::region_size_bytes(); - - if (src->free_unaffiliated_regions() < regions) { - // Source does not have enough free regions for this transfer. The caller should have - // already capped the transfer based on available unaffiliated regions. - return false; - } - - if (dst->max_capacity() + bytes_to_transfer > max_size_for(dst)) { - // This transfer would cause the destination generation to grow above its configured maximum size. - return false; - } - - if (src->max_capacity() - bytes_to_transfer < min_size_for(src)) { - // This transfer would cause the source generation to shrink below its configured minimum size. - return false; - } - - src->decrease_capacity(bytes_to_transfer); - dst->increase_capacity(bytes_to_transfer); - const size_t new_size = dst->max_capacity(); - log_info(gc, ergo)("Transfer %zu region(s) from %s to %s, yielding increased size: " PROPERFMT, - regions, src->name(), dst->name(), PROPERFMTARGS(new_size)); - return true; -} - - -size_t ShenandoahGenerationSizer::max_size_for(ShenandoahGeneration* generation) const { - switch (generation->type()) { - case YOUNG: - return max_young_size(); - case OLD: - // On the command line, max size of OLD is specified indirectly, by setting a minimum size of young. - // OLD is what remains within the heap after YOUNG has been sized. - return ShenandoahHeap::heap()->max_capacity() - min_young_size(); - default: - ShouldNotReachHere(); - return 0; - } -} - -size_t ShenandoahGenerationSizer::min_size_for(ShenandoahGeneration* generation) const { - switch (generation->type()) { - case YOUNG: - return min_young_size(); - case OLD: - // On the command line, min size of OLD is specified indirectly, by setting a maximum size of young. - // OLD is what remains within the heap after YOUNG has been sized. - return ShenandoahHeap::heap()->max_capacity() - max_young_size(); - default: - ShouldNotReachHere(); - return 0; - } -} - - -// Returns true iff transfer is successful -bool ShenandoahGenerationSizer::transfer_to_old(size_t regions) const { - ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); - return transfer_regions(heap->young_generation(), heap->old_generation(), regions); -} - -// This is used when promoting humongous or highly utilized regular regions in place. It is not required in this situation -// that the transferred regions be unaffiliated. -void ShenandoahGenerationSizer::force_transfer_to_old(size_t regions) const { - ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); - ShenandoahGeneration* old_gen = heap->old_generation(); - ShenandoahGeneration* young_gen = heap->young_generation(); - const size_t bytes_to_transfer = regions * ShenandoahHeapRegion::region_size_bytes(); - - young_gen->decrease_capacity(bytes_to_transfer); - old_gen->increase_capacity(bytes_to_transfer); - const size_t new_size = old_gen->max_capacity(); - log_info(gc, ergo)("Forcing transfer of %zu region(s) from %s to %s, yielding increased size: " PROPERFMT, - regions, young_gen->name(), old_gen->name(), PROPERFMTARGS(new_size)); -} - - -bool ShenandoahGenerationSizer::transfer_to_young(size_t regions) const { - ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); - return transfer_regions(heap->old_generation(), heap->young_generation(), regions); -} - -size_t ShenandoahGenerationSizer::min_young_size() const { - return min_young_regions() * ShenandoahHeapRegion::region_size_bytes(); -} - -size_t ShenandoahGenerationSizer::max_young_size() const { - return max_young_regions() * ShenandoahHeapRegion::region_size_bytes(); -} diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.hpp deleted file mode 100644 index 5752422bb77..00000000000 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationSizer.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Amazon.com Inc. 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONSIZER_HPP -#define SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONSIZER_HPP - -#include "utilities/globalDefinitions.hpp" - -class ShenandoahGeneration; -class ShenandoahGenerationalHeap; - -class ShenandoahGenerationSizer { -private: - enum SizerKind { - SizerDefaults, - SizerNewSizeOnly, - SizerMaxNewSizeOnly, - SizerMaxAndNewSize, - SizerNewRatio - }; - SizerKind _sizer_kind; - - size_t _min_desired_young_regions; - size_t _max_desired_young_regions; - - static size_t calculate_min_young_regions(size_t heap_region_count); - static size_t calculate_max_young_regions(size_t heap_region_count); - - // Update the given values for minimum and maximum young gen length in regions - // given the number of heap regions depending on the kind of sizing algorithm. - void recalculate_min_max_young_length(size_t heap_region_count); - - // This will attempt to transfer regions from the `src` generation to `dst` generation. - // If the transfer would violate the configured minimum size for the source or the configured - // maximum size of the destination, it will not perform the transfer and will return false. - // Returns true if the transfer is performed. - bool transfer_regions(ShenandoahGeneration* src, ShenandoahGeneration* dst, size_t regions) const; - - // Return the configured maximum size in bytes for the given generation. - size_t max_size_for(ShenandoahGeneration* generation) const; - - // Return the configured minimum size in bytes for the given generation. - size_t min_size_for(ShenandoahGeneration* generation) const; - -public: - ShenandoahGenerationSizer(); - - // Calculate the maximum length of the young gen given the number of regions - // depending on the sizing algorithm. - void heap_size_changed(size_t heap_size); - - // Minimum size of young generation in bytes as multiple of region size. - size_t min_young_size() const; - size_t min_young_regions() const { - return _min_desired_young_regions; - } - - // Maximum size of young generation in bytes as multiple of region size. - size_t max_young_size() const; - size_t max_young_regions() const { - return _max_desired_young_regions; - } - - // True if transfer succeeds, else false. See transfer_regions. - bool transfer_to_young(size_t regions) const; - bool transfer_to_old(size_t regions) const; - - // force transfer is used when we promote humongous objects. May violate min/max limits on generation sizes - void force_transfer_to_old(size_t regions) const; -}; - -#endif //SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONSIZER_HPP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp index 88b3c086da0..ece4150f577 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalControlThread.cpp @@ -244,7 +244,9 @@ void ShenandoahGenerationalControlThread::run_gc_cycle(const ShenandoahGCRequest GCIdMark gc_id_mark; - _heap->reset_bytes_allocated_since_gc_start(); + if (gc_mode() != servicing_old) { + _heap->reset_bytes_allocated_since_gc_start(); + } MetaspaceCombinedStats meta_sizes = MetaspaceUtils::get_combined_statistics(); @@ -288,11 +290,11 @@ void ShenandoahGenerationalControlThread::run_gc_cycle(const ShenandoahGCRequest if (!_heap->cancelled_gc()) { notify_gc_waiters(); notify_alloc_failure_waiters(); + // Report current free set state at the end of cycle if normal completion. + // Do not report if cancelled, since we may not have rebuilt free set and content is unreliable. + _heap->free_set()->log_status_under_lock(); } - // Report current free set state at the end of cycle, whether - // it is a normal completion, or the abort. - _heap->free_set()->log_status_under_lock(); // Notify Universe about new heap usage. This has implications for // global soft refs policy, and we better report it every time heap diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp index ccabdb7b9da..4a3faa2c707 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalEvacuationTask.cpp @@ -174,11 +174,13 @@ void ShenandoahGenerationalEvacuationTask::promote_in_place(ShenandoahHeapRegion assert(!_generation->is_old(), "Sanity check"); ShenandoahMarkingContext* const marking_context = _heap->young_generation()->complete_marking_context(); HeapWord* const tams = marking_context->top_at_mark_start(region); + size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); { - const size_t old_garbage_threshold = (ShenandoahHeapRegion::region_size_bytes() * ShenandoahOldGarbageThreshold) / 100; + const size_t old_garbage_threshold = (region_size_bytes * ShenandoahOldGarbageThreshold) / 100; assert(!_heap->is_concurrent_old_mark_in_progress(), "Cannot promote in place during old marking"); - assert(region->garbage_before_padded_for_promote() < old_garbage_threshold, "Region %zu has too much garbage for promotion", region->index()); + assert(region->garbage_before_padded_for_promote() < old_garbage_threshold, + "Region %zu has too much garbage for promotion", region->index()); assert(region->is_young(), "Only young regions can be promoted"); assert(region->is_regular(), "Use different service to promote humongous regions"); assert(_heap->is_tenurable(region), "Only promote regions that are sufficiently aged"); @@ -225,35 +227,29 @@ void ShenandoahGenerationalEvacuationTask::promote_in_place(ShenandoahHeapRegion ShenandoahHeapLocker locker(_heap->lock()); HeapWord* update_watermark = region->get_update_watermark(); + // pip_unpadded is memory too small to be filled above original top + size_t pip_unpadded = (region->end() - region->top()) * HeapWordSize; + assert((region->top() == region->end()) + || (pip_unpadded == (size_t) ((region->end() - region->top()) * HeapWordSize)), "Invariant"); + assert(pip_unpadded < ShenandoahHeap::min_fill_size() * HeapWordSize, "Sanity"); + size_t pip_pad_bytes = (region->top() - region->get_top_before_promote()) * HeapWordSize; + assert((pip_unpadded == 0) || (pip_pad_bytes == 0), "Only one of pip_unpadded and pip_pad_bytes is non-zero"); // Now that this region is affiliated with old, we can allow it to receive allocations, though it may not be in the - // is_collector_free range. + // is_collector_free range. We'll add it to that range below. region->restore_top_before_promote(); - - size_t region_used = region->used(); +#ifdef ASSERT + size_t region_to_be_used_in_old = region->used(); + assert(region_to_be_used_in_old + pip_pad_bytes + pip_unpadded == region_size_bytes, "invariant"); +#endif // The update_watermark was likely established while we had the artificially high value of top. Make it sane now. assert(update_watermark >= region->top(), "original top cannot exceed preserved update_watermark"); region->set_update_watermark(region->top()); - // Unconditionally transfer one region from young to old. This represents the newly promoted region. - // This expands old and shrinks new by the size of one region. Strictly, we do not "need" to expand old - // if there are already enough unaffiliated regions in old to account for this newly promoted region. - // However, if we do not transfer the capacities, we end up reducing the amount of memory that would have - // otherwise been available to hold old evacuations, because old available is max_capacity - used and now - // we would be trading a fully empty region for a partially used region. - young_gen->decrease_used(region_used); - young_gen->decrement_affiliated_region_count(); - - // transfer_to_old() increases capacity of old and decreases capacity of young - _heap->generation_sizer()->force_transfer_to_old(1); - region->set_affiliation(OLD_GENERATION); - - old_gen->increment_affiliated_region_count(); - old_gen->increase_used(region_used); - - // add_old_collector_free_region() increases promoted_reserve() if available space exceeds plab_min_size() + // Transfer this region from young to old, increasing promoted_reserve if available space exceeds plab_min_size() _heap->free_set()->add_promoted_in_place_region_to_old_collector(region); + region->set_affiliation(OLD_GENERATION); } } @@ -268,7 +264,8 @@ void ShenandoahGenerationalEvacuationTask::promote_humongous(ShenandoahHeapRegio const size_t used_bytes = obj->size() * HeapWordSize; const size_t spanned_regions = ShenandoahHeapRegion::required_regions(used_bytes); - const size_t humongous_waste = spanned_regions * ShenandoahHeapRegion::region_size_bytes() - obj->size() * HeapWordSize; + const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + const size_t humongous_waste = spanned_regions * region_size_bytes - obj->size() * HeapWordSize; const size_t index_limit = region->index() + spanned_regions; ShenandoahOldGeneration* const old_gen = _heap->old_generation(); @@ -282,13 +279,6 @@ void ShenandoahGenerationalEvacuationTask::promote_humongous(ShenandoahHeapRegio // usage totals, including humongous waste, after evacuation is done. log_debug(gc)("promoting humongous region %zu, spanning %zu", region->index(), spanned_regions); - young_gen->decrease_used(used_bytes); - young_gen->decrease_humongous_waste(humongous_waste); - young_gen->decrease_affiliated_region_count(spanned_regions); - - // transfer_to_old() increases capacity of old and decreases capacity of young - _heap->generation_sizer()->force_transfer_to_old(spanned_regions); - // For this region and each humongous continuation region spanned by this humongous object, change // affiliation to OLD_GENERATION and adjust the generation-use tallies. The remnant of memory // in the last humongous region that is not spanned by obj is currently not used. @@ -300,9 +290,8 @@ void ShenandoahGenerationalEvacuationTask::promote_humongous(ShenandoahHeapRegio r->set_affiliation(OLD_GENERATION); } - old_gen->increase_affiliated_region_count(spanned_regions); - old_gen->increase_used(used_bytes); - old_gen->increase_humongous_waste(humongous_waste); + ShenandoahFreeSet* freeset = _heap->free_set(); + freeset->transfer_humongous_regions_from_mutator_to_old_collector(spanned_regions, humongous_waste); } // Since this region may have served previously as OLD, it may hold obsolete object range info. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp index 8d8091472fc..ef913362df3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.cpp @@ -41,7 +41,7 @@ void assert_regions_used_not_more_than_capacity(ShenandoahGeneration* generation } void assert_usage_not_more_than_regions_used(ShenandoahGeneration* generation) { - assert(generation->used_including_humongous_waste() <= generation->used_regions_size(), + assert(generation->used() <= generation->used_regions_size(), "%s consumed can be no larger than span of affiliated regions", generation->name()); } #else @@ -83,7 +83,7 @@ void ShenandoahGenerationalFullGC::handle_completion(ShenandoahHeap* heap) { assert_usage_not_more_than_regions_used(young); // Establish baseline for next old-has-grown trigger. - old->set_live_bytes_after_last_mark(old->used_including_humongous_waste()); + old->set_live_bytes_after_last_mark(old->used()); } void ShenandoahGenerationalFullGC::rebuild_remembered_set(ShenandoahHeap* heap) { @@ -104,33 +104,6 @@ void ShenandoahGenerationalFullGC::rebuild_remembered_set(ShenandoahHeap* heap) heap->old_generation()->set_parsable(true); } -void ShenandoahGenerationalFullGC::balance_generations_after_gc(ShenandoahHeap* heap) { - ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::cast(heap); - ShenandoahOldGeneration* const old_gen = gen_heap->old_generation(); - - size_t old_usage = old_gen->used_regions_size(); - size_t old_capacity = old_gen->max_capacity(); - - assert(old_usage % ShenandoahHeapRegion::region_size_bytes() == 0, "Old usage must align with region size"); - assert(old_capacity % ShenandoahHeapRegion::region_size_bytes() == 0, "Old capacity must align with region size"); - - if (old_capacity > old_usage) { - size_t excess_old_regions = (old_capacity - old_usage) / ShenandoahHeapRegion::region_size_bytes(); - gen_heap->generation_sizer()->transfer_to_young(excess_old_regions); - } else if (old_capacity < old_usage) { - size_t old_regions_deficit = (old_usage - old_capacity) / ShenandoahHeapRegion::region_size_bytes(); - gen_heap->generation_sizer()->force_transfer_to_old(old_regions_deficit); - } - - log_info(gc, ergo)("FullGC done: young usage: " PROPERFMT ", old usage: " PROPERFMT, - PROPERFMTARGS(gen_heap->young_generation()->used()), - PROPERFMTARGS(old_gen->used())); -} - -ShenandoahGenerationalHeap::TransferResult ShenandoahGenerationalFullGC::balance_generations_after_rebuilding_free_set() { - return ShenandoahGenerationalHeap::heap()->balance_generations(); -} - void ShenandoahGenerationalFullGC::log_live_in_old(ShenandoahHeap* heap) { LogTarget(Debug, gc) lt; if (lt.is_enabled()) { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.hpp index 06080286f22..32abc5455ce 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalFullGC.hpp @@ -45,25 +45,11 @@ public: // Records end of cycle for young and old and establishes size of live bytes in old static void handle_completion(ShenandoahHeap* heap); - // Full GC may have promoted regions and may have temporarily violated constraints on the usage and - // capacity of the old generation. This method will balance the accounting of regions between the - // young and old generations. This is somewhat vestigial, but the outcome of this method is used - // when rebuilding the free sets. - static void balance_generations_after_gc(ShenandoahHeap* heap); - // This will compute the target size for the old generation. It will be expressed in terms of // a region surplus and deficit, which will be redistributed accordingly after rebuilding the // free set. static void compute_balances(); - // Rebuilding the free set may have resulted in regions being pulled in to the old generation - // evacuation reserve. For this reason, we must update the usage and capacity of the generations - // again. In the distant past, the free set did not know anything about generations, so we had - // a layer built above it to represent how much young/old memory was available. This layer is - // redundant and adds complexity. We would like to one day remove it. Until then, we must keep it - // synchronized with the free set's view of things. - static ShenandoahGenerationalHeap::TransferResult balance_generations_after_rebuilding_free_set(); - // Logs the number of live bytes marked in the old generation. This is _not_ the same // value used as the baseline for the old generation _after_ the full gc is complete. // The value reported in the logs does not include objects and regions that may be diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 5c7b65405cf..e5f766f9df1 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -27,6 +27,7 @@ #include "gc/shenandoah/shenandoahClosures.inline.hpp" #include "gc/shenandoah/shenandoahCollectorPolicy.hpp" #include "gc/shenandoah/shenandoahFreeSet.hpp" +#include "gc/shenandoah/shenandoahGeneration.hpp" #include "gc/shenandoah/shenandoahGenerationalControlThread.hpp" #include "gc/shenandoah/shenandoahGenerationalEvacuationTask.hpp" #include "gc/shenandoah/shenandoahGenerationalHeap.hpp" @@ -107,17 +108,25 @@ void ShenandoahGenerationalHeap::initialize_heuristics() { // for old would be total heap - minimum capacity of young. This means the sum of the maximum // allowed for old and young could exceed the total heap size. It remains the case that the // _actual_ capacity of young + old = total. - _generation_sizer.heap_size_changed(max_capacity()); - size_t initial_capacity_young = _generation_sizer.max_young_size(); - size_t max_capacity_young = _generation_sizer.max_young_size(); + size_t region_count = num_regions(); + size_t max_young_regions = MAX2((region_count * ShenandoahMaxYoungPercentage) / 100, (size_t) 1U); + size_t initial_capacity_young = max_young_regions * ShenandoahHeapRegion::region_size_bytes(); + size_t max_capacity_young = initial_capacity_young; + size_t initial_capacity_old = max_capacity() - max_capacity_young; size_t max_capacity_old = max_capacity() - initial_capacity_young; - _young_generation = new ShenandoahYoungGeneration(max_workers(), max_capacity_young); - _old_generation = new ShenandoahOldGeneration(max_workers(), max_capacity_old); + _young_generation = new ShenandoahYoungGeneration(max_workers()); + _old_generation = new ShenandoahOldGeneration(max_workers()); _young_generation->initialize_heuristics(mode()); _old_generation->initialize_heuristics(mode()); } +void ShenandoahGenerationalHeap::post_initialize_heuristics() { + ShenandoahHeap::post_initialize_heuristics(); + _young_generation->post_initialize(this); + _old_generation->post_initialize(this); +} + void ShenandoahGenerationalHeap::initialize_serviceability() { assert(mode()->is_generational(), "Only for the generational mode"); _young_gen_memory_pool = new ShenandoahYoungGenMemoryPool(this); @@ -577,39 +586,13 @@ void ShenandoahGenerationalHeap::retire_plab(PLAB* plab) { retire_plab(plab, thread); } -ShenandoahGenerationalHeap::TransferResult ShenandoahGenerationalHeap::balance_generations() { - shenandoah_assert_heaplocked_or_safepoint(); - - ShenandoahOldGeneration* old_gen = old_generation(); - const ssize_t old_region_balance = old_gen->get_region_balance(); - old_gen->set_region_balance(0); - - if (old_region_balance > 0) { - const auto old_region_surplus = checked_cast(old_region_balance); - const bool success = generation_sizer()->transfer_to_young(old_region_surplus); - return TransferResult { - success, old_region_surplus, "young" - }; - } - - if (old_region_balance < 0) { - const auto old_region_deficit = checked_cast(-old_region_balance); - const bool success = generation_sizer()->transfer_to_old(old_region_deficit); - if (!success) { - old_gen->handle_failed_transfer(); - } - return TransferResult { - success, old_region_deficit, "old" - }; - } - - return TransferResult {true, 0, "none"}; -} - // Make sure old-generation is large enough, but no larger than is necessary, to hold mixed evacuations // and promotions, if we anticipate either. Any deficit is provided by the young generation, subject to // xfer_limit, and any surplus is transferred to the young generation. -// xfer_limit is the maximum we're able to transfer from young to old. +// +// xfer_limit is the maximum we're able to transfer from young to old based on either: +// 1. an assumption that we will be able to replenish memory "borrowed" from young at the end of collection, or +// 2. there is sufficient excess in the allocation runway during GC idle cycles void ShenandoahGenerationalHeap::compute_old_generation_balance(size_t old_xfer_limit, size_t old_cset_regions) { // We can limit the old reserve to the size of anticipated promotions: @@ -637,9 +620,9 @@ void ShenandoahGenerationalHeap::compute_old_generation_balance(size_t old_xfer_ // In the case that ShenandoahOldEvacRatioPercent equals 100, max_old_reserve is limited only by xfer_limit. const double bound_on_old_reserve = old_available + old_xfer_limit + young_reserve; - const double max_old_reserve = (ShenandoahOldEvacRatioPercent == 100)? - bound_on_old_reserve: MIN2(double(young_reserve * ShenandoahOldEvacRatioPercent) / double(100 - ShenandoahOldEvacRatioPercent), - bound_on_old_reserve); + const double max_old_reserve = ((ShenandoahOldEvacRatioPercent == 100)? bound_on_old_reserve: + MIN2(double(young_reserve * ShenandoahOldEvacRatioPercent) + / double(100 - ShenandoahOldEvacRatioPercent), bound_on_old_reserve)); const size_t region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); @@ -648,10 +631,12 @@ void ShenandoahGenerationalHeap::compute_old_generation_balance(size_t old_xfer_ if (old_generation()->has_unprocessed_collection_candidates()) { // We want this much memory to be unfragmented in order to reliably evacuate old. This is conservative because we // may not evacuate the entirety of unprocessed candidates in a single mixed evacuation. - const double max_evac_need = (double(old_generation()->unprocessed_collection_candidates_live_memory()) * ShenandoahOldEvacWaste); + const double max_evac_need = + (double(old_generation()->unprocessed_collection_candidates_live_memory()) * ShenandoahOldEvacWaste); assert(old_available >= old_generation()->free_unaffiliated_regions() * region_size_bytes, "Unaffiliated available must be less than total available"); - const double old_fragmented_available = double(old_available - old_generation()->free_unaffiliated_regions() * region_size_bytes); + const double old_fragmented_available = + double(old_available - old_generation()->free_unaffiliated_regions() * region_size_bytes); reserve_for_mixed = max_evac_need + old_fragmented_available; if (reserve_for_mixed > max_old_reserve) { reserve_for_mixed = max_old_reserve; @@ -698,6 +683,7 @@ void ShenandoahGenerationalHeap::compute_old_generation_balance(size_t old_xfer_ } void ShenandoahGenerationalHeap::reset_generation_reserves() { + ShenandoahHeapLocker locker(lock()); young_generation()->set_evacuation_reserve(0); old_generation()->set_evacuation_reserve(0); old_generation()->set_promoted_reserve(0); @@ -1060,15 +1046,6 @@ void ShenandoahGenerationalHeap::complete_degenerated_cycle() { // a more detailed explanation. old_generation()->transfer_pointers_from_satb(); } - - // We defer generation resizing actions until after cset regions have been recycled. - TransferResult result = balance_generations(); - LogTarget(Info, gc, ergo) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - result.print_on("Degenerated GC", &ls); - } - // In case degeneration interrupted concurrent evacuation or update references, we need to clean up // transient state. Otherwise, these actions have no effect. reset_generation_reserves(); @@ -1090,24 +1067,7 @@ void ShenandoahGenerationalHeap::complete_concurrent_cycle() { // throw off the heuristics. entry_global_coalesce_and_fill(); } - - log_info(gc, cset)("Concurrent cycle complete, promotions reserved: %zu, promotions expended: %zu, failed count: %zu, failed bytes: %zu", - old_generation()->get_promoted_reserve(), old_generation()->get_promoted_expended(), - old_generation()->get_promotion_failed_count(), old_generation()->get_promotion_failed_words() * HeapWordSize); - - TransferResult result; - { - ShenandoahHeapLocker locker(lock()); - - result = balance_generations(); - reset_generation_reserves(); - } - - LogTarget(Info, gc, ergo) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - result.print_on("Concurrent GC", &ls); - } + reset_generation_reserves(); } void ShenandoahGenerationalHeap::entry_global_coalesce_and_fill() { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp index 4c8c9fe0118..3eeec26dbbf 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.hpp @@ -41,6 +41,7 @@ public: explicit ShenandoahGenerationalHeap(ShenandoahCollectorPolicy* policy); void post_initialize() override; void initialize_heuristics() override; + void post_initialize_heuristics() override; static ShenandoahGenerationalHeap* heap() { assert(ShenandoahCardBarrier, "Should have card barrier to use genenrational heap"); @@ -138,8 +139,6 @@ public: void print_on(const char* when, outputStream* ss) const; }; - const ShenandoahGenerationSizer* generation_sizer() const { return &_generation_sizer; } - // Zeros out the evacuation and promotion reserves void reset_generation_reserves(); @@ -163,8 +162,6 @@ private: MemoryPool* _young_gen_memory_pool; MemoryPool* _old_gen_memory_pool; - - ShenandoahGenerationSizer _generation_sizer; }; #endif //SHARE_GC_SHENANDOAH_SHENANDOAHGENERATIONALHEAP diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.cpp index 6099c41f262..c9972e2db81 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.cpp @@ -37,17 +37,38 @@ const char* ShenandoahGlobalGeneration::name() const { } size_t ShenandoahGlobalGeneration::max_capacity() const { - return ShenandoahHeap::heap()->max_capacity(); + size_t total_regions = _free_set->total_global_regions(); + return total_regions * ShenandoahHeapRegion::region_size_bytes(); } +size_t ShenandoahGlobalGeneration::free_unaffiliated_regions() const { + return _free_set->global_unaffiliated_regions(); +} + +size_t ShenandoahGlobalGeneration::used() const { + return _free_set->global_used(); +} + +size_t ShenandoahGlobalGeneration::bytes_allocated_since_gc_start() const { + return _free_set->get_bytes_allocated_since_gc_start(); +} + +size_t ShenandoahGlobalGeneration::get_affiliated_region_count() const { + return _free_set->global_affiliated_regions(); +} + +size_t ShenandoahGlobalGeneration::get_humongous_waste() const { + return _free_set->total_humongous_waste(); +} + + size_t ShenandoahGlobalGeneration::used_regions() const { - ShenandoahGenerationalHeap* heap = ShenandoahGenerationalHeap::heap(); - assert(heap->mode()->is_generational(), "Region usage accounting is only for generational mode"); - return heap->old_generation()->used_regions() + heap->young_generation()->used_regions(); + return _free_set->global_affiliated_regions(); } size_t ShenandoahGlobalGeneration::used_regions_size() const { - return ShenandoahHeap::heap()->capacity(); + size_t used_regions = _free_set->global_affiliated_regions(); + return used_regions * ShenandoahHeapRegion::region_size_bytes(); } size_t ShenandoahGlobalGeneration::available() const { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.hpp index a823784a459..5ceba8ed50e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGlobalGeneration.hpp @@ -32,15 +32,29 @@ // A "generation" that represents the whole heap. class ShenandoahGlobalGeneration : public ShenandoahGeneration { public: - ShenandoahGlobalGeneration(bool generational, uint max_queues, size_t max_capacity) - : ShenandoahGeneration(generational ? GLOBAL : NON_GEN, max_queues, max_capacity) { } + ShenandoahGlobalGeneration(bool generational, uint max_queues) + : ShenandoahGeneration(generational ? GLOBAL : NON_GEN, max_queues) { +#ifdef ASSERT + ShenandoahHeap* heap = ShenandoahHeap::heap(); + bool is_generational = heap->mode()->is_generational(); + assert(is_generational == generational, "sanity"); + assert((is_generational && (type() == ShenandoahGenerationType::GLOBAL)) || + (!is_generational && (type() == ShenandoahGenerationType::NON_GEN)), "OO sanity"); +#endif + } public: const char* name() const override; - size_t max_capacity() const override; + size_t bytes_allocated_since_gc_start() const override; + size_t used() const override; size_t used_regions() const override; size_t used_regions_size() const override; + size_t get_humongous_waste() const override; + size_t free_unaffiliated_regions() const override; + size_t get_affiliated_region_count() const override; + size_t max_capacity() const override; + size_t available() const override; size_t soft_available() const override; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index a058a7bd38d..f66d83204a4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -201,7 +201,7 @@ jint ShenandoahHeap::initialize() { assert(num_min_regions <= _num_regions, "sanity"); _minimum_size = num_min_regions * reg_size_bytes; - _soft_max_size = SoftMaxHeapSize; + _soft_max_size = clamp(SoftMaxHeapSize, min_capacity(), max_capacity()); _committed = _initial_size; @@ -252,7 +252,7 @@ jint ShenandoahHeap::initialize() { // it means we're under passive mode and we have to initialize old gen // for the purpose of having card table. if (ShenandoahCardBarrier && !(mode()->is_generational())) { - _old_generation = new ShenandoahOldGeneration(max_workers(), max_capacity()); + _old_generation = new ShenandoahOldGeneration(max_workers()); } assert(_heap_region.byte_size() == heap_rs.size(), "Need to know reserved size for card table"); @@ -411,7 +411,6 @@ jint ShenandoahHeap::initialize() { { ShenandoahHeapLocker locker(lock()); - _free_set = new ShenandoahFreeSet(this, _num_regions); for (size_t i = 0; i < _num_regions; i++) { HeapWord* start = (HeapWord*)sh_rs.base() + ShenandoahHeapRegion::region_size_words() * i; bool is_committed = i < num_committed_regions; @@ -426,12 +425,21 @@ jint ShenandoahHeap::initialize() { _affiliations[i] = ShenandoahAffiliation::FREE; } + _free_set = new ShenandoahFreeSet(this, _num_regions); - size_t young_cset_regions, old_cset_regions; + post_initialize_heuristics(); // We are initializing free set. We ignore cset region tallies. - size_t first_old, last_old, num_old; + size_t young_cset_regions, old_cset_regions, first_old, last_old, num_old; _free_set->prepare_to_rebuild(young_cset_regions, old_cset_regions, first_old, last_old, num_old); + if (mode()->is_generational()) { + ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::heap(); + // We cannot call + // gen_heap->young_generation()->heuristics()->bytes_of_allocation_runway_before_gc_trigger(young_cset_regions) + // until after the heap is fully initialized. So we make up a safe value here. + size_t allocation_runway = InitialHeapSize / 2; + gen_heap->compute_old_generation_balance(allocation_runway, old_cset_regions); + } _free_set->finish_rebuild(young_cset_regions, old_cset_regions, num_old); } @@ -525,10 +533,14 @@ void ShenandoahHeap::initialize_mode() { } void ShenandoahHeap::initialize_heuristics() { - _global_generation = new ShenandoahGlobalGeneration(mode()->is_generational(), max_workers(), max_capacity()); + _global_generation = new ShenandoahGlobalGeneration(mode()->is_generational(), max_workers()); _global_generation->initialize_heuristics(mode()); } +void ShenandoahHeap::post_initialize_heuristics() { + _global_generation->post_initialize(this); +} + #ifdef _MSC_VER #pragma warning( push ) #pragma warning( disable:4355 ) // 'this' : used in base member initializer list @@ -673,6 +685,8 @@ public: void ShenandoahHeap::post_initialize() { CollectedHeap::post_initialize(); + check_soft_max_changed(); + // Schedule periodic task to report on gc thread CPU utilization _mmu_tracker.initialize(); @@ -717,75 +731,6 @@ void ShenandoahHeap::decrease_committed(size_t bytes) { _committed -= bytes; } -// For tracking usage based on allocations, it should be the case that: -// * The sum of regions::used == heap::used -// * The sum of a generation's regions::used == generation::used -// * The sum of a generation's humongous regions::free == generation::humongous_waste -// These invariants are checked by the verifier on GC safepoints. -// -// Additional notes: -// * When a mutator's allocation request causes a region to be retired, the -// free memory left in that region is considered waste. It does not contribute -// to the usage, but it _does_ contribute to allocation rate. -// * The bottom of a PLAB must be aligned on card size. In some cases this will -// require padding in front of the PLAB (a filler object). Because this padding -// is included in the region's used memory we include the padding in the usage -// accounting as waste. -// * Mutator allocations are used to compute an allocation rate. -// * There are three sources of waste: -// 1. The padding used to align a PLAB on card size -// 2. Region's free is less than minimum TLAB size and is retired -// 3. The unused portion of memory in the last region of a humongous object -void ShenandoahHeap::increase_used(const ShenandoahAllocRequest& req) { - size_t actual_bytes = req.actual_size() * HeapWordSize; - size_t wasted_bytes = req.waste() * HeapWordSize; - ShenandoahGeneration* generation = generation_for(req.affiliation()); - - if (req.is_gc_alloc()) { - assert(wasted_bytes == 0 || req.type() == ShenandoahAllocRequest::_alloc_plab, "Only PLABs have waste"); - increase_used(generation, actual_bytes + wasted_bytes); - } else { - assert(req.is_mutator_alloc(), "Expected mutator alloc here"); - // padding and actual size both count towards allocation counter - generation->increase_allocated(actual_bytes + wasted_bytes); - - // only actual size counts toward usage for mutator allocations - increase_used(generation, actual_bytes); - - if (wasted_bytes > 0 && ShenandoahHeapRegion::requires_humongous(req.actual_size())) { - increase_humongous_waste(generation,wasted_bytes); - } - } -} - -void ShenandoahHeap::increase_humongous_waste(ShenandoahGeneration* generation, size_t bytes) { - generation->increase_humongous_waste(bytes); - if (!generation->is_global()) { - global_generation()->increase_humongous_waste(bytes); - } -} - -void ShenandoahHeap::decrease_humongous_waste(ShenandoahGeneration* generation, size_t bytes) { - generation->decrease_humongous_waste(bytes); - if (!generation->is_global()) { - global_generation()->decrease_humongous_waste(bytes); - } -} - -void ShenandoahHeap::increase_used(ShenandoahGeneration* generation, size_t bytes) { - generation->increase_used(bytes); - if (!generation->is_global()) { - global_generation()->increase_used(bytes); - } -} - -void ShenandoahHeap::decrease_used(ShenandoahGeneration* generation, size_t bytes) { - generation->decrease_used(bytes); - if (!generation->is_global()) { - global_generation()->decrease_used(bytes); - } -} - size_t ShenandoahHeap::capacity() const { return committed(); } @@ -1034,10 +979,6 @@ HeapWord* ShenandoahHeap::allocate_memory(ShenandoahAllocRequest& req) { req.set_actual_size(0); } - // This is called regardless of the outcome of the allocation to account - // for any waste created by retiring regions with this request. - increase_used(req); - if (result != nullptr) { size_t requested = req.size(); size_t actual = req.actual_size(); @@ -2347,18 +2288,16 @@ void ShenandoahHeap::reset_bytes_allocated_since_gc_start() { // the "forced sample" will not happen, and any recently allocated bytes are "unaccounted for". We pretend these // bytes are allocated after the start of subsequent gc. size_t unaccounted_bytes; + ShenandoahFreeSet* _free_set = free_set(); + size_t bytes_allocated = _free_set->get_bytes_allocated_since_gc_start(); if (mode()->is_generational()) { - size_t bytes_allocated = young_generation()->bytes_allocated_since_gc_start(); unaccounted_bytes = young_generation()->heuristics()->force_alloc_rate_sample(bytes_allocated); - young_generation()->reset_bytes_allocated_since_gc_start(unaccounted_bytes); - unaccounted_bytes = 0; - old_generation()->reset_bytes_allocated_since_gc_start(unaccounted_bytes); } else { - size_t bytes_allocated = global_generation()->bytes_allocated_since_gc_start(); // Single-gen Shenandoah uses global heuristics. unaccounted_bytes = heuristics()->force_alloc_rate_sample(bytes_allocated); } - global_generation()->reset_bytes_allocated_since_gc_start(unaccounted_bytes); + ShenandoahHeapLocker locker(lock()); + _free_set->reset_bytes_allocated_since_gc_start(unaccounted_bytes); } void ShenandoahHeap::set_degenerated_gc_in_progress(bool in_progress) { @@ -2743,6 +2682,9 @@ GrowableArray ShenandoahHeap::memory_pools() { } MemoryUsage ShenandoahHeap::memory_usage() { + assert(_initial_size <= ShenandoahHeap::heap()->max_capacity(), "sanity"); + assert(used() <= ShenandoahHeap::heap()->max_capacity(), "sanity"); + assert(committed() <= ShenandoahHeap::heap()->max_capacity(), "sanity"); return MemoryUsage(_initial_size, used(), committed(), max_capacity()); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp index e44bbd55e92..6cbe44fef09 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp @@ -35,7 +35,6 @@ #include "gc/shenandoah/shenandoahController.hpp" #include "gc/shenandoah/shenandoahEvacOOMHandler.hpp" #include "gc/shenandoah/shenandoahEvacTracker.hpp" -#include "gc/shenandoah/shenandoahGenerationSizer.hpp" #include "gc/shenandoah/shenandoahGenerationType.hpp" #include "gc/shenandoah/shenandoahLock.hpp" #include "gc/shenandoah/shenandoahMmuTracker.hpp" @@ -183,6 +182,7 @@ public: void post_initialize() override; void initialize_mode(); virtual void initialize_heuristics(); + virtual void post_initialize_heuristics(); virtual void print_init_logger() const; void initialize_serviceability() override; @@ -212,14 +212,7 @@ private: volatile size_t _committed; shenandoah_padding(1); - void increase_used(const ShenandoahAllocRequest& req); - public: - void increase_used(ShenandoahGeneration* generation, size_t bytes); - void decrease_used(ShenandoahGeneration* generation, size_t bytes); - void increase_humongous_waste(ShenandoahGeneration* generation, size_t bytes); - void decrease_humongous_waste(ShenandoahGeneration* generation, size_t bytes); - void increase_committed(size_t bytes); void decrease_committed(size_t bytes); @@ -698,8 +691,6 @@ public: size_t size, Metaspace::MetadataType mdtype) override; - void notify_mutator_alloc_words(size_t words, size_t waste); - HeapWord* allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) override; size_t tlab_capacity(Thread *thr) const override; size_t unsafe_max_tlab_alloc(Thread *thread) const override; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp index ca0f7460d54..3cd5cdd2ec3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.cpp @@ -578,16 +578,16 @@ void ShenandoahHeapRegion::recycle_internal() { set_affiliation(FREE); } +// Upon return, this region has been recycled. We try to recycle it. +// We may fail if some other thread recycled it before we do. void ShenandoahHeapRegion::try_recycle_under_lock() { shenandoah_assert_heaplocked(); if (is_trash() && _recycling.try_set()) { if (is_trash()) { - ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahGeneration* generation = heap->generation_for(affiliation()); - - heap->decrease_used(generation, used()); - generation->decrement_affiliated_region_count(); - + // At freeset rebuild time, which precedes recycling of collection set, we treat all cset regions as + // part of capacity, as empty, as fully available, and as unaffiliated. This provides short-lived optimism + // for triggering heuristics. It greatly simplifies and reduces the locking overhead required + // by more time-precise accounting of these details. recycle_internal(); } _recycling.unset(); @@ -608,11 +608,10 @@ void ShenandoahHeapRegion::try_recycle() { if (is_trash() && _recycling.try_set()) { // Double check region state after win the race to set recycling flag if (is_trash()) { - ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahGeneration* generation = heap->generation_for(affiliation()); - heap->decrease_used(generation, used()); - generation->decrement_affiliated_region_count_without_lock(); - + // At freeset rebuild time, which precedes recycling of collection set, we treat all cset regions as + // part of capacity, as empty, as fully available, and as unaffiliated. This provides short-lived optimism + // for triggering and pacing heuristics. It greatly simplifies and reduces the locking overhead required + // by more time-precise accounting of these details. recycle_internal(); } _recycling.unset(); @@ -900,12 +899,11 @@ void ShenandoahHeapRegion::set_affiliation(ShenandoahAffiliation new_affiliation heap->set_affiliation(this, new_affiliation); } -void ShenandoahHeapRegion::decrement_humongous_waste() const { +void ShenandoahHeapRegion::decrement_humongous_waste() { assert(is_humongous(), "Should only use this for humongous regions"); size_t waste_bytes = free(); if (waste_bytes > 0) { ShenandoahHeap* heap = ShenandoahHeap::heap(); - ShenandoahGeneration* generation = heap->generation_for(affiliation()); - heap->decrease_humongous_waste(generation, waste_bytes); + heap->free_set()->decrease_humongous_waste_for_regular_bypass(this, waste_bytes); } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp index b6f65834c07..32382f5e594 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.hpp @@ -366,6 +366,9 @@ public: // Allocation (return nullptr if full) inline HeapWord* allocate(size_t word_size, const ShenandoahAllocRequest& req); + // Allocate fill after top + inline HeapWord* allocate_fill(size_t word_size); + inline void clear_live_data(); void set_live_data(size_t s); @@ -492,7 +495,7 @@ public: } private: - void decrement_humongous_waste() const; + void decrement_humongous_waste(); void do_commit(); void do_uncommit(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp index da1caf24266..cad9dc0e932 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeapRegion.inline.hpp @@ -87,6 +87,23 @@ HeapWord* ShenandoahHeapRegion::allocate_aligned(size_t size, ShenandoahAllocReq } } +HeapWord* ShenandoahHeapRegion::allocate_fill(size_t size) { + shenandoah_assert_heaplocked_or_safepoint(); + assert(is_object_aligned(size), "alloc size breaks alignment: %zu", size); + assert(size >= ShenandoahHeap::min_fill_size(), "Cannot fill unless min fill size"); + + HeapWord* obj = top(); + HeapWord* new_top = obj + size; + ShenandoahHeap::fill_with_object(obj, size); + set_top(new_top); + + assert(is_object_aligned(new_top), "new top breaks alignment: " PTR_FORMAT, p2i(new_top)); + assert(is_object_aligned(obj), "obj is not aligned: " PTR_FORMAT, p2i(obj)); + + return obj; +} + + HeapWord* ShenandoahHeapRegion::allocate(size_t size, const ShenandoahAllocRequest& req) { shenandoah_assert_heaplocked_or_safepoint(); assert(is_object_aligned(size), "alloc size breaks alignment: %zu", size); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMarkBitMap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahMarkBitMap.hpp index 472f5712648..c094ec434f5 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMarkBitMap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkBitMap.hpp @@ -33,7 +33,7 @@ class ShenandoahMarkBitMap { public: - typedef size_t idx_t; // Type used for bit and word indices. + typedef size_t idx_t; // Type used for bit and word indices. typedef uintptr_t bm_word_t; // Element type of array that represents the // bitmap, with BitsPerWord bits per element. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp index ebfe5267160..d55d1bd8147 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp @@ -62,8 +62,10 @@ MemoryUsage ShenandoahMemoryPool::get_memory_usage() { // the assert below, which would also fail in downstream code. To avoid that, adjust values // to make sense under the race. See JDK-8207200. committed = MAX2(used, committed); - assert(used <= committed, "used: %zu, committed: %zu", used, committed); - + assert(used <= committed, "used: %zu, committed: %zu", used, committed); + assert(initial <= _heap->max_capacity(), "sanity"); + assert(committed <= _heap->max_capacity(), "sanity"); + assert(max <= _heap->max_capacity(), "sanity"); return MemoryUsage(initial, used, committed, max); } @@ -86,6 +88,10 @@ MemoryUsage ShenandoahGenerationalMemoryPool::get_memory_usage() { size_t used = used_in_bytes(); size_t committed = _generation->used_regions_size(); + assert(initial <= _heap->max_capacity(), "sanity"); + assert(used <= _heap->max_capacity(), "sanity"); + assert(committed <= _heap->max_capacity(), "sanity"); + assert(max <= _heap->max_capacity(), "sanity"); return MemoryUsage(initial, used, committed, max); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp index d980a9e3e0c..a44a831ef3d 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGC.cpp @@ -138,21 +138,7 @@ bool ShenandoahOldGC::collect(GCCause::Cause cause) { // collection. heap->concurrent_final_roots(); - // We do not rebuild_free following increments of old marking because memory has not been reclaimed. However, we may - // need to transfer memory to OLD in order to efficiently support the mixed evacuations that might immediately follow. size_t allocation_runway = heap->young_generation()->heuristics()->bytes_of_allocation_runway_before_gc_trigger(0); heap->compute_old_generation_balance(allocation_runway, 0); - - ShenandoahGenerationalHeap::TransferResult result; - { - ShenandoahHeapLocker locker(heap->lock()); - result = heap->balance_generations(); - } - - LogTarget(Info, gc, ergo) lt; - if (lt.is_enabled()) { - LogStream ls(lt); - result.print_on("Old Mark", &ls); - } return true; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp index 9c95dad6409..1f474baef46 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp @@ -1,3 +1,4 @@ + /* * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. @@ -195,8 +196,8 @@ public: } }; -ShenandoahOldGeneration::ShenandoahOldGeneration(uint max_queues, size_t max_capacity) - : ShenandoahGeneration(OLD, max_queues, max_capacity), +ShenandoahOldGeneration::ShenandoahOldGeneration(uint max_queues) + : ShenandoahGeneration(OLD, max_queues), _coalesce_and_fill_region_array(NEW_C_HEAP_ARRAY(ShenandoahHeapRegion*, ShenandoahHeap::heap()->num_regions(), mtGC)), _old_heuristics(nullptr), _region_balance(0), @@ -214,6 +215,7 @@ ShenandoahOldGeneration::ShenandoahOldGeneration(uint max_queues, size_t max_cap _growth_before_compaction(INITIAL_GROWTH_BEFORE_COMPACTION), _min_growth_before_compaction ((ShenandoahMinOldGenGrowthPercent * FRACTIONAL_DENOMINATOR) / 100) { + assert(type() == ShenandoahGenerationType::OLD, "OO sanity"); _live_bytes_after_last_mark = ShenandoahHeap::heap()->capacity() * INITIAL_LIVE_FRACTION / FRACTIONAL_DENOMINATOR; // Always clear references for old generation ref_processor()->set_soft_reference_policy(true); @@ -519,12 +521,20 @@ void ShenandoahOldGeneration::prepare_regions_and_collection_set(bool concurrent ShenandoahPhaseTimings::final_rebuild_freeset : ShenandoahPhaseTimings::degen_gc_final_rebuild_freeset); ShenandoahHeapLocker locker(heap->lock()); - size_t cset_young_regions, cset_old_regions; + size_t young_trash_regions, old_trash_regions; size_t first_old, last_old, num_old; - heap->free_set()->prepare_to_rebuild(cset_young_regions, cset_old_regions, first_old, last_old, num_old); - // This is just old-gen completion. No future budgeting required here. The only reason to rebuild the freeset here - // is in case there was any immediate old garbage identified. - heap->free_set()->finish_rebuild(cset_young_regions, cset_old_regions, num_old); + heap->free_set()->prepare_to_rebuild(young_trash_regions, old_trash_regions, first_old, last_old, num_old); + // At the end of old-gen, we may find that we have reclaimed immediate garbage, allowing a longer allocation runway. + // We may also find that we have accumulated canddiate regions for mixed evacuation. If so, we will want to expand + // the OldCollector reserve in order to make room for these mixed evacuations. + assert(ShenandoahHeap::heap()->mode()->is_generational(), "sanity"); + assert(young_trash_regions == 0, "sanity"); + ShenandoahGenerationalHeap* gen_heap = ShenandoahGenerationalHeap::heap(); + size_t allocation_runway = + gen_heap->young_generation()->heuristics()->bytes_of_allocation_runway_before_gc_trigger(young_trash_regions); + gen_heap->compute_old_generation_balance(allocation_runway, old_trash_regions); + + heap->free_set()->finish_rebuild(young_trash_regions, old_trash_regions, num_old); } } @@ -729,11 +739,6 @@ void ShenandoahOldGeneration::handle_evacuation(HeapWord* obj, size_t words, boo // do this in batch, in a background GC thread than to try to carefully dirty only cards // that hold interesting pointers right now. _card_scan->mark_range_as_dirty(obj, words); - - if (promotion) { - // This evacuation was a promotion, track this as allocation against old gen - increase_allocated(words * HeapWordSize); - } } bool ShenandoahOldGeneration::has_unprocessed_collection_candidates() { @@ -839,3 +844,38 @@ void ShenandoahOldGeneration::clear_cards_for(ShenandoahHeapRegion* region) { void ShenandoahOldGeneration::mark_card_as_dirty(void* location) { _card_scan->mark_card_as_dirty((HeapWord*)location); } + +size_t ShenandoahOldGeneration::used() const { + return _free_set->old_used(); +} + +size_t ShenandoahOldGeneration::bytes_allocated_since_gc_start() const { + assert(ShenandoahHeap::heap()->mode()->is_generational(), "NON_GEN implies not generational"); + return 0; +} + +size_t ShenandoahOldGeneration::get_affiliated_region_count() const { + return _free_set->old_affiliated_regions(); +} + +size_t ShenandoahOldGeneration::get_humongous_waste() const { + return _free_set->humongous_waste_in_old(); +} + +size_t ShenandoahOldGeneration::used_regions() const { + return _free_set->old_affiliated_regions(); +} + +size_t ShenandoahOldGeneration::used_regions_size() const { + size_t used_regions = _free_set->old_affiliated_regions(); + return used_regions * ShenandoahHeapRegion::region_size_bytes(); +} + +size_t ShenandoahOldGeneration::max_capacity() const { + size_t total_regions = _free_set->total_old_regions(); + return total_regions * ShenandoahHeapRegion::region_size_bytes(); +} + +size_t ShenandoahOldGeneration::free_unaffiliated_regions() const { + return _free_set->old_unaffiliated_regions(); +} diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp index 28d2a30493c..028ee18554c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp @@ -94,7 +94,7 @@ private: bool coalesce_and_fill(); public: - ShenandoahOldGeneration(uint max_queues, size_t max_capacity); + ShenandoahOldGeneration(uint max_queues); ShenandoahHeuristics* initialize_heuristics(ShenandoahMode* gc_mode) override; @@ -145,7 +145,9 @@ public: void configure_plab_for_current_thread(const ShenandoahAllocRequest &req); // See description in field declaration - void set_region_balance(ssize_t balance) { _region_balance = balance; } + void set_region_balance(ssize_t balance) { + _region_balance = balance; + } ssize_t get_region_balance() const { return _region_balance; } // See description in field declaration @@ -331,6 +333,14 @@ public: static const char* state_name(State state); + size_t bytes_allocated_since_gc_start() const override; + size_t used() const override; + size_t used_regions() const override; + size_t used_regions_size() const override; + size_t get_humongous_waste() const override; + size_t free_unaffiliated_regions() const override; + size_t get_affiliated_region_count() const override; + size_t max_capacity() const override; }; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.cpp index 3f4bbafb755..82a759e34db 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.cpp @@ -25,7 +25,7 @@ #include "gc/shenandoah/shenandoahSimpleBitMap.inline.hpp" -ShenandoahSimpleBitMap::ShenandoahSimpleBitMap(size_t num_bits) : +ShenandoahSimpleBitMap::ShenandoahSimpleBitMap(idx_t num_bits) : _num_bits(num_bits), _num_words(align_up(num_bits, BitsPerWord) / BitsPerWord), _bitmap(NEW_C_HEAP_ARRAY(uintx, _num_words, mtGC)) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.hpp b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.hpp index 3a4cb8cf742..a2d664f2016 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.hpp @@ -42,22 +42,23 @@ // represent index, even though index is "inherently" unsigned. There are two reasons for this choice: // 1. We use -1 as a sentinel value to represent empty partitions. This same value may be used to represent // failure to find a previous set bit or previous range of set bits. -// 2. Certain loops are written most naturally if the iterator, which may hold the sentinel -1 value, can be +// 2. Certain loops are written most naturally if the induction variable, which may hold the sentinel -1 value, can be // declared as signed and the terminating condition can be < 0. -typedef ssize_t idx_t; - // ShenandoahSimpleBitMap resembles CHeapBitMap but adds missing support for find_first_consecutive_set_bits() and // find_last_consecutive_set_bits. An alternative refactoring of code would subclass CHeapBitMap, but this might // break abstraction rules, because efficient implementation requires assumptions about superclass internals that // might be violated through future software maintenance. class ShenandoahSimpleBitMap { +public: + typedef ssize_t idx_t; +private: const idx_t _num_bits; const size_t _num_words; uintx* const _bitmap; public: - ShenandoahSimpleBitMap(size_t num_bits); + ShenandoahSimpleBitMap(idx_t num_bits); ~ShenandoahSimpleBitMap(); @@ -116,7 +117,6 @@ public: inline void clear_bit(idx_t idx) { assert((idx >= 0) && (idx < _num_bits), "precondition"); - assert(idx >= 0, "precondition"); size_t array_idx = idx >> LogBitsPerWord; uintx bit_number = idx & (BitsPerWord - 1); uintx the_bit = nth_bit(bit_number); @@ -125,7 +125,6 @@ public: inline bool is_set(idx_t idx) const { assert((idx >= 0) && (idx < _num_bits), "precondition"); - assert(idx >= 0, "precondition"); size_t array_idx = idx >> LogBitsPerWord; uintx bit_number = idx & (BitsPerWord - 1); uintx the_bit = nth_bit(bit_number); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.inline.hpp index 4582ab9a781..84d116cf618 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSimpleBitMap.inline.hpp @@ -27,6 +27,8 @@ #include "gc/shenandoah/shenandoahSimpleBitMap.hpp" +using idx_t = ShenandoahSimpleBitMap::idx_t; + inline uintx ShenandoahSimpleBitMap::tail_mask(uintx bit_number) { if (bit_number >= BitsPerWord) { return -1; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp index fb5fbbd00a1..543df2422c0 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.cpp @@ -365,30 +365,57 @@ public: // a subset (e.g. the young generation or old generation) of the total heap. class ShenandoahCalculateRegionStatsClosure : public ShenandoahHeapRegionClosure { private: - size_t _used, _committed, _garbage, _regions, _humongous_waste, _trashed_regions; + size_t _used, _committed, _garbage, _regions, _humongous_waste, _trashed_regions, _trashed_used; + size_t _region_size_bytes, _min_free_size; public: ShenandoahCalculateRegionStatsClosure() : - _used(0), _committed(0), _garbage(0), _regions(0), _humongous_waste(0), _trashed_regions(0) {}; + _used(0), _committed(0), _garbage(0), _regions(0), _humongous_waste(0), _trashed_regions(0), _trashed_used(0) + { + _region_size_bytes = ShenandoahHeapRegion::region_size_bytes(); + // Retired regions are not necessarily filled, thouugh their remnant memory is considered used. + _min_free_size = PLAB::min_size() * HeapWordSize; + }; void heap_region_do(ShenandoahHeapRegion* r) override { - _used += r->used(); - _garbage += r->garbage(); - _committed += r->is_committed() ? ShenandoahHeapRegion::region_size_bytes() : 0; - if (r->is_humongous()) { - _humongous_waste += r->free(); - } - if (r->is_trash()) { - _trashed_regions++; + if (r->is_cset() || r->is_trash()) { + // Count the entire cset or trashed (formerly cset) region as used + // Note: Immediate garbage trash regions were never in the cset. + _used += _region_size_bytes; + _garbage += _region_size_bytes - r->get_live_data_bytes(); + if (r->is_trash()) { + _trashed_regions++; + _trashed_used += _region_size_bytes; + } + } else { + if (r->is_humongous()) { + _used += _region_size_bytes; + _garbage += _region_size_bytes - r->get_live_data_bytes(); + _humongous_waste += r->free(); + } else { + size_t alloc_capacity = r->free(); + if (alloc_capacity < _min_free_size) { + // this region has been retired already, count it as entirely consumed + alloc_capacity = 0; + } + size_t bytes_used_in_region = _region_size_bytes - alloc_capacity; + size_t bytes_garbage_in_region = bytes_used_in_region - r->get_live_data_bytes(); + size_t waste_bytes = r->free(); + _used += bytes_used_in_region; + _garbage += bytes_garbage_in_region; + } } + _committed += r->is_committed() ? _region_size_bytes : 0; _regions++; log_debug(gc)("ShenandoahCalculateRegionStatsClosure: adding %zu for %s Region %zu, yielding: %zu", r->used(), (r->is_humongous() ? "humongous" : "regular"), r->index(), _used); } size_t used() const { return _used; } + size_t used_after_recycle() const { return _used - _trashed_used; } size_t committed() const { return _committed; } size_t garbage() const { return _garbage; } size_t regions() const { return _regions; } + size_t trashed_regions() const { return _trashed_regions; } size_t waste() const { return _humongous_waste; } // span is the total memory affiliated with these stats (some of which is in use and other is available) @@ -398,21 +425,21 @@ public: class ShenandoahGenerationStatsClosure : public ShenandoahHeapRegionClosure { public: - ShenandoahCalculateRegionStatsClosure old; - ShenandoahCalculateRegionStatsClosure young; - ShenandoahCalculateRegionStatsClosure global; + ShenandoahCalculateRegionStatsClosure _old; + ShenandoahCalculateRegionStatsClosure _young; + ShenandoahCalculateRegionStatsClosure _global; void heap_region_do(ShenandoahHeapRegion* r) override { switch (r->affiliation()) { case FREE: return; case YOUNG_GENERATION: - young.heap_region_do(r); - global.heap_region_do(r); + _young.heap_region_do(r); + _global.heap_region_do(r); break; case OLD_GENERATION: - old.heap_region_do(r); - global.heap_region_do(r); + _old.heap_region_do(r); + _global.heap_region_do(r); break; default: ShouldNotReachHere(); @@ -426,23 +453,22 @@ class ShenandoahGenerationStatsClosure : public ShenandoahHeapRegionClosure { byte_size_in_proper_unit(stats.used()), proper_unit_for_byte_size(stats.used())); } - static void validate_usage(const bool adjust_for_padding, + static void validate_usage(const bool adjust_for_padding, const bool adjust_for_trash, const char* label, ShenandoahGeneration* generation, ShenandoahCalculateRegionStatsClosure& stats) { ShenandoahHeap* heap = ShenandoahHeap::heap(); size_t generation_used = generation->used(); size_t generation_used_regions = generation->used_regions(); - if (adjust_for_padding && (generation->is_young() || generation->is_global())) { - size_t pad = heap->old_generation()->get_pad_for_promote_in_place(); - generation_used += pad; - } - guarantee(stats.used() == generation_used, + size_t stats_used = adjust_for_trash? stats.used_after_recycle(): stats.used(); + guarantee(stats_used == generation_used, "%s: generation (%s) used size must be consistent: generation-used: " PROPERFMT ", regions-used: " PROPERFMT, - label, generation->name(), PROPERFMTARGS(generation_used), PROPERFMTARGS(stats.used())); + label, generation->name(), PROPERFMTARGS(generation_used), PROPERFMTARGS(stats_used)); - guarantee(stats.regions() == generation_used_regions, - "%s: generation (%s) used regions (%zu) must equal regions that are in use (%zu)", - label, generation->name(), generation->used_regions(), stats.regions()); + size_t stats_regions = adjust_for_trash? stats.regions() - stats.trashed_regions(): stats.regions(); + guarantee(stats_regions == generation_used_regions, + "%s: generation (%s) used regions (%zu) must equal regions that are in use (%zu)%s", + label, generation->name(), generation->used_regions(), stats_regions, + adjust_for_trash? " (after adjusting for trash)": ""); size_t generation_capacity = generation->max_capacity(); guarantee(stats.non_trashed_span() <= generation_capacity, @@ -463,11 +489,11 @@ private: ShenandoahHeap* _heap; const char* _phase; ShenandoahVerifier::VerifyRegions _regions; -public: + public: ShenandoahVerifyHeapRegionClosure(const char* phase, ShenandoahVerifier::VerifyRegions regions) : - _heap(ShenandoahHeap::heap()), - _phase(phase), - _regions(regions) {}; + _heap(ShenandoahHeap::heap()), + _phase(phase), + _regions(regions) {}; void print_failure(ShenandoahHeapRegion* r, const char* label) { ResourceMark rm; @@ -620,7 +646,7 @@ public: }; class ShenandoahVerifyNoIncompleteSatbBuffers : public ThreadClosure { -public: + public: void do_thread(Thread* thread) override { SATBMarkQueue& queue = ShenandoahThreadLocalData::satb_mark_queue(thread); if (!queue.is_empty()) { @@ -630,7 +656,7 @@ public: }; class ShenandoahVerifierMarkedRegionTask : public WorkerTask { -private: + private: const char* _label; ShenandoahVerifier::VerifyOptions _options; ShenandoahHeap *_heap; @@ -760,7 +786,7 @@ public: class VerifyThreadGCState : public ThreadClosure { private: const char* const _label; - char const _expected; + char const _expected; public: VerifyThreadGCState(const char* label, char expected) : _label(label), _expected(expected) {} @@ -864,16 +890,18 @@ void ShenandoahVerifier::verify_at_safepoint(ShenandoahGeneration* generation, size_t heap_used; if (_heap->mode()->is_generational() && (sizeness == _verify_size_adjusted_for_padding)) { // Prior to evacuation, regular regions that are to be evacuated in place are padded to prevent further allocations - heap_used = _heap->used() + _heap->old_generation()->get_pad_for_promote_in_place(); + // but this padding is already represented in _heap->used() + heap_used = _heap->used(); } else if (sizeness != _verify_size_disable) { heap_used = _heap->used(); } if (sizeness != _verify_size_disable) { - guarantee(cl.used() == heap_used, + size_t cl_size = (sizeness == _verify_size_exact_including_trash)? cl.used(): cl.used_after_recycle(); + guarantee(cl_size == heap_used, "%s: heap used size must be consistent: heap-used = %zu%s, regions-used = %zu%s", label, byte_size_in_proper_unit(heap_used), proper_unit_for_byte_size(heap_used), - byte_size_in_proper_unit(cl.used()), proper_unit_for_byte_size(cl.used())); + byte_size_in_proper_unit(cl_size), proper_unit_for_byte_size(cl_size)); } size_t heap_committed = _heap->committed(); guarantee(cl.committed() == heap_committed, @@ -911,18 +939,19 @@ void ShenandoahVerifier::verify_at_safepoint(ShenandoahGeneration* generation, _heap->heap_region_iterate(&cl); if (LogTarget(Debug, gc)::is_enabled()) { - ShenandoahGenerationStatsClosure::log_usage(_heap->old_generation(), cl.old); - ShenandoahGenerationStatsClosure::log_usage(_heap->young_generation(), cl.young); - ShenandoahGenerationStatsClosure::log_usage(_heap->global_generation(), cl.global); + ShenandoahGenerationStatsClosure::log_usage(_heap->old_generation(), cl._old); + ShenandoahGenerationStatsClosure::log_usage(_heap->young_generation(), cl._young); + ShenandoahGenerationStatsClosure::log_usage(_heap->global_generation(), cl._global); } if (sizeness == _verify_size_adjusted_for_padding) { - ShenandoahGenerationStatsClosure::validate_usage(false, label, _heap->old_generation(), cl.old); - ShenandoahGenerationStatsClosure::validate_usage(true, label, _heap->young_generation(), cl.young); - ShenandoahGenerationStatsClosure::validate_usage(true, label, _heap->global_generation(), cl.global); - } else if (sizeness == _verify_size_exact) { - ShenandoahGenerationStatsClosure::validate_usage(false, label, _heap->old_generation(), cl.old); - ShenandoahGenerationStatsClosure::validate_usage(false, label, _heap->young_generation(), cl.young); - ShenandoahGenerationStatsClosure::validate_usage(false, label, _heap->global_generation(), cl.global); + ShenandoahGenerationStatsClosure::validate_usage(false, true, label, _heap->old_generation(), cl._old); + ShenandoahGenerationStatsClosure::validate_usage(true, true, label, _heap->young_generation(), cl._young); + ShenandoahGenerationStatsClosure::validate_usage(true, true, label, _heap->global_generation(), cl._global); + } else if (sizeness == _verify_size_exact || sizeness == _verify_size_exact_including_trash) { + bool adjust_trash = (sizeness == _verify_size_exact); + ShenandoahGenerationStatsClosure::validate_usage(false, adjust_trash, label, _heap->old_generation(), cl._old); + ShenandoahGenerationStatsClosure::validate_usage(false, adjust_trash, label, _heap->young_generation(), cl._young); + ShenandoahGenerationStatsClosure::validate_usage(false, adjust_trash, label, _heap->global_generation(), cl._global); } // else: sizeness must equal _verify_size_disable } @@ -1139,7 +1168,8 @@ void ShenandoahVerifier::verify_after_update_refs(ShenandoahGeneration* generati _verify_cset_none, // no cset references, all updated _verify_liveness_disable, // no reliable liveness data anymore _verify_regions_nocset, // no cset regions, trash regions have appeared - _verify_size_exact, // expect generation and heap sizes to match exactly + // expect generation and heap sizes to match exactly, including trash + _verify_size_exact_including_trash, _verify_gcstate_stable // update refs had cleaned up forwarded objects ); } @@ -1405,7 +1435,7 @@ void ShenandoahVerifier::verify_before_rebuilding_free_set() { ShenandoahGenerationStatsClosure cl; _heap->heap_region_iterate(&cl); - ShenandoahGenerationStatsClosure::validate_usage(false, "Before free set rebuild", _heap->old_generation(), cl.old); - ShenandoahGenerationStatsClosure::validate_usage(false, "Before free set rebuild", _heap->young_generation(), cl.young); - ShenandoahGenerationStatsClosure::validate_usage(false, "Before free set rebuild", _heap->global_generation(), cl.global); + ShenandoahGenerationStatsClosure::validate_usage(false, true, "Before free set rebuild", _heap->old_generation(), cl._old); + ShenandoahGenerationStatsClosure::validate_usage(false, true, "Before free set rebuild", _heap->young_generation(), cl._young); + ShenandoahGenerationStatsClosure::validate_usage(false, true, "Before free set rebuild", _heap->global_generation(), cl._global); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp index e49990fdc62..f66d7bbec77 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahVerifier.hpp @@ -155,7 +155,10 @@ public: _verify_size_exact, // Expect promote-in-place adjustments: padding inserted to temporarily prevent further allocation in regular regions - _verify_size_adjusted_for_padding + _verify_size_adjusted_for_padding, + + // Expected heap size should not include + _verify_size_exact_including_trash } VerifySize; typedef enum { diff --git a/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.cpp index 849ab691dcf..86be2fc60be 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.cpp @@ -30,9 +30,10 @@ #include "gc/shenandoah/shenandoahUtils.hpp" #include "gc/shenandoah/shenandoahYoungGeneration.hpp" -ShenandoahYoungGeneration::ShenandoahYoungGeneration(uint max_queues, size_t max_capacity) : - ShenandoahGeneration(YOUNG, max_queues, max_capacity), +ShenandoahYoungGeneration::ShenandoahYoungGeneration(uint max_queues) : + ShenandoahGeneration(YOUNG, max_queues), _old_gen_task_queues(nullptr) { + assert(type() == ShenandoahGenerationType::YOUNG, "OO sanity"); } void ShenandoahYoungGeneration::set_concurrent_mark_in_progress(bool in_progress) { @@ -95,6 +96,41 @@ ShenandoahHeuristics* ShenandoahYoungGeneration::initialize_heuristics(Shenandoa return _heuristics; } +size_t ShenandoahYoungGeneration::used() const { + return _free_set->young_used(); +} + +size_t ShenandoahYoungGeneration::bytes_allocated_since_gc_start() const { + assert(ShenandoahHeap::heap()->mode()->is_generational(), "Young implies generational"); + return _free_set->get_bytes_allocated_since_gc_start(); +} + +size_t ShenandoahYoungGeneration::get_affiliated_region_count() const { + return _free_set->young_affiliated_regions(); +} + +size_t ShenandoahYoungGeneration::get_humongous_waste() const { + return _free_set->humongous_waste_in_mutator(); +} + +size_t ShenandoahYoungGeneration::used_regions() const { + return _free_set->young_affiliated_regions(); +} + +size_t ShenandoahYoungGeneration::used_regions_size() const { + size_t used_regions = _free_set->young_affiliated_regions(); + return used_regions * ShenandoahHeapRegion::region_size_bytes(); +} + +size_t ShenandoahYoungGeneration::max_capacity() const { + size_t total_regions = _free_set->total_young_regions(); + return total_regions * ShenandoahHeapRegion::region_size_bytes(); +} + +size_t ShenandoahYoungGeneration::free_unaffiliated_regions() const { + return _free_set->young_unaffiliated_regions(); +} + size_t ShenandoahYoungGeneration::available() const { // The collector reserve may eat into what the mutator is allowed to use. Make sure we are looking // at what is available to the mutator when reporting how much memory is available. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.hpp index 14f9a9b3004..6b2794b12c3 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahYoungGeneration.hpp @@ -34,7 +34,7 @@ private: ShenandoahYoungHeuristics* _young_heuristics; public: - ShenandoahYoungGeneration(uint max_queues, size_t max_capacity); + ShenandoahYoungGeneration(uint max_queues); ShenandoahHeuristics* initialize_heuristics(ShenandoahMode* gc_mode) override; @@ -73,10 +73,16 @@ public: return _old_gen_task_queues != nullptr; } + size_t bytes_allocated_since_gc_start() const override; + size_t used() const override; + size_t used_regions() const override; + size_t used_regions_size() const override; + size_t get_humongous_waste() const override; + size_t free_unaffiliated_regions() const override; + size_t get_affiliated_region_count() const override; + size_t max_capacity() const override; + size_t available() const override; - - // Do not override available_with_reserve() because that needs to see memory reserved for Collector - size_t soft_available() const override; void prepare_gc() override; diff --git a/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp b/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp index a245f91fa71..3968575d089 100644 --- a/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp +++ b/src/hotspot/share/gc/shenandoah/vmStructs_shenandoah.hpp @@ -34,9 +34,8 @@ nonstatic_field(ShenandoahHeap, _num_regions, size_t) \ nonstatic_field(ShenandoahHeap, _regions, ShenandoahHeapRegion**) \ nonstatic_field(ShenandoahHeap, _log_min_obj_alignment_in_bytes, int) \ - nonstatic_field(ShenandoahHeap, _global_generation, ShenandoahGeneration*) \ + nonstatic_field(ShenandoahHeap, _free_set, ShenandoahFreeSet*) \ volatile_nonstatic_field(ShenandoahHeap, _committed, size_t) \ - volatile_nonstatic_field(ShenandoahGeneration, _used, size_t) \ static_field(ShenandoahHeapRegion, RegionSizeBytes, size_t) \ static_field(ShenandoahHeapRegion, RegionSizeBytesShift, size_t) \ volatile_nonstatic_field(ShenandoahHeapRegion, _state, ShenandoahHeapRegion::RegionState) \ @@ -44,6 +43,7 @@ nonstatic_field(ShenandoahHeapRegion, _bottom, HeapWord* const) \ nonstatic_field(ShenandoahHeapRegion, _top, HeapWord*) \ nonstatic_field(ShenandoahHeapRegion, _end, HeapWord* const) \ + nonstatic_field(ShenandoahFreeSet, _total_global_used, size_t) \ #define VM_INT_CONSTANTS_SHENANDOAH(declare_constant, declare_constant_with_value) \ declare_constant(ShenandoahHeapRegion::_empty_uncommitted) \ @@ -66,7 +66,7 @@ declare_toplevel_type(ShenandoahHeap*) \ declare_toplevel_type(ShenandoahHeapRegion*) \ declare_toplevel_type(ShenandoahHeapRegion::RegionState) \ - declare_toplevel_type(ShenandoahGeneration) \ - declare_toplevel_type(ShenandoahGeneration*) \ + declare_toplevel_type(ShenandoahFreeSet) \ + declare_toplevel_type(ShenandoahFreeSet*) \ #endif // SHARE_GC_SHENANDOAH_VMSTRUCTS_SHENANDOAH_HPP diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahGeneration.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahFreeSet.java similarity index 89% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahGeneration.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahFreeSet.java index bcd59523ae0..9ca8e1deb04 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahGeneration.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahFreeSet.java @@ -34,7 +34,7 @@ import sun.jvm.hotspot.types.CIntegerField; import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; -public class ShenandoahGeneration extends VMObject { +public class ShenandoahFreeSet extends VMObject { private static CIntegerField used; static { VM.registerVMInitializedObserver(new Observer() { @@ -45,11 +45,11 @@ public class ShenandoahGeneration extends VMObject { } private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("ShenandoahGeneration"); - used = type.getCIntegerField("_used"); + Type type = db.lookupType("ShenandoahFreeSet"); + used = type.getCIntegerField("_total_global_used"); } - public ShenandoahGeneration(Address addr) { + public ShenandoahFreeSet(Address addr) { super(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java index 3109fe22102..abce4a7d024 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java @@ -43,7 +43,7 @@ import sun.jvm.hotspot.utilities.Observer; public class ShenandoahHeap extends CollectedHeap { private static CIntegerField numRegions; - private static AddressField globalGeneration; + private static AddressField globalFreeSet; private static CIntegerField committed; private static AddressField regions; private static CIntegerField logMinObjAlignmentInBytes; @@ -60,7 +60,7 @@ public class ShenandoahHeap extends CollectedHeap { private static synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("ShenandoahHeap"); numRegions = type.getCIntegerField("_num_regions"); - globalGeneration = type.getAddressField("_global_generation"); + globalFreeSet = type.getAddressField("_free_set"); committed = type.getCIntegerField("_committed"); regions = type.getAddressField("_regions"); logMinObjAlignmentInBytes = type.getCIntegerField("_log_min_obj_alignment_in_bytes"); @@ -89,9 +89,9 @@ public class ShenandoahHeap extends CollectedHeap { @Override public long used() { - Address globalGenerationAddress = globalGeneration.getValue(addr); - ShenandoahGeneration global = VMObjectFactory.newObject(ShenandoahGeneration.class, globalGenerationAddress); - return global.used(); + Address globalFreeSetAddress = globalFreeSet.getValue(addr); + ShenandoahFreeSet freeset = VMObjectFactory.newObject(ShenandoahFreeSet.class, globalFreeSetAddress); + return freeset.used(); } public long committed() { diff --git a/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldGeneration.cpp b/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldGeneration.cpp index 2fd87b48dc2..b2491226e5c 100644 --- a/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldGeneration.cpp +++ b/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldGeneration.cpp @@ -52,7 +52,7 @@ protected: ShenandoahHeap::heap()->lock()->lock(false); - old = new ShenandoahOldGeneration(8, 1024 * 1024); + old = new ShenandoahOldGeneration(8); old->set_promoted_reserve(512 * HeapWordSize); old->expend_promoted(256 * HeapWordSize); old->set_evacuation_reserve(512 * HeapWordSize); diff --git a/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldHeuristic.cpp b/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldHeuristic.cpp index d08cfd7618b..b661bd6bc57 100644 --- a/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldHeuristic.cpp +++ b/test/hotspot/gtest/gc/shenandoah/test_shenandoahOldHeuristic.cpp @@ -84,7 +84,8 @@ class ShenandoahOldHeuristicTest : public ::testing::Test { _heap->lock()->lock(false); ShenandoahResetRegions reset; _heap->heap_region_iterate(&reset); - _heap->old_generation()->set_capacity(ShenandoahHeapRegion::region_size_bytes() * 10); + // _heap->old_generation()->set_capacity(ShenandoahHeapRegion::region_size_bytes() * 10) + _heap->free_set()->resize_old_collector_capacity(10); _heap->old_generation()->set_evacuation_reserve(ShenandoahHeapRegion::region_size_bytes() * 4); _heuristics->abandon_collection_candidates(); _collection_set->clear(); diff --git a/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java b/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java index c3b09f5ab4c..79259168bf3 100644 --- a/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java +++ b/test/hotspot/jtreg/gc/shenandoah/TestSieveObjects.java @@ -144,12 +144,25 @@ * @requires vm.gc.Shenandoah * @library /test/lib * - * @run main/othervm/timeout=240 -Xmx1g -Xms1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions + * @run main/othervm/timeout=480 -Xmx1g -Xms1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions * -XX:+UseShenandoahGC * -XX:-UseTLAB -XX:+ShenandoahVerify * TestSieveObjects */ +/* + * @test id=no-tlab-genshen + * @summary Acceptance tests: collector can deal with retained objects + * @key randomness + * @requires vm.gc.Shenandoah + * @library /test/lib + * + * @run main/othervm/timeout=480 -Xmx1g -Xms1g -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions + * -XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational + * -XX:-UseTLAB -XX:+ShenandoahVerify + * TestSieveObjects + */ + import java.util.Random; import jdk.test.lib.Utils; diff --git a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java index bd3c4508c7b..6473c310ec7 100644 --- a/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java +++ b/test/hotspot/jtreg/gc/shenandoah/mxbeans/TestChurnNotifications.java @@ -112,8 +112,10 @@ import com.sun.management.GarbageCollectionNotificationInfo; public class TestChurnNotifications { - static final long HEAP_MB = 128; // adjust for test configuration above - static final long TARGET_MB = Long.getLong("target", 2_000); // 2 Gb allocation + static final long HEAP_MB = 128; // adjust for test configuration above + static final long TARGET_MB = Long.getLong("target", 2_000); // 2 Gb allocation + static final long ANTICIPATED_HUMONGOUS_WASTE_PER_ARRAY = 124_272; + // Should we track the churn precisely? // Precise tracking is only reliable when GC is fully stop-the-world. Otherwise, @@ -159,7 +161,7 @@ public class TestChurnNotifications { final int size = 100_000; long count = TARGET_MB * 1024 * 1024 / (16 + 4 * size); - long mem = count * (16 + 4 * size); + long mem = count * (16 + 4 * size + ANTICIPATED_HUMONGOUS_WASTE_PER_ARRAY); for (int c = 0; c < count; c++) { sink = new int[size]; From 2fc4cbe426c814c49c03c794c7a7fff2a23f22c4 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Fri, 31 Oct 2025 23:33:49 +0000 Subject: [PATCH 398/561] 8370663: Incorrect synchronization in nsk/jvmti/RedefineClasses when expected events are not received Reviewed-by: sspitsyn --- .../nsk/jvmti/RedefineClasses/redefclass028/redefclass028.cpp | 3 +-- .../nsk/jvmti/RedefineClasses/redefclass029/redefclass029.cpp | 3 +-- .../nsk/jvmti/RedefineClasses/redefclass030/redefclass030.cpp | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass028/redefclass028.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass028/redefclass028.cpp index 934e483da1d..2ec4a1a2685 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass028/redefclass028.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass028/redefclass028.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -176,7 +176,6 @@ agentProc(jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg) { printf("WARNING: CompiledMethodLoad event is still not received for \"%s\" after %d attempts\n" "\tThe test has no results\n\n", expHSMethod, MAX_ATTEMPTS); - nsk_jvmti_resumeSync(); exit(95 + PASSED); } } while (fire == 0); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass029/redefclass029.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass029/redefclass029.cpp index d2b4b720c55..cd0e6c98ab7 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass029/redefclass029.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass029/redefclass029.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -175,7 +175,6 @@ agentProc(jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg) { printf("WARNING: CompiledMethodLoad event is still not received for \"%s\" after %d attempts\n" "\tThe test has no results\n\n", expHSMethod, MAX_ATTEMPTS); - nsk_jvmti_resumeSync(); exit(95 + PASSED); } } while (fire == 0); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass030/redefclass030.cpp b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass030/redefclass030.cpp index 35505044ef1..4452d1c65f6 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass030/redefclass030.cpp +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass030/redefclass030.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -176,7 +176,6 @@ agentProc(jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg) { printf("WARNING: CompiledMethodLoad event is still not received for \"%s\" after %d attempts\n" "\tThe test has no results\n\n", expHSMethod, MAX_ATTEMPTS); - nsk_jvmti_resumeSync(); exit(95 + PASSED); } } while (fire == 0); From 54fe50210efe9ae6fad225b815cfdeb16c868115 Mon Sep 17 00:00:00 2001 From: SendaoYan Date: Sat, 1 Nov 2025 02:04:43 +0000 Subject: [PATCH 399/561] 8370732: Use WhiteBox.getWhiteBox().fullGC() to provoking gc for nsk/jvmti tests Reviewed-by: cjplummer, lmesnik, sspitsyn --- .../AttachOnDemand/attach020/TEST.properties | 24 ------------------- .../attach020/TestDescription.java | 8 ++++--- .../attach020/attach020Target.java | 6 ++--- .../AttachOnDemand/attach021/TEST.properties | 24 ------------------- .../attach021/TestDescription.java | 6 +++-- .../attach021/attach021Target.java | 6 ++--- .../AttachOnDemand/attach022/TEST.properties | 24 ------------------- .../attach022/TestDescription.java | 6 +++-- .../attach022/attach022Target.java | 6 ++--- .../GarbageCollectionFinish/gcfinish001.java | 5 ++-- .../gcfinish001/TEST.properties | 24 ------------------- .../gcfinish001/TestDescription.java | 5 +++- .../GarbageCollectionStart/gcstart001.java | 11 +++------ .../gcstart001/TEST.properties | 24 ------------------- .../gcstart001/TestDescription.java | 5 +++- .../GarbageCollectionStart/gcstart002.java | 11 +++------ .../gcstart002/TEST.properties | 24 ------------------- .../gcstart002/TestDescription.java | 5 +++- .../scenarios/allocation/AP12/ap12t001.java | 10 ++++---- .../allocation/AP12/ap12t001/TEST.properties | 24 ------------------- .../AP12/ap12t001/TestDescription.java | 5 +++- .../jvmti/scenarios/events/EM02/em02t002.java | 5 ++-- .../events/EM02/em02t002/TEST.properties | 24 ------------------- .../events/EM02/em02t002/TestDescription.java | 5 +++- .../jvmti/scenarios/events/EM02/em02t006.java | 5 ++-- .../events/EM02/em02t006/TEST.properties | 24 ------------------- .../events/EM02/em02t006/TestDescription.java | 5 +++- 27 files changed, 65 insertions(+), 266 deletions(-) delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart002/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t002/TEST.properties delete mode 100644 test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TEST.properties diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TEST.properties b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TEST.properties deleted file mode 100644 index 8b51b2a9115..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TEST.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# 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. -# - -exclusiveAccess.dirs=. diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java index a729aa4d28f..09d54318b60 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ * Test scenario: * - during initialization (from function Agent_OnAttach) agent starts auxiliary thread waiting on * raw monitor and enables GarbageCollectionStart and GarbageCollectionFinish events - * - target application provokes garbage collection (calls System.gc()) + * - target application provokes garbage collection (calls WhiteBox.getWhiteBox().fullGC()) * - agent receives event GarbageCollectionStart * - agent receives event GarbageCollectionFinish event and notifies waiting auxiliary thread * - notified auxiliary thread notifies target application that agent finished its work @@ -48,11 +48,13 @@ * /test/lib * @build nsk.share.aod.AODTestRunner * nsk.jvmti.AttachOnDemand.attach020.attach020Target + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/native * nsk.share.aod.AODTestRunner * -jdk ${test.jdk} * -target nsk.jvmti.AttachOnDemand.attach020.attach020Target - * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts}" + * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts} -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI" * -na attach020Agent00 */ diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/attach020Target.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/attach020Target.java index a20cf935bae..3a52a539b82 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/attach020Target.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach020/attach020Target.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -22,14 +22,14 @@ */ package nsk.jvmti.AttachOnDemand.attach020; -import nsk.share.ClassUnloader; import nsk.share.aod.TargetApplicationWaitingAgents; +import jdk.test.whitebox.WhiteBox; public class attach020Target extends TargetApplicationWaitingAgents { protected void targetApplicationActions() { log.display("Provoking garbage collection"); - ClassUnloader.eatMemory(); + WhiteBox.getWhiteBox().fullGC(); } public static void main(String[] args) { diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TEST.properties b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TEST.properties deleted file mode 100644 index 8b51b2a9115..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TEST.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# 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. -# - -exclusiveAccess.dirs=. diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TestDescription.java index 5cf7b39729b..3d8dc2f4e85 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -44,11 +44,13 @@ * /test/lib * @build nsk.share.aod.AODTestRunner * nsk.jvmti.AttachOnDemand.attach021.attach021Target + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/native * nsk.share.aod.AODTestRunner * -jdk ${test.jdk} * -target nsk.jvmti.AttachOnDemand.attach021.attach021Target - * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts}" + * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts} -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI" * -na attach021Agent00 */ diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/attach021Target.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/attach021Target.java index d287616af69..adb2c194189 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/attach021Target.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach021/attach021Target.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -22,8 +22,8 @@ */ package nsk.jvmti.AttachOnDemand.attach021; -import nsk.share.ClassUnloader; import nsk.share.aod.TargetApplicationWaitingAgents; +import jdk.test.whitebox.WhiteBox; public class attach021Target extends TargetApplicationWaitingAgents { @@ -51,7 +51,7 @@ public class attach021Target extends TargetApplicationWaitingAgents { try { if (createTaggedObject()) { log.display("Provoking GC"); - ClassUnloader.eatMemory(); + WhiteBox.getWhiteBox().fullGC(); } } finally { shutdownAgent(); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TEST.properties b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TEST.properties deleted file mode 100644 index 8b51b2a9115..00000000000 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TEST.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# 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. -# - -exclusiveAccess.dirs=. diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TestDescription.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TestDescription.java index 49b47585749..5875f7a0f50 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TestDescription.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/TestDescription.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -47,11 +47,13 @@ * /test/lib * @build nsk.share.aod.AODTestRunner * nsk.jvmti.AttachOnDemand.attach022.attach022Target + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm/native * nsk.share.aod.AODTestRunner * -jdk ${test.jdk} * -target nsk.jvmti.AttachOnDemand.attach022.attach022Target - * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts}" + * -javaOpts="-XX:+UsePerfData ${test.vm.opts} ${test.java.opts} -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI" * -na attach022Agent00 */ diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/attach022Target.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/attach022Target.java index eb80c0c2a4c..3324855e622 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/attach022Target.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/AttachOnDemand/attach022/attach022Target.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -22,8 +22,8 @@ */ package nsk.jvmti.AttachOnDemand.attach022; -import nsk.share.ClassUnloader; import nsk.share.aod.TargetApplicationWaitingAgents; +import jdk.test.whitebox.WhiteBox; class ClassForAllocationEventsTest { @@ -47,7 +47,7 @@ public class attach022Target extends TargetApplicationWaitingAgents { } log.display("Provoking GC"); - ClassUnloader.eatMemory(); + WhiteBox.getWhiteBox().fullGC(); } finally { if (!shutdownAgent(TEST_ALLOCATION_NUMBER)) { setStatusFailed("Error happened during agent work, see error messages for details"); diff --git a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001.java b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001.java index 433ee607d7c..3e25000a2fb 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionFinish/gcfinish001.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -27,6 +27,7 @@ import java.io.*; import java.math.*; import nsk.share.*; +import jdk.test.whitebox.WhiteBox; /** * This test exercises the JVMTI event GarbageCollectionFinish. @@ -63,7 +64,7 @@ public class gcfinish001 { private int runThis(String argv[], PrintStream out) { try { for (int i=0; iGarbageCollectionStart. @@ -63,13 +64,7 @@ public class gcstart001 { } private int runThis(String argv[], PrintStream out) { - try { - for (int i=0; iGarbageCollectionStart. @@ -61,13 +62,7 @@ public class gcstart002 { } private int runThis(String argv[], PrintStream out) { - try { - for (int i=0; i Date: Sat, 1 Nov 2025 02:33:16 +0000 Subject: [PATCH 400/561] 8369994: Mixed mode jhsdb jstack cannot resolve symbol in function ending in call Reviewed-by: kevinw, cjplummer --- .../linux/amd64/LinuxAMD64CFrame.java | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java index 3dfb83c9f5a..0ada288942d 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java @@ -63,18 +63,24 @@ public final class LinuxAMD64CFrame extends BasicCFrame { } private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf, boolean finalFrame) { + this(dbg, cfa, rip, dwarf, finalFrame, false); + } + + private LinuxAMD64CFrame(LinuxDebugger dbg, Address cfa, Address rip, DwarfParser dwarf, boolean finalFrame, boolean use1ByteBeforeToLookup) { super(dbg.getCDebugger()); this.cfa = cfa; this.rip = rip; this.dbg = dbg; this.dwarf = dwarf; this.finalFrame = finalFrame; + this.use1ByteBeforeToLookup = use1ByteBeforeToLookup; } // override base class impl to avoid ELF parsing public ClosestSymbol closestSymbolToPC() { + Address symAddr = use1ByteBeforeToLookup ? pc().addOffsetTo(-1) : pc(); // try native lookup in debugger. - return dbg.lookup(dbg.getAddressValue(pc())); + return dbg.lookup(dbg.getAddressValue(symAddr)); } public Address pc() { @@ -145,19 +151,16 @@ public final class LinuxAMD64CFrame extends BasicCFrame { } DwarfParser nextDwarf = null; - Address libptr = dbg.findLibPtrByAddress(nextPC); - if (libptr != null) { + boolean fallback = false; + try { + nextDwarf = createDwarfParser(nextPC); + } catch (DebuggerException _) { + // Try again with RIP-1 in case RIP is just outside function bounds, + // due to function ending with a `call` instruction. try { - nextDwarf = new DwarfParser(libptr); - } catch (DebuggerException e) { - // Bail out to Java frame - } - } - - if (nextDwarf != null) { - try { - nextDwarf.processDwarf(nextPC); - } catch (DebuggerException e) { + nextDwarf = createDwarfParser(nextPC.addOffsetTo(-1)); + fallback = true; + } catch (DebuggerException _) { // DWARF processing should succeed when the frame is native // but it might fail if Common Information Entry (CIE) has language // personality routine and/or Language Specific Data Area (LSDA). @@ -166,10 +169,28 @@ public final class LinuxAMD64CFrame extends BasicCFrame { } Address nextCFA = getNextCFA(nextDwarf, context); - return isValidFrame(nextCFA, context) ? new LinuxAMD64CFrame(dbg, nextCFA, nextPC, nextDwarf) + return isValidFrame(nextCFA, context) ? new LinuxAMD64CFrame(dbg, nextCFA, nextPC, nextDwarf, false, fallback) : null; } + private DwarfParser createDwarfParser(Address pc) throws DebuggerException { + DwarfParser nextDwarf = null; + Address libptr = dbg.findLibPtrByAddress(pc); + if (libptr != null) { + try { + nextDwarf = new DwarfParser(libptr); + } catch (DebuggerException _) { + // Bail out to Java frame + } + } + + if (nextDwarf != null) { + nextDwarf.processDwarf(pc); + } + + return nextDwarf; + } + // package/class internals only private static final int ADDRESS_SIZE = 8; private Address rip; @@ -177,4 +198,5 @@ public final class LinuxAMD64CFrame extends BasicCFrame { private LinuxDebugger dbg; private DwarfParser dwarf; private boolean finalFrame; + private boolean use1ByteBeforeToLookup; } From 13b3d2fca1af71d0aa9908e19630c2e965dd7134 Mon Sep 17 00:00:00 2001 From: Mikhail Yankelevich Date: Sat, 1 Nov 2025 10:06:14 +0000 Subject: [PATCH 401/561] 8368625: com/sun/net/httpserver/ServerStopTerminationTest.java fails intermittently Reviewed-by: dfuchs --- .../httpserver/ServerStopTerminationTest.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/test/jdk/com/sun/net/httpserver/ServerStopTerminationTest.java b/test/jdk/com/sun/net/httpserver/ServerStopTerminationTest.java index 81561160725..e8f365b715b 100644 --- a/test/jdk/com/sun/net/httpserver/ServerStopTerminationTest.java +++ b/test/jdk/com/sun/net/httpserver/ServerStopTerminationTest.java @@ -124,13 +124,16 @@ public class ServerStopTerminationTest { // Complete the exchange one second into the future final Duration exchangeDuration = Duration.ofSeconds(1); + // taking start time before entering completeExchange to account for possible + // delays in reaching server.stop(). + final long startTime = System.nanoTime(); completeExchange(exchangeDuration); log("Complete Exchange triggered"); // Time the shutdown sequence - final Duration delayDuration = Duration.ofSeconds(Utils.adjustTimeout(5)); + final Duration delayDuration = Duration.ofSeconds(Utils.adjustTimeout(20)); log("Shutdown triggered with the delay of " + delayDuration.getSeconds()); - final long elapsed = timeShutdown(delayDuration); + final long elapsed = timeShutdown(delayDuration, startTime); log("Shutdown complete"); // The shutdown should take at least as long as the exchange duration @@ -151,31 +154,20 @@ public class ServerStopTerminationTest { * @throws InterruptedException if an unexpected interruption occurs */ @Test - public void shouldCompeteAfterDelay() throws InterruptedException { + public void shouldCompleteAfterDelay() throws InterruptedException { // Initiate an exchange startExchange(); // Wait for the server to receive the exchange start.await(); log("Exchange started"); - // Complete the exchange 10 second into the future. - // Runs in parallel, so won't block the server stop - final Duration exchangeDuration = Duration.ofSeconds(Utils.adjustTimeout(10)); - completeExchange(exchangeDuration); - log("Complete Exchange triggered"); - - // Time the shutdown sequence final Duration delayDuration = Duration.ofSeconds(1); log("Shutdown triggered with the delay of " + delayDuration.getSeconds()); final long elapsed = timeShutdown(delayDuration); log("Shutdown complete"); - - - // The shutdown should not await the exchange to complete - if (elapsed >= exchangeDuration.toNanos()) { - fail("HttpServer.stop terminated too late"); - } + complete.countDown(); + log("Exchange completed"); // The shutdown delay should have expired if (elapsed < delayDuration.toNanos()) { @@ -277,7 +269,14 @@ public class ServerStopTerminationTest { */ private long timeShutdown(Duration delayDuration) { final long startTime = System.nanoTime(); + return timeShutdown(delayDuration, startTime); + } + /** + * This allows passing a custom start time + */ + private long timeShutdown(Duration delayDuration, + long startTime) { server.stop((int) delayDuration.toSeconds()); return System.nanoTime() - startTime; } From f7f4f903cfdafecf69ff47d5d37e254adaf63141 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Sat, 1 Nov 2025 23:29:48 +0000 Subject: [PATCH 402/561] 8370969: --launcher-as-service option is ignored when used with --app-image option Reviewed-by: almatvee --- .../jdk/jpackage/internal/FromParams.java | 11 +- .../jdk/jpackage/test/AdditionalLauncher.java | 5 + .../helpers/jdk/jpackage/test/CfgFile.java | 6 +- .../jdk/jpackage/test/ConfigFilesStasher.java | 20 +- .../jdk/jpackage/test/JPackageCommand.java | 72 +++++- .../test/LauncherAsServiceVerifier.java | 211 ++++++++++++------ .../jdk/jpackage/test/LauncherShortcut.java | 4 +- .../jdk/jpackage/test/LinuxHelper.java | 22 +- .../helpers/jdk/jpackage/test/MacHelper.java | 26 ++- .../jdk/jpackage/test/MacSignVerify.java | 8 +- .../jdk/jpackage/test/PropertyFinder.java | 163 ++++++++++++++ .../helpers/jdk/jpackage/test/TKit.java | 25 ++- .../jpackage/test/WinShortcutVerifier.java | 25 +-- .../jdk/tools/jpackage/share/ServiceTest.java | 166 +++++++++++++- 14 files changed, 601 insertions(+), 163 deletions(-) create mode 100644 test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java index df9cc528439..cee7492dbc7 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/FromParams.java @@ -67,6 +67,7 @@ import jdk.jpackage.internal.model.Application; import jdk.jpackage.internal.model.ApplicationLaunchers; import jdk.jpackage.internal.model.ApplicationLayout; import jdk.jpackage.internal.model.ConfigException; +import jdk.jpackage.internal.model.ExternalApplication; import jdk.jpackage.internal.model.ExternalApplication.LauncherInfo; import jdk.jpackage.internal.model.Launcher; import jdk.jpackage.internal.model.LauncherShortcut; @@ -116,7 +117,7 @@ final class FromParams { if (hasPredefinedAppImage(params)) { final var appImageFile = PREDEFINED_APP_IMAGE_FILE.fetchFrom(params); appBuilder.initFromExternalApplication(appImageFile, launcherInfo -> { - var launcherParams = mapLauncherInfo(launcherInfo); + var launcherParams = mapLauncherInfo(appImageFile, launcherInfo); return launcherMapper.apply(mergeParams(params, launcherParams)); }); } else { @@ -220,10 +221,14 @@ final class FromParams { return new ApplicationLaunchers(mainLauncher, additionalLaunchers); } - private static Map mapLauncherInfo(LauncherInfo launcherInfo) { + private static Map mapLauncherInfo(ExternalApplication appImageFile, LauncherInfo launcherInfo) { Map launcherParams = new HashMap<>(); launcherParams.put(NAME.getID(), launcherInfo.name()); - launcherParams.put(LAUNCHER_AS_SERVICE.getID(), Boolean.toString(launcherInfo.service())); + if (!appImageFile.getLauncherName().equals(launcherInfo.name())) { + // This is not the main launcher, accept the value + // of "launcher-as-service" from the app image file (.jpackage.xml). + launcherParams.put(LAUNCHER_AS_SERVICE.getID(), Boolean.toString(launcherInfo.service())); + } launcherParams.putAll(launcherInfo.extra()); return launcherParams; } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java index 66da89fc3f9..a41e2b5043f 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java @@ -101,6 +101,11 @@ public final class AdditionalLauncher { return this; } + public AdditionalLauncher removeProperty(String name) { + rawProperties.remove(Objects.requireNonNull(name)); + return this; + } + public AdditionalLauncher setShortcuts(boolean menu, boolean desktop) { if (TKit.isLinux()) { setShortcut(LINUX_SHORTCUT, desktop); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java index 52e8ecf819b..e163678bacf 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/CfgFile.java @@ -22,7 +22,6 @@ */ package jdk.jpackage.test; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -34,6 +33,7 @@ import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; +import jdk.jpackage.internal.util.function.ThrowingFunction; public final class CfgFile { @@ -116,7 +116,7 @@ public final class CfgFile { return null; } - public static CfgFile load(Path path) throws IOException { + public static CfgFile load(Path path) { TKit.trace(String.format("Read [%s] jpackage cfg file", path)); final Pattern sectionBeginRegex = Pattern.compile( "\\s*\\[([^]]*)\\]\\s*"); @@ -126,7 +126,7 @@ public final class CfgFile { String currentSectionName = null; List> currentSection = new ArrayList<>(); - for (String line : Files.readAllLines(path)) { + for (String line : ThrowingFunction.>toFunction(Files::readAllLines).apply(path)) { Matcher matcher = sectionBeginRegex.matcher(line); if (matcher.find()) { if (currentSectionName != null) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java index 2321e4e852e..11627ab9125 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java @@ -29,7 +29,6 @@ import static jdk.jpackage.test.ApplicationLayout.platformAppImage; import java.io.File; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -214,22 +213,9 @@ final class ConfigFilesStasher { } private static boolean isWithServices(JPackageCommand cmd) { - boolean[] withServices = new boolean[1]; - withServices[0] = cmd.hasArgument("--launcher-as-service"); - if (!withServices[0]) { - AdditionalLauncher.forEachAdditionalLauncher(cmd, (launcherName, propertyFilePath) -> { - try { - final var launcherAsService = new AdditionalLauncher.PropertyFile(propertyFilePath) - .findBooleanProperty("launcher-as-service").orElse(false); - if (launcherAsService) { - withServices[0] = true; - } - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - }); - } - return withServices[0]; + return cmd.launcherNames(true).stream().anyMatch(launcherName -> { + return LauncherAsServiceVerifier.launcherAsService(cmd, launcherName); + }); } private static List listAppImage(Path to) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index b3729093ad2..fcd940e725e 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -39,6 +39,7 @@ import java.nio.file.Path; import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.ListIterator; @@ -573,6 +574,24 @@ public class JPackageCommand extends CommandArguments { return appLayout().runtimeDirectory(); } + /** + * Returns the name of the main launcher. It will read the name of the main + * launcher from the external app image if such is specified. + * + * @return the name of the main launcher + * + * @throws IllegalArgumentException if the command is configured for packaging + * Java runtime + */ + public String mainLauncherName() { + verifyNotRuntime(); + return name(); + } + + boolean isMainLauncher(String launcherName) { + return launcherName == null || mainLauncherName().equals(launcherName); + } + /** * Returns path for application launcher with the given name. * @@ -589,7 +608,7 @@ public class JPackageCommand extends CommandArguments { public Path appLauncherPath(String launcherName) { verifyNotRuntime(); if (launcherName == null) { - launcherName = name(); + launcherName = mainLauncherName(); } if (TKit.isWindows()) { @@ -607,15 +626,54 @@ public class JPackageCommand extends CommandArguments { } /** - * Returns names of all additional launchers or empty list if none - * configured. + * Returns names of additional launchers or an empty list if none configured. + *

          + * If {@code lookupInPrederfinedAppImage} is {@code true} and the command is + * configured with an external app image, it will read names of the additional + * launchers from the external app image. + * + * @param lookupInPrederfinedAppImage if to read names of additional launchers + * from an external app image + * + * @return the names of additional launchers */ - public List addLauncherNames() { + public List addLauncherNames(boolean lookupInPrederfinedAppImage) { + if (isRuntime()) { + return List.of(); + } + List names = new ArrayList<>(); + if (lookupInPrederfinedAppImage) { + Optional.ofNullable(getArgumentValue("--app-image")) + .map(Path::of) + .map(AppImageFile::load) + .map(AppImageFile::addLaunchers) + .map(Map::keySet) + .ifPresent(names::addAll); + } forEachAdditionalLauncher(this, (launcherName, propFile) -> { names.add(launcherName); }); - return names; + return Collections.unmodifiableList(names); + } + + /** + * Returns names of all launchers. + *

          + * If the list is not empty, the first element is {@code null} referencing the + * main launcher. In the case of runtime packaging, the list is empty. + * + * @return the names of all launchers + */ + public List launcherNames(boolean lookupInPrederfinedAppImage) { + if (isRuntime()) { + return List.of(); + } + + List names = new ArrayList<>(); + names.add(null); + names.addAll(addLauncherNames(lookupInPrederfinedAppImage)); + return Collections.unmodifiableList(names); } private void verifyNotRuntime() { @@ -639,7 +697,7 @@ public class JPackageCommand extends CommandArguments { public Path appLauncherCfgPath(String launcherName) { verifyNotRuntime(); if (launcherName == null) { - launcherName = name(); + launcherName = mainLauncherName(); } return appLayout().appDirectory().resolve(launcherName + ".cfg"); } @@ -1244,7 +1302,7 @@ public class JPackageCommand extends CommandArguments { // a predefined app image. if (!hasArgument("--app-image")) { TKit.assertStringListEquals( - addLauncherNames().stream().sorted().toList(), + addLauncherNames(false).stream().sorted().toList(), aif.addLaunchers().keySet().stream().sorted().toList(), "Check additional launcher names"); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java index e1cd37fe8b4..ce6faf99034 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherAsServiceVerifier.java @@ -22,20 +22,19 @@ */ package jdk.jpackage.test; -import static jdk.jpackage.internal.util.function.ThrowingBiConsumer.toBiConsumer; -import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; -import static jdk.jpackage.test.AdditionalLauncher.forEachAdditionalLauncher; import static jdk.jpackage.test.PackageType.LINUX; import static jdk.jpackage.test.PackageType.MAC_PKG; import static jdk.jpackage.test.PackageType.WINDOWS; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.FileSystemException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -44,8 +43,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.jpackage.internal.util.PathUtils; +import jdk.jpackage.internal.util.function.ThrowingFunction; import jdk.jpackage.internal.util.function.ThrowingRunnable; -import jdk.jpackage.test.AdditionalLauncher.PropertyFile; import jdk.jpackage.test.LauncherVerifier.Action; public final class LauncherAsServiceVerifier { @@ -67,26 +66,56 @@ public final class LauncherAsServiceVerifier { return this; } + public Builder setAppOutputFileNamePrefix(String v) { + appOutputFileNamePrefix = v; + return this; + } + + public Builder appendAppOutputFileNamePrefix(String v) { + return setAppOutputFileNamePrefix(appOutputFileNamePrefix() + Objects.requireNonNull(v)); + } + + public Builder setAppOutputFileNamePrefixToAppName() { + return setAppOutputFileNamePrefix(TKit.getCurrentDefaultAppName()); + } + public Builder setAdditionalLauncherCallback(Consumer v) { additionalLauncherCallback = v; return this; } - public LauncherAsServiceVerifier create() { - Objects.requireNonNull(expectedValue); - return new LauncherAsServiceVerifier(launcherName, appOutputFileName, - expectedValue, - launcherName != null ? additionalLauncherCallback : null); + public Builder mutate(Consumer mutator) { + mutator.accept(this); + return this; } - public Builder applyTo(PackageTest pkg) { - create().applyTo(pkg); + public LauncherAsServiceVerifier create() { + Objects.requireNonNull(expectedValue); + return new LauncherAsServiceVerifier( + launcherName, + appOutputFileNamePrefix() + + Optional.ofNullable(appOutputFileName).orElse("launcher-as-service.txt"), + expectedValue, + Optional.ofNullable(additionalLauncherCallback)); + } + + public Builder applyTo(PackageTest test) { + return applyTo(new ConfigurationTarget(test)); + } + + public Builder applyTo(ConfigurationTarget target) { + create().applyTo(target); return this; } + private String appOutputFileNamePrefix() { + return Optional.ofNullable(appOutputFileNamePrefix).orElse(""); + } + private String launcherName; private String expectedValue; - private String appOutputFileName = "launcher-as-service.txt"; + private String appOutputFileName; + private String appOutputFileNamePrefix; private Consumer additionalLauncherCallback; } @@ -97,41 +126,50 @@ public final class LauncherAsServiceVerifier { private LauncherAsServiceVerifier(String launcherName, String appOutputFileName, String expectedArgValue, - Consumer additionalLauncherCallback) { - this.expectedValue = expectedArgValue; + Optional> additionalLauncherCallback) { + + if (launcherName == null && additionalLauncherCallback.isPresent()) { + throw new UnsupportedOperationException(); + } + + this.expectedValue = Objects.requireNonNull(expectedArgValue); this.launcherName = launcherName; this.appOutputFileName = Path.of(appOutputFileName); this.additionalLauncherCallback = additionalLauncherCallback; } - public void applyTo(PackageTest pkg) { + public void applyTo(ConfigurationTarget target) { if (launcherName == null) { - pkg.forTypes(WINDOWS, () -> { - pkg.addInitializer(cmd -> { - // Remove parameter added to jpackage command line in HelloApp.addTo() - cmd.removeArgument("--win-console"); - }); + target.addInitializer(cmd -> { + // Remove parameter added to jpackage command line in HelloApp.addTo() + cmd.removeArgument("--win-console"); }); - applyToMainLauncher(pkg); + applyToMainLauncher(target); } else { - applyToAdditionalLauncher(pkg); + applyToAdditionalLauncher(target); } - pkg.addInstallVerifier(this::verifyLauncherExecuted); + target.test().ifPresent(pkg -> { + pkg.addInstallVerifier(this::verifyLauncherExecuted); + }); } static void verify(JPackageCommand cmd) { cmd.verifyIsOfType(SUPPORTED_PACKAGES); - var launcherNames = getLaunchersAsServices(cmd); + var partitionedLauncherNames = partitionLaunchers(cmd); - launcherNames.forEach(toConsumer(launcherName -> { - verify(cmd, launcherName); - })); + var launcherAsServiceNames = partitionedLauncherNames.get(true); + + for (var launcherAsService : List.of(true, false)) { + partitionedLauncherNames.get(launcherAsService).forEach(launcherName -> { + verify(cmd, launcherName, launcherAsService); + }); + } if (WINDOWS.contains(cmd.packageType()) && !cmd.isRuntime()) { Path serviceInstallerPath = cmd.appLayout().launchersDirectory().resolve( "service-installer.exe"); - if (launcherNames.isEmpty()) { + if (launcherAsServiceNames.isEmpty()) { TKit.assertPathExists(serviceInstallerPath, false); } else { TKit.assertFileExists(serviceInstallerPath); @@ -146,16 +184,16 @@ public final class LauncherAsServiceVerifier { if (cmd.isPackageUnpacked()) { servicesSpecificFolders.add(MacHelper.getServicePlistFilePath( - cmd, null).getParent()); + cmd, "foo").getParent()); } } else if (LINUX.contains(cmd.packageType())) { if (cmd.isPackageUnpacked()) { servicesSpecificFolders.add(LinuxHelper.getServiceUnitFilePath( - cmd, null).getParent()); + cmd, "foo").getParent()); } } - if (launcherNames.isEmpty() || cmd.isRuntime()) { + if (launcherAsServiceNames.isEmpty() || cmd.isRuntime()) { servicesSpecificFiles.forEach(path -> TKit.assertPathExists(path, false)); servicesSpecificFolders.forEach(path -> TKit.assertPathExists(path, @@ -187,22 +225,46 @@ public final class LauncherAsServiceVerifier { } static List getLaunchersAsServices(JPackageCommand cmd) { - List launcherNames = new ArrayList<>(); - - if (cmd.hasArgument("--launcher-as-service")) { - launcherNames.add(null); - } - - forEachAdditionalLauncher(cmd, toBiConsumer((launcherName, propFilePath) -> { - if (new PropertyFile(propFilePath).findBooleanProperty("launcher-as-service").orElse(false)) { - launcherNames.add(launcherName); - } - })); - - return launcherNames; + return Objects.requireNonNull(partitionLaunchers(cmd).get(true)); } - private boolean canVerifyInstall(JPackageCommand cmd) throws IOException { + private static Map> partitionLaunchers(JPackageCommand cmd) { + if (cmd.isRuntime()) { + return Map.of(true, List.of(), false, List.of()); + } else { + return cmd.launcherNames(true).stream().collect(Collectors.partitioningBy(launcherName -> { + return launcherAsService(cmd, launcherName); + })); + } + } + + static boolean launcherAsService(JPackageCommand cmd, String launcherName) { + if (cmd.isMainLauncher(launcherName)) { + return PropertyFinder.findLauncherProperty(cmd, null, + PropertyFinder.cmdlineBooleanOption("--launcher-as-service"), + PropertyFinder.nop(), + PropertyFinder.nop() + ).map(Boolean::parseBoolean).orElse(false); + } else { + var mainLauncherValue = PropertyFinder.findLauncherProperty(cmd, null, + PropertyFinder.cmdlineBooleanOption("--launcher-as-service"), + PropertyFinder.nop(), + PropertyFinder.nop() + ).map(Boolean::parseBoolean).orElse(false); + + var value = PropertyFinder.findLauncherProperty(cmd, launcherName, + PropertyFinder.nop(), + PropertyFinder.launcherPropertyFile("launcher-as-service"), + PropertyFinder.appImageFileLauncher(cmd, launcherName, "service").defaultValue(Boolean.FALSE.toString()) + ).map(Boolean::parseBoolean); + + return value.orElse(mainLauncherValue); + } + } + + private boolean canVerifyInstall(JPackageCommand cmd) { + cmd.verifyIsOfType(SUPPORTED_PACKAGES); + String msg = String.format( "Not verifying contents of test output file [%s] for %s launcher", appOutputFilePathInitialize(), @@ -221,8 +283,8 @@ public final class LauncherAsServiceVerifier { return true; } - private void applyToMainLauncher(PackageTest pkg) { - pkg.addInitializer(cmd -> { + private void applyToMainLauncher(ConfigurationTarget target) { + target.addInitializer(cmd -> { cmd.addArgument("--launcher-as-service"); cmd.addArguments("--arguments", JPackageCommand.escapeAndJoin(expectedValue)); @@ -232,7 +294,7 @@ public final class LauncherAsServiceVerifier { }); } - private void applyToAdditionalLauncher(PackageTest pkg) { + private void applyToAdditionalLauncher(ConfigurationTarget target) { var al = new AdditionalLauncher(launcherName) .setProperty("launcher-as-service", true) .addJavaOptions("-Djpackage.test.appOutput=" + appOutputFilePathInitialize().toString()) @@ -240,16 +302,16 @@ public final class LauncherAsServiceVerifier { .addDefaultArguments(expectedValue) .withoutVerifyActions(Action.EXECUTE_LAUNCHER); - Optional.ofNullable(additionalLauncherCallback).ifPresent(v -> v.accept(al)); + additionalLauncherCallback.ifPresent(v -> v.accept(al)); - al.applyTo(pkg); + target.add(al); } - private void verifyLauncherExecuted(JPackageCommand cmd) throws IOException { + public void verifyLauncherExecuted(JPackageCommand cmd) { if (canVerifyInstall(cmd)) { delayInstallVerify(); Path outputFilePath = appOutputFilePathVerify(cmd); - HelloApp.assertApp(cmd.appLauncherPath()) + HelloApp.assertApp(cmd.appLauncherPath(launcherName)) .addParam("jpackage.test.appOutput", outputFilePath.toString()) .addDefaultArguments(expectedValue) .verifyOutput(); @@ -257,31 +319,41 @@ public final class LauncherAsServiceVerifier { } } - private static void deleteOutputFile(Path file) throws IOException { + private static void deleteOutputFile(Path file) { try { TKit.deleteIfExists(file); } catch (FileSystemException ex) { if (TKit.isLinux() || TKit.isOSX()) { // Probably "Operation no permitted" error. Try with "sudo" as the // file is created by a launcher started under root account. - Executor.of("sudo", "rm", "-f").addArgument(file.toString()). - execute(); + Executor.of("sudo", "rm", "-f").addArgument(file.toString()).execute(); } else { - throw ex; + throw new UncheckedIOException(ex); + } + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + private static void verify(JPackageCommand cmd, String launcherName, boolean launcherAsService) { + if (LINUX.contains(cmd.packageType())) { + if (launcherAsService) { + verifyLinuxUnitFile(cmd, launcherName); + } else { + var serviceUnitFile = LinuxHelper.getServiceUnitFilePath(cmd, launcherName); + TKit.assertPathExists(serviceUnitFile, false); + } + } else if (MAC_PKG.equals(cmd.packageType())) { + if (launcherAsService) { + verifyMacDaemonPlistFile(cmd, launcherName); + } else { + var servicePlistFile = MacHelper.getServicePlistFilePath(cmd, launcherName); + TKit.assertPathExists(servicePlistFile, false); } } } - private static void verify(JPackageCommand cmd, String launcherName) throws IOException { - if (LINUX.contains(cmd.packageType())) { - verifyLinuxUnitFile(cmd, launcherName); - } else if (MAC_PKG.equals(cmd.packageType())) { - verifyMacDaemonPlistFile(cmd, launcherName); - } - } - - private static void verifyLinuxUnitFile(JPackageCommand cmd, - String launcherName) throws IOException { + private static void verifyLinuxUnitFile(JPackageCommand cmd, String launcherName) { var serviceUnitFile = LinuxHelper.getServiceUnitFilePath(cmd, launcherName); @@ -296,11 +368,10 @@ public final class LauncherAsServiceVerifier { TKit.assertTextStream("ExecStart=" + execStartValue) .label("unit file") .predicate(String::equals) - .apply(Files.readAllLines(serviceUnitFile)); + .apply(ThrowingFunction.>toFunction(Files::readAllLines).apply(serviceUnitFile)); } - private static void verifyMacDaemonPlistFile(JPackageCommand cmd, - String launcherName) throws IOException { + private static void verifyMacDaemonPlistFile(JPackageCommand cmd, String launcherName) { var servicePlistFile = MacHelper.getServicePlistFilePath(cmd, launcherName); @@ -348,7 +419,7 @@ public final class LauncherAsServiceVerifier { private final String expectedValue; private final String launcherName; private final Path appOutputFileName; - private final Consumer additionalLauncherCallback; + private final Optional> additionalLauncherCallback; static final Set SUPPORTED_PACKAGES = Stream.of( LINUX, diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherShortcut.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherShortcut.java index 1ee3b8d47b0..2cc5fcc95fc 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherShortcut.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherShortcut.java @@ -103,9 +103,7 @@ public enum LauncherShortcut { Optional expectShortcut(JPackageCommand cmd, Optional predefinedAppImage, String launcherName) { Objects.requireNonNull(predefinedAppImage); - final var name = Optional.ofNullable(launcherName).orElseGet(cmd::name); - - if (name.equals(cmd.name())) { + if (cmd.isMainLauncher(launcherName)) { return findMainLauncherShortcut(cmd); } else { String[] propertyName = new String[1]; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index 1807d3ce256..c8df0f640d0 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -45,7 +45,6 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -101,7 +100,7 @@ public final class LinuxHelper { return cmd.pathToUnpackedPackageFile( Path.of("/lib/systemd/system").resolve(getServiceUnitFileName( getPackageName(cmd), - Optional.ofNullable(launcherName).orElseGet(cmd::name)))); + Optional.ofNullable(launcherName).orElseGet(cmd::mainLauncherName)))); } static String getBundleName(JPackageCommand cmd) { @@ -371,12 +370,11 @@ public final class LinuxHelper { cmd.verifyIsOfType(PackageType.LINUX); final var desktopFiles = getDesktopFiles(cmd); - final var predefinedAppImage = Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of).map(AppImageFile::load); return desktopFiles.stream().map(desktopFile -> { var systemDesktopFile = getSystemDesktopFilesFolder().resolve(desktopFile.getFileName()); return new InvokeShortcutSpec.Stub( - launcherNameFromDesktopFile(cmd, predefinedAppImage, desktopFile), + launcherNameFromDesktopFile(cmd, desktopFile), LauncherShortcut.LINUX_SHORTCUT, new DesktopFile(systemDesktopFile, false).findQuotedValue("Path").map(Path::of), List.of("gtk-launch", PathUtils.replaceSuffix(systemDesktopFile.getFileName(), "").toString())); @@ -532,16 +530,11 @@ public final class LinuxHelper { TKit.assertEquals(List.of(), unreferencedIconFiles, "Check there are no unreferenced icon files in the package"); } - private static String launcherNameFromDesktopFile(JPackageCommand cmd, Optional predefinedAppImage, Path desktopFile) { + private static String launcherNameFromDesktopFile(JPackageCommand cmd, Path desktopFile) { Objects.requireNonNull(cmd); - Objects.requireNonNull(predefinedAppImage); Objects.requireNonNull(desktopFile); - return predefinedAppImage.map(v -> { - return v.launchers().keySet().stream(); - }).orElseGet(() -> { - return Stream.concat(Stream.of(cmd.name()), cmd.addLauncherNames().stream()); - }).filter(name-> { + return Stream.concat(Stream.of(cmd.mainLauncherName()), cmd.addLauncherNames(true).stream()).filter(name-> { return getDesktopFile(cmd, name).equals(desktopFile); }).findAny().orElseThrow(() -> { TKit.assertUnexpected(String.format("Failed to find launcher corresponding to [%s] file", desktopFile)); @@ -557,7 +550,7 @@ public final class LinuxHelper { TKit.trace(String.format("Check [%s] file BEGIN", desktopFile)); - var launcherName = launcherNameFromDesktopFile(cmd, predefinedAppImage, desktopFile); + var launcherName = launcherNameFromDesktopFile(cmd, desktopFile); var data = new DesktopFile(desktopFile, true); @@ -887,8 +880,9 @@ public final class LinuxHelper { return arch; } - private static String getServiceUnitFileName(String packageName, - String launcherName) { + private static String getServiceUnitFileName(String packageName, String launcherName) { + Objects.requireNonNull(packageName); + Objects.requireNonNull(launcherName); try { return getServiceUnitFileName.invoke(null, packageName, launcherName).toString(); } catch (InvocationTargetException | IllegalAccessException ex) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index 3900851f810..dc753624a32 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -56,6 +56,7 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -662,16 +663,21 @@ public final class MacHelper { } private static String getPackageId(JPackageCommand cmd) { - return cmd.getArgumentValue("--mac-package-identifier", () -> { - return cmd.getArgumentValue("--main-class", cmd::name, className -> { - var packageName = ClassDesc.of(className).packageName(); - if (packageName.isEmpty()) { - return className; - } else { - return packageName; - } - }); - }); + UnaryOperator getPackageIdFromClassName = className -> { + var packageName = ClassDesc.of(className).packageName(); + if (packageName.isEmpty()) { + return className; + } else { + return packageName; + } + }; + + return PropertyFinder.findAppProperty(cmd, + PropertyFinder.cmdlineOptionWithValue("--mac-package-identifier").or( + PropertyFinder.cmdlineOptionWithValue("--main-class").map(getPackageIdFromClassName) + ), + PropertyFinder.appImageFile(AppImageFile::mainLauncherClassName).map(getPackageIdFromClassName) + ).orElseGet(cmd::name); } public static boolean isXcodeDevToolsInstalled() { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java index 81d31ed7267..123fba56b71 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacSignVerify.java @@ -61,11 +61,9 @@ public final class MacSignVerify { assertSigned(bundleRoot, certRequest); - if (!cmd.isRuntime()) { - cmd.addLauncherNames().stream().map(cmd::appLauncherPath).forEach(launcherPath -> { - assertSigned(launcherPath, certRequest); - }); - } + cmd.addLauncherNames(true).stream().map(cmd::appLauncherPath).forEach(launcherPath -> { + assertSigned(launcherPath, certRequest); + }); // Set to "null" if the sign origin is not found, instead of bailing out with an exception. // Let is fail in the following TKit.assertEquals() call with a proper log message. diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java new file mode 100644 index 00000000000..e310de855c6 --- /dev/null +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2019, 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. + * + * 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 jdk.jpackage.test; +import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; + +import java.nio.file.Path; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.UnaryOperator; +import jdk.jpackage.test.AdditionalLauncher.PropertyFile; + +final class PropertyFinder { + + @FunctionalInterface + static interface Finder { + Optional find(T target); + + default Finder defaultValue(String v) { + return target -> { + return Optional.of(find(target).orElse(v)); + }; + } + + default Finder map(UnaryOperator v) { + Objects.requireNonNull(v); + return target -> { + return find(target).map(v); + }; + } + + default Finder or(Finder other) { + return target -> { + return find(target).or(() -> { + return other.find(target); + }); + }; + } + } + + static Finder nop() { + return target -> { + return Optional.empty(); + }; + } + + static Finder appImageFileLauncher(JPackageCommand cmd, String launcherName, String propertyName) { + Objects.requireNonNull(propertyName); + if (cmd.isMainLauncher(launcherName)) { + return target -> { + return Optional.ofNullable(target.launchers().get(target.mainLauncherName()).get(propertyName)); + }; + } else { + return target -> { + return Optional.ofNullable(target.addLaunchers().get(launcherName).get(propertyName)); + }; + } + } + + static Finder appImageFile(Function propertyGetter) { + Objects.requireNonNull(propertyGetter); + return target -> { + return Optional.of(propertyGetter.apply(target)); + }; + } + + static Finder appImageFileOptional(Function> propertyGetter) { + Objects.requireNonNull(propertyGetter); + return target -> { + return propertyGetter.apply(target); + }; + } + + static Finder launcherPropertyFile(String propertyName) { + return target -> { + return target.findProperty(propertyName); + }; + } + + static Finder cmdlineBooleanOption(String optionName) { + return target -> { + return Optional.of(target.hasArgument(optionName)).map(Boolean::valueOf).map(Object::toString); + }; + } + + static Finder cmdlineOptionWithValue(String optionName) { + return target -> { + return Optional.ofNullable(target.getArgumentValue(optionName)); + }; + } + + static Optional findAppProperty( + JPackageCommand cmd, + Finder cmdlineFinder, + Finder appImageFileFinder) { + + Objects.requireNonNull(cmd); + Objects.requireNonNull(cmdlineFinder); + Objects.requireNonNull(appImageFileFinder); + + var reply = cmdlineFinder.find(cmd); + if (reply.isPresent()) { + return reply; + } else { + var appImageFilePath = Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of); + return appImageFilePath.map(AppImageFile::load).flatMap(appImageFileFinder::find); + } + } + + static Optional findLauncherProperty( + JPackageCommand cmd, + String launcherName, + Finder cmdlineFinder, + Finder addLauncherPropertyFileFinder, + Finder appImageFileFinder) { + + Objects.requireNonNull(cmd); + Objects.requireNonNull(cmdlineFinder); + Objects.requireNonNull(addLauncherPropertyFileFinder); + Objects.requireNonNull(appImageFileFinder); + + var mainLauncher = cmd.isMainLauncher(launcherName); + + var appImageFilePath = Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of); + + Optional reply; + + if (mainLauncher) { + reply = cmdlineFinder.find(cmd); + } else if (appImageFilePath.isEmpty()) { + var props = getAdditionalLauncherProperties(cmd, launcherName); + reply = addLauncherPropertyFileFinder.find(props); + } else { + reply = Optional.empty(); + } + + if (reply.isPresent()) { + return reply; + } else { + return appImageFilePath.map(AppImageFile::load).flatMap(appImageFileFinder::find); + } + } +} diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java index baeeda4e569..0afdf31ec68 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/TKit.java @@ -314,8 +314,11 @@ public final class TKit { public static void createTextFile(Path filename, Stream lines) { trace(String.format("Create [%s] text file...", filename.toAbsolutePath().normalize())); - ThrowingRunnable.toRunnable(() -> Files.write(filename, - lines.peek(TKit::trace).collect(Collectors.toList()))).run(); + try { + Files.write(filename, lines.peek(TKit::trace).toList()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } trace("Done"); } @@ -323,16 +326,24 @@ public final class TKit { Collection> props) { trace(String.format("Create [%s] properties file...", propsFilename.toAbsolutePath().normalize())); - ThrowingRunnable.toRunnable(() -> Files.write(propsFilename, - props.stream().map(e -> String.join("=", e.getKey(), - e.getValue())).peek(TKit::trace).collect(Collectors.toList()))).run(); + try { + Files.write(propsFilename, props.stream().map(e -> { + return String.join("=", e.getKey(), e.getValue()); + }).peek(TKit::trace).toList()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } trace("Done"); } - public static void traceFileContents(Path path, String label) throws IOException { + public static void traceFileContents(Path path, String label) { assertFileExists(path); trace(String.format("Dump [%s] %s...", path, label)); - Files.readAllLines(path).forEach(TKit::trace); + try { + Files.readAllLines(path).forEach(TKit::trace); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } trace("Done"); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WinShortcutVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WinShortcutVerifier.java index 27e94366e69..0e581c1e7dc 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WinShortcutVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/WinShortcutVerifier.java @@ -23,6 +23,7 @@ package jdk.jpackage.test; import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toUnmodifiableMap; import static jdk.jpackage.test.LauncherShortcut.WIN_DESKTOP_SHORTCUT; import static jdk.jpackage.test.LauncherShortcut.WIN_START_MENU_SHORTCUT; import static jdk.jpackage.test.WindowsHelper.getInstallationSubDirectory; @@ -32,7 +33,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -51,7 +51,7 @@ public final class WinShortcutVerifier { static void verifyBundleShortcuts(JPackageCommand cmd) { cmd.verifyIsOfType(PackageType.WIN_MSI); - if (Stream.of("--win-menu", "--win-shortcut").noneMatch(cmd::hasArgument) && cmd.addLauncherNames().isEmpty()) { + if (Stream.of("--win-menu", "--win-shortcut").noneMatch(cmd::hasArgument) && cmd.addLauncherNames(true).isEmpty()) { return; } @@ -170,7 +170,7 @@ public final class WinShortcutVerifier { private static Shortcut createLauncherShortcutSpec(JPackageCommand cmd, String launcherName, SpecialFolder installRoot, Path workDir, ShortcutType type) { - var name = Optional.ofNullable(launcherName).orElseGet(cmd::name); + var name = Optional.ofNullable(launcherName).orElseGet(cmd::mainLauncherName); var appLayout = ApplicationLayout.windowsAppImage().resolveAt( Path.of(installRoot.getMsiPropertyName()).resolve(getInstallationSubDirectory(cmd))); @@ -250,22 +250,19 @@ public final class WinShortcutVerifier { } private static Map> expectShortcuts(JPackageCommand cmd) { - Map> expectedShortcuts = new HashMap<>(); var predefinedAppImage = Optional.ofNullable(cmd.getArgumentValue("--app-image")).map(Path::of).map(AppImageFile::load); - predefinedAppImage.map(v -> { - return v.launchers().keySet().stream(); - }).orElseGet(() -> { - return Stream.concat(Stream.of(cmd.name()), cmd.addLauncherNames().stream()); - }).forEach(launcherName -> { + return cmd.launcherNames(true).stream().map(launcherName -> { + return Optional.ofNullable(launcherName).orElseGet(cmd::mainLauncherName); + }).map(launcherName -> { var shortcuts = expectLauncherShortcuts(cmd, predefinedAppImage, launcherName); - if (!shortcuts.isEmpty()) { - expectedShortcuts.put(launcherName, shortcuts); + if (shortcuts.isEmpty()) { + return null; + } else { + return Map.entry(launcherName, shortcuts); } - }); - - return expectedShortcuts; + }).filter(Objects::nonNull).collect(toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue)); } private static InvokeShortcutSpec convert(JPackageCommand cmd, String launcherName, Shortcut shortcut) { diff --git a/test/jdk/tools/jpackage/share/ServiceTest.java b/test/jdk/tools/jpackage/share/ServiceTest.java index f11ca628ed4..56e003f508c 100644 --- a/test/jdk/tools/jpackage/share/ServiceTest.java +++ b/test/jdk/tools/jpackage/share/ServiceTest.java @@ -21,18 +21,26 @@ * questions. */ +import static jdk.jpackage.test.PackageType.MAC_DMG; +import static jdk.jpackage.test.PackageType.WINDOWS; + import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.HexFormat; import java.util.Optional; +import java.util.function.Consumer; import java.util.stream.Stream; -import jdk.jpackage.test.PackageTest; +import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.ConfigurationTarget; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JavaTool; import jdk.jpackage.test.LauncherAsServiceVerifier; -import static jdk.jpackage.test.PackageType.MAC_DMG; -import static jdk.jpackage.test.PackageType.WINDOWS; +import jdk.jpackage.test.LauncherVerifier.Action; +import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.RunnablePackageTest; import jdk.jpackage.test.TKit; @@ -47,11 +55,26 @@ import jdk.jpackage.test.TKit; * @library /test/jdk/tools/jpackage/helpers * @build jdk.jpackage.test.* * @key jpackagePlatformPackage + * @requires (jpackage.test.SQETest != null) * @compile -Xlint:all -Werror ServiceTest.java - * @run main/othervm/timeout=360 -Xmx512m + * @run main/othervm/timeout=2880 -Xmx512m + * jdk.jpackage.test.Main + * --jpt-run=ServiceTest.test,ServiceTest.testUpdate + */ + +/* + * @test + * @summary Launcher as service packaging test + * @library /test/jdk/tools/jpackage/helpers + * @build jdk.jpackage.test.* + * @key jpackagePlatformPackage + * @requires (jpackage.test.SQETest == null) + * @compile -Xlint:all -Werror ServiceTest.java + * @run main/othervm/timeout=2880 -Xmx512m * jdk.jpackage.test.Main * --jpt-run=ServiceTest */ + public class ServiceTest { public ServiceTest() { @@ -86,10 +109,9 @@ public class ServiceTest { @Test public void test() throws Throwable { - var testInitializer = createTestInitializer(); var pkg = createPackageTest().addHelloAppInitializer("com.foo.ServiceTest"); LauncherAsServiceVerifier.build().setExpectedValue("A1").applyTo(pkg); - testInitializer.applyTo(pkg); + createTestInitializer().applyTo(pkg); pkg.run(); } @@ -132,6 +154,108 @@ public class ServiceTest { new PackageTest.Group(pkg, pkg2).run(); } + @Test + @Parameter("true") + @Parameter("false") + public void testAddL(boolean mainLauncherAsService) { + + final var uniqueOutputFile = uniqueOutputFile(); + + createPackageTest() + .addHelloAppInitializer("com.buz.AddLaunchersServiceTest") + .mutate(test -> { + if (mainLauncherAsService) { + LauncherAsServiceVerifier.build() + .mutate(uniqueOutputFile).appendAppOutputFileNamePrefix("-") + .setExpectedValue("Main").applyTo(test); + } + }) + // Regular launcher. The installer should not automatically execute it. + .mutate(new AdditionalLauncher("notservice") + .withoutVerifyActions(Action.EXECUTE_LAUNCHER) + .setProperty("launcher-as-service", Boolean.FALSE) + .addJavaOptions("-Djpackage.test.noexit=true")::applyTo) + // Additional launcher with explicit "launcher-as-service=true" property in the property file. + .mutate(LauncherAsServiceVerifier.build() + .mutate(uniqueOutputFile).appendAppOutputFileNamePrefix("-A1-") + .setLauncherName("AL1") + .setExpectedValue("AL1")::applyTo) + .mutate(test -> { + if (mainLauncherAsService) { + // Additional launcher without "launcher-as-service" property in the property file. + // Still, should be installed as a service. + LauncherAsServiceVerifier.build() + .mutate(uniqueOutputFile).appendAppOutputFileNamePrefix("-A2-") + .setLauncherName("AL2") + .setExpectedValue("AL2") + .setAdditionalLauncherCallback(al -> { + al.removeProperty("launcher-as-service"); + }) + .applyTo(test); + } + }) + .mutate(createTestInitializer()::applyTo) + .run(); + } + + @Test + @Parameter("true") + @Parameter("false") + public void testAddLFromAppImage(boolean mainLauncherAsService) { + + var uniqueOutputFile = uniqueOutputFile(); + + var appImageCmd = new ConfigurationTarget(JPackageCommand.helloAppImage("com.bar.AddLaunchersFromAppImageServiceTest")); + + if (RunnablePackageTest.hasAction(RunnablePackageTest.Action.INSTALL)) { + // Ensure launchers are executable because the output bundle will be installed + // and we want to verify launchers are automatically started by the installer. + appImageCmd.addInitializer(JPackageCommand::ignoreFakeRuntime); + } + + if (mainLauncherAsService) { + LauncherAsServiceVerifier.build() + .mutate(uniqueOutputFile).appendAppOutputFileNamePrefix("-") + .setExpectedValue("Main") + .applyTo(appImageCmd); + // Can not use "--launcher-as-service" option with app image packaging. + appImageCmd.cmd().orElseThrow().removeArgument("--launcher-as-service"); + } else { + appImageCmd.addInitializer(cmd -> { + // Configure the main launcher to hang at the end of the execution. + // The main launcher should not be executed in this test. + // If it is executed, it indicates it was started as a service, + // which must fail the test. The launcher's hang-up will be the event failing the test. + cmd.addArguments("--java-options", "-Djpackage.test.noexit=true"); + }); + } + + // Additional launcher with explicit "launcher-as-service=true" property in the property file. + LauncherAsServiceVerifier.build() + .mutate(uniqueOutputFile).appendAppOutputFileNamePrefix("-A1-") + .setLauncherName("AL1") + .setExpectedValue("AL1").applyTo(appImageCmd); + + // Regular launcher. The installer should not automatically execute it. + appImageCmd.add(new AdditionalLauncher("notservice") + .withoutVerifyActions(Action.EXECUTE_LAUNCHER) + .addJavaOptions("-Djpackage.test.noexit=true")); + + new PackageTest().excludeTypes(MAC_DMG) + .addRunOnceInitializer(appImageCmd.cmd().orElseThrow()::execute) + .addInitializer(cmd -> { + cmd.removeArgumentWithValue("--input"); + cmd.addArguments("--app-image", appImageCmd.cmd().orElseThrow().outputBundle()); + }) + .addInitializer(cmd -> { + if (mainLauncherAsService) { + cmd.addArgument("--launcher-as-service"); + } + }) + .mutate(createTestInitializer()::applyTo) + .run(); + } + private final class TestInitializer { TestInitializer setUpgradeCode(String v) { @@ -139,11 +263,14 @@ public class ServiceTest { return this; } - void applyTo(PackageTest test) throws IOException { + void applyTo(PackageTest test) { if (winServiceInstaller != null) { var resourceDir = TKit.createTempDirectory("resource-dir"); - Files.copy(winServiceInstaller, resourceDir.resolve( - "service-installer.exe")); + try { + Files.copy(winServiceInstaller, resourceDir.resolve("service-installer.exe")); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } test.forTypes(WINDOWS, () -> test.addInitializer(cmd -> { cmd.addArguments("--resource-dir", resourceDir); @@ -165,9 +292,28 @@ public class ServiceTest { } private static PackageTest createPackageTest() { - return new PackageTest() + var test = new PackageTest() .excludeTypes(MAC_DMG) // DMG not supported .addInitializer(JPackageCommand::setInputToEmptyDirectory); + if (RunnablePackageTest.hasAction(RunnablePackageTest.Action.INSTALL)) { + // Ensure launchers are executable because the output bundle will be installed + // and we want to verify launchers are automatically started by the installer. + test.addInitializer(JPackageCommand::ignoreFakeRuntime); + } + return test; + } + + private static Consumer uniqueOutputFile() { + var prefix = uniquePrefix(); + return builder -> { + builder.setAppOutputFileNamePrefixToAppName() + .appendAppOutputFileNamePrefix("-") + .appendAppOutputFileNamePrefix(prefix); + }; + } + + private static String uniquePrefix() { + return HexFormat.of().toHexDigits(System.currentTimeMillis()); } private final Path winServiceInstaller; From 7c900da1985c9508198ea7805e4955da4a7cac42 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Sun, 2 Nov 2025 02:19:11 +0000 Subject: [PATCH 403/561] 8371076: jpackage will wrongly overwrite the plist file in the embedded runtime when executed with the "--app-image" option Reviewed-by: almatvee --- .../jdk/jpackage/internal/AppImageSigner.java | 7 +- .../internal/MacPackagingPipeline.java | 10 +- .../jpackage/internal/PackagingPipeline.java | 27 ++- .../jpackage/internal/util/PListReader.java | 105 +++++---- .../jdk/jpackage/internal/util/Slot.java | 101 +++++++++ .../jdk/jpackage/internal/util/XmlUtils.java | 8 +- .../internal/WixLauncherAsService.java | 2 +- .../jdk/jpackage/test/JPackageCommand.java | 4 +- .../helpers/jdk/jpackage/test/MacHelper.java | 212 ++++++++++++------ .../internal/util/PListReaderTest.java | 51 ++++- .../jpackage/macosx/CustomInfoPListTest.java | 137 ++++++++--- .../SigningRuntimeImagePackageTest.java | 37 +-- .../jpackage/share/RuntimePackageTest.java | 61 +---- 13 files changed, 511 insertions(+), 251 deletions(-) create mode 100644 src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Slot.java diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java index 1345597e352..71f87dd8705 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/AppImageSigner.java @@ -127,7 +127,12 @@ final class AppImageSigner { // Sign runtime root directory if present app.asApplicationLayout().map(appLayout -> { return appLayout.resolveAt(appImage.root()); - }).map(MacApplicationLayout.class::cast).map(MacApplicationLayout::runtimeRootDirectory).ifPresent(codesigners); + }).map(MacApplicationLayout.class::cast) + .map(MacApplicationLayout::runtimeRootDirectory) + .flatMap(MacBundle::fromPath) + .filter(MacBundle::isValid) + .map(MacBundle::root) + .ifPresent(codesigners); final var frameworkPath = appImage.contentsDir().resolve("Frameworks"); if (Files.isDirectory(frameworkPath)) { diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackagingPipeline.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackagingPipeline.java index a6ed164d9f7..6e63b73674e 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackagingPipeline.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/MacPackagingPipeline.java @@ -133,7 +133,7 @@ final class MacPackagingPipeline { .addDependencies(CopyAppImageTaskID.COPY) .addDependents(PrimaryTaskID.COPY_APP_IMAGE).add() .task(MacCopyAppImageTaskID.COPY_RUNTIME_INFO_PLIST) - .appImageAction(MacPackagingPipeline::writeRuntimeInfoPlist) + .noaction() .addDependencies(CopyAppImageTaskID.COPY) .addDependents(PrimaryTaskID.COPY_APP_IMAGE).add() .task(MacCopyAppImageTaskID.COPY_RUNTIME_JLILIB) @@ -186,14 +186,18 @@ final class MacPackagingPipeline { disabledTasks.add(MacCopyAppImageTaskID.COPY_PACKAGE_FILE); if (predefinedRuntimeBundle.isPresent()) { - // The predefined app image is a macOS bundle. + // The input runtime image is a macOS bundle. // Disable all alterations of the input bundle, but keep the signing enabled. disabledTasks.addAll(List.of(MacCopyAppImageTaskID.values())); disabledTasks.remove(MacCopyAppImageTaskID.COPY_SIGN); + } else { + // The input runtime is not a macOS bundle and doesn't have the plist file. Create one. + builder.task(MacCopyAppImageTaskID.COPY_RUNTIME_INFO_PLIST) + .appImageAction(MacPackagingPipeline::writeRuntimeInfoPlist).add(); } if (predefinedRuntimeBundle.map(MacBundle::isSigned).orElse(false) && !((MacPackage)p).app().sign()) { - // The predefined app image is a signed bundle; explicit signing is not requested for the package. + // The input runtime is a signed bundle; explicit signing is not requested for the package. // Disable the signing, i.e. don't re-sign the input bundle. disabledTasks.add(MacCopyAppImageTaskID.COPY_SIGN); } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/PackagingPipeline.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/PackagingPipeline.java index 64a37878bd8..6f4e0d0d2d8 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/PackagingPipeline.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/PackagingPipeline.java @@ -431,6 +431,10 @@ final class PackagingPipeline { this.taskGraph = Objects.requireNonNull(taskGraph); this.taskConfig = Objects.requireNonNull(taskConfig); this.contextMapper = Objects.requireNonNull(contextMapper); + + if (TRACE_TASK_GRAPTH) { + taskGraph.dumpToStdout(); + } } private TaskContext createTaskContext(BuildEnv env, Application app) { @@ -630,9 +634,27 @@ final class PackagingPipeline { Objects.requireNonNull(id); Objects.requireNonNull(config); return () -> { - if (config.action.isPresent() && context.test(id)) { + + final var withAction = config.action.isPresent(); + final var accepted = withAction && context.test(id); + + if (TRACE_TASK_ACTION) { + var sb = new StringBuffer(); + sb.append("Execute task=[").append(id).append("]: "); + if (!withAction) { + sb.append("no action"); + } else if (!accepted) { + sb.append("rejected"); + } else { + sb.append("run"); + } + System.out.println(sb); + } + + if (accepted) { context.execute(config.action.orElseThrow()); } + return null; }; } @@ -640,4 +662,7 @@ final class PackagingPipeline { private final FixedDAG taskGraph; private final Map taskConfig; private final UnaryOperator contextMapper; + + private static final boolean TRACE_TASK_GRAPTH = false; + private static final boolean TRACE_TASK_ACTION = false; } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/PListReader.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/PListReader.java index 6d7532bbd74..2c693939dab 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/PListReader.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/PListReader.java @@ -36,6 +36,7 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.dom.DOMSource; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; @@ -160,15 +161,13 @@ public final class PListReader { * name in the underlying "dict" element */ public String queryValue(String keyName) { - final var node = getNode(keyName); - switch (node.getNodeName()) { - case "string" -> { - return node.getTextContent(); - } - default -> { - throw new NoSuchElementException(); - } - } + return findValue(keyName).orElseThrow(NoSuchElementException::new); + } + + public Optional findValue(String keyName) { + return findNode(keyName).filter(node -> { + return "string".equals(node.getNodeName()); + }).map(Node::getTextContent); } /** @@ -182,15 +181,13 @@ public final class PListReader { * name in the underlying "dict" element */ public PListReader queryDictValue(String keyName) { - final var node = getNode(keyName); - switch (node.getNodeName()) { - case "dict" -> { - return new PListReader(node); - } - default -> { - throw new NoSuchElementException(); - } - } + return findDictValue(keyName).orElseThrow(NoSuchElementException::new); + } + + public Optional findDictValue(String keyName) { + return findNode(keyName).filter(node -> { + return "dict".equals(node.getNodeName()); + }).map(PListReader::new); } /** @@ -204,18 +201,20 @@ public final class PListReader { * name in the underlying "dict" element */ public boolean queryBoolValue(String keyName) { - final var node = getNode(keyName); - switch (node.getNodeName()) { - case "true" -> { - return true; + return findBoolValue(keyName).orElseThrow(NoSuchElementException::new); + } + + public Optional findBoolValue(String keyName) { + return findNode(keyName).filter(node -> { + switch (node.getNodeName()) { + case "true", "false" -> { + return true; + } + default -> { + return false; + } } - case "false" -> { - return false; - } - default -> { - throw new NoSuchElementException(); - } - } + }).map(Node::getNodeName).map(Boolean::parseBoolean); } /** @@ -233,14 +232,20 @@ public final class PListReader { * name in the underlying "dict" element */ public List queryStringArrayValue(String keyName) { - return queryArrayValue(keyName, false).map(v -> { - if (v instanceof Raw r) { - if (r.type() == Raw.Type.STRING) { - return r.value(); + return findStringArrayValue(keyName).orElseThrow(NoSuchElementException::new); + } + + public Optional> findStringArrayValue(String keyName) { + return findArrayValue(keyName, false).map(stream -> { + return stream.map(v -> { + if (v instanceof Raw r) { + if (r.type() == Raw.Type.STRING) { + return r.value(); + } } - } - return (String)null; - }).filter(Objects::nonNull).toList(); + return (String)null; + }).filter(Objects::nonNull).toList(); + }); } /** @@ -266,15 +271,21 @@ public final class PListReader { * in the underlying "dict" element */ public Stream queryArrayValue(String keyName, boolean fetchDictionaries) { - final var node = getNode(keyName); - switch (node.getNodeName()) { - case "array" -> { - return readArray(node, fetchDictionaries); - } - default -> { - throw new NoSuchElementException(); - } - } + return findArrayValue(keyName, fetchDictionaries).orElseThrow(NoSuchElementException::new); + } + + public Optional> findArrayValue(String keyName, boolean fetchDictionaries) { + return findNode(keyName).filter(node -> { + return "array".equals(node.getNodeName()); + }).map(node -> { + return readArray(node, fetchDictionaries); + }); + } + + public XmlConsumer toXmlConsumer() { + return xml -> { + XmlUtils.concatXml(xml, new DOMSource(root)); + }; } /** @@ -333,12 +344,12 @@ public final class PListReader { }).filter(Optional::isPresent).map(Optional::get); } - private Node getNode(String keyName) { + private Optional findNode(String keyName) { Objects.requireNonNull(keyName); final var query = String.format("*[preceding-sibling::key = \"%s\"][1]", keyName); return Optional.ofNullable(toSupplier(() -> { return (Node) XPathSingleton.INSTANCE.evaluate(query, root, XPathConstants.NODE); - }).get()).orElseThrow(NoSuchElementException::new); + }).get()); } diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Slot.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Slot.java new file mode 100644 index 00000000000..0c426749ce4 --- /dev/null +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/Slot.java @@ -0,0 +1,101 @@ +/* + * 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 jdk.jpackage.internal.util; + +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; + +/** + * A mutable container object for a value. + *

          + * An alternative for cases where {@link AtomicReference} would be an overkill. + * Sample usage: + * {@snippet : + * void foo(MessageNotifier messageNotifier) { + * var lastMessage = Slot.createEmpty(); + * + * messageNotifier.setListener(msg -> { + * lastMessage.set(msg); + * }).run(); + * + * lastMessage.find().ifPresentOrElse(msg -> { + * System.out.println(String.format("The last message: [%s]", msg)); + * }, () -> { + * System.out.println("No messages received"); + * }); + * } + * + * abstract class MessageNotifier { + * MessageNotifier setListener(Consumer messageConsumer) { + * callback = messageConsumer; + * return this; + * } + * + * void run() { + * for (;;) { + * var msg = fetchNextMessage(); + * msg.ifPresent(callback); + * if (msg.isEmpty()) { + * break; + * } + * } + * } + * + * abstract Optional fetchNextMessage(); + * + * private Consumer callback; + * } + * } + * + * An alternative to the {@code Slot} would be either {@code + * AtomicReference} or a single-element {@code String[]} or any other + * suitable container type. {@code AtomicReference} would be an overkill if + * thread-safety is not a concern and the use of other options would be + * confusing. + * + * @param value type + */ +public final class Slot { + + public static Slot createEmpty() { + + return new Slot<>(); + } + + public T get() { + return find().orElseThrow(); + } + + public Optional find() { + return Optional.ofNullable(value); + } + + public void set(T v) { + value = Objects.requireNonNull(v); + } + + private T value; +} diff --git a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/XmlUtils.java b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/XmlUtils.java index 549044862d8..c8761259254 100644 --- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/XmlUtils.java +++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/util/XmlUtils.java @@ -31,7 +31,7 @@ import java.io.Writer; import java.lang.reflect.Proxy; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -105,7 +105,11 @@ public final class XmlUtils { } } - public static void mergeXmls(XMLStreamWriter xml, Collection sources) + public static void concatXml(XMLStreamWriter xml, Source... sources) throws XMLStreamException, IOException { + concatXml(xml, List.of(sources)); + } + + public static void concatXml(XMLStreamWriter xml, Iterable sources) throws XMLStreamException, IOException { xml = (XMLStreamWriter) Proxy.newProxyInstance(XMLStreamWriter.class.getClassLoader(), new Class[]{XMLStreamWriter.class}, diff --git a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixLauncherAsService.java b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixLauncherAsService.java index 3d990b990c2..833219eaa10 100644 --- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixLauncherAsService.java +++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WixLauncherAsService.java @@ -111,7 +111,7 @@ class WixLauncherAsService extends LauncherAsService { sources.add(new DOMSource(n)); } - XmlUtils.mergeXmls(xml, sources); + XmlUtils.concatXml(xml, sources); } catch (SAXException ex) { throw new IOException(ex); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index fcd940e725e..088a9fe3bad 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -376,7 +376,7 @@ public class JPackageCommand extends CommandArguments { return cmd; } - public static Path createInputRuntimeImage() throws IOException { + public static Path createInputRuntimeImage() { final Path runtimeImageDir; @@ -406,7 +406,7 @@ public class JPackageCommand extends CommandArguments { } public JPackageCommand setDefaultAppName() { - return addArguments("--name", TKit.getCurrentDefaultAppName()); + return setArgumentValue("--name", TKit.getCurrentDefaultAppName()); } /** diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index dc753624a32..5c0914ed2f4 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -31,6 +31,7 @@ import static jdk.jpackage.internal.util.PListWriter.writeKey; import static jdk.jpackage.internal.util.PListWriter.writeString; import static jdk.jpackage.internal.util.PListWriter.writeStringArray; import static jdk.jpackage.internal.util.PListWriter.writeStringOptional; +import static jdk.jpackage.internal.util.XmlUtils.initDocumentBuilder; import static jdk.jpackage.internal.util.XmlUtils.toXmlConsumer; import static jdk.jpackage.internal.util.function.ThrowingRunnable.toRunnable; @@ -60,6 +61,7 @@ import java.util.function.UnaryOperator; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; @@ -71,6 +73,7 @@ import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.internal.util.function.ThrowingSupplier; import jdk.jpackage.test.MacSign.CertificateRequest; import jdk.jpackage.test.PackageTest.PackageHandlers; +import org.xml.sax.SAXException; public final class MacHelper { @@ -297,79 +300,160 @@ public final class MacHelper { public static void writeFaPListFragment(JPackageCommand cmd, XMLStreamWriter xml) { toRunnable(() -> { - var allProps = Stream.of(cmd.getAllArgumentValues("--file-associations")).map(Path::of).map(propFile -> { - try (var propFileReader = Files.newBufferedReader(propFile)) { - var props = new Properties(); - props.load(propFileReader); - return props; - } catch (IOException ex) { - throw new UncheckedIOException(ex); + if (cmd.hasArgument("--app-image")) { + copyFaPListFragmentFromPredefinedAppImage(cmd, xml); + } else { + createFaPListFragmentFromFaProperties(cmd, xml); + } + }).run(); + } + + private static void createFaPListFragmentFromFaProperties(JPackageCommand cmd, XMLStreamWriter xml) + throws XMLStreamException, IOException { + + var allProps = Stream.of(cmd.getAllArgumentValues("--file-associations")).map(Path::of).map(propFile -> { + try (var propFileReader = Files.newBufferedReader(propFile)) { + var props = new Properties(); + props.load(propFileReader); + return props; + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }).toList(); + + if (!allProps.isEmpty()) { + var bundleId = getPackageId(cmd); + + Function contentType = fa -> { + return String.format("%s.%s", bundleId, Objects.requireNonNull(fa.getProperty("extension"))); + }; + + Function> icon = fa -> { + return Optional.ofNullable(fa.getProperty("icon")).map(Path::of).map(Path::getFileName).map(Path::toString); + }; + + BiFunction> asBoolean = (fa, key) -> { + return Optional.ofNullable(fa.getProperty(key)).map(Boolean::parseBoolean); + }; + + BiFunction> asList = (fa, key) -> { + return Optional.ofNullable(fa.getProperty(key)).map(str -> { + return List.of(str.split("[ ,]+")); + }).orElseGet(List::of); + }; + + writeKey(xml, "CFBundleDocumentTypes"); + writeArray(xml, toXmlConsumer(() -> { + for (var fa : allProps) { + writeDict(xml, toXmlConsumer(() -> { + writeStringArray(xml, "LSItemContentTypes", List.of(contentType.apply(fa))); + writeStringOptional(xml, "CFBundleTypeName", Optional.ofNullable(fa.getProperty("description"))); + writeString(xml, "LSHandlerRank", Optional.ofNullable(fa.getProperty("mac.LSHandlerRank")).orElse("Owner")); + writeString(xml, "CFBundleTypeRole", Optional.ofNullable(fa.getProperty("mac.CFBundleTypeRole")).orElse("Editor")); + writeStringOptional(xml, "NSPersistentStoreTypeKey", Optional.ofNullable(fa.getProperty("mac.NSPersistentStoreTypeKey"))); + writeStringOptional(xml, "NSDocumentClass", Optional.ofNullable(fa.getProperty("mac.NSDocumentClass"))); + writeBoolean(xml, "LSIsAppleDefaultForType", true); + writeBooleanOptional(xml, "LSTypeIsPackage", asBoolean.apply(fa, "mac.LSTypeIsPackage")); + writeBooleanOptional(xml, "LSSupportsOpeningDocumentsInPlace", asBoolean.apply(fa, "mac.LSSupportsOpeningDocumentsInPlace")); + writeBooleanOptional(xml, "UISupportsDocumentBrowser", asBoolean.apply(fa, "mac.UISupportsDocumentBrowser")); + writeStringOptional(xml, "CFBundleTypeIconFile", icon.apply(fa)); + })); } - }).toList(); + })); - if (!allProps.isEmpty()) { - var bundleId = getPackageId(cmd); - - Function contentType = fa -> { - return String.format("%s.%s", bundleId, Objects.requireNonNull(fa.getProperty("extension"))); - }; - - Function> icon = fa -> { - return Optional.ofNullable(fa.getProperty("icon")).map(Path::of).map(Path::getFileName).map(Path::toString); - }; - - BiFunction> asBoolean = (fa, key) -> { - return Optional.ofNullable(fa.getProperty(key)).map(Boolean::parseBoolean); - }; - - BiFunction> asList = (fa, key) -> { - return Optional.ofNullable(fa.getProperty(key)).map(str -> { - return List.of(str.split("[ ,]+")); - }).orElseGet(List::of); - }; - - writeKey(xml, "CFBundleDocumentTypes"); - writeArray(xml, toXmlConsumer(() -> { - for (var fa : allProps) { + writeKey(xml, "UTExportedTypeDeclarations"); + writeArray(xml, toXmlConsumer(() -> { + for (var fa : allProps) { + writeDict(xml, toXmlConsumer(() -> { + writeString(xml, "UTTypeIdentifier", contentType.apply(fa)); + writeStringOptional(xml, "UTTypeDescription", Optional.ofNullable(fa.getProperty("description"))); + if (fa.containsKey("mac.UTTypeConformsTo")) { + writeStringArray(xml, "UTTypeConformsTo", asList.apply(fa, "mac.UTTypeConformsTo")); + } else { + writeStringArray(xml, "UTTypeConformsTo", List.of("public.data")); + } + writeStringOptional(xml, "UTTypeIconFile", icon.apply(fa)); + writeKey(xml, "UTTypeTagSpecification"); writeDict(xml, toXmlConsumer(() -> { - writeStringArray(xml, "LSItemContentTypes", List.of(contentType.apply(fa))); - writeStringOptional(xml, "CFBundleTypeName", Optional.ofNullable(fa.getProperty("description"))); - writeString(xml, "LSHandlerRank", Optional.ofNullable(fa.getProperty("mac.LSHandlerRank")).orElse("Owner")); - writeString(xml, "CFBundleTypeRole", Optional.ofNullable(fa.getProperty("mac.CFBundleTypeRole")).orElse("Editor")); - writeStringOptional(xml, "NSPersistentStoreTypeKey", Optional.ofNullable(fa.getProperty("mac.NSPersistentStoreTypeKey"))); - writeStringOptional(xml, "NSDocumentClass", Optional.ofNullable(fa.getProperty("mac.NSDocumentClass"))); - writeBoolean(xml, "LSIsAppleDefaultForType", true); - writeBooleanOptional(xml, "LSTypeIsPackage", asBoolean.apply(fa, "mac.LSTypeIsPackage")); - writeBooleanOptional(xml, "LSSupportsOpeningDocumentsInPlace", asBoolean.apply(fa, "mac.LSSupportsOpeningDocumentsInPlace")); - writeBooleanOptional(xml, "UISupportsDocumentBrowser", asBoolean.apply(fa, "mac.UISupportsDocumentBrowser")); - writeStringOptional(xml, "CFBundleTypeIconFile", icon.apply(fa)); + writeStringArray(xml, "public.filename-extension", List.of(fa.getProperty("extension"))); + writeStringArray(xml, "public.mime-type", List.of(fa.getProperty("mime-type"))); + writeStringArray(xml, "NSExportableTypes", asList.apply(fa, "mac.NSExportableTypes")); })); - } - })); + })); + } + })); + } + } - writeKey(xml, "UTExportedTypeDeclarations"); + private static void copyFaPListFragmentFromPredefinedAppImage(JPackageCommand cmd, XMLStreamWriter xml) + throws IOException, SAXException, XMLStreamException { + + var predefinedAppImage = Path.of(Optional.ofNullable(cmd.getArgumentValue("--app-image")).orElseThrow(IllegalArgumentException::new)); + + var plistPath = ApplicationLayout.macAppImage().resolveAt(predefinedAppImage).contentDirectory().resolve("Info.plist"); + + try (var plistStream = Files.newInputStream(plistPath)) { + var plist = new PListReader(initDocumentBuilder().parse(plistStream)); + + var entries = Stream.of("CFBundleDocumentTypes", "UTExportedTypeDeclarations").map(key -> { + return plist.findArrayValue(key, false).map(stream -> { + return stream.map(PListReader.class::cast).toList(); + }).map(plistList -> { + return Map.entry(key, plistList); + }); + }).filter(Optional::isPresent).map(Optional::get).toList(); + + for (var e : entries) { + writeKey(xml, e.getKey()); writeArray(xml, toXmlConsumer(() -> { - for (var fa : allProps) { - writeDict(xml, toXmlConsumer(() -> { - writeString(xml, "UTTypeIdentifier", contentType.apply(fa)); - writeStringOptional(xml, "UTTypeDescription", Optional.ofNullable(fa.getProperty("description"))); - if (fa.containsKey("mac.UTTypeConformsTo")) { - writeStringArray(xml, "UTTypeConformsTo", asList.apply(fa, "mac.UTTypeConformsTo")); - } else { - writeStringArray(xml, "UTTypeConformsTo", List.of("public.data")); - } - writeStringOptional(xml, "UTTypeIconFile", icon.apply(fa)); - writeKey(xml, "UTTypeTagSpecification"); - writeDict(xml, toXmlConsumer(() -> { - writeStringArray(xml, "public.filename-extension", List.of(fa.getProperty("extension"))); - writeStringArray(xml, "public.mime-type", List.of(fa.getProperty("mime-type"))); - writeStringArray(xml, "NSExportableTypes", asList.apply(fa, "mac.NSExportableTypes")); - })); - })); + for (var arrayElement : e.getValue()) { + arrayElement.toXmlConsumer().accept(xml); } })); } - }).run(); + } + } + + public static Path createRuntimeBundle(Consumer mutator) { + return createRuntimeBundle(Optional.of(mutator)); + } + + public static Path createRuntimeBundle() { + return createRuntimeBundle(Optional.empty()); + } + + public static Path createRuntimeBundle(Optional> mutator) { + Objects.requireNonNull(mutator); + + final var runtimeImage = JPackageCommand.createInputRuntimeImage(); + + final var runtimeBundleWorkDir = TKit.createTempDirectory("runtime-bundle"); + + final var unpackadeRuntimeBundleDir = runtimeBundleWorkDir.resolve("unpacked"); + + var cmd = new JPackageCommand() + .useToolProvider(true) + .ignoreDefaultRuntime(true) + .dumpOutput(true) + .setPackageType(PackageType.MAC_DMG) + .setArgumentValue("--name", "foo") + .addArguments("--runtime-image", runtimeImage) + .addArguments("--dest", runtimeBundleWorkDir); + + mutator.ifPresent(cmd::mutate); + + cmd.execute(); + + MacHelper.withExplodedDmg(cmd, dmgImage -> { + if (dmgImage.endsWith(cmd.appInstallationDirectory().getFileName())) { + Executor.of("cp", "-R") + .addArgument(dmgImage) + .addArgument(unpackadeRuntimeBundleDir) + .execute(0); + } + }); + + return unpackadeRuntimeBundleDir; } public static Consumer useKeychain(MacSign.ResolvedKeychain keychain) { diff --git a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/PListReaderTest.java b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/PListReaderTest.java index fe7d0c63870..620650c83b4 100644 --- a/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/PListReaderTest.java +++ b/test/jdk/tools/jpackage/junit/share/jdk.jpackage/jdk/jpackage/internal/util/PListReaderTest.java @@ -23,6 +23,7 @@ package jdk.jpackage.internal.util; +import static jdk.jpackage.internal.util.XmlUtils.initDocumentBuilder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -30,6 +31,8 @@ import java.io.IOException; import java.io.StringReader; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -41,6 +44,7 @@ import java.util.stream.Stream; import javax.xml.parsers.ParserConfigurationException; import jdk.jpackage.internal.util.PListReader.Raw; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource.Mode; @@ -277,12 +281,49 @@ public class PListReaderTest { assertEquals("A", actualValue); } - @Test - public void test_toMap() { + @ParameterizedTest + @MethodSource("parsedPLists") + public void test_toMap(ParsedPList data) { + testSpec().xml(data.xml()).expect(data.xmlAsMap()).queryType(QueryType.TO_MAP_RECURSIVE).create().test(); + } - var builder = testSpec(); + @ParameterizedTest + @MethodSource("parsedPLists") + public void test_toConsumer(ParsedPList data, @TempDir Path workDir) throws IOException, SAXException { + var node = createXml(data.xml); - builder.xml( + var srcPList = new PListReader(node); + + var sink = workDir.resolve("sink.xml"); + + XmlUtils.createXml(sink, xml -> { + PListWriter.writePList(xml, srcPList.toXmlConsumer()); + }); + + try (var in = Files.newInputStream(sink)) { + var dstPList = new PListReader(initDocumentBuilder().parse(in)); + + var src = srcPList.toMap(true); + var dst = dstPList.toMap(true); + + assertEquals(data.xmlAsMap(), src); + assertEquals(data.xmlAsMap(), dst); + } + } + + private record ParsedPList(Map xmlAsMap, String... xml) { + ParsedPList { + Objects.requireNonNull(xmlAsMap); + } + + ParsedPList(Map xmlAsMap, List xml) { + this(xmlAsMap, xml.toArray(String[]::new)); + } + } + + private static Stream parsedPLists() { + + var xml = List.of( "AppName", "Hello", "", @@ -367,7 +408,7 @@ public class PListReaderTest { ) ); - builder.expect(expected).queryType(QueryType.TO_MAP_RECURSIVE).create().test(); + return Stream.of(new ParsedPList(expected, xml)); } private static List test() { diff --git a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java index c0b7b6b6604..b690b69269c 100644 --- a/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java +++ b/test/jdk/tools/jpackage/macosx/CustomInfoPListTest.java @@ -23,11 +23,13 @@ import static java.util.Collections.unmodifiableSortedSet; import static java.util.Map.entry; +import jdk.jpackage.internal.util.Slot; import static jdk.jpackage.internal.util.PListWriter.writeDict; import static jdk.jpackage.internal.util.PListWriter.writePList; import static jdk.jpackage.internal.util.PListWriter.writeString; import static jdk.jpackage.internal.util.XmlUtils.createXml; import static jdk.jpackage.internal.util.XmlUtils.toXmlConsumer; +import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; import java.io.IOException; import java.nio.file.Path; @@ -43,15 +45,17 @@ import java.util.Objects; import java.util.Set; import java.util.TreeSet; import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import jdk.jpackage.internal.util.PListReader; import jdk.jpackage.internal.util.function.ThrowingBiConsumer; -import jdk.jpackage.internal.util.function.ThrowingConsumer; +import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.ParameterSupplier; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.ConfigurationTarget; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.JPackageStringBundle; import jdk.jpackage.test.MacHelper; @@ -80,38 +84,67 @@ public class CustomInfoPListTest { @Test @ParameterSupplier("customPLists") public void testAppImage(TestConfig cfg) throws Throwable { - var cmd = cfg.init(JPackageCommand.helloAppImage()); - var verifier = cfg.createPListFilesVerifier(cmd.executePrerequisiteActions()); - cmd.executeAndAssertHelloAppImageCreated(); - verifier.accept(cmd); + testApp(new ConfigurationTarget(JPackageCommand.helloAppImage()), cfg); } @Test @ParameterSupplier("customPLists") - public void testNativePackage(TestConfig cfg) { - List> verifier = new ArrayList<>(); - new PackageTest().configureHelloApp().addInitializer(cmd -> { - cfg.init(cmd.setFakeRuntime()); - }).addRunOnceInitializer(() -> { - verifier.add(cfg.createPListFilesVerifier(JPackageCommand.helloAppImage().executePrerequisiteActions())); + public void testPackage(TestConfig cfg) { + testApp(new ConfigurationTarget(new PackageTest().configureHelloApp()), cfg); + } + + @Test + @ParameterSupplier("customPLists") + public void testFromAppImage(TestConfig cfg) { + + var verifier = Slot.>createEmpty(); + + var appImageCmd = JPackageCommand.helloAppImage().setFakeRuntime(); + + new PackageTest().addRunOnceInitializer(() -> { + // Create the input app image with custom plist file(s). + // Call JPackageCommand.executePrerequisiteActions() to initialize + // all command line options. + cfg.init(appImageCmd.executePrerequisiteActions()); + appImageCmd.execute(); + verifier.set(cfg.createPListFilesVerifier(appImageCmd)); + }).addInitializer(cmd -> { + cmd.removeArgumentWithValue("--input").setArgumentValue("--app-image", appImageCmd.outputBundle()); }).addInstallVerifier(cmd -> { - verifier.get(0).accept(cmd); + verifier.get().accept(cmd); }).run(Action.CREATE_AND_UNPACK); } @Test - public void testRuntime() { - final Path runtimeImage[] = new Path[1]; + @Parameter("true") + @Parameter("false") + public void testRuntime(boolean runtimeBundle) { + + var runtimeImage = Slot.createEmpty(); var cfg = new TestConfig(Set.of(CustomPListType.RUNTIME)); new PackageTest().addRunOnceInitializer(() -> { - runtimeImage[0] = JPackageCommand.createInputRuntimeImage(); + if (runtimeBundle) { + // Use custom plist file with the input runtime bundle. + runtimeImage.set(MacHelper.createRuntimeBundle(toConsumer(buildRuntimeBundleCmd -> { + // Use the same name for the input runtime bundle as the name of the output bundle. + // This is to make the plist file validation pass, as the custom plist file + // is configured for the command building the input runtime bundle, + // but the plist file from the output bundle is examined. + buildRuntimeBundleCmd.setDefaultAppName(); + cfg.init(buildRuntimeBundleCmd); + }))); + } else { + runtimeImage.set(JPackageCommand.createInputRuntimeImage()); + } }).addInitializer(cmd -> { cmd.ignoreDefaultRuntime(true) .removeArgumentWithValue("--input") - .setArgumentValue("--runtime-image", runtimeImage[0]); - cfg.init(cmd); + .setArgumentValue("--runtime-image", runtimeImage.get()); + if (!runtimeBundle) { + cfg.init(cmd); + } }).addInstallVerifier(cmd -> { cfg.createPListFilesVerifier(cmd).accept(cmd); }).run(Action.CREATE_AND_UNPACK); @@ -128,6 +161,31 @@ public class CustomInfoPListTest { }).toList(); } + private void testApp(ConfigurationTarget target, TestConfig cfg) { + + List> verifier = new ArrayList<>(); + + target.addInitializer(JPackageCommand::setFakeRuntime); + + target.addInitializer(toConsumer(cfg::init)); + + target.addRunOnceInitializer(_ -> { + verifier.add(cfg.createPListFilesVerifier( + target.cmd().orElseGet(JPackageCommand::helloAppImage).executePrerequisiteActions() + )); + }); + + target.cmd().ifPresent(JPackageCommand::executeAndAssertHelloAppImageCreated); + + target.addInstallVerifier(cmd -> { + verifier.get(0).accept(cmd); + }); + + target.test().ifPresent(test -> { + test.run(Action.CREATE_AND_UNPACK); + }); + } + private static List toStringList(PListReader plistReader) { return MacHelper.flatMapPList(plistReader).entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).map(e -> { return String.format("%s: %s", e.getKey(), e.getValue()); @@ -171,27 +229,37 @@ public class CustomInfoPListTest { return cmd; } - ThrowingConsumer createPListFilesVerifier(JPackageCommand cmd) throws IOException { - ThrowingConsumer defaultVerifier = otherCmd -> { + Consumer createPListFilesVerifier(JPackageCommand cmd) { + Consumer customPListFilesVerifier = toConsumer(otherCmd -> { for (var customPList : customPLists) { customPList.verifyPListFile(otherCmd); } - }; + }); + // Get the list of default plist files. + // These are the plist files created from the plist file templates in jpackage resources. var defaultPListFiles = CustomPListType.defaultRoles(customPLists); if (defaultPListFiles.isEmpty()) { - return defaultVerifier; + // All plist files in the bundle are customized. + return customPListFilesVerifier; } else { - var vanillaCmd = new JPackageCommand().setFakeRuntime() + // There are some default plist files in the bundle. + // Verify the expected default plist files are such. + + // Create a copy of the `cmd` without the resource directory and with the app image bundling type. + // Execute it and get the default plist files. + var vanillaCmd = new JPackageCommand() .addArguments(cmd.getAllArguments()) .setPackageType(PackageType.IMAGE) .removeArgumentWithValue("--resource-dir") .setArgumentValue("--dest", TKit.createTempDirectory("vanilla")); - vanillaCmd.executeIgnoreExitCode().assertExitCodeIsZero(); + vanillaCmd.execute(); return otherCmd -> { - defaultVerifier.accept(otherCmd); + // Verify custom plist files. + customPListFilesVerifier.accept(otherCmd); + // Verify default plist files. for (var defaultPListFile : defaultPListFiles) { final var expectedPListPath = defaultPListFile.path(vanillaCmd); final var expectedPList = MacHelper.readPList(expectedPListPath); @@ -234,7 +302,10 @@ public class CustomInfoPListTest { CustomPListFactory.PLIST_OUTPUT::writeAppPlist, "Info.plist"), - APP_WITH_FA(APP), + APP_WITH_FA( + CustomPListFactory.PLIST_INPUT::writeAppPlistWithFa, + CustomPListFactory.PLIST_OUTPUT::writeAppPlistWithFa, + "Info.plist"), EMBEDDED_RUNTIME( CustomPListFactory.PLIST_INPUT::writeEmbeddedRuntimePlist, @@ -256,12 +327,6 @@ public class CustomInfoPListTest { this.outputPlistFilename = outputPlistFilename; } - private CustomPListType(CustomPListType other) { - this.inputPlistWriter = other.inputPlistWriter; - this.outputPlistWriter = other.outputPlistWriter; - this.outputPlistFilename = other.outputPlistFilename; - } - void createInputPListFile(JPackageCommand cmd) throws IOException { createXml(Path.of(cmd.getArgumentValue("--resource-dir")).resolve(outputPlistFilename), xml -> { inputPlistWriter.accept(cmd, xml); @@ -313,7 +378,15 @@ public class CustomInfoPListTest { PLIST_OUTPUT, ; + private void writeAppPlistWithFa(JPackageCommand cmd, XMLStreamWriter xml) throws XMLStreamException, IOException { + writeAppPlist(cmd, xml, true); + } + private void writeAppPlist(JPackageCommand cmd, XMLStreamWriter xml) throws XMLStreamException, IOException { + writeAppPlist(cmd, xml, false); + } + + private void writeAppPlist(JPackageCommand cmd, XMLStreamWriter xml, boolean withFa) throws XMLStreamException, IOException { writePList(xml, toXmlConsumer(() -> { writeDict(xml, toXmlConsumer(() -> { writeString(xml, "CustomAppProperty", "App"); @@ -326,7 +399,7 @@ public class CustomInfoPListTest { writeString(xml, "CFBundleVersion", value("DEPLOY_BUNDLE_CFBUNDLE_VERSION", cmd.version())); writeString(xml, "NSHumanReadableCopyright", value("DEPLOY_BUNDLE_COPYRIGHT", JPackageStringBundle.MAIN.cannedFormattedString("param.copyright.default", new Date()).getValue())); - if (cmd.hasArgument("--file-associations")) { + if (withFa) { if (this == PLIST_INPUT) { xml.writeCharacters("DEPLOY_FILE_ASSOCIATIONS"); } else { diff --git a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java index 856962d3b01..ccc39f7a367 100644 --- a/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningRuntimeImagePackageTest.java @@ -23,19 +23,15 @@ import static jdk.jpackage.internal.util.function.ThrowingConsumer.toConsumer; -import java.io.IOException; import java.nio.file.Path; import java.util.function.Predicate; import java.util.stream.Stream; import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Executor; import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.MacHelper; import jdk.jpackage.test.MacSign; import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.PackageType; -import jdk.jpackage.test.TKit; /** * Tests generation of dmg and pkg with --mac-sign and related arguments. Test @@ -97,37 +93,10 @@ public class SigningRuntimeImagePackageTest { return cmd; } - private static Path createInputRuntimeBundle(MacSign.ResolvedKeychain keychain, int certIndex) throws IOException { - - final var runtimeImage = JPackageCommand.createInputRuntimeImage(); - - final var runtimeBundleWorkDir = TKit.createTempDirectory("runtime-bundle"); - - final var unpackadeRuntimeBundleDir = runtimeBundleWorkDir.resolve("unpacked"); - - var cmd = new JPackageCommand() - .useToolProvider(true) - .ignoreDefaultRuntime(true) - .dumpOutput(true) - .setPackageType(PackageType.MAC_DMG) - .setArgumentValue("--name", "foo") - .addArguments("--runtime-image", runtimeImage) - .addArguments("--dest", runtimeBundleWorkDir); - - addSignOptions(cmd, keychain, certIndex); - - cmd.execute(); - - MacHelper.withExplodedDmg(cmd, dmgImage -> { - if (dmgImage.endsWith(cmd.appInstallationDirectory().getFileName())) { - Executor.of("cp", "-R") - .addArgument(dmgImage) - .addArgument(unpackadeRuntimeBundleDir) - .execute(0); - } + private static Path createInputRuntimeBundle(MacSign.ResolvedKeychain keychain, int certIndex) { + return MacHelper.createRuntimeBundle(cmd -> { + addSignOptions(cmd, keychain, certIndex); }); - - return unpackadeRuntimeBundleDir; } @Test diff --git a/test/jdk/tools/jpackage/share/RuntimePackageTest.java b/test/jdk/tools/jpackage/share/RuntimePackageTest.java index caa129713b4..387b46acdfb 100644 --- a/test/jdk/tools/jpackage/share/RuntimePackageTest.java +++ b/test/jdk/tools/jpackage/share/RuntimePackageTest.java @@ -26,7 +26,6 @@ import static jdk.internal.util.OperatingSystem.MACOS; import static jdk.jpackage.test.TKit.assertFalse; import static jdk.jpackage.test.TKit.assertTrue; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; @@ -34,9 +33,7 @@ import java.util.function.Predicate; import jdk.jpackage.internal.util.function.ThrowingSupplier; import jdk.jpackage.test.Annotations.Parameter; import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Executor; import jdk.jpackage.test.JPackageCommand; -import jdk.jpackage.test.JavaTool; import jdk.jpackage.test.LinuxHelper; import jdk.jpackage.test.MacHelper; import jdk.jpackage.test.PackageTest; @@ -89,7 +86,7 @@ public class RuntimePackageTest { @Test(ifOS = MACOS) public static void testFromBundle() { - init(RuntimePackageTest::createInputRuntimeBundle).run(); + init(MacHelper::createRuntimeBundle).run(); } @Test(ifOS = LINUX) @@ -114,7 +111,7 @@ public class RuntimePackageTest { } private static PackageTest init() { - return init(RuntimePackageTest::createInputRuntimeImage); + return init(JPackageCommand::createInputRuntimeImage); } private static PackageTest init(ThrowingSupplier createRuntime) { @@ -168,58 +165,4 @@ public class RuntimePackageTest { } return path; } - - private static Path createInputRuntimeImage() throws IOException { - - final Path runtimeImageDir; - - if (JPackageCommand.DEFAULT_RUNTIME_IMAGE != null) { - runtimeImageDir = JPackageCommand.DEFAULT_RUNTIME_IMAGE; - } else { - runtimeImageDir = TKit.createTempDirectory("runtime-image").resolve("data"); - - new Executor().setToolProvider(JavaTool.JLINK) - .dumpOutput() - .addArguments( - "--output", runtimeImageDir.toString(), - "--add-modules", "java.desktop", - "--strip-debug", - "--no-header-files", - "--no-man-pages") - .execute(); - } - - return runtimeImageDir; - } - - private static Path createInputRuntimeBundle() throws IOException { - - final var runtimeImage = createInputRuntimeImage(); - - final var runtimeBundleWorkDir = TKit.createTempDirectory("runtime-bundle"); - - final var unpackadeRuntimeBundleDir = runtimeBundleWorkDir.resolve("unpacked"); - - var cmd = new JPackageCommand() - .useToolProvider(true) - .ignoreDefaultRuntime(true) - .dumpOutput(true) - .setPackageType(PackageType.MAC_DMG) - .setArgumentValue("--name", "foo") - .addArguments("--runtime-image", runtimeImage) - .addArguments("--dest", runtimeBundleWorkDir); - - cmd.execute(); - - MacHelper.withExplodedDmg(cmd, dmgImage -> { - if (dmgImage.endsWith(cmd.appInstallationDirectory().getFileName())) { - Executor.of("cp", "-R") - .addArgument(dmgImage) - .addArgument(unpackadeRuntimeBundleDir) - .execute(0); - } - }); - - return unpackadeRuntimeBundleDir; - } } From e8a1a8707ee6192c85ac62a2a51c815e07613c38 Mon Sep 17 00:00:00 2001 From: Kim Barrett Date: Sun, 2 Nov 2025 07:02:06 +0000 Subject: [PATCH 404/561] 8369186: HotSpot Style Guide should permit some uses of the C++ Standard Library Reviewed-by: jrose, lkorinth, iwalulya, kvn, stefank --- doc/hotspot-style.html | 199 ++++++++++++++---- doc/hotspot-style.md | 183 ++++++++++++---- src/hotspot/cpu/aarch64/assembler_aarch64.hpp | 2 +- src/hotspot/cpu/riscv/assembler_riscv.hpp | 4 +- src/hotspot/share/code/codeBlob.cpp | 3 +- src/hotspot/share/code/relocInfo.cpp | 2 +- src/hotspot/share/cppstdlib/cstddef.hpp | 49 +++++ src/hotspot/share/cppstdlib/limits.hpp | 41 ++++ src/hotspot/share/cppstdlib/type_traits.hpp | 46 ++++ src/hotspot/share/gc/shared/bufferNode.hpp | 5 +- .../share/gc/shared/oopStorage.inline.hpp | 5 +- .../share/gc/shared/oopStorageParState.hpp | 5 +- .../gc/shared/oopStorageParState.inline.hpp | 5 +- src/hotspot/share/gc/shared/workerUtils.hpp | 3 +- .../gc/shenandoah/shenandoahSimpleBitMap.hpp | 3 +- src/hotspot/share/gc/z/zAddress.inline.hpp | 3 +- src/hotspot/share/gc/z/zArray.hpp | 3 +- .../gc/z/zDeferredConstructed.inline.hpp | 3 +- src/hotspot/share/gc/z/zDirector.cpp | 3 +- src/hotspot/share/gc/z/zForwardingEntry.hpp | 5 +- src/hotspot/share/gc/z/zInitialize.hpp | 5 +- src/hotspot/share/gc/z/zPageAge.inline.hpp | 3 +- src/hotspot/share/gc/z/zPageTable.inline.hpp | 3 +- src/hotspot/share/gc/z/zSafeDelete.hpp | 5 +- src/hotspot/share/gc/z/zSafeDelete.inline.hpp | 5 +- src/hotspot/share/gc/z/zStat.cpp | 3 +- src/hotspot/share/memory/metadataFactory.hpp | 3 +- .../share/memory/metaspace/counters.hpp | 3 +- src/hotspot/share/memory/metaspaceClosure.hpp | 3 +- .../share/metaprogramming/enableIf.hpp | 4 +- .../metaprogramming/primitiveConversions.hpp | 5 +- src/hotspot/share/nmt/arrayWithFreeList.hpp | 5 +- .../share/nmt/nmtNativeCallStackStorage.hpp | 3 +- src/hotspot/share/oops/accessBackend.hpp | 5 +- .../share/oops/accessBackend.inline.hpp | 3 +- src/hotspot/share/oops/accessDecorators.hpp | 5 +- src/hotspot/share/oops/compressedOops.hpp | 5 +- src/hotspot/share/oops/instanceOop.hpp | 5 +- src/hotspot/share/oops/markWord.hpp | 3 +- src/hotspot/share/oops/objArrayOop.hpp | 3 +- src/hotspot/share/oops/oop.hpp | 3 +- src/hotspot/share/oops/oopHandle.hpp | 5 +- src/hotspot/share/oops/oopsHierarchy.hpp | 5 +- src/hotspot/share/oops/typeArrayOop.hpp | 5 +- src/hotspot/share/opto/rangeinference.hpp | 3 +- src/hotspot/share/runtime/arguments.cpp | 3 +- src/hotspot/share/runtime/atomicAccess.hpp | 3 +- .../share/runtime/continuationFreezeThaw.cpp | 3 +- src/hotspot/share/runtime/flags/jvmFlag.hpp | 5 +- src/hotspot/share/runtime/lockStack.cpp | 3 +- .../share/runtime/sharedRuntimeTrans.cpp | 3 +- .../share/services/diagnosticFramework.hpp | 4 +- src/hotspot/share/utilities/align.hpp | 3 +- src/hotspot/share/utilities/byteswap.hpp | 4 +- .../utilities/concurrentHashTable.inline.hpp | 3 +- .../share/utilities/deferredStatic.hpp | 2 +- .../share/utilities/devirtualizer.inline.hpp | 5 +- src/hotspot/share/utilities/enumIterator.hpp | 5 +- .../share/utilities/globalDefinitions.hpp | 6 +- src/hotspot/share/utilities/hashTable.hpp | 5 +- src/hotspot/share/utilities/intn_t.hpp | 3 +- src/hotspot/share/utilities/intpow.hpp | 5 +- src/hotspot/share/utilities/parseInteger.hpp | 4 +- .../share/utilities/population_count.hpp | 5 +- src/hotspot/share/utilities/powerOfTwo.hpp | 7 +- src/hotspot/share/utilities/rbTree.hpp | 3 +- src/hotspot/share/utilities/reverse_bits.hpp | 6 +- src/hotspot/share/utilities/tuple.hpp | 4 +- 68 files changed, 531 insertions(+), 235 deletions(-) create mode 100644 src/hotspot/share/cppstdlib/cstddef.hpp create mode 100644 src/hotspot/share/cppstdlib/limits.hpp create mode 100644 src/hotspot/share/cppstdlib/type_traits.hpp diff --git a/doc/hotspot-style.html b/doc/hotspot-style.html index f1c25dab7f4..a2ffb57e5a3 100644 --- a/doc/hotspot-style.html +++ b/doc/hotspot-style.html @@ -114,7 +114,7 @@ id="toc-compatibility-with-c11">Compatibility with C11 id="toc-additional-permitted-features">Additional Permitted Features -

        • Excluded +
        • Forbidden Features
        • Undecided @@ -506,19 +506,19 @@ uses a subset. (Backports to JDK versions lacking support for more recent Standards must of course stick with the original C++98/03 subset.)

          This section describes that subset. Features from the C++98/03 -language may be used unless explicitly excluded here. Features from +language may be used unless explicitly forbidden here. Features from C++11, C++14, and C++17 may be explicitly permitted or explicitly -excluded, and discussed accordingly here. There is a third category, +forbidden, and discussed accordingly here. There is a third category, undecided features, about which HotSpot developers have not yet reached a consensus, or perhaps have not discussed at all. Use of these features -is also excluded.

          +is also forbidden.

          (The use of some features may not be immediately obvious and may slip in anyway, since the compiler will accept them. The code review process is the main defense against this.)

          Some features are discussed in their own subsection, typically to provide more extensive discussion or rationale for limitations. Features that don't have their own subsection are listed in omnibus feature -sections for permitted, excluded, and undecided features.

          +sections for permitted, forbidden, and undecided features.

          Lists of new features for C++11, C++14, and C++17, along with links to their descriptions, can be found in the online documentation for some of the compilers and libraries. The C++17 Standard is the definitive @@ -594,14 +594,15 @@ title="Runtime Type Information">RTTI are deemed not worthwhile, given the alternatives.

          Memory Allocation

          Do not use the standard global allocation and deallocation functions -(operator new and related functions). Use of these functions by HotSpot -code is disabled for some platforms.

          +(global operator new and related functions), other than the +non-allocating forms of those functions. Use of these functions by +HotSpot code is disabled for some platforms.

          Rationale: HotSpot often uses "resource" or "arena" allocation. Even where heap allocation is used, the standard global functions are avoided -in favor of wrappers around malloc and free that support the VM's Native -Memory Tracking (NMT) feature. Typically, uses of the global operator -new are inadvertent and therefore often associated with memory -leaks.

          +in favor of wrappers around malloc and free +that support the JVM's Native Memory Tracking (NMT) feature. Typically, +uses of the global operator new are inadvertent and +therefore often associated with memory leaks.

          Native memory allocation failures are often treated as non-recoverable. The place where "out of memory" is (first) detected may be an innocent bystander, unrelated to the actual culprit.

          @@ -648,7 +649,39 @@ for anonymous namespaces.

          class="uri">https://sourceware.org/bugzilla/show_bug.cgi?id=16874
          Bug for similar gdb problems.

          C++ Standard Library

          -

          Avoid using the C++ Standard Library.

          +

          Only curated parts of the C++ Standard Library may be used by HotSpot +code.

          +

          Functions that may throw exceptions must not be used. This is in +accordance with the HotSpot policy of not +using exceptions.

          +

          Also in accordance with HotSpot policy, the standard global allocator must not be +used. This means that uses of standard container classes cannot +presently be used, as doing so requires specialization on some allocator +type that is integrated with the existing HotSpot allocation mechanisms. +(Such allocators may be provided in the future.)

          +

          Standard Library identifiers should usually be fully qualified; +using directives must not be used to bring Standard Library +identifiers into scope just to remove the need for namespace +qualification. Requiring qualification makes it easy to distinguish +between references to external libraries and code that is part of +HotSpot.

          +

          As with language features, Standard Library facilities are either +permitted, explicitly forbidden, or undecided (and so implicitly +forbidden).

          +

          Most HotSpot code should not directly #include C++ +Standard Library headers. HotSpot provides a set of wrapper headers for +the Standard Library headers containing permitted definitions. These +wrappers are in the cppstdlib directory, with the same name +as the corresponding Standard Library header and a .hpp +extension. These wrappers provide a place for any additional code (some +of which may be platform-specific) needed to support HotSpot usage.

          +

          These wrappers also provide a place to document HotSpot usage, +including any restrictions. The set of wrappers and the usage +documentation should be considered part of HotSpot style. Any changes +are subject to the same process as applies to this document. (For +historical reasons, there may be many direct inclusions of some C++ +Standard Library headers.)

          Historically, HotSpot has mostly avoided use of the Standard Library.

          (It used to be impossible to use most of it in shared code, because @@ -661,46 +694,60 @@ in mid-2017. Support for Solaris was removed in 2020.)

          of Standard Library facilities is exceptions. HotSpot does not use exceptions and, for platforms which allow doing so, builds with them turned off. Many Standard Library facilities implicitly or explicitly -use exceptions.

        • +use exceptions. On the other hand, many don't, and can be used without +concern for this issue. Others may have a useful subset that doesn't use +exceptions.

        • assert. An issue that is quickly encountered is the assert macro name collision (JDK-8007770). -Some mechanism for addressing this would be needed before much of the -Standard Library could be used. (Not all Standard Library -implementations use assert in header files, but some do.)

        • +(Not all Standard Library implementations use assert in +header files, but some do.) HotSpot provides a mechanism for addressing +this, by establishing a scope around the include of a library header +where the HotSpot assert macro is suppressed. One of the +reasons for using wrapper headers rather than directly including +standard headers is to provide a central place to deal with this issue +for each header.

        • Memory allocation. HotSpot requires explicit control over where allocations occur. The C++98/03 std::allocator class is too -limited to support our usage. (Changes in more recent Standards may -remove this limitation.)

        • +limited to support our usage. But changes to the allocator concept in +more recent Standards removed some of the limitations, supporting +stateful allocators. HotSpot may, in the future, provide +standard-conforming allocators that are integrated with HotSpot's +existing allocation mechanisms.

        • Implementation vagaries. Bugs, or simply different implementation choices, can lead to different behaviors among the various Standard -Libraries we need to deal with.

        • +Libraries we need to deal with. But only selected parts of the Standard +Library are being permitted, and one of the selection criteria is +maturity. Some of these facilities are among the most heavily tested and +used C++ codes that exist.

        • Inconsistent naming conventions. HotSpot and the C++ Standard use different naming conventions. The coexistence of those different -conventions might appear jarring and reduce readability.

        • - -

          There are a few exceptions to this rule.

          +conventions might appear jarring and reduce readability. However, +experience in some other code bases suggests this isn't a significant +problem, so long as Standard Library names are namespace-qualified. It +is tempting to bring the Standard Library names into scope via a +using std; directive. Doing so makes writing code using +those names easier, since the qualifiers don't need to be included. But +there are several reasons not to do that.

            -
          • #include <new> to use placement new, -std::nothrow, and std::nothrow_t.
          • -
          • #include <limits> to use -std::numeric_limits.
          • -
          • #include <type_traits> with some restrictions, -listed below.
          • -
          • #include <cstddef> to use -std::nullptr_t and std::max_align_t.
          • +
          • There is a risk of future name collisions. Additional Standard +Library headers may be included, adding to the list of names being used. +Also, future versions of the Standard Library may add currently unknown +names to the headers already being included.

          • +
          • It may harm readability. Code where this is relevant is a mixture +of the local HotSpot naming conventions and the Standard Library's (or +other 3rd-party library's) naming conventions. With only unqualified +names, any distinctions from the naming conventions for the different +code sources are lost. Instead one may end up with an undifferentiated +mess, where it's not obvious whether an identifier is from local code +that is inconsistent with HotSpot style (and there's a regretable amount +of that for historical reasons), or is following some other convention. +Having the qualifiers disambiguates that.

          • +
          • It can be helpful to know, at a glance, whether the definition is +in HotSpot or elsewhere, for purposes of looking up the definition or +documentation.

          • +
          -

          Certain restrictions apply to the declarations provided by -<type_traits>.

          -
            -
          • The alignof operator should be used rather than -std::alignment_of<>.
          • -
          -

          TODO: Rather than directly #including (permitted) Standard Library -headers, use a convention of #including wrapper headers (in some -location like hotspot/shared/stdcpp). This provides a single place for -dealing with issues we might have for any given header, esp. -platform-specific issues.

          Type Deduction

          Use type deduction only if it makes the code clearer or safer. Do not use it merely to avoid the inconvenience of writing an explicit type, @@ -1577,10 +1624,10 @@ href="http://wg21.link/p0138r2">p0138r2)

        • Allow typename in template template parameter (n4051) — template template parameters are barely used (if at all) in HotSpot, but there's no reason to -artificially disallow this syntactic regularization in any such +artificially forbid this syntactic regularization in any such uses.

        • -

          Excluded Features

          +

          Forbidden Features

          Structured Bindings

          The use of structured bindings p0217r3 is forbidden. Preferred @@ -1622,8 +1669,33 @@ initialization for classes with base classes (p0017r1). HotSpot makes very little use of aggregate classes, preferring explicit constructors even for very simple classes.

          -

          Additional Excluded Features

          +

          Additional Forbidden +Features

          * * @return The version number of this {@code UUID} @@ -336,16 +393,13 @@ public final class UUID implements java.io.Serializable, Comparable { * The variant number has the following meaning: *
            *
          • 0 Reserved for NCS backward compatibility - *
          • 2 IETF RFC 4122 + *
          • 2 IETF RFC 9562 * (Leach-Salz), used by this class *
          • 6 Reserved, Microsoft Corporation backward compatibility *
          • 7 Reserved for future definition *
          * * @return The variant number of this {@code UUID} - * - * @spec https://www.rfc-editor.org/info/rfc4122 - * RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace */ public int variant() { // This field is composed of a varying number of bits. diff --git a/test/jdk/java/util/UUID/UUIDTest.java b/test/jdk/java/util/UUID/UUIDTest.java index 9fbd6dc1788..cb447a05656 100644 --- a/test/jdk/java/util/UUID/UUIDTest.java +++ b/test/jdk/java/util/UUID/UUIDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -47,6 +47,7 @@ public class UUIDTest { randomUUIDTest(); randomUUIDTest_Multi(); nameUUIDFromBytesTest(); + testOfEpochMillisTimestamp(); stringTest(); versionTest(); variantTest(); @@ -146,6 +147,44 @@ public class UUIDTest { } } + private static void testOfEpochMillisTimestamp() { + // Should not throw for valid currentTimeMillis() timestamp + long timestamp = System.currentTimeMillis(); + try { + UUID u = UUID.ofEpochMillis(timestamp); + if (u == null) { + throw new AssertionError("Generated UUID should not be null for timestamp: " + timestamp); + } + } catch (Exception e) { + throw new AssertionError("Unexpected exception with timestamp " + timestamp, e); + } + + // Should not throw for the 48-bit long + long value = 0xFEDCBA987654L; + try { + UUID u = UUID.ofEpochMillis(value); + if (u == null) { + throw new AssertionError("Generated UUID should not be null for 48-bit long: " + value); + } + } catch (Exception e) { + throw new AssertionError("Unexpected exception with 48-bit long " + value, e); + } + + // Should throw for negative timestamp + value = -0xFEDCBA987654L; + try { + UUID.ofEpochMillis(value); + throw new AssertionError("Expected IllegalArgumentException with negative timestamp: " + value); + } catch (IllegalArgumentException expected) {} + + // Should throw for timestamp > 48 bits + value = 1L << 48; + try { + UUID.ofEpochMillis(value); + throw new AssertionError("Expected IllegalArgumentException with timestamp > 48 bits: " + value); + } catch (IllegalArgumentException expected) {} + } + private static void stringTest() throws Exception { for (int i = 0; i < COUNT; i++) { UUID u1 = UUID.randomUUID(); @@ -187,6 +226,15 @@ public class UUIDTest { throw new Exception("nameUUIDFromBytes not type 3: " + test); } + long timestamp = System.currentTimeMillis(); + test = UUID.ofEpochMillis(timestamp); + if (test.version() != 7) { + throw new Exception("ofEpochMillis not type 7: " + test); + } + if (test.variant() != 2) { + throw new Exception("ofEpochMillis not variant 2: " + test); + } + test = UUID.fromString("9835451d-e2e0-1e41-8a5a-be785f17dcda"); if (test.version() != 1) { throw new Exception("wrong version fromString 1"); From d4622b2ceac6b6aef2717bf427878df1290c4a38 Mon Sep 17 00:00:00 2001 From: Jonas Norlinder Date: Tue, 4 Nov 2025 14:27:14 +0000 Subject: [PATCH 439/561] 8371130: Remove String template leftovers Reviewed-by: redestad, rriggs --- .../java/lang/AbstractStringBuilder.java | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java index f1da102236a..05b395ebf83 100644 --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java @@ -2046,42 +2046,6 @@ abstract sealed class AbstractStringBuilder implements Appendable, CharSequence return value; } - /** - * Used by StringConcatHelper via JLA. Adds the current builder count to the - * accumulation of items being concatenated. If the coder for the builder is - * UTF16 then upgrade the whole concatenation to UTF16. - * - * @param lengthCoder running accumulation of length and coder - * - * @return updated accumulation of length and coder - */ - long mix(long lengthCoder) { - return (lengthCoder + count) | ((long)coder << 32); - } - - /** - * Used by StringConcatHelper via JLA. Adds the characters in the builder value to the - * concatenation buffer and then updates the running accumulation of length. - * - * @param lengthCoder running accumulation of length and coder - * @param buffer concatenation buffer - * - * @return running accumulation of length and coder minus the number of characters added - */ - long prepend(long lengthCoder, byte[] buffer) { - lengthCoder -= count; - - if (lengthCoder < ((long)UTF16 << 32)) { - System.arraycopy(value, 0, buffer, (int)lengthCoder, count); - } else if (isLatin1(coder)) { - StringUTF16.inflate(value, 0, buffer, (int)lengthCoder, count); - } else { - System.arraycopy(value, 0, buffer, (int)lengthCoder << 1, count << 1); - } - - return lengthCoder; - } - private AbstractStringBuilder repeat(char c, int count) { byte coder = this.coder; int prevCount = this.count; From c0c76703bc10d5caa1cda7e2820d0702df5b8008 Mon Sep 17 00:00:00 2001 From: Fernando Guallini Date: Tue, 4 Nov 2025 15:20:22 +0000 Subject: [PATCH 440/561] 8366817: test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java and JdkProcClient.java should not delete logs Reviewed-by: syan, rhalade --- .../javax/net/ssl/TLSCommon/interop/AbstractPeer.java | 9 +-------- .../javax/net/ssl/TLSCommon/interop/JdkProcClient.java | 3 +-- .../javax/net/ssl/TLSCommon/interop/JdkProcServer.java | 3 +-- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java b/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java index 1bfc3ebcdbb..9950caf1921 100644 --- a/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java +++ b/test/jdk/javax/net/ssl/TLSCommon/interop/AbstractPeer.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -49,13 +49,6 @@ public abstract class AbstractPeer implements Peer { System.out.println(Utilities.readFile(logPath).orElse("")); } - /* - * Deletes log file if exists. - */ - protected void deleteLog() throws IOException { - Utilities.deleteFile(getLogPath()); - } - /* * The negotiated application protocol. */ diff --git a/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java b/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java index 91d1a8d1ead..7d3cb7d1665 100644 --- a/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java +++ b/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcClient.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -148,7 +148,6 @@ public class JdkProcClient extends AbstractClient { @Override public void close() throws IOException { printLog(); - deleteLog(); } public static void main(String[] args) throws Exception { diff --git a/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java b/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java index b07a039203e..a6c8a13e0c6 100644 --- a/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java +++ b/test/jdk/javax/net/ssl/TLSCommon/interop/JdkProcServer.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -166,7 +166,6 @@ public class JdkProcServer extends AbstractServer { public void close() throws IOException { printLog(); deletePort(); - deleteLog(); } private static int readPort() { From a51a0bf57feaae0862fd7f3dbf305883d49781a0 Mon Sep 17 00:00:00 2001 From: Jorn Vernee Date: Tue, 4 Nov 2025 15:40:40 +0000 Subject: [PATCH 441/561] 8370344: Arbitrary Java frames on stack during scoped access Reviewed-by: pchilanomate, dholmes, liach --- .../share/prims/scopedMemoryAccess.cpp | 55 +++++--- src/hotspot/share/runtime/handshake.cpp | 2 + src/hotspot/share/runtime/javaThread.cpp | 1 + src/hotspot/share/runtime/javaThread.hpp | 18 +++ .../sharedclosejfr/TestSharedCloseJFR.java | 123 ++++++++++++++++ .../foreign/sharedclosejfr/sharedCloseJfr.jfc | 7 + .../TestSharedCloseJvmti.java | 130 +++++++++++++++++ .../sharedclosejvmti/libSharedCloseAgent.cpp | 133 ++++++++++++++++++ .../lang/foreign/SharedCloseStackWalk.java | 92 ++++++++++++ 9 files changed, 545 insertions(+), 16 deletions(-) create mode 100644 test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java create mode 100644 test/jdk/java/foreign/sharedclosejfr/sharedCloseJfr.jfc create mode 100644 test/jdk/java/foreign/sharedclosejvmti/TestSharedCloseJvmti.java create mode 100644 test/jdk/java/foreign/sharedclosejvmti/libSharedCloseAgent.cpp create mode 100644 test/micro/org/openjdk/bench/java/lang/foreign/SharedCloseStackWalk.java diff --git a/src/hotspot/share/prims/scopedMemoryAccess.cpp b/src/hotspot/share/prims/scopedMemoryAccess.cpp index c1d1b8cd8c0..26ae5bc03f5 100644 --- a/src/hotspot/share/prims/scopedMemoryAccess.cpp +++ b/src/hotspot/share/prims/scopedMemoryAccess.cpp @@ -22,9 +22,11 @@ * */ +#include "classfile/moduleEntry.hpp" #include "classfile/vmSymbols.hpp" #include "jni.h" #include "jvm.h" +#include "jvmtifiles/jvmtiEnv.hpp" #include "logging/logStream.hpp" #include "oops/access.inline.hpp" #include "oops/oop.inline.hpp" @@ -36,7 +38,7 @@ #include "runtime/vframe.inline.hpp" template -static bool for_scoped_method(JavaThread* jt, const Func& func) { +static void for_scoped_methods(JavaThread* jt, bool agents_loaded, const Func& func) { ResourceMark rm; #ifdef ASSERT LogMessage(foreign) msg; @@ -44,12 +46,26 @@ static bool for_scoped_method(JavaThread* jt, const Func& func) { if (ls.is_enabled()) { ls.print_cr("Walking thread: %s", jt->name()); } + + bool would_have_bailed = false; #endif - const int max_critical_stack_depth = 10; - int depth = 0; for (vframeStream stream(jt); !stream.at_end(); stream.next()) { Method* m = stream.method(); + + if (!agents_loaded && + (m->method_holder()->module()->name() != vmSymbols::java_base())) { + // Stop walking if we see a frame outside of java.base. + + // If any JVMTI agents are loaded, we also have to keep walking, since + // agents can add arbitrary Java frames to the stack inside a @Scoped method. +#ifndef ASSERT + return; +#else + would_have_bailed = true; +#endif + } + bool is_scoped = m->is_scoped(); #ifdef ASSERT @@ -60,36 +76,43 @@ static bool for_scoped_method(JavaThread* jt, const Func& func) { #endif if (is_scoped) { - assert(depth < max_critical_stack_depth, "can't have more than %d critical frames", max_critical_stack_depth); - return func(stream); + assert(!would_have_bailed, "would have missed scoped method on release build"); + bool done = func(stream); + if (done || !agents_loaded) { + // We may also have to keep walking after finding a @Scoped method, + // since there may be multiple @Scoped methods active on the stack + // if a JVMTI agent callback runs during a scoped access and calls + // back into Java code that then itself does a scoped access. + return; + } } - depth++; - -#ifndef ASSERT - // On debug builds, just keep searching the stack - // in case we missed an @Scoped method further up - if (depth >= max_critical_stack_depth) { - break; - } -#endif } - return false; } static bool is_accessing_session(JavaThread* jt, oop session, bool& in_scoped) { - return for_scoped_method(jt, [&](vframeStream& stream){ + bool agents_loaded = JvmtiEnv::environments_might_exist(); + if (!agents_loaded && jt->is_throwing_unsafe_access_error()) { + // Ignore this thread. It is in the process of throwing another exception + // already. + return false; + } + + bool is_accessing_session = false; + for_scoped_methods(jt, agents_loaded, [&](vframeStream& stream){ in_scoped = true; StackValueCollection* locals = stream.asJavaVFrame()->locals(); for (int i = 0; i < locals->size(); i++) { StackValue* var = locals->at(i); if (var->type() == T_OBJECT) { if (var->get_obj() == session) { + is_accessing_session = true; return true; } } } return false; }); + return is_accessing_session; } static frame get_last_frame(JavaThread* jt) { diff --git a/src/hotspot/share/runtime/handshake.cpp b/src/hotspot/share/runtime/handshake.cpp index e9a00c2a3bc..f468f27e2c0 100644 --- a/src/hotspot/share/runtime/handshake.cpp +++ b/src/hotspot/share/runtime/handshake.cpp @@ -722,6 +722,8 @@ void HandshakeState::handle_unsafe_access_error() { MutexUnlocker ml(&_lock, Mutex::_no_safepoint_check_flag); // We may be at method entry which requires we save the do-not-unlock flag. UnlockFlagSaver fs(_handshakee); + // Tell code inspecting handshakee's stack what we are doing + ThrowingUnsafeAccessError tuae(_handshakee); Handle h_exception = Exceptions::new_exception(_handshakee, vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation"); if (h_exception()->is_a(vmClasses::InternalError_klass())) { java_lang_InternalError::set_during_unsafe_access(h_exception()); diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 36544cf1118..b9b4237e7ee 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -444,6 +444,7 @@ JavaThread::JavaThread(MemTag mem_tag) : _terminated(_not_terminated), _in_deopt_handler(0), _doing_unsafe_access(false), + _throwing_unsafe_access_error(false), _do_not_unlock_if_synchronized(false), #if INCLUDE_JVMTI _carrier_thread_suspended(false), diff --git a/src/hotspot/share/runtime/javaThread.hpp b/src/hotspot/share/runtime/javaThread.hpp index a6a00bfbd03..c0b25384fac 100644 --- a/src/hotspot/share/runtime/javaThread.hpp +++ b/src/hotspot/share/runtime/javaThread.hpp @@ -317,6 +317,7 @@ class JavaThread: public Thread { jint _in_deopt_handler; // count of deoptimization // handlers thread is in volatile bool _doing_unsafe_access; // Thread may fault due to unsafe access + volatile bool _throwing_unsafe_access_error; // Thread has faulted and is throwing an exception bool _do_not_unlock_if_synchronized; // Do not unlock the receiver of a synchronized method (since it was // never locked) when throwing an exception. Used by interpreter only. #if INCLUDE_JVMTI @@ -622,6 +623,9 @@ private: bool doing_unsafe_access() { return _doing_unsafe_access; } void set_doing_unsafe_access(bool val) { _doing_unsafe_access = val; } + bool is_throwing_unsafe_access_error() { return _throwing_unsafe_access_error; } + void set_throwing_unsafe_access_error(bool val) { _throwing_unsafe_access_error = val; } + bool do_not_unlock_if_synchronized() { return _do_not_unlock_if_synchronized; } void set_do_not_unlock_if_synchronized(bool val) { _do_not_unlock_if_synchronized = val; } @@ -1354,4 +1358,18 @@ class ThreadInClassInitializer : public StackObj { } }; +class ThrowingUnsafeAccessError : public StackObj { + JavaThread* _thread; + bool _prev; +public: + ThrowingUnsafeAccessError(JavaThread* thread) : + _thread(thread), + _prev(thread->is_throwing_unsafe_access_error()) { + _thread->set_throwing_unsafe_access_error(true); + } + ~ThrowingUnsafeAccessError() { + _thread->set_throwing_unsafe_access_error(_prev); + } +}; + #endif // SHARE_RUNTIME_JAVATHREAD_HPP diff --git a/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java b/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java new file mode 100644 index 00000000000..b59373b5b4e --- /dev/null +++ b/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java @@ -0,0 +1,123 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8370344 + * @requires os.family != "windows" + * @requires vm.flavor != "zero" + * @requires vm.hasJFR + * @summary Test closing a shared scope during faulting access + * + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main jdk.test.lib.FileInstaller sharedCloseJfr.jfc sharedCloseJfr.jfc + * @run main/othervm + * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:StartFlightRecording:filename=recording.jfr,dumponexit=true,settings=sharedCloseJfr.jfc + * TestSharedCloseJFR + */ + +import jdk.test.whitebox.WhiteBox; + +import java.io.RandomAccessFile; +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; + +// We are interested in the following scenario: +// When accessing a memory-mapped file that is truncated +// a segmentation fault will occur (see also test/hotspot/jtreg/runtime/Unsafe/InternalErrorTest.java) +// +// This segmentation fault will be caught in the VM's signal handler +// and get turned into an InternalError by a VM handshake operation. +// This handshake operation calls back into Java to the constructor +// of InternalError. This constructor calls super constructors until +// it ends up in the constructor of Throwable, where JFR starts logging +// the Throwable being created. This logging code adds a bunch +// of extra Java frames to the stack. +// +// All of this occurs during the original memory access, i.e. +// while we are inside a @Scoped method call (jdk.internal.misc.ScopedMemoryAccess). +// If at this point a shared arena is closed in another thread, +// the shared scope closure handshake (src/hotspot/share/prims/scopedMemoryAccess.cpp) +// will see all the extra frames added by JFR and the InternalError constructor, +// while walking the stack of the thread doing the faulting access. +// +// This test is here to make sure that the shared scope closure handshake can +// deal with that situation. +public class TestSharedCloseJFR { + + private static final int PAGE_SIZE = WhiteBox.getWhiteBox().getVMPageSize(); + + public static void main(String[] args) throws Throwable { + String fileName = "tmp.txt"; + Path path = Path.of(fileName); + AtomicBoolean stop = new AtomicBoolean(); + + Files.write(path, "1".repeat(PAGE_SIZE + 1000).getBytes()); + try (RandomAccessFile file = new RandomAccessFile(fileName, "rw")) { + FileChannel fileChannel = file.getChannel(); + MemorySegment segment = + fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel.size(), Arena.ofAuto()); + // truncate file + // this will make the access fault + Files.write(path, "2".getBytes()); + + // start worker thread + CountDownLatch latch = new CountDownLatch(1); + Thread.ofPlatform().start(() -> { + latch.countDown(); + while (!stop.get()) { + Arena.ofShared().close(); // hammer VM with handshakes + } + }); + + // wait util the worker thread has started + latch.await(); + + // access (should fault) + // try it a few times until we get a handshake during JFR reporting + for (int i = 0; i < 50_000; i++) { + try { + segment.get(ValueLayout.JAVA_INT, PAGE_SIZE); + throw new RuntimeException("InternalError was expected"); + } catch (InternalError e) { + // InternalError as expected + if (!e.getMessage().contains("a fault occurred in an unsafe memory access")) { + throw new RuntimeException("Unexpected exception", e); + } + } + } + } finally { + // stop worker + stop.set(true); + } + } +} diff --git a/test/jdk/java/foreign/sharedclosejfr/sharedCloseJfr.jfc b/test/jdk/java/foreign/sharedclosejfr/sharedCloseJfr.jfc new file mode 100644 index 00000000000..13f3406a5de --- /dev/null +++ b/test/jdk/java/foreign/sharedclosejfr/sharedCloseJfr.jfc @@ -0,0 +1,7 @@ + + + + true + true + + diff --git a/test/jdk/java/foreign/sharedclosejvmti/TestSharedCloseJvmti.java b/test/jdk/java/foreign/sharedclosejvmti/TestSharedCloseJvmti.java new file mode 100644 index 00000000000..b7106da24e8 --- /dev/null +++ b/test/jdk/java/foreign/sharedclosejvmti/TestSharedCloseJvmti.java @@ -0,0 +1,130 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8370344 + * @library /test/lib + * @run junit/native TestSharedCloseJvmti + */ + +import jdk.test.lib.Utils; +import jdk.test.lib.process.OutputAnalyzer; +import jdk.test.lib.process.ProcessTools; +import org.junit.jupiter.api.Test; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.ValueLayout; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class TestSharedCloseJvmti { + + private static final String JVMTI_AGENT_LIB = Path.of(Utils.TEST_NATIVE_PATH, System.mapLibraryName("SharedCloseAgent")) + .toAbsolutePath().toString(); + + @Test + void eventDuringScopedAccess() throws Throwable { + List command = new ArrayList<>(List.of( + "-agentpath:" + JVMTI_AGENT_LIB, + "-Xcheck:jni", + EventDuringScopedAccessRunner.class.getName() + )); + + try { + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder(command); + Process process = ProcessTools.startProcess("fork", pb, null, null, 1L, TimeUnit.MINUTES); + OutputAnalyzer output = new OutputAnalyzer(process); + output.shouldHaveExitValue(0); + output.stderrShouldContain("Exception in thread \"Trigger\" jdk.internal.misc.ScopedMemoryAccess$ScopedAccessError: Invalid memory access"); + } catch (TimeoutException e) { + throw new RuntimeException("Timeout while waiting for forked process"); + } + } + + public static class EventDuringScopedAccessRunner { + static final int ADDED_FRAMES = 10; + + static final CountDownLatch MAIN_LATCH = new CountDownLatch(1); + static final CountDownLatch TARGET_LATCH = new CountDownLatch(1); + static final MemorySegment OTHER_SEGMENT = Arena.global().allocate(4); + + static volatile int SINK; + + public static void main(String[] args) throws Throwable { + try (Arena arena = Arena.ofShared()) { + MemorySegment segment = arena.allocate(4); + // run in separate thread so that waiting on + // latch doesn't block main thread + Thread.ofPlatform().name("Trigger").start(() -> { + SINK = segment.get(ValueLayout.JAVA_INT, 0); + }); + // wait until trigger thread is in JVMTI event callback + MAIN_LATCH.await(); + } + // Notify trigger thread that arena was closed + TARGET_LATCH.countDown(); + } + + static boolean reentrant = false; + + // called by jvmti agent + // we get here after checking arena liveness + private static void target() { + String callerName = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(frames -> + frames.skip(2).findFirst().orElseThrow().getClassName()); + if (!callerName.equals("jdk.internal.misc.ScopedMemoryAccess")) { + return; + } + + if (reentrant) { + // put some frames on the stack, so stack walk does not see @Scoped method + addFrames(0); + } else { + reentrant = true; + SINK = OTHER_SEGMENT.get(ValueLayout.JAVA_INT, 0); + reentrant = false; + } + } + + private static void addFrames(int depth) { + if (depth >= ADDED_FRAMES) { + // notify main thread to close the arena + MAIN_LATCH.countDown(); + try { + // wait here until main thread has closed arena + TARGET_LATCH.await(); + } catch (InterruptedException ex) { + throw new RuntimeException("Unexpected interruption"); + } + return; + } + addFrames(depth + 1); + } + } +} diff --git a/test/jdk/java/foreign/sharedclosejvmti/libSharedCloseAgent.cpp b/test/jdk/java/foreign/sharedclosejvmti/libSharedCloseAgent.cpp new file mode 100644 index 00000000000..6406c46f61c --- /dev/null +++ b/test/jdk/java/foreign/sharedclosejvmti/libSharedCloseAgent.cpp @@ -0,0 +1,133 @@ +/* + * 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. + * + * 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. + */ + +#include + +#include + +static jclass MAIN_CLS; +static jmethodID TARGET_ID; + +static const char* TARGET_CLASS_NAME = "TestSharedCloseJvmti$EventDuringScopedAccessRunner"; +static const char* TARGET_METHOD_NAME = "target"; +static const char* TARGET_METHOD_SIG = "()V"; + +static const char* INTERCEPT_CLASS_NAME = "Ljdk/internal/foreign/MemorySessionImpl;"; +static const char* INTERCEPT_METHOD_NAME = "checkValidStateRaw"; + +void start(jvmtiEnv *jvmti_env, JNIEnv* jni_env) { + + jclass cls = jni_env->FindClass(TARGET_CLASS_NAME); + if (cls == nullptr) { + jni_env->ExceptionDescribe(); + return; + } + + MAIN_CLS = (jclass) jni_env->NewGlobalRef(cls); + + TARGET_ID = jni_env->GetStaticMethodID(cls, TARGET_METHOD_NAME, TARGET_METHOD_SIG); + if (TARGET_ID == nullptr) { + jni_env->ExceptionDescribe(); + return; + } +} + +void method_exit(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jmethodID method, + jboolean was_popped_by_exception, jvalue return_value) { + char* method_name = nullptr; + jvmtiError err = jvmti_env->GetMethodName(method, &method_name, nullptr, nullptr); + if (err != JVMTI_ERROR_NONE) { + return; + } + + if (strcmp(method_name, INTERCEPT_METHOD_NAME) != 0) { + jvmti_env->Deallocate((unsigned char*) method_name); + return; + } + + jclass cls; + err = jvmti_env->GetMethodDeclaringClass(method, &cls); + if (err != JVMTI_ERROR_NONE) { + jvmti_env->Deallocate((unsigned char*) method_name); + return; + } + + char* class_sig = nullptr; + err = jvmti_env->GetClassSignature(cls, &class_sig, nullptr); + if (err != JVMTI_ERROR_NONE) { + jvmti_env->Deallocate((unsigned char*) method_name); + return; + } + + if (strcmp(class_sig, INTERCEPT_CLASS_NAME) != 0) { + jvmti_env->Deallocate((unsigned char*) method_name); + jvmti_env->Deallocate((unsigned char*) class_sig); + return; + } + + jni_env->CallStaticVoidMethod(MAIN_CLS, TARGET_ID); + if (jni_env->ExceptionOccurred()) { + jni_env->ExceptionDescribe(); + } + + jvmti_env->Deallocate((unsigned char*) method_name); + jvmti_env->Deallocate((unsigned char*) class_sig); +} + +JNIEXPORT jint JNICALL +Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { + jvmtiEnv* env; + jint jni_err = vm->GetEnv((void**) &env, JVMTI_VERSION); + if (jni_err != JNI_OK) { + return jni_err; + } + + jvmtiCapabilities capabilities{}; + capabilities.can_generate_method_exit_events = 1; + + jvmtiError err = env->AddCapabilities(&capabilities); + if (err != JVMTI_ERROR_NONE) { + return err; + } + + jvmtiEventCallbacks callbacks; + callbacks.VMStart = start; + callbacks.MethodExit = method_exit; + + err = env->SetEventCallbacks(&callbacks, (jint) sizeof(callbacks)); + if (err != JVMTI_ERROR_NONE) { + return err; + } + + err = env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, nullptr); + if (err != JVMTI_ERROR_NONE) { + return err; + } + + err = env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, nullptr); + if (err != JVMTI_ERROR_NONE) { + return err; + } + + return 0; +} diff --git a/test/micro/org/openjdk/bench/java/lang/foreign/SharedCloseStackWalk.java b/test/micro/org/openjdk/bench/java/lang/foreign/SharedCloseStackWalk.java new file mode 100644 index 00000000000..ead4bcb5089 --- /dev/null +++ b/test/micro/org/openjdk/bench/java/lang/foreign/SharedCloseStackWalk.java @@ -0,0 +1,92 @@ +/* + * 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. + * + * 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 org.openjdk.bench.java.lang.foreign; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +import java.lang.foreign.Arena; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 10, time = 10, timeUnit = TimeUnit.SECONDS) +@State(Scope.Benchmark) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Fork(value = 1, jvmArgs = { "--enable-native-access=ALL-UNNAMED", "-Djava.library.path=micro/native" }) +public class SharedCloseStackWalk { + + @Param({"1", "10", "100"}) + int numOtherThread; + + @Param({"10", "100", "1000"}) + int extraFrames; + + @Param({"false", "true"}) + boolean virtualThreads; + + private CountDownLatch stop; + + @Setup + public void setup() { + stop = new CountDownLatch(1); + for (int i = 0; i < numOtherThread; i++) { + (virtualThreads + ? Thread.ofVirtual() + : Thread.ofPlatform()).start(() -> recurse(0)); + } + } + + @TearDown + public void teardown() { + stop.countDown(); + } + + @Benchmark + public void sharedOpenClose() { + Arena.ofShared().close(); + } + + private void recurse(int depth) { + if (depth == extraFrames) { + try { + stop.await(); + } catch (InterruptedException e) { + throw new RuntimeException("Don't interrupt me!", e); + } + } else { + recurse(depth + 1); + } + } +} From 7d3c66f379fcb24d4505c2c12e20b24dce313e56 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Tue, 4 Nov 2025 15:58:19 +0000 Subject: [PATCH 442/561] 8371114: Problemlist vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TestDescription.java Reviewed-by: amenkov, syan, sspitsyn --- test/hotspot/jtreg/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 3dac8821165..2065737c2a1 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -167,6 +167,7 @@ vmTestbase/metaspace/gc/firstGC_default/TestDescription.java 8208250 generic-all vmTestbase/nsk/jvmti/scenarios/capability/CM03/cm03t001/TestDescription.java 8073470 linux-all vmTestbase/nsk/jvmti/InterruptThread/intrpthrd003/TestDescription.java 8288911 macosx-all +vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TestDescription.java 8371103 generic-all vmTestbase/jit/escape/LockCoarsening/LockCoarsening001.java 8148743 generic-all vmTestbase/jit/escape/LockCoarsening/LockCoarsening002.java 8208259 generic-all From 2f455ed146ff2e56da4532e9430e4c85ca9497ad Mon Sep 17 00:00:00 2001 From: Peyang Date: Tue, 4 Nov 2025 16:08:15 +0000 Subject: [PATCH 443/561] 8371092: NullPointerException in AltServiceUsageTest.afterClass() test Reviewed-by: dfuchs --- .../java/net/httpclient/AltServiceUsageTest.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/jdk/java/net/httpclient/AltServiceUsageTest.java b/test/jdk/java/net/httpclient/AltServiceUsageTest.java index 8b9193432f0..673357a59aa 100644 --- a/test/jdk/java/net/httpclient/AltServiceUsageTest.java +++ b/test/jdk/java/net/httpclient/AltServiceUsageTest.java @@ -123,7 +123,7 @@ public class AltServiceUsageTest implements HttpServerAdapters { public void afterClass() throws Exception { safeStop(originServer); safeStop(altServer); - udpNotResponding.close(); + safeClose(udpNotResponding); } private static void safeStop(final HttpTestServer server) { @@ -140,6 +140,19 @@ public class AltServiceUsageTest implements HttpServerAdapters { } } + private static void safeClose(final DatagramChannel channel) { + if (channel == null) { + return; + } + try { + System.out.println("Closing DatagramChannel " + channel.getLocalAddress()); + channel.close(); + } catch (Exception e) { + System.err.println("Ignoring exception: " + e.getMessage() + " that occurred " + + "during close of DatagramChannel: " + channel); + } + } + private static class H3AltServicePublisher implements HttpTestHandler { private static final String RESPONSE_CONTENT = "apple"; From 4c6af03f81e068a98b8f4628b96682a54f3946da Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Tue, 4 Nov 2025 16:47:33 +0000 Subject: [PATCH 444/561] 8337142: StackOverflowError in Types.containsTypeRecursive with deeply nested type hierarchy Reviewed-by: mcimadamore --- .../com/sun/tools/javac/code/Types.java | 44 +++++++++++-- .../types/SOEForDeeplyNestedTypeTest.java | 64 +++++++++++++++++++ 2 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 test/langtools/tools/javac/types/SOEForDeeplyNestedTypeTest.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java index 98ad65fdc05..ffd304c18a2 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java @@ -1346,7 +1346,7 @@ public class Types { * Type-equality relation - type variables are considered * equals if they share the same object identity. */ - TypeRelation isSameTypeVisitor = new TypeRelation() { + abstract class TypeEqualityVisitor extends TypeRelation { public Boolean visitType(Type t, Type s) { if (t.equalsIgnoreMetadata(s)) @@ -1385,10 +1385,12 @@ public class Types { } else { WildcardType t2 = (WildcardType)s; return (t.kind == t2.kind || (t.isExtendsBound() && s.isExtendsBound())) && - isSameType(t.type, t2.type); + sameTypeComparator(t.type, t2.type); } } + abstract boolean sameTypeComparator(Type t, Type s); + @Override public Boolean visitClassType(ClassType t, Type s) { if (t == s) @@ -1419,9 +1421,11 @@ public class Types { } return t.tsym == s.tsym && visit(t.getEnclosingType(), s.getEnclosingType()) - && containsTypeEquivalent(t.getTypeArguments(), s.getTypeArguments()); + && sameTypeArguments(t.getTypeArguments(), s.getTypeArguments()); } + abstract boolean sameTypeArguments(List ts, List ss); + @Override public Boolean visitArrayType(ArrayType t, Type s) { if (t == s) @@ -1477,6 +1481,16 @@ public class Types { public Boolean visitErrorType(ErrorType t, Type s) { return true; } + } + + TypeEqualityVisitor isSameTypeVisitor = new TypeEqualityVisitor() { + boolean sameTypeComparator(Type t, Type s) { + return isSameType(t, s); + } + + boolean sameTypeArguments(List ts, List ss) { + return containsTypeEquivalent(ts, ss); + } }; // @@ -3862,7 +3876,7 @@ public class Types { // where class TypePair { final Type t1; - final Type t2;; + final Type t2; TypePair(Type t1, Type t2) { this.t1 = t1; @@ -3875,10 +3889,28 @@ public class Types { @Override public boolean equals(Object obj) { return (obj instanceof TypePair typePair) - && isSameType(t1, typePair.t1) - && isSameType(t2, typePair.t2); + && exactTypeVisitor.visit(t1, typePair.t1) + && exactTypeVisitor.visit(t2, typePair.t2); } } + + TypeEqualityVisitor exactTypeVisitor = new TypeEqualityVisitor() { + @Override + boolean sameTypeArguments(List ts, List ss) { + while (ts.nonEmpty() && ss.nonEmpty() + && sameTypeComparator(ts.head, ss.head)) { + ts = ts.tail; + ss = ss.tail; + } + return ts.isEmpty() && ss.isEmpty(); + } + + @Override + boolean sameTypeComparator(Type t, Type s) { + return exactTypeVisitor.visit(t, s); + } + }; + Set mergeCache = new HashSet<>(); private Type merge(Type c1, Type c2) { ClassType class1 = (ClassType) c1; diff --git a/test/langtools/tools/javac/types/SOEForDeeplyNestedTypeTest.java b/test/langtools/tools/javac/types/SOEForDeeplyNestedTypeTest.java new file mode 100644 index 00000000000..ad268ddef24 --- /dev/null +++ b/test/langtools/tools/javac/types/SOEForDeeplyNestedTypeTest.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8337142 + * @summary StackOverflowError in Types.containsTypeRecursive with deeply nested type hierarchy + * @compile SOEForDeeplyNestedTypeTest.java + */ + +import java.util.List; + +public class SOEForDeeplyNestedTypeTest { + class T { + List> xs = List.of(new M<>(One.class), new M<>(Two.class), new M<>(Two.class)); + } + + class M> { + M(Class c) {} + } + + class One implements Three, Six {} + class Two implements Four, Six {} + interface Three extends Nine {} + interface Four extends Nine {} + class Five extends Ten implements Eleven, Thirteen {} + interface Six extends TwentyTwo {} + class Seven extends Ten implements Eleven, Thirteen {} + interface Eight {} + interface Nine extends TwentyTwo {} + class Ten implements TwentyTwo {} + interface Eleven extends Twenty {} + class Twelve extends Ten implements Eleven, Thirteen {} + interface Thirteen extends Seventeen {} + class Fourteen extends Ten implements Eleven, Thirteen {} + class Fifteen extends Ten implements Eleven, Thirteen {} + class Sixteen extends Nineteen implements Eighteen, Thirteen {} + interface Seventeen extends Twenty {} + interface Eighteen extends Twenty {} + class Nineteen extends Ten implements Twenty {} + interface Twenty extends TwentyTwo {} + class TwentyOne {} + interface TwentyTwo extends Eight {} +} From 8224292ba57f3d6f79c1a3515348824d92ef45fe Mon Sep 17 00:00:00 2001 From: Koushik Thirupattur Date: Tue, 4 Nov 2025 18:42:52 +0000 Subject: [PATCH 445/561] 8365069: Refactor tests to use PEM API (Phase 1) Reviewed-by: ascarpino --- .../KeyStore/PKCS12/WriteP12Test.java | 29 ++--- .../security/KeyStore/TestKeyStoreBasic.java | 83 ++++++------- .../selfIssued/DisableRevocation.java | 66 ++++------- .../selfIssued/KeyUsageMatters.java | 86 +++++--------- .../CertPathValidator/OCSP/FailoverToCRL.java | 30 ++--- .../indirectCRL/CircularCRLOneLevel.java | 42 +++---- .../CircularCRLOneLevelRevoked.java | 43 +++---- .../NameConstraintsWithRID.java | 28 ++--- .../NameConstraintsWithUnexpectedRID.java | 25 ++-- .../NameConstraintsWithoutRID.java | 28 ++--- .../trustAnchor/ValWithAnchorByName.java | 18 ++- test/jdk/javax/net/ssl/TLSCommon/TLSTest.java | 110 +++++++++++------- .../DisabledAlgorithms/CPBuilder.java | 41 +++---- .../DisabledAlgorithms/CPBuilderWithMD5.java | 37 +++--- .../CPValidatorEndEntity.java | 32 +++-- .../CPValidatorIntermediate.java | 29 ++--- .../X509TrustManagerImpl/PKIXExtendedTM.java | 17 ++- .../SunX509ExtendedTM.java | 18 ++- 18 files changed, 322 insertions(+), 440 deletions(-) diff --git a/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java b/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java index f4024090f2f..96bbbbcde13 100644 --- a/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java +++ b/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -30,12 +30,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.security.Key; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.UnrecoverableKeyException; +import java.security.*; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; @@ -50,6 +45,7 @@ import java.util.Enumeration; * @summary Write different types p12 key store to Check the write related * APIs. * @run main WriteP12Test + * @enablePreview */ public class WriteP12Test { @@ -128,19 +124,16 @@ public class WriteP12Test { private final Certificate testLeadCert; private final Certificate caCert; - WriteP12Test() throws CertificateException { - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - caCert = cf.generateCertificate(new ByteArrayInputStream(CA_CERT_STR - .getBytes())); - testLeadCert = cf.generateCertificate(new ByteArrayInputStream( - LEAD_CERT.getBytes())); - testerCert = cf.generateCertificate(new ByteArrayInputStream(END_CERT - .getBytes())); + WriteP12Test() { + PEMDecoder pemDecoder = PEMDecoder.of(); + caCert = pemDecoder.decode(CA_CERT_STR, X509Certificate.class); + testLeadCert = pemDecoder.decode(LEAD_CERT, X509Certificate.class); + testerCert = pemDecoder.decode(END_CERT, X509Certificate.class); } - public static void main(String[] args) throws CertificateException, - UnrecoverableKeyException, KeyStoreException, - NoSuchProviderException, NoSuchAlgorithmException, IOException { + public static void main(String[] args) throws UnrecoverableKeyException, + KeyStoreException, NoSuchProviderException, + NoSuchAlgorithmException, IOException { WriteP12Test jstest = new WriteP12Test(); out.println("test WriteP12CertChain"); /* diff --git a/test/jdk/java/security/KeyStore/TestKeyStoreBasic.java b/test/jdk/java/security/KeyStore/TestKeyStoreBasic.java index 1a31d51c418..8218c9cb48a 100644 --- a/test/jdk/java/security/KeyStore/TestKeyStoreBasic.java +++ b/test/jdk/java/security/KeyStore/TestKeyStoreBasic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -21,54 +21,48 @@ * questions. */ -import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.security.KeyFactory; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchProviderException; -import java.security.PrivateKey; -import java.security.UnrecoverableKeyException; +import java.security.*; import java.security.cert.Certificate; -import java.security.cert.CertificateFactory; -import java.security.spec.KeySpec; -import java.security.spec.PKCS8EncodedKeySpec; -import java.util.Base64; +import java.security.cert.X509Certificate; /* * @test * @bug 8048621 8133090 8167371 8236671 + * @enablePreview * @summary Test basic operations with keystores (jks, jceks, pkcs12) * @author Yu-Ching Valerie PENG */ public class TestKeyStoreBasic { - private static final String PRIVATE_KEY_PKCS8_BASE64 = "" - + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpyz97liuWPDYcLH9TX8BiT78o" - + "lCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgKmLhuczF3M9VIcWr+" - + "JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz7leikne7KmclHvTfvFd0WDI7Gb9v" - + "o4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXRv5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfF" - + "e1DDsMg/KpKGiILYZ+g2qtVMZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e" - + "+sO6H24w2F19AgMBAAECggEBAId/12187dO6wUPCjumuJA1QrrBnbKdKONyai36uoc1Od4s5QFj7" - + "+hEIeS7rbGNYQuBvnkgusAbzkW0FIpxpHce3EJez/emux6pEOKoP77BwMt9gy+txyu0+BHi91FQg" - + "AGvrnQDO5EYVY4Cz/WjOsJzKu8zVLg+DS0Toa2qRFwmUe9mVAXPNOCZ3Oae/Q6tCDsaINNw0fmjj" - + "jn6uohPbS+n6xENG3FkQXB36getXy310xTGED2J27cmAQH6gLR6Kl2iROzNPbbpBqbuemI9kbcld" - + "EwBS1jRfZWeaPstYA1niVrE9UgUBzemnoh4TDkG076sYthHMr5QFGjPswnwtJ4ECgYEA0sURQ5+v" - + "baH4tdaemI3qpnknXTlzSpuZZmAoyvY0Id0mlduwKwmZ3Y5989wHfnnhFfyNO4IkTKjI2Wp97qP5" - + "4eqUNpA7FtNU7KUzMcFDTtwtNZuRYMrKlqo2lLbA+gVrAYpYZFL4b7tcwtX4DnYorDsmude6W8sG" - + "4Mx2VdFJC9UCgYEAzjsdXCYH5doWUHb0dvn9ID7IikffEMRM720MRjrnnnVbpzx6ACntkPDNZg7p" - + "TRE/mx7iBz81ZaUWE+V0wd0JvCHEdpAz3mksyvDFhU4Bgs6xzf2pSul5muhsx3hHcvvPezz5Bnxs" - + "faJlzkxfwotyGmvWN15GA/pyfsZjsbbTpwkCgYAO6NnbysQCIV8SnegCKqfatt9N/O5m7LLhRxQb" - + "p2bwrlA4cZ34rWkw/w9x3LK7A6wkfgUPnJkswxPSLXJTG05l6M4rPfCwIKr1Qopojp9QSMr569NQ" - + "4YeLOOc7heIIzbFQHpU6I5Rncv2Q2sn9W+ZsqJKIuvX34FjQNiZ406EzMQKBgHSxOGS61D84DuZK" - + "2Ps1awhC3kB4eHzJRms3vflDPWoJJ+pSKwpKrzUTPHXiPBqyhtYkPGszVeiE6CAr9sv3YZnFVaBs" - + "6hyQUJsob+uE/w/gGvXe8VsFDx0bJOodYfhrCbTHBHWqE81nBcocpxayxsayfAzqWB3KKd0YLrMR" - + "K2PZAoGAcZa8915R2m0KZ6HVJUt/JDR85jCbN71kcVDFY2XSFkOJvOdFoHNfRckfLzjq9Y2MSSTV" - + "+QDWbDo2doUQCejJUTaN8nP79tfyir24X5uVPvQaeVoGTKYb+LfUqK0F60lStmjuddIGSZH55y3v" - + "+9XjmxbVERtd1lqgQg3VlmKlEXY="; + private static final String PRIVATE_KEY_PKCS8_BASE64 = """ + -----BEGIN PRIVATE KEY----- + MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpyz97liuWPDYcLH9TX8BiT78o + lCmAfmevvch6ncXUVuCzbdaKuKXwn4EVbDszsVJLoK5zdtP+X3iDhutj+IgKmLhuczF3M9VIcWr+ + JJUyTH4+3h/RT8cjCDZOmk9iXkb5ifruVsLqzb9g+Vp140Oz7leikne7KmclHvTfvFd0WDI7Gb9v + o4f5rT717BXJ/n+M6pNk8DLpLiEu6eziYvXRv5x+t5Go3x0eCXdaxEQUf2j876Wfr2qHRJK7lDfF + e1DDsMg/KpKGiILYZ+g2qtVMZSxtp5BZEtfB5qV/IE5kWO+mCIAGpXSZIdbERR6pZUq8GLEe1T9e + +sO6H24w2F19AgMBAAECggEBAId/12187dO6wUPCjumuJA1QrrBnbKdKONyai36uoc1Od4s5QFj7 + +hEIeS7rbGNYQuBvnkgusAbzkW0FIpxpHce3EJez/emux6pEOKoP77BwMt9gy+txyu0+BHi91FQg + AGvrnQDO5EYVY4Cz/WjOsJzKu8zVLg+DS0Toa2qRFwmUe9mVAXPNOCZ3Oae/Q6tCDsaINNw0fmjj + jn6uohPbS+n6xENG3FkQXB36getXy310xTGED2J27cmAQH6gLR6Kl2iROzNPbbpBqbuemI9kbcld + EwBS1jRfZWeaPstYA1niVrE9UgUBzemnoh4TDkG076sYthHMr5QFGjPswnwtJ4ECgYEA0sURQ5+v + baH4tdaemI3qpnknXTlzSpuZZmAoyvY0Id0mlduwKwmZ3Y5989wHfnnhFfyNO4IkTKjI2Wp97qP5 + 4eqUNpA7FtNU7KUzMcFDTtwtNZuRYMrKlqo2lLbA+gVrAYpYZFL4b7tcwtX4DnYorDsmude6W8sG + 4Mx2VdFJC9UCgYEAzjsdXCYH5doWUHb0dvn9ID7IikffEMRM720MRjrnnnVbpzx6ACntkPDNZg7p + TRE/mx7iBz81ZaUWE+V0wd0JvCHEdpAz3mksyvDFhU4Bgs6xzf2pSul5muhsx3hHcvvPezz5Bnxs + faJlzkxfwotyGmvWN15GA/pyfsZjsbbTpwkCgYAO6NnbysQCIV8SnegCKqfatt9N/O5m7LLhRxQb + p2bwrlC4cZ34rWkw/w9x3LK7A6wkfgUPnJkswxPSLXJTG05l6M4rPfCwIKr1Qopojp9QSMr569NQ + 4YeLOOc7heIIzbFQHpU6I5Rncv2Q2sn9W+ZsqJKIuvX34FjQNiZ406EzMQKBgHSxOGS61D84DuZK + 2Ps1awhC3kB4eHzJRms3vflDPWoJJ+pSKwpKrzUTPHXiPBqyhtYkPGszVeiE6CAr9sv3YZnFVaBs + 6hyQUJsob+uE/w/gGvXe8VsFDx0bJOodYfhrCbTHBHWqE81nBcocpxayxsayfAzqWB3KKd0YLrMR + K2PZAoGAcZa8915R2m0KZ6HVJUt/JDR85jCbN71kcVDFY2XSFkOJvOdFoHNfRckfLzjq9Y2MSSTV + +QDWbDo2doUQCejJUTaN8nP79tfyir24X5uVPvQaeVoGTKYb+LfUqK0F60lStmjuddIGSZH55y3v + +9XjmxbVERtd1lqgQg3VlmKlEXY= + -----END PRIVATE KEY----- + """; /* * Certificate: @@ -132,20 +126,9 @@ public class TestKeyStoreBasic { public void runTest(String provider) throws Exception { - // load private key - // all keystore types should support private keys - KeySpec spec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(PRIVATE_KEY_PKCS8_BASE64)); - PrivateKey privateKey = KeyFactory.getInstance("RSA") - .generatePrivate(spec); - - // load x509 certificate - Certificate cert; - try (InputStream is = new BufferedInputStream( - new ByteArrayInputStream(CERTIFICATE.getBytes()))) { - cert = CertificateFactory.getInstance("X.509") - .generateCertificate(is); - } + PEMDecoder pemDecoder = PEMDecoder.of(); + PrivateKey privateKey = pemDecoder.decode(PRIVATE_KEY_PKCS8_BASE64, PrivateKey.class); + Certificate cert = pemDecoder.decode(CERTIFICATE, X509Certificate.class); int numEntries = 5; String type = null; diff --git a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/DisableRevocation.java b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/DisableRevocation.java index b72550e4c5d..23a0b11d93c 100644 --- a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/DisableRevocation.java +++ b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/DisableRevocation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -36,11 +36,14 @@ * @run main/othervm DisableRevocation subca * @run main/othervm DisableRevocation subci * @run main/othervm DisableRevocation alice + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -143,49 +146,29 @@ public final class DisableRevocation { "G93Dcf0U1JRO77juc61Br5paAy8Bok18Y/MeG7uKgB2MAEJYKhGKbCrfMw==\n" + "-----END CERTIFICATE-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); + Collection entries = new HashSet<>(); // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is; - - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(topCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); + entries.add(PEM_DECODER.decode(targetCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(subCaCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(topCrlIssuerCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(subCrlIssuerCertStr, X509Certificate.class)); return CertStore.getInstance("Collection", new CollectionCertStoreParameters(entries)); @@ -198,15 +181,16 @@ public final class DisableRevocation { // generate certificate from certificate string CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream is = null; + String cert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + cert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + cert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + cert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(cert, X509Certificate.class); byte[] extVal = target.getExtensionValue("2.5.29.14"); if (extVal != null) { DerInputStream in = new DerInputStream(extVal); @@ -222,19 +206,17 @@ public final class DisableRevocation { private static boolean match(String name, Certificate cert) throws Exception { - X509CertSelector selector = new X509CertSelector(); // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = null; + String newCert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + newCert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + newCert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + newCert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(newCert, X509Certificate.class); return target.equals(cert); } diff --git a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/KeyUsageMatters.java b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/KeyUsageMatters.java index ec238cb40c9..1343aefa7f3 100644 --- a/test/jdk/java/security/cert/CertPathBuilder/selfIssued/KeyUsageMatters.java +++ b/test/jdk/java/security/cert/CertPathBuilder/selfIssued/KeyUsageMatters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -32,6 +32,7 @@ * @bug 6852744 8133489 * @summary PIT b61: PKI test suite fails because self signed certificates * are being rejected + * @enablePreview * @modules java.base/sun.security.util * @run main/othervm -Djava.security.debug=certpath KeyUsageMatters subca * @run main/othervm -Djava.security.debug=certpath KeyUsageMatters subci @@ -41,6 +42,8 @@ import java.io.*; import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -66,6 +69,8 @@ import sun.security.util.DerInputStream; */ public final class KeyUsageMatters { + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + // the trust anchor static String selfSignedCertStr = "-----BEGIN CERTIFICATE-----\n" + @@ -179,57 +184,30 @@ public final class KeyUsageMatters { private static Set generateTrustAnchors() throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + // generate certificate from cert string + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); + Collection entries = new HashSet<>(); - // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is; - - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(topCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); - cert = cf.generateCertificate(is); - entries.add(cert); - - // generate CRL from CRL string - is = new ByteArrayInputStream(topCrlStr.getBytes()); - Collection mixes = cf.generateCRLs(is); - entries.addAll(mixes); - - is = new ByteArrayInputStream(subCrlStr.getBytes()); - mixes = cf.generateCRLs(is); - entries.addAll(mixes); + // Decode and add certificates + entries.add(PEM_DECODER.decode(targetCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(subCaCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(topCrlIssuerCertStr, X509Certificate.class)); + entries.add(PEM_DECODER.decode(subCrlIssuerCertStr, X509Certificate.class)); + // Decode and add CRLs + entries.add(PEM_DECODER.decode(topCrlStr, X509CRL.class)); + entries.add(PEM_DECODER.decode(subCrlStr, X509CRL.class)); return CertStore.getInstance("Collection", new CollectionCertStoreParameters(entries)); } @@ -239,17 +217,16 @@ public final class KeyUsageMatters { X509CertSelector selector = new X509CertSelector(); // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = null; + String cert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + cert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + cert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + cert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(cert, X509Certificate.class); byte[] extVal = target.getExtensionValue("2.5.29.14"); if (extVal != null) { DerInputStream in = new DerInputStream(extVal); @@ -263,21 +240,18 @@ public final class KeyUsageMatters { return selector; } - private static boolean match(String name, Certificate cert) - throws Exception { - X509CertSelector selector = new X509CertSelector(); + private static boolean match(String name, Certificate cert) { // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = null; + String newCert; if (name.equals("subca")) { - is = new ByteArrayInputStream(subCaCertStr.getBytes()); + newCert = subCaCertStr; } else if (name.equals("subci")) { - is = new ByteArrayInputStream(subCrlIssuerCertStr.getBytes()); + newCert = subCrlIssuerCertStr; } else { - is = new ByteArrayInputStream(targetCertStr.getBytes()); + newCert = targetCertStr; } - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(newCert, X509Certificate.class); return target.equals(cert); } diff --git a/test/jdk/java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java b/test/jdk/java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java index d1e4e8c6a29..2232ae06711 100644 --- a/test/jdk/java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java +++ b/test/jdk/java/security/cert/CertPathValidator/OCSP/FailoverToCRL.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -32,6 +32,7 @@ * @bug 6383095 * @summary CRL revoked certificate failures masked by OCSP failures * @run main/othervm FailoverToCRL + * @enablePreview * @author Xuelei Fan */ @@ -136,11 +137,14 @@ import java.io.*; import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; import java.security.InvalidAlgorithmParameterException; import java.security.cert.CertPathValidatorException.BasicReason; +import java.util.Collections; public class FailoverToCRL { @@ -193,32 +197,29 @@ public class FailoverToCRL { "-----END X509 CRL-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static CertPath generateCertificatePath() - throws CertificateException { + throws CertificateException, IOException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); // generate certification path - List list = Arrays.asList(new Certificate[] {targetCert}); + List list = Collections.singletonList(PEM_DECODER.decode + (is, X509Certificate.class)); return cf.generateCertPath(list); } - private static Set generateTrustAnchors() - throws CertificateException { + private static Set generateTrustAnchors() { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); + X509Certificate trustedCert = PEM_DECODER.decode(trusedCertStr, X509Certificate.class); // generate a trust anchor - TrustAnchor anchor = new TrustAnchor((X509Certificate)trusedCert, null); + TrustAnchor anchor = new TrustAnchor(trustedCert, null); return Collections.singleton(anchor); } @@ -231,7 +232,10 @@ public class FailoverToCRL { new ByteArrayInputStream(crlStr.getBytes()); // generate a cert store - Collection crls = cf.generateCRLs(is); + Collection crls = new HashSet<>(); + + crls.add(PEM_DECODER.decode(crlStr, X509CRL.class)); + return CertStore.getInstance("Collection", new CollectionCertStoreParameters(crls)); } diff --git a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevel.java b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevel.java index 9a21ae2de0d..947f0e0b485 100644 --- a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevel.java +++ b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -33,11 +33,14 @@ * @bug 6720721 * @summary CRL check with circular depency support needed * @run main/othervm CircularCRLOneLevel + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -107,22 +110,19 @@ public class CircularCRLOneLevel { "oKLrE9+yCOkYUOpiRlz43/3vkEL5hjIKMcDSZnPKBZi1h16Yj2hPe9GMibNip54=\n" + "-----END X509 CRL-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; + Certificate targetCert = PEM_DECODER.decode(targetCertStr, X509Certificate.class); - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, selfSignedCert}); + List list = Arrays.asList(targetCert, selfSignedCert); return cf.generateCertPath(list); } @@ -130,35 +130,21 @@ public class CircularCRLOneLevel { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { - // generate CRL from CRL string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(crlStr.getBytes()); // generate a cert store - Collection crls = cf.generateCRLs(is); - - is = new ByteArrayInputStream(crlIssuerCertStr.getBytes()); - Collection certs = cf.generateCertificates(is); - - Collection entries = new HashSet(); - entries.addAll(crls); - entries.addAll(certs); + Collection entries = new HashSet<>(); + entries.add(PEM_DECODER.decode(crlStr, X509CRL.class)); + entries.add(PEM_DECODER.decode(crlIssuerCertStr, X509Certificate.class)); return CertStore.getInstance("Collection", new CollectionCertStoreParameters(entries)); diff --git a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevelRevoked.java b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevelRevoked.java index 944483683ba..251883d4e51 100644 --- a/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevelRevoked.java +++ b/test/jdk/java/security/cert/CertPathValidator/indirectCRL/CircularCRLOneLevelRevoked.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -33,11 +33,14 @@ * @bug 6720721 * @summary CRL check with circular depency support needed * @run main/othervm CircularCRLOneLevelRevoked + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -108,22 +111,19 @@ public class CircularCRLOneLevelRevoked { "oKLrE9+yCOkYUOpiRlz43/3vkEL5hjIKMcDSZnPKBZi1h16Yj2hPe9GMibNip54=\n" + "-----END X509 CRL-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; + Certificate targetCert = PEM_DECODER.decode(targetCertStr, X509Certificate.class); - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, selfSignedCert}); + List list = Arrays.asList(targetCert, selfSignedCert); return cf.generateCertPath(list); } @@ -131,35 +131,20 @@ public class CircularCRLOneLevelRevoked { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } private static CertStore generateCertificateStore() throws Exception { // generate CRL from CRL string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(crlStr.getBytes()); - - // generate a cert store - Collection crls = cf.generateCRLs(is); - - is = new ByteArrayInputStream(crlIssuerCertStr.getBytes()); - Collection certs = cf.generateCertificates(is); - - Collection entries = new HashSet(); - entries.addAll(crls); - entries.addAll(certs); + Collection entries = new HashSet<>(); + entries.add(PEM_DECODER.decode(crlStr, X509CRL.class)); + entries.add(PEM_DECODER.decode(crlIssuerCertStr, X509Certificate.class)); return CertStore.getInstance("Collection", new CollectionCertStoreParameters(entries)); diff --git a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithRID.java b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithRID.java index 34a15287f2d..d7dcfc6b6d5 100644 --- a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithRID.java +++ b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithRID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -26,11 +26,13 @@ * * @bug 6845286 * @summary Add regression test for name constraints + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -90,25 +92,21 @@ public class NameConstraintsWithRID { "FbcNIaCtg8blO5ImdOz5hAi+NuY=\n" + "-----END CERTIFICATE-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; + Certificate targetCert = PEM_DECODER.decode(targetCertStr, X509Certificate.class); - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); + Certificate subCaCert = PEM_DECODER.decode(subCaCertStr, X509Certificate.class); - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - Certificate subCaCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, subCaCert, selfSignedCert}); + List list = Arrays.asList(targetCert, subCaCert, selfSignedCert); return cf.generateCertPath(list); } @@ -116,15 +114,11 @@ public class NameConstraintsWithRID { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } diff --git a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithUnexpectedRID.java b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithUnexpectedRID.java index a493d6c7324..333e9b19f30 100644 --- a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithUnexpectedRID.java +++ b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithUnexpectedRID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -26,11 +26,13 @@ * * @bug 6845286 * @summary Add regression test for name constraints + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -90,41 +92,40 @@ public class NameConstraintsWithUnexpectedRID { "dcVScVdLUDeqE/3f+5yt1JPRuA==\n" + "-----END CERTIFICATE-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of() + ; private static CertPath generateCertificatePath() - throws CertificateException { + throws CertificateException, IOException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); ByteArrayInputStream is; is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); + Certificate targetCert = PEM_DECODER.decode(is, X509Certificate.class); is = new ByteArrayInputStream(subCaCertStr.getBytes()); - Certificate subCaCert = cf.generateCertificate(is); + Certificate subCaCert = PEM_DECODER.decode(is, X509Certificate.class); is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate selfSignedCert = PEM_DECODER.decode(is, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, subCaCert, selfSignedCert}); + List list = Arrays.asList(targetCert, subCaCert, selfSignedCert); return cf.generateCertPath(list); } private static Set generateTrustAnchors() - throws CertificateException { + throws IOException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(is, X509Certificate.class);; // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } diff --git a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithoutRID.java b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithoutRID.java index 0d11d767625..63b4f921e0e 100644 --- a/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithoutRID.java +++ b/test/jdk/java/security/cert/CertPathValidator/nameConstraints/NameConstraintsWithoutRID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -26,11 +26,13 @@ * * @bug 6845286 * @summary Add regression test for name constraints + * @enablePreview * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -90,25 +92,21 @@ public class NameConstraintsWithoutRID { "/A==\n" + "-----END CERTIFICATE-----"; + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + private static CertPath generateCertificatePath() throws CertificateException { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; + Certificate targetCert = PEM_DECODER.decode(targetCertStr, X509Certificate.class); - is = new ByteArrayInputStream(targetCertStr.getBytes()); - Certificate targetCert = cf.generateCertificate(is); + Certificate subCaCert = PEM_DECODER.decode(subCaCertStr, X509Certificate.class); - is = new ByteArrayInputStream(subCaCertStr.getBytes()); - Certificate subCaCert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate certification path - List list = Arrays.asList(new Certificate[] { - targetCert, subCaCert, selfSignedCert}); + List list = Arrays.asList(targetCert, subCaCert, selfSignedCert); return cf.generateCertPath(list); } @@ -116,15 +114,11 @@ public class NameConstraintsWithoutRID { private static Set generateTrustAnchors() throws CertificateException { // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(selfSignedCertStr.getBytes()); - Certificate selfSignedCert = cf.generateCertificate(is); + X509Certificate selfSignedCert = PEM_DECODER.decode(selfSignedCertStr, X509Certificate.class); // generate a trust anchor TrustAnchor anchor = - new TrustAnchor((X509Certificate)selfSignedCert, null); + new TrustAnchor(selfSignedCert, null); return Collections.singleton(anchor); } diff --git a/test/jdk/java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java b/test/jdk/java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java index c57abdf243d..58d3c37975a 100644 --- a/test/jdk/java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java +++ b/test/jdk/java/security/cert/CertPathValidator/trustAnchor/ValWithAnchorByName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 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 @@ -26,10 +26,13 @@ * @bug 8132926 * @summary PKIXParameters built with public key form of TrustAnchor causes * NPE during cert path building/validation + * @enablePreview * @run main ValWithAnchorByName */ import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.security.PEMDecoder; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.CertPath; @@ -232,9 +235,10 @@ public class ValWithAnchorByName { public static void main(String[] args) throws Exception { TrustAnchor anchor; CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate rootCert = generateCertificate(cf, ROOT_CA_CERT); - X509Certificate eeCert = generateCertificate(cf, EE_CERT); - X509Certificate intCaCert = generateCertificate(cf, INT_CA_CERT); + PEMDecoder pemDecoder = PEMDecoder.of(); + X509Certificate rootCert = pemDecoder.decode(ROOT_CA_CERT, X509Certificate.class); + X509Certificate eeCert = pemDecoder.decode(EE_CERT, X509Certificate.class); + X509Certificate intCaCert = pemDecoder.decode(INT_CA_CERT, X509Certificate.class); List certList = new ArrayList() {{ add(eeCert); add(intCaCert); @@ -283,10 +287,4 @@ public class ValWithAnchorByName { validator.validate(path, params); } - - private static X509Certificate generateCertificate(CertificateFactory cf, - String encoded) throws CertificateException { - ByteArrayInputStream is = new ByteArrayInputStream(encoded.getBytes()); - return (X509Certificate)cf.generateCertificate(is); - } } diff --git a/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java b/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java index 1b3aef8b0fe..6aec08deedd 100644 --- a/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java +++ b/test/jdk/javax/net/ssl/TLSCommon/TLSTest.java @@ -25,12 +25,10 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.security.KeyFactory; -import java.security.KeyStore; -import java.security.PrivateKey; -import java.security.Security; +import java.security.*; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; import java.util.concurrent.CountDownLatch; @@ -49,6 +47,7 @@ import javax.net.ssl.TrustManagerFactory; /* * @test * @bug 8205111 + * @enablePreview * @summary Test TLS with different types of supported keys. * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha1 TLS_AES_128_GCM_SHA256 * @run main/othervm -Djavax.net.debug=ssl,handshake TLSTest TLSv1.3 rsa_pkcs1_sha256 TLS_AES_128_GCM_SHA256 @@ -315,34 +314,27 @@ public class TLSTest { String trustedCertStr, String keyCertStr, String privateKey, String keyType) throws Exception { - // Generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + PEMDecoder pemDecoder = PEMDecoder.of(); // Create a key store KeyStore ts = KeyStore.getInstance("PKCS12"); KeyStore ks = KeyStore.getInstance("PKCS12"); ts.load(null, null); ks.load(null, null); - char passphrase[] = "passphrase".toCharArray(); + char[] passphrase = "passphrase".toCharArray(); // Import the trusted cert ts.setCertificateEntry("trusted-cert-" + keyType, - cf.generateCertificate(new ByteArrayInputStream( - trustedCertStr.getBytes()))); + pemDecoder.decode(trustedCertStr, X509Certificate.class)); boolean hasKeyMaterials = keyCertStr != null && privateKey != null; if (hasKeyMaterials) { // Generate the private key. - PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( - Base64.getMimeDecoder().decode(privateKey)); - KeyFactory kf = KeyFactory.getInstance(keyType); - PrivateKey priKey = kf.generatePrivate(priKeySpec); - + PrivateKey priKey = pemDecoder.decode(privateKey, PrivateKey.class); // Generate certificate chain - Certificate keyCert = cf.generateCertificate( - new ByteArrayInputStream(keyCertStr.getBytes())); - Certificate[] chain = new Certificate[]{keyCert}; + Certificate keyCert =pemDecoder.decode(keyCertStr, X509Certificate.class); + Certificate[] chain = new Certificate[]{keyCert}; // Import the key entry. ks.setKeyEntry("cert-" + keyType, priKey, passphrase, chain); @@ -422,9 +414,11 @@ public class TLSTest { // // Private key. // - "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVHQp1EG3PgASz7Nu\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgVHQp1EG3PgASz7Nu\n" + "uv9dvFLxsr3qfgC6CgZU4xorLbChRANCAARdc4XgHchFHqyzVKlx8Nlpl5zFSZyk\n" - + "jE3qvm5PVrGRgTmcyXBLcq9fPOyQEbq59Lieyd2C1DZTLh2klmfIRMRr" + + "jE3qvm5PVrGRgTmcyXBLcq9fPOyQEbq59Lieyd2C1DZTLh2klmfIRMRr\n" + + "-----END PRIVATE KEY-----" ), ecdsa_sha1( "EC", @@ -449,9 +443,11 @@ public class TLSTest { // // Private key. // - "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgyJJNI8eqYVKcCshG\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgyJJNI8eqYVKcCshG\n" + "t89mrRZ1jMeD8fAbgijAG7WfgtGhRANCAAR6LMO6lBGdmpo87XTjtA2vsXvq1kd8\n" - + "ktaIGEdCrA8BKk0A30LW8SY5Be29ScYu8d+IjQ3X/fpblrVh/64pOgQz" + + "ktaIGEdCrA8BKk0A30LW8SY5Be29ScYu8d+IjQ3X/fpblrVh/64pOgQz\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_pss_sha256( "RSASSA-PSS", @@ -487,7 +483,8 @@ public class TLSTest { // // Private key. // - "MIIEuwIBADALBgkqhkiG9w0BAQoEggSnMIIEowIBAAKCAQEApfK+EK4NuwWFDv9V\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEuwIBADALBgkqhkiG9w0BAQoEggSnMIIEowIBAAKCAQEApfK+EK4NuwWFDv9V\n" + "WtiMfEDxszf5b85irz+RX9uqLzVuL0VMevB8wIYYlrXJfj8C0myaia3hJE5ZXuz5\n" + "0QMqW8t3zu2QCtGN2Ih6rmgYO3fu2BYYR8L/IBtJWXMgNAZFxSR6nau+qmq9MRwu\n" + "g1Xs15tCt5nHHsphrRUfQc1pgI/uw2LEsL7U0O1jaEJn9HHQzEjO9SMGk8CML09s\n" @@ -512,7 +509,8 @@ public class TLSTest { + "ofaiiWffsaytVvotmT6+atElvAMbAua42V+nAQKBgHtIn3mYMHLriYGhQzpkFEA2\n" + "8YcAMlKppueOMAKVy8nLu2r3MidmLAhMiKJQKG45I3Yg0/t/25tXLiOPJlwrOebh\n" + "xQqUBI/JUOIpGAEnr48jhOXnCS+i+z294G5U/RgjXrlR4bCPvrtCmwzWwe0h79w2\n" - + "Q2hO5ZTW6UD9CVA85whf" + + "Q2hO5ZTW6UD9CVA85whf\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_rsae_sha256( "RSA", @@ -579,7 +577,8 @@ public class TLSTest { // // Private key. // - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD8nVjgSWSwVmP\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD8nVjgSWSwVmP\n" + "6wHXl+8cjESonTvCqSU1xLiySoqOH+/u5kTcg5uk7J9qr3sDpLLVmnB7lITrv3cx\n" + "X7GufAC2lrWPhKdY2/BTpCGP4Twg/sC7Z2MnAPNabmPh+BhpQA3PllULdnsV/aEK\n" + "eP3dFF+piJmSDKwowLhDc0wdD1t15jDk812UnNQugd465g0g6z57m3MFX1veUrya\n" @@ -604,7 +603,8 @@ public class TLSTest { + "j+4Sinm9qkHWc7ixKZdocRQjCriHrENSMy/FBNBBAoGAfi0ZGZxyIeik5qUBy+P+\n" + "+ce6n5/1kdczPTpzJae+eCPqg3VQuGz3NutZ2tdx1IMcYSeMfiB6xLMWSKSraxEi\n" + "2BCtdPcyUau8w12BXwn+hyK2u79OhHbexisrJUOVXE+yA8C/k0r0SrZHS0PHYZjj\n" - + "xkWyr/6XyeGP/vX8WvfF2eM=" + + "xkWyr/6XyeGP/vX8WvfF2eM=\n" + + "-----END PRIVATE KEY-----" ), rsa_pkcs1_sha1( "RSA", @@ -638,7 +638,8 @@ public class TLSTest { // // Private key. // - "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQClt40e4e/lW5S1\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQClt40e4e/lW5S1\n" + "4zFrkZrg3ZAOeYaTWkAa6EVUbtGiH/eRTeAnODRQey9zQFRY8cM6izBheJbfPN9r\n" + "ZN1SfL8R4XfHHDXS9udX4zWIOcrAMQxoK2KEFMcJ1F3cMFGQ1vIM+A4FTjObHl9m\n" + "Et6Pq0LQTPlX7JJw+1R7REJYSkxFm7h/lsr/8CScVxF4SZtO6/EMPoG2kSPylQlq\n" @@ -663,7 +664,8 @@ public class TLSTest { + "7qCBIYk8Nk9F7v+7M69NAfK97Dd5gzRsyL3sbFECgYBxz2nCKeBv2frxtD36nlY1\n" + "bDhZv1Asyxq0yt9GSkVWeHnSIFHfwBu3w6qW7+qdlQizu+6GZ3wq9dyyrXUA4zPU\n" + "QnYWYYk30p4uqLXFCrnscVOm3v7f51oEYVoEKjqGl2C/BTy7iSgCRd+cp6y34DsV\n" - + "PsRyQCB/QarxsDNAuioguQ==" + + "PsRyQCB/QarxsDNAuioguQ==\n" + + "-----END PRIVATE KEY-----" ), rsa_pkcs1_sha256( "RSA", @@ -697,7 +699,8 @@ public class TLSTest { // // Private key. // - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDaMM8YyiBz12rb\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDaMM8YyiBz12rb\n" + "Dlv4Uept9oY+iRGbI5uJTzL+X92qQzn0hX6qPxVBQjg22l0JNavXrzXbPgCNeuTk\n" + "cgGsQJ9Bsc9RybWuZ7lhVnRbFXT5R/KEOasbAMuGTEapzeE6FGuUXbB1d5R+MjOG\n" + "9L35L/jTX763+O+r5yoUXUEefNg676WduL+j3k6qjwyXCJGqDfHLd81F+peTsNbL\n" @@ -722,7 +725,8 @@ public class TLSTest { + "QFuQIMdYm9dJLZnOkxLXrOZoHeui0poX2Ya6FawhAoGAAI/QCyDbuvnJzGmjSbvl\n" + "5Ndr9lNAansCXaUzXuVLp6dD6PnB8HVCE8tdETZrcXseyTBeltaxAhj+tCybJvDO\n" + "sV8UmPR0w9ibExmUIVGX5BpoRlB/KWxEG3ar/wJbUZVZ2oSdIAZvCvdbN956SLDg\n" - + "Pg5M5wrRqs71s2EiIJd0HrU=" + + "Pg5M5wrRqs71s2EiIJd0HrU=\n" + + "-----END PRIVATE KEY-----" ), rsa_pkcs1_sha384( "RSA", @@ -756,7 +760,8 @@ public class TLSTest { // // Private key. // - "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC8iCdCvecakzP9\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQC8iCdCvecakzP9\n" + "BiSyTav5KmptGGI4Wejpz+TImZK7xNDTxFXwB3wJqWcAOQeU8GhOYKpjm/1o66ly\n" + "XX6MJ7t7iJ3Pggmy5jUpFT9SPiVhWo7VbvwfEiAp3eNtKAD3rbyUno2G/o6rIDwo\n" + "IicpugjwV0OZ1FXO74UKYYosG1RWc486TMzO22SuDujJSgJqBiLNktjyWFQDxF+D\n" @@ -781,7 +786,8 @@ public class TLSTest { + "jFP4YVofTd3ltSFI3x5pVZA2a88rE49gNkGWU9mReD0CgYEAkXoH6Sn+Elp6Oa+k\n" + "jF5jQ14RNH4SoBSFR8mY6jOIGzINTWiMCaBMiPusjkrq7SfgIM3iEeJWmgghlZdl\n" + "0ynmwThnfQnEEtsvpSMteI11eVrZrMGVZOhgALxf4zcmQCpPVQicNQLkocuAZSAo\n" - + "mzO1FvNUBCMZb/5PQdiFw3pMEyQ=" + + "mzO1FvNUBCMZb/5PQdiFw3pMEyQ=\n" + + "-----END PRIVATE KEY-----" ), rsa_pkcs1_sha512( "RSA", @@ -815,7 +821,8 @@ public class TLSTest { // // Private key. // - "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDaF4fhwBKMatza\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDaF4fhwBKMatza\n" + "KvqfimqhBLNPmaGVHz+IX/let8hJJud9k1mc+TZxNBIMPwc1tFP1u+2shhAhOsaB\n" + "RgoFPC3DJywzq/vr5MVaw8EdZufxufJ4awXGE1eytFdliKoPCiI8T4nxpNAy3haU\n" + "0FpmO3/0ERRjJPJnxzndZZoT1pITexDKe6Vnyu6GRz2FvJsQ7VR8BARYhj6dHRT1\n" @@ -840,7 +847,8 @@ public class TLSTest { + "K86SqEklQKYXAnUmZiESGQgjSn68llowSwTznZPhAoGBAMH2scnvGRbPmzm91pyY\n" + "1loeejtO8qWQsRFaSZyqtlW1c/zHaotTU1XhmVxnliv/HCb3t7qlssb3snCTUY9R\n" + "mcyMWbaTIBMNfW2IspX4hhkLuCwzhskl/08/8GJwkOEAo3q/TYigyFPVEwq8R9uq\n" - + "l0uEakWMhPrvr/N1FT1KXo6S" + + "l0uEakWMhPrvr/N1FT1KXo6S\n" + + "-----END PRIVATE KEY-----" ), ecdsa_secp384r1_sha384( "EC", @@ -867,10 +875,12 @@ public class TLSTest { // // Private key. // - "MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCpxyn85BJ+JFfT5U7U\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCpxyn85BJ+JFfT5U7U\n" + "VY+c8v2oY873YOVussMDiC82VYGKZDZH8D6C6h0b33iCpm2hZANiAAR5esh3fLL/\n" + "SYk81dcZeUxJAS8ilLIMJwopB3ZmbWq3SADUdRIe6V9K3IdQjoOX+ljuJHTA7/Fg\n" - + "haGKuapP5dtU9NYglvbjkt/0YWJH93pTJRupe42D0amdRGzLlmHHgN8=" + + "haGKuapP5dtU9NYglvbjkt/0YWJH93pTJRupe42D0amdRGzLlmHHgN8=\n" + + "-----END PRIVATE KEY-----" ), ecdsa_secp521r1_sha512( "EC", @@ -898,12 +908,14 @@ public class TLSTest { // // Private key. // - "MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAz7qc9msPhSoh0iiT\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAz7qc9msPhSoh0iiT\n" + "Z0146/sLJL5K+JNo2KdKpZOf1mS/egCCbp7lndigL7jr0JnBRIjk+pmeBtIId6mW\n" + "MrcvF4KhgYkDgYYABACzWmHHe0hLD4bYcDyvhl+VDdD/mj1TnN4XPv0+woQ9KwTX\n" + "GEZtTJYNqwFJ5Qo69WyWLm9jLSF07XfZDs2X5AA1QQBFjZrHkRFcgkFj1L49F0/s\n" + "4bh+v3rpG/y9oITaDylX02cC1qU3eyTyIIR1VS2G8v1HqeimIR3sXP1IxEY5K7Xw\n" - + "Vg==" + + "Vg==\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_rsae_sha384( "RSA", @@ -970,7 +982,8 @@ public class TLSTest { // // Private key. // - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCe7chGqR+iYpXW\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCe7chGqR+iYpXW\n" + "HDWK0LZVff4XDc/dS0CloNQr6GAa/Gb7p37vkjWStk5BKpRg1SNZtssFNEOXR4ph\n" + "jFf3boUQ7A1i9e+eYJAmbGalwwotY1zxdr5kfaWYxIiMSaPHHwPfe/pnY1RF6lOs\n" + "LlegPw6xxg08LETaU+M9QCJ9EodXDEb19/KwINer/Cduou7TdVDFPYY02lMoj7Wr\n" @@ -995,7 +1008,8 @@ public class TLSTest { + "xd/NBqsx/vHpxxxeekBfu8rhI1h7M7XLBHL4s30CgYEAnmwpLxK36H4fyg3FT5uS\n" + "nCJuWFIP8LvWaPm8iDUJ45flOPbXokoV+UZbe7A+TK6tdyTXtfoM59/IsLtiEp7n\n" + "VuE9osST2ZOTD+l10ukIcjJJgI/Pwjtd36EGXyGftdAtT4sFMRxP4sGSXZodqHrZ\n" - + "T9fE4yY/E4FyzS7yMeoXIyo=" + + "T9fE4yY/E4FyzS7yMeoXIyo=\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_rsae_sha512( "RSA", @@ -1062,7 +1076,8 @@ public class TLSTest { // // Private key. // - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCyeGmgpaHoXnR\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCyeGmgpaHoXnR\n" + "csuhMhzsoinxDqSCHfJB62g0HuZDpZG3yjlEU9zVTLeuCtWsrQnC0LCaNODjjvE9\n" + "vI1tbY5L7B1pz3JNHrASzituzd3vPNlKjX5fEUG4dBEOIx0UvwTDlf8taL897aLR\n" + "mUHKE29qPV3Xo80M794CdQsUSq/sNQDkE1qFm7MAmznXTS++RUqtofyz4W570KBw\n" @@ -1087,7 +1102,8 @@ public class TLSTest { + "+LAfJE/tRliLHYDfAyRnjoZn2bPZQr8Qroj5+xydAoGACHEc7aoEwZ/z8cnrHuoT\n" + "T0QUw6HNlic5FgK+bZy7SXj9SqJBkWADzRJ/tVDopWT/EiDiGeqNP/uBPYt6i7m2\n" + "SoqCLYdGDIbUFyDQg3zC48IXlHyEF3whx0bg/0hoKs/E/rXuxYIH/10aEwmb0FQO\n" - + "GA3T726uW8XrrTssMkhzixU=" + + "GA3T726uW8XrrTssMkhzixU=\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_pss_sha384( "RSASSA-PSS", @@ -1123,7 +1139,8 @@ public class TLSTest { // // Private key. // - "MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAz+1/SVKdaz83Mcs6\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAz+1/SVKdaz83Mcs6\n" + "RzkuIyZvwDoYCQubniueMJ/mcMSJOIQIxxgxrFCH8cw5jFu5wsb5sPwVdMXwKgnS\n" + "0WHdSHfXDLjYj2Ig7vywtdKzEW3RZdBkL52qlxi29BCREyYhFomHppY7MK+BN4c3\n" + "ipOmdnVw+FoVJfTPuAAoweYRg01A9LCmDDLY0X89U1VLYJ286hzHNHWRWOwVQiKD\n" @@ -1148,7 +1165,8 @@ public class TLSTest { + "MZwdpuKcfsysbPZhnaoBHc5kf6lNBreahd+PfQKBgQDzZHFUndVfI28zn10ZzY8M\n" + "zVeUMn+m1Dhp/e4F0t3XPTWCkwlYI3bk0k5BWHYSdLb2R7gKhTMynxPUb53oeY6P\n" + "Pt/tA+dbjGHPx+v98wOorsD28qH0WG/V1xQdGRA9/dDZtJDolLqNn2B3t0QH9Kco\n" - + "LsJldTLzMQSVP/05BAt6DQ==" + + "LsJldTLzMQSVP/05BAt6DQ==\n" + + "-----END PRIVATE KEY-----" ), rsa_pss_pss_sha512( "RSASSA-PSS", @@ -1184,7 +1202,8 @@ public class TLSTest { // // Private key. // - "MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAxv/aW7ezE+gXt2lI\n" + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvAIBADALBgkqhkiG9w0BAQoEggSoMIIEpAIBAAKCAQEAxv/aW7ezE+gXt2lI\n" + "PeFSkPQTKIy2IwQ8zO23f8tO/i33XeuyFIUOVZCXMYLO0LW/M7Z1CUBM8iwZHGQP\n" + "4b76S1FyVD91IrETVddjAXx1HBQFTd96XZu1/1CQ1WnVGUwH3uj1CLpP/maTpk58\n" + "BP7BH4QmQLTcJvtPBHcrFISvWlZfN7wvnhI9tufOFc3dn0I/WGFNYTdDilr2r6x7\n" @@ -1209,7 +1228,8 @@ public class TLSTest { + "qckcE14nt7o5rlcHNwLQ0o8h+IHxBnZdXernwQKBgQCunOWvYd7MGlIjpkl6roq7\n" + "MrQ/zaAkUyGsTgBxEu3p5+x2ENG6SukEtHGGDE6TMxlcKdTSohL2lXZX2AkP+eXf\n" + "sF3h66iQ8DrGrYoyCgx3KTx3G+KPfblAqwDMTqj2G5fAeWDwXrpEacpTXiFZvNAn\n" - + "KtqEurWf+mUeJVzLj1x1BA==" + + "KtqEurWf+mUeJVzLj1x1BA==\n" + + "-----END PRIVATE KEY-----" ); private final String keyType; diff --git a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilder.java b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilder.java index 0037ac7bad6..91ea3533cb8 100644 --- a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilder.java +++ b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -29,6 +29,7 @@ * * @bug 6861062 * @summary Disable MD2 support + * @enablePreview * * @run main/othervm CPBuilder trustAnchor_SHA1withRSA_1024 0 true * @run main/othervm CPBuilder trustAnchor_SHA1withRSA_512 0 true @@ -48,14 +49,16 @@ * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; public class CPBuilder { + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + // SHA1withRSA 1024 static String trustAnchor_SHA1withRSA_1024 = "-----BEGIN CERTIFICATE-----\n" + @@ -321,35 +324,27 @@ public class CPBuilder { private static Set generateTrustAnchors() throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + HashSet anchors = new HashSet(); - ByteArrayInputStream is = - new ByteArrayInputStream(trustAnchor_SHA1withRSA_1024.getBytes()); - Certificate cert = cf.generateCertificate(is); - TrustAnchor anchor = new TrustAnchor((X509Certificate)cert, null); + // generate certificate from certificate string + X509Certificate cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_1024, X509Certificate.class); + TrustAnchor anchor = new TrustAnchor(cert, null); anchors.add(anchor); - is = new ByteArrayInputStream(trustAnchor_SHA1withRSA_512.getBytes()); - cert = cf.generateCertificate(is); - anchor = new TrustAnchor((X509Certificate)cert, null); + cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_512, X509Certificate.class); + anchor = new TrustAnchor(cert, null); anchors.add(anchor); return anchors; } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); - - // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + Collection entries = new HashSet<>(); for (String key : certmap.keySet()) { String certStr = certmap.get(key); - ByteArrayInputStream is = - new ByteArrayInputStream(certStr.getBytes()); - Certificate cert = cf.generateCertificate(is); + DEREncodable cert = PEM_DECODER.decode(certStr, X509Certificate.class); entries.add(cert); } @@ -367,9 +362,7 @@ public class CPBuilder { } // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = new ByteArrayInputStream(certStr.getBytes()); - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(certStr, X509Certificate.class); selector.setCertificate(target); @@ -386,9 +379,7 @@ public class CPBuilder { } // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = new ByteArrayInputStream(certStr.getBytes()); - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(certStr, X509Certificate.class); return target.equals(cert); } diff --git a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilderWithMD5.java b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilderWithMD5.java index 9785b270299..036a9634469 100644 --- a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilderWithMD5.java +++ b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPBuilderWithMD5.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ * * @bug 8030829 * @summary Add MD5 to jdk.certpath.disabledAlgorithms security property + * @enablePreview * * @run main/othervm CPBuilderWithMD5 trustAnchor_SHA1withRSA_1024 0 true * @run main/othervm CPBuilderWithMD5 trustAnchor_SHA1withRSA_512 0 true @@ -53,14 +54,15 @@ * certificates used in this test are generated by an updated generate.sh that * replacing MD2 with MD5 algorithm. */ -import java.io.*; -import java.net.SocketException; +import java.security.DEREncodable; +import java.security.PEMDecoder; import java.util.*; -import java.security.Security; import java.security.cert.*; public class CPBuilderWithMD5 { + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + // SHA1withRSA 1024 static String trustAnchor_SHA1withRSA_1024 = "-----BEGIN CERTIFICATE-----\n" + @@ -326,35 +328,30 @@ public class CPBuilderWithMD5 { private static Set generateTrustAnchors() throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + HashSet anchors = new HashSet(); - ByteArrayInputStream is = - new ByteArrayInputStream(trustAnchor_SHA1withRSA_1024.getBytes()); - Certificate cert = cf.generateCertificate(is); + // generate certificate from certificate string + X509Certificate cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_1024, X509Certificate.class); TrustAnchor anchor = new TrustAnchor((X509Certificate)cert, null); anchors.add(anchor); - is = new ByteArrayInputStream(trustAnchor_SHA1withRSA_512.getBytes()); - cert = cf.generateCertificate(is); - anchor = new TrustAnchor((X509Certificate)cert, null); + cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_512, X509Certificate.class); + anchor = new TrustAnchor(cert, null); anchors.add(anchor); return anchors; } private static CertStore generateCertificateStore() throws Exception { - Collection entries = new HashSet(); + Collection entries = new HashSet<>(); // generate certificate from certificate string CertificateFactory cf = CertificateFactory.getInstance("X.509"); for (String key : certmap.keySet()) { String certStr = certmap.get(key); - ByteArrayInputStream is = - new ByteArrayInputStream(certStr.getBytes()); - Certificate cert = cf.generateCertificate(is); + DEREncodable cert = PEM_DECODER.decode(certStr, X509Certificate.class); entries.add(cert); } @@ -372,9 +369,7 @@ public class CPBuilderWithMD5 { } // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = new ByteArrayInputStream(certStr.getBytes()); - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(certStr, X509Certificate.class); selector.setCertificate(target); @@ -391,9 +386,7 @@ public class CPBuilderWithMD5 { } // generate certificate from certificate string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is = new ByteArrayInputStream(certStr.getBytes()); - X509Certificate target = (X509Certificate)cf.generateCertificate(is); + X509Certificate target = PEM_DECODER.decode(certStr, X509Certificate.class); return target.equals(cert); } diff --git a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorEndEntity.java b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorEndEntity.java index bd43bde75e4..aa19bc2f0c8 100644 --- a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorEndEntity.java +++ b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorEndEntity.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -31,12 +31,14 @@ * @summary Disable MD2 support. * New CertPathValidatorException.BasicReason enum constant for * constrained algorithm. + * @enablePreview * @run main/othervm CPValidatorEndEntity * @author Xuelei Fan */ import java.io.*; import java.net.SocketException; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -44,6 +46,8 @@ import java.security.cert.CertPathValidatorException.*; public class CPValidatorEndEntity { + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + // SHA1withRSA 1024 static String trustAnchor_SHA1withRSA_1024 = "-----BEGIN CERTIFICATE-----\n" + @@ -278,38 +282,28 @@ public class CPValidatorEndEntity { private static CertPath generateCertificatePath(String castr, String eestr) throws CertificateException { // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is; - - is = new ByteArrayInputStream(castr.getBytes()); - Certificate cacert = cf.generateCertificate(is); - - is = new ByteArrayInputStream(eestr.getBytes()); - Certificate eecert = cf.generateCertificate(is); + Certificate cacert = PEM_DECODER.decode(castr, X509Certificate.class); + Certificate eecert = PEM_DECODER.decode(eestr, X509Certificate.class); // generate certification path List list = Arrays.asList(new Certificate[] { eecert, cacert}); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); return cf.generateCertPath(list); } private static Set generateTrustAnchors() throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + HashSet anchors = new HashSet(); - ByteArrayInputStream is = - new ByteArrayInputStream(trustAnchor_SHA1withRSA_1024.getBytes()); - Certificate cert = cf.generateCertificate(is); - TrustAnchor anchor = new TrustAnchor((X509Certificate)cert, null); + X509Certificate cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_1024, X509Certificate.class); + TrustAnchor anchor = new TrustAnchor(cert, null); anchors.add(anchor); - is = new ByteArrayInputStream(trustAnchor_SHA1withRSA_512.getBytes()); - cert = cf.generateCertificate(is); - anchor = new TrustAnchor((X509Certificate)cert, null); + cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_512, X509Certificate.class); + anchor = new TrustAnchor(cert, null); anchors.add(anchor); return anchors; diff --git a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorIntermediate.java b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorIntermediate.java index d7d0fe69f23..72dff1694b1 100644 --- a/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorIntermediate.java +++ b/test/jdk/sun/security/provider/certpath/DisabledAlgorithms/CPValidatorIntermediate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 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 @@ -31,12 +31,12 @@ * @summary Disable MD2 support * new CertPathValidatorException.BasicReason enum constant for * constrained algorithm + * @enablePreview * @run main/othervm CPValidatorIntermediate * @author Xuelei Fan */ -import java.io.*; -import java.net.SocketException; +import java.security.PEMDecoder; import java.util.*; import java.security.Security; import java.security.cert.*; @@ -44,6 +44,8 @@ import java.security.cert.CertPathValidatorException.*; public class CPValidatorIntermediate { + private static final PEMDecoder PEM_DECODER = PEMDecoder.of(); + // SHA1withRSA 1024 static String trustAnchor_SHA1withRSA_1024 = "-----BEGIN CERTIFICATE-----\n" + @@ -183,10 +185,7 @@ public class CPValidatorIntermediate { // generate certificate from cert strings CertificateFactory cf = CertificateFactory.getInstance("X.509"); - ByteArrayInputStream is; - - is = new ByteArrayInputStream(certStr.getBytes()); - Certificate cert = cf.generateCertificate(is); + Certificate cert = PEM_DECODER.decode(certStr, X509Certificate.class); // generate certification path List list = Arrays.asList(new Certificate[] {cert}); @@ -196,19 +195,15 @@ public class CPValidatorIntermediate { private static Set generateTrustAnchors() throws CertificateException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - HashSet anchors = new HashSet(); - ByteArrayInputStream is = - new ByteArrayInputStream(trustAnchor_SHA1withRSA_1024.getBytes()); - Certificate cert = cf.generateCertificate(is); - TrustAnchor anchor = new TrustAnchor((X509Certificate)cert, null); + HashSet anchors = new HashSet(); + // generate certificate from cert string + X509Certificate cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_1024, X509Certificate.class); + TrustAnchor anchor = new TrustAnchor(cert, null); anchors.add(anchor); - is = new ByteArrayInputStream(trustAnchor_SHA1withRSA_512.getBytes()); - cert = cf.generateCertificate(is); - anchor = new TrustAnchor((X509Certificate)cert, null); + cert = PEM_DECODER.decode(trustAnchor_SHA1withRSA_512, X509Certificate.class); + anchor = new TrustAnchor(cert, null); anchors.add(anchor); return anchors; diff --git a/test/jdk/sun/security/ssl/X509TrustManagerImpl/PKIXExtendedTM.java b/test/jdk/sun/security/ssl/X509TrustManagerImpl/PKIXExtendedTM.java index fcc7cbf73f0..28f9f8e1f19 100644 --- a/test/jdk/sun/security/ssl/X509TrustManagerImpl/PKIXExtendedTM.java +++ b/test/jdk/sun/security/ssl/X509TrustManagerImpl/PKIXExtendedTM.java @@ -30,6 +30,7 @@ * @test * @bug 6916074 8170131 * @summary Add support for TLS 1.2 + * @enablePreview * @run main/othervm PKIXExtendedTM 0 * @run main/othervm PKIXExtendedTM 1 * @run main/othervm PKIXExtendedTM 2 @@ -38,12 +39,14 @@ import java.io.*; import javax.net.ssl.*; +import java.security.PEMDecoder; import java.security.Security; import java.security.KeyStore; import java.security.KeyFactory; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.CertPathValidatorException; +import java.security.cert.X509Certificate; import java.security.spec.*; import java.security.interfaces.*; import java.math.BigInteger; @@ -904,7 +907,7 @@ public class PKIXExtendedTM { (byte)0x4f }; - static char passphrase[] = "passphrase".toCharArray(); + static char[] passphrase = "passphrase".toCharArray(); /* * Is the server ready to serve? @@ -999,13 +1002,9 @@ public class PKIXExtendedTM { String keyCertStr, byte[] modulus, byte[] privateExponent, char[] passphrase) throws Exception { + PEMDecoder pemDecoder = PEMDecoder.of(); // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); - is.close(); + Certificate trusedCert = pemDecoder.decode(trusedCertStr, X509Certificate.class); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); @@ -1024,9 +1023,7 @@ public class PKIXExtendedTM { (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain - is = new ByteArrayInputStream(keyCertStr.getBytes()); - Certificate keyCert = cf.generateCertificate(is); - is.close(); + Certificate keyCert = pemDecoder.decode(keyCertStr, X509Certificate.class); Certificate[] chain = new Certificate[2]; chain[0] = keyCert; diff --git a/test/jdk/sun/security/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java b/test/jdk/sun/security/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java index f95aee76dab..13491bebe22 100644 --- a/test/jdk/sun/security/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java +++ b/test/jdk/sun/security/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -30,10 +30,13 @@ * @test * @bug 6916074 * @summary Add support for TLS 1.2 + * @enablePreview * @run main/othervm SunX509ExtendedTM */ import java.net.*; +import java.security.PEMDecoder; +import java.security.cert.X509Certificate; import java.util.*; import java.io.*; import javax.net.ssl.*; @@ -997,13 +1000,10 @@ public class SunX509ExtendedTM { String keyCertStr, byte[] modulus, byte[] privateExponent, char[] passphrase) throws Exception { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); + PEMDecoder pemDecoder = PEMDecoder.of(); - ByteArrayInputStream is = - new ByteArrayInputStream(trusedCertStr.getBytes()); - Certificate trusedCert = cf.generateCertificate(is); - is.close(); + // generate certificate from cert string + Certificate trusedCert = pemDecoder.decode(trusedCertStr, X509Certificate.class); // create a key store KeyStore ks = KeyStore.getInstance("JKS"); @@ -1022,9 +1022,7 @@ public class SunX509ExtendedTM { (RSAPrivateKey)kf.generatePrivate(priKeySpec); // generate certificate chain - is = new ByteArrayInputStream(keyCertStr.getBytes()); - Certificate keyCert = cf.generateCertificate(is); - is.close(); + Certificate keyCert = pemDecoder.decode(keyCertStr, X509Certificate.class); Certificate[] chain = new Certificate[2]; chain[0] = keyCert; From 0555f6228c59c6739b8b824d64eb6c1545a5520a Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 4 Nov 2025 19:44:04 +0000 Subject: [PATCH 446/561] 8371094: --mac-signing-key-user-name no longer works Reviewed-by: almatvee --- .../jdk/jpackage/internal/SigningIdentityBuilder.java | 4 +++- test/jdk/tools/jpackage/macosx/MacSignTest.java | 7 +++++++ test/jdk/tools/jpackage/macosx/base/SigningBase.java | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/SigningIdentityBuilder.java b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/SigningIdentityBuilder.java index 119d7797453..bf8f1519fe1 100644 --- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/SigningIdentityBuilder.java +++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/SigningIdentityBuilder.java @@ -113,14 +113,16 @@ final class SigningIdentityBuilder { final var signingIdentityNames = certificateSelector.signingIdentities(); + // Look up for the exact match. var matchingCertificates = mappedCertficates.stream().filter(e -> { return signingIdentityNames.contains(e.getKey()); }).map(Map.Entry::getValue).toList(); if (matchingCertificates.isEmpty()) { + // No exact matches found, look up for substrings. matchingCertificates = mappedCertficates.stream().filter(e -> { return signingIdentityNames.stream().anyMatch(filter -> { - return filter.startsWith(e.getKey()); + return e.getKey().startsWith(filter); }); }).map(Map.Entry::getValue).toList(); } diff --git a/test/jdk/tools/jpackage/macosx/MacSignTest.java b/test/jdk/tools/jpackage/macosx/MacSignTest.java index f5f8b3825cc..014fbc84548 100644 --- a/test/jdk/tools/jpackage/macosx/MacSignTest.java +++ b/test/jdk/tools/jpackage/macosx/MacSignTest.java @@ -184,6 +184,7 @@ public class MacSignTest { @Test @ParameterSupplier + @ParameterSupplier("testSelectSigningIdentity_JDK_8371094") public static void testSelectSigningIdentity(String signingKeyUserName, CertificateRequest certRequest) { MacSign.withKeychain(keychain -> { @@ -207,6 +208,12 @@ public class MacSignTest { }).toList(); } + public static Collection testSelectSigningIdentity_JDK_8371094() { + return List.of(new Object[] { + "ACME Technologies Limited", SigningBase.StandardCertificateRequest.CODESIGN_ACME_TECH_LTD.spec() + }); + } + enum SignOption { EXPIRED_SIGNING_KEY_USER_NAME("--mac-signing-key-user-name", SigningBase.StandardCertificateRequest.CODESIGN_EXPIRED.spec(), true, false), EXPIRED_SIGNING_KEY_USER_NAME_PKG("--mac-signing-key-user-name", SigningBase.StandardCertificateRequest.PKG_EXPIRED.spec(), true, false), diff --git a/test/jdk/tools/jpackage/macosx/base/SigningBase.java b/test/jdk/tools/jpackage/macosx/base/SigningBase.java index 1e38f9b0c29..b1a709c9cf0 100644 --- a/test/jdk/tools/jpackage/macosx/base/SigningBase.java +++ b/test/jdk/tools/jpackage/macosx/base/SigningBase.java @@ -68,6 +68,7 @@ public class SigningBase { public enum StandardCertificateRequest { CODESIGN(cert().userName(DEV_NAMES[CertIndex.ASCII_INDEX.value()])), CODESIGN_COPY(cert().days(100).userName(DEV_NAMES[CertIndex.ASCII_INDEX.value()])), + CODESIGN_ACME_TECH_LTD(cert().days(100).userName("ACME Technologies Limited (ABC12345)")), PKG(cert().type(CertificateType.INSTALLER).userName(DEV_NAMES[CertIndex.ASCII_INDEX.value()])), PKG_COPY(cert().type(CertificateType.INSTALLER).days(100).userName(DEV_NAMES[CertIndex.ASCII_INDEX.value()])), CODESIGN_UNICODE(cert().userName(DEV_NAMES[CertIndex.UNICODE_INDEX.value()])), @@ -101,7 +102,8 @@ public class SigningBase { StandardCertificateRequest.CODESIGN, StandardCertificateRequest.PKG, StandardCertificateRequest.CODESIGN_UNICODE, - StandardCertificateRequest.PKG_UNICODE), + StandardCertificateRequest.PKG_UNICODE, + StandardCertificateRequest.CODESIGN_ACME_TECH_LTD), /** * A keychain with some good and some expired certificates. */ From 325082302266f25d4fac33d0d4a9492c72de3ffc Mon Sep 17 00:00:00 2001 From: Roger Riggs Date: Tue, 4 Nov 2025 20:40:38 +0000 Subject: [PATCH 447/561] 8364361: [process] java.lang.Process should implement Closeable Reviewed-by: lancea, darcy, naoto, jpai, alanb, prappo --- .../share/classes/java/lang/Process.java | 140 +++- .../lang/snippet-files/ProcessExamples.java | 51 ++ .../java/lang/Process/ProcessCloseTest.java | 760 ++++++++++++++++++ 3 files changed, 945 insertions(+), 6 deletions(-) create mode 100644 src/java.base/share/classes/java/lang/snippet-files/ProcessExamples.java create mode 100644 test/jdk/java/lang/Process/ProcessCloseTest.java diff --git a/src/java.base/share/classes/java/lang/Process.java b/src/java.base/share/classes/java/lang/Process.java index 577ee538326..8aef43fe6c9 100644 --- a/src/java.base/share/classes/java/lang/Process.java +++ b/src/java.base/share/classes/java/lang/Process.java @@ -85,7 +85,29 @@ import java.util.stream.Stream; *

          As of 1.5, {@link ProcessBuilder#start()} is the preferred way * to create a {@code Process}. * - *

          Subclasses of Process should override the {@link #onExit()} and + *

          Subclasses of Process should ensure that each overridden method + * invokes the superclass method. + * For example, if {@linkplain #close() close} is overridden, the subclass should + * ensure that {@code Process.close()} is called. + * {@snippet lang = "java" : + * public class LoggingProcess extends java.lang.Process { + * ... + * @Override + * public void close() throws IOException { + * try { + * super.close(); + * } catch (IOException ex) { + * LOGGER.log(ex); +* } finally { + * LOGGER.log("process closed"); + * } + * } + * ... + * } + * } + * + *

          Subclasses of Process that wrap another Process instance + * should override and delegate the {@link #onExit()} and * {@link #toHandle()} methods to provide a fully functional Process including the * {@linkplain #pid() process id}, * {@linkplain #info() information about the process}, @@ -99,7 +121,9 @@ import java.util.stream.Stream; * process and for the communication streams between them. * The resources to control the process and for communication between the processes are retained * until there are no longer any references to the Process or the input, error, and output streams - * or readers, or they have been closed. + * or readers, or they have been closed. The Process {@linkplain Process#close close} method closes + * all the streams and terminates the process to release the resources. Using try-with-resources + * will ensure the process is terminated when the try-with-resources block exits. * *

          The process is not killed when there are no more references to the {@code Process} object, * but rather the process continues executing asynchronously. @@ -107,15 +131,15 @@ import java.util.stream.Stream; * that are no longer referenced to prevent leaking operating system resources. * Processes that have terminated or been terminated are monitored and their resources released. * - *

          Streams should be {@code closed} when they are no longer needed, to avoid delaying + *

          Streams should be closed when they are no longer needed, to avoid delaying * releasing the operating system resources. * {@code Try-with-resources} can be used to open and close the streams. *

          For example, to capture the output of a program known to produce some output and then exit: * {@snippet lang = "java" : * List capture(List args) throws Exception { * ProcessBuilder pb = new ProcessBuilder(args); - * Process process = pb.start(); - * try (BufferedReader in = process.inputReader()) { + * try (Process process = pb.start(); + * BufferedReader in = process.inputReader()) { * List captured = in.readAllLines(); * int status = process.waitFor(); * if (status != 0) { @@ -139,7 +163,7 @@ import java.util.stream.Stream; * * @since 1.0 */ -public abstract class Process { +public abstract class Process implements Closeable { // Readers and Writers created for this process; so repeated calls return the same object // All updates must be done while synchronized on this Process. @@ -149,12 +173,116 @@ public abstract class Process { private Charset inputCharset; private BufferedReader errorReader; private Charset errorCharset; + private boolean closed; // true if close() has been called /** * Default constructor for Process. */ public Process() {} + /** + * Closes all reader and writer streams and waits for the process to terminate. + * This method is idempotent, if this {@code Process} has already been closed + * invoking this method has no effect. + *

          + * If the data from the process input or error streams is needed, it must be read before + * calling this method. The contents of streams that have not been read to end of stream + * are lost, they are discarded or ignored. + *

          + * If the process exit value is of interest, then the caller must + * {@linkplain #waitFor() wait for} the process to terminate before calling this method. + *

          + * Streams should be closed when no longer needed. + * Closing an already closed stream usually has no effect but is specific to the stream. + * If an {@code IOException} occurs when closing a stream it is thrown + * after the process has terminated. + * Exceptions thrown by closing the streams, if any, are added to the first + * {@code IOException} as {@linkplain IOException#addSuppressed suppressed exceptions}. + *

          + * After the streams are closed this method {@linkplain #waitFor() waits for} the + * process to terminate. If {@linkplain Thread#interrupt interrupted} while waiting + * the process is {@linkplain #destroyForcibly() forcibly destroyed} and + * this method continues to wait for the process to terminate. + * The interrupted status is re-asserted before this method returns or + * any {@code IOExceptions} are thrown. + * @apiNote + * Try-with-resources example to write text to a process, read back the + * response, and close the streams and process: + * {@snippet file="ProcessExamples.java" region=example} + * + * @implNote + * Concrete implementations that override this class are strongly encouraged to + * override this method and invoke the superclass {@code close} method. + * + * @implSpec + * This method closes the process I/O streams and then + * {@linkplain #waitFor() waits for} the process to terminate. + * If {@link #waitFor() waitFor()} is {@linkplain Thread#interrupt() interrupted} + * the process is {@linkplain #destroyForcibly() forcibly destroyed} + * and then {@code close()} waits for the process to terminate. + * @throws IOException if closing any of the streams throws an exception + * @since 26 + */ + @Override + public void close() throws IOException { + synchronized(this) { + if (closed) { + return; + } + closed = true; + // Close each stream + IOException ioe = quietClose(outputWriter != null ? outputWriter : getOutputStream(), null); + ioe = quietClose(inputReader != null ? inputReader : getInputStream(), ioe); + ioe = quietClose(errorReader != null ? errorReader : getErrorStream(), ioe); + + // Wait for the process to terminate + // If waitFor is interrupted, destroy the process + // Continue waiting indefinitely for the process to terminate + if (!tryWait()) { + destroyForcibly(); + while (!tryWait()) { + continue; + } + // Re-assert the interrupted status + Thread.currentThread().interrupt(); + } + if (ioe != null) { + throw ioe; + } + } + } + + // Try to wait for the process to terminate. + // Return true if the process has terminated, false if wait is interrupted. + private boolean tryWait() { + try { + waitFor(); + return true; + } catch (InterruptedException ie) { + return false; + } + } + + // Quietly close. + // If an IOException occurs, and it is the first, return it. + // If there is no first IOException, a first IOException is created with the Throwable. + // Otherwise, add the Throwable as a suppressed exception to the first. + private static IOException quietClose(Closeable c, IOException firstIOE) { + try { + c.close(); + return firstIOE; + } catch (Throwable th) { + if (firstIOE == null && th instanceof IOException ioe) { + return ioe; + } else if (firstIOE == null) { + firstIOE = new IOException(th); + } else { + firstIOE.addSuppressed(th); + } + return firstIOE; + } + } + /** * Returns the output stream connected to the normal input of the * process. Output to the stream is piped into the standard diff --git a/src/java.base/share/classes/java/lang/snippet-files/ProcessExamples.java b/src/java.base/share/classes/java/lang/snippet-files/ProcessExamples.java new file mode 100644 index 00000000000..99ea32afff3 --- /dev/null +++ b/src/java.base/share/classes/java/lang/snippet-files/ProcessExamples.java @@ -0,0 +1,51 @@ +/* + * 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. + */ + +public class ProcessExamples { + // @start region=example + void main() { + try (Process p = new ProcessBuilder("cat").start(); + var writer = p.outputWriter(); + var reader = p.inputReader()) { + writer.write(haiku); + writer.close(); + // Read all lines and print each + reader.readAllLines() + .forEach(IO::println); + var status = p.waitFor(); + if (status != 0) + throw new RuntimeException("unexpected process status: " + status); + } catch (Exception e) { + System.out.println("Process failed: " + e); + } + } + + static final String haiku = """ + Oh, the sunrise glow; + Paddling with the river flow; + Chilling still, go slow. + """; + // @end region=example +} diff --git a/test/jdk/java/lang/Process/ProcessCloseTest.java b/test/jdk/java/lang/Process/ProcessCloseTest.java new file mode 100644 index 00000000000..3e4040b62f1 --- /dev/null +++ b/test/jdk/java/lang/Process/ProcessCloseTest.java @@ -0,0 +1,760 @@ +/* + * 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. + * + * 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 jdk.java.lang.Process; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.FilterInputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.Reader; +import java.io.UncheckedIOException; +import java.io.Writer; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.stream.Stream; + +/* + * @test + * @bug 8364361 + * @summary Tests for Process.close + * @modules java.base/java.lang:+open java.base/java.io:+open + * @run junit jdk.java.lang.Process.ProcessCloseTest + */ +public class ProcessCloseTest { + + private final static boolean OS_WINDOWS = System.getProperty("os.name").startsWith("Windows"); + private final static String CAT_PROGRAM = "cat"; + public static final String FORCED_CLOSE_MSG = "Forced close"; + private static List JAVA_ARGS; + + private static List setupJavaEXE() { + String JAVA_HOME = System.getProperty("test.jdk"); + if (JAVA_HOME == null) + JAVA_HOME = System.getProperty("JAVA_HOME"); + String classPath = System.getProperty("test.class.path"); + return List.of(JAVA_HOME + "/bin/java", "-cp", classPath, ProcessCloseTest.class.getName()); + } + + private static List javaArgs(ChildCommand... moreArgs) { + + List javaArgs = JAVA_ARGS; + if (javaArgs == null) { + JAVA_ARGS = javaArgs = setupJavaEXE(); + } + List args = new ArrayList<>(javaArgs); + for (ChildCommand arg : moreArgs) { + args.add(arg.toString()); + } + return args; + } + + /** + * {@return A Stream of Arguments} + * Each Argument consists of three lists. + * - A List of command line arguments to start a process. + * `javaArgs can be used to launch a Java child with ChildCommands + * - A List of ProcessCommand actions to be invoked on that process + * - A List of commands to be invoked on the process after the close or T-W-R exit. + */ + static Stream singleThreadTestCases() { + return Stream.of( + Arguments.of(List.of("echo", "xyz0"), + List.of(ProcessCommand.STDOUT_PRINT_ALL_LINES, + ProcessCommand.STDERR_EXPECT_EMPTY, + ExitStatus.NORMAL), + List.of(ExitStatus.NORMAL)), + Arguments.of(List.of("echo", "xyz1"), + List.of(ProcessCommand.STDOUT_PRINT_ALL_LINES), + List.of(ExitStatus.NORMAL)), + Arguments.of(javaArgs(ChildCommand.STDOUT_ECHO), + List.of(ProcessCommand.WRITER_WRITE, + ProcessCommand.WRITER_CLOSE, + ProcessCommand.STDOUT_PRINT_ALL_LINES), + List.of(ExitStatus.NORMAL)), + Arguments.of(javaArgs(ChildCommand.STDOUT_ECHO), + List.of(ProcessCommand.STDOUT_WRITE, + ProcessCommand.STDOUT_CLOSE, + ProcessCommand.STDOUT_PRINT_ALL_LINES), + List.of(ExitStatus.NORMAL)), + Arguments.of(javaArgs(ChildCommand.STDOUT_ECHO), + List.of(ProcessCommand.STDOUT_WRITE, + ProcessCommand.STDOUT_CLOSE, + ExitStatus.NORMAL), + List.of(ExitStatus.NORMAL)), + Arguments.of(List.of(CAT_PROGRAM, "NoSuchFile.txt"), + List.of(ProcessCommand.STDERR_PRINT_ALL_LINES, + ProcessCommand.STDOUT_EXPECT_EMPTY), + List.of(ExitStatus.FAIL)), + Arguments.of(javaArgs(ChildCommand.STDOUT_MARCO), + List.of(ProcessCommand.STDOUT_EXPECT_POLO, + ProcessCommand.STDERR_EXPECT_EMPTY), + List.of(ExitStatus.NORMAL)), + Arguments.of(javaArgs(ChildCommand.STDERR_MARCO), + List.of(ProcessCommand.STDERR_EXPECT_POLO, + ProcessCommand.STDOUT_EXPECT_EMPTY), + List.of(ExitStatus.NORMAL)), + Arguments.of(javaArgs(ChildCommand.PROCESS_EXIT1), + List.of(ExitStatus.FAIL), + List.of(ExitStatus.FAIL)), // Got expected status == 1 + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_INTERRUPT, // schedule an interrupt (in .2 sec) + ProcessCommand.PROCESS_CLOSE, + ProcessCommand.PROCESS_CHECK_INTERRUPTED), // Verify interrupted status + List.of(ExitStatus.KILLED)), // And process was destroyed + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_INTERRUPT), // interrupts the TWR/close + List.of(ProcessCommand.PROCESS_CHECK_INTERRUPTED, ExitStatus.KILLED)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ExitStatus.NORMAL), // waitFor before T-W-R exit + List.of(ExitStatus.NORMAL)), + Arguments.of(List.of("echo", "abc"), + List.of(ProcessCommand.PROCESS_CLOSE), + List.of(ExitStatus.RACY)), + Arguments.of(javaArgs(ChildCommand.STDOUT_ECHO), + List.of(ProcessCommand.STDOUT_WRITE, + ProcessCommand.PROCESS_CLOSE), + List.of(ExitStatus.PIPE)), + Arguments.of(List.of("echo", "def"), + List.of(ProcessCommand.PROCESS_DESTROY), + List.of(ExitStatus.RACY)), // Racy, not deterministic + Arguments.of(javaArgs(ChildCommand.STDOUT_ECHO), + List.of(ProcessCommand.STDOUT_WRITE, + ProcessCommand.PROCESS_DESTROY), + List.of(ExitStatus.RACY)), // Racy, not deterministic + Arguments.of(List.of("echo"), + List.of(ExitStatus.NORMAL), + List.of(ExitStatus.NORMAL)) + ); + } + + // Utility to process each command on the process + private static void doCommands(Process proc, List> commands) { + commands.forEach(c -> { + Log.printf(" %s\n", c); + c.accept(proc); + }); + } + + @ParameterizedTest + @MethodSource("singleThreadTestCases") + void simple(List args, List> commands, + List> postCommands) throws IOException { + var log = Log.get(); + try { + ProcessBuilder pb = new ProcessBuilder(args); + Process p = pb.start(); // Buffer any debug output + Log.printf("Program: %s; pid: %d\n", args, p.pid()); + doCommands(p, commands); + p.close(); + doCommands(p, postCommands); + } catch (Throwable ex) { + System.err.print(log); + throw ex; + } + } + + @ParameterizedTest + @MethodSource("singleThreadTestCases") + void autoCloseable(List args, List> commands, + List> postCommands) { + var log = Log.get(); + try { + ProcessBuilder pb = new ProcessBuilder(args); + Process proc = null; + try (Process p = pb.start()) { + proc = p; + Log.printf("Program: %s; pid: %d\n", args, p.pid()); + doCommands(p, commands); + } catch (IOException ioe) { + Assertions.fail(ioe); + } + doCommands(proc, postCommands); + } catch (Throwable ex) { + System.err.println(log); + throw ex; + } + } + + /** + * Test AutoCloseable for the process and out, in, and err streams. + * @param args The command line arguments + * @param commands the commands to the process + * @param postCommands The expected final exit status + */ + @ParameterizedTest + @MethodSource("singleThreadTestCases") + void autoCloseableAll(List args, List> commands, + List> postCommands) { + var log = Log.get(); + try { + ProcessBuilder pb = new ProcessBuilder(args); + Process proc = null; + try (Process p = pb.start(); var out = p.getOutputStream(); + var in = p.getInputStream(); + var err = p.getErrorStream()) { + proc = p; + Log.printf("Program: %s; pid: %d\n", args, p.pid()); + doCommands(p, commands); + } catch (IOException ioe) { + Assertions.fail(ioe); + } + doCommands(proc, postCommands); + } catch (Throwable ex) { + System.err.println(log); + throw ex; + } + } + + /** + * ExitStatus named values and assertions + */ + enum ExitStatus implements Consumer { + NORMAL(0), + FAIL(1), + PIPE(0, 1, 141), // SIGPIPE + KILLED(1, 137), // SIGKILL + TERMINATED(0, 143), // SIGTERM + RACY(0, 1, 137, 143), + ; + private final int[] allowedStatus; + + ExitStatus(int... status) { + this.allowedStatus = status; + } + + // If used as a process command, checks the exit status + public void accept(Process p) { + try { + Instant begin = Instant.now(); + final int exitStatus = p.waitFor(); + Duration latency = begin.until(Instant.now()); + Log.printf(" ExitStatus: %d, sig#: %d, waitFor latency: %s%n", + exitStatus, exitStatus & 0x7f, latency); + assertEquals(exitStatus); + } catch (InterruptedException ie) { + Assertions.fail("Unexpected InterruptedException checking status: " + this); + } + } + + // Check a status matches one of the allowed exit status values + void assertEquals(int actual) { + for (int status : allowedStatus) { + if (status == actual) { + return; // status is expected + } + } + if (this == RACY) { + // Not an error but report the actual status + Log.printf("Racy exit status: %d\n", actual); + } else { + Assertions.fail("Status: " + actual + ", sig#: " + (actual & 0x7f) + + ", expected one of: " + Arrays.toString(allowedStatus)); + } + } + } + + /** + * Commands on a Process that can be sequenced in the parent. + * See ChildCommands for commands that can be sent to the child process. + */ + enum ProcessCommand implements Consumer { + PROCESS_CLOSE(ProcessCommand::processClose), + PROCESS_DESTROY(ProcessCommand::processDestroy), + PROCESS_FORCE_OUT_CLOSE_EXCEPTION(ProcessCommand::processForceOutCloseException), + PROCESS_FORCE_IN_CLOSE_EXCEPTION(ProcessCommand::processForceInCloseException), + PROCESS_FORCE_ERROR_CLOSE_EXCEPTION(ProcessCommand::processForceErrorCloseException), + WRITER_WRITE(ProcessCommand::writerWrite), + WRITER_CLOSE(ProcessCommand::writerClose), + STDOUT_PRINT_ALL_LINES(ProcessCommand::stdoutPrintAllLines), + STDERR_PRINT_ALL_LINES(ProcessCommand::stderrPrintAllLines), + STDOUT_WRITE(ProcessCommand::stdoutWrite), + STDOUT_CLOSE(ProcessCommand::stdoutClose), + STDOUT_EXPECT_POLO(ProcessCommand::stdoutExpectPolo), + STDERR_EXPECT_POLO(ProcessCommand::stderrExpectPolo), + STDOUT_EXPECT_EMPTY(ProcessCommand::stdoutExpectEmpty), + STDERR_EXPECT_EMPTY(ProcessCommand::stderrExpectEmpty), + PROCESS_INTERRUPT(ProcessCommand::processInterruptThread), + PROCESS_CHECK_INTERRUPTED(ProcessCommand::processAssertInterrupted), + ; + private final Consumer command; + + ProcessCommand(Consumer command) { + this.command = command; + } + + public void accept(Process p) { + command.accept(p); + } + + private static void stdoutPrintAllLines(Process p) { + try { + var lines = p.inputReader().readAllLines(); + Assertions.assertNotEquals(0, lines.size(), "stdout should not be empty"); + Log.printf(" %d lines\n", lines.size()); + Log.printf("%s%n", lines.toString().indent(8)); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void stderrPrintAllLines(Process p) { + try { + var lines = p.errorReader().readAllLines(); + Assertions.assertNotEquals(0, lines.size(), "stderr should not be empty"); + Log.printf(" %d lines\n", lines.size()); + Log.printf("%s%n", lines.toString().indent(8)); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void writerWrite(Process p) { + try { + p.outputWriter().write("Now is the time."); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void writerClose(Process p) { + try { + p.outputWriter().close(); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void stdoutExpectPolo(Process p) { + String line = readLine(p.getInputStream()); + Assertions.assertEquals("Polo", line, "Stdout Expected Polo"); + } + + private static void stderrExpectPolo(Process p) { + String line = readLine(p.getErrorStream()); + Assertions.assertEquals("Polo", line, "Stderr Expected Polo"); + } + + private static void stdoutExpectEmpty(Process p) { + String line = readLine(p.getInputStream()); + Assertions.assertEquals("", line, "Stdout Expected Empty"); + } + + private static void stderrExpectEmpty(Process p) { + String line = readLine(p.getErrorStream()); + Assertions.assertEquals("", line, "Stderr Expected Empty"); + } + + private static String readLine(InputStream in) { + StringBuilder sb = new StringBuilder(); + try { + int ch; + while ((ch = in.read()) != -1) { + if (ch == '\n') { + // end of line + return sb.toString(); + } + if (ch != '\r') { // ignore cr - Windows defense + sb.append((char) ch); + } + } + // EOF - return string if no LF found + return sb.toString(); + } catch (IOException ioe) { + return ioe.getMessage(); + } + } + + private static void stdoutWrite(Process p) { + try { + var out = p.getOutputStream(); + out.write("stdout-write".getBytes(StandardCharsets.UTF_8)); + out.flush(); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void stdoutClose(Process p) { + try { + p.getOutputStream().close(); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + + private static void processClose(Process p) { + try { + p.close(); + } catch (IOException ioe) { + Assertions.fail(ioe); + } + } + + private static void processDestroy(Process p) { + p.destroy(); + } + + // Interpose an input stream that throws on close() + private static void processForceInCloseException(Process p) { + try { + synchronized (p) { + Field stdinField = p.getClass().getDeclaredField(OS_WINDOWS ? "stdin_stream" : "stdin"); + stdinField.setAccessible(true); + stdinField.set(p, new ThrowingOutputStream((OutputStream) stdinField.get(p))); + } + } catch (Exception ex) { + Assertions.fail("Failed to setup InputStream for throwing close", ex); + } + } + + // Interpose an output stream that throws on close() + private static void processForceOutCloseException(Process p) { + try { + synchronized (p) { + Field stdoutField = p.getClass().getDeclaredField(OS_WINDOWS ? "stdout_stream" : "stdout"); + stdoutField.setAccessible(true); + stdoutField.set(p, new ThrowingInputStream((InputStream) stdoutField.get(p))); + } + } catch (Exception ex) { + Assertions.fail("Failed to setup OutputStream throwing close", ex); + } + } + + // Interpose an error stream that throws on close() + private static void processForceErrorCloseException(Process p) { + try { + synchronized (p) { + Field stderrField = p.getClass().getDeclaredField(OS_WINDOWS ? "stderr_stream" : "stderr"); + stderrField.setAccessible(true); + stderrField.set(p, new ThrowingInputStream((InputStream) stderrField.get(p))); + } + } catch (Exception ex) { + Assertions.fail("Failed to setup OutputStream for throwing close", ex); + } + } + + // Hard coded to interrupt the invoking thread at a fixed rate of .2 second, if process is alive + private static void processInterruptThread(Process p) { + if (p.isAlive()) { + int delay = 200; + final Thread targetThread = Thread.currentThread(); + ForkJoinPool common = ForkJoinPool.commonPool(); + final ThreadInterruptor interrupter = new ThreadInterruptor(p, targetThread); + common.scheduleAtFixedRate(interrupter, delay, delay, TimeUnit.MILLISECONDS); + } + } + + // Verify that an interrupt is pending and reset it + private static void processAssertInterrupted(Process p) { + Assertions.assertTrue(Thread.interrupted(), "Expected an interrupt"); + } + } + + // Runnable scheduled at a fixed rate to interrupt a thread if a process is alive. + private static class ThreadInterruptor implements Runnable { + private final Process process; + private final Thread targetThread; + private int count; + + ThreadInterruptor(Process process, Thread targetThread) { + this.process = process; + this.targetThread = targetThread; + this.count = 0; + } + + public void run() { + if (process.isAlive()) { + count++; + Log.printf("Interrupting thread, count: %d%n", count); + targetThread.interrupt(); + } else { + throw new RuntimeException("process not alive"); + } + } + } + + // Commands to Java child sent as command line arguments + enum ChildCommand { + STDOUT_ECHO(ChildCommand::stdoutEchoBytes), + STDERR_ECHO(ChildCommand::stderrEchoBytes), + SLEEP(ChildCommand::SLEEP), + STDOUT_MARCO(ChildCommand::stdoutMarco), + STDERR_MARCO(ChildCommand::stderrMarco), + PROCESS_EXIT1(ChildCommand::processExit1), + ; + private final Runnable command; + ChildCommand(Runnable cmd) { + this.command = cmd; + } + + // The child sleeps before continuing with next ChildCommand + private static void SLEEP() { + final int sleepMS = 2_000; + try { + Thread.sleep(sleepMS); + } catch (InterruptedException ie) { + // Interrupted sleep, re-assert interrupted status + System.err.println("Sleep interrupted"); // Note the interruption in the log + Thread.currentThread().interrupt(); + } + } + + private static void stdoutEchoBytes() { + echoBytes(System.in, System.out); + } + + private static void stderrEchoBytes() { + echoBytes(System.in, System.err); + } + + private static void echoBytes(InputStream in, PrintStream out) { + try { + byte[] bytes = in.readAllBytes(); + out.write(bytes); + } catch (IOException ioe) { + out.println(ioe); + } + } + + private static void stdoutMarco() { + System.out.println("Polo"); + } + + private static void stderrMarco() { + System.err.println("Polo"); + } + + private static void processExit1() { + System.exit(1); + } + } + + static Stream closeExceptions() { + return Stream.of( + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_OUT_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_IN_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_ERROR_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_OUT_CLOSE_EXCEPTION, + ProcessCommand.PROCESS_FORCE_IN_CLOSE_EXCEPTION, + ProcessCommand.PROCESS_FORCE_ERROR_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG, FORCED_CLOSE_MSG, FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_OUT_CLOSE_EXCEPTION, + ProcessCommand.PROCESS_FORCE_IN_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG, FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_OUT_CLOSE_EXCEPTION, + ProcessCommand.PROCESS_FORCE_ERROR_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG, FORCED_CLOSE_MSG)), + Arguments.of(javaArgs(ChildCommand.SLEEP), + List.of(ProcessCommand.PROCESS_FORCE_IN_CLOSE_EXCEPTION, + ProcessCommand.PROCESS_FORCE_ERROR_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG, FORCED_CLOSE_MSG)), + Arguments.of(List.of("echo", "xyz1"), + List.of(ProcessCommand.PROCESS_FORCE_OUT_CLOSE_EXCEPTION), + List.of(ExitStatus.RACY), List.of(FORCED_CLOSE_MSG)) + ); + } + /** + * Test AutoCloseable for cases that are expected to throw exceptions. + * The list of ProcessCommands controls what is sent to the process and closing of streams. + * The command line arguments control the sequence of actions taken by the child. + * @param args The command line arguments for the child process + * @param commands the commands to this process controlling the child + * @param postCommands The expected final exit status + * @param expectedMessages the list of exception messages expected by close() + */ + @ParameterizedTest + @MethodSource("closeExceptions") + void testStreamsCloseThrowing(List args, List> commands, + List> postCommands, List expectedMessages) { + var log = Log.get(); + try { + ProcessBuilder pb = new ProcessBuilder(args); + Process proc = null; + IOException expectedIOE = null; + try (Process p = pb.start()) { + proc = p; + Log.printf("Program: %s; pid: %d\n",args, p.pid()); + doCommands(p, commands); + } catch (IOException ioe) { + expectedIOE = ioe; + } + // Check the exceptions thrown, if any + if (expectedIOE != null) { + // Check each exception that it is expected + Assertions.assertEquals(expectedMessages.getFirst(), expectedIOE.getMessage(), + "Unexpected exception message"); + var suppressedEx = expectedIOE.getSuppressed(); + Assertions.assertEquals(expectedMessages.size() - 1, suppressedEx.length, + "Number of suppressed exceptions"); + for (int i = 1; i < expectedMessages.size(); i++) { + Assertions.assertEquals(expectedMessages.get(i), + suppressedEx[i - 1].getMessage(), + "Unexpected suppressed exception message"); + } + } + Assertions.assertNotNull(proc, "Process is null"); + doCommands(proc, postCommands); + } catch (Exception ex) { + System.err.println(log); + throw ex; + } + } + + /** + * An OutputStream that delegates to another stream and always throws IOException on close(). + */ + private static class ThrowingOutputStream extends FilterOutputStream { + public ThrowingOutputStream(OutputStream out) { + super(out); + } + + @Override + public void close() throws IOException { + try { + out.close(); + } catch (IOException ioe) { + // ignore except to log the exception; may be useful to debug + ioe.printStackTrace(System.err); + } + throw new IOException(FORCED_CLOSE_MSG); + } + } + + /** + * An InputStream that delegates to another stream and always throws IOException on close(). + */ + private static class ThrowingInputStream extends FilterInputStream { + public ThrowingInputStream(InputStream in) { + super(in); + } + + @Override + public void close() throws IOException { + try { + in.close(); + } catch (IOException ioe) { + // ignore except to log the exception; may be useful to debug + ioe.printStackTrace(System.err); + } + throw new IOException(FORCED_CLOSE_MSG); + } + } + + // Copy of ProcessExamples in java/lang/snippet-files/ProcessExamples.java + @Test + void example() { + try (Process p = new ProcessBuilder(CAT_PROGRAM).start(); + Writer writer = p.outputWriter(); + Reader reader = p.inputReader()) { + writer.write(haiku); + writer.close(); + // Read all lines and print each + reader.readAllLines() + .forEach(System.out::println); + var status = p.waitFor(); + if (status != 0) + throw new RuntimeException("unexpected process status: " + status); + } catch (Exception e) { + System.err.println("Process failed: " + e); + } + } + + String haiku = """ + Oh, the sunrise glow; + Paddling with the river flow; + Chilling still, go slow. + """; + + /** + * Child program that executes child actions as named by command line args. + * @param childCommands a sequence of ChildCommand names. + */ + public static void main(String... childCommands) { + List args = List.of(childCommands); + List commands = args.stream().map(ChildCommand::valueOf).toList(); + commands.forEach(c -> c.command.run()); + } + + /** + * Log of output produced on a thread during a test. + * Normally, the output is buffered and only output to stderr if the test fails. + * Set -DDEBUG=true to send all output to stderr as it occurs. + */ + private static class Log { + + private static final boolean DEBUG = Boolean.getBoolean("DEBUG"); + private final static ScopedValue OUT = ScopedValue.newInstance(); + private final static ScopedValue.Carrier LOG = setupLog(); + + private static ScopedValue.Carrier setupLog() { + if (DEBUG) { + return ScopedValue.where(OUT, System.err); + } else { + return ScopedValue.where(OUT, new StringBuffer()); + } + } + + // Return the log for this thread and clear the buffer. + private static Appendable get() { + var log = LOG.get(OUT); + if (log instanceof StringBuffer sb) + sb.setLength(0); + return log; + } + + // Printf to the log for this thread. + private static void printf(String format, Object... args) { + try { + var log = LOG.get(OUT); + log.append(format.formatted(args)); + } catch (IOException ioe) { + throw new UncheckedIOException(ioe); + } + } + } +} From 8585b46c1221f6894f4f1cda34714e7b49a8cccb Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 4 Nov 2025 21:40:50 +0000 Subject: [PATCH 448/561] =?UTF-8?q?8364583:=20ColorConvertOp=20fails=20for?= =?UTF-8?q?=20CMYK=20=E2=86=92=20RGB=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: serb, psadhukhan, honkar --- .../java/awt/image/ColorConvertOp.java | 2 +- .../ColorConvertOp/ColorConvertOpCMYK.java | 51 ++++++++++++++++++ .../awt/image/ColorConvertOp/black_cmyk.jpg | Bin 0 -> 220 bytes 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 test/jdk/java/awt/image/ColorConvertOp/ColorConvertOpCMYK.java create mode 100644 test/jdk/java/awt/image/ColorConvertOp/black_cmyk.jpg diff --git a/src/java.desktop/share/classes/java/awt/image/ColorConvertOp.java b/src/java.desktop/share/classes/java/awt/image/ColorConvertOp.java index c1c60397198..bf0292ca5c3 100644 --- a/src/java.desktop/share/classes/java/awt/image/ColorConvertOp.java +++ b/src/java.desktop/share/classes/java/awt/image/ColorConvertOp.java @@ -808,7 +808,7 @@ public class ColorConvertOp implements BufferedImageOp, RasterOp { idx = 0; for (int x = 0; x < w; x++) { pixel = srcRas.getDataElements(x, y, pixel); - color = srcCM.getNormalizedComponents(pixel, color, 0); + color = srcCM.getNormalizedComponents(pixel, null, 0); if (needSrcAlpha) { alpha[x] = color[srcNumComp]; } diff --git a/test/jdk/java/awt/image/ColorConvertOp/ColorConvertOpCMYK.java b/test/jdk/java/awt/image/ColorConvertOp/ColorConvertOpCMYK.java new file mode 100644 index 00000000000..9b008c591a8 --- /dev/null +++ b/test/jdk/java/awt/image/ColorConvertOp/ColorConvertOpCMYK.java @@ -0,0 +1,51 @@ +/* + * 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. + * + * 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. + */ +import java.io.File; + +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorConvertOp; +import java.awt.image.ColorModel; + +import javax.imageio.ImageIO; + +/* + * @test + * @bug 8364583 + * @summary Verify CMYK images work with ColorConvertOp + */ + +public class ColorConvertOpCMYK { + + public static void main(String[] args) throws Exception { + String sep = System.getProperty("file.separator"); + String dir = System.getProperty("test.src", "."); + String prefix = dir + sep; + File file = new File(prefix + "black_cmyk.jpg"); + BufferedImage source = ImageIO.read(file); + ColorModel sourceModel = source.getColorModel(); + ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); + ColorConvertOp convertOp = new ColorConvertOp(cs, null); + BufferedImage rgb = convertOp.filter(source, null); + } +} diff --git a/test/jdk/java/awt/image/ColorConvertOp/black_cmyk.jpg b/test/jdk/java/awt/image/ColorConvertOp/black_cmyk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1446f063bddf0c80a63a4a9da213b5560ad1d236 GIT binary patch literal 220 zcmZ9FO%8%E6odzR@LD?D2_M8A2NOeT35 zzVQoo*LE$UD8kkY{D#>~r^68w0{ldSco7I5dxR7LCFN3*(wY>JPV-bJCLzjPW^!wt z)oD={w)ENZ1(iaLS~L!W!|2dE@D(dR{GFMNd|lc97W{w_4F-(pfi=$E-rxN8oA~|# DH1{1W literal 0 HcmV?d00001 From 245eeb41bc749cba4e44bf3998cf07e7a1b784ed Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 4 Nov 2025 21:47:40 +0000 Subject: [PATCH 449/561] 8357252: sun/awt/font/TestArabicHebrew.java fails in OEL 9 and 10 x64 Reviewed-by: serb, psadhukhan, kizune --- src/java.desktop/unix/native/common/awt/fontpath.c | 10 +--------- test/jdk/sun/awt/font/TestArabicHebrew.java | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/java.desktop/unix/native/common/awt/fontpath.c b/src/java.desktop/unix/native/common/awt/fontpath.c index 95499cfc948..d3821504bfb 100644 --- a/src/java.desktop/unix/native/common/awt/fontpath.c +++ b/src/java.desktop/unix/native/common/awt/fontpath.c @@ -1038,7 +1038,7 @@ Java_sun_font_FontConfigManager_getFontConfig return; } fontCount = 0; - minGlyphs = 20; + minGlyphs = 0; if (debugMinGlyphsStr != NULL) { int val = minGlyphs; sscanf(debugMinGlyphsStr, "%5d", &val); @@ -1086,14 +1086,6 @@ Java_sun_font_FontConfigManager_getFontConfig return; } - /* We don't want 20 or 30 fonts, so once we hit 10 fonts, - * then require that they really be adding value. Too many - * adversely affects load time for minimal value-add. - * This is still likely far more than we've had in the past. - */ - if (j==10) { - minGlyphs = 50; - } if (unionCharset == NULL) { unionCharset = charset; } else { diff --git a/test/jdk/sun/awt/font/TestArabicHebrew.java b/test/jdk/sun/awt/font/TestArabicHebrew.java index 61cbe931c32..356d36a4d21 100644 --- a/test/jdk/sun/awt/font/TestArabicHebrew.java +++ b/test/jdk/sun/awt/font/TestArabicHebrew.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4198081 + * @bug 4198081 8357252 * @key headful * @summary Arabic characters should appear instead of boxes and be correctly shaped. * Hebrew characters should appear instead of boxes. From 984c87cf767a46a2c1000a4030dfd91a62b03b4d Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 4 Nov 2025 21:47:58 +0000 Subject: [PATCH 450/561] 8370719: [Linux] Use /etc/os-release values for font configuration file names Reviewed-by: kizune, psadhukhan --- .../classes/sun/font/FcFontConfiguration.java | 34 ++----------------- .../classes/sun/font/MFontConfiguration.java | 34 ++----------------- 2 files changed, 6 insertions(+), 62 deletions(-) diff --git a/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java b/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java index 328e2454842..27d6773105e 100644 --- a/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java +++ b/src/java.desktop/unix/classes/sun/font/FcFontConfiguration.java @@ -317,42 +317,14 @@ public final class FcFontConfiguration extends FontConfiguration { return; } try { - File f; - if ((f = new File("/etc/lsb-release")).canRead()) { - /* Ubuntu and (perhaps others) use only lsb-release. - * Syntax and encoding is compatible with java properties. - * For Ubuntu the ID is "Ubuntu". - */ - Properties props = new Properties(); - try (FileInputStream fis = new FileInputStream(f)) { - props.load(fis); - } - osName = extractInfo(props.getProperty("DISTRIB_ID")); - osVersion = extractInfo(props.getProperty("DISTRIB_RELEASE")); - } else if ((f = new File("/etc/redhat-release")).canRead()) { - osName = "RedHat"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/SuSE-release")).canRead()) { - osName = "SuSE"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/turbolinux-release")).canRead()) { - osName = "Turbo"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/fedora-release")).canRead()) { - osName = "Fedora"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/os-release")).canRead()) { + File f = new File("/etc/os-release"); + if (f.canRead()) { Properties props = new Properties(); try (FileInputStream fis = new FileInputStream(f)) { props.load(fis); } - osName = extractInfo(props.getProperty("NAME")); + osName = extractInfo(props.getProperty("ID")); osVersion = extractInfo(props.getProperty("VERSION_ID")); - if (osName.equals("SLES")) { - osName = "SuSE"; - } else { - osName = extractInfo(props.getProperty("ID")); - } } } catch (Exception e) { if (FontUtilities.debugFonts()) { diff --git a/src/java.desktop/unix/classes/sun/font/MFontConfiguration.java b/src/java.desktop/unix/classes/sun/font/MFontConfiguration.java index 3d7e68d8dea..f5a8fe8b3c0 100644 --- a/src/java.desktop/unix/classes/sun/font/MFontConfiguration.java +++ b/src/java.desktop/unix/classes/sun/font/MFontConfiguration.java @@ -91,42 +91,14 @@ public final class MFontConfiguration extends FontConfiguration { if (osName.equals("Linux")) { try { - File f; - if ((f = new File("/etc/fedora-release")).canRead()) { - osName = "Fedora"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/redhat-release")).canRead()) { - osName = "RedHat"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/turbolinux-release")).canRead()) { - osName = "Turbo"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/SuSE-release")).canRead()) { - osName = "SuSE"; - osVersion = getVersionString(f); - } else if ((f = new File("/etc/lsb-release")).canRead()) { - /* Ubuntu and (perhaps others) use only lsb-release. - * Syntax and encoding is compatible with java properties. - * For Ubuntu the ID is "Ubuntu". - */ + File f = new File("/etc/os-release"); + if (f.canRead()) { Properties props = new Properties(); try (FileInputStream fis = new FileInputStream(f)) { props.load(fis); } - osName = extractInfo(props.getProperty("DISTRIB_ID")); - osVersion = extractInfo(props.getProperty("DISTRIB_RELEASE")); - } else if ((f = new File("/etc/os-release")).canRead()) { - Properties props = new Properties(); - try (FileInputStream fis = new FileInputStream(f)) { - props.load(fis); - } - osName = extractInfo(props.getProperty("NAME")); + osName = extractInfo(props.getProperty("ID")); osVersion = extractInfo(props.getProperty("VERSION_ID")); - if (osName.equals("SLES")) { - osName = "SuSE"; - } else { - osName = extractInfo(props.getProperty("ID")); - } } } catch (Exception e) { } From 146f8a83f9195ff246e2c3803c79171509df7d24 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Tue, 4 Nov 2025 21:49:41 +0000 Subject: [PATCH 451/561] 4954405: Data buffers created with an offset are unusable Reviewed-by: avu, psadhukhan, jdv --- .../sun/awt/image/ByteInterleavedRaster.java | 4 +- .../ByteInterleavedRasterOffsetsTest.java | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java diff --git a/src/java.desktop/share/classes/sun/awt/image/ByteInterleavedRaster.java b/src/java.desktop/share/classes/sun/awt/image/ByteInterleavedRaster.java index f0dedd9775a..775e7803c5b 100644 --- a/src/java.desktop/share/classes/sun/awt/image/ByteInterleavedRaster.java +++ b/src/java.desktop/share/classes/sun/awt/image/ByteInterleavedRaster.java @@ -206,7 +206,7 @@ public class ByteInterleavedRaster extends ByteComponentRaster { this.pixelStride = csm.getPixelStride(); this.dataOffsets = csm.getBandOffsets(); for (int i = 0; i < getNumDataElements(); i++) { - dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride; + dataOffsets[i] += dataBuffer.getOffset() + xOffset*pixelStride+yOffset*scanlineStride; } } else if (sampleModel instanceof SinglePixelPackedSampleModel) { SinglePixelPackedSampleModel sppsm = @@ -227,7 +227,7 @@ public class ByteInterleavedRaster extends ByteComponentRaster { } this.bandOffset = this.dataOffsets[0]; - this.dbOffsetPacked = dataBuffer.getOffset() - + this.dbOffsetPacked = - sampleModelTranslateY*scanlineStride - sampleModelTranslateX*pixelStride; this.dbOffset = dbOffsetPacked - diff --git a/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java b/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java new file mode 100644 index 00000000000..ec077c45ff1 --- /dev/null +++ b/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java @@ -0,0 +1,73 @@ +/* + * 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. + * + * 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. + */ + +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; + +/* + * @test + * @bug 4954405 + * @summary Verify DataBuffer offsets are handled by ByteInterleavedRaster + */ + +public class ByteInterleavedOffsetsTest { + + public static void main(String[] args) { + byte[] data = { 0, -1, 0, 0 }; // only set the R sample. + int[] bandOffsets = { 0, 1, 2 }; + DataBuffer databuf = new DataBufferByte(data, 3, 1); + WritableRaster raster = + Raster.createInterleavedRaster(databuf, 1, 1, 3, 3, bandOffsets, null); + int[] pixels = raster.getPixels(0, 0, 1, 1, (int[])null); + byte[] elements = (byte[])raster.getDataElements(0, 0, null); + ColorModel colorModel = new ComponentColorModel( + ColorSpace.getInstance(ColorSpace.CS_sRGB), false, false, + ColorModel.OPAQUE, DataBuffer.TYPE_BYTE); + BufferedImage img = new BufferedImage(colorModel, raster, false, null); + int pixel = img.getRGB(0, 0); + + System.out.println("PIXEL0=" + Integer.toHexString(pixels[0])); + System.out.println("PIXEL1=" + Integer.toHexString(pixels[1])); + System.out.println("PIXEL2=" + Integer.toHexString(pixels[2])); + System.out.println("ELEMENT0=" + Integer.toHexString(elements[0] & 0xff)); + System.out.println("ELEMENT1=" + Integer.toHexString(elements[1] & 0xff)); + System.out.println("ELEMENT2=" + Integer.toHexString(elements[2] & 0xff)); + System.out.println("PIXEL=" + Integer.toHexString(pixel)); + + if ((pixels[0] != 0xff) || (pixels[1] != 0) || (pixels[2] != 0)) { + throw new RuntimeException("Unexpected pixels"); + } + if (((elements[0] & 0xff) != 0xff) || (elements[1] != 0) || (elements[2] != 0)) { + throw new RuntimeException("Unexpected elements"); + } + if (pixel != 0xffff0000) { + throw new RuntimeException("Unexpected pixel"); + } + } +} From 463f5dc112386802b9ce0cc985a961ecfd3fbc55 Mon Sep 17 00:00:00 2001 From: Koushik Thirupattur Date: Tue, 4 Nov 2025 22:08:33 +0000 Subject: [PATCH 452/561] 8371296: Refactor tests to use PEM API (Phase 1) - Fix WriteP12Test failure Reviewed-by: ascarpino --- test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java b/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java index 96bbbbcde13..535cb8c8f4c 100644 --- a/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java +++ b/test/jdk/java/security/KeyStore/PKCS12/WriteP12Test.java @@ -133,7 +133,7 @@ public class WriteP12Test { public static void main(String[] args) throws UnrecoverableKeyException, KeyStoreException, NoSuchProviderException, - NoSuchAlgorithmException, IOException { + NoSuchAlgorithmException, IOException, CertificateException { WriteP12Test jstest = new WriteP12Test(); out.println("test WriteP12CertChain"); /* From c8f5fd6ff3808804eda03c9754698a00dd06449c Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Tue, 4 Nov 2025 22:41:17 +0000 Subject: [PATCH 453/561] 8371184: Improve jpackage test coverage for "--app-image" option Reviewed-by: almatvee --- .../jdk/jpackage/test/PackageTestTest.java | 3 +- .../jdk/jpackage/test/AdditionalLauncher.java | 2 +- .../jdk/jpackage/test/ConfigFilesStasher.java | 4 +- .../jdk/jpackage/test/JPackageCommand.java | 173 ++++++++++++++---- .../jdk/jpackage/test/LauncherVerifier.java | 36 +++- .../jdk/jpackage/test/LinuxHelper.java | 10 +- .../helpers/jdk/jpackage/test/MacHelper.java | 45 ++++- .../jdk/jpackage/test/PackageTest.java | 10 + .../jdk/jpackage/test/PropertyFinder.java | 30 ++- .../macosx/SigningPackageTwoStepTest.java | 4 +- .../jpackage/share/AddLShortcutTest.java | 48 ++--- .../tools/jpackage/share/AddLauncherTest.java | 5 +- .../tools/jpackage/share/AppContentTest.java | 4 +- .../jpackage/share/AppImagePackageTest.java | 35 ++-- .../tools/jpackage/share/InstallDirTest.java | 40 ++-- .../share/MultiLauncherTwoPhaseTest.java | 14 +- .../jpackage/share/MultiNameTwoPhaseTest.java | 14 +- .../jpackage/share/PostImageScriptTest.java | 5 +- .../jdk/tools/jpackage/share/ServiceTest.java | 5 +- .../jpackage/windows/Win8282351Test.java | 25 +-- 20 files changed, 331 insertions(+), 181 deletions(-) diff --git a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java index 4cf89fca3cc..4723f4dadbd 100644 --- a/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java +++ b/test/jdk/tools/jpackage/helpers-test/jdk/jpackage/test/PackageTestTest.java @@ -351,7 +351,8 @@ public class PackageTestTest extends JUnitAdapter { } @Override - public void verifyIsOfType(PackageType ... types) { + public JPackageCommand verifyIsOfType(Set types) { + return this; } @Override diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java index a41e2b5043f..4f0e3f4e485 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/AdditionalLauncher.java @@ -165,7 +165,7 @@ public final class AdditionalLauncher { public void applyTo(JPackageCommand cmd) { cmd.addPrerequisiteAction(this::initialize); - cmd.addVerifyAction(createVerifierAsConsumer()); + cmd.addVerifyAction(createVerifierAsConsumer(), JPackageCommand.ActionRole.LAUNCHER_VERIFIER); } public void applyTo(PackageTest test) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java index 11627ab9125..0b3f5defbac 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/ConfigFilesStasher.java @@ -192,9 +192,7 @@ final class ConfigFilesStasher { } private static ApplicationLayout appImageAppLayout(JPackageCommand cmd) { - if (cmd.isRuntime()) { - throw new UnsupportedOperationException(); - } + cmd.verifyNotRuntime(); if (cmd.isImagePackageType()) { return platformAppImage(); diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java index 088a9fe3bad..57915b91d8b 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/JPackageCommand.java @@ -28,13 +28,16 @@ import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; +import static java.util.stream.Collectors.toCollection; import static jdk.jpackage.test.AdditionalLauncher.forEachAdditionalLauncher; import java.io.FileOutputStream; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.InvalidPathException; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.security.SecureRandom; import java.util.ArrayList; @@ -48,6 +51,7 @@ import java.util.Objects; import java.util.Optional; import java.util.OptionalInt; import java.util.Set; +import java.util.TreeSet; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -56,6 +60,7 @@ import java.util.regex.Pattern; import java.util.spi.ToolProvider; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.internal.util.function.ThrowingFunction; import jdk.jpackage.internal.util.function.ThrowingRunnable; @@ -85,7 +90,6 @@ public class JPackageCommand extends CommandArguments { ignoreDefaultRuntime = cmd.ignoreDefaultRuntime; ignoreDefaultVerbose = cmd.ignoreDefaultVerbose; this.immutable = immutable; - dmgInstallDir = cmd.dmgInstallDir; prerequisiteActions = new Actions(cmd.prerequisiteActions); verifyActions = new Actions(cmd.verifyActions); standardAsserts = cmd.standardAsserts; @@ -165,11 +169,6 @@ public class JPackageCommand extends CommandArguments { return null; } - public String getArgumentValue(String argName, - Function defaultValueSupplier) { - return getArgumentValue(argName, defaultValueSupplier, v -> v); - } - public T getArgumentValue(String argName, Supplier defaultValueSupplier, Function stringConverter) { @@ -332,16 +331,35 @@ public class JPackageCommand extends CommandArguments { return this; } + public JPackageCommand usePredefinedAppImage(Path predefinedAppImagePath) { + return setArgumentValue("--app-image", Objects.requireNonNull(predefinedAppImagePath)) + .removeArgumentWithValue("--input"); + } + JPackageCommand addPrerequisiteAction(ThrowingConsumer action) { prerequisiteActions.add(action); return this; } JPackageCommand addVerifyAction(ThrowingConsumer action) { - verifyActions.add(action); + return addVerifyAction(action, ActionRole.DEFAULT); + } + + enum ActionRole { + DEFAULT, + LAUNCHER_VERIFIER, + ; + } + + JPackageCommand addVerifyAction(ThrowingConsumer action, ActionRole actionRole) { + verifyActions.add(action, actionRole); return this; } + Stream> getVerifyActionsWithRole(ActionRole actionRole) { + return verifyActions.actionsWithRole(actionRole); + } + /** * Shorthand for {@code helloAppImage(null)}. */ @@ -550,11 +568,7 @@ public class JPackageCommand extends CommandArguments { } if (TKit.isOSX()) { - if (packageType() == PackageType.MAC_DMG && dmgInstallDir != null) { - return dmgInstallDir; - } else { - return MacHelper.getInstallationDirectory(this); - } + return MacHelper.getInstallationDirectory(this); } throw TKit.throwUnknownPlatformError(); @@ -676,10 +690,11 @@ public class JPackageCommand extends CommandArguments { return Collections.unmodifiableList(names); } - private void verifyNotRuntime() { + JPackageCommand verifyNotRuntime() { if (isRuntime()) { - throw new IllegalArgumentException("Java runtime packaging"); + throw new UnsupportedOperationException("Java runtime packaging"); } + return this; } /** @@ -1212,6 +1227,52 @@ public class JPackageCommand extends CommandArguments { MacHelper.verifyUnsignedBundleSignature(cmd); } }), + PREDEFINED_APP_IMAGE_COPY(cmd -> { + Optional.ofNullable(cmd.getArgumentValue("--app-image")).filter(_ -> { + return !TKit.isOSX() || !MacHelper.signPredefinedAppImage(cmd); + }).map(Path::of).ifPresent(predefinedAppImage -> { + + TKit.trace(String.format( + "Check contents of the predefined app image [%s] copied verbatim", + predefinedAppImage)); + + var outputAppImageDir = cmd.pathToUnpackedPackageFile(cmd.appInstallationDirectory()); + + try (var walk = Files.walk(predefinedAppImage)) { + var filteredWalk = walk; + if (!cmd.expectAppImageFile()) { + var appImageFile = AppImageFile.getPathInAppImage(predefinedAppImage); + // Exclude ".jpackage.xml" as it should no be in the output bundle. + var pred = Predicate.isEqual(appImageFile).negate(); + if (TKit.isOSX()) { + // On MacOS exclude files that can be signed as their digests change. + pred = pred.and(path -> { + return MacHelper.isVerbatimCopyFromPredefinedAppImage(cmd, path); + }); + } + + filteredWalk = walk.filter(pred); + } + + var verbatimPaths = filteredWalk.collect(toCollection(TreeSet::new)); + + // Remove nonempty directories from the collection of paths copied verbatim. + verbatimPaths.removeAll(verbatimPaths.stream().map(Path::getParent).toList()); + + verbatimPaths.forEach(ThrowingConsumer.toConsumer(p -> { + if (Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS)) { + TKit.assertDirectoryExists(p); + } else { + TKit.assertSameFileContent(p, outputAppImageDir.resolve(predefinedAppImage.relativize(p))); + } + })); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + + TKit.trace("Done"); + }); + }) ; StandardAssert(Consumer action) { @@ -1220,9 +1281,7 @@ public class JPackageCommand extends CommandArguments { private static JPackageCommand convertFromRuntime(JPackageCommand cmd) { var copy = cmd.createMutableCopy(); - copy.immutable = false; copy.removeArgumentWithValue("--runtime-image"); - copy.dmgInstallDir = cmd.appInstallationDirectory(); if (!copy.hasArgument("--name")) { copy.addArguments("--name", cmd.nameFromRuntimeImage().orElseThrow()); } @@ -1440,29 +1499,35 @@ public class JPackageCommand extends CommandArguments { return getPrintableCommandLine(); } - public void verifyIsOfType(Collection types) { - verifyIsOfType(types.toArray(PackageType[]::new)); + public final JPackageCommand verifyIsOfType(PackageType ... types) { + return verifyIsOfType(Set.of(types)); } - public void verifyIsOfType(PackageType ... types) { - final var typesSet = Stream.of(types).collect(Collectors.toSet()); + public final JPackageCommand verifyIsOfType(Iterable types) { + return verifyIsOfType(StreamSupport.stream(types.spliterator(), false).collect(toSet())); + } + + public JPackageCommand verifyIsOfType(Set types) { + Objects.requireNonNull(types); if (!hasArgument("--type")) { if (!isImagePackageType()) { - if ((TKit.isLinux() && typesSet.equals(PackageType.LINUX)) || (TKit.isWindows() && typesSet.equals(PackageType.WINDOWS))) { - return; + if ((TKit.isLinux() && types.equals(PackageType.LINUX)) || (TKit.isWindows() && types.equals(PackageType.WINDOWS))) { + return this; } - if (TKit.isOSX() && typesSet.equals(PackageType.MAC)) { - return; + if (TKit.isOSX() && types.equals(PackageType.MAC)) { + return this; } - } else if (typesSet.equals(Set.of(PackageType.IMAGE))) { - return; + } else if (types.equals(Set.of(PackageType.IMAGE))) { + return this; } } - if (!typesSet.contains(packageType())) { - throw new IllegalArgumentException("Unexpected type"); + if (!types.contains(packageType())) { + throw new UnsupportedOperationException(String.format("Unsupported operation for type [%s]", packageType().getType())); } + + return this; } public CfgFile readLauncherCfgFile() { @@ -1558,18 +1623,47 @@ public class JPackageCommand extends CommandArguments { } void add(ThrowingConsumer action) { - Objects.requireNonNull(action); + add(action, ActionRole.DEFAULT); + } + + void add(ThrowingConsumer action, ActionRole role) { verifyMutable(); - actions.add(new Consumer() { - @Override - public void accept(JPackageCommand t) { - if (!executed) { - executed = true; - ThrowingConsumer.toConsumer(action).accept(t); - } + actions.add(new Action(action, role)); + } + + Stream> actionsWithRole(ActionRole role) { + Objects.requireNonNull(role); + return actions.stream().filter(action -> { + return Objects.equals(action.role(), role); + }).map(Action::impl); + } + + private static final class Action implements Consumer { + + Action(ThrowingConsumer impl, ActionRole role) { + this.impl = Objects.requireNonNull(impl); + this.role = Objects.requireNonNull(role); + } + + ActionRole role() { + return role; + } + + ThrowingConsumer impl() { + return impl; + } + + @Override + public void accept(JPackageCommand cmd) { + if (!executed) { + executed = true; + ThrowingConsumer.toConsumer(impl).accept(cmd); } - private boolean executed; - }); + } + + private final ActionRole role; + private final ThrowingConsumer impl; + private boolean executed; } @Override @@ -1578,7 +1672,7 @@ public class JPackageCommand extends CommandArguments { actions.forEach(action -> action.accept(JPackageCommand.this)); } - private final List> actions; + private final List actions; } private Boolean withToolProvider; @@ -1589,7 +1683,6 @@ public class JPackageCommand extends CommandArguments { private boolean ignoreDefaultRuntime; private boolean ignoreDefaultVerbose; private boolean immutable; - private Path dmgInstallDir; private final Actions prerequisiteActions; private final Actions verifyActions; private Path executeInDirectory; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java index 489788b565a..da5b8583c72 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LauncherVerifier.java @@ -24,6 +24,7 @@ package jdk.jpackage.test; import static java.util.stream.Collectors.toMap; import static jdk.jpackage.test.AdditionalLauncher.NO_ICON; +import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import static jdk.jpackage.test.LauncherShortcut.LINUX_SHORTCUT; import java.io.IOException; @@ -34,6 +35,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.BiConsumer; +import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -72,6 +74,12 @@ public final class LauncherVerifier { new LauncherVerifier(cmd).verify(cmd, Action.EXECUTE_LAUNCHER); } + static String launcherDescription(JPackageCommand cmd, String launcherName) { + return launcherDescription(cmd, launcherName, (theCmd, theLauncherName) -> { + return getAdditionalLauncherProperties(theCmd, theLauncherName); + }); + } + public enum Action { VERIFY_ICON(LauncherVerifier::verifyIcon), @@ -137,8 +145,8 @@ public final class LauncherVerifier { } private String getDescription(JPackageCommand cmd) { - return findProperty("description").orElseGet(() -> { - return cmd.getArgumentValue("--description", cmd::name); + return launcherDescription(cmd, name, (theCmd, theLauncherName) -> { + return properties.orElseThrow(); }); } @@ -272,7 +280,11 @@ public final class LauncherVerifier { } private void verifyDescription(JPackageCommand cmd) throws IOException { - if (TKit.isWindows()) { + if (TKit.isWindows() && !cmd.hasArgument("--app-image")) { + // On Windows, check the description if the predefined app image is not configured. + // The description and the icon are encoded in the launcher executable, which should be + // copied verbatim from the predefined app image into the output bundle. + // This check is done in the JPackageCommand class, so there is no need to duplicate it here. String expectedDescription = getDescription(cmd); Path launcherPath = cmd.appLauncherPath(name); String actualDescription = @@ -424,6 +436,24 @@ public final class LauncherVerifier { }); } + private static String launcherDescription( + JPackageCommand cmd, + String launcherName, + BiFunction addLauncherPropertyFileGetter) { + + return PropertyFinder.findLauncherProperty(cmd, launcherName, + PropertyFinder.cmdlineOptionWithValue("--description"), + PropertyFinder.launcherPropertyFile("description"), + PropertyFinder.nop() + ).orElseGet(() -> { + if (cmd.isMainLauncher(launcherName)) { + return cmd.mainLauncherName(); + } else { + return launcherDescription(cmd, null, addLauncherPropertyFileGetter); + } + }); + } + private static final class DefaultEntitlements { private static Map loadFromResources(String resourceName) { diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java index c8df0f640d0..25358e8ecdc 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/LinuxHelper.java @@ -26,7 +26,6 @@ import static java.util.Collections.unmodifiableSortedSet; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; -import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperties; import java.io.IOException; import java.io.UncheckedIOException; @@ -560,14 +559,7 @@ public final class LinuxHelper { TKit.assertTrue(mandatoryKeys.isEmpty(), String.format( "Check for missing %s keys in the file", mandatoryKeys)); - final String launcherDescription; - if (cmd.name().equals(launcherName) || predefinedAppImage.isPresent()) { - launcherDescription = Optional.ofNullable(cmd.getArgumentValue("--description")).orElseGet(cmd::name); - } else { - launcherDescription = getAdditionalLauncherProperties(cmd, launcherName).findProperty("description").or(() -> { - return Optional.ofNullable(cmd.getArgumentValue("--description")); - }).orElseGet(cmd::name); - } + final var launcherDescription = LauncherVerifier.launcherDescription(cmd, launcherName); for (var e : List.of( Map.entry("Type", "Application"), diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java index 5c0914ed2f4..4e239e16b59 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/MacHelper.java @@ -545,6 +545,43 @@ public final class MacHelper { } } + static boolean isVerbatimCopyFromPredefinedAppImage(JPackageCommand cmd, Path path) { + cmd.verifyIsOfType(PackageType.MAC); + + final var predefinedAppImage = Path.of(cmd.getArgumentValue("--app-image")); + + final var appLayout = ApplicationLayout.macAppImage().resolveAt(predefinedAppImage); + + if (!path.startsWith(predefinedAppImage)) { + throw new IllegalArgumentException( + String.format("Path [%s] is not in directory [%s]", path, predefinedAppImage)); + } + + if (path.startsWith(appLayout.contentDirectory().resolve("_CodeSignature"))) { + // A file in the "Contents/_CodeSignature" directory. + return false; + } + + final var outputAppImageDir = cmd.pathToUnpackedPackageFile(cmd.appInstallationDirectory()); + + final var outputAppImagePath = outputAppImageDir.resolve(predefinedAppImage.relativize(path)); + + if (path.startsWith(appLayout.launchersDirectory()) && + cmd.launcherNames(true).stream().map(cmd::appLauncherPath).collect(toSet()).contains(outputAppImagePath)) { + // The `path` references a launcher. + // It can be signed and its digest may change. + return false; + } + + if (path.startsWith(appLayout.runtimeHomeDirectory().resolve("bin"))) { + // The `path` references an executable native command in JDK's "bin" subdirectory. + // It can be signed and its digest may change. + return false; + } + + return true; + } + static void verifyUnsignedBundleSignature(JPackageCommand cmd) { if (!cmd.isImagePackageType()) { MacSignVerify.assertUnsigned(cmd.outputBundle()); @@ -716,12 +753,8 @@ public final class MacHelper { final var defaultInstallLocation = Path.of( cmd.isRuntime() ? "/Library/Java/JavaVirtualMachines" : "/Applications"); - final Path installLocation; - if (cmd.packageType() == PackageType.MAC_DMG) { - installLocation = defaultInstallLocation; - } else { - installLocation = cmd.getArgumentValue("--install-dir", () -> defaultInstallLocation, Path::of); - } + final Path installLocation = Optional.ofNullable(cmd.getArgumentValue("--install-dir")) + .map(Path::of).orElse(defaultInstallLocation); return installLocation.resolve(cmd.name() + (cmd.isRuntime() ? ".jdk" : ".app")); } diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java index 2e73f43b58d..5b3815510ce 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PackageTest.java @@ -60,6 +60,7 @@ import java.util.stream.StreamSupport; import jdk.jpackage.internal.util.function.ThrowingBiConsumer; import jdk.jpackage.internal.util.function.ThrowingConsumer; import jdk.jpackage.internal.util.function.ThrowingRunnable; +import jdk.jpackage.test.JPackageCommand.ActionRole; /** @@ -233,6 +234,15 @@ public final class PackageTest extends RunnablePackageTest { return this; } + public PackageTest usePredefinedAppImage(JPackageCommand appImageCmd) { + appImageCmd.verifyIsOfType(PackageType.IMAGE); + addInitializer(cmd -> { + cmd.usePredefinedAppImage(appImageCmd.outputBundle()); + }); + appImageCmd.getVerifyActionsWithRole(ActionRole.LAUNCHER_VERIFIER).forEach(this::addInstallVerifier); + return this; + } + public PackageTest disablePackageInstaller() { currentTypes.forEach(disabledInstallers::add); return this; diff --git a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java index e310de855c6..54e3ef2ec54 100644 --- a/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java +++ b/test/jdk/tools/jpackage/helpers/jdk/jpackage/test/PropertyFinder.java @@ -26,7 +26,9 @@ import static jdk.jpackage.test.AdditionalLauncher.getAdditionalLauncherProperti import java.nio.file.Path; import java.util.Objects; import java.util.Optional; +import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; import java.util.function.UnaryOperator; import jdk.jpackage.test.AdditionalLauncher.PropertyFile; @@ -42,6 +44,12 @@ final class PropertyFinder { }; } + default Finder defaultValue(Supplier v) { + return target -> { + return Optional.of(find(target).orElseGet(v)); + }; + } + default Finder map(UnaryOperator v) { Objects.requireNonNull(v); return target -> { @@ -134,7 +142,27 @@ final class PropertyFinder { Finder addLauncherPropertyFileFinder, Finder appImageFileFinder) { + return findLauncherProperty( + cmd, + launcherName, + (theCmd, theLauncherName) -> { + return getAdditionalLauncherProperties(theCmd, theLauncherName); + }, + cmdlineFinder, + addLauncherPropertyFileFinder, + appImageFileFinder); + } + + static Optional findLauncherProperty( + JPackageCommand cmd, + String launcherName, + BiFunction addLauncherPropertyFileGetter, + Finder cmdlineFinder, + Finder addLauncherPropertyFileFinder, + Finder appImageFileFinder) { + Objects.requireNonNull(cmd); + Objects.requireNonNull(addLauncherPropertyFileGetter); Objects.requireNonNull(cmdlineFinder); Objects.requireNonNull(addLauncherPropertyFileFinder); Objects.requireNonNull(appImageFileFinder); @@ -148,7 +176,7 @@ final class PropertyFinder { if (mainLauncher) { reply = cmdlineFinder.find(cmd); } else if (appImageFilePath.isEmpty()) { - var props = getAdditionalLauncherProperties(cmd, launcherName); + var props = addLauncherPropertyFileGetter.apply(cmd, launcherName); reply = addLauncherPropertyFileFinder.find(props); } else { reply = Optional.empty(); diff --git a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java index 32311fd121e..586d8d68444 100644 --- a/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java +++ b/test/jdk/tools/jpackage/macosx/SigningPackageTwoStepTest.java @@ -199,10 +199,8 @@ public class SigningPackageTwoStepTest { test.forTypes(signPackage.keySet()).addRunOnceInitializer(() -> { appImageCmd.setArgumentValue("--dest", TKit.createTempDirectory("appimage")).execute(0); - }).addInitializer(cmd -> { + }).usePredefinedAppImage(appImageCmd).addInitializer(cmd -> { MacHelper.useKeychain(cmd, keychain); - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); Optional.ofNullable(signPackage.get(cmd.packageType())).ifPresent(signOption -> { signOption.setTo(cmd); }); diff --git a/test/jdk/tools/jpackage/share/AddLShortcutTest.java b/test/jdk/tools/jpackage/share/AddLShortcutTest.java index f000e79227e..ef8f277e267 100644 --- a/test/jdk/tools/jpackage/share/AddLShortcutTest.java +++ b/test/jdk/tools/jpackage/share/AddLShortcutTest.java @@ -196,27 +196,22 @@ public class AddLShortcutTest { // and applies shortcut configuration to the main launcher in the native packaging jpackage command. // - Path[] predefinedAppImage = new Path[1]; + var appImageCmd = JPackageCommand.helloAppImage() + .setArgumentValue("--name", "foo") + .setFakeRuntime(); - new PackageTest().addRunOnceInitializer(() -> { - var cmd = JPackageCommand.helloAppImage() - .setArgumentValue("--name", "foo") - .setFakeRuntime(); + for (var i = 1; i != cfgs.length; ++i) { + var al = new AdditionalLauncher("launcher-" + i); + cfgs[i].applyToAdditionalLauncher(al); + al.withoutVerifyActions(Action.EXECUTE_LAUNCHER).applyTo(appImageCmd); + } - for (var i = 1; i != cfgs.length; ++i) { - var al = new AdditionalLauncher("launcher-" + i); - cfgs[i].applyToAdditionalLauncher(al); - al.withoutVerifyActions(Action.EXECUTE_LAUNCHER).applyTo(cmd); - } - - cmd.execute(); - - predefinedAppImage[0] = cmd.outputBundle(); - }).addInitializer(cmd -> { + new PackageTest() + .addRunOnceInitializer(appImageCmd::execute) + .usePredefinedAppImage(appImageCmd) + .addInitializer(cmd -> { cfgs[0].applyToMainLauncher(cmd); - cmd.removeArgumentWithValue("--input"); cmd.setArgumentValue("--name", "AddLShortcutDir2Test"); - cmd.addArguments("--app-image", predefinedAppImage[0]); }).run(RunnablePackageTest.Action.CREATE_AND_UNPACK); } @@ -237,20 +232,15 @@ public class AddLShortcutTest { shortcutArgs.add(startupDirectory.asStringValue()); } - Path[] predefinedAppImage = new Path[1]; + var appImageCmd = JPackageCommand.helloAppImage() + .setArgumentValue("--name", "foo") + .setFakeRuntime(); - new PackageTest().addRunOnceInitializer(() -> { - var cmd = JPackageCommand.helloAppImage() - .setArgumentValue("--name", "foo") - .setFakeRuntime(); - - cmd.execute(); - - predefinedAppImage[0] = cmd.outputBundle(); - }).addInitializer(cmd -> { - cmd.removeArgumentWithValue("--input"); + new PackageTest() + .addRunOnceInitializer(appImageCmd::execute) + .usePredefinedAppImage(appImageCmd) + .addInitializer(cmd -> { cmd.setArgumentValue("--name", "AddLShortcutDir3Test"); - cmd.addArguments("--app-image", predefinedAppImage[0]); cmd.ignoreDefaultVerbose(true); }).addInitializer(cmd -> { cmd.addArguments(shortcutArgs); diff --git a/test/jdk/tools/jpackage/share/AddLauncherTest.java b/test/jdk/tools/jpackage/share/AddLauncherTest.java index 21f475cbd78..2a85de33051 100644 --- a/test/jdk/tools/jpackage/share/AddLauncherTest.java +++ b/test/jdk/tools/jpackage/share/AddLauncherTest.java @@ -275,10 +275,9 @@ public class AddLauncherTest { if (withPredefinedAppImage) { new PackageTest().addInitializer(cmd -> { cmd.setArgumentValue("--name", "Bar"); - // Should not have impact of launcher descriptions, but it does. + // Should not have impact on launcher descriptions, but it does. cmd.setArgumentValue("--description", "Installer"); - cmd.removeArgumentWithValue("--input").setArgumentValue("--app-image", target.cmd().orElseThrow().outputBundle()); - }).mutate(addLinuxShortcuts()).run(Action.CREATE_AND_UNPACK); + }).usePredefinedAppImage(target.cmd().orElseThrow()).mutate(addLinuxShortcuts()).run(Action.CREATE_AND_UNPACK); } } diff --git a/test/jdk/tools/jpackage/share/AppContentTest.java b/test/jdk/tools/jpackage/share/AppContentTest.java index 5b5734df61d..97c83bba57d 100644 --- a/test/jdk/tools/jpackage/share/AppContentTest.java +++ b/test/jdk/tools/jpackage/share/AppContentTest.java @@ -499,11 +499,11 @@ public class AppContentTest { return new FileContentFactory(() -> { var basedir = TKit.createTempDirectory("content").resolve(path); - for (var textFile : Map.ofEntries( + for (var textFile : List.of( entry("woods/moose", "The moose"), entry("woods/bear", "The bear"), entry("woods/trees/jay", "The gray jay") - ).entrySet()) { + )) { var src = basedir.resolve(textFile.getKey()); Files.createDirectories(src.getParent()); TKit.createTextFile(src, Stream.of(textFile.getValue())); diff --git a/test/jdk/tools/jpackage/share/AppImagePackageTest.java b/test/jdk/tools/jpackage/share/AppImagePackageTest.java index aacb76b122b..94eb086e4c6 100644 --- a/test/jdk/tools/jpackage/share/AppImagePackageTest.java +++ b/test/jdk/tools/jpackage/share/AppImagePackageTest.java @@ -62,15 +62,12 @@ public class AppImagePackageTest { @Test public static void test() { - var appImageCmd = JPackageCommand.helloAppImage() - .setArgumentValue("--dest", TKit.createTempDirectory("appimage")); + final var appImageCmd = createAppImageCommand(); new PackageTest() .addRunOnceInitializer(appImageCmd::execute) - .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); - }).addBundleDesktopIntegrationVerifier(false).run(); + .usePredefinedAppImage(appImageCmd) + .addBundleDesktopIntegrationVerifier(false).run(); } /** @@ -85,10 +82,7 @@ public class AppImagePackageTest { @Parameter("false") public static void testEmpty(boolean withIcon) throws IOException { - var appImageCmd = JPackageCommand.helloAppImage() - .setFakeRuntime() - .setArgumentValue("--name", "EmptyAppImagePackageTest") - .setArgumentValue("--dest", TKit.createTempDirectory("appimage")); + final var appImageCmd = createAppImageCommand(); new PackageTest() .addRunOnceInitializer(appImageCmd::execute) @@ -116,12 +110,11 @@ public class AppImagePackageTest { TKit.trace("Done"); } }) + .usePredefinedAppImage(appImageCmd) .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); if (withIcon) { - cmd.addArguments("--icon", iconPath("icon")); + cmd.setArgumentValue("--icon", iconPath("icon")); } - cmd.removeArgumentWithValue("--input"); cmd.excludeStandardAsserts( StandardAssert.MAIN_JAR_FILE, @@ -160,10 +153,8 @@ public class AppImagePackageTest { */ @Test public static void testBadAppImage3() { - Path appImageDir = TKit.createTempDirectory("appimage"); - JPackageCommand appImageCmd = JPackageCommand.helloAppImage(). - setFakeRuntime().setArgumentValue("--dest", appImageDir); + final var appImageCmd = createAppImageCommand(); configureBadAppImage(appImageCmd.outputBundle()).addRunOnceInitializer(() -> { appImageCmd.execute(); @@ -176,10 +167,8 @@ public class AppImagePackageTest { */ @Test public static void testBadAppImageFile() { - final var appImageRoot = TKit.createTempDirectory("appimage"); - final var appImageCmd = JPackageCommand.helloAppImage(). - setFakeRuntime().setArgumentValue("--dest", appImageRoot); + final var appImageCmd = createAppImageCommand(); final var appImageDir = appImageCmd.outputBundle(); @@ -202,13 +191,17 @@ public class AppImagePackageTest { private static PackageTest configureBadAppImage(Path appImageDir, CannedFormattedString expectedError) { return new PackageTest().addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageDir); - cmd.removeArgumentWithValue("--input"); + cmd.usePredefinedAppImage(appImageDir); cmd.ignoreDefaultVerbose(true); // no "--verbose" option cmd.validateOutput(expectedError); }).setExpectedExitCode(1); } + private static JPackageCommand createAppImageCommand() { + final var appImageRoot = TKit.createTempDirectory("appimage"); + return JPackageCommand.helloAppImage().setFakeRuntime().setArgumentValue("--dest", appImageRoot); + } + private static Path iconPath(String name) { return TKit.TEST_SRC_ROOT.resolve(Path.of("resources", name + TKit.ICON_SUFFIX)); diff --git a/test/jdk/tools/jpackage/share/InstallDirTest.java b/test/jdk/tools/jpackage/share/InstallDirTest.java index 5106eed3fc6..db22077cd62 100644 --- a/test/jdk/tools/jpackage/share/InstallDirTest.java +++ b/test/jdk/tools/jpackage/share/InstallDirTest.java @@ -34,8 +34,6 @@ import jdk.jpackage.test.JPackageStringBundle; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import jdk.jpackage.test.RunnablePackageTest.Action; -import jdk.jpackage.test.TKit; -import jdk.jpackage.test.TKit.TextStreamVerifier; /** * Test --install-dir parameter. Output of the test should be @@ -113,9 +111,9 @@ public class InstallDirTest { .run(); } - record DmgTestSpec(Path installDir, boolean runtimeInstaller) { + record TestSpec(Path installDir, boolean runtimeInstaller) { - DmgTestSpec { + TestSpec { Objects.requireNonNull(installDir); } @@ -135,8 +133,8 @@ public class InstallDirTest { return this; } - DmgTestSpec create() { - return new DmgTestSpec(installDir, runtimeInstaller); + TestSpec create() { + return new TestSpec(installDir, runtimeInstaller); } private Path installDir; @@ -154,7 +152,7 @@ public class InstallDirTest { } void run() { - final var test = new PackageTest().forTypes(PackageType.MAC_DMG).ignoreBundleOutputDir(); + final var test = new PackageTest().ignoreBundleOutputDir(); if (runtimeInstaller) { test.addInitializer(cmd -> { cmd.removeArgumentWithValue("--input"); @@ -164,33 +162,33 @@ public class InstallDirTest { } test.addInitializer(JPackageCommand::setFakeRuntime).addInitializer(cmd -> { - cmd.addArguments("--install-dir", installDir); + cmd.setArgumentValue("--install-dir", installDir); }).run(Action.CREATE_AND_UNPACK); } } @Test(ifOS = OperatingSystem.MACOS) @ParameterSupplier - public static void testDmg(DmgTestSpec testSpec) { + public static void testMac(TestSpec testSpec) { testSpec.run(); } - public static List testDmg() { + public static List testMac() { return Stream.of( - DmgTestSpec.build().acceptedInstallDir("/foo"), - DmgTestSpec.build().acceptedInstallDir("/foo/bar"), - DmgTestSpec.build().acceptedInstallDir("/foo").runtimeInstaller(), - DmgTestSpec.build().acceptedInstallDir("/foo/bar").runtimeInstaller(), + TestSpec.build().acceptedInstallDir("/foo"), + TestSpec.build().acceptedInstallDir("/foo/bar"), + TestSpec.build().acceptedInstallDir("/foo").runtimeInstaller(), + TestSpec.build().acceptedInstallDir("/foo/bar").runtimeInstaller(), - DmgTestSpec.build().acceptedInstallDir("/Library/Java/JavaVirtualMachines"), - DmgTestSpec.build().acceptedInstallDir("/Applications").runtimeInstaller(), + TestSpec.build().acceptedInstallDir("/Library/Java/JavaVirtualMachines"), + TestSpec.build().acceptedInstallDir("/Applications").runtimeInstaller(), - DmgTestSpec.build().acceptedInstallDir("/Applications"), - DmgTestSpec.build().acceptedInstallDir("/Applications/foo/bar/buz"), + TestSpec.build().acceptedInstallDir("/Applications"), + TestSpec.build().acceptedInstallDir("/Applications/foo/bar/buz"), - DmgTestSpec.build().runtimeInstaller().acceptedInstallDir("/Library/Java/JavaVirtualMachines"), - DmgTestSpec.build().runtimeInstaller().acceptedInstallDir("/Library/Java/JavaVirtualMachines/foo/bar/buz") - ).map(DmgTestSpec.Builder::create).map(testSpec -> { + TestSpec.build().runtimeInstaller().acceptedInstallDir("/Library/Java/JavaVirtualMachines"), + TestSpec.build().runtimeInstaller().acceptedInstallDir("/Library/Java/JavaVirtualMachines/foo/bar/buz") + ).map(TestSpec.Builder::create).map(testSpec -> { return new Object[] { testSpec }; }).toList(); } diff --git a/test/jdk/tools/jpackage/share/MultiLauncherTwoPhaseTest.java b/test/jdk/tools/jpackage/share/MultiLauncherTwoPhaseTest.java index d348b5c170d..0786255893f 100644 --- a/test/jdk/tools/jpackage/share/MultiLauncherTwoPhaseTest.java +++ b/test/jdk/tools/jpackage/share/MultiLauncherTwoPhaseTest.java @@ -22,13 +22,12 @@ */ import java.nio.file.Path; -import java.io.IOException; import jdk.jpackage.test.AdditionalLauncher; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.JPackageCommand; /** * Test multiple launchers in two phases. First test creates app image and then @@ -55,7 +54,7 @@ import jdk.jpackage.test.JPackageCommand; public class MultiLauncherTwoPhaseTest { @Test - public static void test() throws IOException { + public static void test() { Path appimageOutput = TKit.createTempDirectory("appimage"); JPackageCommand appImageCmd = JPackageCommand.helloAppImage() @@ -68,12 +67,9 @@ public class MultiLauncherTwoPhaseTest { launcher2.applyTo(appImageCmd); PackageTest packageTest = new PackageTest() - .addRunOnceInitializer(() -> appImageCmd.execute()) + .addRunOnceInitializer(appImageCmd::execute) .addBundleDesktopIntegrationVerifier(true) - .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); - }) + .usePredefinedAppImage(appImageCmd) .forTypes(PackageType.WINDOWS) .addInitializer(cmd -> { cmd.addArguments("--win-shortcut", "--win-menu", diff --git a/test/jdk/tools/jpackage/share/MultiNameTwoPhaseTest.java b/test/jdk/tools/jpackage/share/MultiNameTwoPhaseTest.java index de8412c2839..6d4c597cb51 100644 --- a/test/jdk/tools/jpackage/share/MultiNameTwoPhaseTest.java +++ b/test/jdk/tools/jpackage/share/MultiNameTwoPhaseTest.java @@ -22,13 +22,12 @@ */ import java.nio.file.Path; -import java.io.IOException; +import jdk.jpackage.test.Annotations.Parameter; +import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.PackageType; import jdk.jpackage.test.TKit; -import jdk.jpackage.test.Annotations.Test; -import jdk.jpackage.test.Annotations.Parameter; -import jdk.jpackage.test.JPackageCommand; /** * Test creation of packages in tho phases with different names. @@ -58,9 +57,7 @@ public class MultiNameTwoPhaseTest { @Parameter({"MultiNameTest", ""}) @Parameter({"", "MultiNameTestInstaller"}) @Parameter({"", ""}) - public static void test(String... testArgs) throws IOException { - String appName = testArgs[0]; - String installName = testArgs[1]; + public static void test(String appName, String installName) { Path appimageOutput = TKit.createTempDirectory("appimage"); @@ -74,9 +71,8 @@ public class MultiNameTwoPhaseTest { PackageTest packageTest = new PackageTest() .addRunOnceInitializer(() -> appImageCmd.execute()) .addBundleDesktopIntegrationVerifier(true) + .usePredefinedAppImage(appImageCmd) .addInitializer(cmd -> { - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); cmd.removeArgumentWithValue("--name"); if (!installName.isEmpty()) { cmd.addArguments("--name", installName); diff --git a/test/jdk/tools/jpackage/share/PostImageScriptTest.java b/test/jdk/tools/jpackage/share/PostImageScriptTest.java index 68ded999e4a..5e9127d8fa8 100644 --- a/test/jdk/tools/jpackage/share/PostImageScriptTest.java +++ b/test/jdk/tools/jpackage/share/PostImageScriptTest.java @@ -107,10 +107,7 @@ public class PostImageScriptTest { }); } case EXTERNAL_APP_IMAGE -> { - test.addInitializer(cmd -> { - cmd.removeArgumentWithValue("--input"); - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - }); + test.usePredefinedAppImage(appImageCmd); } } diff --git a/test/jdk/tools/jpackage/share/ServiceTest.java b/test/jdk/tools/jpackage/share/ServiceTest.java index 56e003f508c..226f8f16bdc 100644 --- a/test/jdk/tools/jpackage/share/ServiceTest.java +++ b/test/jdk/tools/jpackage/share/ServiceTest.java @@ -243,10 +243,7 @@ public class ServiceTest { new PackageTest().excludeTypes(MAC_DMG) .addRunOnceInitializer(appImageCmd.cmd().orElseThrow()::execute) - .addInitializer(cmd -> { - cmd.removeArgumentWithValue("--input"); - cmd.addArguments("--app-image", appImageCmd.cmd().orElseThrow().outputBundle()); - }) + .usePredefinedAppImage(appImageCmd.cmd().orElseThrow()) .addInitializer(cmd -> { if (mainLauncherAsService) { cmd.addArgument("--launcher-as-service"); diff --git a/test/jdk/tools/jpackage/windows/Win8282351Test.java b/test/jdk/tools/jpackage/windows/Win8282351Test.java index 55357437762..93731c7cfc6 100644 --- a/test/jdk/tools/jpackage/windows/Win8282351Test.java +++ b/test/jdk/tools/jpackage/windows/Win8282351Test.java @@ -24,9 +24,11 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import jdk.jpackage.test.PackageTest; -import jdk.jpackage.test.JPackageCommand; +import java.util.List; +import java.util.stream.Stream; import jdk.jpackage.test.Annotations.Test; +import jdk.jpackage.test.JPackageCommand; +import jdk.jpackage.test.PackageTest; import jdk.jpackage.test.RunnablePackageTest.Action; import jdk.jpackage.test.TKit; @@ -48,13 +50,13 @@ import jdk.jpackage.test.TKit; public class Win8282351Test { @Test - public void test() throws IOException { + public void test() { Path appimageOutput = TKit.createTempDirectory("appimage"); JPackageCommand appImageCmd = JPackageCommand.helloAppImage() .setFakeRuntime().setArgumentValue("--dest", appimageOutput); - String[] filesWithDollarCharsInNames = new String[]{ + var filesWithDollarCharsInNames = Stream.of( "Pane$$anon$$greater$1.class", "$", "$$", @@ -63,11 +65,11 @@ public class Win8282351Test { "$$$$$", "foo$.class", "1$b$$a$$$r$$$$.class" - }; + ).map(Path::of).toList(); - String[] dirsWithDollarCharsInNames = new String[]{ - Path.of("foo", String.join("/", filesWithDollarCharsInNames)).toString() - }; + var dirsWithDollarCharsInNames = List.of( + filesWithDollarCharsInNames.stream().reduce(Path.of("foo"), Path::resolve) + ); String name = appImageCmd.name() + "$-$$-$$$"; @@ -75,7 +77,7 @@ public class Win8282351Test { .addRunOnceInitializer(() -> { appImageCmd.execute(); for (var path : filesWithDollarCharsInNames) { - createImageFile(appImageCmd, Path.of(path)); + createImageFile(appImageCmd, path); } for (var path : dirsWithDollarCharsInNames) { @@ -83,16 +85,15 @@ public class Win8282351Test { appImageCmd.outputBundle().resolve(path)); } }) + .usePredefinedAppImage(appImageCmd) .addInitializer(cmd -> { cmd.setArgumentValue("--name", name); - cmd.addArguments("--app-image", appImageCmd.outputBundle()); - cmd.removeArgumentWithValue("--input"); cmd.addArgument("--win-menu"); cmd.addArgument("--win-shortcut"); }) .addInstallVerifier(cmd -> { for (var path : filesWithDollarCharsInNames) { - verifyImageFile(appImageCmd, Path.of(path)); + verifyImageFile(appImageCmd, path); } for (var path : dirsWithDollarCharsInNames) { From c6a88155b519a5d0b22f6009e75a0e6388601756 Mon Sep 17 00:00:00 2001 From: Patricio Chilano Mateo Date: Tue, 4 Nov 2025 23:32:41 +0000 Subject: [PATCH 454/561] 8369238: Allow virtual thread preemption on some common class initialization paths Co-authored-by: Alan Bateman Co-authored-by: Fei Yang Co-authored-by: Richard Reingruber Reviewed-by: sspitsyn, dholmes, coleenp, fbredberg --- .../continuationFreezeThaw_aarch64.inline.hpp | 46 +- .../continuationHelper_aarch64.inline.hpp | 3 + .../cpu/aarch64/interp_masm_aarch64.cpp | 99 +++- .../cpu/aarch64/interp_masm_aarch64.hpp | 16 +- .../cpu/aarch64/macroAssembler_aarch64.cpp | 16 +- .../cpu/aarch64/macroAssembler_aarch64.hpp | 1 + .../smallRegisterMap_aarch64.inline.hpp | 23 +- .../stackChunkFrameStream_aarch64.inline.hpp | 13 +- .../cpu/aarch64/templateTable_aarch64.cpp | 6 +- .../arm/continuationFreezeThaw_arm.inline.hpp | 14 + .../cpu/arm/smallRegisterMap_arm.inline.hpp | 23 +- .../arm/stackChunkFrameStream_arm.inline.hpp | 3 +- .../ppc/continuationFreezeThaw_ppc.inline.hpp | 35 +- .../cpu/ppc/continuationHelper_ppc.inline.hpp | 3 + src/hotspot/cpu/ppc/frame_ppc.hpp | 2 +- src/hotspot/cpu/ppc/interp_masm_ppc.hpp | 4 +- src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp | 65 ++- src/hotspot/cpu/ppc/macroAssembler_ppc.cpp | 35 +- src/hotspot/cpu/ppc/macroAssembler_ppc.hpp | 22 +- .../cpu/ppc/macroAssembler_ppc.inline.hpp | 3 +- .../cpu/ppc/smallRegisterMap_ppc.inline.hpp | 24 +- .../ppc/stackChunkFrameStream_ppc.inline.hpp | 13 +- .../ppc/templateInterpreterGenerator_ppc.cpp | 7 +- src/hotspot/cpu/ppc/templateTable_ppc_64.cpp | 6 +- .../continuationFreezeThaw_riscv.inline.hpp | 46 +- .../riscv/continuationHelper_riscv.inline.hpp | 3 + src/hotspot/cpu/riscv/interp_masm_riscv.cpp | 100 +++- src/hotspot/cpu/riscv/interp_masm_riscv.hpp | 19 +- .../cpu/riscv/macroAssembler_riscv.cpp | 17 +- .../cpu/riscv/macroAssembler_riscv.hpp | 1 + .../riscv/smallRegisterMap_riscv.inline.hpp | 24 +- .../stackChunkFrameStream_riscv.inline.hpp | 13 +- src/hotspot/cpu/riscv/templateTable_riscv.cpp | 6 +- .../continuationFreezeThaw_s390.inline.hpp | 14 + .../cpu/s390/smallRegisterMap_s390.inline.hpp | 23 +- .../stackChunkFrameStream_s390.inline.hpp | 3 +- .../x86/continuationFreezeThaw_x86.inline.hpp | 46 +- .../cpu/x86/continuationHelper_x86.inline.hpp | 3 + src/hotspot/cpu/x86/interp_masm_x86.cpp | 94 +++- src/hotspot/cpu/x86/interp_masm_x86.hpp | 15 +- .../cpu/x86/smallRegisterMap_x86.inline.hpp | 20 +- .../x86/stackChunkFrameStream_x86.inline.hpp | 13 +- src/hotspot/cpu/x86/templateTable_x86.cpp | 8 +- .../continuationFreezeThaw_zero.inline.hpp | 14 + .../cpu/zero/smallRegisterMap_zero.inline.hpp | 23 +- .../stackChunkFrameStream_zero.inline.hpp | 3 +- .../share/cds/aotConstantPoolResolver.cpp | 4 +- src/hotspot/share/cds/heapShared.cpp | 3 +- src/hotspot/share/ci/ciField.cpp | 2 +- src/hotspot/share/classfile/javaClasses.cpp | 6 + src/hotspot/share/classfile/javaClasses.hpp | 2 + src/hotspot/share/classfile/vmClassMacros.hpp | 1 + src/hotspot/share/classfile/vmSymbols.hpp | 3 + .../share/interpreter/interpreterRuntime.cpp | 40 +- .../share/interpreter/interpreterRuntime.hpp | 13 +- .../share/interpreter/linkResolver.cpp | 50 +- .../share/interpreter/linkResolver.hpp | 24 +- src/hotspot/share/jvmci/jvmciCompilerToVM.cpp | 2 +- src/hotspot/share/memory/universe.cpp | 6 + src/hotspot/share/memory/universe.hpp | 1 + src/hotspot/share/oops/instanceKlass.cpp | 59 ++- src/hotspot/share/oops/instanceKlass.hpp | 1 + .../share/oops/instanceStackChunkKlass.cpp | 3 +- src/hotspot/share/oops/klass.cpp | 4 + src/hotspot/share/oops/klass.hpp | 1 + src/hotspot/share/oops/stackChunkOop.cpp | 19 +- src/hotspot/share/oops/stackChunkOop.hpp | 6 + .../share/oops/stackChunkOop.inline.hpp | 17 +- src/hotspot/share/prims/jvmtiExport.cpp | 14 +- src/hotspot/share/prims/jvmtiExport.hpp | 17 +- src/hotspot/share/prims/methodHandles.cpp | 4 +- src/hotspot/share/runtime/continuation.hpp | 5 +- .../share/runtime/continuationFreezeThaw.cpp | 361 +++++++++++-- .../share/runtime/continuationJavaClasses.cpp | 2 + .../share/runtime/continuationJavaClasses.hpp | 10 + .../continuationJavaClasses.inline.hpp | 16 + src/hotspot/share/runtime/frame.cpp | 36 +- src/hotspot/share/runtime/frame.hpp | 3 +- src/hotspot/share/runtime/javaCalls.cpp | 3 +- src/hotspot/share/runtime/javaThread.cpp | 4 + src/hotspot/share/runtime/javaThread.hpp | 47 +- src/hotspot/share/runtime/objectMonitor.cpp | 28 +- src/hotspot/share/runtime/objectMonitor.hpp | 6 +- .../share/runtime/smallRegisterMap.inline.hpp | 15 + .../share/runtime/stackChunkFrameStream.hpp | 16 +- .../runtime/stackChunkFrameStream.inline.hpp | 7 +- src/hotspot/share/runtime/stackValue.cpp | 4 +- src/hotspot/share/runtime/synchronizer.cpp | 35 +- src/hotspot/share/runtime/synchronizer.hpp | 7 +- .../share/runtime/synchronizer.inline.hpp | 4 + src/hotspot/share/runtime/threads.cpp | 1 + src/hotspot/share/utilities/exceptions.cpp | 31 ++ src/hotspot/share/utilities/exceptions.hpp | 10 + .../classes/java/lang/VirtualThread.java | 6 +- .../jdk/internal/vm/PreemptedException.java | 41 ++ test/hotspot/gtest/oops/test_markWord.cpp | 2 +- .../SingleStepKlassInit.java | 90 ++++ .../libSingleStepKlassInit.cpp | 86 +++ .../java/lang/Thread/virtual/JfrEvents.java | 10 +- .../java/lang/Thread/virtual/KlassInit.java | 490 ++++++++++++++++++ .../lang/Thread/virtual/YieldQueuing.java | 8 + .../stress/LotsOfContendedMonitorEnter.java | 25 +- 102 files changed, 2252 insertions(+), 449 deletions(-) create mode 100644 src/java.base/share/classes/jdk/internal/vm/PreemptedException.java create mode 100644 test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/SingleStepKlassInit.java create mode 100644 test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/libSingleStepKlassInit.cpp create mode 100644 test/jdk/java/lang/Thread/virtual/KlassInit.java diff --git a/src/hotspot/cpu/aarch64/continuationFreezeThaw_aarch64.inline.hpp b/src/hotspot/cpu/aarch64/continuationFreezeThaw_aarch64.inline.hpp index 1fd59b81d9e..a1a5209de7a 100644 --- a/src/hotspot/cpu/aarch64/continuationFreezeThaw_aarch64.inline.hpp +++ b/src/hotspot/cpu/aarch64/continuationFreezeThaw_aarch64.inline.hpp @@ -200,6 +200,41 @@ inline void FreezeBase::patch_pd_unused(intptr_t* sp) { *fp_addr = badAddressVal; } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + intptr_t* sp = _top_frame.sp(); + if (_top_frame.is_interpreted_frame()) { + // In case the top frame is interpreted we need to set up the anchor using + // the last_sp saved in the frame (remove possible alignment added while + // thawing, see ThawBase::finish_thaw()). We also clear last_sp to match + // the behavior when calling the VM from the interpreter (we check for this + // in FreezeBase::prepare_freeze_interpreted_top_frame, which can be reached + // if preempting again at redo_vmcall()). + _last_sp_from_frame = _top_frame.interpreter_frame_last_sp(); + assert(_last_sp_from_frame != nullptr, ""); + _top_frame.interpreter_frame_set_last_sp(nullptr); + if (sp != _last_sp_from_frame) { + // We need to move up return pc and fp. They will be read next in + // set_anchor() and set as _last_Java_pc and _last_Java_fp respectively. + _last_sp_from_frame[-1] = (intptr_t)_top_frame.pc(); + _last_sp_from_frame[-2] = (intptr_t)_top_frame.fp(); + } + _is_interpreted = true; + sp = _last_sp_from_frame; + } + return sp; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + if (_is_interpreted) { + // Restore last_sp_from_frame and possibly overwritten pc. + _top_frame.interpreter_frame_set_last_sp(_last_sp_from_frame); + intptr_t* sp = _top_frame.sp(); + if (sp != _last_sp_from_frame) { + sp[-1] = (intptr_t)_top_frame.pc(); + } + } +} + //////// Thaw // Fast path @@ -304,10 +339,17 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { frame enterSpecial = new_entry_frame(); intptr_t* sp = enterSpecial.sp(); + // We only need to set the return pc. rfp will be restored back in gen_continuation_enter(). sp[-1] = (intptr_t)ContinuationEntry::cleanup_pc(); - sp[-2] = (intptr_t)enterSpecial.fp(); + return sp; +} - log_develop_trace(continuations, preempt)("push_cleanup_continuation initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT, p2i(sp + 2 * frame::metadata_words), p2i(sp)); +inline intptr_t* ThawBase::push_preempt_adapter() { + frame enterSpecial = new_entry_frame(); + intptr_t* sp = enterSpecial.sp(); + + // We only need to set the return pc. rfp will be restored back in generate_cont_preempt_stub(). + sp[-1] = (intptr_t)StubRoutines::cont_preempt_stub(); return sp; } diff --git a/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp b/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp index e39580369db..19a892f5ff8 100644 --- a/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp +++ b/src/hotspot/cpu/aarch64/continuationHelper_aarch64.inline.hpp @@ -52,6 +52,9 @@ static inline void patch_return_pc_with_preempt_stub(frame& f) { // The target will check for preemption once it returns to the interpreter // or the native wrapper code and will manually jump to the preempt stub. JavaThread *thread = JavaThread::current(); + DEBUG_ONLY(Method* m = f.is_interpreted_frame() ? f.interpreter_frame_method() : f.cb()->as_nmethod()->method();) + assert(m->is_object_wait0() || thread->interp_at_preemptable_vmcall_cnt() > 0, + "preemptable VM call not using call_VM_preemptable"); thread->set_preempt_alternate_return(StubRoutines::cont_preempt_stub()); } } diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp index 6f8795494a2..cf4d5a63496 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp @@ -479,6 +479,14 @@ void InterpreterMacroAssembler::remove_activation(TosState state, // result check if synchronized method Label unlocked, unlock, no_unlock; +#ifdef ASSERT + Label not_preempted; + ldr(rscratch1, Address(rthread, JavaThread::preempt_alternate_return_offset())); + cbz(rscratch1, not_preempted); + stop("remove_activation: should not have alternate return address set"); + bind(not_preempted); +#endif /* ASSERT */ + // get the value of _do_not_unlock_if_synchronized into r3 const Address do_not_unlock_if_synchronized(rthread, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset())); @@ -1371,6 +1379,7 @@ void InterpreterMacroAssembler::call_VM_leaf_base(address entry_point, void InterpreterMacroAssembler::call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions) { @@ -1394,26 +1403,34 @@ void InterpreterMacroAssembler::call_VM_base(Register oop_result, #endif /* ASSERT */ // super call MacroAssembler::call_VM_base(oop_result, noreg, last_java_sp, - entry_point, number_of_arguments, - check_exceptions); + return_pc, entry_point, + number_of_arguments, check_exceptions); // interpreter specific restore_bcp(); restore_locals(); } -void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, - address entry_point, - Register arg_1) { - assert(arg_1 == c_rarg1, ""); +void InterpreterMacroAssembler::call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions) { + assert(InterpreterRuntime::is_preemptable_call(entry_point), "VM call not preemptable, should use call_VM()"); Label resume_pc, not_preempted; #ifdef ASSERT { - Label L; + Label L1, L2; ldr(rscratch1, Address(rthread, JavaThread::preempt_alternate_return_offset())); - cbz(rscratch1, L); - stop("Should not have alternate return address set"); - bind(L); + cbz(rscratch1, L1); + stop("call_VM_preemptable_helper: Should not have alternate return address set"); + bind(L1); + // We check this counter in patch_return_pc_with_preempt_stub() during freeze. + incrementw(Address(rthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + ldrw(rscratch1, Address(rthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + cmpw(rscratch1, 0); + br(Assembler::GT, L2); + stop("call_VM_preemptable_helper: should be > 0"); + bind(L2); } #endif /* ASSERT */ @@ -1421,12 +1438,23 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, push_cont_fastpath(); // Make VM call. In case of preemption set last_pc to the one we want to resume to. - adr(rscratch1, resume_pc); - str(rscratch1, Address(rthread, JavaThread::last_Java_pc_offset())); - call_VM_base(oop_result, noreg, noreg, entry_point, 1, false /*check_exceptions*/); + // Note: call_VM_base will use resume_pc label to set last_Java_pc. + call_VM_base(noreg, noreg, noreg, &resume_pc, entry_point, number_of_arguments, false /*check_exceptions*/); pop_cont_fastpath(); +#ifdef ASSERT + { + Label L; + decrementw(Address(rthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + ldrw(rscratch1, Address(rthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + cmpw(rscratch1, 0); + br(Assembler::GE, L); + stop("call_VM_preemptable_helper: should be >= 0"); + bind(L); + } +#endif /* ASSERT */ + // Check if preempted. ldr(rscratch1, Address(rthread, JavaThread::preempt_alternate_return_offset())); cbz(rscratch1, not_preempted); @@ -1438,6 +1466,51 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, restore_after_resume(false /* is_native */); bind(not_preempted); + if (check_exceptions) { + // check for pending exceptions + ldr(rscratch1, Address(rthread, in_bytes(Thread::pending_exception_offset()))); + Label ok; + cbz(rscratch1, ok); + lea(rscratch1, RuntimeAddress(StubRoutines::forward_exception_entry())); + br(rscratch1); + bind(ok); + } + + // get oop result if there is one and reset the value in the thread + if (oop_result->is_valid()) { + get_vm_result_oop(oop_result, rthread); + } +} + +static void pass_arg1(MacroAssembler* masm, Register arg) { + if (c_rarg1 != arg ) { + masm->mov(c_rarg1, arg); + } +} + +static void pass_arg2(MacroAssembler* masm, Register arg) { + if (c_rarg2 != arg ) { + masm->mov(c_rarg2, arg); + } +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + bool check_exceptions) { + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 1, check_exceptions); +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions) { + LP64_ONLY(assert_different_registers(arg_1, c_rarg2)); + pass_arg2(this, arg_2); + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 2, check_exceptions); } void InterpreterMacroAssembler::restore_after_resume(bool is_native) { diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp index e07e6e49f53..2b230a3b73e 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.hpp @@ -45,6 +45,7 @@ class InterpreterMacroAssembler: public MacroAssembler { virtual void call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions); @@ -58,11 +59,24 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_earlyret_value(TosState state); + // Use for vthread preemption void call_VM_preemptable(Register oop_result, address entry_point, - Register arg_1); + Register arg_1, + bool check_exceptions = true); + void call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions = true); void restore_after_resume(bool is_native); + private: + void call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions); + public: void jump_to_entry(address entry); virtual void check_and_handle_popframe(Register java_thread); diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index 14009789319..e6dd29f105a 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -743,13 +743,10 @@ static void pass_arg3(MacroAssembler* masm, Register arg) { } } -static bool is_preemptable(address entry_point) { - return entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter); -} - void MacroAssembler::call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions) { @@ -782,12 +779,7 @@ void MacroAssembler::call_VM_base(Register oop_result, assert(last_java_sp != rfp, "can't use rfp"); Label l; - if (is_preemptable(entry_point)) { - // skip setting last_pc since we already set it to desired value. - set_last_Java_frame(last_java_sp, rfp, noreg, rscratch1); - } else { - set_last_Java_frame(last_java_sp, rfp, l, rscratch1); - } + set_last_Java_frame(last_java_sp, rfp, return_pc != nullptr ? *return_pc : l, rscratch1); // do the call, remove parameters MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments, &l); @@ -822,7 +814,7 @@ void MacroAssembler::call_VM_base(Register oop_result, } void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) { - call_VM_base(oop_result, noreg, noreg, entry_point, number_of_arguments, check_exceptions); + call_VM_base(oop_result, noreg, noreg, nullptr, entry_point, number_of_arguments, check_exceptions); } // Check the entry target is always reachable from any branch. @@ -1080,7 +1072,7 @@ void MacroAssembler::call_VM(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) { - call_VM_base(oop_result, rthread, last_java_sp, entry_point, number_of_arguments, check_exceptions); + call_VM_base(oop_result, rthread, last_java_sp, nullptr, entry_point, number_of_arguments, check_exceptions); } void MacroAssembler::call_VM(Register oop_result, diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index d5a16e424e4..7bfc6c562e3 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -81,6 +81,7 @@ class MacroAssembler: public Assembler { Register oop_result, // where an oop-result ends up if any; use noreg otherwise Register java_thread, // the thread if computed before ; use noreg otherwise Register last_java_sp, // to set up last_Java_frame in stubs; use noreg otherwise + Label* return_pc, // to set up last_Java_frame; use nullptr otherwise address entry_point, // the entry point int number_of_arguments, // the number of arguments (w/o thread) to pop after the call bool check_exceptions // whether to check for pending exceptions after return diff --git a/src/hotspot/cpu/aarch64/smallRegisterMap_aarch64.inline.hpp b/src/hotspot/cpu/aarch64/smallRegisterMap_aarch64.inline.hpp index 45e8f2f4202..dd00e765eea 100644 --- a/src/hotspot/cpu/aarch64/smallRegisterMap_aarch64.inline.hpp +++ b/src/hotspot/cpu/aarch64/smallRegisterMap_aarch64.inline.hpp @@ -28,18 +28,17 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" -// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +class SmallRegisterMap; + +// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap +template +class SmallRegisterMapType { + friend SmallRegisterMap; + + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } -private: static void assert_is_rfp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ assert (r == rfp->as_VMReg() || r == rfp->as_VMReg()->next(), "Reg: %s", r->name()); }) public: @@ -71,7 +70,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/aarch64/stackChunkFrameStream_aarch64.inline.hpp b/src/hotspot/cpu/aarch64/stackChunkFrameStream_aarch64.inline.hpp index 8a221f13772..8d2f013e116 100644 --- a/src/hotspot/cpu/aarch64/stackChunkFrameStream_aarch64.inline.hpp +++ b/src/hotspot/cpu/aarch64/stackChunkFrameStream_aarch64.inline.hpp @@ -108,17 +108,14 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { assert_is_interpreted_and_frame_type_mixed(); ResourceMark rm; - InterpreterOopMap mask; frame f = to_frame(); - f.interpreted_frame_oop_map(&mask); - return mask.num_oops() - + 1 // for the mirror oop - + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot - + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(), - (intptr_t*)f.interpreter_frame_monitor_end())/BasicObjectLock::size(); + InterpreterOopCount closure; + f.oops_interpreted_do(&closure, map); + return closure.count(); } template<> diff --git a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp index f4774f31bbd..cde142b39ac 100644 --- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp @@ -2304,7 +2304,7 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ mov(temp, (int) code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_method_entry(Rcache, index); @@ -2356,7 +2356,7 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ mov(temp, (int) code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_field_entry(Rcache, index); @@ -3700,7 +3700,7 @@ void TemplateTable::_new() { __ bind(slow_case); __ get_constant_pool(c_rarg1); __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1); - call_VM(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); + __ call_VM_preemptable(r0, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); __ verify_oop(r0); // continue diff --git a/src/hotspot/cpu/arm/continuationFreezeThaw_arm.inline.hpp b/src/hotspot/cpu/arm/continuationFreezeThaw_arm.inline.hpp index 389cf4dc936..05172ffeba3 100644 --- a/src/hotspot/cpu/arm/continuationFreezeThaw_arm.inline.hpp +++ b/src/hotspot/cpu/arm/continuationFreezeThaw_arm.inline.hpp @@ -68,6 +68,15 @@ inline void FreezeBase::patch_stack_pd(intptr_t* frame_sp, intptr_t* heap_sp) { Unimplemented(); } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + Unimplemented(); + return nullptr; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + Unimplemented(); +} + inline frame ThawBase::new_entry_frame() { Unimplemented(); return frame(); @@ -100,6 +109,11 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { return nullptr; } +inline intptr_t* ThawBase::push_preempt_adapter() { + Unimplemented(); + return nullptr; +} + template inline void Thaw::patch_caller_links(intptr_t* sp, intptr_t* bottom) { Unimplemented(); diff --git a/src/hotspot/cpu/arm/smallRegisterMap_arm.inline.hpp b/src/hotspot/cpu/arm/smallRegisterMap_arm.inline.hpp index 903a71aab53..1223384d3b7 100644 --- a/src/hotspot/cpu/arm/smallRegisterMap_arm.inline.hpp +++ b/src/hotspot/cpu/arm/smallRegisterMap_arm.inline.hpp @@ -28,18 +28,17 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" -// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +class SmallRegisterMap; + +// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap +template +class SmallRegisterMapType { + friend SmallRegisterMap; + + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } -private: static void assert_is_rfp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ Unimplemented(); }) public: @@ -69,7 +68,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/arm/stackChunkFrameStream_arm.inline.hpp b/src/hotspot/cpu/arm/stackChunkFrameStream_arm.inline.hpp index ae97ec60f32..2da68d6d5ee 100644 --- a/src/hotspot/cpu/arm/stackChunkFrameStream_arm.inline.hpp +++ b/src/hotspot/cpu/arm/stackChunkFrameStream_arm.inline.hpp @@ -85,7 +85,8 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { Unimplemented(); return 0; } diff --git a/src/hotspot/cpu/ppc/continuationFreezeThaw_ppc.inline.hpp b/src/hotspot/cpu/ppc/continuationFreezeThaw_ppc.inline.hpp index fa878b07d43..e35bdae70d6 100644 --- a/src/hotspot/cpu/ppc/continuationFreezeThaw_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/continuationFreezeThaw_ppc.inline.hpp @@ -72,9 +72,16 @@ void FreezeBase::adjust_interpreted_frame_unextended_sp(frame& f) { } inline void FreezeBase::prepare_freeze_interpreted_top_frame(frame& f) { - // nothing to do - DEBUG_ONLY( intptr_t* lspp = (intptr_t*) &(f.get_ijava_state()->top_frame_sp); ) - assert(*lspp == f.unextended_sp() - f.fp(), "should be " INTPTR_FORMAT " usp:" INTPTR_FORMAT " fp:" INTPTR_FORMAT, *lspp, p2i(f.unextended_sp()), p2i(f.fp())); + // Nothing to do. We don't save a last sp since we cannot use sp as esp. + // Instead the top frame is trimmed when making an i2i call. The original + // top_frame_sp is set when the frame is pushed (see generate_fixed_frame()). + // An interpreter top frame that was just thawed is resized to top_frame_sp by the + // resume adapter (see generate_cont_resume_interpreter_adapter()). So the assertion is + // false, if we freeze again right after thawing as we do when redoing a vm call wasn't + // successful. + assert(_thread->interp_redoing_vm_call() || + ((intptr_t*)f.at_relative(ijava_idx(top_frame_sp)) == f.unextended_sp()), + "top_frame_sp:" PTR_FORMAT " usp:" PTR_FORMAT, f.at_relative(ijava_idx(top_frame_sp)), p2i(f.unextended_sp())); } inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, const frame& hf) { @@ -337,6 +344,15 @@ inline void FreezeBase::patch_pd(frame& hf, const frame& caller) { inline void FreezeBase::patch_pd_unused(intptr_t* sp) { } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + // Nothing to do on PPC because the interpreter does not use SP as expression stack pointer. + // Instead there is a dedicated register R15_esp which is not affected by VM calls. + return _top_frame.sp(); +} + +inline void AnchorMark::anchor_mark_clear_pd() { +} + //////// Thaw // Fast path @@ -566,6 +582,19 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { return enterSpecial.sp(); } +inline intptr_t* ThawBase::push_preempt_adapter() { + frame enterSpecial = new_entry_frame(); + frame::common_abi* enterSpecial_abi = (frame::common_abi*)enterSpecial.sp(); + + enterSpecial_abi->lr = (intptr_t)StubRoutines::cont_preempt_stub(); + + log_develop_trace(continuations, preempt)("push_preempt_adapter enterSpecial sp: " INTPTR_FORMAT " adapter pc: " INTPTR_FORMAT, + p2i(enterSpecial_abi), + p2i(StubRoutines::cont_preempt_stub())); + + return enterSpecial.sp(); +} + inline void ThawBase::patch_pd(frame& f, const frame& caller) { patch_callee_link(caller, caller.fp()); // Prevent assertion if f gets deoptimized right away before it's fully initialized diff --git a/src/hotspot/cpu/ppc/continuationHelper_ppc.inline.hpp b/src/hotspot/cpu/ppc/continuationHelper_ppc.inline.hpp index d55bf0da3e3..7c6d19d442b 100644 --- a/src/hotspot/cpu/ppc/continuationHelper_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/continuationHelper_ppc.inline.hpp @@ -37,6 +37,9 @@ static inline void patch_return_pc_with_preempt_stub(frame& f) { // The target will check for preemption once it returns to the interpreter // or the native wrapper code and will manually jump to the preempt stub. JavaThread *thread = JavaThread::current(); + DEBUG_ONLY(Method* m = f.is_interpreted_frame() ? f.interpreter_frame_method() : f.cb()->as_nmethod()->method();) + assert(m->is_object_wait0() || thread->interp_at_preemptable_vmcall_cnt() > 0, + "preemptable VM call not using call_VM_preemptable"); thread->set_preempt_alternate_return(StubRoutines::cont_preempt_stub()); } } diff --git a/src/hotspot/cpu/ppc/frame_ppc.hpp b/src/hotspot/cpu/ppc/frame_ppc.hpp index 188015f5cd9..ebe5d24c072 100644 --- a/src/hotspot/cpu/ppc/frame_ppc.hpp +++ b/src/hotspot/cpu/ppc/frame_ppc.hpp @@ -215,7 +215,7 @@ uint64_t bcp; uint64_t esp; uint64_t mdx; - uint64_t top_frame_sp; // Maybe define parent_frame_abi and move there. + uint64_t top_frame_sp; // Original sp to be restored when returning from an i2i call uint64_t sender_sp; // Slots only needed for native calls. Maybe better to move elsewhere. uint64_t oop_tmp; diff --git a/src/hotspot/cpu/ppc/interp_masm_ppc.hpp b/src/hotspot/cpu/ppc/interp_masm_ppc.hpp index 9140dd7ca4e..4ea33ebaf63 100644 --- a/src/hotspot/cpu/ppc/interp_masm_ppc.hpp +++ b/src/hotspot/cpu/ppc/interp_masm_ppc.hpp @@ -49,12 +49,14 @@ class InterpreterMacroAssembler: public MacroAssembler { virtual void check_and_handle_popframe(Register scratch_reg); virtual void check_and_handle_earlyret(Register scratch_reg); + // Use for vthread preemption void call_VM_preemptable(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true); + void call_VM_preemptable(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true); void restore_after_resume(Register fp); // R22 and R31 are preserved when a vthread gets preempted in the interpreter. // The interpreter already assumes that these registers are nonvolatile across native calls. bool nonvolatile_accross_vthread_preemtion(Register r) const { - return r->is_nonvolatile() && ((r == R22) || (r == R31)); + return r->is_nonvolatile() && ((r == R24) || (r == R31)); } // Base routine for all dispatches. diff --git a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp index 503cc259432..0d32ea8003e 100644 --- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp @@ -108,6 +108,8 @@ void InterpreterMacroAssembler::dispatch_prolog(TosState state, int bcp_incr) { // own dispatch. The dispatch address in R24_dispatch_addr is used for the // dispatch. void InterpreterMacroAssembler::dispatch_epilog(TosState state, int bcp_incr) { + assert(nonvolatile_accross_vthread_preemtion(R24_dispatch_addr), + "Requirement of field accesses (e.g. putstatic)"); if (bcp_incr) { addi(R14_bcp, R14_bcp, bcp_incr); } mtctr(R24_dispatch_addr); bcctr(bcondAlways, 0, bhintbhBCCTRisNotPredictable); @@ -862,6 +864,9 @@ void InterpreterMacroAssembler::remove_activation(TosState state, bool install_monitor_exception) { BLOCK_COMMENT("remove_activation {"); + asm_assert_mem8_is_zero(in_bytes(JavaThread::preempt_alternate_return_offset()), R16_thread, + "remove_activation: should not have alternate return address set"); + unlock_if_synchronized_method(state, throw_monitor_exception, install_monitor_exception); // The below poll is for the stack watermark barrier. It allows fixing up frames lazily, @@ -2014,35 +2019,67 @@ void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point } void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, address entry_point, - Register arg_1, bool check_exceptions) { + Register arg_1, + bool check_exceptions) { if (!Continuations::enabled()) { call_VM(oop_result, entry_point, arg_1, check_exceptions); return; } + call_VM_preemptable(oop_result, entry_point, arg_1, noreg /* arg_2 */, check_exceptions); +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, address entry_point, + Register arg_1, Register arg_2, + bool check_exceptions) { + if (!Continuations::enabled()) { + call_VM(oop_result, entry_point, arg_1, arg_2, check_exceptions); + return; + } Label resume_pc, not_preempted; + Register tmp = R11_scratch1; + assert_different_registers(arg_1, tmp); + assert_different_registers(arg_2, tmp); - DEBUG_ONLY(ld(R0, in_bytes(JavaThread::preempt_alternate_return_offset()), R16_thread)); - DEBUG_ONLY(cmpdi(CR0, R0, 0)); - asm_assert_eq("Should not have alternate return address set"); +#ifdef ASSERT + asm_assert_mem8_is_zero(in_bytes(JavaThread::preempt_alternate_return_offset()), R16_thread, + "Should not have alternate return address set"); + // We check this counter in patch_return_pc_with_preempt_stub() during freeze. + lwa(tmp, in_bytes(JavaThread::interp_at_preemptable_vmcall_cnt_offset()), R16_thread); + addi(tmp, tmp, 1); + cmpwi(CR0, tmp, 0); + stw(tmp, in_bytes(JavaThread::interp_at_preemptable_vmcall_cnt_offset()), R16_thread); + asm_assert(gt, "call_VM_preemptable: should be > 0"); +#endif // ASSERT // Preserve 2 registers - assert(nonvolatile_accross_vthread_preemtion(R31) && nonvolatile_accross_vthread_preemtion(R22), ""); + assert(nonvolatile_accross_vthread_preemtion(R31) && nonvolatile_accross_vthread_preemtion(R24), ""); ld(R3_ARG1, _abi0(callers_sp), R1_SP); // load FP std(R31, _ijava_state_neg(lresult), R3_ARG1); - std(R22, _ijava_state_neg(fresult), R3_ARG1); + std(R24, _ijava_state_neg(fresult), R3_ARG1); // We set resume_pc as last java pc. It will be saved if the vthread gets preempted. // Later execution will continue right there. mr_if_needed(R4_ARG2, arg_1); + assert(arg_2 != R4_ARG2, "smashed argument"); + mr_if_needed(R5_ARG3, arg_2, true /* allow_noreg */); push_cont_fastpath(); - call_VM(oop_result, entry_point, false /*check_exceptions*/, &resume_pc /* last_java_pc */); + call_VM(noreg /* oop_result */, entry_point, false /*check_exceptions*/, &resume_pc /* last_java_pc */); pop_cont_fastpath(); +#ifdef ASSERT + lwa(tmp, in_bytes(JavaThread::interp_at_preemptable_vmcall_cnt_offset()), R16_thread); + addi(tmp, tmp, -1); + cmpwi(CR0, tmp, 0); + stw(tmp, in_bytes(JavaThread::interp_at_preemptable_vmcall_cnt_offset()), R16_thread); + asm_assert(ge, "call_VM_preemptable: should be >= 0"); +#endif // ASSERT + // Jump to handler if the call was preempted ld(R0, in_bytes(JavaThread::preempt_alternate_return_offset()), R16_thread); cmpdi(CR0, R0, 0); beq(CR0, not_preempted); + // Preempted. Frames are already frozen on heap. mtlr(R0); li(R0, 0); std(R0, in_bytes(JavaThread::preempt_alternate_return_offset()), R16_thread); @@ -2050,21 +2087,21 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, address bind(resume_pc); // Location to resume execution restore_after_resume(noreg /* fp */); + bind(not_preempted); + if (check_exceptions) { + check_and_forward_exception(R11_scratch1, R12_scratch2); + } + if (oop_result->is_valid()) { + get_vm_result_oop(oop_result); + } } void InterpreterMacroAssembler::restore_after_resume(Register fp) { - if (!Continuations::enabled()) return; - const address resume_adapter = TemplateInterpreter::cont_resume_interpreter_adapter(); add_const_optimized(R31, R29_TOC, MacroAssembler::offset_to_global_toc(resume_adapter)); mtctr(R31); bctrl(); - // Restore registers that are preserved across vthread preemption - assert(nonvolatile_accross_vthread_preemtion(R31) && nonvolatile_accross_vthread_preemtion(R22), ""); - ld(R3_ARG1, _abi0(callers_sp), R1_SP); // load FP - ld(R31, _ijava_state_neg(lresult), R3_ARG1); - ld(R22, _ijava_state_neg(fresult), R3_ARG1); #ifdef ASSERT // Assert FP is in R11_scratch1 (see generate_cont_resume_interpreter_adapter()) { diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp index 00a46504e14..5a7e2172b29 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp @@ -757,9 +757,9 @@ void MacroAssembler::clobber_nonvolatile_registers() { R31 }; Register bad = regs[0]; - load_const_optimized(bad, 0xbad0101babe11111); - for (uint32_t i = 1; i < (sizeof(regs) / sizeof(Register)); i++) { - mr(regs[i], bad); + load_const_optimized(bad, 0xbad0101babe00000); + for (int i = (sizeof(regs) / sizeof(Register)) - 1; i >= 0; i--) { + addi(regs[i], bad, regs[i]->encoding()); } BLOCK_COMMENT("} clobber nonvolatile registers"); } @@ -4341,21 +4341,36 @@ void MacroAssembler::multiply_to_len(Register x, Register xlen, bind(L_done); } // multiply_to_len -void MacroAssembler::asm_assert(bool check_equal, const char *msg) { #ifdef ASSERT +void MacroAssembler::asm_assert(AsmAssertCond cond, const char *msg) { Label ok; - if (check_equal) { + switch (cond) { + case eq: beq(CR0, ok); - } else { + break; + case ne: bne(CR0, ok); + break; + case ge: + bge(CR0, ok); + break; + case gt: + bgt(CR0, ok); + break; + case lt: + blt(CR0, ok); + break; + case le: + ble(CR0, ok); + break; + default: + assert(false, "unknown cond:%d", cond); } stop(msg); bind(ok); -#endif } -#ifdef ASSERT -void MacroAssembler::asm_assert_mems_zero(bool check_equal, int size, int mem_offset, +void MacroAssembler::asm_assert_mems_zero(AsmAssertCond cond, int size, int mem_offset, Register mem_base, const char* msg) { switch (size) { case 4: @@ -4369,7 +4384,7 @@ void MacroAssembler::asm_assert_mems_zero(bool check_equal, int size, int mem_of default: ShouldNotReachHere(); } - asm_assert(check_equal, msg); + asm_assert(cond, msg); } #endif // ASSERT diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp index 63be608094f..61e6a173823 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp @@ -68,7 +68,7 @@ class MacroAssembler: public Assembler { void store_sized_value(Register dst, RegisterOrConstant offs, Register base, size_t size_in_bytes); // Move register if destination register and target register are different - inline void mr_if_needed(Register rd, Register rs); + inline void mr_if_needed(Register rd, Register rs, bool allow_invalid = false); inline void fmr_if_needed(FloatRegister rd, FloatRegister rs); // This is dedicated for emitting scheduled mach nodes. For better // readability of the ad file I put it here. @@ -942,21 +942,29 @@ class MacroAssembler: public Assembler { // // assert on cr0 - void asm_assert(bool check_equal, const char* msg); - void asm_assert_eq(const char* msg) { asm_assert(true, msg); } - void asm_assert_ne(const char* msg) { asm_assert(false, msg); } + enum AsmAssertCond { + eq, + ne, + ge, + gt, + lt, + le + }; + void asm_assert(AsmAssertCond cond, const char* msg) PRODUCT_RETURN; + void asm_assert_eq(const char* msg) { asm_assert(eq, msg); } + void asm_assert_ne(const char* msg) { asm_assert(ne, msg); } private: - void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base, + void asm_assert_mems_zero(AsmAssertCond cond, int size, int mem_offset, Register mem_base, const char* msg) NOT_DEBUG_RETURN; public: void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg) { - asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg); + asm_assert_mems_zero(eq, 8, mem_offset, mem_base, msg); } void asm_assert_mem8_isnot_zero(int mem_offset, Register mem_base, const char* msg) { - asm_assert_mems_zero(false, 8, mem_offset, mem_base, msg); + asm_assert_mems_zero(ne, 8, mem_offset, mem_base, msg); } // Calls verify_oop. If UseCompressedOops is on, decodes the oop. diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp index d27011112e2..2b19d84c69c 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp @@ -65,7 +65,8 @@ inline void MacroAssembler::round_to(Register r, int modulus) { } // Move register if destination register and target register are different. -inline void MacroAssembler::mr_if_needed(Register rd, Register rs) { +inline void MacroAssembler::mr_if_needed(Register rd, Register rs, bool allow_noreg) { + if (allow_noreg && (rs == noreg)) return; if (rs != rd) mr(rd, rs); } inline void MacroAssembler::fmr_if_needed(FloatRegister rd, FloatRegister rs) { diff --git a/src/hotspot/cpu/ppc/smallRegisterMap_ppc.inline.hpp b/src/hotspot/cpu/ppc/smallRegisterMap_ppc.inline.hpp index fd352a53716..221a3c01341 100644 --- a/src/hotspot/cpu/ppc/smallRegisterMap_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/smallRegisterMap_ppc.inline.hpp @@ -28,18 +28,18 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" +class SmallRegisterMap; + // Java frames don't have callee saved registers, so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +template +class SmallRegisterMapType { + friend SmallRegisterMap; -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); + public: // as_RegisterMap is used when we didn't want to templatize and abstract over RegisterMap type to support SmallRegisterMap // Consider enhancing SmallRegisterMap to support those cases const RegisterMap* as_RegisterMap() const { return nullptr; } @@ -61,14 +61,14 @@ public: JavaThread* thread() const { #ifndef ASSERT - guarantee (false, ""); + guarantee (false, "unreachable"); #endif return nullptr; } bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } @@ -76,7 +76,7 @@ public: #ifdef ASSERT bool should_skip_missing() const { return false; } VMReg find_register_spilled_here(void* p, intptr_t* sp) { - Unimplemented(); + assert(false, "Shouldn't reach here! p:" PTR_FORMAT " sp:" PTR_FORMAT, p2i(p), p2i(p)); return nullptr; } void print() const { print_on(tty); } diff --git a/src/hotspot/cpu/ppc/stackChunkFrameStream_ppc.inline.hpp b/src/hotspot/cpu/ppc/stackChunkFrameStream_ppc.inline.hpp index 07f1c9c1c6f..a14ec9303f6 100644 --- a/src/hotspot/cpu/ppc/stackChunkFrameStream_ppc.inline.hpp +++ b/src/hotspot/cpu/ppc/stackChunkFrameStream_ppc.inline.hpp @@ -176,17 +176,14 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { assert_is_interpreted_and_frame_type_mixed(); ResourceMark rm; - InterpreterOopMap mask; frame f = to_frame(); - f.interpreted_frame_oop_map(&mask); - return mask.num_oops() - + 1 // for the mirror oop - + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot - + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(), - (intptr_t*)f.interpreter_frame_monitor_end())/BasicObjectLock::size(); + InterpreterOopCount closure; + f.oops_interpreted_do(&closure, map); + return closure.count(); } template<> diff --git a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp index 199b578a36f..3fe7d353962 100644 --- a/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp +++ b/src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp @@ -702,6 +702,11 @@ address TemplateInterpreterGenerator::generate_cont_resume_interpreter_adapter() __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R12_scratch2); __ restore_interpreter_state(R11_scratch1, false, true /*restore_top_frame_sp*/); + // Restore registers that are preserved across vthread preemption + assert(__ nonvolatile_accross_vthread_preemtion(R31) && __ nonvolatile_accross_vthread_preemtion(R24), ""); + __ ld(R3_ARG1, _abi0(callers_sp), R1_SP); // load FP + __ ld(R31, _ijava_state_neg(lresult), R3_ARG1); + __ ld(R24, _ijava_state_neg(fresult), R3_ARG1); __ blr(); return start; @@ -1249,7 +1254,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) { const Register pending_exception = R0; const Register result_handler_addr = R31; const Register native_method_fd = R12_scratch2; // preferred in MacroAssembler::branch_to - const Register access_flags = R22_tmp2; + const Register access_flags = R24_tmp4; const Register active_handles = R11_scratch1; // R26_monitor saved to state. const Register sync_state = R12_scratch2; const Register sync_state_addr = sync_state; // Address is dead after use. diff --git a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp index 09acd1c067d..8d61ba1b2d7 100644 --- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp @@ -2214,7 +2214,7 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no, Register Rca __ bind(L_clinit_barrier_slow); address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ li(R4_ARG2, code); - __ call_VM(noreg, entry, R4_ARG2); + __ call_VM_preemptable(noreg, entry, R4_ARG2); // Update registers with resolved info. __ load_method_entry(Rcache, Rindex); @@ -2262,7 +2262,7 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no, Register Rcac __ bind(L_clinit_barrier_slow); address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ li(R4_ARG2, code); - __ call_VM(noreg, entry, R4_ARG2); + __ call_VM_preemptable(noreg, entry, R4_ARG2); // Update registers with resolved info __ load_field_entry(Rcache, index); @@ -3864,7 +3864,7 @@ void TemplateTable::_new() { // -------------------------------------------------------------------------- // slow case __ bind(Lslow_case); - call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), Rcpool, Rindex); + __ call_VM_preemptable(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), Rcpool, Rindex); // continue __ bind(Ldone); diff --git a/src/hotspot/cpu/riscv/continuationFreezeThaw_riscv.inline.hpp b/src/hotspot/cpu/riscv/continuationFreezeThaw_riscv.inline.hpp index 461dc19f383..d6586617a63 100644 --- a/src/hotspot/cpu/riscv/continuationFreezeThaw_riscv.inline.hpp +++ b/src/hotspot/cpu/riscv/continuationFreezeThaw_riscv.inline.hpp @@ -207,6 +207,41 @@ inline void ThawBase::prefetch_chunk_pd(void* start, int size) { Prefetch::read(start, size - 64); } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + intptr_t* sp = _top_frame.sp(); + if (_top_frame.is_interpreted_frame()) { + // In case the top frame is interpreted we need to set up the anchor using + // the last_sp saved in the frame (remove possible alignment added while + // thawing, see ThawBase::finish_thaw()). We also clear last_sp to match + // the behavior when calling the VM from the interpreter (we check for this + // in FreezeBase::prepare_freeze_interpreted_top_frame, which can be reached + // if preempting again at redo_vmcall()). + _last_sp_from_frame = _top_frame.interpreter_frame_last_sp(); + assert(_last_sp_from_frame != nullptr, ""); + _top_frame.interpreter_frame_set_last_sp(nullptr); + if (sp != _last_sp_from_frame) { + // We need to move up return pc and fp. They will be read next in + // set_anchor() and set as _last_Java_pc and _last_Java_fp respectively. + _last_sp_from_frame[-1] = (intptr_t)_top_frame.pc(); + _last_sp_from_frame[-2] = (intptr_t)_top_frame.fp(); + } + _is_interpreted = true; + sp = _last_sp_from_frame; + } + return sp; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + if (_is_interpreted) { + // Restore last_sp_from_frame and possibly overwritten pc. + _top_frame.interpreter_frame_set_last_sp(_last_sp_from_frame); + intptr_t* sp = _top_frame.sp(); + if (sp != _last_sp_from_frame) { + sp[-1] = (intptr_t)_top_frame.pc(); + } + } +} + template inline void Thaw::patch_caller_links(intptr_t* sp, intptr_t* bottom) { // Fast path depends on !PreserveFramePointer. See can_thaw_fast(). @@ -305,10 +340,17 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { frame enterSpecial = new_entry_frame(); intptr_t* sp = enterSpecial.sp(); + // We only need to set the return pc. fp will be restored back in gen_continuation_enter(). sp[-1] = (intptr_t)ContinuationEntry::cleanup_pc(); - sp[-2] = (intptr_t)enterSpecial.fp(); + return sp; +} - log_develop_trace(continuations, preempt)("push_cleanup_continuation initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT, p2i(sp + 2 * frame::metadata_words), p2i(sp)); +inline intptr_t* ThawBase::push_preempt_adapter() { + frame enterSpecial = new_entry_frame(); + intptr_t* sp = enterSpecial.sp(); + + // We only need to set the return pc. fp will be restored back in generate_cont_preempt_stub(). + sp[-1] = (intptr_t)StubRoutines::cont_preempt_stub(); return sp; } diff --git a/src/hotspot/cpu/riscv/continuationHelper_riscv.inline.hpp b/src/hotspot/cpu/riscv/continuationHelper_riscv.inline.hpp index 424d56edf5a..918bf3db8cc 100644 --- a/src/hotspot/cpu/riscv/continuationHelper_riscv.inline.hpp +++ b/src/hotspot/cpu/riscv/continuationHelper_riscv.inline.hpp @@ -52,6 +52,9 @@ static inline void patch_return_pc_with_preempt_stub(frame& f) { // The target will check for preemption once it returns to the interpreter // or the native wrapper code and will manually jump to the preempt stub. JavaThread *thread = JavaThread::current(); + DEBUG_ONLY(Method* m = f.is_interpreted_frame() ? f.interpreter_frame_method() : f.cb()->as_nmethod()->method();) + assert(m->is_object_wait0() || thread->interp_at_preemptable_vmcall_cnt() > 0, + "preemptable VM call not using call_VM_preemptable"); thread->set_preempt_alternate_return(StubRoutines::cont_preempt_stub()); } } diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp index 549c9cda7b6..5af8ea1da37 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp @@ -518,6 +518,14 @@ void InterpreterMacroAssembler::remove_activation(TosState state, // result check if synchronized method Label unlocked, unlock, no_unlock; +#ifdef ASSERT + Label not_preempted; + ld(t0, Address(xthread, JavaThread::preempt_alternate_return_offset())); + beqz(t0, not_preempted); + stop("remove_activation: should not have alternate return address set"); + bind(not_preempted); +#endif /* ASSERT */ + // get the value of _do_not_unlock_if_synchronized into x13 const Address do_not_unlock_if_synchronized(xthread, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset())); @@ -1441,6 +1449,7 @@ void InterpreterMacroAssembler::call_VM_leaf_base(address entry_point, void InterpreterMacroAssembler::call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions) { @@ -1463,26 +1472,34 @@ void InterpreterMacroAssembler::call_VM_base(Register oop_result, #endif /* ASSERT */ // super call MacroAssembler::call_VM_base(oop_result, noreg, last_java_sp, - entry_point, number_of_arguments, - check_exceptions); -// interpreter specific + return_pc, entry_point, + number_of_arguments, check_exceptions); + // interpreter specific restore_bcp(); restore_locals(); } -void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, - address entry_point, - Register arg_1) { - assert(arg_1 == c_rarg1, ""); +void InterpreterMacroAssembler::call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions) { + assert(InterpreterRuntime::is_preemptable_call(entry_point), + "VM call not preemptable, should use call_VM()"); Label resume_pc, not_preempted; #ifdef ASSERT { - Label L; + Label L1, L2; ld(t0, Address(xthread, JavaThread::preempt_alternate_return_offset())); - beqz(t0, L); - stop("Should not have alternate return address set"); - bind(L); + beqz(t0, L1); + stop("call_VM_preemptable_helper: Should not have alternate return address set"); + bind(L1); + // We check this counter in patch_return_pc_with_preempt_stub() during freeze. + incrementw(Address(xthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + lw(t0, Address(xthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + bgtz(t0, L2); + stop("call_VM_preemptable_helper: should be > 0"); + bind(L2); } #endif /* ASSERT */ @@ -1490,12 +1507,22 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, push_cont_fastpath(); // Make VM call. In case of preemption set last_pc to the one we want to resume to. - la(t0, resume_pc); - sd(t0, Address(xthread, JavaThread::last_Java_pc_offset())); - call_VM_base(oop_result, noreg, noreg, entry_point, 1, false /*check_exceptions*/); + // Note: call_VM_base will use resume_pc label to set last_Java_pc. + call_VM_base(noreg, noreg, noreg, &resume_pc, entry_point, number_of_arguments, false /*check_exceptions*/); pop_cont_fastpath(); +#ifdef ASSERT + { + Label L; + decrementw(Address(xthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + lw(t0, Address(xthread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + bgez(t0, L); + stop("call_VM_preemptable_helper: should be >= 0"); + bind(L); + } +#endif /* ASSERT */ + // Check if preempted. ld(t1, Address(xthread, JavaThread::preempt_alternate_return_offset())); beqz(t1, not_preempted); @@ -1507,6 +1534,51 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, restore_after_resume(false /* is_native */); bind(not_preempted); + if (check_exceptions) { + // check for pending exceptions + ld(t0, Address(xthread, in_bytes(Thread::pending_exception_offset()))); + Label ok; + beqz(t0, ok); + la(t1, RuntimeAddress(StubRoutines::forward_exception_entry())); + jr(t1); + bind(ok); + } + + // get oop result if there is one and reset the value in the thread + if (oop_result->is_valid()) { + get_vm_result_oop(oop_result, xthread); + } +} + +static void pass_arg1(MacroAssembler* masm, Register arg) { + if (c_rarg1 != arg) { + masm->mv(c_rarg1, arg); + } +} + +static void pass_arg2(MacroAssembler* masm, Register arg) { + if (c_rarg2 != arg) { + masm->mv(c_rarg2, arg); + } +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + bool check_exceptions) { + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 1, check_exceptions); +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions) { + LP64_ONLY(assert_different_registers(arg_1, c_rarg2)); + pass_arg2(this, arg_2); + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 2, check_exceptions); } void InterpreterMacroAssembler::restore_after_resume(bool is_native) { diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp index 295f1b22191..89b2ed17291 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.hpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.hpp @@ -46,6 +46,7 @@ class InterpreterMacroAssembler: public MacroAssembler { virtual void call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions); @@ -59,11 +60,27 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_earlyret_value(TosState state); + // Use for vthread preemption void call_VM_preemptable(Register oop_result, address entry_point, - Register arg_1); + Register arg_1, + bool check_exceptions = true); + + void call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions = true); + void restore_after_resume(bool is_native); + private: + void call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions); + + public: void jump_to_entry(address entry); virtual void check_and_handle_popframe(Register java_thread); diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index 700e42e6194..54304ec648d 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -233,7 +233,7 @@ int MacroAssembler::align(int modulus, int extra_offset) { } void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) { - call_VM_base(oop_result, noreg, noreg, entry_point, number_of_arguments, check_exceptions); + call_VM_base(oop_result, noreg, noreg, nullptr, entry_point, number_of_arguments, check_exceptions); } // Implementation of call_VM versions @@ -284,7 +284,7 @@ void MacroAssembler::call_VM(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) { - call_VM_base(oop_result, xthread, last_java_sp, entry_point, number_of_arguments, check_exceptions); + call_VM_base(oop_result, xthread, last_java_sp, nullptr, entry_point, number_of_arguments, check_exceptions); } void MacroAssembler::call_VM(Register oop_result, @@ -409,13 +409,10 @@ void MacroAssembler::reset_last_Java_frame(bool clear_fp) { sd(zr, Address(xthread, JavaThread::last_Java_pc_offset())); } -static bool is_preemptable(address entry_point) { - return entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter); -} - void MacroAssembler::call_VM_base(Register oop_result, Register java_thread, Register last_java_sp, + Label* return_pc, address entry_point, int number_of_arguments, bool check_exceptions) { @@ -423,6 +420,7 @@ void MacroAssembler::call_VM_base(Register oop_result, if (!java_thread->is_valid()) { java_thread = xthread; } + // determine last_java_sp register if (!last_java_sp->is_valid()) { last_java_sp = esp; @@ -442,12 +440,7 @@ void MacroAssembler::call_VM_base(Register oop_result, assert(last_java_sp != fp, "can't use fp"); Label l; - if (is_preemptable(entry_point)) { - // skip setting last_pc since we already set it to desired value. - set_last_Java_frame(last_java_sp, fp, noreg); - } else { - set_last_Java_frame(last_java_sp, fp, l, t0); - } + set_last_Java_frame(last_java_sp, fp, return_pc != nullptr ? *return_pc : l, t0); // do the call, remove parameters MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments, &l); diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index 9e713e90270..e0e610ff49a 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -168,6 +168,7 @@ class MacroAssembler: public Assembler { Register oop_result, // where an oop-result ends up if any; use noreg otherwise Register java_thread, // the thread if computed before ; use noreg otherwise Register last_java_sp, // to set up last_Java_frame in stubs; use noreg otherwise + Label* return_pc, // to set up last_Java_frame; use nullptr otherwise address entry_point, // the entry point int number_of_arguments, // the number of arguments (w/o thread) to pop after the call bool check_exceptions // whether to check for pending exceptions after return diff --git a/src/hotspot/cpu/riscv/smallRegisterMap_riscv.inline.hpp b/src/hotspot/cpu/riscv/smallRegisterMap_riscv.inline.hpp index 541cb0cbcb5..ea5aef14ae1 100644 --- a/src/hotspot/cpu/riscv/smallRegisterMap_riscv.inline.hpp +++ b/src/hotspot/cpu/riscv/smallRegisterMap_riscv.inline.hpp @@ -28,20 +28,20 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" -// Java frames don't have callee saved registers (except for fp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +class SmallRegisterMap; + +// Java frames don't have callee saved registers (except for fp), so we can use a smaller RegisterMap +template +class SmallRegisterMapType { + friend SmallRegisterMap; + + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } -private: static void assert_is_fp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ assert (r == fp->as_VMReg() || r == fp->as_VMReg()->next(), "Reg: %s", r->name()); }) + public: // as_RegisterMap is used when we didn't want to templatize and abstract over RegisterMap type to support SmallRegisterMap // Consider enhancing SmallRegisterMap to support those cases @@ -71,7 +71,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/riscv/stackChunkFrameStream_riscv.inline.hpp b/src/hotspot/cpu/riscv/stackChunkFrameStream_riscv.inline.hpp index fa8a8fb47f0..9e2b8003dc4 100644 --- a/src/hotspot/cpu/riscv/stackChunkFrameStream_riscv.inline.hpp +++ b/src/hotspot/cpu/riscv/stackChunkFrameStream_riscv.inline.hpp @@ -106,17 +106,14 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { assert_is_interpreted_and_frame_type_mixed(); ResourceMark rm; - InterpreterOopMap mask; frame f = to_frame(); - f.interpreted_frame_oop_map(&mask); - return mask.num_oops() - + 1 // for the mirror oop - + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot - + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(), - (intptr_t*)f.interpreter_frame_monitor_end()) / BasicObjectLock::size(); + InterpreterOopCount closure; + f.oops_interpreted_do(&closure, map); + return closure.count(); } template<> diff --git a/src/hotspot/cpu/riscv/templateTable_riscv.cpp b/src/hotspot/cpu/riscv/templateTable_riscv.cpp index bd4a89d8199..ca41583e4bc 100644 --- a/src/hotspot/cpu/riscv/templateTable_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateTable_riscv.cpp @@ -2206,7 +2206,7 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ mv(temp, (int) code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_method_entry(Rcache, index); @@ -2259,7 +2259,7 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ mv(temp, (int) code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_field_entry(Rcache, index); @@ -3612,7 +3612,7 @@ void TemplateTable::_new() { __ bind(slow_case); __ get_constant_pool(c_rarg1); __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1); - call_VM(x10, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); + __ call_VM_preemptable(x10, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); __ verify_oop(x10); // continue diff --git a/src/hotspot/cpu/s390/continuationFreezeThaw_s390.inline.hpp b/src/hotspot/cpu/s390/continuationFreezeThaw_s390.inline.hpp index d39821bd034..33ac17effa7 100644 --- a/src/hotspot/cpu/s390/continuationFreezeThaw_s390.inline.hpp +++ b/src/hotspot/cpu/s390/continuationFreezeThaw_s390.inline.hpp @@ -68,6 +68,15 @@ inline void FreezeBase::patch_stack_pd(intptr_t* frame_sp, intptr_t* heap_sp) { Unimplemented(); } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + Unimplemented(); + return nullptr; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + Unimplemented(); +} + inline frame ThawBase::new_entry_frame() { Unimplemented(); return frame(); @@ -100,6 +109,11 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { return nullptr; } +inline intptr_t* ThawBase::push_preempt_adapter() { + Unimplemented(); + return nullptr; +} + template inline void Thaw::patch_caller_links(intptr_t* sp, intptr_t* bottom) { Unimplemented(); diff --git a/src/hotspot/cpu/s390/smallRegisterMap_s390.inline.hpp b/src/hotspot/cpu/s390/smallRegisterMap_s390.inline.hpp index 3a0afb27260..43363ccd933 100644 --- a/src/hotspot/cpu/s390/smallRegisterMap_s390.inline.hpp +++ b/src/hotspot/cpu/s390/smallRegisterMap_s390.inline.hpp @@ -28,18 +28,17 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" -// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +class SmallRegisterMap; + +// Java frames don't have callee saved registers (except for rfp), so we can use a smaller SmallRegisterMapType +template +class SmallRegisterMapType { + friend SmallRegisterMap; + + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } -private: static void assert_is_rfp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ Unimplemented(); }) public: @@ -69,7 +68,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/s390/stackChunkFrameStream_s390.inline.hpp b/src/hotspot/cpu/s390/stackChunkFrameStream_s390.inline.hpp index d94dea33e55..4fff0846a80 100644 --- a/src/hotspot/cpu/s390/stackChunkFrameStream_s390.inline.hpp +++ b/src/hotspot/cpu/s390/stackChunkFrameStream_s390.inline.hpp @@ -85,7 +85,8 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { Unimplemented(); return 0; } diff --git a/src/hotspot/cpu/x86/continuationFreezeThaw_x86.inline.hpp b/src/hotspot/cpu/x86/continuationFreezeThaw_x86.inline.hpp index 126f4043cad..7691a84a9fe 100644 --- a/src/hotspot/cpu/x86/continuationFreezeThaw_x86.inline.hpp +++ b/src/hotspot/cpu/x86/continuationFreezeThaw_x86.inline.hpp @@ -191,6 +191,41 @@ inline void FreezeBase::patch_pd_unused(intptr_t* sp) { *fp_addr = badAddressVal; } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + intptr_t* sp = _top_frame.sp(); + if (_top_frame.is_interpreted_frame()) { + // In case the top frame is interpreted we need to set up the anchor using + // the last_sp saved in the frame (remove possible alignment added while + // thawing, see ThawBase::finish_thaw()). We also clear last_sp to match + // the behavior when calling the VM from the interpreter (we check for this + // in FreezeBase::prepare_freeze_interpreted_top_frame, which can be reached + // if preempting again at redo_vmcall()). + _last_sp_from_frame = _top_frame.interpreter_frame_last_sp(); + assert(_last_sp_from_frame != nullptr, ""); + _top_frame.interpreter_frame_set_last_sp(nullptr); + if (sp != _last_sp_from_frame) { + // We need to move up return pc and fp. They will be read next in + // set_anchor() and set as _last_Java_pc and _last_Java_fp respectively. + _last_sp_from_frame[-1] = (intptr_t)_top_frame.pc(); + _last_sp_from_frame[-2] = (intptr_t)_top_frame.fp(); + } + _is_interpreted = true; + sp = _last_sp_from_frame; + } + return sp; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + if (_is_interpreted) { + // Restore last_sp_from_frame and possibly overwritten pc. + _top_frame.interpreter_frame_set_last_sp(_last_sp_from_frame); + intptr_t* sp = _top_frame.sp(); + if (sp != _last_sp_from_frame) { + sp[-1] = (intptr_t)_top_frame.pc(); + } + } +} + //////// Thaw // Fast path @@ -291,10 +326,17 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { frame enterSpecial = new_entry_frame(); intptr_t* sp = enterSpecial.sp(); + // We only need to set the return pc. rbp will be restored back in gen_continuation_enter(). sp[-1] = (intptr_t)ContinuationEntry::cleanup_pc(); - sp[-2] = (intptr_t)enterSpecial.fp(); + return sp; +} - log_develop_trace(continuations, preempt)("push_cleanup_continuation initial sp: " INTPTR_FORMAT " final sp: " INTPTR_FORMAT, p2i(sp + 2 * frame::metadata_words), p2i(sp)); +inline intptr_t* ThawBase::push_preempt_adapter() { + frame enterSpecial = new_entry_frame(); + intptr_t* sp = enterSpecial.sp(); + + // We only need to set the return pc. rbp will be restored back in generate_cont_preempt_stub(). + sp[-1] = (intptr_t)StubRoutines::cont_preempt_stub(); return sp; } diff --git a/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp b/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp index 6d72e1b80e8..bb32e55db75 100644 --- a/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp +++ b/src/hotspot/cpu/x86/continuationHelper_x86.inline.hpp @@ -50,6 +50,9 @@ static inline void patch_return_pc_with_preempt_stub(frame& f) { // The target will check for preemption once it returns to the interpreter // or the native wrapper code and will manually jump to the preempt stub. JavaThread *thread = JavaThread::current(); + DEBUG_ONLY(Method* m = f.is_interpreted_frame() ? f.interpreter_frame_method() : f.cb()->as_nmethod()->method();) + assert(m->is_object_wait0() || thread->interp_at_preemptable_vmcall_cnt() > 0, + "preemptable VM call not using call_VM_preemptable"); thread->set_preempt_alternate_return(StubRoutines::cont_preempt_stub()); } } diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp index 9720be17892..110dfab5808 100644 --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp @@ -326,19 +326,26 @@ void InterpreterMacroAssembler::call_VM_base(Register oop_result, restore_locals(); } -void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, - address entry_point, - Register arg_1) { - assert(arg_1 == c_rarg1, ""); +void InterpreterMacroAssembler::call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions) { + assert(InterpreterRuntime::is_preemptable_call(entry_point), "VM call not preemptable, should use call_VM()"); Label resume_pc, not_preempted; #ifdef ASSERT { - Label L; + Label L1, L2; cmpptr(Address(r15_thread, JavaThread::preempt_alternate_return_offset()), NULL_WORD); - jcc(Assembler::equal, L); - stop("Should not have alternate return address set"); - bind(L); + jcc(Assembler::equal, L1); + stop("call_VM_preemptable_helper: should not have alternate return address set"); + bind(L1); + // We check this counter in patch_return_pc_with_preempt_stub() during freeze. + incrementl(Address(r15_thread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + cmpl(Address(r15_thread, JavaThread::interp_at_preemptable_vmcall_cnt_offset()), 0); + jcc(Assembler::greater, L2); + stop("call_VM_preemptable_helper: should be > 0"); + bind(L2); } #endif /* ASSERT */ @@ -346,14 +353,25 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, push_cont_fastpath(); // Make VM call. In case of preemption set last_pc to the one we want to resume to. - // Note: call_VM_helper requires last_Java_pc for anchor to be at the top of the stack. lea(rscratch1, resume_pc); push(rscratch1); - MacroAssembler::call_VM_helper(oop_result, entry_point, 1, false /*check_exceptions*/); + lea(rax, Address(rsp, wordSize)); + call_VM_base(noreg, rax, entry_point, number_of_arguments, false); pop(rscratch1); pop_cont_fastpath(); +#ifdef ASSERT + { + Label L; + decrementl(Address(r15_thread, JavaThread::interp_at_preemptable_vmcall_cnt_offset())); + cmpl(Address(r15_thread, JavaThread::interp_at_preemptable_vmcall_cnt_offset()), 0); + jcc(Assembler::greaterEqual, L); + stop("call_VM_preemptable_helper: should be >= 0"); + bind(L); + } +#endif /* ASSERT */ + // Check if preempted. movptr(rscratch1, Address(r15_thread, JavaThread::preempt_alternate_return_offset())); cmpptr(rscratch1, NULL_WORD); @@ -366,6 +384,54 @@ void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, restore_after_resume(false /* is_native */); bind(not_preempted); + if (check_exceptions) { + // check for pending exceptions + cmpptr(Address(r15_thread, Thread::pending_exception_offset()), NULL_WORD); + Label ok; + jcc(Assembler::equal, ok); + // Exception stub expects return pc to be at top of stack. We only need + // it to check Interpreter::contains(return_address) so anything will do. + lea(rscratch1, resume_pc); + push(rscratch1); + jump(RuntimeAddress(StubRoutines::forward_exception_entry())); + bind(ok); + } + + // get oop result if there is one and reset the value in the thread + if (oop_result->is_valid()) { + get_vm_result_oop(oop_result); + } +} + +static void pass_arg1(MacroAssembler* masm, Register arg) { + if (c_rarg1 != arg ) { + masm->mov(c_rarg1, arg); + } +} + +static void pass_arg2(MacroAssembler* masm, Register arg) { + if (c_rarg2 != arg ) { + masm->mov(c_rarg2, arg); + } +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + bool check_exceptions) { + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 1, check_exceptions); +} + +void InterpreterMacroAssembler::call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions) { + LP64_ONLY(assert_different_registers(arg_1, c_rarg2)); + pass_arg2(this, arg_2); + pass_arg1(this, arg_1); + call_VM_preemptable_helper(oop_result, entry_point, 2, check_exceptions); } void InterpreterMacroAssembler::restore_after_resume(bool is_native) { @@ -800,6 +866,14 @@ void InterpreterMacroAssembler::remove_activation(TosState state, // result check if synchronized method Label unlocked, unlock, no_unlock; +#ifdef ASSERT + Label not_preempted; + cmpptr(Address(r15_thread, JavaThread::preempt_alternate_return_offset()), NULL_WORD); + jcc(Assembler::equal, not_preempted); + stop("remove_activation: should not have alternate return address set"); + bind(not_preempted); +#endif /* ASSERT */ + const Register rthread = r15_thread; const Register robj = c_rarg1; const Register rmon = c_rarg1; diff --git a/src/hotspot/cpu/x86/interp_masm_x86.hpp b/src/hotspot/cpu/x86/interp_masm_x86.hpp index a36a697eebf..1d2080cd542 100644 --- a/src/hotspot/cpu/x86/interp_masm_x86.hpp +++ b/src/hotspot/cpu/x86/interp_masm_x86.hpp @@ -62,11 +62,24 @@ class InterpreterMacroAssembler: public MacroAssembler { void load_earlyret_value(TosState state); + // Use for vthread preemption void call_VM_preemptable(Register oop_result, address entry_point, - Register arg_1); + Register arg_1, + bool check_exceptions = true); + void call_VM_preemptable(Register oop_result, + address entry_point, + Register arg_1, + Register arg_2, + bool check_exceptions = true); void restore_after_resume(bool is_native); + private: + void call_VM_preemptable_helper(Register oop_result, + address entry_point, + int number_of_arguments, + bool check_exceptions); + public: // Interpreter-specific registers void save_bcp() { movptr(Address(rbp, frame::interpreter_frame_bcp_offset * wordSize), _bcp_register); diff --git a/src/hotspot/cpu/x86/smallRegisterMap_x86.inline.hpp b/src/hotspot/cpu/x86/smallRegisterMap_x86.inline.hpp index 930a8af0794..78b604c16fc 100644 --- a/src/hotspot/cpu/x86/smallRegisterMap_x86.inline.hpp +++ b/src/hotspot/cpu/x86/smallRegisterMap_x86.inline.hpp @@ -28,19 +28,17 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" +class SmallRegisterMap; + // Java frames don't have callee saved registers (except for rbp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +template +class SmallRegisterMapType { + friend SmallRegisterMap; -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -private: static void assert_is_rbp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ assert(r == rbp->as_VMReg() || r == rbp->as_VMReg()->next(), "Reg: %s", r->name()); }) public: @@ -72,7 +70,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/x86/stackChunkFrameStream_x86.inline.hpp b/src/hotspot/cpu/x86/stackChunkFrameStream_x86.inline.hpp index 6289b903ab1..ebdae8a7eac 100644 --- a/src/hotspot/cpu/x86/stackChunkFrameStream_x86.inline.hpp +++ b/src/hotspot/cpu/x86/stackChunkFrameStream_x86.inline.hpp @@ -106,17 +106,14 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { assert_is_interpreted_and_frame_type_mixed(); ResourceMark rm; - InterpreterOopMap mask; frame f = to_frame(); - f.interpreted_frame_oop_map(&mask); - return mask.num_oops() - + 1 // for the mirror oop - + (f.interpreter_frame_method()->is_native() ? 1 : 0) // temp oop slot - + pointer_delta_as_int((intptr_t*)f.interpreter_frame_monitor_begin(), - (intptr_t*)f.interpreter_frame_monitor_end())/BasicObjectLock::size(); + InterpreterOopCount closure; + f.oops_interpreted_do(&closure, map); + return closure.count(); } template<> diff --git a/src/hotspot/cpu/x86/templateTable_x86.cpp b/src/hotspot/cpu/x86/templateTable_x86.cpp index c8dafb2d023..7065f653e19 100644 --- a/src/hotspot/cpu/x86/templateTable_x86.cpp +++ b/src/hotspot/cpu/x86/templateTable_x86.cpp @@ -2233,7 +2233,7 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ movl(temp, code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_method_entry(cache, index); __ bind(L_done); @@ -2280,7 +2280,7 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no, // Class initialization barrier slow path lands here as well. address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache); __ movl(temp, code); - __ call_VM(noreg, entry, temp); + __ call_VM_preemptable(noreg, entry, temp); // Update registers with resolved info __ load_field_entry(cache, index); __ bind(L_done); @@ -3644,8 +3644,8 @@ void TemplateTable::_new() { __ get_constant_pool(c_rarg1); __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1); - call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); - __ verify_oop(rax); + __ call_VM_preemptable(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2); + __ verify_oop(rax); // continue __ bind(done); diff --git a/src/hotspot/cpu/zero/continuationFreezeThaw_zero.inline.hpp b/src/hotspot/cpu/zero/continuationFreezeThaw_zero.inline.hpp index eb6be8772f9..22f596b161a 100644 --- a/src/hotspot/cpu/zero/continuationFreezeThaw_zero.inline.hpp +++ b/src/hotspot/cpu/zero/continuationFreezeThaw_zero.inline.hpp @@ -68,6 +68,15 @@ inline void FreezeBase::patch_stack_pd(intptr_t* frame_sp, intptr_t* heap_sp) { Unimplemented(); } +inline intptr_t* AnchorMark::anchor_mark_set_pd() { + Unimplemented(); + return nullptr; +} + +inline void AnchorMark::anchor_mark_clear_pd() { + Unimplemented(); +} + inline frame ThawBase::new_entry_frame() { Unimplemented(); return frame(); @@ -100,6 +109,11 @@ inline intptr_t* ThawBase::push_cleanup_continuation() { return nullptr; } +inline intptr_t* ThawBase::push_preempt_adapter() { + Unimplemented(); + return nullptr; +} + template inline void Thaw::patch_caller_links(intptr_t* sp, intptr_t* bottom) { Unimplemented(); diff --git a/src/hotspot/cpu/zero/smallRegisterMap_zero.inline.hpp b/src/hotspot/cpu/zero/smallRegisterMap_zero.inline.hpp index bbb70fa2065..906575ab669 100644 --- a/src/hotspot/cpu/zero/smallRegisterMap_zero.inline.hpp +++ b/src/hotspot/cpu/zero/smallRegisterMap_zero.inline.hpp @@ -28,18 +28,17 @@ #include "runtime/frame.inline.hpp" #include "runtime/registerMap.hpp" -// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap -class SmallRegisterMap { - constexpr SmallRegisterMap() = default; - ~SmallRegisterMap() = default; - NONCOPYABLE(SmallRegisterMap); +class SmallRegisterMap; + +// Java frames don't have callee saved registers (except for rfp), so we can use a smaller RegisterMap +template +class SmallRegisterMapType { + friend SmallRegisterMap; + + constexpr SmallRegisterMapType() = default; + ~SmallRegisterMapType() = default; + NONCOPYABLE(SmallRegisterMapType); -public: - static const SmallRegisterMap* instance() { - static constexpr SmallRegisterMap the_instance{}; - return &the_instance; - } -private: static void assert_is_rfp(VMReg r) NOT_DEBUG_RETURN DEBUG_ONLY({ Unimplemented(); }) public: @@ -69,7 +68,7 @@ public: bool update_map() const { return false; } bool walk_cont() const { return false; } - bool include_argument_oops() const { return false; } + bool include_argument_oops() const { return IncludeArgs; } void set_include_argument_oops(bool f) {} bool in_cont() const { return false; } stackChunkHandle stack_chunk() const { return stackChunkHandle(); } diff --git a/src/hotspot/cpu/zero/stackChunkFrameStream_zero.inline.hpp b/src/hotspot/cpu/zero/stackChunkFrameStream_zero.inline.hpp index 84d6dee9149..3b9643fb3f4 100644 --- a/src/hotspot/cpu/zero/stackChunkFrameStream_zero.inline.hpp +++ b/src/hotspot/cpu/zero/stackChunkFrameStream_zero.inline.hpp @@ -85,7 +85,8 @@ inline int StackChunkFrameStream::interpreter_frame_stack_argsize() } template -inline int StackChunkFrameStream::interpreter_frame_num_oops() const { +template +inline int StackChunkFrameStream::interpreter_frame_num_oops(RegisterMapT* map) const { Unimplemented(); return 0; } diff --git a/src/hotspot/share/cds/aotConstantPoolResolver.cpp b/src/hotspot/share/cds/aotConstantPoolResolver.cpp index ff47d00c484..ddf7d32ed70 100644 --- a/src/hotspot/share/cds/aotConstantPoolResolver.cpp +++ b/src/hotspot/share/cds/aotConstantPoolResolver.cpp @@ -318,13 +318,13 @@ void AOTConstantPoolResolver::maybe_resolve_fmi_ref(InstanceKlass* ik, Method* m if (!VM_Version::supports_fast_class_init_checks()) { return; // Do not resolve since interpreter lacks fast clinit barriers support } - InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); + InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, ClassInitMode::dont_init, CHECK); is_static = " *** static"; break; case Bytecodes::_getfield: case Bytecodes::_putfield: - InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, false /*initialize_holder*/, CHECK); + InterpreterRuntime::resolve_get_put(bc, raw_index, mh, cp, ClassInitMode::dont_init, CHECK); break; case Bytecodes::_invokestatic: diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index de4d1c8a729..146ee4af1e0 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -1809,7 +1809,8 @@ void HeapShared::check_special_subgraph_classes() { name != vmSymbols::java_lang_ArrayStoreException() && name != vmSymbols::java_lang_ClassCastException() && name != vmSymbols::java_lang_InternalError() && - name != vmSymbols::java_lang_NullPointerException()) { + name != vmSymbols::java_lang_NullPointerException() && + name != vmSymbols::jdk_internal_vm_PreemptedException()) { ResourceMark rm; fatal("special subgraph cannot have objects of type %s", subgraph_k->external_name()); } diff --git a/src/hotspot/share/ci/ciField.cpp b/src/hotspot/share/ci/ciField.cpp index cbe0cadbc93..d47c4c508d7 100644 --- a/src/hotspot/share/ci/ciField.cpp +++ b/src/hotspot/share/ci/ciField.cpp @@ -400,7 +400,7 @@ bool ciField::will_link(ciMethod* accessing_method, _name->get_symbol(), _signature->get_symbol(), methodHandle(THREAD, accessing_method->get_Method())); fieldDescriptor result; - LinkResolver::resolve_field(result, link_info, bc, false, CHECK_AND_CLEAR_(false)); + LinkResolver::resolve_field(result, link_info, bc, ClassInitMode::dont_init, CHECK_AND_CLEAR_(false)); // update the hit-cache, unless there is a problem with memory scoping: if (accessing_method->holder()->is_shared() || !is_shared()) { diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index cfe55bf7f76..ac701e8364f 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -2115,6 +2115,7 @@ int java_lang_VirtualThread::_state_offset; int java_lang_VirtualThread::_next_offset; int java_lang_VirtualThread::_onWaitingList_offset; int java_lang_VirtualThread::_notified_offset; +int java_lang_VirtualThread::_interruptible_wait_offset; int java_lang_VirtualThread::_timeout_offset; int java_lang_VirtualThread::_objectWaiter_offset; @@ -2126,6 +2127,7 @@ int java_lang_VirtualThread::_objectWaiter_offset; macro(_next_offset, k, "next", vthread_signature, false); \ macro(_onWaitingList_offset, k, "onWaitingList", bool_signature, false); \ macro(_notified_offset, k, "notified", bool_signature, false); \ + macro(_interruptible_wait_offset, k, "interruptibleWait", bool_signature, false); \ macro(_timeout_offset, k, "timeout", long_signature, false); @@ -2195,6 +2197,10 @@ void java_lang_VirtualThread::set_notified(oop vthread, jboolean value) { vthread->bool_field_put_volatile(_notified_offset, value); } +void java_lang_VirtualThread::set_interruptible_wait(oop vthread, jboolean value) { + vthread->bool_field_put_volatile(_interruptible_wait_offset, value); +} + jlong java_lang_VirtualThread::timeout(oop vthread) { return vthread->long_field(_timeout_offset); } diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp index 750f27fcf47..28f8c0a3b8c 100644 --- a/src/hotspot/share/classfile/javaClasses.hpp +++ b/src/hotspot/share/classfile/javaClasses.hpp @@ -563,6 +563,7 @@ class java_lang_VirtualThread : AllStatic { static int _next_offset; static int _onWaitingList_offset; static int _notified_offset; + static int _interruptible_wait_offset; static int _recheckInterval_offset; static int _timeout_offset; static int _objectWaiter_offset; @@ -615,6 +616,7 @@ class java_lang_VirtualThread : AllStatic { static jlong timeout(oop vthread); static void set_timeout(oop vthread, jlong value); static void set_notified(oop vthread, jboolean value); + static void set_interruptible_wait(oop vthread, jboolean value); static bool is_preempted(oop vthread); static JavaThreadStatus map_state_to_thread_status(int state); diff --git a/src/hotspot/share/classfile/vmClassMacros.hpp b/src/hotspot/share/classfile/vmClassMacros.hpp index 1edc13054d4..04f0aaaaa44 100644 --- a/src/hotspot/share/classfile/vmClassMacros.hpp +++ b/src/hotspot/share/classfile/vmClassMacros.hpp @@ -75,6 +75,7 @@ do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException ) \ do_klass(Reference_klass, java_lang_ref_Reference ) \ do_klass(IllegalCallerException_klass, java_lang_IllegalCallerException ) \ + do_klass(PreemptedException_klass, jdk_internal_vm_PreemptedException ) \ \ /* ref klasses and set reference types */ \ do_klass(SoftReference_klass, java_lang_ref_SoftReference ) \ diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp index 06f27f09c5c..d22700b8d1f 100644 --- a/src/hotspot/share/classfile/vmSymbols.hpp +++ b/src/hotspot/share/classfile/vmSymbols.hpp @@ -220,6 +220,7 @@ class SerializeClosure; template(java_lang_Exception, "java/lang/Exception") \ template(java_lang_RuntimeException, "java/lang/RuntimeException") \ template(java_io_IOException, "java/io/IOException") \ + template(jdk_internal_vm_PreemptedException, "jdk/internal/vm/PreemptedException") \ \ /* error klasses: at least all errors thrown by the VM have entries here */ \ template(java_lang_AbstractMethodError, "java/lang/AbstractMethodError") \ @@ -512,6 +513,8 @@ class SerializeClosure; template(maxThawingSize_name, "maxThawingSize") \ template(lockStackSize_name, "lockStackSize") \ template(objectWaiter_name, "objectWaiter") \ + template(atKlassInit_name, "atKlassInit") \ + template(hasArgsAtTop_name, "hasArgsAtTop") \ \ /* name symbols needed by intrinsics */ \ VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, VM_SYMBOL_IGNORE, template, VM_SYMBOL_IGNORE, VM_ALIAS_IGNORE) \ diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index 6e067c77287..5f4cc6c450d 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -219,7 +219,7 @@ JRT_ENTRY(void, InterpreterRuntime::_new(JavaThread* current, ConstantPool* pool klass->check_valid_for_instantiation(true, CHECK); // Make sure klass is initialized - klass->initialize(CHECK); + klass->initialize_preemptable(CHECK_AND_CLEAR_PREEMPTED); oop obj = klass->allocate_instance(CHECK); current->set_vm_result_oop(obj); @@ -646,18 +646,19 @@ JRT_END // Fields // -void InterpreterRuntime::resolve_get_put(JavaThread* current, Bytecodes::Code bytecode) { +void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, TRAPS) { + JavaThread* current = THREAD; LastFrameAccessor last_frame(current); constantPoolHandle pool(current, last_frame.method()->constants()); methodHandle m(current, last_frame.method()); - resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, true /*initialize_holder*/, current); + resolve_get_put(bytecode, last_frame.get_index_u2(bytecode), m, pool, ClassInitMode::init_preemptable, THREAD); } void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, int field_index, methodHandle& m, constantPoolHandle& pool, - bool initialize_holder, TRAPS) { + ClassInitMode init_mode, TRAPS) { fieldDescriptor info; bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_nofast_putfield || bytecode == Bytecodes::_putstatic); @@ -665,8 +666,7 @@ void InterpreterRuntime::resolve_get_put(Bytecodes::Code bytecode, int field_ind { JvmtiHideSingleStepping jhss(THREAD); - LinkResolver::resolve_field_access(info, pool, field_index, - m, bytecode, initialize_holder, CHECK); + LinkResolver::resolve_field_access(info, pool, field_index, m, bytecode, init_mode, CHECK); } // end JvmtiHideSingleStepping // check if link resolution caused cpCache to be updated @@ -794,7 +794,8 @@ JRT_ENTRY(void, InterpreterRuntime::_breakpoint(JavaThread* current, Method* met JvmtiExport::post_raw_breakpoint(current, method, bcp); JRT_END -void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code bytecode) { +void InterpreterRuntime::resolve_invoke(Bytecodes::Code bytecode, TRAPS) { + JavaThread* current = THREAD; LastFrameAccessor last_frame(current); // extract receiver from the outgoing argument list if necessary Handle receiver(current, nullptr); @@ -822,10 +823,9 @@ void InterpreterRuntime::resolve_invoke(JavaThread* current, Bytecodes::Code byt int method_index = last_frame.get_index_u2(bytecode); { JvmtiHideSingleStepping jhss(current); - JavaThread* THREAD = current; // For exception macros. LinkResolver::resolve_invoke(info, receiver, pool, method_index, bytecode, - THREAD); + ClassInitMode::init_preemptable, THREAD); if (HAS_PENDING_EXCEPTION) { if (ProfileTraps && PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_NullPointerException()) { @@ -933,7 +933,8 @@ void InterpreterRuntime::cds_resolve_invoke(Bytecodes::Code bytecode, int method } // First time execution: Resolve symbols, create a permanent MethodType object. -void InterpreterRuntime::resolve_invokehandle(JavaThread* current) { +void InterpreterRuntime::resolve_invokehandle(TRAPS) { + JavaThread* current = THREAD; const Bytecodes::Code bytecode = Bytecodes::_invokehandle; LastFrameAccessor last_frame(current); @@ -962,7 +963,8 @@ void InterpreterRuntime::cds_resolve_invokehandle(int raw_index, } // First time execution: Resolve symbols, create a permanent CallSite object. -void InterpreterRuntime::resolve_invokedynamic(JavaThread* current) { +void InterpreterRuntime::resolve_invokedynamic(TRAPS) { + JavaThread* current = THREAD; LastFrameAccessor last_frame(current); const Bytecodes::Code bytecode = Bytecodes::_invokedynamic; @@ -997,19 +999,19 @@ JRT_ENTRY(void, InterpreterRuntime::resolve_from_cache(JavaThread* current, Byte case Bytecodes::_putstatic: case Bytecodes::_getfield: case Bytecodes::_putfield: - resolve_get_put(current, bytecode); + resolve_get_put(bytecode, CHECK_AND_CLEAR_PREEMPTED); break; case Bytecodes::_invokevirtual: case Bytecodes::_invokespecial: case Bytecodes::_invokestatic: case Bytecodes::_invokeinterface: - resolve_invoke(current, bytecode); + resolve_invoke(bytecode, CHECK_AND_CLEAR_PREEMPTED); break; case Bytecodes::_invokehandle: - resolve_invokehandle(current); + resolve_invokehandle(THREAD); break; case Bytecodes::_invokedynamic: - resolve_invokedynamic(current); + resolve_invokedynamic(THREAD); break; default: fatal("unexpected bytecode: %s", Bytecodes::name(bytecode)); @@ -1524,3 +1526,11 @@ JRT_LEAF(intptr_t, InterpreterRuntime::trace_bytecode(JavaThread* current, intpt return preserve_this_value; JRT_END #endif // !PRODUCT + +#ifdef ASSERT +bool InterpreterRuntime::is_preemptable_call(address entry_point) { + return entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter) || + entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache) || + entry_point == CAST_FROM_FN_PTR(address, InterpreterRuntime::_new); +} +#endif // ASSERT diff --git a/src/hotspot/share/interpreter/interpreterRuntime.hpp b/src/hotspot/share/interpreter/interpreterRuntime.hpp index cdee0c9daa7..f553debcd75 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.hpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.hpp @@ -94,7 +94,7 @@ class InterpreterRuntime: AllStatic { // Used by AOTConstantPoolResolver static void resolve_get_put(Bytecodes::Code bytecode, int field_index, - methodHandle& m, constantPoolHandle& pool, bool initialize_holder, TRAPS); + methodHandle& m, constantPoolHandle& pool, ClassInitMode init_mode, TRAPS); static void cds_resolve_invoke(Bytecodes::Code bytecode, int method_index, constantPoolHandle& pool, TRAPS); static void cds_resolve_invokehandle(int raw_index, @@ -103,12 +103,12 @@ class InterpreterRuntime: AllStatic { constantPoolHandle& pool, TRAPS); private: // Statics & fields - static void resolve_get_put(JavaThread* current, Bytecodes::Code bytecode); + static void resolve_get_put(Bytecodes::Code bytecode, TRAPS); // Calls - static void resolve_invoke(JavaThread* current, Bytecodes::Code bytecode); - static void resolve_invokehandle (JavaThread* current); - static void resolve_invokedynamic(JavaThread* current); + static void resolve_invoke(Bytecodes::Code bytecode, TRAPS); + static void resolve_invokehandle (TRAPS); + static void resolve_invokedynamic(TRAPS); static void update_invoke_cp_cache_entry(CallInfo& info, Bytecodes::Code bytecode, methodHandle& resolved_method, @@ -170,6 +170,9 @@ private: static void verify_mdp(Method* method, address bcp, address mdp); #endif // ASSERT static MethodCounters* build_method_counters(JavaThread* current, Method* m); + + // Virtual Thread Preemption + DEBUG_ONLY(static bool is_preemptable_call(address entry_point);) }; diff --git a/src/hotspot/share/interpreter/linkResolver.cpp b/src/hotspot/share/interpreter/linkResolver.cpp index d46ccdb4d1c..c82398b654c 100644 --- a/src/hotspot/share/interpreter/linkResolver.cpp +++ b/src/hotspot/share/interpreter/linkResolver.cpp @@ -986,14 +986,14 @@ void LinkResolver::resolve_field_access(fieldDescriptor& fd, int index, const methodHandle& method, Bytecodes::Code byte, - bool initialize_class, TRAPS) { + ClassInitMode init_mode, TRAPS) { LinkInfo link_info(pool, index, method, byte, CHECK); - resolve_field(fd, link_info, byte, initialize_class, CHECK); + resolve_field(fd, link_info, byte, init_mode, CHECK); } void LinkResolver::resolve_field(fieldDescriptor& fd, const LinkInfo& link_info, - Bytecodes::Code byte, bool initialize_class, + Bytecodes::Code byte, ClassInitMode init_mode, TRAPS) { assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic || byte == Bytecodes::_getfield || byte == Bytecodes::_putfield || @@ -1077,8 +1077,12 @@ void LinkResolver::resolve_field(fieldDescriptor& fd, // // note 2: we don't want to force initialization if we are just checking // if the field access is legal; e.g., during compilation - if (is_static && initialize_class) { - sel_klass->initialize(CHECK); + if (is_static) { + if (init_mode == ClassInitMode::init) { + sel_klass->initialize(CHECK); + } else if (init_mode == ClassInitMode::init_preemptable) { + sel_klass->initialize_preemptable(CHECK); + } } } @@ -1104,15 +1108,19 @@ void LinkResolver::resolve_field(fieldDescriptor& fd, void LinkResolver::resolve_static_call(CallInfo& result, const LinkInfo& link_info, - bool initialize_class, TRAPS) { + ClassInitMode init_mode, TRAPS) { Method* resolved_method = linktime_resolve_static_method(link_info, CHECK); // The resolved class can change as a result of this resolution. Klass* resolved_klass = resolved_method->method_holder(); // Initialize klass (this should only happen if everything is ok) - if (initialize_class && resolved_klass->should_be_initialized()) { - resolved_klass->initialize(CHECK); + if (init_mode != ClassInitMode::dont_init && resolved_klass->should_be_initialized()) { + if (init_mode == ClassInitMode::init) { + resolved_klass->initialize(CHECK); + } else if (init_mode == ClassInitMode::init_preemptable) { + resolved_klass->initialize_preemptable(CHECK); + } // Use updated LinkInfo to reresolve with resolved method holder LinkInfo new_info(resolved_klass, link_info.name(), link_info.signature(), link_info.current_klass(), @@ -1127,7 +1135,7 @@ void LinkResolver::resolve_static_call(CallInfo& result, } void LinkResolver::cds_resolve_static_call(CallInfo& result, const LinkInfo& link_info, TRAPS) { - resolve_static_call(result, link_info, /*initialize_class*/false, CHECK); + resolve_static_call(result, link_info, ClassInitMode::dont_init, CHECK); } // throws linktime exceptions @@ -1678,7 +1686,7 @@ int LinkResolver::resolve_virtual_vtable_index(Klass* receiver_klass, Method* LinkResolver::resolve_static_call_or_null(const LinkInfo& link_info) { EXCEPTION_MARK; CallInfo info; - resolve_static_call(info, link_info, /*initialize_class*/false, THREAD); + resolve_static_call(info, link_info, ClassInitMode::dont_init, THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return nullptr; @@ -1702,15 +1710,15 @@ Method* LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) { //------------------------------------------------------------------------------------------------------------------------ // ConstantPool entries -void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) { +void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, ClassInitMode init_mode, TRAPS) { switch (byte) { - case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break; - case Bytecodes::_invokespecial : resolve_invokespecial (result, recv, pool, index, CHECK); break; - case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break; - case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break; - case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break; - case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break; - default : break; + case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, init_mode, CHECK); break; + case Bytecodes::_invokespecial : resolve_invokespecial (result, recv, pool, index, CHECK); break; + case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break; + case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break; + case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break; + case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break; + default : break; } return; } @@ -1732,7 +1740,7 @@ void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv, /*check_null_and_abstract=*/true, CHECK); break; case Bytecodes::_invokestatic: - resolve_static_call(result, link_info, /*initialize_class=*/false, CHECK); + resolve_static_call(result, link_info, ClassInitMode::dont_init, CHECK); break; case Bytecodes::_invokespecial: resolve_special_call(result, recv, link_info, CHECK); @@ -1743,9 +1751,9 @@ void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv, } } -void LinkResolver::resolve_invokestatic(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) { +void LinkResolver::resolve_invokestatic(CallInfo& result, const constantPoolHandle& pool, int index, ClassInitMode init_mode, TRAPS) { LinkInfo link_info(pool, index, Bytecodes::_invokestatic, CHECK); - resolve_static_call(result, link_info, /*initialize_class*/true, CHECK); + resolve_static_call(result, link_info, init_mode, CHECK); } diff --git a/src/hotspot/share/interpreter/linkResolver.hpp b/src/hotspot/share/interpreter/linkResolver.hpp index 18fb4ee6ccb..4d28e712c5f 100644 --- a/src/hotspot/share/interpreter/linkResolver.hpp +++ b/src/hotspot/share/interpreter/linkResolver.hpp @@ -189,6 +189,12 @@ class LinkInfo : public StackObj { void print() PRODUCT_RETURN; }; +enum class ClassInitMode { + dont_init, + init, + init_preemptable +}; + // Link information for getfield/putfield & getstatic/putstatic bytecodes // is represented using a fieldDescriptor. @@ -267,7 +273,7 @@ class LinkResolver: AllStatic { // runtime resolving from constant pool static void resolve_invokestatic (CallInfo& result, - const constantPoolHandle& pool, int index, TRAPS); + const constantPoolHandle& pool, int index, ClassInitMode mode, TRAPS); static void resolve_invokespecial (CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, TRAPS); static void resolve_invokevirtual (CallInfo& result, Handle recv, @@ -295,22 +301,21 @@ class LinkResolver: AllStatic { int index, const methodHandle& method, Bytecodes::Code byte, - bool initialize_class, TRAPS); + ClassInitMode mode, TRAPS); static void resolve_field_access(fieldDescriptor& result, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) { - resolve_field_access(result, pool, index, method, byte, - /* initialize_class*/true, THREAD); + resolve_field_access(result, pool, index, method, byte, ClassInitMode::init, THREAD); } static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info, Bytecodes::Code access_kind, - bool initialize_class, TRAPS); + ClassInitMode mode, TRAPS); static void resolve_static_call (CallInfo& result, const LinkInfo& link_info, - bool initialize_klass, TRAPS); + ClassInitMode mode, TRAPS); static void resolve_special_call (CallInfo& result, Handle recv, const LinkInfo& link_info, @@ -353,7 +358,12 @@ class LinkResolver: AllStatic { // runtime resolving from constant pool static void resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, - Bytecodes::Code byte, TRAPS); + Bytecodes::Code byte, ClassInitMode static_mode, TRAPS); + static void resolve_invoke(CallInfo& result, Handle recv, + const constantPoolHandle& pool, int index, + Bytecodes::Code byte, TRAPS) { + resolve_invoke(result, recv, pool, index, byte, ClassInitMode::init, THREAD); + } // runtime resolving from attached method static void resolve_invoke(CallInfo& result, Handle& recv, diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index 36a6fae794a..5891bec9c8a 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -1008,7 +1008,7 @@ C2V_VMENTRY_NULL(jobject, resolveFieldInPool, (JNIEnv* env, jobject, ARGUMENT_PA } LinkInfo link_info(cp, index, mh, code, CHECK_NULL); - LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_NULL); + LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), ClassInitMode::dont_init, CHECK_NULL); JVMCIPrimitiveArray info = JVMCIENV->wrap(info_handle); if (info.is_null() || JVMCIENV->get_length(info) != 4) { JVMCI_ERROR_NULL("info must not be null and have a length of 4"); diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp index 756619bff33..69afe5c6450 100644 --- a/src/hotspot/share/memory/universe.cpp +++ b/src/hotspot/share/memory/universe.cpp @@ -238,6 +238,7 @@ static BuiltinException _internal_error; static BuiltinException _array_index_out_of_bounds_exception; static BuiltinException _array_store_exception; static BuiltinException _class_cast_exception; +static BuiltinException _preempted_exception; objArrayOop Universe::the_empty_class_array () { return (objArrayOop)_the_empty_class_array.resolve(); @@ -258,6 +259,7 @@ oop Universe::internal_error_instance() { return _internal_error.insta oop Universe::array_index_out_of_bounds_exception_instance() { return _array_index_out_of_bounds_exception.instance(); } oop Universe::array_store_exception_instance() { return _array_store_exception.instance(); } oop Universe::class_cast_exception_instance() { return _class_cast_exception.instance(); } +oop Universe::preempted_exception_instance() { return _preempted_exception.instance(); } oop Universe::the_null_sentinel() { return _the_null_sentinel.resolve(); } @@ -317,6 +319,7 @@ void Universe::archive_exception_instances() { _array_index_out_of_bounds_exception.store_in_cds(); _array_store_exception.store_in_cds(); _class_cast_exception.store_in_cds(); + _preempted_exception.store_in_cds(); } void Universe::load_archived_object_instances() { @@ -336,6 +339,7 @@ void Universe::load_archived_object_instances() { _array_index_out_of_bounds_exception.load_from_cds(); _array_store_exception.load_from_cds(); _class_cast_exception.load_from_cds(); + _preempted_exception.load_from_cds(); } } #endif @@ -355,6 +359,7 @@ void Universe::serialize(SerializeClosure* f) { _array_index_out_of_bounds_exception.serialize(f); _array_store_exception.serialize(f); _class_cast_exception.serialize(f); + _preempted_exception.serialize(f); #endif f->do_ptr(&_fillerArrayKlass); @@ -1139,6 +1144,7 @@ bool universe_post_init() { _array_index_out_of_bounds_exception.init_if_empty(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), CHECK_false); _array_store_exception.init_if_empty(vmSymbols::java_lang_ArrayStoreException(), CHECK_false); _class_cast_exception.init_if_empty(vmSymbols::java_lang_ClassCastException(), CHECK_false); + _preempted_exception.init_if_empty(vmSymbols::jdk_internal_vm_PreemptedException(), CHECK_false); // Virtual Machine Error for when we get into a situation we can't resolve Klass* k = vmClasses::InternalError_klass(); diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp index 37ca965062e..df2c1d66d3c 100644 --- a/src/hotspot/share/memory/universe.hpp +++ b/src/hotspot/share/memory/universe.hpp @@ -244,6 +244,7 @@ class Universe: AllStatic { static oop array_index_out_of_bounds_exception_instance(); static oop array_store_exception_instance(); static oop class_cast_exception_instance(); + static oop preempted_exception_instance(); static oop vm_exception() { return internal_error_instance(); } static Array* the_array_interfaces_array() { return _the_array_interfaces_array; } diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index e13f4849454..2d03b69ee92 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -793,10 +793,11 @@ oop InstanceKlass::init_lock() const { return lock; } -// Set the initialization lock to null so the object can be GC'ed. Any racing +// Set the initialization lock to null so the object can be GC'ed. Any racing // threads to get this lock will see a null lock and will not lock. // That's okay because they all check for initialized state after getting -// the lock and return. +// the lock and return. For preempted vthreads we keep the oop protected +// in the ObjectMonitor (see ObjectMonitor::set_object_strong()). void InstanceKlass::fence_and_clear_init_lock() { // make sure previous stores are all done, notably the init_state. OrderAccess::storestore(); @@ -804,6 +805,31 @@ void InstanceKlass::fence_and_clear_init_lock() { assert(!is_not_initialized(), "class must be initialized now"); } +class PreemptableInitCall { + JavaThread* _thread; + bool _previous; + DEBUG_ONLY(InstanceKlass* _previous_klass;) + public: + PreemptableInitCall(JavaThread* thread, InstanceKlass* ik) : _thread(thread) { + _previous = thread->at_preemptable_init(); + _thread->set_at_preemptable_init(true); + DEBUG_ONLY(_previous_klass = _thread->preempt_init_klass();) + DEBUG_ONLY(_thread->set_preempt_init_klass(ik)); + } + ~PreemptableInitCall() { + _thread->set_at_preemptable_init(_previous); + DEBUG_ONLY(_thread->set_preempt_init_klass(_previous_klass)); + } +}; + +void InstanceKlass::initialize_preemptable(TRAPS) { + if (this->should_be_initialized()) { + PreemptableInitCall pic(THREAD, this); + initialize_impl(THREAD); + } else { + assert(is_initialized(), "sanity check"); + } +} // See "The Virtual Machine Specification" section 2.16.5 for a detailed explanation of the class initialization // process. The step comments refers to the procedure described in that section. @@ -980,7 +1006,12 @@ bool InstanceKlass::link_class_impl(TRAPS) { { HandleMark hm(THREAD); Handle h_init_lock(THREAD, init_lock()); - ObjectLocker ol(h_init_lock, jt); + ObjectLocker ol(h_init_lock, CHECK_PREEMPTABLE_false); + // Don't allow preemption if we link/initialize classes below, + // since that would release this monitor while we are in the + // middle of linking this class. + NoPreemptMark npm(THREAD); + // rewritten will have been set if loader constraint error found // on an earlier link attempt // don't verify or rewrite if already rewritten @@ -1174,6 +1205,17 @@ void InstanceKlass::clean_initialization_error_table() { } } +class ThreadWaitingForClassInit : public StackObj { + JavaThread* _thread; + public: + ThreadWaitingForClassInit(JavaThread* thread, InstanceKlass* ik) : _thread(thread) { + _thread->set_class_to_be_initialized(ik); + } + ~ThreadWaitingForClassInit() { + _thread->set_class_to_be_initialized(nullptr); + } +}; + void InstanceKlass::initialize_impl(TRAPS) { HandleMark hm(THREAD); @@ -1193,7 +1235,7 @@ void InstanceKlass::initialize_impl(TRAPS) { // Step 1 { Handle h_init_lock(THREAD, init_lock()); - ObjectLocker ol(h_init_lock, jt); + ObjectLocker ol(h_init_lock, CHECK_PREEMPTABLE); // Step 2 // If we were to use wait() instead of waitInterruptibly() then @@ -1206,9 +1248,8 @@ void InstanceKlass::initialize_impl(TRAPS) { jt->name(), external_name(), init_thread_name()); } wait = true; - jt->set_class_to_be_initialized(this); - ol.wait_uninterruptibly(jt); - jt->set_class_to_be_initialized(nullptr); + ThreadWaitingForClassInit twcl(THREAD, this); + ol.wait_uninterruptibly(CHECK_PREEMPTABLE); } // Step 3 @@ -1266,6 +1307,10 @@ void InstanceKlass::initialize_impl(TRAPS) { } } + // Block preemption once we are the initializer thread. Unmounting now + // would complicate the reentrant case (identity is platform thread). + NoPreemptMark npm(THREAD); + // Step 7 // Next, if C is a class rather than an interface, initialize it's super class and super // interfaces. diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index 82c82714f9b..8bb9741af9f 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -538,6 +538,7 @@ public: void initialize_with_aot_initialized_mirror(TRAPS); void assert_no_clinit_will_run_for_aot_initialized_class() const NOT_DEBUG_RETURN; void initialize(TRAPS); + void initialize_preemptable(TRAPS); void link_class(TRAPS); bool link_class_or_fail(TRAPS); // returns false on failure void rewrite_class(TRAPS); diff --git a/src/hotspot/share/oops/instanceStackChunkKlass.cpp b/src/hotspot/share/oops/instanceStackChunkKlass.cpp index db60e74013f..aaa3eaa4f6b 100644 --- a/src/hotspot/share/oops/instanceStackChunkKlass.cpp +++ b/src/hotspot/share/oops/instanceStackChunkKlass.cpp @@ -195,7 +195,8 @@ public: } const RegisterMap* get_map(const RegisterMap* map, intptr_t* sp) { return map; } - const RegisterMap* get_map(const SmallRegisterMap* map, intptr_t* sp) { return map->copy_to_RegisterMap(&_map, sp); } + template + const RegisterMap* get_map(const SmallRegisterMapT map, intptr_t* sp) { return map->copy_to_RegisterMap(&_map, sp); } template bool do_frame(const StackChunkFrameStream& f, const RegisterMapT* map) { diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp index 208a274d766..d9041cc54f4 100644 --- a/src/hotspot/share/oops/klass.cpp +++ b/src/hotspot/share/oops/klass.cpp @@ -252,6 +252,10 @@ void Klass::initialize(TRAPS) { ShouldNotReachHere(); } +void Klass::initialize_preemptable(TRAPS) { + ShouldNotReachHere(); +} + Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { #ifdef ASSERT tty->print_cr("Error: find_field called on a klass oop." diff --git a/src/hotspot/share/oops/klass.hpp b/src/hotspot/share/oops/klass.hpp index db3360b080e..5ac393d7614 100644 --- a/src/hotspot/share/oops/klass.hpp +++ b/src/hotspot/share/oops/klass.hpp @@ -580,6 +580,7 @@ public: virtual bool should_be_initialized() const { return false; } // initializes the klass virtual void initialize(TRAPS); + virtual void initialize_preemptable(TRAPS); virtual Klass* find_field(Symbol* name, Symbol* signature, fieldDescriptor* fd) const; virtual Method* uncached_lookup_method(const Symbol* name, const Symbol* signature, OverpassLookupMode overpass_mode, diff --git a/src/hotspot/share/oops/stackChunkOop.cpp b/src/hotspot/share/oops/stackChunkOop.cpp index 13a94d65f8e..67e5e474cce 100644 --- a/src/hotspot/share/oops/stackChunkOop.cpp +++ b/src/hotspot/share/oops/stackChunkOop.cpp @@ -56,7 +56,7 @@ public: virtual void oops_do(OopClosure* cl) override { if (_f.is_interpreted_frame()) { - _f.oops_interpreted_do(cl, nullptr); + _f.oops_interpreted_do(cl, _map); } else { OopMapDo visitor(cl, nullptr); visitor.oops_do(&_f, _map, _f.oop_map()); @@ -139,7 +139,7 @@ static int num_java_frames(const StackChunkFrameStream& f) { int stackChunkOopDesc::num_java_frames() const { int n = 0; for (StackChunkFrameStream f(const_cast(this)); !f.is_done(); - f.next(SmallRegisterMap::instance())) { + f.next(SmallRegisterMap::instance_no_args())) { if (!f.is_stub()) { n += ::num_java_frames(f); } @@ -415,10 +415,12 @@ template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const RegisterMap* map); template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const RegisterMap* map); template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const RegisterMap* map); -template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const SmallRegisterMap* map); -template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const SmallRegisterMap* map); -template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const SmallRegisterMap* map); -template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const SmallRegisterMap* map); +template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const SmallRegisterMapNoArgs* map); +template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const SmallRegisterMapNoArgs* map); +template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const SmallRegisterMapNoArgs* map); +template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const SmallRegisterMapNoArgs* map); +template void stackChunkOopDesc::do_barriers0 (const StackChunkFrameStream& f, const SmallRegisterMapWithArgs* map); +template void stackChunkOopDesc::do_barriers0(const StackChunkFrameStream& f, const SmallRegisterMapWithArgs* map); template void stackChunkOopDesc::fix_thawed_frame(const frame& f, const RegisterMapT* map) { @@ -438,7 +440,8 @@ void stackChunkOopDesc::fix_thawed_frame(const frame& f, const RegisterMapT* map } template void stackChunkOopDesc::fix_thawed_frame(const frame& f, const RegisterMap* map); -template void stackChunkOopDesc::fix_thawed_frame(const frame& f, const SmallRegisterMap* map); +template void stackChunkOopDesc::fix_thawed_frame(const frame& f, const SmallRegisterMapNoArgs* map); +template void stackChunkOopDesc::fix_thawed_frame(const frame& f, const SmallRegisterMapWithArgs* map); void stackChunkOopDesc::transfer_lockstack(oop* dst, bool requires_barriers) { const bool requires_gc_barriers = is_gc_mode() || requires_barriers; @@ -527,7 +530,7 @@ public: _cb = f.cb(); int fsize = f.frame_size() - ((f.is_interpreted() == _callee_interpreted) ? _argsize : 0); - int num_oops = f.num_oops(); + int num_oops = f.num_oops(map); assert(num_oops >= 0, ""); _argsize = f.stack_argsize() + frame::metadata_words_at_top; diff --git a/src/hotspot/share/oops/stackChunkOop.hpp b/src/hotspot/share/oops/stackChunkOop.hpp index 57ab6316c2a..79944f0326e 100644 --- a/src/hotspot/share/oops/stackChunkOop.hpp +++ b/src/hotspot/share/oops/stackChunkOop.hpp @@ -137,6 +137,12 @@ public: inline bool preempted() const; inline void set_preempted(bool value); + inline bool at_klass_init() const; + inline void set_at_klass_init(bool value); + + inline bool has_args_at_top() const; + inline void set_has_args_at_top(bool value); + inline bool has_lockstack() const; inline void set_has_lockstack(bool value); diff --git a/src/hotspot/share/oops/stackChunkOop.inline.hpp b/src/hotspot/share/oops/stackChunkOop.inline.hpp index 9c91e934328..4fe5b913ade 100644 --- a/src/hotspot/share/oops/stackChunkOop.inline.hpp +++ b/src/hotspot/share/oops/stackChunkOop.inline.hpp @@ -168,6 +168,18 @@ inline void stackChunkOopDesc::set_preempted(bool value) { set_flag(FLAG_PREEMPTED, value); } +inline bool stackChunkOopDesc::at_klass_init() const { return jdk_internal_vm_StackChunk::atKlassInit(as_oop()); } +inline void stackChunkOopDesc::set_at_klass_init(bool value) { + assert(at_klass_init() != value, ""); + jdk_internal_vm_StackChunk::set_atKlassInit(this, value); +} + +inline bool stackChunkOopDesc::has_args_at_top() const { return jdk_internal_vm_StackChunk::hasArgsAtTop(as_oop()); } +inline void stackChunkOopDesc::set_has_args_at_top(bool value) { + assert(has_args_at_top() != value, ""); + jdk_internal_vm_StackChunk::set_hasArgsAtTop(this, value); +} + inline bool stackChunkOopDesc::has_lockstack() const { return is_flag(FLAG_HAS_LOCKSTACK); } inline void stackChunkOopDesc::set_has_lockstack(bool value) { set_flag(FLAG_HAS_LOCKSTACK, value); } @@ -210,7 +222,7 @@ inline void stackChunkOopDesc::iterate_stack(StackChunkFrameClosureType* closure template inline void stackChunkOopDesc::iterate_stack(StackChunkFrameClosureType* closure) { - const SmallRegisterMap* map = SmallRegisterMap::instance(); + const auto* map = SmallRegisterMap::instance_no_args(); assert(!map->in_cont(), ""); StackChunkFrameStream f(this); @@ -230,6 +242,9 @@ inline void stackChunkOopDesc::iterate_stack(StackChunkFrameClosureType* closure should_continue = closure->do_frame(f, &full_map); f.next(map); + } else if (frame_kind == ChunkFrames::Mixed && f.is_interpreted() && has_args_at_top()) { + should_continue = closure->do_frame(f, SmallRegisterMap::instance_with_args()); + f.next(map); } assert(!f.is_stub(), ""); diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index 4c3dc9ebf03..d241ca6110a 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -1337,21 +1337,19 @@ void JvmtiExport::at_single_stepping_point(JavaThread *thread, Method* method, a } -void JvmtiExport::expose_single_stepping(JavaThread *thread) { - JvmtiThreadState *state = get_jvmti_thread_state(thread); - if (state != nullptr) { - state->clear_hide_single_stepping(); - } +void JvmtiExport::expose_single_stepping(JvmtiThreadState* state) { + assert(state != nullptr, "must be non-null"); + state->clear_hide_single_stepping(); } -bool JvmtiExport::hide_single_stepping(JavaThread *thread) { +JvmtiThreadState* JvmtiExport::hide_single_stepping(JavaThread *thread) { JvmtiThreadState *state = get_jvmti_thread_state(thread); if (state != nullptr && state->is_enabled(JVMTI_EVENT_SINGLE_STEP)) { state->set_hide_single_stepping(); - return true; + return state; } else { - return false; + return nullptr; } } diff --git a/src/hotspot/share/prims/jvmtiExport.hpp b/src/hotspot/share/prims/jvmtiExport.hpp index 8906d6b81df..66f5413c8f6 100644 --- a/src/hotspot/share/prims/jvmtiExport.hpp +++ b/src/hotspot/share/prims/jvmtiExport.hpp @@ -317,8 +317,8 @@ class JvmtiExport : public AllStatic { // single stepping management methods static void at_single_stepping_point(JavaThread *thread, Method* method, address location) NOT_JVMTI_RETURN; - static void expose_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN; - static bool hide_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN_(false); + static void expose_single_stepping(JvmtiThreadState* state) NOT_JVMTI_RETURN; + static JvmtiThreadState* hide_single_stepping(JavaThread *thread) NOT_JVMTI_RETURN_(nullptr); // Methods that notify the debugger that something interesting has happened in the VM. static void post_early_vm_start () NOT_JVMTI_RETURN; @@ -622,23 +622,20 @@ class JvmtiGCMarker : public StackObj { // internal single step events. class JvmtiHideSingleStepping : public StackObj { private: - bool _single_step_hidden; - JavaThread * _thread; + JvmtiThreadState* _state; public: - JvmtiHideSingleStepping(JavaThread * thread) { + JvmtiHideSingleStepping(JavaThread * thread) : _state(nullptr) { assert(thread != nullptr, "sanity check"); - _single_step_hidden = false; - _thread = thread; if (JvmtiExport::should_post_single_step()) { - _single_step_hidden = JvmtiExport::hide_single_stepping(_thread); + _state = JvmtiExport::hide_single_stepping(thread); } } ~JvmtiHideSingleStepping() { - if (_single_step_hidden) { - JvmtiExport::expose_single_stepping(_thread); + if (_state != nullptr) { + JvmtiExport::expose_single_stepping(_state); } } }; diff --git a/src/hotspot/share/prims/methodHandles.cpp b/src/hotspot/share/prims/methodHandles.cpp index b13bd392eaa..c243cae20ab 100644 --- a/src/hotspot/share/prims/methodHandles.cpp +++ b/src/hotspot/share/prims/methodHandles.cpp @@ -771,7 +771,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, int lookup assert(!HAS_PENDING_EXCEPTION, ""); if (ref_kind == JVM_REF_invokeStatic) { LinkResolver::resolve_static_call(result, - link_info, false, THREAD); + link_info, ClassInitMode::dont_init, THREAD); } else if (ref_kind == JVM_REF_invokeInterface) { LinkResolver::resolve_interface_call(result, Handle(), defc, link_info, false, THREAD); @@ -833,7 +833,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, Klass* caller, int lookup { assert(!HAS_PENDING_EXCEPTION, ""); LinkInfo link_info(defc, name, type, caller, LinkInfo::AccessCheck::skip, loader_constraint_check); - LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD); + LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, ClassInitMode::dont_init, THREAD); if (HAS_PENDING_EXCEPTION) { if (speculative_resolve) { CLEAR_PENDING_EXCEPTION; diff --git a/src/hotspot/share/runtime/continuation.hpp b/src/hotspot/share/runtime/continuation.hpp index 0cfd484361d..c54a56ce7eb 100644 --- a/src/hotspot/share/runtime/continuation.hpp +++ b/src/hotspot/share/runtime/continuation.hpp @@ -62,8 +62,9 @@ class Continuation : AllStatic { public: enum preempt_kind { - freeze_on_monitorenter, - freeze_on_wait + monitorenter, + object_wait, + object_locker }; enum thaw_kind { diff --git a/src/hotspot/share/runtime/continuationFreezeThaw.cpp b/src/hotspot/share/runtime/continuationFreezeThaw.cpp index 6ede40c22e0..2a31e5fb5b2 100644 --- a/src/hotspot/share/runtime/continuationFreezeThaw.cpp +++ b/src/hotspot/share/runtime/continuationFreezeThaw.cpp @@ -34,11 +34,14 @@ #include "gc/shared/gc_globals.hpp" #include "gc/shared/memAllocator.hpp" #include "gc/shared/threadLocalAllocBuffer.inline.hpp" +#include "interpreter/bytecodeStream.hpp" #include "interpreter/interpreter.hpp" +#include "interpreter/interpreterRuntime.hpp" #include "jfr/jfrEvents.hpp" #include "logging/log.hpp" #include "logging/logStream.hpp" #include "oops/access.inline.hpp" +#include "oops/constantPool.inline.hpp" #include "oops/method.inline.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oopsHierarchy.hpp" @@ -64,6 +67,8 @@ #include "runtime/stackFrameStream.inline.hpp" #include "runtime/stackOverflow.hpp" #include "runtime/stackWatermarkSet.inline.hpp" +#include "runtime/vframe.inline.hpp" +#include "runtime/vframe_hp.hpp" #include "utilities/debug.hpp" #include "utilities/exceptions.hpp" #include "utilities/macros.hpp" @@ -74,6 +79,12 @@ #if INCLUDE_JFR #include "jfr/jfr.inline.hpp" #endif +#ifdef COMPILER1 +#include "c1/c1_Runtime1.hpp" +#endif +#ifdef COMPILER2 +#include "opto/runtime.hpp" +#endif /* * This file contains the implementation of continuation freezing (yield) and thawing (run). @@ -182,8 +193,9 @@ static void verify_continuation(oop continuation) { Continuation::debug_verify_c static void do_deopt_after_thaw(JavaThread* thread); static bool do_verify_after_thaw(JavaThread* thread, stackChunkOop chunk, outputStream* st); static void log_frames(JavaThread* thread); -static void log_frames_after_thaw(JavaThread* thread, ContinuationWrapper& cont, intptr_t* sp, bool preempted); +static void log_frames_after_thaw(JavaThread* thread, ContinuationWrapper& cont, intptr_t* sp); static void print_frame_layout(const frame& f, bool callee_complete, outputStream* st = tty); +static void verify_frame_kind(frame& top, Continuation::preempt_kind preempt_kind, Method** m_ptr = nullptr, const char** code_name_ptr = nullptr, int* bci_ptr = nullptr, stackChunkOop chunk = nullptr); #define assert_pfl(p, ...) \ do { \ @@ -461,7 +473,7 @@ private: inline void patch_pd(frame& callee, const frame& caller); inline void patch_pd_unused(intptr_t* sp); void adjust_interpreted_frame_unextended_sp(frame& f); - static inline void prepare_freeze_interpreted_top_frame(frame& f); + inline void prepare_freeze_interpreted_top_frame(frame& f); static inline void relativize_interpreted_frame_metadata(const frame& f, const frame& hf); protected: @@ -1089,13 +1101,27 @@ freeze_result FreezeBase::finalize_freeze(const frame& callee, frame& caller, in assert(!chunk->is_empty() || StackChunkFrameStream(chunk).to_frame().is_empty(), ""); if (_preempt) { - frame f = _thread->last_frame(); - if (f.is_interpreted_frame()) { + frame top_frame = _thread->last_frame(); + if (top_frame.is_interpreted_frame()) { // Some platforms do not save the last_sp in the top interpreter frame on VM calls. // We need it so that on resume we can restore the sp to the right place, since // thawing might add an alignment word to the expression stack (see finish_thaw()). // We do it now that we know freezing will be successful. - prepare_freeze_interpreted_top_frame(f); + prepare_freeze_interpreted_top_frame(top_frame); + } + + // Do this now so should_process_args_at_top() is set before calling finish_freeze + // in case we might need to apply GC barriers to frames in this stackChunk. + if (_thread->at_preemptable_init()) { + assert(top_frame.is_interpreted_frame(), "only InterpreterRuntime::_new/resolve_from_cache allowed"); + chunk->set_at_klass_init(true); + methodHandle m(_thread, top_frame.interpreter_frame_method()); + Bytecode_invoke call = Bytecode_invoke_check(m, top_frame.interpreter_frame_bci()); + assert(!call.is_valid() || call.is_invokestatic(), "only invokestatic allowed"); + if (call.is_invokestatic() && call.size_of_parameters() > 0) { + assert(top_frame.interpreter_frame_expression_stack_size() > 0, "should have parameters in exp stack"); + chunk->set_has_args_at_top(true); + } } } @@ -1607,6 +1633,25 @@ void FreezeBase::throw_stack_overflow_on_humongous_chunk() { Exceptions::_throw_msg(_thread, __FILE__, __LINE__, vmSymbols::java_lang_StackOverflowError(), "Humongous stack chunk"); } +class AnchorMark : public StackObj { + JavaThread* _current; + frame& _top_frame; + intptr_t* _last_sp_from_frame; + bool _is_interpreted; + + public: + AnchorMark(JavaThread* current, frame& f) : _current(current), _top_frame(f), _is_interpreted(false) { + intptr_t* sp = anchor_mark_set_pd(); + set_anchor(_current, sp); + } + ~AnchorMark() { + clear_anchor(_current); + anchor_mark_clear_pd(); + } + inline intptr_t* anchor_mark_set_pd(); + inline void anchor_mark_clear_pd(); +}; + #if INCLUDE_JVMTI static int num_java_frames(ContinuationWrapper& cont) { ResourceMark rm; // used for scope traversal in num_java_frames(nmethod*, address) @@ -1636,27 +1681,25 @@ static void jvmti_yield_cleanup(JavaThread* thread, ContinuationWrapper& cont) { } } -static void jvmti_mount_end(JavaThread* current, ContinuationWrapper& cont, frame top) { +static void jvmti_mount_end(JavaThread* current, ContinuationWrapper& cont, frame top, Continuation::preempt_kind pk) { assert(current->vthread() != nullptr, "must be"); - HandleMarkCleaner hm(current); + HandleMarkCleaner hm(current); // Cleanup all handles (including so._conth) before returning to Java. Handle vth(current, current->vthread()); - ContinuationWrapper::SafepointOp so(current, cont); - - // Since we might safepoint set the anchor so that the stack can be walked. - set_anchor(current, top.sp()); + AnchorMark am(current, top); // Set anchor so that the stack is walkable. JRT_BLOCK JvmtiVTMSTransitionDisabler::VTMS_vthread_mount((jthread)vth.raw_value(), false); if (current->pending_contended_entered_event()) { - JvmtiExport::post_monitor_contended_entered(current, current->contended_entered_monitor()); + // No monitor JVMTI events for ObjectLocker case. + if (pk != Continuation::object_locker) { + JvmtiExport::post_monitor_contended_entered(current, current->contended_entered_monitor()); + } current->set_contended_entered_monitor(nullptr); } JRT_BLOCK_END - - clear_anchor(current); } #endif // INCLUDE_JVMTI @@ -1679,6 +1722,109 @@ bool FreezeBase::check_valid_fast_path() { } return true; } + +static void verify_frame_kind(frame& top, Continuation::preempt_kind preempt_kind, Method** m_ptr, const char** code_name_ptr, int* bci_ptr, stackChunkOop chunk) { + Method* m; + const char* code_name; + int bci; + if (preempt_kind == Continuation::monitorenter) { + assert(top.is_interpreted_frame() || top.is_runtime_frame(), "unexpected %sframe", + top.is_compiled_frame() ? "compiled " : top.is_native_frame() ? "native " : ""); + bool at_sync_method; + if (top.is_interpreted_frame()) { + m = top.interpreter_frame_method(); + assert(!m->is_native() || m->is_synchronized(), "invalid method %s", m->external_name()); + address bcp = top.interpreter_frame_bcp(); + assert(bcp != 0 || m->is_native(), ""); + at_sync_method = m->is_synchronized() && (bcp == 0 || bcp == m->code_base()); + // bcp is advanced on monitorenter before making the VM call, adjust for that. + bool at_sync_bytecode = bcp > m->code_base() && Bytecode(m, bcp - 1).code() == Bytecodes::Code::_monitorenter; + assert(at_sync_method || at_sync_bytecode, ""); + bci = at_sync_method ? -1 : top.interpreter_frame_bci(); + } else { + JavaThread* current = JavaThread::current(); + ResourceMark rm(current); + CodeBlob* cb = top.cb(); + RegisterMap reg_map(current, + RegisterMap::UpdateMap::skip, + RegisterMap::ProcessFrames::skip, + RegisterMap::WalkContinuation::include); + if (top.is_heap_frame()) { + assert(chunk != nullptr, ""); + reg_map.set_stack_chunk(chunk); + top = chunk->relativize(top); + top.set_frame_index(0); + } + frame fr = top.sender(®_map); + vframe* vf = vframe::new_vframe(&fr, ®_map, current); + compiledVFrame* cvf = compiledVFrame::cast(vf); + m = cvf->method(); + bci = cvf->scope()->bci(); + at_sync_method = bci == SynchronizationEntryBCI; + assert(!at_sync_method || m->is_synchronized(), "bci is %d but method %s is not synchronized", bci, m->external_name()); + bool is_c1_monitorenter = false, is_c2_monitorenter = false; + COMPILER1_PRESENT(is_c1_monitorenter = cb == Runtime1::blob_for(StubId::c1_monitorenter_id) || + cb == Runtime1::blob_for(StubId::c1_monitorenter_nofpu_id);) + COMPILER2_PRESENT(is_c2_monitorenter = cb == CodeCache::find_blob(OptoRuntime::complete_monitor_locking_Java());) + assert(is_c1_monitorenter || is_c2_monitorenter, "wrong runtime stub frame"); + } + code_name = at_sync_method ? "synchronized method" : "monitorenter"; + } else if (preempt_kind == Continuation::object_wait) { + assert(top.is_interpreted_frame() || top.is_native_frame(), ""); + m = top.is_interpreted_frame() ? top.interpreter_frame_method() : top.cb()->as_nmethod()->method(); + assert(m->is_object_wait0(), ""); + bci = 0; + code_name = ""; + } else { + assert(preempt_kind == Continuation::object_locker, "invalid preempt kind"); + assert(top.is_interpreted_frame(), ""); + m = top.interpreter_frame_method(); + Bytecode current_bytecode = Bytecode(m, top.interpreter_frame_bcp()); + Bytecodes::Code code = current_bytecode.code(); + assert(code == Bytecodes::Code::_new || code == Bytecodes::Code::_invokestatic || + (code == Bytecodes::Code::_getstatic || code == Bytecodes::Code::_putstatic), "invalid bytecode"); + bci = top.interpreter_frame_bci(); + code_name = Bytecodes::name(current_bytecode.code()); + } + assert(bci >= 0 || m->is_synchronized(), "invalid bci:%d at method %s", bci, m->external_name()); + + if (m_ptr != nullptr) { + *m_ptr = m; + *code_name_ptr = code_name; + *bci_ptr = bci; + } +} + +static void log_preempt_after_freeze(const ContinuationWrapper& cont) { + JavaThread* current = cont.thread(); + int64_t tid = current->monitor_owner_id(); + + StackChunkFrameStream sfs(cont.tail()); + frame top_frame = sfs.to_frame(); + bool at_init = current->at_preemptable_init(); + bool at_enter = current->current_pending_monitor() != nullptr; + bool at_wait = current->current_waiting_monitor() != nullptr; + assert((at_enter && !at_wait) || (!at_enter && at_wait), ""); + Continuation::preempt_kind pk = at_init ? Continuation::object_locker : at_enter ? Continuation::monitorenter : Continuation::object_wait; + + Method* m = nullptr; + const char* code_name = nullptr; + int bci = InvalidFrameStateBci; + verify_frame_kind(top_frame, pk, &m, &code_name, &bci, cont.tail()); + assert(m != nullptr && code_name != nullptr && bci != InvalidFrameStateBci, "should be set"); + + ResourceMark rm(current); + if (bci < 0) { + log_trace(continuations, preempt)("Preempted " INT64_FORMAT " while synchronizing on %smethod %s", tid, m->is_native() ? "native " : "", m->external_name()); + } else if (m->is_object_wait0()) { + log_trace(continuations, preempt)("Preempted " INT64_FORMAT " at native method %s", tid, m->external_name()); + } else { + Klass* k = current->preempt_init_klass(); + assert(k != nullptr || !at_init, ""); + log_trace(continuations, preempt)("Preempted " INT64_FORMAT " at %s(bci:%d) in method %s %s%s", tid, code_name, bci, + m->external_name(), at_init ? "trying to initialize klass " : "", at_init ? k->external_name() : ""); + } +} #endif // ASSERT static inline freeze_result freeze_epilog(ContinuationWrapper& cont) { @@ -1708,9 +1854,10 @@ static freeze_result preempt_epilog(ContinuationWrapper& cont, freeze_result res return res; } + // Set up things so that on return to Java we jump to preempt stub. patch_return_pc_with_preempt_stub(old_last_frame); cont.tail()->set_preempted(true); - + DEBUG_ONLY(log_preempt_after_freeze(cont);) return freeze_epilog(cont); } @@ -1906,10 +2053,14 @@ protected: intptr_t* _fastpath; bool _barriers; bool _preempted_case; + bool _process_args_at_top; intptr_t* _top_unextended_sp_before_thaw; int _align_size; DEBUG_ONLY(intptr_t* _top_stack_address); + // Only used for preemption on ObjectLocker + ObjectMonitor* _init_lock; + StackChunkFrameStream _stream; NOT_PRODUCT(int _frames;) @@ -1936,6 +2087,8 @@ protected: intptr_t* handle_preempted_continuation(intptr_t* sp, Continuation::preempt_kind preempt_kind, bool fast_case); inline intptr_t* push_cleanup_continuation(); + inline intptr_t* push_preempt_adapter(); + intptr_t* redo_vmcall(JavaThread* current, frame& top); void throw_interrupted_exception(JavaThread* current, frame& top); void recurse_thaw(const frame& heap_frame, frame& caller, int num_frames, bool top_on_preempt_case); @@ -1952,12 +2105,12 @@ private: inline void patch(frame& f, const frame& caller, bool bottom); void clear_bitmap_bits(address start, address end); - NOINLINE void recurse_thaw_interpreted_frame(const frame& hf, frame& caller, int num_frames); + NOINLINE void recurse_thaw_interpreted_frame(const frame& hf, frame& caller, int num_frames, bool is_top); void recurse_thaw_compiled_frame(const frame& hf, frame& caller, int num_frames, bool stub_caller); void recurse_thaw_stub_frame(const frame& hf, frame& caller, int num_frames); void recurse_thaw_native_frame(const frame& hf, frame& caller, int num_frames); - void push_return_frame(frame& f); + void push_return_frame(const frame& f); inline frame new_entry_frame(); template frame new_stack_frame(const frame& hf, frame& caller, bool bottom); inline void patch_pd(frame& f, const frame& sender); @@ -2052,7 +2205,7 @@ int ThawBase::remove_top_compiled_frame_from_chunk(stackChunkOop chunk, int &arg // If we don't thaw the top compiled frame too, after restoring the saved // registers back in Java, we would hit the return barrier to thaw one more // frame effectively overwriting the restored registers during that call. - f.next(SmallRegisterMap::instance(), true /* stop */); + f.next(SmallRegisterMap::instance_no_args(), true /* stop */); assert(!f.is_done(), ""); f.get_cb(); @@ -2068,7 +2221,7 @@ int ThawBase::remove_top_compiled_frame_from_chunk(stackChunkOop chunk, int &arg } } - f.next(SmallRegisterMap::instance(), true /* stop */); + f.next(SmallRegisterMap::instance_no_args(), true /* stop */); empty = f.is_done(); assert(!empty || argsize == chunk->argsize(), ""); @@ -2200,12 +2353,12 @@ NOINLINE intptr_t* Thaw::thaw_fast(stackChunkOop chunk) { #endif #ifdef ASSERT - set_anchor(_thread, rs.sp()); - log_frames(_thread); if (LoomDeoptAfterThaw) { + frame top(rs.sp()); + AnchorMark am(_thread, top); + log_frames(_thread); do_deopt_after_thaw(_thread); } - clear_anchor(_thread); #endif return rs.sp(); @@ -2228,29 +2381,49 @@ NOINLINE intptr_t* Thaw::thaw_slow(stackChunkOop chunk, Continuation::t Continuation::preempt_kind preempt_kind; bool retry_fast_path = false; + _process_args_at_top = false; _preempted_case = chunk->preempted(); if (_preempted_case) { + ObjectMonitor* mon = nullptr; ObjectWaiter* waiter = java_lang_VirtualThread::objectWaiter(_thread->vthread()); if (waiter != nullptr) { // Mounted again after preemption. Resume the pending monitor operation, // which will be either a monitorenter or Object.wait() call. - ObjectMonitor* mon = waiter->monitor(); - preempt_kind = waiter->is_wait() ? Continuation::freeze_on_wait : Continuation::freeze_on_monitorenter; + mon = waiter->monitor(); + preempt_kind = waiter->is_wait() ? Continuation::object_wait : Continuation::monitorenter; bool mon_acquired = mon->resume_operation(_thread, waiter, _cont); assert(!mon_acquired || mon->has_owner(_thread), "invariant"); if (!mon_acquired) { // Failed to acquire monitor. Return to enterSpecial to unmount again. + log_develop_trace(continuations, preempt)("Failed to acquire monitor, unmounting again"); return push_cleanup_continuation(); } chunk = _cont.tail(); // reload oop in case of safepoint in resume_operation (if posting JVMTI events). + JVMTI_ONLY(assert(_thread->contended_entered_monitor() == nullptr || _thread->contended_entered_monitor() == mon, "")); } else { - // Preemption cancelled in moniterenter case. We actually acquired - // the monitor after freezing all frames so nothing to do. - preempt_kind = Continuation::freeze_on_monitorenter; + // Preemption cancelled on moniterenter or ObjectLocker case. We + // actually acquired the monitor after freezing all frames so no + // need to call resume_operation. If this is the ObjectLocker case + // we released the monitor already at ~ObjectLocker, so _init_lock + // will be set to nullptr below since there is no monitor to release. + preempt_kind = Continuation::monitorenter; } + // Call this first to avoid racing with GC threads later when modifying the chunk flags. relativize_chunk_concurrently(chunk); + + if (chunk->at_klass_init()) { + preempt_kind = Continuation::object_locker; + chunk->set_at_klass_init(false); + _process_args_at_top = chunk->has_args_at_top(); + if (_process_args_at_top) { + // Only needed for the top frame which will be thawed. + chunk->set_has_args_at_top(false); + } + assert(waiter == nullptr || mon != nullptr, "should have a monitor"); + _init_lock = mon; // remember monitor since we will need it on handle_preempted_continuation() + } chunk->set_preempted(false); retry_fast_path = true; } else { @@ -2334,7 +2507,7 @@ void ThawBase::recurse_thaw(const frame& heap_frame, frame& caller, int num_fram } else if (!heap_frame.is_interpreted_frame()) { recurse_thaw_compiled_frame(heap_frame, caller, num_frames, false); } else { - recurse_thaw_interpreted_frame(heap_frame, caller, num_frames); + recurse_thaw_interpreted_frame(heap_frame, caller, num_frames, top_on_preempt_case); } } @@ -2346,7 +2519,7 @@ bool ThawBase::recurse_thaw_java_frame(frame& caller, int num_frames) { int argsize = _stream.stack_argsize(); - _stream.next(SmallRegisterMap::instance()); + _stream.next(SmallRegisterMap::instance_no_args()); assert(_stream.to_frame().is_empty() == _stream.is_done(), ""); // we never leave a compiled caller of an interpreted frame as the top frame in the chunk @@ -2451,9 +2624,10 @@ void ThawBase::clear_bitmap_bits(address start, address end) { } intptr_t* ThawBase::handle_preempted_continuation(intptr_t* sp, Continuation::preempt_kind preempt_kind, bool fast_case) { - assert(preempt_kind == Continuation::freeze_on_wait || preempt_kind == Continuation::freeze_on_monitorenter, ""); frame top(sp); assert(top.pc() == *(address*)(sp - frame::sender_sp_ret_address_offset()), ""); + DEBUG_ONLY(verify_frame_kind(top, preempt_kind);) + NOT_PRODUCT(int64_t tid = _thread->monitor_owner_id();) #if INCLUDE_JVMTI // Finish the VTMS transition. @@ -2461,7 +2635,7 @@ intptr_t* ThawBase::handle_preempted_continuation(intptr_t* sp, Continuation::pr bool is_vthread = Continuation::continuation_scope(_cont.continuation()) == java_lang_VirtualThread::vthread_scope(); if (is_vthread) { if (JvmtiVTMSTransitionDisabler::VTMS_notify_jvmti_events()) { - jvmti_mount_end(_thread, _cont, top); + jvmti_mount_end(_thread, _cont, top, preempt_kind); } else { _thread->set_is_in_VTMS_transition(false); java_lang_Thread::set_is_in_VTMS_transition(_thread->vthread(), false); @@ -2478,36 +2652,103 @@ intptr_t* ThawBase::handle_preempted_continuation(intptr_t* sp, Continuation::pr patch_pd(top, sp + fsize); } - if (preempt_kind == Continuation::freeze_on_wait) { + if (preempt_kind == Continuation::object_wait) { // Check now if we need to throw IE exception. - if (_thread->pending_interrupted_exception()) { + bool throw_ie = _thread->pending_interrupted_exception(); + if (throw_ie) { throw_interrupted_exception(_thread, top); _thread->set_pending_interrupted_exception(false); } - } else if (top.is_runtime_frame()) { - // The continuation might now run on a different platform thread than the previous time so - // we need to adjust the current thread saved in the stub frame before restoring registers. - JavaThread** thread_addr = frame::saved_thread_address(top); - if (thread_addr != nullptr) *thread_addr = _thread; + log_develop_trace(continuations, preempt)("Resuming " INT64_FORMAT" after preemption on Object.wait%s", tid, throw_ie ? "(throwing IE)" : ""); + } else if (preempt_kind == Continuation::monitorenter) { + if (top.is_runtime_frame()) { + // The continuation might now run on a different platform thread than the previous time so + // we need to adjust the current thread saved in the stub frame before restoring registers. + JavaThread** thread_addr = frame::saved_thread_address(top); + if (thread_addr != nullptr) *thread_addr = _thread; + } + log_develop_trace(continuations, preempt)("Resuming " INT64_FORMAT " after preemption on monitorenter", tid); + } else { + // We need to redo the original call into the VM. First though, we need + // to exit the monitor we just acquired (except on preemption cancelled + // case where it was already released). + assert(preempt_kind == Continuation::object_locker, ""); + if (_init_lock != nullptr) _init_lock->exit(_thread); + sp = redo_vmcall(_thread, top); + } + return sp; +} + +intptr_t* ThawBase::redo_vmcall(JavaThread* current, frame& top) { + assert(!current->preempting(), ""); + NOT_PRODUCT(int64_t tid = current->monitor_owner_id();) + intptr_t* sp = top.sp(); + + { + HandleMarkCleaner hmc(current); // Cleanup all handles (including so._conth) before returning to Java. + ContinuationWrapper::SafepointOp so(current, _cont); + AnchorMark am(current, top); // Set the anchor so that the stack is walkable. + + Method* m = top.interpreter_frame_method(); + Bytecode current_bytecode = Bytecode(m, top.interpreter_frame_bcp()); + Bytecodes::Code code = current_bytecode.code(); + log_develop_trace(continuations, preempt)("Redoing InterpreterRuntime::%s for " INT64_FORMAT, code == Bytecodes::Code::_new ? "_new" : "resolve_from_cache", tid); + + // These InterpreterRuntime entry points use JRT_ENTRY which uses a HandleMarkCleaner. + // Create a HandeMark to avoid destroying so._conth. + HandleMark hm(current); + DEBUG_ONLY(JavaThread::AtRedoVMCall apvmc(current);) + if (code == Bytecodes::Code::_new) { + InterpreterRuntime::_new(current, m->constants(), current_bytecode.get_index_u2(code)); + } else { + InterpreterRuntime::resolve_from_cache(current, code); + } + } + + if (current->preempting()) { + // Preempted again so we just arrange to return to preempt stub to unmount. + sp = push_preempt_adapter(); + current->set_preempt_alternate_return(nullptr); + bool cancelled = current->preemption_cancelled(); + if (cancelled) { + // Since preemption was cancelled, the thread will call thaw again from the preempt + // stub. These retries could happen several times due to contention on the init_lock, + // so just let the vthread umount to give a chance for other vthreads to run. + current->set_preemption_cancelled(false); + oop vthread = current->vthread(); + assert(java_lang_VirtualThread::state(vthread) == java_lang_VirtualThread::RUNNING, "wrong state for vthread"); + java_lang_VirtualThread::set_state(vthread, java_lang_VirtualThread::YIELDING); +#if INCLUDE_JVMTI + if (current->contended_entered_monitor() != nullptr) { + current->set_contended_entered_monitor(nullptr); + } +#endif + } + log_develop_trace(continuations, preempt)("Preempted " INT64_FORMAT " again%s", tid, cancelled ? "(preemption cancelled, setting state to YIELDING)" : ""); + } else { + log_develop_trace(continuations, preempt)("Call succesful, resuming " INT64_FORMAT, tid); } return sp; } void ThawBase::throw_interrupted_exception(JavaThread* current, frame& top) { + HandleMarkCleaner hm(current); // Cleanup all handles (including so._conth) before returning to Java. ContinuationWrapper::SafepointOp so(current, _cont); - // Since we might safepoint set the anchor so that the stack can be walked. - set_anchor(current, top.sp()); + AnchorMark am(current, top); // Set the anchor so that the stack is walkable. JRT_BLOCK THROW(vmSymbols::java_lang_InterruptedException()); JRT_BLOCK_END - clear_anchor(current); } -NOINLINE void ThawBase::recurse_thaw_interpreted_frame(const frame& hf, frame& caller, int num_frames) { +NOINLINE void ThawBase::recurse_thaw_interpreted_frame(const frame& hf, frame& caller, int num_frames, bool is_top) { assert(hf.is_interpreted_frame(), ""); if (UNLIKELY(seen_by_gc())) { - _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance()); + if (is_top && _process_args_at_top) { + _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance_with_args()); + } else { + _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance_no_args()); + } } const bool is_bottom_frame = recurse_thaw_java_frame(caller, num_frames); @@ -2552,7 +2793,7 @@ NOINLINE void ThawBase::recurse_thaw_interpreted_frame(const frame& hf, frame& c if (!is_bottom_frame) { // can only fix caller once this frame is thawed (due to callee saved regs) - _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance()); + _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance_no_args()); } else if (_cont.tail()->has_bitmap() && locals > 0) { assert(hf.is_heap_frame(), "should be"); address start = (address)(heap_frame_bottom - locals); @@ -2569,7 +2810,7 @@ void ThawBase::recurse_thaw_compiled_frame(const frame& hf, frame& caller, int n assert(_preempted_case || !stub_caller, "stub caller not at preemption"); if (!stub_caller && UNLIKELY(seen_by_gc())) { // recurse_thaw_stub_frame already invoked our barriers with a full regmap - _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance()); + _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance_no_args()); } const bool is_bottom_frame = recurse_thaw_java_frame(caller, num_frames); @@ -2628,7 +2869,7 @@ void ThawBase::recurse_thaw_compiled_frame(const frame& hf, frame& caller, int n if (!is_bottom_frame) { // can only fix caller once this frame is thawed (due to callee saved regs); this happens on the stack - _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance()); + _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance_no_args()); } else if (_cont.tail()->has_bitmap() && added_argsize > 0) { address start = (address)(heap_frame_top + ContinuationHelper::CompiledFrame::size(hf) + frame::metadata_words_at_top); int stack_args_slots = f.cb()->as_nmethod()->num_stack_arg_slots(false /* rounded */); @@ -2654,7 +2895,7 @@ void ThawBase::recurse_thaw_stub_frame(const frame& hf, frame& caller, int num_f assert(!_stream.is_done(), ""); _cont.tail()->do_barriers(_stream, &map); } else { - _stream.next(SmallRegisterMap::instance()); + _stream.next(SmallRegisterMap::instance_no_args()); assert(!_stream.is_done(), ""); } @@ -2694,7 +2935,7 @@ void ThawBase::recurse_thaw_native_frame(const frame& hf, frame& caller, int num assert(_preempted_case && hf.cb()->as_nmethod()->method()->is_object_wait0(), ""); if (UNLIKELY(seen_by_gc())) { // recurse_thaw_stub_frame already invoked our barriers with a full regmap - _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance()); + _cont.tail()->do_barriers(_stream, SmallRegisterMap::instance_no_args()); } const bool is_bottom_frame = recurse_thaw_java_frame(caller, num_frames); @@ -2732,7 +2973,7 @@ void ThawBase::recurse_thaw_native_frame(const frame& hf, frame& caller, int num assert(!f.cb()->as_nmethod()->is_marked_for_deoptimization(), ""); // can only fix caller once this frame is thawed (due to callee saved regs); this happens on the stack - _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance()); + _cont.tail()->fix_thawed_frame(caller, SmallRegisterMap::instance_no_args()); DEBUG_ONLY(after_thaw_java_frame(f, false /* bottom */);) caller = f; @@ -2759,7 +3000,12 @@ void ThawBase::finish_thaw(frame& f) { f.set_sp(align_down(f.sp(), frame::frame_alignment)); } push_return_frame(f); - chunk->fix_thawed_frame(f, SmallRegisterMap::instance()); // can only fix caller after push_return_frame (due to callee saved regs) + // can only fix caller after push_return_frame (due to callee saved regs) + if (_process_args_at_top) { + chunk->fix_thawed_frame(f, SmallRegisterMap::instance_with_args()); + } else { + chunk->fix_thawed_frame(f, SmallRegisterMap::instance_no_args()); + } assert(_cont.is_empty() == _cont.last_frame().is_empty(), ""); @@ -2773,7 +3019,7 @@ void ThawBase::finish_thaw(frame& f) { } } -void ThawBase::push_return_frame(frame& f) { // see generate_cont_thaw +void ThawBase::push_return_frame(const frame& f) { // see generate_cont_thaw assert(!f.is_compiled_frame() || f.is_deoptimized_frame() == f.cb()->as_nmethod()->is_deopt_pc(f.raw_pc()), ""); assert(!f.is_compiled_frame() || f.is_deoptimized_frame() == (f.pc() != f.raw_pc()), ""); @@ -2821,11 +3067,10 @@ static inline intptr_t* thaw_internal(JavaThread* thread, const Continuation::th clear_anchor(thread); #endif - DEBUG_ONLY(bool preempted = cont.tail()->preempted();) Thaw thw(thread, cont); intptr_t* const sp = thw.thaw(kind); assert(is_aligned(sp, frame::frame_alignment), ""); - DEBUG_ONLY(log_frames_after_thaw(thread, cont, sp, preempted);) + DEBUG_ONLY(log_frames_after_thaw(thread, cont, sp);) CONT_JFR_ONLY(thw.jfr_info().post_jfr_event(&event, cont.continuation(), thread);) @@ -2967,14 +3212,16 @@ static void log_frames(JavaThread* thread) { ls.print_cr("======= end frames ========="); } -static void log_frames_after_thaw(JavaThread* thread, ContinuationWrapper& cont, intptr_t* sp, bool preempted) { +static void log_frames_after_thaw(JavaThread* thread, ContinuationWrapper& cont, intptr_t* sp) { intptr_t* sp0 = sp; address pc0 = *(address*)(sp - frame::sender_sp_ret_address_offset()); - if (preempted && sp0 == cont.entrySP()) { + bool preempted = false; + stackChunkOop tail = cont.tail(); + if (tail != nullptr && tail->preempted()) { // Still preempted (monitor not acquired) so no frames were thawed. - assert(cont.tail()->preempted(), ""); set_anchor(thread, cont.entrySP(), cont.entryPC()); + preempted = true; } else { set_anchor(thread, sp0); } @@ -2983,7 +3230,7 @@ static void log_frames_after_thaw(JavaThread* thread, ContinuationWrapper& cont, if (LoomVerifyAfterThaw) { assert(do_verify_after_thaw(thread, cont.tail(), tty), ""); } - assert(ContinuationEntry::assert_entry_frame_laid_out(thread), ""); + assert(preempted || ContinuationEntry::assert_entry_frame_laid_out(thread), ""); clear_anchor(thread); LogTarget(Trace, continuations) lt; diff --git a/src/hotspot/share/runtime/continuationJavaClasses.cpp b/src/hotspot/share/runtime/continuationJavaClasses.cpp index a5b7ea4ad93..6e4e52e0107 100644 --- a/src/hotspot/share/runtime/continuationJavaClasses.cpp +++ b/src/hotspot/share/runtime/continuationJavaClasses.cpp @@ -87,6 +87,8 @@ int jdk_internal_vm_StackChunk::_bottom_offset; int jdk_internal_vm_StackChunk::_flags_offset; int jdk_internal_vm_StackChunk::_maxThawingSize_offset; int jdk_internal_vm_StackChunk::_lockStackSize_offset; +int jdk_internal_vm_StackChunk::_atKlassInit_offset; +int jdk_internal_vm_StackChunk::_hasArgsAtTop_offset; int jdk_internal_vm_StackChunk::_cont_offset; #define STACKCHUNK_FIELDS_DO(macro) \ diff --git a/src/hotspot/share/runtime/continuationJavaClasses.hpp b/src/hotspot/share/runtime/continuationJavaClasses.hpp index f9cd53ff9f0..91224b94e1e 100644 --- a/src/hotspot/share/runtime/continuationJavaClasses.hpp +++ b/src/hotspot/share/runtime/continuationJavaClasses.hpp @@ -76,6 +76,8 @@ class jdk_internal_vm_Continuation: AllStatic { macro(jdk_internal_vm_StackChunk, pc, intptr_signature, false) \ macro(jdk_internal_vm_StackChunk, maxThawingSize, int_signature, false) \ macro(jdk_internal_vm_StackChunk, lockStackSize, byte_signature, false) \ + macro(jdk_internal_vm_StackChunk, atKlassInit, bool_signature, false) \ + macro(jdk_internal_vm_StackChunk, hasArgsAtTop, bool_signature, false) \ class jdk_internal_vm_StackChunk: AllStatic { friend class JavaClasses; @@ -88,6 +90,8 @@ class jdk_internal_vm_StackChunk: AllStatic { static int _flags_offset; static int _maxThawingSize_offset; static int _lockStackSize_offset; + static int _atKlassInit_offset; + static int _hasArgsAtTop_offset; static int _cont_offset; @@ -129,6 +133,12 @@ class jdk_internal_vm_StackChunk: AllStatic { static inline uint8_t lockStackSize(oop chunk); static inline void set_lockStackSize(oop chunk, uint8_t value); + static inline bool atKlassInit(oop chunk); + static inline void set_atKlassInit(oop chunk, bool value); + + static inline bool hasArgsAtTop(oop chunk); + static inline void set_hasArgsAtTop(oop chunk, bool value); + // cont oop's processing is essential for the chunk's GC protocol static inline oop cont(oop chunk); template diff --git a/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp b/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp index f464648cdc3..c6d80652180 100644 --- a/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp +++ b/src/hotspot/share/runtime/continuationJavaClasses.inline.hpp @@ -194,4 +194,20 @@ inline void jdk_internal_vm_StackChunk::set_lockStackSize(oop chunk, uint8_t val AtomicAccess::store(chunk->field_addr(_lockStackSize_offset), value); } +inline bool jdk_internal_vm_StackChunk::atKlassInit(oop chunk) { + return chunk->bool_field(_atKlassInit_offset); +} + +inline void jdk_internal_vm_StackChunk::set_atKlassInit(oop chunk, bool value) { + chunk->bool_field_put(_atKlassInit_offset, (jboolean)value); +} + +inline bool jdk_internal_vm_StackChunk::hasArgsAtTop(oop chunk) { + return chunk->bool_field(_hasArgsAtTop_offset); +} + +inline void jdk_internal_vm_StackChunk::set_hasArgsAtTop(oop chunk, bool value) { + chunk->bool_field_put(_hasArgsAtTop_offset, (jboolean)value); +} + #endif // SHARE_RUNTIME_CONTINUATIONJAVACLASSES_INLINE_HPP diff --git a/src/hotspot/share/runtime/frame.cpp b/src/hotspot/share/runtime/frame.cpp index e578e614440..b5cd4acc75d 100644 --- a/src/hotspot/share/runtime/frame.cpp +++ b/src/hotspot/share/runtime/frame.cpp @@ -891,7 +891,8 @@ oop frame::interpreter_callee_receiver(Symbol* signature) { return *interpreter_callee_receiver_addr(signature); } -void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) const { +template +void frame::oops_interpreted_do(OopClosure* f, const RegisterMapT* map, bool query_oop_map_cache) const { assert(is_interpreted_frame(), "Not an interpreted frame"); Thread *thread = Thread::current(); methodHandle m (thread, interpreter_frame_method()); @@ -928,33 +929,19 @@ void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool quer int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals(); - Symbol* signature = nullptr; - bool has_receiver = false; - // Process a callee's arguments if we are at a call site // (i.e., if we are at an invoke bytecode) // This is used sometimes for calling into the VM, not for another // interpreted or compiled frame. - if (!m->is_native()) { + if (!m->is_native() && map != nullptr && map->include_argument_oops()) { Bytecode_invoke call = Bytecode_invoke_check(m, bci); - if (map != nullptr && call.is_valid()) { - signature = call.signature(); - has_receiver = call.has_receiver(); - if (map->include_argument_oops() && - interpreter_frame_expression_stack_size() > 0) { - ResourceMark rm(thread); // is this right ??? - // we are at a call site & the expression stack is not empty - // => process callee's arguments - // - // Note: The expression stack can be empty if an exception - // occurred during method resolution/execution. In all - // cases we empty the expression stack completely be- - // fore handling the exception (the exception handling - // code in the interpreter calls a blocking runtime - // routine which can cause this code to be executed). - // (was bug gri 7/27/98) - oops_interpreted_arguments_do(signature, has_receiver, f); - } + if (call.is_valid() && interpreter_frame_expression_stack_size() > 0) { + ResourceMark rm(thread); // is this right ??? + Symbol* signature = call.signature(); + bool has_receiver = call.has_receiver(); + // We are at a call site & the expression stack is not empty + // so we might have callee arguments we need to process. + oops_interpreted_arguments_do(signature, has_receiver, f); } } @@ -970,6 +957,9 @@ void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool quer mask.iterate_oop(&blk); } +template void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) const; +template void frame::oops_interpreted_do(OopClosure* f, const SmallRegisterMapNoArgs* map, bool query_oop_map_cache) const; +template void frame::oops_interpreted_do(OopClosure* f, const SmallRegisterMapWithArgs* map, bool query_oop_map_cache) const; void frame::oops_interpreted_arguments_do(Symbol* signature, bool has_receiver, OopClosure* f) const { InterpretedArgumentOopFinder finder(signature, has_receiver, this, f); diff --git a/src/hotspot/share/runtime/frame.hpp b/src/hotspot/share/runtime/frame.hpp index fbe7310f3ae..f54553086f6 100644 --- a/src/hotspot/share/runtime/frame.hpp +++ b/src/hotspot/share/runtime/frame.hpp @@ -456,7 +456,8 @@ class frame { // Oops-do's void oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, const RegisterMap* reg_map, OopClosure* f) const; - void oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache = true) const; + template + void oops_interpreted_do(OopClosure* f, const RegisterMapT* map, bool query_oop_map_cache = true) const; private: void oops_interpreted_arguments_do(Symbol* signature, bool has_receiver, OopClosure* f) const; diff --git a/src/hotspot/share/runtime/javaCalls.cpp b/src/hotspot/share/runtime/javaCalls.cpp index ec3132220d9..3ed678284e4 100644 --- a/src/hotspot/share/runtime/javaCalls.cpp +++ b/src/hotspot/share/runtime/javaCalls.cpp @@ -58,6 +58,7 @@ JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle recei guarantee(thread->is_Java_thread(), "crucial check - the VM thread cannot and must not escape to Java code"); assert(!thread->owns_locks(), "must release all locks when leaving VM"); guarantee(thread->can_call_java(), "cannot make java calls from the native compiler"); + assert(!thread->preempting(), "Unexpected Java upcall whilst processing preemption"); _result = result; // Allocate handle block for Java code. This must be done before we change thread_state to _thread_in_Java_or_stub, @@ -242,7 +243,7 @@ void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, S void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { CallInfo callinfo; LinkInfo link_info(klass, name, signature); - LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK); + LinkResolver::resolve_static_call(callinfo, link_info, ClassInitMode::init, CHECK); methodHandle method(THREAD, callinfo.selected_method()); assert(method.not_null(), "should have thrown exception"); diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index b9b4237e7ee..838f8e4c581 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -494,6 +494,10 @@ JavaThread::JavaThread(MemTag mem_tag) : _preempt_alternate_return(nullptr), _preemption_cancelled(false), _pending_interrupted_exception(false), + _at_preemptable_init(false), + DEBUG_ONLY(_preempt_init_klass(nullptr) COMMA) + DEBUG_ONLY(_interp_at_preemptable_vmcall_cnt(0) COMMA) + DEBUG_ONLY(_interp_redoing_vm_call(false) COMMA) _handshake(this), _suspend_resume_manager(this, &_handshake._lock), diff --git a/src/hotspot/share/runtime/javaThread.hpp b/src/hotspot/share/runtime/javaThread.hpp index c0b25384fac..b0cd6fb3e4f 100644 --- a/src/hotspot/share/runtime/javaThread.hpp +++ b/src/hotspot/share/runtime/javaThread.hpp @@ -485,6 +485,9 @@ class JavaThread: public Thread { // For Object.wait() we set this field to know if we need to // throw IE at the end of thawing before returning to Java. bool _pending_interrupted_exception; + // We allow preemption on some klass initialization calls. + // We use this boolean to mark such calls. + bool _at_preemptable_init; public: bool preemption_cancelled() { return _preemption_cancelled; } @@ -493,11 +496,46 @@ class JavaThread: public Thread { bool pending_interrupted_exception() { return _pending_interrupted_exception; } void set_pending_interrupted_exception(bool b) { _pending_interrupted_exception = b; } - bool preempting() { return _preempt_alternate_return != nullptr; } + bool preempting() { return _preempt_alternate_return != nullptr; } void set_preempt_alternate_return(address val) { _preempt_alternate_return = val; } -private: + bool at_preemptable_init() { return _at_preemptable_init; } + void set_at_preemptable_init(bool b) { _at_preemptable_init = b; } +#ifdef ASSERT + // Used for extra logging with -Xlog:continuation+preempt + InstanceKlass* _preempt_init_klass; + + InstanceKlass* preempt_init_klass() { return _preempt_init_klass; } + void set_preempt_init_klass(InstanceKlass* ik) { _preempt_init_klass = ik; } + + int _interp_at_preemptable_vmcall_cnt; + int interp_at_preemptable_vmcall_cnt() { return _interp_at_preemptable_vmcall_cnt; } + + bool _interp_redoing_vm_call; + bool interp_redoing_vm_call() const { return _interp_redoing_vm_call; }; + + class AtRedoVMCall : public StackObj { + JavaThread* _thread; + public: + AtRedoVMCall(JavaThread* t) : _thread(t) { + assert(!_thread->_interp_redoing_vm_call, ""); + _thread->_interp_redoing_vm_call = true; + _thread->_interp_at_preemptable_vmcall_cnt++; + assert(_thread->_interp_at_preemptable_vmcall_cnt > 0, "Unexpected count: %d", + _thread->_interp_at_preemptable_vmcall_cnt); + } + ~AtRedoVMCall() { + assert(_thread->_interp_redoing_vm_call, ""); + _thread->_interp_redoing_vm_call = false; + _thread->_interp_at_preemptable_vmcall_cnt--; + assert(_thread->_interp_at_preemptable_vmcall_cnt >= 0, "Unexpected count: %d", + _thread->_interp_at_preemptable_vmcall_cnt); + } + }; +#endif // ASSERT + +private: friend class VMThread; friend class ThreadWaitTransition; friend class VM_Exit; @@ -885,6 +923,7 @@ public: static ByteSize cont_fastpath_offset() { return byte_offset_of(JavaThread, _cont_fastpath); } static ByteSize preemption_cancelled_offset() { return byte_offset_of(JavaThread, _preemption_cancelled); } static ByteSize preempt_alternate_return_offset() { return byte_offset_of(JavaThread, _preempt_alternate_return); } + DEBUG_ONLY(static ByteSize interp_at_preemptable_vmcall_cnt_offset() { return byte_offset_of(JavaThread, _interp_at_preemptable_vmcall_cnt); }) static ByteSize unlocked_inflated_monitor_offset() { return byte_offset_of(JavaThread, _unlocked_inflated_monitor); } #if INCLUDE_JVMTI @@ -1330,8 +1369,8 @@ class NoPreemptMark { ContinuationEntry* _ce; bool _unpin; public: - NoPreemptMark(JavaThread* thread) : _ce(thread->last_continuation()), _unpin(false) { - if (_ce != nullptr) _unpin = _ce->pin(); + NoPreemptMark(JavaThread* thread, bool ignore_mark = false) : _ce(thread->last_continuation()), _unpin(false) { + if (_ce != nullptr && !ignore_mark) _unpin = _ce->pin(); } ~NoPreemptMark() { if (_unpin) _ce->unpin(); } }; diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index f6d569b1b7a..6a99568ba44 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -304,6 +304,7 @@ ObjectMonitor::ObjectMonitor(oop object) : ObjectMonitor::~ObjectMonitor() { _object.release(_oop_storage); + _object_strong.release(JavaThread::thread_oop_storage()); } oop ObjectMonitor::object() const { @@ -311,6 +312,20 @@ oop ObjectMonitor::object() const { return _object.resolve(); } +// Keep object protected during ObjectLocker preemption. +void ObjectMonitor::set_object_strong() { + check_object_context(); + if (_object_strong.is_empty()) { + if (AtomicAccess::cmpxchg(&_object_strong_lock, 0, 1) == 0) { + if (_object_strong.is_empty()) { + assert(_object.resolve() != nullptr, ""); + _object_strong = OopHandle(JavaThread::thread_oop_storage(), _object.resolve()); + } + AtomicAccess::release_store(&_object_strong_lock, 0); + } + } +} + void ObjectMonitor::ExitOnSuspend::operator()(JavaThread* current) { if (current->is_suspended()) { _om->_recursions = 0; @@ -1813,7 +1828,7 @@ void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { current->set_current_waiting_monitor(this); result = Continuation::try_preempt(current, ce->cont_oop(current)); if (result == freeze_ok) { - vthread_wait(current, millis); + vthread_wait(current, millis, interruptible); current->set_current_waiting_monitor(nullptr); return; } @@ -2167,12 +2182,14 @@ void ObjectMonitor::quick_notifyAll(JavaThread* current) { } } -void ObjectMonitor::vthread_wait(JavaThread* current, jlong millis) { +void ObjectMonitor::vthread_wait(JavaThread* current, jlong millis, bool interruptible) { oop vthread = current->vthread(); ObjectWaiter* node = new ObjectWaiter(vthread, this); node->_is_wait = true; + node->_interruptible = interruptible; node->TState = ObjectWaiter::TS_WAIT; java_lang_VirtualThread::set_notified(vthread, false); // Reset notified flag + java_lang_VirtualThread::set_interruptible_wait(vthread, interruptible); // Enter the waiting queue, which is a circular doubly linked list in this case // but it could be a priority queue or any data structure. @@ -2217,11 +2234,12 @@ bool ObjectMonitor::vthread_wait_reenter(JavaThread* current, ObjectWaiter* node ObjectWaiter::TStates state = node->TState; bool was_notified = state == ObjectWaiter::TS_ENTER; assert(was_notified || state == ObjectWaiter::TS_RUN, ""); - node->_interrupted = !was_notified && current->is_interrupted(false); + node->_interrupted = node->_interruptible && !was_notified && current->is_interrupted(false); - // Post JFR and JVMTI events. + // Post JFR and JVMTI events. If non-interruptible we are in + // ObjectLocker case so we don't post anything. EventJavaMonitorWait wait_event; - if (wait_event.should_commit() || JvmtiExport::should_post_monitor_waited()) { + if (node->_interruptible && (wait_event.should_commit() || JvmtiExport::should_post_monitor_waited())) { vthread_monitor_waited_event(current, node, cont, &wait_event, !was_notified && !node->_interrupted); } diff --git a/src/hotspot/share/runtime/objectMonitor.hpp b/src/hotspot/share/runtime/objectMonitor.hpp index 77919d99955..2da41786309 100644 --- a/src/hotspot/share/runtime/objectMonitor.hpp +++ b/src/hotspot/share/runtime/objectMonitor.hpp @@ -55,6 +55,7 @@ class ObjectWaiter : public CHeapObj { bool _is_wait; bool _at_reenter; bool _interrupted; + bool _interruptible; bool _do_timed_park; bool _active; // Contention monitoring is enabled public: @@ -200,10 +201,12 @@ class ObjectMonitor : public CHeapObj { // ObjectMonitor::deflate_monitor(). int64_t _unmounted_vthreads; // Number of nodes in the _entry_list associated with unmounted vthreads. // It might be temporarily more than the actual number but never less. + OopHandle _object_strong; // Used to protect object during preemption on class initialization ObjectWaiter* volatile _wait_set; // LL of threads waiting on the monitor - wait() volatile int _waiters; // number of waiting threads volatile int _wait_set_lock; // protects wait set queue - simple spinlock + volatile int _object_strong_lock; // protects setting of _object_strong public: @@ -343,6 +346,7 @@ class ObjectMonitor : public CHeapObj { oop object_peek() const; bool object_is_dead() const; bool object_refers_to(oop obj) const; + void set_object_strong(); // Returns true if the specified thread owns the ObjectMonitor. Otherwise // returns false and throws IllegalMonitorStateException (IMSE). @@ -405,7 +409,7 @@ class ObjectMonitor : public CHeapObj { ObjectWaiter* entry_list_tail(JavaThread* current); bool vthread_monitor_enter(JavaThread* current, ObjectWaiter* node = nullptr); - void vthread_wait(JavaThread* current, jlong millis); + void vthread_wait(JavaThread* current, jlong millis, bool interruptible); bool vthread_wait_reenter(JavaThread* current, ObjectWaiter* node, ContinuationWrapper& cont); void vthread_epilog(JavaThread* current, ObjectWaiter* node); diff --git a/src/hotspot/share/runtime/smallRegisterMap.inline.hpp b/src/hotspot/share/runtime/smallRegisterMap.inline.hpp index e0de6acbd6d..09febdaf450 100644 --- a/src/hotspot/share/runtime/smallRegisterMap.inline.hpp +++ b/src/hotspot/share/runtime/smallRegisterMap.inline.hpp @@ -29,4 +29,19 @@ #include CPU_HEADER_INLINE(smallRegisterMap) +typedef SmallRegisterMapType SmallRegisterMapNoArgs; +typedef SmallRegisterMapType SmallRegisterMapWithArgs; + +class SmallRegisterMap : AllStatic { +public: + static const SmallRegisterMapNoArgs* instance_no_args() { + static constexpr SmallRegisterMapNoArgs the_instance{}; + return &the_instance; + } + static const SmallRegisterMapWithArgs* instance_with_args() { + static constexpr SmallRegisterMapWithArgs the_instance_with_args{}; + return &the_instance_with_args; + } +}; + #endif // SHARE_RUNTIME_SMALLREGISTERMAP_HPP diff --git a/src/hotspot/share/runtime/stackChunkFrameStream.hpp b/src/hotspot/share/runtime/stackChunkFrameStream.hpp index 207203dbb35..cb46254d125 100644 --- a/src/hotspot/share/runtime/stackChunkFrameStream.hpp +++ b/src/hotspot/share/runtime/stackChunkFrameStream.hpp @@ -26,6 +26,7 @@ #define SHARE_RUNTIME_STACKCHUNKFRAMESTREAM_HPP #include "memory/allocation.hpp" +#include "memory/iterator.hpp" #include "oops/oopsHierarchy.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" @@ -79,7 +80,8 @@ public: const ImmutableOopMap* oopmap() const { if (_oopmap == nullptr) get_oopmap(); return _oopmap; } inline int frame_size() const; inline int stack_argsize() const; - inline int num_oops() const; + template + inline int num_oops(RegisterMapT* map) const; inline void initialize_register_map(RegisterMap* map); template inline void next(RegisterMapT* map, bool stop = false); @@ -101,7 +103,8 @@ public: inline address get_pc() const; inline int interpreter_frame_size() const; - inline int interpreter_frame_num_oops() const; + template + inline int interpreter_frame_num_oops(RegisterMapT* map) const; inline int interpreter_frame_stack_argsize() const; inline void next_for_interpreter_frame(); inline intptr_t* unextended_sp_for_interpreter_frame() const; @@ -123,4 +126,13 @@ public: inline void iterate_derived_pointers(DerivedOopClosureType* closure, const RegisterMapT* map) const; }; +class InterpreterOopCount : public OopClosure { + int _count; +public: + InterpreterOopCount() : _count(0) {} + void do_oop(oop* p) override { _count++; } + void do_oop(narrowOop* p) override { _count++; } + int count() { return _count; } +}; + #endif // SHARE_RUNTIME_STACKCHUNKFRAMESTREAM_HPP diff --git a/src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp b/src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp index 09c267b408b..97166950752 100644 --- a/src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp +++ b/src/hotspot/share/runtime/stackChunkFrameStream.inline.hpp @@ -195,9 +195,10 @@ inline int StackChunkFrameStream::stack_argsize() const { } template -inline int StackChunkFrameStream::num_oops() const { +template +inline int StackChunkFrameStream::num_oops(RegisterMapT* map) const { if (is_interpreted()) { - return interpreter_frame_num_oops(); + return interpreter_frame_num_oops(map); } else if (is_compiled()) { return oopmap()->num_oops(); } else { @@ -365,7 +366,7 @@ template inline void StackChunkFrameStream::iterate_oops(OopClosureType* closure, const RegisterMapT* map) const { if (is_interpreted()) { frame f = to_frame(); - f.oops_interpreted_do(closure, nullptr, true); + f.oops_interpreted_do(closure, map, true); } else { DEBUG_ONLY(int oops = 0;) for (OopMapStream oms(oopmap()); !oms.is_done(); oms.next()) { diff --git a/src/hotspot/share/runtime/stackValue.cpp b/src/hotspot/share/runtime/stackValue.cpp index 52d2631f3c9..fc810a1fa80 100644 --- a/src/hotspot/share/runtime/stackValue.cpp +++ b/src/hotspot/share/runtime/stackValue.cpp @@ -38,7 +38,7 @@ class RegisterMap; class SmallRegisterMap; template StackValue* StackValue::create_stack_value(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv); -template StackValue* StackValue::create_stack_value(const frame* fr, const SmallRegisterMap* reg_map, ScopeValue* sv); +template StackValue* StackValue::create_stack_value(const frame* fr, const SmallRegisterMapNoArgs* reg_map, ScopeValue* sv); template StackValue* StackValue::create_stack_value(const frame* fr, const RegisterMapT* reg_map, ScopeValue* sv) { @@ -257,7 +257,7 @@ StackValue* StackValue::create_stack_value(ScopeValue* sv, address value_addr, c } template address StackValue::stack_value_address(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv); -template address StackValue::stack_value_address(const frame* fr, const SmallRegisterMap* reg_map, ScopeValue* sv); +template address StackValue::stack_value_address(const frame* fr, const SmallRegisterMapNoArgs* reg_map, ScopeValue* sv); template address StackValue::stack_value_address(const frame* fr, const RegisterMapT* reg_map, ScopeValue* sv) { diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp index e513c57fe06..36e38b4dd35 100644 --- a/src/hotspot/share/runtime/synchronizer.cpp +++ b/src/hotspot/share/runtime/synchronizer.cpp @@ -475,22 +475,45 @@ void ObjectSynchronizer::jni_exit(oop obj, TRAPS) { // ----------------------------------------------------------------------------- // Internal VM locks on java objects // standard constructor, allows locking failures -ObjectLocker::ObjectLocker(Handle obj, JavaThread* thread) : _npm(thread) { - _thread = thread; +ObjectLocker::ObjectLocker(Handle obj, TRAPS) : _thread(THREAD), _obj(obj), + _npm(_thread, _thread->at_preemptable_init() /* ignore_mark */), _skip_exit(false) { + assert(!_thread->preempting(), ""); + _thread->check_for_valid_safepoint_state(); - _obj = obj; if (_obj() != nullptr) { ObjectSynchronizer::enter(_obj, &_lock, _thread); + + if (_thread->preempting()) { + // If preemption was cancelled we acquired the monitor after freezing + // the frames. Redoing the vm call later in thaw will require us to + // release it since the call should look like the original one. We + // do it in ~ObjectLocker to reduce the window of time we hold the + // monitor since we can't do anything useful with it now, and would + // otherwise just force other vthreads to preempt in case they try + // to acquire this monitor. + _skip_exit = !_thread->preemption_cancelled(); + ObjectSynchronizer::read_monitor(_thread, _obj())->set_object_strong(); + _thread->set_pending_preempted_exception(); + + } } } ObjectLocker::~ObjectLocker() { - if (_obj() != nullptr) { + if (_obj() != nullptr && !_skip_exit) { ObjectSynchronizer::exit(_obj(), &_lock, _thread); } } +void ObjectLocker::wait_uninterruptibly(TRAPS) { + ObjectSynchronizer::waitUninterruptibly(_obj, 0, _thread); + if (_thread->preempting()) { + _skip_exit = true; + ObjectSynchronizer::read_monitor(_thread, _obj())->set_object_strong(); + _thread->set_pending_preempted_exception(); + } +} // ----------------------------------------------------------------------------- // Wait/Notify/NotifyAll @@ -517,9 +540,7 @@ int ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) { } void ObjectSynchronizer::waitUninterruptibly(Handle obj, jlong millis, TRAPS) { - if (millis < 0) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative"); - } + assert(millis >= 0, "timeout value is negative"); ObjectMonitor* monitor; monitor = LightweightSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_wait, CHECK); diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp index 419cf2bf5bb..2337569176e 100644 --- a/src/hotspot/share/runtime/synchronizer.hpp +++ b/src/hotspot/share/runtime/synchronizer.hpp @@ -126,6 +126,7 @@ public: static const char* inflate_cause_name(const InflateCause cause); inline static ObjectMonitor* read_monitor(markWord mark); + inline static ObjectMonitor* read_monitor(Thread* current, oop obj); inline static ObjectMonitor* read_monitor(Thread* current, oop obj, markWord mark); // Returns the identity hash value for an oop @@ -224,13 +225,13 @@ class ObjectLocker : public StackObj { Handle _obj; BasicLock _lock; NoPreemptMark _npm; + bool _skip_exit; public: - ObjectLocker(Handle obj, JavaThread* current); + ObjectLocker(Handle obj, TRAPS); ~ObjectLocker(); // Monitor behavior - void wait(TRAPS) { ObjectSynchronizer::wait(_obj, 0, CHECK); } // wait forever - void wait_uninterruptibly(TRAPS) { ObjectSynchronizer::waitUninterruptibly(_obj, 0, CHECK); } // wait forever + void wait_uninterruptibly(TRAPS); void notify_all(TRAPS) { ObjectSynchronizer::notifyall(_obj, CHECK); } }; diff --git a/src/hotspot/share/runtime/synchronizer.inline.hpp b/src/hotspot/share/runtime/synchronizer.inline.hpp index cdbeb1daf5b..7bcbd91eda7 100644 --- a/src/hotspot/share/runtime/synchronizer.inline.hpp +++ b/src/hotspot/share/runtime/synchronizer.inline.hpp @@ -34,6 +34,10 @@ inline ObjectMonitor* ObjectSynchronizer::read_monitor(markWord mark) { return mark.monitor(); } +inline ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj) { + return ObjectSynchronizer::read_monitor(current, obj, obj->mark()); +} + inline ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj, markWord mark) { if (!UseObjectMonitorTable) { return read_monitor(mark); diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 299905ff0a2..10c3636273d 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -410,6 +410,7 @@ void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) { initialize_class(vmSymbols::java_lang_ClassCastException(), CHECK); initialize_class(vmSymbols::java_lang_ArrayStoreException(), CHECK); initialize_class(vmSymbols::java_lang_ArithmeticException(), CHECK); + initialize_class(vmSymbols::jdk_internal_vm_PreemptedException(), CHECK); initialize_class(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), CHECK); initialize_class(vmSymbols::java_lang_StackOverflowError(), CHECK); initialize_class(vmSymbols::java_lang_IllegalMonitorStateException(), CHECK); diff --git a/src/hotspot/share/utilities/exceptions.cpp b/src/hotspot/share/utilities/exceptions.cpp index e7acb4387ed..22a8cd6e0ef 100644 --- a/src/hotspot/share/utilities/exceptions.cpp +++ b/src/hotspot/share/utilities/exceptions.cpp @@ -62,6 +62,8 @@ void ThreadShadow::set_pending_exception(oop exception, const char* file, int li } void ThreadShadow::clear_pending_exception() { + assert(_pending_exception == nullptr || !_pending_exception->is_a(vmClasses::PreemptedException_klass()), + "unexpected PreemptedException, missing NoPreemptMark?"); LogTarget(Debug, exceptions) lt; if (_pending_exception != nullptr && lt.is_enabled()) { ResourceMark rm; @@ -82,6 +84,30 @@ void ThreadShadow::clear_pending_nonasync_exception() { } } +void ThreadShadow::set_pending_preempted_exception() { + assert(!has_pending_exception(), ""); + // We always install the same pre-allocated exception since we only + // want to use the TRAPS mechanism to bail out from all methods until + // reaching the one using the CHECK_AND_CLEAR_PREEMPTED macro. + set_pending_exception(Universe::preempted_exception_instance(), __FILE__, __LINE__); +} + +void ThreadShadow::clear_pending_preempted_exception() { + assert(has_pending_exception(), ""); + if (pending_exception()->is_a(vmClasses::PreemptedException_klass())) { + _pending_exception = nullptr; + _exception_file = nullptr; + _exception_line = 0; + } +} + +#ifdef ASSERT +void ThreadShadow::check_preempted_exception() { + assert(has_pending_exception(), ""); + assert(pending_exception()->is_a(vmClasses::PreemptedException_klass()), "should only be PreemptedException"); +} +#endif + // Implementation of Exceptions bool Exceptions::special_exception(JavaThread* thread, const char* file, int line, Handle h_exception, Symbol* h_name, const char* message) { @@ -317,6 +343,11 @@ Handle Exceptions::new_exception(JavaThread* thread, Symbol* name, if (!thread->has_pending_exception()) { assert(klass != nullptr, "klass must exist"); + // We could get here while linking or initializing a klass + // from a preemptable call. Don't preempt here since before + // the PreemptedException is propagated we might make an upcall + // to Java to initialize the object with the cause of exception. + NoPreemptMark npm(thread); h_exception = JavaCalls::construct_new_instance(InstanceKlass::cast(klass), signature, args, diff --git a/src/hotspot/share/utilities/exceptions.hpp b/src/hotspot/share/utilities/exceptions.hpp index 94f4a04546d..e76a0041d20 100644 --- a/src/hotspot/share/utilities/exceptions.hpp +++ b/src/hotspot/share/utilities/exceptions.hpp @@ -94,6 +94,10 @@ class ThreadShadow: public CHeapObj { // use CLEAR_PENDING_NONASYNC_EXCEPTION to clear probable nonasync exception. void clear_pending_nonasync_exception(); + void set_pending_preempted_exception(); + void clear_pending_preempted_exception(); + void check_preempted_exception() NOT_DEBUG_RETURN; + ThreadShadow() : _pending_exception(nullptr), _exception_file(nullptr), _exception_line(0) {} }; @@ -230,6 +234,8 @@ class Exceptions { #define CHECK_NULL CHECK_(nullptr) #define CHECK_false CHECK_(false) #define CHECK_JNI_ERR CHECK_(JNI_ERR) +#define CHECK_PREEMPTABLE THREAD); if (HAS_PENDING_EXCEPTION) { THREAD->check_preempted_exception(); return; } (void)(0 +#define CHECK_PREEMPTABLE_false THREAD); if (HAS_PENDING_EXCEPTION) { THREAD->check_preempted_exception(); return false; } (void)(0 // CAUTION: These macros clears all exceptions including async exceptions, use it with caution. #define CHECK_AND_CLEAR THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; return; } (void)(0 @@ -249,6 +255,10 @@ class Exceptions { #define CHECK_AND_CLEAR_NONASYNC_NULL CHECK_AND_CLEAR_NONASYNC_(nullptr) #define CHECK_AND_CLEAR_NONASYNC_false CHECK_AND_CLEAR_NONASYNC_(false) +#define CLEAR_PENDING_PREEMPTED_EXCEPTION (((ThreadShadow*)THREAD)->clear_pending_preempted_exception()) +#define CHECK_AND_CLEAR_PREEMPTED THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_PREEMPTED_EXCEPTION; return; } (void)(0 + + // The THROW... macros should be used to throw an exception. They require a THREAD variable to be // visible within the scope containing the THROW. Usually this is achieved by declaring the function // with a TRAPS argument. diff --git a/src/java.base/share/classes/java/lang/VirtualThread.java b/src/java.base/share/classes/java/lang/VirtualThread.java index a23cbb72a6c..6064b46d50a 100644 --- a/src/java.base/share/classes/java/lang/VirtualThread.java +++ b/src/java.base/share/classes/java/lang/VirtualThread.java @@ -168,6 +168,9 @@ final class VirtualThread extends BaseVirtualThread { // notified by Object.notify/notifyAll while waiting in Object.wait private volatile boolean notified; + // true when waiting in Object.wait, false for VM internal uninterruptible Object.wait + private volatile boolean interruptibleWait; + // timed-wait support private byte timedWaitSeqNo; @@ -599,6 +602,7 @@ final class VirtualThread extends BaseVirtualThread { // Object.wait if (s == WAITING || s == TIMED_WAITING) { int newState; + boolean interruptible = interruptibleWait; if (s == WAITING) { setState(newState = WAIT); } else { @@ -628,7 +632,7 @@ final class VirtualThread extends BaseVirtualThread { } // may have been interrupted while in transition to wait state - if (interrupted && compareAndSetState(newState, UNBLOCKED)) { + if (interruptible && interrupted && compareAndSetState(newState, UNBLOCKED)) { submitRunContinuation(); return; } diff --git a/src/java.base/share/classes/jdk/internal/vm/PreemptedException.java b/src/java.base/share/classes/jdk/internal/vm/PreemptedException.java new file mode 100644 index 00000000000..56b3764f2fd --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/vm/PreemptedException.java @@ -0,0 +1,41 @@ +/* + * 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 jdk.internal.vm; + +/** + * Internal exception used only by the VM. + */ +public class PreemptedException extends RuntimeException { + @java.io.Serial + private static final long serialVersionUID = 6700691236100628123L; + + /** + * Constructs an {@code PreemptedException} with no detail message. + */ + public PreemptedException() { + super(); + } +} diff --git a/test/hotspot/gtest/oops/test_markWord.cpp b/test/hotspot/gtest/oops/test_markWord.cpp index 226d5a2dd74..f894acb5d1b 100644 --- a/test/hotspot/gtest/oops/test_markWord.cpp +++ b/test/hotspot/gtest/oops/test_markWord.cpp @@ -102,7 +102,7 @@ TEST_VM(markWord, printing) { st = new LockerThread(&done, h_obj()); st->doit(); - ol.wait(THREAD); + ol.wait_uninterruptibly(THREAD); assert_test_pattern(h_obj, "monitor"); done.wait_with_safepoint_check(THREAD); // wait till the thread is done. } diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/SingleStepKlassInit.java b/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/SingleStepKlassInit.java new file mode 100644 index 00000000000..457c4b345c7 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/SingleStepKlassInit.java @@ -0,0 +1,90 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test id=default + * @library /test/lib + * @requires vm.continuations + * @run main/othervm/native -agentlib:SingleStepKlassInit -XX:CompileCommand=exclude,SingleStepKlassInit::lambda$main* + * -XX:CompileCommand=exclude,SingleStepKlassInit$$Lambda*::run SingleStepKlassInit + */ + +import java.util.concurrent.CountDownLatch; + +public class SingleStepKlassInit { + private static final int MAX_VTHREAD_COUNT = 8 * Runtime.getRuntime().availableProcessors(); + private static final CountDownLatch finishInvokeStatic = new CountDownLatch(1); + + private static native void setSingleSteppingMode(boolean enable); + private static native boolean didSingleStep(); + + public static void main(String args[]) throws Exception { + class TestClass { + static { + try { + finishInvokeStatic.await(); + } catch (InterruptedException e) {} + } + static void m() { + } + } + + setSingleSteppingMode(true); + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + TestClass.m(); + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishInvokeStatic.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + setSingleSteppingMode(false); + + if (!didSingleStep()) { + throw new RuntimeException("No SingleStep events"); + } + } + + /** + * Waits for the given thread to reach a given state. + */ + private static void await(Thread thread, Thread.State expectedState) throws InterruptedException { + Thread.State state = thread.getState(); + while (state != expectedState) { + assert state != Thread.State.TERMINATED : "Thread has terminated"; + Thread.sleep(10); + state = thread.getState(); + } + } +} diff --git a/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/libSingleStepKlassInit.cpp b/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/libSingleStepKlassInit.cpp new file mode 100644 index 00000000000..8acecd952e3 --- /dev/null +++ b/test/hotspot/jtreg/serviceability/jvmti/vthread/SingleStepKlassInit/libSingleStepKlassInit.cpp @@ -0,0 +1,86 @@ +/* + * 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. + * + * 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. + */ + +#include +#include +#include +#include +#include "jvmti_common.hpp" + +// set by Agent_OnLoad +static jvmtiEnv* jvmti = nullptr; +static jboolean did_single_step = false; + +extern "C" { + +static void JNICALL +SingleStep(jvmtiEnv *jvmti, JNIEnv* jni, jthread thread, + jmethodID method, jlocation location) { + did_single_step = true; +} + +JNIEXPORT jboolean JNICALL +Java_SingleStepKlassInit_didSingleStep(JNIEnv* jni, jclass klass) { + return did_single_step; +} + +JNIEXPORT void JNICALL +Java_SingleStepKlassInit_setSingleSteppingMode(JNIEnv* jni, jclass klass, jboolean enable) { + jvmtiError err = jvmti->SetEventNotificationMode(enable ? JVMTI_ENABLE : JVMTI_DISABLE, JVMTI_EVENT_SINGLE_STEP, nullptr); + check_jvmti_status(jni, err, "setSingleSteppingMode: error in JVMTI SetEventNotificationMode for JVMTI_EVENT_SINGLE_STEP"); +} + +JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* jvm, char* options, void* reserved) { + jvmtiEventCallbacks callbacks; + jvmtiCapabilities caps; + jvmtiError err; + + LOG("Agent_OnLoad: started\n"); + if (jvm->GetEnv((void **) (&jvmti), JVMTI_VERSION) != JNI_OK) { + LOG("Agent init: Failed in GetEnv\n"); + return JNI_ERR; + } + + memset(&caps, 0, sizeof(caps)); + caps.can_generate_single_step_events = 1; + caps.can_support_virtual_threads = 1; + + err = jvmti->AddCapabilities(&caps); + if (err != JVMTI_ERROR_NONE) { + LOG("Agent init: Failed in AddCapabilities: %s (%d)\n", TranslateError(err), err); + return JNI_ERR; + } + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.SingleStep = &SingleStep; + err = jvmti->SetEventCallbacks(&callbacks, sizeof(jvmtiEventCallbacks)); + if (err != JVMTI_ERROR_NONE) { + LOG("Agent init: Failed in SetEventCallbacks: %s (%d)\n", TranslateError(err), err); + return JNI_ERR; + } + + LOG("Agent_OnLoad: finished\n"); + return 0; +} + +} // extern "C" diff --git a/test/jdk/java/lang/Thread/virtual/JfrEvents.java b/test/jdk/java/lang/Thread/virtual/JfrEvents.java index 0c967811481..a0b2077a2aa 100644 --- a/test/jdk/java/lang/Thread/virtual/JfrEvents.java +++ b/test/jdk/java/lang/Thread/virtual/JfrEvents.java @@ -302,10 +302,10 @@ class JfrEvents { } /** - * Test jdk.VirtualThreadPinned event when waiting for a class initializer. + * Test jdk.VirtualThreadPinned event when waiting for a class initializer while pinned. */ @Test - void testWaitingForClassInitializer() throws Exception { + void testWaitingForClassInitializerWhenPinned() throws Exception { class TestClass { static { LockSupport.park(); @@ -328,7 +328,9 @@ class JfrEvents { }); Thread vthread2 = Thread.ofVirtual().unstarted(() -> { started2.set(true); - TestClass.m(); + VThreadPinner.runPinned(() -> { + TestClass.m(); + }); }); try { @@ -341,7 +343,7 @@ class JfrEvents { vthread2.start(); awaitTrue(started2); - // give time for second virtual thread to wait on the MutexLocker + // give time for second virtual thread to wait in VM Thread.sleep(3000); } finally { diff --git a/test/jdk/java/lang/Thread/virtual/KlassInit.java b/test/jdk/java/lang/Thread/virtual/KlassInit.java new file mode 100644 index 00000000000..4f11d667a2b --- /dev/null +++ b/test/jdk/java/lang/Thread/virtual/KlassInit.java @@ -0,0 +1,490 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test id=default + * @library /test/lib + * @requires vm.continuations + * @run junit/othervm/timeout=480 -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* + * -XX:CompileCommand=exclude,KlassInit$$Lambda*::run -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +/* + * @test id=Xint + * @library /test/lib + * @requires vm.continuations + * @run junit/othervm/timeout=480 -Xint -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* + * -XX:CompileCommand=exclude,KlassInit$$Lambda*::run -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +/* + * @test id=Xcomp + * @library /test/lib + * @requires vm.continuations + * @run junit/othervm/timeout=480 -Xcomp -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* + * -XX:CompileCommand=exclude,KlassInit$$Lambda*::run -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +/* + * @test id=Xcomp-TieredStopAtLevel1 + * @library /test/lib + * @requires vm.continuations + * @run junit/othervm/timeout=480 -Xcomp -XX:TieredStopAtLevel=1 -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* + * -XX:CompileCommand=exclude,KlassInit$$Lambda*::run -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +/* + * @test id=Xcomp-noTieredCompilation + * @library /test/lib + * @requires vm.continuations + * @run junit/othervm/timeout=480 -Xcomp -XX:-TieredCompilation -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* + * -XX:CompileCommand=exclude,KlassInit$$Lambda*::run -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +/* + * @test id=gc + * @library /test/lib + * @requires vm.debug == true & vm.continuations + * @run junit/othervm/timeout=480 -XX:+UnlockDiagnosticVMOptions -XX:+FullGCALot -XX:FullGCALotInterval=1000 + * -XX:CompileCommand=exclude,KlassInit::lambda$testReleaseAtKlassInit* -XX:CompileCommand=exclude,KlassInit$$Lambda*::run + * -XX:CompileCommand=exclude,KlassInit$1Driver::foo KlassInit + */ + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.CountDownLatch; +import java.util.stream.Stream; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.Arguments; +import static org.junit.jupiter.api.Assertions.*; + +class KlassInit { + private static final int MAX_VTHREAD_COUNT = 8 * Runtime.getRuntime().availableProcessors(); + + private static final CountDownLatch finishInvokeStatic1 = new CountDownLatch(1); + private static final CountDownLatch finishInvokeStatic2 = new CountDownLatch(1); + private static final CountDownLatch finishInvokeStatic3 = new CountDownLatch(1); + private static final CountDownLatch finishNew = new CountDownLatch(1); + private static final CountDownLatch finishGetStatic = new CountDownLatch(1); + private static final CountDownLatch finishPutStatic = new CountDownLatch(1); + private static final CountDownLatch finishFailedInit = new CountDownLatch(1); + + /** + * Test that threads blocked waiting for klass to be initialized + * on invokestatic bytecode release the carrier. + */ + @Test + void testReleaseAtKlassInitInvokeStatic1() throws Exception { + class TestClass { + static { + try { + finishInvokeStatic1.await(); + } catch (InterruptedException e) {} + } + static void m() { + } + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + TestClass.m(); + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishInvokeStatic1.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + } + + /** + * Test with static method that takes arguments. + */ + @Test + void testReleaseAtKlassInitInvokeStatic2() throws Exception { + class TestClass { + static { + try { + finishInvokeStatic2.await(); + } catch (InterruptedException e) {} + } + static void m(ArrayList list, int id) { + String str = list.get(0); + if (str != null && str.equals("VThread#" + id)) { + list.add("Success"); + } + } + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + ArrayList[] lists = new ArrayList[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + lists[i] = new ArrayList<>(List.of("VThread#" + i)); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + TestClass.m(lists[id], id); + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + System.gc(); + finishInvokeStatic2.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + assertEquals(lists[i].get(1), "Success"); + } + } + + /** + * Test invokestatic as first bytecode in method. + */ + @Test + void testReleaseAtKlassInitInvokeStatic3() throws Exception { + class TestClass { + static { + try { + finishInvokeStatic3.await(); + } catch (InterruptedException e) {} + } + static void m() { + } + } + class Driver { + static void foo() { + TestClass.m(); + } + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + started[0] = new CountDownLatch(1); + vthreads[0] = Thread.ofVirtual().start(() -> { + started[0].countDown(); + TestClass.m(); + }); + started[0].await(); + await(vthreads[0], Thread.State.WAITING); + + for (int i = 1; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + Driver.foo(); + }); + } + for (int i = 1; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishInvokeStatic3.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + } + + /** + * Test that threads blocked waiting for klass to be initialized + * on new bytecode release the carrier. + */ + @Test + void testReleaseAtKlassInitNew() throws Exception { + class TestClass { + static { + try { + finishNew.await(); + } catch (InterruptedException e) {} + } + void m() { + } + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + TestClass x = new TestClass(); + x.m(); + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishNew.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + } + + /** + * Test that threads blocked waiting for klass to be initialized + * on getstatic bytecode release the carrier. + */ + @Test + void testReleaseAtKlassInitGetStatic() throws Exception { + class TestClass { + static { + try { + finishGetStatic.await(); + } catch (InterruptedException e) {} + } + public static int NUMBER = 150; + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + AtomicInteger[] result = new AtomicInteger[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + result[i] = new AtomicInteger(); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + result[id].set(TestClass.NUMBER); + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishGetStatic.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + assertEquals(result[i].get(), TestClass.NUMBER); + } + } + + /** + * Test that threads blocked waiting for klass to be initialized + * on putstatic release the carrier. + */ + @Test + void testReleaseAtKlassInitPutStatic() throws Exception { + class TestClass { + static { + try { + finishPutStatic.await(); + } catch (InterruptedException e) {} + } + public static int NUMBER; + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + TestClass.NUMBER = id; + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishPutStatic.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + } + + /** + * Test that interruptions during preemption on klass init + * are preserved. + */ + @ParameterizedTest + @MethodSource("interruptTestCases") + void testReleaseAtKlassInitPreserverInterrupt(int timeout, Runnable m, CountDownLatch finish) throws Exception { + // Start vthread1 and wait until it blocks in TestClassX initializer + var vthread1_started = new CountDownLatch(1); + var vthread1 = Thread.ofVirtual().start(() -> { + vthread1_started.countDown(); + m.run(); + }); + vthread1_started.await(); + await(vthread1, Thread.State.WAITING); + + // Start vthread2 and wait until it gets preempted on TestClassX initialization + var lock = new Object(); + var interruptedException = new AtomicBoolean(); + var vthread2_started = new CountDownLatch(1); + var vthread2 = Thread.ofVirtual().start(() -> { + vthread2_started.countDown(); + m.run(); + synchronized (lock) { + try { + if (timeout > 0) { + lock.wait(timeout); + } else { + lock.wait(); + } + } catch (InterruptedException e) { + // check stack trace has the expected frames + Set expected = Set.of("wait0", "wait", "run"); + Set methods = Stream.of(e.getStackTrace()) + .map(StackTraceElement::getMethodName) + .collect(Collectors.toSet()); + assertTrue(methods.containsAll(expected)); + interruptedException.set(true); + } + } + }); + vthread2_started.await(); + await(vthread2, Thread.State.WAITING); + + // Interrupt vthread2 and let initialization of TestClassX finish + vthread2.interrupt(); + finish.countDown(); + vthread1.join(); + vthread2.join(); + assertTrue(interruptedException.get()); + } + + static CountDownLatch finishInterrupt0 = new CountDownLatch(1); + class TestClass0 { + static { + try { + finishInterrupt0.await(); + } catch (InterruptedException e) {} + } + static void m() {} + } + + static CountDownLatch finishInterrupt30000 = new CountDownLatch(1); + class TestClass30000 { + static { + try { + finishInterrupt30000.await(); + } catch (InterruptedException e) {} + } + static void m() {} + } + + static CountDownLatch finishInterruptMax = new CountDownLatch(1); + class TestClassMax { + static { + try { + finishInterruptMax.await(); + } catch (InterruptedException e) {} + } + static void m() {} + } + + static Stream interruptTestCases() { + return Stream.of( + Arguments.of(0, (Runnable) TestClass0::m, finishInterrupt0), + Arguments.of(30000, (Runnable) TestClass30000::m, finishInterrupt30000), + Arguments.of(Integer.MAX_VALUE, (Runnable) TestClassMax::m, finishInterruptMax) + ); + } + + /** + * Test case of threads blocked waiting for klass to be initialized + * when the klass initialization fails. + */ + @Test + void testReleaseAtKlassInitFailedInit() throws Exception { + class TestClass { + static int[] a = {1, 2, 3}; + static { + try { + finishFailedInit.await(); + a[3] = 4; + } catch (InterruptedException e) {} + } + static void m() { + } + } + + Thread[] vthreads = new Thread[MAX_VTHREAD_COUNT]; + CountDownLatch[] started = new CountDownLatch[MAX_VTHREAD_COUNT]; + AtomicInteger failedCount = new AtomicInteger(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + final int id = i; + started[i] = new CountDownLatch(1); + vthreads[i] = Thread.ofVirtual().start(() -> { + started[id].countDown(); + try { + TestClass.m(); + } catch (NoClassDefFoundError e) { + failedCount.getAndIncrement(); + } catch (ExceptionInInitializerError e) { + failedCount.getAndIncrement(); + } + }); + } + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + started[i].await(); + await(vthreads[i], Thread.State.WAITING); + } + + finishFailedInit.countDown(); + for (int i = 0; i < MAX_VTHREAD_COUNT; i++) { + vthreads[i].join(); + } + assertEquals(MAX_VTHREAD_COUNT, failedCount.get()); + } + + /** + * Waits for the given thread to reach a given state. + */ + private void await(Thread thread, Thread.State expectedState) throws InterruptedException { + Thread.State state = thread.getState(); + while (state != expectedState) { + assertTrue(state != Thread.State.TERMINATED, "Thread has terminated"); + Thread.sleep(10); + state = thread.getState(); + } + } +} diff --git a/test/jdk/java/lang/Thread/virtual/YieldQueuing.java b/test/jdk/java/lang/Thread/virtual/YieldQueuing.java index edb0b6e9f74..7bd2320e2ab 100644 --- a/test/jdk/java/lang/Thread/virtual/YieldQueuing.java +++ b/test/jdk/java/lang/Thread/virtual/YieldQueuing.java @@ -28,16 +28,24 @@ * @run junit/othervm -Djdk.virtualThreadScheduler.maxPoolSize=1 YieldQueuing */ +import java.lang.invoke.MethodHandles; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.LockSupport; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeAll; import static org.junit.jupiter.api.Assertions.*; class YieldQueuing { + @BeforeAll + static void setup() throws Exception { + // waiting for LockSupport to be initialized can change the scheduling + MethodHandles.lookup().ensureInitialized(LockSupport.class); + } + /** * Test Thread.yield submits the task for the current virtual thread to a scheduler * submission queue when there are no tasks in the local queue. diff --git a/test/jdk/java/lang/Thread/virtual/stress/LotsOfContendedMonitorEnter.java b/test/jdk/java/lang/Thread/virtual/stress/LotsOfContendedMonitorEnter.java index da45c610e82..32d4e1b39d9 100644 --- a/test/jdk/java/lang/Thread/virtual/stress/LotsOfContendedMonitorEnter.java +++ b/test/jdk/java/lang/Thread/virtual/stress/LotsOfContendedMonitorEnter.java @@ -25,22 +25,34 @@ * @test id=default * @summary Test virtual threads entering a lot of monitors with contention * @library /test/lib - * @run main LotsOfContendedMonitorEnter + * @run main/timeout=480 LotsOfContendedMonitorEnter */ +import java.time.Instant; +import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.CountDownLatch; import jdk.test.lib.thread.VThreadRunner; public class LotsOfContendedMonitorEnter { + static int depth; public static void main(String[] args) throws Exception { - int depth; if (args.length > 0) { depth = Integer.parseInt(args[0]); } else { depth = 1024; } - VThreadRunner.run(() -> testContendedEnter(depth)); + + var exRef = new AtomicReference(); + var thread = Thread.ofVirtual().start(() -> { + try { + testContendedEnter(depth); + } catch (Exception e) { + exRef.set(e); + } + }); + thread.join(); + assert exRef.get() == null; } /** @@ -48,6 +60,7 @@ public class LotsOfContendedMonitorEnter { * attempts to enter around the same time, then repeat to the given depth. */ private static void testContendedEnter(int depthRemaining) throws Exception { + boolean doLog = depthRemaining % 10 == 0; if (depthRemaining > 0) { var lock = new Object(); @@ -81,12 +94,18 @@ public class LotsOfContendedMonitorEnter { // signal thread to enter monitor again, it should block signal.countDown(); await(thread, Thread.State.BLOCKED); + if (doLog) { + System.out.println(Instant.now() + " => at depth: " + (depth - depthRemaining)); + } testContendedEnter(depthRemaining - 1); } } finally { thread.join(); } } + if (doLog) { + System.out.println(Instant.now() + " => returning from depth: " + (depth - depthRemaining)); + } } /** From 87c2091cd08e58304d0909ffaf9402ca2f0c3b7f Mon Sep 17 00:00:00 2001 From: Kelvin Nilsen Date: Wed, 5 Nov 2025 00:25:16 +0000 Subject: [PATCH 455/561] 8371141: Shenandoah: Many test timeouts with -XX:-UseTLAB Reviewed-by: xpeng, ysr, wkemper --- test/hotspot/jtreg/ProblemList.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 2065737c2a1..0b9630e9434 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -94,6 +94,9 @@ gc/TestAllocHumongousFragment.java#g1 8298781 generic-all gc/TestAllocHumongousFragment.java#static 8298781 generic-all gc/shenandoah/oom/TestAllocOutOfMemory.java#large 8344312 linux-ppc64le gc/shenandoah/TestEvilSyncBug.java#generational 8345501 generic-all +gc/shenandoah/TestRetainObjects.java#no-tlab 8361099 generic-all +gc/shenandoah/TestSieveObjects.java#no-tlab 8361099 generic-all +gc/shenandoah/TestSieveObjects.java#no-tlab-genshen 8361099 generic-all ############################################################################# From 4e6cadf4550c58b3ff97dfa0cead4b5b1399324c Mon Sep 17 00:00:00 2001 From: erifan Date: Wed, 5 Nov 2025 02:19:29 +0000 Subject: [PATCH 456/561] 8369456: [TESTBUG] Fix the test failure of TestSelectFromTwoVectorOp.java on sve2 platforms Reviewed-by: epeter, bkilambi, xgong, haosun --- .../cpu/aarch64/c2_MacroAssembler_aarch64.cpp | 5 +- src/hotspot/cpu/x86/x86.ad | 2 +- .../vectorapi/TestSelectFromTwoVectorOp.java | 130 +++++++++++++++--- 3 files changed, 115 insertions(+), 22 deletions(-) diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp index 328ef0c53e6..5f71222ed88 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp @@ -2722,9 +2722,8 @@ void C2_MacroAssembler::select_from_two_vectors(FloatRegister dst, FloatRegister assert_different_registers(dst, src1, src2, index, tmp); // The cases that can reach this method are - - // - UseSVE = 0, vector_length_in_bytes = 8 or 16 - // - UseSVE = 1, vector_length_in_bytes = 8 or 16 - // - UseSVE = 2, vector_length_in_bytes >= 8 + // - UseSVE = 0/1, vector_length_in_bytes = 8 or 16, excluding double and long types + // - UseSVE = 2, vector_length_in_bytes >= 8, for all types // // SVE/SVE2 tbl instructions are generated when UseSVE = 1 with vector_length_in_bytes = 8 // and UseSVE = 2 with vector_length_in_bytes >= 8 diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index 2f19e76baf2..064c52e658b 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -3467,7 +3467,7 @@ bool Matcher::match_rule_supported_vector(int opcode, int vlen, BasicType bt) { if (size_in_bits < 128) { return false; } - if ((size_in_bits < 512 && !VM_Version::supports_avx512vl())) { + if (size_in_bits < 512 && !VM_Version::supports_avx512vl()) { return false; } if (bt == T_SHORT && !VM_Version::supports_avx512bw()) { diff --git a/test/hotspot/jtreg/compiler/vectorapi/TestSelectFromTwoVectorOp.java b/test/hotspot/jtreg/compiler/vectorapi/TestSelectFromTwoVectorOp.java index 3746578266c..1320b888ee6 100644 --- a/test/hotspot/jtreg/compiler/vectorapi/TestSelectFromTwoVectorOp.java +++ b/test/hotspot/jtreg/compiler/vectorapi/TestSelectFromTwoVectorOp.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2025, Arm Limited. All rights reserved. + * Copyright (c) 2025, NVIDIA CORPORATION & 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 @@ -185,8 +186,14 @@ public class TestSelectFromTwoVectorOp { @Test @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_16, ">0"}, - applyIfCPUFeature = {"asimd", "true"}, + applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_16, ">0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_16, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_16, ">0"}, applyIfCPUFeatureAnd = {"avx512_vbmi", "true", "avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) @@ -200,7 +207,10 @@ public class TestSelectFromTwoVectorOp { applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_32, ">0"}, applyIfCPUFeature = {"sve2", "true"}, - applyIf = {"MaxVectorSize", ">=32"}) + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_32, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_32, ">0"}, applyIfCPUFeatureAnd = {"avx512_vbmi", "true", "avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) @@ -214,7 +224,10 @@ public class TestSelectFromTwoVectorOp { applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_64, ">0"}, applyIfCPUFeature = {"sve2", "true"}, - applyIf = {"MaxVectorSize", ">=64"}) + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_64, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VB, IRNode.VECTOR_SIZE_64, ">0"}, applyIfCPUFeatureAnd = {"avx512_vbmi", "true", "avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) @@ -248,7 +261,10 @@ public class TestSelectFromTwoVectorOp { applyIf = {"MaxVectorSize", ">=16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_8, ">0"}, applyIfCPUFeature = {"sve2", "true"}, - applyIf = {"MaxVectorSize", ">=16"}) + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_8, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_8, ">0"}, applyIfCPUFeatureAnd = {"avx512bw", "true", "avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) @@ -262,7 +278,10 @@ public class TestSelectFromTwoVectorOp { applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_16, ">0"}, applyIfCPUFeature = {"sve2", "true"}, - applyIf = {"MaxVectorSize", ">=32"}) + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_16, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_16, ">0"}, applyIfCPUFeatureAnd = {"avx512bw", "true", "avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) @@ -276,7 +295,10 @@ public class TestSelectFromTwoVectorOp { applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_32, ">0"}, applyIfCPUFeature = {"sve2", "true"}, - applyIf = {"MaxVectorSize", ">=64"}) + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_32, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VS, IRNode.VECTOR_SIZE_32, ">0"}, applyIfCPUFeatureAnd = {"avx512bw", "true", "avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) @@ -309,7 +331,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_4, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_4, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_4, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) public static void selectFromTwoVector_Int128() { IntSelectFromTwoVectorKernel(IntVector.SPECIES_128, ia, ib, iindex[1]); @@ -320,7 +348,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_8, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_8, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_8, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) public static void selectFromTwoVector_Int256() { IntSelectFromTwoVectorKernel(IntVector.SPECIES_256, ia, ib, iindex[2]); @@ -331,7 +365,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_16, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512f", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_16, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VI, IRNode.VECTOR_SIZE_16, ">0"}, + applyIfCPUFeature = {"avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) public static void selectFromTwoVector_Int512() { IntSelectFromTwoVectorKernel(IntVector.SPECIES_512, ia, ib, iindex[3]); @@ -362,7 +402,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_4, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_4, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_4, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) public static void selectFromTwoVector_Float128() { FloatSelectFromTwoVectorKernel(FloatVector.SPECIES_128, fa, fb, findex[1]); @@ -373,7 +419,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_8, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_8, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_8, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) public static void selectFromTwoVector_Float256() { FloatSelectFromTwoVectorKernel(FloatVector.SPECIES_256, fa, fb, findex[2]); @@ -384,7 +436,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_16, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512f", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_16, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VF, IRNode.VECTOR_SIZE_16, ">0"}, + applyIfCPUFeature = {"avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) public static void selectFromTwoVector_Float512() { FloatSelectFromTwoVectorKernel(FloatVector.SPECIES_512, fa, fb, findex[3]); @@ -407,7 +465,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_2, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_2, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_2, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) public static void selectFromTwoVector_Double128() { DoubleSelectFromTwoVectorKernel(DoubleVector.SPECIES_128, da, db, dindex[0]); @@ -418,7 +482,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_4, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_4, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_4, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) public static void selectFromTwoVector_Double256() { DoubleSelectFromTwoVectorKernel(DoubleVector.SPECIES_256, da, db, dindex[1]); @@ -429,7 +499,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_8, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512f", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_8, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VD, IRNode.VECTOR_SIZE_8, ">0"}, + applyIfCPUFeature = {"avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) public static void selectFromTwoVector_Double512() { DoubleSelectFromTwoVectorKernel(DoubleVector.SPECIES_512, da, db, dindex[2]); @@ -452,7 +528,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=16"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_2, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_2, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">16"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_2, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=16"}) public static void selectFromTwoVector_Long128() { LongSelectFromTwoVectorKernel(LongVector.SPECIES_128, la, lb, lindex[0]); @@ -463,7 +545,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=32"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_4, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512vl", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_4, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">32"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_4, ">0"}, + applyIfCPUFeature = {"avx512vl", "true"}, applyIf = {"MaxVectorSize", ">=32"}) public static void selectFromTwoVector_Long256() { LongSelectFromTwoVectorKernel(LongVector.SPECIES_256, la, lb, lindex[1]); @@ -474,7 +562,13 @@ public class TestSelectFromTwoVectorOp { applyIfCPUFeatureAnd = {"asimd", "true", "sve2", "false"}, applyIf = {"MaxVectorSize", ">=64"}) @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_8, ">0"}, - applyIfCPUFeatureOr = {"sve2", "true", "avx512f", "true"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", "64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_8, "0"}, + applyIfCPUFeature = {"sve2", "true"}, + applyIf = {"MaxVectorSize", ">64"}) + @IR(counts = {IRNode.SELECT_FROM_TWO_VECTOR_VL, IRNode.VECTOR_SIZE_8, ">0"}, + applyIfCPUFeature = {"avx512f", "true"}, applyIf = {"MaxVectorSize", ">=64"}) public static void selectFromTwoVector_Long512() { LongSelectFromTwoVectorKernel(LongVector.SPECIES_512, la, lb, lindex[2]); From d89c6a77f2bf3e0f820f8f631d82d5bec1b02399 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 5 Nov 2025 03:25:40 +0000 Subject: [PATCH 457/561] 8371304: mismatch in file name and class name for ByteInterleavedRasterOffsetsTest.java Reviewed-by: psadhukhan --- test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java b/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java index ec077c45ff1..59bc20789b6 100644 --- a/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java +++ b/test/jdk/java/awt/image/ByteInterleavedRasterOffsetsTest.java @@ -36,7 +36,7 @@ import java.awt.image.WritableRaster; * @summary Verify DataBuffer offsets are handled by ByteInterleavedRaster */ -public class ByteInterleavedOffsetsTest { +public class ByteInterleavedRasterOffsetsTest { public static void main(String[] args) { byte[] data = { 0, -1, 0, 0 }; // only set the R sample. From 8b536b5428d5bf087dc71f3559c3978b13acad16 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Wed, 5 Nov 2025 05:44:09 +0000 Subject: [PATCH 458/561] 8369489: Marker annotation on inner class access crashes javac compiler Reviewed-by: vromero --- .../sun/tools/javac/parser/JavacParser.java | 12 +- .../com/sun/tools/javac/tree/TreeInfo.java | 22 +- .../TypeAnnosOnMemberReferenceTest.java | 190 ++++++++++++++++++ .../tools/javac/parser/JavacParserTest.java | 29 ++- 4 files changed, 244 insertions(+), 9 deletions(-) create mode 100644 test/langtools/tools/javac/annotations/typeAnnotations/TypeAnnosOnMemberReferenceTest.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index 098fbaf59f5..d3539b53541 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -1542,7 +1542,17 @@ public class JavacParser implements Parser { switch (expr.getTag()) { case REFERENCE: { JCMemberReference mref = (JCMemberReference) expr; - mref.expr = toP(F.at(pos).AnnotatedType(typeAnnos, mref.expr)); + if (TreeInfo.isType(mref.expr, names)) { + mref.expr = insertAnnotationsToMostInner(mref.expr, typeAnnos, false); + } else { + //the selector is not a type, error recovery: + JCAnnotatedType annotatedType = + toP(F.at(pos).AnnotatedType(typeAnnos, mref.expr)); + int termStart = getStartPos(mref.expr); + mref.expr = syntaxError(termStart, List.of(annotatedType), + Errors.IllegalStartOfType); + } + mref.pos = getStartPos(mref.expr); t = mref; break; } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java index a66dcaad851..af823024fab 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -437,6 +437,19 @@ public class TreeInfo { * Return true if the AST corresponds to a static select of the kind A.B */ public static boolean isStaticSelector(JCTree base, Names names) { + return isTypeSelector(base, names, TreeInfo::isStaticSym); + } + //where + private static boolean isStaticSym(JCTree tree) { + Symbol sym = symbol(tree); + return (sym.kind == TYP || sym.kind == PCK); + } + + public static boolean isType(JCTree base, Names names) { + return isTypeSelector(base, names, _ -> true); + } + + private static boolean isTypeSelector(JCTree base, Names names, Predicate checkStaticSym) { if (base == null) return false; switch (base.getTag()) { @@ -444,9 +457,9 @@ public class TreeInfo { JCIdent id = (JCIdent)base; return id.name != names._this && id.name != names._super && - isStaticSym(base); + checkStaticSym.test(base); case SELECT: - return isStaticSym(base) && + return checkStaticSym.test(base) && isStaticSelector(((JCFieldAccess)base).selected, names); case TYPEAPPLY: case TYPEARRAY: @@ -457,11 +470,6 @@ public class TreeInfo { return false; } } - //where - private static boolean isStaticSym(JCTree tree) { - Symbol sym = symbol(tree); - return (sym.kind == TYP || sym.kind == PCK); - } /** Return true if a tree represents the null literal. */ public static boolean isNull(JCTree tree) { diff --git a/test/langtools/tools/javac/annotations/typeAnnotations/TypeAnnosOnMemberReferenceTest.java b/test/langtools/tools/javac/annotations/typeAnnotations/TypeAnnosOnMemberReferenceTest.java new file mode 100644 index 00000000000..002b8d5bcb1 --- /dev/null +++ b/test/langtools/tools/javac/annotations/typeAnnotations/TypeAnnosOnMemberReferenceTest.java @@ -0,0 +1,190 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8369489 + * @summary Verify annotations on member references work reasonably. + * @library /tools/lib /tools/javac/lib + * @modules + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JavacTask + * @run junit TypeAnnosOnMemberReferenceTest + */ + +import com.sun.source.tree.IdentifierTree; +import com.sun.source.tree.Tree; +import com.sun.source.tree.VariableTree; +import com.sun.source.util.TreePath; +import com.sun.source.util.TreeScanner; +import com.sun.source.util.Trees; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.util.ElementFilter; + +import org.junit.jupiter.api.Test; + +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class TypeAnnosOnMemberReferenceTest { + private ToolBox tb = new ToolBox(); + + @Test + public void testAnnoOnMemberRef() throws Exception { + Path base = Paths.get("."); + Path src = base.resolve("src"); + Path classes = base.resolve("classes"); + + Files.createDirectories(classes); + + tb.writeJavaFiles(src, + """ + import java.lang.annotation.Target; + import java.lang.annotation.ElementType; + import java.lang.annotation.Retention; + import java.lang.annotation.RetentionPolicy; + + public class Test { + interface I { + void foo(int i); + } + + @Target(ElementType.TYPE_USE) + @interface Ann1 {} + @Target(ElementType.TYPE_USE) + @interface Ann2 {} + I i = @Ann1 Test @Ann2 []::new; + } + """); + + Path classDir = getClassDir(); + new JavacTask(tb) + .classpath(classDir) + .outdir(classes) + .options("-processor", VerifyAnnotations.class.getName()) + .files(tb.findJavaFiles(src)) + .outdir(classes) + .run(Task.Expect.SUCCESS); + } + + public Path getClassDir() { + String classes = ToolBox.testClasses; + if (classes == null) { + return Paths.get("build"); + } else { + return Paths.get(classes); + } + } + + @SupportedAnnotationTypes("*") + public static final class VerifyAnnotations extends AbstractProcessor { + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latestSupported(); + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + TypeElement testElement = processingEnv.getElementUtils().getTypeElement("Test"); + VariableElement iElement = ElementFilter.fieldsIn(testElement.getEnclosedElements()).getFirst(); + Trees trees = Trees.instance(processingEnv); + TreePath iPath = trees.getPath(iElement); + StringBuilder text = new StringBuilder(); + new TreeScanner<>() { + int ident = 0; + @Override + public Object scan(Tree tree, Object p) { + if (tree != null) { + String indent = + Stream.generate(() -> " ") + .limit(ident) + .collect(Collectors.joining()); + + text.append("\n") + .append(indent) + .append("(") + .append(tree.getKind()); + ident += 4; + super.scan(tree, p); + ident -= 4; + text.append("\n") + .append(indent) + .append(")"); + } + return null; + } + + @Override + public Object visitIdentifier(IdentifierTree node, Object p) { + text.append(" ").append(node.getName()); + return super.visitIdentifier(node, p); + } + }.scan(((VariableTree) iPath.getLeaf()).getInitializer(), null); + String expected = + """ + + (MEMBER_REFERENCE + (ANNOTATED_TYPE + (TYPE_ANNOTATION + (IDENTIFIER Ann2 + ) + ) + (ARRAY_TYPE + (ANNOTATED_TYPE + (TYPE_ANNOTATION + (IDENTIFIER Ann1 + ) + ) + (IDENTIFIER Test + ) + ) + ) + ) + )"""; + + String actual = text.toString(); + + if (!expected.equals(actual)) { + throw new AssertionError("Expected: " + expected + "," + + "got: " + actual); + } + + return false; + } + } +} diff --git a/test/langtools/tools/javac/parser/JavacParserTest.java b/test/langtools/tools/javac/parser/JavacParserTest.java index 58d60d80ca9..25aeb19f1bb 100644 --- a/test/langtools/tools/javac/parser/JavacParserTest.java +++ b/test/langtools/tools/javac/parser/JavacParserTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 7073631 7159445 7156633 8028235 8065753 8205418 8205913 8228451 8237041 8253584 8246774 8256411 8256149 8259050 8266436 8267221 8271928 8275097 8293897 8295401 8304671 8310326 8312093 8312204 8315452 8337976 8324859 8344706 8351260 8370865 + * @bug 7073631 7159445 7156633 8028235 8065753 8205418 8205913 8228451 8237041 8253584 8246774 8256411 8256149 8259050 8266436 8267221 8271928 8275097 8293897 8295401 8304671 8310326 8312093 8312204 8315452 8337976 8324859 8344706 8351260 8370865 8369489 * @summary tests error and diagnostics positions * @author Jan Lahoda * @modules jdk.compiler/com.sun.tools.javac.api @@ -3124,6 +3124,33 @@ public class JavacParserTest extends TestCase { codes); } + @Test //JDK-8369489 + void testTypeAnnotationBrokenMethodRef() throws IOException { + String code = """ + public class Test { + Object o1 = @Ann any()::test; + Object o2 = @Ann any().field::test; + } + """; + DiagnosticCollector coll = + new DiagnosticCollector<>(); + JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, fm, coll, + null, + null, Arrays.asList(new MyFileObject(code))); + //no exceptions: + ct.parse().iterator().next(); + List codes = new LinkedList<>(); + + for (Diagnostic d : coll.getDiagnostics()) { + codes.add(d.getLineNumber() + ":" + d.getColumnNumber() + ":" + d.getCode()); + } + + assertEquals("testTypeAnnotationBrokenMethodRef: " + codes, + List.of("2:22:compiler.err.illegal.start.of.type", + "3:22:compiler.err.illegal.start.of.type"), + codes); + } + void run(String[] args) throws Exception { int passed = 0, failed = 0; final Pattern p = (args != null && args.length > 0) From a0e70c4e9489fc3d8f35c3aec9423fe0839ed0bd Mon Sep 17 00:00:00 2001 From: Christian Stein Date: Wed, 5 Nov 2025 06:23:26 +0000 Subject: [PATCH 459/561] 8370175: State engine terminates when throwing self-caused exception Reviewed-by: jlahoda, fandreuzzi --- .../execution/DirectExecutionControl.java | 23 +++++++++++++++---- test/langtools/jdk/jshell/ExceptionsTest.java | 12 +++++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java b/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java index 1c40aa03e5f..b9424f762a5 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 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 @@ -29,6 +29,9 @@ import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Set; import java.util.stream.IntStream; import jdk.jshell.spi.ExecutionControl; import jdk.jshell.spi.SPIResolutionException; @@ -335,10 +338,15 @@ public class DirectExecutionControl implements ExecutionControl { * @throws ExecutionControl.InternalException for internal problems */ protected String throwConvertedInvocationException(Throwable cause) throws RunException, InternalException { - throw asRunException(cause); + // Guard against recursive cause chains by + // using a Set with identity equality semantics. + Set dejaVu = Collections.newSetFromMap(new IdentityHashMap<>()); + dejaVu.add(cause); + + throw asRunException(cause, dejaVu); } - private RunException asRunException(Throwable ex) { + private RunException asRunException(Throwable ex, Set dejaVu) { if (ex instanceof SPIResolutionException) { SPIResolutionException spire = (SPIResolutionException) ex; return new ResolutionException(spire.id(), spire.getStackTrace()); @@ -347,7 +355,14 @@ public class DirectExecutionControl implements ExecutionControl { ex.getClass().getName(), ex.getStackTrace()); Throwable cause = ex.getCause(); - ue.initCause(cause == null ? null : asRunException(cause)); + if (cause != null) { + Throwable throwable = dejaVu.add(cause) + ? asRunException(cause, dejaVu) + : new UserException("CIRCULAR REFERENCE!", + cause.getClass().getName(), + cause.getStackTrace()); + ue.initCause(throwable); + } return ue; } } diff --git a/test/langtools/jdk/jshell/ExceptionsTest.java b/test/langtools/jdk/jshell/ExceptionsTest.java index f7273b2a6fc..6cca962acde 100644 --- a/test/langtools/jdk/jshell/ExceptionsTest.java +++ b/test/langtools/jdk/jshell/ExceptionsTest.java @@ -24,7 +24,7 @@ /* * @test * @summary Tests for exceptions - * @bug 8198801 8212167 8210527 + * @bug 8198801 8212167 8210527 8370175 * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main * jdk.jdeps/com.sun.tools.javap @@ -320,6 +320,16 @@ public class ExceptionsTest extends KullaTesting { assertExecuteException("f();", StackOverflowError.class); } + @Test + public void recursiveCauses() { + assertEval("var one = new Throwable();"); + assertEval("var two = new Error();"); + assertEval("one.initCause(two);"); + assertEval("two.initCause(one);"); + assertExecuteException("throw one;", Throwable.class); + assertExecuteException("throw two;", Error.class); + } + private StackTraceElement newStackTraceElement(String className, String methodName, Snippet key, int lineNumber) { return new StackTraceElement(className, methodName, "#" + key.id(), lineNumber); } From dddfcd03aa30514d63eceff707d48bff35e93c56 Mon Sep 17 00:00:00 2001 From: Kerem Kat Date: Wed, 5 Nov 2025 08:33:14 +0000 Subject: [PATCH 460/561] 8334866: Improve Speed of ElfDecoder source search Reviewed-by: shade, chagedorn --- src/hotspot/share/utilities/elfFile.cpp | 148 +++++++++++++++++++++++- src/hotspot/share/utilities/elfFile.hpp | 90 ++++++++++++-- 2 files changed, 225 insertions(+), 13 deletions(-) diff --git a/src/hotspot/share/utilities/elfFile.cpp b/src/hotspot/share/utilities/elfFile.cpp index e3cbb5ac18e..9ea19b38276 100644 --- a/src/hotspot/share/utilities/elfFile.cpp +++ b/src/hotspot/share/utilities/elfFile.cpp @@ -684,9 +684,8 @@ bool ElfFile::create_new_dwarf_file(const char* filepath) { // Starting point of reading line number and filename information from the DWARF file. bool DwarfFile::get_filename_and_line_number(const uint32_t offset_in_library, char* filename, const size_t filename_len, int* line, const bool is_pc_after_call) { - DebugAranges debug_aranges(this); uint32_t compilation_unit_offset = 0; // 4-bytes for 32-bit DWARF - if (!debug_aranges.find_compilation_unit_offset(offset_in_library, &compilation_unit_offset)) { + if (!_debug_aranges.find_compilation_unit_offset(offset_in_library, &compilation_unit_offset)) { DWARF_LOG_ERROR("Failed to find .debug_info offset for the compilation unit."); return false; } @@ -708,11 +707,87 @@ bool DwarfFile::get_filename_and_line_number(const uint32_t offset_in_library, c return true; } +// Build sorted cache of all address ranges for binary search. +DwarfFile::DebugAranges::CacheHint DwarfFile::DebugAranges::ensure_cached() { + if (_cache._failed) { + return CacheHint::FAILED; + } + if (_cache._initialized) { + return CacheHint::VALID; + } + + assert(_cache._capacity == 0, "need fresh cache"); + assert(_cache._count == 0, "need fresh cache"); + const long pos = _reader.get_position(); + if (!read_section_header()) { + _cache.destroy(true); + return CacheHint::FAILED; + } + + // Start with reasonable initial capacity to minimize number of grow/realloc calls. + // Assume ~3% of the .debug_aranges is DebugArangesSetHeader and the rest is made up of AddressDescriptors. + const uintptr_t estimated_set_header_size = _size_bytes / 32; + const size_t initial_capacity = (_size_bytes - estimated_set_header_size) / sizeof(AddressDescriptor); + _cache._entries = NEW_C_HEAP_ARRAY_RETURN_NULL(ArangesEntry, initial_capacity, mtInternal); + if (_cache._entries == nullptr) { + _cache.destroy(true); + _reader.set_position(pos); + return CacheHint::TRY_LINEAR_SCAN; + } + _cache._capacity = initial_capacity; + _cache._count = 0; + + // Read all sets and their descriptors + while (_reader.has_bytes_left()) { + DebugArangesSetHeader set_header; + if (!read_set_header(set_header)) { + break; + } + + // Read all address descriptors for this set into the cache. + AddressDescriptor descriptor; + do { + if (!read_address_descriptor(descriptor)) { + _cache.destroy(true); + return CacheHint::FAILED; + } + if (!is_terminating_entry(set_header, descriptor) && descriptor.range_length > 0 && + !_cache.add_entry(descriptor, set_header._debug_info_offset)) { + _cache.destroy(true); + _reader.set_position(pos); + return CacheHint::TRY_LINEAR_SCAN; + } + } while (!is_terminating_entry(set_header, descriptor) && _reader.has_bytes_left()); + } + + if (_cache._count == 0) { + _cache.destroy(false); + // No entries found, unusual but still valid. + return CacheHint::VALID; + } + _cache.sort(); + _cache._initialized = true; + DWARF_LOG_INFO("Built .debug_aranges cache for '%s' with %zu entries", this->_dwarf_file->filepath(), _cache._count); + return CacheHint::VALID; +} + // (2) The .debug_aranges section contains a number of entries/sets. Each set contains one or multiple address range descriptors of the // form [beginning_address, beginning_address+length). Start reading these sets and their descriptors until we find one that contains // 'offset_in_library'. Read the debug_info_offset field from the header of this set which defines the offset for the compilation unit. // This process is described in section 6.1.2 of the DWARF 4 spec. bool DwarfFile::DebugAranges::find_compilation_unit_offset(const uint32_t offset_in_library, uint32_t* compilation_unit_offset) { + switch (ensure_cached()) { + case CacheHint::VALID: + return _cache.find_compilation_unit_offset(offset_in_library, compilation_unit_offset); + case CacheHint::TRY_LINEAR_SCAN: + break; + case CacheHint::FAILED: + return false; + } + + // Fall back to linear scan if building of the cache failed, which can happen + // if there are C heap allocation errors. + DWARF_LOG_INFO("Falling back to linear scan of .debug_aranges for '%s'", _dwarf_file->filepath()); if (!read_section_header()) { DWARF_LOG_ERROR("Failed to read a .debug_aranges header."); return false; @@ -750,6 +825,7 @@ bool DwarfFile::DebugAranges::read_section_header() { } _section_start_address = shdr.sh_offset; + _size_bytes = shdr.sh_size; _reader.set_max_pos(shdr.sh_offset + shdr.sh_size); return _reader.set_position(shdr.sh_offset); } @@ -829,6 +905,74 @@ bool DwarfFile::DebugAranges::is_terminating_entry(const DwarfFile::DebugAranges return is_terminating; } +// Sort entries by beginning_address, when same then sort longest range first. +int DwarfFile::ArangesCache::compare_aranges_entries(const ArangesEntry& a, const ArangesEntry& b) { + if (a.beginning_address < b.beginning_address) { + return -1; + } else if (a.beginning_address > b.beginning_address) { + return 1; + } + + uintptr_t len_a = a.end_address - a.beginning_address; + uintptr_t len_b = b.end_address - b.beginning_address; + if (len_a < len_b) { + return 1; + } else if (len_a > len_b) { + return -1; + } + return 0; +} + +void DwarfFile::ArangesCache::sort() { + QuickSort::sort(_entries, _count, compare_aranges_entries); +} + +bool DwarfFile::ArangesCache::add_entry(const AddressDescriptor& descriptor, uint32_t debug_info_offset) { + if (_count >= _capacity && !grow()) { + return false; + } + _entries[_count] = ArangesEntry( + descriptor.beginning_address, + descriptor.beginning_address + descriptor.range_length, + debug_info_offset + ); + _count++; + return true; +} + +bool DwarfFile::ArangesCache::grow() { + size_t new_capacity = _capacity == 0 ? 128 : _capacity * 1.5; + ArangesEntry* new_entries = REALLOC_C_HEAP_ARRAY_RETURN_NULL(ArangesEntry, _entries, new_capacity, mtInternal); + if (new_entries == nullptr) { + return false; + } + _entries = new_entries; + _capacity = new_capacity; + return true; +} + +bool DwarfFile::ArangesCache::find_compilation_unit_offset(uint32_t offset_in_library, uint32_t* compilation_unit_offset) const { + if (!_initialized || _entries == nullptr || _count == 0) { + return false; + } + + size_t left = 0; + size_t right = _count; + while (left < right) { + size_t mid = left + (right - left) / 2; + const ArangesEntry& entry = _entries[mid]; + if (offset_in_library < entry.beginning_address) { + right = mid; + } else if (offset_in_library >= entry.end_address) { + left = mid + 1; + } else { + *compilation_unit_offset = entry.debug_info_offset; + return true; + } + } + return false; +} + // Find the .debug_line offset for the line number program by reading from the .debug_abbrev and .debug_info section. bool DwarfFile::CompilationUnit::find_debug_line_offset(uint32_t* debug_line_offset) { // (3a,b) diff --git a/src/hotspot/share/utilities/elfFile.hpp b/src/hotspot/share/utilities/elfFile.hpp index 979fac5edfc..1298892533e 100644 --- a/src/hotspot/share/utilities/elfFile.hpp +++ b/src/hotspot/share/utilities/elfFile.hpp @@ -72,6 +72,7 @@ typedef Elf32_Sym Elf_Sym; #include "memory/allocation.hpp" #include "utilities/checkedCast.hpp" #include "utilities/decoder.hpp" +#include "utilities/quickSort.hpp" #ifdef ASSERT // Helper macros to print different log levels during DWARF parsing @@ -94,10 +95,10 @@ typedef Elf32_Sym Elf_Sym; #define DWARF_LOG_TRACE(format, ...) #endif +class DwarfFile; +class ElfFuncDescTable; class ElfStringTable; class ElfSymbolTable; -class ElfFuncDescTable; -class DwarfFile; // ELF section, may or may not have cached data class ElfSection { @@ -201,6 +202,7 @@ class ElfFile: public CHeapObj { bool get_source_info(uint32_t offset_in_library, char* filename, size_t filename_len, int* line, bool is_pc_after_call); + DEBUG_ONLY(const char* filepath() const { return _filepath; }) private: // sanity check, if the file is a real elf file static bool is_elf_file(Elf_Ehdr&); @@ -397,7 +399,6 @@ class ElfFile: public CHeapObj { * - Complete information about intermediate states/results when parsing the DWARF file. */ class DwarfFile : public ElfFile { - static constexpr uint8_t ADDRESS_SIZE = NOT_LP64(4) LP64_ONLY(8); // We only support 32-bit DWARF (emitted by GCC) which uses 32-bit values for DWARF section lengths and offsets // relative to the beginning of a section. @@ -435,6 +436,63 @@ class DwarfFile : public ElfFile { bool read_non_null_char(char* result); }; + // Address descriptor defining a range that is covered by a compilation unit. It is defined in section 6.1.2 after + // the set header in the DWARF 4 spec. + struct AddressDescriptor { + uintptr_t beginning_address = 0; + uintptr_t range_length = 0; + }; + + // Entry in ArangesCache, corresponding to an entry in .debug_aranges section. + struct ArangesEntry { + uintptr_t beginning_address; + uintptr_t end_address; + uint32_t debug_info_offset; + + ArangesEntry() : beginning_address(0), end_address(0), debug_info_offset(0) {} + ArangesEntry(uintptr_t begin, uintptr_t end, uint32_t offset) + : beginning_address(begin), end_address(end), debug_info_offset(offset) {} + }; + + // Cache for .debug_aranges to enable binary search for address lookup. + // DebugAranges uses this cache to resolve the compilation_unit_offset, rather than doing a linear scan on the files + // in each invocation of DebugAranges::find_compilation_unit_offset. + struct ArangesCache { + ArangesEntry* _entries; + size_t _count; + size_t _capacity; + bool _initialized; + bool _failed; + + ArangesCache() : _entries(nullptr), _count(0), _capacity(0), _initialized(false), _failed(false) {} + ArangesCache(const ArangesCache&) = delete; + ArangesCache& operator=(const ArangesCache&) = delete; + ~ArangesCache() { + this->free(); + } + + void destroy(bool failed) { + this->free(); + _count = 0; + _capacity = 0; + _failed = failed; + } + bool find_compilation_unit_offset(uint32_t offset_in_library, uint32_t* compilation_unit_offset) const; + bool valid() const { return _initialized && !_failed; } + bool add_entry(const AddressDescriptor& descriptor, uint32_t debug_info_offset); + void sort(); + + private: + static int compare_aranges_entries(const ArangesEntry& a, const ArangesEntry& b); + bool grow(); + void free() { + if (_entries != nullptr) { + FREE_C_HEAP_ARRAY(ArangesEntry, _entries); + _entries = nullptr; + } + } + }; + // (2) Processing the .debug_aranges section to find the compilation unit which covers offset_in_library. // This is specified in section 6.1.2 of the DWARF 4 spec. // @@ -475,16 +533,22 @@ class DwarfFile : public ElfFile { uint8_t _segment_size; }; - // Address descriptor defining a range that is covered by a compilation unit. It is defined in section 6.1.2 after - // the set header in the DWARF 4 spec. - struct AddressDescriptor { - uintptr_t beginning_address = 0; - uintptr_t range_length = 0; + enum class CacheHint { + // Do not retry as linear scan won't be able to read this either. + FAILED, + + // Cache is usable, no need to fall back to linear scan. + VALID, + + // Cache is unusable, possible reasons are C heap allocation failures. Fall back to linear scan. + TRY_LINEAR_SCAN, }; DwarfFile* _dwarf_file; + ArangesCache _cache; MarkedDwarfFileReader _reader; uintptr_t _section_start_address; + uintptr_t _size_bytes; // a calculated end position long _entry_end; @@ -499,9 +563,9 @@ class DwarfFile : public ElfFile { const AddressDescriptor& descriptor); public: DebugAranges(DwarfFile* dwarf_file) : _dwarf_file(dwarf_file), _reader(dwarf_file->fd()), - _section_start_address(0), _entry_end(0) {} + _section_start_address(0), _size_bytes(0), _entry_end(0) {} bool find_compilation_unit_offset(uint32_t offset_in_library, uint32_t* compilation_unit_offset); - + CacheHint ensure_cached(); }; // (3a-c,e) The compilation unit is read from the .debug_info section. The structure of .debug_info is shown in the @@ -884,7 +948,8 @@ class DwarfFile : public ElfFile { }; public: - DwarfFile(const char* filepath) : ElfFile(filepath) {} + DwarfFile(const char* filepath) : ElfFile(filepath), _debug_aranges(this) { + } /* * Starting point of reading line number and filename information from the DWARF file. @@ -897,6 +962,9 @@ class DwarfFile : public ElfFile { * More details about the different phases can be found at the associated methods. */ bool get_filename_and_line_number(uint32_t offset_in_library, char* filename, size_t filename_len, int* line, bool is_pc_after_call); + + private: + DebugAranges _debug_aranges; }; #endif // !_WINDOWS && !__APPLE__ From f5d8bd0dd50bcd963b4062997aecb4e15249e30d Mon Sep 17 00:00:00 2001 From: Afshin Zafari Date: Wed, 5 Nov 2025 08:57:02 +0000 Subject: [PATCH 461/561] 8370874: [asan] ASAN build fails after JDK-8368365 Reviewed-by: haosun, dholmes, syan, stuefe --- src/hotspot/share/sanitizers/address.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/sanitizers/address.cpp b/src/hotspot/share/sanitizers/address.cpp index b050039b1b8..7d129feab0a 100644 --- a/src/hotspot/share/sanitizers/address.cpp +++ b/src/hotspot/share/sanitizers/address.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -25,6 +25,7 @@ #ifdef ADDRESS_SANITIZER #include "logging/log.hpp" +#include "runtime/globals_extension.hpp" #include "sanitizers/address.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/vmError.hpp" From 0737a5625269773dcf70b95f8b8ac90b3b6cc444 Mon Sep 17 00:00:00 2001 From: Robbin Ehn Date: Wed, 5 Nov 2025 09:21:57 +0000 Subject: [PATCH 462/561] 8370708: RISC-V: Add VerifyStackAtCalls Reviewed-by: fyang, fjiang --- src/hotspot/cpu/riscv/riscv.ad | 30 ++++++++++++++----- src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp | 2 +- src/hotspot/share/opto/chaitin.cpp | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 83c59af9113..4be408f6ca5 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1184,6 +1184,8 @@ bool is_CAS(int opcode, bool maybe_volatile) } } +constexpr uint64_t MAJIK_DWORD = 0xabbaabbaabbaabbaull; + // predicate controlling translation of CAS // // returns true if CAS needs to use an acquiring load otherwise false @@ -1363,10 +1365,15 @@ void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const { st->print("# stack bang size=%d\n\t", framesize); } - st->print("sd fp, [sp, #%d]\n\t", - 2 * wordSize); - st->print("sd ra, [sp, #%d]\n\t", - wordSize); - if (PreserveFramePointer) { st->print("sub fp, sp, #%d\n\t", 2 * wordSize); } st->print("sub sp, sp, #%d\n\t", framesize); + st->print("sd fp, [sp, #%d]\n\t", framesize - 2 * wordSize); + st->print("sd ra, [sp, #%d]\n\t", framesize - wordSize); + if (PreserveFramePointer) { st->print("add fp, sp, #%d\n\t", framesize); } + + if (VerifyStackAtCalls) { + st->print("mv t2, %ld\n\t", MAJIK_DWORD); + st->print("sd t2, [sp, #%d]\n\t", framesize - 3 * wordSize); + } if (C->stub_function() == nullptr) { st->print("ld t0, [guard]\n\t"); @@ -1408,6 +1415,11 @@ void MachPrologNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { __ build_frame(framesize); + if (VerifyStackAtCalls) { + __ mv(t2, MAJIK_DWORD); + __ sd(t2, Address(sp, framesize - 3 * wordSize)); + } + if (C->stub_function() == nullptr) { BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); // Dummy labels for just measuring the code size @@ -1429,10 +1441,6 @@ void MachPrologNode::emit(C2_MacroAssembler *masm, PhaseRegAlloc *ra_) const { bs->nmethod_entry_barrier(masm, slow_path, continuation, guard); } - if (VerifyStackAtCalls) { - Unimplemented(); - } - C->output()->set_frame_complete(__ offset()); if (C->has_mach_constant_base_node()) { @@ -2431,7 +2439,13 @@ encode %{ enc_class riscv_enc_call_epilog() %{ if (VerifyStackAtCalls) { // Check that stack depth is unchanged: find majik cookie on stack - __ call_Unimplemented(); + int framesize = ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3 * VMRegImpl::slots_per_word)); + Label stack_ok; + __ ld(t1, Address(sp, framesize)); + __ mv(t2, MAJIK_DWORD); + __ beq(t2, t1, stack_ok); + __ stop("MAJIK_DWORD not found"); + __ bind(stack_ok); } %} diff --git a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp index b303178a666..e64fc2ffc80 100644 --- a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp +++ b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp @@ -2368,7 +2368,7 @@ void SharedRuntime::generate_deopt_blob() { // EPILOG must remove this many slots. // RISCV needs two words for RA (return address) and FP (frame pointer). uint SharedRuntime::in_preserve_stack_slots() { - return 2 * VMRegImpl::slots_per_word; + return 2 * VMRegImpl::slots_per_word + (VerifyStackAtCalls ? 0 : 2) ; } uint SharedRuntime::out_preserve_stack_slots() { diff --git a/src/hotspot/share/opto/chaitin.cpp b/src/hotspot/share/opto/chaitin.cpp index 8c8c2b0ed4e..524dee6e06a 100644 --- a/src/hotspot/share/opto/chaitin.cpp +++ b/src/hotspot/share/opto/chaitin.cpp @@ -2408,7 +2408,7 @@ void PhaseChaitin::dump_frame() const { tty->print_cr("saved fp register"); else if (return_addr == OptoReg::add(reg, 2*VMRegImpl::slots_per_word) && VerifyStackAtCalls) - tty->print_cr("0xBADB100D +VerifyStackAtCalls"); + tty->print_cr(" +VerifyStackAtCalls"); else tty->print_cr("in_preserve"); } else if ((int)OptoReg::reg2stack(reg) < fixed_slots) { From 6a51b51ba13167a15a637507a7fa5d6f988a39e7 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Wed, 5 Nov 2025 10:12:47 +0000 Subject: [PATCH 463/561] 8371197: G1: Use void for return type of G1RegionsOnNodes::add Reviewed-by: tschatzl, iwalulya, fandreuzzi --- src/hotspot/share/gc/g1/g1EdenRegions.hpp | 4 ++-- src/hotspot/share/gc/g1/g1RegionsOnNodes.cpp | 5 +---- src/hotspot/share/gc/g1/g1RegionsOnNodes.hpp | 4 ++-- src/hotspot/share/gc/g1/g1SurvivorRegions.cpp | 4 ++-- src/hotspot/share/gc/g1/g1SurvivorRegions.hpp | 2 +- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1EdenRegions.hpp b/src/hotspot/share/gc/g1/g1EdenRegions.hpp index c7ed9008ee7..a08cda97d4c 100644 --- a/src/hotspot/share/gc/g1/g1EdenRegions.hpp +++ b/src/hotspot/share/gc/g1/g1EdenRegions.hpp @@ -41,10 +41,10 @@ private: public: G1EdenRegions() : _length(0), _used_bytes(0), _regions_on_node() { } - uint add(G1HeapRegion* hr) { + void add(G1HeapRegion* hr) { assert(hr->is_eden(), "must be"); _length++; - return _regions_on_node.add(hr); + _regions_on_node.add(hr); } void clear() { diff --git a/src/hotspot/share/gc/g1/g1RegionsOnNodes.cpp b/src/hotspot/share/gc/g1/g1RegionsOnNodes.cpp index 91f6ee49095..c1c0d471796 100644 --- a/src/hotspot/share/gc/g1/g1RegionsOnNodes.cpp +++ b/src/hotspot/share/gc/g1/g1RegionsOnNodes.cpp @@ -35,16 +35,13 @@ G1RegionsOnNodes::~G1RegionsOnNodes() { FREE_C_HEAP_ARRAY(uint, _count_per_node); } -uint G1RegionsOnNodes::add(G1HeapRegion* hr) { +void G1RegionsOnNodes::add(G1HeapRegion* hr) { uint node_index = hr->node_index(); // Update only if the node index is valid. if (node_index < _numa->num_active_nodes()) { *(_count_per_node + node_index) += 1; - return node_index; } - - return G1NUMA::UnknownNodeIndex; } void G1RegionsOnNodes::clear() { diff --git a/src/hotspot/share/gc/g1/g1RegionsOnNodes.hpp b/src/hotspot/share/gc/g1/g1RegionsOnNodes.hpp index d5318343399..5b8d6479833 100644 --- a/src/hotspot/share/gc/g1/g1RegionsOnNodes.hpp +++ b/src/hotspot/share/gc/g1/g1RegionsOnNodes.hpp @@ -40,8 +40,8 @@ public: ~G1RegionsOnNodes(); - // Increase _count_per_node for the node of given heap region and returns node index. - uint add(G1HeapRegion* hr); + // Increase _count_per_node for the node of given heap region. + void add(G1HeapRegion* hr); void clear(); diff --git a/src/hotspot/share/gc/g1/g1SurvivorRegions.cpp b/src/hotspot/share/gc/g1/g1SurvivorRegions.cpp index 4aa752e5823..84609df4fc9 100644 --- a/src/hotspot/share/gc/g1/g1SurvivorRegions.cpp +++ b/src/hotspot/share/gc/g1/g1SurvivorRegions.cpp @@ -32,10 +32,10 @@ G1SurvivorRegions::G1SurvivorRegions() : _used_bytes(0), _regions_on_node() {} -uint G1SurvivorRegions::add(G1HeapRegion* hr) { +void G1SurvivorRegions::add(G1HeapRegion* hr) { assert(hr->is_survivor(), "should be flagged as survivor region"); _regions.append(hr); - return _regions_on_node.add(hr); + _regions_on_node.add(hr); } uint G1SurvivorRegions::length() const { diff --git a/src/hotspot/share/gc/g1/g1SurvivorRegions.hpp b/src/hotspot/share/gc/g1/g1SurvivorRegions.hpp index 0532ee12162..65c20dfbf45 100644 --- a/src/hotspot/share/gc/g1/g1SurvivorRegions.hpp +++ b/src/hotspot/share/gc/g1/g1SurvivorRegions.hpp @@ -42,7 +42,7 @@ class G1SurvivorRegions { public: G1SurvivorRegions(); - uint add(G1HeapRegion* hr); + void add(G1HeapRegion* hr); void convert_to_eden(); From 3e3822ad7eadbb3d86a3b94a6bd858f8c8ef9364 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Wed, 5 Nov 2025 11:55:02 +0000 Subject: [PATCH 464/561] 8365047: Remove exception handler stub code in C2 Co-authored-by: Martin Doerr Reviewed-by: mdoerr, dlong, dfenacci, adinn, fyang, aph --- src/hotspot/cpu/aarch64/aarch64.ad | 39 ++--- .../cpu/aarch64/c1_LIRAssembler_aarch64.cpp | 12 +- .../cpu/aarch64/c1_LIRAssembler_aarch64.hpp | 2 +- .../cpu/aarch64/nativeInst_aarch64.cpp | 6 - .../cpu/aarch64/nativeInst_aarch64.hpp | 22 ++- src/hotspot/cpu/aarch64/runtime_aarch64.cpp | 2 - src/hotspot/cpu/arm/arm.ad | 47 ++---- src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp | 10 +- src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp | 2 +- src/hotspot/cpu/arm/runtime_arm.cpp | 2 - src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp | 7 +- src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp | 2 +- src/hotspot/cpu/ppc/ppc.ad | 35 ++-- src/hotspot/cpu/ppc/runtime_ppc.cpp | 1 - src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp | 19 +-- .../cpu/riscv/c1_LIRAssembler_riscv.cpp | 12 +- .../cpu/riscv/c1_LIRAssembler_riscv.hpp | 2 +- src/hotspot/cpu/riscv/riscv.ad | 37 +--- src/hotspot/cpu/riscv/runtime_riscv.cpp | 2 - src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp | 15 +- src/hotspot/cpu/s390/runtime_s390.cpp | 2 - src/hotspot/cpu/s390/s390.ad | 54 ++---- src/hotspot/cpu/s390/sharedRuntime_s390.cpp | 6 +- src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp | 14 +- src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp | 2 +- src/hotspot/cpu/x86/runtime_x86_64.cpp | 2 - src/hotspot/cpu/x86/x86.ad | 51 ++---- src/hotspot/os/posix/signals_posix.cpp | 2 +- src/hotspot/os/windows/os_windows.cpp | 2 +- src/hotspot/share/ci/ciEnv.cpp | 4 +- src/hotspot/share/code/nmethod.cpp | 23 ++- src/hotspot/share/code/nmethod.hpp | 4 +- src/hotspot/share/code/nmethod.inline.hpp | 2 +- src/hotspot/share/opto/output.cpp | 6 +- src/hotspot/share/runtime/deoptimization.cpp | 3 + src/hotspot/share/runtime/frame.cpp | 4 +- src/hotspot/share/runtime/sharedRuntime.cpp | 8 + src/hotspot/share/runtime/vmStructs.cpp | 2 +- .../classes/sun/jvm/hotspot/code/NMethod.java | 28 +-- .../sun/jvm/hotspot/runtime/Frame.java | 2 +- .../jtreg/runtime/vthread/Deoptimization.java | 159 ++++++++++++++++++ 41 files changed, 354 insertions(+), 302 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/vthread/Deoptimization.java diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 5734519301e..1e506edb634 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -1,6 +1,7 @@ // // Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2014, 2024, Red Hat, Inc. All rights reserved. +// Copyright 2025 Arm Limited and/or its affiliates. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -1194,15 +1195,10 @@ class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - return MacroAssembler::far_codestub_branch_size(); - } - static uint size_deopt_handler() { - // count one adr and one far branch instruction + // count one branch instruction and one far call instruction sequence return NativeInstruction::instruction_size + MacroAssembler::far_codestub_branch_size(); } }; @@ -2261,25 +2257,6 @@ uint MachUEPNode::size(PhaseRegAlloc* ra_) const //============================================================================= -// Emit exception handler code. -int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) -{ - // mov rscratch1 #exception_blob_entry_point - // br rscratch1 - // Note that the code buffer's insts_mark is always relative to insts. - // That's why we must use the macroassembler to generate a handler. - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - int offset = __ offset(); - __ far_jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); - assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); - __ end_a_stub(); - return offset; -} - // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2290,14 +2267,18 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) ciEnv::current()->record_failure("CodeCache is full"); return 0; // CodeBuffer::expand failed } - int offset = __ offset(); - __ adr(lr, __ pc()); - __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + int offset = __ offset(); + Label start; + __ bind(start); + __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + __ b(start); assert(__ offset() - offset == (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } // REQUIRED MATCHER CODE diff --git a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp index 9ab463125fe..2498a646e31 100644 --- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp @@ -449,12 +449,18 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); - __ adr(lr, pc()); - __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + Label start; + __ bind(start); + + __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + __ b(start); + guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } void LIR_Assembler::add_debug_info_for_branch(address adr, CodeEmitInfo* info) { diff --git a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp index 12b941fc4f7..729cd2827b7 100644 --- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp @@ -71,7 +71,7 @@ friend class ArrayCopyStub; // CompiledDirectCall::to_trampoline_stub_size() _call_stub_size = 13 * NativeInstruction::instruction_size, _exception_handler_size = DEBUG_ONLY(1*K) NOT_DEBUG(175), - _deopt_handler_size = 7 * NativeInstruction::instruction_size + _deopt_handler_size = 4 * NativeInstruction::instruction_size }; public: diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp index 5a7fececafa..f2003dd9b55 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp @@ -394,12 +394,6 @@ void NativePostCallNop::make_deopt() { NativeDeoptInstruction::insert(addr_at(0)); } -#ifdef ASSERT -static bool is_movk_to_zr(uint32_t insn) { - return ((insn & 0xffe0001f) == 0xf280001f); -} -#endif - bool NativePostCallNop::patch(int32_t oopmap_slot, int32_t cb_offset) { if (((oopmap_slot & 0xff) != oopmap_slot) || ((cb_offset & 0xffffff) != cb_offset)) { return false; // cannot encode diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp index df5d97c2376..b7444347bf1 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp @@ -526,14 +526,24 @@ inline NativeLdSt* NativeLdSt_at(address addr) { // can store an offset from the initial nop to the nmethod. class NativePostCallNop: public NativeInstruction { +private: + static bool is_movk_to_zr(uint32_t insn) { + return ((insn & 0xffe0001f) == 0xf280001f); + } + public: bool check() const { - uint64_t insns = *(uint64_t*)addr_at(0); - // Check for two instructions: nop; movk zr, xx - // These instructions only ever appear together in a post-call - // NOP, so it's unnecessary to check that the third instruction is - // a MOVK as well. - return (insns & 0xffe0001fffffffff) == 0xf280001fd503201f; + // Check the first instruction is NOP. + if (is_nop()) { + uint32_t insn = *(uint32_t*)addr_at(4); + // Check next instruction is MOVK zr, xx. + // These instructions only ever appear together in a post-call + // NOP, so it's unnecessary to check that the third instruction is + // a MOVK as well. + return is_movk_to_zr(insn); + } + + return false; } bool decode(int32_t& oopmap_slot, int32_t& cb_offset) const { diff --git a/src/hotspot/cpu/aarch64/runtime_aarch64.cpp b/src/hotspot/cpu/aarch64/runtime_aarch64.cpp index d45f9865bd2..e36aa21b567 100644 --- a/src/hotspot/cpu/aarch64/runtime_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/runtime_aarch64.cpp @@ -260,8 +260,6 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end -// Using exception blob, this code is jumped from a compiled method. -// (see emit_exception_handler in aarch64.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/arm/arm.ad b/src/hotspot/cpu/arm/arm.ad index 31a442be624..eb9b0ed8fba 100644 --- a/src/hotspot/cpu/arm/arm.ad +++ b/src/hotspot/cpu/arm/arm.ad @@ -105,14 +105,8 @@ class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - return ( 3 * 4 ); - } - - static uint size_deopt_handler() { return ( 9 * 4 ); } @@ -876,26 +870,6 @@ uint MachUEPNode::size(PhaseRegAlloc *ra_) const { //============================================================================= -// Emit exception handler code. -int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) { - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - - int offset = __ offset(); - - // OK to trash LR, because exception blob will kill it - __ jump(OptoRuntime::exception_blob()->entry_point(), relocInfo::runtime_call_type, LR_tmp); - - assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); - - __ end_a_stub(); - - return offset; -} - int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { // Can't use any of the current frame's registers as we may have deopted // at a poll and everything can be live. @@ -906,19 +880,26 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); - address deopt_pc = __ pc(); - __ sub(SP, SP, wordSize); // make room for saved PC - __ push(LR); // save LR that may be live when we get here - __ mov_relative_address(LR, deopt_pc); - __ str(LR, Address(SP, wordSize)); // save deopt PC - __ pop(LR); // restore LR + Label start; + __ bind(start); + __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); + int entry_offset = __ offset(); + address deopt_pc = __ pc(); + // Preserve R0 and reserve space for the address of the entry point + __ push(RegisterSet(R0) | RegisterSet(R1)); + // Store the entry point address + __ mov_relative_address(R0, deopt_pc); + __ str(R0, Address(SP, wordSize)); + __ pop(R0); // restore R0 + __ b(start); + assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } bool Matcher::match_rule_supported(int opcode) { diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp index 219c49d1f14..1d7c1579502 100644 --- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp @@ -272,14 +272,20 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); + Label start; + __ bind(start); + + __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); + + int entry_offset = __ offset(); __ mov_relative_address(LR, __ pc()); __ push(LR); // stub expects LR to be saved - __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); + __ b(start); assert(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp index 77d13532685..615d2f188ff 100644 --- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp +++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp @@ -54,7 +54,7 @@ enum { _call_stub_size = 16, _exception_handler_size = PRODUCT_ONLY(68) NOT_PRODUCT(68+60), - _deopt_handler_size = 16 + _deopt_handler_size = 20 }; public: diff --git a/src/hotspot/cpu/arm/runtime_arm.cpp b/src/hotspot/cpu/arm/runtime_arm.cpp index 8d48de5795a..29fd0aa0a10 100644 --- a/src/hotspot/cpu/arm/runtime_arm.cpp +++ b/src/hotspot/cpu/arm/runtime_arm.cpp @@ -182,8 +182,6 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------ generate_exception_blob --------------------------- // creates exception blob at the end -// Using exception blob, this code is jumped from a compiled method. -// (see emit_exception_handler in sparc.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp index 108da2039f6..7898500cff2 100644 --- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp @@ -264,12 +264,17 @@ int LIR_Assembler::emit_deopt_handler() { } int offset = code_offset(); + Label start; + + __ bind(start); __ bl64_patchable(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type); + int entry_offset = __ offset(); + __ b(start); guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } diff --git a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp index e4de2eb5c46..6a2f6264850 100644 --- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp @@ -63,7 +63,7 @@ enum { _static_call_stub_size = 4 * BytesPerInstWord + MacroAssembler::b64_patchable_size, // or smaller _call_stub_size = _static_call_stub_size + MacroAssembler::trampoline_stub_size, // or smaller _exception_handler_size = MacroAssembler::b64_patchable_size, // or smaller - _deopt_handler_size = MacroAssembler::bl64_patchable_size + _deopt_handler_size = MacroAssembler::bl64_patchable_size + BytesPerInstWord }; // '_static_call_stub_size' is only used on ppc (see LIR_Assembler::emit_static_call_stub() diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 75566b2dd80..5488dbdb8c0 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -2088,17 +2088,11 @@ class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - // The exception_handler is a b64_patchable. - return MacroAssembler::b64_patchable_size; - } - static uint size_deopt_handler() { // The deopt_handler is a bl64_patchable. - return MacroAssembler::bl64_patchable_size; + return MacroAssembler::bl64_patchable_size + BytesPerInstWord; } }; @@ -2114,22 +2108,6 @@ public: source %{ -int HandlerImpl::emit_exception_handler(C2_MacroAssembler *masm) { - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - - int offset = __ offset(); - __ b64_patchable((address)OptoRuntime::exception_blob()->content_begin(), - relocInfo::runtime_call_type); - assert(__ offset() - offset == (int)size_exception_handler(), "must be fixed size"); - __ end_a_stub(); - - return offset; -} - // The deopt_handler is like the exception handler, but it calls to // the deoptimization blob instead of jumping to the exception blob. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2140,12 +2118,21 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); + + Label start; + __ bind(start); + __ bl64_patchable((address)SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type); + + int entry_offset = __ offset(); + + __ b(start); + assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size"); __ end_a_stub(); - return offset; + return entry_offset; } //============================================================================= diff --git a/src/hotspot/cpu/ppc/runtime_ppc.cpp b/src/hotspot/cpu/ppc/runtime_ppc.cpp index 2654075f702..ab658e9de58 100644 --- a/src/hotspot/cpu/ppc/runtime_ppc.cpp +++ b/src/hotspot/cpu/ppc/runtime_ppc.cpp @@ -46,7 +46,6 @@ //------------------------------generate_exception_blob--------------------------- // Creates exception blob at the end. -// Using exception blob, this code is jumped from a compiled method. // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp index 9fe7e1f22ff..4be3a0aee8b 100644 --- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp @@ -83,7 +83,6 @@ class RegisterSaver { static OopMap* push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map, - int return_pc_adjustment, ReturnPCLocation return_pc_location, bool save_vectors = false); static void restore_live_registers_and_pop_frame(MacroAssembler* masm, @@ -262,7 +261,6 @@ static const RegisterSaver::LiveRegType RegisterSaver_LiveVecRegs[] = { OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map, - int return_pc_adjustment, ReturnPCLocation return_pc_location, bool save_vectors) { // Push an abi_reg_args-frame and store all registers which may be live. @@ -271,7 +269,6 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble // propagated to the RegisterMap of the caller frame during // StackFrameStream construction (needed for deoptimization; see // compiledVFrame::create_stack_value). - // If return_pc_adjustment != 0 adjust the return pc by return_pc_adjustment. // Updated return pc is returned in R31 (if not return_pc_is_pre_saved). // calculate frame size @@ -305,14 +302,11 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble // Do the save_LR by hand and adjust the return pc if requested. switch (return_pc_location) { case return_pc_is_lr: __ mflr(R31); break; - case return_pc_is_pre_saved: assert(return_pc_adjustment == 0, "unsupported"); break; + case return_pc_is_pre_saved: break; case return_pc_is_thread_saved_exception_pc: __ ld(R31, thread_(saved_exception_pc)); break; default: ShouldNotReachHere(); } if (return_pc_location != return_pc_is_pre_saved) { - if (return_pc_adjustment != 0) { - __ addi(R31, R31, return_pc_adjustment); - } __ std(R31, frame_size_in_bytes + _abi0(lr), R1_SP); } @@ -2907,22 +2901,15 @@ void SharedRuntime::generate_deopt_blob() { // deopt_handler: call_deopt_stub // cur. return pc --> ... // - // So currently SR_LR points behind the call in the deopt handler. - // We adjust it such that it points to the start of the deopt handler. // The return_pc has been stored in the frame of the deoptee and // will replace the address of the deopt_handler in the call // to Deoptimization::fetch_unroll_info below. - // We can't grab a free register here, because all registers may - // contain live values, so let the RegisterSaver do the adjustment - // of the return pc. - const int return_pc_adjustment_no_exception = -MacroAssembler::bl64_patchable_size; // Push the "unpack frame" // Save everything in sight. map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ true, - return_pc_adjustment_no_exception, RegisterSaver::return_pc_is_lr); assert(map != nullptr, "OopMap must have been created"); @@ -2957,7 +2944,6 @@ void SharedRuntime::generate_deopt_blob() { RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ false, - /*return_pc_adjustment_exception=*/ 0, RegisterSaver::return_pc_is_pre_saved); // Deopt during an exception. Save exec mode for unpack_frames. @@ -2975,7 +2961,6 @@ void SharedRuntime::generate_deopt_blob() { RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ false, - /*return_pc_adjustment_reexecute=*/ 0, RegisterSaver::return_pc_is_pre_saved); __ li(exec_mode_reg, Deoptimization::Unpack_reexecute); #endif @@ -3266,7 +3251,6 @@ SafepointBlob* SharedRuntime::generate_handler_blob(StubId id, address call_ptr) map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &frame_size_in_bytes, /*generate_oop_map=*/ true, - /*return_pc_adjustment=*/0, return_pc_location, save_vectors); // The following is basically a call_VM. However, we need the precise @@ -3367,7 +3351,6 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(StubId id, address destination map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &frame_size_in_bytes, /*generate_oop_map*/ true, - /*return_pc_adjustment*/ 0, RegisterSaver::return_pc_is_lr); // Use noreg as last_Java_pc, the return pc will be reconstructed diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp index 9d8ae770ccf..b085dd7ac00 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp @@ -377,12 +377,18 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); - __ auipc(ra, 0); - __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + Label start; + __ bind(start); + + __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + __ j(start); + guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) { diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp index e4efb2c171d..ed2ab0c4861 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp @@ -72,7 +72,7 @@ private: // See emit_exception_handler for detail _exception_handler_size = DEBUG_ONLY(256) NOT_DEBUG(32), // or smaller // See emit_deopt_handler for detail - // auipc (1) + far_jump (2) + // far_call (2) + j (1) _deopt_handler_size = 1 * MacroAssembler::instruction_size + 2 * MacroAssembler::instruction_size }; diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 4be408f6ca5..34177701900 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1049,15 +1049,10 @@ class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - return MacroAssembler::far_branch_size(); - } - static uint size_deopt_handler() { - // count auipc + far branch + // count far call + j return NativeInstruction::instruction_size + MacroAssembler::far_branch_size(); } }; @@ -1838,25 +1833,6 @@ uint MachUEPNode::size(PhaseRegAlloc* ra_) const //============================================================================= -// Emit exception handler code. -int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) -{ - // auipc t1, #exception_blob_entry_point - // jr (offset)t1 - // Note that the code buffer's insts_mark is always relative to insts. - // That's why we must use the macroassembler to generate a handler. - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - int offset = __ offset(); - __ far_jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); - assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); - __ end_a_stub(); - return offset; -} - // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -1867,12 +1843,17 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) } int offset = __ offset(); - __ auipc(ra, 0); - __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + Label start; + __ bind(start); + + __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + __ j(start); assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } // REQUIRED MATCHER CODE diff --git a/src/hotspot/cpu/riscv/runtime_riscv.cpp b/src/hotspot/cpu/riscv/runtime_riscv.cpp index e1add8dbb82..c52d5a31066 100644 --- a/src/hotspot/cpu/riscv/runtime_riscv.cpp +++ b/src/hotspot/cpu/riscv/runtime_riscv.cpp @@ -249,8 +249,6 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end -// Using exception blob, this code is jumped from a compiled method. -// (see emit_exception_handler in riscv.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp index 298234156c3..ee6df63d21b 100644 --- a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp @@ -272,14 +272,25 @@ int LIR_Assembler::emit_deopt_handler() { // Not enough space left for the handler. bailout("deopt handler overflow"); return -1; - } int offset = code_offset(); + } + + int offset = code_offset(); + + Label start; + __ bind(start); + // Size must be constant (see HandlerImpl::emit_deopt_handler). __ load_const(Z_R1_scratch, SharedRuntime::deopt_blob()->unpack()); __ call(Z_R1_scratch); + + int entry_offset = __ offset(); + + __ z_bru(start); + guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } void LIR_Assembler::jobject2reg(jobject o, Register reg) { diff --git a/src/hotspot/cpu/s390/runtime_s390.cpp b/src/hotspot/cpu/s390/runtime_s390.cpp index 314c407af91..658fba069b4 100644 --- a/src/hotspot/cpu/s390/runtime_s390.cpp +++ b/src/hotspot/cpu/s390/runtime_s390.cpp @@ -43,8 +43,6 @@ //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end -// Using exception blob, this code is jumped from a compiled method. -// (see emit_exception_handler in s390.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index ab991896b53..0c4939d8432 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -1649,15 +1649,10 @@ source_hpp %{ // Header information of the source block. class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - return NativeJump::max_instruction_size(); - } - static uint size_deopt_handler() { - return NativeCall::max_instruction_size(); + return NativeCall::max_instruction_size() + MacroAssembler::jump_pcrelative_size(); } }; @@ -1672,43 +1667,6 @@ public: source %{ -// This exception handler code snippet is placed after the method's -// code. It is the return point if an exception occurred. it jumps to -// the exception blob. -// -// If the method gets deoptimized, the method and this code snippet -// get patched. -// -// 1) Trampoline code gets patched into the end of this exception -// handler. the trampoline code jumps to the deoptimization blob. -// -// 2) The return address in the method's code will get patched such -// that it jumps to the trampoline. -// -// 3) The handler will get patched such that it does not jump to the -// exception blob, but to an entry in the deoptimization blob being -// aware of the exception. -int HandlerImpl::emit_exception_handler(C2_MacroAssembler *masm) { - Register temp_reg = Z_R1; - - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - - int offset = __ offset(); - // Use unconditional pc-relative jump with 32-bit range here. - __ load_const_optimized(temp_reg, (address)OptoRuntime::exception_blob()->content_begin()); - __ z_br(temp_reg); - - assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); - - __ end_a_stub(); - - return offset; -} - // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { address base = __ start_a_stub(size_deopt_handler()); @@ -1720,14 +1678,22 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { int offset = __ offset(); + Label start; + __ bind(start); + // Size_deopt_handler() must be exact on zarch, so for simplicity // we do not use load_const_opt here. __ load_const(Z_R1, SharedRuntime::deopt_blob()->unpack()); __ call(Z_R1); + + int entry_offset = __ offset(); + + __ z_bru(start); + assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size"); __ end_a_stub(); - return offset; + return entry_offset; } //============================================================================= diff --git a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp index db1ee8351ac..3a6e1bff8f4 100644 --- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp @@ -2544,14 +2544,10 @@ void SharedRuntime::generate_deopt_blob() { // Normal entry (non-exception case) // // We have been called from the deopt handler of the deoptee. - // Z_R14 points behind the call in the deopt handler. We adjust - // it such that it points to the start of the deopt handler. + // Z_R14 points to the entry point of the deopt handler. // The return_pc has been stored in the frame of the deoptee and // will replace the address of the deopt_handler in the call // to Deoptimization::fetch_unroll_info below. - // The (int) cast is necessary, because -((unsigned int)14) - // is an unsigned int. - __ add2reg(Z_R14, -(int)NativeCall::max_instruction_size()); const Register exec_mode_reg = Z_tmp_1; diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp index edeb0baea0e..6600d841050 100644 --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp @@ -450,14 +450,20 @@ int LIR_Assembler::emit_deopt_handler() { } int offset = code_offset(); - InternalAddress here(__ pc()); - __ pushptr(here.addr(), rscratch1); - __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + Label start; + __ bind(start); + + __ call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + + __ jmp(start); + guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return offset; + return entry_offset; } void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) { diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp index 8524dc90276..7a8fbc75ba7 100644 --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp @@ -48,7 +48,7 @@ enum { _call_stub_size = 28, _exception_handler_size = DEBUG_ONLY(1*K) NOT_DEBUG(175), - _deopt_handler_size = 17 + _deopt_handler_size = 10 }; public: diff --git a/src/hotspot/cpu/x86/runtime_x86_64.cpp b/src/hotspot/cpu/x86/runtime_x86_64.cpp index 7b98cf4fad7..5bf65299a0c 100644 --- a/src/hotspot/cpu/x86/runtime_x86_64.cpp +++ b/src/hotspot/cpu/x86/runtime_x86_64.cpp @@ -242,8 +242,6 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end -// Using exception blob, this code is jumped from a compiled method. -// (see emit_exception_handler in x86_64.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index 064c52e658b..ca94b03a841 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -2767,21 +2767,11 @@ class HandlerImpl { public: - static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); - static uint size_exception_handler() { - // NativeCall instruction size is the same as NativeJump. - // exception handler starts out as jump and can be patched to - // a call be deoptimization. (4932387) - // Note that this value is also credited (in output.cpp) to - // the size of the code section. - return NativeJump::instruction_size; - } - static uint size_deopt_handler() { - // three 5 byte instructions plus one move for unreachable address. - return 15+3; + // one call and one jmp. + return 10; } }; @@ -2873,24 +2863,6 @@ int MachNode::compute_padding(int current_offset) const { } } -// Emit exception handler code. -// Stuff framesize into a register and call a VM stub routine. -int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) { - - // Note that the code buffer's insts_mark is always relative to insts. - // That's why we must use the macroassembler to generate a handler. - address base = __ start_a_stub(size_exception_handler()); - if (base == nullptr) { - ciEnv::current()->record_failure("CodeCache is full"); - return 0; // CodeBuffer::expand failed - } - int offset = __ offset(); - __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); - assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); - __ end_a_stub(); - return offset; -} - // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2903,21 +2875,18 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); - address the_pc = (address) __ pc(); - Label next; - // push a "the_pc" on the stack without destroying any registers - // as they all may be live. + Label start; + __ bind(start); - // push address of "next" - __ call(next, relocInfo::none); // reloc none is fine since it is a disp32 - __ bind(next); - // adjust it so it matches "the_pc" - __ subptr(Address(rsp, 0), __ offset() - offset); + __ call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); + + int entry_offset = __ offset(); + + __ jmp(start); - __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow %d", (__ offset() - offset)); __ end_a_stub(); - return offset; + return entry_offset; } static Assembler::Width widthForType(BasicType bt) { diff --git a/src/hotspot/os/posix/signals_posix.cpp b/src/hotspot/os/posix/signals_posix.cpp index 5833e324070..625eb63445a 100644 --- a/src/hotspot/os/posix/signals_posix.cpp +++ b/src/hotspot/os/posix/signals_posix.cpp @@ -621,7 +621,7 @@ int JVM_HANDLE_XXX_SIGNAL(int sig, siginfo_t* info, if (cb != nullptr && cb->is_nmethod()) { nmethod* nm = cb->as_nmethod(); assert(nm->insts_contains_inclusive(pc), ""); - address deopt = nm->deopt_handler_begin(); + address deopt = nm->deopt_handler_entry(); assert(deopt != nullptr, ""); frame fr = os::fetch_frame_from_context(uc); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index ce2baeaf46c..4b84e2fdfdb 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -2795,7 +2795,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { if (cb != nullptr && cb->is_nmethod()) { nmethod* nm = cb->as_nmethod(); frame fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord); - address deopt = nm->deopt_handler_begin(); + address deopt = nm->deopt_handler_entry(); assert(nm->insts_contains_inclusive(pc), ""); nm->set_original_pc(&fr, pc); // Set pc to handler diff --git a/src/hotspot/share/ci/ciEnv.cpp b/src/hotspot/share/ci/ciEnv.cpp index 79ab881e7f6..92bacc4c2c3 100644 --- a/src/hotspot/share/ci/ciEnv.cpp +++ b/src/hotspot/share/ci/ciEnv.cpp @@ -1057,7 +1057,9 @@ void ciEnv::register_method(ciMethod* target, } assert(offsets->value(CodeOffsets::Deopt) != -1, "must have deopt entry"); - assert(offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry"); + + assert(compiler->type() == compiler_c2 || + offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry"); nm = nmethod::new_nmethod(method, compile_id(), diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index d91af9b4991..c2f8b46f00e 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1302,7 +1302,7 @@ nmethod::nmethod( } // Native wrappers do not have deopt handlers. Make the values // something that will never match a pc like the nmethod vtable entry - _deopt_handler_offset = 0; + _deopt_handler_entry_offset = 0; _unwind_handler_offset = 0; CHECKED_CAST(_oops_size, uint16_t, align_up(code_buffer->total_oop_size(), oopSize)); @@ -1442,7 +1442,7 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. _skipped_instructions_size = nm._skipped_instructions_size; _stub_offset = nm._stub_offset; _exception_offset = nm._exception_offset; - _deopt_handler_offset = nm._deopt_handler_offset; + _deopt_handler_entry_offset = nm._deopt_handler_entry_offset; _unwind_handler_offset = nm._unwind_handler_offset; _num_stack_arg_slots = nm._num_stack_arg_slots; _oops_size = nm._oops_size; @@ -1704,19 +1704,26 @@ nmethod::nmethod( _exception_offset = -1; } if (offsets->value(CodeOffsets::Deopt) != -1) { - _deopt_handler_offset = code_offset() + offsets->value(CodeOffsets::Deopt); + _deopt_handler_entry_offset = code_offset() + offsets->value(CodeOffsets::Deopt); } else { - _deopt_handler_offset = -1; + _deopt_handler_entry_offset = -1; } } else #endif { // Exception handler and deopt handler are in the stub section - assert(offsets->value(CodeOffsets::Exceptions) != -1, "must be set"); assert(offsets->value(CodeOffsets::Deopt ) != -1, "must be set"); - _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); - _deopt_handler_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); + bool has_exception_handler = (offsets->value(CodeOffsets::Exceptions) != -1); + assert(has_exception_handler == (compiler->type() != compiler_c2), + "C2 compiler doesn't provide exception handler stub code."); + if (has_exception_handler) { + _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); + } else { + _exception_offset = -1; + } + + _deopt_handler_entry_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); } if (offsets->value(CodeOffsets::UnwindHandler) != -1) { // C1 generates UnwindHandler at the end of instructions section. @@ -4024,7 +4031,7 @@ const char* nmethod::nmethod_section_label(address pos) const { // Check stub_code before checking exception_handler or deopt_handler. if (pos == this->stub_begin()) label = "[Stub Code]"; if (JVMCI_ONLY(_exception_offset >= 0 &&) pos == exception_begin()) label = "[Exception Handler]"; - if (JVMCI_ONLY(_deopt_handler_offset != -1 &&) pos == deopt_handler_begin()) label = "[Deopt Handler Code]"; + if (JVMCI_ONLY(_deopt_handler_entry_offset != -1 &&) pos == deopt_handler_entry()) label = "[Deopt Handler Entry Point]"; return label; } diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 34accf428b6..0fa9d7fda9e 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -229,7 +229,7 @@ class nmethod : public CodeBlob { int _exception_offset; // All deoptee's will resume execution at this location described by // this offset. - int _deopt_handler_offset; + int _deopt_handler_entry_offset; // Offset (from insts_end) of the unwind handler if it exists int16_t _unwind_handler_offset; // Number of arguments passed on the stack @@ -617,7 +617,7 @@ public: address stub_begin () const { return header_begin() + _stub_offset ; } address stub_end () const { return code_end() ; } address exception_begin () const { return header_begin() + _exception_offset ; } - address deopt_handler_begin () const { return header_begin() + _deopt_handler_offset ; } + address deopt_handler_entry () const { return header_begin() + _deopt_handler_entry_offset ; } address unwind_handler_begin () const { return _unwind_handler_offset != -1 ? (insts_end() - _unwind_handler_offset) : nullptr; } oop* oops_begin () const { return (oop*) data_begin(); } oop* oops_end () const { return (oop*) data_end(); } diff --git a/src/hotspot/share/code/nmethod.inline.hpp b/src/hotspot/share/code/nmethod.inline.hpp index 44331db669c..ecee3c0c31a 100644 --- a/src/hotspot/share/code/nmethod.inline.hpp +++ b/src/hotspot/share/code/nmethod.inline.hpp @@ -34,7 +34,7 @@ inline bool nmethod::is_deopt_pc(address pc) { return is_deopt_entry(pc); } inline bool nmethod::is_deopt_entry(address pc) { - return pc == deopt_handler_begin(); + return pc == deopt_handler_entry(); } // class ExceptionCache methods diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index 84c01c68e38..136fc8ac864 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -1347,20 +1347,18 @@ CodeBuffer* PhaseOutput::init_buffer() { // nmethod and CodeBuffer count stubs & constants as part of method's code. // class HandlerImpl is platform-specific and defined in the *.ad files. - int exception_handler_req = HandlerImpl::size_exception_handler() + MAX_stubs_size; // add marginal slop for handler int deopt_handler_req = HandlerImpl::size_deopt_handler() + MAX_stubs_size; // add marginal slop for handler stub_req += MAX_stubs_size; // ensure per-stub margin code_req += MAX_inst_size; // ensure per-instruction margin if (StressCodeBuffers) - code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion + code_req = const_req = stub_req = deopt_handler_req = 0x10; // force expansion int total_req = const_req + code_req + pad_req + stub_req + - exception_handler_req + deopt_handler_req; // deopt handler CodeBuffer* cb = code_buffer(); @@ -1789,8 +1787,6 @@ void PhaseOutput::fill_buffer(C2_MacroAssembler* masm, uint* blk_starts) { // Only java methods have exception handlers and deopt handlers // class HandlerImpl is platform-specific and defined in the *.ad files. if (C->method()) { - // Emit the exception handler code. - _code_offsets.set_value(CodeOffsets::Exceptions, HandlerImpl::emit_exception_handler(masm)); if (C->failing()) { return; // CodeBuffer::expand failed } diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 144de698d85..35ccc92f90b 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -499,6 +499,9 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread RegisterMap::WalkContinuation::skip); // Now get the deoptee with a valid map frame deoptee = stub_frame.sender(&map); + if (exec_mode == Unpack_deopt) { + assert(deoptee.is_deoptimized_frame(), "frame is not marked for deoptimization"); + } // Set the deoptee nmethod assert(current->deopt_compiled_method() == nullptr, "Pending deopt!"); nmethod* nm = deoptee.cb()->as_nmethod_or_null(); diff --git a/src/hotspot/share/runtime/frame.cpp b/src/hotspot/share/runtime/frame.cpp index b5cd4acc75d..8f969600ba8 100644 --- a/src/hotspot/share/runtime/frame.cpp +++ b/src/hotspot/share/runtime/frame.cpp @@ -206,7 +206,7 @@ address frame::raw_pc() const { if (is_deoptimized_frame()) { nmethod* nm = cb()->as_nmethod_or_null(); assert(nm != nullptr, "only nmethod is expected here"); - return nm->deopt_handler_begin() - pc_return_offset; + return nm->deopt_handler_entry() - pc_return_offset; } else { return (pc() - pc_return_offset); } @@ -355,7 +355,7 @@ void frame::deoptimize(JavaThread* thread) { // If the call site is a MethodHandle call site use the MH deopt handler. nmethod* nm = _cb->as_nmethod(); - address deopt = nm->deopt_handler_begin(); + address deopt = nm->deopt_handler_entry(); NativePostCallNop* inst = nativePostCallNop_at(pc()); diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index 35bc3f5f1be..a980838ed76 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -87,6 +87,9 @@ #ifdef COMPILER1 #include "c1/c1_Runtime1.hpp" #endif +#ifdef COMPILER2 +#include "opto/runtime.hpp" +#endif #if INCLUDE_JFR #include "jfr/jfr.inline.hpp" #endif @@ -601,6 +604,11 @@ address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* curr // The deferred StackWatermarkSet::after_unwind check will be performed in // * OptoRuntime::handle_exception_C_helper for C2 code // * exception_handler_for_pc_helper via Runtime1::handle_exception_from_callee_id for C1 code +#ifdef COMPILER2 + if (nm->compiler_type() == compiler_c2) { + return OptoRuntime::exception_blob()->entry_point(); + } +#endif // COMPILER2 return nm->exception_begin(); } } diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index a7342448522..2ce6a6cac76 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -535,7 +535,7 @@ nonstatic_field(nmethod, _osr_link, nmethod*) \ nonstatic_field(nmethod, _state, volatile signed char) \ nonstatic_field(nmethod, _exception_offset, int) \ - nonstatic_field(nmethod, _deopt_handler_offset, int) \ + nonstatic_field(nmethod, _deopt_handler_entry_offset, int) \ nonstatic_field(nmethod, _orig_pc_offset, int) \ nonstatic_field(nmethod, _stub_offset, int) \ nonstatic_field(nmethod, _immutable_data_ref_count_offset, int) \ diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java index 91302dba0f6..f935c56b536 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java @@ -48,7 +48,7 @@ public class NMethod extends CodeBlob { /** Offsets for different nmethod parts */ private static CIntegerField exceptionOffsetField; - private static CIntegerField deoptHandlerOffsetField; + private static CIntegerField deoptHandlerEntryOffsetField; private static CIntegerField origPCOffsetField; private static CIntegerField stubOffsetField; private static CIntField handlerTableOffsetField; @@ -86,7 +86,7 @@ public class NMethod extends CodeBlob { immutableDataField = type.getAddressField("_immutable_data"); immutableDataSizeField = type.getCIntegerField("_immutable_data_size"); exceptionOffsetField = type.getCIntegerField("_exception_offset"); - deoptHandlerOffsetField = type.getCIntegerField("_deopt_handler_offset"); + deoptHandlerEntryOffsetField = type.getCIntegerField("_deopt_handler_entry_offset"); origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); stubOffsetField = type.getCIntegerField("_stub_offset"); scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); @@ -121,16 +121,16 @@ public class NMethod extends CodeBlob { public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } /** Boundaries for different parts */ - public Address constantsBegin() { return contentBegin(); } - public Address constantsEnd() { return codeBegin(); } - public Address instsBegin() { return codeBegin(); } - public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } - public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptHandlerOffset()); } - public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address stubEnd() { return dataBegin(); } - public Address oopsBegin() { return dataBegin(); } - public Address oopsEnd() { return dataEnd(); } + public Address constantsBegin() { return contentBegin(); } + public Address constantsEnd() { return codeBegin(); } + public Address instsBegin() { return codeBegin(); } + public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } + public Address deoptHandlerEntry() { return headerBegin().addOffsetTo(getDeoptHandlerEntryOffset()); } + public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address stubEnd() { return dataBegin(); } + public Address oopsBegin() { return dataBegin(); } + public Address oopsEnd() { return dataEnd(); } public Address immutableDataBegin() { return immutableDataField.getValue(addr); } public Address immutableDataEnd() { return immutableDataBegin().addOffsetTo(getImmutableDataSize()); } @@ -262,7 +262,7 @@ public class NMethod extends CodeBlob { // Deopt // Return true is the PC is one would expect if the frame is being deopted. public boolean isDeoptPc (Address pc) { return isDeoptEntry(pc); } - public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerBegin(); } + public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerEntry(); } /** Tells whether frames described by this nmethod can be deoptimized. Note: native wrappers cannot be deoptimized. */ @@ -490,7 +490,7 @@ public class NMethod extends CodeBlob { private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } - private int getDeoptHandlerOffset() { return (int) deoptHandlerOffsetField .getValue(addr); } + private int getDeoptHandlerEntryOffset() { return (int) deoptHandlerEntryOffsetField .getValue(addr); } private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java index 27efb631f79..ee9e0ecdafd 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java @@ -87,7 +87,7 @@ public abstract class Frame implements Cloneable { CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc); if (cb != null && cb.isJavaMethod()) { NMethod nm = (NMethod) cb; - if (pc.equals(nm.deoptHandlerBegin())) { + if (pc.equals(nm.deoptHandlerEntry())) { if (Assert.ASSERTS_ENABLED) { Assert.that(this.getUnextendedSP() != null, "null SP in Java frame"); } diff --git a/test/hotspot/jtreg/runtime/vthread/Deoptimization.java b/test/hotspot/jtreg/runtime/vthread/Deoptimization.java new file mode 100644 index 00000000000..050848c3a72 --- /dev/null +++ b/test/hotspot/jtreg/runtime/vthread/Deoptimization.java @@ -0,0 +1,159 @@ +/* + * Copyright 2025 Arm Limited and/or its affiliates. + * 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. + */ + +/** + * @test id=vthread-deopt-c1 + * @summary Deoptimization test for virtual threads (C1) + * @requires vm.continuations + * @requires vm.compiler1.enabled + * @requires vm.opt.TieredStopAtLevel != 0 + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:-BackgroundCompilation + * -XX:TieredStopAtLevel=1 + * Deoptimization + */ + +/** + * @test id=vthread-deopt-c2 + * @summary Deoptimization test for virtual threads (C2) + * @requires vm.continuations + * @requires vm.compiler2.enabled + * @library /test/lib + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox + * @run main/othervm -Xbootclasspath/a:. + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:-BackgroundCompilation + * -XX:-TieredCompilation + * Deoptimization + */ + +import java.lang.reflect.Method; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.Objects; +import jdk.test.whitebox.WhiteBox; + +public class Deoptimization { + static final WhiteBox white_box = WhiteBox.getWhiteBox(); + + static class TestTask implements Runnable { + CyclicBarrier start_barrier = null; + AtomicInteger completed_number = new AtomicInteger(0); + + public void reset(int barrier_parties) { + start_barrier = new CyclicBarrier(barrier_parties); + completed_number.set(0); + } + + public int getNumberWaiting() { + return start_barrier.getNumberWaiting(); + } + + public int getNumberCompleted() { + return completed_number.get(); + } + + public void await() throws BrokenBarrierException, InterruptedException { + start_barrier.await(); + } + + public void run() { + try { + await(); + } catch(BrokenBarrierException e) { + return; + } catch(InterruptedException e) { + return; + } + + completed_number.getAndIncrement(); + } + } + + static void test(TestTask task, Method method, int vthreads_num) throws Exception { + task.reset(vthreads_num + 1 /* 1 for the main thread */); + + Thread[] vthreads = new Thread[vthreads_num]; + for (int i = 0; i < vthreads_num; i++) { + vthreads[i] = Thread.startVirtualThread(task); + } + + while (task.getNumberWaiting() != vthreads_num) { + Thread.onSpinWait(); + } + + if (method != null) { + if (!white_box.isMethodCompiled(method, false)) { + throw new Error("Unexpectedly, it is not compiled."); + } + + white_box.deoptimizeMethod(method); + + if (white_box.isMethodCompiled(method, false)) { + throw new Error("Unexpectedly, it is compiled."); + } + } + + task.await(); + + for (int i = 0; i < vthreads_num; i++) { + vthreads[i].join(); + } + + if (task.getNumberCompleted() != vthreads_num) { + throw new Error("Some threads didn't reach completion"); + } + } + + static int getIntegerOption(String option_name) { + Object option_object = white_box.getVMFlag(option_name); + String option_string = Objects.toString(option_object); + return Integer.parseInt(option_string); + } + + public static void main(String[] args) throws Exception { + int tiered_stop_at_level = getIntegerOption("TieredStopAtLevel"); + + Method method_run = TestTask.class.getMethod("run"); + white_box.testSetDontInlineMethod(method_run, true); + + Method method_await = TestTask.class.getMethod("await"); + white_box.testSetDontInlineMethod(method_await, true); + + TestTask task = new TestTask(); + + // Warm-up + test(task, null, 2); + + white_box.enqueueMethodForCompilation(method_run, tiered_stop_at_level); + + // Deoptimization test + test(task, method_run, 10000); + } +} From f6f87bb6759c86d941453a1776e8abfdffc48183 Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Wed, 5 Nov 2025 13:01:51 +0000 Subject: [PATCH 465/561] 8371133: Clarify the purpose of "src/jdk.compiler/share/classes/com/sun/tools/javac/resources/ct.properties" Reviewed-by: jlahoda --- .../com/sun/tools/javac/resources/ct.properties | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/ct.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/ct.properties index ba42e8e067c..a8fdd923e2c 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/ct.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/ct.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2016, 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 @@ -23,6 +23,15 @@ # questions. # +# This file was originally used to produce the `proprietary` warning when +# accessing non-APIs, and to hide some non-APIs in JDK <= 8. This has been +# superseded by the module system and `--release`. But, when compiling with +# `--source 8`, it is still used for this purpose by +# `com.sun.tools.javac.file.JRTIndex`. +# +# The build generates `jdk.compiler/com/sun/tools/javac/resources/ct.java` from +# this file, which is then used at runtime. + apple.laf.*: hidden apple.security.*: hidden com.apple.eawt.*: hidden From c9a98169cb79df235316cb38a804d539044ea57e Mon Sep 17 00:00:00 2001 From: Samuel Chee Date: Wed, 5 Nov 2025 13:56:26 +0000 Subject: [PATCH 466/561] 8371205: AArch64: Remove unused cmpxchg* methods Co-authored-by: Samuel Chee Reviewed-by: aph, kbarrett, haosun --- .../cpu/aarch64/macroAssembler_aarch64.cpp | 91 ------------------- .../cpu/aarch64/macroAssembler_aarch64.hpp | 10 -- 2 files changed, 101 deletions(-) diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index e6dd29f105a..c83e6e12fa1 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -3315,97 +3315,6 @@ void MacroAssembler::reinit_heapbase() } } -// this simulates the behaviour of the x86 cmpxchg instruction using a -// load linked/store conditional pair. we use the acquire/release -// versions of these instructions so that we flush pending writes as -// per Java semantics. - -// n.b the x86 version assumes the old value to be compared against is -// in rax and updates rax with the value located in memory if the -// cmpxchg fails. we supply a register for the old value explicitly - -// the aarch64 load linked/store conditional instructions do not -// accept an offset. so, unlike x86, we must provide a plain register -// to identify the memory word to be compared/exchanged rather than a -// register+offset Address. - -void MacroAssembler::cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp, - Label &succeed, Label *fail) { - // oldv holds comparison value - // newv holds value to write in exchange - // addr identifies memory word to compare against/update - if (UseLSE) { - mov(tmp, oldv); - casal(Assembler::xword, oldv, newv, addr); - cmp(tmp, oldv); - br(Assembler::EQ, succeed); - membar(AnyAny); - } else { - Label retry_load, nope; - prfm(Address(addr), PSTL1STRM); - bind(retry_load); - // flush and load exclusive from the memory location - // and fail if it is not what we expect - ldaxr(tmp, addr); - cmp(tmp, oldv); - br(Assembler::NE, nope); - // if we store+flush with no intervening write tmp will be zero - stlxr(tmp, newv, addr); - cbzw(tmp, succeed); - // retry so we only ever return after a load fails to compare - // ensures we don't return a stale value after a failed write. - b(retry_load); - // if the memory word differs we return it in oldv and signal a fail - bind(nope); - membar(AnyAny); - mov(oldv, tmp); - } - if (fail) - b(*fail); -} - -void MacroAssembler::cmpxchg_obj_header(Register oldv, Register newv, Register obj, Register tmp, - Label &succeed, Label *fail) { - assert(oopDesc::mark_offset_in_bytes() == 0, "assumption"); - cmpxchgptr(oldv, newv, obj, tmp, succeed, fail); -} - -void MacroAssembler::cmpxchgw(Register oldv, Register newv, Register addr, Register tmp, - Label &succeed, Label *fail) { - // oldv holds comparison value - // newv holds value to write in exchange - // addr identifies memory word to compare against/update - // tmp returns 0/1 for success/failure - if (UseLSE) { - mov(tmp, oldv); - casal(Assembler::word, oldv, newv, addr); - cmp(tmp, oldv); - br(Assembler::EQ, succeed); - membar(AnyAny); - } else { - Label retry_load, nope; - prfm(Address(addr), PSTL1STRM); - bind(retry_load); - // flush and load exclusive from the memory location - // and fail if it is not what we expect - ldaxrw(tmp, addr); - cmp(tmp, oldv); - br(Assembler::NE, nope); - // if we store+flush with no intervening write tmp will be zero - stlxrw(tmp, newv, addr); - cbzw(tmp, succeed); - // retry so we only ever return after a load fails to compare - // ensures we don't return a stale value after a failed write. - b(retry_load); - // if the memory word differs we return it in oldv and signal a fail - bind(nope); - membar(AnyAny); - mov(oldv, tmp); - } - if (fail) - b(*fail); -} - // A generic CAS; success or failure is in the EQ flag. A weak CAS // doesn't retry and may fail spuriously. If the oldval is wanted, // Pass a register for the result, otherwise pass noreg. diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index 7bfc6c562e3..4468eaa40c5 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -1200,16 +1200,6 @@ public: void cmpoop(Register obj1, Register obj2); - // Various forms of CAS - - void cmpxchg_obj_header(Register oldv, Register newv, Register obj, Register tmp, - Label &succeed, Label *fail); - void cmpxchgptr(Register oldv, Register newv, Register addr, Register tmp, - Label &succeed, Label *fail); - - void cmpxchgw(Register oldv, Register newv, Register addr, Register tmp, - Label &succeed, Label *fail); - void atomic_add(Register prev, RegisterOrConstant incr, Register addr); void atomic_addw(Register prev, RegisterOrConstant incr, Register addr); void atomic_addal(Register prev, RegisterOrConstant incr, Register addr); From 2dd15cf5bf1614e4b74ad9675723562e14ced8ab Mon Sep 17 00:00:00 2001 From: Magnus Ihse Bursie Date: Wed, 5 Nov 2025 13:57:18 +0000 Subject: [PATCH 467/561] 8346719: Add relaunchers to the static JDK image for missing executables Reviewed-by: alanb, erikj --- make/Main.gmk | 6 +- make/StaticLibs.gmk | 117 ++++++++- make/common/modules/LauncherCommon.gmk | 60 ++++- make/modules/java.base/Launcher.gmk | 2 +- make/modules/jdk.jpackage/Lib.gmk | 1 - src/java.base/share/native/launcher/defines.h | 75 ------ src/java.base/share/native/launcher/main.c | 88 ++++++- .../unix/native/launcher/relauncher.c | 113 ++++++++ src/java.base/unix/native/libjli/java_md.c | 6 +- .../windows/native/launcher/relauncher.c | 246 ++++++++++++++++++ test/hotspot/jtreg/ProblemList-StaticJdk.txt | 35 --- test/jdk/ProblemList-StaticJdk.txt | 38 ++- test/langtools/ProblemList-StaticJdk.txt | 53 ++-- test/lib-test/ProblemList-StaticJdk.txt | 28 +- 14 files changed, 678 insertions(+), 190 deletions(-) delete mode 100644 src/java.base/share/native/launcher/defines.h create mode 100644 src/java.base/unix/native/launcher/relauncher.c create mode 100644 src/java.base/windows/native/launcher/relauncher.c diff --git a/make/Main.gmk b/make/Main.gmk index e9f0b5bb9eb..22302cdea46 100644 --- a/make/Main.gmk +++ b/make/Main.gmk @@ -461,9 +461,9 @@ $(eval $(call SetupTarget, symbols-image, \ TARGET := symbols, \ )) -$(eval $(call SetupTarget, static-launcher, \ +$(eval $(call SetupTarget, static-launchers, \ MAKEFILE := StaticLibs, \ - TARGET := static-launcher, \ + TARGET := static-launchers, \ DEPS := hotspot-static-libs static-libs, \ )) @@ -1290,7 +1290,7 @@ ifeq ($(call isTargetOs, macosx), true) legacy-images: mac-legacy-jre-bundle endif -static-exploded-image: static-launcher exploded-image +static-exploded-image: static-launchers exploded-image # These targets build the various documentation images docs-jdk-image: docs-jdk diff --git a/make/StaticLibs.gmk b/make/StaticLibs.gmk index 490180eb649..ca74590938d 100644 --- a/make/StaticLibs.gmk +++ b/make/StaticLibs.gmk @@ -48,8 +48,8 @@ ifneq ($(word 2, $(wildcard $(HOTSPOT_STATIC_LIB_PATH))), ) endif # Find all modules with static libraries -STATIC_LIB_MODULES := $(patsubst $(SUPPORT_OUTPUTDIR)/modules_static-libs/%, \ - %, $(wildcard $(SUPPORT_OUTPUTDIR)/modules_static-libs/*)) +STATIC_LIB_MODULES := $(sort $(patsubst $(SUPPORT_OUTPUTDIR)/modules_static-libs/%, \ + %, $(wildcard $(SUPPORT_OUTPUTDIR)/modules_static-libs/*))) # Filter out known broken libraries. This is a temporary measure until # proper support for these libraries can be provided. @@ -123,13 +123,18 @@ else $(error Unsupported platform) endif +################################################################################ +# Build the java static launcher +################################################################################ $(eval $(call SetupBuildLauncher, java, \ ENABLE_ARG_FILES := true, \ EXPAND_CLASSPATH_WILDCARDS := true, \ EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \ VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \ OPTIMIZATION := HIGH, \ + MACOSX_PRIVILEGED := true, \ STATIC_LAUNCHER := true, \ + CFLAGS := -DSTATIC_BUILD, \ LDFLAGS := $(LDFLAGS_STATIC_JDK), \ LIBS := $(STATIC_LIBS) $(EXTERNAL_LIBS), \ LINK_TYPE := C++, \ @@ -146,7 +151,53 @@ TARGETS += $(java) JAVA_LAUNCHER := $(BUILD_LAUNCHER_java_TARGET) -static-launcher: $(java) +static-launchers: $(java) + +################################################################################ +# Build relaunchers (thin wrappers calling the java binary) for all other +# JDK launchers. +################################################################################ + +RELAUNCHER_SRC := $(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/launcher + +# $1: The module name +# $2: The launcher name +define SetupRelauncher + $1_$2_LAUNCHER_ARGS_LINE := $$(call ReadFile, $$(SUPPORT_OUTPUTDIR)/static-native/relaunchers/$1/$2-relauncher-arguments.txt) + # Restore |||| with space + $1_$2_LAUNCHER_ARGS := '{ $$(subst ||||,$(SPACE),$$(strip $$(foreach a, $$($1_$2_LAUNCHER_ARGS_LINE), "-J$$a"$$(COMMA) )) ) }' + + $$(eval $$(call SetupJdkExecutable, BUILD_relauncher_$2, \ + NAME := $2, \ + EXTRA_FILES := $$(RELAUNCHER_SRC)/relauncher.c, \ + CFLAGS := -DLAUNCHER_ARGS=$$($1_$2_LAUNCHER_ARGS), \ + LIBS_windows := shlwapi.lib, \ + OUTPUT_DIR := $$(STATIC_LAUNCHER_OUTPUT_DIR), \ + OBJECT_DIR := $$(STATIC_LAUNCHER_OUTPUT_DIR)/relaunchers/$2, \ + )) + + TARGETS += $$(BUILD_relauncher_$2) + + RELAUNCHERS += $$(BUILD_relauncher_$2_TARGET) + static-launchers: $$(BUILD_relauncher_$2) +endef + +# Find all modules with launchers +LAUNCHER_MODULES := $(sort $(patsubst $(SUPPORT_OUTPUTDIR)/modules_static-launchers/%, \ + %, $(wildcard $(SUPPORT_OUTPUTDIR)/modules_static-launchers/*))) + +# Find launchers for each module +$(foreach module, $(LAUNCHER_MODULES), \ + $(eval LAUNCHERS_$(module) := $(if $(wildcard \ + $(SUPPORT_OUTPUTDIR)/modules_static-launchers/$(module)/module-included-launchers.txt), \ + $(shell cat \ + $(SUPPORT_OUTPUTDIR)/modules_static-launchers/$(module)/module-included-launchers.txt))) \ +) + +# For all launchers (except java and javaw), setup a relauncher build +$(foreach module, $(LAUNCHER_MODULES), \ + $(foreach launcher, $(filter-out java javaw, $(LAUNCHERS_$(module))), \ + $(eval $(call SetupRelauncher,$(module),$(launcher))))) ################################################################################ # @@ -188,26 +239,72 @@ TARGETS += $(copy-from-jdk-image) $(copy-from-jdk-image): | static-jdk-info -$(eval $(call SetupCopyFiles, copy-static-launcher, \ - FILES := $(JAVA_LAUNCHER), \ +$(eval $(call SetupCopyFiles, copy-static-launchers, \ + FILES := $(JAVA_LAUNCHER) $(RELAUNCHERS), \ DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ )) -TARGETS += $(copy-static-launcher) +TARGETS += $(copy-static-launchers) -$(eval $(call SetupCopyFiles, copy-static-launcher-debuginfo, \ +$(eval $(call SetupCopyFiles, copy-static-launchers-debuginfo, \ SRC := $(STATIC_LAUNCHER_OUTPUT_DIR), \ DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ FILES := $(call FindDebuginfoFiles, $(STATIC_LAUNCHER_OUTPUT_DIR)), \ )) -TARGETS += $(copy-static-launcher-debuginfo) +TARGETS += $(copy-static-launchers-debuginfo) -static-jdk-image: $(copy-from-jdk-image) $(copy-static-launcher) $(copy-static-launcher-debuginfo) +# Copy the microsoft runtime libraries on windows +ifeq ($(call isTargetOs, windows), true) + # Chmod to avoid permission issues if bundles are unpacked on unix platforms. + # Use separate macro calls in case the source files are not in the same + # directory. + $(eval $(call SetupCopyFiles, copy-windows-msvcr, \ + DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ + FILES := $(MSVCR_DLL), \ + MACRO := copy-and-chmod-executable, \ + )) + + TARGETS += $(copy-windows-msvcr) + + $(eval $(call SetupCopyFiles, copy-windows-vcruntime, \ + DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ + FILES := $(VCRUNTIME_1_DLL), \ + MACRO := copy-and-chmod-executable, \ + )) + + TARGETS += $(copy-windows-vcruntime) + + $(eval $(call SetupCopyFiles, copy-windows-msvcp, \ + DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ + FILES := $(MSVCP_DLL), \ + MACRO := copy-and-chmod-executable, \ + )) + + TARGETS += $(copy-windows-msvcp) + + copy-windows-libs := $(copy-windows-msvcr) $(copy-windows-vcruntime) $(copy-windows-msvcp) + + ifneq ($(UCRT_DLL_DIR), ) + $(eval $(call SetupCopyFiles, copy-windows-ucrt, \ + DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ + SRC := $(UCRT_DLL_DIR), \ + FILES := $(wildcard $(UCRT_DLL_DIR)/*.dll), \ + MACRO := copy-and-chmod-executable, \ + )) + + TARGETS += $(copy-windows-ucrt) + + copy-windows-libs += $(copy-windows-ucrt) + endif +endif + +static-jdk-image: $(copy-from-jdk-image) $(copy-static-launchers) \ + $(copy-static-launchers-debuginfo) $(copy-windows-libs) TARGETS += static-jdk-image -.PHONY: static-launcher static-jdk-image +.PHONY: static-launchers static-jdk-image ################################################################################ diff --git a/make/common/modules/LauncherCommon.gmk b/make/common/modules/LauncherCommon.gmk index 0b420df5684..7682ffbb95c 100644 --- a/make/common/modules/LauncherCommon.gmk +++ b/make/common/modules/LauncherCommon.gmk @@ -43,6 +43,9 @@ LAUNCHER_CFLAGS += -I$(TOPDIR)/src/java.base/share/native/launcher \ MACOSX_PLIST_DIR := $(TOPDIR)/src/java.base/macosx/native/launcher JAVA_MANIFEST := $(TOPDIR)/src/java.base/windows/native/launcher/java.manifest +INCLUDED_LAUNCHERS_FILE := $(SUPPORT_OUTPUTDIR)/modules_static-launchers/$(MODULE)/module-included-launchers.txt +INCLUDED_LAUNCHERS := + ################################################################################ # Build standard launcher. @@ -74,19 +77,30 @@ define SetupBuildLauncherBody $1_MAIN_MODULE := $(MODULE) + $1_RELAUNCHER_ARGUMENTS := + ifneq ($$($1_MAIN_CLASS), ) $1_JAVA_ARGS += -Xms8m $1_LAUNCHER_CLASS := -m $$($1_MAIN_MODULE)/$$($1_MAIN_CLASS) endif - ifeq ($$($1_EXPAND_CLASSPATH_WILDCARDS), true) - $1_CFLAGS += -DEXPAND_CLASSPATH_WILDCARDS + ifeq ($$($1_ENABLE_ARG_FILES), true) + $1_CFLAGS += -DDISABLE_ARGFILE=JNI_FALSE + else + $1_CFLAGS += -DDISABLE_ARGFILE=JNI_TRUE + # This must be the first argument given, if it should be present + $1_RELAUNCHER_ARGUMENTS += -DjavaLauncherArgFiles=false endif - ifeq ($$($1_ENABLE_ARG_FILES), true) - $1_CFLAGS += -DENABLE_ARG_FILES + ifeq ($$($1_EXPAND_CLASSPATH_WILDCARDS), true) + $1_CFLAGS += -DCLASSPATH_WILDCARDS=JNI_TRUE + else + $1_CFLAGS += -DCLASSPATH_WILDCARDS=JNI_FALSE + $1_RELAUNCHER_ARGUMENTS += -DjavaLauncherWildcards=false endif + $1_RELAUNCHER_ARGUMENTS += -DjavaLauncherProgname=$1 + ifeq ($(call isTargetOs, windows), true) ifeq ($$($1_WINDOWS_JAVAW), true) $1_CFLAGS += -DJAVAW @@ -94,9 +108,14 @@ define SetupBuildLauncherBody endif ifneq ($$($1_JAVA_ARGS), ) - $1_JAVA_ARGS_STR := '{ $$(strip $$(foreach a, \ - $$(addprefix -J, $$($1_JAVA_ARGS)) $$($1_LAUNCHER_CLASS), "$$a"$(COMMA) )) }' + $1_PREFIXED_JAVA_ARGS := $$(addprefix -J, $$($1_JAVA_ARGS)) \ + $$($1_LAUNCHER_CLASS) + $1_JAVA_ARGS_STR := '{ $$(strip $$(foreach a, $$($1_PREFIXED_JAVA_ARGS), \ + "$$a"$(COMMA) )) }' $1_CFLAGS += -DJAVA_ARGS=$$($1_JAVA_ARGS_STR) + # To preserve spaces, substitute them with a hopefully unique pattern + $1_RELAUNCHER_ARGUMENTS += \ + -DjavaLauncherArgs=$$(subst $$(SPACE),||||,$$($1_PREFIXED_JAVA_ARGS)) endif ifeq ($(call isTargetOs, macosx), true) @@ -172,8 +191,28 @@ define SetupBuildLauncherBody )) $1 += $$(BUILD_LAUNCHER_$1) + + $1_RELAUNCHER_ARGUMENTS_FILE := \ + $$(SUPPORT_OUTPUTDIR)/static-native/relaunchers/$$(MODULE)/$1-relauncher-arguments.txt + + $1_VARDEPS := $$($1_RELAUNCHER_ARGUMENTS) + $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ + $$($1_RELAUNCHER_ARGUMENTS_FILE).vardeps) + + $$($1_RELAUNCHER_ARGUMENTS_FILE): + $$(call MakeDir, $$(@D)) + $$(ECHO) '$$($1_RELAUNCHER_ARGUMENTS)' > $$@ + + $1 += $$($1_RELAUNCHER_ARGUMENTS_FILE) + TARGETS += $$($1) + # Record the fact that this launcher is part of the current module. + INCLUDED_LAUNCHERS += $1 + + # Add a dependency from this launcher to the launcher list + $$(INCLUDED_LAUNCHERS_FILE): $$($1) + $$(BUILD_LAUNCHER_$1): $$(BUILD_PLIST_$1) ifeq ($(call isTargetOs, macosx), true) @@ -242,5 +281,14 @@ endif ################################################################################ +# We need to keep track of which launchers are created by this module. This +# information is required for static builds, to know which relaunchers to +# create. The file module-included-launchers.txt is then read in StaticLibs.gmk. +$(INCLUDED_LAUNCHERS_FILE): + $(call MakeDir, $(@D)) + $(ECHO) $(INCLUDED_LAUNCHERS) > $@ + +TARGETS += $(INCLUDED_LAUNCHERS_FILE) + endif # include guard include MakeIncludeEnd.gmk diff --git a/make/modules/java.base/Launcher.gmk b/make/modules/java.base/Launcher.gmk index c249656f188..3a3920acb12 100644 --- a/make/modules/java.base/Launcher.gmk +++ b/make/modules/java.base/Launcher.gmk @@ -73,7 +73,7 @@ ifeq ($(call isTargetOs, linux), true) $(eval $(call SetupJdkExecutable, BUILD_JEXEC, \ NAME := jexec, \ - SRC := $(TOPDIR)/src/$(MODULE)/unix/native/launcher, \ + EXTRA_FILES := $(TOPDIR)/src/$(MODULE)/unix/native/launcher/jexec.c, \ OPTIMIZATION := LOW, \ EXTRA_HEADER_DIRS := libjli, \ CFLAGS_linux := -fPIC, \ diff --git a/make/modules/jdk.jpackage/Lib.gmk b/make/modules/jdk.jpackage/Lib.gmk index 51d70c6d835..704436bbde6 100644 --- a/make/modules/jdk.jpackage/Lib.gmk +++ b/make/modules/jdk.jpackage/Lib.gmk @@ -25,7 +25,6 @@ ################################################################################ -include LauncherCommon.gmk include LibCommon.gmk JPACKAGE_OUTPUT_DIR := \ diff --git a/src/java.base/share/native/launcher/defines.h b/src/java.base/share/native/launcher/defines.h deleted file mode 100644 index a07a1db17a6..00000000000 --- a/src/java.base/share/native/launcher/defines.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2005, 2024, 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. - */ - -#ifndef _DEFINES_H -#define _DEFINES_H - -#include "java.h" - -#define STR_HELPER(x) #x -#define STR(x) STR_HELPER(x) - -/* - * This file contains commonly defined constants used only by main.c - * and should not be included by another file. - */ -#ifndef VERSION_STRING -/* make sure the compilation fails */ -#error "VERSION_STRING must be defined" -#endif - -/* Unused, but retained for JLI_Launch compatibility*/ -#define DOT_VERSION "0.0" - -#ifdef JAVA_ARGS -#ifdef PROGNAME -static const char* const_progname = PROGNAME; -#else -static char* const_progname = NULL; -#endif -static const char* const_jargs[] = JAVA_ARGS; -#else /* !JAVA_ARGS */ -static const char* const_progname = "java"; -static const char** const_jargs = NULL; -#endif /* JAVA_ARGS */ - -#ifdef LAUNCHER_NAME -static const char* const_launcher = LAUNCHER_NAME; -#else /* LAUNCHER_NAME */ -static char* const_launcher = NULL; -#endif /* LAUNCHER_NAME */ - -#ifdef EXPAND_CLASSPATH_WILDCARDS -static const jboolean const_cpwildcard = JNI_TRUE; -#else -static const jboolean const_cpwildcard = JNI_FALSE; -#endif /* EXPAND_CLASSPATH_WILDCARDS */ - -#ifdef ENABLE_ARG_FILES -static const jboolean const_disable_argfile = JNI_FALSE; -#else -static const jboolean const_disable_argfile = JNI_TRUE; -#endif -#endif /*_DEFINES_H */ diff --git a/src/java.base/share/native/launcher/main.c b/src/java.base/share/native/launcher/main.c index 4e42e03dfc7..6fa2a29dc7b 100644 --- a/src/java.base/share/native/launcher/main.c +++ b/src/java.base/share/native/launcher/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -30,10 +30,60 @@ * tools. The rest of the files will be linked in. */ -#include "defines.h" +#include "java.h" #include "jli_util.h" #include "jni.h" +// Unused, but retained for JLI_Launch compatibility +#define DOT_VERSION "0.0" + +// This is reported when requesting a full version +static char* launcher = LAUNCHER_NAME; + +// This is used as the name of the executable in the help message +static char* progname = PROGNAME; + +#ifdef JAVA_ARGS +static const char* jargs[] = JAVA_ARGS; +#else +static const char** jargs = NULL; +#endif +static int jargc; + +static jboolean cpwildcard = CLASSPATH_WILDCARDS; +static jboolean disable_argfile = DISABLE_ARGFILE; + +#ifdef STATIC_BUILD +static void check_relauncher_argument(char* arg) { + if (strcmp(arg, "-J-DjavaLauncherWildcards=false") == 0) { + cpwildcard = JNI_FALSE; + } + const char *progname_prefix = "-J-DjavaLauncherProgname="; + size_t progname_prefix_len = strlen(progname_prefix); + if (strncmp(arg, progname_prefix, progname_prefix_len) == 0) { + progname = arg + progname_prefix_len; + } + const char *args_prefix = "-J-DjavaLauncherArgs="; + size_t args_prefix_len = strlen(args_prefix); + if (strncmp(arg, args_prefix, args_prefix_len) == 0) { + char* java_args_ptr = arg + args_prefix_len; + size_t java_args_len = strlen(arg) - args_prefix_len; + + JLI_List java_args = JLI_List_new(java_args_len); + char* next_space; + while ((next_space = strchr(java_args_ptr, ' ')) != NULL) { + size_t next_arg_len = next_space - java_args_ptr; + JLI_List_addSubstring(java_args, java_args_ptr, next_arg_len); + java_args_ptr = next_space + 1; + } + JLI_List_add(java_args, java_args_ptr); + + jargc = (int) java_args->size; + jargs = (const char**) java_args->elements; + } +} +#endif + /* * Entry point. */ @@ -44,7 +94,7 @@ char **__initenv; int WINAPI WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow) { - const jboolean const_javaw = JNI_TRUE; + const jboolean javaw = JNI_TRUE; __initenv = _environ; @@ -52,19 +102,25 @@ WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow) JNIEXPORT int main(int argc, char **argv) { - const jboolean const_javaw = JNI_FALSE; + const jboolean javaw = JNI_FALSE; #endif /* JAVAW */ int margc; char** margv; - int jargc; - const char** jargv = const_jargs; - jargc = (sizeof(const_jargs) / sizeof(char *)) > 1 - ? sizeof(const_jargs) / sizeof(char *) + jargc = (sizeof(jargs) / sizeof(char *)) > 1 + ? sizeof(jargs) / sizeof(char *) : 0; // ignore the null terminator index - JLI_InitArgProcessing(jargc > 0, const_disable_argfile); +#ifdef STATIC_BUILD + // Relaunchers always give -J-DjavaLauncherArgFiles as the first argument, if present + // We must check disable_argfile before calling JLI_InitArgProcessing. + if (argc > 1 && strcmp(argv[1], "-J-DjavaLauncherArgFiles=false") == 0) { + disable_argfile = JNI_TRUE; + } +#endif + + JLI_InitArgProcessing(jargc > 0, disable_argfile); #ifdef _WIN32 { @@ -103,6 +159,9 @@ main(int argc, char **argv) StdArg *stdargs = JLI_GetStdArgs(); for (i = 0 ; i < margc ; i++) { margv[i] = stdargs[i].arg; +#ifdef STATIC_BUILD + check_relauncher_argument(margv[i]); +#endif } margv[i] = NULL; } @@ -127,6 +186,9 @@ main(int argc, char **argv) } // Iterate the rest of command line for (i = 1; i < argc; i++) { +#ifdef STATIC_BUILD + check_relauncher_argument(argv[i]); +#endif JLI_List argsInFile = JLI_PreprocessArg(argv[i], JNI_TRUE); if (NULL == argsInFile) { JLI_List_add(args, JLI_StringDup(argv[i])); @@ -148,12 +210,12 @@ main(int argc, char **argv) } #endif /* WIN32 */ return JLI_Launch(margc, margv, - jargc, jargv, + jargc, jargs, 0, NULL, VERSION_STRING, DOT_VERSION, - (const_progname != NULL) ? const_progname : *margv, - (const_launcher != NULL) ? const_launcher : *margv, + progname, + launcher, jargc > 0, - const_cpwildcard, const_javaw, 0); + cpwildcard, javaw, 0); } diff --git a/src/java.base/unix/native/launcher/relauncher.c b/src/java.base/unix/native/launcher/relauncher.c new file mode 100644 index 00000000000..f95e3b38caa --- /dev/null +++ b/src/java.base/unix/native/launcher/relauncher.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2024, 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. + */ + +#include +#include +#include +#include +#include + +#define JAVA_EXECUTABLE_NAME "java" + +#ifndef LAUNCHER_ARGS +#error LAUNCHER_ARGS must be defined +#endif + +static char *launcher_args[] = LAUNCHER_ARGS; + +int main(int argc, char *argv[]) { + //////////////////////////////////////////////////////////////////////////// + // Create a fully qualified path to the java executable in the same + // directory as this file resides in. + + char *our_full_path = realpath(argv[0], NULL); + if (our_full_path == NULL) { + perror("failed to get the full path of the executable"); + return 1; + } + + char *last_slash_pos = strrchr(our_full_path, '/'); + if (last_slash_pos == NULL) { + fprintf(stderr, "no '/' found in the full path of the executable\n"); + return 1; + } + + size_t base_length = last_slash_pos - our_full_path + 1; + size_t java_path_length = base_length + strlen(JAVA_EXECUTABLE_NAME) + 1; + + char *java_path = malloc(java_path_length); + if (java_path == NULL) { + perror("malloc failed"); + return 1; + } + + memcpy(java_path, our_full_path, base_length); + strcpy(java_path + base_length, JAVA_EXECUTABLE_NAME); + + //////////////////////////////////////////////////////////////////////////// + // Build the argument list: our executable name + launcher args + users args + + int launcher_argsc = sizeof(launcher_args) / sizeof(char *); + + char **java_args = malloc((launcher_argsc + argc + 1) * sizeof(char *)); + if (java_args == NULL) { + perror("malloc failed"); + return 1; + } + + // Our executable name + java_args[0] = argv[0]; + + // Launcher arguments + for (int i = 0; i < launcher_argsc; i++) { + java_args[i + 1] = launcher_args[i]; + } + + // User arguments + for (int i = 1; i < argc; i++) { + java_args[launcher_argsc + i] = argv[i]; + } + + java_args[launcher_argsc + argc] = NULL; + + //////////////////////////////////////////////////////////////////////////// + // Finally execute the real java process with the constructed arguments + + if (getenv("_JAVA_LAUNCHER_DEBUG")) { + char *program_name = basename(argv[0]); + + fprintf(stderr, "%s: executing: '%s'", program_name, java_path); + for (int i = 0; java_args[i] != NULL; i++) { + fprintf(stderr, " '%s' ", java_args[i]); + } + fprintf(stderr, "\n"); + } + + execv(java_path, java_args); + + // Should not reach here, unless something went wrong + perror("execv failed"); + return 1; +} diff --git a/src/java.base/unix/native/libjli/java_md.c b/src/java.base/unix/native/libjli/java_md.c index 0a61971b080..a75795af580 100644 --- a/src/java.base/unix/native/libjli/java_md.c +++ b/src/java.base/unix/native/libjli/java_md.c @@ -276,6 +276,9 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, char jdkroot[], jint so_jdkroot, char jvmpath[], jint so_jvmpath, char jvmcfg[], jint so_jvmcfg) { + /* Compute/set the name of the executable */ + SetExecname(*pargv); + if (JLI_IsStaticallyLinked()) { // With static builds, all JDK and VM natives are statically linked // with the launcher executable. No need to manipulate LD_LIBRARY_PATH @@ -297,9 +300,6 @@ CreateExecutionEnvironment(int *pargc, char ***pargv, size_t new_runpath_size; #endif /* SETENV_REQUIRED */ - /* Compute/set the name of the executable */ - SetExecname(*pargv); - /* Check to see if the jvmpath exists */ /* Find out where the JDK is that we will be using. */ if (!GetJDKInstallRoot(jdkroot, so_jdkroot, JNI_FALSE)) { diff --git a/src/java.base/windows/native/launcher/relauncher.c b/src/java.base/windows/native/launcher/relauncher.c new file mode 100644 index 00000000000..6487406c04e --- /dev/null +++ b/src/java.base/windows/native/launcher/relauncher.c @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2024, 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. + */ + +#include +#include +#include +#include +#include + +#define JAVA_EXECUTABLE_NAME "java.exe" + +#ifndef LAUNCHER_ARGS +#error LAUNCHER_ARGS must be defined +#endif + +static char* launcher_args[] = LAUNCHER_ARGS; + +char* quote_argument(char* arg) { + // See https://learn.microsoft.com/en-us/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way + // for an explanation of how to properly quote command lines for CreateProcess + size_t arg_length = strlen(arg); + + if (strcspn(arg, " \t\n\v\"") == arg_length) { + // No quoting is needed + return arg; + } + + // Worst-case buffer size: all characters need a backslash, and starting + end quotes + size_t buffer_size = arg_length * 2 + 3; + char* buffer = malloc(buffer_size); + if (buffer == NULL) { + return NULL; + } + + int backslashes = 0; + char* write_pos = buffer; + char* read_pos = arg; + + // Start with a quote character + *write_pos++ = '"'; + + while (*read_pos) { + while (*read_pos == '\\') { + read_pos++; + backslashes++; + } + + if (*read_pos == '"') { + // Any potential backslashes before a quote needs to be doubled, + // and the quote needs to be escaped with an additional backslash + for (int i = 0; i < backslashes * 2 + 1; i++) { + *write_pos++ = '\\'; + } + *write_pos++ = *read_pos++; + backslashes = 0; + } else { + // Backslashes not preceeding a quote are copied without escaping + for (int i = 0; i < backslashes; i++) { + *write_pos++ = '\\'; + } + if (*read_pos) { + *write_pos++ = *read_pos++; + backslashes = 0; + } + } + } + + // If the string ended with backslashes, they need to be doubled before + // the final quote character + for (int i = 0; i < backslashes; i++) { + *write_pos++ = '\\'; + } + *write_pos++ = '"'; + *write_pos = '\0'; + + return buffer; +} + +int main(int argc, char* argv[]) { + //////////////////////////////////////////////////////////////////////////// + // Create a fully qualified path to the java executable in the same + // directory as this file resides in. + + // Calculate path length first + DWORD our_full_path_len = GetFullPathName(argv[0], 0, NULL, NULL); + if (our_full_path_len == 0) { + fprintf(stderr, "failed to get the full path of the executable: %lu\n", GetLastError()); + return 1; + } + + char* our_full_path = malloc(our_full_path_len + 1); + if (our_full_path == NULL) { + perror("malloc failed"); + return 1; + } + + if (GetFullPathName(argv[0], our_full_path_len + 1, our_full_path, NULL) == 0) { + fprintf(stderr, "failed to get the full path of the executable: %lu\n", GetLastError()); + return 1; + } + + char *last_slash_pos = strrchr(our_full_path, '\\'); + if (last_slash_pos == NULL) { + fprintf(stderr, "no '\\' found in the full path of the executable\n"); + return 1; + } + + size_t base_length = last_slash_pos - our_full_path + 1; + size_t java_path_length = base_length + strlen(JAVA_EXECUTABLE_NAME) + 1; + + char *java_path = malloc(java_path_length); + if (java_path == NULL) { + perror("malloc failed"); + return 1; + } + + memcpy(java_path, our_full_path, base_length); + strcpy(java_path + base_length, JAVA_EXECUTABLE_NAME); + + //////////////////////////////////////////////////////////////////////////// + // Build the argument list: our executable name + launcher args + users args + + int launcher_argsc = sizeof(launcher_args) / sizeof(char *); + + char **java_args = malloc((launcher_argsc + argc + 1) * sizeof(char *)); + if (java_args == NULL) { + perror("malloc failed"); + return 1; + } + + // Our executable name + java_args[0] = quote_argument(argv[0]); + if (java_args[0] == NULL) { + perror("malloc failed"); + return 1; + } + + // Launcher arguments + for (int i = 0; i < launcher_argsc; i++) { + char* quoted = quote_argument(launcher_args[i]); + if (quoted == NULL) { + perror("malloc failed"); + return 1; + } + java_args[i + 1] = quoted; + } + + // User arguments + for (int i = 1; i < argc; i++) { + char* quoted = quote_argument(argv[i]); + if (quoted == NULL) { + perror("malloc failed"); + return 1; + } + java_args[launcher_argsc + i] = quoted; + } + + java_args[launcher_argsc + argc] = NULL; + + // Windows needs the command line as a single string, not as an array of char* + size_t total_length = 0; + for (int i = 0; java_args[i] != NULL; i++) { + char* arg = java_args[i]; + total_length += strlen(java_args[i]) + 1; + } + + char* command_line = malloc(total_length); + if (command_line == NULL) { + perror("malloc failed"); + return 1; + } + + // Concatenate the quoted arguments with a space between them + char* write_pos = command_line; + for (int i = 0; java_args[i] != NULL; i++) { + size_t arg_len = strlen(java_args[i]); + memcpy(write_pos, java_args[i], arg_len); + write_pos += arg_len; + + // Append a space + *write_pos++ = ' '; + } + + // Replace the last space with a null terminator + write_pos--; + *write_pos = '\0'; + + //////////////////////////////////////////////////////////////////////////// + // Finally execute the real java process with the constructed arguments + + if (GetEnvironmentVariable("_JAVA_LAUNCHER_DEBUG", NULL, 0)) { + char *program_name = PathFindFileName(argv[0]); + + fprintf(stderr, "%s: executing: '%s' '%s'\n", program_name, java_path, command_line); + } + + STARTUPINFO si; + PROCESS_INFORMATION pi; + + memset(&si, 0, sizeof(si)); + memset(&pi, 0, sizeof(pi)); + + // Windows has no equivalent of exec, so start the process and wait for it + // to finish, to be able to return the same exit code + if (!CreateProcess(java_path, command_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + fprintf(stderr, "CreateProcess failed: %lu\n", GetLastError()); + return 1; + } + + if (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_FAILED) { + fprintf(stderr, "WaitForSingleObject failed: %lu\n", GetLastError()); + return 1; + } + + DWORD exit_code; + if (!GetExitCodeProcess(pi.hProcess, &exit_code)) { + fprintf(stderr, "GetExitCodeProcess failed: %lu\n", GetLastError()); + return 1; + } + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return exit_code; +} diff --git a/test/hotspot/jtreg/ProblemList-StaticJdk.txt b/test/hotspot/jtreg/ProblemList-StaticJdk.txt index 1681fb74634..1e5538ca5b9 100644 --- a/test/hotspot/jtreg/ProblemList-StaticJdk.txt +++ b/test/hotspot/jtreg/ProblemList-StaticJdk.txt @@ -1,38 +1,3 @@ -# Require javac -runtime/HiddenClasses/DefineHiddenClass.java 8346719 generic-all - -# Require jstack -runtime/Thread/TestThreadDumpClassInitMonitor.java 8346719 generic-all -runtime/Thread/TestThreadDumpSMRInfo.java 8346719 generic-all -serviceability/tmtools/jstack/DaemonThreadTest.java 8346719 generic-all -serviceability/tmtools/jstack/JstackThreadTest.java 8346719 generic-all -serviceability/tmtools/jstack/SpreadLockTest.java 8346719 generic-all -serviceability/tmtools/jstack/ThreadNamesTest.java 8346719 generic-all -serviceability/tmtools/jstack/TraveledLockTest.java 8346719 generic-all -serviceability/tmtools/jstack/WaitNotifyThreadTest.java 8346719 generic-all -serviceability/tmtools/jstat/GcCapacityTest.java 8346719 generic-all -serviceability/tmtools/jstat/GcCauseTest01.java 8346719 generic-all -serviceability/tmtools/jstat/GcCauseTest02.java 8346719 generic-all -serviceability/tmtools/jstat/GcCauseTest03.java 8346719 generic-all -serviceability/tmtools/jstat/GcNewTest.java 8346719 generic-all -serviceability/tmtools/jstat/GcTest01.java 8346719 generic-all -serviceability/tmtools/jstat/GcTest02.java 8346719 generic-all - -# Require jcmd -serviceability/HeapDump/DuplicateArrayClassesTest.java 8346719 generic-all -serviceability/HeapDump/FieldsInInstanceTest.java 8346719 generic-all -serviceability/attach/ConcAttachTest.java 8346719 generic-all -serviceability/attach/RemovingUnixDomainSocketTest.java 8346719 generic-all -serviceability/jvmti/vthread/HeapDump/VThreadInHeapDump.java#default 8346719 generic-all -serviceability/jvmti/vthread/HeapDump/VThreadInHeapDump.java#no-vmcontinuations 8346719 generic-all - -# Require jhsdb -serviceability/sa/ClhsdbCDSCore.java 8346719 generic-all -serviceability/sa/ClhsdbFindPC.java#no-xcomp-core 8346719 generic-all -serviceability/sa/ClhsdbFindPC.java#xcomp-core 8346719 generic-all -serviceability/sa/ClhsdbPmap.java#core 8346719 generic-all -serviceability/sa/ClhsdbPstack.java#core 8346719 generic-all - # Dynamically link with JDK/VM native libraries gtest/GTestWrapper.java 8356201 generic-all gtest/LargePageGtests.java#use-large-pages 8356201 generic-all diff --git a/test/jdk/ProblemList-StaticJdk.txt b/test/jdk/ProblemList-StaticJdk.txt index 12ff29dbae9..70f0438c0c6 100644 --- a/test/jdk/ProblemList-StaticJdk.txt +++ b/test/jdk/ProblemList-StaticJdk.txt @@ -1,14 +1,26 @@ -# Require jarsigner -java/lang/System/LoggerFinder/SignedLoggerFinderTest/SignedLoggerFinderTest.java 8346719 generic-all -java/util/jar/JarFile/jarVerification/MultiProviderTest.java 8346719 generic-all +########################################################################### +# +# 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. +# +# 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. +# +########################################################################### -# Require jar -java/lang/System/MacEncoding/TestFileEncoding.java 8346719 generic-all -java/util/ResourceBundle/modules/basic/BasicTest.java 8346719 generic-all - -# Require javac -java/util/ResourceBundle/modules/layer/LayerTest.java 8346719 generic-all -java/util/ResourceBundle/modules/unnamed/UnNamedTest.java 8346719 generic-all - -# Require jps -java/util/concurrent/locks/Lock/TimedAcquireLeak.java 8346719 generic-all +# Currently empty diff --git a/test/langtools/ProblemList-StaticJdk.txt b/test/langtools/ProblemList-StaticJdk.txt index 85fa3a6e14d..70f0438c0c6 100644 --- a/test/langtools/ProblemList-StaticJdk.txt +++ b/test/langtools/ProblemList-StaticJdk.txt @@ -1,29 +1,26 @@ -# Requires javadoc -jdk/javadoc/tool/6964914/TestStdDoclet.java 8346719 generic-all -jdk/javadoc/tool/6964914/TestUserDoclet.java 8346719 generic-all -jdk/javadoc/tool/AddOpensTest.java 8346719 generic-all -jdk/javadoc/tool/EncodingTest.java 8346719 generic-all -jdk/javadoc/tool/EnsureNewOldDoclet.java 8346719 generic-all -jdk/javadoc/tool/QuietOption.java 8346719 generic-all -jdk/javadoc/tool/testLocaleOption/TestLocaleOption.java 8346719 generic-all +########################################################################### +# +# 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. +# +# 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. +# +########################################################################### -# Requires javac -tools/javac/ClassPathTest/ClassPathTest.java 8346719 generic-all -tools/javac/Paths/ClassPath.java 8346719 generic-all -tools/javac/Paths/WildcardMineField.java 8346719 generic-all -tools/javac/T8132562/ClassPathWithDoubleQuotesTest.java 8346719 generic-all -tools/javac/file/MultiReleaseJar/MultiReleaseJarTest.java 8346719 generic-all -tools/javac/modules/AllDefaultTest.java 8346719 generic-all -tools/javac/modules/EnvVarTest.java 8346719 generic-all -tools/javac/modules/InheritRuntimeEnvironmentTest.java 8346719 generic-all -tools/javac/modules/NPEEmptyFileTest.java 8346719 generic-all -tools/javac/newlines/NewLineTest.java 8346719 generic-all -tools/javac/options/smokeTests/OptionSmokeTest.java 8346719 generic-all -tools/javac/platform/PlatformProviderTest.java 8346719 generic-all -tools/javac/processing/options/testPrintProcessorInfo/TestWithXstdout.java 8346719 generic-all - -# Requires jar -tools/jdeps/MultiReleaseJar.java 8346719 generic-all - -# Requires jimage -tools/javac/Paths/MineField.java 8346719 generic-all +# Currently empty diff --git a/test/lib-test/ProblemList-StaticJdk.txt b/test/lib-test/ProblemList-StaticJdk.txt index 3d151e07d41..70f0438c0c6 100644 --- a/test/lib-test/ProblemList-StaticJdk.txt +++ b/test/lib-test/ProblemList-StaticJdk.txt @@ -1,2 +1,26 @@ -# Requires jcmd -jdk/test/lib/hprof/HprofTest.java 8346719 generic-all +########################################################################### +# +# 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. +# +# 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. +# +########################################################################### + +# Currently empty From 973dc3fc47b249bb392d277880dcac0940f62771 Mon Sep 17 00:00:00 2001 From: EunHyunsu Date: Wed, 5 Nov 2025 14:57:05 +0000 Subject: [PATCH 468/561] 8371009: HttpClient javadoc synchronous example missing HttpRequest variable declaration Reviewed-by: dfuchs, michaelm --- .../share/classes/java/net/http/HttpClient.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java.net.http/share/classes/java/net/http/HttpClient.java b/src/java.net.http/share/classes/java/net/http/HttpClient.java index 889ea56531e..a7a2171857d 100644 --- a/src/java.net.http/share/classes/java/net/http/HttpClient.java +++ b/src/java.net.http/share/classes/java/net/http/HttpClient.java @@ -102,13 +102,17 @@ import jdk.internal.net.http.HttpClientBuilderImpl; * .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80))) * .authenticator(Authenticator.getDefault()) * .build(); + * + * HttpRequest request = HttpRequest.newBuilder() + * .uri(URI.create("https://foo.com/")) + * .build(); * HttpResponse response = client.send(request, BodyHandlers.ofString()); * System.out.println(response.statusCode()); * System.out.println(response.body()); } * *

          Asynchronous Example * {@snippet : - * HttpRequest request = HttpRequest.newBuilder() + * HttpRequest request = HttpRequest.newBuilder() * .uri(URI.create("https://foo.com/")) * .timeout(Duration.ofMinutes(2)) * .header("Content-Type", "application/json") From b0536f9c2a6ddfa27be8fad8f53783c6b28d22c9 Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Wed, 5 Nov 2025 15:56:08 +0000 Subject: [PATCH 469/561] 8370201: Test serviceability/sa/TestJhsdbJstackWithVirtualThread.java fails due to VM warnings Reviewed-by: kevinw, amenkov, sspitsyn --- .../serviceability/attach/RemovingUnixDomainSocketTest.java | 4 ++-- .../jtreg/serviceability/sa/ClhsdbJstackXcompStress.java | 2 +- test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java | 4 ++-- test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java | 4 ++-- .../serviceability/sa/TestJhsdbJstackWithVirtualThread.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java b/test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java index 3e15b24b5d4..22083ee1334 100644 --- a/test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java +++ b/test/hotspot/jtreg/serviceability/attach/RemovingUnixDomainSocketTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, 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. * * This code is free software; you can redistribute it and/or modify it @@ -67,7 +67,7 @@ public class RemovingUnixDomainSocketTest { "jcmd exitValue = " + out.getExitValue()); out.shouldHaveExitValue(0); - out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.stderrShouldBeEmptyIgnoreVMWarnings(); } public static void main(String... args) throws Exception { diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java index bb35e6c5aff..4b02c01119d 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbJstackXcompStress.java @@ -75,7 +75,7 @@ public class ClhsdbJstackXcompStress { System.err.println(out.getStderr()); } - out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.stderrShouldBeEmptyIgnoreVMWarnings(); out.stdoutShouldNotContain("Error occurred during stack walking:"); out.stdoutShouldContain(LingeredAppWithRecComputation.THREAD_NAME); List stdoutList = Arrays.asList(out.getStdout().split("\\R")); diff --git a/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java b/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java index 798de679d7c..75942f7113a 100644 --- a/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java +++ b/test/hotspot/jtreg/serviceability/sa/JhsdbThreadInfoTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, 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. * * This code is free software; you can redistribute it and/or modify it @@ -70,7 +70,7 @@ public class JhsdbThreadInfoTest { out.shouldNotContain(" prio=0 "); out.shouldNotContain(" java.lang.Thread.State: UNKNOWN"); - out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.stderrShouldBeEmptyIgnoreVMWarnings(); System.out.println("Test Completed"); } catch (Exception ex) { diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java index 8d5c95721d5..ac536523815 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackLock.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -68,7 +68,7 @@ public class TestJhsdbJstackLock { out.shouldMatch("^\\s+- locked <0x[0-9a-f]+> \\(a java\\.lang\\.Class for int\\)$"); out.shouldMatch("^\\s+- waiting on (<0x[0-9a-f]+> \\(a java\\.lang\\.Object\\)|)$"); - out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.stderrShouldBeEmptyIgnoreVMWarnings(); System.out.println("Test Completed"); } finally { diff --git a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java index 6d7921c7ed8..39b6e1ed609 100644 --- a/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java +++ b/test/hotspot/jtreg/serviceability/sa/TestJhsdbJstackWithVirtualThread.java @@ -58,7 +58,7 @@ public class TestJhsdbJstackWithVirtualThread { System.out.println(out.getStdout()); System.err.println(out.getStderr()); - out.stderrShouldBeEmptyIgnoreDeprecatedWarnings(); + out.stderrShouldBeEmptyIgnoreVMWarnings(); out.shouldNotContain("must have non-zero frame size"); } From cf45e09c388e95b5f11ad08ebdf7f277e968f90b Mon Sep 17 00:00:00 2001 From: Chris Plummer Date: Wed, 5 Nov 2025 18:03:22 +0000 Subject: [PATCH 470/561] 8371354: Problem list serviceability/sa/TestJhsdbJstackMixedWithXComp.java due to JDK-8371194 Reviewed-by: kevinw --- test/hotspot/jtreg/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 0b9630e9434..1e4ac9e2848 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -144,6 +144,7 @@ serviceability/sa/TestJmapCore.java 8318754 macosx-aarch64 serviceability/sa/TestJmapCoreMetaspace.java 8318754 macosx-aarch64 serviceability/sa/ClhsdbThreadContext.java 8356704 windows-x64 +serviceability/sa/TestJhsdbJstackMixedWithXComp.java 8371194 linux-x64 serviceability/jvmti/stress/StackTrace/NotSuspended/GetStackTraceNotSuspendedStressTest.java 8315980 linux-all,windows-x64 From 7d93cb73c45d393705504f0637b12512124923a1 Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 5 Nov 2025 18:52:26 +0000 Subject: [PATCH 471/561] 8370637: [Windows] Crash if use Graphics after PrintJob.end Reviewed-by: azvegint, psadhukhan, aivanov --- .../classes/sun/awt/windows/WPrinterJob.java | 142 +++++++++--------- .../native/libawt/windows/awt_PrintJob.cpp | 128 +++++++++++++++- .../awt/PrintJob/PrintJobAfterEndTest.java | 12 +- .../print/PrinterJob/PrintAfterEndTest.java | 4 +- 4 files changed, 206 insertions(+), 80 deletions(-) diff --git a/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java b/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java index 17d41036bcc..01be8587685 100644 --- a/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java +++ b/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java @@ -929,35 +929,35 @@ public final class WPrinterJob extends RasterPrinterJob * Return the Window's device context that we are printing * into. */ - private long getPrintDC() { + private synchronized long getPrintDC() { return handleRecord.mPrintDC; } - private void setPrintDC(long mPrintDC) { + private synchronized void setPrintDC(long mPrintDC) { handleRecord.mPrintDC = mPrintDC; } - private long getDevMode() { + private synchronized long getDevMode() { return handleRecord.mPrintHDevMode; } - private void setDevMode(long mPrintHDevMode) { + private synchronized void setDevMode(long mPrintHDevMode) { handleRecord.mPrintHDevMode = mPrintHDevMode; } - private long getDevNames() { + private synchronized long getDevNames() { return handleRecord.mPrintHDevNames; } - private void setDevNames(long mPrintHDevNames) { + private synchronized void setDevNames(long mPrintHDevNames) { handleRecord.mPrintHDevNames = mPrintHDevNames; } - protected void beginPath() { + protected synchronized void beginPath() { beginPath(getPrintDC()); } - protected void endPath() { + protected synchronized void endPath() { endPath(getPrintDC()); } @@ -972,23 +972,23 @@ public final class WPrinterJob extends RasterPrinterJob setGraphicsMode(graphicsMode); } - protected void closeFigure() { + protected synchronized void closeFigure() { closeFigure(getPrintDC()); } - protected void fillPath() { + protected synchronized void fillPath() { fillPath(getPrintDC()); } - protected void moveTo(float x, float y) { + protected synchronized void moveTo(float x, float y) { moveTo(getPrintDC(), x, y); } - protected void lineTo(float x, float y) { + protected synchronized void lineTo(float x, float y) { lineTo(getPrintDC(), x, y); } - protected void polyBezierTo(float control1x, float control1y, + protected synchronized void polyBezierTo(float control1x, float control1y, float control2x, float control2y, float endX, float endY) { @@ -1003,14 +1003,14 @@ public final class WPrinterJob extends RasterPrinterJob * be one of the following Windows constants: * {@code ALTERNATE} or {@code WINDING}. */ - protected void setPolyFillMode(int fillRule) { + protected synchronized void setPolyFillMode(int fillRule) { setPolyFillMode(getPrintDC(), fillRule); } /** * Set the GDI graphics mode to {@code GM_ADVANCED}. */ - private int setAdvancedGraphicsMode() { + private synchronized int setAdvancedGraphicsMode() { return setAdvancedGraphicsMode(getPrintDC()); } @@ -1020,28 +1020,28 @@ public final class WPrinterJob extends RasterPrinterJob * be one of the following Windows constants: * {@code GM_COMPATIBLE} or {@code GM_ADVANCED}. */ - private void setGraphicsMode(int mode) { + private synchronized void setGraphicsMode(int mode) { setGraphicsMode(getPrintDC(), mode); } /** * Scale the GDI World Transform. */ - private void scale(double scaleX, double scaleY) { + private synchronized void scale(double scaleX, double scaleY) { scale(getPrintDC(), scaleX, scaleY); } /** * Get the GDI World Transform. */ - private void getWorldTransform(double[] transform) { + private synchronized void getWorldTransform(double[] transform) { getWorldTransform(getPrintDC(), transform); } /** * Set the GDI World Transform. */ - private void setWorldTransform(double[] transform) { + private synchronized void setWorldTransform(double[] transform) { setWorldTransform(getPrintDC(), transform); } @@ -1051,7 +1051,7 @@ public final class WPrinterJob extends RasterPrinterJob * is created, select it in the current printing device * context and free the old brush. */ - protected void selectSolidBrush(Color color) { + protected synchronized void selectSolidBrush(Color color) { /* We only need to select a brush if the color has changed. */ @@ -1070,7 +1070,7 @@ public final class WPrinterJob extends RasterPrinterJob * Return the x coordinate of the current pen * position in the print device context. */ - protected int getPenX() { + protected synchronized int getPenX() { return getPenX(getPrintDC()); } @@ -1080,7 +1080,7 @@ public final class WPrinterJob extends RasterPrinterJob * Return the y coordinate of the current pen * position in the print device context. */ - protected int getPenY() { + protected synchronized int getPenY() { return getPenY(getPrintDC()); } @@ -1089,16 +1089,16 @@ public final class WPrinterJob extends RasterPrinterJob * Set the current path in the printer device's * context to be clipping path. */ - protected void selectClipPath() { + protected synchronized void selectClipPath() { selectClipPath(getPrintDC()); } - protected void frameRect(float x, float y, float width, float height) { + protected synchronized void frameRect(float x, float y, float width, float height) { frameRect(getPrintDC(), x, y, width, height); } - protected void fillRect(float x, float y, float width, float height, + protected synchronized void fillRect(float x, float y, float width, float height, Color color) { float[] rgb = color.getRGBColorComponents(null); @@ -1109,7 +1109,7 @@ public final class WPrinterJob extends RasterPrinterJob } - protected void selectPen(float width, Color color) { + protected synchronized void selectPen(float width, Color color) { float[] rgb = color.getRGBColorComponents(null); @@ -1120,7 +1120,7 @@ public final class WPrinterJob extends RasterPrinterJob } - protected boolean selectStylePen(int cap, int join, float width, + protected synchronized boolean selectStylePen(int cap, int join, float width, Color color) { long endCap; @@ -1152,7 +1152,7 @@ public final class WPrinterJob extends RasterPrinterJob * Set a GDI font capable of drawing the java Font * passed in. */ - protected boolean setFont(String family, float size, int style, + protected synchronized boolean setFont(String family, float size, int style, int rotation, float awScale) { if (family.isEmpty()) { @@ -1187,7 +1187,7 @@ public final class WPrinterJob extends RasterPrinterJob /** * Set the GDI color for text drawing. */ - protected void setTextColor(Color color) { + protected synchronized void setTextColor(Color color) { /* We only need to select a brush if the color has changed. */ @@ -1206,7 +1206,7 @@ public final class WPrinterJob extends RasterPrinterJob * Draw the string {@code text} to the printer's * device context at the specified position. */ - protected void textOut(String str, float x, float y, + protected synchronized void textOut(String str, float x, float y, float[] positions) { /* Don't leave handling of control chars to GDI. * If control chars are removed, 'positions' isn't valid. @@ -1226,7 +1226,7 @@ public final class WPrinterJob extends RasterPrinterJob * Draw the glyphs {@code glyphs} to the printer's * device context at the specified position. */ - protected void glyphsOut(int []glyphs, float x, float y, + protected synchronized void glyphsOut(int []glyphs, float x, float y, float[] positions) { /* TrueType glyph codes are 16 bit values, so can be packed @@ -1254,7 +1254,7 @@ public final class WPrinterJob extends RasterPrinterJob * rendering so also remove them for measurement so that * this measurement can be properly compared with JDK measurement. */ - protected int getGDIAdvance(String text) { + protected synchronized int getGDIAdvance(String text) { /* Don't leave handling of control chars to GDI. */ text = removeControlChars(text); if (text.length() == 0) { @@ -1275,7 +1275,7 @@ public final class WPrinterJob extends RasterPrinterJob * by {@code srcX}, {@code srcY}, * {@code srcWidth}, and srcHeight. */ - protected void drawImage3ByteBGR(byte[] image, + protected synchronized void drawImage3ByteBGR(byte[] image, float destX, float destY, float destWidth, float destHeight, float srcX, float srcY, @@ -1306,7 +1306,7 @@ public final class WPrinterJob extends RasterPrinterJob * There's no alignment problem as GDI expects this to be packed * and each struct will start on a 4 byte boundary anyway. */ - protected void drawDIBImage(byte[] image, + protected synchronized void drawDIBImage(byte[] image, float destX, float destY, float destWidth, float destHeight, float srcX, float srcY, @@ -1338,7 +1338,7 @@ public final class WPrinterJob extends RasterPrinterJob * Begin a new page. */ @Override - protected void startPage(PageFormat format, Printable painter, + protected synchronized void startPage(PageFormat format, Printable painter, int index, boolean paperChanged) { /* Invalidate any device state caches we are @@ -1355,7 +1355,7 @@ public final class WPrinterJob extends RasterPrinterJob * End a page. */ @Override - protected void endPage(PageFormat format, Printable painter, + protected synchronized void endPage(PageFormat format, Printable painter, int index) { deviceEndPage(format, painter, index); @@ -1402,7 +1402,7 @@ public final class WPrinterJob extends RasterPrinterJob * is reflected back up to Java code */ @Override - protected native void initPrinter(); + protected synchronized native void initPrinter(); /** * Call Window's StartDoc routine to begin a @@ -1415,10 +1415,10 @@ public final class WPrinterJob extends RasterPrinterJob * user may cancel out of it. Note that the implementation of * cancel() throws PrinterAbortException to indicate the user cancelled. */ - private native boolean _startDoc(String dest, String jobName) + private synchronized native boolean _startDoc(String dest, String jobName) throws PrinterException; @Override - protected void startDoc() throws PrinterException { + protected synchronized void startDoc() throws PrinterException { if (!_startDoc(mDestination, getJobName())) { cancel(); } @@ -1429,31 +1429,31 @@ public final class WPrinterJob extends RasterPrinterJob * print job. */ @Override - protected native void endDoc(); + protected synchronized native void endDoc(); /** * Call Window's AbortDoc routine to abort a * print job. */ @Override - protected native void abortDoc(); + protected synchronized native void abortDoc(); /** * Call Windows native resource freeing APIs */ - private static native void deleteDC(long dc, long devmode, long devnames); + private static synchronized native void deleteDC(long dc, long devmode, long devnames); /** * Begin a new page. This call's Window's * StartPage routine. */ - protected native void deviceStartPage(PageFormat format, Printable painter, + protected synchronized native void deviceStartPage(PageFormat format, Printable painter, int index, boolean paperChanged); /** * End a page. This call's Window's EndPage * routine. */ - protected native void deviceEndPage(PageFormat format, Printable painter, + protected synchronized native void deviceEndPage(PageFormat format, Printable painter, int index); /** @@ -1464,46 +1464,46 @@ public final class WPrinterJob extends RasterPrinterJob * specified by the caller. */ @Override - protected native void printBand(byte[] data, int x, int y, + protected synchronized native void printBand(byte[] data, int x, int y, int width, int height); /** * Begin a Window's rendering path in the device * context {@code printDC}. */ - protected native void beginPath(long printDC); + protected synchronized native void beginPath(long printDC); /** * End a Window's rendering path in the device * context {@code printDC}. */ - protected native void endPath(long printDC); + protected synchronized native void endPath(long printDC); /** * Close a subpath in a Window's rendering path in the device * context {@code printDC}. */ - protected native void closeFigure(long printDC); + protected synchronized native void closeFigure(long printDC); /** * Fill a defined Window's rendering path in the device * context {@code printDC}. */ - protected native void fillPath(long printDC); + protected synchronized native void fillPath(long printDC); /** * Move the Window's pen position to {@code (x,y)} * in the device context {@code printDC}. */ - protected native void moveTo(long printDC, float x, float y); + protected synchronized native void moveTo(long printDC, float x, float y); /** * Draw a line from the current pen position to * {@code (x,y)} in the device context {@code printDC}. */ - protected native void lineTo(long printDC, float x, float y); + protected synchronized native void lineTo(long printDC, float x, float y); - protected native void polyBezierTo(long printDC, + protected synchronized native void polyBezierTo(long printDC, float control1x, float control1y, float control2x, float control2y, float endX, float endY); @@ -1514,13 +1514,13 @@ public final class WPrinterJob extends RasterPrinterJob * be one of the following Windows constants: * {@code ALTERNATE} or {@code WINDING}. */ - protected native void setPolyFillMode(long printDC, int fillRule); + protected synchronized native void setPolyFillMode(long printDC, int fillRule); /** * Set the GDI graphics mode to {@code GM_ADVANCED} * into the device context {@code printDC}. */ - protected native int setAdvancedGraphicsMode(long printDC); + protected synchronized native int setAdvancedGraphicsMode(long printDC); /** * Set the GDI graphics {@code mode} @@ -1529,25 +1529,25 @@ public final class WPrinterJob extends RasterPrinterJob * be one of the following Windows constants: * {@code GM_COMPATIBLE} or {@code GM_ADVANCED}. */ - protected native void setGraphicsMode(long printDC, int mode); + protected synchronized native void setGraphicsMode(long printDC, int mode); /** * Scale the GDI World Transform * of the device context {@code printDC}. */ - protected native void scale(long printDC, double scaleX, double scaleY); + protected synchronized native void scale(long printDC, double scaleX, double scaleY); /** * Get the GDI World Transform * from the device context {@code printDC}. */ - protected native void getWorldTransform(long printDC, double[] transform); + protected synchronized native void getWorldTransform(long printDC, double[] transform); /** * Set the GDI World Transform * into the device context {@code printDC}. */ - protected native void setWorldTransform(long printDC, double[] transform); + protected synchronized native void setWorldTransform(long printDC, double[] transform); /** * Create a Window's solid brush for the color specified @@ -1555,7 +1555,7 @@ public final class WPrinterJob extends RasterPrinterJob * is created, select it in the device * context {@code printDC} and free the old brush. */ - protected native void selectSolidBrush(long printDC, + protected synchronized native void selectSolidBrush(long printDC, int red, int green, int blue); /** @@ -1563,32 +1563,32 @@ public final class WPrinterJob extends RasterPrinterJob * position in the device context * {@code printDC}. */ - protected native int getPenX(long printDC); + protected synchronized native int getPenX(long printDC); /** * Return the y coordinate of the current pen * position in the device context * {@code printDC}. */ - protected native int getPenY(long printDC); + protected synchronized native int getPenY(long printDC); /** * Select the device context's current path * to be the clipping path. */ - protected native void selectClipPath(long printDC); + protected synchronized native void selectClipPath(long printDC); /** * Draw a rectangle using specified brush. */ - protected native void frameRect(long printDC, float x, float y, + protected synchronized native void frameRect(long printDC, float x, float y, float width, float height); /** * Fill a rectangle specified by the coordinates using * specified brush. */ - protected native void fillRect(long printDC, float x, float y, + protected synchronized native void fillRect(long printDC, float x, float y, float width, float height, int red, int green, int blue); @@ -1596,14 +1596,14 @@ public final class WPrinterJob extends RasterPrinterJob * Create a solid brush using the RG & B colors and width. * Select this brush and delete the old one. */ - protected native void selectPen(long printDC, float width, + protected synchronized native void selectPen(long printDC, float width, int red, int green, int blue); /** * Create a solid brush using the RG & B colors and specified * pen styles. Select this created brush and delete the old one. */ - protected native boolean selectStylePen(long printDC, long cap, + protected synchronized native boolean selectStylePen(long printDC, long cap, long join, float width, int red, int green, int blue); @@ -1611,7 +1611,7 @@ public final class WPrinterJob extends RasterPrinterJob * Set a GDI font capable of drawing the java Font * passed in. */ - protected native boolean setFont(long printDC, String familyName, + protected synchronized native boolean setFont(long printDC, String familyName, float fontSize, boolean bold, boolean italic, @@ -1622,7 +1622,7 @@ public final class WPrinterJob extends RasterPrinterJob /** * Set the GDI color for text drawing. */ - protected native void setTextColor(long printDC, + protected synchronized native void setTextColor(long printDC, int red, int green, int blue); @@ -1631,12 +1631,12 @@ public final class WPrinterJob extends RasterPrinterJob * context {@code printDC} at the specified * position. */ - protected native void textOut(long printDC, String text, + protected synchronized native void textOut(long printDC, String text, int strlen, boolean glyphs, float x, float y, float[] positions); - private native int getGDIAdvance(long printDC, String text); + private synchronized native int getGDIAdvance(long printDC, String text); /** * Draw the DIB compatible image buffer represented by @@ -1653,7 +1653,7 @@ public final class WPrinterJob extends RasterPrinterJob * At the very least it needs to be padded so each scanline is * DWORD aligned. Also we "flip" the image to make it a bottom-up DIB. */ - private native void drawDIBImage(long printDC, byte[] image, + private synchronized native void drawDIBImage(long printDC, byte[] image, float destX, float destY, float destWidth, float destHeight, float srcX, float srcY, diff --git a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp index 9abe32e0fcc..9d45c3f083b 100644 --- a/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp +++ b/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp @@ -1523,6 +1523,7 @@ Java_sun_awt_windows_WPrinterJob_endDoc(JNIEnv *env, jobject self) { if (printDC != NULL){ SAVE_CONTROLWORD ::EndDoc(printDC); + AwtPrintControl::setPrintDC(env, self, (HDC)NULL); RESTORE_CONTROLWORD } @@ -1583,7 +1584,9 @@ Java_sun_awt_windows_WPrinterJob_deleteDC TRY_NO_VERIFY; - DeletePrintDC((HDC)dc); + if ((HDC)dc != NULL) { + DeletePrintDC((HDC)dc); + } if ((HGLOBAL)devmode != NULL){ ::GlobalFree((HGLOBAL)devmode); @@ -1850,6 +1853,9 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_printBand jint width, jint height) { HDC printDC = AwtPrintControl::getPrintDC(env, self); + if ((HDC)printDC == NULL) { + return; + } doPrintBand(env, printDC, imageArray, x, y, width, height); } @@ -1862,6 +1868,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_beginPath (JNIEnv *env , jobject self, jlong printDC) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::BeginPath((HDC)printDC); CATCH_BAD_ALLOC; @@ -1876,6 +1886,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_endPath (JNIEnv *env, jobject self, jlong printDC) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::EndPath((HDC)printDC); CATCH_BAD_ALLOC; @@ -1890,6 +1904,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_fillPath (JNIEnv *env, jobject self, jlong printDC) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::FillPath((HDC)printDC); CATCH_BAD_ALLOC; @@ -1904,6 +1922,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_closeFigure (JNIEnv *env, jobject self, jlong printDC) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::CloseFigure((HDC)printDC); CATCH_BAD_ALLOC; @@ -1918,6 +1940,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_lineTo (JNIEnv *env, jobject self, jlong printDC, jfloat x, jfloat y) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::LineTo((HDC)printDC, ROUND_TO_LONG(x), ROUND_TO_LONG(y)); CATCH_BAD_ALLOC; @@ -1933,6 +1959,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_moveTo (JNIEnv *env, jobject self, jlong printDC, jfloat x, jfloat y) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::MoveToEx((HDC)printDC, ROUND_TO_LONG(x), ROUND_TO_LONG(y), NULL); CATCH_BAD_ALLOC; @@ -1951,6 +1981,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_polyBezierTo TRY; + if ((HDC)printDC == NULL) { + return; + } + POINT points[3]; points[0].x = ROUND_TO_LONG(control1x); @@ -1974,6 +2008,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_setPolyFillMode (JNIEnv *env, jobject self, jlong printDC, jint fillRule) { TRY; + if ((HDC)printDC == NULL) { + return; + } + (void) ::SetPolyFillMode((HDC)printDC, fillRule); CATCH_BAD_ALLOC; @@ -1988,6 +2026,10 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_setAdvancedGraphicsMode (JNIEnv *env, jobject self, jlong printDC) { TRY; + if ((HDC)printDC == NULL) { + return 0; + } + int oldGraphicsMode = ::SetGraphicsMode((HDC)printDC, GM_ADVANCED); DASSERT(oldGraphicsMode != 0); return (jint) oldGraphicsMode; @@ -2004,6 +2046,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_setGraphicsMode (JNIEnv *env, jobject self, jlong printDC, jint mode) { TRY; + if ((HDC)printDC == NULL) { + return; + } + int oldGraphicsMode = ::SetGraphicsMode((HDC)printDC, mode); DASSERT(oldGraphicsMode != 0); @@ -2019,6 +2065,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_scale (JNIEnv *env, jobject self, jlong printDC, jdouble scaleX, jdouble scaleY) { TRY; + if ((HDC)printDC == NULL) { + return; + } + XFORM xForm; xForm.eM11 = (FLOAT) scaleX; @@ -2043,6 +2093,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_getWorldTransform (JNIEnv* env, jobject self, jlong printDC, jdoubleArray transform) { TRY; + if ((HDC)printDC == NULL) { + return; + } + double elems[6]; XFORM xForm; @@ -2070,6 +2124,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_setWorldTransform (JNIEnv* env, jobject self, jlong printDC, jdoubleArray transform) { TRY; + if ((HDC)printDC == NULL) { + return; + } + double *elems; XFORM xForm; @@ -2100,6 +2158,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_selectSolidBrush TRY; + if ((HDC)printDC == NULL) { + return; + } + HBRUSH colorBrush = ::CreateSolidBrush(RGB(red, green, blue)); HBRUSH oldBrush = (HBRUSH)::SelectObject((HDC)printDC, colorBrush); DeleteObject(oldBrush); @@ -2117,6 +2179,10 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getPenX TRY; + if ((HDC)printDC == NULL) { + return 0; + } + POINT where; ::GetCurrentPositionEx((HDC)printDC, &where); @@ -2135,6 +2201,10 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getPenY TRY; + if ((HDC)printDC == NULL) { + return 0; + } + POINT where; ::GetCurrentPositionEx((HDC)printDC, &where); @@ -2153,6 +2223,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_selectClipPath TRY; + if ((HDC)printDC == NULL) { + return; + } + ::SelectClipPath((HDC)printDC, RGN_COPY); CATCH_BAD_ALLOC; @@ -2170,6 +2244,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_frameRect TRY; + if ((HDC)printDC == NULL) { + return; + } + POINT points[5]; points[0].x = ROUND_TO_LONG(x); @@ -2200,6 +2278,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_fillRect TRY; + if ((HDC)printDC == NULL) { + return; + } + RECT rect; rect.left = ROUND_TO_LONG(x); rect.top = ROUND_TO_LONG(y); @@ -2228,6 +2310,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_selectPen TRY; + if ((HDC)printDC == NULL) { + return; + } + HPEN hpen = ::CreatePen(PS_SOLID, ROUND_TO_LONG(width), RGB(red, green, blue)); @@ -2254,6 +2340,10 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_selectStylePen TRY; + if ((HDC)printDC == NULL) { + return JNI_FALSE; + } + LOGBRUSH logBrush; logBrush.lbStyle = PS_SOLID ; @@ -2287,6 +2377,10 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont jfloat fontSize, jboolean isBold, jboolean isItalic, jint rotation, jfloat awScale) { + if ((HDC)printDC == NULL) { + return JNI_FALSE; + } + jboolean didSetFont = JNI_FALSE; didSetFont = jFontToWFontW(env, (HDC)printDC, @@ -2317,6 +2411,10 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, LOGFONTW matchedLogFont; BOOL foundFont = false; // Assume we didn't find a matching GDI font. + if ((HDC)printDC == NULL) { + return JNI_FALSE; + } + memset(&matchedLogFont, 0, sizeof(matchedLogFont)); LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); @@ -2478,6 +2576,10 @@ static int embolden(int currentWeight) JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_setTextColor (JNIEnv *env, jobject self, jlong printDC, jint red, jint green, jint blue) { + if ((HDC)printDC == NULL) { + return; + } + (void) ::SetTextColor( (HDC)printDC, RGB(red, green, blue)); } @@ -2485,6 +2587,11 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_setTextColor JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getGDIAdvance (JNIEnv *env, jobject self, jlong printDC, jstring text) { + + if ((HDC)printDC == NULL) { + return 0; + } + SIZE size; LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL); CHECK_NULL_RETURN(wText, 0); @@ -2538,6 +2645,9 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut (JNIEnv *env, jobject self, jlong printDC, jstring text, jint strLen, jboolean glyphCodes, jfloat x, jfloat y, jfloatArray positions) { + if ((HDC)printDC == NULL) { + return; + } long posX = ROUND_TO_LONG(x); long posY = ROUND_TO_LONG(y); @@ -2832,6 +2942,10 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_drawDIBImage jfloat srcWidth, jfloat srcHeight, jint bitCount, jbyteArray bmiColorsArray) { + if ((HDC)printDC == NULL) { + return; + } + int result = 0; assert(printDC != NULL); @@ -2922,6 +3036,10 @@ static void doPrintBand(JNIEnv *env, HDC printDC, jbyteArray imageArray, TRY; + if ((HDC)printDC == NULL) { + return; + } + jbyte *image = NULL; try { long scanLineStride = J2DRasterBPP * width; @@ -2966,6 +3084,10 @@ static int bitsToDevice(HDC printDC, jbyte *image, long destX, long destY, long width, long height) { int result = 0; + if ((HDC)printDC == NULL) { + return result; + } + assert(printDC != NULL); assert(image != NULL); assert(destX >= 0); @@ -3707,6 +3829,10 @@ static double convertToPoints(long value, int units) { */ void setCapabilities(JNIEnv *env, jobject self, HDC printDC) { + if ((HDC)printDC == NULL) { + return; + } + jboolean err; // width of page in pixels jint pageWid = GetDeviceCaps(printDC, PHYSICALWIDTH); diff --git a/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java b/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java index e4ce07ac038..034866c4b3c 100644 --- a/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java +++ b/test/jdk/java/awt/PrintJob/PrintJobAfterEndTest.java @@ -23,12 +23,12 @@ /* - @test - @bug 8370141 - @summary Test no crash printing to Graphics after job is ended. - @key headful printer - @run main PrintJobAfterEndTest -*/ + * @test + * @bug 8370141 8370637 + * @summary Test no crash printing to Graphics after job is ended. + * @key headful printer + * @run main PrintJobAfterEndTest + */ import java.awt.Frame; import java.awt.Graphics; diff --git a/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java b/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java index a1d173681e7..b7232e93497 100644 --- a/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java +++ b/test/jdk/java/awt/print/PrinterJob/PrintAfterEndTest.java @@ -21,10 +21,10 @@ * questions. */ -/** +/* * @test * @key printer - * @bug 8370141 + * @bug 8370141 8370637 * @summary No crash when printing after job completed. * @run main PrintAfterEndTest */ From 2872f815fdbe4a84bbec1cd910e81e2e21fffbdf Mon Sep 17 00:00:00 2001 From: Dmitry Kulikov Date: Wed, 5 Nov 2025 18:54:34 +0000 Subject: [PATCH 472/561] 8360120: Bundled macOS applications not receiving OpenURL events when launched as subprocess Reviewed-by: kizune, prr --- .../classes/com/apple/eawt/Application.java | 4 +- .../libawt_lwawt/awt/ApplicationDelegate.h | 3 +- .../libawt_lwawt/awt/ApplicationDelegate.m | 40 +++++++++++++++---- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/java.desktop/macosx/classes/com/apple/eawt/Application.java b/src/java.desktop/macosx/classes/com/apple/eawt/Application.java index c1daee47912..137aa864510 100644 --- a/src/java.desktop/macosx/classes/com/apple/eawt/Application.java +++ b/src/java.desktop/macosx/classes/com/apple/eawt/Application.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -75,6 +75,7 @@ import sun.lwawt.macosx.CPlatformWindow; */ public final class Application { private static native void nativeInitializeApplicationDelegate(); + private static native void nativeInstallOpenURLEventHandler(); static Application sApplication = null; @@ -211,6 +212,7 @@ public final class Application { * @since Java for Mac OS X 10.5 Update 8 */ public void setOpenURIHandler(final OpenURIHandler openURIHandler) { + nativeInstallOpenURLEventHandler(); eventHandler.openURIDispatcher.setHandler(openURIHandler); } diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.h b/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.h index 8d0723c555a..831bdeee603 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.h +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, 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. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ BOOL fHandlesDocumentTypes; BOOL fHandlesURLTypes; + BOOL fOpenURLHandlerInstalled; } @property (nonatomic, retain) NSMenuItem *fPreferencesMenu; diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m b/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m index b256c4121d4..d84fe9afa4a 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -243,11 +243,9 @@ AWT_ASSERT_APPKIT_THREAD; NSBundle *bundle = [NSBundle mainBundle]; fHandlesDocumentTypes = [bundle objectForInfoDictionaryKey:@"CFBundleDocumentTypes"] != nil || [bundle _hasEAWTOverride:@"DocumentHandler"]; fHandlesURLTypes = [bundle objectForInfoDictionaryKey:@"CFBundleURLTypes"] != nil || [bundle _hasEAWTOverride:@"URLHandler"]; + fOpenURLHandlerInstalled = NO; if (fHandlesURLTypes) { - [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self - andSelector:@selector(_handleOpenURLEvent:withReplyEvent:) - forEventClass:kInternetEventClass - andEventID:kAEGetURL]; + [self _installOpenURLHandler]; } // By HIG, Preferences are not available unless there is a handler. By default in Mac OS X, @@ -302,9 +300,19 @@ static jclass sjc_AppEventHandler = NULL; #define GET_APPEVENTHANDLER_CLASS_RETURN(ret) \ GET_CLASS_RETURN(sjc_AppEventHandler, "com/apple/eawt/_AppEventHandler", ret); -- (void)_handleOpenURLEvent:(NSAppleEventDescriptor *)openURLEvent withReplyEvent:(NSAppleEventDescriptor *)replyEvent { - if (!fHandlesURLTypes) return; +- (void)_installOpenURLHandler { +AWT_ASSERT_APPKIT_THREAD; + if (fOpenURLHandlerInstalled) return; + [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self + andSelector:@selector(_handleOpenURLEvent:withReplyEvent:) + forEventClass:kInternetEventClass + andEventID:kAEGetURL]; + + fOpenURLHandlerInstalled = YES; +} + +- (void)_handleOpenURLEvent:(NSAppleEventDescriptor *)openURLEvent withReplyEvent:(NSAppleEventDescriptor *)replyEvent { NSString *url = [[openURLEvent paramDescriptorForKeyword:keyDirectObject] stringValue]; [ApplicationDelegate _openURL:url]; @@ -626,6 +634,24 @@ JNI_COCOA_ENTER(env); JNI_COCOA_EXIT(env); } +/* + * Class: com_apple_eawt_Application + * Method: nativeInstallOpenURLEventHandler + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_apple_eawt_Application_nativeInstallOpenURLEventHandler +(JNIEnv *env, jclass clz) +{ +JNI_COCOA_ENTER(env); + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + ApplicationDelegate *delegate = [ApplicationDelegate sharedDelegate]; + if (delegate != nil) { + [delegate _installOpenURLHandler]; + } + }]; +JNI_COCOA_EXIT(env); +} + /* * Class: com_apple_eawt__AppEventHandler * Method: nativeOpenCocoaAboutWindow From 5a37374dcaae0d3939570b33418f772a901df21a Mon Sep 17 00:00:00 2001 From: Phil Race Date: Wed, 5 Nov 2025 18:55:07 +0000 Subject: [PATCH 473/561] 8368576: PrintJob.getGraphics() does not specify behavior after PrintJob.end() Reviewed-by: psadhukhan, tr, serb --- src/java.desktop/share/classes/java/awt/PrintJob.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java.desktop/share/classes/java/awt/PrintJob.java b/src/java.desktop/share/classes/java/awt/PrintJob.java index f4ea24efd97..926de65608b 100644 --- a/src/java.desktop/share/classes/java/awt/PrintJob.java +++ b/src/java.desktop/share/classes/java/awt/PrintJob.java @@ -46,6 +46,8 @@ public abstract class PrintJob { * The page is sent to the printer when the graphics * object is disposed. This graphics object will also implement * the PrintGraphics interface. + * If {@code PrintJob.end()} has been called, this method will + * return {@code null}. * @see PrintGraphics * @return the graphics context for printing the next page */ From acc8a76db2314211dd29a5b84c5bbe73d9055c76 Mon Sep 17 00:00:00 2001 From: Jeremy Wood Date: Wed, 5 Nov 2025 18:57:03 +0000 Subject: [PATCH 474/561] 8357034: GifImageDecoder can produce wrong transparent pixels Reviewed-by: jdv, prr --- .../sun/awt/image/GifImageDecoder.java | 6 +- test/jdk/sun/awt/image/gif/GifBuilder.java | 8 +- test/jdk/sun/awt/image/gif/GifComparison.java | 95 +++++++++++++------ .../awt/image/gif/GifEmptyBackgroundTest.java | 16 +++- .../gif/GifSavedImageTransparentTest.java | 53 +++++++++++ 5 files changed, 143 insertions(+), 35 deletions(-) create mode 100644 test/jdk/sun/awt/image/gif/GifSavedImageTransparentTest.java diff --git a/src/java.desktop/share/classes/sun/awt/image/GifImageDecoder.java b/src/java.desktop/share/classes/sun/awt/image/GifImageDecoder.java index ae7ee6618bf..a8deaa71a4b 100644 --- a/src/java.desktop/share/classes/sun/awt/image/GifImageDecoder.java +++ b/src/java.desktop/share/classes/sun/awt/image/GifImageDecoder.java @@ -343,6 +343,7 @@ public class GifImageDecoder extends ImageDecoder { private short[] prefix = new short[4096]; private byte[] suffix = new byte[4096]; private byte[] outCode = new byte[4097]; + private boolean isSavedModelReliable = true; private static native void initIDs(); @@ -396,7 +397,7 @@ public class GifImageDecoder extends ImageDecoder { int off = y * global_width + x2; boolean save = (curframe.disposal_method == GifFrame.DISPOSAL_SAVE); if (trans_pixel >= 0 && !curframe.initialframe) { - if (saved_image != null && model.equals(saved_model)) { + if (saved_image != null && model.equals(saved_model) && isSavedModelReliable) { for (int i = rasbeg; i < rasend; i++, off++) { byte pixel = rasline[i]; if ((pixel & 0xff) == trans_pixel) { @@ -406,6 +407,8 @@ public class GifImageDecoder extends ImageDecoder { } } } else { + isSavedModelReliable = false; + // We have to do this the hard way - only transmit // the non-transparent sections of the line... // Fix for 6301050: the interlacing is ignored in this case @@ -597,6 +600,7 @@ public class GifImageDecoder extends ImageDecoder { } return false; } + boolean ret = parseImage(x, y, width, height, interlace, initCodeSize, block, rasline, model); diff --git a/test/jdk/sun/awt/image/gif/GifBuilder.java b/test/jdk/sun/awt/image/gif/GifBuilder.java index 41eed6abeff..d118bdd0149 100644 --- a/test/jdk/sun/awt/image/gif/GifBuilder.java +++ b/test/jdk/sun/awt/image/gif/GifBuilder.java @@ -65,12 +65,16 @@ public class GifBuilder { /** * This creates a sample gif image based on a series of FrameDescriptions, * and the calls {@link GifComparison#run(URL)} + * + * @param frameDir an optional directory to write all frames as PNGs to. + * See {@link GifComparison#run(URL, File)} */ - public static void test(FrameDescription... frameDescriptions) + public static void test(FrameDescription[] frameDescriptions, + File frameDir) throws Throwable { File file = createTestFile(frameDescriptions); try { - GifComparison.run(file.toURI().toURL()); + GifComparison.run(file.toURI().toURL(), frameDir); } finally { file.delete(); } diff --git a/test/jdk/sun/awt/image/gif/GifComparison.java b/test/jdk/sun/awt/image/gif/GifComparison.java index d0ef3cc128d..a3deb38a810 100644 --- a/test/jdk/sun/awt/image/gif/GifComparison.java +++ b/test/jdk/sun/awt/image/gif/GifComparison.java @@ -38,6 +38,7 @@ import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ImageConsumer; import java.awt.image.IndexColorModel; +import java.io.File; import java.net.URL; import java.util.Hashtable; import java.util.LinkedList; @@ -59,13 +60,21 @@ public class GifComparison { * if ImageIO and ToolkitImage produce different BufferedImage renderings. * * @param srcURL the URL of the image to inspect + * @param frameDir an optional directory to write frames to as PNG images. + * The frames should render identically whether we use + * the ImageIO model or the ToolkitImage model. If they're + * identical, then we only output one image, such as + * "frame_0.png". If they're different then we'll + * output two images: "frame_0_iio.png" and + * "frame_0_awt.png". * * @return the last frame encoded as a TYPE_INT_ARGB image. *

          * Unit tests may further inspect this image to make sure certain * conditions are met. */ - public static BufferedImage run(URL srcURL) throws Throwable { + public static BufferedImage run(URL srcURL, File frameDir) + throws Throwable { System.out.println("Comparing ImageIO vs ToolkitImage rendering of " + srcURL); ImageIOModel ioModel = new ImageIOModel(srcURL); @@ -73,41 +82,67 @@ public class GifComparison { BufferedImage lastImage = null; - int a = ioModel.frames.size() - 1; - BufferedImage ioImg = ioModel.getFrame(a); - BufferedImage awtImage = awtModel.getFrame(a); + // if frameDir exists: test & export all frames. + // Otherwise: only test the last frame + int startIndex = frameDir == null ? ioModel.frames.size() - 1 : 0; - lastImage = awtImage; + for (int a = startIndex; a < ioModel.frames.size(); a++) { + BufferedImage ioImg = ioModel.getFrame(a); + BufferedImage awtImage = awtModel.getFrame(a); - if (!(ioImg.getWidth() == awtImage.getWidth() && - ioImg.getHeight() == awtImage.getHeight())) - throw new Error("These images are not the same size: " + - ioImg.getWidth() + "x" + ioImg.getHeight() + " vs " + - awtImage.getWidth() + "x" + awtImage.getHeight()); + lastImage = awtImage; - for (int y = 0; y < ioImg.getHeight(); y++) { - for (int x = 0; x < ioImg.getWidth(); x++) { - int argb1 = ioImg.getRGB(x, y); - int argb2 = awtImage.getRGB(x, y); + try { + if (!(ioImg.getWidth() == awtImage.getWidth() && + ioImg.getHeight() == awtImage.getHeight())) + throw new Error("These images are not the same size: " + + ioImg.getWidth() + "x" + ioImg.getHeight() + + " vs " + + awtImage.getWidth() + "x" + awtImage.getHeight()); - int alpha1 = (argb1 & 0xff000000) >> 24; - int alpha2 = (argb2 & 0xff000000) >> 24; - if (alpha1 == 0 && alpha2 == 0) { - continue; - } else if (alpha1 == 0 || alpha2 == 0) { - throw new Error("pixels at (" + x + ", " + y + - ") have different opacities: " + - Integer.toUnsignedString(argb1, 16) + " vs " + - Integer.toUnsignedString(argb2, 16)); + for (int y = 0; y < ioImg.getHeight(); y++) { + for (int x = 0; x < ioImg.getWidth(); x++) { + int argb1 = ioImg.getRGB(x, y); + int argb2 = awtImage.getRGB(x, y); + + int alpha1 = (argb1 & 0xff000000) >> 24; + int alpha2 = (argb2 & 0xff000000) >> 24; + if (alpha1 == 0 && alpha2 == 0) { + continue; + } else if (alpha1 == 0 || alpha2 == 0) { + throw new Error("pixels at (" + x + ", " + y + + ") have different opacities: " + + Integer.toUnsignedString(argb1, 16) + + " vs " + + Integer.toUnsignedString(argb2, 16)); + } + int rgb1 = argb1 & 0xffffff; + int rgb2 = argb2 & 0xffffff; + if (rgb1 != rgb2) { + throw new Error("pixels at (" + x + ", " + y + + ") have different opaque RGB values: " + + Integer.toUnsignedString(rgb1, 16) + + " vs " + + Integer.toUnsignedString(rgb2, 16)); + } + } } - int rgb1 = argb1 & 0xffffff; - int rgb2 = argb2 & 0xffffff; - if (rgb1 != rgb2) { - throw new Error("pixels at (" + x + ", " + y + - ") have different opaque RGB values: " + - Integer.toUnsignedString(rgb1, 16) + " vs " + - Integer.toUnsignedString(rgb2, 16)); + + if (frameDir != null) { + // the two models are identical, so simply write one image: + File pngFile = new File(frameDir, "frame_" + a + ".png"); + ImageIO.write(ioImg, "png", pngFile); + System.out.println("\tWrote " + pngFile); } + } catch (Throwable t) { + if (frameDir != null) { + File f1 = new File(frameDir, "frame_" + + a + "_iio.png"); + File f2 = new File(frameDir, "frame_" + + a + "_awt.png"); + ImageIO.write(ioImg, "png", f1); + ImageIO.write(awtImage, "png", f2); + System.out.println("\tWrote " + f1 + " vs " + f2); + } + throw t; } } System.out.println("Passed"); diff --git a/test/jdk/sun/awt/image/gif/GifEmptyBackgroundTest.java b/test/jdk/sun/awt/image/gif/GifEmptyBackgroundTest.java index 3adc2faa387..3b230cf3a57 100644 --- a/test/jdk/sun/awt/image/gif/GifEmptyBackgroundTest.java +++ b/test/jdk/sun/awt/image/gif/GifEmptyBackgroundTest.java @@ -28,14 +28,26 @@ * the disposal method changes from 2 to 1 */ +import java.io.File; + public class GifEmptyBackgroundTest { public static void main(String[] args) throws Throwable { - GifBuilder.test( + GifBuilder.FrameDescription[] frames = + new GifBuilder.FrameDescription[] { new GifBuilder.FrameDescription( GifBuilder.Disposal.restoreToBackgroundColor, false), new GifBuilder.FrameDescription( GifBuilder.Disposal.doNotDispose, false), new GifBuilder.FrameDescription( - GifBuilder.Disposal.doNotDispose, false) ); + GifBuilder.Disposal.doNotDispose, false) + }; + + File dir = null; + + // un-comment to visually inspect the frames: +// dir = new File("8356137-frames"); +// dir.mkdir(); + + GifBuilder.test(frames, dir); } } diff --git a/test/jdk/sun/awt/image/gif/GifSavedImageTransparentTest.java b/test/jdk/sun/awt/image/gif/GifSavedImageTransparentTest.java new file mode 100644 index 00000000000..10db453bd63 --- /dev/null +++ b/test/jdk/sun/awt/image/gif/GifSavedImageTransparentTest.java @@ -0,0 +1,53 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8357034 + * @summary This test verifies that when the transparent pixel index changes + * and we're rendering on top of another frame we respect the new transparency. + */ + +import java.io.File; + +public class GifSavedImageTransparentTest { + public static void main(String[] args) throws Throwable { + GifBuilder.FrameDescription[] frames = + new GifBuilder.FrameDescription[] { + new GifBuilder.FrameDescription( + GifBuilder.Disposal.doNotDispose, false), + new GifBuilder.FrameDescription( + GifBuilder.Disposal.doNotDispose, true), + new GifBuilder.FrameDescription( + GifBuilder.Disposal.doNotDispose, true) + }; + + File dir = null; + + // un-comment to visually inspect the frames: +// dir = new File("8357034-frames"); +// dir.mkdir(); + + GifBuilder.test(frames, dir); + } +} From 1357be98fc7aeb73655ed1a31d0b6fa7a7213c3e Mon Sep 17 00:00:00 2001 From: Ashutosh Mehra Date: Wed, 5 Nov 2025 21:38:34 +0000 Subject: [PATCH 475/561] 8371178: Preserve fast version of getfield and putfield in AOTCache Reviewed-by: adinn, iklam --- src/hotspot/share/cds/aotMetaspace.cpp | 105 ++++++++++++++++++++--- src/hotspot/share/cds/aotMetaspace.hpp | 2 +- src/hotspot/share/cds/archiveBuilder.cpp | 2 +- 3 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/hotspot/share/cds/aotMetaspace.cpp b/src/hotspot/share/cds/aotMetaspace.cpp index d80383be272..039c32a2bad 100644 --- a/src/hotspot/share/cds/aotMetaspace.cpp +++ b/src/hotspot/share/cds/aotMetaspace.cpp @@ -77,11 +77,13 @@ #include "memory/universe.hpp" #include "nmt/memTracker.hpp" #include "oops/compressedKlass.hpp" +#include "oops/constantPool.inline.hpp" #include "oops/instanceMirrorKlass.hpp" #include "oops/klass.inline.hpp" #include "oops/objArrayOop.hpp" #include "oops/oop.inline.hpp" #include "oops/oopHandle.hpp" +#include "oops/resolvedFieldEntry.hpp" #include "oops/trainingData.hpp" #include "prims/jvmtiExport.hpp" #include "runtime/arguments.hpp" @@ -519,21 +521,102 @@ void AOTMetaspace::serialize(SerializeClosure* soc) { soc->do_tag(666); } -static void rewrite_nofast_bytecode(const methodHandle& method) { +// In AOTCache workflow, when dumping preimage, the constant pool entries are stored in unresolved state. +// So the fast version of getfield/putfield needs to be converted to nofast version. +// When dumping the final image in the assembly phase, these nofast versions are converted back to fast versions +// if the constant pool entry refered by these bytecodes is stored in resolved state. +// Same principle applies to static and dynamic archives. If the constant pool entry is in resolved state, then +// the fast version of the bytecodes can be preserved, else use the nofast version. +// +// The fast versions of aload_0 (i.e. _fast_Xaccess_0) merges the bytecode pair (aload_0, fast_Xgetfield). +// If the fast version of aload_0 is preserved in AOTCache, then the JVMTI notifications for field access and +// breakpoint events will be skipped for the second bytecode (fast_Xgetfield) in the pair. +// Same holds for fast versions of iload_0. So for these bytecodes, nofast version is used. +static void rewrite_bytecodes(const methodHandle& method) { + ConstantPool* cp = method->constants(); BytecodeStream bcs(method); + Bytecodes::Code new_code; + + LogStreamHandle(Trace, aot, resolve) lsh; + if (lsh.is_enabled()) { + lsh.print("Rewriting bytecodes for "); + method()->print_external_name(&lsh); + lsh.print("\n"); + } + while (!bcs.is_last_bytecode()) { Bytecodes::Code opcode = bcs.next(); - switch (opcode) { - case Bytecodes::_getfield: *bcs.bcp() = Bytecodes::_nofast_getfield; break; - case Bytecodes::_putfield: *bcs.bcp() = Bytecodes::_nofast_putfield; break; - case Bytecodes::_aload_0: *bcs.bcp() = Bytecodes::_nofast_aload_0; break; - case Bytecodes::_iload: { - if (!bcs.is_wide()) { - *bcs.bcp() = Bytecodes::_nofast_iload; + // Use current opcode as the default value of new_code + new_code = opcode; + switch(opcode) { + case Bytecodes::_getfield: { + uint rfe_index = bcs.get_index_u2(); + bool is_resolved = cp->is_resolved(rfe_index, opcode); + if (is_resolved) { + assert(!CDSConfig::is_dumping_preimage_static_archive(), "preimage should not have resolved field references"); + ResolvedFieldEntry* rfe = cp->resolved_field_entry_at(bcs.get_index_u2()); + switch(rfe->tos_state()) { + case btos: + // fallthrough + case ztos: new_code = Bytecodes::_fast_bgetfield; break; + case atos: new_code = Bytecodes::_fast_agetfield; break; + case itos: new_code = Bytecodes::_fast_igetfield; break; + case ctos: new_code = Bytecodes::_fast_cgetfield; break; + case stos: new_code = Bytecodes::_fast_sgetfield; break; + case ltos: new_code = Bytecodes::_fast_lgetfield; break; + case ftos: new_code = Bytecodes::_fast_fgetfield; break; + case dtos: new_code = Bytecodes::_fast_dgetfield; break; + default: + ShouldNotReachHere(); + break; + } + } else { + new_code = Bytecodes::_nofast_getfield; } break; } - default: break; + case Bytecodes::_putfield: { + uint rfe_index = bcs.get_index_u2(); + bool is_resolved = cp->is_resolved(rfe_index, opcode); + if (is_resolved) { + assert(!CDSConfig::is_dumping_preimage_static_archive(), "preimage should not have resolved field references"); + ResolvedFieldEntry* rfe = cp->resolved_field_entry_at(bcs.get_index_u2()); + switch(rfe->tos_state()) { + case btos: new_code = Bytecodes::_fast_bputfield; break; + case ztos: new_code = Bytecodes::_fast_zputfield; break; + case atos: new_code = Bytecodes::_fast_aputfield; break; + case itos: new_code = Bytecodes::_fast_iputfield; break; + case ctos: new_code = Bytecodes::_fast_cputfield; break; + case stos: new_code = Bytecodes::_fast_sputfield; break; + case ltos: new_code = Bytecodes::_fast_lputfield; break; + case ftos: new_code = Bytecodes::_fast_fputfield; break; + case dtos: new_code = Bytecodes::_fast_dputfield; break; + default: + ShouldNotReachHere(); + break; + } + } else { + new_code = Bytecodes::_nofast_putfield; + } + break; + } + case Bytecodes::_aload_0: + // Revert _fast_Xaccess_0 or _aload_0 to _nofast_aload_0 + new_code = Bytecodes::_nofast_aload_0; + break; + case Bytecodes::_iload: + if (!bcs.is_wide()) { + new_code = Bytecodes::_nofast_iload; + } + break; + default: + break; + } + if (opcode != new_code) { + *bcs.bcp() = new_code; + if (lsh.is_enabled()) { + lsh.print_cr("%d:%s -> %s", bcs.bci(), Bytecodes::name(opcode), Bytecodes::name(new_code)); + } } } } @@ -541,11 +624,11 @@ static void rewrite_nofast_bytecode(const methodHandle& method) { // [1] Rewrite all bytecodes as needed, so that the ConstMethod* will not be modified // at run time by RewriteBytecodes/RewriteFrequentPairs // [2] Assign a fingerprint, so one doesn't need to be assigned at run-time. -void AOTMetaspace::rewrite_nofast_bytecodes_and_calculate_fingerprints(Thread* thread, InstanceKlass* ik) { +void AOTMetaspace::rewrite_bytecodes_and_calculate_fingerprints(Thread* thread, InstanceKlass* ik) { for (int i = 0; i < ik->methods()->length(); i++) { methodHandle m(thread, ik->methods()->at(i)); if (ik->can_be_verified_at_dumptime() && ik->is_linked()) { - rewrite_nofast_bytecode(m); + rewrite_bytecodes(m); } Fingerprinter fp(m); // The side effect of this call sets method's fingerprint field. diff --git a/src/hotspot/share/cds/aotMetaspace.hpp b/src/hotspot/share/cds/aotMetaspace.hpp index 379c684e939..c7b1578ec08 100644 --- a/src/hotspot/share/cds/aotMetaspace.hpp +++ b/src/hotspot/share/cds/aotMetaspace.hpp @@ -144,7 +144,7 @@ public: // (Heap region alignments are decided by GC). static size_t core_region_alignment(); static size_t protection_zone_size(); - static void rewrite_nofast_bytecodes_and_calculate_fingerprints(Thread* thread, InstanceKlass* ik); + static void rewrite_bytecodes_and_calculate_fingerprints(Thread* thread, InstanceKlass* ik); // print loaded classes names to file. static void dump_loaded_classes(const char* file_name, TRAPS); #endif diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index f5026339086..539c2672cf6 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -952,7 +952,7 @@ void ArchiveBuilder::make_klasses_shareable() { } } - AOTMetaspace::rewrite_nofast_bytecodes_and_calculate_fingerprints(Thread::current(), ik); + AOTMetaspace::rewrite_bytecodes_and_calculate_fingerprints(Thread::current(), ik); ik->remove_unshareable_info(); } From d5831ed866cb3d1cf2c77d7a3e535afc9e2b688b Mon Sep 17 00:00:00 2001 From: Peyang Date: Wed, 5 Nov 2025 22:26:03 +0000 Subject: [PATCH 476/561] 8357880: Code formatting typo in Cipher.getMaxAllowedParameterSpec Reviewed-by: fandreuzzi, mullan --- src/java.base/share/classes/javax/crypto/Cipher.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/javax/crypto/Cipher.java b/src/java.base/share/classes/javax/crypto/Cipher.java index f95917b5c86..6ff5a4e00ac 100644 --- a/src/java.base/share/classes/javax/crypto/Cipher.java +++ b/src/java.base/share/classes/javax/crypto/Cipher.java @@ -263,7 +263,7 @@ public class Cipher { } /** - * Creates a {code Cipher} object. Called internally by {code NullCipher}. + * Creates a {@code Cipher} object. Called internally by {@code NullCipher}. * * @param cipherSpi the delegate * @param transformation the transformation @@ -2690,7 +2690,7 @@ public class Cipher { } /** - * Returns an {code AlgorithmParameterSpec} object which contains + * Returns an {@code AlgorithmParameterSpec} object which contains * the maximum {@code Cipher} parameter value according to the * jurisdiction policy file. If JCE unlimited strength jurisdiction * policy files are installed or there is no maximum limit on the @@ -2698,7 +2698,7 @@ public class Cipher { * {@code null} will be returned. * * @param transformation the cipher transformation - * @return an {code AlgorithmParameterSpec} object which holds the maximum + * @return an {@code AlgorithmParameterSpec} object which holds the maximum * value or {@code null} * @throws NullPointerException if {@code transformation} * is {@code null} From 188da51f30e5ca3945fee91fe2e94f0466151c06 Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Thu, 6 Nov 2025 04:42:20 +0000 Subject: [PATCH 477/561] 8365699: Remove jdk.internal.javac.PreviewFeature.Feature enum values for features finalized in Java 25 or earlier Reviewed-by: vromero, liach --- .../jdk/internal/javac/PreviewFeature.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java index e6c994a12b1..eb0346c7397 100644 --- a/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java +++ b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java @@ -64,18 +64,27 @@ public @interface PreviewFeature { * Values should be annotated with the feature's {@code JEP}. */ public enum Feature { - // while building the interim javac, the ClassReader will produce a warning when loading a class - // keeping the constant of a feature that has been integrated or dropped, serves the purpose of muting such warnings. + // The JDK build process involves creating an interim javac which is then + // used to compile the rest of the JDK. The jdk.internal.javac.PreviewFeature + // annotation from the current sources is used when compiling interim javac. + // That's because the javac APIs of the current sources may be annotated with + // this annotation and they may be using the enum constants of the current sources. + // Furthermore, when compiling interim javac, the class files from the bootstrap JDK get + // used and those may also contain the PreviewFeature annotation. However, they may be + // using the enum constants of the bootstrap JDK's PreviewFeature annotation. + // If javac sees an annotation with an unknown enum constant, it produces a warning, + // and that in turn fails the build. + // So, in the current sources, we need to preserve the PreviewFeature enum constants + // for as long as the interim javac build needs it. As a result, we retain PreviewFeature + // enum constants for preview features that are present in the bootstrap JDK. + // Older constants can be removed. + // + // For example, Class-File API became final in JDK 24. As soon as JDK 23 was dropped as + // the bootstrap JDK, the CLASSFILE_API enum constant became eligible for removal. //--- - IMPLICIT_CLASSES, //to be removed when boot JDK is 25 - SCOPED_VALUES, @JEP(number=505, title="Structured Concurrency", status="Fifth Preview") STRUCTURED_CONCURRENCY, - CLASSFILE_API, - STREAM_GATHERERS, - MODULE_IMPORTS, //remove when the boot JDK is JDK 25 - KEY_DERIVATION, //remove when the boot JDK is JDK 25 @JEP(number = 502, title = "Stable Values", status = "Preview") STABLE_VALUES, @JEP(number=470, title="PEM Encodings of Cryptographic Objects", status="Preview") From 3f40f4c362f6ff4d1ec7d513b4690ed5fade3e2a Mon Sep 17 00:00:00 2001 From: Ioi Lam Date: Thu, 6 Nov 2025 04:48:29 +0000 Subject: [PATCH 478/561] 8370975: OutputAnalyzer.matches() should use Matcher with Pattern.MULTILINE Reviewed-by: stefank --- .../test/lib/process/OutputAnalyzerTest.java | 70 ++++++++++++++++++- .../jdk/test/lib/process/OutputAnalyzer.java | 52 ++++++++------ 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/test/lib-test/jdk/test/lib/process/OutputAnalyzerTest.java b/test/lib-test/jdk/test/lib/process/OutputAnalyzerTest.java index 3426c7daab9..4d916f9b1fa 100644 --- a/test/lib-test/jdk/test/lib/process/OutputAnalyzerTest.java +++ b/test/lib-test/jdk/test/lib/process/OutputAnalyzerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -217,6 +217,69 @@ public class OutputAnalyzerTest { } } + { + // Multi-line output: OutputAnalyzer uses MULTILINE but not DOTALL, so "." doesn't match newline, but + // "^" and "$" matches just after or just before, respectively, a newline. + stdout = "aaaaaa\nxxxxxx\n"; + stderr = "bbbbbb\nyyyyyy\n"; + + OutputAnalyzer out = new OutputAnalyzer(stdout, stderr); + + out.shouldMatch("aaa"); + out.shouldMatch("xxx"); + out.shouldMatch("bbb"); + out.shouldMatch("yyy"); + + out.stdoutShouldMatch("aaaaaa"); + out.stdoutShouldMatch("xxxxxx"); + out.stderrShouldMatch("bbbbbb"); + out.stderrShouldMatch("yyyyyy"); + + out.shouldMatch("^aaaaaa$"); + out.shouldMatch("^xxxxxx$"); + out.shouldMatch("^bbbbbb$"); + out.shouldMatch("^yyyyyy$"); + + out.stdoutShouldMatch("^aaaaaa$"); + out.stdoutShouldMatch("^xxxxxx$"); + out.stderrShouldMatch("^bbbbbb$"); + out.stderrShouldMatch("^yyyyyy$"); + + out.shouldMatch ("a.*"); + out.shouldNotMatch("a.*x"); + out.shouldMatch ("b.*"); + out.shouldNotMatch("b.*y"); + out.stdoutShouldMatch ("a.*"); + out.stdoutShouldNotMatch("a.*x"); + out.stderrShouldMatch ("b.*"); + out.stderrShouldNotMatch("b.*y"); + + check(out.matches("^aaaaaa$")); + check(out.matches("^yyyyyy$")); + check(out.stdoutMatches("^aaaaaa$")); + check(out.stderrMatches("^yyyyyy$")); + + check( out.matches("a.*")); + check(!out.matches("a.*x")); + + check( out.stdoutMatches("a.*")); + check(!out.stdoutMatches("a.*x")); + + check( out.stderrMatches("b.*")); + check(!out.stderrMatches("b.*y")); + + // Test the "contains" methods as well + check(out.contains("aaa\nxxx")); + check(out.contains("bbb\nyyy")); + check(out.stdoutContains("aaa\nxxx")); + check(out.stderrContains("bbb\nyyy")); + + check(!out.contains("X")); + check(!out.contains("X")); + check(!out.stdoutContains("X")); + check(!out.stderrContains("X")); + } + { try { // Verify the exception message @@ -244,4 +307,9 @@ public class OutputAnalyzerTest { } } + private static void check(boolean b) { + if (!b) { + throw new RuntimeException("Check failed"); + } + } } diff --git a/test/lib/jdk/test/lib/process/OutputAnalyzer.java b/test/lib/jdk/test/lib/process/OutputAnalyzer.java index fa5e30dd815..d8b3f470260 100644 --- a/test/lib/jdk/test/lib/process/OutputAnalyzer.java +++ b/test/lib/jdk/test/lib/process/OutputAnalyzer.java @@ -354,25 +354,44 @@ public final class OutputAnalyzer { return this; } + /** + * Returns true if the pattern can be found in the given string(s). + * + * NOTE: The meaning of "match" in OutputAnalyzer is NOT the same as String.matches(). + * Rather it means "can the pattern be found in stdout and/or stderr". + * + * The pattern is comiled with MULTILINE but without DOTALL, so "." doesn't match newline, but + * "^" and "$" matches just after or just before, respectively, a newline. + */ + private boolean findPattern(String regexp, String... strings) { + Pattern pattern = Pattern.compile(regexp, Pattern.MULTILINE); + for (String s : strings) { + if (pattern.matcher(s).find()) { + return true; + } + } + return false; + } + /** * Returns true if stdout matches the given pattern */ public boolean stdoutMatches(String regexp) { - return getStdout().matches(regexp); + return findPattern(regexp, getStdout()); } /** * Returns true if stderr matches the given pattern */ public boolean stderrMatches(String regexp) { - return getStderr().matches(regexp); + return findPattern(regexp, getStderr()); } /** * Returns true if either stdout or stderr matches the given pattern */ public boolean matches(String regexp) { - return stdoutMatches(regexp) || stderrMatches(regexp); + return findPattern(regexp, getStdout(), getStderr()); } /** @@ -383,12 +402,7 @@ public final class OutputAnalyzer { * @throws RuntimeException If the pattern was not found */ public OutputAnalyzer shouldMatch(String regexp) { - String stdout = getStdout(); - String stderr = getStderr(); - Pattern pattern = Pattern.compile(regexp, Pattern.MULTILINE); - Matcher stdoutMatcher = pattern.matcher(stdout); - Matcher stderrMatcher = pattern.matcher(stderr); - if (!stdoutMatcher.find() && !stderrMatcher.find()) { + if (!matches(regexp)) { reportDiagnosticSummary(); throw new RuntimeException("'" + regexp + "' missing from stdout/stderr"); @@ -404,9 +418,7 @@ public final class OutputAnalyzer { * @throws RuntimeException If the pattern was not found */ public OutputAnalyzer stdoutShouldMatch(String regexp) { - String stdout = getStdout(); - Matcher matcher = Pattern.compile(regexp, Pattern.MULTILINE).matcher(stdout); - if (!matcher.find()) { + if (!stdoutMatches(regexp)) { reportDiagnosticSummary(); throw new RuntimeException("'" + regexp + "' missing from stdout"); @@ -421,12 +433,10 @@ public final class OutputAnalyzer { * @param pattern * @throws RuntimeException If the pattern was not found */ - public OutputAnalyzer stderrShouldMatch(String pattern) { - String stderr = getStderr(); - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); - if (!matcher.find()) { + public OutputAnalyzer stderrShouldMatch(String regexp) { + if (!stderrMatches(regexp)) { reportDiagnosticSummary(); - throw new RuntimeException("'" + pattern + throw new RuntimeException("'" + regexp + "' missing from stderr"); } return this; @@ -468,9 +478,7 @@ public final class OutputAnalyzer { * @throws RuntimeException If the pattern was found */ public OutputAnalyzer stdoutShouldNotMatch(String regexp) { - String stdout = getStdout(); - Matcher matcher = Pattern.compile(regexp, Pattern.MULTILINE).matcher(stdout); - if (matcher.find()) { + if (stdoutMatches(regexp)) { reportDiagnosticSummary(); throw new RuntimeException("'" + regexp + "' found in stdout"); @@ -486,9 +494,7 @@ public final class OutputAnalyzer { * @throws RuntimeException If the pattern was found */ public OutputAnalyzer stderrShouldNotMatch(String regexp) { - String stderr = getStderr(); - Matcher matcher = Pattern.compile(regexp, Pattern.MULTILINE).matcher(stderr); - if (matcher.find()) { + if (stderrMatches(regexp)) { reportDiagnosticSummary(); throw new RuntimeException("'" + regexp + "' found in stderr"); From c754e3e095cd367de9d3f69a4afb0c4be53a9342 Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Thu, 6 Nov 2025 06:22:32 +0000 Subject: [PATCH 479/561] 8368528: HttpClient.Builder.connectTimeout should accept arbitrarily large values Reviewed-by: dfuchs --- .../internal/net/http/HttpQuicConnection.java | 16 +- .../internal/net/http/common/Deadline.java | 154 +++++--- .../net/httpclient/DurationOverflowTest.java | 349 ++++++++++++++++++ .../whitebox/DeadlineOverflowTestDriver.java | 30 ++ .../net/http/common/DeadlineOverflowTest.java | 129 +++++++ 5 files changed, 621 insertions(+), 57 deletions(-) create mode 100644 test/jdk/java/net/httpclient/DurationOverflowTest.java create mode 100644 test/jdk/java/net/httpclient/whitebox/DeadlineOverflowTestDriver.java create mode 100644 test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DeadlineOverflowTest.java diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/HttpQuicConnection.java b/src/java.net.http/share/classes/jdk/internal/net/http/HttpQuicConnection.java index bbbe1157cdf..0a22256f6c6 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/HttpQuicConnection.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/HttpQuicConnection.java @@ -499,22 +499,28 @@ abstract class HttpQuicConnection extends HttpConnection { }, exchange.parentExecutor.safeDelegate()); } - Optional timeout = client().connectTimeout(); CompletableFuture> fxi = handshakeCfCf; // In case of connection timeout, set up a timeout on the handshakeCfCf. // Note: this is a different timeout than the direct connection timeout. - if (timeout.isPresent()) { + Duration timeout = client().connectTimeout().orElse(null); + if (timeout != null) { // In case of timeout we need to close the quic connection - debug.log("setting up quic connect timeout: " + timeout.get().toMillis()); + debug.log("setting up quic connect timeout: " + timeout); + long timeoutMillis; + try { + timeoutMillis = timeout.toMillis(); + } catch (ArithmeticException _) { + timeoutMillis = Long.MAX_VALUE; + } fxi = handshakeCfCf.completeOnTimeout( MinimalFuture.failedFuture(new HttpConnectTimeoutException("quic connect timeout")), - timeout.get().toMillis(), TimeUnit.MILLISECONDS); + timeoutMillis, TimeUnit.MILLISECONDS); } // If we have set up any timeout, arrange to close the quicConnection // if one of the timeout expires - if (timeout.isPresent() || directTimeout.isPresent()) { + if (timeout != null || directTimeout.isPresent()) { fxi = fxi.handleAsync(this::handleTimeout, exchange.parentExecutor.safeDelegate()); } return fxi.thenCompose(Function.identity()); diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/common/Deadline.java b/src/java.net.http/share/classes/jdk/internal/net/http/common/Deadline.java index 3ee334885a3..6a042fd7d0d 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/common/Deadline.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/common/Deadline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 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. * * This code is free software; you can redistribute it and/or modify it @@ -28,14 +28,22 @@ import java.time.DateTimeException; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.time.temporal.Temporal; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalAmount; import java.time.temporal.TemporalUnit; import java.time.temporal.UnsupportedTemporalTypeException; /** - * A Deadline represents an instant on a {@linkplain TimeLine time line}. + * An instantaneous point on the {@linkplain TimeLine time-line}. + *

          + * This class is immutable and thread-safe. + *

          + * Operations that add or subtract durations to a {@code Deadline}, whether + * represented as a {@link Duration} or as a {@code long} time increment (such + * as seconds or nanoseconds) do not throw on numeric overflow if the resulting + * {@code Deadline} would exceed {@link #MAX} or be less than {@link #MIN}. + * Instead, {@code MAX} or {@code MIN} is returned, respectively. Similarly, + * methods that return a duration as a {@code long} will either return + * {@link Long#MAX_VALUE} or {@link Long#MIN_VALUE} if the returned quantity + * would exceed the capacity of a {@code long}. */ public final class Deadline implements Comparable { @@ -49,17 +57,24 @@ public final class Deadline implements Comparable { /** - * Returns a copy of this deadline with the specified duration in nanoseconds added. + * {@return a deadline with the specified duration in nanoseconds added} *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MAX} if the provided duration is positive, + * {@link Deadline#MIN} otherwise. * * @param nanosToAdd the nanoseconds to add, positive or negative - * @return a {@code Deadline} based on this deadline with the specified nanoseconds added, not null - * @throws DateTimeException if the result exceeds the maximum or minimum deadline - * @throws ArithmeticException if numeric overflow occurs */ public Deadline plusNanos(long nanosToAdd) { - return new Deadline(deadline.plusNanos(nanosToAdd)); + if (nanosToAdd == 0) return this; + try { + return new Deadline(deadline.plusNanos(nanosToAdd)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return nanosToAdd > 0 ? Deadline.MAX : Deadline.MIN; + } } /** @@ -89,92 +104,116 @@ public final class Deadline implements Comparable { } /** - * Returns a copy of this deadline with the specified amount subtracted. - *

          - * This returns a {@code Deadline}, based on this one, with the specified amount subtracted. - * The amount is typically {@link Duration} but may be any other type implementing - * the {@link TemporalAmount} interface. + * {@return a deadline with the specified amount subtracted from this deadline} *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MIN} if the provided duration is positive, + * {@link Deadline#MAX} otherwise. * - * @param amountToSubtract the amount to subtract, not null - * @return a {@code Deadline} based on this deadline with the subtraction made, not null - * @throws DateTimeException if the subtraction cannot be made - * @throws ArithmeticException if numeric overflow occurs + * @param duration the amount to subtract, not null */ - public Deadline minus(TemporalAmount amountToSubtract) { - return Deadline.of(deadline.minus(amountToSubtract)); + public Deadline minus(Duration duration) { + if (duration.isZero()) return this; + try { + return Deadline.of(deadline.minus(duration)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return duration.isPositive() ? Deadline.MIN : Deadline.MAX; + } } /** - * Returns a copy of this deadline with the specified amount added. + * {@return a deadline with the specified amount added to this deadline} *

          * This returns a {@code Deadline}, based on this one, with the amount * in terms of the unit added. If it is not possible to add the amount, because the * unit is not supported or for some other reason, an exception is thrown. *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MAX} if the provided amount is positive, + * {@link Deadline#MIN} otherwise. * * @see Instant#plus(long, TemporalUnit) * * @param amountToAdd the amount of the unit to add to the result, may be negative * @param unit the unit of the amount to add, not null - * @return a {@code Deadline} based on this deadline with the specified amount added, not null - * @throws DateTimeException if the addition cannot be made * @throws UnsupportedTemporalTypeException if the unit is not supported - * @throws ArithmeticException if numeric overflow occurs */ public Deadline plus(long amountToAdd, TemporalUnit unit) { if (amountToAdd == 0) return this; - return Deadline.of(deadline.plus(amountToAdd, unit)); + try { + return Deadline.of(deadline.plus(amountToAdd, unit)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return amountToAdd > 0 ? Deadline.MAX : Deadline.MIN; + } } /** - * Returns a copy of this deadline with the specified duration in seconds added. + * {@return a deadline with the specified duration in seconds added to this deadline} *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MAX} if the provided duration is positive, + * {@link Deadline#MIN} otherwise. * * @param secondsToAdd the seconds to add, positive or negative - * @return a {@code Deadline} based on this deadline with the specified seconds added, not null - * @throws DateTimeException if the result exceeds the maximum or minimum deadline - * @throws ArithmeticException if numeric overflow occurs */ public Deadline plusSeconds(long secondsToAdd) { if (secondsToAdd == 0) return this; - return Deadline.of(deadline.plusSeconds(secondsToAdd)); + try { + return Deadline.of(deadline.plusSeconds(secondsToAdd)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return secondsToAdd > 0 ? Deadline.MAX : Deadline.MIN; + } } /** - * Returns a copy of this deadline with the specified duration in milliseconds added. + * {@return a deadline with the specified duration in milliseconds added to this deadline} *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MAX} if the provided duration is positive, + * {@link Deadline#MIN} otherwise. * * @param millisToAdd the milliseconds to add, positive or negative - * @return a {@code Deadline} based on this deadline with the specified milliseconds added, not null - * @throws DateTimeException if the result exceeds the maximum or minimum deadline - * @throws ArithmeticException if numeric overflow occurs */ public Deadline plusMillis(long millisToAdd) { if (millisToAdd == 0) return this; - return Deadline.of(deadline.plusMillis(millisToAdd)); + try { + return Deadline.of(deadline.plusMillis(millisToAdd)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return millisToAdd > 0 ? Deadline.MAX : Deadline.MIN; + } } /** - * Returns a copy of this deadline with the specified amount added. - *

          - * This returns a {@code Deadline}, based on this one, with the specified amount added. - * The amount is typically {@link Duration} but may be any other type implementing - * the {@link TemporalAmount} interface. + * {@return a deadline with the specified duration added to this deadline} *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Deadline#MAX} if the provided duration is positive, + * {@link Deadline#MIN} otherwise. * - * @param amountToAdd the amount to add, not null - * @return a {@code Deadline} based on this deadline with the addition made, not null - * @throws DateTimeException if the addition cannot be made - * @throws ArithmeticException if numeric overflow occurs + * @param duration the duration to add, not null */ - public Deadline plus(TemporalAmount amountToAdd) { - return Deadline.of(deadline.plus(amountToAdd)); + public Deadline plus(Duration duration) { + if (duration.isZero()) return this; + try { + return Deadline.of(deadline.plus(duration)); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + return duration.isPositive() ? Deadline.MAX : Deadline.MIN; + } } /** @@ -188,16 +227,24 @@ public final class Deadline implements Comparable { * complete units between the two deadlines. *

          * This instance is immutable and unaffected by this method call. + *

          + * On {@linkplain ##overflow numeric overflows}, this method will return + * {@link Long#MAX_VALUE} if the current deadline is before the provided end + * deadline, {@link Long#MIN_VALUE} otherwise. * * @param endExclusive the end deadline, exclusive * @param unit the unit to measure the amount in, not null * @return the amount of time between this deadline and the end deadline - * @throws DateTimeException if the amount cannot be calculated * @throws UnsupportedTemporalTypeException if the unit is not supported - * @throws ArithmeticException if numeric overflow occurs */ public long until(Deadline endExclusive, TemporalUnit unit) { - return deadline.until(endExclusive.deadline, unit); + try { + return deadline.until(endExclusive.deadline, unit); + } catch (DateTimeException | // "Instant exceeds minimum or maximum instant" + ArithmeticException _) { // "long overflow" + int delta = compareTo(endExclusive); + return delta < 0 ? Long.MAX_VALUE : Long.MIN_VALUE; + } } /** @@ -266,10 +313,13 @@ public final class Deadline implements Comparable { * @param startInclusive the start deadline, inclusive, not null * @param endExclusive the end deadline, exclusive, not null * @return a {@code Duration}, not null - * @throws DateTimeException if the seconds between the deadline cannot be obtained - * @throws ArithmeticException if the calculation exceeds the capacity of {@code Duration} */ public static Duration between(Deadline startInclusive, Deadline endExclusive) { + if (startInclusive.equals(endExclusive)) return Duration.ZERO; + // `Deadline` works with `Instant` under the hood. + // Delta between `Instant.MIN` and `Instant.MAX` fits in a `Duration`. + // Hence, we should never receive a numeric overflow while calculating the delta between two deadlines. return Duration.between(startInclusive.deadline, endExclusive.deadline); } + } diff --git a/test/jdk/java/net/httpclient/DurationOverflowTest.java b/test/jdk/java/net/httpclient/DurationOverflowTest.java new file mode 100644 index 00000000000..bc836a7c5dd --- /dev/null +++ b/test/jdk/java/net/httpclient/DurationOverflowTest.java @@ -0,0 +1,349 @@ +/* + * 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. + * + * 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. + */ + +import jdk.httpclient.test.lib.common.HttpServerAdapters.HttpTestEchoHandler; +import jdk.httpclient.test.lib.common.HttpServerAdapters.HttpTestServer; +import jdk.internal.net.http.common.Logger; +import jdk.internal.net.http.common.Utils; +import jdk.test.lib.net.SimpleSSLContext; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import javax.net.ssl.SSLContext; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpClient.Version; +import java.net.http.HttpOption; +import java.net.http.HttpRequest; +import java.net.http.HttpRequest.BodyPublishers; +import java.net.http.HttpResponse.BodyHandlers; +import java.time.Duration; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import static java.net.http.HttpClient.Builder.NO_PROXY; +import static java.net.http.HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY; +import static java.nio.charset.StandardCharsets.US_ASCII; +import static jdk.httpclient.test.lib.common.HttpServerAdapters.createClientBuilderFor; + +/* + * @test id=withoutPropertyConfig + * @bug 8368528 + * @summary Verifies that `Duration`-accepting programmatic public APIs, either + * individually, or in combination, work with arbitrarily large values + * + * @library /test/jdk/java/net/httpclient/lib + * /test/lib + * + * @run junit DurationOverflowTest + */ + +/* + * @test id=withPropertyConfig + * @bug 8368528 + * @summary Verifies that `Duration`-accepting programmatic public APIs, either + * individually, or in combination, work with arbitrarily large values + * when combined with duration-accepting property-based public APIs. + * + * @library /test/jdk/java/net/httpclient/lib + * /test/lib + * + * @comment 9223372036854775807 is the value of `Long.MAX_VALUE` + * + * @run junit/othervm + * -Djdk.httpclient.keepalive.timeout=9223372036854775807 + * DurationOverflowTest + * + * @comment `h3` infra is also enabled for this test since `j.h.k.timeout.h3` + * defaults to `j.h.k.timeout.h2` + * @run junit/othervm + * -Djdk.httpclient.keepalive.timeout.h2=9223372036854775807 + * -DallowedInfras=h2,h2s,h3 + * DurationOverflowTest + * + * @run junit/othervm + * -Djdk.httpclient.keepalive.timeout.h3=9223372036854775807 + * -DallowedInfras=h3 + * DurationOverflowTest + */ + +public class DurationOverflowTest { + + private static final String CLASS_NAME = DurationOverflowTest.class.getSimpleName(); + + private static final Logger LOGGER = Utils.getDebugLogger(CLASS_NAME::toString, Utils.DEBUG); + + private static final SSLContext SSL_CONTEXT = createSslContext(); + + private static SSLContext createSslContext() { + try { + return new SimpleSSLContext().get(); + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + } + + private static final List INFRAS = loadInfras(); + + private static final class Infra implements AutoCloseable { + + private static final AtomicInteger SERVER_COUNTER = new AtomicInteger(); + + private final String serverId; + + private final HttpTestServer server; + + private final Supplier clientBuilderSupplier; + + private final Supplier requestBuilderSupplier; + + private final boolean secure; + + private Infra( + String serverId, + HttpTestServer server, + Supplier clientBuilderSupplier, + Supplier requestBuilderSupplier, + boolean secure) { + this.serverId = serverId; + this.server = server; + this.clientBuilderSupplier = clientBuilderSupplier; + this.requestBuilderSupplier = requestBuilderSupplier; + this.secure = secure; + } + + private static Infra of(Version version, boolean secure) { + + // Create the server and the request URI + var sslContext = secure ? SSL_CONTEXT : null; + var server = createServer(version, sslContext); + server.getVersion(); + var handlerPath = "/%s/".formatted(CLASS_NAME); + var requestUriScheme = secure ? "https" : "http"; + var requestUri = URI.create("%s://%s%s-".formatted(requestUriScheme, server.serverAuthority(), handlerPath)); + + // Register the request handler + var serverId = "" + SERVER_COUNTER.getAndIncrement(); + server.addHandler( + // Intentionally opting for receiving a body to cover code paths associated with its retrieval + new HttpTestEchoHandler(false), + handlerPath); + + // Create client & request builders + Supplier clientBuilderSupplier = + () -> createClientBuilderFor(version) + .version(version) + .sslContext(SSL_CONTEXT) + .proxy(NO_PROXY); + Supplier requestBuilderSupplier = + () -> createRequestBuilder(requestUri, version); + + // Create the pair + var pair = new Infra(serverId, server, clientBuilderSupplier, requestBuilderSupplier, secure); + pair.server.start(); + LOGGER.log("Server[%s] is started at `%s`", serverId, server.serverAuthority()); + return pair; + + } + + private static HttpTestServer createServer(Version version, SSLContext sslContext) { + try { + return switch (version) { + case HTTP_1_1, HTTP_2 -> HttpTestServer.create(version, sslContext, null); + case HTTP_3 -> HttpTestServer.create(HTTP_3_URI_ONLY, sslContext, null); + }; + } catch (IOException exception) { + throw new UncheckedIOException(exception); + } + } + + private static HttpRequest.Builder createRequestBuilder(URI uri, Version version) { + var requestBuilder = HttpRequest.newBuilder(uri).version(version).HEAD(); + if (Version.HTTP_3.equals(version)) { + requestBuilder.setOption(HttpOption.H3_DISCOVERY, HttpOption.Http3DiscoveryMode.HTTP_3_URI_ONLY); + } + return requestBuilder; + } + + @Override + public void close() { + LOGGER.log("Server[%s] is stopping", serverId); + server.stop(); + } + + @Override + public String toString() { + var version = server.getVersion(); + var versionString = version.toString(); + return switch (version) { + case HTTP_1_1, HTTP_2 -> secure ? versionString.replaceFirst("_", "S_") : versionString; + case HTTP_3 -> versionString; + }; + } + + } + + private static List loadInfras() { + return Stream + .of(System.getProperty("allowedInfras", "h1,h1s,h2,h2s,h3").split(",")) + .map(infra -> { + LOGGER.log("Loading test infrastructure: `%s`", infra); + return switch (infra) { + case "h1" -> Infra.of(Version.HTTP_1_1, false); + case "h1s" -> Infra.of(Version.HTTP_1_1, true); + case "h2" -> Infra.of(Version.HTTP_2, false); + case "h2s" -> Infra.of(Version.HTTP_2, true); + case "h3" -> Infra.of(Version.HTTP_3, true); + default -> throw new IllegalArgumentException("Unknown test infrastructure: " + infra); + }; + }) + .toList(); + } + + @AfterAll + static void tearDownInfras() { + LOGGER.log("Tearing down test infrastructure"); + Exception[] exceptionRef = {null}; + infras().forEach(infra -> { + try { + infra.close(); + } catch (Exception exception) { + if (exceptionRef[0] == null) { + exceptionRef[0] = exception; + } else { + exceptionRef[0].addSuppressed(exception); + } + } + }); + if (exceptionRef[0] != null) { + throw new RuntimeException("Failed tearing down one or more test infrastructures", exceptionRef[0]); + } + } + + private static Stream infras() { + return INFRAS.stream(); + } + + public static final Set EXCESSIVE_DURATIONS = Set.of( + Duration.MAX, + // This triggers different exceptions than the ones triggered by `Duration.MAX` + Duration.ofMillis(Long.MAX_VALUE)); + + private static Stream infraDurationPairs() { + return infras().flatMap(infra -> EXCESSIVE_DURATIONS.stream() + .map(duration -> new InfraDurationPair(infra, duration))); + } + + private record InfraDurationPair(Infra infra, Duration duration) {} + + @ParameterizedTest + @MethodSource("infraDurationPairs") + void testClientConnectTimeout(InfraDurationPair pair) throws Exception { + testConfig(pair.infra, clientBuilder -> clientBuilder.connectTimeout(pair.duration), null); + } + + @ParameterizedTest + @MethodSource("infraDurationPairs") + void testRequestTimeout(InfraDurationPair pair) throws Exception { + testConfig(pair.infra, null, requestBuilder -> requestBuilder.timeout(pair.duration)); + } + + private static Stream infraDurationDurationTriples() { + return infras().flatMap(infra -> EXCESSIVE_DURATIONS.stream() + .flatMap(duration1 -> EXCESSIVE_DURATIONS.stream() + .map(duration2 -> new InfraDurationDurationTriple(infra, duration1, duration2)))); + } + + private record InfraDurationDurationTriple(Infra infra, Duration duration1, Duration duration2) {} + + @ParameterizedTest + @MethodSource("infraDurationDurationTriples") + void testClientConnectTimeoutAndRequestTimeout(InfraDurationDurationTriple triple) throws Exception { + testConfig( + triple.infra, + clientBuilder -> clientBuilder.connectTimeout(triple.duration1), + requestBuilder -> requestBuilder.timeout(triple.duration2)); + } + + private static void testConfig( + Infra infra, + Consumer clientBuilderConsumer, + Consumer requestBuilderConsumer) + throws Exception { + + // Create the client + var clientBuilder = infra.clientBuilderSupplier.get(); + if (clientBuilderConsumer != null) { + clientBuilderConsumer.accept(clientBuilder); + } + try (var client = clientBuilder.build()) { + + // Create the request + byte[] expectedBytes = "abc".repeat(8192).getBytes(US_ASCII); + var requestBuilder = infra.requestBuilderSupplier.get() + // Intentionally opting for sending a body to cover code paths associated with its delivery + .POST(BodyPublishers.ofByteArray(expectedBytes)); + if (requestBuilderConsumer != null) { + requestBuilderConsumer.accept(requestBuilder); + } + var request = requestBuilder.build(); + + // Execute the request. + // Doing it twice to touch code paths before & after a protocol upgrade, if present. + for (int requestIndex = 0; requestIndex < 2; requestIndex++) { + LOGGER.log("Executing request (attempt=%s)", requestIndex + 1); + var response = client.send(request, BodyHandlers.ofByteArray()); + + // Verify the response status code + if (response.statusCode() != 200) { + var message = String.format( + "Unexpected status code: %s (attempt=%s)", + response.statusCode(), requestIndex + 1); + throw new AssertionError(message); + } + + // Verify the response body + int mismatchIndex = Arrays.mismatch(expectedBytes, response.body()); + if (mismatchIndex > 0) { + var message = String.format( + "Body mismatch at index %s (attempt=%s)", + mismatchIndex, requestIndex + 1); + throw new AssertionError(message); + } + + } + + } + + } + +} diff --git a/test/jdk/java/net/httpclient/whitebox/DeadlineOverflowTestDriver.java b/test/jdk/java/net/httpclient/whitebox/DeadlineOverflowTestDriver.java new file mode 100644 index 00000000000..a7270c2bfdb --- /dev/null +++ b/test/jdk/java/net/httpclient/whitebox/DeadlineOverflowTestDriver.java @@ -0,0 +1,30 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8368528 + * @summary Verifies that `Deadline` returns extremums on numeric overflows + * @modules java.net.http/jdk.internal.net.http.common:+open + * @run junit java.net.http/jdk.internal.net.http.common.DeadlineOverflowTest + */ diff --git a/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DeadlineOverflowTest.java b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DeadlineOverflowTest.java new file mode 100644 index 00000000000..2d3d32b084d --- /dev/null +++ b/test/jdk/java/net/httpclient/whitebox/java.net.http/jdk/internal/net/http/common/DeadlineOverflowTest.java @@ -0,0 +1,129 @@ +/* + * 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. + * + * 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 jdk.internal.net.http.common; + +import org.junit.jupiter.api.Test; + +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.ChronoUnit; + +import static java.time.temporal.ChronoUnit.NANOS; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DeadlineOverflowTest { + + @Test + void test_DeadlineOf_InstantMin() { + assertEquals(Instant.MIN, Deadline.of(Instant.MIN).asInstant()); + } + + @Test + void test_DeadlineOf_InstantMax() { + assertEquals(Instant.MAX, Deadline.of(Instant.MAX).asInstant()); + } + + @Test + void test_plusNanos_min() { + assertEquals(Deadline.MIN, Deadline.MIN.plusNanos(-1)); + } + + @Test + void test_plusNanos_max() { + assertEquals(Deadline.MAX, Deadline.MAX.plusNanos(1)); + } + + @Test + void test_minus_min() { + assertEquals(Deadline.MIN, Deadline.MIN.minus(Duration.ofNanos(1))); + } + + @Test + void test_minus_max() { + assertEquals(Deadline.MAX, Deadline.MAX.minus(Duration.ofNanos(-1))); + } + + @Test + void test_plusAmount_min() { + assertEquals(Deadline.MIN, Deadline.MIN.plus(-1, ChronoUnit.NANOS)); + } + + @Test + void test_plusAmount_max() { + assertEquals(Deadline.MAX, Deadline.MAX.plus(1, ChronoUnit.NANOS)); + } + + @Test + void test_plusSeconds_min() { + assertEquals(Deadline.MIN, Deadline.MIN.plusSeconds(-1)); + } + + @Test + void test_plusSeconds_max() { + assertEquals(Deadline.MAX, Deadline.MAX.plusSeconds(1)); + } + + @Test + void test_plusMillis_min() { + assertEquals(Deadline.MIN, Deadline.MIN.plusMillis(-1)); + } + + @Test + void test_plusMillis_max() { + assertEquals(Deadline.MAX, Deadline.MAX.plusMillis(1)); + } + + @Test + void test_plusDuration_min() { + assertEquals(Deadline.MIN, Deadline.MIN.plus(Duration.ofNanos(-1))); + } + + @Test + void test_plusDuration_max() { + assertEquals(Deadline.MAX, Deadline.MAX.plus(Duration.ofNanos(1))); + } + + @Test + void test_until_min() { + assertEquals(Long.MIN_VALUE, Deadline.MAX.until(Deadline.MIN, NANOS)); + } + + @Test + void test_until_max() { + assertEquals(Long.MAX_VALUE, Deadline.MIN.until(Deadline.MAX, NANOS)); + } + + @Test + void test_between_min() { + Duration delta = Duration.between(Instant.MAX, Instant.MIN); + assertEquals(delta, Deadline.between(Deadline.MAX, Deadline.MIN)); + } + + @Test + void test_between_max() { + Duration delta = Duration.between(Instant.MIN, Instant.MAX); + assertEquals(delta, Deadline.between(Deadline.MIN, Deadline.MAX)); + } + +} From ac9cf5d572f7504507117aa15e56c903e1400cf5 Mon Sep 17 00:00:00 2001 From: Zihao Lin Date: Thu, 6 Nov 2025 07:19:14 +0000 Subject: [PATCH 480/561] 8370878: C1: Clean up unnecessary ConversionStub constructor Reviewed-by: chagedorn --- src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp | 2 +- src/hotspot/share/c1/c1_CodeStubs.hpp | 30 --------------------- src/hotspot/share/c1/c1_LIR.cpp | 4 --- src/hotspot/share/c1/c1_LIR.hpp | 11 +++----- 4 files changed, 4 insertions(+), 43 deletions(-) diff --git a/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp b/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp index c8a3f79960b..4c339968f85 100644 --- a/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp +++ b/src/hotspot/cpu/arm/c1_LIRGenerator_arm.cpp @@ -924,7 +924,7 @@ void LIRGenerator::do_Convert(Convert* x) { LIRItem value(x->value(), this); value.load_item(); LIR_Opr reg = rlock_result(x); - __ convert(x->op(), value.result(), reg, nullptr); + __ convert(x->op(), value.result(), reg); return; } } diff --git a/src/hotspot/share/c1/c1_CodeStubs.hpp b/src/hotspot/share/c1/c1_CodeStubs.hpp index 9a462006bcc..c8b29f91bb2 100644 --- a/src/hotspot/share/c1/c1_CodeStubs.hpp +++ b/src/hotspot/share/c1/c1_CodeStubs.hpp @@ -127,36 +127,6 @@ public: }; -class ConversionStub: public CodeStub { - private: - Bytecodes::Code _bytecode; - LIR_Opr _input; - LIR_Opr _result; - - static float float_zero; - static double double_zero; - public: - ConversionStub(Bytecodes::Code bytecode, LIR_Opr input, LIR_Opr result) - : _bytecode(bytecode), _input(input), _result(result) { - ShouldNotReachHere(); - } - - Bytecodes::Code bytecode() { return _bytecode; } - LIR_Opr input() { return _input; } - LIR_Opr result() { return _result; } - - virtual void emit_code(LIR_Assembler* e); - virtual void visit(LIR_OpVisitState* visitor) { - visitor->do_slow_case(); - visitor->do_input(_input); - visitor->do_output(_result); - } -#ifndef PRODUCT - virtual void print_name(outputStream* out) const { out->print("ConversionStub"); } -#endif // PRODUCT -}; - - // Throws ArrayIndexOutOfBoundsException by default but can be // configured to throw IndexOutOfBoundsException in constructor class RangeCheckStub: public CodeStub { diff --git a/src/hotspot/share/c1/c1_LIR.cpp b/src/hotspot/share/c1/c1_LIR.cpp index 012c0f92f25..a67fa98f8f8 100644 --- a/src/hotspot/share/c1/c1_LIR.cpp +++ b/src/hotspot/share/c1/c1_LIR.cpp @@ -501,7 +501,6 @@ void LIR_OpVisitState::visit(LIR_Op* op) { assert(opConvert->_info == nullptr, "must be"); if (opConvert->_opr->is_valid()) do_input(opConvert->_opr); if (opConvert->_result->is_valid()) do_output(opConvert->_result); - do_stub(opConvert->_stub); break; } @@ -1009,9 +1008,6 @@ void LIR_OpBranch::emit_code(LIR_Assembler* masm) { void LIR_OpConvert::emit_code(LIR_Assembler* masm) { masm->emit_opConvert(this); - if (stub() != nullptr) { - masm->append_code_stub(stub()); - } } void LIR_Op2::emit_code(LIR_Assembler* masm) { diff --git a/src/hotspot/share/c1/c1_LIR.hpp b/src/hotspot/share/c1/c1_LIR.hpp index 847184731ce..80b0fd65bc1 100644 --- a/src/hotspot/share/c1/c1_LIR.hpp +++ b/src/hotspot/share/c1/c1_LIR.hpp @@ -1430,23 +1430,18 @@ class LIR_OpReturn: public LIR_Op1 { virtual LIR_OpReturn* as_OpReturn() { return this; } }; -class ConversionStub; - class LIR_OpConvert: public LIR_Op1 { friend class LIR_OpVisitState; private: Bytecodes::Code _bytecode; - ConversionStub* _stub; public: - LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub) + LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result) : LIR_Op1(lir_convert, opr, result) - , _bytecode(code) - , _stub(stub) {} + , _bytecode(code) {} Bytecodes::Code bytecode() const { return _bytecode; } - ConversionStub* stub() const { return _stub; } virtual void emit_code(LIR_Assembler* masm); virtual LIR_OpConvert* as_OpConvert() { return this; } @@ -2171,7 +2166,7 @@ class LIR_List: public CompilationResourceObj { void safepoint(LIR_Opr tmp, CodeEmitInfo* info) { append(new LIR_Op1(lir_safepoint, tmp, info)); } void return_op(LIR_Opr result) { append(new LIR_OpReturn(result)); } - void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, ConversionStub* stub = nullptr/*, bool is_32bit = false*/) { append(new LIR_OpConvert(code, left, dst, stub)); } + void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst) { append(new LIR_OpConvert(code, left, dst)); } void logical_and (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_and, left, right, dst)); } void logical_or (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_or, left, right, dst)); } From db76479a105cda383f38f5f9857a8642ccf50cfd Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Thu, 6 Nov 2025 08:06:34 +0000 Subject: [PATCH 481/561] 8371316: Adjust assertion (GC pause time cannot be smaller than the sum of each phase) in G1GCPhaseTimes::print Reviewed-by: ayang, tschatzl --- src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp index b211b1e32fb..a5013ddbb40 100644 --- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp +++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp @@ -567,8 +567,8 @@ void G1GCPhaseTimes::print(bool evacuation_failed) { accounted_ms += print_evacuate_optional_collection_set(); accounted_ms += print_post_evacuate_collection_set(evacuation_failed); - assert(_gc_pause_time_ms >= accounted_ms, "GC pause time(%.3lfms) cannot be " - "smaller than the sum of each phase(%.3lfms).", _gc_pause_time_ms, accounted_ms); + assert(_gc_pause_time_ms >= accounted_ms, "GC pause time(%.15lf ms) cannot be " + "smaller than the sum of each phase(%.15lf ms).", _gc_pause_time_ms, accounted_ms); print_other(accounted_ms); From 1b3889a47092e018ab9ecb6aaa922046d8d0e916 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Thu, 6 Nov 2025 08:27:32 +0000 Subject: [PATCH 482/561] 8354937: Cleanup some sparc related coding in os_linux Reviewed-by: ayang, mdoerr, lucy --- src/hotspot/os/linux/os_linux.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp index d1a7b7b82c8..69ef8ce7c33 100644 --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -486,13 +486,11 @@ bool os::Linux::get_tick_information(CPUPerfTicks* pticks, int which_logical_cpu } #ifndef SYS_gettid -// i386: 224, amd64: 186, sparc: 143 +// i386: 224, amd64: 186 #if defined(__i386__) #define SYS_gettid 224 #elif defined(__amd64__) #define SYS_gettid 186 - #elif defined(__sparc__) - #define SYS_gettid 143 #else #error "Define SYS_gettid for this architecture" #endif @@ -2715,8 +2713,6 @@ const char* search_string = "CPU"; const char* search_string = "cpu"; #elif defined(S390) const char* search_string = "machine ="; -#elif defined(SPARC) -const char* search_string = "cpu"; #else const char* search_string = "Processor"; #endif @@ -2766,8 +2762,6 @@ void os::get_summary_cpu_info(char* cpuinfo, size_t length) { strncpy(cpuinfo, LP64_ONLY("RISCV64") NOT_LP64("RISCV32"), length); #elif defined(S390) strncpy(cpuinfo, "S390", length); -#elif defined(SPARC) - strncpy(cpuinfo, "sparcv9", length); #elif defined(ZERO_LIBARCH) strncpy(cpuinfo, ZERO_LIBARCH, length); #else From 913c973ca0ffdc19171a56550e8a8f03ac7f4771 Mon Sep 17 00:00:00 2001 From: Kim Barrett Date: Thu, 6 Nov 2025 10:14:21 +0000 Subject: [PATCH 483/561] 8371104: gtests should use wrappers for and Reviewed-by: jrose, tschatzl --- test/hotspot/gtest/metaprogramming/test_enableIf.cpp | 3 +-- test/hotspot/gtest/riscv/test_assembler_riscv.cpp | 3 +-- test/hotspot/gtest/utilities/test_align.cpp | 3 +-- test/hotspot/gtest/utilities/test_count_leading_zeros.cpp | 5 ++--- test/hotspot/gtest/utilities/test_deferredStatic.cpp | 3 +-- test/hotspot/gtest/utilities/test_enumIterator.cpp | 3 +-- test/hotspot/gtest/utilities/test_globalDefinitions.cpp | 3 +-- test/hotspot/gtest/utilities/test_population_count.cpp | 3 +-- test/hotspot/gtest/utilities/test_powerOfTwo.cpp | 5 ++--- 9 files changed, 11 insertions(+), 20 deletions(-) diff --git a/test/hotspot/gtest/metaprogramming/test_enableIf.cpp b/test/hotspot/gtest/metaprogramming/test_enableIf.cpp index 39073309704..05603f01c64 100644 --- a/test/hotspot/gtest/metaprogramming/test_enableIf.cpp +++ b/test/hotspot/gtest/metaprogramming/test_enableIf.cpp @@ -22,13 +22,12 @@ * */ +#include "cppstdlib/type_traits.hpp" #include "memory/allStatic.hpp" #include "metaprogramming/enableIf.hpp" #include "utilities/debug.hpp" #include "unittest.hpp" -#include - class EnableIfTest: AllStatic { class A: AllStatic { public: diff --git a/test/hotspot/gtest/riscv/test_assembler_riscv.cpp b/test/hotspot/gtest/riscv/test_assembler_riscv.cpp index c6754eacae6..55504c34b0f 100644 --- a/test/hotspot/gtest/riscv/test_assembler_riscv.cpp +++ b/test/hotspot/gtest/riscv/test_assembler_riscv.cpp @@ -26,14 +26,13 @@ #include "asm/assembler.inline.hpp" #include "asm/macroAssembler.hpp" +#include "cppstdlib/limits.hpp" #include "memory/resourceArea.hpp" #include "metaprogramming/enableIf.hpp" #include "runtime/orderAccess.hpp" #include "threadHelper.inline.hpp" #include "unittest.hpp" -#include - typedef int64_t (*zicond_func)(int64_t cmp1, int64_t cmp2, int64_t dst, int64_t src); typedef void (MacroAssembler::*cmov_func)(Register cmp1, Register cmp2, Register dst, Register src); diff --git a/test/hotspot/gtest/utilities/test_align.cpp b/test/hotspot/gtest/utilities/test_align.cpp index 7413e58e7ab..3679a0b3e42 100644 --- a/test/hotspot/gtest/utilities/test_align.cpp +++ b/test/hotspot/gtest/utilities/test_align.cpp @@ -21,13 +21,12 @@ * questions. */ +#include "cppstdlib/limits.hpp" #include "utilities/align.hpp" #include "utilities/formatBuffer.hpp" #include "utilities/globalDefinitions.hpp" #include "unittest.hpp" -#include - // A few arbitrarily chosen values to test the align functions on. static constexpr uint64_t values[] = {1, 3, 10, 345, 1023, 1024, 1025, 23909034, INT_MAX, uint64_t(-1) / 2, uint64_t(-1) / 2 + 100, ~(uint64_t(1) << 62)}; diff --git a/test/hotspot/gtest/utilities/test_count_leading_zeros.cpp b/test/hotspot/gtest/utilities/test_count_leading_zeros.cpp index 4d5fcc09999..8d8f0a6f5e4 100644 --- a/test/hotspot/gtest/utilities/test_count_leading_zeros.cpp +++ b/test/hotspot/gtest/utilities/test_count_leading_zeros.cpp @@ -22,13 +22,12 @@ * */ +#include "cppstdlib/limits.hpp" +#include "cppstdlib/type_traits.hpp" #include "utilities/count_leading_zeros.hpp" #include "utilities/globalDefinitions.hpp" #include "unittest.hpp" -#include -#include - template void one_or_two_set_bits() { uint32_t bit1_pos = 0; uint32_t bits = sizeof(T) * BitsPerByte; diff --git a/test/hotspot/gtest/utilities/test_deferredStatic.cpp b/test/hotspot/gtest/utilities/test_deferredStatic.cpp index b41b1e4ee60..779c0d08b2c 100644 --- a/test/hotspot/gtest/utilities/test_deferredStatic.cpp +++ b/test/hotspot/gtest/utilities/test_deferredStatic.cpp @@ -22,12 +22,11 @@ * */ +#include "cppstdlib/type_traits.hpp" #include "utilities/debug.hpp" #include "utilities/deferredStatic.hpp" #include "utilities/globalDefinitions.hpp" -#include - #include "unittest.hpp" class DeferredStaticTestClass { diff --git a/test/hotspot/gtest/utilities/test_enumIterator.cpp b/test/hotspot/gtest/utilities/test_enumIterator.cpp index 2506e85e3d3..429efff7ede 100644 --- a/test/hotspot/gtest/utilities/test_enumIterator.cpp +++ b/test/hotspot/gtest/utilities/test_enumIterator.cpp @@ -21,11 +21,10 @@ * questions. */ +#include "cppstdlib/type_traits.hpp" #include "utilities/enumIterator.hpp" #include "unittest.hpp" -#include - enum class ExplicitTest : int { value1, value2, value3 }; ENUMERATOR_RANGE(ExplicitTest, ExplicitTest::value1, ExplicitTest::value3); constexpr int explicit_start = 0; diff --git a/test/hotspot/gtest/utilities/test_globalDefinitions.cpp b/test/hotspot/gtest/utilities/test_globalDefinitions.cpp index 4c04b77a51b..f24d74ea529 100644 --- a/test/hotspot/gtest/utilities/test_globalDefinitions.cpp +++ b/test/hotspot/gtest/utilities/test_globalDefinitions.cpp @@ -21,6 +21,7 @@ * questions. */ +#include "cppstdlib/type_traits.hpp" #include "memory/resourceArea.hpp" #include "runtime/os.hpp" #include "utilities/align.hpp" @@ -28,8 +29,6 @@ #include "utilities/ostream.hpp" #include "unittest.hpp" -#include - static ::testing::AssertionResult testPageAddress( const char* expected_addr_expr, const char* addr_expr, diff --git a/test/hotspot/gtest/utilities/test_population_count.cpp b/test/hotspot/gtest/utilities/test_population_count.cpp index 1cb7c87f434..8494d9b593e 100644 --- a/test/hotspot/gtest/utilities/test_population_count.cpp +++ b/test/hotspot/gtest/utilities/test_population_count.cpp @@ -22,14 +22,13 @@ * */ +#include "cppstdlib/limits.hpp" #include "runtime/os.hpp" #include "utilities/population_count.hpp" #include "utilities/powerOfTwo.hpp" #include "utilities/globalDefinitions.hpp" #include "unittest.hpp" -#include - #define BITS_IN_BYTE_ARRAY_SIZE 256 const uint8_t test_popcnt_bitsInByte[BITS_IN_BYTE_ARRAY_SIZE] = { diff --git a/test/hotspot/gtest/utilities/test_powerOfTwo.cpp b/test/hotspot/gtest/utilities/test_powerOfTwo.cpp index a287036e6a0..9ead9952e73 100644 --- a/test/hotspot/gtest/utilities/test_powerOfTwo.cpp +++ b/test/hotspot/gtest/utilities/test_powerOfTwo.cpp @@ -22,13 +22,12 @@ */ +#include "cppstdlib/limits.hpp" +#include "cppstdlib/type_traits.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/powerOfTwo.hpp" #include "unittest.hpp" -#include -#include - struct StaticTestIsPowerOf2Result { uint64_t _value; int _status; // 0: success, > 0 indicates which failure case From 093e128771f3dc01f64a8572de068e9776e38b97 Mon Sep 17 00:00:00 2001 From: Qizheng Xing Date: Thu, 6 Nov 2025 10:56:48 +0000 Subject: [PATCH 484/561] 8347499: C2: Make `PhaseIdealLoop` eliminate more redundant safepoints in loops Reviewed-by: epeter, roland --- src/hotspot/share/opto/loopnode.cpp | 65 ++++--- .../TestRedundantSafepointElimination.java | 177 ++++++++++++++++++ .../bench/vm/compiler/LoopSafepoint.java | 131 +++++++++++++ 3 files changed, 345 insertions(+), 28 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/TestRedundantSafepointElimination.java create mode 100644 test/micro/org/openjdk/bench/vm/compiler/LoopSafepoint.java diff --git a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp index d04eb34acee..3b398b053a3 100644 --- a/src/hotspot/share/opto/loopnode.cpp +++ b/src/hotspot/share/opto/loopnode.cpp @@ -4165,35 +4165,44 @@ void IdealLoopTree::allpaths_check_safepts(VectorSet &visited, Node_List &stack) // backedge (arc 3->2). So it deletes the ncsfpt (non-call safepoint) // in block 2, _but_ this leaves the outer loop without a safepoint. // -// entry 0 -// | -// v -// outer 1,2 +->1 -// | | -// | v -// | 2<---+ ncsfpt in 2 -// |_/|\ | -// | v | -// inner 2,3 / 3 | call in 3 -// / | | -// v +--+ -// exit 4 +// entry 0 +// | +// v +// outer 1,2,4 +-> 1 +// | \ +// | v +// inner 2,3 | 2 <---+ ncsfpt in 2 +// | / \ | +// | v v | +// | 4 3 | call in 3 +// |_/ \ \_| +// | +// v +// exit 5 // +// This method maintains a list (_required_safept) of ncsfpts that must +// be protected for each loop. It only marks ncsfpts for prevervation, +// and does not actually delete any of them. // -// This method creates a list (_required_safept) of ncsfpt nodes that must -// be protected is created for each loop. When a ncsfpt maybe deleted, it -// is first looked for in the lists for the outer loops of the current loop. +// If some other method needs to delete a ncsfpt later, it will make sure +// the ncsfpt is not in the list of all outer loops of the current loop. +// See `PhaseIdealLoop::is_deleteable_safept`. // // The insights into the problem: -// A) counted loops are okay -// B) innermost loops are okay (only an inner loop can delete -// a ncsfpt needed by an outer loop) -// C) a loop is immune from an inner loop deleting a safepoint -// if the loop has a call on the idom-path -// D) a loop is also immune if it has a ncsfpt (non-call safepoint) on the -// idom-path that is not in a nested loop -// E) otherwise, an ncsfpt on the idom-path that is nested in an inner -// loop needs to be prevented from deletion by an inner loop +// A) Counted loops are okay (i.e. do not need to preserve ncsfpts), +// they will be handled in `IdealLoopTree::counted_loop` +// B) Innermost loops are okay because there's no inner loops that can +// delete their ncsfpts. Only outer loops need to mark safepoints for +// protection, because only loops further in can accidentally delete +// their ncsfpts +// C) If an outer loop has a call that's guaranteed to execute (on the +// idom-path), then that loop is okay. Because the call will always +// perform a safepoint poll, regardless of what safepoints are deleted +// from its inner loops +// D) Similarly, if an outer loop has a ncsfpt on the idom-path that isn't +// inside any nested loop, then that loop is okay +// E) Otherwise, if an outer loop's ncsfpt on the idom-path is nested in +// an inner loop, we need to prevent the inner loop from deleting it // // There are two analyses: // 1) The first, and cheaper one, scans the loop body from @@ -4227,10 +4236,10 @@ void IdealLoopTree::check_safepts(VectorSet &visited, Node_List &stack) { break; } else if (n->Opcode() == Op_SafePoint) { if (_phase->get_loop(n) == this) { + // We found a local ncsfpt. + // Continue searching for a call that is guaranteed to be a safepoint. has_local_ncsfpt = true; - break; - } - if (nonlocal_ncsfpt == nullptr) { + } else if (nonlocal_ncsfpt == nullptr) { nonlocal_ncsfpt = n; // save the one closest to the tail } } else { diff --git a/test/hotspot/jtreg/compiler/loopopts/TestRedundantSafepointElimination.java b/test/hotspot/jtreg/compiler/loopopts/TestRedundantSafepointElimination.java new file mode 100644 index 00000000000..69f86a2bf1d --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TestRedundantSafepointElimination.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2025 Alibaba Group Holding Limited. 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. + */ + +package compiler.loopopts; + +import compiler.lib.ir_framework.*; + +/* + * @test + * @bug 8347499 + * @summary Tests that redundant safepoints can be eliminated in loops. + * @library /test/lib / + * @run main compiler.loopopts.TestRedundantSafepointElimination + */ +public class TestRedundantSafepointElimination { + public static void main(String[] args) { + TestFramework.run(); + } + + static int someInts0 = 1; + static int someInts1 = 2; + + @DontInline + private void empty() {} + + // Test for a top-level counted loop. + // There should be a non-call safepoint in the loop. + @Test + @IR(counts = {IRNode.SAFEPOINT, "1"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testTopLevelCountedLoop() { + int sum = 0; + for (int i = 0; i < 100000; i++) { + sum += someInts0; + } + return sum; + } + + // Test for a top-level counted loop with a call that dominates + // the tail of the loop. + // There should be no safepoint in the loop, because the call is + // guaranteed to have a safepoint. + @Test + @IR(counts = {IRNode.SAFEPOINT, "0"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testTopLevelCountedLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100000; i++) { + empty(); + sum += someInts0; + } + return sum; + } + + // Test for a top-level uncounted loop. + // There should be a non-call safepoint in the loop. + @Test + @IR(counts = {IRNode.SAFEPOINT, "1"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testTopLevelUncountedLoop() { + int sum = 0; + for (int i = 0; i < 100000; i += someInts0) { + sum += someInts1; + } + return sum; + } + + // Test for a top-level uncounted loop with a call that dominates + // the tail of the loop. + // There should be no safepoint in the loop, because the call is + // guaranteed to have a safepoint. + // Before JDK-8347499, this test would fail due to C2 exiting + // prematurely when encountering the local non-call safepoint. + @Test + @IR(counts = {IRNode.SAFEPOINT, "0"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testTopLevelUncountedLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100000; i += someInts0) { + empty(); + sum += someInts1; + } + return sum; + } + + // Test for nested loops, where the outer loop has a call that + // dominates its own tail. + // There should be only one safepoint in the inner loop. + // Before JDK-8347499, this test would fail due to C2 exiting + // prematurely when encountering the local non-call safepoint. + @Test + @IR(counts = {IRNode.SAFEPOINT, "1"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testOuterLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + empty(); + for (int j = 0; j < 1000; j++) { + sum += someInts1; + } + } + return sum; + } + + // Test for nested loops, where both the outer and inner loops + // have a call that dominates their tails. + // There should be no safepoint in both loops, because calls + // within them are guaranteed to have a safepoint. + // Before JDK-8347499, this test would fail due to C2 exiting + // prematurely when encountering the local non-call safepoint. + @Test + @IR(counts = {IRNode.SAFEPOINT, "0"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testOuterAndInnerLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + empty(); + for (int j = 0; j < 1000; j++) { + empty(); + sum += someInts1; + } + } + return sum; + } + + // Test for nested loops, where the outer loop has a local + // non-call safepoint. + // There should be a safepoint in both loops. + @Test + @IR(counts = {IRNode.SAFEPOINT, "2"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public int testOuterLoopWithLocalNonCallSafepoint() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + for (int j = 0; j < 1000; j++) { + sum += someInts1; + } + } + return sum; + } + + // Test for nested loops, where the outer loop has no local + // safepoints, and it must preserve a non-local safepoint. + // There should be two safepoints in the loop tree. + @Test + @IR(counts = {IRNode.SAFEPOINT, "2"}, + phase = CompilePhase.AFTER_LOOP_OPTS) + public void testLoopNeedsToPreserveSafepoint() { + int i = 0, stop; + while (i < 1000) { + stop = i + 10; + while (i < stop) { + i += 1; + } + } + } +} diff --git a/test/micro/org/openjdk/bench/vm/compiler/LoopSafepoint.java b/test/micro/org/openjdk/bench/vm/compiler/LoopSafepoint.java new file mode 100644 index 00000000000..fa69550948e --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/compiler/LoopSafepoint.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2025 Alibaba Group Holding Limited. 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. + */ + +package org.openjdk.bench.vm.compiler; + +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Fork(value = 3) +@Warmup(iterations = 5, time = 2) +@Measurement(iterations = 5, time = 3) +@State(Scope.Thread) +public class LoopSafepoint { + static int someInts0 = 1; + static int someInts1 = 2; + + @CompilerControl(CompilerControl.Mode.DONT_INLINE) + private void empty() {} + + // All benchmarks below are in sync with the IR test + // `compiler.loopopts.TestRedundantSafepointElimination.java`. + // Check the comments in the IR test for more details. + + @Benchmark + public int topLevelCountedLoop() { + int sum = 0; + for (int i = 0; i < 100000; i++) { + sum += someInts0; + } + return sum; + } + + @Benchmark + public int topLevelCountedLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100000; i++) { + empty(); + sum += someInts0; + } + return sum; + } + + @Benchmark + public int topLevelUncountedLoop() { + int sum = 0; + for (int i = 0; i < 100000; i += someInts0) { + sum += someInts1; + } + return sum; + } + + @Benchmark + public int topLevelUncountedLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100000; i += someInts0) { + empty(); + sum += someInts1; + } + return sum; + } + + @Benchmark + public int outerLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + empty(); + for (int j = 0; j < 1000; j++) { + sum += someInts1; + } + } + return sum; + } + + @Benchmark + public int outerAndInnerLoopWithDomCall() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + empty(); + for (int j = 0; j < 1000; j++) { + empty(); + sum += someInts1; + } + } + return sum; + } + + @Benchmark + public int outerLoopWithLocalNonCallSafepoint() { + int sum = 0; + for (int i = 0; i < 100; i += someInts0) { + for (int j = 0; j < 1000; j++) { + sum += someInts1; + } + } + return sum; + } + + @Benchmark + public void loopNeedsToPreserveSafepoint() { + int i = 0, stop; + while (i < 1000) { + stop = i + 10; + while (i < stop) { + i += 1; + } + } + } +} From 3930b1d4ddda9d56d0fb3626421283c72f4ad7f9 Mon Sep 17 00:00:00 2001 From: Fredrik Bredberg Date: Thu, 6 Nov 2025 12:16:19 +0000 Subject: [PATCH 485/561] 8367982: Unify ObjectSynchronizer and LightweightSynchronizer Reviewed-by: pchilanomate, coleenp --- src/hotspot/cpu/aarch64/aarch64.ad | 8 +- .../cpu/aarch64/c1_MacroAssembler_aarch64.cpp | 4 +- .../cpu/aarch64/c2_MacroAssembler_aarch64.cpp | 14 +- .../cpu/aarch64/c2_MacroAssembler_aarch64.hpp | 6 +- .../cpu/aarch64/interp_masm_aarch64.cpp | 6 +- .../cpu/aarch64/macroAssembler_aarch64.cpp | 10 +- .../cpu/aarch64/macroAssembler_aarch64.hpp | 4 +- .../cpu/aarch64/sharedRuntime_aarch64.cpp | 6 +- .../cpu/aarch64/vm_version_aarch64.hpp | 2 +- src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp | 4 +- src/hotspot/cpu/arm/c2_MacroAssembler_arm.cpp | 8 +- src/hotspot/cpu/arm/interp_masm_arm.cpp | 6 +- src/hotspot/cpu/arm/macroAssembler_arm.cpp | 8 +- src/hotspot/cpu/arm/macroAssembler_arm.hpp | 10 +- src/hotspot/cpu/arm/sharedRuntime_arm.cpp | 8 +- src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp | 4 +- src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp | 12 +- src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp | 12 +- src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp | 4 +- src/hotspot/cpu/ppc/macroAssembler_ppc.cpp | 24 +- src/hotspot/cpu/ppc/macroAssembler_ppc.hpp | 12 +- src/hotspot/cpu/ppc/ppc.ad | 16 +- src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp | 4 +- src/hotspot/cpu/ppc/vm_version_ppc.hpp | 2 +- .../cpu/riscv/c1_MacroAssembler_riscv.cpp | 4 +- .../cpu/riscv/c2_MacroAssembler_riscv.cpp | 12 +- .../cpu/riscv/c2_MacroAssembler_riscv.hpp | 10 +- src/hotspot/cpu/riscv/interp_masm_riscv.cpp | 6 +- .../cpu/riscv/macroAssembler_riscv.cpp | 8 +- .../cpu/riscv/macroAssembler_riscv.hpp | 4 +- src/hotspot/cpu/riscv/riscv.ad | 20 +- src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp | 6 +- src/hotspot/cpu/riscv/vm_version_riscv.hpp | 4 +- .../cpu/s390/c1_MacroAssembler_s390.cpp | 4 +- .../cpu/s390/c2_MacroAssembler_s390.cpp | 8 +- .../cpu/s390/c2_MacroAssembler_s390.hpp | 8 +- src/hotspot/cpu/s390/interp_masm_s390.cpp | 4 +- src/hotspot/cpu/s390/macroAssembler_s390.cpp | 32 +- src/hotspot/cpu/s390/macroAssembler_s390.hpp | 8 +- src/hotspot/cpu/s390/s390.ad | 8 +- src/hotspot/cpu/s390/sharedRuntime_s390.cpp | 4 +- src/hotspot/cpu/s390/vm_version_s390.hpp | 4 +- src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp | 4 +- src/hotspot/cpu/x86/c2_CodeStubs_x86.cpp | 4 +- src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp | 14 +- src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp | 6 +- src/hotspot/cpu/x86/interp_masm_x86.cpp | 4 +- src/hotspot/cpu/x86/macroAssembler_x86.cpp | 10 +- src/hotspot/cpu/x86/macroAssembler_x86.hpp | 4 +- src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp | 4 +- src/hotspot/cpu/x86/vm_version_x86.hpp | 2 +- src/hotspot/cpu/x86/x86.ad | 8 +- .../share/interpreter/interpreterRuntime.cpp | 2 +- src/hotspot/share/oops/markWord.hpp | 4 +- src/hotspot/share/opto/c2_CodeStubs.hpp | 8 +- src/hotspot/share/prims/jvmtiEnvBase.cpp | 2 +- src/hotspot/share/prims/whitebox.cpp | 7 +- .../share/runtime/abstract_vm_version.hpp | 4 +- src/hotspot/share/runtime/deoptimization.cpp | 7 +- src/hotspot/share/runtime/globals.hpp | 14 +- src/hotspot/share/runtime/javaThread.cpp | 2 +- .../share/runtime/lightweightSynchronizer.cpp | 1231 ---------------- .../share/runtime/lightweightSynchronizer.hpp | 80 - src/hotspot/share/runtime/lockStack.cpp | 4 +- .../share/runtime/lockStack.inline.hpp | 12 +- src/hotspot/share/runtime/objectMonitor.cpp | 6 +- src/hotspot/share/runtime/objectMonitor.hpp | 6 +- .../share/runtime/objectMonitor.inline.hpp | 8 +- src/hotspot/share/runtime/serviceThread.cpp | 6 +- src/hotspot/share/runtime/sharedRuntime.cpp | 4 +- src/hotspot/share/runtime/synchronizer.cpp | 1283 ++++++++++++++++- src/hotspot/share/runtime/synchronizer.hpp | 51 +- .../share/runtime/synchronizer.inline.hpp | 71 - src/hotspot/share/runtime/vframe.cpp | 2 +- src/hotspot/share/services/threadService.cpp | 2 +- test/hotspot/gtest/runtime/test_lockStack.cpp | 8 +- .../runtime/Monitor/TestRecursiveLocking.java | 11 +- .../lockStack/TestLockStackCapacity.java | 6 +- test/jdk/com/sun/jdi/EATests.java | 17 +- test/lib/jdk/test/whitebox/WhiteBox.java | 2 +- 80 files changed, 1551 insertions(+), 1717 deletions(-) delete mode 100644 src/hotspot/share/runtime/lightweightSynchronizer.cpp delete mode 100644 src/hotspot/share/runtime/lightweightSynchronizer.hpp delete mode 100644 src/hotspot/share/runtime/synchronizer.inline.hpp diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 1e506edb634..44d7bf1e0fa 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -16262,7 +16262,7 @@ instruct branchLoopEnd(cmpOp cmp, rFlagsReg cr, label lbl) // ============================================================================ // inlined locking and unlocking -instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3) +instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3) %{ match(Set cr (FastLock object box)); effect(TEMP tmp, TEMP tmp2, TEMP tmp3); @@ -16271,13 +16271,13 @@ instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp format %{ "fastlock $object,$box\t! kills $tmp,$tmp2,$tmp3" %} ins_encode %{ - __ fast_lock_lightweight($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register); + __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register); %} ins_pipe(pipe_serial); %} -instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3) +instruct cmpFastUnlock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2, iRegPNoSp tmp3) %{ match(Set cr (FastUnlock object box)); effect(TEMP tmp, TEMP tmp2, TEMP tmp3); @@ -16286,7 +16286,7 @@ instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNo format %{ "fastunlock $object,$box\t! kills $tmp, $tmp2, $tmp3" %} ins_encode %{ - __ fast_unlock_lightweight($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register); + __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, $tmp2$$Register, $tmp3$$Register); %} ins_pipe(pipe_serial); diff --git a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp index 31c36e749c5..e934632715c 100644 --- a/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp @@ -70,7 +70,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register basic_lo null_check_offset = offset(); - lightweight_lock(basic_lock, obj, hdr, temp, rscratch2, slow_case); + fast_lock(basic_lock, obj, hdr, temp, rscratch2, slow_case); return null_check_offset; } @@ -83,7 +83,7 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register basic ldr(obj, Address(basic_lock, BasicObjectLock::obj_offset())); verify_oop(obj); - lightweight_unlock(obj, hdr, temp, rscratch2, slow_case); + fast_unlock(obj, hdr, temp, rscratch2, slow_case); } diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp index 5f71222ed88..ebb4a897906 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp @@ -147,8 +147,8 @@ address C2_MacroAssembler::arrays_hashcode(Register ary, Register cnt, Register return pc(); } -void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register t1, - Register t2, Register t3) { +void C2_MacroAssembler::fast_lock(Register obj, Register box, Register t1, + Register t2, Register t3) { assert_different_registers(obj, box, t1, t2, t3, rscratch2); // Handle inflated monitor. @@ -173,7 +173,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist const Register t1_mark = t1; const Register t3_t = t3; - { // Lightweight locking + { // Fast locking // Push lock to the lock stack and finish successfully. MUST branch to with flag == EQ Label push; @@ -303,8 +303,8 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist // C2 uses the value of Flags (NE vs EQ) to determine the continuation. } -void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register t1, - Register t2, Register t3) { +void C2_MacroAssembler::fast_unlock(Register obj, Register box, Register t1, + Register t2, Register t3) { assert_different_registers(obj, box, t1, t2, t3); // Handle inflated monitor. @@ -318,7 +318,7 @@ void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Regi const Register t2_top = t2; const Register t3_t = t3; - { // Lightweight unlock + { // Fast unlock Label push_and_slow_path; @@ -2859,4 +2859,4 @@ void C2_MacroAssembler::vector_expand_sve(FloatRegister dst, FloatRegister src, sve_sub(dst, size, 1); // dst = 00 87 00 65 00 43 00 21 sve_tbl(dst, size, src, dst); -} \ No newline at end of file +} diff --git a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp index 09850a60c64..ccd091938a3 100644 --- a/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp @@ -51,9 +51,9 @@ FloatRegister vmul3, FloatRegister vpow, FloatRegister vpowm, BasicType eltype); - // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file. - void fast_lock_lightweight(Register object, Register box, Register t1, Register t2, Register t3); - void fast_unlock_lightweight(Register object, Register box, Register t1, Register t2, Register t3); + // Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file. + void fast_lock(Register object, Register box, Register t1, Register t2, Register t3); + void fast_unlock(Register object, Register box, Register t1, Register t2, Register t3); void string_compare(Register str1, Register str2, Register cnt1, Register cnt2, Register result, diff --git a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp index cf4d5a63496..957c2aee1c1 100644 --- a/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp @@ -709,7 +709,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg) ldr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset())); Label slow_case, done; - lightweight_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case); + fast_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case); b(done); bind(slow_case); @@ -741,7 +741,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) const Register swap_reg = r0; const Register header_reg = c_rarg2; // Will contain the old oopMark const Register obj_reg = c_rarg3; // Will contain the oop - const Register tmp_reg = c_rarg4; // Temporary used by lightweight_unlock + const Register tmp_reg = c_rarg4; // Temporary used by fast_unlock save_bcp(); // Save in case of exception @@ -752,7 +752,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) str(zr, Address(lock_reg, BasicObjectLock::obj_offset())); Label slow_case, done; - lightweight_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case); + fast_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case); b(done); bind(slow_case); diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index c83e6e12fa1..ceedb4f1063 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -6934,12 +6934,12 @@ void MacroAssembler::double_move(VMRegPair src, VMRegPair dst, Register tmp) { } } -// Implements lightweight-locking. +// Implements fast-locking. // // - obj: the object to be locked // - t1, t2, t3: temporary registers, will be destroyed // - slow: branched to if locking fails, absolute offset may larger than 32KB (imm14 encoding). -void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow) { +void MacroAssembler::fast_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow) { assert_different_registers(basic_lock, obj, t1, t2, t3, rscratch1); Label push; @@ -6993,12 +6993,12 @@ void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Registe strw(top, Address(rthread, JavaThread::lock_stack_top_offset())); } -// Implements lightweight-unlocking. +// Implements fast-unlocking. // // - obj: the object to be unlocked // - t1, t2, t3: temporary registers // - slow: branched to if unlocking fails, absolute offset may larger than 32KB (imm14 encoding). -void MacroAssembler::lightweight_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow) { // cmpxchg clobbers rscratch1. assert_different_registers(obj, t1, t2, t3, rscratch1); @@ -7044,7 +7044,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register t1, Register t2, // Check header not unlocked (0b01). Label not_unlocked; tbz(mark, log2i_exact(markWord::unlocked_value), not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp index 4468eaa40c5..4baa07d7d49 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp @@ -1721,8 +1721,8 @@ public: // Code for java.lang.Thread::onSpinWait() intrinsic. void spin_wait(); - void lightweight_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow); - void lightweight_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow); + void fast_lock(Register basic_lock, Register obj, Register t1, Register t2, Register t3, Label& slow); + void fast_unlock(Register obj, Register t1, Register t2, Register t3, Label& slow); private: // Check the current thread doesn't need a cross modify fence. diff --git a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp index 39609cbe0ac..89ae6bc10e0 100644 --- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp @@ -1707,7 +1707,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, const Register obj_reg = r19; // Will contain the oop const Register lock_reg = r13; // Address of compiler lock object (BasicLock) const Register old_hdr = r13; // value of old header at unlock time - const Register lock_tmp = r14; // Temporary used by lightweight_lock/unlock + const Register lock_tmp = r14; // Temporary used by fast_lock/unlock const Register tmp = lr; Label slow_path_lock; @@ -1724,7 +1724,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Load the oop from the handle __ ldr(obj_reg, Address(oop_handle_reg, 0)); - __ lightweight_lock(lock_reg, obj_reg, swap_reg, tmp, lock_tmp, slow_path_lock); + __ fast_lock(lock_reg, obj_reg, swap_reg, tmp, lock_tmp, slow_path_lock); // Slow path will re-enter here __ bind(lock_done); @@ -1833,7 +1833,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, save_native_result(masm, ret_type, stack_slots); } - __ lightweight_unlock(obj_reg, old_hdr, swap_reg, lock_tmp, slow_path_unlock); + __ fast_unlock(obj_reg, old_hdr, swap_reg, lock_tmp, slow_path_unlock); // slow path re-enters here __ bind(unlock_done); diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp index 5a8642a285a..3f7ba683efc 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.hpp @@ -195,7 +195,7 @@ enum Ampere_CPU_Model { // Aarch64 supports fast class initialization checks static bool supports_fast_class_init_checks() { return true; } constexpr static bool supports_stack_watermark_barrier() { return true; } - constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_recursive_fast_locking() { return true; } constexpr static bool supports_secondary_supers_table() { return true; } diff --git a/src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp b/src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp index ca7711353d2..ad6c56186df 100644 --- a/src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/c1_MacroAssembler_arm.cpp @@ -201,7 +201,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register basic_lo Register t2 = hdr; // blow Register t3 = Rtemp; // blow - lightweight_lock(obj, t1, t2, t3, 1 /* savemask - save t1 */, slow_case); + fast_lock(obj, t1, t2, t3, 1 /* savemask - save t1 */, slow_case); // Success: fall through return null_check_offset; } @@ -218,7 +218,7 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register basic Register t2 = hdr; // blow Register t3 = Rtemp; // blow - lightweight_unlock(obj, t1, t2, t3, 1 /* savemask - save t1 */, slow_case); + fast_unlock(obj, t1, t2, t3, 1 /* savemask - save t1 */, slow_case); // Success: fall through } diff --git a/src/hotspot/cpu/arm/c2_MacroAssembler_arm.cpp b/src/hotspot/cpu/arm/c2_MacroAssembler_arm.cpp index 2d26b4f9a50..83e9cc672f2 100644 --- a/src/hotspot/cpu/arm/c2_MacroAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/c2_MacroAssembler_arm.cpp @@ -90,8 +90,8 @@ void C2_MacroAssembler::fast_lock(Register Roop, Register Rbox, Register Rscratc b(done, ne); } - lightweight_lock(Roop /* obj */, Rbox /* t1 */, Rscratch /* t2 */, Rscratch2 /* t3 */, - 1 /* savemask (save t1) */, done); + MacroAssembler::fast_lock(Roop /* obj */, Rbox /* t1 */, Rscratch /* t2 */, Rscratch2 /* t3 */, + 1 /* savemask (save t1) */, done); cmp(Roop, Roop); // Success: set Z bind(done); @@ -107,8 +107,8 @@ void C2_MacroAssembler::fast_unlock(Register Roop, Register Rbox, Register Rscra Label done; - lightweight_unlock(Roop /* obj */, Rbox /* t1 */, Rscratch /* t2 */, Rscratch2 /* t3 */, - 1 /* savemask (save t1) */, done); + MacroAssembler::fast_unlock(Roop /* obj */, Rbox /* t1 */, Rscratch /* t2 */, Rscratch2 /* t3 */, + 1 /* savemask (save t1) */, done); cmp(Roop, Roop); // Success: Set Z // Fall through diff --git a/src/hotspot/cpu/arm/interp_masm_arm.cpp b/src/hotspot/cpu/arm/interp_masm_arm.cpp index 3f9130309e9..720413c9c5b 100644 --- a/src/hotspot/cpu/arm/interp_masm_arm.cpp +++ b/src/hotspot/cpu/arm/interp_masm_arm.cpp @@ -904,7 +904,7 @@ void InterpreterMacroAssembler::lock_object(Register Rlock) { b(slow_case, ne); } - lightweight_lock(Robj, R0 /* t1 */, Rmark /* t2 */, Rtemp /* t3 */, 0 /* savemask */, slow_case); + fast_lock(Robj, R0 /* t1 */, Rmark /* t2 */, Rtemp /* t3 */, 0 /* savemask */, slow_case); b(done); bind(slow_case); @@ -945,8 +945,8 @@ void InterpreterMacroAssembler::unlock_object(Register Rlock) { cmpoop(Rtemp, Robj); b(slow_case, ne); - lightweight_unlock(Robj /* obj */, Rlock /* t1 */, Rmark /* t2 */, Rtemp /* t3 */, - 1 /* savemask (save t1) */, slow_case); + fast_unlock(Robj /* obj */, Rlock /* t1 */, Rmark /* t2 */, Rtemp /* t3 */, + 1 /* savemask (save t1) */, slow_case); b(done); bind(slow_case); diff --git a/src/hotspot/cpu/arm/macroAssembler_arm.cpp b/src/hotspot/cpu/arm/macroAssembler_arm.cpp index 12462e1843c..935c9544620 100644 --- a/src/hotspot/cpu/arm/macroAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/macroAssembler_arm.cpp @@ -1750,14 +1750,14 @@ void MacroAssembler::read_polling_page(Register dest, relocInfo::relocType rtype POISON_REG(mask, 1, R2, poison) \ POISON_REG(mask, 2, R3, poison) -// Attempt to lightweight-lock an object +// Attempt to fast-lock an object // Registers: // - obj: the object to be locked // - t1, t2, t3: temp registers. If corresponding bit in savemask is set, they get saved, otherwise blown. // Result: // - Success: fallthrough // - Error: break to slow, Z cleared. -void MacroAssembler::lightweight_lock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow) { +void MacroAssembler::fast_lock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow) { assert_different_registers(obj, t1, t2, t3); #ifdef ASSERT @@ -1807,14 +1807,14 @@ void MacroAssembler::lightweight_lock(Register obj, Register t1, Register t2, Re // Success: fall through } -// Attempt to lightweight-unlock an object +// Attempt to fast-unlock an object // Registers: // - obj: the object to be unlocked // - t1, t2, t3: temp registers. If corresponding bit in savemask is set, they get saved, otherwise blown. // Result: // - Success: fallthrough // - Error: break to slow, Z cleared. -void MacroAssembler::lightweight_unlock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow) { assert_different_registers(obj, t1, t2, t3); #ifdef ASSERT diff --git a/src/hotspot/cpu/arm/macroAssembler_arm.hpp b/src/hotspot/cpu/arm/macroAssembler_arm.hpp index d60b38e42db..8e80c5bcc6e 100644 --- a/src/hotspot/cpu/arm/macroAssembler_arm.hpp +++ b/src/hotspot/cpu/arm/macroAssembler_arm.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -1010,23 +1010,23 @@ public: void cas_for_lock_acquire(Register oldval, Register newval, Register base, Register tmp, Label &slow_case, bool allow_fallthrough_on_failure = false, bool one_shot = false); void cas_for_lock_release(Register oldval, Register newval, Register base, Register tmp, Label &slow_case, bool allow_fallthrough_on_failure = false, bool one_shot = false); - // Attempt to lightweight-lock an object + // Attempt to fast-lock an object // Registers: // - obj: the object to be locked // - t1, t2, t3: temp registers. If corresponding bit in savemask is set, they get saved, otherwise blown. // Result: // - Success: fallthrough // - Error: break to slow, Z cleared. - void lightweight_lock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow); + void fast_lock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow); - // Attempt to lightweight-unlock an object + // Attempt to fast-unlock an object // Registers: // - obj: the object to be unlocked // - t1, t2, t3: temp registers. If corresponding bit in savemask is set, they get saved, otherwise blown. // Result: // - Success: fallthrough // - Error: break to slow, Z cleared. - void lightweight_unlock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow); + void fast_unlock(Register obj, Register t1, Register t2, Register t3, unsigned savemask, Label& slow); #ifndef PRODUCT // Preserves flags and all registers. diff --git a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp index 99d8773368d..76e38d29478 100644 --- a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp +++ b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp @@ -1139,8 +1139,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, __ mov(sync_handle, R1); log_trace(fastlock)("SharedRuntime lock fast"); - __ lightweight_lock(sync_obj /* object */, basic_lock /* t1 */, tmp /* t2 */, Rtemp /* t3 */, - 0x7 /* savemask */, slow_lock); + __ fast_lock(sync_obj /* object */, basic_lock /* t1 */, tmp /* t2 */, Rtemp /* t3 */, + 0x7 /* savemask */, slow_lock); // Fall through to lock_done __ bind(lock_done); } @@ -1195,8 +1195,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, Label slow_unlock, unlock_done; if (method->is_synchronized()) { log_trace(fastlock)("SharedRuntime unlock fast"); - __ lightweight_unlock(sync_obj, R2 /* t1 */, tmp /* t2 */, Rtemp /* t3 */, - 7 /* savemask */, slow_unlock); + __ fast_unlock(sync_obj, R2 /* t1 */, tmp /* t2 */, Rtemp /* t3 */, + 7 /* savemask */, slow_unlock); // Fall through __ bind(unlock_done); diff --git a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp index 04af473c99b..798451446e5 100644 --- a/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/c1_MacroAssembler_ppc.cpp @@ -82,7 +82,7 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox // Save object being locked into the BasicObjectLock... std(Roop, in_bytes(BasicObjectLock::obj_offset()), Rbox); - lightweight_lock(Rbox, Roop, Rmark, Rscratch, slow_int); + fast_lock(Rbox, Roop, Rmark, Rscratch, slow_int); b(done); bind(slow_int); @@ -104,7 +104,7 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb ld(Roop, in_bytes(BasicObjectLock::obj_offset()), Rbox); verify_oop(Roop, FILE_AND_LINE); - lightweight_unlock(Roop, Rmark, slow_int); + fast_unlock(Roop, Rmark, slow_int); b(done); bind(slow_int); b(slow_case); // far diff --git a/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp index eab3df03fde..edf348fdc50 100644 --- a/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.cpp @@ -36,14 +36,14 @@ #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") -void C2_MacroAssembler::fast_lock_lightweight(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3) { - compiler_fast_lock_lightweight_object(flag, obj, box, tmp1, tmp2, tmp3); +void C2_MacroAssembler::fast_lock(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3) { + compiler_fast_lock_object(flag, obj, box, tmp1, tmp2, tmp3); } -void C2_MacroAssembler::fast_unlock_lightweight(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3) { - compiler_fast_unlock_lightweight_object(flag, obj, box, tmp1, tmp2, tmp3); +void C2_MacroAssembler::fast_unlock(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3) { + compiler_fast_unlock_object(flag, obj, box, tmp1, tmp2, tmp3); } void C2_MacroAssembler::load_narrow_klass_compact_c2(Register dst, Register obj, int disp) { diff --git a/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp index 16b6d1935ba..5a114294c1f 100644 --- a/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/c2_MacroAssembler_ppc.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, 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. * * This code is free software; you can redistribute it and/or modify it @@ -28,11 +28,11 @@ // C2_MacroAssembler contains high-level macros for C2 public: - // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file. - void fast_lock_lightweight(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3); - void fast_unlock_lightweight(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3); + // Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file. + void fast_lock(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3); + void fast_unlock(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3); void load_narrow_klass_compact_c2(Register dst, Register obj, int disp); diff --git a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp index 0d32ea8003e..fc865be015e 100644 --- a/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp +++ b/src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp @@ -958,7 +958,7 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) { assert_different_registers(header, tmp); - lightweight_lock(monitor, object, header, tmp, slow_case); + fast_lock(monitor, object, header, tmp, slow_case); b(done); bind(slow_case); @@ -987,7 +987,7 @@ void InterpreterMacroAssembler::unlock_object(Register monitor) { // The object address from the monitor is in object. ld(object, in_bytes(BasicObjectLock::obj_offset()), monitor); - lightweight_unlock(object, header, slow_case); + fast_unlock(object, header, slow_case); b(free_slot); diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp index 5a7e2172b29..5649ead2ea8 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp @@ -2671,8 +2671,8 @@ address MacroAssembler::emit_trampoline_stub(int destination_toc_offset, } // "The box" is the space on the stack where we copy the object mark. -void MacroAssembler::compiler_fast_lock_lightweight_object(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3) { +void MacroAssembler::compiler_fast_lock_object(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3) { assert_different_registers(obj, box, tmp1, tmp2, tmp3); assert(UseObjectMonitorTable || tmp3 == noreg, "tmp3 not needed"); assert(flag == CR0, "bad condition register"); @@ -2699,7 +2699,7 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(ConditionRegister fla Register mark = tmp1; - { // Lightweight locking + { // Fast locking // Push lock to the lock stack and finish successfully. MUST reach to with flag == EQ Label push; @@ -2847,8 +2847,8 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(ConditionRegister fla // C2 uses the value of flag (NE vs EQ) to determine the continuation. } -void MacroAssembler::compiler_fast_unlock_lightweight_object(ConditionRegister flag, Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3) { +void MacroAssembler::compiler_fast_unlock_object(ConditionRegister flag, Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3) { assert_different_registers(obj, tmp1, tmp2, tmp3); assert(flag == CR0, "bad condition register"); @@ -2863,7 +2863,7 @@ void MacroAssembler::compiler_fast_unlock_lightweight_object(ConditionRegister f const Register top = tmp2; const Register t = tmp3; - { // Lightweight unlock + { // Fast unlock Label push_and_slow; // Check if obj is top of lock-stack. @@ -2904,7 +2904,7 @@ void MacroAssembler::compiler_fast_unlock_lightweight_object(ConditionRegister f Label not_unlocked; andi_(t, mark, markWord::unlocked_value); beq(CR0, not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif @@ -4588,11 +4588,11 @@ void MacroAssembler::atomically_flip_locked_state(bool is_unlock, Register obj, } } -// Implements lightweight-locking. +// Implements fast-locking. // // - obj: the object to be locked // - t1, t2: temporary register -void MacroAssembler::lightweight_lock(Register box, Register obj, Register t1, Register t2, Label& slow) { +void MacroAssembler::fast_lock(Register box, Register obj, Register t1, Register t2, Label& slow) { assert_different_registers(box, obj, t1, t2, R0); Label push; @@ -4644,11 +4644,11 @@ void MacroAssembler::lightweight_lock(Register box, Register obj, Register t1, R stw(top, in_bytes(JavaThread::lock_stack_top_offset()), R16_thread); } -// Implements lightweight-unlocking. +// Implements fast-unlocking. // // - obj: the object to be unlocked // - t1: temporary register -void MacroAssembler::lightweight_unlock(Register obj, Register t1, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register t1, Label& slow) { assert_different_registers(obj, t1); #ifdef ASSERT @@ -4706,7 +4706,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register t1, Label& slow) Label not_unlocked; andi_(t, mark, markWord::unlocked_value); beq(CR0, not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif diff --git a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp index 61e6a173823..875602cae58 100644 --- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp @@ -698,8 +698,8 @@ class MacroAssembler: public Assembler { void push_cont_fastpath(); void pop_cont_fastpath(); void atomically_flip_locked_state(bool is_unlock, Register obj, Register tmp, Label& failed, int semantics); - void lightweight_lock(Register box, Register obj, Register t1, Register t2, Label& slow); - void lightweight_unlock(Register obj, Register t1, Label& slow); + void fast_lock(Register box, Register obj, Register t1, Register t2, Label& slow); + void fast_unlock(Register obj, Register t1, Label& slow); // allocation (for C1) void tlab_allocate( @@ -713,11 +713,11 @@ class MacroAssembler: public Assembler { enum { trampoline_stub_size = 6 * 4 }; address emit_trampoline_stub(int destination_toc_offset, int insts_call_instruction_offset, Register Rtoc = noreg); - void compiler_fast_lock_lightweight_object(ConditionRegister flag, Register oop, Register box, - Register tmp1, Register tmp2, Register tmp3); + void compiler_fast_lock_object(ConditionRegister flag, Register oop, Register box, + Register tmp1, Register tmp2, Register tmp3); - void compiler_fast_unlock_lightweight_object(ConditionRegister flag, Register oop, Register box, - Register tmp1, Register tmp2, Register tmp3); + void compiler_fast_unlock_object(ConditionRegister flag, Register oop, Register box, + Register tmp1, Register tmp2, Register tmp3); // Check if safepoint requested and if so branch void safepoint_poll(Label& slow_path, Register temp, bool at_return, bool in_nmethod); diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 5488dbdb8c0..5c44fc19704 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -11551,15 +11551,15 @@ instruct partialSubtypeCheckConstSuper(rarg3RegP sub, rarg2RegP super_reg, immP // inlined locking and unlocking -instruct cmpFastLockLightweight(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2) %{ +instruct cmpFastLock(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2) %{ predicate(!UseObjectMonitorTable); match(Set crx (FastLock oop box)); effect(TEMP tmp1, TEMP tmp2); format %{ "FASTLOCK $oop, $box, $tmp1, $tmp2" %} ins_encode %{ - __ fast_lock_lightweight($crx$$CondRegister, $oop$$Register, $box$$Register, - $tmp1$$Register, $tmp2$$Register, noreg /*tmp3*/); + __ fast_lock($crx$$CondRegister, $oop$$Register, $box$$Register, + $tmp1$$Register, $tmp2$$Register, noreg /*tmp3*/); // If locking was successful, crx should indicate 'EQ'. // The compiler generates a branch to the runtime call to // _complete_monitor_locking_Java for the case where crx is 'NE'. @@ -11574,8 +11574,8 @@ instruct cmpFastLockMonitorTable(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iR format %{ "FASTLOCK $oop, $box, $tmp1, $tmp2, $tmp3" %} ins_encode %{ - __ fast_lock_lightweight($crx$$CondRegister, $oop$$Register, $box$$Register, - $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); + __ fast_lock($crx$$CondRegister, $oop$$Register, $box$$Register, + $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); // If locking was successful, crx should indicate 'EQ'. // The compiler generates a branch to the runtime call to // _complete_monitor_locking_Java for the case where crx is 'NE'. @@ -11583,14 +11583,14 @@ instruct cmpFastLockMonitorTable(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iR ins_pipe(pipe_class_compare); %} -instruct cmpFastUnlockLightweight(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3) %{ +instruct cmpFastUnlock(flagsRegCR0 crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3) %{ match(Set crx (FastUnlock oop box)); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3); format %{ "FASTUNLOCK $oop, $box, $tmp1, $tmp2" %} ins_encode %{ - __ fast_unlock_lightweight($crx$$CondRegister, $oop$$Register, $box$$Register, - $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); + __ fast_unlock($crx$$CondRegister, $oop$$Register, $box$$Register, + $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); // If unlocking was successful, crx should indicate 'EQ'. // The compiler generates a branch to the runtime call to // _complete_monitor_unlocking_Java for the case where crx is 'NE'. diff --git a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp index 4be3a0aee8b..4e427ace404 100644 --- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp @@ -2381,7 +2381,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Try fastpath for locking. // fast_lock kills r_temp_1, r_temp_2, r_temp_3. Register r_temp_3_or_noreg = UseObjectMonitorTable ? r_temp_3 : noreg; - __ compiler_fast_lock_lightweight_object(CR0, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3_or_noreg); + __ compiler_fast_lock_object(CR0, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3_or_noreg); __ beq(CR0, locked); // None of the above fast optimizations worked so we have to get into the @@ -2600,7 +2600,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, __ addi(r_box, R1_SP, lock_offset); // Try fastpath for unlocking. - __ compiler_fast_unlock_lightweight_object(CR0, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3); + __ compiler_fast_unlock_object(CR0, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3); __ beq(CR0, done); // Save and restore any potential method result value around the unlocking operation. diff --git a/src/hotspot/cpu/ppc/vm_version_ppc.hpp b/src/hotspot/cpu/ppc/vm_version_ppc.hpp index 9588edc4bf8..11dce83bed0 100644 --- a/src/hotspot/cpu/ppc/vm_version_ppc.hpp +++ b/src/hotspot/cpu/ppc/vm_version_ppc.hpp @@ -62,7 +62,7 @@ public: // PPC64 supports fast class initialization checks static bool supports_fast_class_init_checks() { return true; } constexpr static bool supports_stack_watermark_barrier() { return true; } - constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_recursive_fast_locking() { return true; } constexpr static bool supports_secondary_supers_table() { return true; } static bool supports_float16() { return PowerArchitecturePPC64 >= 9; } diff --git a/src/hotspot/cpu/riscv/c1_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_MacroAssembler_riscv.cpp index 8e989de2665..aeb077ba0a0 100644 --- a/src/hotspot/cpu/riscv/c1_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_MacroAssembler_riscv.cpp @@ -59,7 +59,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register basic_lo null_check_offset = offset(); - lightweight_lock(basic_lock, obj, hdr, temp, t1, slow_case); + fast_lock(basic_lock, obj, hdr, temp, t1, slow_case); return null_check_offset; } @@ -71,7 +71,7 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register basic ld(obj, Address(basic_lock, BasicObjectLock::obj_offset())); verify_oop(obj); - lightweight_unlock(obj, hdr, temp, t1, slow_case); + fast_unlock(obj, hdr, temp, t1, slow_case); } // Defines obj, preserves var_size_in_bytes diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp index 154b62db47f..abbd7eedbba 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp @@ -43,8 +43,8 @@ #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") -void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3, Register tmp4) { +void C2_MacroAssembler::fast_lock(Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3, Register tmp4) { // Flag register, zero for success; non-zero for failure. Register flag = t1; @@ -74,7 +74,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, const Register tmp1_mark = tmp1; const Register tmp3_t = tmp3; - { // Lightweight locking + { // Fast locking // Push lock to the lock stack and finish successfully. MUST branch to with flag == 0 Label push; @@ -205,8 +205,8 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, // C2 uses the value of flag (0 vs !0) to determine the continuation. } -void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, - Register tmp1, Register tmp2, Register tmp3) { +void C2_MacroAssembler::fast_unlock(Register obj, Register box, + Register tmp1, Register tmp2, Register tmp3) { // Flag register, zero for success; non-zero for failure. Register flag = t1; @@ -225,7 +225,7 @@ void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, const Register tmp2_top = tmp2; const Register tmp3_t = tmp3; - { // Lightweight unlock + { // Fast unlock Label push_and_slow_path; // Check if obj is top of lock-stack. diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp index 2d5339dc153..f08e5e27c87 100644 --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp @@ -49,11 +49,11 @@ const int STUB_THRESHOLD, Label *STUB, Label *DONE); public: - // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in .ad file. - void fast_lock_lightweight(Register object, Register box, - Register tmp1, Register tmp2, Register tmp3, Register tmp4); - void fast_unlock_lightweight(Register object, Register box, - Register tmp1, Register tmp2, Register tmp3); + // Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file. + void fast_lock(Register object, Register box, + Register tmp1, Register tmp2, Register tmp3, Register tmp4); + void fast_unlock(Register object, Register box, + Register tmp1, Register tmp2, Register tmp3); void string_compare(Register str1, Register str2, Register cnt1, Register cnt2, Register result, diff --git a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp index 5af8ea1da37..189c7c93d07 100644 --- a/src/hotspot/cpu/riscv/interp_masm_riscv.cpp +++ b/src/hotspot/cpu/riscv/interp_masm_riscv.cpp @@ -751,7 +751,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg) ld(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset())); Label done, slow_case; - lightweight_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case); + fast_lock(lock_reg, obj_reg, tmp, tmp2, tmp3, slow_case); j(done); bind(slow_case); @@ -782,7 +782,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) const Register swap_reg = x10; const Register header_reg = c_rarg2; // Will contain the old oopMark const Register obj_reg = c_rarg3; // Will contain the oop - const Register tmp_reg = c_rarg4; // Temporary used by lightweight_unlock + const Register tmp_reg = c_rarg4; // Temporary used by fast_unlock save_bcp(); // Save in case of exception @@ -793,7 +793,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) sd(zr, Address(lock_reg, BasicObjectLock::obj_offset())); Label done, slow_case; - lightweight_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case); + fast_unlock(obj_reg, header_reg, swap_reg, tmp_reg, slow_case); j(done); bind(slow_case); diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp index 54304ec648d..7a8496ae42b 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp @@ -6435,12 +6435,12 @@ void MacroAssembler::test_bit(Register Rd, Register Rs, uint32_t bit_pos) { } } -// Implements lightweight-locking. +// Implements fast-locking. // // - obj: the object to be locked // - tmp1, tmp2, tmp3: temporary registers, will be destroyed // - slow: branched to if locking fails -void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow) { +void MacroAssembler::fast_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow) { assert_different_registers(basic_lock, obj, tmp1, tmp2, tmp3, t0); Label push; @@ -6499,7 +6499,7 @@ void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Registe // - obj: the object to be unlocked // - tmp1, tmp2, tmp3: temporary registers // - slow: branched to if unlocking fails -void MacroAssembler::lightweight_unlock(Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow) { assert_different_registers(obj, tmp1, tmp2, tmp3, t0); #ifdef ASSERT @@ -6546,7 +6546,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register tmp1, Register tm Label not_unlocked; test_bit(t, mark, exact_log2(markWord::unlocked_value)); beqz(t, not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp index e0e610ff49a..1908b9a9605 100644 --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.hpp @@ -1639,8 +1639,8 @@ private: void store_conditional(Register dst, Register new_val, Register addr, Assembler::operand_size size, Assembler::Aqrl release); public: - void lightweight_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow); - void lightweight_unlock(Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow); + void fast_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow); + void fast_unlock(Register obj, Register tmp1, Register tmp2, Register tmp3, Label& slow); public: enum { diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index 34177701900..e23adcf2488 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -11039,36 +11039,36 @@ instruct tlsLoadP(javaThread_RegP dst) // inlined locking and unlocking // using t1 as the 'flag' register to bridge the BoolNode producers and consumers -instruct cmpFastLockLightweight(rFlagsReg cr, iRegP object, iRegP box, - iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4) +instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, + iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4) %{ match(Set cr (FastLock object box)); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4); ins_cost(10 * DEFAULT_COST); - format %{ "fastlock $object,$box\t! kills $tmp1,$tmp2,$tmp3,$tmp4 #@cmpFastLockLightweight" %} + format %{ "fastlock $object,$box\t! kills $tmp1,$tmp2,$tmp3,$tmp4 #@cmpFastLock" %} ins_encode %{ - __ fast_lock_lightweight($object$$Register, $box$$Register, - $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register); + __ fast_lock($object$$Register, $box$$Register, + $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register); %} ins_pipe(pipe_serial); %} // using t1 as the 'flag' register to bridge the BoolNode producers and consumers -instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, - iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3) +instruct cmpFastUnlock(rFlagsReg cr, iRegP object, iRegP box, + iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3) %{ match(Set cr (FastUnlock object box)); effect(TEMP tmp1, TEMP tmp2, TEMP tmp3); ins_cost(10 * DEFAULT_COST); - format %{ "fastunlock $object,$box\t! kills $tmp1,$tmp2,$tmp3 #@cmpFastUnlockLightweight" %} + format %{ "fastunlock $object,$box\t! kills $tmp1,$tmp2,$tmp3 #@cmpFastUnlock" %} ins_encode %{ - __ fast_unlock_lightweight($object$$Register, $box$$Register, - $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); + __ fast_unlock($object$$Register, $box$$Register, + $tmp1$$Register, $tmp2$$Register, $tmp3$$Register); %} ins_pipe(pipe_serial); diff --git a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp index e64fc2ffc80..eeb6fad1b59 100644 --- a/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp +++ b/src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp @@ -1642,7 +1642,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, const Register obj_reg = x9; // Will contain the oop const Register lock_reg = x30; // Address of compiler lock object (BasicLock) const Register old_hdr = x30; // value of old header at unlock time - const Register lock_tmp = x31; // Temporary used by lightweight_lock/unlock + const Register lock_tmp = x31; // Temporary used by fast_lock/unlock const Register tmp = ra; Label slow_path_lock; @@ -1659,7 +1659,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Load the oop from the handle __ ld(obj_reg, Address(oop_handle_reg, 0)); - __ lightweight_lock(lock_reg, obj_reg, swap_reg, tmp, lock_tmp, slow_path_lock); + __ fast_lock(lock_reg, obj_reg, swap_reg, tmp, lock_tmp, slow_path_lock); // Slow path will re-enter here __ bind(lock_done); @@ -1754,7 +1754,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, save_native_result(masm, ret_type, stack_slots); } - __ lightweight_unlock(obj_reg, old_hdr, swap_reg, lock_tmp, slow_path_unlock); + __ fast_unlock(obj_reg, old_hdr, swap_reg, lock_tmp, slow_path_unlock); // slow path re-enters here __ bind(unlock_done); diff --git a/src/hotspot/cpu/riscv/vm_version_riscv.hpp b/src/hotspot/cpu/riscv/vm_version_riscv.hpp index f74992cbc37..16f2e5d8f5b 100644 --- a/src/hotspot/cpu/riscv/vm_version_riscv.hpp +++ b/src/hotspot/cpu/riscv/vm_version_riscv.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved. * Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved. * Copyright (c) 2023, Rivos Inc. All rights reserved. @@ -498,7 +498,7 @@ private: constexpr static bool supports_stack_watermark_barrier() { return true; } - constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_recursive_fast_locking() { return true; } constexpr static bool supports_secondary_supers_table() { return true; } diff --git a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp index 91d52def08d..993c1a1b552 100644 --- a/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp @@ -67,7 +67,7 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox // Save object being locked into the BasicObjectLock... z_stg(Roop, Address(Rbox, BasicObjectLock::obj_offset())); - lightweight_lock(Rbox, Roop, Rmark, tmp, slow_case); + fast_lock(Rbox, Roop, Rmark, tmp, slow_case); } void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rbox, Label& slow_case) { @@ -77,7 +77,7 @@ void C1_MacroAssembler::unlock_object(Register Rmark, Register Roop, Register Rb z_lg(Roop, Address(Rbox, BasicObjectLock::obj_offset())); verify_oop(Roop, FILE_AND_LINE); - lightweight_unlock(Roop, Rmark, Z_R1_scratch, slow_case); + fast_unlock(Roop, Rmark, Z_R1_scratch, slow_case); } void C1_MacroAssembler::try_allocate( diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp index 485efec6b9b..957c89af3fc 100644 --- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.cpp @@ -32,13 +32,13 @@ #define BLOCK_COMMENT(str) block_comment(str) #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") -void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2) { - compiler_fast_lock_lightweight_object(obj, box, temp1, temp2); +void C2_MacroAssembler::fast_lock(Register obj, Register box, Register temp1, Register temp2) { + compiler_fast_lock_object(obj, box, temp1, temp2); } -void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2) { - compiler_fast_unlock_lightweight_object(obj, box, temp1, temp2); +void C2_MacroAssembler::fast_unlock(Register obj, Register box, Register temp1, Register temp2) { + compiler_fast_unlock_object(obj, box, temp1, temp2); } void C2_MacroAssembler::load_narrow_klass_compact_c2(Register dst, Address src) { diff --git a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp index abf0db8e520..632cc31d492 100644 --- a/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/c2_MacroAssembler_s390.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2024 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -29,9 +29,9 @@ // C2_MacroAssembler contains high-level macros for C2 public: - // Code used by cmpFastLockLightweight and cmpFastUnlockLightweight mach instructions in s390.ad file. - void fast_lock_lightweight(Register obj, Register box, Register temp1, Register temp2); - void fast_unlock_lightweight(Register obj, Register box, Register temp1, Register temp2); + // Code used by cmpFastLock and cmpFastUnlock mach instructions in s390.ad file. + void fast_lock(Register obj, Register box, Register temp1, Register temp2); + void fast_unlock(Register obj, Register box, Register temp1, Register temp2); void load_narrow_klass_compact_c2(Register dst, Address src); diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp index f62051c628e..a80ca26239b 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.cpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp @@ -1019,7 +1019,7 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) { NearLabel done, slow_case; - lightweight_lock(monitor, object, header, tmp, slow_case); + fast_lock(monitor, object, header, tmp, slow_case); z_bru(done); bind(slow_case); @@ -1054,7 +1054,7 @@ void InterpreterMacroAssembler::unlock_object(Register monitor, Register object) clear_mem(obj_entry, sizeof(oop)); - lightweight_unlock(object, header, current_header, slow_case); + fast_unlock(object, header, current_header, slow_case); z_bru(done); // The lock has been converted into a heavy lock and hence diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp index b047ff00044..f35e18c7398 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp @@ -6138,11 +6138,11 @@ void MacroAssembler::zap_from_to(Register low, Register high, Register val, Regi } #endif // !PRODUCT -// Implements lightweight-locking. +// Implements fast-locking. // - obj: the object to be locked, contents preserved. // - temp1, temp2: temporary registers, contents destroyed. // Note: make sure Z_R1 is not manipulated here when C2 compiler is in play -void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register temp1, Register temp2, Label& slow) { +void MacroAssembler::fast_lock(Register basic_lock, Register obj, Register temp1, Register temp2, Label& slow) { assert_different_registers(basic_lock, obj, temp1, temp2); @@ -6203,11 +6203,11 @@ void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Registe z_alsi(in_bytes(ls_top_offset), Z_thread, oopSize); } -// Implements lightweight-unlocking. +// Implements fast-unlocking. // - obj: the object to be unlocked // - temp1, temp2: temporary registers, will be destroyed // - Z_R1_scratch: will be killed in case of Interpreter & C1 Compiler -void MacroAssembler::lightweight_unlock(Register obj, Register temp1, Register temp2, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register temp1, Register temp2, Label& slow) { assert_different_registers(obj, temp1, temp2); @@ -6264,7 +6264,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register temp1, Register t NearLabel not_unlocked; z_tmll(mark, markWord::unlocked_value); z_braz(not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif // ASSERT @@ -6289,7 +6289,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register temp1, Register t bind(unlocked); } -void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Register box, Register tmp1, Register tmp2) { +void MacroAssembler::compiler_fast_lock_object(Register obj, Register box, Register tmp1, Register tmp2) { assert_different_registers(obj, box, tmp1, tmp2, Z_R0_scratch); // Handle inflated monitor. @@ -6314,8 +6314,8 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Registe const int mark_offset = oopDesc::mark_offset_in_bytes(); const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); - BLOCK_COMMENT("compiler_fast_lightweight_locking {"); - { // lightweight locking + BLOCK_COMMENT("compiler_fast_locking {"); + { // Fast locking // Push lock to the lock stack and finish successfully. MUST reach to with flag == EQ NearLabel push; @@ -6362,9 +6362,9 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Registe z_cgr(obj, obj); // set the CC to EQ, as it could be changed by alsi z_bru(locked); } - BLOCK_COMMENT("} compiler_fast_lightweight_locking"); + BLOCK_COMMENT("} compiler_fast_locking"); - BLOCK_COMMENT("handle_inflated_monitor_lightweight_locking {"); + BLOCK_COMMENT("handle_inflated_monitor_locking {"); { // Handle inflated monitor. bind(inflated); @@ -6441,7 +6441,7 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Registe // set the CC now z_cgr(obj, obj); } - BLOCK_COMMENT("} handle_inflated_monitor_lightweight_locking"); + BLOCK_COMMENT("} handle_inflated_monitor_locking"); bind(locked); @@ -6464,7 +6464,7 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Registe // C2 uses the value of flag (NE vs EQ) to determine the continuation. } -void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Register box, Register tmp1, Register tmp2) { +void MacroAssembler::compiler_fast_unlock_object(Register obj, Register box, Register tmp1, Register tmp2) { assert_different_registers(obj, box, tmp1, tmp2); // Handle inflated monitor. @@ -6479,8 +6479,8 @@ void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Regis const int mark_offset = oopDesc::mark_offset_in_bytes(); const ByteSize ls_top_offset = JavaThread::lock_stack_top_offset(); - BLOCK_COMMENT("compiler_fast_lightweight_unlock {"); - { // Lightweight Unlock + BLOCK_COMMENT("compiler_fast_unlock {"); + { // Fast Unlock NearLabel push_and_slow_path; // Check if obj is top of lock-stack. @@ -6525,7 +6525,7 @@ void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Regis NearLabel not_unlocked; z_tmll(mark, markWord::unlocked_value); z_braz(not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif // ASSERT @@ -6546,7 +6546,7 @@ void MacroAssembler::compiler_fast_unlock_lightweight_object(Register obj, Regis z_ltgr(obj, obj); // object is not null here z_bru(slow_path); } - BLOCK_COMMENT("} compiler_fast_lightweight_unlock"); + BLOCK_COMMENT("} compiler_fast_unlock"); { // Handle inflated monitor. diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.hpp b/src/hotspot/cpu/s390/macroAssembler_s390.hpp index 1c4da4d26eb..da24ae80d45 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp @@ -790,10 +790,10 @@ class MacroAssembler: public Assembler { // Kills registers tmp1_reg and tmp2_reg and preserves the condition code. void increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg); - void lightweight_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Label& slow); - void lightweight_unlock(Register obj, Register tmp1, Register tmp2, Label& slow); - void compiler_fast_lock_lightweight_object(Register obj, Register box, Register tmp1, Register tmp2); - void compiler_fast_unlock_lightweight_object(Register obj, Register box, Register tmp1, Register tmp2); + void fast_lock(Register basic_lock, Register obj, Register tmp1, Register tmp2, Label& slow); + void fast_unlock(Register obj, Register tmp1, Register tmp2, Label& slow); + void compiler_fast_lock_object(Register obj, Register box, Register tmp1, Register tmp2); + void compiler_fast_unlock_object(Register obj, Register box, Register tmp1, Register tmp2); void resolve_jobject(Register value, Register tmp1, Register tmp2); void resolve_global_jobject(Register value, Register tmp1, Register tmp2); diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 0c4939d8432..2f12aa4c03c 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -10123,14 +10123,14 @@ instruct partialSubtypeCheckConstSuper(rarg2RegP sub, rarg1RegP super, immP supe // ============================================================================ // inlined locking and unlocking -instruct cmpFastLockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ +instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ match(Set pcc (FastLock oop box)); effect(TEMP tmp1, TEMP tmp2); ins_cost(100); // TODO: s390 port size(VARIABLE_SIZE); format %{ "FASTLOCK $oop, $box; KILL Z_ARG4, Z_ARG5" %} ins_encode %{ - __ fast_lock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); + __ fast_lock($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); // If locking was successful, cc should indicate 'EQ'. // The compiler generates a branch to the runtime call to // _complete_monitor_locking_Java for the case where cc is 'NE'. @@ -10138,14 +10138,14 @@ instruct cmpFastLockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iReg ins_pipe(pipe_class_dummy); %} -instruct cmpFastUnlockLightweight(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ +instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{ match(Set pcc (FastUnlock oop box)); effect(TEMP tmp1, TEMP tmp2); ins_cost(100); // TODO: s390 port size(FIXED_SIZE); format %{ "FASTUNLOCK $oop, $box; KILL Z_ARG4, Z_ARG5" %} ins_encode %{ - __ fast_unlock_lightweight($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); + __ fast_unlock($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register); // If unlocking was successful, cc should indicate 'EQ'. // The compiler generates a branch to the runtime call to // _complete_monitor_unlocking_Java for the case where cc is 'NE'. diff --git a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp index 3a6e1bff8f4..5b6f7dcd984 100644 --- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp @@ -1765,7 +1765,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Try fastpath for locking. // Fast_lock kills r_temp_1, r_temp_2. - __ compiler_fast_lock_lightweight_object(r_oop, r_box, r_tmp1, r_tmp2); + __ compiler_fast_lock_object(r_oop, r_box, r_tmp1, r_tmp2); __ z_bre(done); //------------------------------------------------------------------------- @@ -1961,7 +1961,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Try fastpath for unlocking. // Fast_unlock kills r_tmp1, r_tmp2. - __ compiler_fast_unlock_lightweight_object(r_oop, r_box, r_tmp1, r_tmp2); + __ compiler_fast_unlock_object(r_oop, r_box, r_tmp1, r_tmp2); __ z_bre(done); // Slow path for unlocking. diff --git a/src/hotspot/cpu/s390/vm_version_s390.hpp b/src/hotspot/cpu/s390/vm_version_s390.hpp index 04005ff2cf9..591d30c3a1c 100644 --- a/src/hotspot/cpu/s390/vm_version_s390.hpp +++ b/src/hotspot/cpu/s390/vm_version_s390.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, 2024 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -425,7 +425,7 @@ class VM_Version: public Abstract_VM_Version { constexpr static bool supports_secondary_supers_table() { return true; } - constexpr static bool supports_recursive_lightweight_locking() { return true; } + constexpr static bool supports_recursive_fast_locking() { return true; } // CPU feature query functions static const char* get_model_string() { return _model_string; } diff --git a/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp index c3d45f9d15d..88e2e6c8ba9 100644 --- a/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp @@ -53,7 +53,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register basic_lo null_check_offset = offset(); - lightweight_lock(basic_lock, obj, hdr, tmp, slow_case); + fast_lock(basic_lock, obj, hdr, tmp, slow_case); return null_check_offset; } @@ -66,7 +66,7 @@ void C1_MacroAssembler::unlock_object(Register hdr, Register obj, Register basic movptr(obj, Address(basic_lock, BasicObjectLock::obj_offset())); verify_oop(obj); - lightweight_unlock(obj, rax, hdr, slow_case); + fast_unlock(obj, rax, hdr, slow_case); } diff --git a/src/hotspot/cpu/x86/c2_CodeStubs_x86.cpp b/src/hotspot/cpu/x86/c2_CodeStubs_x86.cpp index b4f8e9d9514..f73110f8660 100644 --- a/src/hotspot/cpu/x86/c2_CodeStubs_x86.cpp +++ b/src/hotspot/cpu/x86/c2_CodeStubs_x86.cpp @@ -58,11 +58,11 @@ void C2EntryBarrierStub::emit(C2_MacroAssembler& masm) { __ jmp(continuation(), false /* maybe_short */); } -int C2FastUnlockLightweightStub::max_size() const { +int C2FastUnlockStub::max_size() const { return 128; } -void C2FastUnlockLightweightStub::emit(C2_MacroAssembler& masm) { +void C2FastUnlockStub::emit(C2_MacroAssembler& masm) { assert(_t == rax, "must be"); { // Restore lock-stack and handle the unlock in runtime. diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp index 8386e57c389..51b2eff2cfb 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp @@ -222,8 +222,8 @@ inline Assembler::AvxVectorLen C2_MacroAssembler::vector_length_encoding(int vle // box: on-stack box address -- KILLED // rax: tmp -- KILLED // t : tmp -- KILLED -void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Register rax_reg, - Register t, Register thread) { +void C2_MacroAssembler::fast_lock(Register obj, Register box, Register rax_reg, + Register t, Register thread) { assert(rax_reg == rax, "Used for CAS"); assert_different_registers(obj, box, rax_reg, t, thread); @@ -247,7 +247,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist const Register mark = t; - { // Lightweight Lock + { // Fast Lock Label push; @@ -415,7 +415,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist // A perfectly viable alternative is to elide the owner check except when // Xcheck:jni is enabled. -void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register reg_rax, Register t, Register thread) { +void C2_MacroAssembler::fast_unlock(Register obj, Register reg_rax, Register t, Register thread) { assert(reg_rax == rax, "Used for CAS"); assert_different_registers(obj, reg_rax, t); @@ -430,16 +430,16 @@ void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register reg_rax, const Register box = reg_rax; Label dummy; - C2FastUnlockLightweightStub* stub = nullptr; + C2FastUnlockStub* stub = nullptr; if (!Compile::current()->output()->in_scratch_emit_size()) { - stub = new (Compile::current()->comp_arena()) C2FastUnlockLightweightStub(obj, mark, reg_rax, thread); + stub = new (Compile::current()->comp_arena()) C2FastUnlockStub(obj, mark, reg_rax, thread); Compile::current()->output()->add_stub(stub); } Label& push_and_slow_path = stub == nullptr ? dummy : stub->push_and_slow_path(); - { // Lightweight Unlock + { // Fast Unlock // Load top. movl(top, Address(thread, JavaThread::lock_stack_top_offset())); diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp index aaee25f440a..cd5f0ceb900 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.hpp @@ -35,9 +35,9 @@ public: // Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file. // See full description in c2_MacroAssembler_x86.cpp. - void fast_lock_lightweight(Register obj, Register box, Register rax_reg, - Register t, Register thread); - void fast_unlock_lightweight(Register obj, Register reg_rax, Register t, Register thread); + void fast_lock(Register obj, Register box, Register rax_reg, + Register t, Register thread); + void fast_unlock(Register obj, Register reg_rax, Register t, Register thread); void verify_int_in_range(uint idx, const TypeInt* t, Register val); void verify_long_in_range(uint idx, const TypeLong* t, Register val, Register tmp); diff --git a/src/hotspot/cpu/x86/interp_masm_x86.cpp b/src/hotspot/cpu/x86/interp_masm_x86.cpp index 110dfab5808..36959ddfe1d 100644 --- a/src/hotspot/cpu/x86/interp_masm_x86.cpp +++ b/src/hotspot/cpu/x86/interp_masm_x86.cpp @@ -1107,7 +1107,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg) { // Load object pointer into obj_reg movptr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset())); - lightweight_lock(lock_reg, obj_reg, swap_reg, tmp_reg, slow_case); + fast_lock(lock_reg, obj_reg, swap_reg, tmp_reg, slow_case); jmp(done); bind(slow_case); @@ -1149,7 +1149,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) { // Free entry movptr(Address(lock_reg, BasicObjectLock::obj_offset()), NULL_WORD); - lightweight_unlock(obj_reg, swap_reg, header_reg, slow_case); + fast_unlock(obj_reg, swap_reg, header_reg, slow_case); jmp(done); bind(slow_case); diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index 4f19b30b832..44f1a35d443 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -9653,13 +9653,13 @@ void MacroAssembler::check_stack_alignment(Register sp, const char* msg, unsigne bind(L_stack_ok); } -// Implements lightweight-locking. +// Implements fast-locking. // // obj: the object to be locked // reg_rax: rax // thread: the thread which attempts to lock obj // tmp: a temporary register -void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Register reg_rax, Register tmp, Label& slow) { +void MacroAssembler::fast_lock(Register basic_lock, Register obj, Register reg_rax, Register tmp, Label& slow) { Register thread = r15_thread; assert(reg_rax == rax, ""); @@ -9715,13 +9715,13 @@ void MacroAssembler::lightweight_lock(Register basic_lock, Register obj, Registe movl(Address(thread, JavaThread::lock_stack_top_offset()), top); } -// Implements lightweight-unlocking. +// Implements fast-unlocking. // // obj: the object to be unlocked // reg_rax: rax // thread: the thread // tmp: a temporary register -void MacroAssembler::lightweight_unlock(Register obj, Register reg_rax, Register tmp, Label& slow) { +void MacroAssembler::fast_unlock(Register obj, Register reg_rax, Register tmp, Label& slow) { Register thread = r15_thread; assert(reg_rax == rax, ""); @@ -9753,7 +9753,7 @@ void MacroAssembler::lightweight_unlock(Register obj, Register reg_rax, Register Label not_unlocked; testptr(reg_rax, markWord::unlocked_value); jcc(Assembler::zero, not_unlocked); - stop("lightweight_unlock already unlocked"); + stop("fast_unlock already unlocked"); bind(not_unlocked); #endif diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.hpp b/src/hotspot/cpu/x86/macroAssembler_x86.hpp index ed1343d9c8c..4cecaa55345 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp @@ -2054,8 +2054,8 @@ public: void check_stack_alignment(Register sp, const char* msg, unsigned bias = 0, Register tmp = noreg); - void lightweight_lock(Register basic_lock, Register obj, Register reg_rax, Register tmp, Label& slow); - void lightweight_unlock(Register obj, Register reg_rax, Register tmp, Label& slow); + void fast_lock(Register basic_lock, Register obj, Register reg_rax, Register tmp, Label& slow); + void fast_unlock(Register obj, Register reg_rax, Register tmp, Label& slow); void save_legacy_gprs(); void restore_legacy_gprs(); diff --git a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp index e702b587edd..5a4a5b1809e 100644 --- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp @@ -2141,7 +2141,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Load the oop from the handle __ movptr(obj_reg, Address(oop_handle_reg, 0)); - __ lightweight_lock(lock_reg, obj_reg, swap_reg, rscratch1, slow_path_lock); + __ fast_lock(lock_reg, obj_reg, swap_reg, rscratch1, slow_path_lock); // Slow path will re-enter here __ bind(lock_done); @@ -2266,7 +2266,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, save_native_result(masm, ret_type, stack_slots); } - __ lightweight_unlock(obj_reg, swap_reg, lock_reg, slow_path_unlock); + __ fast_unlock(obj_reg, swap_reg, lock_reg, slow_path_unlock); // slow path re-enters here __ bind(unlock_done); diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp b/src/hotspot/cpu/x86/vm_version_x86.hpp index aa9a527e0b7..cc93ee3564e 100644 --- a/src/hotspot/cpu/x86/vm_version_x86.hpp +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp @@ -995,7 +995,7 @@ public: return true; } - constexpr static bool supports_recursive_lightweight_locking() { + constexpr static bool supports_recursive_fast_locking() { return true; } diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index ca94b03a841..783ed038858 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -16925,24 +16925,24 @@ instruct jmpConUCF2_short(cmpOpUCF2 cop, rFlagsRegUCF cmp, label labl) %{ // ============================================================================ // inlined locking and unlocking -instruct cmpFastLockLightweight(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI rax_reg, rRegP tmp) %{ +instruct cmpFastLock(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI rax_reg, rRegP tmp) %{ match(Set cr (FastLock object box)); effect(TEMP rax_reg, TEMP tmp, USE_KILL box); ins_cost(300); format %{ "fastlock $object,$box\t! kills $box,$rax_reg,$tmp" %} ins_encode %{ - __ fast_lock_lightweight($object$$Register, $box$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); + __ fast_lock($object$$Register, $box$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); %} ins_pipe(pipe_slow); %} -instruct cmpFastUnlockLightweight(rFlagsReg cr, rRegP object, rax_RegP rax_reg, rRegP tmp) %{ +instruct cmpFastUnlock(rFlagsReg cr, rRegP object, rax_RegP rax_reg, rRegP tmp) %{ match(Set cr (FastUnlock object rax_reg)); effect(TEMP tmp, USE_KILL rax_reg); ins_cost(300); format %{ "fastunlock $object,$rax_reg\t! kills $rax_reg,$tmp" %} ins_encode %{ - __ fast_unlock_lightweight($object$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); + __ fast_unlock($object$$Register, $rax_reg$$Register, $tmp$$Register, r15_thread); %} ins_pipe(pipe_slow); %} diff --git a/src/hotspot/share/interpreter/interpreterRuntime.cpp b/src/hotspot/share/interpreter/interpreterRuntime.cpp index 5f4cc6c450d..b985d2af6ff 100644 --- a/src/hotspot/share/interpreter/interpreterRuntime.cpp +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp @@ -70,7 +70,7 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/stackWatermarkSet.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "utilities/align.hpp" #include "utilities/checkedCast.hpp" #include "utilities/copy.hpp" diff --git a/src/hotspot/share/oops/markWord.hpp b/src/hotspot/share/oops/markWord.hpp index aa9cdd65ba9..6bcbcfe97a0 100644 --- a/src/hotspot/share/oops/markWord.hpp +++ b/src/hotspot/share/oops/markWord.hpp @@ -211,7 +211,7 @@ class markWord { } ObjectMonitor* monitor() const { assert(has_monitor(), "check"); - assert(!UseObjectMonitorTable, "Lightweight locking with OM table does not use markWord for monitors"); + assert(!UseObjectMonitorTable, "Locking with OM table does not use markWord for monitors"); // Use xor instead of &~ to provide one extra tag-bit check. return (ObjectMonitor*) (value() ^ monitor_value); } @@ -237,7 +237,7 @@ class markWord { return from_pointer(lock); } static markWord encode(ObjectMonitor* monitor) { - assert(!UseObjectMonitorTable, "Lightweight locking with OM table does not use markWord for monitors"); + assert(!UseObjectMonitorTable, "Locking with OM table does not use markWord for monitors"); uintptr_t tmp = (uintptr_t) monitor; return markWord(tmp | monitor_value); } diff --git a/src/hotspot/share/opto/c2_CodeStubs.hpp b/src/hotspot/share/opto/c2_CodeStubs.hpp index e778cfcde47..5664ee03e5c 100644 --- a/src/hotspot/share/opto/c2_CodeStubs.hpp +++ b/src/hotspot/share/opto/c2_CodeStubs.hpp @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -97,7 +97,7 @@ public: void emit(C2_MacroAssembler& masm); }; -class C2FastUnlockLightweightStub : public C2CodeStub { +class C2FastUnlockStub : public C2CodeStub { private: Register _obj; Register _mark; @@ -107,8 +107,8 @@ private: Label _push_and_slow_path; Label _unlocked_continuation; public: - C2FastUnlockLightweightStub(Register obj, Register mark, Register t, Register thread) : C2CodeStub(), - _obj(obj), _mark(mark), _t(t), _thread(thread) {} + C2FastUnlockStub(Register obj, Register mark, Register t, Register thread) : C2CodeStub(), + _obj(obj), _mark(mark), _t(t), _thread(thread) {} int max_size() const; void emit(C2_MacroAssembler& masm); Label& slow_path() { return _slow_path; } diff --git a/src/hotspot/share/prims/jvmtiEnvBase.cpp b/src/hotspot/share/prims/jvmtiEnvBase.cpp index 7450b079d18..2b17eddbe94 100644 --- a/src/hotspot/share/prims/jvmtiEnvBase.cpp +++ b/src/hotspot/share/prims/jvmtiEnvBase.cpp @@ -55,7 +55,7 @@ #include "runtime/osThread.hpp" #include "runtime/signature.hpp" #include "runtime/stackWatermarkSet.inline.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/threads.hpp" #include "runtime/threadSMR.inline.hpp" #include "runtime/vframe.inline.hpp" diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index 92f5356235a..f5d1edd28f4 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -87,7 +87,6 @@ #include "runtime/javaCalls.hpp" #include "runtime/javaThread.inline.hpp" #include "runtime/jniHandles.inline.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/lockStack.hpp" #include "runtime/os.hpp" #include "runtime/stackFrameStream.inline.hpp" @@ -1974,8 +1973,8 @@ WB_ENTRY(jint, WB_getLockStackCapacity(JNIEnv* env)) return (jint) LockStack::CAPACITY; WB_END -WB_ENTRY(jboolean, WB_supportsRecursiveLightweightLocking(JNIEnv* env)) - return (jboolean) VM_Version::supports_recursive_lightweight_locking(); +WB_ENTRY(jboolean, WB_supportsRecursiveFastLocking(JNIEnv* env)) + return (jboolean) VM_Version::supports_recursive_fast_locking(); WB_END WB_ENTRY(jboolean, WB_DeflateIdleMonitors(JNIEnv* env, jobject wb)) @@ -2996,7 +2995,7 @@ static JNINativeMethod methods[] = { {CC"isUbsanEnabled", CC"()Z", (void*)&WB_IsUbsanEnabled }, {CC"getInUseMonitorCount", CC"()J", (void*)&WB_getInUseMonitorCount }, {CC"getLockStackCapacity", CC"()I", (void*)&WB_getLockStackCapacity }, - {CC"supportsRecursiveLightweightLocking", CC"()Z", (void*)&WB_supportsRecursiveLightweightLocking }, + {CC"supportsRecursiveFastLocking", CC"()Z", (void*)&WB_supportsRecursiveFastLocking }, {CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint }, {CC"forceClassLoaderStatsSafepoint", CC"()V", (void*)&WB_ForceClassLoaderStatsSafepoint }, {CC"getConstantPool0", CC"(Ljava/lang/Class;)J", (void*)&WB_GetConstantPool }, diff --git a/src/hotspot/share/runtime/abstract_vm_version.hpp b/src/hotspot/share/runtime/abstract_vm_version.hpp index b9c52b27182..5a6b41506c7 100644 --- a/src/hotspot/share/runtime/abstract_vm_version.hpp +++ b/src/hotspot/share/runtime/abstract_vm_version.hpp @@ -191,8 +191,8 @@ class Abstract_VM_Version: AllStatic { // Does platform support stack watermark barriers for concurrent stack processing? constexpr static bool supports_stack_watermark_barrier() { return false; } - // Is recursive lightweight locking implemented for this platform? - constexpr static bool supports_recursive_lightweight_locking() { return false; } + // Is recursive fast locking implemented for this platform? + constexpr static bool supports_recursive_fast_locking() { return false; } // Does platform support secondary supers table lookup? constexpr static bool supports_secondary_supers_table() { return false; } diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index 35ccc92f90b..e2029a26d37 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -74,7 +74,6 @@ #include "runtime/javaThread.hpp" #include "runtime/jniHandles.inline.hpp" #include "runtime/keepStackGCProcessed.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/lockStack.inline.hpp" #include "runtime/objectMonitor.inline.hpp" #include "runtime/osThread.hpp" @@ -85,7 +84,7 @@ #include "runtime/stackValue.hpp" #include "runtime/stackWatermarkSet.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/threadSMR.hpp" #include "runtime/threadWXSetters.inline.hpp" #include "runtime/vframe.hpp" @@ -1680,8 +1679,8 @@ bool Deoptimization::relock_objects(JavaThread* thread, GrowableArraylock_stack().contains(obj())) { - LightweightSynchronizer::inflate_fast_locked_object(obj(), ObjectSynchronizer::InflateCause::inflate_cause_vm_internal, - deoptee_thread, thread); + ObjectSynchronizer::inflate_fast_locked_object(obj(), ObjectSynchronizer::InflateCause::inflate_cause_vm_internal, + deoptee_thread, thread); } assert(mon_info->owner()->is_locked(), "object must be locked now"); assert(obj->mark().has_monitor(), "must be"); diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp index 238517197b2..d002edd48cd 100644 --- a/src/hotspot/share/runtime/globals.hpp +++ b/src/hotspot/share/runtime/globals.hpp @@ -1954,14 +1954,14 @@ const int ObjectAlignmentInBytes = 8; "fence. Add cleanliness checks.") \ \ product(bool, UseObjectMonitorTable, false, DIAGNOSTIC, \ - "With Lightweight Locking mode, use a table to record inflated " \ - "monitors rather than the first word of the object.") \ + "Use a table to record inflated monitors rather than the first " \ + "word of the object.") \ \ - product(int, LightweightFastLockingSpins, 13, DIAGNOSTIC, \ - "Specifies the number of times lightweight fast locking will " \ - "attempt to CAS the markWord before inflating. Between each " \ - "CAS it will spin for exponentially more time, resulting in " \ - "a total number of spins on the order of O(2^value)") \ + product(int, FastLockingSpins, 13, DIAGNOSTIC, \ + "Specifies the number of times fast locking will attempt to " \ + "CAS the markWord before inflating. Between each CAS it will " \ + "spin for exponentially more time, resulting in a total number " \ + "of spins on the order of O(2^value)") \ range(1, 30) \ \ product(uint, TrimNativeHeapInterval, 0, \ diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index 838f8e4c581..f52be5d740e 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -1409,7 +1409,7 @@ void JavaThread::oops_do_no_frames(OopClosure* f, NMethodClosure* cf) { entry = entry->parent(); } - // Due to lightweight locking + // Due to fast locking lock_stack().oops_do(f); } diff --git a/src/hotspot/share/runtime/lightweightSynchronizer.cpp b/src/hotspot/share/runtime/lightweightSynchronizer.cpp deleted file mode 100644 index ebb14490365..00000000000 --- a/src/hotspot/share/runtime/lightweightSynchronizer.cpp +++ /dev/null @@ -1,1231 +0,0 @@ -/* - * Copyright (c) 2024, 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. - * - * 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. - * - */ - -#include "classfile/vmSymbols.hpp" -#include "jfrfiles/jfrEventClasses.hpp" -#include "logging/log.hpp" -#include "memory/allStatic.hpp" -#include "memory/resourceArea.hpp" -#include "nmt/memTag.hpp" -#include "oops/oop.inline.hpp" -#include "runtime/atomicAccess.hpp" -#include "runtime/basicLock.inline.hpp" -#include "runtime/globals_extension.hpp" -#include "runtime/interfaceSupport.inline.hpp" -#include "runtime/javaThread.inline.hpp" -#include "runtime/lightweightSynchronizer.hpp" -#include "runtime/lockStack.inline.hpp" -#include "runtime/mutexLocker.hpp" -#include "runtime/objectMonitor.inline.hpp" -#include "runtime/os.hpp" -#include "runtime/safepointMechanism.inline.hpp" -#include "runtime/safepointVerifiers.hpp" -#include "runtime/synchronizer.inline.hpp" -#include "runtime/timerTrace.hpp" -#include "runtime/trimNativeHeap.hpp" -#include "utilities/concurrentHashTable.inline.hpp" -#include "utilities/concurrentHashTableTasks.inline.hpp" -#include "utilities/globalDefinitions.hpp" - -// ConcurrentHashTable storing links from objects to ObjectMonitors -class ObjectMonitorTable : AllStatic { - struct Config { - using Value = ObjectMonitor*; - static uintx get_hash(Value const& value, bool* is_dead) { - return (uintx)value->hash(); - } - static void* allocate_node(void* context, size_t size, Value const& value) { - ObjectMonitorTable::inc_items_count(); - return AllocateHeap(size, mtObjectMonitor); - }; - static void free_node(void* context, void* memory, Value const& value) { - ObjectMonitorTable::dec_items_count(); - FreeHeap(memory); - } - }; - using ConcurrentTable = ConcurrentHashTable; - - static ConcurrentTable* _table; - static volatile size_t _items_count; - static size_t _table_size; - static volatile bool _resize; - - class Lookup : public StackObj { - oop _obj; - - public: - explicit Lookup(oop obj) : _obj(obj) {} - - uintx get_hash() const { - uintx hash = _obj->mark().hash(); - assert(hash != 0, "should have a hash"); - return hash; - } - - bool equals(ObjectMonitor** value) { - assert(*value != nullptr, "must be"); - return (*value)->object_refers_to(_obj); - } - - bool is_dead(ObjectMonitor** value) { - assert(*value != nullptr, "must be"); - return false; - } - }; - - class LookupMonitor : public StackObj { - ObjectMonitor* _monitor; - - public: - explicit LookupMonitor(ObjectMonitor* monitor) : _monitor(monitor) {} - - uintx get_hash() const { - return _monitor->hash(); - } - - bool equals(ObjectMonitor** value) { - return (*value) == _monitor; - } - - bool is_dead(ObjectMonitor** value) { - assert(*value != nullptr, "must be"); - return (*value)->object_is_dead(); - } - }; - - static void inc_items_count() { - AtomicAccess::inc(&_items_count, memory_order_relaxed); - } - - static void dec_items_count() { - AtomicAccess::dec(&_items_count, memory_order_relaxed); - } - - static double get_load_factor() { - size_t count = AtomicAccess::load(&_items_count); - return (double)count / (double)_table_size; - } - - static size_t table_size(Thread* current = Thread::current()) { - return ((size_t)1) << _table->get_size_log2(current); - } - - static size_t max_log_size() { - // TODO[OMTable]: Evaluate the max size. - // TODO[OMTable]: Need to fix init order to use Universe::heap()->max_capacity(); - // Using MaxHeapSize directly this early may be wrong, and there - // are definitely rounding errors (alignment). - const size_t max_capacity = MaxHeapSize; - const size_t min_object_size = CollectedHeap::min_dummy_object_size() * HeapWordSize; - const size_t max_objects = max_capacity / MAX2(MinObjAlignmentInBytes, checked_cast(min_object_size)); - const size_t log_max_objects = log2i_graceful(max_objects); - - return MAX2(MIN2(SIZE_BIG_LOG2, log_max_objects), min_log_size()); - } - - static size_t min_log_size() { - // ~= log(AvgMonitorsPerThreadEstimate default) - return 10; - } - - template - static size_t clamp_log_size(V log_size) { - return MAX2(MIN2(log_size, checked_cast(max_log_size())), checked_cast(min_log_size())); - } - - static size_t initial_log_size() { - const size_t estimate = log2i(MAX2(os::processor_count(), 1)) + log2i(MAX2(AvgMonitorsPerThreadEstimate, size_t(1))); - return clamp_log_size(estimate); - } - - static size_t grow_hint () { - return ConcurrentTable::DEFAULT_GROW_HINT; - } - - public: - static void create() { - _table = new ConcurrentTable(initial_log_size(), max_log_size(), grow_hint()); - _items_count = 0; - _table_size = table_size(); - _resize = false; - } - - static void verify_monitor_get_result(oop obj, ObjectMonitor* monitor) { -#ifdef ASSERT - if (SafepointSynchronize::is_at_safepoint()) { - bool has_monitor = obj->mark().has_monitor(); - assert(has_monitor == (monitor != nullptr), - "Inconsistency between markWord and ObjectMonitorTable has_monitor: %s monitor: " PTR_FORMAT, - BOOL_TO_STR(has_monitor), p2i(monitor)); - } -#endif - } - - static ObjectMonitor* monitor_get(Thread* current, oop obj) { - ObjectMonitor* result = nullptr; - Lookup lookup_f(obj); - auto found_f = [&](ObjectMonitor** found) { - assert((*found)->object_peek() == obj, "must be"); - result = *found; - }; - _table->get(current, lookup_f, found_f); - verify_monitor_get_result(obj, result); - return result; - } - - static void try_notify_grow() { - if (!_table->is_max_size_reached() && !AtomicAccess::load(&_resize)) { - AtomicAccess::store(&_resize, true); - if (Service_lock->try_lock()) { - Service_lock->notify(); - Service_lock->unlock(); - } - } - } - - static bool should_shrink() { - // Not implemented; - return false; - } - - static constexpr double GROW_LOAD_FACTOR = 0.75; - - static bool should_grow() { - return get_load_factor() > GROW_LOAD_FACTOR && !_table->is_max_size_reached(); - } - - static bool should_resize() { - return should_grow() || should_shrink() || AtomicAccess::load(&_resize); - } - - template - static bool run_task(JavaThread* current, Task& task, const char* task_name, Args&... args) { - if (task.prepare(current)) { - log_trace(monitortable)("Started to %s", task_name); - TraceTime timer(task_name, TRACETIME_LOG(Debug, monitortable, perf)); - while (task.do_task(current, args...)) { - task.pause(current); - { - ThreadBlockInVM tbivm(current); - } - task.cont(current); - } - task.done(current); - return true; - } - return false; - } - - static bool grow(JavaThread* current) { - ConcurrentTable::GrowTask grow_task(_table); - if (run_task(current, grow_task, "Grow")) { - _table_size = table_size(current); - log_info(monitortable)("Grown to size: %zu", _table_size); - return true; - } - return false; - } - - static bool clean(JavaThread* current) { - ConcurrentTable::BulkDeleteTask clean_task(_table); - auto is_dead = [&](ObjectMonitor** monitor) { - return (*monitor)->object_is_dead(); - }; - auto do_nothing = [&](ObjectMonitor** monitor) {}; - NativeHeapTrimmer::SuspendMark sm("ObjectMonitorTable"); - return run_task(current, clean_task, "Clean", is_dead, do_nothing); - } - - static bool resize(JavaThread* current) { - LogTarget(Info, monitortable) lt; - bool success = false; - - if (should_grow()) { - lt.print("Start growing with load factor %f", get_load_factor()); - success = grow(current); - } else { - if (!_table->is_max_size_reached() && AtomicAccess::load(&_resize)) { - lt.print("WARNING: Getting resize hints with load factor %f", get_load_factor()); - } - lt.print("Start cleaning with load factor %f", get_load_factor()); - success = clean(current); - } - - AtomicAccess::store(&_resize, false); - - return success; - } - - static ObjectMonitor* monitor_put_get(Thread* current, ObjectMonitor* monitor, oop obj) { - // Enter the monitor into the concurrent hashtable. - ObjectMonitor* result = monitor; - Lookup lookup_f(obj); - auto found_f = [&](ObjectMonitor** found) { - assert((*found)->object_peek() == obj, "must be"); - result = *found; - }; - bool grow; - _table->insert_get(current, lookup_f, monitor, found_f, &grow); - verify_monitor_get_result(obj, result); - if (grow) { - try_notify_grow(); - } - return result; - } - - static bool remove_monitor_entry(Thread* current, ObjectMonitor* monitor) { - LookupMonitor lookup_f(monitor); - return _table->remove(current, lookup_f); - } - - static bool contains_monitor(Thread* current, ObjectMonitor* monitor) { - LookupMonitor lookup_f(monitor); - bool result = false; - auto found_f = [&](ObjectMonitor** found) { - result = true; - }; - _table->get(current, lookup_f, found_f); - return result; - } - - static void print_on(outputStream* st) { - auto printer = [&] (ObjectMonitor** entry) { - ObjectMonitor* om = *entry; - oop obj = om->object_peek(); - st->print("monitor=" PTR_FORMAT ", ", p2i(om)); - st->print("object=" PTR_FORMAT, p2i(obj)); - assert(obj->mark().hash() == om->hash(), "hash must match"); - st->cr(); - return true; - }; - if (SafepointSynchronize::is_at_safepoint()) { - _table->do_safepoint_scan(printer); - } else { - _table->do_scan(Thread::current(), printer); - } - } -}; - -ObjectMonitorTable::ConcurrentTable* ObjectMonitorTable::_table = nullptr; -volatile size_t ObjectMonitorTable::_items_count = 0; -size_t ObjectMonitorTable::_table_size = 0; -volatile bool ObjectMonitorTable::_resize = false; - -ObjectMonitor* LightweightSynchronizer::get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted) { - ObjectMonitor* monitor = get_monitor_from_table(current, object); - if (monitor != nullptr) { - *inserted = false; - return monitor; - } - - ObjectMonitor* alloced_monitor = new ObjectMonitor(object); - alloced_monitor->set_anonymous_owner(); - - // Try insert monitor - monitor = add_monitor(current, alloced_monitor, object); - - *inserted = alloced_monitor == monitor; - if (!*inserted) { - delete alloced_monitor; - } - - return monitor; -} - -static void log_inflate(Thread* current, oop object, ObjectSynchronizer::InflateCause cause) { - if (log_is_enabled(Trace, monitorinflation)) { - ResourceMark rm(current); - log_trace(monitorinflation)("inflate: object=" INTPTR_FORMAT ", mark=" - INTPTR_FORMAT ", type='%s' cause=%s", p2i(object), - object->mark().value(), object->klass()->external_name(), - ObjectSynchronizer::inflate_cause_name(cause)); - } -} - -static void post_monitor_inflate_event(EventJavaMonitorInflate* event, - const oop obj, - ObjectSynchronizer::InflateCause cause) { - assert(event != nullptr, "invariant"); - const Klass* monitor_klass = obj->klass(); - if (ObjectMonitor::is_jfr_excluded(monitor_klass)) { - return; - } - event->set_monitorClass(monitor_klass); - event->set_address((uintptr_t)(void*)obj); - event->set_cause((u1)cause); - event->commit(); -} - -ObjectMonitor* LightweightSynchronizer::get_or_insert_monitor(oop object, JavaThread* current, ObjectSynchronizer::InflateCause cause) { - assert(UseObjectMonitorTable, "must be"); - - EventJavaMonitorInflate event; - - bool inserted; - ObjectMonitor* monitor = get_or_insert_monitor_from_table(object, current, &inserted); - - if (inserted) { - log_inflate(current, object, cause); - if (event.should_commit()) { - post_monitor_inflate_event(&event, object, cause); - } - - // The monitor has an anonymous owner so it is safe from async deflation. - ObjectSynchronizer::_in_use_list.add(monitor); - } - - return monitor; -} - -// Add the hashcode to the monitor to match the object and put it in the hashtable. -ObjectMonitor* LightweightSynchronizer::add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj) { - assert(UseObjectMonitorTable, "must be"); - assert(obj == monitor->object(), "must be"); - - intptr_t hash = obj->mark().hash(); - assert(hash != 0, "must be set when claiming the object monitor"); - monitor->set_hash(hash); - - return ObjectMonitorTable::monitor_put_get(current, monitor, obj); -} - -bool LightweightSynchronizer::remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj) { - assert(UseObjectMonitorTable, "must be"); - assert(monitor->object_peek() == obj, "must be, cleared objects are removed by is_dead"); - - return ObjectMonitorTable::remove_monitor_entry(current, monitor); -} - -void LightweightSynchronizer::deflate_mark_word(oop obj) { - assert(UseObjectMonitorTable, "must be"); - - markWord mark = obj->mark_acquire(); - assert(!mark.has_no_hash(), "obj with inflated monitor must have had a hash"); - - while (mark.has_monitor()) { - const markWord new_mark = mark.clear_lock_bits().set_unlocked(); - mark = obj->cas_set_mark(new_mark, mark); - } -} - -void LightweightSynchronizer::initialize() { - if (!UseObjectMonitorTable) { - return; - } - ObjectMonitorTable::create(); -} - -bool LightweightSynchronizer::needs_resize() { - if (!UseObjectMonitorTable) { - return false; - } - return ObjectMonitorTable::should_resize(); -} - -bool LightweightSynchronizer::resize_table(JavaThread* current) { - if (!UseObjectMonitorTable) { - return true; - } - return ObjectMonitorTable::resize(current); -} - -class LightweightSynchronizer::LockStackInflateContendedLocks : private OopClosure { - private: - oop _contended_oops[LockStack::CAPACITY]; - int _length; - - void do_oop(oop* o) final { - oop obj = *o; - if (obj->mark_acquire().has_monitor()) { - if (_length > 0 && _contended_oops[_length - 1] == obj) { - // Recursive - return; - } - _contended_oops[_length++] = obj; - } - } - - void do_oop(narrowOop* o) final { - ShouldNotReachHere(); - } - - public: - LockStackInflateContendedLocks() : - _contended_oops(), - _length(0) {}; - - void inflate(JavaThread* current) { - assert(current == JavaThread::current(), "must be"); - current->lock_stack().oops_do(this); - for (int i = 0; i < _length; i++) { - LightweightSynchronizer:: - inflate_fast_locked_object(_contended_oops[i], ObjectSynchronizer::inflate_cause_vm_internal, current, current); - } - } -}; - -void LightweightSynchronizer::ensure_lock_stack_space(JavaThread* current) { - assert(current == JavaThread::current(), "must be"); - LockStack& lock_stack = current->lock_stack(); - - // Make room on lock_stack - if (lock_stack.is_full()) { - // Inflate contended objects - LockStackInflateContendedLocks().inflate(current); - if (lock_stack.is_full()) { - // Inflate the oldest object - inflate_fast_locked_object(lock_stack.bottom(), ObjectSynchronizer::inflate_cause_vm_internal, current, current); - } - } -} - -class LightweightSynchronizer::CacheSetter : StackObj { - JavaThread* const _thread; - BasicLock* const _lock; - ObjectMonitor* _monitor; - - NONCOPYABLE(CacheSetter); - - public: - CacheSetter(JavaThread* thread, BasicLock* lock) : - _thread(thread), - _lock(lock), - _monitor(nullptr) {} - - ~CacheSetter() { - // Only use the cache if using the table. - if (UseObjectMonitorTable) { - if (_monitor != nullptr) { - // If the monitor is already in the BasicLock cache then it is most - // likely in the thread cache, do not set it again to avoid reordering. - if (_monitor != _lock->object_monitor_cache()) { - _thread->om_set_monitor_cache(_monitor); - _lock->set_object_monitor_cache(_monitor); - } - } else { - _lock->clear_object_monitor_cache(); - } - } - } - - void set_monitor(ObjectMonitor* monitor) { - assert(_monitor == nullptr, "only set once"); - _monitor = monitor; - } - -}; - -// Reads first from the BasicLock cache then from the OMCache in the current thread. -// C2 fast-path may have put the monitor in the cache in the BasicLock. -inline static ObjectMonitor* read_caches(JavaThread* current, BasicLock* lock, oop object) { - ObjectMonitor* monitor = lock->object_monitor_cache(); - if (monitor == nullptr) { - monitor = current->om_get_from_monitor_cache(object); - } - return monitor; -} - -class LightweightSynchronizer::VerifyThreadState { - bool _no_safepoint; - - public: - VerifyThreadState(JavaThread* locking_thread, JavaThread* current) : _no_safepoint(locking_thread != current) { - assert(current == Thread::current(), "must be"); - assert(locking_thread == current || locking_thread->is_obj_deopt_suspend(), "locking_thread may not run concurrently"); - if (_no_safepoint) { - DEBUG_ONLY(JavaThread::current()->inc_no_safepoint_count();) - } - } - ~VerifyThreadState() { - if (_no_safepoint){ - DEBUG_ONLY(JavaThread::current()->dec_no_safepoint_count();) - } - } -}; - -inline bool LightweightSynchronizer::fast_lock_try_enter(oop obj, LockStack& lock_stack, JavaThread* current) { - markWord mark = obj->mark(); - while (mark.is_unlocked()) { - ensure_lock_stack_space(current); - assert(!lock_stack.is_full(), "must have made room on the lock stack"); - assert(!lock_stack.contains(obj), "thread must not already hold the lock"); - // Try to swing into 'fast-locked' state. - markWord locked_mark = mark.set_fast_locked(); - markWord old_mark = mark; - mark = obj->cas_set_mark(locked_mark, old_mark); - if (old_mark == mark) { - // Successfully fast-locked, push object to lock-stack and return. - lock_stack.push(obj); - return true; - } - } - return false; -} - -bool LightweightSynchronizer::fast_lock_spin_enter(oop obj, LockStack& lock_stack, JavaThread* current, bool observed_deflation) { - assert(UseObjectMonitorTable, "must be"); - // Will spin with exponential backoff with an accumulative O(2^spin_limit) spins. - const int log_spin_limit = os::is_MP() ? LightweightFastLockingSpins : 1; - const int log_min_safepoint_check_interval = 10; - - markWord mark = obj->mark(); - const auto should_spin = [&]() { - if (!mark.has_monitor()) { - // Spin while not inflated. - return true; - } else if (observed_deflation) { - // Spin while monitor is being deflated. - ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); - return monitor == nullptr || monitor->is_being_async_deflated(); - } - // Else stop spinning. - return false; - }; - // Always attempt to lock once even when safepoint synchronizing. - bool should_process = false; - for (int i = 0; should_spin() && !should_process && i < log_spin_limit; i++) { - // Spin with exponential backoff. - const int total_spin_count = 1 << i; - const int inner_spin_count = MIN2(1 << log_min_safepoint_check_interval, total_spin_count); - const int outer_spin_count = total_spin_count / inner_spin_count; - for (int outer = 0; outer < outer_spin_count; outer++) { - should_process = SafepointMechanism::should_process(current); - if (should_process) { - // Stop spinning for safepoint. - break; - } - for (int inner = 1; inner < inner_spin_count; inner++) { - SpinPause(); - } - } - - if (fast_lock_try_enter(obj, lock_stack, current)) return true; - } - return false; -} - -void LightweightSynchronizer::enter_for(Handle obj, BasicLock* lock, JavaThread* locking_thread) { - assert(!UseObjectMonitorTable || lock->object_monitor_cache() == nullptr, "must be cleared"); - JavaThread* current = JavaThread::current(); - VerifyThreadState vts(locking_thread, current); - - if (obj->klass()->is_value_based()) { - ObjectSynchronizer::handle_sync_on_value_based_class(obj, locking_thread); - } - - LockStack& lock_stack = locking_thread->lock_stack(); - - ObjectMonitor* monitor = nullptr; - if (lock_stack.contains(obj())) { - monitor = inflate_fast_locked_object(obj(), ObjectSynchronizer::inflate_cause_monitor_enter, locking_thread, current); - bool entered = monitor->enter_for(locking_thread); - assert(entered, "recursive ObjectMonitor::enter_for must succeed"); - } else { - do { - // It is assumed that enter_for must enter on an object without contention. - monitor = inflate_and_enter(obj(), lock, ObjectSynchronizer::inflate_cause_monitor_enter, locking_thread, current); - // But there may still be a race with deflation. - } while (monitor == nullptr); - } - - assert(monitor != nullptr, "LightweightSynchronizer::enter_for must succeed"); - assert(!UseObjectMonitorTable || lock->object_monitor_cache() == nullptr, "unused. already cleared"); -} - -void LightweightSynchronizer::enter(Handle obj, BasicLock* lock, JavaThread* current) { - assert(current == JavaThread::current(), "must be"); - - if (obj->klass()->is_value_based()) { - ObjectSynchronizer::handle_sync_on_value_based_class(obj, current); - } - - CacheSetter cache_setter(current, lock); - - // Used when deflation is observed. Progress here requires progress - // from the deflator. After observing that the deflator is not - // making progress (after two yields), switch to sleeping. - SpinYield spin_yield(0, 2); - bool observed_deflation = false; - - LockStack& lock_stack = current->lock_stack(); - - if (!lock_stack.is_full() && lock_stack.try_recursive_enter(obj())) { - // Recursively fast locked - return; - } - - if (lock_stack.contains(obj())) { - ObjectMonitor* monitor = inflate_fast_locked_object(obj(), ObjectSynchronizer::inflate_cause_monitor_enter, current, current); - bool entered = monitor->enter(current); - assert(entered, "recursive ObjectMonitor::enter must succeed"); - cache_setter.set_monitor(monitor); - return; - } - - while (true) { - // Fast-locking does not use the 'lock' argument. - // Fast-lock spinning to avoid inflating for short critical sections. - // The goal is to only inflate when the extra cost of using ObjectMonitors - // is worth it. - // If deflation has been observed we also spin while deflation is ongoing. - if (fast_lock_try_enter(obj(), lock_stack, current)) { - return; - } else if (UseObjectMonitorTable && fast_lock_spin_enter(obj(), lock_stack, current, observed_deflation)) { - return; - } - - if (observed_deflation) { - spin_yield.wait(); - } - - ObjectMonitor* monitor = inflate_and_enter(obj(), lock, ObjectSynchronizer::inflate_cause_monitor_enter, current, current); - if (monitor != nullptr) { - cache_setter.set_monitor(monitor); - return; - } - - // If inflate_and_enter returns nullptr it is because a deflated monitor - // was encountered. Fallback to fast locking. The deflater is responsible - // for clearing out the monitor and transitioning the markWord back to - // fast locking. - observed_deflation = true; - } -} - -void LightweightSynchronizer::exit(oop object, BasicLock* lock, JavaThread* current) { - assert(current == Thread::current(), "must be"); - - markWord mark = object->mark(); - assert(!mark.is_unlocked(), "must be"); - - LockStack& lock_stack = current->lock_stack(); - if (mark.is_fast_locked()) { - if (lock_stack.try_recursive_exit(object)) { - // This is a recursive exit which succeeded - return; - } - if (lock_stack.is_recursive(object)) { - // Must inflate recursive locks if try_recursive_exit fails - // This happens for un-structured unlocks, could potentially - // fix try_recursive_exit to handle these. - inflate_fast_locked_object(object, ObjectSynchronizer::inflate_cause_vm_internal, current, current); - } - } - - while (mark.is_fast_locked()) { - markWord unlocked_mark = mark.set_unlocked(); - markWord old_mark = mark; - mark = object->cas_set_mark(unlocked_mark, old_mark); - if (old_mark == mark) { - // CAS successful, remove from lock_stack - size_t recursion = lock_stack.remove(object) - 1; - assert(recursion == 0, "Should not have unlocked here"); - return; - } - } - - assert(mark.has_monitor(), "must be"); - // The monitor exists - ObjectMonitor* monitor; - if (UseObjectMonitorTable) { - monitor = read_caches(current, lock, object); - if (monitor == nullptr) { - monitor = get_monitor_from_table(current, object); - } - } else { - monitor = ObjectSynchronizer::read_monitor(mark); - } - if (monitor->has_anonymous_owner()) { - assert(current->lock_stack().contains(object), "current must have object on its lock stack"); - monitor->set_owner_from_anonymous(current); - monitor->set_recursions(current->lock_stack().remove(object) - 1); - } - - monitor->exit(current); -} - -// LightweightSynchronizer::inflate_locked_or_imse is used to get an -// inflated ObjectMonitor* from contexts which require that, such as -// notify/wait and jni_exit. Lightweight locking keeps the invariant that it -// only inflates if it is already locked by the current thread or the current -// thread is in the process of entering. To maintain this invariant we need to -// throw a java.lang.IllegalMonitorStateException before inflating if the -// current thread is not the owner. -ObjectMonitor* LightweightSynchronizer::inflate_locked_or_imse(oop obj, ObjectSynchronizer::InflateCause cause, TRAPS) { - JavaThread* current = THREAD; - - for (;;) { - markWord mark = obj->mark_acquire(); - if (mark.is_unlocked()) { - // No lock, IMSE. - THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), - "current thread is not owner", nullptr); - } - - if (mark.is_fast_locked()) { - if (!current->lock_stack().contains(obj)) { - // Fast locked by other thread, IMSE. - THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), - "current thread is not owner", nullptr); - } else { - // Current thread owns the lock, must inflate - return inflate_fast_locked_object(obj, cause, current, current); - } - } - - assert(mark.has_monitor(), "must be"); - ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); - if (monitor != nullptr) { - if (monitor->has_anonymous_owner()) { - LockStack& lock_stack = current->lock_stack(); - if (lock_stack.contains(obj)) { - // Current thread owns the lock but someone else inflated it. - // Fix owner and pop lock stack. - monitor->set_owner_from_anonymous(current); - monitor->set_recursions(lock_stack.remove(obj) - 1); - } else { - // Fast locked (and inflated) by other thread, or deflation in progress, IMSE. - THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), - "current thread is not owner", nullptr); - } - } - return monitor; - } - } -} - -ObjectMonitor* LightweightSynchronizer::inflate_into_object_header(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, Thread* current) { - - // The JavaThread* locking parameter requires that the locking_thread == JavaThread::current, - // or is suspended throughout the call by some other mechanism. - // Even with lightweight locking the thread might be nullptr when called from a non - // JavaThread. (As may still be the case from FastHashCode). However it is only - // important for the correctness of the lightweight locking algorithm that the thread - // is set when called from ObjectSynchronizer::enter from the owning thread, - // ObjectSynchronizer::enter_for from any thread, or ObjectSynchronizer::exit. - EventJavaMonitorInflate event; - - for (;;) { - const markWord mark = object->mark_acquire(); - - // The mark can be in one of the following states: - // * inflated - Just return if using stack-locking. - // If using fast-locking and the ObjectMonitor owner - // is anonymous and the locking_thread owns the - // object lock, then we make the locking_thread - // the ObjectMonitor owner and remove the lock from - // the locking_thread's lock stack. - // * fast-locked - Coerce it to inflated from fast-locked. - // * unlocked - Aggressively inflate the object. - - // CASE: inflated - if (mark.has_monitor()) { - ObjectMonitor* inf = mark.monitor(); - markWord dmw = inf->header(); - assert(dmw.is_neutral(), "invariant: header=" INTPTR_FORMAT, dmw.value()); - if (inf->has_anonymous_owner() && - locking_thread != nullptr && locking_thread->lock_stack().contains(object)) { - inf->set_owner_from_anonymous(locking_thread); - size_t removed = locking_thread->lock_stack().remove(object); - inf->set_recursions(removed - 1); - } - return inf; - } - - // CASE: fast-locked - // Could be fast-locked either by the locking_thread or by some other thread. - // - // Note that we allocate the ObjectMonitor speculatively, _before_ - // attempting to set the object's mark to the new ObjectMonitor. If - // the locking_thread owns the monitor, then we set the ObjectMonitor's - // owner to the locking_thread. Otherwise, we set the ObjectMonitor's owner - // to anonymous. If we lose the race to set the object's mark to the - // new ObjectMonitor, then we just delete it and loop around again. - // - if (mark.is_fast_locked()) { - ObjectMonitor* monitor = new ObjectMonitor(object); - monitor->set_header(mark.set_unlocked()); - bool own = locking_thread != nullptr && locking_thread->lock_stack().contains(object); - if (own) { - // Owned by locking_thread. - monitor->set_owner(locking_thread); - } else { - // Owned by somebody else. - monitor->set_anonymous_owner(); - } - markWord monitor_mark = markWord::encode(monitor); - markWord old_mark = object->cas_set_mark(monitor_mark, mark); - if (old_mark == mark) { - // Success! Return inflated monitor. - if (own) { - size_t removed = locking_thread->lock_stack().remove(object); - monitor->set_recursions(removed - 1); - } - // Once the ObjectMonitor is configured and object is associated - // with the ObjectMonitor, it is safe to allow async deflation: - ObjectSynchronizer::_in_use_list.add(monitor); - - log_inflate(current, object, cause); - if (event.should_commit()) { - post_monitor_inflate_event(&event, object, cause); - } - return monitor; - } else { - delete monitor; - continue; // Interference -- just retry - } - } - - // CASE: unlocked - // TODO-FIXME: for entry we currently inflate and then try to CAS _owner. - // If we know we're inflating for entry it's better to inflate by swinging a - // pre-locked ObjectMonitor pointer into the object header. A successful - // CAS inflates the object *and* confers ownership to the inflating thread. - // In the current implementation we use a 2-step mechanism where we CAS() - // to inflate and then CAS() again to try to swing _owner from null to current. - // An inflateTry() method that we could call from enter() would be useful. - - assert(mark.is_unlocked(), "invariant: header=" INTPTR_FORMAT, mark.value()); - ObjectMonitor* m = new ObjectMonitor(object); - // prepare m for installation - set monitor to initial state - m->set_header(mark); - - if (object->cas_set_mark(markWord::encode(m), mark) != mark) { - delete m; - m = nullptr; - continue; - // interference - the markword changed - just retry. - // The state-transitions are one-way, so there's no chance of - // live-lock -- "Inflated" is an absorbing state. - } - - // Once the ObjectMonitor is configured and object is associated - // with the ObjectMonitor, it is safe to allow async deflation: - ObjectSynchronizer::_in_use_list.add(m); - - log_inflate(current, object, cause); - if (event.should_commit()) { - post_monitor_inflate_event(&event, object, cause); - } - return m; - } -} - -ObjectMonitor* LightweightSynchronizer::inflate_fast_locked_object(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current) { - VerifyThreadState vts(locking_thread, current); - assert(locking_thread->lock_stack().contains(object), "locking_thread must have object on its lock stack"); - - ObjectMonitor* monitor; - - if (!UseObjectMonitorTable) { - return inflate_into_object_header(object, cause, locking_thread, current); - } - - // Inflating requires a hash code - ObjectSynchronizer::FastHashCode(current, object); - - markWord mark = object->mark_acquire(); - assert(!mark.is_unlocked(), "Cannot be unlocked"); - - for (;;) { - // Fetch the monitor from the table - monitor = get_or_insert_monitor(object, current, cause); - - // ObjectMonitors are always inserted as anonymously owned, this thread is - // the current holder of the monitor. So unless the entry is stale and - // contains a deflating monitor it must be anonymously owned. - if (monitor->has_anonymous_owner()) { - // The monitor must be anonymously owned if it was added - assert(monitor == get_monitor_from_table(current, object), "The monitor must be found"); - // New fresh monitor - break; - } - - // If the monitor was not anonymously owned then we got a deflating monitor - // from the table. We need to let the deflator make progress and remove this - // entry before we are allowed to add a new one. - os::naked_yield(); - assert(monitor->is_being_async_deflated(), "Should be the reason"); - } - - // Set the mark word; loop to handle concurrent updates to other parts of the mark word - while (mark.is_fast_locked()) { - mark = object->cas_set_mark(mark.set_has_monitor(), mark); - } - - // Indicate that the monitor now has a known owner - monitor->set_owner_from_anonymous(locking_thread); - - // Remove the entry from the thread's lock stack - monitor->set_recursions(locking_thread->lock_stack().remove(object) - 1); - - if (locking_thread == current) { - // Only change the thread local state of the current thread. - locking_thread->om_set_monitor_cache(monitor); - } - - return monitor; -} - -ObjectMonitor* LightweightSynchronizer::inflate_and_enter(oop object, BasicLock* lock, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current) { - VerifyThreadState vts(locking_thread, current); - - // Note: In some paths (deoptimization) the 'current' thread inflates and - // enters the lock on behalf of the 'locking_thread' thread. - - ObjectMonitor* monitor = nullptr; - - if (!UseObjectMonitorTable) { - // Do the old inflate and enter. - monitor = inflate_into_object_header(object, cause, locking_thread, current); - - bool entered; - if (locking_thread == current) { - entered = monitor->enter(locking_thread); - } else { - entered = monitor->enter_for(locking_thread); - } - - // enter returns false for deflation found. - return entered ? monitor : nullptr; - } - - NoSafepointVerifier nsv; - - // Try to get the monitor from the thread-local cache. - // There's no need to use the cache if we are locking - // on behalf of another thread. - if (current == locking_thread) { - monitor = read_caches(current, lock, object); - } - - // Get or create the monitor - if (monitor == nullptr) { - // Lightweight monitors require that hash codes are installed first - ObjectSynchronizer::FastHashCode(locking_thread, object); - monitor = get_or_insert_monitor(object, current, cause); - } - - if (monitor->try_enter(locking_thread)) { - return monitor; - } - - // Holds is_being_async_deflated() stable throughout this function. - ObjectMonitorContentionMark contention_mark(monitor); - - /// First handle the case where the monitor from the table is deflated - if (monitor->is_being_async_deflated()) { - // The MonitorDeflation thread is deflating the monitor. The locking thread - // must spin until further progress has been made. - - // Clear the BasicLock cache as it may contain this monitor. - lock->clear_object_monitor_cache(); - - const markWord mark = object->mark_acquire(); - - if (mark.has_monitor()) { - // Waiting on the deflation thread to remove the deflated monitor from the table. - os::naked_yield(); - - } else if (mark.is_fast_locked()) { - // Some other thread managed to fast-lock the lock, or this is a - // recursive lock from the same thread; yield for the deflation - // thread to remove the deflated monitor from the table. - os::naked_yield(); - - } else { - assert(mark.is_unlocked(), "Implied"); - // Retry immediately - } - - // Retry - return nullptr; - } - - for (;;) { - const markWord mark = object->mark_acquire(); - // The mark can be in one of the following states: - // * inflated - If the ObjectMonitor owner is anonymous - // and the locking_thread owns the object - // lock, then we make the locking_thread - // the ObjectMonitor owner and remove the - // lock from the locking_thread's lock stack. - // * fast-locked - Coerce it to inflated from fast-locked. - // * neutral - Inflate the object. Successful CAS is locked - - // CASE: inflated - if (mark.has_monitor()) { - LockStack& lock_stack = locking_thread->lock_stack(); - if (monitor->has_anonymous_owner() && lock_stack.contains(object)) { - // The lock is fast-locked by the locking thread, - // convert it to a held monitor with a known owner. - monitor->set_owner_from_anonymous(locking_thread); - monitor->set_recursions(lock_stack.remove(object) - 1); - } - - break; // Success - } - - // CASE: fast-locked - // Could be fast-locked either by locking_thread or by some other thread. - // - if (mark.is_fast_locked()) { - markWord old_mark = object->cas_set_mark(mark.set_has_monitor(), mark); - if (old_mark != mark) { - // CAS failed - continue; - } - - // Success! Return inflated monitor. - LockStack& lock_stack = locking_thread->lock_stack(); - if (lock_stack.contains(object)) { - // The lock is fast-locked by the locking thread, - // convert it to a held monitor with a known owner. - monitor->set_owner_from_anonymous(locking_thread); - monitor->set_recursions(lock_stack.remove(object) - 1); - } - - break; // Success - } - - // CASE: neutral (unlocked) - - // Catch if the object's header is not neutral (not locked and - // not marked is what we care about here). - assert(mark.is_neutral(), "invariant: header=" INTPTR_FORMAT, mark.value()); - markWord old_mark = object->cas_set_mark(mark.set_has_monitor(), mark); - if (old_mark != mark) { - // CAS failed - continue; - } - - // Transitioned from unlocked to monitor means locking_thread owns the lock. - monitor->set_owner_from_anonymous(locking_thread); - - return monitor; - } - - if (current == locking_thread) { - // One round of spinning - if (monitor->spin_enter(locking_thread)) { - return monitor; - } - - // Monitor is contended, take the time before entering to fix the lock stack. - LockStackInflateContendedLocks().inflate(current); - } - - // enter can block for safepoints; clear the unhandled object oop - PauseNoSafepointVerifier pnsv(&nsv); - object = nullptr; - - if (current == locking_thread) { - monitor->enter_with_contention_mark(locking_thread, contention_mark); - } else { - monitor->enter_for_with_contention_mark(locking_thread, contention_mark); - } - - return monitor; -} - -void LightweightSynchronizer::deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor) { - if (obj != nullptr) { - deflate_mark_word(obj); - } - bool removed = remove_monitor(current, monitor, obj); - if (obj != nullptr) { - assert(removed, "Should have removed the entry if obj was alive"); - } -} - -ObjectMonitor* LightweightSynchronizer::get_monitor_from_table(Thread* current, oop obj) { - assert(UseObjectMonitorTable, "must be"); - return ObjectMonitorTable::monitor_get(current, obj); -} - -bool LightweightSynchronizer::contains_monitor(Thread* current, ObjectMonitor* monitor) { - assert(UseObjectMonitorTable, "must be"); - return ObjectMonitorTable::contains_monitor(current, monitor); -} - -bool LightweightSynchronizer::quick_enter(oop obj, BasicLock* lock, JavaThread* current) { - assert(current->thread_state() == _thread_in_Java, "must be"); - assert(obj != nullptr, "must be"); - NoSafepointVerifier nsv; - - LockStack& lock_stack = current->lock_stack(); - if (lock_stack.is_full()) { - // Always go into runtime if the lock stack is full. - return false; - } - - const markWord mark = obj->mark(); - -#ifndef _LP64 - // Only for 32bit which has limited support for fast locking outside the runtime. - if (lock_stack.try_recursive_enter(obj)) { - // Recursive lock successful. - return true; - } - - if (mark.is_unlocked()) { - markWord locked_mark = mark.set_fast_locked(); - if (obj->cas_set_mark(locked_mark, mark) == mark) { - // Successfully fast-locked, push object to lock-stack and return. - lock_stack.push(obj); - return true; - } - } -#endif - - if (mark.has_monitor()) { - ObjectMonitor* monitor; - if (UseObjectMonitorTable) { - monitor = read_caches(current, lock, obj); - } else { - monitor = ObjectSynchronizer::read_monitor(mark); - } - - if (monitor == nullptr) { - // Take the slow-path on a cache miss. - return false; - } - - if (UseObjectMonitorTable) { - // Set the monitor regardless of success. - // Either we successfully lock on the monitor, or we retry with the - // monitor in the slow path. If the monitor gets deflated, it will be - // cleared, either by the CacheSetter if we fast lock in enter or in - // inflate_and_enter when we see that the monitor is deflated. - lock->set_object_monitor_cache(monitor); - } - - if (monitor->spin_enter(current)) { - return true; - } - } - - // Slow-path. - return false; -} diff --git a/src/hotspot/share/runtime/lightweightSynchronizer.hpp b/src/hotspot/share/runtime/lightweightSynchronizer.hpp deleted file mode 100644 index b10e639a67c..00000000000 --- a/src/hotspot/share/runtime/lightweightSynchronizer.hpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2024, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#ifndef SHARE_RUNTIME_LIGHTWEIGHTSYNCHRONIZER_HPP -#define SHARE_RUNTIME_LIGHTWEIGHTSYNCHRONIZER_HPP - -#include "memory/allStatic.hpp" -#include "runtime/javaThread.hpp" -#include "runtime/objectMonitor.hpp" -#include "runtime/synchronizer.hpp" - -class ObjectMonitorTable; - -class LightweightSynchronizer : AllStatic { - private: - static ObjectMonitor* get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted); - static ObjectMonitor* get_or_insert_monitor(oop object, JavaThread* current, ObjectSynchronizer::InflateCause cause); - - static ObjectMonitor* add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj); - static bool remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj); - - static void deflate_mark_word(oop object); - - static void ensure_lock_stack_space(JavaThread* current); - - class CacheSetter; - class LockStackInflateContendedLocks; - class VerifyThreadState; - - public: - static void initialize(); - - static bool needs_resize(); - static bool resize_table(JavaThread* current); - - private: - static inline bool fast_lock_try_enter(oop obj, LockStack& lock_stack, JavaThread* current); - static bool fast_lock_spin_enter(oop obj, LockStack& lock_stack, JavaThread* current, bool observed_deflation); - - public: - static void enter_for(Handle obj, BasicLock* lock, JavaThread* locking_thread); - static void enter(Handle obj, BasicLock* lock, JavaThread* current); - static void exit(oop object, BasicLock* lock, JavaThread* current); - - static ObjectMonitor* inflate_into_object_header(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, Thread* current); - static ObjectMonitor* inflate_locked_or_imse(oop object, ObjectSynchronizer::InflateCause cause, TRAPS); - static ObjectMonitor* inflate_fast_locked_object(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); - static ObjectMonitor* inflate_and_enter(oop object, BasicLock* lock, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); - - static void deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor); - - static ObjectMonitor* get_monitor_from_table(Thread* current, oop obj); - - static bool contains_monitor(Thread* current, ObjectMonitor* monitor); - - static bool quick_enter(oop obj, BasicLock* Lock, JavaThread* current); -}; - -#endif // SHARE_RUNTIME_LIGHTWEIGHTSYNCHRONIZER_HPP diff --git a/src/hotspot/share/runtime/lockStack.cpp b/src/hotspot/share/runtime/lockStack.cpp index 95f72393d91..a88a84eb9f8 100644 --- a/src/hotspot/share/runtime/lockStack.cpp +++ b/src/hotspot/share/runtime/lockStack.cpp @@ -35,7 +35,7 @@ #include "runtime/safepoint.hpp" #include "runtime/stackWatermark.hpp" #include "runtime/stackWatermarkSet.inline.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/thread.hpp" #include "utilities/copy.hpp" #include "utilities/debug.hpp" @@ -82,7 +82,7 @@ void LockStack::verify(const char* msg) const { int top = to_index(_top); for (int i = 0; i < top; i++) { assert(_base[i] != nullptr, "no zapped before top"); - if (VM_Version::supports_recursive_lightweight_locking()) { + if (VM_Version::supports_recursive_fast_locking()) { oop o = _base[i]; for (; i < top - 1; i++) { // Consecutive entries may be the same diff --git a/src/hotspot/share/runtime/lockStack.inline.hpp b/src/hotspot/share/runtime/lockStack.inline.hpp index 0516a85356d..27eb07fcec8 100644 --- a/src/hotspot/share/runtime/lockStack.inline.hpp +++ b/src/hotspot/share/runtime/lockStack.inline.hpp @@ -1,7 +1,7 @@ /* * Copyright (c) 2022, Red Hat, Inc. All rights reserved. * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -31,11 +31,11 @@ #include "memory/iterator.hpp" #include "runtime/javaThread.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/objectMonitor.inline.hpp" #include "runtime/safepoint.hpp" #include "runtime/stackWatermark.hpp" #include "runtime/stackWatermarkSet.inline.hpp" +#include "runtime/synchronizer.hpp" #include "utilities/align.hpp" #include "utilities/globalDefinitions.hpp" @@ -87,7 +87,7 @@ inline bool LockStack::is_empty() const { } inline bool LockStack::is_recursive(oop o) const { - if (!VM_Version::supports_recursive_lightweight_locking()) { + if (!VM_Version::supports_recursive_fast_locking()) { return false; } verify("pre-is_recursive"); @@ -119,7 +119,7 @@ inline bool LockStack::is_recursive(oop o) const { } inline bool LockStack::try_recursive_enter(oop o) { - if (!VM_Version::supports_recursive_lightweight_locking()) { + if (!VM_Version::supports_recursive_fast_locking()) { return false; } verify("pre-try_recursive_enter"); @@ -145,7 +145,7 @@ inline bool LockStack::try_recursive_enter(oop o) { } inline bool LockStack::try_recursive_exit(oop o) { - if (!VM_Version::supports_recursive_lightweight_locking()) { + if (!VM_Version::supports_recursive_fast_locking()) { return false; } verify("pre-try_recursive_exit"); @@ -254,7 +254,7 @@ inline void OMCache::set_monitor(ObjectMonitor *monitor) { oop obj = monitor->object_peek(); assert(obj != nullptr, "must be alive"); - assert(monitor == LightweightSynchronizer::get_monitor_from_table(JavaThread::current(), obj), "must exist in table"); + assert(monitor == ObjectSynchronizer::get_monitor_from_table(JavaThread::current(), obj), "must exist in table"); OMCacheEntry to_insert = {obj, monitor}; diff --git a/src/hotspot/share/runtime/objectMonitor.cpp b/src/hotspot/share/runtime/objectMonitor.cpp index 6a99568ba44..ee7629ec6f5 100644 --- a/src/hotspot/share/runtime/objectMonitor.cpp +++ b/src/hotspot/share/runtime/objectMonitor.cpp @@ -43,7 +43,6 @@ #include "runtime/handles.inline.hpp" #include "runtime/interfaceSupport.inline.hpp" #include "runtime/javaThread.inline.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.inline.hpp" #include "runtime/orderAccess.hpp" @@ -51,6 +50,7 @@ #include "runtime/safefetch.hpp" #include "runtime/safepointMechanism.inline.hpp" #include "runtime/sharedRuntime.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/threads.hpp" #include "services/threadService.hpp" #include "utilities/debug.hpp" @@ -415,7 +415,7 @@ bool ObjectMonitor::try_lock_with_contention_mark(JavaThread* locking_thread, Ob } void ObjectMonitor::enter_for_with_contention_mark(JavaThread* locking_thread, ObjectMonitorContentionMark& contention_mark) { - // Used by LightweightSynchronizer::inflate_and_enter in deoptimization path to enter for another thread. + // Used by ObjectSynchronizer::inflate_and_enter in deoptimization path to enter for another thread. // The monitor is private to or already owned by locking_thread which must be suspended. // So this code may only contend with deflation. assert(locking_thread == Thread::current() || locking_thread->is_obj_deopt_suspend(), "must be"); @@ -856,7 +856,7 @@ bool ObjectMonitor::deflate_monitor(Thread* current) { } if (UseObjectMonitorTable) { - LightweightSynchronizer::deflate_monitor(current, obj, this); + ObjectSynchronizer::deflate_monitor(current, obj, this); } else if (obj != nullptr) { // Install the old mark word if nobody else has already done it. install_displaced_markword_in_object(obj); diff --git a/src/hotspot/share/runtime/objectMonitor.hpp b/src/hotspot/share/runtime/objectMonitor.hpp index 2da41786309..53b64f1e8a5 100644 --- a/src/hotspot/share/runtime/objectMonitor.hpp +++ b/src/hotspot/share/runtime/objectMonitor.hpp @@ -160,10 +160,10 @@ class ObjectMonitor : public CHeapObj { // Because of frequent access, the metadata field is at offset zero (0). // Enforced by the assert() in metadata_addr(). - // * Lightweight locking with UseObjectMonitorTable: + // * Locking with UseObjectMonitorTable: // Contains the _object's hashCode. - // * * Lightweight locking without UseObjectMonitorTable: - // Contains the displaced object header word - mark + // * Locking without UseObjectMonitorTable: + // Contains the displaced object header word - mark volatile uintptr_t _metadata; // metadata WeakHandle _object; // backward object pointer // Separate _metadata and _owner on different cache lines since both can diff --git a/src/hotspot/share/runtime/objectMonitor.inline.hpp b/src/hotspot/share/runtime/objectMonitor.inline.hpp index eeb451235dc..efdc33cd441 100644 --- a/src/hotspot/share/runtime/objectMonitor.inline.hpp +++ b/src/hotspot/share/runtime/objectMonitor.inline.hpp @@ -74,22 +74,22 @@ inline volatile uintptr_t* ObjectMonitor::metadata_addr() { } inline markWord ObjectMonitor::header() const { - assert(!UseObjectMonitorTable, "Lightweight locking with OM table does not use header"); + assert(!UseObjectMonitorTable, "Locking with OM table does not use header"); return markWord(metadata()); } inline void ObjectMonitor::set_header(markWord hdr) { - assert(!UseObjectMonitorTable, "Lightweight locking with OM table does not use header"); + assert(!UseObjectMonitorTable, "Locking with OM table does not use header"); set_metadata(hdr.value()); } inline intptr_t ObjectMonitor::hash() const { - assert(UseObjectMonitorTable, "Only used by lightweight locking with OM table"); + assert(UseObjectMonitorTable, "Only used when locking with OM table"); return metadata(); } inline void ObjectMonitor::set_hash(intptr_t hash) { - assert(UseObjectMonitorTable, "Only used by lightweight locking with OM table"); + assert(UseObjectMonitorTable, "Only used when locking with OM table"); set_metadata(hash); } diff --git a/src/hotspot/share/runtime/serviceThread.cpp b/src/hotspot/share/runtime/serviceThread.cpp index 03168842e36..27958885a7f 100644 --- a/src/hotspot/share/runtime/serviceThread.cpp +++ b/src/hotspot/share/runtime/serviceThread.cpp @@ -36,10 +36,10 @@ #include "prims/resolvedMethodTable.hpp" #include "runtime/handles.inline.hpp" #include "runtime/interfaceSupport.inline.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/os.hpp" #include "runtime/serviceThread.hpp" +#include "runtime/synchronizer.hpp" #include "services/finalizerService.hpp" #include "services/gcNotifier.hpp" #include "services/lowMemoryDetector.hpp" @@ -113,7 +113,7 @@ void ServiceThread::service_thread_entry(JavaThread* jt, TRAPS) { (cldg_cleanup_work = ClassLoaderDataGraph::should_clean_metaspaces_and_reset()) | (jvmti_tagmap_work = JvmtiTagMap::has_object_free_events_and_reset()) | (oopmap_cache_work = OopMapCache::has_cleanup_work()) | - (object_monitor_table_work = LightweightSynchronizer::needs_resize()) + (object_monitor_table_work = ObjectSynchronizer::needs_resize()) ) == 0) { // Wait until notified that there is some work to do or timer expires. // Some cleanup requests don't notify the ServiceThread so work needs to be done at periodic intervals. @@ -173,7 +173,7 @@ void ServiceThread::service_thread_entry(JavaThread* jt, TRAPS) { } if (object_monitor_table_work) { - LightweightSynchronizer::resize_table(jt); + ObjectSynchronizer::resize_table(jt); } } } diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index a980838ed76..afa4558c7ae 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -72,7 +72,7 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/stackWatermarkSet.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/timerTrace.hpp" #include "runtime/vframe.inline.hpp" #include "runtime/vframeArray.hpp" @@ -2029,7 +2029,7 @@ void SharedRuntime::monitor_exit_helper(oopDesc* obj, BasicLock* lock, JavaThrea ExceptionMark em(current); // Check if C2_MacroAssembler::fast_unlock() or - // C2_MacroAssembler::fast_unlock_lightweight() unlocked an inflated + // C2_MacroAssembler::fast_unlock() unlocked an inflated // monitor before going slow path. Since there is no safepoint // polling when calling into the VM, we can be sure that the monitor // hasn't been deallocated. diff --git a/src/hotspot/share/runtime/synchronizer.cpp b/src/hotspot/share/runtime/synchronizer.cpp index 36e38b4dd35..fe95320c574 100644 --- a/src/hotspot/share/runtime/synchronizer.cpp +++ b/src/hotspot/share/runtime/synchronizer.cpp @@ -41,7 +41,6 @@ #include "runtime/handshake.hpp" #include "runtime/interfaceSupport.inline.hpp" #include "runtime/javaThread.hpp" -#include "runtime/lightweightSynchronizer.hpp" #include "runtime/lockStack.inline.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.inline.hpp" @@ -51,13 +50,16 @@ #include "runtime/safepointVerifiers.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/threads.hpp" #include "runtime/timer.hpp" +#include "runtime/timerTrace.hpp" #include "runtime/trimNativeHeap.hpp" #include "runtime/vframe.hpp" #include "runtime/vmThread.hpp" #include "utilities/align.hpp" +#include "utilities/concurrentHashTable.inline.hpp" +#include "utilities/concurrentHashTableTasks.inline.hpp" #include "utilities/dtrace.hpp" #include "utilities/events.hpp" #include "utilities/globalCounter.inline.hpp" @@ -281,7 +283,7 @@ void ObjectSynchronizer::initialize() { // Start the timer for deflations, so it does not trigger immediately. _last_async_deflation_time_ns = os::javaTimeNanos(); - LightweightSynchronizer::initialize(); + ObjectSynchronizer::create_om_table(); } MonitorList ObjectSynchronizer::_in_use_list; @@ -421,17 +423,6 @@ void ObjectSynchronizer::handle_sync_on_value_based_class(Handle obj, JavaThread } } -// ----------------------------------------------------------------------------- -// Monitor Enter/Exit - -void ObjectSynchronizer::enter_for(Handle obj, BasicLock* lock, JavaThread* locking_thread) { - // When called with locking_thread != Thread::current() some mechanism must synchronize - // the locking_thread with respect to the current thread. Currently only used when - // deoptimizing and re-locking locks. See Deoptimization::relock_objects - assert(locking_thread == Thread::current() || locking_thread->is_obj_deopt_suspend(), "must be"); - return LightweightSynchronizer::enter_for(obj, lock, locking_thread); -} - // ----------------------------------------------------------------------------- // JNI locks on java objects // NOTE: must use heavy weight monitor to handle jni monitor enter @@ -451,7 +442,7 @@ void ObjectSynchronizer::jni_enter(Handle obj, JavaThread* current) { // we have lost the race to async deflation and we simply try again. while (true) { BasicLock lock; - if (LightweightSynchronizer::inflate_and_enter(obj(), &lock, inflate_cause_jni_enter, current, current) != nullptr) { + if (ObjectSynchronizer::inflate_and_enter(obj(), &lock, inflate_cause_jni_enter, current, current) != nullptr) { break; } } @@ -463,7 +454,7 @@ void ObjectSynchronizer::jni_exit(oop obj, TRAPS) { JavaThread* current = THREAD; ObjectMonitor* monitor; - monitor = LightweightSynchronizer::inflate_locked_or_imse(obj, inflate_cause_jni_exit, CHECK); + monitor = ObjectSynchronizer::inflate_locked_or_imse(obj, inflate_cause_jni_exit, CHECK); // If this thread has locked the object, exit the monitor. We // intentionally do not use CHECK on check_owner because we must exit the // monitor even if an exception was already pending. @@ -526,7 +517,7 @@ int ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) { } ObjectMonitor* monitor; - monitor = LightweightSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_wait, CHECK_0); + monitor = ObjectSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_wait, CHECK_0); DTRACE_MONITOR_WAIT_PROBE(monitor, obj(), current, millis); monitor->wait(millis, true, THREAD); // Not CHECK as we need following code @@ -543,7 +534,7 @@ void ObjectSynchronizer::waitUninterruptibly(Handle obj, jlong millis, TRAPS) { assert(millis >= 0, "timeout value is negative"); ObjectMonitor* monitor; - monitor = LightweightSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_wait, CHECK); + monitor = ObjectSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_wait, CHECK); monitor->wait(millis, false, THREAD); } @@ -556,7 +547,7 @@ void ObjectSynchronizer::notify(Handle obj, TRAPS) { // Not inflated so there can't be any waiters to notify. return; } - ObjectMonitor* monitor = LightweightSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_notify, CHECK); + ObjectMonitor* monitor = ObjectSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_notify, CHECK); monitor->notify(CHECK); } @@ -570,7 +561,7 @@ void ObjectSynchronizer::notifyall(Handle obj, TRAPS) { return; } - ObjectMonitor* monitor = LightweightSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_notify, CHECK); + ObjectMonitor* monitor = ObjectSynchronizer::inflate_locked_or_imse(obj(), inflate_cause_notify, CHECK); monitor->notifyAll(CHECK); } @@ -647,40 +638,15 @@ static intptr_t get_next_hash(Thread* current, oop obj) { return value; } -static intptr_t install_hash_code(Thread* current, oop obj) { - assert(UseObjectMonitorTable, "must be"); - - markWord mark = obj->mark_acquire(); - for (;;) { - intptr_t hash = mark.hash(); - if (hash != 0) { - return hash; - } - - hash = get_next_hash(current, obj); - const markWord old_mark = mark; - const markWord new_mark = old_mark.copy_set_hash(hash); - - mark = obj->cas_set_mark(new_mark, old_mark); - if (old_mark == mark) { - return hash; - } - } -} - intptr_t ObjectSynchronizer::FastHashCode(Thread* current, oop obj) { - if (UseObjectMonitorTable) { - // Since the monitor isn't in the object header, the hash can simply be - // installed in the object header. - return install_hash_code(current, obj); - } - while (true) { ObjectMonitor* monitor = nullptr; markWord temp, test; intptr_t hash; markWord mark = obj->mark_acquire(); - if (mark.is_unlocked() || mark.is_fast_locked()) { + // If UseObjectMonitorTable is set the hash can simply be installed in the + // object header, since the monitor isn't in the object header. + if (UseObjectMonitorTable || !mark.has_monitor()) { hash = mark.hash(); if (hash != 0) { // if it has a hash, just return it return hash; @@ -699,7 +665,8 @@ intptr_t ObjectSynchronizer::FastHashCode(Thread* current, oop obj) { // installed the hash just before our attempt or inflation has // occurred or... so we fall thru to inflate the monitor for // stability and then install the hash. - } else if (mark.has_monitor()) { + } else { + assert(!mark.is_unlocked() && !mark.is_fast_locked(), "invariant"); monitor = mark.monitor(); temp = monitor->header(); assert(temp.is_neutral(), "invariant: header=" INTPTR_FORMAT, temp.value()); @@ -1230,7 +1197,7 @@ size_t ObjectSynchronizer::deflate_idle_monitors() { #ifdef ASSERT if (UseObjectMonitorTable) { for (ObjectMonitor* monitor : delete_list) { - assert(!LightweightSynchronizer::contains_monitor(current, monitor), "Should have been removed"); + assert(!ObjectSynchronizer::contains_monitor(current, monitor), "Should have been removed"); } } #endif @@ -1502,3 +1469,1219 @@ void ObjectSynchronizer::log_in_use_monitor_details(outputStream* out, bool log_ out->flush(); } + +// ----------------------------------------------------------------------------- +// ConcurrentHashTable storing links from objects to ObjectMonitors +class ObjectMonitorTable : AllStatic { + struct Config { + using Value = ObjectMonitor*; + static uintx get_hash(Value const& value, bool* is_dead) { + return (uintx)value->hash(); + } + static void* allocate_node(void* context, size_t size, Value const& value) { + ObjectMonitorTable::inc_items_count(); + return AllocateHeap(size, mtObjectMonitor); + }; + static void free_node(void* context, void* memory, Value const& value) { + ObjectMonitorTable::dec_items_count(); + FreeHeap(memory); + } + }; + using ConcurrentTable = ConcurrentHashTable; + + static ConcurrentTable* _table; + static volatile size_t _items_count; + static size_t _table_size; + static volatile bool _resize; + + class Lookup : public StackObj { + oop _obj; + + public: + explicit Lookup(oop obj) : _obj(obj) {} + + uintx get_hash() const { + uintx hash = _obj->mark().hash(); + assert(hash != 0, "should have a hash"); + return hash; + } + + bool equals(ObjectMonitor** value) { + assert(*value != nullptr, "must be"); + return (*value)->object_refers_to(_obj); + } + + bool is_dead(ObjectMonitor** value) { + assert(*value != nullptr, "must be"); + return false; + } + }; + + class LookupMonitor : public StackObj { + ObjectMonitor* _monitor; + + public: + explicit LookupMonitor(ObjectMonitor* monitor) : _monitor(monitor) {} + + uintx get_hash() const { + return _monitor->hash(); + } + + bool equals(ObjectMonitor** value) { + return (*value) == _monitor; + } + + bool is_dead(ObjectMonitor** value) { + assert(*value != nullptr, "must be"); + return (*value)->object_is_dead(); + } + }; + + static void inc_items_count() { + AtomicAccess::inc(&_items_count, memory_order_relaxed); + } + + static void dec_items_count() { + AtomicAccess::dec(&_items_count, memory_order_relaxed); + } + + static double get_load_factor() { + size_t count = AtomicAccess::load(&_items_count); + return (double)count / (double)_table_size; + } + + static size_t table_size(Thread* current = Thread::current()) { + return ((size_t)1) << _table->get_size_log2(current); + } + + static size_t max_log_size() { + // TODO[OMTable]: Evaluate the max size. + // TODO[OMTable]: Need to fix init order to use Universe::heap()->max_capacity(); + // Using MaxHeapSize directly this early may be wrong, and there + // are definitely rounding errors (alignment). + const size_t max_capacity = MaxHeapSize; + const size_t min_object_size = CollectedHeap::min_dummy_object_size() * HeapWordSize; + const size_t max_objects = max_capacity / MAX2(MinObjAlignmentInBytes, checked_cast(min_object_size)); + const size_t log_max_objects = log2i_graceful(max_objects); + + return MAX2(MIN2(SIZE_BIG_LOG2, log_max_objects), min_log_size()); + } + + static size_t min_log_size() { + // ~= log(AvgMonitorsPerThreadEstimate default) + return 10; + } + + template + static size_t clamp_log_size(V log_size) { + return MAX2(MIN2(log_size, checked_cast(max_log_size())), checked_cast(min_log_size())); + } + + static size_t initial_log_size() { + const size_t estimate = log2i(MAX2(os::processor_count(), 1)) + log2i(MAX2(AvgMonitorsPerThreadEstimate, size_t(1))); + return clamp_log_size(estimate); + } + + static size_t grow_hint () { + return ConcurrentTable::DEFAULT_GROW_HINT; + } + + public: + static void create() { + _table = new ConcurrentTable(initial_log_size(), max_log_size(), grow_hint()); + _items_count = 0; + _table_size = table_size(); + _resize = false; + } + + static void verify_monitor_get_result(oop obj, ObjectMonitor* monitor) { +#ifdef ASSERT + if (SafepointSynchronize::is_at_safepoint()) { + bool has_monitor = obj->mark().has_monitor(); + assert(has_monitor == (monitor != nullptr), + "Inconsistency between markWord and ObjectMonitorTable has_monitor: %s monitor: " PTR_FORMAT, + BOOL_TO_STR(has_monitor), p2i(monitor)); + } +#endif + } + + static ObjectMonitor* monitor_get(Thread* current, oop obj) { + ObjectMonitor* result = nullptr; + Lookup lookup_f(obj); + auto found_f = [&](ObjectMonitor** found) { + assert((*found)->object_peek() == obj, "must be"); + result = *found; + }; + _table->get(current, lookup_f, found_f); + verify_monitor_get_result(obj, result); + return result; + } + + static void try_notify_grow() { + if (!_table->is_max_size_reached() && !AtomicAccess::load(&_resize)) { + AtomicAccess::store(&_resize, true); + if (Service_lock->try_lock()) { + Service_lock->notify(); + Service_lock->unlock(); + } + } + } + + static bool should_shrink() { + // Not implemented; + return false; + } + + static constexpr double GROW_LOAD_FACTOR = 0.75; + + static bool should_grow() { + return get_load_factor() > GROW_LOAD_FACTOR && !_table->is_max_size_reached(); + } + + static bool should_resize() { + return should_grow() || should_shrink() || AtomicAccess::load(&_resize); + } + + template + static bool run_task(JavaThread* current, Task& task, const char* task_name, Args&... args) { + if (task.prepare(current)) { + log_trace(monitortable)("Started to %s", task_name); + TraceTime timer(task_name, TRACETIME_LOG(Debug, monitortable, perf)); + while (task.do_task(current, args...)) { + task.pause(current); + { + ThreadBlockInVM tbivm(current); + } + task.cont(current); + } + task.done(current); + return true; + } + return false; + } + + static bool grow(JavaThread* current) { + ConcurrentTable::GrowTask grow_task(_table); + if (run_task(current, grow_task, "Grow")) { + _table_size = table_size(current); + log_info(monitortable)("Grown to size: %zu", _table_size); + return true; + } + return false; + } + + static bool clean(JavaThread* current) { + ConcurrentTable::BulkDeleteTask clean_task(_table); + auto is_dead = [&](ObjectMonitor** monitor) { + return (*monitor)->object_is_dead(); + }; + auto do_nothing = [&](ObjectMonitor** monitor) {}; + NativeHeapTrimmer::SuspendMark sm("ObjectMonitorTable"); + return run_task(current, clean_task, "Clean", is_dead, do_nothing); + } + + static bool resize(JavaThread* current) { + LogTarget(Info, monitortable) lt; + bool success = false; + + if (should_grow()) { + lt.print("Start growing with load factor %f", get_load_factor()); + success = grow(current); + } else { + if (!_table->is_max_size_reached() && AtomicAccess::load(&_resize)) { + lt.print("WARNING: Getting resize hints with load factor %f", get_load_factor()); + } + lt.print("Start cleaning with load factor %f", get_load_factor()); + success = clean(current); + } + + AtomicAccess::store(&_resize, false); + + return success; + } + + static ObjectMonitor* monitor_put_get(Thread* current, ObjectMonitor* monitor, oop obj) { + // Enter the monitor into the concurrent hashtable. + ObjectMonitor* result = monitor; + Lookup lookup_f(obj); + auto found_f = [&](ObjectMonitor** found) { + assert((*found)->object_peek() == obj, "must be"); + result = *found; + }; + bool grow; + _table->insert_get(current, lookup_f, monitor, found_f, &grow); + verify_monitor_get_result(obj, result); + if (grow) { + try_notify_grow(); + } + return result; + } + + static bool remove_monitor_entry(Thread* current, ObjectMonitor* monitor) { + LookupMonitor lookup_f(monitor); + return _table->remove(current, lookup_f); + } + + static bool contains_monitor(Thread* current, ObjectMonitor* monitor) { + LookupMonitor lookup_f(monitor); + bool result = false; + auto found_f = [&](ObjectMonitor** found) { + result = true; + }; + _table->get(current, lookup_f, found_f); + return result; + } + + static void print_on(outputStream* st) { + auto printer = [&] (ObjectMonitor** entry) { + ObjectMonitor* om = *entry; + oop obj = om->object_peek(); + st->print("monitor=" PTR_FORMAT ", ", p2i(om)); + st->print("object=" PTR_FORMAT, p2i(obj)); + assert(obj->mark().hash() == om->hash(), "hash must match"); + st->cr(); + return true; + }; + if (SafepointSynchronize::is_at_safepoint()) { + _table->do_safepoint_scan(printer); + } else { + _table->do_scan(Thread::current(), printer); + } + } +}; + +ObjectMonitorTable::ConcurrentTable* ObjectMonitorTable::_table = nullptr; +volatile size_t ObjectMonitorTable::_items_count = 0; +size_t ObjectMonitorTable::_table_size = 0; +volatile bool ObjectMonitorTable::_resize = false; + +ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted) { + ObjectMonitor* monitor = get_monitor_from_table(current, object); + if (monitor != nullptr) { + *inserted = false; + return monitor; + } + + ObjectMonitor* alloced_monitor = new ObjectMonitor(object); + alloced_monitor->set_anonymous_owner(); + + // Try insert monitor + monitor = add_monitor(current, alloced_monitor, object); + + *inserted = alloced_monitor == monitor; + if (!*inserted) { + delete alloced_monitor; + } + + return monitor; +} + +static void log_inflate(Thread* current, oop object, ObjectSynchronizer::InflateCause cause) { + if (log_is_enabled(Trace, monitorinflation)) { + ResourceMark rm(current); + log_trace(monitorinflation)("inflate: object=" INTPTR_FORMAT ", mark=" + INTPTR_FORMAT ", type='%s' cause=%s", p2i(object), + object->mark().value(), object->klass()->external_name(), + ObjectSynchronizer::inflate_cause_name(cause)); + } +} + +static void post_monitor_inflate_event(EventJavaMonitorInflate* event, + const oop obj, + ObjectSynchronizer::InflateCause cause) { + assert(event != nullptr, "invariant"); + const Klass* monitor_klass = obj->klass(); + if (ObjectMonitor::is_jfr_excluded(monitor_klass)) { + return; + } + event->set_monitorClass(monitor_klass); + event->set_address((uintptr_t)(void*)obj); + event->set_cause((u1)cause); + event->commit(); +} + +ObjectMonitor* ObjectSynchronizer::get_or_insert_monitor(oop object, JavaThread* current, ObjectSynchronizer::InflateCause cause) { + assert(UseObjectMonitorTable, "must be"); + + EventJavaMonitorInflate event; + + bool inserted; + ObjectMonitor* monitor = get_or_insert_monitor_from_table(object, current, &inserted); + + if (inserted) { + log_inflate(current, object, cause); + if (event.should_commit()) { + post_monitor_inflate_event(&event, object, cause); + } + + // The monitor has an anonymous owner so it is safe from async deflation. + ObjectSynchronizer::_in_use_list.add(monitor); + } + + return monitor; +} + +// Add the hashcode to the monitor to match the object and put it in the hashtable. +ObjectMonitor* ObjectSynchronizer::add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj) { + assert(UseObjectMonitorTable, "must be"); + assert(obj == monitor->object(), "must be"); + + intptr_t hash = obj->mark().hash(); + assert(hash != 0, "must be set when claiming the object monitor"); + monitor->set_hash(hash); + + return ObjectMonitorTable::monitor_put_get(current, monitor, obj); +} + +bool ObjectSynchronizer::remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj) { + assert(UseObjectMonitorTable, "must be"); + assert(monitor->object_peek() == obj, "must be, cleared objects are removed by is_dead"); + + return ObjectMonitorTable::remove_monitor_entry(current, monitor); +} + +void ObjectSynchronizer::deflate_mark_word(oop obj) { + assert(UseObjectMonitorTable, "must be"); + + markWord mark = obj->mark_acquire(); + assert(!mark.has_no_hash(), "obj with inflated monitor must have had a hash"); + + while (mark.has_monitor()) { + const markWord new_mark = mark.clear_lock_bits().set_unlocked(); + mark = obj->cas_set_mark(new_mark, mark); + } +} + +void ObjectSynchronizer::create_om_table() { + if (!UseObjectMonitorTable) { + return; + } + ObjectMonitorTable::create(); +} + +bool ObjectSynchronizer::needs_resize() { + if (!UseObjectMonitorTable) { + return false; + } + return ObjectMonitorTable::should_resize(); +} + +bool ObjectSynchronizer::resize_table(JavaThread* current) { + if (!UseObjectMonitorTable) { + return true; + } + return ObjectMonitorTable::resize(current); +} + +class ObjectSynchronizer::LockStackInflateContendedLocks : private OopClosure { + private: + oop _contended_oops[LockStack::CAPACITY]; + int _length; + + void do_oop(oop* o) final { + oop obj = *o; + if (obj->mark_acquire().has_monitor()) { + if (_length > 0 && _contended_oops[_length - 1] == obj) { + // Recursive + return; + } + _contended_oops[_length++] = obj; + } + } + + void do_oop(narrowOop* o) final { + ShouldNotReachHere(); + } + + public: + LockStackInflateContendedLocks() : + _contended_oops(), + _length(0) {}; + + void inflate(JavaThread* current) { + assert(current == JavaThread::current(), "must be"); + current->lock_stack().oops_do(this); + for (int i = 0; i < _length; i++) { + ObjectSynchronizer:: + inflate_fast_locked_object(_contended_oops[i], ObjectSynchronizer::inflate_cause_vm_internal, current, current); + } + } +}; + +void ObjectSynchronizer::ensure_lock_stack_space(JavaThread* current) { + assert(current == JavaThread::current(), "must be"); + LockStack& lock_stack = current->lock_stack(); + + // Make room on lock_stack + if (lock_stack.is_full()) { + // Inflate contended objects + LockStackInflateContendedLocks().inflate(current); + if (lock_stack.is_full()) { + // Inflate the oldest object + inflate_fast_locked_object(lock_stack.bottom(), ObjectSynchronizer::inflate_cause_vm_internal, current, current); + } + } +} + +class ObjectSynchronizer::CacheSetter : StackObj { + JavaThread* const _thread; + BasicLock* const _lock; + ObjectMonitor* _monitor; + + NONCOPYABLE(CacheSetter); + + public: + CacheSetter(JavaThread* thread, BasicLock* lock) : + _thread(thread), + _lock(lock), + _monitor(nullptr) {} + + ~CacheSetter() { + // Only use the cache if using the table. + if (UseObjectMonitorTable) { + if (_monitor != nullptr) { + // If the monitor is already in the BasicLock cache then it is most + // likely in the thread cache, do not set it again to avoid reordering. + if (_monitor != _lock->object_monitor_cache()) { + _thread->om_set_monitor_cache(_monitor); + _lock->set_object_monitor_cache(_monitor); + } + } else { + _lock->clear_object_monitor_cache(); + } + } + } + + void set_monitor(ObjectMonitor* monitor) { + assert(_monitor == nullptr, "only set once"); + _monitor = monitor; + } + +}; + +// Reads first from the BasicLock cache then from the OMCache in the current thread. +// C2 fast-path may have put the monitor in the cache in the BasicLock. +inline static ObjectMonitor* read_caches(JavaThread* current, BasicLock* lock, oop object) { + ObjectMonitor* monitor = lock->object_monitor_cache(); + if (monitor == nullptr) { + monitor = current->om_get_from_monitor_cache(object); + } + return monitor; +} + +class ObjectSynchronizer::VerifyThreadState { + bool _no_safepoint; + + public: + VerifyThreadState(JavaThread* locking_thread, JavaThread* current) : _no_safepoint(locking_thread != current) { + assert(current == Thread::current(), "must be"); + assert(locking_thread == current || locking_thread->is_obj_deopt_suspend(), "locking_thread may not run concurrently"); + if (_no_safepoint) { + DEBUG_ONLY(JavaThread::current()->inc_no_safepoint_count();) + } + } + ~VerifyThreadState() { + if (_no_safepoint){ + DEBUG_ONLY(JavaThread::current()->dec_no_safepoint_count();) + } + } +}; + +inline bool ObjectSynchronizer::fast_lock_try_enter(oop obj, LockStack& lock_stack, JavaThread* current) { + markWord mark = obj->mark(); + while (mark.is_unlocked()) { + ensure_lock_stack_space(current); + assert(!lock_stack.is_full(), "must have made room on the lock stack"); + assert(!lock_stack.contains(obj), "thread must not already hold the lock"); + // Try to swing into 'fast-locked' state. + markWord locked_mark = mark.set_fast_locked(); + markWord old_mark = mark; + mark = obj->cas_set_mark(locked_mark, old_mark); + if (old_mark == mark) { + // Successfully fast-locked, push object to lock-stack and return. + lock_stack.push(obj); + return true; + } + } + return false; +} + +bool ObjectSynchronizer::fast_lock_spin_enter(oop obj, LockStack& lock_stack, JavaThread* current, bool observed_deflation) { + assert(UseObjectMonitorTable, "must be"); + // Will spin with exponential backoff with an accumulative O(2^spin_limit) spins. + const int log_spin_limit = os::is_MP() ? FastLockingSpins : 1; + const int log_min_safepoint_check_interval = 10; + + markWord mark = obj->mark(); + const auto should_spin = [&]() { + if (!mark.has_monitor()) { + // Spin while not inflated. + return true; + } else if (observed_deflation) { + // Spin while monitor is being deflated. + ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); + return monitor == nullptr || monitor->is_being_async_deflated(); + } + // Else stop spinning. + return false; + }; + // Always attempt to lock once even when safepoint synchronizing. + bool should_process = false; + for (int i = 0; should_spin() && !should_process && i < log_spin_limit; i++) { + // Spin with exponential backoff. + const int total_spin_count = 1 << i; + const int inner_spin_count = MIN2(1 << log_min_safepoint_check_interval, total_spin_count); + const int outer_spin_count = total_spin_count / inner_spin_count; + for (int outer = 0; outer < outer_spin_count; outer++) { + should_process = SafepointMechanism::should_process(current); + if (should_process) { + // Stop spinning for safepoint. + break; + } + for (int inner = 1; inner < inner_spin_count; inner++) { + SpinPause(); + } + } + + if (fast_lock_try_enter(obj, lock_stack, current)) return true; + } + return false; +} + +void ObjectSynchronizer::enter_for(Handle obj, BasicLock* lock, JavaThread* locking_thread) { + // When called with locking_thread != Thread::current() some mechanism must synchronize + // the locking_thread with respect to the current thread. Currently only used when + // deoptimizing and re-locking locks. See Deoptimization::relock_objects + assert(locking_thread == Thread::current() || locking_thread->is_obj_deopt_suspend(), "must be"); + + assert(!UseObjectMonitorTable || lock->object_monitor_cache() == nullptr, "must be cleared"); + JavaThread* current = JavaThread::current(); + VerifyThreadState vts(locking_thread, current); + + if (obj->klass()->is_value_based()) { + ObjectSynchronizer::handle_sync_on_value_based_class(obj, locking_thread); + } + + LockStack& lock_stack = locking_thread->lock_stack(); + + ObjectMonitor* monitor = nullptr; + if (lock_stack.contains(obj())) { + monitor = inflate_fast_locked_object(obj(), ObjectSynchronizer::inflate_cause_monitor_enter, locking_thread, current); + bool entered = monitor->enter_for(locking_thread); + assert(entered, "recursive ObjectMonitor::enter_for must succeed"); + } else { + do { + // It is assumed that enter_for must enter on an object without contention. + monitor = inflate_and_enter(obj(), lock, ObjectSynchronizer::inflate_cause_monitor_enter, locking_thread, current); + // But there may still be a race with deflation. + } while (monitor == nullptr); + } + + assert(monitor != nullptr, "ObjectSynchronizer::enter_for must succeed"); + assert(!UseObjectMonitorTable || lock->object_monitor_cache() == nullptr, "unused. already cleared"); +} + +void ObjectSynchronizer::enter(Handle obj, BasicLock* lock, JavaThread* current) { + assert(current == JavaThread::current(), "must be"); + + if (obj->klass()->is_value_based()) { + ObjectSynchronizer::handle_sync_on_value_based_class(obj, current); + } + + CacheSetter cache_setter(current, lock); + + // Used when deflation is observed. Progress here requires progress + // from the deflator. After observing that the deflator is not + // making progress (after two yields), switch to sleeping. + SpinYield spin_yield(0, 2); + bool observed_deflation = false; + + LockStack& lock_stack = current->lock_stack(); + + if (!lock_stack.is_full() && lock_stack.try_recursive_enter(obj())) { + // Recursively fast locked + return; + } + + if (lock_stack.contains(obj())) { + ObjectMonitor* monitor = inflate_fast_locked_object(obj(), ObjectSynchronizer::inflate_cause_monitor_enter, current, current); + bool entered = monitor->enter(current); + assert(entered, "recursive ObjectMonitor::enter must succeed"); + cache_setter.set_monitor(monitor); + return; + } + + while (true) { + // Fast-locking does not use the 'lock' argument. + // Fast-lock spinning to avoid inflating for short critical sections. + // The goal is to only inflate when the extra cost of using ObjectMonitors + // is worth it. + // If deflation has been observed we also spin while deflation is ongoing. + if (fast_lock_try_enter(obj(), lock_stack, current)) { + return; + } else if (UseObjectMonitorTable && fast_lock_spin_enter(obj(), lock_stack, current, observed_deflation)) { + return; + } + + if (observed_deflation) { + spin_yield.wait(); + } + + ObjectMonitor* monitor = inflate_and_enter(obj(), lock, ObjectSynchronizer::inflate_cause_monitor_enter, current, current); + if (monitor != nullptr) { + cache_setter.set_monitor(monitor); + return; + } + + // If inflate_and_enter returns nullptr it is because a deflated monitor + // was encountered. Fallback to fast locking. The deflater is responsible + // for clearing out the monitor and transitioning the markWord back to + // fast locking. + observed_deflation = true; + } +} + +void ObjectSynchronizer::exit(oop object, BasicLock* lock, JavaThread* current) { + assert(current == Thread::current(), "must be"); + + markWord mark = object->mark(); + assert(!mark.is_unlocked(), "must be"); + + LockStack& lock_stack = current->lock_stack(); + if (mark.is_fast_locked()) { + if (lock_stack.try_recursive_exit(object)) { + // This is a recursive exit which succeeded + return; + } + if (lock_stack.is_recursive(object)) { + // Must inflate recursive locks if try_recursive_exit fails + // This happens for un-structured unlocks, could potentially + // fix try_recursive_exit to handle these. + inflate_fast_locked_object(object, ObjectSynchronizer::inflate_cause_vm_internal, current, current); + } + } + + while (mark.is_fast_locked()) { + markWord unlocked_mark = mark.set_unlocked(); + markWord old_mark = mark; + mark = object->cas_set_mark(unlocked_mark, old_mark); + if (old_mark == mark) { + // CAS successful, remove from lock_stack + size_t recursion = lock_stack.remove(object) - 1; + assert(recursion == 0, "Should not have unlocked here"); + return; + } + } + + assert(mark.has_monitor(), "must be"); + // The monitor exists + ObjectMonitor* monitor; + if (UseObjectMonitorTable) { + monitor = read_caches(current, lock, object); + if (monitor == nullptr) { + monitor = get_monitor_from_table(current, object); + } + } else { + monitor = ObjectSynchronizer::read_monitor(mark); + } + if (monitor->has_anonymous_owner()) { + assert(current->lock_stack().contains(object), "current must have object on its lock stack"); + monitor->set_owner_from_anonymous(current); + monitor->set_recursions(current->lock_stack().remove(object) - 1); + } + + monitor->exit(current); +} + +// ObjectSynchronizer::inflate_locked_or_imse is used to get an +// inflated ObjectMonitor* from contexts which require that, such as +// notify/wait and jni_exit. Fast locking keeps the invariant that it +// only inflates if it is already locked by the current thread or the current +// thread is in the process of entering. To maintain this invariant we need to +// throw a java.lang.IllegalMonitorStateException before inflating if the +// current thread is not the owner. +ObjectMonitor* ObjectSynchronizer::inflate_locked_or_imse(oop obj, ObjectSynchronizer::InflateCause cause, TRAPS) { + JavaThread* current = THREAD; + + for (;;) { + markWord mark = obj->mark_acquire(); + if (mark.is_unlocked()) { + // No lock, IMSE. + THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), + "current thread is not owner", nullptr); + } + + if (mark.is_fast_locked()) { + if (!current->lock_stack().contains(obj)) { + // Fast locked by other thread, IMSE. + THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), + "current thread is not owner", nullptr); + } else { + // Current thread owns the lock, must inflate + return inflate_fast_locked_object(obj, cause, current, current); + } + } + + assert(mark.has_monitor(), "must be"); + ObjectMonitor* monitor = ObjectSynchronizer::read_monitor(current, obj, mark); + if (monitor != nullptr) { + if (monitor->has_anonymous_owner()) { + LockStack& lock_stack = current->lock_stack(); + if (lock_stack.contains(obj)) { + // Current thread owns the lock but someone else inflated it. + // Fix owner and pop lock stack. + monitor->set_owner_from_anonymous(current); + monitor->set_recursions(lock_stack.remove(obj) - 1); + } else { + // Fast locked (and inflated) by other thread, or deflation in progress, IMSE. + THROW_MSG_(vmSymbols::java_lang_IllegalMonitorStateException(), + "current thread is not owner", nullptr); + } + } + return monitor; + } + } +} + +ObjectMonitor* ObjectSynchronizer::inflate_into_object_header(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, Thread* current) { + + // The JavaThread* locking parameter requires that the locking_thread == JavaThread::current, + // or is suspended throughout the call by some other mechanism. + // Even with fast locking the thread might be nullptr when called from a non + // JavaThread. (As may still be the case from FastHashCode). However it is only + // important for the correctness of the fast locking algorithm that the thread + // is set when called from ObjectSynchronizer::enter from the owning thread, + // ObjectSynchronizer::enter_for from any thread, or ObjectSynchronizer::exit. + EventJavaMonitorInflate event; + + for (;;) { + const markWord mark = object->mark_acquire(); + + // The mark can be in one of the following states: + // * inflated - Just return if using stack-locking. + // If using fast-locking and the ObjectMonitor owner + // is anonymous and the locking_thread owns the + // object lock, then we make the locking_thread + // the ObjectMonitor owner and remove the lock from + // the locking_thread's lock stack. + // * fast-locked - Coerce it to inflated from fast-locked. + // * unlocked - Aggressively inflate the object. + + // CASE: inflated + if (mark.has_monitor()) { + ObjectMonitor* inf = mark.monitor(); + markWord dmw = inf->header(); + assert(dmw.is_neutral(), "invariant: header=" INTPTR_FORMAT, dmw.value()); + if (inf->has_anonymous_owner() && + locking_thread != nullptr && locking_thread->lock_stack().contains(object)) { + inf->set_owner_from_anonymous(locking_thread); + size_t removed = locking_thread->lock_stack().remove(object); + inf->set_recursions(removed - 1); + } + return inf; + } + + // CASE: fast-locked + // Could be fast-locked either by the locking_thread or by some other thread. + // + // Note that we allocate the ObjectMonitor speculatively, _before_ + // attempting to set the object's mark to the new ObjectMonitor. If + // the locking_thread owns the monitor, then we set the ObjectMonitor's + // owner to the locking_thread. Otherwise, we set the ObjectMonitor's owner + // to anonymous. If we lose the race to set the object's mark to the + // new ObjectMonitor, then we just delete it and loop around again. + // + if (mark.is_fast_locked()) { + ObjectMonitor* monitor = new ObjectMonitor(object); + monitor->set_header(mark.set_unlocked()); + bool own = locking_thread != nullptr && locking_thread->lock_stack().contains(object); + if (own) { + // Owned by locking_thread. + monitor->set_owner(locking_thread); + } else { + // Owned by somebody else. + monitor->set_anonymous_owner(); + } + markWord monitor_mark = markWord::encode(monitor); + markWord old_mark = object->cas_set_mark(monitor_mark, mark); + if (old_mark == mark) { + // Success! Return inflated monitor. + if (own) { + size_t removed = locking_thread->lock_stack().remove(object); + monitor->set_recursions(removed - 1); + } + // Once the ObjectMonitor is configured and object is associated + // with the ObjectMonitor, it is safe to allow async deflation: + ObjectSynchronizer::_in_use_list.add(monitor); + + log_inflate(current, object, cause); + if (event.should_commit()) { + post_monitor_inflate_event(&event, object, cause); + } + return monitor; + } else { + delete monitor; + continue; // Interference -- just retry + } + } + + // CASE: unlocked + // TODO-FIXME: for entry we currently inflate and then try to CAS _owner. + // If we know we're inflating for entry it's better to inflate by swinging a + // pre-locked ObjectMonitor pointer into the object header. A successful + // CAS inflates the object *and* confers ownership to the inflating thread. + // In the current implementation we use a 2-step mechanism where we CAS() + // to inflate and then CAS() again to try to swing _owner from null to current. + // An inflateTry() method that we could call from enter() would be useful. + + assert(mark.is_unlocked(), "invariant: header=" INTPTR_FORMAT, mark.value()); + ObjectMonitor* m = new ObjectMonitor(object); + // prepare m for installation - set monitor to initial state + m->set_header(mark); + + if (object->cas_set_mark(markWord::encode(m), mark) != mark) { + delete m; + m = nullptr; + continue; + // interference - the markword changed - just retry. + // The state-transitions are one-way, so there's no chance of + // live-lock -- "Inflated" is an absorbing state. + } + + // Once the ObjectMonitor is configured and object is associated + // with the ObjectMonitor, it is safe to allow async deflation: + ObjectSynchronizer::_in_use_list.add(m); + + log_inflate(current, object, cause); + if (event.should_commit()) { + post_monitor_inflate_event(&event, object, cause); + } + return m; + } +} + +ObjectMonitor* ObjectSynchronizer::inflate_fast_locked_object(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current) { + VerifyThreadState vts(locking_thread, current); + assert(locking_thread->lock_stack().contains(object), "locking_thread must have object on its lock stack"); + + ObjectMonitor* monitor; + + if (!UseObjectMonitorTable) { + return inflate_into_object_header(object, cause, locking_thread, current); + } + + // Inflating requires a hash code + ObjectSynchronizer::FastHashCode(current, object); + + markWord mark = object->mark_acquire(); + assert(!mark.is_unlocked(), "Cannot be unlocked"); + + for (;;) { + // Fetch the monitor from the table + monitor = get_or_insert_monitor(object, current, cause); + + // ObjectMonitors are always inserted as anonymously owned, this thread is + // the current holder of the monitor. So unless the entry is stale and + // contains a deflating monitor it must be anonymously owned. + if (monitor->has_anonymous_owner()) { + // The monitor must be anonymously owned if it was added + assert(monitor == get_monitor_from_table(current, object), "The monitor must be found"); + // New fresh monitor + break; + } + + // If the monitor was not anonymously owned then we got a deflating monitor + // from the table. We need to let the deflator make progress and remove this + // entry before we are allowed to add a new one. + os::naked_yield(); + assert(monitor->is_being_async_deflated(), "Should be the reason"); + } + + // Set the mark word; loop to handle concurrent updates to other parts of the mark word + while (mark.is_fast_locked()) { + mark = object->cas_set_mark(mark.set_has_monitor(), mark); + } + + // Indicate that the monitor now has a known owner + monitor->set_owner_from_anonymous(locking_thread); + + // Remove the entry from the thread's lock stack + monitor->set_recursions(locking_thread->lock_stack().remove(object) - 1); + + if (locking_thread == current) { + // Only change the thread local state of the current thread. + locking_thread->om_set_monitor_cache(monitor); + } + + return monitor; +} + +ObjectMonitor* ObjectSynchronizer::inflate_and_enter(oop object, BasicLock* lock, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current) { + VerifyThreadState vts(locking_thread, current); + + // Note: In some paths (deoptimization) the 'current' thread inflates and + // enters the lock on behalf of the 'locking_thread' thread. + + ObjectMonitor* monitor = nullptr; + + if (!UseObjectMonitorTable) { + // Do the old inflate and enter. + monitor = inflate_into_object_header(object, cause, locking_thread, current); + + bool entered; + if (locking_thread == current) { + entered = monitor->enter(locking_thread); + } else { + entered = monitor->enter_for(locking_thread); + } + + // enter returns false for deflation found. + return entered ? monitor : nullptr; + } + + NoSafepointVerifier nsv; + + // Try to get the monitor from the thread-local cache. + // There's no need to use the cache if we are locking + // on behalf of another thread. + if (current == locking_thread) { + monitor = read_caches(current, lock, object); + } + + // Get or create the monitor + if (monitor == nullptr) { + // Lightweight monitors require that hash codes are installed first + ObjectSynchronizer::FastHashCode(locking_thread, object); + monitor = get_or_insert_monitor(object, current, cause); + } + + if (monitor->try_enter(locking_thread)) { + return monitor; + } + + // Holds is_being_async_deflated() stable throughout this function. + ObjectMonitorContentionMark contention_mark(monitor); + + /// First handle the case where the monitor from the table is deflated + if (monitor->is_being_async_deflated()) { + // The MonitorDeflation thread is deflating the monitor. The locking thread + // must spin until further progress has been made. + + // Clear the BasicLock cache as it may contain this monitor. + lock->clear_object_monitor_cache(); + + const markWord mark = object->mark_acquire(); + + if (mark.has_monitor()) { + // Waiting on the deflation thread to remove the deflated monitor from the table. + os::naked_yield(); + + } else if (mark.is_fast_locked()) { + // Some other thread managed to fast-lock the lock, or this is a + // recursive lock from the same thread; yield for the deflation + // thread to remove the deflated monitor from the table. + os::naked_yield(); + + } else { + assert(mark.is_unlocked(), "Implied"); + // Retry immediately + } + + // Retry + return nullptr; + } + + for (;;) { + const markWord mark = object->mark_acquire(); + // The mark can be in one of the following states: + // * inflated - If the ObjectMonitor owner is anonymous + // and the locking_thread owns the object + // lock, then we make the locking_thread + // the ObjectMonitor owner and remove the + // lock from the locking_thread's lock stack. + // * fast-locked - Coerce it to inflated from fast-locked. + // * neutral - Inflate the object. Successful CAS is locked + + // CASE: inflated + if (mark.has_monitor()) { + LockStack& lock_stack = locking_thread->lock_stack(); + if (monitor->has_anonymous_owner() && lock_stack.contains(object)) { + // The lock is fast-locked by the locking thread, + // convert it to a held monitor with a known owner. + monitor->set_owner_from_anonymous(locking_thread); + monitor->set_recursions(lock_stack.remove(object) - 1); + } + + break; // Success + } + + // CASE: fast-locked + // Could be fast-locked either by locking_thread or by some other thread. + // + if (mark.is_fast_locked()) { + markWord old_mark = object->cas_set_mark(mark.set_has_monitor(), mark); + if (old_mark != mark) { + // CAS failed + continue; + } + + // Success! Return inflated monitor. + LockStack& lock_stack = locking_thread->lock_stack(); + if (lock_stack.contains(object)) { + // The lock is fast-locked by the locking thread, + // convert it to a held monitor with a known owner. + monitor->set_owner_from_anonymous(locking_thread); + monitor->set_recursions(lock_stack.remove(object) - 1); + } + + break; // Success + } + + // CASE: neutral (unlocked) + + // Catch if the object's header is not neutral (not locked and + // not marked is what we care about here). + assert(mark.is_neutral(), "invariant: header=" INTPTR_FORMAT, mark.value()); + markWord old_mark = object->cas_set_mark(mark.set_has_monitor(), mark); + if (old_mark != mark) { + // CAS failed + continue; + } + + // Transitioned from unlocked to monitor means locking_thread owns the lock. + monitor->set_owner_from_anonymous(locking_thread); + + return monitor; + } + + if (current == locking_thread) { + // One round of spinning + if (monitor->spin_enter(locking_thread)) { + return monitor; + } + + // Monitor is contended, take the time before entering to fix the lock stack. + LockStackInflateContendedLocks().inflate(current); + } + + // enter can block for safepoints; clear the unhandled object oop + PauseNoSafepointVerifier pnsv(&nsv); + object = nullptr; + + if (current == locking_thread) { + monitor->enter_with_contention_mark(locking_thread, contention_mark); + } else { + monitor->enter_for_with_contention_mark(locking_thread, contention_mark); + } + + return monitor; +} + +void ObjectSynchronizer::deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor) { + if (obj != nullptr) { + deflate_mark_word(obj); + } + bool removed = remove_monitor(current, monitor, obj); + if (obj != nullptr) { + assert(removed, "Should have removed the entry if obj was alive"); + } +} + +ObjectMonitor* ObjectSynchronizer::get_monitor_from_table(Thread* current, oop obj) { + assert(UseObjectMonitorTable, "must be"); + return ObjectMonitorTable::monitor_get(current, obj); +} + +bool ObjectSynchronizer::contains_monitor(Thread* current, ObjectMonitor* monitor) { + assert(UseObjectMonitorTable, "must be"); + return ObjectMonitorTable::contains_monitor(current, monitor); +} + +ObjectMonitor* ObjectSynchronizer::read_monitor(markWord mark) { + return mark.monitor(); +} + +ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj) { + return ObjectSynchronizer::read_monitor(current, obj, obj->mark()); +} + +ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj, markWord mark) { + if (!UseObjectMonitorTable) { + return read_monitor(mark); + } else { + return ObjectSynchronizer::get_monitor_from_table(current, obj); + } +} + +bool ObjectSynchronizer::quick_enter_internal(oop obj, BasicLock* lock, JavaThread* current) { + assert(current->thread_state() == _thread_in_Java, "must be"); + assert(obj != nullptr, "must be"); + NoSafepointVerifier nsv; + + LockStack& lock_stack = current->lock_stack(); + if (lock_stack.is_full()) { + // Always go into runtime if the lock stack is full. + return false; + } + + const markWord mark = obj->mark(); + +#ifndef _LP64 + // Only for 32bit which has limited support for fast locking outside the runtime. + if (lock_stack.try_recursive_enter(obj)) { + // Recursive lock successful. + return true; + } + + if (mark.is_unlocked()) { + markWord locked_mark = mark.set_fast_locked(); + if (obj->cas_set_mark(locked_mark, mark) == mark) { + // Successfully fast-locked, push object to lock-stack and return. + lock_stack.push(obj); + return true; + } + } +#endif + + if (mark.has_monitor()) { + ObjectMonitor* monitor; + if (UseObjectMonitorTable) { + monitor = read_caches(current, lock, obj); + } else { + monitor = ObjectSynchronizer::read_monitor(mark); + } + + if (monitor == nullptr) { + // Take the slow-path on a cache miss. + return false; + } + + if (UseObjectMonitorTable) { + // Set the monitor regardless of success. + // Either we successfully lock on the monitor, or we retry with the + // monitor in the slow path. If the monitor gets deflated, it will be + // cleared, either by the CacheSetter if we fast lock in enter or in + // inflate_and_enter when we see that the monitor is deflated. + lock->set_object_monitor_cache(monitor); + } + + if (monitor->spin_enter(current)) { + return true; + } + } + + // Slow-path. + return false; +} + +bool ObjectSynchronizer::quick_enter(oop obj, BasicLock* lock, JavaThread* current) { + assert(current->thread_state() == _thread_in_Java, "invariant"); + NoSafepointVerifier nsv; + if (obj == nullptr) return false; // Need to throw NPE + + if (obj->klass()->is_value_based()) { + return false; + } + + return ObjectSynchronizer::quick_enter_internal(obj, lock, current); +} diff --git a/src/hotspot/share/runtime/synchronizer.hpp b/src/hotspot/share/runtime/synchronizer.hpp index 2337569176e..a10e44b3092 100644 --- a/src/hotspot/share/runtime/synchronizer.hpp +++ b/src/hotspot/share/runtime/synchronizer.hpp @@ -94,8 +94,8 @@ public: // deoptimization at monitor exit. Hence, it does not take a Handle argument. // This is the "slow path" version of monitor enter and exit. - static inline void enter(Handle obj, BasicLock* lock, JavaThread* current); - static inline void exit(oop obj, BasicLock* lock, JavaThread* current); + static void enter(Handle obj, BasicLock* lock, JavaThread* current); + static void exit(oop obj, BasicLock* lock, JavaThread* current); // Used to enter a monitor for another thread. This requires that the // locking_thread is suspended, and that entering on a potential @@ -115,7 +115,7 @@ public: static void notifyall(Handle obj, TRAPS); static bool quick_notify(oopDesc* obj, JavaThread* current, bool All); - static inline bool quick_enter(oop obj, BasicLock* Lock, JavaThread* current); + static bool quick_enter(oop obj, BasicLock* Lock, JavaThread* current); // Special internal-use-only method for use by JVM infrastructure // that needs to wait() on a java-level object but that can't risk @@ -125,9 +125,9 @@ public: public: static const char* inflate_cause_name(const InflateCause cause); - inline static ObjectMonitor* read_monitor(markWord mark); - inline static ObjectMonitor* read_monitor(Thread* current, oop obj); - inline static ObjectMonitor* read_monitor(Thread* current, oop obj, markWord mark); + static ObjectMonitor* read_monitor(markWord mark); + static ObjectMonitor* read_monitor(Thread* current, oop obj); + static ObjectMonitor* read_monitor(Thread* current, oop obj, markWord mark); // Returns the identity hash value for an oop // NOTE: It may cause monitor inflation @@ -195,7 +195,6 @@ public: private: friend class SynchronizerTest; - friend class LightweightSynchronizer; static MonitorList _in_use_list; static volatile bool _is_async_deflation_requested; @@ -209,6 +208,44 @@ public: static u_char* get_gvars_stw_random_addr(); static void handle_sync_on_value_based_class(Handle obj, JavaThread* locking_thread); + + static ObjectMonitor* get_or_insert_monitor_from_table(oop object, JavaThread* current, bool* inserted); + static ObjectMonitor* get_or_insert_monitor(oop object, JavaThread* current, ObjectSynchronizer::InflateCause cause); + + static ObjectMonitor* add_monitor(JavaThread* current, ObjectMonitor* monitor, oop obj); + static bool remove_monitor(Thread* current, ObjectMonitor* monitor, oop obj); + + static void deflate_mark_word(oop object); + + static void ensure_lock_stack_space(JavaThread* current); + + class CacheSetter; + class LockStackInflateContendedLocks; + class VerifyThreadState; + + static void create_om_table(); + + public: + static bool needs_resize(); + static bool resize_table(JavaThread* current); + + private: + static inline bool fast_lock_try_enter(oop obj, LockStack& lock_stack, JavaThread* current); + static bool fast_lock_spin_enter(oop obj, LockStack& lock_stack, JavaThread* current, bool observed_deflation); + + public: + static ObjectMonitor* inflate_into_object_header(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, Thread* current); + static ObjectMonitor* inflate_locked_or_imse(oop object, ObjectSynchronizer::InflateCause cause, TRAPS); + static ObjectMonitor* inflate_fast_locked_object(oop object, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); + static ObjectMonitor* inflate_and_enter(oop object, BasicLock* lock, ObjectSynchronizer::InflateCause cause, JavaThread* locking_thread, JavaThread* current); + + static void deflate_monitor(Thread* current, oop obj, ObjectMonitor* monitor); + + static ObjectMonitor* get_monitor_from_table(Thread* current, oop obj); + + static bool contains_monitor(Thread* current, ObjectMonitor* monitor); + + static bool quick_enter_internal(oop obj, BasicLock* Lock, JavaThread* current); }; // ObjectLocker enforces balanced locking and can never throw an diff --git a/src/hotspot/share/runtime/synchronizer.inline.hpp b/src/hotspot/share/runtime/synchronizer.inline.hpp deleted file mode 100644 index 7bcbd91eda7..00000000000 --- a/src/hotspot/share/runtime/synchronizer.inline.hpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2024, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#ifndef SHARE_RUNTIME_SYNCHRONIZER_INLINE_HPP -#define SHARE_RUNTIME_SYNCHRONIZER_INLINE_HPP - -#include "runtime/synchronizer.hpp" - -#include "runtime/lightweightSynchronizer.hpp" -#include "runtime/safepointVerifiers.hpp" - -inline ObjectMonitor* ObjectSynchronizer::read_monitor(markWord mark) { - return mark.monitor(); -} - -inline ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj) { - return ObjectSynchronizer::read_monitor(current, obj, obj->mark()); -} - -inline ObjectMonitor* ObjectSynchronizer::read_monitor(Thread* current, oop obj, markWord mark) { - if (!UseObjectMonitorTable) { - return read_monitor(mark); - } else { - return LightweightSynchronizer::get_monitor_from_table(current, obj); - } -} - -inline void ObjectSynchronizer::enter(Handle obj, BasicLock* lock, JavaThread* current) { - assert(current == Thread::current(), "must be"); - - LightweightSynchronizer::enter(obj, lock, current); -} - -inline bool ObjectSynchronizer::quick_enter(oop obj, BasicLock* lock, JavaThread* current) { - assert(current->thread_state() == _thread_in_Java, "invariant"); - NoSafepointVerifier nsv; - if (obj == nullptr) return false; // Need to throw NPE - - if (obj->klass()->is_value_based()) { - return false; - } - - return LightweightSynchronizer::quick_enter(obj, lock, current); -} - -inline void ObjectSynchronizer::exit(oop object, BasicLock* lock, JavaThread* current) { - LightweightSynchronizer::exit(object, lock, current); -} - -#endif // SHARE_RUNTIME_SYNCHRONIZER_INLINE_HPP diff --git a/src/hotspot/share/runtime/vframe.cpp b/src/hotspot/share/runtime/vframe.cpp index 74d42b7dc9d..604ff1f751a 100644 --- a/src/hotspot/share/runtime/vframe.cpp +++ b/src/hotspot/share/runtime/vframe.cpp @@ -48,7 +48,7 @@ #include "runtime/signature.hpp" #include "runtime/stackFrameStream.inline.hpp" #include "runtime/stubRoutines.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/vframe.inline.hpp" #include "runtime/vframe_hp.hpp" #include "runtime/vframeArray.hpp" diff --git a/src/hotspot/share/services/threadService.cpp b/src/hotspot/share/services/threadService.cpp index 547ca4e51d5..48f4eb16cf1 100644 --- a/src/hotspot/share/services/threadService.cpp +++ b/src/hotspot/share/services/threadService.cpp @@ -48,7 +48,7 @@ #include "runtime/javaThread.inline.hpp" #include "runtime/jniHandles.inline.hpp" #include "runtime/objectMonitor.inline.hpp" -#include "runtime/synchronizer.inline.hpp" +#include "runtime/synchronizer.hpp" #include "runtime/thread.inline.hpp" #include "runtime/threads.hpp" #include "runtime/threadSMR.inline.hpp" diff --git a/test/hotspot/gtest/runtime/test_lockStack.cpp b/test/hotspot/gtest/runtime/test_lockStack.cpp index 6755541adb0..c61b6db6023 100644 --- a/test/hotspot/gtest/runtime/test_lockStack.cpp +++ b/test/hotspot/gtest/runtime/test_lockStack.cpp @@ -63,7 +63,7 @@ public: } while (false) TEST_VM_F(LockStackTest, is_recursive) { - if (!VM_Version::supports_recursive_lightweight_locking()) { + if (!VM_Version::supports_recursive_fast_locking()) { return; } @@ -130,7 +130,7 @@ TEST_VM_F(LockStackTest, is_recursive) { } TEST_VM_F(LockStackTest, try_recursive_enter) { - if (!VM_Version::supports_recursive_lightweight_locking()) { + if (!VM_Version::supports_recursive_fast_locking()) { return; } @@ -197,7 +197,7 @@ TEST_VM_F(LockStackTest, try_recursive_enter) { } TEST_VM_F(LockStackTest, contains) { - const bool test_recursive = VM_Version::supports_recursive_lightweight_locking(); + const bool test_recursive = VM_Version::supports_recursive_fast_locking(); JavaThread* THREAD = JavaThread::current(); // the thread should be in vm to use locks @@ -259,7 +259,7 @@ TEST_VM_F(LockStackTest, contains) { } TEST_VM_F(LockStackTest, remove) { - const bool test_recursive = VM_Version::supports_recursive_lightweight_locking(); + const bool test_recursive = VM_Version::supports_recursive_fast_locking(); JavaThread* THREAD = JavaThread::current(); // the thread should be in vm to use locks diff --git a/test/hotspot/jtreg/runtime/Monitor/TestRecursiveLocking.java b/test/hotspot/jtreg/runtime/Monitor/TestRecursiveLocking.java index bea7a41ae2b..9782824ef0f 100644 --- a/test/hotspot/jtreg/runtime/Monitor/TestRecursiveLocking.java +++ b/test/hotspot/jtreg/runtime/Monitor/TestRecursiveLocking.java @@ -202,7 +202,7 @@ public class TestRecursiveLocking { assertNotInflated(); } else { // Second time we want to lock A, the lock stack - // looks like this [A, B]. Lightweight locking + // looks like this [A, B]. Fast locking // doesn't allow interleaving ([A, B, A]), instead // it inflates A and removes it from the lock // stack. Which leaves us with only [B] on the @@ -220,11 +220,10 @@ public class TestRecursiveLocking { counter++; - // Legacy tolerates endless recursions. While testing - // lightweight we don't go deeper than the size of the - // lock stack, which in this test case will be filled - // with a number of B-elements. See comment in runA() - // above for more info. + // Legacy tolerates endless recursions. While testing we + // don't go deeper than the size of the lock stack, which + // in this test case will be filled with a number of + // B-elements. See comment in runA() above for more info. assertNotInflated(); if (depth == 1) { diff --git a/test/hotspot/jtreg/runtime/lockStack/TestLockStackCapacity.java b/test/hotspot/jtreg/runtime/lockStack/TestLockStackCapacity.java index f3f1f9c91a6..37568fd3434 100644 --- a/test/hotspot/jtreg/runtime/lockStack/TestLockStackCapacity.java +++ b/test/hotspot/jtreg/runtime/lockStack/TestLockStackCapacity.java @@ -24,7 +24,7 @@ /* * @test TestLockStackCapacity - * @summary Tests the interaction between recursive lightweight locking and + * @summary Tests the interaction between recursive fast locking and * when the lock stack capacity is exceeded. * @requires vm.flagless * @library /testlibrary /test/lib @@ -93,8 +93,8 @@ public class TestLockStackCapacity { } public static void main(String... args) throws Exception { - if (!WB.supportsRecursiveLightweightLocking()) { - throw new SkippedException("Test only valid if lightweight locking supports recursion"); + if (!WB.supportsRecursiveFastLocking()) { + throw new SkippedException("Test only valid if fast locking supports recursion"); } SynchronizedObject.runTest(); diff --git a/test/jdk/com/sun/jdi/EATests.java b/test/jdk/com/sun/jdi/EATests.java index 321855b4969..cb51e91021b 100644 --- a/test/jdk/com/sun/jdi/EATests.java +++ b/test/jdk/com/sun/jdi/EATests.java @@ -97,7 +97,7 @@ * -Xlog:monitorinflation=trace:file=monitorinflation.log * * @bug 8341819 - * @comment Regression test for re-locking racing with deflation with lightweight locking. + * @comment Regression test for re-locking racing with deflation with fast locking. * @run driver EATests * -XX:+UnlockDiagnosticVMOptions * -Xms256m -Xmx256m @@ -237,7 +237,7 @@ class EATestsTarget { // Relocking test cases new EARelockingSimpleTarget() .run(); - new EARelockingWithManyLightweightLocksTarget() .run(); + new EARelockingWithManyFastLocksTarget() .run(); new EARelockingSimpleWithAccessInOtherThreadTarget() .run(); new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall_Target() .run(); new EARelockingRecursiveTarget() .run(); @@ -363,7 +363,7 @@ public class EATests extends TestScaffold { // Relocking test cases new EARelockingSimple() .run(this); - new EARelockingWithManyLightweightLocks() .run(this); + new EARelockingWithManyFastLocks() .run(this); new EARelockingSimpleWithAccessInOtherThread() .run(this); new EARelockingSimpleWithAccessInOtherThread_02_DynamicCall() .run(this); new EARelockingRecursive() .run(this); @@ -1750,12 +1750,11 @@ class EARelockingSimpleTarget extends EATestCaseBaseTarget { /** * Like {@link EARelockingSimple}. The difference is that there are many - * lightweight locked objects when the relocking is done. With - * lightweight the lock stack of the thread will be full because of - * this. + * fast locked objects when the relocking is done, which means that the + * lock stack of the thread will be full because of this. */ -class EARelockingWithManyLightweightLocks extends EATestCaseBaseDebugger { +class EARelockingWithManyFastLocks extends EATestCaseBaseDebugger { public void runTestCase() throws Exception { BreakpointEvent bpe = resumeTo(TARGET_TESTCASE_BASE_NAME, "dontinline_brkpt", "()V"); @@ -1765,7 +1764,7 @@ class EARelockingWithManyLightweightLocks extends EATestCaseBaseDebugger { } } -class EARelockingWithManyLightweightLocksTarget extends EATestCaseBaseTarget { +class EARelockingWithManyFastLocksTarget extends EATestCaseBaseTarget { static class Lock { } @@ -2260,7 +2259,7 @@ class EARelockingArgEscapeLWLockedInCalleeFrame_2Target extends EATestCaseBaseTa /** * Similar to {@link EARelockingArgEscapeLWLockedInCalleeFrame_2Target}. It does - * not use recursive locking and exposed a bug in the lightweight-locking implementation. + * not use recursive locking and exposed a bug in the fast-locking implementation. */ class EARelockingArgEscapeLWLockedInCalleeFrameNoRecursive extends EATestCaseBaseDebugger { diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index e989b0aca88..558feeec78f 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -124,7 +124,7 @@ public class WhiteBox { public native int getLockStackCapacity(); - public native boolean supportsRecursiveLightweightLocking(); + public native boolean supportsRecursiveFastLocking(); public native void forceSafepoint(); From c173d416f749348bee42e1a9436a999700d0f0e8 Mon Sep 17 00:00:00 2001 From: Boris Ulasevich Date: Thu, 6 Nov 2025 12:56:37 +0000 Subject: [PATCH 486/561] 8359256: AArch64: Use SHA3 GPR intrinsic where it's faster Reviewed-by: eastigeevich, phh --- src/hotspot/cpu/aarch64/globals_aarch64.hpp | 2 +- .../cpu/aarch64/vm_version_aarch64.cpp | 30 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/hotspot/cpu/aarch64/globals_aarch64.hpp b/src/hotspot/cpu/aarch64/globals_aarch64.hpp index 8e520314c8b..107919b2cbd 100644 --- a/src/hotspot/cpu/aarch64/globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/globals_aarch64.hpp @@ -95,7 +95,7 @@ define_pd_global(intx, InlineSmallCode, 1000); "Use simplest and shortest implementation for array equals") \ product(bool, UseSIMDForBigIntegerShiftIntrinsics, true, \ "Use SIMD instructions for left/right shift of BigInteger") \ - product(bool, UseSIMDForSHA3Intrinsic, true, \ + product(bool, UseSIMDForSHA3Intrinsic, false, \ "Use SIMD SHA3 instructions for SHA3 intrinsic") \ product(bool, AvoidUnalignedAccesses, false, \ "Avoid generating unaligned memory accesses") \ diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp index a04e9defa4b..b47bfe6a89f 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp @@ -375,18 +375,24 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); } - if (UseSHA && VM_Version::supports_sha3()) { - // Auto-enable UseSHA3Intrinsics on hardware with performance benefit. - // Note that the evaluation of UseSHA3Intrinsics shows better performance - // on Apple silicon but worse performance on Neoverse V1 and N2. - if (_cpu == CPU_APPLE) { // Apple silicon - if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); - } - } - } else if (UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { - warning("Intrinsics for SHA3-224, SHA3-256, SHA3-384 and SHA3-512 crypto hash functions not available on this CPU."); - FLAG_SET_DEFAULT(UseSHA3Intrinsics, false); + if (UseSHA && VM_Version::supports_sha3() && _cpu == CPU_APPLE && FLAG_IS_DEFAULT(UseSIMDForSHA3Intrinsic)) { + // Note: SIMD faster on Apple, worse on Neoverse V1, V2 and N2. + FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, true); + } + + // Enable SHA-3 intrinsics (SIMD or GPR). The GPR path does not require SHA instructions. + if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); + } + + if (!UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { + // Keep flags consistent: if SHA3 intrinsics are off, disable the SHA3 SIMD variant. + FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, false); + } + + if (!VM_Version::supports_sha3() && UseSIMDForSHA3Intrinsic) { + warning("SHA3 instructions are not available on this CPU"); + FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, false); } if (UseSHA && VM_Version::supports_sha512()) { From df414e0d19c1ed68f151d84dbb481a9dd6c65539 Mon Sep 17 00:00:00 2001 From: Erik Gahlin Date: Thu, 6 Nov 2025 13:39:57 +0000 Subject: [PATCH 487/561] 8370884: JFR: Overflow in aggregators Reviewed-by: mgronlun --- .../jdk/jfr/internal/query/Function.java | 70 +++++++++++++++---- 1 file changed, 58 insertions(+), 12 deletions(-) diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Function.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Function.java index f01105c698c..4c921ba4d87 100644 --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Function.java +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/query/Function.java @@ -34,6 +34,7 @@ import java.util.LinkedHashSet; import java.util.Set; abstract class Function { + private static final long NANOS_PER_SECOND = 1_000_000_000L; interface FunctionFactory { Function newFunction(); @@ -164,14 +165,30 @@ abstract class Function { private static final class AverageDuration extends Function { private long seconds; private long nanos; - private int count; + private long count; + private boolean hasOverflowed; @Override public void add(Object value) { - if (value instanceof Duration duration) { - seconds += duration.getSeconds(); - nanos += duration.getNano(); - count++; + if (hasOverflowed) { + return; + } + if (value instanceof Duration d) { + try { + // Code copied from Duration::plus + long secondsToAdd = d.getSeconds(); + long nanosToAdd = d.getNano(); + if ((secondsToAdd | nanosToAdd) == 0) { + return; + } + long s = Math.addExact(seconds, secondsToAdd); + seconds = Math.addExact(s, nanosToAdd / NANOS_PER_SECOND); + nanos = nanos + nanosToAdd % NANOS_PER_SECOND; + count++; + } catch (ArithmeticException ae) { + hasOverflowed = true; + count = 0; + } } } @@ -345,13 +362,29 @@ abstract class Function { private long seconds; private long nanos; private boolean hasValue; + private boolean hasOverflowed; @Override public void add(Object value) { + if (hasOverflowed) { + return; + } if (value instanceof Duration n) { - seconds += n.getSeconds(); - nanos += n.getNano(); - hasValue = true; + try { + // Code copied from Duration::plus + long secondsToAdd = n.getSeconds(); + long nanosToAdd = n.getNano(); + if ((secondsToAdd | nanosToAdd) == 0) { + return; + } + long s = Math.addExact(seconds, secondsToAdd); + seconds = Math.addExact(s, nanosToAdd / NANOS_PER_SECOND); + nanos = nanos + nanosToAdd % NANOS_PER_SECOND; + hasValue = true; + } catch (ArithmeticException ae) { + hasOverflowed = true; + hasValue = false; + } } } @@ -363,13 +396,22 @@ abstract class Function { private static final class SumLong extends Function { private boolean hasValue = false; + private boolean hasOverflowed; private long sum = 0; @Override public void add(Object value) { + if (hasOverflowed) { + return; + } if (value instanceof Number n) { - sum += n.longValue(); - hasValue = true; + try { + sum = Math.addExact(sum, n.longValue()); + hasValue = true; + } catch (ArithmeticException ae) { + hasOverflowed = true; + hasValue = false; + } } } @@ -436,7 +478,11 @@ abstract class Function { return null; } if (isIntegral(first) && isIntegral(last)) { - return last.longValue() - first.longValue(); + try { + return Math.subtractExact(last.longValue(), first.longValue()); + } catch (ArithmeticException ae) { + return null; + } } if (first instanceof Float f && last instanceof Float l) { return l - f; @@ -528,7 +574,7 @@ abstract class Function { @Override public void add(Object value) { if (value instanceof Duration duration) { - long nanos = 1_000_000_000L * duration.getSeconds() + duration.getNano(); + double nanos = 1_000_000_000.0 * duration.getSeconds() + duration.getNano(); function.add(nanos); } } From 2d924ad3584a0ea8682f47c742dcdfd3be14937d Mon Sep 17 00:00:00 2001 From: Kerem Kat Date: Thu, 6 Nov 2025 15:00:37 +0000 Subject: [PATCH 488/561] 8351194: Clean up Hotspot SA after 32-bit x86 removal Reviewed-by: cjplummer, shade, ayang, dholmes --- src/jdk.hotspot.agent/doc/clhsdb.html | 2 +- src/jdk.hotspot.agent/doc/hsdb.html | 2 +- .../native/libsaproc/LinuxDebuggerLocal.cpp | 34 +-- .../linux/native/libsaproc/ps_core.c | 12 - .../macosx/native/libsaproc/ps_core.c | 12 - .../share/classes/sun/jvm/hotspot/HSDB.java | 2 +- .../classes/sun/jvm/hotspot/HotSpotAgent.java | 17 +- .../sun/jvm/hotspot/debugger/Debugger.java | 2 +- .../debugger/MachineDescriptionIntelX86.java | 39 --- .../hotspot/debugger/bsd/BsdCDebugger.java | 11 +- .../debugger/bsd/BsdThreadContextFactory.java | 5 +- .../debugger/bsd/x86/BsdX86CFrame.java | 79 ------ .../debugger/bsd/x86/BsdX86ThreadContext.java | 46 ---- .../sun/jvm/hotspot/debugger/cdbg/CFrame.java | 2 +- .../debugger/linux/LinuxCDebugger.java | 11 +- .../linux/LinuxThreadContextFactory.java | 5 +- .../debugger/linux/x86/LinuxX86CFrame.java | 92 ------- .../linux/x86/LinuxX86ThreadContext.java | 46 ---- .../debugger/remote/RemoteDebuggerClient.java | 5 +- .../debugger/remote/x86/RemoteX86Thread.java | 53 ----- .../remote/x86/RemoteX86ThreadContext.java | 50 ---- .../remote/x86/RemoteX86ThreadFactory.java | 44 ---- .../win32/coff/DebugVC50X86RegisterEnums.java | 111 --------- .../debugger/windbg/WindbgDebugger.java | 5 - .../debugger/windbg/WindbgDebuggerLocal.java | 4 +- .../debugger/x86/X86ThreadContext.java | 129 ---------- .../hotspot/runtime/StackValueCollection.java | 2 +- .../sun/jvm/hotspot/runtime/Threads.java | 10 +- .../classes/sun/jvm/hotspot/runtime/VM.java | 4 +- .../runtime/amd64/AMD64CurrentFrameGuess.java | 6 +- .../X86Frame.java => amd64/AMD64Frame.java} | 74 +++--- .../AMD64RegisterMap.java} | 10 +- .../bsd_amd64/BsdAMD64JavaThreadPDAccess.java | 11 +- .../hotspot/runtime/bsd_x86/BsdSignals.java | 70 ------ .../bsd_x86/BsdX86JavaThreadPDAccess.java | 133 ----------- .../LinuxAMD64JavaThreadPDAccess.java | 11 +- .../runtime/linux_x86/LinuxSignals.java | 71 ------ .../linux_x86/LinuxX86JavaThreadPDAccess.java | 133 ----------- .../Win32AMD64JavaThreadPDAccess.java | 13 +- .../runtime/x86/X86CurrentFrameGuess.java | 225 ------------------ .../runtime/x86/X86JavaCallWrapper.java | 58 ----- .../jvm/hotspot/ui/AnnotatedMemoryPanel.java | 2 +- .../jvm/hotspot/utilities/PlatformInfo.java | 9 +- 43 files changed, 84 insertions(+), 1578 deletions(-) delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86ThreadContext.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86Thread.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadContext.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadFactory.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50X86RegisterEnums.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/{x86/X86Frame.java => amd64/AMD64Frame.java} (88%) rename src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/{x86/X86RegisterMap.java => amd64/AMD64RegisterMap.java} (85%) delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxSignals.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxX86JavaThreadPDAccess.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java delete mode 100644 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86JavaCallWrapper.java diff --git a/src/jdk.hotspot.agent/doc/clhsdb.html b/src/jdk.hotspot.agent/doc/clhsdb.html index a225530774f..bd436f1dfef 100644 --- a/src/jdk.hotspot.agent/doc/clhsdb.html +++ b/src/jdk.hotspot.agent/doc/clhsdb.html @@ -32,7 +32,7 @@ Available commands: class name find a Java class from debuggee and print oop classes print all loaded Java classes with Klass* detach detach SA from current target - dis address [ length ] disassemble (x86) specified number of instructions from given address + dis address [ length ] disassemble (requires hsdis) specified number of instructions from given address dissemble address disassemble nmethod dumpcfg -a | id Dump the PhaseCFG for every compiler thread that has one live dumpclass { address | name } [ directory ] dump .class file for given Klass* or class name diff --git a/src/jdk.hotspot.agent/doc/hsdb.html b/src/jdk.hotspot.agent/doc/hsdb.html index 3470d2806e0..ba47558cf6b 100644 --- a/src/jdk.hotspot.agent/doc/hsdb.html +++ b/src/jdk.hotspot.agent/doc/hsdb.html @@ -31,7 +31,7 @@ HSDB was launched without debuggee, empty screen is shown.

        • Object Histogram and inspection of objects and liveness analysis therein.
        • Class Browser - view Java classes, bytecode disassembly, or create .class files for selected classes -
        • native disassembly (x86 only) and nmethod disassembly with annotations for safepoint details. +
        • native disassembly (requires hsdis) and nmethod disassembly with annotations for safepoint details.
        • view -XX flags, System properties, VM version of debuggee

          Windows sub-menu options include:

          diff --git a/src/jdk.hotspot.agent/linux/native/libsaproc/LinuxDebuggerLocal.cpp b/src/jdk.hotspot.agent/linux/native/libsaproc/LinuxDebuggerLocal.cpp index bd696fd2a25..4b8c5e55f63 100644 --- a/src/jdk.hotspot.agent/linux/native/libsaproc/LinuxDebuggerLocal.cpp +++ b/src/jdk.hotspot.agent/linux/native/libsaproc/LinuxDebuggerLocal.cpp @@ -40,14 +40,6 @@ #define amd64 1 #endif -#if defined(i386) && !defined(i586) -#define i586 1 -#endif - -#ifdef i586 -#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h" -#endif - #ifdef amd64 #include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h" #endif @@ -411,7 +403,7 @@ JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLo return (err == PS_OK)? array : 0; } -#if defined(i586) || defined(amd64) || defined(ppc64) || defined(ppc64le) || defined(aarch64) || defined(riscv64) +#if defined(amd64) || defined(ppc64) || defined(ppc64le) || defined(aarch64) || defined(riscv64) extern "C" JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_getThreadIntegerRegisterSet0 (JNIEnv *env, jobject this_obj, jint lwp_id) { @@ -433,9 +425,6 @@ JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLo } #undef NPRGREG -#ifdef i586 -#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG -#endif #ifdef amd64 #define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG #endif @@ -456,27 +445,6 @@ JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLo #undef REG_INDEX -#ifdef i586 -#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg - - regs[REG_INDEX(GS)] = (uintptr_t) gregs.xgs; - regs[REG_INDEX(FS)] = (uintptr_t) gregs.xfs; - regs[REG_INDEX(ES)] = (uintptr_t) gregs.xes; - regs[REG_INDEX(DS)] = (uintptr_t) gregs.xds; - regs[REG_INDEX(EDI)] = (uintptr_t) gregs.edi; - regs[REG_INDEX(ESI)] = (uintptr_t) gregs.esi; - regs[REG_INDEX(FP)] = (uintptr_t) gregs.ebp; - regs[REG_INDEX(SP)] = (uintptr_t) gregs.esp; - regs[REG_INDEX(EBX)] = (uintptr_t) gregs.ebx; - regs[REG_INDEX(EDX)] = (uintptr_t) gregs.edx; - regs[REG_INDEX(ECX)] = (uintptr_t) gregs.ecx; - regs[REG_INDEX(EAX)] = (uintptr_t) gregs.eax; - regs[REG_INDEX(PC)] = (uintptr_t) gregs.eip; - regs[REG_INDEX(CS)] = (uintptr_t) gregs.xcs; - regs[REG_INDEX(SS)] = (uintptr_t) gregs.xss; - -#endif /* i586 */ - #ifdef amd64 #define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg diff --git a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c index 9c4f0b0d357..899d42152d1 100644 --- a/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c +++ b/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c @@ -200,18 +200,6 @@ static bool core_handle_prstatus(struct ps_prochandle* ph, const char* buf, size if (is_debug()) { print_debug("integer regset\n"); -#ifdef i386 - // print the regset - print_debug("\teax = 0x%x\n", newthr->regs.eax); - print_debug("\tebx = 0x%x\n", newthr->regs.ebx); - print_debug("\tecx = 0x%x\n", newthr->regs.ecx); - print_debug("\tedx = 0x%x\n", newthr->regs.edx); - print_debug("\tesp = 0x%x\n", newthr->regs.esp); - print_debug("\tebp = 0x%x\n", newthr->regs.ebp); - print_debug("\tesi = 0x%x\n", newthr->regs.esi); - print_debug("\tedi = 0x%x\n", newthr->regs.edi); - print_debug("\teip = 0x%x\n", newthr->regs.eip); -#endif #if defined(amd64) || defined(x86_64) // print the regset diff --git a/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c b/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c index 149997dc4bb..20fe2ffb17e 100644 --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c +++ b/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_core.c @@ -814,18 +814,6 @@ static bool core_handle_prstatus(struct ps_prochandle* ph, const char* buf, size if (is_debug()) { print_debug("integer regset\n"); -#if defined(i586) || defined(i386) - // print the regset - print_debug("\teax = 0x%x\n", newthr->regs.r_eax); - print_debug("\tebx = 0x%x\n", newthr->regs.r_ebx); - print_debug("\tecx = 0x%x\n", newthr->regs.r_ecx); - print_debug("\tedx = 0x%x\n", newthr->regs.r_edx); - print_debug("\tesp = 0x%x\n", newthr->regs.r_esp); - print_debug("\tebp = 0x%x\n", newthr->regs.r_ebp); - print_debug("\tesi = 0x%x\n", newthr->regs.r_esi); - print_debug("\tedi = 0x%x\n", newthr->regs.r_edi); - print_debug("\teip = 0x%x\n", newthr->regs.r_eip); -#endif #if defined(amd64) || defined(x86_64) // print the regset diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java index d8c4d1a781e..897ea5da85f 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HSDB.java @@ -1007,7 +1007,7 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener { curFrame.getFP(), anno)); } else { - // For C2, which has null frame pointers on x86/amd64/aarch64 + // For C2, which has null frame pointers on amd64/aarch64 CodeBlob cb = VM.getVM().getCodeCache().findBlob(curFrame.getPC()); Address sp = curFrame.getSP(); if (Assert.ASSERTS_ENABLED) { diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java index ff14e99f3b9..4ffd0434e86 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/HotSpotAgent.java @@ -37,7 +37,6 @@ import sun.jvm.hotspot.debugger.MachineDescriptionAMD64; import sun.jvm.hotspot.debugger.MachineDescriptionPPC64; import sun.jvm.hotspot.debugger.MachineDescriptionAArch64; import sun.jvm.hotspot.debugger.MachineDescriptionRISCV64; -import sun.jvm.hotspot.debugger.MachineDescriptionIntelX86; import sun.jvm.hotspot.debugger.NoSuchSymbolException; import sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal; import sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal; @@ -522,14 +521,12 @@ public class HotSpotAgent { private void setupDebuggerWin32() { setupJVMLibNamesWin32(); - if (cpu.equals("x86")) { - machDesc = new MachineDescriptionIntelX86(); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { machDesc = new MachineDescriptionAMD64(); } else if (cpu.equals("aarch64")) { machDesc = new MachineDescriptionAArch64(); } else { - throw new DebuggerException("Win32 supported under x86, amd64 and aarch64 only"); + throw new DebuggerException("Win32 supported under amd64 and aarch64 only"); } // Note we do not use a cache for the local debugger in server @@ -554,9 +551,7 @@ public class HotSpotAgent { private void setupDebuggerLinux() { setupJVMLibNamesLinux(); - if (cpu.equals("x86")) { - machDesc = new MachineDescriptionIntelX86(); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { machDesc = new MachineDescriptionAMD64(); } else if (cpu.equals("ppc64")) { machDesc = new MachineDescriptionPPC64(); @@ -592,12 +587,10 @@ public class HotSpotAgent { private void setupDebuggerBsd() { setupJVMLibNamesBsd(); - if (cpu.equals("x86")) { - machDesc = new MachineDescriptionIntelX86(); - } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { + if (cpu.equals("amd64") || cpu.equals("x86_64")) { machDesc = new MachineDescriptionAMD64(); } else { - throw new DebuggerException("BSD only supported on x86/x86_64. Current arch: " + cpu); + throw new DebuggerException("BSD only supported on x86_64. Current arch: " + cpu); } BsdDebuggerLocal dbg = new BsdDebuggerLocal(machDesc, !isServer); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/Debugger.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/Debugger.java index 36b73d66a05..81e620ff1fb 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/Debugger.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/Debugger.java @@ -78,7 +78,7 @@ public interface Debugger extends SymbolLookup, ThreadAccess { /** Support for remote debugging. Get the name of the CPU type on which this debugger is running (to be able to properly configure - the local system). Typical return value is "x86"; see + the local system). Typical return value is "amd64"; see utilities/PlatformInfo.java. */ public String getCPU() throws DebuggerException; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java deleted file mode 100644 index c74a37c05be..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2000, 2022, 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. - * - * 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 sun.jvm.hotspot.debugger; - -public class MachineDescriptionIntelX86 extends MachineDescriptionTwosComplement implements MachineDescription { - public long getAddressSize() { - return 4; - } - - public boolean isBigEndian() { - return false; - } - - public boolean supports32bitAlignmentOf64bitTypes() { - return true; - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java index d8fb562bfcc..c119e374d66 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdCDebugger.java @@ -29,10 +29,8 @@ import java.io.*; import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.cdbg.*; -import sun.jvm.hotspot.debugger.x86.*; import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.aarch64.*; -import sun.jvm.hotspot.debugger.bsd.x86.*; import sun.jvm.hotspot.debugger.bsd.amd64.*; import sun.jvm.hotspot.debugger.bsd.aarch64.*; import sun.jvm.hotspot.utilities.*; @@ -86,14 +84,7 @@ class BsdCDebugger implements CDebugger { public CFrame topFrameForThread(ThreadProxy thread) throws DebuggerException { String cpu = dbg.getCPU(); - if (cpu.equals("x86")) { - X86ThreadContext context = (X86ThreadContext) thread.getContext(); - Address ebp = context.getRegisterAsAddress(X86ThreadContext.EBP); - if (ebp == null) return null; - Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP); - if (pc == null) return null; - return new BsdX86CFrame(dbg, ebp, pc); - } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { + if (cpu.equals("amd64") || cpu.equals("x86_64")) { AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP); if (rbp == null) return null; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java index 48126ec6695..c4a3a4850ff 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java @@ -27,14 +27,11 @@ package sun.jvm.hotspot.debugger.bsd; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.bsd.aarch64.*; import sun.jvm.hotspot.debugger.bsd.amd64.*; -import sun.jvm.hotspot.debugger.bsd.x86.*; class BsdThreadContextFactory { static ThreadContext createThreadContext(BsdDebugger dbg) { String cpu = dbg.getCPU(); - if (cpu.equals("x86")) { - return new BsdX86ThreadContext(dbg); - } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { + if (cpu.equals("amd64") || cpu.equals("x86_64")) { return new BsdAMD64ThreadContext(dbg); } else if (cpu.equals("aarch64")) { return new BsdAARCH64ThreadContext(dbg); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java deleted file mode 100644 index 1e8d83b289f..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86CFrame.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2003, 2021, 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. - * - * 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 sun.jvm.hotspot.debugger.bsd.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.bsd.*; -import sun.jvm.hotspot.debugger.cdbg.*; -import sun.jvm.hotspot.debugger.cdbg.basic.*; -import sun.jvm.hotspot.debugger.x86.*; - -public final class BsdX86CFrame extends BasicCFrame { - // package/class internals only - public BsdX86CFrame(BsdDebugger dbg, Address ebp, Address pc) { - super(dbg.getCDebugger()); - this.ebp = ebp; - this.pc = pc; - this.dbg = dbg; - } - - // override base class impl to avoid ELF parsing - public ClosestSymbol closestSymbolToPC() { - // try native lookup in debugger. - return dbg.lookup(dbg.getAddressValue(pc())); - } - - public Address pc() { - return pc; - } - - public Address localVariableBase() { - return ebp; - } - - public CFrame sender(ThreadProxy thread) { - X86ThreadContext context = (X86ThreadContext) thread.getContext(); - Address esp = context.getRegisterAsAddress(X86ThreadContext.ESP); - - if ( (ebp == null) || ebp.lessThan(esp) ) { - return null; - } - - Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE); - if (nextEBP == null) { - return null; - } - Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE); - if (nextPC == null) { - return null; - } - return new BsdX86CFrame(dbg, nextEBP, nextPC); - } - - private static final int ADDRESS_SIZE = 4; - private Address pc; - private Address ebp; - private BsdDebugger dbg; -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java deleted file mode 100644 index 8eaca2b7d79..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2003, 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. - * - * 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 sun.jvm.hotspot.debugger.bsd.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.debugger.bsd.*; - -public class BsdX86ThreadContext extends X86ThreadContext { - private BsdDebugger debugger; - - public BsdX86ThreadContext(BsdDebugger debugger) { - super(); - this.debugger = debugger; - } - - public void setRegisterAsAddress(int index, Address value) { - setRegister(index, debugger.getAddressValue(value)); - } - - public Address getRegisterAsAddress(int index) { - return debugger.newAddress(getRegister(index)); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java index 13951447903..47f41fe1383 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java @@ -64,7 +64,7 @@ public interface CFrame { /** Gets the base pointer in this frame from which local variable offsets in the debug info are based. Typically this is the - base-of-frame pointer (EBP on x86, FP/I6 on SPARC). */ + base-of-frame pointer (RBP on amd64, FP/I6 on SPARC). */ public Address localVariableBase(); /** Visit all local variables in this frame if debug information is diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java index c100c160947..894e31949b2 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java @@ -30,12 +30,10 @@ import java.util.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.cdbg.*; -import sun.jvm.hotspot.debugger.x86.*; import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.debugger.aarch64.*; import sun.jvm.hotspot.debugger.riscv64.*; import sun.jvm.hotspot.debugger.ppc64.*; -import sun.jvm.hotspot.debugger.linux.x86.*; import sun.jvm.hotspot.debugger.linux.amd64.*; import sun.jvm.hotspot.debugger.linux.ppc64.*; import sun.jvm.hotspot.debugger.linux.aarch64.*; @@ -81,14 +79,7 @@ class LinuxCDebugger implements CDebugger { public CFrame topFrameForThread(ThreadProxy thread) throws DebuggerException { String cpu = dbg.getCPU(); - if (cpu.equals("x86")) { - X86ThreadContext context = (X86ThreadContext) thread.getContext(); - Address ebp = context.getRegisterAsAddress(X86ThreadContext.EBP); - if (ebp == null) return null; - Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP); - if (pc == null) return null; - return new LinuxX86CFrame(dbg, ebp, pc); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext(); Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP); if (pc == null) return null; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThreadContextFactory.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThreadContextFactory.java index 69a34fe2afa..88863e76285 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThreadContextFactory.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThreadContextFactory.java @@ -27,15 +27,12 @@ package sun.jvm.hotspot.debugger.linux; import java.lang.reflect.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.linux.amd64.*; -import sun.jvm.hotspot.debugger.linux.x86.*; import sun.jvm.hotspot.debugger.linux.ppc64.*; class LinuxThreadContextFactory { static ThreadContext createThreadContext(LinuxDebugger dbg) { String cpu = dbg.getCPU(); - if (cpu.equals("x86")) { - return new LinuxX86ThreadContext(dbg); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { return new LinuxAMD64ThreadContext(dbg); } else if (cpu.equals("ppc64")) { return new LinuxPPC64ThreadContext(dbg); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java deleted file mode 100644 index 3834eb41a36..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2003, 2021, 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. - * - * 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 sun.jvm.hotspot.debugger.linux.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.linux.*; -import sun.jvm.hotspot.debugger.cdbg.*; -import sun.jvm.hotspot.debugger.cdbg.basic.*; -import sun.jvm.hotspot.debugger.x86.*; - -public final class LinuxX86CFrame extends BasicCFrame { - // package/class internals only - public LinuxX86CFrame(LinuxDebugger dbg, Address ebp, Address pc) { - super(dbg.getCDebugger()); - this.ebp = ebp; - this.pc = pc; - this.dbg = dbg; - } - - // override base class impl to avoid ELF parsing - public ClosestSymbol closestSymbolToPC() { - // try native lookup in debugger. - return dbg.lookup(dbg.getAddressValue(pc())); - } - - public Address pc() { - return pc; - } - - public Address localVariableBase() { - return ebp; - } - - public CFrame sender(ThreadProxy thread) { - X86ThreadContext context = (X86ThreadContext) thread.getContext(); - /* - * Native code fills in the stack pointer register value using index - * X86ThreadContext.SP. - * See file LinuxDebuggerLocal.c macro REG_INDEX(reg). - * - * Be sure to use SP, or UESP which is aliased to SP in Java code, - * for the frame pointer validity check. - */ - Address esp = context.getRegisterAsAddress(X86ThreadContext.SP); - - if ( (ebp == null) || ebp.lessThan(esp) ) { - return null; - } - - // Check alignment of ebp - if ( dbg.getAddressValue(ebp) % ADDRESS_SIZE != 0) { - return null; - } - - Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE); - if (nextEBP == null || nextEBP.lessThanOrEqual(ebp)) { - return null; - } - Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE); - if (nextPC == null) { - return null; - } - return new LinuxX86CFrame(dbg, nextEBP, nextPC); - } - - private static final int ADDRESS_SIZE = 4; - private Address pc; - private Address ebp; - private LinuxDebugger dbg; -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86ThreadContext.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86ThreadContext.java deleted file mode 100644 index 5ba323356fe..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86ThreadContext.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2003, 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. - * - * 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 sun.jvm.hotspot.debugger.linux.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.debugger.linux.*; - -public class LinuxX86ThreadContext extends X86ThreadContext { - private LinuxDebugger debugger; - - public LinuxX86ThreadContext(LinuxDebugger debugger) { - super(); - this.debugger = debugger; - } - - public void setRegisterAsAddress(int index, Address value) { - setRegister(index, debugger.getAddressValue(value)); - } - - public Address getRegisterAsAddress(int index) { - return debugger.newAddress(getRegister(index)); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java index d4a7c17dc85..3833680d96c 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java @@ -30,7 +30,6 @@ import java.lang.reflect.*; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.cdbg.*; -import sun.jvm.hotspot.debugger.remote.x86.*; import sun.jvm.hotspot.debugger.remote.amd64.*; import sun.jvm.hotspot.debugger.remote.ppc64.*; @@ -55,9 +54,7 @@ public class RemoteDebuggerClient extends DebuggerBase implements JVMDebugger { int cachePageSize = 4096; int cacheNumPages = parseCacheNumPagesProperty(cacheSize / cachePageSize); String cpu = remoteDebugger.getCPU(); - if (cpu.equals("x86")) { - threadFactory = new RemoteX86ThreadFactory(this); - } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { + if (cpu.equals("amd64") || cpu.equals("x86_64")) { threadFactory = new RemoteAMD64ThreadFactory(this); } else if (cpu.equals("ppc64")) { threadFactory = new RemotePPC64ThreadFactory(this); diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86Thread.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86Thread.java deleted file mode 100644 index f591900283c..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86Thread.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2002, 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. - * - * 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 sun.jvm.hotspot.debugger.remote.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.debugger.remote.*; -import sun.jvm.hotspot.utilities.*; - -public class RemoteX86Thread extends RemoteThread { - public RemoteX86Thread(RemoteDebuggerClient debugger, Address addr) { - super(debugger, addr); - } - - public RemoteX86Thread(RemoteDebuggerClient debugger, long id) { - super(debugger, id); - } - - public ThreadContext getContext() throws IllegalThreadStateException { - RemoteX86ThreadContext context = new RemoteX86ThreadContext(debugger); - long[] regs = (addr != null)? debugger.getThreadIntegerRegisterSet(addr) : - debugger.getThreadIntegerRegisterSet(id); - if (Assert.ASSERTS_ENABLED) { - Assert.that(regs.length == X86ThreadContext.NPRGREG, "size of register set must match"); - } - for (int i = 0; i < regs.length; i++) { - context.setRegister(i, regs[i]); - } - return context; - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadContext.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadContext.java deleted file mode 100644 index e5bbe9647a9..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadContext.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2002, 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. - * - * 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 sun.jvm.hotspot.debugger.remote.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.debugger.remote.*; - -public class RemoteX86ThreadContext extends X86ThreadContext { - private RemoteDebuggerClient debugger; - - public RemoteX86ThreadContext(RemoteDebuggerClient debugger) { - super(); - this.debugger = debugger; - } - - /** This can't be implemented in this class since we would have to - tie the implementation to, for example, the debugging system */ - public void setRegisterAsAddress(int index, Address value) { - setRegister(index, debugger.getAddressValue(value)); - } - - /** This can't be implemented in this class since we would have to - tie the implementation to, for example, the debugging system */ - public Address getRegisterAsAddress(int index) { - return debugger.newAddress(getRegister(index)); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadFactory.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadFactory.java deleted file mode 100644 index f8a8f247318..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2002, 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. - * - * 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 sun.jvm.hotspot.debugger.remote.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.remote.*; - -public class RemoteX86ThreadFactory implements RemoteThreadFactory { - private RemoteDebuggerClient debugger; - - public RemoteX86ThreadFactory(RemoteDebuggerClient debugger) { - this.debugger = debugger; - } - - public ThreadProxy createThreadWrapper(Address threadIdentifierAddr) { - return new RemoteX86Thread(debugger, threadIdentifierAddr); - } - - public ThreadProxy createThreadWrapper(long id) { - return new RemoteX86Thread(debugger, id); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50X86RegisterEnums.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50X86RegisterEnums.java deleted file mode 100644 index 9793f20deb8..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50X86RegisterEnums.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2001, 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. - * - * 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 sun.jvm.hotspot.debugger.win32.coff; - -public interface DebugVC50X86RegisterEnums { - /** 8-bit registers */ - public static final int NONE = 0; - public static final int AL = 1; - public static final int CL = 2; - public static final int DL = 3; - public static final int BL = 4; - public static final int AH = 5; - public static final int CH = 6; - public static final int DH = 7; - public static final int BH = 8; - - /** 16-bit registers */ - public static final int AX = 9; - public static final int CX = 10; - public static final int DX = 11; - public static final int BX = 12; - public static final int SP = 13; - public static final int BP = 14; - public static final int SI = 15; - public static final int DI = 16; - - /** 32-bit registers */ - public static final int EAX = 17; - public static final int ECX = 18; - public static final int EDX = 19; - public static final int EBX = 20; - public static final int ESP = 21; - public static final int EBP = 22; - public static final int ESI = 23; - public static final int EDI = 24; - - /** Segment registers */ - public static final int ES = 25; - public static final int CS = 26; - public static final int SS = 27; - public static final int DS = 28; - public static final int FS = 29; - public static final int GS = 30; - - /** Special cases */ - public static final int IP = 31; - public static final int FLAGS = 32; - public static final int EIP = 33; - public static final int EFLAGS = 34; - - /** PCODE Registers */ - public static final int TEMP = 40; - public static final int TEMPH = 41; - public static final int QUOTE = 42; - - /** System Registers */ - public static final int CR0 = 80; - public static final int CR1 = 81; - public static final int CR2 = 82; - public static final int CR3 = 83; - public static final int DR0 = 90; - public static final int DR1 = 91; - public static final int DR2 = 92; - public static final int DR3 = 93; - public static final int DR4 = 94; - public static final int DR5 = 95; - public static final int DR6 = 96; - public static final int DR7 = 97; - - /** Register extensions for 80x87 */ - public static final int ST0 = 128; - public static final int ST1 = 129; - public static final int ST2 = 130; - public static final int ST3 = 131; - public static final int ST4 = 132; - public static final int ST5 = 133; - public static final int ST6 = 134; - public static final int ST7 = 135; - public static final int CONTROL = 136; - public static final int STATUS = 137; - public static final int TAG = 138; - public static final int FPIP = 139; - public static final int FPCS = 140; - public static final int FPDO = 141; - public static final int FPDS = 142; - public static final int ISEM = 143; - public static final int FPEIP = 144; - public static final int FPEDO = 145; -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java index 86ca82ea33f..6fbea538488 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java @@ -49,11 +49,6 @@ public interface WindbgDebugger extends JVMDebugger { public WindbgAddress readCompKlassAddress(long address) throws DebuggerException; public WindbgOopHandle readOopHandle(long address) throws DebuggerException; public WindbgOopHandle readCompOopHandle(long address) throws DebuggerException; - - // The returned array of register contents is guaranteed to be in - // the same order as in the DbxDebugger for Solaris/x86 or amd64; that is, - // the indices match those in debugger/x86/X86ThreadContext.java or - // debugger/amd64/AMD64ThreadContext.java. public long[] getThreadIntegerRegisterSet(long threadId) throws DebuggerException; public long getThreadIdFromSysId(long sysId) throws DebuggerException; diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java index 07704671fd4..b45dbd23405 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java @@ -523,9 +523,7 @@ public class WindbgDebuggerLocal extends DebuggerBase implements WindbgDebugger // Only add the search path for the current CPU architecture: String cpu = PlatformInfo.getCPU(); - if (cpu.equals("x86")) { - searchList.add(DTFWHome + " (x86)"); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { searchList.add(DTFWHome + " (x64)"); } // The last place to search is the system directory: diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java deleted file mode 100644 index e37e51cebbe..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2000, 2015, 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. - * - * 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 sun.jvm.hotspot.debugger.x86; - -import java.lang.annotation.Native; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.cdbg.*; - -/** Specifies the thread context on x86 platforms; only a sub-portion - of the context is guaranteed to be present on all operating - systems. */ - -public abstract class X86ThreadContext implements ThreadContext { - // Taken from /usr/include/ia32/sys/reg.h on Solaris/x86 - - // NOTE: the indices for the various registers must be maintained as - // listed across various operating systems. However, only a small - // subset of the registers' values are guaranteed to be present (and - // must be present for the SA's stack walking to work): EAX, EBX, - // ECX, EDX, ESI, EDI, EBP, ESP, and EIP. - - // One instance of the Native annotation is enough to trigger header generation - // for this file. - @Native - public static final int GS = 0; - public static final int FS = 1; - public static final int ES = 2; - public static final int DS = 3; - public static final int EDI = 4; - public static final int ESI = 5; - public static final int EBP = 6; - public static final int ESP = 7; - public static final int EBX = 8; - public static final int EDX = 9; - public static final int ECX = 10; - public static final int EAX = 11; - public static final int TRAPNO = 12; - public static final int ERR = 13; - public static final int EIP = 14; - public static final int CS = 15; - public static final int EFL = 16; - public static final int UESP = 17; - public static final int SS = 18; - // Additional state (not in reg.h) for debug registers - public static final int DR0 = 19; - public static final int DR1 = 20; - public static final int DR2 = 21; - public static final int DR3 = 22; - public static final int DR6 = 23; - public static final int DR7 = 24; - - - public static final int PC = EIP; - public static final int FP = EBP; - public static final int SP = UESP; - public static final int PS = EFL; - public static final int R0 = EAX; - public static final int R1 = EDX; - - public static final int NPRGREG = 25; - - private static final String[] regNames = { - "GS", "FS", "ES", "DS", - "EDI", "ESI", "EBP", "ESP", - "EBX", "EDX", "ECX", "EAX", - "TRAPNO", "ERR", "EIP", "CS", - "EFLAGS", "UESP", "SS", - "DR0", "DR1", "DR2", "DR3", - "DR6", "DR7" - }; - - // Ought to be int on x86 but we're stuck - private long[] data; - - public X86ThreadContext() { - data = new long[NPRGREG]; - } - - public int getNumRegisters() { - return NPRGREG; - } - - public String getRegisterName(int index) { - return regNames[index]; - } - - public void setRegister(int index, long value) { - data[index] = value; - } - - public long getRegister(int index) { - return data[index]; - } - - public CFrame getTopFrame(Debugger dbg) { - return null; - } - - /** This can't be implemented in this class since we would have to - tie the implementation to, for example, the debugging system */ - public abstract void setRegisterAsAddress(int index, Address value); - - /** This can't be implemented in this class since we would have to - tie the implementation to, for example, the debugging system */ - public abstract Address getRegisterAsAddress(int index); -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/StackValueCollection.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/StackValueCollection.java index 566b527b88a..a2808bfff31 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/StackValueCollection.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/StackValueCollection.java @@ -41,7 +41,7 @@ public class StackValueCollection { public StackValue get(int i) { return list.get(i); } // Get typed locals/expressions - // FIXME: must figure out whether word swapping is necessary on x86 + // FIXME: must figure out whether word swapping is necessary on amd64 public boolean booleanAt(int slot) { return (int)get(slot).getInteger() != 0; } public byte byteAt(int slot) { return (byte) get(slot).getInteger(); } public char charAt(int slot) { return (char) get(slot).getInteger(); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java index 6acacc28722..04c4c944517 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Threads.java @@ -30,12 +30,10 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.runtime.win32_amd64.Win32AMD64JavaThreadPDAccess; import sun.jvm.hotspot.runtime.win32_aarch64.Win32AARCH64JavaThreadPDAccess; -import sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess; import sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess; import sun.jvm.hotspot.runtime.linux_aarch64.LinuxAARCH64JavaThreadPDAccess; import sun.jvm.hotspot.runtime.linux_riscv64.LinuxRISCV64JavaThreadPDAccess; import sun.jvm.hotspot.runtime.linux_ppc64.LinuxPPC64JavaThreadPDAccess; -import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess; import sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess; import sun.jvm.hotspot.runtime.bsd_aarch64.BsdAARCH64JavaThreadPDAccess; import sun.jvm.hotspot.utilities.*; @@ -101,9 +99,7 @@ public class Threads { access = new Win32AARCH64JavaThreadPDAccess(); } } else if (os.equals("linux")) { - if (cpu.equals("x86")) { - access = new LinuxX86JavaThreadPDAccess(); - } else if (cpu.equals("amd64")) { + if (cpu.equals("amd64")) { access = new LinuxAMD64JavaThreadPDAccess(); } else if (cpu.equals("ppc64")) { access = new LinuxPPC64JavaThreadPDAccess(); @@ -123,9 +119,7 @@ public class Threads { } } } else if (os.equals("bsd")) { - if (cpu.equals("x86")) { - access = new BsdX86JavaThreadPDAccess(); - } else if (cpu.equals("amd64") || cpu.equals("x86_64")) { + if (cpu.equals("amd64") || cpu.equals("x86_64")) { access = new BsdAMD64JavaThreadPDAccess(); } } else if (os.equals("darwin")) { diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java index c558374d23c..dc27a4fc59e 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java @@ -879,9 +879,7 @@ public class VM { } /** Indicates whether a given program counter is in Java code. This - includes but is not spanned by the interpreter and code cache. - Only used in the debugging system, for implementing - JavaThread.currentFrameGuess() on x86. */ + includes but is not spanned by the interpreter and code cache. */ public boolean isJavaPCDbg(Address addr) { // FIXME: this is not a complete enough set: must include areas // like vtable stubs diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess.java index 29df979e13e..e85973773dc 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess.java @@ -30,7 +30,7 @@ import sun.jvm.hotspot.code.*; import sun.jvm.hotspot.interpreter.*; import sun.jvm.hotspot.oops.*; import sun.jvm.hotspot.runtime.*; -import sun.jvm.hotspot.runtime.x86.*; +import sun.jvm.hotspot.runtime.amd64.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; @@ -67,7 +67,7 @@ public class AMD64CurrentFrameGuess { private boolean validateInterpreterFrame(Address sp, Address fp, Address pc) { VM vm = VM.getVM(); - X86Frame f = new X86Frame(sp, fp, pc); + AMD64Frame f = new AMD64Frame(sp, fp, pc); // First validate that frame->method is really a Method* Method method = null; @@ -263,7 +263,7 @@ public class AMD64CurrentFrameGuess { offset += vm.getAddressSize()) { try { Address curSP = sp.addOffsetTo(offset); - Frame frame = new X86Frame(curSP, null, pc); + Frame frame = new AMD64Frame(curSP, null, pc); RegisterMap map = thread.newRegisterMap(false); while (frame != null) { if (frame.isEntryFrame() && frame.entryFrameIsFirst()) { diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64Frame.java similarity index 88% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64Frame.java index 2d972d3df17..360f62a253d 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64Frame.java @@ -22,7 +22,7 @@ * */ -package sun.jvm.hotspot.runtime.x86; +package sun.jvm.hotspot.runtime.amd64; import java.util.*; import sun.jvm.hotspot.code.*; @@ -36,12 +36,12 @@ import sun.jvm.hotspot.utilities.Observable; import sun.jvm.hotspot.utilities.Observer; /** Specialization of and implementation of abstract methods of the - Frame class for the x86 family of CPUs. */ + Frame class for the x86_64 family of CPUs. */ -public class X86Frame extends Frame { +public class AMD64Frame extends Frame { private static final boolean DEBUG; static { - DEBUG = System.getProperty("sun.jvm.hotspot.runtime.x86.X86Frame.DEBUG") != null; + DEBUG = System.getProperty("sun.jvm.hotspot.runtime.amd64.AMD64Frame.DEBUG") != null; } // All frames @@ -99,7 +99,7 @@ public class X86Frame extends Frame { private Address raw_unextendedSP; private Address live_bcp; - private X86Frame() { + private AMD64Frame() { } private void initFrame(Address raw_sp, Address raw_fp, Address pc, Address raw_unextendedSp, Address live_bcp) { @@ -122,44 +122,44 @@ public class X86Frame extends Frame { } - public X86Frame(Address raw_sp, Address raw_fp, Address pc) { + public AMD64Frame(Address raw_sp, Address raw_fp, Address pc) { initFrame(raw_sp, raw_fp, pc, null, null); if (DEBUG) { - System.out.println("X86Frame(sp, fp, pc): " + this); + System.out.println("AMD64Frame(sp, fp, pc): " + this); dumpStack(); } } - public X86Frame(Address raw_sp, Address raw_fp) { + public AMD64Frame(Address raw_sp, Address raw_fp) { initFrame(raw_sp, raw_fp, null, null, null); if (DEBUG) { - System.out.println("X86Frame(sp, fp): " + this); + System.out.println("AMD64Frame(sp, fp): " + this); dumpStack(); } } - public X86Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) { + public AMD64Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) { initFrame(raw_sp, raw_fp, pc, raw_unextendedSp, null); if (DEBUG) { - System.out.println("X86Frame(sp, unextendedSP, fp, pc): " + this); + System.out.println("AMD64Frame(sp, unextendedSP, fp, pc): " + this); dumpStack(); } } - public X86Frame(Address raw_sp, Address raw_fp, Address pc, Address raw_unextendedSp, Address live_bcp) { + public AMD64Frame(Address raw_sp, Address raw_fp, Address pc, Address raw_unextendedSp, Address live_bcp) { initFrame(raw_sp, raw_fp, pc, raw_unextendedSp, live_bcp); if (DEBUG) { - System.out.println("X86Frame(sp, fp, pc, unextendedSP, live_bcp): " + this); + System.out.println("AMD64Frame(sp, fp, pc, unextendedSP, live_bcp): " + this); dumpStack(); } } public Object clone() { - X86Frame frame = new X86Frame(); + AMD64Frame frame = new AMD64Frame(); frame.raw_sp = raw_sp; frame.raw_unextendedSP = raw_unextendedSP; frame.raw_fp = raw_fp; @@ -174,11 +174,11 @@ public class X86Frame extends Frame { return false; } - if (!(arg instanceof X86Frame)) { + if (!(arg instanceof AMD64Frame)) { return false; } - X86Frame other = (X86Frame) arg; + AMD64Frame other = (AMD64Frame) arg; return (AddressOps.equal(getSP(), other.getSP()) && AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) && @@ -206,7 +206,7 @@ public class X86Frame extends Frame { public Address getSP() { return raw_sp; } public Address getID() { return raw_sp; } - // FIXME: not implemented yet (should be done for Solaris/X86) + // FIXME: not implemented yet (should be done for Solaris) public boolean isSignalHandlerFrameDbg() { return false; } public int getSignalNumberDbg() { return 0; } public String getSignalNameDbg() { return null; } @@ -248,7 +248,7 @@ public class X86Frame extends Frame { // void patch_pc(Thread* thread, address pc); public Frame sender(RegisterMap regMap, CodeBlob cb) { - X86RegisterMap map = (X86RegisterMap) regMap; + AMD64RegisterMap map = (AMD64RegisterMap) regMap; if (Assert.ASSERTS_ENABLED) { Assert.that(map != null, "map must be set"); @@ -281,10 +281,10 @@ public class X86Frame extends Frame { // Must be native-compiled frame, i.e. the marshaling code for native // methods that exists in the core system. - return new X86Frame(getSenderSP(), getLink(), getSenderPC()); + return new AMD64Frame(getSenderSP(), getLink(), getSenderPC()); } - private Frame senderForEntryFrame(X86RegisterMap map) { + private Frame senderForEntryFrame(AMD64RegisterMap map) { if (DEBUG) { System.out.println("senderForEntryFrame"); } @@ -293,16 +293,16 @@ public class X86Frame extends Frame { } // Java frame called from C; skip all C frames and return top C // frame of that chunk as the sender - X86JavaCallWrapper jcw = (X86JavaCallWrapper) getEntryFrameCallWrapper(); + AMD64JavaCallWrapper jcw = (AMD64JavaCallWrapper) getEntryFrameCallWrapper(); if (Assert.ASSERTS_ENABLED) { Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero"); Assert.that(jcw.getLastJavaSP().greaterThan(getSP()), "must be above this frame on stack"); } - X86Frame fr; + AMD64Frame fr; if (jcw.getLastJavaPC() != null) { - fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC()); + fr = new AMD64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC()); } else { - fr = new X86Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP()); + fr = new AMD64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP()); } map.clear(); if (Assert.ASSERTS_ENABLED) { @@ -311,7 +311,7 @@ public class X86Frame extends Frame { return fr; } - private Frame senderForUpcallStub(X86RegisterMap map, UpcallStub stub) { + private Frame senderForUpcallStub(AMD64RegisterMap map, UpcallStub stub) { if (DEBUG) { System.out.println("senderForUpcallStub"); } @@ -326,11 +326,11 @@ public class X86Frame extends Frame { if (Assert.ASSERTS_ENABLED) { Assert.that(lastJavaSP.greaterThan(getSP()), "must be above this frame on stack"); } - X86Frame fr; + AMD64Frame fr; if (lastJavaPC != null) { - fr = new X86Frame(lastJavaSP, lastJavaFP, lastJavaPC); + fr = new AMD64Frame(lastJavaSP, lastJavaFP, lastJavaPC); } else { - fr = new X86Frame(lastJavaSP, lastJavaFP); + fr = new AMD64Frame(lastJavaSP, lastJavaFP); } map.clear(); if (Assert.ASSERTS_ENABLED) { @@ -339,7 +339,7 @@ public class X86Frame extends Frame { return fr; } - private Frame senderForInterpreterFrame(X86RegisterMap map) { + private Frame senderForInterpreterFrame(AMD64RegisterMap map) { if (DEBUG) { System.out.println("senderForInterpreterFrame"); } @@ -355,32 +355,28 @@ public class X86Frame extends Frame { if (map.getUpdateMap()) updateMapWithSavedLink(map, addressOfStackSlot(LINK_OFFSET)); - return new X86Frame(sp, unextendedSP, getLink(), getSenderPC()); + return new AMD64Frame(sp, unextendedSP, getLink(), getSenderPC()); } private void updateMapWithSavedLink(RegisterMap map, Address savedFPAddr) { map.setLocation(rbp, savedFPAddr); } - private Frame senderForContinuationStub(X86RegisterMap map, CodeBlob cb) { + private Frame senderForContinuationStub(AMD64RegisterMap map, CodeBlob cb) { var contEntry = map.getThread().getContEntry(); Address senderSP = contEntry.getEntrySP(); Address senderPC = contEntry.getEntryPC(); Address senderFP = contEntry.getEntryFP(); - return new X86Frame(senderSP, senderFP, senderPC); + return new AMD64Frame(senderSP, senderFP, senderPC); } - private Frame senderForCompiledFrame(X86RegisterMap map, CodeBlob cb) { + private Frame senderForCompiledFrame(AMD64RegisterMap map, CodeBlob cb) { if (DEBUG) { System.out.println("senderForCompiledFrame"); } - // - // NOTE: some of this code is (unfortunately) duplicated in X86CurrentFrameGuess - // - if (Assert.ASSERTS_ENABLED) { Assert.that(map != null, "map must be set"); } @@ -414,7 +410,7 @@ public class X86Frame extends Frame { updateMapWithSavedLink(map, savedFPAddr); } - return new X86Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC); + return new AMD64Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC); } protected boolean hasSenderPD() { @@ -545,7 +541,7 @@ public class X86Frame extends Frame { // Entry frames public JavaCallWrapper getEntryFrameCallWrapper() { - return new X86JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0)); + return new AMD64JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0)); } protected Address addressOfSavedOopResult() { diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86RegisterMap.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64RegisterMap.java similarity index 85% rename from src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86RegisterMap.java rename to src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64RegisterMap.java index 4cde2902043..b1ae1e8a001 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86RegisterMap.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64RegisterMap.java @@ -22,24 +22,24 @@ * */ -package sun.jvm.hotspot.runtime.x86; +package sun.jvm.hotspot.runtime.amd64; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.runtime.*; -public class X86RegisterMap extends RegisterMap { +public class AMD64RegisterMap extends RegisterMap { /** This is the only public constructor */ - public X86RegisterMap(JavaThread thread, boolean updateMap) { + public AMD64RegisterMap(JavaThread thread, boolean updateMap) { super(thread, updateMap); } - protected X86RegisterMap(RegisterMap map) { + protected AMD64RegisterMap(RegisterMap map) { super(map); } public Object clone() { - X86RegisterMap retval = new X86RegisterMap(this); + AMD64RegisterMap retval = new AMD64RegisterMap(this); return retval; } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java index 3f7d923a564..a2cdac72add 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java @@ -32,7 +32,6 @@ import sun.jvm.hotspot.debugger.bsd.BsdDebugger; import sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.runtime.amd64.*; -import sun.jvm.hotspot.runtime.x86.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; import sun.jvm.hotspot.utilities.Observable; @@ -87,11 +86,11 @@ public class BsdAMD64JavaThreadPDAccess implements JavaThreadPDAccess { if (fp == null) { return null; // no information } - return new X86Frame(thread.getLastJavaSP(), fp); + return new AMD64Frame(thread.getLastJavaSP(), fp); } public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) { - return new X86RegisterMap(thread, updateMap); + return new AMD64RegisterMap(thread, updateMap); } public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { @@ -102,13 +101,13 @@ public class BsdAMD64JavaThreadPDAccess implements JavaThreadPDAccess { return null; } if (guesser.getPC() == null) { - return new X86Frame(guesser.getSP(), guesser.getFP()); + return new AMD64Frame(guesser.getSP(), guesser.getFP()); } else if (VM.getVM().getInterpreter().contains(guesser.getPC())) { // pass the value of R13 which contains the bcp for the top level frame Address bcp = context.getRegisterAsAddress(AMD64ThreadContext.R13); - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); } else { - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); } } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java deleted file mode 100644 index 703a09747ae..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdSignals.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2002, 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. - * - * 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 sun.jvm.hotspot.runtime.bsd_x86; - -public class BsdSignals { - private static String[] signalNames = { - "", /* No signal 0 */ - "SIGHUP", /* hangup */ - "SIGINT", /* interrupt */ - "SIGQUIT", /* quit */ - "SIGILL", /* illegal instr. (not reset when caught) */ - "SIGTRAP", /* trace trap (not reset when caught) */ - "SIGABRT", /* abort() */ - "SIGEMT", /* EMT instruction */ - "SIGFPE", /* floating point exception */ - "SIGKILL", /* kill (cannot be caught or ignored) */ - "SIGBUS", /* bus error */ - "SIGSEGV", /* segmentation violation */ - "SIGSYS", /* non-existent system call invoked */ - "SIGPIPE", /* write on a pipe with no one to read it */ - "SIGALRM", /* alarm clock */ - "SIGTERM", /* software termination signal from kill */ - "SIGURG", /* urgent condition on IO channel */ - "SIGSTOP", /* sendable stop signal not from tty */ - "SIGTSTP", /* stop signal from tty */ - "SIGCONT", /* continue a stopped process */ - "SIGCHLD", /* to parent on child stop or exit */ - "SIGTTIN", /* to readers pgrp upon background tty read */ - "SIGTTOU", /* like TTIN if (tp->t_local<OSTOP) */ - "SIGIO", /* input/output possible signal */ - "SIGXCPU", /* exceeded CPU time limit */ - "SIGXFSZ", /* exceeded file size limit */ - "SIGVTALRM", /* virtual time alarm */ - "SIGPROF", /* profiling time alarm */ - "SIGWINCH", /* window size changes */ - "SIGINFO", /* information request */ - "SIGUSR1", /* user defined signal 1 */ - "SIGUSR2" /* user defined signal 2 */ - }; - - public static String getSignalName(int sigNum) { - if ((sigNum <= 0) || (sigNum >= signalNames.length)) { - // Probably best to fail in a non-destructive way - return ""; - } - return signalNames[sigNum]; - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java deleted file mode 100644 index f4e2ab49f7e..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2002, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * 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. - * - */ - -package sun.jvm.hotspot.runtime.bsd_x86; - -import java.io.*; -import java.util.*; -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.runtime.*; -import sun.jvm.hotspot.runtime.x86.*; -import sun.jvm.hotspot.types.*; -import sun.jvm.hotspot.utilities.*; -import sun.jvm.hotspot.utilities.Observable; -import sun.jvm.hotspot.utilities.Observer; - -public class BsdX86JavaThreadPDAccess implements JavaThreadPDAccess { - private static AddressField lastJavaFPField; - private static AddressField osThreadField; - - // Field from OSThread - private static CIntegerField osThreadThreadIDField; - - // This is currently unneeded but is being kept in case we change - // the currentFrameGuess algorithm - private static final long GUESS_SCAN_RANGE = 128 * 1024; - - static { - VM.registerVMInitializedObserver(new Observer() { - public void update(Observable o, Object data) { - initialize(VM.getVM().getTypeDataBase()); - } - }); - } - - private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("JavaThread"); - osThreadField = type.getAddressField("_osthread"); - - Type anchorType = db.lookupType("JavaFrameAnchor"); - lastJavaFPField = anchorType.getAddressField("_last_Java_fp"); - - Type osThreadType = db.lookupType("OSThread"); - osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id"); - } - - public Address getLastJavaFP(Address addr) { - return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset())); - } - - public Address getLastJavaPC(Address addr) { - return null; - } - - public Address getBaseOfStackPointer(Address addr) { - return null; - } - - public Frame getLastFramePD(JavaThread thread, Address addr) { - Address fp = thread.getLastJavaFP(); - if (fp == null) { - return null; // no information - } - return new X86Frame(thread.getLastJavaSP(), fp); - } - - public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) { - return new X86RegisterMap(thread, updateMap); - } - - public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { - ThreadProxy t = getThreadProxy(addr); - X86ThreadContext context = (X86ThreadContext) t.getContext(); - X86CurrentFrameGuess guesser = new X86CurrentFrameGuess(context, thread); - if (!guesser.run(GUESS_SCAN_RANGE)) { - return null; - } - if (guesser.getPC() == null) { - return new X86Frame(guesser.getSP(), guesser.getFP()); - } else { - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); - } - } - - public void printThreadIDOn(Address addr, PrintStream tty) { - tty.print(getThreadProxy(addr)); - } - - public void printInfoOn(Address threadAddr, PrintStream tty) { - tty.print("Thread id: "); - printThreadIDOn(threadAddr, tty); -// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr)); - } - - public Address getLastSP(Address addr) { - ThreadProxy t = getThreadProxy(addr); - X86ThreadContext context = (X86ThreadContext) t.getContext(); - return context.getRegisterAsAddress(X86ThreadContext.ESP); - } - - public ThreadProxy getThreadProxy(Address addr) { - // Addr is the address of the JavaThread. - // Fetch the OSThread (for now and for simplicity, not making a - // separate "OSThread" class in this package) - Address osThreadAddr = osThreadField.getValue(addr); - // Get the address of the _thread_id from the OSThread - Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset()); - - JVMDebugger debugger = VM.getVM().getDebugger(); - return debugger.getThreadForIdentifierAddress(threadIdAddr); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_amd64/LinuxAMD64JavaThreadPDAccess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_amd64/LinuxAMD64JavaThreadPDAccess.java index 2737cc84fe4..f8672066189 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_amd64/LinuxAMD64JavaThreadPDAccess.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_amd64/LinuxAMD64JavaThreadPDAccess.java @@ -30,7 +30,6 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.runtime.amd64.*; -import sun.jvm.hotspot.runtime.x86.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; import sun.jvm.hotspot.utilities.Observable; @@ -83,11 +82,11 @@ public class LinuxAMD64JavaThreadPDAccess implements JavaThreadPDAccess { if (fp == null) { return null; // no information } - return new X86Frame(thread.getLastJavaSP(), fp); + return new AMD64Frame(thread.getLastJavaSP(), fp); } public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) { - return new X86RegisterMap(thread, updateMap); + return new AMD64RegisterMap(thread, updateMap); } public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { @@ -98,13 +97,13 @@ public class LinuxAMD64JavaThreadPDAccess implements JavaThreadPDAccess { return null; } if (guesser.getPC() == null) { - return new X86Frame(guesser.getSP(), guesser.getFP()); + return new AMD64Frame(guesser.getSP(), guesser.getFP()); } else if (VM.getVM().getInterpreter().contains(guesser.getPC())) { // pass the value of R13 which contains the bcp for the top level frame Address bcp = context.getRegisterAsAddress(AMD64ThreadContext.R13); - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); } else { - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); } } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxSignals.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxSignals.java deleted file mode 100644 index 71854d58027..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxSignals.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2002, 2022, 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. - * - * 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 sun.jvm.hotspot.runtime.linux_x86; - -public class LinuxSignals { - private static String[] signalNames = { - "", /* No signal 0 */ - "SIGHUP", /* hangup */ - "SIGINT", /* interrupt (rubout) */ - "SIGQUIT", /* quit (ASCII FS) */ - "SIGILL", /* illegal instruction (not reset when caught) */ - "SIGTRAP", /* trace trap (not reset when caught) */ - "SIGABRT", /* used by abort, replace SIGIOT in the future */ - "SIGIOT", - "SIGBUS", - "SIGFPE", /* floating point exception */ - "SIGKILL", /* kill (cannot be caught or ignored) */ - "SIGUSR1", /* user defined signal 1 */ - "SIGSEGV", /* segmentation violation */ - "SIGUSR2", /* user defined signal 2 */ - "SIGPIPE", /* write on a pipe with no one to read it */ - "SIGALRM", /* alarm clock */ - "SIGTERM", /* software termination signal from kill */ - "SIGSTKFLT", - "SIGCHLD", /* child status change alias */ - "SIGCONT", /* stopped process has been continued */ - "SIGSTOP", /* stop (cannot be caught or ignored) */ - "SIGTSTP", /* user stop requested from tty */ - "SIGTTIN", /* background tty read attempted */ - "SIGTTOU", /* background tty write attempted */ - "SIGURG", /* urgent socket condition */ - "SIGXCPU", /* exceeded cpu limit */ - "SIGXFSZ", /* exceeded file size limit */ - "SIGVTALRM", /* virtual timer expired */ - "SIGPROF", /* profiling timer expired */ - "SIGWINCH", /* window size change */ - "SIGPOLL", /* pollable event occurred */ - "SIGPWR", /* power-fail restart */ - "SIGSYS" - }; - - public static String getSignalName(int sigNum) { - if ((sigNum <= 0) || (sigNum >= signalNames.length)) { - // Probably best to fail in a non-destructive way - return ""; - } - return signalNames[sigNum]; - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxX86JavaThreadPDAccess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxX86JavaThreadPDAccess.java deleted file mode 100644 index 6224de03141..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxX86JavaThreadPDAccess.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2002, 2022, 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. - * - * 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 sun.jvm.hotspot.runtime.linux_x86; - -import java.io.*; -import java.util.*; -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.runtime.*; -import sun.jvm.hotspot.runtime.x86.*; -import sun.jvm.hotspot.types.*; -import sun.jvm.hotspot.utilities.*; -import sun.jvm.hotspot.utilities.Observable; -import sun.jvm.hotspot.utilities.Observer; - -public class LinuxX86JavaThreadPDAccess implements JavaThreadPDAccess { - private static AddressField lastJavaFPField; - private static AddressField osThreadField; - - // Field from OSThread - private static CIntegerField osThreadThreadIDField; - - // This is currently unneeded but is being kept in case we change - // the currentFrameGuess algorithm - private static final long GUESS_SCAN_RANGE = 128 * 1024; - - static { - VM.registerVMInitializedObserver(new Observer() { - public void update(Observable o, Object data) { - initialize(VM.getVM().getTypeDataBase()); - } - }); - } - - private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("JavaThread"); - osThreadField = type.getAddressField("_osthread"); - - Type anchorType = db.lookupType("JavaFrameAnchor"); - lastJavaFPField = anchorType.getAddressField("_last_Java_fp"); - - Type osThreadType = db.lookupType("OSThread"); - osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id"); - } - - public Address getLastJavaFP(Address addr) { - return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset())); - } - - public Address getLastJavaPC(Address addr) { - return null; - } - - public Address getBaseOfStackPointer(Address addr) { - return null; - } - - public Frame getLastFramePD(JavaThread thread, Address addr) { - Address fp = thread.getLastJavaFP(); - if (fp == null) { - return null; // no information - } - return new X86Frame(thread.getLastJavaSP(), fp); - } - - public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) { - return new X86RegisterMap(thread, updateMap); - } - - public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { - ThreadProxy t = getThreadProxy(addr); - X86ThreadContext context = (X86ThreadContext) t.getContext(); - X86CurrentFrameGuess guesser = new X86CurrentFrameGuess(context, thread); - if (!guesser.run(GUESS_SCAN_RANGE)) { - return null; - } - if (guesser.getPC() == null) { - return new X86Frame(guesser.getSP(), guesser.getFP()); - } else { - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); - } - } - - public void printThreadIDOn(Address addr, PrintStream tty) { - tty.print(getThreadProxy(addr)); - } - - public void printInfoOn(Address threadAddr, PrintStream tty) { - tty.print("Thread id: "); - printThreadIDOn(threadAddr, tty); -// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr)); - } - - public Address getLastSP(Address addr) { - ThreadProxy t = getThreadProxy(addr); - X86ThreadContext context = (X86ThreadContext) t.getContext(); - return context.getRegisterAsAddress(X86ThreadContext.SP); - } - - public ThreadProxy getThreadProxy(Address addr) { - // Addr is the address of the JavaThread. - // Fetch the OSThread (for now and for simplicity, not making a - // separate "OSThread" class in this package) - Address osThreadAddr = osThreadField.getValue(addr); - // Get the address of the _thread_id from the OSThread - Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset()); - - JVMDebugger debugger = VM.getVM().getDebugger(); - return debugger.getThreadForIdentifierAddress(threadIdAddr); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/win32_amd64/Win32AMD64JavaThreadPDAccess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/win32_amd64/Win32AMD64JavaThreadPDAccess.java index f6975d836c1..a573b9a383a 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/win32_amd64/Win32AMD64JavaThreadPDAccess.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/win32_amd64/Win32AMD64JavaThreadPDAccess.java @@ -30,7 +30,6 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.debugger.amd64.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.runtime.amd64.*; -import sun.jvm.hotspot.runtime.x86.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; import sun.jvm.hotspot.utilities.Observable; @@ -88,14 +87,14 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess { } Address pc = thread.getLastJavaPC(); if ( pc != null ) { - return new X86Frame(thread.getLastJavaSP(), fp, pc); + return new AMD64Frame(thread.getLastJavaSP(), fp, pc); } else { - return new X86Frame(thread.getLastJavaSP(), fp); + return new AMD64Frame(thread.getLastJavaSP(), fp); } } public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) { - return new X86RegisterMap(thread, updateMap); + return new AMD64RegisterMap(thread, updateMap); } public Frame getCurrentFrameGuess(JavaThread thread, Address addr) { @@ -106,13 +105,13 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess { return null; } if (guesser.getPC() == null) { - return new X86Frame(guesser.getSP(), guesser.getFP()); + return new AMD64Frame(guesser.getSP(), guesser.getFP()); } else if (VM.getVM().getInterpreter().contains(guesser.getPC())) { // pass the value of R13 which contains the bcp for the top level frame Address bcp = context.getRegisterAsAddress(AMD64ThreadContext.R13); - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC(), null, bcp); } else { - return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); + return new AMD64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC()); } } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java deleted file mode 100644 index 80d31c823cd..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * 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. - * - */ - -package sun.jvm.hotspot.runtime.x86; - -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.debugger.x86.*; -import sun.jvm.hotspot.code.*; -import sun.jvm.hotspot.interpreter.*; -import sun.jvm.hotspot.runtime.*; - -/**

          Should be able to be used on all x86 platforms we support - (Win32, Solaris/x86, and soon Linux) to implement JavaThread's - "currentFrameGuess()" functionality. Input is an X86ThreadContext; - output is SP, FP, and PC for an X86Frame. Instantiation of the - X86Frame is left to the caller, since we may need to subclass - X86Frame to support signal handler frames on Unix platforms.

          - -

          Algorithm is to walk up the stack within a given range (say, - 512K at most) looking for a plausible PC and SP for a Java frame, - also considering those coming in from the context. If we find a PC - that belongs to the VM (i.e., in generated code like the - interpreter or CodeCache) then we try to find an associated EBP. - We repeat this until we either find a complete frame or run out of - stack to look at.

          */ - -public class X86CurrentFrameGuess { - private X86ThreadContext context; - private JavaThread thread; - private Address spFound; - private Address fpFound; - private Address pcFound; - - private static final boolean DEBUG = System.getProperty("sun.jvm.hotspot.runtime.x86.X86Frame.DEBUG") - != null; - - public X86CurrentFrameGuess(X86ThreadContext context, - JavaThread thread) { - this.context = context; - this.thread = thread; - } - - /** Returns false if not able to find a frame within a reasonable range. */ - public boolean run(long regionInBytesToSearch) { - Address sp = context.getRegisterAsAddress(X86ThreadContext.SP); - Address pc = context.getRegisterAsAddress(X86ThreadContext.PC); - Address fp = context.getRegisterAsAddress(X86ThreadContext.FP); - if (sp == null) { - // Bail out if no last java frame eithe - if (thread.getLastJavaSP() != null) { - setValues(thread.getLastJavaSP(), thread.getLastJavaFP(), null); - return true; - } - // Bail out - return false; - } - Address end = sp.addOffsetTo(regionInBytesToSearch); - VM vm = VM.getVM(); - - setValues(null, null, null); // Assume we're not going to find anything - - if (vm.isJavaPCDbg(pc)) { - if (vm.isClientCompiler()) { - // If the topmost frame is a Java frame, we are (pretty much) - // guaranteed to have a viable EBP. We should be more robust - // than this (we have the potential for losing entire threads' - // stack traces) but need to see how much work we really have - // to do here. Searching the stack for an (SP, FP) pair is - // hard since it's easy to misinterpret inter-frame stack - // pointers as base-of-frame pointers; we also don't know the - // sizes of C1 frames (not registered in the nmethod) so can't - // derive them from ESP. - - setValues(sp, fp, pc); - return true; - } else { - if (vm.getInterpreter().contains(pc)) { - if (DEBUG) { - System.out.println("CurrentFrameGuess: choosing interpreter frame: sp = " + - sp + ", fp = " + fp + ", pc = " + pc); - } - setValues(sp, fp, pc); - return true; - } - - // For the server compiler, EBP is not guaranteed to be valid - // for compiled code. In addition, an earlier attempt at a - // non-searching algorithm (see below) failed because the - // stack pointer from the thread context was pointing - // (considerably) beyond the ostensible end of the stack, into - // garbage; walking from the topmost frame back caused a crash. - // - // This algorithm takes the current PC as a given and tries to - // find the correct corresponding SP by walking up the stack - // and repeatedly performing stackwalks (very inefficient). - // - // FIXME: there is something wrong with stackwalking across - // adapter frames...this is likely to be the root cause of the - // failure with the simpler algorithm below. - - for (long offset = 0; - offset < regionInBytesToSearch; - offset += vm.getAddressSize()) { - try { - Address curSP = sp.addOffsetTo(offset); - Frame frame = new X86Frame(curSP, null, pc); - RegisterMap map = thread.newRegisterMap(false); - while (frame != null) { - if (frame.isEntryFrame() && frame.entryFrameIsFirst()) { - // We were able to traverse all the way to the - // bottommost Java frame. - // This sp looks good. Keep it. - if (DEBUG) { - System.out.println("CurrentFrameGuess: Choosing sp = " + curSP + ", pc = " + pc); - } - setValues(curSP, null, pc); - return true; - } - Frame oldFrame = frame; - frame = frame.sender(map); - if (frame.getSP().lessThanOrEqual(oldFrame.getSP())) { - // Frame points to itself or to a location in the wrong direction. - // Break the loop and move on to next offset. - if (DEBUG) { - System.out.println("X86CurrentFrameGuess.run: frame <= oldFrame: " + frame); - } - break; - } - } - } catch (Exception e) { - if (DEBUG) { - System.out.println("CurrentFrameGuess: Exception " + e + " at offset " + offset); - } - // Bad SP. Try another. - } - } - - // Were not able to find a plausible SP to go with this PC. - // Bail out. - return false; - - /* - // Original algorithm which does not work because SP was - // pointing beyond where it should have: - - // For the server compiler, EBP is not guaranteed to be valid - // for compiled code. We see whether the PC is in the - // interpreter and take care of that, otherwise we run code - // (unfortunately) duplicated from X86Frame.senderForCompiledFrame. - - CodeCache cc = vm.getCodeCache(); - if (cc.contains(pc)) { - CodeBlob cb = cc.findBlob(pc); - - // See if we can derive a frame pointer from SP and PC - // NOTE: This is the code duplicated from X86Frame - Address saved_fp = null; - int llink_offset = cb.getLinkOffset(); - if (llink_offset >= 0) { - // Restore base-pointer, since next frame might be an interpreter frame. - Address fp_addr = sp.addOffsetTo(VM.getVM().getAddressSize() * llink_offset); - saved_fp = fp_addr.getAddressAt(0); - } - - setValues(sp, saved_fp, pc); - return true; - } - */ - } - } else { - // If the current program counter was not known to us as a Java - // PC, we currently assume that we are in the run-time system - // and attempt to look to thread-local storage for saved ESP and - // EBP. Note that if these are null (because we were, in fact, - // in Java code, i.e., vtable stubs or similar, and the SA - // didn't have enough insight into the target VM to understand - // that) then we are going to lose the entire stack trace for - // the thread, which is sub-optimal. FIXME. - - if (DEBUG) { - System.out.println("CurrentFrameGuess: choosing last Java frame: sp = " + - thread.getLastJavaSP() + ", fp = " + thread.getLastJavaFP()); - } - if (thread.getLastJavaSP() == null) { - return false; // No known Java frames on stack - } - setValues(thread.getLastJavaSP(), thread.getLastJavaFP(), null); - return true; - } - } - - public Address getSP() { return spFound; } - public Address getFP() { return fpFound; } - /** May be null if getting values from thread-local storage; take - care to call the correct X86Frame constructor to recover this if - necessary */ - public Address getPC() { return pcFound; } - - private void setValues(Address sp, Address fp, Address pc) { - spFound = sp; - fpFound = fp; - pcFound = pc; - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86JavaCallWrapper.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86JavaCallWrapper.java deleted file mode 100644 index 61a5a8415a7..00000000000 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86JavaCallWrapper.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * 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. - * - */ - -package sun.jvm.hotspot.runtime.x86; - -import java.util.*; -import sun.jvm.hotspot.debugger.*; -import sun.jvm.hotspot.types.*; -import sun.jvm.hotspot.runtime.*; -import sun.jvm.hotspot.utilities.Observable; -import sun.jvm.hotspot.utilities.Observer; - -public class X86JavaCallWrapper extends JavaCallWrapper { - private static AddressField lastJavaFPField; - - static { - VM.registerVMInitializedObserver(new Observer() { - public void update(Observable o, Object data) { - initialize(VM.getVM().getTypeDataBase()); - } - }); - } - - private static synchronized void initialize(TypeDataBase db) { - Type type = db.lookupType("JavaFrameAnchor"); - - lastJavaFPField = type.getAddressField("_last_Java_fp"); - } - - public X86JavaCallWrapper(Address addr) { - super(addr); - } - - public Address getLastJavaFP() { - return lastJavaFPField.getValue(addr.addOffsetTo(anchorField.getOffset())); - } -} diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java index dfe18d7b161..76b8595e3b2 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java @@ -626,7 +626,7 @@ public class AnnotatedMemoryPanel extends JPanel { public static void main(String[] args) { JFrame frame = new JFrame(); - DummyDebugger debugger = new DummyDebugger(new MachineDescriptionIntelX86()); + DummyDebugger debugger = new DummyDebugger(new MachineDescriptionAMD64()); AnnotatedMemoryPanel anno = new AnnotatedMemoryPanel(debugger); frame.getContentPane().add(anno); anno.addAnnotation(new Annotation(debugger.parseAddress("0x80000000"), diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java index f4cd4873207..53fa5204349 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java @@ -50,7 +50,7 @@ public class PlatformInfo { public static boolean knownCPU(String cpu) { final String[] KNOWN = - new String[] {"i386", "x86", "x86_64", "amd64", "ppc64", "ppc64le", "aarch64", "riscv64"}; + new String[] {"x86_64", "amd64", "ppc64", "ppc64le", "aarch64", "riscv64"}; for(String s : KNOWN) { if(s.equals(cpu)) @@ -60,8 +60,8 @@ public class PlatformInfo { return false; } - /* Returns "x86" for x86 based platforms and x86_64 for 64bit x86 - based platform. Otherwise returns the value of os.arch. If the + /* Returns "amd64" for x86_64 based platforms. + Otherwise returns the value of os.arch. If the value is not recognized as supported, an exception is thrown instead. */ @@ -74,9 +74,6 @@ public class PlatformInfo { } // Tweeks - if (cpu.equals("i386")) - return "x86"; - if (cpu.equals("x86_64")) return "amd64"; From a5864582da7e19b941bf55c294a414bc1a0c7a84 Mon Sep 17 00:00:00 2001 From: Archie Cobbs Date: Thu, 6 Nov 2025 15:28:01 +0000 Subject: [PATCH 489/561] 8155591: Misleading warning when not overriding close method in interface extending AutoCloseable Reviewed-by: jlahoda --- .../com/sun/tools/javac/comp/Attr.java | 18 +- .../tools/javac/resources/compiler.properties | 5 + .../InterruptedExceptionTest.java | 3 +- .../InterruptedExceptionTest2.java | 256 ++++++++++++++++++ .../InterruptedExceptionTest2.out | 23 ++ .../TryResourceThrowsInterruptedExc.java | 7 + 6 files changed, 306 insertions(+), 6 deletions(-) create mode 100644 test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.java create mode 100644 test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 617d8ca7077..1465ea652b1 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1982,7 +1982,7 @@ public class Attr extends JCTree.Visitor { twrResult.check(resource, resource.type); //check that resource type cannot throw InterruptedException - checkAutoCloseable(resource.pos(), localEnv, resource.type); + checkAutoCloseable(localEnv, resource, true); VarSymbol var = ((JCVariableDecl) resource).sym; @@ -2031,7 +2031,9 @@ public class Attr extends JCTree.Visitor { } } - void checkAutoCloseable(DiagnosticPosition pos, Env env, Type resource) { + void checkAutoCloseable(Env env, JCTree tree, boolean useSite) { + DiagnosticPosition pos = tree.pos(); + Type resource = tree.type; if (!resource.isErroneous() && types.asSuper(resource, syms.autoCloseableType.tsym) != null && !types.isSameType(resource, syms.autoCloseableType)) { // Don't emit warning for AutoCloseable itself @@ -2049,9 +2051,15 @@ public class Attr extends JCTree.Visitor { log.popDiagnosticHandler(discardHandler); } if (close.kind == MTH && - close.overrides(syms.autoCloseableClose, resource.tsym, types, true) && + (useSite || close.owner != syms.autoCloseableType.tsym) && + ((MethodSymbol)close).binaryOverrides(syms.autoCloseableClose, resource.tsym, types) && chk.isHandled(syms.interruptedExceptionType, types.memberType(resource, close).getThrownTypes())) { - log.warning(pos, LintWarnings.TryResourceThrowsInterruptedExc(resource)); + if (!useSite && close.owner == resource.tsym) { + log.warning(TreeInfo.diagnosticPositionFor(close, tree), + LintWarnings.TryResourceCanThrowInterruptedExc(resource)); + } else { + log.warning(pos, LintWarnings.TryResourceThrowsInterruptedExc(resource)); + } } } } @@ -5649,7 +5657,7 @@ public class Attr extends JCTree.Visitor { chk.checkImplementations(tree); //check that a resource implementing AutoCloseable cannot throw InterruptedException - checkAutoCloseable(tree.pos(), env, c.type); + checkAutoCloseable(env, tree, false); for (List l = tree.defs; l.nonEmpty(); l = l.tail) { // Attribute declaration diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index d6358f6075d..4e034ff1bc8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -2368,6 +2368,11 @@ compiler.warn.try.resource.not.referenced=\ compiler.warn.try.resource.throws.interrupted.exc=\ auto-closeable resource {0} has a member method close() that could throw InterruptedException +# 0: type +# lint: try +compiler.warn.try.resource.can.throw.interrupted.exc=\ + close() method can throw InterruptedException in auto-closeable class {0} + # lint: unchecked compiler.warn.unchecked.assign=\ unchecked assignment: {0} to {1} diff --git a/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest.java b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest.java index 25dae2cc668..05317b00492 100644 --- a/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest.java +++ b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest.java @@ -228,7 +228,8 @@ public class InterruptedExceptionTest { public void report(Diagnostic diagnostic) { if (diagnostic.getKind() == Diagnostic.Kind.WARNING && - diagnostic.getCode().contains("try.resource.throws.interrupted.exc")) { + (diagnostic.getCode().contains("try.resource.throws.interrupted.exc") || + diagnostic.getCode().contains("try.resource.can.throw.interrupted.exc"))) { tryWarnFound++; } } diff --git a/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.java b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.java new file mode 100644 index 00000000000..396823789fd --- /dev/null +++ b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.java @@ -0,0 +1,256 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8155591 + * @summary Verify cases where no AutoCloseable InterruptedException warning should be generated + * @compile/ref=InterruptedExceptionTest2.out -XDrawDiagnostics -Xlint:try InterruptedExceptionTest2.java + */ + +import java.util.function.Supplier; + +// Here's an interface and a class that we can inherit declaring offending close() methods + +interface HasClose { + void close() throws Exception; +} + +class WithConcreteClose { + public void close() throws Exception { } +} + +abstract class WithAbstractClose { + public abstract void close() throws Exception; +} + +// Interface declaration tests + +interface InterruptedExceptionTest_I1 extends AutoCloseable { +} + +interface InterruptedExceptionTest_I2 extends AutoCloseable { + @Override void close(); +} + +interface InterruptedExceptionTest_I3 extends AutoCloseable { + @Override void close() throws InterruptedException; // warning here +} + +interface InterruptedExceptionTest_I4 extends AutoCloseable { + @Override void close() throws Exception; // warning here +} + +interface InterruptedExceptionTest_I5 extends AutoCloseable { + @Override default void close() { } +} + +interface InterruptedExceptionTest_I6 extends AutoCloseable { + @Override default void close() throws InterruptedException { } // warning here +} + +interface InterruptedExceptionTest_I7 extends AutoCloseable { + @Override default void close() throws Exception { } // warning here +} + +interface InterruptedExceptionTest_I8 extends HasClose, AutoCloseable { +} + +interface InterruptedExceptionTest_I9 extends HasClose, AutoCloseable { + @Override void close(); +} + +// Abstract class declaration tests + +abstract class InterruptedExceptionTest_C1 implements AutoCloseable { +} + +abstract class InterruptedExceptionTest_C2 implements AutoCloseable { + @Override public abstract void close(); +} + +abstract class InterruptedExceptionTest_C3 implements AutoCloseable { + @Override public abstract void close() throws InterruptedException; // warning here +} + +abstract class InterruptedExceptionTest_C4 implements AutoCloseable { + @Override public abstract void close() throws Exception; // warning here +} + +abstract class InterruptedExceptionTest_C5 implements AutoCloseable { + @Override public void close() { } +} + +abstract class InterruptedExceptionTest_C6 implements AutoCloseable { + @Override public void close() throws InterruptedException { } // warning here +} + +abstract class InterruptedExceptionTest_C7 implements AutoCloseable { + @Override public void close() throws Exception { } // warning here +} + +abstract class InterruptedExceptionTest_C8 implements HasClose, AutoCloseable { +} + +abstract class InterruptedExceptionTest_C9 implements HasClose, AutoCloseable { + @Override public void close() { } +} + +abstract class InterruptedExceptionTest_C10 extends WithConcreteClose implements AutoCloseable { // warning here +} + +abstract class InterruptedExceptionTest_C11 extends WithAbstractClose implements AutoCloseable { +} + +// Interface use site tests + +class UseSite_I1 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I1 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I2 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I2 t = s.get()) { + t.hashCode(); + } + } +} + +class UseSite_I3 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I3 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I4 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I4 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I5 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I5 t = s.get()) { + t.hashCode(); + } + } +} + +class UseSite_I6 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I6 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I7 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I7 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I8 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I8 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_I9 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_I9 t = s.get()) { + t.hashCode(); + } + } +} + +// Abstract class use site tests + +class UseSite_C1 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C1 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C2 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C2 t = s.get()) { + t.hashCode(); + } + } +} + +class UseSite_C3 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C3 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C4 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C4 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C5 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C5 t = s.get()) { + t.hashCode(); + } + } +} + +class UseSite_C6 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C6 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C7 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C7 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C8 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C8 t = s.get()) { // warning here + t.hashCode(); + } + } +} + +class UseSite_C9 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C9 t = s.get()) { + t.hashCode(); + } + } +} + +class UseSite_C10 { + void m(Supplier s) throws Exception { + try (InterruptedExceptionTest_C10 t = s.get()) { // warning here + t.hashCode(); + } + } +} diff --git a/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.out b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.out new file mode 100644 index 00000000000..9aae66cea5e --- /dev/null +++ b/test/langtools/tools/javac/TryWithResources/InterruptedExceptionTest2.out @@ -0,0 +1,23 @@ +InterruptedExceptionTest2.java:34:20: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_I3 +InterruptedExceptionTest2.java:38:20: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_I4 +InterruptedExceptionTest2.java:46:28: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_I6 +InterruptedExceptionTest2.java:50:28: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_I7 +InterruptedExceptionTest2.java:70:36: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_C3 +InterruptedExceptionTest2.java:74:36: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_C4 +InterruptedExceptionTest2.java:82:27: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_C6 +InterruptedExceptionTest2.java:86:27: compiler.warn.try.resource.can.throw.interrupted.exc: InterruptedExceptionTest_C7 +InterruptedExceptionTest2.java:96:10: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C10 +InterruptedExceptionTest2.java:106:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I1 +InterruptedExceptionTest2.java:122:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I3 +InterruptedExceptionTest2.java:130:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I4 +InterruptedExceptionTest2.java:146:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I6 +InterruptedExceptionTest2.java:154:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I7 +InterruptedExceptionTest2.java:162:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_I8 +InterruptedExceptionTest2.java:180:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C1 +InterruptedExceptionTest2.java:196:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C3 +InterruptedExceptionTest2.java:204:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C4 +InterruptedExceptionTest2.java:220:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C6 +InterruptedExceptionTest2.java:228:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C7 +InterruptedExceptionTest2.java:236:42: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C8 +InterruptedExceptionTest2.java:252:43: compiler.warn.try.resource.throws.interrupted.exc: InterruptedExceptionTest_C10 +22 warnings diff --git a/test/langtools/tools/javac/diags/examples/TryResourceThrowsInterruptedExc.java b/test/langtools/tools/javac/diags/examples/TryResourceThrowsInterruptedExc.java index c22992c991e..6d24a6c2a83 100644 --- a/test/langtools/tools/javac/diags/examples/TryResourceThrowsInterruptedExc.java +++ b/test/langtools/tools/javac/diags/examples/TryResourceThrowsInterruptedExc.java @@ -22,8 +22,15 @@ */ // key: compiler.warn.try.resource.throws.interrupted.exc +// key: compiler.warn.try.resource.can.throw.interrupted.exc // options: -Xlint:try class TryResourceThrowsInterruptedException implements AutoCloseable { public void close() throws InterruptedException {} + { + try (var t = new TryResourceThrowsInterruptedException()) { + t.hashCode(); + } catch (InterruptedException e) { + } + } } From 1321186547bddd3f8615cf5d110489ec383f47ab Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Thu, 6 Nov 2025 16:01:10 +0000 Subject: [PATCH 490/561] 8367943: PipedOutputStream write(0, 0) successful after close() Reviewed-by: rriggs, jpai --- .../classes/java/io/PipedOutputStream.java | 11 +++--- .../io/PipedOutputStream/WriteAfterClose.java | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/java.base/share/classes/java/io/PipedOutputStream.java b/src/java.base/share/classes/java/io/PipedOutputStream.java index bfa8f0bbb5a..4e33741721c 100644 --- a/src/java.base/share/classes/java/io/PipedOutputStream.java +++ b/src/java.base/share/classes/java/io/PipedOutputStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -129,16 +129,17 @@ public class PipedOutputStream extends OutputStream { /** * Writes {@code len} bytes from the specified byte array * starting at offset {@code off} to this piped output stream. - * This method blocks until all the bytes are written to the output - * stream. + * If {@code len} is not zero, this method blocks until all the + * bytes are written to the output stream. * * @param b {@inheritDoc} * @param off {@inheritDoc} * @param len {@inheritDoc} + * @throws IndexOutOfBoundsException {@inheritDoc} * @throws IOException if the pipe is broken, * {@link #connect(java.io.PipedInputStream) unconnected}, - * closed, or if an I/O error occurs. - * @throws IndexOutOfBoundsException {@inheritDoc} + * closed and {@code len} is greater than zero, + * or if an I/O error occurs. */ @Override public void write(byte[] b, int off, int len) throws IOException { diff --git a/test/jdk/java/io/PipedOutputStream/WriteAfterClose.java b/test/jdk/java/io/PipedOutputStream/WriteAfterClose.java index e0dfbcf169f..3314541bb97 100644 --- a/test/jdk/java/io/PipedOutputStream/WriteAfterClose.java +++ b/test/jdk/java/io/PipedOutputStream/WriteAfterClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -22,25 +22,34 @@ */ /* @test - @bug 4143704 - @summary Test if write throws exception after reader - closes the pipe. -*/ + * @bug 4143704 8367943 + * @summary Test if write throws exception after reader closes the pipe. + */ - - -import java.io.*; +import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; public class WriteAfterClose { public static void main(String argv[]) throws Exception { - PipedInputStream in = new PipedInputStream(); - PipedOutputStream out = new PipedOutputStream(in); + try (PipedInputStream in = new PipedInputStream(); + PipedOutputStream out = new PipedOutputStream(in)) { + in.close(); + try { + out.write('a'); + throw new Exception("Should not allow write after close"); + } catch (IOException e) { + } + } - in.close(); - try { - out.write('a'); - throw new Exception("Should not allow write after close"); - } catch (IOException e) { + try (PipedInputStream in = new PipedInputStream(); + PipedOutputStream out = new PipedOutputStream(in)) { + out.close(); + try { + out.write(new byte[7], 3, 0); + } catch (IOException e) { + throw new Exception("Should not fail 0-length write after close"); + } } } } From 1f08a3ede2445fb05d9700a1293d681ca89cbf5b Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Thu, 6 Nov 2025 16:01:37 +0000 Subject: [PATCH 491/561] 8355342: File.getCanonicalPath on Java 24 resolves paths on network drives to UNC format Reviewed-by: alanb --- .../classes/java/io/WinNTFileSystem.java | 17 +--- .../native/libjava/WinNTFileSystem_md.c | 35 ++----- .../windows/native/libjava/canonicalize_md.c | 97 ++++++++++++++++--- test/jdk/java/io/File/GetCanonicalPath.java | 51 +++++++++- 4 files changed, 141 insertions(+), 59 deletions(-) diff --git a/src/java.base/windows/classes/java/io/WinNTFileSystem.java b/src/java.base/windows/classes/java/io/WinNTFileSystem.java index e053f7f004c..5066374c0c9 100644 --- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java +++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java @@ -482,27 +482,12 @@ final class WinNTFileSystem extends FileSystem { return path; return "" + ((char) (c-32)) + ':' + '\\'; } - String canonicalPath = canonicalize0(path); - String finalPath = null; - try { - finalPath = getFinalPath(canonicalPath); - } catch (IOException ignored) { - finalPath = canonicalPath; - } - return finalPath; + return canonicalize0(path); } private native String canonicalize0(String path) throws IOException; - private String getFinalPath(String path) throws IOException { - return getFinalPath0(path); - } - - private native String getFinalPath0(String path) - throws IOException; - - /* -- Attribute accessors -- */ @Override diff --git a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c index 974d5c11d7e..2834a449502 100644 --- a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c +++ b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c @@ -59,7 +59,7 @@ Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls) /* -- Path operations -- */ -extern int wcanonicalize(const WCHAR *path, WCHAR *out, int len); +extern WCHAR* wcanonicalize(const WCHAR *path, WCHAR *out, int len); /** * Retrieves the fully resolved (final) path for the given path or NULL @@ -274,18 +274,23 @@ Java_java_io_WinNTFileSystem_canonicalize0(JNIEnv *env, jobject this, */ int len = (int)wcslen(path); len += currentDirLength(path, len); + WCHAR* fp; if (len > MAX_PATH_LENGTH - 1) { WCHAR *cp = (WCHAR*)malloc(len * sizeof(WCHAR)); if (cp != NULL) { - if (wcanonicalize(path, cp, len) >= 0) { - rv = (*env)->NewString(env, cp, (jsize)wcslen(cp)); + if ((fp = wcanonicalize(path, cp, len)) != NULL) { + rv = (*env)->NewString(env, fp, (jsize)wcslen(fp)); + if (fp != cp) + free(fp); } free(cp); } else { JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); } - } else if (wcanonicalize(path, canonicalPath, MAX_PATH_LENGTH) >= 0) { - rv = (*env)->NewString(env, canonicalPath, (jsize)wcslen(canonicalPath)); + } else if ((fp = wcanonicalize(path, canonicalPath, MAX_PATH_LENGTH)) != NULL) { + rv = (*env)->NewString(env, fp, (jsize)wcslen(fp)); + if (fp != canonicalPath) + free(fp); } } END_UNICODE_STRING(env, path); if (rv == NULL && !(*env)->ExceptionCheck(env)) { @@ -294,26 +299,6 @@ Java_java_io_WinNTFileSystem_canonicalize0(JNIEnv *env, jobject this, return rv; } - -JNIEXPORT jstring JNICALL -Java_java_io_WinNTFileSystem_getFinalPath0(JNIEnv* env, jobject this, jstring pathname) { - jstring rv = NULL; - - WITH_UNICODE_STRING(env, pathname, path) { - WCHAR* finalPath = getFinalPath(env, path); - if (finalPath != NULL) { - rv = (*env)->NewString(env, finalPath, (jsize)wcslen(finalPath)); - free(finalPath); - } - } END_UNICODE_STRING(env, path); - - if (rv == NULL && !(*env)->ExceptionCheck(env)) { - JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); - } - - return rv; -} - /* -- Attribute accessors -- */ /* Check whether or not the file name in "path" is a Windows reserved diff --git a/src/java.base/windows/native/libjava/canonicalize_md.c b/src/java.base/windows/native/libjava/canonicalize_md.c index 3719ec75d11..8596521509c 100644 --- a/src/java.base/windows/native/libjava/canonicalize_md.c +++ b/src/java.base/windows/native/libjava/canonicalize_md.c @@ -36,6 +36,7 @@ #include #include +#include #include /* We should also include jdk_util.h here, for the prototype of JDK_Canonicalize. @@ -82,9 +83,9 @@ wnextsep(WCHAR *start) /* Tell whether the given string contains any wildcard characters */ static int -wwild(WCHAR *start) +wwild(const WCHAR *start) { - WCHAR *p = start; + WCHAR *p = (WCHAR*)start; int c; while (c = *p) { if ((c == L'*') || (c == L'?')) @@ -146,12 +147,59 @@ lastErrorReportable() return 1; } -/* Convert a pathname to canonical form. The input orig_path is assumed to - have been converted to native form already, via JVM_NativePath(). This is - necessary because _fullpath() rejects duplicate separator characters on - Win95, though it accepts them on NT. */ -int -wcanonicalize(WCHAR *orig_path, WCHAR *result, int size) +// +// Return the final path of 'path'. If 'finalPath' is long enough, the final +// path is placed in it. If not, a new character array is allocated for the +// return value. If the return value does not equal the original 'finalPath' +// value, then the calling code might need to free the memory of the +// parameter. Non-NULL is returned on success, NULL on error. +// +WCHAR* getFinalPath(WCHAR* path, WCHAR* finalPath, DWORD size) +{ + HANDLE h = CreateFileW(path, + FILE_READ_ATTRIBUTES, + FILE_SHARE_DELETE | + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if (h != INVALID_HANDLE_VALUE) { + DWORD len = GetFinalPathNameByHandleW(h, finalPath, size, 0); + if (len >= size) { + if ((finalPath = (WCHAR*)malloc(len * sizeof(WCHAR))) == NULL) + return NULL; + len = GetFinalPathNameByHandleW(h, finalPath, len, 0); + } + CloseHandle(h); + if (len != 0) { + if (finalPath[0] == L'\\' && finalPath[1] == L'\\' && + finalPath[2] == L'?' && finalPath[3] == L'\\') + { + // Strip prefix (should be \\?\ or \\?\UNC) + int isUnc = (finalPath[4] == L'U' && + finalPath[5] == L'N' && + finalPath[6] == L'C'); + int prefixLen = (isUnc) ? 7 : 4; + // the amount to copy includes terminator + int amountToCopy = len - prefixLen + 1; + wmemmove(finalPath, finalPath + prefixLen, amountToCopy); + } + + return finalPath; + } + } + + return NULL; +} + +/* Convert a pathname to canonical form. If a reparse point is encountered + while traversing the path, then the final path is derived from the full path + and returned as the canonical pathname. + */ +WCHAR* +wcanonicalize(const WCHAR *orig_path, WCHAR *result, int size) { WIN32_FIND_DATAW fd; HANDLE h; @@ -161,11 +209,11 @@ wcanonicalize(WCHAR *orig_path, WCHAR *result, int size) /* Reject paths that contain wildcards */ if (wwild(orig_path)) { errno = EINVAL; - return -1; + return NULL; } if ((path = (WCHAR*)malloc(size * sizeof(WCHAR))) == NULL) - return -1; + return NULL; /* Collapse instances of "foo\.." and ensure absoluteness. Note that contrary to the documentation, the _fullpath procedure does not require @@ -237,6 +285,18 @@ wcanonicalize(WCHAR *orig_path, WCHAR *result, int size) if (h != INVALID_HANDLE_VALUE) { /* Lookup succeeded; append true name to result and continue */ FindClose(h); + + // If a reparse point is encountered, get the final path. + if ((fd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0) { + // Do not fail if the final path cannot be obtained as the + // canonicalization may still be otherwise correct + WCHAR* fp = NULL; + if ((fp = getFinalPath(path, result, size)) != NULL) { + free(path); + return fp; + } + } + if (!(dst = wcp(dst, dend, L'\\', fd.cFileName, fd.cFileName + wcslen(fd.cFileName)))){ goto err; @@ -261,11 +321,11 @@ wcanonicalize(WCHAR *orig_path, WCHAR *result, int size) } *dst = L'\0'; free(path); - return 0; + return result; err: free(path); - return -1; + return NULL; } /* Non-Wide character version of canonicalize. @@ -274,6 +334,7 @@ JNIEXPORT int JDK_Canonicalize(const char *orig, char *out, int len) { wchar_t* wpath = NULL; wchar_t* wresult = NULL; + wchar_t* wcanon = NULL; int wpath_len; int ret = -1; @@ -297,12 +358,12 @@ JDK_Canonicalize(const char *orig, char *out, int len) { goto finish; } - if (wcanonicalize(wpath, wresult, len) != 0) { + if ((wcanon = wcanonicalize(wpath, wresult, len)) == NULL) { goto finish; } if (WideCharToMultiByte(CP_ACP, 0, - wresult, -1, out, len, NULL, NULL) == 0) { + wcanon, -1, out, len, NULL, NULL) == 0) { goto finish; } @@ -310,8 +371,12 @@ JDK_Canonicalize(const char *orig, char *out, int len) { ret = 0; finish: - free(wresult); - free(wpath); + if (wcanon != NULL && wcanon != wresult) + free(wcanon); + if (wresult != NULL) + free(wresult); + if (wpath != NULL) + free(wpath); return ret; } diff --git a/test/jdk/java/io/File/GetCanonicalPath.java b/test/jdk/java/io/File/GetCanonicalPath.java index d69e90fbbfc..14ef90260fc 100644 --- a/test/jdk/java/io/File/GetCanonicalPath.java +++ b/test/jdk/java/io/File/GetCanonicalPath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -22,7 +22,7 @@ */ /* @test - * @bug 4899022 8003887 + * @bug 4899022 8003887 8355342 * @summary Look for erroneous representation of drive letter * @run junit GetCanonicalPath */ @@ -33,6 +33,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.stream.Stream; import org.junit.jupiter.api.Assumptions; @@ -127,6 +128,52 @@ public class GetCanonicalPath { assertFalse(path.length() > 3, "Drive letter incorrectly represented"); } + @Test + @EnabledOnOs(OS.WINDOWS) + void mappedDrive() throws IOException { + // find the first unused drive letter + char drive = '['; + var roots = Set.of(new File(".").listRoots()); + for (int i = 4; i < 26; i++) { + char c = (char)('A' + i); + if (!roots.contains(new File(c + ":\\"))) { + drive = c; + break; + } + } + assertFalse(drive == '['); // '[' is next after 'Z' + + // map the first unused drive letter to the cwd + String cwd = System.getProperty("user.dir"); + Runtime rt = Runtime.getRuntime(); + String share = + "\\\\localhost\\" + cwd.charAt(0) + "$" + cwd.substring(2); + try { + Process p = rt.exec(new String[] {"net", "use", drive + ":", share}); + assertEquals(0, p.waitFor()); + } catch (InterruptedException x) { + fail(x); + } + + // check that the canonical path name and its content are as expected + try { + final String filename = "file.txt"; + final String text = "This is some text"; + Files.writeString(Path.of(share, filename), text); + File file = new File(drive + ":\\" + filename); + String canonicalPath = file.getCanonicalPath(); + assertEquals(drive + ":\\" + filename, canonicalPath); + assertEquals(text, Files.readString(Path.of(canonicalPath))); + } finally { + try { + Process p = rt.exec(new String[] {"net", "use", drive + ":", "/Delete"}); + assertEquals(0, p.waitFor()); + } catch (InterruptedException x) { + fail(x); + } + } + } + // Create a File with the given pathname and return the File as a Path private static Path createFile(String pathname) throws IOException { File file = new File(pathname); From c272aca8a0a2720365159684bed35c0c31e8778f Mon Sep 17 00:00:00 2001 From: EunHyunsu Date: Thu, 6 Nov 2025 16:13:34 +0000 Subject: [PATCH 492/561] 8371091: Improve the exception message of NullPointerException thrown by the methods in the default implementation of HttpRequest.Builder Reviewed-by: dfuchs --- .../net/http/HttpRequestBuilderImpl.java | 8 ++-- .../net/httpclient/RequestBuilderTest.java | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java b/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java index c68965626b7..ef0e2b152bb 100644 --- a/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java +++ b/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java @@ -203,7 +203,7 @@ public class HttpRequestBuilderImpl implements HttpRequest.Builder { @Override public HttpRequest.Builder POST(BodyPublisher body) { - return method0("POST", requireNonNull(body)); + return method0("POST", requireNonNull(body, "BodyPublisher must be non-null")); } @Override @@ -218,12 +218,12 @@ public class HttpRequestBuilderImpl implements HttpRequest.Builder { @Override public HttpRequest.Builder PUT(BodyPublisher body) { - return method0("PUT", requireNonNull(body)); + return method0("PUT", requireNonNull(body, "BodyPublisher must be non-null")); } @Override public HttpRequest.Builder method(String method, BodyPublisher body) { - requireNonNull(method); + requireNonNull(method, "HTTP method must be non-null"); if (method.isEmpty()) throw newIAE("illegal method "); if (method.equals("CONNECT")) @@ -234,7 +234,7 @@ public class HttpRequestBuilderImpl implements HttpRequest.Builder { .replace("\r", "\\r") .replace("\t", "\\t") + "\""); - return method0(method, requireNonNull(body)); + return method0(method, requireNonNull(body, "BodyPublisher must be non-null")); } private HttpRequest.Builder method0(String method, BodyPublisher body) { diff --git a/test/jdk/java/net/httpclient/RequestBuilderTest.java b/test/jdk/java/net/httpclient/RequestBuilderTest.java index 97f4793d63c..a83c12f592e 100644 --- a/test/jdk/java/net/httpclient/RequestBuilderTest.java +++ b/test/jdk/java/net/httpclient/RequestBuilderTest.java @@ -486,4 +486,41 @@ public class RequestBuilderTest { assertNotEquals(builder.build(), newBuilder(uri).header("x", "Z").build()); assertNotEquals(builder.build(), newBuilder(uri).header("z", "y").build()); } + + @Test + public void testNullMessages() { + HttpRequest.Builder builder = HttpRequest.newBuilder(); + + try { + builder.method(null, null); + fail("builder.method(null, null) should have thrown NullPointerException"); + } catch (NullPointerException e) { + assertTrue(e.getMessage().contains("HTTP method"), + "Expected exception message to contain 'HTTP method', but got: " + e.getMessage()); + } + + try { + builder.POST(null); + fail("builder.POST(null) should have thrown NullPointerException"); + } catch (NullPointerException e) { + assertTrue(e.getMessage().contains("BodyPublisher"), + "Expected exception message to contain 'BodyPublisher', but got: " + e.getMessage()); + } + + try { + builder.PUT(null); + fail("builder.PUT(null) should have thrown NullPointerException"); + } catch (NullPointerException e) { + assertTrue(e.getMessage().contains("BodyPublisher"), + "Expected exception message to contain 'BodyPublisher', but got: " + e.getMessage()); + } + + try { + builder.method("PATCH", null); + fail("builder.method(\"PATCH\", null) should have thrown NullPointerException"); + } catch (NullPointerException e) { + assertTrue(e.getMessage().contains("BodyPublisher"), + "Expected exception message to contain 'BodyPublisher', but got: " + e.getMessage()); + } + } } From 0026967e030fd4557b5365870d55f863fe2a4512 Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Thu, 6 Nov 2025 17:12:49 +0000 Subject: [PATCH 493/561] 8370420: HostLocaleProviderAdapter_md.c from libjava can use GetLocaleInfoEx, GetCalendarInfoEx, EnumCalendarInfoExEx directly Reviewed-by: naoto, mbaesken, bpb --- .../HostLocaleProviderAdapterImpl.java | 29 +++---- .../libjava/HostLocaleProviderAdapter_md.c | 82 ++++--------------- 2 files changed, 27 insertions(+), 84 deletions(-) diff --git a/src/java.base/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java b/src/java.base/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java index abc62d79bb1..5aa8431d859 100644 --- a/src/java.base/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java +++ b/src/java.base/windows/classes/sun/util/locale/provider/HostLocaleProviderAdapterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2020, 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. * * This code is free software; you can redistribute it and/or modify it @@ -116,22 +116,18 @@ public class HostLocaleProviderAdapterImpl { private static final String nativeDisplayLanguage; static { Set tmpSet = new HashSet<>(); - if (initialize()) { - // Assuming the default locales do not include any extensions, so - // no stripping is needed here. - Control c = Control.getNoFallbackControl(Control.FORMAT_DEFAULT); - String displayLocale = getDefaultLocale(CAT_DISPLAY); - Locale l = Locale.forLanguageTag(displayLocale.replace('_', '-')); - tmpSet.addAll(c.getCandidateLocales("", l)); - nativeDisplayLanguage = l.getLanguage(); + // Assuming the default locales do not include any extensions, so + // no stripping is needed here. + Control c = Control.getNoFallbackControl(Control.FORMAT_DEFAULT); + String displayLocale = getDefaultLocale(CAT_DISPLAY); + Locale l = Locale.forLanguageTag(displayLocale.replace('_', '-')); + tmpSet.addAll(c.getCandidateLocales("", l)); + nativeDisplayLanguage = l.getLanguage(); - String formatLocale = getDefaultLocale(CAT_FORMAT); - if (!formatLocale.equals(displayLocale)) { - l = Locale.forLanguageTag(formatLocale.replace('_', '-')); - tmpSet.addAll(c.getCandidateLocales("", l)); - } - } else { - nativeDisplayLanguage = ""; + String formatLocale = getDefaultLocale(CAT_FORMAT); + if (!formatLocale.equals(displayLocale)) { + l = Locale.forLanguageTag(formatLocale.replace('_', '-')); + tmpSet.addAll(c.getCandidateLocales("", l)); } supportedLocaleSet = Collections.unmodifiableSet(tmpSet); } @@ -850,7 +846,6 @@ public class HostLocaleProviderAdapterImpl { // native methods // initialize - private static native boolean initialize(); private static native String getDefaultLocale(int cat); // For DateFormatProvider diff --git a/src/java.base/windows/native/libjava/HostLocaleProviderAdapter_md.c b/src/java.base/windows/native/libjava/HostLocaleProviderAdapter_md.c index bf399a68894..b50dca85bf7 100644 --- a/src/java.base/windows/native/libjava/HostLocaleProviderAdapter_md.c +++ b/src/java.base/windows/native/libjava/HostLocaleProviderAdapter_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -39,15 +39,6 @@ #define CALENDAR_STYLE_SHORT_MASK 0x00000001 // Calendar.SHORT #define CALENDAR_STYLE_STANDALONE_MASK 0x00008000 // Calendar.STANDALONE -// global variables -typedef int (WINAPI *PGLIE)(const jchar *, LCTYPE, LPWSTR, int); -typedef int (WINAPI *PGCIE)(const jchar *, CALID, LPCWSTR, CALTYPE, LPWSTR, int, LPDWORD); -typedef int (WINAPI *PECIEE)(CALINFO_ENUMPROCEXEX, const jchar *, CALID, LPCWSTR, CALTYPE, LPARAM); -PGLIE pGetLocaleInfoEx; -PGCIE pGetCalendarInfoEx; -PECIEE pEnumCalendarInfoExEx; -BOOL initialized = FALSE; - // prototypes int getLocaleInfoWrapper(const jchar *langtag, LCTYPE type, LPWSTR data, int buflen); int getCalendarInfoWrapper(const jchar *langtag, CALID id, LPCWSTR reserved, CALTYPE type, LPWSTR data, int buflen, LPDWORD val); @@ -178,31 +169,6 @@ WCHAR * fixes[2][2][3][16] = } }; -/* - * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl - * Method: initialize - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_initialize - (JNIEnv *env, jclass cls) { - if (!initialized) { - pGetLocaleInfoEx = (PGLIE)GetProcAddress( - GetModuleHandle("kernel32.dll"), - "GetLocaleInfoEx"); - pGetCalendarInfoEx = (PGCIE)GetProcAddress( - GetModuleHandle("kernel32.dll"), - "GetCalendarInfoEx"); - pEnumCalendarInfoExEx = (PECIEE)GetProcAddress( - GetModuleHandle("kernel32.dll"), - "EnumCalendarInfoExEx"); - initialized =TRUE; - } - - return pGetLocaleInfoEx != NULL && - pGetCalendarInfoEx != NULL && - pEnumCalendarInfoExEx != NULL; -} - /* * Class: sun_util_locale_provider_HostLocaleProviderAdapterImpl * Method: getDefaultLocale @@ -768,34 +734,20 @@ JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapte } int getLocaleInfoWrapper(const jchar *langtag, LCTYPE type, LPWSTR data, int buflen) { - if (pGetLocaleInfoEx) { - if (wcscmp(L"und", (LPWSTR)langtag) == 0) { - // defaults to "en" - return pGetLocaleInfoEx(L"en", type, data, buflen); - } else { - return pGetLocaleInfoEx((LPWSTR)langtag, type, data, buflen); - } + if (wcscmp(L"und", (LPWSTR)langtag) == 0) { + // defaults to "en" + return GetLocaleInfoEx(L"en", type, data, buflen); } else { - // If we ever wanted to support WinXP, we will need extra module from - // MS... - // return GetLocaleInfo(DownlevelLocaleNameToLCID(langtag, 0), type, data, buflen); - return 0; + return GetLocaleInfoEx((LPWSTR)langtag, type, data, buflen); } } int getCalendarInfoWrapper(const jchar *langtag, CALID id, LPCWSTR reserved, CALTYPE type, LPWSTR data, int buflen, LPDWORD val) { - if (pGetCalendarInfoEx) { - if (wcscmp(L"und", (LPWSTR)langtag) == 0) { - // defaults to "en" - return pGetCalendarInfoEx(L"en", id, reserved, type, data, buflen, val); - } else { - return pGetCalendarInfoEx((LPWSTR)langtag, id, reserved, type, data, buflen, val); - } + if (wcscmp(L"und", (LPWSTR)langtag) == 0) { + // defaults to "en" + return GetCalendarInfoEx(L"en", id, reserved, type, data, buflen, val); } else { - // If we ever wanted to support WinXP, we will need extra module from - // MS... - // return GetCalendarInfo(DownlevelLocaleNameToLCID(langtag, 0), ...); - return 0; + return GetCalendarInfoEx((LPWSTR)langtag, id, reserved, type, data, buflen, val); } } @@ -1000,17 +952,13 @@ void getFixPart(const jchar * langtag, const jint numberStyle, BOOL positive, BO } int enumCalendarInfoWrapper(const jchar *langtag, CALID calid, CALTYPE type, LPWSTR buf, int buflen) { - if (pEnumCalendarInfoExEx) { - if (wcscmp(L"und", (LPWSTR)langtag) == 0) { - // defaults to "en" - return pEnumCalendarInfoExEx(&EnumCalendarInfoProc, L"en", - calid, NULL, type, (LPARAM)buf); - } else { - return pEnumCalendarInfoExEx(&EnumCalendarInfoProc, langtag, - calid, NULL, type, (LPARAM)buf); - } + if (wcscmp(L"und", (LPWSTR)langtag) == 0) { + // defaults to "en" + return EnumCalendarInfoExEx(&EnumCalendarInfoProc, L"en", + calid, NULL, type, (LPARAM)buf); } else { - return 0; + return EnumCalendarInfoExEx(&EnumCalendarInfoProc, langtag, + calid, NULL, type, (LPARAM)buf); } } From 4445a8e3f5cac6738b7984716c867dcf9780fe0a Mon Sep 17 00:00:00 2001 From: Nityanand Rai Date: Thu, 6 Nov 2025 17:25:59 +0000 Subject: [PATCH 494/561] 8369323: Fix typos in vmTestbase/.../Concurrent.java Reviewed-by: wkemper, phh, lmesnik, shade, syan --- .../vm/gc/concurrent/Concurrent.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/hotspot/jtreg/vmTestbase/vm/gc/concurrent/Concurrent.java b/test/hotspot/jtreg/vmTestbase/vm/gc/concurrent/Concurrent.java index 5fa7fe3e1d8..1ea07c8e4b2 100644 --- a/test/hotspot/jtreg/vmTestbase/vm/gc/concurrent/Concurrent.java +++ b/test/hotspot/jtreg/vmTestbase/vm/gc/concurrent/Concurrent.java @@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -79,7 +79,7 @@ class Forest { treeHeight = Memory.balancedTreeHeightFromMemory(size / ntrees, (int) new TreeNode(nodeGarbageSize).getTotalSize()); } - log.debug("The expected forest paramteres: tree height = " + treeHeight + " number of trees = " + ntrees + log.debug("The expected forest parameters: tree height = " + treeHeight + " number of trees = " + ntrees + " size = " + new TreeNode(nodeGarbageSize).getTotalSize()); Tree[] localTrees = new Tree[ntrees * 4]; Lock[] localLocks = new Lock[ntrees * 4]; @@ -104,7 +104,7 @@ class Forest { instance.where = new AtomicCycleInteger(instance.trees.length); instance.nodeGarbageSize = nodeGarbageSize; - log.debug("The forest real paramteres: tree height = " + treeHeight + " number of trees = " + instance.trees.length + log.debug("The forest real parameters: tree height = " + treeHeight + " number of trees = " + instance.trees.length + " number of nodes = " + allNodesCount); log.debug("Approximate node size = " + nodeSize + " calc = " + instance.trees[0].getRoot().getSize()); return instance; @@ -140,12 +140,12 @@ class Forest { int h2 = root.getShortestPath(); if ((h1 != treeHeight) || (h2 != treeHeight)) { throw new TestFailure("The tree is not balanced expected " + treeHeight - + " value = " + h1 + " shortedtPath = " + h2); + + " value = " + h1 + " shortestPath = " + h2); } } // Swap subtrees in 2 trees, the path is used - // as sequence of 1-0 to select subtree (left-reight sequence) + // as sequence of 1-0 to select subtree (left-right sequence) static void swapSubtrees(Tree t1, Tree t2, int depth, int path) { TreeNode tn1 = t1.getRoot(); TreeNode tn2 = t2.getRoot(); @@ -210,7 +210,7 @@ class Forest { } } - // the index in tree array which should be chnaged during next regeneration + // the index in tree array which should be changed during next regeneration AtomicCycleInteger where = null; // generate new full and partial trees in our forest @@ -276,10 +276,10 @@ public class Concurrent extends ThreadedGCTest implements GarbageProducerAware, // Heap as tree Forest forest; - // GP for old gargbage production + // GP for old garbage production GarbageProducer gpOld; - // GP for young gargbage production + // GP for young garbage production GarbageProducer gpYoung; MemoryStrategy ms; @@ -322,7 +322,7 @@ public class Concurrent extends ThreadedGCTest implements GarbageProducerAware, // young garbage in percent and absolute private static int youngPercent = 0; long youngGarbageSize; - // mutation rate (parcent and absolute trees) + // mutation rate (percent and absolute trees) private static int ptrMutRate = 50; long mutateTrees; // percent of heap to occupy by forest (long live garbage) From 9cc542ebcb81552fe8c32a8cc3c63332853e5127 Mon Sep 17 00:00:00 2001 From: Xiaolong Peng Date: Thu, 6 Nov 2025 18:57:52 +0000 Subject: [PATCH 495/561] 8370850: Shenandoah: Simplify collector allocation to save unnecessary region iteration Reviewed-by: wkemper --- .../share/gc/shenandoah/shenandoahFreeSet.cpp | 74 +++++++------------ .../share/gc/shenandoah/shenandoahFreeSet.hpp | 17 ++--- 2 files changed, 32 insertions(+), 59 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp index 8dccf5a057c..0deb3b5ba4c 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.cpp @@ -1265,22 +1265,13 @@ void ShenandoahFreeSet::add_promoted_in_place_region_to_old_collector(Shenandoah _partitions.assert_bounds(true); } -HeapWord* ShenandoahFreeSet::allocate_from_partition_with_affiliation(ShenandoahAffiliation affiliation, - ShenandoahAllocRequest& req, bool& in_new_region) { - - shenandoah_assert_heaplocked(); - ShenandoahFreeSetPartitionId which_partition = req.is_old()? ShenandoahFreeSetPartitionId::OldCollector: ShenandoahFreeSetPartitionId::Collector; - if (_partitions.alloc_from_left_bias(which_partition)) { - ShenandoahLeftRightIterator iterator(&_partitions, which_partition, affiliation == ShenandoahAffiliation::FREE); - return allocate_with_affiliation(iterator, affiliation, req, in_new_region); - } else { - ShenandoahRightLeftIterator iterator(&_partitions, which_partition, affiliation == ShenandoahAffiliation::FREE); - return allocate_with_affiliation(iterator, affiliation, req, in_new_region); - } -} - template -HeapWord* ShenandoahFreeSet::allocate_with_affiliation(Iter& iterator, ShenandoahAffiliation affiliation, ShenandoahAllocRequest& req, bool& in_new_region) { +HeapWord* ShenandoahFreeSet::allocate_with_affiliation(Iter& iterator, + ShenandoahAffiliation affiliation, + ShenandoahAllocRequest& req, + bool& in_new_region) { + assert(affiliation != ShenandoahAffiliation::FREE, "Must not"); + ShenandoahHeapRegion* free_region = nullptr; for (idx_t idx = iterator.current(); iterator.has_next(); idx = iterator.next()) { ShenandoahHeapRegion* r = _heap->get_region(idx); if (r->affiliation() == affiliation) { @@ -1288,8 +1279,16 @@ HeapWord* ShenandoahFreeSet::allocate_with_affiliation(Iter& iterator, Shenandoa if (result != nullptr) { return result; } + } else if (free_region == nullptr && r->affiliation() == FREE) { + free_region = r; } } + // Failed to allocate within any affiliated region, try the first free region in the partition. + if (free_region != nullptr) { + HeapWord* result = try_allocate_in(free_region, req, in_new_region); + assert(result != nullptr, "Allocate in free region in the partition always succeed."); + return result; + } log_debug(gc, free)("Could not allocate collector region with affiliation: %s for request " PTR_FORMAT, shenandoah_affiliation_name(affiliation), p2i(&req)); return nullptr; @@ -1391,20 +1390,19 @@ HeapWord* ShenandoahFreeSet::allocate_from_regions(Iter& iterator, ShenandoahAll } HeapWord* ShenandoahFreeSet::allocate_for_collector(ShenandoahAllocRequest &req, bool &in_new_region) { - // Fast-path: try to allocate in the collector view first - HeapWord* result; - result = allocate_from_partition_with_affiliation(req.affiliation(), req, in_new_region); - if (result != nullptr) { - return result; + shenandoah_assert_heaplocked(); + ShenandoahFreeSetPartitionId which_partition = req.is_old()? ShenandoahFreeSetPartitionId::OldCollector: ShenandoahFreeSetPartitionId::Collector; + HeapWord* result = nullptr; + if (_partitions.alloc_from_left_bias(which_partition)) { + ShenandoahLeftRightIterator iterator(&_partitions, which_partition); + result = allocate_with_affiliation(iterator, req.affiliation(), req, in_new_region); + } else { + ShenandoahRightLeftIterator iterator(&_partitions, which_partition); + result = allocate_with_affiliation(iterator, req.affiliation(), req, in_new_region); } - bool allow_new_region = can_allocate_in_new_region(req); - if (allow_new_region) { - // Try a free region that is dedicated to GC allocations. - result = allocate_from_partition_with_affiliation(ShenandoahAffiliation::FREE, req, in_new_region); - if (result != nullptr) { - return result; - } + if (result != nullptr) { + return result; } // No dice. Can we borrow space from mutator view? @@ -1412,17 +1410,7 @@ HeapWord* ShenandoahFreeSet::allocate_for_collector(ShenandoahAllocRequest &req, return nullptr; } - if (!allow_new_region && req.is_old() && (_heap->young_generation()->free_unaffiliated_regions() > 0)) { - // This allows us to flip a mutator region to old_collector - allow_new_region = true; - } - - // We should expand old-gen if this can prevent an old-gen evacuation failure. We don't care so much about - // promotion failures since they can be mitigated in a subsequent GC pass. Would be nice to know if this - // allocation request is for evacuation or promotion. Individual threads limit their use of PLAB memory for - // promotions, so we already have an assurance that any additional memory set aside for old-gen will be used - // only for old-gen evacuations. - if (allow_new_region) { + if (_partitions.get_empty_region_counts(ShenandoahFreeSetPartitionId::Mutator) > 0) { // Try to steal an empty region from the mutator view. result = try_allocate_from_mutator(req, in_new_region); } @@ -1432,16 +1420,6 @@ HeapWord* ShenandoahFreeSet::allocate_for_collector(ShenandoahAllocRequest &req, return result; } -bool ShenandoahFreeSet::can_allocate_in_new_region(const ShenandoahAllocRequest& req) { - if (!_heap->mode()->is_generational()) { - return true; - } - - assert(req.is_old() || req.is_young(), "Should request affiliation"); - return (req.is_old() && _heap->old_generation()->free_unaffiliated_regions() > 0) - || (req.is_young() && _heap->young_generation()->free_unaffiliated_regions() > 0); -} - HeapWord* ShenandoahFreeSet::try_allocate_from_mutator(ShenandoahAllocRequest& req, bool& in_new_region) { // The collector prefers to keep longer lived regions toward the right side of the heap, so it always // searches for regions from right to left here. diff --git a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp index 11d93bf094a..5cc9eab7b4b 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahFreeSet.hpp @@ -446,11 +446,6 @@ private: HeapWord* allocate_aligned_plab(size_t size, ShenandoahAllocRequest& req, ShenandoahHeapRegion* r); - // Return the address of memory allocated, setting in_new_region to true iff the allocation is taken - // from a region that was previously empty. Return nullptr if memory could not be allocated. - inline HeapWord* allocate_from_partition_with_affiliation(ShenandoahAffiliation affiliation, - ShenandoahAllocRequest& req, bool& in_new_region); - // We re-evaluate the left-to-right allocation bias whenever _alloc_bias_weight is less than zero. Each time // we allocate an object, we decrement the count of this value. Each time we re-evaluate whether to allocate // from right-to-left or left-to-right, we reset the value of this counter to _InitialAllocBiasWeight. @@ -601,13 +596,13 @@ private: // Handle allocation for collector (for evacuation). HeapWord* allocate_for_collector(ShenandoahAllocRequest& req, bool& in_new_region); - // Search for allocation in region with same affiliation as request, using given iterator. + // Search for allocation in region with same affiliation as request, using given iterator, + // or affiliate the first usable FREE region with given affiliation and allocate in. template - HeapWord* allocate_with_affiliation(Iter& iterator, ShenandoahAffiliation affiliation, - ShenandoahAllocRequest& req, bool& in_new_region); - - // Return true if the respective generation for this request has free regions. - bool can_allocate_in_new_region(const ShenandoahAllocRequest& req); + HeapWord* allocate_with_affiliation(Iter& iterator, + ShenandoahAffiliation affiliation, + ShenandoahAllocRequest& req, + bool& in_new_region); // Attempt to allocate memory for an evacuation from the mutator's partition. HeapWord* try_allocate_from_mutator(ShenandoahAllocRequest& req, bool& in_new_region); From cad73d39762974776dd6fda5efe4e2a271d69f14 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Thu, 6 Nov 2025 19:37:44 +0000 Subject: [PATCH 496/561] 8370041: GenShen: Filter young pointers from thread local SATB buffers when only marking old Reviewed-by: ysr, kdnilsen --- .../gc/shenandoah/shenandoahClosures.hpp | 12 +- .../shenandoah/shenandoahClosures.inline.hpp | 4 + .../gc/shenandoah/shenandoahConcurrentGC.cpp | 92 +++++++------- .../shenandoah/shenandoahConcurrentMark.cpp | 16 +-- .../gc/shenandoah/shenandoahDegeneratedGC.cpp | 23 ++-- .../shenandoah/shenandoahGenerationalHeap.cpp | 6 - .../share/gc/shenandoah/shenandoahHeap.cpp | 4 + .../gc/shenandoah/shenandoahOldGeneration.cpp | 117 +----------------- .../gc/shenandoah/shenandoahOldGeneration.hpp | 37 +++--- .../shenandoah/shenandoahSATBMarkQueueSet.cpp | 27 +++- .../shenandoah/shenandoahSATBMarkQueueSet.hpp | 20 ++- 11 files changed, 134 insertions(+), 224 deletions(-) diff --git a/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp b/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp index 0c223ee3128..fefed0340c4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahClosures.hpp @@ -24,7 +24,6 @@ #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHCLOSURES_HPP #define SHARE_GC_SHENANDOAH_SHENANDOAHCLOSURES_HPP -#include "code/nmethod.hpp" #include "gc/shared/stringdedup/stringDedup.hpp" #include "gc/shenandoah/shenandoahGenerationType.hpp" #include "gc/shenandoah/shenandoahTaskqueue.hpp" @@ -230,6 +229,17 @@ public: }; +class ShenandoahFlushSATB : public ThreadClosure { +private: + SATBMarkQueueSet& _satb_qset; + +public: + explicit ShenandoahFlushSATB(SATBMarkQueueSet& satb_qset) : _satb_qset(satb_qset) {} + + inline void do_thread(Thread* thread) override; +}; + + // // ========= Utilities // diff --git a/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp b/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp index 427eaad26ce..e8d25b1e5a9 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp @@ -253,6 +253,10 @@ inline void ShenandoahConcUpdateRefsClosure::work(T* p) { _heap->conc_update_with_forwarded(p); } +inline void ShenandoahFlushSATB::do_thread(Thread* thread) { + // Transfer any partial buffer to the qset for completed buffer processing. + _satb_qset.flush_queue(ShenandoahThreadLocalData::satb_mark_queue(thread)); +} // // ========= Utilities diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp index 9613422496a..cee8727a3f4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp @@ -279,21 +279,6 @@ bool ShenandoahConcurrentGC::complete_abbreviated_cycle() { heap->update_region_ages(_generation->complete_marking_context()); } - if (!heap->is_concurrent_old_mark_in_progress()) { - heap->concurrent_final_roots(); - } else { - // Since the cycle was shortened for having enough immediate garbage, this will be - // the last phase before concurrent marking of old resumes. We must be sure - // that old mark threads don't see any pointers to garbage in the SATB queues. Even - // though nothing was evacuated, overwriting unreachable weak roots with null may still - // put pointers to regions that become trash in the SATB queues. The following will - // piggyback flushing the thread local SATB queues on the same handshake that propagates - // the gc state change. - ShenandoahSATBMarkQueueSet& satb_queues = ShenandoahBarrierSet::satb_mark_queue_set(); - ShenandoahFlushSATBHandshakeClosure complete_thread_local_satb_buffers(satb_queues); - heap->concurrent_final_roots(&complete_thread_local_satb_buffers); - heap->old_generation()->concurrent_transfer_pointers_from_satb(); - } return true; } @@ -684,16 +669,10 @@ void ShenandoahConcurrentGC::op_init_mark() { assert(!heap->has_forwarded_objects(), "No forwarded objects on this path"); if (heap->mode()->is_generational()) { - if (_generation->is_global()) { heap->old_generation()->cancel_gc(); - } else if (heap->is_concurrent_old_mark_in_progress()) { - // Purge the SATB buffers, transferring any valid, old pointers to the - // old generation mark queue. Any pointers in a young region will be - // abandoned. - ShenandoahGCPhase phase(ShenandoahPhaseTimings::init_transfer_satb); - heap->old_generation()->transfer_pointers_from_satb(); } + { // After we swap card table below, the write-table is all clean, and the read table holds // cards dirty prior to the start of GC. Young and bootstrap collection will update @@ -1131,7 +1110,7 @@ private: ShenandoahNonConcUpdateRefsClosure _cl; public: ShenandoahUpdateThreadHandshakeClosure(); - void do_thread(Thread* thread); + void do_thread(Thread* thread) override; }; ShenandoahUpdateThreadHandshakeClosure::ShenandoahUpdateThreadHandshakeClosure() : @@ -1146,9 +1125,49 @@ void ShenandoahUpdateThreadHandshakeClosure::do_thread(Thread* thread) { } } +class ShenandoahUpdateThreadRootsAndFlushOldSatbBuffers final : public HandshakeClosure { + // When Shenandoah is marking the old generation, it is possible for the SATB barrier + // to pick up overwritten pointers that point into a cset region. If these pointers + // are accessed by mark threads, they will crash. Once update refs has completed, it is + // no longer possible for a mutator thread to overwrite a pointer into a cset region. + // + // Therefore, at the end of update refs, we use this closure to update the thread roots + // and 'complete' all the thread local SATB buffers. Completing these will filter out + // anything that has already been marked or anything that points to a region which is + // not old. We do not need to worry about ABA situations where a region may become old + // after the pointer is enqueued but before it is filtered. There are only two ways a + // region may become old: + // 1. The region is promoted in place. This is safe because such regions will never + // be in the collection set. If this happens, the pointer will be preserved, essentially + // becoming part of the old snapshot. + // 2. The region is allocated during evacuation of old. This is also not a concern because + // we haven't yet finished marking old so no mixed evacuations will happen. + ShenandoahUpdateThreadHandshakeClosure _update_roots; + ShenandoahFlushSATB _flush_all_satb; + +public: + ShenandoahUpdateThreadRootsAndFlushOldSatbBuffers() : + HandshakeClosure("Shenandoah Update Thread Roots and Flush SATB"), + _flush_all_satb(ShenandoahBarrierSet::satb_mark_queue_set()) { + assert(ShenandoahBarrierSet::satb_mark_queue_set().get_filter_out_young(), + "Should be filtering pointers outside of old during old marking"); + } + + void do_thread(Thread* thread) override { + _update_roots.do_thread(thread); + _flush_all_satb.do_thread(thread); + } +}; + void ShenandoahConcurrentGC::op_update_thread_roots() { - ShenandoahUpdateThreadHandshakeClosure cl; - Handshake::execute(&cl); + ShenandoahHeap* const heap = ShenandoahHeap::heap(); + if (heap->is_concurrent_old_mark_in_progress()) { + ShenandoahUpdateThreadRootsAndFlushOldSatbBuffers cl; + Handshake::execute(&cl); + } else { + ShenandoahUpdateThreadHandshakeClosure cl; + Handshake::execute(&cl); + } } void ShenandoahConcurrentGC::op_final_update_refs() { @@ -1177,23 +1196,6 @@ void ShenandoahConcurrentGC::op_final_update_refs() { heap->set_has_forwarded_objects(false); if (heap->mode()->is_generational() && heap->is_concurrent_old_mark_in_progress()) { - // When the SATB barrier is left on to support concurrent old gen mark, it may pick up writes to - // objects in the collection set. After those objects are evacuated, the pointers in the - // SATB are no longer safe. Once we have finished update references, we are guaranteed that - // no more writes to the collection set are possible. - // - // This will transfer any old pointers in _active_ regions from the SATB to the old gen - // mark queues. All other pointers will be discarded. This would also discard any pointers - // in old regions that were included in a mixed evacuation. We aren't using the SATB filter - // methods here because we cannot control when they execute. If the SATB filter runs _after_ - // a region has been recycled, we will not be able to detect the bad pointer. - // - // We are not concerned about skipping this step in abbreviated cycles because regions - // with no live objects cannot have been written to and so cannot have entries in the SATB - // buffers. - ShenandoahGCPhase phase(ShenandoahPhaseTimings::final_update_refs_transfer_satb); - heap->old_generation()->transfer_pointers_from_satb(); - // Aging_cycle is only relevant during evacuation cycle for individual objects and during final mark for // entire regions. Both of these relevant operations occur before final update refs. ShenandoahGenerationalHeap::heap()->set_aging_cycle(false); @@ -1228,13 +1230,13 @@ bool ShenandoahConcurrentGC::entry_final_roots() { ShenandoahWorkerPolicy::calc_workers_for_conc_evac(), msg); - if (!heap->mode()->is_generational()) { - heap->concurrent_final_roots(); - } else { + if (heap->mode()->is_generational()) { if (!complete_abbreviated_cycle()) { return false; } } + + heap->concurrent_final_roots(); return true; } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp index 7a195f64cbd..367a15abfa4 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahConcurrentMark.cpp @@ -66,20 +66,6 @@ public: } }; -class ShenandoahSATBAndRemarkThreadsClosure : public ThreadClosure { -private: - SATBMarkQueueSet& _satb_qset; - -public: - explicit ShenandoahSATBAndRemarkThreadsClosure(SATBMarkQueueSet& satb_qset) : - _satb_qset(satb_qset) {} - - void do_thread(Thread* thread) override { - // Transfer any partial buffer to the qset for completed buffer processing. - _satb_qset.flush_queue(ShenandoahThreadLocalData::satb_mark_queue(thread)); - } -}; - template class ShenandoahFinalMarkingTask : public WorkerTask { private: @@ -109,7 +95,7 @@ public: while (satb_mq_set.apply_closure_to_completed_buffer(&cl)) {} assert(!heap->has_forwarded_objects(), "Not expected"); - ShenandoahSATBAndRemarkThreadsClosure tc(satb_mq_set); + ShenandoahFlushSATB tc(satb_mq_set); Threads::possibly_parallel_threads_do(true /* is_par */, &tc); } _cm->mark_loop(worker_id, _terminator, GENERATION, false /*not cancellable*/, diff --git a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp index 53b83edd47b..cd079d29afe 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahDegeneratedGC.cpp @@ -101,12 +101,16 @@ void ShenandoahDegenGC::op_degenerated() { heap->old_generation()->card_scan()->mark_write_table_as_clean(); } -#ifdef ASSERT if (heap->mode()->is_generational()) { - ShenandoahOldGeneration* old_generation = heap->old_generation(); + const ShenandoahOldGeneration* old_generation = heap->old_generation(); if (!heap->is_concurrent_old_mark_in_progress()) { // If we are not marking the old generation, there should be nothing in the old mark queues assert(old_generation->task_queues()->is_empty(), "Old gen task queues should be empty"); + } else { + // This is still necessary for degenerated cycles because the degeneration point may occur + // after final mark of the young generation. See ShenandoahConcurrentGC::op_final_update_refs for + // a more detailed explanation. + old_generation->transfer_pointers_from_satb(); } if (_generation->is_global()) { @@ -118,7 +122,6 @@ void ShenandoahDegenGC::op_degenerated() { "Old generation cannot be in state: %s", old_generation->state_name()); } } -#endif ShenandoahMetricsSnapshot metrics(heap->free_set()); @@ -166,15 +169,6 @@ void ShenandoahDegenGC::op_degenerated() { _generation->cancel_marking(); } - if (heap->is_concurrent_mark_in_progress()) { - // If either old or young marking is in progress, the SATB barrier will be enabled. - // The SATB buffer may hold a mix of old and young pointers. The old pointers need to be - // transferred to the old generation mark queues and the young pointers are NOT part - // of this snapshot, so they must be dropped here. It is safe to drop them here because - // we will rescan the roots on this safepoint. - heap->old_generation()->transfer_pointers_from_satb(); - } - if (_degen_point == ShenandoahDegenPoint::_degenerated_roots) { // We only need this if the concurrent cycle has already swapped the card tables. // Marking will use the 'read' table, but interesting pointers may have been @@ -193,8 +187,9 @@ void ShenandoahDegenGC::op_degenerated() { case _degenerated_mark: // No fallthrough. Continue mark, handed over from concurrent mark if // concurrent mark has yet completed - if (_degen_point == ShenandoahDegenPoint::_degenerated_mark && - heap->is_concurrent_mark_in_progress()) { + if (_degen_point == ShenandoahDegenPoint::_degenerated_mark && heap->is_concurrent_mark_in_progress()) { + assert(!ShenandoahBarrierSet::satb_mark_queue_set().get_filter_out_young(), + "Should not be filtering out young pointers when concurrent mark degenerates"); op_finish_mark(); } assert(!heap->cancelled_gc(), "STW mark can not OOM"); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp index 28053dffd5a..e582ea6b189 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahGenerationalHeap.cpp @@ -1040,12 +1040,6 @@ void ShenandoahGenerationalHeap::final_update_refs_update_region_states() { void ShenandoahGenerationalHeap::complete_degenerated_cycle() { shenandoah_assert_heaplocked_or_safepoint(); - if (is_concurrent_old_mark_in_progress()) { - // This is still necessary for degenerated cycles because the degeneration point may occur - // after final mark of the young generation. See ShenandoahConcurrentGC::op_final_update_refs for - // a more detailed explanation. - old_generation()->transfer_pointers_from_satb(); - } // In case degeneration interrupted concurrent evacuation or update references, we need to clean up // transient state. Otherwise, these actions have no effect. reset_generation_reserves(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 5b353ee2103..38f055c34b6 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -2028,6 +2028,10 @@ void ShenandoahHeap::prepare_update_heap_references() { void ShenandoahHeap::propagate_gc_state_to_all_threads() { assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "Must be at Shenandoah safepoint"); if (_gc_state_changed) { + // If we are only marking old, we do not need to process young pointers + ShenandoahBarrierSet::satb_mark_queue_set().set_filter_out_young( + is_concurrent_old_mark_in_progress() && !is_concurrent_young_mark_in_progress() + ); ShenandoahGCStatePropagatorHandshakeClosure propagator(_gc_state.raw_value()); Threads::threads_do(&propagator); _gc_state_changed = false; diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp index 1f474baef46..338c99c7c55 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.cpp @@ -44,113 +44,17 @@ #include "runtime/threads.hpp" #include "utilities/events.hpp" -class ShenandoahFlushAllSATB : public ThreadClosure { -private: - SATBMarkQueueSet& _satb_qset; - -public: - explicit ShenandoahFlushAllSATB(SATBMarkQueueSet& satb_qset) : - _satb_qset(satb_qset) {} - - void do_thread(Thread* thread) override { - // Transfer any partial buffer to the qset for completed buffer processing. - _satb_qset.flush_queue(ShenandoahThreadLocalData::satb_mark_queue(thread)); - } -}; - -class ShenandoahProcessOldSATB : public SATBBufferClosure { -private: - ShenandoahObjToScanQueue* _queue; - ShenandoahHeap* _heap; - ShenandoahMarkingContext* const _mark_context; - size_t _trashed_oops; - -public: - explicit ShenandoahProcessOldSATB(ShenandoahObjToScanQueue* q) : - _queue(q), - _heap(ShenandoahHeap::heap()), - _mark_context(_heap->marking_context()), - _trashed_oops(0) {} - - void do_buffer(void** buffer, size_t size) override { - assert(size == 0 || !_heap->has_forwarded_objects() || _heap->is_concurrent_old_mark_in_progress(), "Forwarded objects are not expected here"); - for (size_t i = 0; i < size; ++i) { - oop *p = (oop *) &buffer[i]; - ShenandoahHeapRegion* region = _heap->heap_region_containing(*p); - if (region->is_old() && region->is_active()) { - ShenandoahMark::mark_through_ref(p, _queue, nullptr, _mark_context, false); - } else { - _trashed_oops++; - } - } - } - - size_t trashed_oops() const { - return _trashed_oops; - } -}; - class ShenandoahPurgeSATBTask : public WorkerTask { -private: - ShenandoahObjToScanQueueSet* _mark_queues; - // Keep track of the number of oops that are not transferred to mark queues. - // This is volatile because workers update it, but the vm thread reads it. - volatile size_t _trashed_oops; - public: - explicit ShenandoahPurgeSATBTask(ShenandoahObjToScanQueueSet* queues) : - WorkerTask("Purge SATB"), - _mark_queues(queues), - _trashed_oops(0) { + explicit ShenandoahPurgeSATBTask() : WorkerTask("Purge SATB") { Threads::change_thread_claim_token(); } - ~ShenandoahPurgeSATBTask() { - if (_trashed_oops > 0) { - log_debug(gc)("Purged %zu oops from old generation SATB buffers", _trashed_oops); - } - } - void work(uint worker_id) override { ShenandoahParallelWorkerSession worker_session(worker_id); ShenandoahSATBMarkQueueSet &satb_queues = ShenandoahBarrierSet::satb_mark_queue_set(); - ShenandoahFlushAllSATB flusher(satb_queues); + ShenandoahFlushSATB flusher(satb_queues); Threads::possibly_parallel_threads_do(true /* is_par */, &flusher); - - ShenandoahObjToScanQueue* mark_queue = _mark_queues->queue(worker_id); - ShenandoahProcessOldSATB processor(mark_queue); - while (satb_queues.apply_closure_to_completed_buffer(&processor)) {} - - AtomicAccess::add(&_trashed_oops, processor.trashed_oops()); - } -}; - -class ShenandoahTransferOldSATBTask : public WorkerTask { - ShenandoahSATBMarkQueueSet& _satb_queues; - ShenandoahObjToScanQueueSet* _mark_queues; - // Keep track of the number of oops that are not transferred to mark queues. - // This is volatile because workers update it, but the control thread reads it. - volatile size_t _trashed_oops; - -public: - explicit ShenandoahTransferOldSATBTask(ShenandoahSATBMarkQueueSet& satb_queues, ShenandoahObjToScanQueueSet* mark_queues) : - WorkerTask("Transfer SATB"), - _satb_queues(satb_queues), - _mark_queues(mark_queues), - _trashed_oops(0) {} - - ~ShenandoahTransferOldSATBTask() { - if (_trashed_oops > 0) { - log_debug(gc)("Purged %zu oops from old generation SATB buffers", _trashed_oops); - } - } - - void work(uint worker_id) override { - ShenandoahObjToScanQueue* mark_queue = _mark_queues->queue(worker_id); - ShenandoahProcessOldSATB processor(mark_queue); - while (_satb_queues.apply_closure_to_completed_buffer(&processor)) {} - - AtomicAccess::add(&_trashed_oops, processor.trashed_oops()); } }; @@ -463,26 +367,11 @@ bool ShenandoahOldGeneration::coalesce_and_fill() { } } -void ShenandoahOldGeneration::concurrent_transfer_pointers_from_satb() const { - const ShenandoahHeap* heap = ShenandoahHeap::heap(); - assert(heap->is_concurrent_old_mark_in_progress(), "Only necessary during old marking."); - log_debug(gc)("Transfer SATB buffers"); - - // Step 1. All threads need to 'complete' partially filled, thread local SATB buffers. This - // is accomplished in ShenandoahConcurrentGC::complete_abbreviated_cycle using a Handshake - // operation. - // Step 2. Use worker threads to transfer oops from old, active regions in the completed - // SATB buffers to old generation mark queues. - ShenandoahSATBMarkQueueSet& satb_queues = ShenandoahBarrierSet::satb_mark_queue_set(); - ShenandoahTransferOldSATBTask transfer_task(satb_queues, task_queues()); - heap->workers()->run_task(&transfer_task); -} - void ShenandoahOldGeneration::transfer_pointers_from_satb() const { const ShenandoahHeap* heap = ShenandoahHeap::heap(); assert(heap->is_concurrent_old_mark_in_progress(), "Only necessary during old marking."); log_debug(gc)("Transfer SATB buffers"); - ShenandoahPurgeSATBTask purge_satb_task(task_queues()); + ShenandoahPurgeSATBTask purge_satb_task; heap->workers()->run_task(&purge_satb_task); } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp index 028ee18554c..cd78ed4ef5e 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahOldGeneration.hpp @@ -228,26 +228,27 @@ public: // Cancels old gc and transitions to the idle state void cancel_gc(); - // We leave the SATB barrier on for the entirety of the old generation - // marking phase. In some cases, this can cause a write to a perfectly - // reachable oop to enqueue a pointer that later becomes garbage (because - // it points at an object that is later chosen for the collection set). There are - // also cases where the referent of a weak reference ends up in the SATB - // and is later collected. In these cases the oop in the SATB buffer becomes - // invalid and the _next_ cycle will crash during its marking phase. To - // avoid this problem, we "purge" the SATB buffers during the final update - // references phase if (and only if) an old generation mark is in progress. - // At this stage we can safely determine if any of the oops in the SATB - // buffer belong to trashed regions (before they are recycled). As it - // happens, flushing a SATB queue also filters out oops which have already - // been marked - which is the case for anything that is being evacuated - // from the collection set. + // The SATB barrier will be "enabled" until old marking completes. This means it is + // possible for an entire young collection cycle to execute while the SATB barrier is enabled. + // Consider a situation like this, where we have a pointer 'B' at an object 'A' which is in + // the young collection set: // - // Alternatively, we could inspect the state of the heap and the age of the - // object at the barrier, but we reject this approach because it is likely - // the performance impact would be too severe. + // +--Young, CSet------+ +--Young, Regular----+ + // | | | | + // | | | | + // | A <--------------------+ B | + // | | | | + // | | | | + // +-------------------+ +--------------------+ + // + // If a mutator thread overwrites pointer B, the SATB barrier will dutifully enqueue + // object A. However, this object will be trashed when the young cycle completes. We must, + // therefore, filter this object from the SATB buffer before any old mark threads see it. + // We do this with a handshake before final-update-refs (see shenandoahConcurrentGC.cpp). + // + // This method is here only for degenerated cycles. A concurrent cycle may be cancelled before + // we have a chance to execute the handshake to flush the SATB in final-update-refs. void transfer_pointers_from_satb() const; - void concurrent_transfer_pointers_from_satb() const; // True if there are old regions waiting to be selected for a mixed collection bool has_unprocessed_collection_candidates(); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp index 547ebb1a229..c2ed575b438 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp @@ -28,7 +28,7 @@ #include "gc/shenandoah/shenandoahThreadLocalData.hpp" ShenandoahSATBMarkQueueSet::ShenandoahSATBMarkQueueSet(BufferNode::Allocator* allocator) : - SATBMarkQueueSet(allocator) + SATBMarkQueueSet(allocator), _filter_out_young(false) {} SATBMarkQueue& ShenandoahSATBMarkQueueSet::satb_queue_for_thread(Thread* const t) const { @@ -39,16 +39,33 @@ class ShenandoahSATBMarkQueueFilterFn { ShenandoahHeap* const _heap; public: - ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} + explicit ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} - // Return true if entry should be filtered out (removed), false if - // it should be retained. + // Return true if entry should be filtered out (removed), false if it should be retained. bool operator()(const void* entry) const { return !_heap->requires_marking(entry); } }; +class ShenandoahSATBOldMarkQueueFilterFn { + ShenandoahHeap* const _heap; + +public: + explicit ShenandoahSATBOldMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} + + // Return true if entry should be filtered out (removed), false if it should be retained. + bool operator()(const void* entry) const { + assert(_heap->is_concurrent_old_mark_in_progress(), "Should only use this when old marking is in progress"); + assert(!_heap->is_concurrent_young_mark_in_progress(), "Should only use this when young marking is not in progress"); + return !_heap->requires_marking(entry) || !_heap->is_in_old(entry); + } +}; + void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue& queue) { ShenandoahHeap* heap = ShenandoahHeap::heap(); - apply_filter(ShenandoahSATBMarkQueueFilterFn(heap), queue); + if (_filter_out_young) { + apply_filter(ShenandoahSATBOldMarkQueueFilterFn(heap), queue); + } else { + apply_filter(ShenandoahSATBMarkQueueFilterFn(heap), queue); + } } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp index c30d2507676..dd4cdfebc17 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.hpp @@ -27,15 +27,23 @@ #include "gc/shared/bufferNode.hpp" #include "gc/shared/satbMarkQueue.hpp" -#include "runtime/javaThread.hpp" -#include "runtime/mutex.hpp" class ShenandoahSATBMarkQueueSet : public SATBMarkQueueSet { -public: - ShenandoahSATBMarkQueueSet(BufferNode::Allocator* allocator); +private: + bool _filter_out_young; - virtual SATBMarkQueue& satb_queue_for_thread(Thread* const t) const; - virtual void filter(SATBMarkQueue& queue); +public: + explicit ShenandoahSATBMarkQueueSet(BufferNode::Allocator* allocator); + + SATBMarkQueue& satb_queue_for_thread(Thread* const t) const override; + void filter(SATBMarkQueue& queue) override; + void set_filter_out_young(bool filter_out_young) { + _filter_out_young = filter_out_young; + } + + bool get_filter_out_young() const { + return _filter_out_young; + } }; #endif // SHARE_GC_SHENANDOAH_SHENANDOAHSATBMARKQUEUESET_HPP From 90ccdf2986b0e3705997fe31a23fd53c88a1bfaf Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Thu, 6 Nov 2025 20:20:22 +0000 Subject: [PATCH 497/561] 8371367: Replace remaining JvmtiJavaThreadEventTransition with JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK Reviewed-by: sspitsyn, cjplummer --- src/hotspot/share/prims/jvmtiExport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index d241ca6110a..96437882584 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -1774,7 +1774,7 @@ void JvmtiExport::post_object_free(JvmtiEnv* env, GrowableArray* objects) EVT_TRACE(JVMTI_EVENT_OBJECT_FREE, ("[?] Evt Object Free sent")); JvmtiThreadEventMark jem(javaThread); - JvmtiJavaThreadEventTransition jet(javaThread); + JVMTI_JAVA_THREAD_EVENT_CALLBACK_BLOCK(javaThread) jvmtiEventObjectFree callback = env->callbacks()->ObjectFree; if (callback != nullptr) { for (int index = 0; index < objects->length(); index++) { From 8a0c47d4ba4db523d94689b3ac347e9cd35183ce Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Thu, 6 Nov 2025 20:24:20 +0000 Subject: [PATCH 498/561] 8371225: Missing release of GDK lock in Java_sun_awt_X11_GtkFileDialogPeer_run() Reviewed-by: aivanov, serb --- .../libawt_xawt/awt/sun_awt_X11_GtkFileDialogPeer.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/java.desktop/unix/native/libawt_xawt/awt/sun_awt_X11_GtkFileDialogPeer.c b/src/java.desktop/unix/native/libawt_xawt/awt/sun_awt_X11_GtkFileDialogPeer.c index db6acc0f3d1..9e6fcd423ad 100644 --- a/src/java.desktop/unix/native/libawt_xawt/awt/sun_awt_X11_GtkFileDialogPeer.c +++ b/src/java.desktop/unix/native/libawt_xawt/awt/sun_awt_X11_GtkFileDialogPeer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -324,8 +324,6 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, JNU_CHECK_EXCEPTION(env); } - gtk->gdk_threads_enter(); - const char *title = jtitle == NULL? "": (*env)->GetStringUTFChars(env, jtitle, 0); if (title == NULL) { (*env)->ExceptionClear(env); @@ -333,6 +331,8 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, return; } + gtk->gdk_threads_enter(); + if (mode == java_awt_FileDialog_SAVE) { /* Save action */ dialog = gtk->gtk_file_chooser_dialog_new(title, NULL, @@ -360,6 +360,7 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, if (jdir != NULL) { const char *dir = (*env)->GetStringUTFChars(env, jdir, 0); if (dir == NULL) { + gtk->gdk_threads_leave(); (*env)->ExceptionClear(env); JNU_ThrowOutOfMemoryError(env, "Could not get dir"); return; @@ -372,6 +373,7 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, if (jfile != NULL) { const char *filename = (*env)->GetStringUTFChars(env, jfile, 0); if (filename == NULL) { + gtk->gdk_threads_leave(); (*env)->ExceptionClear(env); JNU_ThrowOutOfMemoryError(env, "Could not get filename"); return; From 8796611206438c6fe8bf0cba87dca089d9da2e30 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Thu, 6 Nov 2025 21:03:54 +0000 Subject: [PATCH 499/561] 8272160: Avoid using 32-bit counters in CDS code Reviewed-by: iklam, kvn --- src/hotspot/share/cds/aotMetaspace.cpp | 6 ++-- src/hotspot/share/cds/archiveUtils.hpp | 4 +-- src/hotspot/share/cds/cdsHeapVerifier.cpp | 2 +- src/hotspot/share/cds/cdsHeapVerifier.hpp | 2 +- src/hotspot/share/cds/filemap.cpp | 2 +- src/hotspot/share/cds/heapShared.cpp | 40 +++++++++++------------ src/hotspot/share/cds/heapShared.hpp | 21 +++++------- 7 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/hotspot/share/cds/aotMetaspace.cpp b/src/hotspot/share/cds/aotMetaspace.cpp index 039c32a2bad..e5c1700dbfb 100644 --- a/src/hotspot/share/cds/aotMetaspace.cpp +++ b/src/hotspot/share/cds/aotMetaspace.cpp @@ -2057,13 +2057,13 @@ void AOTMetaspace::unmap_archive(FileMapInfo* mapinfo) { // For -XX:PrintSharedArchiveAndExit class CountSharedSymbols : public SymbolClosure { private: - int _count; + size_t _count; public: CountSharedSymbols() : _count(0) {} void do_symbol(Symbol** sym) { _count++; } - int total() { return _count; } + size_t total() { return _count; } }; @@ -2137,7 +2137,7 @@ void AOTMetaspace::initialize_shared_spaces() { // collect shared symbols and strings CountSharedSymbols cl; SymbolTable::shared_symbols_do(&cl); - tty->print_cr("Number of shared symbols: %d", cl.total()); + tty->print_cr("Number of shared symbols: %zu", cl.total()); tty->print_cr("Number of shared strings: %zu", StringTable::shared_entry_count()); tty->print_cr("VM version: %s\r\n", static_mapinfo->vm_version()); if (FileMapInfo::current_info() == nullptr || _archive_loading_failed) { diff --git a/src/hotspot/share/cds/archiveUtils.hpp b/src/hotspot/share/cds/archiveUtils.hpp index be423881008..79d894f0144 100644 --- a/src/hotspot/share/cds/archiveUtils.hpp +++ b/src/hotspot/share/cds/archiveUtils.hpp @@ -324,14 +324,14 @@ private: size_t _base_offset; size_t _count; int _roots_count; - int _max_size_in_bytes; + size_t _max_size_in_bytes; int _max_size_in_elems; public: size_t base_offset() { return _base_offset; } size_t count() { return _count; } int roots_count() { return _roots_count; } - int max_size_in_bytes() { return _max_size_in_bytes; } + size_t max_size_in_bytes() { return _max_size_in_bytes; } int max_size_in_elems() { return _max_size_in_elems; } size_t size_in_bytes(size_t seg_idx); diff --git a/src/hotspot/share/cds/cdsHeapVerifier.cpp b/src/hotspot/share/cds/cdsHeapVerifier.cpp index 59b07190c09..59c91c834d6 100644 --- a/src/hotspot/share/cds/cdsHeapVerifier.cpp +++ b/src/hotspot/share/cds/cdsHeapVerifier.cpp @@ -254,7 +254,7 @@ void CDSHeapVerifier::add_shared_secret_accessors() { CDSHeapVerifier::~CDSHeapVerifier() { if (_problems > 0) { - log_error(aot, heap)("Scanned %d objects. Found %d case(s) where " + log_error(aot, heap)("Scanned %zu objects. Found %d case(s) where " "an object points to a static field that " "may hold a different value at runtime.", _archived_objs, _problems); log_error(aot, heap)("Please see cdsHeapVerifier.cpp and aotClassInitializer.cpp for details"); diff --git a/src/hotspot/share/cds/cdsHeapVerifier.hpp b/src/hotspot/share/cds/cdsHeapVerifier.hpp index 88ef13c9e90..7f1bdb1d249 100644 --- a/src/hotspot/share/cds/cdsHeapVerifier.hpp +++ b/src/hotspot/share/cds/cdsHeapVerifier.hpp @@ -41,7 +41,7 @@ class CDSHeapVerifier : public KlassClosure { class SharedSecretsAccessorFinder; class TraceFields; - int _archived_objs; + size_t _archived_objs; int _problems; struct StaticFieldInfo { diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 050c1708efb..b52861cecef 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -309,7 +309,7 @@ void FileMapHeader::print(outputStream* st) { st->print_cr("- heap_root_segments.base_offset: 0x%zx", _heap_root_segments.base_offset()); st->print_cr("- heap_root_segments.count: %zu", _heap_root_segments.count()); st->print_cr("- heap_root_segments.max_size_elems: %d", _heap_root_segments.max_size_in_elems()); - st->print_cr("- heap_root_segments.max_size_bytes: %d", _heap_root_segments.max_size_in_bytes()); + st->print_cr("- heap_root_segments.max_size_bytes: %zu", _heap_root_segments.max_size_in_bytes()); st->print_cr("- _heap_oopmap_start_pos: %zu", _heap_oopmap_start_pos); st->print_cr("- _heap_ptrmap_start_pos: %zu", _heap_ptrmap_start_pos); st->print_cr("- _rw_ptrmap_start_pos: %zu", _rw_ptrmap_start_pos); diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index 146ee4af1e0..3f4d584b0f5 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -1049,7 +1049,7 @@ void HeapShared::write_subgraph_info_table() { _run_time_subgraph_info_table.reset(); - CompactHashtableWriter writer(d_table->_count, &stats); + CompactHashtableWriter writer(d_table->number_of_entries(), &stats); CopyKlassSubGraphInfoToArchive copy(&writer); d_table->iterate(©); writer.dump(&_run_time_subgraph_info_table, "subgraphs"); @@ -1820,15 +1820,15 @@ void HeapShared::check_special_subgraph_classes() { HeapShared::SeenObjectsTable* HeapShared::_seen_objects_table = nullptr; HeapShared::PendingOop HeapShared::_object_being_archived; -int HeapShared::_num_new_walked_objs; -int HeapShared::_num_new_archived_objs; -int HeapShared::_num_old_recorded_klasses; +size_t HeapShared::_num_new_walked_objs; +size_t HeapShared::_num_new_archived_objs; +size_t HeapShared::_num_old_recorded_klasses; -int HeapShared::_num_total_subgraph_recordings = 0; -int HeapShared::_num_total_walked_objs = 0; -int HeapShared::_num_total_archived_objs = 0; -int HeapShared::_num_total_recorded_klasses = 0; -int HeapShared::_num_total_verifications = 0; +size_t HeapShared::_num_total_subgraph_recordings = 0; +size_t HeapShared::_num_total_walked_objs = 0; +size_t HeapShared::_num_total_archived_objs = 0; +size_t HeapShared::_num_total_recorded_klasses = 0; +size_t HeapShared::_num_total_verifications = 0; bool HeapShared::has_been_seen_during_subgraph_recording(oop obj) { return _seen_objects_table->get(obj) != nullptr; @@ -1851,10 +1851,10 @@ void HeapShared::start_recording_subgraph(InstanceKlass *k, const char* class_na } void HeapShared::done_recording_subgraph(InstanceKlass *k, const char* class_name) { - int num_new_recorded_klasses = get_subgraph_info(k)->num_subgraph_object_klasses() - + size_t num_new_recorded_klasses = get_subgraph_info(k)->num_subgraph_object_klasses() - _num_old_recorded_klasses; log_info(aot, heap)("Done recording subgraph(s) for archived fields in %s: " - "walked %d objs, archived %d new objs, recorded %d classes", + "walked %zu objs, archived %zu new objs, recorded %zu classes", class_name, _num_new_walked_objs, _num_new_archived_objs, num_new_recorded_klasses); @@ -2102,18 +2102,18 @@ void HeapShared::archive_object_subgraphs(ArchivableStaticFieldInfo fields[], done_recording_subgraph(info->klass, klass_name); } - log_info(aot, heap)("Archived subgraph records = %d", + log_info(aot, heap)("Archived subgraph records = %zu", _num_total_subgraph_recordings); - log_info(aot, heap)(" Walked %d objects", _num_total_walked_objs); - log_info(aot, heap)(" Archived %d objects", _num_total_archived_objs); - log_info(aot, heap)(" Recorded %d klasses", _num_total_recorded_klasses); + log_info(aot, heap)(" Walked %zu objects", _num_total_walked_objs); + log_info(aot, heap)(" Archived %zu objects", _num_total_archived_objs); + log_info(aot, heap)(" Recorded %zu klasses", _num_total_recorded_klasses); #ifndef PRODUCT for (int i = 0; fields[i].valid(); i++) { ArchivableStaticFieldInfo* f = &fields[i]; verify_subgraph_from_static_field(f->klass, f->offset); } - log_info(aot, heap)(" Verified %d references", _num_total_verifications); + log_info(aot, heap)(" Verified %zu references", _num_total_verifications); #endif } @@ -2165,8 +2165,8 @@ void HeapShared::debug_trace() { class FindEmbeddedNonNullPointers: public BasicOopIterateClosure { void* _start; BitMap *_oopmap; - int _num_total_oops; - int _num_null_oops; + size_t _num_total_oops; + size_t _num_null_oops; public: FindEmbeddedNonNullPointers(void* start, BitMap* oopmap) : _start(start), _oopmap(oopmap), _num_total_oops(0), _num_null_oops(0) {} @@ -2192,8 +2192,8 @@ class FindEmbeddedNonNullPointers: public BasicOopIterateClosure { _num_null_oops ++; } } - int num_total_oops() const { return _num_total_oops; } - int num_null_oops() const { return _num_null_oops; } + size_t num_total_oops() const { return _num_total_oops; } + size_t num_null_oops() const { return _num_null_oops; } }; #endif diff --git a/src/hotspot/share/cds/heapShared.hpp b/src/hotspot/share/cds/heapShared.hpp index c877748fe9c..cc41fb1dec7 100644 --- a/src/hotspot/share/cds/heapShared.hpp +++ b/src/hotspot/share/cds/heapShared.hpp @@ -217,10 +217,7 @@ private: 137, // prime number AnyObj::C_HEAP, mtClassShared, - DumpTimeSharedClassTable_hash> { - public: - int _count; - }; + DumpTimeSharedClassTable_hash> {}; public: // solaris compiler wants this for RunTimeKlassSubGraphInfoTable inline static bool record_equals_compact_hashtable_entry( @@ -301,16 +298,16 @@ private: } // Statistics (for one round of start_recording_subgraph ... done_recording_subgraph) - static int _num_new_walked_objs; - static int _num_new_archived_objs; - static int _num_old_recorded_klasses; + static size_t _num_new_walked_objs; + static size_t _num_new_archived_objs; + static size_t _num_old_recorded_klasses; // Statistics (for all archived subgraphs) - static int _num_total_subgraph_recordings; - static int _num_total_walked_objs; - static int _num_total_archived_objs; - static int _num_total_recorded_klasses; - static int _num_total_verifications; + static size_t _num_total_subgraph_recordings; + static size_t _num_total_walked_objs; + static size_t _num_total_archived_objs; + static size_t _num_total_recorded_klasses; + static size_t _num_total_verifications; static void start_recording_subgraph(InstanceKlass *k, const char* klass_name, bool is_full_module_graph); From e34a831814996be3e0a2df86b11b1718a76ea558 Mon Sep 17 00:00:00 2001 From: Rui Li Date: Thu, 6 Nov 2025 23:46:50 +0000 Subject: [PATCH 500/561] 8261743: Shenandoah: enable String deduplication with compact heuristics Reviewed-by: shade, wkemper --- .../gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp index 592bba67757..f8a77d95d51 100644 --- a/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp +++ b/src/hotspot/share/gc/shenandoah/heuristics/shenandoahCompactHeuristics.cpp @@ -38,6 +38,7 @@ ShenandoahCompactHeuristics::ShenandoahCompactHeuristics(ShenandoahSpaceInfo* sp SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahImplicitGCInvokesConcurrent); SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahUncommit); SHENANDOAH_ERGO_ENABLE_FLAG(ShenandoahAlwaysClearSoftRefs); + SHENANDOAH_ERGO_ENABLE_FLAG(UseStringDeduplication); SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahAllocationThreshold, 10); SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahImmediateThreshold, 100); SHENANDOAH_ERGO_OVERRIDE_DEFAULT(ShenandoahUncommitDelay, 1000); From 866faa9d40ab336e4c4861a55edc4c91d8aa0c74 Mon Sep 17 00:00:00 2001 From: Volkan Yazici Date: Fri, 7 Nov 2025 08:15:42 +0000 Subject: [PATCH 501/561] 8366577: Deprecate java.net.Socket::setPerformancePreferences Reviewed-by: dfuchs, alanb, jpai --- src/java.base/share/classes/java/net/ServerSocket.java | 4 ++++ src/java.base/share/classes/java/net/Socket.java | 4 ++++ src/java.base/share/classes/java/net/SocketImpl.java | 4 ++++ .../share/classes/sun/security/ssl/BaseSSLSocketImpl.java | 3 ++- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/net/ServerSocket.java b/src/java.base/share/classes/java/net/ServerSocket.java index af7cedfd966..21061c2dae1 100644 --- a/src/java.base/share/classes/java/net/ServerSocket.java +++ b/src/java.base/share/classes/java/net/ServerSocket.java @@ -947,7 +947,11 @@ public class ServerSocket implements java.io.Closeable { * bandwidth * * @since 1.5 + * + * @deprecated This method was intended to allow for protocols that are now + * obsolete. */ + @Deprecated(since = "26", forRemoval = true) public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) diff --git a/src/java.base/share/classes/java/net/Socket.java b/src/java.base/share/classes/java/net/Socket.java index a2aee2e45a1..42ca5314b78 100644 --- a/src/java.base/share/classes/java/net/Socket.java +++ b/src/java.base/share/classes/java/net/Socket.java @@ -1853,7 +1853,11 @@ public class Socket implements java.io.Closeable { * bandwidth * * @since 1.5 + * + * @deprecated This method was intended to allow for protocols that are now + * obsolete. */ + @Deprecated(since = "26", forRemoval = true) public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) diff --git a/src/java.base/share/classes/java/net/SocketImpl.java b/src/java.base/share/classes/java/net/SocketImpl.java index 15c12457aac..27489aa9947 100644 --- a/src/java.base/share/classes/java/net/SocketImpl.java +++ b/src/java.base/share/classes/java/net/SocketImpl.java @@ -357,7 +357,11 @@ public abstract class SocketImpl implements SocketOptions { * bandwidth * * @since 1.5 + * + * @deprecated This method was intended to allow for protocols that are now + * obsolete. */ + @Deprecated(since = "26", forRemoval = true) protected void setPerformancePreferences(int connectionTime, int latency, int bandwidth) diff --git a/src/java.base/share/classes/sun/security/ssl/BaseSSLSocketImpl.java b/src/java.base/share/classes/sun/security/ssl/BaseSSLSocketImpl.java index 20bb67c06d6..a24d6e5799c 100644 --- a/src/java.base/share/classes/sun/security/ssl/BaseSSLSocketImpl.java +++ b/src/java.base/share/classes/sun/security/ssl/BaseSSLSocketImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 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 @@ -556,6 +556,7 @@ abstract class BaseSSLSocketImpl extends SSLSocket { * @see java.net.Socket#setPerformancePreferences(int, int, int) */ @Override + @SuppressWarnings("removal") public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) { if (self == this) { From 205a163a90bb263d403476c28203836189e337a7 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 7 Nov 2025 09:06:51 +0000 Subject: [PATCH 502/561] 8340840: jshell ClassFormatError when making inner class static 8368999: jshell crash when existing sealed class is updated to also be abstract Reviewed-by: mcimadamore, asotona, liach --- .../com/sun/tools/javac/jvm/ClassReader.java | 20 +- .../tools/javac/resources/compiler.properties | 6 + .../jshell/execution/JdiExecutionControl.java | 4 +- test/langtools/jdk/jshell/ReplaceTest.java | 37 ++- .../InconsistentInnerClasses.java | 30 ++ .../classpath/p/Other.java | 25 ++ .../classpath/p/Test.java | 25 ++ .../SourceAndInnerClassInconsistency.java | 277 ++++++++++++++++++ 8 files changed, 413 insertions(+), 11 deletions(-) create mode 100644 test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/InconsistentInnerClasses.java create mode 100644 test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Other.java create mode 100644 test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Test.java create mode 100644 test/langtools/tools/javac/recovery/SourceAndInnerClassInconsistency.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java index 6f1ad28586d..b7bf48b4a12 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -3152,14 +3152,18 @@ public class ClassReader { if (name == names.empty) name = names.one; ClassSymbol member = enterClass(name, outer); - if ((flags & STATIC) == 0) { - ((ClassType)member.type).setEnclosingType(outer.type); - if (member.erasure_field != null) - ((ClassType)member.erasure_field).setEnclosingType(types.erasure(outer.type)); - } - if (c == outer && member.owner == c) { - member.flags_field = flags; - enterMember(c, member); + if ((member.flags_field & FROM_SOURCE) == 0) { + if ((flags & STATIC) == 0) { + ((ClassType)member.type).setEnclosingType(outer.type); + if (member.erasure_field != null) + ((ClassType)member.erasure_field).setEnclosingType(types.erasure(outer.type)); + } + if (c == outer && member.owner == c) { + member.flags_field = flags; + enterMember(c, member); + } + } else if ((flags & STATIC) != (member.flags_field & STATIC)) { + log.warning(LintWarnings.InconsistentInnerClasses(member, currentClassFile)); } } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 4e034ff1bc8..6318476fca4 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -2258,6 +2258,12 @@ compiler.warn.option.obsolete.suppression=\ compiler.warn.future.attr=\ {0} attribute introduced in version {1}.{2} class files is ignored in version {3}.{4} class files +# 0: symbol, 1: file object +# lint: classfile +compiler.warn.inconsistent.inner.classes=\ + InnerClasses attribute for {0} in {1} inconsistent with source code\n\ + ({1} may need to be recompiled with {0}) + # lint: requires-automatic compiler.warn.requires.automatic=\ requires directive for an automatic module diff --git a/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControl.java b/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControl.java index 3084c601cc5..176e3530f39 100644 --- a/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControl.java +++ b/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiExecutionControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, 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. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,7 @@ public abstract class JdiExecutionControl extends StreamingExecutionControl impl vm().redefineClasses(rmp); } catch (EngineTerminationException ex) { throw ex; - } catch (Exception ex) { + } catch (Exception | LinkageError ex) { throw new ClassInstallException("redefine: " + ex.getMessage(), new boolean[cbcs.length]); } // forward the redefine to remote-end to register the redefined bytecode diff --git a/test/langtools/jdk/jshell/ReplaceTest.java b/test/langtools/jdk/jshell/ReplaceTest.java index 02ebb27fcb9..6b9471b6bc4 100644 --- a/test/langtools/jdk/jshell/ReplaceTest.java +++ b/test/langtools/jdk/jshell/ReplaceTest.java @@ -22,7 +22,7 @@ */ /* - * @test 8080069 8152925 + * @test 8080069 8152925 8340840 8368999 * @summary Test of Snippet redefinition and replacement. * @build KullaTesting TestingInputStream * @run junit ReplaceTest @@ -282,4 +282,39 @@ public class ReplaceTest extends KullaTesting { ste(MAIN_SNIPPET, VALID, VALID, true, null), ste(xi2, VALID, OVERWRITTEN, false, MAIN_SNIPPET))); } + + @Test //JDK-8368999 + public void testLinkageErrorWhileRedefine() { + Snippet iKey = classKey(assertEval("sealed interface I permits C {}", + ste(MAIN_SNIPPET, NONEXISTENT, RECOVERABLE_NOT_DEFINED, false, null))); + Snippet cKey = classKey(assertEval("sealed class C implements I permits SubC {}", + ste(MAIN_SNIPPET, NONEXISTENT, RECOVERABLE_NOT_DEFINED, false, null))); + Snippet subCKey = classKey(assertEval("final class SubC extends C {}", + ste(MAIN_SNIPPET, NONEXISTENT, VALID, true, null), + ste(iKey, RECOVERABLE_NOT_DEFINED, VALID, true, null), + ste(cKey, RECOVERABLE_NOT_DEFINED, VALID, true, null))); + assertEval("sealed abstract class C implements I permits SubC {}", + ste(MAIN_SNIPPET, VALID, VALID, true, null), + ste(iKey, VALID, VALID, true, null), + ste(subCKey, VALID, VALID, true, null), + ste(cKey, VALID, OVERWRITTEN, false, null)); + } + + @Test //JDK-8340840 + public void testStaticNonStatic() { + Snippet oKey = classKey(assertEval("class O { class I {} }")); + Snippet vKey = varKey(assertEval("var i = new O().new I();")); + assertEval("class O { static class I {} }", + DiagCheck.DIAG_OK, + DiagCheck.DIAG_ERROR, + ste(MAIN_SNIPPET, VALID, VALID, true, null), + ste(vKey, VALID, RECOVERABLE_NOT_DEFINED, true, null), + ste(oKey, VALID, OVERWRITTEN, false, null)); + assertEval("var i2 = new O.I();"); + assertEval("var i = new O.I();", + DiagCheck.DIAG_OK, + DiagCheck.DIAG_IGNORE, //there are errors in the original (replaced) Snippet + ste(MAIN_SNIPPET, RECOVERABLE_NOT_DEFINED, VALID, true, null), + ste(vKey, RECOVERABLE_NOT_DEFINED, OVERWRITTEN, false, null)); + } } diff --git a/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/InconsistentInnerClasses.java b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/InconsistentInnerClasses.java new file mode 100644 index 00000000000..f3a0bc977cb --- /dev/null +++ b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/InconsistentInnerClasses.java @@ -0,0 +1,30 @@ +/* + * 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. + * + * 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. + */ + +// key: compiler.warn.inconsistent.inner.classes +// options: -Xlint:classfile + +class Test { + Other o; + public class Nested {} +} diff --git a/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Other.java b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Other.java new file mode 100644 index 00000000000..c3de73058f6 --- /dev/null +++ b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Other.java @@ -0,0 +1,25 @@ +/* + * 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. + * + * 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. + */ +class Other { + Test.Nested n; +} diff --git a/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Test.java b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Test.java new file mode 100644 index 00000000000..81638da2853 --- /dev/null +++ b/test/langtools/tools/javac/diags/examples/InconsistentInnerClasses/classpath/p/Test.java @@ -0,0 +1,25 @@ +/* + * 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. + * + * 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. + */ +class Test { + public static class Nested { } +} diff --git a/test/langtools/tools/javac/recovery/SourceAndInnerClassInconsistency.java b/test/langtools/tools/javac/recovery/SourceAndInnerClassInconsistency.java new file mode 100644 index 00000000000..0dfda503288 --- /dev/null +++ b/test/langtools/tools/javac/recovery/SourceAndInnerClassInconsistency.java @@ -0,0 +1,277 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8340840 + * @summary Ensure InnerClasses attribute from a classfile won't overwrite properties + * of a source-based class + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JavacTask + * @run junit SourceAndInnerClassInconsistency + */ + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Objects; + +import org.junit.jupiter.api.Test; +import toolbox.JavacTask; +import toolbox.Task; +import toolbox.ToolBox; + +public class SourceAndInnerClassInconsistency { + + ToolBox tb = new ToolBox(); + + @Test + public void testNonStaticToStatic() throws Exception { + Path base = Paths.get("."); + Path src = base.resolve("src"); + Path classes = base.resolve("classes"); + + tb.writeJavaFiles(src, + """ + public class Complex { + public class Nested {} + } + """, + """ + public class Other { + Complex.Nested n; + } + """); + + Files.createDirectories(classes); + + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .files(tb.findJavaFiles(src)) + .outdir(classes) + .run() + .writeAll(); + + tb.writeJavaFiles(src, + """ + public class Complex { + public static class Nested {} + private void t() { + Other o; + } + } + """); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + List log = new JavacTask(tb) + .options("-XDrawDiagnostics", "-Xlint:classfile") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + List expected = List.of( + "- compiler.warn.inconsistent.inner.classes: Complex.Nested, Other.class", + "1 warning" + ); + if (!Objects.equals(expected, log)) { + throw new AssertionError("Wrong output, expected: " + expected + + ", got: " + log); + } + } + + @Test + public void testStaticToNonStatic() throws Exception { + Path base = Paths.get("."); + Path src = base.resolve("src"); + Path classes = base.resolve("classes"); + + tb.writeJavaFiles(src, + """ + public class Complex { + public static class Nested {} + } + """, + """ + public class Other { + Complex.Nested n; + } + """); + + Files.createDirectories(classes); + + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .files(tb.findJavaFiles(src)) + .outdir(classes) + .run() + .writeAll(); + + tb.writeJavaFiles(src, + """ + public class Complex { + public class Nested {} + private void t() { + Other o; + } + } + """); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + List log = new JavacTask(tb) + .options("-XDrawDiagnostics", "-Xlint:classfile") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll() + .getOutputLines(Task.OutputKind.DIRECT); + List expected = List.of( + "- compiler.warn.inconsistent.inner.classes: Complex.Nested, Other.class", + "1 warning" + ); + if (!Objects.equals(expected, log)) { + throw new AssertionError("Wrong output, expected: " + expected + + ", got: " + log); + } + } + + @Test + public void testNoWarning() throws Exception { + Path base = Paths.get("."); + Path src = base.resolve("src"); + Path classes = base.resolve("classes"); + + tb.writeJavaFiles(src, + """ + public class Complex { + public static class Nested {} + } + """, + """ + public class Other { + Complex.Nested n; + } + """); + + Files.createDirectories(classes); + + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .files(tb.findJavaFiles(src)) + .outdir(classes) + .run() + .writeAll(); + + tb.writeJavaFiles(src, + """ + public class Complex { + public static class Nested {} + private void t() { + Other o; + } + } + """); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-Xlint:classfile", "-Werror") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + } + + @Test + public void testSuppress() throws Exception { + Path base = Paths.get("."); + Path src = base.resolve("src"); + Path classes = base.resolve("classes"); + + tb.writeJavaFiles(src, + """ + public class Complex { + public static class Nested {} + } + """, + """ + public class Other { + Complex.Nested n; + } + """); + + Files.createDirectories(classes); + + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .files(tb.findJavaFiles(src)) + .outdir(classes) + .run() + .writeAll(); + + tb.writeJavaFiles(src, + """ + public class Complex { + public class Nested {} + private void t() { + Other o; + } + } + """); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-XDdev") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + new JavacTask(tb) + .options("-XDrawDiagnostics", "-Xlint:-classfile", "-Werror") + .classpath(classes) + .files(src.resolve("Complex.java")) + .outdir(classes) + .run() + .writeAll(); + } + +} From 48bbc950f11113a57ea03f877bc3e526982c0eef Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Fri, 7 Nov 2025 09:17:21 +0000 Subject: [PATCH 503/561] 8371388: [BACKOUT] JDK-8365047: Remove exception handler stub code in C2 Reviewed-by: chagedorn, epeter --- src/hotspot/cpu/aarch64/aarch64.ad | 37 +++- .../cpu/aarch64/c1_LIRAssembler_aarch64.cpp | 12 +- .../cpu/aarch64/c1_LIRAssembler_aarch64.hpp | 2 +- .../cpu/aarch64/nativeInst_aarch64.cpp | 6 + .../cpu/aarch64/nativeInst_aarch64.hpp | 22 +-- src/hotspot/cpu/aarch64/runtime_aarch64.cpp | 2 + src/hotspot/cpu/arm/arm.ad | 49 ++++-- src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp | 10 +- src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp | 2 +- src/hotspot/cpu/arm/runtime_arm.cpp | 2 + src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp | 7 +- src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp | 2 +- src/hotspot/cpu/ppc/ppc.ad | 35 ++-- src/hotspot/cpu/ppc/runtime_ppc.cpp | 1 + src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp | 19 ++- .../cpu/riscv/c1_LIRAssembler_riscv.cpp | 12 +- .../cpu/riscv/c1_LIRAssembler_riscv.hpp | 2 +- src/hotspot/cpu/riscv/riscv.ad | 37 +++- src/hotspot/cpu/riscv/runtime_riscv.cpp | 2 + src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp | 15 +- src/hotspot/cpu/s390/runtime_s390.cpp | 2 + src/hotspot/cpu/s390/s390.ad | 54 ++++-- src/hotspot/cpu/s390/sharedRuntime_s390.cpp | 6 +- src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp | 14 +- src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp | 2 +- src/hotspot/cpu/x86/runtime_x86_64.cpp | 2 + src/hotspot/cpu/x86/x86.ad | 51 ++++-- src/hotspot/os/posix/signals_posix.cpp | 2 +- src/hotspot/os/windows/os_windows.cpp | 2 +- src/hotspot/share/ci/ciEnv.cpp | 4 +- src/hotspot/share/code/nmethod.cpp | 23 +-- src/hotspot/share/code/nmethod.hpp | 4 +- src/hotspot/share/code/nmethod.inline.hpp | 2 +- src/hotspot/share/opto/output.cpp | 6 +- src/hotspot/share/runtime/deoptimization.cpp | 3 - src/hotspot/share/runtime/frame.cpp | 4 +- src/hotspot/share/runtime/sharedRuntime.cpp | 8 - src/hotspot/share/runtime/vmStructs.cpp | 2 +- .../classes/sun/jvm/hotspot/code/NMethod.java | 28 +-- .../sun/jvm/hotspot/runtime/Frame.java | 2 +- .../jtreg/runtime/vthread/Deoptimization.java | 159 ------------------ 41 files changed, 302 insertions(+), 354 deletions(-) delete mode 100644 test/hotspot/jtreg/runtime/vthread/Deoptimization.java diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index 44d7bf1e0fa..e8f9733fe7e 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -1,7 +1,6 @@ // // Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. // Copyright (c) 2014, 2024, Red Hat, Inc. All rights reserved. -// Copyright 2025 Arm Limited and/or its affiliates. // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This code is free software; you can redistribute it and/or modify it @@ -1195,10 +1194,15 @@ class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + return MacroAssembler::far_codestub_branch_size(); + } + static uint size_deopt_handler() { - // count one branch instruction and one far call instruction sequence + // count one adr and one far branch instruction return NativeInstruction::instruction_size + MacroAssembler::far_codestub_branch_size(); } }; @@ -2257,6 +2261,25 @@ uint MachUEPNode::size(PhaseRegAlloc* ra_) const //============================================================================= +// Emit exception handler code. +int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) +{ + // mov rscratch1 #exception_blob_entry_point + // br rscratch1 + // Note that the code buffer's insts_mark is always relative to insts. + // That's why we must use the macroassembler to generate a handler. + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + int offset = __ offset(); + __ far_jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); + assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); + __ end_a_stub(); + return offset; +} + // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2267,18 +2290,14 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) ciEnv::current()->record_failure("CodeCache is full"); return 0; // CodeBuffer::expand failed } - int offset = __ offset(); - Label start; - __ bind(start); - __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - int entry_offset = __ offset(); - __ b(start); + __ adr(lr, __ pc()); + __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); assert(__ offset() - offset == (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } // REQUIRED MATCHER CODE diff --git a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp index 2498a646e31..9ab463125fe 100644 --- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp @@ -449,18 +449,12 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); - Label start; - __ bind(start); - - __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - - int entry_offset = __ offset(); - __ b(start); - + __ adr(lr, pc()); + __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } void LIR_Assembler::add_debug_info_for_branch(address adr, CodeEmitInfo* info) { diff --git a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp index 729cd2827b7..12b941fc4f7 100644 --- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp @@ -71,7 +71,7 @@ friend class ArrayCopyStub; // CompiledDirectCall::to_trampoline_stub_size() _call_stub_size = 13 * NativeInstruction::instruction_size, _exception_handler_size = DEBUG_ONLY(1*K) NOT_DEBUG(175), - _deopt_handler_size = 4 * NativeInstruction::instruction_size + _deopt_handler_size = 7 * NativeInstruction::instruction_size }; public: diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp index f2003dd9b55..5a7fececafa 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.cpp @@ -394,6 +394,12 @@ void NativePostCallNop::make_deopt() { NativeDeoptInstruction::insert(addr_at(0)); } +#ifdef ASSERT +static bool is_movk_to_zr(uint32_t insn) { + return ((insn & 0xffe0001f) == 0xf280001f); +} +#endif + bool NativePostCallNop::patch(int32_t oopmap_slot, int32_t cb_offset) { if (((oopmap_slot & 0xff) != oopmap_slot) || ((cb_offset & 0xffffff) != cb_offset)) { return false; // cannot encode diff --git a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp index b7444347bf1..df5d97c2376 100644 --- a/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/nativeInst_aarch64.hpp @@ -526,24 +526,14 @@ inline NativeLdSt* NativeLdSt_at(address addr) { // can store an offset from the initial nop to the nmethod. class NativePostCallNop: public NativeInstruction { -private: - static bool is_movk_to_zr(uint32_t insn) { - return ((insn & 0xffe0001f) == 0xf280001f); - } - public: bool check() const { - // Check the first instruction is NOP. - if (is_nop()) { - uint32_t insn = *(uint32_t*)addr_at(4); - // Check next instruction is MOVK zr, xx. - // These instructions only ever appear together in a post-call - // NOP, so it's unnecessary to check that the third instruction is - // a MOVK as well. - return is_movk_to_zr(insn); - } - - return false; + uint64_t insns = *(uint64_t*)addr_at(0); + // Check for two instructions: nop; movk zr, xx + // These instructions only ever appear together in a post-call + // NOP, so it's unnecessary to check that the third instruction is + // a MOVK as well. + return (insns & 0xffe0001fffffffff) == 0xf280001fd503201f; } bool decode(int32_t& oopmap_slot, int32_t& cb_offset) const { diff --git a/src/hotspot/cpu/aarch64/runtime_aarch64.cpp b/src/hotspot/cpu/aarch64/runtime_aarch64.cpp index e36aa21b567..d45f9865bd2 100644 --- a/src/hotspot/cpu/aarch64/runtime_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/runtime_aarch64.cpp @@ -260,6 +260,8 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end +// Using exception blob, this code is jumped from a compiled method. +// (see emit_exception_handler in aarch64.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/arm/arm.ad b/src/hotspot/cpu/arm/arm.ad index eb9b0ed8fba..31a442be624 100644 --- a/src/hotspot/cpu/arm/arm.ad +++ b/src/hotspot/cpu/arm/arm.ad @@ -105,8 +105,14 @@ class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + return ( 3 * 4 ); + } + + static uint size_deopt_handler() { return ( 9 * 4 ); } @@ -870,6 +876,26 @@ uint MachUEPNode::size(PhaseRegAlloc *ra_) const { //============================================================================= +// Emit exception handler code. +int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) { + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + + int offset = __ offset(); + + // OK to trash LR, because exception blob will kill it + __ jump(OptoRuntime::exception_blob()->entry_point(), relocInfo::runtime_call_type, LR_tmp); + + assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); + + __ end_a_stub(); + + return offset; +} + int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { // Can't use any of the current frame's registers as we may have deopted // at a poll and everything can be live. @@ -880,26 +906,19 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); - - Label start; - __ bind(start); - - __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); - - int entry_offset = __ offset(); address deopt_pc = __ pc(); - // Preserve R0 and reserve space for the address of the entry point - __ push(RegisterSet(R0) | RegisterSet(R1)); - // Store the entry point address - __ mov_relative_address(R0, deopt_pc); - __ str(R0, Address(SP, wordSize)); - __ pop(R0); // restore R0 - __ b(start); + + __ sub(SP, SP, wordSize); // make room for saved PC + __ push(LR); // save LR that may be live when we get here + __ mov_relative_address(LR, deopt_pc); + __ str(LR, Address(SP, wordSize)); // save deopt PC + __ pop(LR); // restore LR + __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } bool Matcher::match_rule_supported(int opcode) { diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp index 1d7c1579502..219c49d1f14 100644 --- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp +++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp @@ -272,20 +272,14 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); - Label start; - __ bind(start); - - __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); - - int entry_offset = __ offset(); __ mov_relative_address(LR, __ pc()); __ push(LR); // stub expects LR to be saved - __ b(start); + __ jump(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type, noreg); assert(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } diff --git a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp index 615d2f188ff..77d13532685 100644 --- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp +++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.hpp @@ -54,7 +54,7 @@ enum { _call_stub_size = 16, _exception_handler_size = PRODUCT_ONLY(68) NOT_PRODUCT(68+60), - _deopt_handler_size = 20 + _deopt_handler_size = 16 }; public: diff --git a/src/hotspot/cpu/arm/runtime_arm.cpp b/src/hotspot/cpu/arm/runtime_arm.cpp index 29fd0aa0a10..8d48de5795a 100644 --- a/src/hotspot/cpu/arm/runtime_arm.cpp +++ b/src/hotspot/cpu/arm/runtime_arm.cpp @@ -182,6 +182,8 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------ generate_exception_blob --------------------------- // creates exception blob at the end +// Using exception blob, this code is jumped from a compiled method. +// (see emit_exception_handler in sparc.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp index 7898500cff2..108da2039f6 100644 --- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp +++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp @@ -264,17 +264,12 @@ int LIR_Assembler::emit_deopt_handler() { } int offset = code_offset(); - Label start; - - __ bind(start); __ bl64_patchable(SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type); - int entry_offset = __ offset(); - __ b(start); guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } diff --git a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp index 6a2f6264850..e4de2eb5c46 100644 --- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp +++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.hpp @@ -63,7 +63,7 @@ enum { _static_call_stub_size = 4 * BytesPerInstWord + MacroAssembler::b64_patchable_size, // or smaller _call_stub_size = _static_call_stub_size + MacroAssembler::trampoline_stub_size, // or smaller _exception_handler_size = MacroAssembler::b64_patchable_size, // or smaller - _deopt_handler_size = MacroAssembler::bl64_patchable_size + BytesPerInstWord + _deopt_handler_size = MacroAssembler::bl64_patchable_size }; // '_static_call_stub_size' is only used on ppc (see LIR_Assembler::emit_static_call_stub() diff --git a/src/hotspot/cpu/ppc/ppc.ad b/src/hotspot/cpu/ppc/ppc.ad index 5c44fc19704..36326e5fdb7 100644 --- a/src/hotspot/cpu/ppc/ppc.ad +++ b/src/hotspot/cpu/ppc/ppc.ad @@ -2088,11 +2088,17 @@ class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + // The exception_handler is a b64_patchable. + return MacroAssembler::b64_patchable_size; + } + static uint size_deopt_handler() { // The deopt_handler is a bl64_patchable. - return MacroAssembler::bl64_patchable_size + BytesPerInstWord; + return MacroAssembler::bl64_patchable_size; } }; @@ -2108,6 +2114,22 @@ public: source %{ +int HandlerImpl::emit_exception_handler(C2_MacroAssembler *masm) { + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + + int offset = __ offset(); + __ b64_patchable((address)OptoRuntime::exception_blob()->content_begin(), + relocInfo::runtime_call_type); + assert(__ offset() - offset == (int)size_exception_handler(), "must be fixed size"); + __ end_a_stub(); + + return offset; +} + // The deopt_handler is like the exception handler, but it calls to // the deoptimization blob instead of jumping to the exception blob. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2118,21 +2140,12 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); - - Label start; - __ bind(start); - __ bl64_patchable((address)SharedRuntime::deopt_blob()->unpack(), relocInfo::runtime_call_type); - - int entry_offset = __ offset(); - - __ b(start); - assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size"); __ end_a_stub(); - return entry_offset; + return offset; } //============================================================================= diff --git a/src/hotspot/cpu/ppc/runtime_ppc.cpp b/src/hotspot/cpu/ppc/runtime_ppc.cpp index ab658e9de58..2654075f702 100644 --- a/src/hotspot/cpu/ppc/runtime_ppc.cpp +++ b/src/hotspot/cpu/ppc/runtime_ppc.cpp @@ -46,6 +46,7 @@ //------------------------------generate_exception_blob--------------------------- // Creates exception blob at the end. +// Using exception blob, this code is jumped from a compiled method. // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp index 4e427ace404..db45a2fa4c8 100644 --- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp @@ -83,6 +83,7 @@ class RegisterSaver { static OopMap* push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map, + int return_pc_adjustment, ReturnPCLocation return_pc_location, bool save_vectors = false); static void restore_live_registers_and_pop_frame(MacroAssembler* masm, @@ -261,6 +262,7 @@ static const RegisterSaver::LiveRegType RegisterSaver_LiveVecRegs[] = { OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, int* out_frame_size_in_bytes, bool generate_oop_map, + int return_pc_adjustment, ReturnPCLocation return_pc_location, bool save_vectors) { // Push an abi_reg_args-frame and store all registers which may be live. @@ -269,6 +271,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble // propagated to the RegisterMap of the caller frame during // StackFrameStream construction (needed for deoptimization; see // compiledVFrame::create_stack_value). + // If return_pc_adjustment != 0 adjust the return pc by return_pc_adjustment. // Updated return pc is returned in R31 (if not return_pc_is_pre_saved). // calculate frame size @@ -302,11 +305,14 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble // Do the save_LR by hand and adjust the return pc if requested. switch (return_pc_location) { case return_pc_is_lr: __ mflr(R31); break; - case return_pc_is_pre_saved: break; + case return_pc_is_pre_saved: assert(return_pc_adjustment == 0, "unsupported"); break; case return_pc_is_thread_saved_exception_pc: __ ld(R31, thread_(saved_exception_pc)); break; default: ShouldNotReachHere(); } if (return_pc_location != return_pc_is_pre_saved) { + if (return_pc_adjustment != 0) { + __ addi(R31, R31, return_pc_adjustment); + } __ std(R31, frame_size_in_bytes + _abi0(lr), R1_SP); } @@ -2901,15 +2907,22 @@ void SharedRuntime::generate_deopt_blob() { // deopt_handler: call_deopt_stub // cur. return pc --> ... // + // So currently SR_LR points behind the call in the deopt handler. + // We adjust it such that it points to the start of the deopt handler. // The return_pc has been stored in the frame of the deoptee and // will replace the address of the deopt_handler in the call // to Deoptimization::fetch_unroll_info below. + // We can't grab a free register here, because all registers may + // contain live values, so let the RegisterSaver do the adjustment + // of the return pc. + const int return_pc_adjustment_no_exception = -MacroAssembler::bl64_patchable_size; // Push the "unpack frame" // Save everything in sight. map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ true, + return_pc_adjustment_no_exception, RegisterSaver::return_pc_is_lr); assert(map != nullptr, "OopMap must have been created"); @@ -2944,6 +2957,7 @@ void SharedRuntime::generate_deopt_blob() { RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ false, + /*return_pc_adjustment_exception=*/ 0, RegisterSaver::return_pc_is_pre_saved); // Deopt during an exception. Save exec mode for unpack_frames. @@ -2961,6 +2975,7 @@ void SharedRuntime::generate_deopt_blob() { RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &first_frame_size_in_bytes, /*generate_oop_map=*/ false, + /*return_pc_adjustment_reexecute=*/ 0, RegisterSaver::return_pc_is_pre_saved); __ li(exec_mode_reg, Deoptimization::Unpack_reexecute); #endif @@ -3251,6 +3266,7 @@ SafepointBlob* SharedRuntime::generate_handler_blob(StubId id, address call_ptr) map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &frame_size_in_bytes, /*generate_oop_map=*/ true, + /*return_pc_adjustment=*/0, return_pc_location, save_vectors); // The following is basically a call_VM. However, we need the precise @@ -3351,6 +3367,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(StubId id, address destination map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, &frame_size_in_bytes, /*generate_oop_map*/ true, + /*return_pc_adjustment*/ 0, RegisterSaver::return_pc_is_lr); // Use noreg as last_Java_pc, the return pc will be reconstructed diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp index b085dd7ac00..9d8ae770ccf 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.cpp @@ -377,18 +377,12 @@ int LIR_Assembler::emit_deopt_handler() { int offset = code_offset(); - Label start; - __ bind(start); - - __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - - int entry_offset = __ offset(); - __ j(start); - + __ auipc(ra, 0); + __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) { diff --git a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp index ed2ab0c4861..e4efb2c171d 100644 --- a/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp +++ b/src/hotspot/cpu/riscv/c1_LIRAssembler_riscv.hpp @@ -72,7 +72,7 @@ private: // See emit_exception_handler for detail _exception_handler_size = DEBUG_ONLY(256) NOT_DEBUG(32), // or smaller // See emit_deopt_handler for detail - // far_call (2) + j (1) + // auipc (1) + far_jump (2) _deopt_handler_size = 1 * MacroAssembler::instruction_size + 2 * MacroAssembler::instruction_size }; diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index e23adcf2488..7acbb5a478b 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -1049,10 +1049,15 @@ class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + return MacroAssembler::far_branch_size(); + } + static uint size_deopt_handler() { - // count far call + j + // count auipc + far branch return NativeInstruction::instruction_size + MacroAssembler::far_branch_size(); } }; @@ -1833,6 +1838,25 @@ uint MachUEPNode::size(PhaseRegAlloc* ra_) const //============================================================================= +// Emit exception handler code. +int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) +{ + // auipc t1, #exception_blob_entry_point + // jr (offset)t1 + // Note that the code buffer's insts_mark is always relative to insts. + // That's why we must use the macroassembler to generate a handler. + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + int offset = __ offset(); + __ far_jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); + assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); + __ end_a_stub(); + return offset; +} + // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -1843,17 +1867,12 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) } int offset = __ offset(); - Label start; - __ bind(start); - - __ far_call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - - int entry_offset = __ offset(); - __ j(start); + __ auipc(ra, 0); + __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } // REQUIRED MATCHER CODE diff --git a/src/hotspot/cpu/riscv/runtime_riscv.cpp b/src/hotspot/cpu/riscv/runtime_riscv.cpp index c52d5a31066..e1add8dbb82 100644 --- a/src/hotspot/cpu/riscv/runtime_riscv.cpp +++ b/src/hotspot/cpu/riscv/runtime_riscv.cpp @@ -249,6 +249,8 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end +// Using exception blob, this code is jumped from a compiled method. +// (see emit_exception_handler in riscv.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp index ee6df63d21b..298234156c3 100644 --- a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp @@ -272,25 +272,14 @@ int LIR_Assembler::emit_deopt_handler() { // Not enough space left for the handler. bailout("deopt handler overflow"); return -1; - } - - int offset = code_offset(); - - Label start; - __ bind(start); - + } int offset = code_offset(); // Size must be constant (see HandlerImpl::emit_deopt_handler). __ load_const(Z_R1_scratch, SharedRuntime::deopt_blob()->unpack()); __ call(Z_R1_scratch); - - int entry_offset = __ offset(); - - __ z_bru(start); - guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } void LIR_Assembler::jobject2reg(jobject o, Register reg) { diff --git a/src/hotspot/cpu/s390/runtime_s390.cpp b/src/hotspot/cpu/s390/runtime_s390.cpp index 658fba069b4..314c407af91 100644 --- a/src/hotspot/cpu/s390/runtime_s390.cpp +++ b/src/hotspot/cpu/s390/runtime_s390.cpp @@ -43,6 +43,8 @@ //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end +// Using exception blob, this code is jumped from a compiled method. +// (see emit_exception_handler in s390.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/s390/s390.ad b/src/hotspot/cpu/s390/s390.ad index 2f12aa4c03c..2b2ce713491 100644 --- a/src/hotspot/cpu/s390/s390.ad +++ b/src/hotspot/cpu/s390/s390.ad @@ -1649,10 +1649,15 @@ source_hpp %{ // Header information of the source block. class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + return NativeJump::max_instruction_size(); + } + static uint size_deopt_handler() { - return NativeCall::max_instruction_size() + MacroAssembler::jump_pcrelative_size(); + return NativeCall::max_instruction_size(); } }; @@ -1667,6 +1672,43 @@ public: source %{ +// This exception handler code snippet is placed after the method's +// code. It is the return point if an exception occurred. it jumps to +// the exception blob. +// +// If the method gets deoptimized, the method and this code snippet +// get patched. +// +// 1) Trampoline code gets patched into the end of this exception +// handler. the trampoline code jumps to the deoptimization blob. +// +// 2) The return address in the method's code will get patched such +// that it jumps to the trampoline. +// +// 3) The handler will get patched such that it does not jump to the +// exception blob, but to an entry in the deoptimization blob being +// aware of the exception. +int HandlerImpl::emit_exception_handler(C2_MacroAssembler *masm) { + Register temp_reg = Z_R1; + + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + + int offset = __ offset(); + // Use unconditional pc-relative jump with 32-bit range here. + __ load_const_optimized(temp_reg, (address)OptoRuntime::exception_blob()->content_begin()); + __ z_br(temp_reg); + + assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); + + __ end_a_stub(); + + return offset; +} + // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { address base = __ start_a_stub(size_deopt_handler()); @@ -1678,22 +1720,14 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { int offset = __ offset(); - Label start; - __ bind(start); - // Size_deopt_handler() must be exact on zarch, so for simplicity // we do not use load_const_opt here. __ load_const(Z_R1, SharedRuntime::deopt_blob()->unpack()); __ call(Z_R1); - - int entry_offset = __ offset(); - - __ z_bru(start); - assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size"); __ end_a_stub(); - return entry_offset; + return offset; } //============================================================================= diff --git a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp index 5b6f7dcd984..a3605f649cc 100644 --- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp @@ -2544,10 +2544,14 @@ void SharedRuntime::generate_deopt_blob() { // Normal entry (non-exception case) // // We have been called from the deopt handler of the deoptee. - // Z_R14 points to the entry point of the deopt handler. + // Z_R14 points behind the call in the deopt handler. We adjust + // it such that it points to the start of the deopt handler. // The return_pc has been stored in the frame of the deoptee and // will replace the address of the deopt_handler in the call // to Deoptimization::fetch_unroll_info below. + // The (int) cast is necessary, because -((unsigned int)14) + // is an unsigned int. + __ add2reg(Z_R14, -(int)NativeCall::max_instruction_size()); const Register exec_mode_reg = Z_tmp_1; diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp index 6600d841050..edeb0baea0e 100644 --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp @@ -450,20 +450,14 @@ int LIR_Assembler::emit_deopt_handler() { } int offset = code_offset(); + InternalAddress here(__ pc()); - Label start; - __ bind(start); - - __ call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - - int entry_offset = __ offset(); - - __ jmp(start); - + __ pushptr(here.addr(), rscratch1); + __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); guarantee(code_offset() - offset <= deopt_handler_size(), "overflow"); __ end_a_stub(); - return entry_offset; + return offset; } void LIR_Assembler::return_op(LIR_Opr result, C1SafepointPollStub* code_stub) { diff --git a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp index 7a8fbc75ba7..8524dc90276 100644 --- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp +++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.hpp @@ -48,7 +48,7 @@ enum { _call_stub_size = 28, _exception_handler_size = DEBUG_ONLY(1*K) NOT_DEBUG(175), - _deopt_handler_size = 10 + _deopt_handler_size = 17 }; public: diff --git a/src/hotspot/cpu/x86/runtime_x86_64.cpp b/src/hotspot/cpu/x86/runtime_x86_64.cpp index 5bf65299a0c..7b98cf4fad7 100644 --- a/src/hotspot/cpu/x86/runtime_x86_64.cpp +++ b/src/hotspot/cpu/x86/runtime_x86_64.cpp @@ -242,6 +242,8 @@ UncommonTrapBlob* OptoRuntime::generate_uncommon_trap_blob() { //------------------------------generate_exception_blob--------------------------- // creates exception blob at the end +// Using exception blob, this code is jumped from a compiled method. +// (see emit_exception_handler in x86_64.ad file) // // Given an exception pc at a call we call into the runtime for the // handler in this method. This handler might merely restore state diff --git a/src/hotspot/cpu/x86/x86.ad b/src/hotspot/cpu/x86/x86.ad index 783ed038858..9a0bbdc27a0 100644 --- a/src/hotspot/cpu/x86/x86.ad +++ b/src/hotspot/cpu/x86/x86.ad @@ -2767,11 +2767,21 @@ class HandlerImpl { public: + static int emit_exception_handler(C2_MacroAssembler *masm); static int emit_deopt_handler(C2_MacroAssembler* masm); + static uint size_exception_handler() { + // NativeCall instruction size is the same as NativeJump. + // exception handler starts out as jump and can be patched to + // a call be deoptimization. (4932387) + // Note that this value is also credited (in output.cpp) to + // the size of the code section. + return NativeJump::instruction_size; + } + static uint size_deopt_handler() { - // one call and one jmp. - return 10; + // three 5 byte instructions plus one move for unreachable address. + return 15+3; } }; @@ -2863,6 +2873,24 @@ int MachNode::compute_padding(int current_offset) const { } } +// Emit exception handler code. +// Stuff framesize into a register and call a VM stub routine. +int HandlerImpl::emit_exception_handler(C2_MacroAssembler* masm) { + + // Note that the code buffer's insts_mark is always relative to insts. + // That's why we must use the macroassembler to generate a handler. + address base = __ start_a_stub(size_exception_handler()); + if (base == nullptr) { + ciEnv::current()->record_failure("CodeCache is full"); + return 0; // CodeBuffer::expand failed + } + int offset = __ offset(); + __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); + assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); + __ end_a_stub(); + return offset; +} + // Emit deopt handler code. int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { @@ -2875,18 +2903,21 @@ int HandlerImpl::emit_deopt_handler(C2_MacroAssembler* masm) { } int offset = __ offset(); - Label start; - __ bind(start); + address the_pc = (address) __ pc(); + Label next; + // push a "the_pc" on the stack without destroying any registers + // as they all may be live. - __ call(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - - int entry_offset = __ offset(); - - __ jmp(start); + // push address of "next" + __ call(next, relocInfo::none); // reloc none is fine since it is a disp32 + __ bind(next); + // adjust it so it matches "the_pc" + __ subptr(Address(rsp, 0), __ offset() - offset); + __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow %d", (__ offset() - offset)); __ end_a_stub(); - return entry_offset; + return offset; } static Assembler::Width widthForType(BasicType bt) { diff --git a/src/hotspot/os/posix/signals_posix.cpp b/src/hotspot/os/posix/signals_posix.cpp index 625eb63445a..5833e324070 100644 --- a/src/hotspot/os/posix/signals_posix.cpp +++ b/src/hotspot/os/posix/signals_posix.cpp @@ -621,7 +621,7 @@ int JVM_HANDLE_XXX_SIGNAL(int sig, siginfo_t* info, if (cb != nullptr && cb->is_nmethod()) { nmethod* nm = cb->as_nmethod(); assert(nm->insts_contains_inclusive(pc), ""); - address deopt = nm->deopt_handler_entry(); + address deopt = nm->deopt_handler_begin(); assert(deopt != nullptr, ""); frame fr = os::fetch_frame_from_context(uc); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp index 4b84e2fdfdb..ce2baeaf46c 100644 --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -2795,7 +2795,7 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) { if (cb != nullptr && cb->is_nmethod()) { nmethod* nm = cb->as_nmethod(); frame fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord); - address deopt = nm->deopt_handler_entry(); + address deopt = nm->deopt_handler_begin(); assert(nm->insts_contains_inclusive(pc), ""); nm->set_original_pc(&fr, pc); // Set pc to handler diff --git a/src/hotspot/share/ci/ciEnv.cpp b/src/hotspot/share/ci/ciEnv.cpp index 92bacc4c2c3..79ab881e7f6 100644 --- a/src/hotspot/share/ci/ciEnv.cpp +++ b/src/hotspot/share/ci/ciEnv.cpp @@ -1057,9 +1057,7 @@ void ciEnv::register_method(ciMethod* target, } assert(offsets->value(CodeOffsets::Deopt) != -1, "must have deopt entry"); - - assert(compiler->type() == compiler_c2 || - offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry"); + assert(offsets->value(CodeOffsets::Exceptions) != -1, "must have exception entry"); nm = nmethod::new_nmethod(method, compile_id(), diff --git a/src/hotspot/share/code/nmethod.cpp b/src/hotspot/share/code/nmethod.cpp index c2f8b46f00e..d91af9b4991 100644 --- a/src/hotspot/share/code/nmethod.cpp +++ b/src/hotspot/share/code/nmethod.cpp @@ -1302,7 +1302,7 @@ nmethod::nmethod( } // Native wrappers do not have deopt handlers. Make the values // something that will never match a pc like the nmethod vtable entry - _deopt_handler_entry_offset = 0; + _deopt_handler_offset = 0; _unwind_handler_offset = 0; CHECKED_CAST(_oops_size, uint16_t, align_up(code_buffer->total_oop_size(), oopSize)); @@ -1442,7 +1442,7 @@ nmethod::nmethod(const nmethod &nm) : CodeBlob(nm._name, nm._kind, nm._size, nm. _skipped_instructions_size = nm._skipped_instructions_size; _stub_offset = nm._stub_offset; _exception_offset = nm._exception_offset; - _deopt_handler_entry_offset = nm._deopt_handler_entry_offset; + _deopt_handler_offset = nm._deopt_handler_offset; _unwind_handler_offset = nm._unwind_handler_offset; _num_stack_arg_slots = nm._num_stack_arg_slots; _oops_size = nm._oops_size; @@ -1704,26 +1704,19 @@ nmethod::nmethod( _exception_offset = -1; } if (offsets->value(CodeOffsets::Deopt) != -1) { - _deopt_handler_entry_offset = code_offset() + offsets->value(CodeOffsets::Deopt); + _deopt_handler_offset = code_offset() + offsets->value(CodeOffsets::Deopt); } else { - _deopt_handler_entry_offset = -1; + _deopt_handler_offset = -1; } } else #endif { // Exception handler and deopt handler are in the stub section + assert(offsets->value(CodeOffsets::Exceptions) != -1, "must be set"); assert(offsets->value(CodeOffsets::Deopt ) != -1, "must be set"); - bool has_exception_handler = (offsets->value(CodeOffsets::Exceptions) != -1); - assert(has_exception_handler == (compiler->type() != compiler_c2), - "C2 compiler doesn't provide exception handler stub code."); - if (has_exception_handler) { - _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); - } else { - _exception_offset = -1; - } - - _deopt_handler_entry_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); + _exception_offset = _stub_offset + offsets->value(CodeOffsets::Exceptions); + _deopt_handler_offset = _stub_offset + offsets->value(CodeOffsets::Deopt); } if (offsets->value(CodeOffsets::UnwindHandler) != -1) { // C1 generates UnwindHandler at the end of instructions section. @@ -4031,7 +4024,7 @@ const char* nmethod::nmethod_section_label(address pos) const { // Check stub_code before checking exception_handler or deopt_handler. if (pos == this->stub_begin()) label = "[Stub Code]"; if (JVMCI_ONLY(_exception_offset >= 0 &&) pos == exception_begin()) label = "[Exception Handler]"; - if (JVMCI_ONLY(_deopt_handler_entry_offset != -1 &&) pos == deopt_handler_entry()) label = "[Deopt Handler Entry Point]"; + if (JVMCI_ONLY(_deopt_handler_offset != -1 &&) pos == deopt_handler_begin()) label = "[Deopt Handler Code]"; return label; } diff --git a/src/hotspot/share/code/nmethod.hpp b/src/hotspot/share/code/nmethod.hpp index 0fa9d7fda9e..34accf428b6 100644 --- a/src/hotspot/share/code/nmethod.hpp +++ b/src/hotspot/share/code/nmethod.hpp @@ -229,7 +229,7 @@ class nmethod : public CodeBlob { int _exception_offset; // All deoptee's will resume execution at this location described by // this offset. - int _deopt_handler_entry_offset; + int _deopt_handler_offset; // Offset (from insts_end) of the unwind handler if it exists int16_t _unwind_handler_offset; // Number of arguments passed on the stack @@ -617,7 +617,7 @@ public: address stub_begin () const { return header_begin() + _stub_offset ; } address stub_end () const { return code_end() ; } address exception_begin () const { return header_begin() + _exception_offset ; } - address deopt_handler_entry () const { return header_begin() + _deopt_handler_entry_offset ; } + address deopt_handler_begin () const { return header_begin() + _deopt_handler_offset ; } address unwind_handler_begin () const { return _unwind_handler_offset != -1 ? (insts_end() - _unwind_handler_offset) : nullptr; } oop* oops_begin () const { return (oop*) data_begin(); } oop* oops_end () const { return (oop*) data_end(); } diff --git a/src/hotspot/share/code/nmethod.inline.hpp b/src/hotspot/share/code/nmethod.inline.hpp index ecee3c0c31a..44331db669c 100644 --- a/src/hotspot/share/code/nmethod.inline.hpp +++ b/src/hotspot/share/code/nmethod.inline.hpp @@ -34,7 +34,7 @@ inline bool nmethod::is_deopt_pc(address pc) { return is_deopt_entry(pc); } inline bool nmethod::is_deopt_entry(address pc) { - return pc == deopt_handler_entry(); + return pc == deopt_handler_begin(); } // class ExceptionCache methods diff --git a/src/hotspot/share/opto/output.cpp b/src/hotspot/share/opto/output.cpp index 136fc8ac864..84c01c68e38 100644 --- a/src/hotspot/share/opto/output.cpp +++ b/src/hotspot/share/opto/output.cpp @@ -1347,18 +1347,20 @@ CodeBuffer* PhaseOutput::init_buffer() { // nmethod and CodeBuffer count stubs & constants as part of method's code. // class HandlerImpl is platform-specific and defined in the *.ad files. + int exception_handler_req = HandlerImpl::size_exception_handler() + MAX_stubs_size; // add marginal slop for handler int deopt_handler_req = HandlerImpl::size_deopt_handler() + MAX_stubs_size; // add marginal slop for handler stub_req += MAX_stubs_size; // ensure per-stub margin code_req += MAX_inst_size; // ensure per-instruction margin if (StressCodeBuffers) - code_req = const_req = stub_req = deopt_handler_req = 0x10; // force expansion + code_req = const_req = stub_req = exception_handler_req = deopt_handler_req = 0x10; // force expansion int total_req = const_req + code_req + pad_req + stub_req + + exception_handler_req + deopt_handler_req; // deopt handler CodeBuffer* cb = code_buffer(); @@ -1787,6 +1789,8 @@ void PhaseOutput::fill_buffer(C2_MacroAssembler* masm, uint* blk_starts) { // Only java methods have exception handlers and deopt handlers // class HandlerImpl is platform-specific and defined in the *.ad files. if (C->method()) { + // Emit the exception handler code. + _code_offsets.set_value(CodeOffsets::Exceptions, HandlerImpl::emit_exception_handler(masm)); if (C->failing()) { return; // CodeBuffer::expand failed } diff --git a/src/hotspot/share/runtime/deoptimization.cpp b/src/hotspot/share/runtime/deoptimization.cpp index e2029a26d37..0aa7b392b17 100644 --- a/src/hotspot/share/runtime/deoptimization.cpp +++ b/src/hotspot/share/runtime/deoptimization.cpp @@ -498,9 +498,6 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread RegisterMap::WalkContinuation::skip); // Now get the deoptee with a valid map frame deoptee = stub_frame.sender(&map); - if (exec_mode == Unpack_deopt) { - assert(deoptee.is_deoptimized_frame(), "frame is not marked for deoptimization"); - } // Set the deoptee nmethod assert(current->deopt_compiled_method() == nullptr, "Pending deopt!"); nmethod* nm = deoptee.cb()->as_nmethod_or_null(); diff --git a/src/hotspot/share/runtime/frame.cpp b/src/hotspot/share/runtime/frame.cpp index 8f969600ba8..b5cd4acc75d 100644 --- a/src/hotspot/share/runtime/frame.cpp +++ b/src/hotspot/share/runtime/frame.cpp @@ -206,7 +206,7 @@ address frame::raw_pc() const { if (is_deoptimized_frame()) { nmethod* nm = cb()->as_nmethod_or_null(); assert(nm != nullptr, "only nmethod is expected here"); - return nm->deopt_handler_entry() - pc_return_offset; + return nm->deopt_handler_begin() - pc_return_offset; } else { return (pc() - pc_return_offset); } @@ -355,7 +355,7 @@ void frame::deoptimize(JavaThread* thread) { // If the call site is a MethodHandle call site use the MH deopt handler. nmethod* nm = _cb->as_nmethod(); - address deopt = nm->deopt_handler_entry(); + address deopt = nm->deopt_handler_begin(); NativePostCallNop* inst = nativePostCallNop_at(pc()); diff --git a/src/hotspot/share/runtime/sharedRuntime.cpp b/src/hotspot/share/runtime/sharedRuntime.cpp index afa4558c7ae..8ede4d1082a 100644 --- a/src/hotspot/share/runtime/sharedRuntime.cpp +++ b/src/hotspot/share/runtime/sharedRuntime.cpp @@ -87,9 +87,6 @@ #ifdef COMPILER1 #include "c1/c1_Runtime1.hpp" #endif -#ifdef COMPILER2 -#include "opto/runtime.hpp" -#endif #if INCLUDE_JFR #include "jfr/jfr.inline.hpp" #endif @@ -604,11 +601,6 @@ address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* curr // The deferred StackWatermarkSet::after_unwind check will be performed in // * OptoRuntime::handle_exception_C_helper for C2 code // * exception_handler_for_pc_helper via Runtime1::handle_exception_from_callee_id for C1 code -#ifdef COMPILER2 - if (nm->compiler_type() == compiler_c2) { - return OptoRuntime::exception_blob()->entry_point(); - } -#endif // COMPILER2 return nm->exception_begin(); } } diff --git a/src/hotspot/share/runtime/vmStructs.cpp b/src/hotspot/share/runtime/vmStructs.cpp index 2ce6a6cac76..a7342448522 100644 --- a/src/hotspot/share/runtime/vmStructs.cpp +++ b/src/hotspot/share/runtime/vmStructs.cpp @@ -535,7 +535,7 @@ nonstatic_field(nmethod, _osr_link, nmethod*) \ nonstatic_field(nmethod, _state, volatile signed char) \ nonstatic_field(nmethod, _exception_offset, int) \ - nonstatic_field(nmethod, _deopt_handler_entry_offset, int) \ + nonstatic_field(nmethod, _deopt_handler_offset, int) \ nonstatic_field(nmethod, _orig_pc_offset, int) \ nonstatic_field(nmethod, _stub_offset, int) \ nonstatic_field(nmethod, _immutable_data_ref_count_offset, int) \ diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java index f935c56b536..91302dba0f6 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/code/NMethod.java @@ -48,7 +48,7 @@ public class NMethod extends CodeBlob { /** Offsets for different nmethod parts */ private static CIntegerField exceptionOffsetField; - private static CIntegerField deoptHandlerEntryOffsetField; + private static CIntegerField deoptHandlerOffsetField; private static CIntegerField origPCOffsetField; private static CIntegerField stubOffsetField; private static CIntField handlerTableOffsetField; @@ -86,7 +86,7 @@ public class NMethod extends CodeBlob { immutableDataField = type.getAddressField("_immutable_data"); immutableDataSizeField = type.getCIntegerField("_immutable_data_size"); exceptionOffsetField = type.getCIntegerField("_exception_offset"); - deoptHandlerEntryOffsetField = type.getCIntegerField("_deopt_handler_entry_offset"); + deoptHandlerOffsetField = type.getCIntegerField("_deopt_handler_offset"); origPCOffsetField = type.getCIntegerField("_orig_pc_offset"); stubOffsetField = type.getCIntegerField("_stub_offset"); scopesPCsOffsetField = type.getCIntegerField("_scopes_pcs_offset"); @@ -121,16 +121,16 @@ public class NMethod extends CodeBlob { public boolean isOSRMethod() { return getEntryBCI() != VM.getVM().getInvocationEntryBCI(); } /** Boundaries for different parts */ - public Address constantsBegin() { return contentBegin(); } - public Address constantsEnd() { return codeBegin(); } - public Address instsBegin() { return codeBegin(); } - public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } - public Address deoptHandlerEntry() { return headerBegin().addOffsetTo(getDeoptHandlerEntryOffset()); } - public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } - public Address stubEnd() { return dataBegin(); } - public Address oopsBegin() { return dataBegin(); } - public Address oopsEnd() { return dataEnd(); } + public Address constantsBegin() { return contentBegin(); } + public Address constantsEnd() { return codeBegin(); } + public Address instsBegin() { return codeBegin(); } + public Address instsEnd() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address exceptionBegin() { return headerBegin().addOffsetTo(getExceptionOffset()); } + public Address deoptHandlerBegin() { return headerBegin().addOffsetTo(getDeoptHandlerOffset()); } + public Address stubBegin() { return headerBegin().addOffsetTo(getStubOffset()); } + public Address stubEnd() { return dataBegin(); } + public Address oopsBegin() { return dataBegin(); } + public Address oopsEnd() { return dataEnd(); } public Address immutableDataBegin() { return immutableDataField.getValue(addr); } public Address immutableDataEnd() { return immutableDataBegin().addOffsetTo(getImmutableDataSize()); } @@ -262,7 +262,7 @@ public class NMethod extends CodeBlob { // Deopt // Return true is the PC is one would expect if the frame is being deopted. public boolean isDeoptPc (Address pc) { return isDeoptEntry(pc); } - public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerEntry(); } + public boolean isDeoptEntry (Address pc) { return pc == deoptHandlerBegin(); } /** Tells whether frames described by this nmethod can be deoptimized. Note: native wrappers cannot be deoptimized. */ @@ -490,7 +490,7 @@ public class NMethod extends CodeBlob { private int getEntryBCI() { return (int) entryBCIField .getValue(addr); } private int getExceptionOffset() { return (int) exceptionOffsetField .getValue(addr); } - private int getDeoptHandlerEntryOffset() { return (int) deoptHandlerEntryOffsetField .getValue(addr); } + private int getDeoptHandlerOffset() { return (int) deoptHandlerOffsetField .getValue(addr); } private int getStubOffset() { return (int) stubOffsetField .getValue(addr); } private int getScopesDataOffset() { return (int) scopesDataOffsetField .getValue(addr); } private int getScopesPCsOffset() { return (int) scopesPCsOffsetField .getValue(addr); } diff --git a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java index ee9e0ecdafd..27efb631f79 100644 --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/Frame.java @@ -87,7 +87,7 @@ public abstract class Frame implements Cloneable { CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc); if (cb != null && cb.isJavaMethod()) { NMethod nm = (NMethod) cb; - if (pc.equals(nm.deoptHandlerEntry())) { + if (pc.equals(nm.deoptHandlerBegin())) { if (Assert.ASSERTS_ENABLED) { Assert.that(this.getUnextendedSP() != null, "null SP in Java frame"); } diff --git a/test/hotspot/jtreg/runtime/vthread/Deoptimization.java b/test/hotspot/jtreg/runtime/vthread/Deoptimization.java deleted file mode 100644 index 050848c3a72..00000000000 --- a/test/hotspot/jtreg/runtime/vthread/Deoptimization.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright 2025 Arm Limited and/or its affiliates. - * 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. - */ - -/** - * @test id=vthread-deopt-c1 - * @summary Deoptimization test for virtual threads (C1) - * @requires vm.continuations - * @requires vm.compiler1.enabled - * @requires vm.opt.TieredStopAtLevel != 0 - * @library /test/lib - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. - * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI - * -XX:-BackgroundCompilation - * -XX:TieredStopAtLevel=1 - * Deoptimization - */ - -/** - * @test id=vthread-deopt-c2 - * @summary Deoptimization test for virtual threads (C2) - * @requires vm.continuations - * @requires vm.compiler2.enabled - * @library /test/lib - * @build jdk.test.whitebox.WhiteBox - * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox - * @run main/othervm -Xbootclasspath/a:. - * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI - * -XX:-BackgroundCompilation - * -XX:-TieredCompilation - * Deoptimization - */ - -import java.lang.reflect.Method; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.BrokenBarrierException; -import java.util.concurrent.CyclicBarrier; -import java.util.Objects; -import jdk.test.whitebox.WhiteBox; - -public class Deoptimization { - static final WhiteBox white_box = WhiteBox.getWhiteBox(); - - static class TestTask implements Runnable { - CyclicBarrier start_barrier = null; - AtomicInteger completed_number = new AtomicInteger(0); - - public void reset(int barrier_parties) { - start_barrier = new CyclicBarrier(barrier_parties); - completed_number.set(0); - } - - public int getNumberWaiting() { - return start_barrier.getNumberWaiting(); - } - - public int getNumberCompleted() { - return completed_number.get(); - } - - public void await() throws BrokenBarrierException, InterruptedException { - start_barrier.await(); - } - - public void run() { - try { - await(); - } catch(BrokenBarrierException e) { - return; - } catch(InterruptedException e) { - return; - } - - completed_number.getAndIncrement(); - } - } - - static void test(TestTask task, Method method, int vthreads_num) throws Exception { - task.reset(vthreads_num + 1 /* 1 for the main thread */); - - Thread[] vthreads = new Thread[vthreads_num]; - for (int i = 0; i < vthreads_num; i++) { - vthreads[i] = Thread.startVirtualThread(task); - } - - while (task.getNumberWaiting() != vthreads_num) { - Thread.onSpinWait(); - } - - if (method != null) { - if (!white_box.isMethodCompiled(method, false)) { - throw new Error("Unexpectedly, it is not compiled."); - } - - white_box.deoptimizeMethod(method); - - if (white_box.isMethodCompiled(method, false)) { - throw new Error("Unexpectedly, it is compiled."); - } - } - - task.await(); - - for (int i = 0; i < vthreads_num; i++) { - vthreads[i].join(); - } - - if (task.getNumberCompleted() != vthreads_num) { - throw new Error("Some threads didn't reach completion"); - } - } - - static int getIntegerOption(String option_name) { - Object option_object = white_box.getVMFlag(option_name); - String option_string = Objects.toString(option_object); - return Integer.parseInt(option_string); - } - - public static void main(String[] args) throws Exception { - int tiered_stop_at_level = getIntegerOption("TieredStopAtLevel"); - - Method method_run = TestTask.class.getMethod("run"); - white_box.testSetDontInlineMethod(method_run, true); - - Method method_await = TestTask.class.getMethod("await"); - white_box.testSetDontInlineMethod(method_await, true); - - TestTask task = new TestTask(); - - // Warm-up - test(task, null, 2); - - white_box.enqueueMethodForCompilation(method_run, tiered_stop_at_level); - - // Deoptimization test - test(task, method_run, 10000); - } -} From 3d6824e802bda6efed40f7613eda7c8c0d84e673 Mon Sep 17 00:00:00 2001 From: Tobias Hartmann Date: Fri, 7 Nov 2025 09:19:18 +0000 Subject: [PATCH 504/561] 8371432: [BACKOUT] 8359256: AArch64: Use SHA3 GPR intrinsic where it's faster Reviewed-by: mchevalier, epeter, syan --- src/hotspot/cpu/aarch64/globals_aarch64.hpp | 2 +- .../cpu/aarch64/vm_version_aarch64.cpp | 30 ++++++++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/hotspot/cpu/aarch64/globals_aarch64.hpp b/src/hotspot/cpu/aarch64/globals_aarch64.hpp index 107919b2cbd..8e520314c8b 100644 --- a/src/hotspot/cpu/aarch64/globals_aarch64.hpp +++ b/src/hotspot/cpu/aarch64/globals_aarch64.hpp @@ -95,7 +95,7 @@ define_pd_global(intx, InlineSmallCode, 1000); "Use simplest and shortest implementation for array equals") \ product(bool, UseSIMDForBigIntegerShiftIntrinsics, true, \ "Use SIMD instructions for left/right shift of BigInteger") \ - product(bool, UseSIMDForSHA3Intrinsic, false, \ + product(bool, UseSIMDForSHA3Intrinsic, true, \ "Use SIMD SHA3 instructions for SHA3 intrinsic") \ product(bool, AvoidUnalignedAccesses, false, \ "Avoid generating unaligned memory accesses") \ diff --git a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp index b47bfe6a89f..a04e9defa4b 100644 --- a/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/vm_version_aarch64.cpp @@ -375,24 +375,18 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseSHA256Intrinsics, false); } - if (UseSHA && VM_Version::supports_sha3() && _cpu == CPU_APPLE && FLAG_IS_DEFAULT(UseSIMDForSHA3Intrinsic)) { - // Note: SIMD faster on Apple, worse on Neoverse V1, V2 and N2. - FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, true); - } - - // Enable SHA-3 intrinsics (SIMD or GPR). The GPR path does not require SHA instructions. - if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { - FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); - } - - if (!UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { - // Keep flags consistent: if SHA3 intrinsics are off, disable the SHA3 SIMD variant. - FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, false); - } - - if (!VM_Version::supports_sha3() && UseSIMDForSHA3Intrinsic) { - warning("SHA3 instructions are not available on this CPU"); - FLAG_SET_DEFAULT(UseSIMDForSHA3Intrinsic, false); + if (UseSHA && VM_Version::supports_sha3()) { + // Auto-enable UseSHA3Intrinsics on hardware with performance benefit. + // Note that the evaluation of UseSHA3Intrinsics shows better performance + // on Apple silicon but worse performance on Neoverse V1 and N2. + if (_cpu == CPU_APPLE) { // Apple silicon + if (FLAG_IS_DEFAULT(UseSHA3Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA3Intrinsics, true); + } + } + } else if (UseSHA3Intrinsics && UseSIMDForSHA3Intrinsic) { + warning("Intrinsics for SHA3-224, SHA3-256, SHA3-384 and SHA3-512 crypto hash functions not available on this CPU."); + FLAG_SET_DEFAULT(UseSHA3Intrinsics, false); } if (UseSHA && VM_Version::supports_sha512()) { From 4233178af20f07ade32322fad931c68e1c4251cf Mon Sep 17 00:00:00 2001 From: Jayathirth D V Date: Fri, 7 Nov 2025 09:45:48 +0000 Subject: [PATCH 505/561] 8368729: Add appropriate checks in java.awt.image.Kernel constructor Reviewed-by: azvegint, prr, kizune --- .../share/classes/java/awt/image/Kernel.java | 29 +++++++-- .../ConvolveOp/KernelInitialisationTest.java | 60 +++++++++++++++++++ 2 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 test/jdk/java/awt/image/ConvolveOp/KernelInitialisationTest.java diff --git a/src/java.desktop/share/classes/java/awt/image/Kernel.java b/src/java.desktop/share/classes/java/awt/image/Kernel.java index d8ebc501db6..d2b9760aba5 100644 --- a/src/java.desktop/share/classes/java/awt/image/Kernel.java +++ b/src/java.desktop/share/classes/java/awt/image/Kernel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -59,21 +59,38 @@ public class Kernel implements Cloneable { * @param width width of the kernel * @param height height of the kernel * @param data kernel data in row major order + * @throws IllegalArgumentException if {@code data} is null + * @throws IllegalArgumentException if {@code width} or {@code height} + * is not positive + * @throws IllegalArgumentException if product of {@code width} and + * {@code height} overflows an int * @throws IllegalArgumentException if the length of {@code data} * is less than the product of {@code width} and * {@code height} */ public Kernel(int width, int height, float[] data) { - this.width = width; - this.height = height; - this.xOrigin = (width-1)>>1; - this.yOrigin = (height-1)>>1; - int len = width*height; + if (data == null) { + throw new IllegalArgumentException("Data must not be null"); + } + if ((width <= 0) || (height <= 0)) { + throw new IllegalArgumentException("Invalid width or height"); + } + int len = 0; + try { + len = Math.multiplyExact(width, height); + } catch (ArithmeticException e) { + throw new IllegalArgumentException("width * height results in" + + " integer overflow"); + } if (data.length < len) { throw new IllegalArgumentException("Data array too small "+ "(is "+data.length+ " and should be "+len); } + this.width = width; + this.height = height; + this.xOrigin = (width - 1) >> 1; + this.yOrigin = (height - 1) >> 1; this.data = new float[len]; System.arraycopy(data, 0, this.data, 0, len); diff --git a/test/jdk/java/awt/image/ConvolveOp/KernelInitialisationTest.java b/test/jdk/java/awt/image/ConvolveOp/KernelInitialisationTest.java new file mode 100644 index 00000000000..607f0a7a8dc --- /dev/null +++ b/test/jdk/java/awt/image/ConvolveOp/KernelInitialisationTest.java @@ -0,0 +1,60 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8368729 + * @summary Tests that passing invalid values to Kernel constructor + * throws only IllegalArgumentException + */ + +import java.awt.image.Kernel; + +public class KernelInitialisationTest { + private static void expectIllegalArgumentException(Runnable code) { + try { + code.run(); + throw new RuntimeException("Expected IllegalArgumentException" + + " but no exception was thrown"); + } catch (IllegalArgumentException e) { + // we expect IllegalArgumentException + } + } + + private static void testKernel(int width, int height, float[] data) { + System.out.println("Testing for width: " + width + ", height: " + + height + ", data: " + (data == null ? "null" : "not null")); + expectIllegalArgumentException(() -> new Kernel(width, height, data)); + } + + public static void main(String[] args) { + testKernel(-1, 1, new float[100]); + testKernel(1, -1, new float[100]); + testKernel(-1, -1, new float[100]); + testKernel(1, 1, null); + + int width = 50; + int height = Integer.MAX_VALUE; + testKernel(width, height, new float[100]); + } +} From 428b553ad4ee79e5d56f51232c27ed0b003abe18 Mon Sep 17 00:00:00 2001 From: Christian Stein Date: Fri, 7 Nov 2025 09:55:16 +0000 Subject: [PATCH 506/561] 8278856: javac documentation does not mention use of Manifest class-path attribute Reviewed-by: jlahoda --- src/jdk.compiler/share/man/javac.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/jdk.compiler/share/man/javac.md b/src/jdk.compiler/share/man/javac.md index 46246624e53..1822931bf40 100644 --- a/src/jdk.compiler/share/man/javac.md +++ b/src/jdk.compiler/share/man/javac.md @@ -1311,6 +1311,12 @@ although some module-related path options allow a package hierarchy to be specified on a per-module basis. All other path options are used to specify package hierarchies. +When a JAR file in the user class path has a `Class-Path` manifest attribute, +and the specified JAR file(s) exist, they are automatically inserted into the +user class path after the JAR file. This rule also applies recursively to any +new JAR files found. Consult the [JAR File Specification](../jar/jar.html#class-path-attribute) +for details. + ### Package Hierarchy In a package hierarchy, directories and subdirectories are used From 59d23095789bbb6d4e466bcbeb82089b17d78eae Mon Sep 17 00:00:00 2001 From: Fei Yang Date: Fri, 7 Nov 2025 10:10:14 +0000 Subject: [PATCH 507/561] 8371385: compiler/escapeAnalysis/TestRematerializeObjects.java fails in case of -XX:-UseUnalignedAccesses Reviewed-by: chagedorn, dfenacci --- .../compiler/escapeAnalysis/TestRematerializeObjects.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/hotspot/jtreg/compiler/escapeAnalysis/TestRematerializeObjects.java b/test/hotspot/jtreg/compiler/escapeAnalysis/TestRematerializeObjects.java index 4f88dcb6a82..d2fdf47b060 100644 --- a/test/hotspot/jtreg/compiler/escapeAnalysis/TestRematerializeObjects.java +++ b/test/hotspot/jtreg/compiler/escapeAnalysis/TestRematerializeObjects.java @@ -79,12 +79,12 @@ public class TestRematerializeObjects { IRNode.UNSTABLE_IF_TRAP, "1", IRNode.STORE_L_OF_CLASS, "int\\[int:4\\]", "1", IRNode.SAFEPOINT_SCALAROBJECT_OF, "fields@\\[0..3\\]", "0"}, - applyIf = {"EliminateAllocations", "false"}) + applyIfAnd = {"EliminateAllocations", "false", "UseUnalignedAccesses", "true"}) @IR(counts = {IRNode.ALLOC_ARRAY, "0", IRNode.UNSTABLE_IF_TRAP, "1", IRNode.STORE_L_OF_CLASS, "int\\[int:4\\]", "0", IRNode.SAFEPOINT_SCALAROBJECT_OF, "fields@\\[0..3\\]", "2"}, - applyIf = {"EliminateAllocations", "true"}) + applyIfAnd = {"EliminateAllocations", "true", "UseUnalignedAccesses", "true"}) static int test1(boolean flag) { int[] arr = new int[4]; arr[0] = 0x0001_0000; // these slip into Initialize @@ -124,12 +124,12 @@ public class TestRematerializeObjects { IRNode.UNSTABLE_IF_TRAP, "1", IRNode.STORE_I_OF_CLASS, "short\\[int:4\\]", "1", IRNode.SAFEPOINT_SCALAROBJECT_OF, "fields@\\[0..3\\]", "0"}, - applyIf = {"EliminateAllocations", "false"}) + applyIfAnd = {"EliminateAllocations", "false", "UseUnalignedAccesses", "true"}) @IR(counts = {IRNode.ALLOC_ARRAY, "0", IRNode.UNSTABLE_IF_TRAP, "1", IRNode.STORE_I_OF_CLASS, "short\\[int:4\\]", "0", IRNode.SAFEPOINT_SCALAROBJECT_OF, "fields@\\[0..3\\]", "2"}, - applyIf = {"EliminateAllocations", "true"}) + applyIfAnd = {"EliminateAllocations", "true", "UseUnalignedAccesses", "true"}) static int test2(boolean flag) { short[] arr = new short[4]; arr[0] = 1; From 167c952bb0fefb5acc9782f4f4474d92097c93f8 Mon Sep 17 00:00:00 2001 From: Albert Mingkun Yang Date: Fri, 7 Nov 2025 10:48:07 +0000 Subject: [PATCH 508/561] 8371369: Parallel: Relax precondition of PSOldGen::expand_and_allocate Reviewed-by: eosterlund, fandreuzzi --- src/hotspot/share/gc/parallel/mutableSpace.cpp | 11 +++++------ src/hotspot/share/gc/parallel/psOldGen.cpp | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/gc/parallel/mutableSpace.cpp b/src/hotspot/share/gc/parallel/mutableSpace.cpp index a8f47a387e3..6d30c5a8d1f 100644 --- a/src/hotspot/share/gc/parallel/mutableSpace.cpp +++ b/src/hotspot/share/gc/parallel/mutableSpace.cpp @@ -182,12 +182,11 @@ bool MutableSpace::cas_deallocate(HeapWord *obj, size_t size) { // Only used by oldgen allocation. bool MutableSpace::needs_expand(size_t word_size) const { -#ifdef ASSERT - // If called by VM thread, locking is not needed. - if (!Thread::current()->is_VM_thread()) { - assert_lock_strong(PSOldGenExpand_lock); - } -#endif + // This method can be invoked either outside of safepoint by java threads or + // in safepoint by gc workers. Such accesses are synchronized by holding one + // of the following locks. + assert(Heap_lock->is_locked() || PSOldGenExpand_lock->is_locked(), "precondition"); + // Holding the lock means end is stable. So while top may be advancing // via concurrent allocations, there is no need to order the reads of top // and end here, unlike in cas_allocate. diff --git a/src/hotspot/share/gc/parallel/psOldGen.cpp b/src/hotspot/share/gc/parallel/psOldGen.cpp index 2d4b0698ad0..4e614c53447 100644 --- a/src/hotspot/share/gc/parallel/psOldGen.cpp +++ b/src/hotspot/share/gc/parallel/psOldGen.cpp @@ -118,8 +118,8 @@ void PSOldGen::initialize_performance_counters() { } HeapWord* PSOldGen::expand_and_allocate(size_t word_size) { - assert(SafepointSynchronize::is_at_safepoint(), "precondition"); - assert(Thread::current()->is_VM_thread(), "precondition"); + assert(Heap_lock->is_locked(), "precondition"); + if (object_space()->needs_expand(word_size)) { expand(word_size*HeapWordSize); } From d5803aa78a84caccd5c3f14ac788817c5a3b4725 Mon Sep 17 00:00:00 2001 From: Jorn Vernee Date: Fri, 7 Nov 2025 14:06:37 +0000 Subject: [PATCH 509/561] 8371315: java/foreign/sharedclosejfr/TestSharedCloseJFR.java failed with -XX:-TieredCompilation Reviewed-by: mcimadamore, syan --- test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java b/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java index b59373b5b4e..913be05ac50 100644 --- a/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java +++ b/test/jdk/java/foreign/sharedclosejfr/TestSharedCloseJFR.java @@ -35,6 +35,7 @@ * @run main jdk.test.lib.FileInstaller sharedCloseJfr.jfc sharedCloseJfr.jfc * @run main/othervm * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:CompileCommand=exclude,*TestSharedCloseJFR.main * -XX:StartFlightRecording:filename=recording.jfr,dumponexit=true,settings=sharedCloseJfr.jfc * TestSharedCloseJFR */ From c8656449c28581ae9c3d815105e338e42253bb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20=C3=96sterlund?= Date: Fri, 7 Nov 2025 15:28:51 +0000 Subject: [PATCH 510/561] 8365932: Implementation of JEP 516: Ahead-of-Time Object Caching with Any GC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Axel Boldt-Christmas Co-authored-by: Joel Sikström Co-authored-by: Stefan Karlsson Reviewed-by: aboldtch, iklam, kvn --- make/Images.gmk | 1 - src/hotspot/share/cds/aotMapLogger.cpp | 264 ++-- src/hotspot/share/cds/aotMapLogger.hpp | 53 +- src/hotspot/share/cds/aotMappedHeapLoader.cpp | 847 ++++++++++++ ...HeapLoader.hpp => aotMappedHeapLoader.hpp} | 43 +- ...ine.hpp => aotMappedHeapLoader.inline.hpp} | 14 +- ...HeapWriter.cpp => aotMappedHeapWriter.cpp} | 320 +++-- ...HeapWriter.hpp => aotMappedHeapWriter.hpp} | 65 +- src/hotspot/share/cds/aotMetaspace.cpp | 80 +- src/hotspot/share/cds/aotMetaspace.hpp | 8 +- .../share/cds/aotReferenceObjSupport.cpp | 3 + .../share/cds/aotStreamedHeapLoader.cpp | 1190 +++++++++++++++++ .../share/cds/aotStreamedHeapLoader.hpp | 245 ++++ .../share/cds/aotStreamedHeapWriter.cpp | 614 +++++++++ .../share/cds/aotStreamedHeapWriter.hpp | 162 +++ src/hotspot/share/cds/aotThread.cpp | 114 ++ src/hotspot/share/cds/aotThread.hpp | 52 + src/hotspot/share/cds/archiveBuilder.cpp | 38 +- src/hotspot/share/cds/archiveBuilder.hpp | 14 +- src/hotspot/share/cds/archiveHeapLoader.cpp | 468 ------- src/hotspot/share/cds/archiveUtils.cpp | 1 - src/hotspot/share/cds/cdsConfig.cpp | 12 +- src/hotspot/share/cds/cdsEnumKlass.cpp | 9 +- src/hotspot/share/cds/cdsHeapVerifier.cpp | 3 +- src/hotspot/share/cds/cds_globals.hpp | 6 + src/hotspot/share/cds/dynamicArchive.cpp | 5 +- src/hotspot/share/cds/filemap.cpp | 506 +++---- src/hotspot/share/cds/filemap.hpp | 64 +- src/hotspot/share/cds/heapShared.cpp | 559 +++++--- src/hotspot/share/cds/heapShared.hpp | 210 ++- src/hotspot/share/cds/heapShared.inline.hpp | 114 ++ .../share/classfile/classLoaderDataGraph.cpp | 4 +- .../share/classfile/classLoaderDataShared.cpp | 31 +- .../share/classfile/classLoaderDataShared.hpp | 1 + src/hotspot/share/classfile/javaClasses.cpp | 5 +- src/hotspot/share/classfile/moduleEntry.cpp | 4 + src/hotspot/share/classfile/moduleEntry.hpp | 1 + src/hotspot/share/classfile/modules.cpp | 2 + src/hotspot/share/classfile/stringTable.cpp | 45 +- src/hotspot/share/classfile/stringTable.hpp | 3 +- .../share/classfile/systemDictionary.cpp | 2 +- src/hotspot/share/classfile/vmClasses.cpp | 41 +- src/hotspot/share/gc/shared/collectedHeap.cpp | 4 + src/hotspot/share/gc/shared/collectedHeap.hpp | 1 + .../shared/stringdedup/stringDedupConfig.cpp | 1 + .../shared/stringdedup/stringDedupTable.cpp | 7 +- .../share/gc/shenandoah/shenandoahHeap.cpp | 4 +- src/hotspot/share/gc/z/zArguments.cpp | 7 + src/hotspot/share/gc/z/zCollectedHeap.cpp | 5 + src/hotspot/share/gc/z/zCollectedHeap.hpp | 2 + src/hotspot/share/gc/z/zDirector.cpp | 7 + .../share/jfr/support/jfrThreadLocal.cpp | 9 +- src/hotspot/share/memory/universe.cpp | 28 +- src/hotspot/share/oops/constantPool.cpp | 8 +- src/hotspot/share/oops/klass.cpp | 5 +- src/hotspot/share/oops/objArrayOop.hpp | 2 +- src/hotspot/share/oops/oopsHierarchy.cpp | 2 - src/hotspot/share/prims/jni.cpp | 4 + src/hotspot/share/prims/jvmtiExport.cpp | 8 + src/hotspot/share/prims/jvmtiRawMonitor.cpp | 13 +- src/hotspot/share/prims/whitebox.cpp | 26 +- src/hotspot/share/runtime/javaThread.cpp | 4 +- src/hotspot/share/runtime/mutexLocker.cpp | 6 +- src/hotspot/share/runtime/mutexLocker.hpp | 1 + .../share/runtime/safepointVerifiers.cpp | 8 +- .../share/runtime/safepointVerifiers.hpp | 3 +- src/hotspot/share/runtime/thread.hpp | 1 + src/hotspot/share/runtime/threads.cpp | 26 +- src/hotspot/share/utilities/exceptions.cpp | 3 +- src/hotspot/share/utilities/macros.hpp | 2 +- test/hotspot/jtreg/ProblemList-AotJdk.txt | 1 + test/hotspot/jtreg/TEST.ROOT | 2 + test/hotspot/jtreg/TEST.groups | 3 +- .../jtreg/gc/TestPLABAdaptToMinTLABSize.java | 4 +- .../gc/stress/gcbasher/TestGCBasherWithZ.java | 4 +- .../hotspot/jtreg/runtime/cds/AOTMapTest.java | 14 +- .../jtreg/runtime/cds/SharedStrings.java | 2 +- .../jtreg/runtime/cds/SharedStringsDedup.java | 2 +- .../runtime/cds/SharedStringsRunAuto.java | 2 +- .../cds/SharedSymbolTableBucketSize.java | 5 +- .../cds/TestDefaultArchiveLoading.java | 2 + .../cds/appcds/TestParallelGCWithCDS.java | 35 +- .../cds/appcds/TestSerialGCWithCDS.java | 5 +- .../cds/appcds/TestZGCWithAOTHeap.java | 159 +++ .../aotClassLinking/AOTCacheWithZGC.java | 59 - .../aotCode/AOTCodeCompressedOopsTest.java | 2 + .../cacheObject/ArchivedIntegerCacheTest.java | 12 +- .../PrintSharedArchiveAndExit.java | 10 +- .../PrintSharedArchiveAndExit.java | 10 +- .../cds/appcds/sharedStrings/ExerciseGC.java | 3 +- .../cds/appcds/sharedStrings/FlagCombo.java | 8 +- .../sharedStrings/IncompatibleOptions.java | 68 +- .../sharedStrings/InternSharedString.java | 6 +- .../cds/appcds/sharedStrings/LargePages.java | 3 +- .../sharedStrings/SharedStringsBasic.java | 6 +- .../sharedStrings/SharedStringsBasicPlus.java | 7 +- .../sharedStrings/SharedStringsHumongous.java | 7 +- .../sharedStrings/SharedStringsStress.java | 7 +- .../sharedStrings/SharedStringsUtils.java | 7 +- .../sharedStrings/SharedStringsWbTest.java | 7 +- .../serviceability/sa/ClhsdbPrintAll.java | 2 +- test/jdk/TEST.ROOT | 2 + test/jtreg-ext/requires/VMProps.java | 50 +- test/lib/jdk/test/whitebox/WhiteBox.java | 2 + 104 files changed, 5281 insertions(+), 1657 deletions(-) create mode 100644 src/hotspot/share/cds/aotMappedHeapLoader.cpp rename src/hotspot/share/cds/{archiveHeapLoader.hpp => aotMappedHeapLoader.hpp} (79%) rename src/hotspot/share/cds/{archiveHeapLoader.inline.hpp => aotMappedHeapLoader.inline.hpp} (82%) rename src/hotspot/share/cds/{archiveHeapWriter.cpp => aotMappedHeapWriter.cpp} (69%) rename src/hotspot/share/cds/{archiveHeapWriter.hpp => aotMappedHeapWriter.hpp} (86%) create mode 100644 src/hotspot/share/cds/aotStreamedHeapLoader.cpp create mode 100644 src/hotspot/share/cds/aotStreamedHeapLoader.hpp create mode 100644 src/hotspot/share/cds/aotStreamedHeapWriter.cpp create mode 100644 src/hotspot/share/cds/aotStreamedHeapWriter.hpp create mode 100644 src/hotspot/share/cds/aotThread.cpp create mode 100644 src/hotspot/share/cds/aotThread.hpp delete mode 100644 src/hotspot/share/cds/archiveHeapLoader.cpp create mode 100644 src/hotspot/share/cds/heapShared.inline.hpp create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/TestZGCWithAOTHeap.java delete mode 100644 test/hotspot/jtreg/runtime/cds/appcds/aotClassLinking/AOTCacheWithZGC.java diff --git a/make/Images.gmk b/make/Images.gmk index 34d81081d29..c5877e44c22 100644 --- a/make/Images.gmk +++ b/make/Images.gmk @@ -148,7 +148,6 @@ define CreateCDSArchive $1_$2_DUMP_EXTRA_ARG := $$($1_$2_COOPS_OPTION) $$($1_$2_COH_OPTION) $1_$2_DUMP_TYPE := $(if $(findstring _nocoops, $2),-NOCOOPS,)$(if $(findstring _coh, $2),-COH,) - # Only G1 supports dumping the shared heap, so explicitly use G1 if the JVM supports it. $1_$2_CDS_DUMP_FLAGS := $(CDS_DUMP_FLAGS) $(if $(filter g1gc, $(JVM_FEATURES_$1)), -XX:+UseG1GC) ifeq ($(OPENJDK_TARGET_OS), windows) diff --git a/src/hotspot/share/cds/aotMapLogger.cpp b/src/hotspot/share/cds/aotMapLogger.cpp index 151c15048c2..d0a63c56093 100644 --- a/src/hotspot/share/cds/aotMapLogger.cpp +++ b/src/hotspot/share/cds/aotMapLogger.cpp @@ -23,7 +23,10 @@ */ #include "cds/aotMapLogger.hpp" -#include "cds/archiveHeapWriter.hpp" +#include "cds/aotMappedHeapLoader.hpp" +#include "cds/aotMappedHeapWriter.hpp" +#include "cds/aotStreamedHeapLoader.hpp" +#include "cds/aotStreamedHeapWriter.hpp" #include "cds/cdsConfig.hpp" #include "cds/filemap.hpp" #include "classfile/systemDictionaryShared.hpp" @@ -45,10 +48,7 @@ bool AOTMapLogger::_is_logging_at_bootstrap; bool AOTMapLogger::_is_runtime_logging; intx AOTMapLogger::_buffer_to_requested_delta; intx AOTMapLogger::_requested_to_mapped_metadata_delta; -size_t AOTMapLogger::_num_root_segments; -size_t AOTMapLogger::_num_obj_arrays_logged; GrowableArrayCHeap* AOTMapLogger::_roots; -ArchiveHeapInfo* AOTMapLogger::_dumptime_heap_info; class AOTMapLogger::RequestedMetadataAddr { address _raw_addr; @@ -86,12 +86,10 @@ void AOTMapLogger::ergo_initialize() { } void AOTMapLogger::dumptime_log(ArchiveBuilder* builder, FileMapInfo* mapinfo, - ArchiveHeapInfo* heap_info, + ArchiveMappedHeapInfo* mapped_heap_info, ArchiveStreamedHeapInfo* streamed_heap_info, char* bitmap, size_t bitmap_size_in_bytes) { _is_runtime_logging = false; _buffer_to_requested_delta = ArchiveBuilder::current()->buffer_to_requested_delta(); - _num_root_segments = mapinfo->heap_root_segments().count(); - _dumptime_heap_info = heap_info; log_file_header(mapinfo); @@ -106,8 +104,11 @@ void AOTMapLogger::dumptime_log(ArchiveBuilder* builder, FileMapInfo* mapinfo, log_as_hex((address)bitmap, bitmap_end, nullptr); #if INCLUDE_CDS_JAVA_HEAP - if (heap_info->is_used()) { - dumptime_log_heap_region(heap_info); + if (mapped_heap_info != nullptr && mapped_heap_info->is_used()) { + dumptime_log_mapped_heap_region(mapped_heap_info); + } + if (streamed_heap_info != nullptr && streamed_heap_info->is_used()) { + dumptime_log_streamed_heap_region(streamed_heap_info); } #endif @@ -192,7 +193,6 @@ void AOTMapLogger::runtime_log(FileMapInfo* mapinfo, GrowableArrayCHeaphas_heap_region() && CDSConfig::is_loading_heap()) { - _num_root_segments = mapinfo->heap_root_segments().count(); runtime_log_heap_region(mapinfo); } #endif @@ -501,62 +501,38 @@ void AOTMapLogger::log_as_hex(address base, address top, address requested_base, // Hence, in general, we cannot use regular oop API (such as oopDesc::obj_field()) on these objects. There // are a few rare case where regular oop API work, but these are all guarded with the raw_oop() method and // should be used with care. +// +// Each AOT heap reader and writer has its own oop_iterator() API that retrieves all the data required to build +// fake oops for logging. class AOTMapLogger::FakeOop { - static int _requested_shift; - static intx _buffer_to_requested_delta; - static address _buffer_start; - static address _buffer_end; - static uint64_t _buffer_start_narrow_oop; // The encoded narrow oop for the objects at _buffer_start + OopDataIterator* _iter; + OopData _data; - address _buffer_addr; - - static void assert_range(address buffer_addr) { - assert(_buffer_start <= buffer_addr && buffer_addr < _buffer_end, "range check"); + address* buffered_field_addr(int field_offset) { + return (address*)(buffered_addr() + field_offset); } - address* field_addr(int field_offset) { - return (address*)(_buffer_addr + field_offset); - } - -protected: +public: RequestedMetadataAddr metadata_field(int field_offset) { - return RequestedMetadataAddr(*(address*)(field_addr(field_offset))); + return RequestedMetadataAddr(*(address*)(buffered_field_addr(field_offset))); + } + + address buffered_addr() { + return _data._buffered_addr; } // Return an "oop" pointer so we can use APIs that accept regular oops. This // must be used with care, as only a limited number of APIs can work with oops that // live outside of the range of the heap. - oop raw_oop() { return cast_to_oop(_buffer_addr); } + oop raw_oop() { return _data._raw_oop; } -public: - static void init_globals(address requested_base, address requested_start, int requested_shift, - address buffer_start, address buffer_end) { - _requested_shift = requested_shift; - _buffer_to_requested_delta = requested_start - buffer_start; - _buffer_start = buffer_start; - _buffer_end = buffer_end; + FakeOop() : _data() {} + FakeOop(OopDataIterator* iter, OopData data) : _iter(iter), _data(data) {} - precond(requested_start >= requested_base); - if (UseCompressedOops) { - _buffer_start_narrow_oop = (uint64_t)(pointer_delta(requested_start, requested_base, 1)) >> _requested_shift; - assert(_buffer_start_narrow_oop < 0xffffffff, "sanity"); - } else { - _buffer_start_narrow_oop = 0xdeadbeed; - } - } - - FakeOop() : _buffer_addr(nullptr) {} - - FakeOop(address buffer_addr) : _buffer_addr(buffer_addr) { - if (_buffer_addr != nullptr) { - assert_range(_buffer_addr); - } - } - - FakeMirror& as_mirror(); - FakeObjArray& as_obj_array(); - FakeString& as_string(); - FakeTypeArray& as_type_array(); + FakeMirror as_mirror(); + FakeObjArray as_obj_array(); + FakeString as_string(); + FakeTypeArray as_type_array(); RequestedMetadataAddr klass() { address rk = (address)real_klass(); @@ -570,61 +546,45 @@ public: Klass* real_klass() { assert(UseCompressedClassPointers, "heap archiving requires UseCompressedClassPointers"); - if (_is_runtime_logging) { - return raw_oop()->klass(); - } else { - return ArchiveHeapWriter::real_klass_of_buffered_oop(_buffer_addr); - } + return _data._klass; } // in heap words size_t size() { - if (_is_runtime_logging) { - return raw_oop()->size_given_klass(real_klass()); - } else { - return ArchiveHeapWriter::size_of_buffered_oop(_buffer_addr); - } + return _data._size; + } + + bool is_root_segment() { + return _data._is_root_segment; } bool is_array() { return real_klass()->is_array_klass(); } - bool is_null() { return _buffer_addr == nullptr; } + bool is_null() { return buffered_addr() == nullptr; } int array_length() { precond(is_array()); return arrayOop(raw_oop())->length(); } + intptr_t target_location() { + return _data._target_location; + } + address requested_addr() { - return _buffer_addr + _buffer_to_requested_delta; + return _data._requested_addr; } uint32_t as_narrow_oop_value() { precond(UseCompressedOops); - if (_buffer_addr == nullptr) { - return 0; - } - uint64_t pd = (uint64_t)(pointer_delta(_buffer_addr, _buffer_start, 1)); - return checked_cast(_buffer_start_narrow_oop + (pd >> _requested_shift)); + return _data._narrow_location; } FakeOop read_oop_at(narrowOop* addr) { // +UseCompressedOops - uint64_t n = (uint64_t)(*addr); - if (n == 0) { - return FakeOop(nullptr); - } else { - precond(n >= _buffer_start_narrow_oop); - address value = _buffer_start + ((n - _buffer_start_narrow_oop) << _requested_shift); - return FakeOop(value); - } + return FakeOop(_iter, _iter->obj_at(addr)); } FakeOop read_oop_at(oop* addr) { // -UseCompressedOops - address requested_value = cast_from_oop
          (*addr); - if (requested_value == nullptr) { - return FakeOop(nullptr); - } else { - return FakeOop(requested_value - _buffer_to_requested_delta); - } + return FakeOop(_iter, _iter->obj_at(addr)); } FakeOop obj_field(int field_offset) { @@ -644,6 +604,8 @@ public: class AOTMapLogger::FakeMirror : public AOTMapLogger::FakeOop { public: + FakeMirror(OopDataIterator* iter, OopData data) : FakeOop(iter, data) {} + void print_class_signature_on(outputStream* st); Klass* real_mirrored_klass() { @@ -662,6 +624,8 @@ class AOTMapLogger::FakeObjArray : public AOTMapLogger::FakeOop { } public: + FakeObjArray(OopDataIterator* iter, OopData data) : FakeOop(iter, data) {} + int length() { return raw_objArrayOop()->length(); } @@ -676,6 +640,8 @@ public: class AOTMapLogger::FakeString : public AOTMapLogger::FakeOop { public: + FakeString(OopDataIterator* iter, OopData data) : FakeOop(iter, data) {} + bool is_latin1() { jbyte coder = raw_oop()->byte_field(java_lang_String::coder_offset()); assert(CompactStrings || coder == java_lang_String::CODER_UTF16, "Must be UTF16 without CompactStrings"); @@ -694,6 +660,8 @@ class AOTMapLogger::FakeTypeArray : public AOTMapLogger::FakeOop { } public: + FakeTypeArray(OopDataIterator* iter, OopData data) : FakeOop(iter, data) {} + void print_elements_on(outputStream* st) { TypeArrayKlass::cast(real_klass())->oop_print_elements_on(raw_typeArrayOop(), st); } @@ -703,24 +671,24 @@ public: jchar char_at(int i) { return raw_typeArrayOop()->char_at(i); } }; // AOTMapLogger::FakeTypeArray -AOTMapLogger::FakeMirror& AOTMapLogger::FakeOop::as_mirror() { +AOTMapLogger::FakeMirror AOTMapLogger::FakeOop::as_mirror() { precond(real_klass() == vmClasses::Class_klass()); - return (FakeMirror&)*this; + return FakeMirror(_iter, _data); } -AOTMapLogger::FakeObjArray& AOTMapLogger::FakeOop::as_obj_array() { +AOTMapLogger::FakeObjArray AOTMapLogger::FakeOop::as_obj_array() { precond(real_klass()->is_objArray_klass()); - return (FakeObjArray&)*this; + return FakeObjArray(_iter, _data); } -AOTMapLogger::FakeTypeArray& AOTMapLogger::FakeOop::as_type_array() { +AOTMapLogger::FakeTypeArray AOTMapLogger::FakeOop::as_type_array() { precond(real_klass()->is_typeArray_klass()); - return (FakeTypeArray&)*this; + return FakeTypeArray(_iter, _data); } -AOTMapLogger::FakeString& AOTMapLogger::FakeOop::as_string() { +AOTMapLogger::FakeString AOTMapLogger::FakeOop::as_string() { precond(real_klass() == vmClasses::String_klass()); - return (FakeString&)*this; + return FakeString(_iter, _data); } void AOTMapLogger::FakeMirror::print_class_signature_on(outputStream* st) { @@ -823,90 +791,104 @@ public: } }; // AOTMapLogger::ArchivedFieldPrinter -int AOTMapLogger::FakeOop::_requested_shift; -intx AOTMapLogger::FakeOop::_buffer_to_requested_delta; -address AOTMapLogger::FakeOop::_buffer_start; -address AOTMapLogger::FakeOop::_buffer_end; -uint64_t AOTMapLogger::FakeOop::_buffer_start_narrow_oop; - -void AOTMapLogger::dumptime_log_heap_region(ArchiveHeapInfo* heap_info) { +void AOTMapLogger::dumptime_log_mapped_heap_region(ArchiveMappedHeapInfo* heap_info) { MemRegion r = heap_info->buffer_region(); address buffer_start = address(r.start()); // start of the current oop inside the buffer address buffer_end = address(r.end()); - address requested_base = UseCompressedOops ? (address)CompressedOops::base() : (address)ArchiveHeapWriter::NOCOOPS_REQUESTED_BASE; - address requested_start = UseCompressedOops ? ArchiveHeapWriter::buffered_addr_to_requested_addr(buffer_start) : requested_base; - int requested_shift = CompressedOops::shift(); - - FakeOop::init_globals(requested_base, requested_start, requested_shift, buffer_start, buffer_end); + address requested_base = UseCompressedOops ? (address)CompressedOops::base() : (address)AOTMappedHeapWriter::NOCOOPS_REQUESTED_BASE; + address requested_start = UseCompressedOops ? AOTMappedHeapWriter::buffered_addr_to_requested_addr(buffer_start) : requested_base; log_region_range("heap", buffer_start, buffer_end, requested_start); - log_oops(buffer_start, buffer_end); + log_archived_objects(AOTMappedHeapWriter::oop_iterator(heap_info)); +} + +void AOTMapLogger::dumptime_log_streamed_heap_region(ArchiveStreamedHeapInfo* heap_info) { + MemRegion r = heap_info->buffer_region(); + address buffer_start = address(r.start()); // start of the current oop inside the buffer + address buffer_end = address(r.end()); + + log_region_range("heap", buffer_start, buffer_end, nullptr); + log_archived_objects(AOTStreamedHeapWriter::oop_iterator(heap_info)); } void AOTMapLogger::runtime_log_heap_region(FileMapInfo* mapinfo) { ResourceMark rm; + int heap_region_index = AOTMetaspace::hp; FileMapRegion* r = mapinfo->region_at(heap_region_index); - size_t alignment = ObjectAlignmentInBytes; + size_t alignment = (size_t)ObjectAlignmentInBytes; - // Allocate a buffer and read the image of the archived heap region. This buffer is outside - // of the real Java heap, so we must use FakeOop to access the contents of the archived heap objects. - char* buffer = resource_allocate_bytes(r->used() + alignment); - address buffer_start = (address)align_up(buffer, alignment); - address buffer_end = buffer_start + r->used(); - if (!mapinfo->read_region(heap_region_index, (char*)buffer_start, r->used(), /* do_commit = */ false)) { - log_error(aot)("Cannot read heap region; AOT map logging of heap objects failed"); - return; + if (mapinfo->object_streaming_mode()) { + address buffer_start = (address)r->mapped_base(); + address buffer_end = buffer_start + r->used(); + log_region_range("heap", buffer_start, buffer_end, nullptr); + log_archived_objects(AOTStreamedHeapLoader::oop_iterator(mapinfo, buffer_start, buffer_end)); + } else { + // Allocate a buffer and read the image of the archived heap region. This buffer is outside + // of the real Java heap, so we must use FakeOop to access the contents of the archived heap objects. + char* buffer = resource_allocate_bytes(r->used() + alignment); + address buffer_start = (address)align_up(buffer, alignment); + address buffer_end = buffer_start + r->used(); + if (!mapinfo->read_region(heap_region_index, (char*)buffer_start, r->used(), /* do_commit = */ false)) { + log_error(aot)("Cannot read heap region; AOT map logging of heap objects failed"); + return; + } + + address requested_base = UseCompressedOops ? (address)mapinfo->narrow_oop_base() : AOTMappedHeapLoader::heap_region_requested_address(mapinfo); + address requested_start = requested_base + r->mapping_offset(); + log_region_range("heap", buffer_start, buffer_end, requested_start); + log_archived_objects(AOTMappedHeapLoader::oop_iterator(mapinfo, buffer_start, buffer_end)); } - - address requested_base = UseCompressedOops ? (address)mapinfo->narrow_oop_base() : mapinfo->heap_region_requested_address(); - address requested_start = requested_base + r->mapping_offset(); - int requested_shift = mapinfo->narrow_oop_shift(); - - FakeOop::init_globals(requested_base, requested_start, requested_shift, buffer_start, buffer_end); - - log_region_range("heap", buffer_start, buffer_end, requested_start); - log_oops(buffer_start, buffer_end); } -void AOTMapLogger::log_oops(address buffer_start, address buffer_end) { +void AOTMapLogger::log_archived_objects(OopDataIterator* iter) { LogStreamHandle(Debug, aot, map) st; if (!st.is_enabled()) { return; } _roots = new GrowableArrayCHeap(); - _num_obj_arrays_logged = 0; - for (address fop = buffer_start; fop < buffer_end; ) { - FakeOop fake_oop(fop); - st.print(PTR_FORMAT ": @@ Object ", p2i(fake_oop.requested_addr())); - print_oop_info_cr(&st, fake_oop, /*print_requested_addr=*/false); + // Roots that are not segmented + GrowableArrayCHeap* normal_roots = iter->roots(); + for (int i = 0; i < normal_roots->length(); ++i) { + OopData data = normal_roots->at(i); + FakeOop fop(iter, data); + _roots->append(fop); + st.print(" root[%4d]: ", i); + print_oop_info_cr(&st, fop); + } + + while (iter->has_next()) { + FakeOop fake_oop(iter, iter->next()); + st.print(PTR_FORMAT ": @@ Object ", fake_oop.target_location()); + print_oop_info_cr(&st, fake_oop, /*print_location=*/false); LogStreamHandle(Trace, aot, map, oops) trace_st; if (trace_st.is_enabled()) { print_oop_details(fake_oop, &trace_st); } - address next_fop = fop + fake_oop.size() * BytesPerWord; - log_as_hex(fop, next_fop, fake_oop.requested_addr(), /*is_heap=*/true); - - fop = next_fop; + address fop = fake_oop.buffered_addr(); + address end_fop = fop + fake_oop.size() * BytesPerWord; + log_as_hex(fop, end_fop, fake_oop.requested_addr(), /*is_heap=*/true); } delete _roots; + delete iter; + delete normal_roots; } -void AOTMapLogger::print_oop_info_cr(outputStream* st, FakeOop fake_oop, bool print_requested_addr) { +void AOTMapLogger::print_oop_info_cr(outputStream* st, FakeOop fake_oop, bool print_location) { if (fake_oop.is_null()) { st->print_cr("null"); } else { ResourceMark rm; Klass* real_klass = fake_oop.real_klass(); - address requested_addr = fake_oop.requested_addr(); - if (print_requested_addr) { - st->print(PTR_FORMAT " ", p2i(requested_addr)); + intptr_t target_location = fake_oop.target_location(); + if (print_location) { + st->print(PTR_FORMAT " ", target_location); } if (UseCompressedOops) { st->print("(0x%08x) ", fake_oop.as_narrow_oop_value()); @@ -919,7 +901,8 @@ void AOTMapLogger::print_oop_info_cr(outputStream* st, FakeOop fake_oop, bool pr if (real_klass == vmClasses::String_klass()) { st->print(" "); - fake_oop.as_string().print_on(st); + FakeString fake_str = fake_oop.as_string(); + fake_str.print_on(st); } else if (real_klass == vmClasses::Class_klass()) { fake_oop.as_mirror().print_class_signature_on(st); } @@ -942,7 +925,7 @@ void AOTMapLogger::print_oop_details(FakeOop fake_oop, outputStream* st) { fake_oop.as_type_array().print_elements_on(st); } else if (real_klass->is_objArray_klass()) { FakeObjArray fake_obj_array = fake_oop.as_obj_array(); - bool is_logging_root_segment = _num_obj_arrays_logged < _num_root_segments; + bool is_logging_root_segment = fake_oop.is_root_segment(); for (int i = 0; i < fake_obj_array.length(); i++) { FakeOop elm = fake_obj_array.obj_at(i); @@ -954,7 +937,6 @@ void AOTMapLogger::print_oop_details(FakeOop fake_oop, outputStream* st) { } print_oop_info_cr(st, elm); } - _num_obj_arrays_logged ++; } else { st->print_cr(" - fields (%zu words):", fake_oop.size()); diff --git a/src/hotspot/share/cds/aotMapLogger.hpp b/src/hotspot/share/cds/aotMapLogger.hpp index dce857b0850..ba188514861 100644 --- a/src/hotspot/share/cds/aotMapLogger.hpp +++ b/src/hotspot/share/cds/aotMapLogger.hpp @@ -32,7 +32,8 @@ #include "utilities/globalDefinitions.hpp" #include "utilities/growableArray.hpp" -class ArchiveHeapInfo; +class ArchiveMappedHeapInfo; +class ArchiveStreamedHeapInfo; class CompileTrainingData; class DumpRegion; class FileMapInfo; @@ -64,6 +65,7 @@ class AOTMapLogger : AllStatic { MetaspaceObj::Type _type; }; +public: // FakeOop and subtypes class FakeOop; class FakeMirror; @@ -71,15 +73,48 @@ class AOTMapLogger : AllStatic { class FakeString; class FakeTypeArray; +#if INCLUDE_CDS_JAVA_HEAP + struct OopData { + address _buffered_addr; + address _requested_addr; + intptr_t _target_location; + uint32_t _narrow_location; + oopDesc* _raw_oop; + Klass* _klass; + size_t _size; + bool _is_root_segment; + }; + + class OopDataIterator : public CHeapObj { + protected: + OopData null_data() { + return { nullptr, + nullptr, + 0, + 0, + nullptr, + nullptr, + 0, + false }; + } + + public: + virtual bool has_next() = 0; + virtual OopData next() = 0; + virtual OopData obj_at(narrowOop* p) = 0; + virtual OopData obj_at(oop* p) = 0; + virtual GrowableArrayCHeap* roots() = 0; + virtual ~OopDataIterator() {} + }; +#endif + +private: class RequestedMetadataAddr; class RuntimeGatherArchivedMetaspaceObjs; static bool _is_logging_at_bootstrap; static bool _is_runtime_logging; - static size_t _num_root_segments; - static size_t _num_obj_arrays_logged; static GrowableArrayCHeap* _roots; - static ArchiveHeapInfo* _dumptime_heap_info; static intx _buffer_to_requested_delta; static intx _requested_to_mapped_metadata_delta; @@ -114,12 +149,14 @@ class AOTMapLogger : AllStatic { #if INCLUDE_CDS_JAVA_HEAP - static void dumptime_log_heap_region(ArchiveHeapInfo* heap_info); + static void dumptime_log_mapped_heap_region(ArchiveMappedHeapInfo* mapped_heap_info); + static void dumptime_log_streamed_heap_region(ArchiveStreamedHeapInfo* streamed_heap_info); static void runtime_log_heap_region(FileMapInfo* mapinfo); - static void print_oop_info_cr(outputStream* st, FakeOop fake_oop, bool print_requested_addr = true); + static void print_oop_info_cr(outputStream* st, FakeOop fake_oop, bool print_location = true); static void print_oop_details(FakeOop fake_oop, outputStream* st); - static void log_oops(address buf_start, address buf_end); + static void log_mapped_oops(address buf_start, address buf_end); + static void log_archived_objects(OopDataIterator* iter); class ArchivedFieldPrinter; // to be replaced by ArchivedFieldPrinter2 #endif @@ -128,7 +165,7 @@ public: static bool is_logging_at_bootstrap() { return _is_logging_at_bootstrap; } static void dumptime_log(ArchiveBuilder* builder, FileMapInfo* mapinfo, - ArchiveHeapInfo* heap_info, + ArchiveMappedHeapInfo* mapped_heap_info, ArchiveStreamedHeapInfo* streamed_heap_info, char* bitmap, size_t bitmap_size_in_bytes); static void runtime_log(FileMapInfo* static_mapinfo, FileMapInfo* dynamic_mapinfo); }; diff --git a/src/hotspot/share/cds/aotMappedHeapLoader.cpp b/src/hotspot/share/cds/aotMappedHeapLoader.cpp new file mode 100644 index 00000000000..84051cbd9e5 --- /dev/null +++ b/src/hotspot/share/cds/aotMappedHeapLoader.cpp @@ -0,0 +1,847 @@ +/* + * Copyright (c) 2018, 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. + * + * 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. + * + */ + +#include "cds/aotLogging.hpp" +#include "cds/aotMappedHeapLoader.inline.hpp" +#include "cds/aotMappedHeapWriter.hpp" +#include "cds/aotMetaspace.hpp" +#include "cds/cdsConfig.hpp" +#include "cds/heapShared.inline.hpp" +#include "classfile/classLoaderDataShared.hpp" +#include "classfile/stringTable.hpp" +#include "classfile/systemDictionaryShared.hpp" +#include "gc/shared/collectedHeap.hpp" +#include "logging/log.hpp" +#include "logging/logMessage.hpp" +#include "logging/logStream.hpp" +#include "logging/logTag.hpp" +#include "memory/allocation.inline.hpp" +#include "memory/iterator.inline.hpp" +#include "memory/resourceArea.hpp" +#include "memory/universe.hpp" +#include "sanitizers/ub.hpp" +#include "utilities/bitMap.inline.hpp" +#include "utilities/copy.hpp" +#if INCLUDE_G1GC +#include "gc/g1/g1CollectedHeap.hpp" +#include "gc/g1/g1HeapRegion.hpp" +#endif + +#if INCLUDE_CDS_JAVA_HEAP + +bool AOTMappedHeapLoader::_is_mapped = false; +bool AOTMappedHeapLoader::_is_loaded = false; + +bool AOTMappedHeapLoader::_narrow_oop_base_initialized = false; +address AOTMappedHeapLoader::_narrow_oop_base; +int AOTMappedHeapLoader::_narrow_oop_shift; + +// Support for loaded heap. +uintptr_t AOTMappedHeapLoader::_loaded_heap_bottom = 0; +uintptr_t AOTMappedHeapLoader::_loaded_heap_top = 0; +uintptr_t AOTMappedHeapLoader::_dumptime_base = UINTPTR_MAX; +uintptr_t AOTMappedHeapLoader::_dumptime_top = 0; +intx AOTMappedHeapLoader::_runtime_offset = 0; +bool AOTMappedHeapLoader::_loading_failed = false; + +// Support for mapped heap. +uintptr_t AOTMappedHeapLoader::_mapped_heap_bottom = 0; +bool AOTMappedHeapLoader::_mapped_heap_relocation_initialized = false; +ptrdiff_t AOTMappedHeapLoader::_mapped_heap_delta = 0; + +// Heap roots +GrowableArrayCHeap* AOTMappedHeapLoader::_root_segments = nullptr; +int AOTMappedHeapLoader::_root_segment_max_size_elems; + +MemRegion AOTMappedHeapLoader::_mapped_heap_memregion; +bool AOTMappedHeapLoader::_heap_pointers_need_patching; + +// Every mapped region is offset by _mapped_heap_delta from its requested address. +// See FileMapInfo::heap_region_requested_address(). +ATTRIBUTE_NO_UBSAN +void AOTMappedHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) { + assert(!_mapped_heap_relocation_initialized, "only once"); + if (!UseCompressedOops) { + assert(dumptime_oop_shift == 0, "sanity"); + } + assert(can_map(), "sanity"); + init_narrow_oop_decoding(CompressedOops::base() + delta, dumptime_oop_shift); + _mapped_heap_bottom = (intptr_t)mapped_heap_bottom; + _mapped_heap_delta = delta; + _mapped_heap_relocation_initialized = true; +} + +void AOTMappedHeapLoader::init_narrow_oop_decoding(address base, int shift) { + assert(!_narrow_oop_base_initialized, "only once"); + _narrow_oop_base_initialized = true; + _narrow_oop_base = base; + _narrow_oop_shift = shift; +} + +void AOTMappedHeapLoader::fixup_region() { + FileMapInfo* mapinfo = FileMapInfo::current_info(); + if (is_mapped()) { + fixup_mapped_heap_region(mapinfo); + } else if (_loading_failed) { + fill_failed_loaded_heap(); + } +} + +// ------------------ Support for Region MAPPING ----------------------------------------- + +// Patch all the embedded oop pointers inside an archived heap region, +// to be consistent with the runtime oop encoding. +class PatchCompressedEmbeddedPointers: public BitMapClosure { + narrowOop* _start; + + public: + PatchCompressedEmbeddedPointers(narrowOop* start) : _start(start) {} + + bool do_bit(size_t offset) { + narrowOop* p = _start + offset; + narrowOop v = *p; + assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); + oop o = AOTMappedHeapLoader::decode_from_mapped_archive(v); + RawAccess::oop_store(p, o); + return true; + } +}; + +class PatchCompressedEmbeddedPointersQuick: public BitMapClosure { + narrowOop* _start; + uint32_t _delta; + + public: + PatchCompressedEmbeddedPointersQuick(narrowOop* start, uint32_t delta) : _start(start), _delta(delta) {} + + bool do_bit(size_t offset) { + narrowOop* p = _start + offset; + narrowOop v = *p; + assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); + narrowOop new_v = CompressedOops::narrow_oop_cast(CompressedOops::narrow_oop_value(v) + _delta); + assert(!CompressedOops::is_null(new_v), "should never relocate to narrowOop(0)"); +#ifdef ASSERT + oop o1 = AOTMappedHeapLoader::decode_from_mapped_archive(v); + oop o2 = CompressedOops::decode_not_null(new_v); + assert(o1 == o2, "quick delta must work"); +#endif + RawAccess::oop_store(p, new_v); + return true; + } +}; + +class PatchUncompressedEmbeddedPointers: public BitMapClosure { + oop* _start; + intptr_t _delta; + + public: + PatchUncompressedEmbeddedPointers(oop* start, intx runtime_offset) : + _start(start), + _delta(runtime_offset) {} + + PatchUncompressedEmbeddedPointers(oop* start) : + _start(start), + _delta(AOTMappedHeapLoader::mapped_heap_delta()) {} + + bool do_bit(size_t offset) { + oop* p = _start + offset; + intptr_t dumptime_oop = (intptr_t)((void*)*p); + assert(dumptime_oop != 0, "null oops should have been filtered out at dump time"); + intptr_t runtime_oop = dumptime_oop + _delta; + RawAccess::oop_store(p, cast_to_oop(runtime_oop)); + return true; + } +}; + +void AOTMappedHeapLoader::patch_compressed_embedded_pointers(BitMapView bm, + FileMapInfo* info, + MemRegion region) { + narrowOop dt_encoded_bottom = encoded_heap_region_dumptime_address(info); + narrowOop rt_encoded_bottom = CompressedOops::encode_not_null(cast_to_oop(region.start())); + log_info(aot)("patching heap embedded pointers: narrowOop 0x%8x -> 0x%8x", + (uint)dt_encoded_bottom, (uint)rt_encoded_bottom); + + // Optimization: if dumptime shift is the same as runtime shift, we can perform a + // quick conversion from "dumptime narrowOop" -> "runtime narrowOop". + narrowOop* patching_start = (narrowOop*)region.start() + FileMapInfo::current_info()->mapped_heap()->oopmap_start_pos(); + if (_narrow_oop_shift == CompressedOops::shift()) { + uint32_t quick_delta = (uint32_t)rt_encoded_bottom - (uint32_t)dt_encoded_bottom; + log_info(aot)("heap data relocation quick delta = 0x%x", quick_delta); + if (quick_delta == 0) { + log_info(aot)("heap data relocation unnecessary, quick_delta = 0"); + } else { + PatchCompressedEmbeddedPointersQuick patcher(patching_start, quick_delta); + bm.iterate(&patcher); + } + } else { + log_info(aot)("heap data quick relocation not possible"); + PatchCompressedEmbeddedPointers patcher(patching_start); + bm.iterate(&patcher); + } +} + +// Patch all the non-null pointers that are embedded in the archived heap objects +// in this (mapped) region +void AOTMappedHeapLoader::patch_embedded_pointers(FileMapInfo* info, + MemRegion region, address oopmap, + size_t oopmap_size_in_bits) { + BitMapView bm((BitMap::bm_word_t*)oopmap, oopmap_size_in_bits); + if (UseCompressedOops) { + patch_compressed_embedded_pointers(bm, info, region); + } else { + PatchUncompressedEmbeddedPointers patcher((oop*)region.start() + FileMapInfo::current_info()->mapped_heap()->oopmap_start_pos()); + bm.iterate(&patcher); + } +} + +// ------------------ Support for Region LOADING ----------------------------------------- + +// The CDS archive remembers each heap object by its address at dump time, but +// the heap object may be loaded at a different address at run time. This structure is used +// to translate the dump time addresses for all objects in FileMapInfo::space_at(region_index) +// to their runtime addresses. +struct LoadedArchiveHeapRegion { + int _region_index; // index for FileMapInfo::space_at(index) + size_t _region_size; // number of bytes in this region + uintptr_t _dumptime_base; // The dump-time (decoded) address of the first object in this region + intx _runtime_offset; // If an object's dump time address P is within in this region, its + // runtime address is P + _runtime_offset + uintptr_t top() { + return _dumptime_base + _region_size; + } +}; + +void AOTMappedHeapLoader::init_loaded_heap_relocation(LoadedArchiveHeapRegion* loaded_region) { + _dumptime_base = loaded_region->_dumptime_base; + _dumptime_top = loaded_region->top(); + _runtime_offset = loaded_region->_runtime_offset; +} + +bool AOTMappedHeapLoader::can_load() { + return Universe::heap()->can_load_archived_objects(); +} + +class AOTMappedHeapLoader::PatchLoadedRegionPointers: public BitMapClosure { + narrowOop* _start; + intx _offset; + uintptr_t _base; + uintptr_t _top; + + public: + PatchLoadedRegionPointers(narrowOop* start, LoadedArchiveHeapRegion* loaded_region) + : _start(start), + _offset(loaded_region->_runtime_offset), + _base(loaded_region->_dumptime_base), + _top(loaded_region->top()) {} + + bool do_bit(size_t offset) { + assert(UseCompressedOops, "PatchLoadedRegionPointers for uncompressed oops is unimplemented"); + narrowOop* p = _start + offset; + narrowOop v = *p; + assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); + uintptr_t o = cast_from_oop(AOTMappedHeapLoader::decode_from_archive(v)); + assert(_base <= o && o < _top, "must be"); + + o += _offset; + AOTMappedHeapLoader::assert_in_loaded_heap(o); + RawAccess::oop_store(p, cast_to_oop(o)); + return true; + } +}; + +bool AOTMappedHeapLoader::init_loaded_region(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_region, + MemRegion& archive_space) { + size_t total_bytes = 0; + FileMapRegion* r = mapinfo->region_at(AOTMetaspace::hp); + r->assert_is_heap_region(); + if (r->used() == 0) { + return false; + } + + assert(is_aligned(r->used(), HeapWordSize), "must be"); + total_bytes += r->used(); + loaded_region->_region_index = AOTMetaspace::hp; + loaded_region->_region_size = r->used(); + loaded_region->_dumptime_base = (uintptr_t)heap_region_dumptime_address(mapinfo); + + assert(is_aligned(total_bytes, HeapWordSize), "must be"); + size_t word_size = total_bytes / HeapWordSize; + HeapWord* buffer = Universe::heap()->allocate_loaded_archive_space(word_size); + if (buffer == nullptr) { + return false; + } + + archive_space = MemRegion(buffer, word_size); + _loaded_heap_bottom = (uintptr_t)archive_space.start(); + _loaded_heap_top = _loaded_heap_bottom + total_bytes; + + loaded_region->_runtime_offset = _loaded_heap_bottom - loaded_region->_dumptime_base; + + return true; +} + +bool AOTMappedHeapLoader::load_heap_region_impl(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_region, + uintptr_t load_address) { + uintptr_t bitmap_base = (uintptr_t)mapinfo->map_bitmap_region(); + if (bitmap_base == 0) { + _loading_failed = true; + return false; // OOM or CRC error + } + + FileMapRegion* r = mapinfo->region_at(loaded_region->_region_index); + if (!mapinfo->read_region(loaded_region->_region_index, (char*)load_address, r->used(), /* do_commit = */ false)) { + // There's no easy way to free the buffer, so we will fill it with zero later + // in fill_failed_loaded_heap(), and it will eventually be GC'ed. + log_warning(aot)("Loading of heap region %d has failed. Archived objects are disabled", loaded_region->_region_index); + _loading_failed = true; + return false; + } + assert(r->mapped_base() == (char*)load_address, "sanity"); + log_info(aot)("Loaded heap region #%d at base " INTPTR_FORMAT " top " INTPTR_FORMAT + " size %6zu delta %zd", + loaded_region->_region_index, load_address, load_address + loaded_region->_region_size, + loaded_region->_region_size, loaded_region->_runtime_offset); + + uintptr_t oopmap = bitmap_base + r->oopmap_offset(); + BitMapView bm((BitMap::bm_word_t*)oopmap, r->oopmap_size_in_bits()); + + if (UseCompressedOops) { + PatchLoadedRegionPointers patcher((narrowOop*)load_address + FileMapInfo::current_info()->mapped_heap()->oopmap_start_pos(), loaded_region); + bm.iterate(&patcher); + } else { + PatchUncompressedEmbeddedPointers patcher((oop*)load_address + FileMapInfo::current_info()->mapped_heap()->oopmap_start_pos(), loaded_region->_runtime_offset); + bm.iterate(&patcher); + } + return true; +} + +bool AOTMappedHeapLoader::load_heap_region(FileMapInfo* mapinfo) { + assert(can_load(), "loaded heap for must be supported"); + init_narrow_oop_decoding(mapinfo->narrow_oop_base(), mapinfo->narrow_oop_shift()); + + LoadedArchiveHeapRegion loaded_region; + memset(&loaded_region, 0, sizeof(loaded_region)); + + MemRegion archive_space; + if (!init_loaded_region(mapinfo, &loaded_region, archive_space)) { + return false; + } + + if (!load_heap_region_impl(mapinfo, &loaded_region, (uintptr_t)archive_space.start())) { + assert(_loading_failed, "must be"); + return false; + } + + init_loaded_heap_relocation(&loaded_region); + _is_loaded = true; + + return true; +} + +objArrayOop AOTMappedHeapLoader::root_segment(int segment_idx) { + if (CDSConfig::is_dumping_heap()) { + assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); + } else { + assert(CDSConfig::is_using_archive(), "must be"); + } + + objArrayOop segment = (objArrayOop)_root_segments->at(segment_idx).resolve(); + assert(segment != nullptr, "should have been initialized"); + return segment; +} + +void AOTMappedHeapLoader::get_segment_indexes(int idx, int& seg_idx, int& int_idx) { + assert(_root_segment_max_size_elems > 0, "sanity"); + + // Try to avoid divisions for the common case. + if (idx < _root_segment_max_size_elems) { + seg_idx = 0; + int_idx = idx; + } else { + seg_idx = idx / _root_segment_max_size_elems; + int_idx = idx % _root_segment_max_size_elems; + } + + assert(idx == seg_idx * _root_segment_max_size_elems + int_idx, + "sanity: %d index maps to %d segment and %d internal", idx, seg_idx, int_idx); +} + +void AOTMappedHeapLoader::add_root_segment(objArrayOop segment_oop) { + assert(segment_oop != nullptr, "must be"); + assert(is_in_use(), "must be"); + if (_root_segments == nullptr) { + _root_segments = new GrowableArrayCHeap(10); + } + _root_segments->push(OopHandle(Universe::vm_global(), segment_oop)); +} + +void AOTMappedHeapLoader::init_root_segment_sizes(int max_size_elems) { + _root_segment_max_size_elems = max_size_elems; +} + +oop AOTMappedHeapLoader::get_root(int index) { + assert(!_root_segments->is_empty(), "must have loaded shared heap"); + int seg_idx, int_idx; + get_segment_indexes(index, seg_idx, int_idx); + objArrayOop result = objArrayOop(root_segment(seg_idx)); + return result->obj_at(int_idx); +} + +void AOTMappedHeapLoader::clear_root(int index) { + int seg_idx, int_idx; + get_segment_indexes(index, seg_idx, int_idx); + root_segment(seg_idx)->obj_at_put(int_idx, nullptr); +} + +class VerifyLoadedHeapEmbeddedPointers: public BasicOopIterateClosure { + HashTable* _table; + + public: + VerifyLoadedHeapEmbeddedPointers(HashTable* table) : _table(table) {} + + virtual void do_oop(narrowOop* p) { + // This should be called before the loaded region is modified, so all the embedded pointers + // must be null, or must point to a valid object in the loaded region. + narrowOop v = *p; + if (!CompressedOops::is_null(v)) { + oop o = CompressedOops::decode_not_null(v); + uintptr_t u = cast_from_oop(o); + AOTMappedHeapLoader::assert_in_loaded_heap(u); + guarantee(_table->contains(u), "must point to beginning of object in loaded archived region"); + } + } + virtual void do_oop(oop* p) { + oop v = *p; + if(v != nullptr) { + uintptr_t u = cast_from_oop(v); + AOTMappedHeapLoader::assert_in_loaded_heap(u); + guarantee(_table->contains(u), "must point to beginning of object in loaded archived region"); + } + } +}; + +void AOTMappedHeapLoader::finish_initialization(FileMapInfo* info) { + patch_heap_embedded_pointers(info); + + if (is_loaded()) { + // These operations are needed only when the heap is loaded (not mapped). + finish_loaded_heap(); + if (VerifyArchivedFields > 0) { + verify_loaded_heap(); + } + } + if (is_in_use()) { + patch_native_pointers(); + intptr_t bottom = is_loaded() ? _loaded_heap_bottom : _mapped_heap_bottom; + + // The heap roots are stored in one or more segments that are laid out consecutively. + // The size of each segment (except for the last one) is max_size_in_{elems,bytes}. + HeapRootSegments segments = FileMapInfo::current_info()->mapped_heap()->root_segments(); + init_root_segment_sizes(segments.max_size_in_elems()); + intptr_t first_segment_addr = bottom + segments.base_offset(); + for (size_t c = 0; c < segments.count(); c++) { + oop segment_oop = cast_to_oop(first_segment_addr + (c * segments.max_size_in_bytes())); + assert(segment_oop->is_objArray(), "Must be"); + add_root_segment((objArrayOop)segment_oop); + } + + StringTable::load_shared_strings_array(); + } +} + +void AOTMappedHeapLoader::finish_loaded_heap() { + HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; + HeapWord* top = (HeapWord*)_loaded_heap_top; + + MemRegion archive_space = MemRegion(bottom, top); + Universe::heap()->complete_loaded_archive_space(archive_space); +} + +void AOTMappedHeapLoader::verify_loaded_heap() { + log_info(aot, heap)("Verify all oops and pointers in loaded heap"); + + ResourceMark rm; + HashTable table; + VerifyLoadedHeapEmbeddedPointers verifier(&table); + HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; + HeapWord* top = (HeapWord*)_loaded_heap_top; + + for (HeapWord* p = bottom; p < top; ) { + oop o = cast_to_oop(p); + table.put(cast_from_oop(o), true); + p += o->size(); + } + + for (HeapWord* p = bottom; p < top; ) { + oop o = cast_to_oop(p); + o->oop_iterate(&verifier); + p += o->size(); + } +} + +void AOTMappedHeapLoader::fill_failed_loaded_heap() { + assert(_loading_failed, "must be"); + if (_loaded_heap_bottom != 0) { + assert(_loaded_heap_top != 0, "must be"); + HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; + HeapWord* top = (HeapWord*)_loaded_heap_top; + Universe::heap()->fill_with_objects(bottom, top - bottom); + } +} + +class PatchNativePointers: public BitMapClosure { + Metadata** _start; + + public: + PatchNativePointers(Metadata** start) : _start(start) {} + + bool do_bit(size_t offset) { + Metadata** p = _start + offset; + *p = (Metadata*)(address(*p) + AOTMetaspace::relocation_delta()); + return true; + } +}; + +void AOTMappedHeapLoader::patch_native_pointers() { + if (AOTMetaspace::relocation_delta() == 0) { + return; + } + + FileMapRegion* r = FileMapInfo::current_info()->region_at(AOTMetaspace::hp); + if (r->mapped_base() != nullptr && r->has_ptrmap()) { + log_info(aot, heap)("Patching native pointers in heap region"); + BitMapView bm = FileMapInfo::current_info()->ptrmap_view(AOTMetaspace::hp); + PatchNativePointers patcher((Metadata**)r->mapped_base() + FileMapInfo::current_info()->mapped_heap()->ptrmap_start_pos()); + bm.iterate(&patcher); + } +} + +// The actual address of this region during dump time. +address AOTMappedHeapLoader::heap_region_dumptime_address(FileMapInfo* info) { + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + assert(CDSConfig::is_using_archive(), "runtime only"); + assert(is_aligned(r->mapping_offset(), sizeof(HeapWord)), "must be"); + if (UseCompressedOops) { + return /*dumptime*/ (address)((uintptr_t)info->narrow_oop_base() + r->mapping_offset()); + } else { + return heap_region_requested_address(info); + } +} + +// The address where this region can be mapped into the runtime heap without +// patching any of the pointers that are embedded in this region. +address AOTMappedHeapLoader::heap_region_requested_address(FileMapInfo* info) { + assert(CDSConfig::is_using_archive(), "runtime only"); + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + assert(is_aligned(r->mapping_offset(), sizeof(HeapWord)), "must be"); + assert(can_use(), "cannot be used by AOTMappedHeapLoader::can_load() mode"); + if (UseCompressedOops) { + // We can avoid relocation if each region's offset from the runtime CompressedOops::base() + // is the same as its offset from the CompressedOops::base() during dumptime. + // Note that CompressedOops::base() may be different between dumptime and runtime. + // + // Example: + // Dumptime base = 0x1000 and shift is 0. We have a region at address 0x2000. There's a + // narrowOop P stored in this region that points to an object at address 0x2200. + // P's encoded value is 0x1200. + // + // Runtime base = 0x4000 and shift is also 0. If we map this region at 0x5000, then + // the value P can remain 0x1200. The decoded address = (0x4000 + (0x1200 << 0)) = 0x5200, + // which is the runtime location of the referenced object. + return /*runtime*/ (address)((uintptr_t)CompressedOops::base() + r->mapping_offset()); + } else { + // This was the hard-coded requested base address used at dump time. With uncompressed oops, + // the heap range is assigned by the OS so we will most likely have to relocate anyway, no matter + // what base address was picked at duump time. + return (address)AOTMappedHeapWriter::NOCOOPS_REQUESTED_BASE; + } +} + +bool AOTMappedHeapLoader::map_heap_region(FileMapInfo* info) { + if (map_heap_region_impl(info)) { +#ifdef ASSERT + // The "old" regions must be parsable -- we cannot have any unused space + // at the start of the lowest G1 region that contains archived objects. + assert(is_aligned(_mapped_heap_memregion.start(), G1HeapRegion::GrainBytes), "must be"); + + // Make sure we map at the very top of the heap - see comments in + // init_heap_region_relocation(). + MemRegion heap_range = G1CollectedHeap::heap()->reserved(); + assert(heap_range.contains(_mapped_heap_memregion), "must be"); + + address heap_end = (address)heap_range.end(); + address mapped_heap_region_end = (address)_mapped_heap_memregion.end(); + assert(heap_end >= mapped_heap_region_end, "must be"); + assert(heap_end - mapped_heap_region_end < (intx)(G1HeapRegion::GrainBytes), + "must be at the top of the heap to avoid fragmentation"); +#endif + + set_mapped(); + return true; + } else { + return false; + } +} + +bool AOTMappedHeapLoader::map_heap_region_impl(FileMapInfo* info) { + assert(UseG1GC, "the following code assumes G1"); + + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + size_t size = r->used(); + if (size == 0) { + return false; // no archived java heap data + } + + size_t word_size = size / HeapWordSize; + address requested_start = heap_region_requested_address(info); + + aot_log_info(aot)("Preferred address to map heap data (to avoid relocation) is " INTPTR_FORMAT, p2i(requested_start)); + + // allocate from java heap + HeapWord* start = G1CollectedHeap::heap()->alloc_archive_region(word_size, (HeapWord*)requested_start); + if (start == nullptr) { + AOTMetaspace::report_loading_error("UseSharedSpaces: Unable to allocate java heap region for archive heap."); + return false; + } + + _mapped_heap_memregion = MemRegion(start, word_size); + + // Map the archived heap data. No need to call MemTracker::record_virtual_memory_tag() + // for mapped region as it is part of the reserved java heap, which is already recorded. + char* addr = (char*)_mapped_heap_memregion.start(); + char* base; + + if (AOTMetaspace::use_windows_memory_mapping() || UseLargePages) { + // With UseLargePages, memory mapping may fail on some OSes if the size is not + // large page aligned, so let's use read() instead. In this case, the memory region + // is already commited by G1 so we don't need to commit it again. + if (!info->read_region(AOTMetaspace::hp, addr, + align_up(_mapped_heap_memregion.byte_size(), os::vm_page_size()), + /* do_commit = */ !UseLargePages)) { + dealloc_heap_region(info); + aot_log_error(aot)("Failed to read archived heap region into " INTPTR_FORMAT, p2i(addr)); + return false; + } + // Checks for VerifySharedSpaces is already done inside read_region() + base = addr; + } else { + base = info->map_heap_region(r, addr, _mapped_heap_memregion.byte_size()); + if (base == nullptr || base != addr) { + dealloc_heap_region(info); + AOTMetaspace::report_loading_error("UseSharedSpaces: Unable to map at required address in java heap. " + INTPTR_FORMAT ", size = %zu bytes", + p2i(addr), _mapped_heap_memregion.byte_size()); + return false; + } + + if (VerifySharedSpaces && !r->check_region_crc(base)) { + dealloc_heap_region(info); + AOTMetaspace::report_loading_error("UseSharedSpaces: mapped heap region is corrupt"); + return false; + } + } + + r->set_mapped_base(base); + + // If the requested range is different from the range allocated by GC, then + // the pointers need to be patched. + address mapped_start = (address) _mapped_heap_memregion.start(); + ptrdiff_t delta = mapped_start - requested_start; + if (UseCompressedOops && + (info->narrow_oop_mode() != CompressedOops::mode() || + info->narrow_oop_shift() != CompressedOops::shift())) { + _heap_pointers_need_patching = true; + } + if (delta != 0) { + _heap_pointers_need_patching = true; + } + init_mapped_heap_info(mapped_start, delta, info->narrow_oop_shift()); + + if (_heap_pointers_need_patching) { + char* bitmap_base = info->map_bitmap_region(); + if (bitmap_base == nullptr) { + AOTMetaspace::report_loading_error("CDS heap cannot be used because bitmap region cannot be mapped"); + dealloc_heap_region(info); + _heap_pointers_need_patching = false; + return false; + } + } + aot_log_info(aot)("Heap data mapped at " INTPTR_FORMAT ", size = %8zu bytes", + p2i(mapped_start), _mapped_heap_memregion.byte_size()); + aot_log_info(aot)("CDS heap data relocation delta = %zd bytes", delta); + return true; +} + +narrowOop AOTMappedHeapLoader::encoded_heap_region_dumptime_address(FileMapInfo* info) { + assert(CDSConfig::is_using_archive(), "runtime only"); + assert(UseCompressedOops, "sanity"); + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + return CompressedOops::narrow_oop_cast(r->mapping_offset() >> info->narrow_oop_shift()); +} + +void AOTMappedHeapLoader::patch_heap_embedded_pointers(FileMapInfo* info) { + if (!info->is_mapped() || !_heap_pointers_need_patching) { + return; + } + + char* bitmap_base = info->map_bitmap_region(); + assert(bitmap_base != nullptr, "must have already been mapped"); + + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + patch_embedded_pointers( + info, _mapped_heap_memregion, + (address)(info->region_at(AOTMetaspace::bm)->mapped_base()) + r->oopmap_offset(), + r->oopmap_size_in_bits()); +} + +void AOTMappedHeapLoader::fixup_mapped_heap_region(FileMapInfo* info) { + if (is_mapped()) { + assert(!_mapped_heap_memregion.is_empty(), "sanity"); + + // Populate the archive regions' G1BlockOffsetTables. That ensures + // fast G1BlockOffsetTable::block_start operations for any given address + // within the archive regions when trying to find start of an object + // (e.g. during card table scanning). + G1CollectedHeap::heap()->populate_archive_regions_bot(_mapped_heap_memregion); + } +} + +// dealloc the archive regions from java heap +void AOTMappedHeapLoader::dealloc_heap_region(FileMapInfo* info) { + G1CollectedHeap::heap()->dealloc_archive_regions(_mapped_heap_memregion); +} + +AOTMapLogger::OopDataIterator* AOTMappedHeapLoader::oop_iterator(FileMapInfo* info, address buffer_start, address buffer_end) { + class MappedLoaderOopIterator : public AOTMapLogger::OopDataIterator { + private: + address _current; + address _next; + + address _buffer_start; + address _buffer_end; + uint64_t _buffer_start_narrow_oop; + intptr_t _buffer_to_requested_delta; + int _requested_shift; + + size_t _num_root_segments; + size_t _num_obj_arrays_logged; + + public: + MappedLoaderOopIterator(address buffer_start, + address buffer_end, + uint64_t buffer_start_narrow_oop, + intptr_t buffer_to_requested_delta, + int requested_shift, + size_t num_root_segments) + : _current(nullptr), + _next(buffer_start), + _buffer_start(buffer_start), + _buffer_end(buffer_end), + _buffer_start_narrow_oop(buffer_start_narrow_oop), + _buffer_to_requested_delta(buffer_to_requested_delta), + _requested_shift(requested_shift), + _num_root_segments(num_root_segments), + _num_obj_arrays_logged(0) { + } + + + AOTMapLogger::OopData capture(address buffered_addr) { + oopDesc* raw_oop = (oopDesc*)buffered_addr; + size_t size = raw_oop->size(); + address requested_addr = buffered_addr + _buffer_to_requested_delta; + intptr_t target_location = intptr_t(requested_addr); + uint64_t pd = (uint64_t)(pointer_delta(buffered_addr, _buffer_start, 1)); + uint32_t narrow_location = checked_cast(_buffer_start_narrow_oop + (pd >> _requested_shift)); + Klass* klass = raw_oop->klass(); + + return { buffered_addr, + requested_addr, + target_location, + narrow_location, + raw_oop, + klass, + size, + false }; + } + + bool has_next() override { + return _next < _buffer_end; + } + + AOTMapLogger::OopData next() override { + _current = _next; + AOTMapLogger::OopData result = capture(_current); + if (result._klass->is_objArray_klass()) { + result._is_root_segment = _num_obj_arrays_logged++ < _num_root_segments; + } + _next = _current + result._size * BytesPerWord; + return result; + } + + AOTMapLogger::OopData obj_at(narrowOop* addr) override { + uint64_t n = (uint64_t)(*addr); + if (n == 0) { + return null_data(); + } else { + precond(n >= _buffer_start_narrow_oop); + address buffer_addr = _buffer_start + ((n - _buffer_start_narrow_oop) << _requested_shift); + return capture(buffer_addr); + } + } + + AOTMapLogger::OopData obj_at(oop* addr) override { + address requested_value = cast_from_oop
          (*addr); + if (requested_value == nullptr) { + return null_data(); + } else { + address buffer_addr = requested_value - _buffer_to_requested_delta; + return capture(buffer_addr); + } + } + + GrowableArrayCHeap* roots() override { + return new GrowableArrayCHeap(); + } + }; + + FileMapRegion* r = info->region_at(AOTMetaspace::hp); + address requested_base = UseCompressedOops ? (address)info->narrow_oop_base() : heap_region_requested_address(info); + address requested_start = requested_base + r->mapping_offset(); + int requested_shift = info->narrow_oop_shift(); + intptr_t buffer_to_requested_delta = requested_start - buffer_start; + uint64_t buffer_start_narrow_oop = 0xdeadbeed; + if (UseCompressedOops) { + buffer_start_narrow_oop = (uint64_t)(pointer_delta(requested_start, requested_base, 1)) >> requested_shift; + assert(buffer_start_narrow_oop < 0xffffffff, "sanity"); + } + + return new MappedLoaderOopIterator(buffer_start, + buffer_end, + buffer_start_narrow_oop, + buffer_to_requested_delta, + requested_shift, + info->mapped_heap()->root_segments().count()); +} + +#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/archiveHeapLoader.hpp b/src/hotspot/share/cds/aotMappedHeapLoader.hpp similarity index 79% rename from src/hotspot/share/cds/archiveHeapLoader.hpp rename to src/hotspot/share/cds/aotMappedHeapLoader.hpp index e559b447ebf..d344d7b0b0a 100644 --- a/src/hotspot/share/cds/archiveHeapLoader.hpp +++ b/src/hotspot/share/cds/aotMappedHeapLoader.hpp @@ -22,22 +22,27 @@ * */ -#ifndef SHARE_CDS_ARCHIVEHEAPLOADER_HPP -#define SHARE_CDS_ARCHIVEHEAPLOADER_HPP +#ifndef SHARE_CDS_AOTMAPPEDHEAPLOADER_HPP +#define SHARE_CDS_AOTMAPPEDHEAPLOADER_HPP +#include "cds/aotMapLogger.hpp" #include "gc/shared/gc_globals.hpp" #include "memory/allocation.hpp" #include "memory/allStatic.hpp" #include "memory/memRegion.hpp" +#include "oops/oopHandle.hpp" #include "oops/oopsHierarchy.hpp" #include "runtime/globals.hpp" #include "utilities/bitMap.hpp" +#include "utilities/growableArray.hpp" #include "utilities/macros.hpp" class FileMapInfo; struct LoadedArchiveHeapRegion; -class ArchiveHeapLoader : AllStatic { +class AOTMappedHeapLoader : AllStatic { + friend class AOTMapLogger; + public: // At runtime, the heap region in the CDS archive can be used in two different ways, // depending on the GC type: @@ -55,7 +60,6 @@ public: // Can this VM load the objects from archived heap region into the heap at start-up? static bool can_load() NOT_CDS_JAVA_HEAP_RETURN_(false); - static void finish_initialization() NOT_CDS_JAVA_HEAP_RETURN; static bool is_loaded() { CDS_JAVA_HEAP_ONLY(return _is_loaded;) NOT_CDS_JAVA_HEAP(return false;) @@ -81,6 +85,8 @@ public: NOT_CDS_JAVA_HEAP_RETURN_(false); } + static void finish_initialization(FileMapInfo* info) NOT_CDS_JAVA_HEAP_RETURN; + // NarrowOops stored in the CDS archive may use a different encoding scheme // than CompressedOops::{base,shift} -- see FileMapInfo::map_heap_region_impl. // To decode them, do not use CompressedOops::decode_not_null. Use this @@ -127,6 +133,13 @@ private: static ptrdiff_t _mapped_heap_delta; static bool _mapped_heap_relocation_initialized; + // Heap roots + static GrowableArrayCHeap* _root_segments; + static int _root_segment_max_size_elems; + + static MemRegion _mapped_heap_memregion; + static bool _heap_pointers_need_patching; + static void init_narrow_oop_decoding(address base, int shift); static bool init_loaded_region(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_region, MemRegion& archive_space); @@ -141,20 +154,40 @@ private: return (_loaded_heap_bottom <= o && o < _loaded_heap_top); } + static objArrayOop root_segment(int segment_idx); + static void get_segment_indexes(int idx, int& seg_idx, int& int_idx); + static void add_root_segment(objArrayOop segment_oop); + static void init_root_segment_sizes(int max_size_elems); + template inline static oop decode_from_archive_impl(narrowOop v) NOT_CDS_JAVA_HEAP_RETURN_(nullptr); class PatchLoadedRegionPointers; class PatchUncompressedLoadedRegionPointers; + static address heap_region_dumptime_address(FileMapInfo* info); + static address heap_region_requested_address(FileMapInfo* info); + static bool map_heap_region_impl(FileMapInfo* info); + static narrowOop encoded_heap_region_dumptime_address(FileMapInfo* info); + static void patch_heap_embedded_pointers(FileMapInfo* info); + static void fixup_mapped_heap_region(FileMapInfo* info); + static void dealloc_heap_region(FileMapInfo* info); + public: + static bool map_heap_region(FileMapInfo* info); static bool load_heap_region(FileMapInfo* mapinfo); static void assert_in_loaded_heap(uintptr_t o) { assert(is_in_loaded_heap(o), "must be"); } + + static oop get_root(int index); + static void clear_root(int index); + + static AOTMapLogger::OopDataIterator* oop_iterator(FileMapInfo* info, address buffer_start, address buffer_end); + #endif // INCLUDE_CDS_JAVA_HEAP }; -#endif // SHARE_CDS_ARCHIVEHEAPLOADER_HPP +#endif // SHARE_CDS_AOTMAPPEDHEAPLOADER_HPP diff --git a/src/hotspot/share/cds/archiveHeapLoader.inline.hpp b/src/hotspot/share/cds/aotMappedHeapLoader.inline.hpp similarity index 82% rename from src/hotspot/share/cds/archiveHeapLoader.inline.hpp rename to src/hotspot/share/cds/aotMappedHeapLoader.inline.hpp index 9efd39b8d26..0e50fefdf0f 100644 --- a/src/hotspot/share/cds/archiveHeapLoader.inline.hpp +++ b/src/hotspot/share/cds/aotMappedHeapLoader.inline.hpp @@ -22,10 +22,10 @@ * */ -#ifndef SHARE_CDS_ARCHIVEHEAPLOADER_INLINE_HPP -#define SHARE_CDS_ARCHIVEHEAPLOADER_INLINE_HPP +#ifndef SHARE_CDS_AOTMAPPEDHEAPLOADER_INLINE_HPP +#define SHARE_CDS_AOTMAPPEDHEAPLOADER_INLINE_HPP -#include "cds/archiveHeapLoader.hpp" +#include "cds/aotMappedHeapLoader.hpp" #include "oops/compressedOops.inline.hpp" #include "utilities/align.hpp" @@ -33,7 +33,7 @@ #if INCLUDE_CDS_JAVA_HEAP template -inline oop ArchiveHeapLoader::decode_from_archive_impl(narrowOop v) { +inline oop AOTMappedHeapLoader::decode_from_archive_impl(narrowOop v) { assert(!CompressedOops::is_null(v), "narrow oop value can never be zero"); assert(_narrow_oop_base_initialized, "relocation information must have been initialized"); uintptr_t p = ((uintptr_t)_narrow_oop_base) + ((uintptr_t)v << _narrow_oop_shift); @@ -49,14 +49,14 @@ inline oop ArchiveHeapLoader::decode_from_archive_impl(narrowOop v) { return result; } -inline oop ArchiveHeapLoader::decode_from_archive(narrowOop v) { +inline oop AOTMappedHeapLoader::decode_from_archive(narrowOop v) { return decode_from_archive_impl(v); } -inline oop ArchiveHeapLoader::decode_from_mapped_archive(narrowOop v) { +inline oop AOTMappedHeapLoader::decode_from_mapped_archive(narrowOop v) { return decode_from_archive_impl(v); } #endif -#endif // SHARE_CDS_ARCHIVEHEAPLOADER_INLINE_HPP +#endif // SHARE_CDS_AOTMAPPEDHEAPLOADER_INLINE_HPP diff --git a/src/hotspot/share/cds/archiveHeapWriter.cpp b/src/hotspot/share/cds/aotMappedHeapWriter.cpp similarity index 69% rename from src/hotspot/share/cds/archiveHeapWriter.cpp rename to src/hotspot/share/cds/aotMappedHeapWriter.cpp index d1a8772874a..ff9319d266b 100644 --- a/src/hotspot/share/cds/archiveHeapWriter.cpp +++ b/src/hotspot/share/cds/aotMappedHeapWriter.cpp @@ -22,16 +22,18 @@ * */ +#include "cds/aotMappedHeapLoader.hpp" +#include "cds/aotMappedHeapWriter.hpp" #include "cds/aotReferenceObjSupport.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/cdsConfig.hpp" #include "cds/filemap.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "cds/regeneratedClasses.hpp" #include "classfile/javaClasses.hpp" #include "classfile/modules.hpp" #include "classfile/systemDictionary.hpp" #include "gc/shared/collectedHeap.hpp" +#include "memory/allocation.inline.hpp" #include "memory/iterator.inline.hpp" #include "memory/oopFactory.hpp" #include "memory/universe.hpp" @@ -51,24 +53,25 @@ #if INCLUDE_CDS_JAVA_HEAP -GrowableArrayCHeap* ArchiveHeapWriter::_buffer = nullptr; +GrowableArrayCHeap* AOTMappedHeapWriter::_buffer = nullptr; // The following are offsets from buffer_bottom() -size_t ArchiveHeapWriter::_buffer_used; +size_t AOTMappedHeapWriter::_buffer_used; // Heap root segments -HeapRootSegments ArchiveHeapWriter::_heap_root_segments; +HeapRootSegments AOTMappedHeapWriter::_heap_root_segments; -address ArchiveHeapWriter::_requested_bottom; -address ArchiveHeapWriter::_requested_top; +address AOTMappedHeapWriter::_requested_bottom; +address AOTMappedHeapWriter::_requested_top; -GrowableArrayCHeap* ArchiveHeapWriter::_native_pointers; -GrowableArrayCHeap* ArchiveHeapWriter::_source_objs; -GrowableArrayCHeap* ArchiveHeapWriter::_source_objs_order; +GrowableArrayCHeap* AOTMappedHeapWriter::_native_pointers; +GrowableArrayCHeap* AOTMappedHeapWriter::_source_objs; +GrowableArrayCHeap* AOTMappedHeapWriter::_source_objs_order; -ArchiveHeapWriter::BufferOffsetToSourceObjectTable* - ArchiveHeapWriter::_buffer_offset_to_source_obj_table = nullptr; +AOTMappedHeapWriter::BufferOffsetToSourceObjectTable* +AOTMappedHeapWriter::_buffer_offset_to_source_obj_table = nullptr; +DumpedInternedStrings *AOTMappedHeapWriter::_dumped_interned_strings = nullptr; typedef HashTable< size_t, // offset of a filler from ArchiveHeapWriter::buffer_bottom() @@ -79,11 +82,12 @@ typedef HashTable< static FillersTable* _fillers; static int _num_native_ptrs = 0; -void ArchiveHeapWriter::init() { +void AOTMappedHeapWriter::init() { if (CDSConfig::is_dumping_heap()) { Universe::heap()->collect(GCCause::_java_lang_system_gc); _buffer_offset_to_source_obj_table = new BufferOffsetToSourceObjectTable(/*size (prime)*/36137, /*max size*/1 * M); + _dumped_interned_strings = new (mtClass)DumpedInternedStrings(INITIAL_TABLE_SIZE, MAX_TABLE_SIZE); _fillers = new FillersTable(); _requested_bottom = nullptr; _requested_top = nullptr; @@ -95,17 +99,20 @@ void ArchiveHeapWriter::init() { } } -void ArchiveHeapWriter::delete_tables_with_raw_oops() { +void AOTMappedHeapWriter::delete_tables_with_raw_oops() { delete _source_objs; _source_objs = nullptr; + + delete _dumped_interned_strings; + _dumped_interned_strings = nullptr; } -void ArchiveHeapWriter::add_source_obj(oop src_obj) { +void AOTMappedHeapWriter::add_source_obj(oop src_obj) { _source_objs->append(src_obj); } -void ArchiveHeapWriter::write(GrowableArrayCHeap* roots, - ArchiveHeapInfo* heap_info) { +void AOTMappedHeapWriter::write(GrowableArrayCHeap* roots, + ArchiveMappedHeapInfo* heap_info) { assert(CDSConfig::is_dumping_heap(), "sanity"); allocate_buffer(); copy_source_objs_to_buffer(roots); @@ -113,16 +120,16 @@ void ArchiveHeapWriter::write(GrowableArrayCHeap* roots, relocate_embedded_oops(roots, heap_info); } -bool ArchiveHeapWriter::is_too_large_to_archive(oop o) { +bool AOTMappedHeapWriter::is_too_large_to_archive(oop o) { return is_too_large_to_archive(o->size()); } -bool ArchiveHeapWriter::is_string_too_large_to_archive(oop string) { +bool AOTMappedHeapWriter::is_string_too_large_to_archive(oop string) { typeArrayOop value = java_lang_String::value_no_keepalive(string); return is_too_large_to_archive(value); } -bool ArchiveHeapWriter::is_too_large_to_archive(size_t size) { +bool AOTMappedHeapWriter::is_too_large_to_archive(size_t size) { assert(size > 0, "no zero-size object"); assert(size * HeapWordSize > size, "no overflow"); static_assert(MIN_GC_REGION_ALIGNMENT > 0, "must be positive"); @@ -135,20 +142,39 @@ bool ArchiveHeapWriter::is_too_large_to_archive(size_t size) { } } +// Keep track of the contents of the archived interned string table. This table +// is used only by CDSHeapVerifier. +void AOTMappedHeapWriter::add_to_dumped_interned_strings(oop string) { + assert_at_safepoint(); // DumpedInternedStrings uses raw oops + assert(!is_string_too_large_to_archive(string), "must be"); + bool created; + _dumped_interned_strings->put_if_absent(string, true, &created); + if (created) { + // Prevent string deduplication from changing the value field to + // something not in the archive. + java_lang_String::set_deduplication_forbidden(string); + _dumped_interned_strings->maybe_grow(); + } +} + +bool AOTMappedHeapWriter::is_dumped_interned_string(oop o) { + return _dumped_interned_strings->get(o) != nullptr; +} + // Various lookup functions between source_obj, buffered_obj and requested_obj -bool ArchiveHeapWriter::is_in_requested_range(oop o) { +bool AOTMappedHeapWriter::is_in_requested_range(oop o) { assert(_requested_bottom != nullptr, "do not call before _requested_bottom is initialized"); address a = cast_from_oop
          (o); return (_requested_bottom <= a && a < _requested_top); } -oop ArchiveHeapWriter::requested_obj_from_buffer_offset(size_t offset) { +oop AOTMappedHeapWriter::requested_obj_from_buffer_offset(size_t offset) { oop req_obj = cast_to_oop(_requested_bottom + offset); assert(is_in_requested_range(req_obj), "must be"); return req_obj; } -oop ArchiveHeapWriter::source_obj_to_requested_obj(oop src_obj) { +oop AOTMappedHeapWriter::source_obj_to_requested_obj(oop src_obj) { assert(CDSConfig::is_dumping_heap(), "dump-time only"); HeapShared::CachedOopInfo* p = HeapShared::get_cached_oop_info(src_obj); if (p != nullptr) { @@ -158,7 +184,7 @@ oop ArchiveHeapWriter::source_obj_to_requested_obj(oop src_obj) { } } -oop ArchiveHeapWriter::buffered_addr_to_source_obj(address buffered_addr) { +oop AOTMappedHeapWriter::buffered_addr_to_source_obj(address buffered_addr) { OopHandle* oh = _buffer_offset_to_source_obj_table->get(buffered_address_to_offset(buffered_addr)); if (oh != nullptr) { return oh->resolve(); @@ -167,7 +193,7 @@ oop ArchiveHeapWriter::buffered_addr_to_source_obj(address buffered_addr) { } } -Klass* ArchiveHeapWriter::real_klass_of_buffered_oop(address buffered_addr) { +Klass* AOTMappedHeapWriter::real_klass_of_buffered_oop(address buffered_addr) { oop p = buffered_addr_to_source_obj(buffered_addr); if (p != nullptr) { return p->klass(); @@ -179,7 +205,7 @@ Klass* ArchiveHeapWriter::real_klass_of_buffered_oop(address buffered_addr) { } } -size_t ArchiveHeapWriter::size_of_buffered_oop(address buffered_addr) { +size_t AOTMappedHeapWriter::size_of_buffered_oop(address buffered_addr) { oop p = buffered_addr_to_source_obj(buffered_addr); if (p != nullptr) { return p->size(); @@ -205,29 +231,29 @@ size_t ArchiveHeapWriter::size_of_buffered_oop(address buffered_addr) { return 0; } -address ArchiveHeapWriter::buffered_addr_to_requested_addr(address buffered_addr) { +address AOTMappedHeapWriter::buffered_addr_to_requested_addr(address buffered_addr) { return _requested_bottom + buffered_address_to_offset(buffered_addr); } -address ArchiveHeapWriter::requested_address() { +address AOTMappedHeapWriter::requested_address() { assert(_buffer != nullptr, "must be initialized"); return _requested_bottom; } -void ArchiveHeapWriter::allocate_buffer() { +void AOTMappedHeapWriter::allocate_buffer() { int initial_buffer_size = 100000; _buffer = new GrowableArrayCHeap(initial_buffer_size); _buffer_used = 0; ensure_buffer_space(1); // so that buffer_bottom() works } -void ArchiveHeapWriter::ensure_buffer_space(size_t min_bytes) { +void AOTMappedHeapWriter::ensure_buffer_space(size_t min_bytes) { // We usually have very small heaps. If we get a huge one it's probably caused by a bug. guarantee(min_bytes <= max_jint, "we dont support archiving more than 2G of objects"); _buffer->at_grow(to_array_index(min_bytes)); } -objArrayOop ArchiveHeapWriter::allocate_root_segment(size_t offset, int element_count) { +objArrayOop AOTMappedHeapWriter::allocate_root_segment(size_t offset, int element_count) { HeapWord* mem = offset_to_buffered_address(offset); memset(mem, 0, objArrayOopDesc::object_size(element_count)); @@ -242,7 +268,7 @@ objArrayOop ArchiveHeapWriter::allocate_root_segment(size_t offset, int element_ return objArrayOop(cast_to_oop(mem)); } -void ArchiveHeapWriter::root_segment_at_put(objArrayOop segment, int index, oop root) { +void AOTMappedHeapWriter::root_segment_at_put(objArrayOop segment, int index, oop root) { // Do not use arrayOop->obj_at_put(i, o) as arrayOop is outside the real heap! if (UseCompressedOops) { *segment->obj_at_addr(index) = CompressedOops::encode(root); @@ -251,7 +277,7 @@ void ArchiveHeapWriter::root_segment_at_put(objArrayOop segment, int index, oop } } -void ArchiveHeapWriter::copy_roots_to_buffer(GrowableArrayCHeap* roots) { +void AOTMappedHeapWriter::copy_roots_to_buffer(GrowableArrayCHeap* roots) { // Depending on the number of classes we are archiving, a single roots array may be // larger than MIN_GC_REGION_ALIGNMENT. Roots are allocated first in the buffer, which // allows us to chop the large array into a series of "segments". Current layout @@ -324,7 +350,7 @@ static int oop_sorting_rank(oop o) { } } -int ArchiveHeapWriter::compare_objs_by_oop_fields(HeapObjOrder* a, HeapObjOrder* b) { +int AOTMappedHeapWriter::compare_objs_by_oop_fields(HeapObjOrder* a, HeapObjOrder* b) { int rank_a = a->_rank; int rank_b = b->_rank; @@ -336,7 +362,7 @@ int ArchiveHeapWriter::compare_objs_by_oop_fields(HeapObjOrder* a, HeapObjOrder* } } -void ArchiveHeapWriter::sort_source_objs() { +void AOTMappedHeapWriter::sort_source_objs() { log_info(aot)("sorting heap objects"); int len = _source_objs->length(); _source_objs_order = new GrowableArrayCHeap(len); @@ -352,7 +378,7 @@ void ArchiveHeapWriter::sort_source_objs() { log_info(aot)("sorting heap objects done"); } -void ArchiveHeapWriter::copy_source_objs_to_buffer(GrowableArrayCHeap* roots) { +void AOTMappedHeapWriter::copy_source_objs_to_buffer(GrowableArrayCHeap* roots) { // There could be multiple root segments, which we want to be aligned by region. // Putting them ahead of objects makes sure we waste no space. copy_roots_to_buffer(roots); @@ -379,12 +405,12 @@ void ArchiveHeapWriter::copy_source_objs_to_buffer(GrowableArrayCHeaplength() + 1, roots->length(), _num_native_ptrs); } -size_t ArchiveHeapWriter::filler_array_byte_size(int length) { +size_t AOTMappedHeapWriter::filler_array_byte_size(int length) { size_t byte_size = objArrayOopDesc::object_size(length) * HeapWordSize; return byte_size; } -int ArchiveHeapWriter::filler_array_length(size_t fill_bytes) { +int AOTMappedHeapWriter::filler_array_length(size_t fill_bytes) { assert(is_object_aligned(fill_bytes), "must be"); size_t elemSize = (UseCompressedOops ? sizeof(narrowOop) : sizeof(oop)); @@ -400,7 +426,7 @@ int ArchiveHeapWriter::filler_array_length(size_t fill_bytes) { return -1; } -HeapWord* ArchiveHeapWriter::init_filler_array_at_buffer_top(int array_length, size_t fill_bytes) { +HeapWord* AOTMappedHeapWriter::init_filler_array_at_buffer_top(int array_length, size_t fill_bytes) { assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses"); Klass* oak = Universe::objectArrayKlass(); // already relocated to point to archived klass HeapWord* mem = offset_to_buffered_address(_buffer_used); @@ -416,7 +442,7 @@ HeapWord* ArchiveHeapWriter::init_filler_array_at_buffer_top(int array_length, s return mem; } -void ArchiveHeapWriter::maybe_fill_gc_region_gap(size_t required_byte_size) { +void AOTMappedHeapWriter::maybe_fill_gc_region_gap(size_t required_byte_size) { // We fill only with arrays (so we don't need to use a single HeapWord filler if the // leftover space is smaller than a zero-sized array object). Therefore, we need to // make sure there's enough space of min_filler_byte_size in the current region after @@ -449,7 +475,7 @@ void ArchiveHeapWriter::maybe_fill_gc_region_gap(size_t required_byte_size) { } } -size_t ArchiveHeapWriter::get_filler_size_at(address buffered_addr) { +size_t AOTMappedHeapWriter::get_filler_size_at(address buffered_addr) { size_t* p = _fillers->get(buffered_address_to_offset(buffered_addr)); if (p != nullptr) { assert(*p > 0, "filler must be larger than zero bytes"); @@ -465,7 +491,7 @@ void update_buffered_object_field(address buffered_obj, int field_offset, T valu *field_addr = value; } -size_t ArchiveHeapWriter::copy_one_source_obj_to_buffer(oop src_obj) { +size_t AOTMappedHeapWriter::copy_one_source_obj_to_buffer(oop src_obj) { assert(!is_too_large_to_archive(src_obj), "already checked"); size_t byte_size = src_obj->size() * HeapWordSize; assert(byte_size > 0, "no zero-size objects"); @@ -510,7 +536,7 @@ size_t ArchiveHeapWriter::copy_one_source_obj_to_buffer(oop src_obj) { return buffered_obj_offset; } -void ArchiveHeapWriter::set_requested_address(ArchiveHeapInfo* info) { +void AOTMappedHeapWriter::set_requested_address(ArchiveMappedHeapInfo* info) { assert(!info->is_used(), "only set once"); size_t heap_region_byte_size = _buffer_used; @@ -541,12 +567,12 @@ void ArchiveHeapWriter::set_requested_address(ArchiveHeapInfo* info) { info->set_buffer_region(MemRegion(offset_to_buffered_address(0), offset_to_buffered_address(_buffer_used))); - info->set_heap_root_segments(_heap_root_segments); + info->set_root_segments(_heap_root_segments); } // Oop relocation -template T* ArchiveHeapWriter::requested_addr_to_buffered_addr(T* p) { +template T* AOTMappedHeapWriter::requested_addr_to_buffered_addr(T* p) { assert(is_in_requested_range(cast_to_oop(p)), "must be"); address addr = address(p); @@ -555,56 +581,44 @@ template T* ArchiveHeapWriter::requested_addr_to_buffered_addr(T* p return offset_to_buffered_address(offset); } -template oop ArchiveHeapWriter::load_source_oop_from_buffer(T* buffered_addr) { +template oop AOTMappedHeapWriter::load_source_oop_from_buffer(T* buffered_addr) { oop o = load_oop_from_buffer(buffered_addr); assert(!in_buffer(cast_from_oop
          (o)), "must point to source oop"); return o; } -template void ArchiveHeapWriter::store_requested_oop_in_buffer(T* buffered_addr, - oop request_oop) { - assert(is_in_requested_range(request_oop), "must be"); +template void AOTMappedHeapWriter::store_requested_oop_in_buffer(T* buffered_addr, + oop request_oop) { + assert(request_oop == nullptr || is_in_requested_range(request_oop), "must be"); store_oop_in_buffer(buffered_addr, request_oop); } -inline void ArchiveHeapWriter::store_oop_in_buffer(oop* buffered_addr, oop requested_obj) { +inline void AOTMappedHeapWriter::store_oop_in_buffer(oop* buffered_addr, oop requested_obj) { *buffered_addr = requested_obj; } -inline void ArchiveHeapWriter::store_oop_in_buffer(narrowOop* buffered_addr, oop requested_obj) { - narrowOop val = CompressedOops::encode_not_null(requested_obj); +inline void AOTMappedHeapWriter::store_oop_in_buffer(narrowOop* buffered_addr, oop requested_obj) { + narrowOop val = CompressedOops::encode(requested_obj); *buffered_addr = val; } -oop ArchiveHeapWriter::load_oop_from_buffer(oop* buffered_addr) { +oop AOTMappedHeapWriter::load_oop_from_buffer(oop* buffered_addr) { return *buffered_addr; } -oop ArchiveHeapWriter::load_oop_from_buffer(narrowOop* buffered_addr) { +oop AOTMappedHeapWriter::load_oop_from_buffer(narrowOop* buffered_addr) { return CompressedOops::decode(*buffered_addr); } -template void ArchiveHeapWriter::relocate_field_in_buffer(T* field_addr_in_buffer, CHeapBitMap* oopmap) { - oop source_referent = load_source_oop_from_buffer(field_addr_in_buffer); - if (source_referent != nullptr) { - if (java_lang_Class::is_instance(source_referent)) { - Klass* k = java_lang_Class::as_Klass(source_referent); - if (RegeneratedClasses::has_been_regenerated(k)) { - source_referent = RegeneratedClasses::get_regenerated_object(k)->java_mirror(); - } - // When the source object points to a "real" mirror, the buffered object should point - // to the "scratch" mirror, which has all unarchivable fields scrubbed (to be reinstated - // at run time). - source_referent = HeapShared::scratch_java_mirror(source_referent); - assert(source_referent != nullptr, "must be"); - } - oop request_referent = source_obj_to_requested_obj(source_referent); - store_requested_oop_in_buffer(field_addr_in_buffer, request_referent); +template void AOTMappedHeapWriter::relocate_field_in_buffer(T* field_addr_in_buffer, oop source_referent, CHeapBitMap* oopmap) { + oop request_referent = source_obj_to_requested_obj(source_referent); + store_requested_oop_in_buffer(field_addr_in_buffer, request_referent); + if (request_referent != nullptr) { mark_oop_pointer(field_addr_in_buffer, oopmap); } } -template void ArchiveHeapWriter::mark_oop_pointer(T* buffered_addr, CHeapBitMap* oopmap) { +template void AOTMappedHeapWriter::mark_oop_pointer(T* buffered_addr, CHeapBitMap* oopmap) { T* request_p = (T*)(buffered_addr_to_requested_addr((address)buffered_addr)); address requested_region_bottom; @@ -620,7 +634,7 @@ template void ArchiveHeapWriter::mark_oop_pointer(T* buffered_addr, oopmap->set_bit(idx); } -void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj, Klass* src_klass) { +void AOTMappedHeapWriter::update_header_for_requested_obj(oop requested_obj, oop src_obj, Klass* src_klass) { assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses"); narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass); address buffered_addr = requested_addr_to_buffered_addr(cast_from_oop
          (requested_obj)); @@ -653,7 +667,7 @@ void ArchiveHeapWriter::update_header_for_requested_obj(oop requested_obj, oop s fake_oop->set_mark(fake_oop->mark().set_age(0)); } -class ArchiveHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure { +class AOTMappedHeapWriter::EmbeddedOopRelocator: public BasicOopIterateClosure { oop _src_obj; address _buffered_obj; CHeapBitMap* _oopmap; @@ -672,12 +686,9 @@ private: template void do_oop_work(T *p) { int field_offset = pointer_delta_as_int((char*)p, cast_from_oop(_src_obj)); T* field_addr = (T*)(_buffered_obj + field_offset); - if (_is_java_lang_ref && AOTReferenceObjSupport::skip_field(field_offset)) { - // Do not copy these fields. Set them to null - *field_addr = (T)0x0; - } else { - ArchiveHeapWriter::relocate_field_in_buffer(field_addr, _oopmap); - } + oop referent = load_source_oop_from_buffer(field_addr); + referent = HeapShared::maybe_remap_referent(_is_java_lang_ref, field_offset, referent); + AOTMappedHeapWriter::relocate_field_in_buffer(field_addr, referent, _oopmap); } }; @@ -693,8 +704,8 @@ static void log_bitmap_usage(const char* which, BitMap* bitmap, size_t total_bit } // Update all oop fields embedded in the buffered objects -void ArchiveHeapWriter::relocate_embedded_oops(GrowableArrayCHeap* roots, - ArchiveHeapInfo* heap_info) { +void AOTMappedHeapWriter::relocate_embedded_oops(GrowableArrayCHeap* roots, + ArchiveMappedHeapInfo* heap_info) { size_t oopmap_unit = (UseCompressedOops ? sizeof(narrowOop) : sizeof(oop)); size_t heap_region_byte_size = _buffer_used; heap_info->oopmap()->resize(heap_region_byte_size / oopmap_unit); @@ -709,6 +720,7 @@ void ArchiveHeapWriter::relocate_embedded_oops(GrowableArrayCHeap(info->buffer_offset()); EmbeddedOopRelocator relocator(src_obj, buffered_obj, heap_info->oopmap()); src_obj->oop_iterate(&relocator); + mark_native_pointers(src_obj); }; // Relocate HeapShared::roots(), which is created in copy_roots_to_buffer() and @@ -721,15 +733,19 @@ void ArchiveHeapWriter::relocate_embedded_oops(GrowableArrayCHeap(seg_offset); int length = _heap_root_segments.size_in_elems(seg_idx); - if (UseCompressedOops) { - for (int i = 0; i < length; i++) { - narrowOop* addr = (narrowOop*)(buffered_obj + objArrayOopDesc::obj_at_offset(i)); - relocate_field_in_buffer(addr, heap_info->oopmap()); - } - } else { - for (int i = 0; i < length; i++) { - oop* addr = (oop*)(buffered_obj + objArrayOopDesc::obj_at_offset(i)); - relocate_field_in_buffer(addr, heap_info->oopmap()); + size_t elem_size = UseCompressedOops ? sizeof(narrowOop) : sizeof(oop); + + for (int i = 0; i < length; i++) { + // There is no source object; these are native oops - load, translate and + // write back + size_t elem_offset = objArrayOopDesc::base_offset_in_bytes() + elem_size * i; + HeapWord* elem_addr = (HeapWord*)(buffered_obj + elem_offset); + oop obj = NativeAccess<>::oop_load(elem_addr); + obj = HeapShared::maybe_remap_referent(false /* is_reference_field */, elem_offset, obj); + if (UseCompressedOops) { + relocate_field_in_buffer((narrowOop*)elem_addr, obj, heap_info->oopmap()); + } else { + relocate_field_in_buffer((oop*)elem_addr, obj, heap_info->oopmap()); } } } @@ -741,7 +757,7 @@ void ArchiveHeapWriter::relocate_embedded_oops(GrowableArrayCHeapptrmap(), total_bytes / sizeof(address)); } -void ArchiveHeapWriter::mark_native_pointer(oop src_obj, int field_offset) { +void AOTMappedHeapWriter::mark_native_pointer(oop src_obj, int field_offset) { Metadata* ptr = src_obj->metadata_field_acquire(field_offset); if (ptr != nullptr) { NativePointerInfo info; @@ -753,7 +769,13 @@ void ArchiveHeapWriter::mark_native_pointer(oop src_obj, int field_offset) { } } -void ArchiveHeapWriter::compute_ptrmap(ArchiveHeapInfo* heap_info) { +void AOTMappedHeapWriter::mark_native_pointers(oop orig_obj) { + HeapShared::do_metadata_offsets(orig_obj, [&](int offset) { + mark_native_pointer(orig_obj, offset); + }); +} + +void AOTMappedHeapWriter::compute_ptrmap(ArchiveMappedHeapInfo* heap_info) { int num_non_null_ptrs = 0; Metadata** bottom = (Metadata**) _requested_bottom; Metadata** top = (Metadata**) _requested_top; // exclusive @@ -800,4 +822,118 @@ void ArchiveHeapWriter::compute_ptrmap(ArchiveHeapInfo* heap_info) { num_non_null_ptrs, size_t(heap_info->ptrmap()->size())); } +AOTMapLogger::OopDataIterator* AOTMappedHeapWriter::oop_iterator(ArchiveMappedHeapInfo* heap_info) { + class MappedWriterOopIterator : public AOTMapLogger::OopDataIterator { + private: + address _current; + address _next; + + address _buffer_start; + address _buffer_end; + uint64_t _buffer_start_narrow_oop; + intptr_t _buffer_to_requested_delta; + int _requested_shift; + + size_t _num_root_segments; + size_t _num_obj_arrays_logged; + + public: + MappedWriterOopIterator(address buffer_start, + address buffer_end, + uint64_t buffer_start_narrow_oop, + intptr_t buffer_to_requested_delta, + int requested_shift, + size_t num_root_segments) + : _current(nullptr), + _next(buffer_start), + _buffer_start(buffer_start), + _buffer_end(buffer_end), + _buffer_start_narrow_oop(buffer_start_narrow_oop), + _buffer_to_requested_delta(buffer_to_requested_delta), + _requested_shift(requested_shift), + _num_root_segments(num_root_segments), + _num_obj_arrays_logged(0) { + } + + AOTMapLogger::OopData capture(address buffered_addr) { + oopDesc* raw_oop = (oopDesc*)buffered_addr; + size_t size = size_of_buffered_oop(buffered_addr); + address requested_addr = buffered_addr_to_requested_addr(buffered_addr); + intptr_t target_location = (intptr_t)requested_addr; + uint64_t pd = (uint64_t)(pointer_delta(buffered_addr, _buffer_start, 1)); + uint32_t narrow_location = checked_cast(_buffer_start_narrow_oop + (pd >> _requested_shift)); + Klass* klass = real_klass_of_buffered_oop(buffered_addr); + + return { buffered_addr, + requested_addr, + target_location, + narrow_location, + raw_oop, + klass, + size, + false }; + } + + bool has_next() override { + return _next < _buffer_end; + } + + AOTMapLogger::OopData next() override { + _current = _next; + AOTMapLogger::OopData result = capture(_current); + if (result._klass->is_objArray_klass()) { + result._is_root_segment = _num_obj_arrays_logged++ < _num_root_segments; + } + _next = _current + result._size * BytesPerWord; + return result; + } + + AOTMapLogger::OopData obj_at(narrowOop* addr) override { + uint64_t n = (uint64_t)(*addr); + if (n == 0) { + return null_data(); + } else { + precond(n >= _buffer_start_narrow_oop); + address buffer_addr = _buffer_start + ((n - _buffer_start_narrow_oop) << _requested_shift); + return capture(buffer_addr); + } + } + + AOTMapLogger::OopData obj_at(oop* addr) override { + address requested_value = cast_from_oop
          (*addr); + if (requested_value == nullptr) { + return null_data(); + } else { + address buffer_addr = requested_value - _buffer_to_requested_delta; + return capture(buffer_addr); + } + } + + GrowableArrayCHeap* roots() override { + return new GrowableArrayCHeap(); + } + }; + + MemRegion r = heap_info->buffer_region(); + address buffer_start = address(r.start()); + address buffer_end = address(r.end()); + + address requested_base = UseCompressedOops ? (address)CompressedOops::base() : (address)AOTMappedHeapWriter::NOCOOPS_REQUESTED_BASE; + address requested_start = UseCompressedOops ? buffered_addr_to_requested_addr(buffer_start) : requested_base; + int requested_shift = CompressedOops::shift(); + intptr_t buffer_to_requested_delta = requested_start - buffer_start; + uint64_t buffer_start_narrow_oop = 0xdeadbeed; + if (UseCompressedOops) { + buffer_start_narrow_oop = (uint64_t)(pointer_delta(requested_start, requested_base, 1)) >> requested_shift; + assert(buffer_start_narrow_oop < 0xffffffff, "sanity"); + } + + return new MappedWriterOopIterator(buffer_start, + buffer_end, + buffer_start_narrow_oop, + buffer_to_requested_delta, + requested_shift, + heap_info->root_segments().count()); +} + #endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/archiveHeapWriter.hpp b/src/hotspot/share/cds/aotMappedHeapWriter.hpp similarity index 86% rename from src/hotspot/share/cds/archiveHeapWriter.hpp rename to src/hotspot/share/cds/aotMappedHeapWriter.hpp index 80e72c12e7e..9a85b83d3d1 100644 --- a/src/hotspot/share/cds/archiveHeapWriter.hpp +++ b/src/hotspot/share/cds/aotMappedHeapWriter.hpp @@ -22,9 +22,10 @@ * */ -#ifndef SHARE_CDS_ARCHIVEHEAPWRITER_HPP -#define SHARE_CDS_ARCHIVEHEAPWRITER_HPP +#ifndef SHARE_CDS_AOTMAPPEDHEAPWRITER_HPP +#define SHARE_CDS_AOTMAPPEDHEAPWRITER_HPP +#include "cds/aotMapLogger.hpp" #include "cds/heapShared.hpp" #include "memory/allocation.hpp" #include "memory/allStatic.hpp" @@ -37,32 +38,25 @@ class MemRegion; -class ArchiveHeapInfo { - MemRegion _buffer_region; // Contains the archived objects to be written into the CDS archive. - CHeapBitMap _oopmap; - CHeapBitMap _ptrmap; - HeapRootSegments _heap_root_segments; - +#if INCLUDE_CDS_JAVA_HEAP +class DumpedInternedStrings : + public ResizeableHashTable +{ public: - ArchiveHeapInfo() : _buffer_region(), _oopmap(128, mtClassShared), _ptrmap(128, mtClassShared) {} - bool is_used() { return !_buffer_region.is_empty(); } - - MemRegion buffer_region() { return _buffer_region; } - void set_buffer_region(MemRegion r) { _buffer_region = r; } - - char* buffer_start() { return (char*)_buffer_region.start(); } - size_t buffer_byte_size() { return _buffer_region.byte_size(); } - - CHeapBitMap* oopmap() { return &_oopmap; } - CHeapBitMap* ptrmap() { return &_ptrmap; } - - void set_heap_root_segments(HeapRootSegments segments) { _heap_root_segments = segments; }; - HeapRootSegments heap_root_segments() { return _heap_root_segments; } + DumpedInternedStrings(unsigned size, unsigned max_size) : + ResizeableHashTable(size, max_size) {} }; -#if INCLUDE_CDS_JAVA_HEAP -class ArchiveHeapWriter : AllStatic { - // ArchiveHeapWriter manipulates three types of addresses: +class AOTMappedHeapWriter : AllStatic { + friend class HeapShared; + friend class AOTMappedHeapLoader; + // AOTMappedHeapWriter manipulates three types of addresses: // // "source" vs "buffered" vs "requested" // @@ -117,6 +111,9 @@ public: // Shenandoah heap region size can never be smaller than 256K. static constexpr int MIN_GC_REGION_ALIGNMENT = 256 * K; + static const int INITIAL_TABLE_SIZE = 15889; // prime number + static const int MAX_TABLE_SIZE = 1000000; + private: class EmbeddedOopRelocator; struct NativePointerInfo { @@ -138,6 +135,7 @@ private: static GrowableArrayCHeap* _native_pointers; static GrowableArrayCHeap* _source_objs; + static DumpedInternedStrings *_dumped_interned_strings; // We sort _source_objs_order to minimize the number of bits in ptrmap and oopmap. // See comments near the body of ArchiveHeapWriter::compare_objs_by_oop_fields(). @@ -202,9 +200,10 @@ private: static int filler_array_length(size_t fill_bytes); static HeapWord* init_filler_array_at_buffer_top(int array_length, size_t fill_bytes); - static void set_requested_address(ArchiveHeapInfo* info); - static void relocate_embedded_oops(GrowableArrayCHeap* roots, ArchiveHeapInfo* info); - static void compute_ptrmap(ArchiveHeapInfo *info); + static void set_requested_address(ArchiveMappedHeapInfo* info); + static void mark_native_pointers(oop orig_obj); + static void relocate_embedded_oops(GrowableArrayCHeap* roots, ArchiveMappedHeapInfo* info); + static void compute_ptrmap(ArchiveMappedHeapInfo *info); static bool is_in_requested_range(oop o); static oop requested_obj_from_buffer_offset(size_t offset); @@ -217,7 +216,7 @@ private: template static void store_requested_oop_in_buffer(T* buffered_addr, oop request_oop); template static T* requested_addr_to_buffered_addr(T* p); - template static void relocate_field_in_buffer(T* field_addr_in_buffer, CHeapBitMap* oopmap); + template static void relocate_field_in_buffer(T* field_addr_in_buffer, oop source_referent, CHeapBitMap* oopmap); template static void mark_oop_pointer(T* buffered_addr, CHeapBitMap* oopmap); static void update_header_for_requested_obj(oop requested_obj, oop src_obj, Klass* src_klass); @@ -232,7 +231,9 @@ public: static bool is_too_large_to_archive(size_t size); static bool is_too_large_to_archive(oop obj); static bool is_string_too_large_to_archive(oop string); - static void write(GrowableArrayCHeap*, ArchiveHeapInfo* heap_info); + static bool is_dumped_interned_string(oop o); + static void add_to_dumped_interned_strings(oop string); + static void write(GrowableArrayCHeap*, ArchiveMappedHeapInfo* heap_info); static address requested_address(); // requested address of the lowest achived heap object static size_t get_filler_size_at(address buffered_addr); @@ -242,6 +243,8 @@ public: static address buffered_addr_to_requested_addr(address buffered_addr); static Klass* real_klass_of_buffered_oop(address buffered_addr); static size_t size_of_buffered_oop(address buffered_addr); + + static AOTMapLogger::OopDataIterator* oop_iterator(ArchiveMappedHeapInfo* heap_info); }; #endif // INCLUDE_CDS_JAVA_HEAP -#endif // SHARE_CDS_ARCHIVEHEAPWRITER_HPP +#endif // SHARE_CDS_AOTMAPPEDHEAPWRITER_HPP diff --git a/src/hotspot/share/cds/aotMetaspace.cpp b/src/hotspot/share/cds/aotMetaspace.cpp index e5c1700dbfb..8642b1a6de8 100644 --- a/src/hotspot/share/cds/aotMetaspace.cpp +++ b/src/hotspot/share/cds/aotMetaspace.cpp @@ -30,11 +30,10 @@ #include "cds/aotLinkedClassBulkLoader.hpp" #include "cds/aotLogging.hpp" #include "cds/aotMapLogger.hpp" +#include "cds/aotMappedHeapLoader.hpp" #include "cds/aotMetaspace.hpp" #include "cds/aotReferenceObjSupport.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/cds_globals.hpp" #include "cds/cdsConfig.hpp" #include "cds/cdsProtectionDomain.hpp" @@ -45,7 +44,7 @@ #include "cds/dynamicArchive.hpp" #include "cds/filemap.hpp" #include "cds/finalImageRecipes.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "cds/lambdaFormInvokers.hpp" #include "cds/lambdaProxyClassDictionary.hpp" #include "classfile/classLoaderDataGraph.hpp" @@ -339,7 +338,10 @@ void AOTMetaspace::post_initialize(TRAPS) { // Close any open file descriptors. However, mmap'ed pages will remain in memory. static_mapinfo->close(); - static_mapinfo->unmap_region(AOTMetaspace::bm); + + if (HeapShared::is_loading() && HeapShared::is_loading_mapping_mode()) { + static_mapinfo->unmap_region(AOTMetaspace::bm); + } if (dynamic_mapinfo != nullptr) { dynamic_mapinfo->close(); @@ -395,7 +397,7 @@ void AOTMetaspace::read_extra_data(JavaThread* current, const char* filename) { CLEAR_PENDING_EXCEPTION; } else { #if INCLUDE_CDS_JAVA_HEAP - if (ArchiveHeapWriter::is_string_too_large_to_archive(str)) { + if (HeapShared::is_string_too_large_to_archive(str)) { log_warning(aot, heap)("[line %d] extra interned string ignored; size too large: %d", reader.last_line_no(), utf8_length); continue; @@ -638,7 +640,8 @@ void AOTMetaspace::rewrite_bytecodes_and_calculate_fingerprints(Thread* thread, class VM_PopulateDumpSharedSpace : public VM_Operation { private: - ArchiveHeapInfo _heap_info; + ArchiveMappedHeapInfo _mapped_heap_info; + ArchiveStreamedHeapInfo _streamed_heap_info; FileMapInfo* _map_info; StaticArchiveBuilder& _builder; @@ -653,12 +656,13 @@ private: public: VM_PopulateDumpSharedSpace(StaticArchiveBuilder& b) : - VM_Operation(), _heap_info(), _map_info(nullptr), _builder(b) {} + VM_Operation(), _mapped_heap_info(), _streamed_heap_info(), _map_info(nullptr), _builder(b) {} bool skip_operation() const { return false; } VMOp_Type type() const { return VMOp_PopulateDumpSharedSpace; } - ArchiveHeapInfo* heap_info() { return &_heap_info; } + ArchiveMappedHeapInfo* mapped_heap_info() { return &_mapped_heap_info; } + ArchiveStreamedHeapInfo* streamed_heap_info() { return &_streamed_heap_info; } FileMapInfo* map_info() const { return _map_info; } void doit(); // outline because gdb sucks bool allow_nested_vm_operations() const { return true; } @@ -1100,8 +1104,7 @@ void AOTMetaspace::dump_static_archive_impl(StaticArchiveBuilder& builder, TRAPS #if INCLUDE_CDS_JAVA_HEAP if (CDSConfig::is_dumping_heap()) { - ArchiveHeapWriter::init(); - + HeapShared::init_heap_writer(); if (CDSConfig::is_dumping_full_module_graph()) { ClassLoaderDataShared::ensure_module_entry_tables_exist(); HeapShared::reset_archived_object_states(CHECK); @@ -1124,9 +1127,11 @@ void AOTMetaspace::dump_static_archive_impl(StaticArchiveBuilder& builder, TRAPS // See discussion in JDK-8342481. } - // Do this at the very end, when no Java code will be executed. Otherwise - // some new strings may be added to the intern table. - StringTable::allocate_shared_strings_array(CHECK); + if (HeapShared::is_writing_mapping_mode()) { + // Do this at the very end, when no Java code will be executed. Otherwise + // some new strings may be added to the intern table. + StringTable::allocate_shared_strings_array(CHECK); + } } else { log_info(aot)("Not dumping heap, reset CDSConfig::_is_using_optimized_module_handling"); CDSConfig::stop_using_optimized_module_handling(); @@ -1147,7 +1152,7 @@ void AOTMetaspace::dump_static_archive_impl(StaticArchiveBuilder& builder, TRAPS CDSConfig::disable_dumping_aot_code(); } - bool status = write_static_archive(&builder, op.map_info(), op.heap_info()); + bool status = write_static_archive(&builder, op.map_info(), op.mapped_heap_info(), op.streamed_heap_info()); if (status && CDSConfig::is_dumping_preimage_static_archive()) { tty->print_cr("%s AOTConfiguration recorded: %s", CDSConfig::has_temp_aot_config_file() ? "Temporary" : "", AOTConfiguration); @@ -1161,7 +1166,10 @@ void AOTMetaspace::dump_static_archive_impl(StaticArchiveBuilder& builder, TRAPS } } -bool AOTMetaspace::write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info) { +bool AOTMetaspace::write_static_archive(ArchiveBuilder* builder, + FileMapInfo* map_info, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info) { // relocate the data so that it can be mapped to AOTMetaspace::requested_base_address() // without runtime relocation. builder->relocate_to_requested(); @@ -1170,7 +1178,7 @@ bool AOTMetaspace::write_static_archive(ArchiveBuilder* builder, FileMapInfo* ma if (!map_info->is_open()) { return false; } - builder->write_archive(map_info, heap_info); + builder->write_archive(map_info, mapped_heap_info, streamed_heap_info); return true; } @@ -1344,7 +1352,7 @@ bool AOTMetaspace::try_link_class(JavaThread* current, InstanceKlass* ik) { void VM_PopulateDumpSharedSpace::dump_java_heap_objects() { if (CDSConfig::is_dumping_heap()) { - HeapShared::write_heap(&_heap_info); + HeapShared::write_heap(&_mapped_heap_info, &_streamed_heap_info); } else { CDSConfig::log_reasons_for_not_dumping_heap(); } @@ -1746,9 +1754,29 @@ MapArchiveResult AOTMetaspace::map_archives(FileMapInfo* static_mapinfo, FileMap CompressedKlassPointers::establish_protection_zone(klass_range_start, prot_zone_size); } - // map_or_load_heap_region() compares the current narrow oop and klass encodings - // with the archived ones, so it must be done after all encodings are determined. - static_mapinfo->map_or_load_heap_region(); + if (static_mapinfo->can_use_heap_region()) { + if (static_mapinfo->object_streaming_mode()) { + HeapShared::initialize_loading_mode(HeapArchiveMode::_streaming); + } else { + // map_or_load_heap_region() compares the current narrow oop and klass encodings + // with the archived ones, so it must be done after all encodings are determined. + static_mapinfo->map_or_load_heap_region(); + HeapShared::initialize_loading_mode(HeapArchiveMode::_mapping); + } + } else { + FileMapRegion* r = static_mapinfo->region_at(AOTMetaspace::hp); + if (r->used() > 0) { + if (static_mapinfo->object_streaming_mode()) { + AOTMetaspace::report_loading_error("Cannot use CDS heap data."); + } else { + if (!UseCompressedOops && !AOTMappedHeapLoader::can_map()) { + AOTMetaspace::report_loading_error("Cannot use CDS heap data. Selected GC not compatible -XX:-UseCompressedOops"); + } else { + AOTMetaspace::report_loading_error("Cannot use CDS heap data. UseEpsilonGC, UseG1GC, UseSerialGC, UseParallelGC, or UseShenandoahGC are required."); + } + } + } + } } #endif // _LP64 log_info(aot)("initial optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled"); @@ -2081,11 +2109,11 @@ void AOTMetaspace::initialize_shared_spaces() { ReadClosure rc(&array, (intptr_t)SharedBaseAddress); serialize(&rc); - // Finish up archived heap initialization. These must be - // done after ReadClosure. - static_mapinfo->patch_heap_embedded_pointers(); - ArchiveHeapLoader::finish_initialization(); + // Finish initializing the heap dump mode used in the archive + // Heap initialization can be done only after vtables are initialized by ReadClosure. + HeapShared::finalize_initialization(static_mapinfo); Universe::load_archived_object_instances(); + AOTCodeCache::initialize(); if (dynamic_mapinfo != nullptr) { @@ -2138,7 +2166,9 @@ void AOTMetaspace::initialize_shared_spaces() { CountSharedSymbols cl; SymbolTable::shared_symbols_do(&cl); tty->print_cr("Number of shared symbols: %zu", cl.total()); - tty->print_cr("Number of shared strings: %zu", StringTable::shared_entry_count()); + if (HeapShared::is_loading_mapping_mode()) { + tty->print_cr("Number of shared strings: %zu", StringTable::shared_entry_count()); + } tty->print_cr("VM version: %s\r\n", static_mapinfo->vm_version()); if (FileMapInfo::current_info() == nullptr || _archive_loading_failed) { tty->print_cr("archive is invalid"); diff --git a/src/hotspot/share/cds/aotMetaspace.hpp b/src/hotspot/share/cds/aotMetaspace.hpp index c7b1578ec08..bfd9f4bcc75 100644 --- a/src/hotspot/share/cds/aotMetaspace.hpp +++ b/src/hotspot/share/cds/aotMetaspace.hpp @@ -33,7 +33,8 @@ #include "utilities/macros.hpp" class ArchiveBuilder; -class ArchiveHeapInfo; +class ArchiveMappedHeapInfo; +class ArchiveStreamedHeapInfo; class FileMapInfo; class Method; class outputStream; @@ -184,7 +185,10 @@ public: private: static void read_extra_data(JavaThread* current, const char* filename) NOT_CDS_RETURN; static void fork_and_dump_final_static_archive(TRAPS); - static bool write_static_archive(ArchiveBuilder* builder, FileMapInfo* map_info, ArchiveHeapInfo* heap_info); + static bool write_static_archive(ArchiveBuilder* builder, + FileMapInfo* map_info, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info); static FileMapInfo* open_static_archive(); static FileMapInfo* open_dynamic_archive(); // use_requested_addr: If true (default), attempt to map at the address the diff --git a/src/hotspot/share/cds/aotReferenceObjSupport.cpp b/src/hotspot/share/cds/aotReferenceObjSupport.cpp index e1598035d15..aa7cc875533 100644 --- a/src/hotspot/share/cds/aotReferenceObjSupport.cpp +++ b/src/hotspot/share/cds/aotReferenceObjSupport.cpp @@ -153,6 +153,9 @@ void AOTReferenceObjSupport::stabilize_cached_reference_objects(TRAPS) { _keep_alive_objs_array = OopHandle(Universe::vm_global(), result.get_oop()); } + + // Trigger a GC to prune eligible referents that were not kept alive + Universe::heap()->collect(GCCause::_java_lang_system_gc); } } diff --git a/src/hotspot/share/cds/aotStreamedHeapLoader.cpp b/src/hotspot/share/cds/aotStreamedHeapLoader.cpp new file mode 100644 index 00000000000..9b6974bb48d --- /dev/null +++ b/src/hotspot/share/cds/aotStreamedHeapLoader.cpp @@ -0,0 +1,1190 @@ +/* + * Copyright (c) 2018, 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. + * + * 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. + * + */ + +#include "cds/aotMetaspace.hpp" +#include "cds/aotStreamedHeapLoader.hpp" +#include "cds/aotThread.hpp" +#include "cds/cdsConfig.hpp" +#include "cds/filemap.hpp" +#include "cds/heapShared.inline.hpp" +#include "classfile/classLoaderDataShared.hpp" +#include "classfile/javaClasses.inline.hpp" +#include "classfile/stringTable.hpp" +#include "classfile/vmClasses.hpp" +#include "gc/shared/collectedHeap.inline.hpp" +#include "gc/shared/oopStorage.inline.hpp" +#include "gc/shared/oopStorageSet.inline.hpp" +#include "logging/log.hpp" +#include "memory/iterator.inline.hpp" +#include "memory/oopFactory.hpp" +#include "oops/access.inline.hpp" +#include "oops/objArrayOop.inline.hpp" +#include "oops/oop.inline.hpp" +#include "runtime/globals.hpp" +#include "runtime/globals_extension.hpp" +#include "runtime/handles.inline.hpp" +#include "runtime/java.hpp" +#include "runtime/mutex.hpp" +#include "runtime/thread.hpp" +#include "utilities/bitMap.inline.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/stack.inline.hpp" +#include "utilities/ticks.hpp" + +#include + +#if INCLUDE_CDS_JAVA_HEAP + +FileMapRegion* AOTStreamedHeapLoader::_heap_region; +FileMapRegion* AOTStreamedHeapLoader::_bitmap_region; +int* AOTStreamedHeapLoader::_roots_archive; +OopHandle AOTStreamedHeapLoader::_roots; +BitMapView AOTStreamedHeapLoader::_oopmap; +bool AOTStreamedHeapLoader::_is_in_use; +int AOTStreamedHeapLoader::_previous_batch_last_object_index; +int AOTStreamedHeapLoader::_current_batch_last_object_index; +int AOTStreamedHeapLoader::_current_root_index; +size_t AOTStreamedHeapLoader::_allocated_words; +bool AOTStreamedHeapLoader::_allow_gc; +bool AOTStreamedHeapLoader::_objects_are_handles; +size_t AOTStreamedHeapLoader::_num_archived_objects; +int AOTStreamedHeapLoader::_num_roots; +size_t AOTStreamedHeapLoader::_heap_region_used; +bool AOTStreamedHeapLoader::_loading_all_objects; + +size_t* AOTStreamedHeapLoader::_object_index_to_buffer_offset_table; +void** AOTStreamedHeapLoader::_object_index_to_heap_object_table; +int* AOTStreamedHeapLoader::_root_highest_object_index_table; + +bool AOTStreamedHeapLoader::_waiting_for_iterator; +bool AOTStreamedHeapLoader::_swapping_root_format; + +static uint64_t _early_materialization_time_ns = 0; +static uint64_t _late_materialization_time_ns = 0; +static uint64_t _final_materialization_time_ns = 0; +static uint64_t _cleanup_materialization_time_ns = 0; +static volatile uint64_t _accumulated_lazy_materialization_time_ns = 0; +static Ticks _materialization_start_ticks; + +int AOTStreamedHeapLoader::object_index_for_root_index(int root_index) { + return _roots_archive[root_index]; +} + +int AOTStreamedHeapLoader::highest_object_index_for_root_index(int root_index) { + return _root_highest_object_index_table[root_index]; +} + +size_t AOTStreamedHeapLoader::buffer_offset_for_object_index(int object_index) { + return _object_index_to_buffer_offset_table[object_index]; +} + +oopDesc* AOTStreamedHeapLoader::archive_object_for_object_index(int object_index) { + size_t buffer_offset = buffer_offset_for_object_index(object_index); + address bottom = (address)_heap_region->mapped_base(); + return (oopDesc*)(bottom + buffer_offset); +} + +size_t AOTStreamedHeapLoader::buffer_offset_for_archive_object(oopDesc* archive_object) { + address bottom = (address)_heap_region->mapped_base(); + return size_t(archive_object) - size_t(bottom); +} + +template +BitMap::idx_t AOTStreamedHeapLoader::obj_bit_idx_for_buffer_offset(size_t buffer_offset) { + if constexpr (use_coops) { + return BitMap::idx_t(buffer_offset / sizeof(narrowOop)); + } else { + return BitMap::idx_t(buffer_offset / sizeof(HeapWord)); + } +} + +oop AOTStreamedHeapLoader::heap_object_for_object_index(int object_index) { + assert(object_index >= 0 && object_index <= (int)_num_archived_objects, + "Heap object reference out of index: %d", object_index); + + if (_objects_are_handles) { + oop* handle = (oop*)_object_index_to_heap_object_table[object_index]; + if (handle == nullptr) { + return nullptr; + } + return NativeAccess<>::oop_load(handle); + } else { + return cast_to_oop(_object_index_to_heap_object_table[object_index]); + } +} + +void AOTStreamedHeapLoader::set_heap_object_for_object_index(int object_index, oop heap_object) { + assert(heap_object_for_object_index(object_index) == nullptr, "Should only set once with this API"); + if (_objects_are_handles) { + oop* handle = Universe::vm_global()->allocate(); + NativeAccess<>::oop_store(handle, heap_object); + _object_index_to_heap_object_table[object_index] = (void*)handle; + } else { + _object_index_to_heap_object_table[object_index] = cast_from_oop(heap_object); + } +} + +int AOTStreamedHeapLoader::archived_string_value_object_index(oopDesc* archive_object) { + assert(archive_object->klass() == vmClasses::String_klass(), "Must be an archived string"); + address archive_string_value_addr = (address)archive_object + java_lang_String::value_offset(); + return UseCompressedOops ? *(int*)archive_string_value_addr : (int)*(int64_t*)archive_string_value_addr; +} + +static int archive_array_length(oopDesc* archive_array) { + return *(int*)(address(archive_array) + arrayOopDesc::length_offset_in_bytes()); +} + +static size_t archive_object_size(oopDesc* archive_object) { + Klass* klass = archive_object->klass(); + int lh = klass->layout_helper(); + + if (Klass::layout_helper_is_instance(lh)) { + // Instance + if (Klass::layout_helper_needs_slow_path(lh)) { + return ((size_t*)(archive_object))[-1]; + } else { + return (size_t)Klass::layout_helper_size_in_bytes(lh) >> LogHeapWordSize; + } + } else if (Klass::layout_helper_is_array(lh)) { + // Array + size_t size_in_bytes; + size_t array_length = (size_t)archive_array_length(archive_object); + size_in_bytes = array_length << Klass::layout_helper_log2_element_size(lh); + size_in_bytes += (size_t)Klass::layout_helper_header_size(lh); + + return align_up(size_in_bytes, (size_t)MinObjAlignmentInBytes) / HeapWordSize; + } else { + // Other + return ((size_t*)(archive_object))[-1]; + } +} + +oop AOTStreamedHeapLoader::allocate_object(oopDesc* archive_object, markWord mark, size_t size, TRAPS) { + assert(!archive_object->is_stackChunk(), "no such objects are archived"); + + oop heap_object; + + Klass* klass = archive_object->klass(); + if (klass->is_mirror_instance_klass()) { + heap_object = Universe::heap()->class_allocate(klass, size, CHECK_NULL); + } else if (klass->is_instance_klass()) { + heap_object = Universe::heap()->obj_allocate(klass, size, CHECK_NULL); + } else { + assert(klass->is_array_klass(), "must be"); + int length = archive_array_length(archive_object); + bool do_zero = klass->is_objArray_klass(); + heap_object = Universe::heap()->array_allocate(klass, size, length, do_zero, CHECK_NULL); + } + + heap_object->set_mark(mark); + + return heap_object; +} + +void AOTStreamedHeapLoader::install_root(int root_index, oop heap_object) { + objArrayOop roots = objArrayOop(_roots.resolve()); + OrderAccess::release(); // Once the store below publishes an object, it can be concurrently picked up by another thread without using the lock + roots->obj_at_put(root_index, heap_object); +} + +void AOTStreamedHeapLoader::TracingObjectLoader::wait_for_iterator() { + if (JavaThread::current()->is_active_Java_thread()) { + // When the main thread has bootstrapped past the point of allowing safepoints, + // we can and indeed have to use safepoint checking waiting. + AOTHeapLoading_lock->wait(); + } else { + // If we have no bootstrapped the main thread far enough, then we cannot and + // indeed also don't need to perform safepoint checking waiting. + AOTHeapLoading_lock->wait_without_safepoint_check(); + } +} + +// Link object after copying in-place +template +class AOTStreamedHeapLoader::InPlaceLinkingOopClosure : public BasicOopIterateClosure { +private: + oop _obj; + LinkerT _linker; + +public: + InPlaceLinkingOopClosure(oop obj, LinkerT linker) + : _obj(obj), + _linker(linker) { + } + + virtual void do_oop(oop* p) { do_oop_work(p, (int)*(intptr_t*)p); } + virtual void do_oop(narrowOop* p) { do_oop_work(p, *(int*)p); } + + template + void do_oop_work(T* p, int object_index) { + int p_offset = pointer_delta_as_int((address)p, cast_from_oop
          (_obj)); + oop pointee = _linker(p_offset, object_index); + if (pointee != nullptr) { + _obj->obj_field_put_access((int)p_offset, pointee); + } + } +}; + +template +void AOTStreamedHeapLoader::copy_payload_carefully(oopDesc* archive_object, + oop heap_object, + BitMap::idx_t header_bit, + BitMap::idx_t start_bit, + BitMap::idx_t end_bit, + LinkerT linker) { + using RawElementT = std::conditional_t; + using OopElementT = std::conditional_t; + + BitMap::idx_t unfinished_bit = start_bit; + BitMap::idx_t next_reference_bit = _oopmap.find_first_set_bit(unfinished_bit, end_bit); + + // Fill in heap object bytes + while (unfinished_bit < end_bit) { + assert(unfinished_bit >= start_bit && unfinished_bit < end_bit, "out of bounds copying"); + + // This is the address of the pointee inside the input stream + size_t payload_offset = unfinished_bit - header_bit; + RawElementT* archive_payload_addr = ((RawElementT*)archive_object) + payload_offset; + RawElementT* heap_payload_addr = cast_from_oop(heap_object) + payload_offset; + + assert(heap_payload_addr >= cast_from_oop(heap_object) && + (HeapWord*)heap_payload_addr < cast_from_oop(heap_object) + heap_object->size(), + "Out of bounds copying"); + + if (next_reference_bit > unfinished_bit) { + // Primitive bytes available + size_t primitive_elements = next_reference_bit - unfinished_bit; + size_t primitive_bytes = primitive_elements * sizeof(RawElementT); + ::memcpy(heap_payload_addr, archive_payload_addr, primitive_bytes); + + unfinished_bit = next_reference_bit; + } else { + // Encountered reference + RawElementT* archive_p = (RawElementT*)archive_payload_addr; + OopElementT* heap_p = (OopElementT*)heap_payload_addr; + int pointee_object_index = (int)*archive_p; + int heap_p_offset = pointer_delta_as_int((address)heap_p, cast_from_oop
          (heap_object)); + + // The object index is retrieved from the archive, not the heap object. This is + // important after GC is enabled. Concurrent GC threads may scan references in the + // heap for various reasons after this point. Therefore, it is not okay to first copy + // the object index from a reference location in the archived object payload to a + // corresponding location in the heap object payload, and then fix it up afterwards to + // refer to a heap object. This is why this code iterates carefully over object references + // in the archived object, linking them one by one, without clobbering the reference + // locations in the heap objects with anything other than transitions from null to the + // intended linked object. + oop obj = linker(heap_p_offset, pointee_object_index); + if (obj != nullptr) { + heap_object->obj_field_put(heap_p_offset, obj); + } + + unfinished_bit++; + next_reference_bit = _oopmap.find_first_set_bit(unfinished_bit, end_bit); + } + } +} + +template +void AOTStreamedHeapLoader::copy_object_impl(oopDesc* archive_object, + oop heap_object, + size_t size, + LinkerT linker) { + if (!_allow_gc) { + // Without concurrent GC running, we can copy incorrect object references + // and metadata references into the heap object and then fix them up in-place. + size_t payload_size = size - 1; + HeapWord* archive_start = ((HeapWord*)archive_object) + 1; + HeapWord* heap_start = cast_from_oop(heap_object) + 1; + + Copy::disjoint_words(archive_start, heap_start, payload_size); + + // In-place linking fixes up object indices from references of the heap object, + // and patches them up to refer to objects. This can be done because we just copied + // the payload of the object from the archive to the heap object, including the + // reference object indices. However, this is only okay to do before the GC can run. + // A concurrent GC thread might racingly read the object payload after GC is enabled. + InPlaceLinkingOopClosure cl(heap_object, linker); + heap_object->oop_iterate(&cl); + HeapShared::remap_loaded_metadata(heap_object); + return; + } + + // When a concurrent GC may be running, we take care not to copy incorrect oops, + // narrowOops or Metadata* into the heap objects. Transitions go from 0 to the + // intended runtime linked values only. + size_t word_scale = use_coops ? 2 : 1; + using RawElementT = std::conditional_t; + + // Skip the markWord; it is set at allocation time + size_t header_size = word_scale; + + size_t buffer_offset = buffer_offset_for_archive_object(archive_object); + const BitMap::idx_t header_bit = obj_bit_idx_for_buffer_offset(buffer_offset); + const BitMap::idx_t start_bit = header_bit + header_size; + const BitMap::idx_t end_bit = header_bit + size * word_scale; + + BitMap::idx_t curr_bit = start_bit; + + // We are a bit paranoid about GC or other safepointing operations observing + // shady metadata fields from the archive that do not point at real metadata. + // We deal with this by explicitly reading the requested address from the + // archive and fixing it to real Metadata before writing it into the heap object. + HeapShared::do_metadata_offsets(heap_object, [&](int metadata_offset) { + BitMap::idx_t metadata_field_idx = header_bit + (size_t)metadata_offset / sizeof(RawElementT); + BitMap::idx_t skip = word_scale; + assert(metadata_field_idx >= start_bit && metadata_field_idx + skip <= end_bit, + "Metadata field out of bounds"); + + // Copy payload before metadata field + copy_payload_carefully(archive_object, + heap_object, + header_bit, + curr_bit, + metadata_field_idx, + linker); + + // Copy metadata field + Metadata* const archive_metadata = *(Metadata**)(uintptr_t(archive_object) + (size_t)metadata_offset); + Metadata* const runtime_metadata = archive_metadata != nullptr + ? (Metadata*)(address(archive_metadata) + AOTMetaspace::relocation_delta()) + : nullptr; + assert(runtime_metadata == nullptr || AOTMetaspace::in_aot_cache(runtime_metadata), "Invalid metadata pointer"); + DEBUG_ONLY(Metadata* const previous_metadata = heap_object->metadata_field(metadata_offset);) + assert(previous_metadata == nullptr || previous_metadata == runtime_metadata, "Should not observe transient values"); + heap_object->metadata_field_put(metadata_offset, runtime_metadata); + curr_bit = metadata_field_idx + skip; + }); + + // Copy trailing metadata after the last metadata word. This is usually doing + // all the copying. + copy_payload_carefully(archive_object, + heap_object, + header_bit, + curr_bit, + end_bit, + linker); +} + +void AOTStreamedHeapLoader::copy_object_eager_linking(oopDesc* archive_object, oop heap_object, size_t size) { + auto linker = [&](int p_offset, int pointee_object_index) { + oop obj = AOTStreamedHeapLoader::heap_object_for_object_index(pointee_object_index); + assert(pointee_object_index == 0 || obj != nullptr, "Eager object loading should only encounter already allocated links"); + return obj; + }; + if (UseCompressedOops) { + copy_object_impl(archive_object, heap_object, size, linker); + } else { + copy_object_impl(archive_object, heap_object, size, linker); + } +} + +void AOTStreamedHeapLoader::TracingObjectLoader::copy_object_lazy_linking(int object_index, + oopDesc* archive_object, + oop heap_object, + size_t size, + Stack& dfs_stack) { + auto linker = [&](int p_offset, int pointee_object_index) { + dfs_stack.push({pointee_object_index, object_index, p_offset}); + + // The tracing linker is a bit lazy and mutates the reference fields in its traversal. + // Returning null means don't link now. + return oop(nullptr); + }; + if (UseCompressedOops) { + copy_object_impl(archive_object, heap_object, size, linker); + } else { + copy_object_impl(archive_object, heap_object, size, linker); + } +} + +oop AOTStreamedHeapLoader::TracingObjectLoader::materialize_object_inner(int object_index, Stack& dfs_stack, TRAPS) { + // Allocate object + oopDesc* archive_object = archive_object_for_object_index(object_index); + size_t size = archive_object_size(archive_object); + markWord mark = archive_object->mark(); + + // The markWord is marked if the object is a String and it should be interned, + // make sure to unmark it before allocating memory for the object. + bool string_intern = mark.is_marked(); + mark = mark.set_unmarked(); + + oop heap_object; + + if (string_intern) { + int value_object_index = archived_string_value_object_index(archive_object); + + // Materialize the value object. + (void)materialize_object(value_object_index, dfs_stack, CHECK_NULL); + + // Allocate and link the string. + heap_object = allocate_object(archive_object, mark, size, CHECK_NULL); + copy_object_eager_linking(archive_object, heap_object, size); + + assert(java_lang_String::value(heap_object) == heap_object_for_object_index(value_object_index), "Linker should have linked this correctly"); + + // Replace the string with interned string + heap_object = StringTable::intern(heap_object, CHECK_NULL); + } else { + heap_object = allocate_object(archive_object, mark, size, CHECK_NULL); + + // Fill in object contents + copy_object_lazy_linking(object_index, archive_object, heap_object, size, dfs_stack); + } + + // Install forwarding + set_heap_object_for_object_index(object_index, heap_object); + + return heap_object; +} + +oop AOTStreamedHeapLoader::TracingObjectLoader::materialize_object(int object_index, Stack& dfs_stack, TRAPS) { + if (object_index <= _previous_batch_last_object_index) { + // The transitive closure of this object has been materialized; no need to do anything + return heap_object_for_object_index(object_index); + } + + if (object_index <= _current_batch_last_object_index) { + // The AOTThread is currently materializing this object and its transitive closure; only need to wait for it to complete + _waiting_for_iterator = true; + while (object_index > _previous_batch_last_object_index) { + wait_for_iterator(); + } + _waiting_for_iterator = false; + + // Notify the AOT thread if it is waiting for tracing to finish + AOTHeapLoading_lock->notify_all(); + return heap_object_for_object_index(object_index);; + } + + oop heap_object = heap_object_for_object_index(object_index); + if (heap_object != nullptr) { + // Already materialized by mutator + return heap_object; + } + + return materialize_object_inner(object_index, dfs_stack, THREAD); +} + +void AOTStreamedHeapLoader::TracingObjectLoader::drain_stack(Stack& dfs_stack, TRAPS) { + while (!dfs_stack.is_empty()) { + AOTHeapTraversalEntry entry = dfs_stack.pop(); + int pointee_object_index = entry._pointee_object_index; + oop pointee_heap_object = materialize_object(pointee_object_index, dfs_stack, CHECK); + oop heap_object = heap_object_for_object_index(entry._base_object_index); + if (_allow_gc) { + heap_object->obj_field_put(entry._heap_field_offset_bytes, pointee_heap_object); + } else { + heap_object->obj_field_put_access(entry._heap_field_offset_bytes, pointee_heap_object); + } + } +} + +oop AOTStreamedHeapLoader::TracingObjectLoader::materialize_object_transitive(int object_index, Stack& dfs_stack, TRAPS) { + assert_locked_or_safepoint(AOTHeapLoading_lock); + while (_waiting_for_iterator) { + wait_for_iterator(); + } + + auto handlized_materialize_object = [&](TRAPS) { + oop obj = materialize_object(object_index, dfs_stack, CHECK_(Handle())); + return Handle(THREAD, obj); + }; + + Handle result = handlized_materialize_object(CHECK_NULL); + drain_stack(dfs_stack, CHECK_NULL); + + return result(); +} + +oop AOTStreamedHeapLoader::TracingObjectLoader::materialize_root(int root_index, Stack& dfs_stack, TRAPS) { + int root_object_index = object_index_for_root_index(root_index); + oop root = materialize_object_transitive(root_object_index, dfs_stack, CHECK_NULL); + install_root(root_index, root); + + return root; +} + +int oop_handle_cmp(const void* left, const void* right) { + oop* left_handle = *(oop**)left; + oop* right_handle = *(oop**)right; + + if (right_handle > left_handle) { + return -1; + } else if (left_handle > right_handle) { + return 1; + } + + return 0; +} + +// The range is inclusive +void AOTStreamedHeapLoader::IterativeObjectLoader::initialize_range(int first_object_index, int last_object_index, TRAPS) { + for (int i = first_object_index; i <= last_object_index; ++i) { + oopDesc* archive_object = archive_object_for_object_index(i); + markWord mark = archive_object->mark(); + bool string_intern = mark.is_marked(); + if (string_intern) { + int value_object_index = archived_string_value_object_index(archive_object); + if (value_object_index == i + 1) { + // Interned strings are eagerly materialized in the allocation phase, so there is + // nothing else to do for interned strings here for the string nor its value array. + i++; + } + continue; + } + size_t size = archive_object_size(archive_object); + oop heap_object = heap_object_for_object_index(i); + copy_object_eager_linking(archive_object, heap_object, size); + } +} + +// The range is inclusive +size_t AOTStreamedHeapLoader::IterativeObjectLoader::materialize_range(int first_object_index, int last_object_index, TRAPS) { + GrowableArrayCHeap lazy_object_indices(0); + size_t materialized_words = 0; + + for (int i = first_object_index; i <= last_object_index; ++i) { + oopDesc* archive_object = archive_object_for_object_index(i); + markWord mark = archive_object->mark(); + + // The markWord is marked if the object is a String and it should be interned, + // make sure to unmark it before allocating memory for the object. + bool string_intern = mark.is_marked(); + mark = mark.set_unmarked(); + + size_t size = archive_object_size(archive_object); + materialized_words += size; + + oop heap_object = heap_object_for_object_index(i); + if (heap_object != nullptr) { + // Lazy loading has already initialized the object; we must not mutate it + lazy_object_indices.append(i); + continue; + } + + if (!string_intern) { + // The normal case; no lazy loading have loaded the object yet + heap_object = allocate_object(archive_object, mark, size, CHECK_0); + set_heap_object_for_object_index(i, heap_object); + continue; + } + + // Eagerly materialize interned strings to ensure that objects earlier than the string + // in a batch get linked to the intended interned string, and not a copy. + int value_object_index = archived_string_value_object_index(archive_object); + + bool is_normal_interned_string = value_object_index == i + 1; + + if (value_object_index < first_object_index) { + // If materialized in a previous batch, the value should already be allocated and initialized. + assert(heap_object_for_object_index(value_object_index) != nullptr, "should be materialized"); + } else { + // Materialize the value object. + oopDesc* archive_value_object = archive_object_for_object_index(value_object_index); + markWord value_mark = archive_value_object->mark(); + size_t value_size = archive_object_size(archive_value_object); + oop value_heap_object; + + if (is_normal_interned_string) { + // The common case: the value is next to the string. This happens when only the interned + // string points to its value character array. + assert(value_object_index <= last_object_index, "Must be within this batch: %d <= %d", value_object_index, last_object_index); + value_heap_object = allocate_object(archive_value_object, value_mark, value_size, CHECK_0); + set_heap_object_for_object_index(value_object_index, value_heap_object); + materialized_words += value_size; + } else { + // In the uncommon case, multiple strings point to the value of an interned string. + // The string can then be earlier in the batch. + assert(value_object_index < i, "surprising index"); + value_heap_object = heap_object_for_object_index(value_object_index); + } + + copy_object_eager_linking(archive_value_object, value_heap_object, value_size); + } + // Allocate and link the string. + heap_object = allocate_object(archive_object, mark, size, CHECK_0); + copy_object_eager_linking(archive_object, heap_object, size); + + assert(java_lang_String::value(heap_object) == heap_object_for_object_index(value_object_index), "Linker should have linked this correctly"); + + // Replace the string with interned string + heap_object = StringTable::intern(heap_object, CHECK_0); + set_heap_object_for_object_index(i, heap_object); + + if (is_normal_interned_string) { + // Skip over the string value, already materialized + i++; + } + } + + if (lazy_object_indices.is_empty()) { + // Normal case; no sprinkled lazy objects in the root subgraph + initialize_range(first_object_index, last_object_index, CHECK_0); + } else { + // The user lazy initialized some objects that are already initialized; we have to initialize around them + // to make sure they are not mutated. + int previous_object_index = first_object_index - 1; // Exclusive start of initialization slice + for (int i = 0; i < lazy_object_indices.length(); ++i) { + int lazy_object_index = lazy_object_indices.at(i); + int slice_start_object_index = previous_object_index; + int slice_end_object_index = lazy_object_index; + + if (slice_end_object_index - slice_start_object_index > 1) { // Both markers are exclusive + initialize_range(slice_start_object_index + 1, slice_end_object_index - 1, CHECK_0); + } + previous_object_index = lazy_object_index; + } + // Process tail range + if (last_object_index - previous_object_index > 0) { + initialize_range(previous_object_index + 1, last_object_index, CHECK_0); + } + } + + return materialized_words; +} + +bool AOTStreamedHeapLoader::IterativeObjectLoader::has_more() { + return _current_root_index < _num_roots; +} + +void AOTStreamedHeapLoader::IterativeObjectLoader::materialize_next_batch(TRAPS) { + assert(has_more(), "only materialize if there is something to materialize"); + + int min_batch_objects = 128; + int from_root_index = _current_root_index; + int max_to_root_index = _num_roots - 1; + int until_root_index = from_root_index; + int highest_object_index; + + // Expand the batch size from one root, to N roots until we cross 128 objects in total + for (;;) { + highest_object_index = highest_object_index_for_root_index(until_root_index); + if (highest_object_index - _previous_batch_last_object_index >= min_batch_objects) { + break; + } + if (until_root_index == max_to_root_index) { + break; + } + until_root_index++; + } + + oop root = nullptr; + + // Materialize objects of necessary, representing the transitive closure of the root + if (highest_object_index > _previous_batch_last_object_index) { + while (_swapping_root_format) { + // When the roots are being upgraded to use handles, it is not safe to racingly + // iterate over the object; we must wait. Setting the current batch last object index + // to something other than the previous batch last object index indicates to the + // root swapping that there is current iteration ongoing. + AOTHeapLoading_lock->wait(); + } + int first_object_index = _previous_batch_last_object_index + 1; + _current_batch_last_object_index = highest_object_index; + size_t allocated_words; + { + MutexUnlocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + allocated_words = materialize_range(first_object_index, highest_object_index, CHECK); + } + _allocated_words += allocated_words; + _previous_batch_last_object_index = _current_batch_last_object_index; + if (_waiting_for_iterator) { + // If tracer is waiting, let it know at the next point of unlocking that the root + // set it waited for has been processed now. + AOTHeapLoading_lock->notify_all(); + } + } + + // Install the root + for (int i = from_root_index; i <= until_root_index; ++i) { + int root_object_index = object_index_for_root_index(i); + root = heap_object_for_object_index(root_object_index); + install_root(i, root); + ++_current_root_index; + } +} + +bool AOTStreamedHeapLoader::materialize_early(TRAPS) { + Ticks start = Ticks::now(); + + // Only help with early materialization from the AOT thread if the heap archive can be allocated + // without the need for a GC. Otherwise, do lazy loading until GC is enabled later in the bootstrapping. + size_t bootstrap_max_memory = Universe::heap()->bootstrap_max_memory(); + size_t bootstrap_min_memory = MAX2(_heap_region_used, 2 * M); + + size_t before_gc_materialize_budget_bytes = (bootstrap_max_memory > bootstrap_min_memory) ? bootstrap_max_memory - bootstrap_min_memory : 0; + size_t before_gc_materialize_budget_words = before_gc_materialize_budget_bytes / HeapWordSize; + + log_info(aot, heap)("Max bootstrapping memory: %zuM, min bootstrapping memory: %zuM, selected budget: %zuM", + bootstrap_max_memory / M, bootstrap_min_memory / M, before_gc_materialize_budget_bytes / M); + + while (IterativeObjectLoader::has_more()) { + if (_allow_gc || _allocated_words > before_gc_materialize_budget_words) { + log_info(aot, heap)("Early object materialization interrupted at root %d", _current_root_index); + break; + } + + IterativeObjectLoader::materialize_next_batch(CHECK_false); + } + + _early_materialization_time_ns = (Ticks::now() - start).nanoseconds(); + + bool finished_before_gc_allowed = !_allow_gc && !IterativeObjectLoader::has_more(); + + return finished_before_gc_allowed; +} + +void AOTStreamedHeapLoader::materialize_late(TRAPS) { + Ticks start = Ticks::now(); + + // Continue materializing with GC allowed + + while (IterativeObjectLoader::has_more()) { + IterativeObjectLoader::materialize_next_batch(CHECK); + } + + _late_materialization_time_ns = (Ticks::now() - start).nanoseconds(); +} + +void AOTStreamedHeapLoader::cleanup() { + // First ensure there is no concurrent tracing going on + while (_waiting_for_iterator) { + AOTHeapLoading_lock->wait(); + } + + Ticks start = Ticks::now(); + + // Remove OopStorage roots + if (_objects_are_handles) { + size_t num_handles = _num_archived_objects; + // Skip the null entry + oop** handles = ((oop**)_object_index_to_heap_object_table) + 1; + // Sort the handles so that oop storage can release them faster + qsort(handles, num_handles, sizeof(oop*), (int (*)(const void*, const void*))oop_handle_cmp); + size_t num_null_handles = 0; + for (size_t handles_remaining = num_handles; handles_remaining != 0; --handles_remaining) { + oop* handle = handles[handles_remaining - 1]; + if (handle == nullptr) { + num_null_handles = handles_remaining; + break; + } + NativeAccess<>::oop_store(handle, nullptr); + } + Universe::vm_global()->release(&handles[num_null_handles], num_handles - num_null_handles); + } + + FREE_C_HEAP_ARRAY(void*, _object_index_to_heap_object_table); + + // Unmap regions + FileMapInfo::current_info()->unmap_region(AOTMetaspace::hp); + FileMapInfo::current_info()->unmap_region(AOTMetaspace::bm); + + _cleanup_materialization_time_ns = (Ticks::now() - start).nanoseconds(); + + log_statistics(); +} + +void AOTStreamedHeapLoader::log_statistics() { + uint64_t total_duration_us = (Ticks::now() - _materialization_start_ticks).microseconds(); + const bool is_async = _loading_all_objects && !AOTEagerlyLoadObjects; + const char* const async_or_sync = is_async ? "async" : "sync"; + log_info(aot, heap)("start to finish materialization time: " UINT64_FORMAT "us", + total_duration_us); + log_info(aot, heap)("early object materialization time (%s): " UINT64_FORMAT "us", + async_or_sync, _early_materialization_time_ns / 1000); + log_info(aot, heap)("late object materialization time (%s): " UINT64_FORMAT "us", + async_or_sync, _late_materialization_time_ns / 1000); + log_info(aot, heap)("object materialization cleanup time (%s): " UINT64_FORMAT "us", + async_or_sync, _cleanup_materialization_time_ns / 1000); + log_info(aot, heap)("final object materialization time stall (sync): " UINT64_FORMAT "us", + _final_materialization_time_ns / 1000); + log_info(aot, heap)("bootstrapping lazy materialization time (sync): " UINT64_FORMAT "us", + _accumulated_lazy_materialization_time_ns / 1000); + + uint64_t sync_time = _final_materialization_time_ns + _accumulated_lazy_materialization_time_ns; + uint64_t async_time = _early_materialization_time_ns + _late_materialization_time_ns + _cleanup_materialization_time_ns; + + if (!is_async) { + sync_time += async_time; + async_time = 0; + } + + log_info(aot, heap)("sync materialization time: " UINT64_FORMAT "us", + sync_time / 1000); + + log_info(aot, heap)("async materialization time: " UINT64_FORMAT "us", + async_time / 1000); + + uint64_t iterative_time = (uint64_t)(is_async ? async_time : sync_time); + uint64_t materialized_bytes = _allocated_words * HeapWordSize; + log_info(aot, heap)("%s materialized " UINT64_FORMAT "K (" UINT64_FORMAT "M/s)", async_or_sync, + materialized_bytes / 1024, uint64_t(materialized_bytes * UCONST64(1'000'000'000) / M / iterative_time)); +} + +void AOTStreamedHeapLoader::materialize_objects() { + // We cannot handle any exception when materializing roots. Exits the VM. + EXCEPTION_MARK + + // Objects are laid out in DFS order; DFS traverse the roots by linearly walking all objects + HandleMark hm(THREAD); + + // Early materialization with a budget before GC is allowed + MutexLocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + + materialize_early(CHECK); + await_gc_enabled(); + materialize_late(CHECK); + // Notify materialization is done + AOTHeapLoading_lock->notify_all(); + cleanup(); +} + +void AOTStreamedHeapLoader::switch_object_index_to_handle(int object_index) { + oop heap_object = cast_to_oop(_object_index_to_heap_object_table[object_index]); + if (heap_object == nullptr) { + return; + } + + oop* handle = Universe::vm_global()->allocate(); + NativeAccess<>::oop_store(handle, heap_object); + _object_index_to_heap_object_table[object_index] = handle; +} + +void AOTStreamedHeapLoader::enable_gc() { + if (AOTEagerlyLoadObjects && !IterativeObjectLoader::has_more()) { + // Everything was loaded eagerly at early startup + return; + } + + // We cannot handle any exception when materializing roots. Exits the VM. + EXCEPTION_MARK + + MutexLocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + + // First wait until no tracing is active + while (_waiting_for_iterator) { + AOTHeapLoading_lock->wait(); + } + + // Lock further tracing from starting + _waiting_for_iterator = true; + + // Record iterator progress + int num_handles = (int)_num_archived_objects; + + // Lock further iteration from starting + _swapping_root_format = true; + + // Then wait for the iterator to stop + while (_previous_batch_last_object_index != _current_batch_last_object_index) { + AOTHeapLoading_lock->wait(); + } + + if (IterativeObjectLoader::has_more()) { + // If there is more to be materialized, we have to upgrade the object index + // to object mapping to use handles. If there isn't more to materialize, the + // handle will no longer e used; they are only used to materialize objects. + + for (int i = 1; i <= num_handles; ++i) { + // Upgrade the roots to use handles + switch_object_index_to_handle(i); + } + + // From now on, accessing the object table must be done through a handle. + _objects_are_handles = true; + } + + // Unlock tracing + _waiting_for_iterator = false; + + // Unlock iteration + _swapping_root_format = false; + + _allow_gc = true; + + AOTHeapLoading_lock->notify_all(); + + if (AOTEagerlyLoadObjects && IterativeObjectLoader::has_more()) { + materialize_late(CHECK); + cleanup(); + } +} + +void AOTStreamedHeapLoader::materialize_thread_object() { + AOTThread::materialize_thread_object(); +} + +void AOTStreamedHeapLoader::finish_materialize_objects() { + Ticks start = Ticks::now(); + + if (_loading_all_objects) { + MutexLocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + // Wait for the AOT thread to finish + while (IterativeObjectLoader::has_more()) { + AOTHeapLoading_lock->wait(); + } + } else { + assert(!AOTEagerlyLoadObjects, "sanity"); + assert(_current_root_index == 0, "sanity"); + // Without the full module graph we have done only lazy tracing materialization. + // Ensure all roots are processed here by triggering root loading on every root. + for (int i = 0; i < _num_roots; ++i) { + get_root(i); + } + cleanup(); + } + + _final_materialization_time_ns = (Ticks::now() - start).nanoseconds(); +} + +void account_lazy_materialization_time_ns(uint64_t time, const char* description, int index) { + AtomicAccess::add(&_accumulated_lazy_materialization_time_ns, time); + log_debug(aot, heap)("Lazy materialization of %s: %d end (" UINT64_FORMAT " us of " UINT64_FORMAT " us)", description, index, time / 1000, _accumulated_lazy_materialization_time_ns / 1000); +} + +// Initialize an empty array of AOT heap roots; materialize them lazily +void AOTStreamedHeapLoader::initialize() { + EXCEPTION_MARK + + _materialization_start_ticks = Ticks::now(); + + FileMapInfo::current_info()->map_bitmap_region(); + + _heap_region = FileMapInfo::current_info()->region_at(AOTMetaspace::hp); + _bitmap_region = FileMapInfo::current_info()->region_at(AOTMetaspace::bm); + + assert(_heap_region->used() > 0, "empty heap archive?"); + + _is_in_use = true; + + // archived roots are at this offset in the stream. + size_t roots_offset = FileMapInfo::current_info()->streamed_heap()->roots_offset(); + size_t forwarding_offset = FileMapInfo::current_info()->streamed_heap()->forwarding_offset(); + size_t root_highest_object_index_table_offset = FileMapInfo::current_info()->streamed_heap()->root_highest_object_index_table_offset(); + _num_archived_objects = FileMapInfo::current_info()->streamed_heap()->num_archived_objects(); + + // The first int is the length of the array + _roots_archive = ((int*)(((address)_heap_region->mapped_base()) + roots_offset)) + 1; + _num_roots = _roots_archive[-1]; + _heap_region_used = _heap_region->used(); + + // We can't retire a TLAB until the filler klass is set; set it to the archived object klass. + CollectedHeap::set_filler_object_klass(vmClasses::Object_klass()); + + objArrayOop roots = oopFactory::new_objectArray(_num_roots, CHECK); + _roots = OopHandle(Universe::vm_global(), roots); + + _object_index_to_buffer_offset_table = (size_t*)(((address)_heap_region->mapped_base()) + forwarding_offset); + // We allocate the first entry for "null" + _object_index_to_heap_object_table = NEW_C_HEAP_ARRAY(void*, _num_archived_objects + 1, mtClassShared); + Copy::zero_to_bytes(_object_index_to_heap_object_table, (_num_archived_objects + 1) * sizeof(void*)); + + _root_highest_object_index_table = (int*)(((address)_heap_region->mapped_base()) + root_highest_object_index_table_offset); + + address start = (address)(_bitmap_region->mapped_base()) + _heap_region->oopmap_offset(); + _oopmap = BitMapView((BitMap::bm_word_t*)start, _heap_region->oopmap_size_in_bits()); + + + if (FLAG_IS_DEFAULT(AOTEagerlyLoadObjects)) { + // Concurrency will not help much if there are no extra cores available. + FLAG_SET_ERGO(AOTEagerlyLoadObjects, os::initial_active_processor_count() <= 1); + } + + // If the full module graph is not available or the JVMTI class file load hook is on, we + // will prune the object graph to not include cached objects in subgraphs that are not intended + // to be loaded. + _loading_all_objects = CDSConfig::is_using_full_module_graph() && !JvmtiExport::should_post_class_file_load_hook(); + if (!_loading_all_objects) { + // When not using FMG, fall back to tracing materialization + FLAG_SET_ERGO(AOTEagerlyLoadObjects, false); + return; + } + + if (AOTEagerlyLoadObjects) { + // Objects are laid out in DFS order; DFS traverse the roots by linearly walking all objects + HandleMark hm(THREAD); + + // Early materialization with a budget before GC is allowed + MutexLocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + + bool finished_before_gc_allowed = materialize_early(CHECK); + if (finished_before_gc_allowed) { + cleanup(); + } + } else { + AOTThread::initialize(); + } +} + +oop AOTStreamedHeapLoader::materialize_root(int root_index) { + Ticks start = Ticks::now(); + // We cannot handle any exception when materializing a root. Exits the VM. + EXCEPTION_MARK + Stack dfs_stack; + HandleMark hm(THREAD); + + oop result; + { + MutexLocker ml(AOTHeapLoading_lock, Mutex::_safepoint_check_flag); + + oop root = objArrayOop(_roots.resolve())->obj_at(root_index); + + if (root != nullptr) { + // The root has already been materialized + result = root; + } else { + // The root has not been materialized, start tracing materialization + result = TracingObjectLoader::materialize_root(root_index, dfs_stack, CHECK_NULL); + } + } + + uint64_t duration = (Ticks::now() - start).nanoseconds(); + + account_lazy_materialization_time_ns(duration, "root", root_index); + + return result; +} + +oop AOTStreamedHeapLoader::get_root(int index) { + oop result = objArrayOop(_roots.resolve())->obj_at(index); + if (result == nullptr) { + // Materialize root + result = materialize_root(index); + } + if (result == _roots.resolve()) { + // A self-reference to the roots array acts as a sentinel object for null, + // indicating that the root has been cleared. + result = nullptr; + } + // Acquire the root transitive object payload + OrderAccess::acquire(); + return result; +} + +void AOTStreamedHeapLoader::clear_root(int index) { + // Self-reference to the roots array acts as a sentinel object for null, + // indicating that the root has been cleared. + objArrayOop(_roots.resolve())->obj_at_put(index, _roots.resolve()); +} + +void AOTStreamedHeapLoader::await_gc_enabled() { + while (!_allow_gc) { + AOTHeapLoading_lock->wait(); + } +} + +void AOTStreamedHeapLoader::finish_initialization(FileMapInfo* static_mapinfo) { + static_mapinfo->stream_heap_region(); +} + +AOTMapLogger::OopDataIterator* AOTStreamedHeapLoader::oop_iterator(FileMapInfo* info, address buffer_start, address buffer_end) { + class StreamedLoaderOopIterator : public AOTMapLogger::OopDataIterator { + private: + int _current; + int _next; + + address _buffer_start; + + int _num_archived_objects; + + public: + StreamedLoaderOopIterator(address buffer_start, + int num_archived_objects) + : _current(0), + _next(1), + _buffer_start(buffer_start), + _num_archived_objects(num_archived_objects) { + } + + AOTMapLogger::OopData capture(int dfs_index) { + size_t buffered_offset = buffer_offset_for_object_index(dfs_index); + address buffered_addr = _buffer_start + buffered_offset; + oopDesc* raw_oop = (oopDesc*)buffered_addr; + size_t size = archive_object_size(raw_oop); + + intptr_t target_location = (intptr_t)buffered_offset; + uint32_t narrow_location = checked_cast(dfs_index); + Klass* klass = raw_oop->klass(); + + address requested_addr = (address)buffered_offset; + + return { buffered_addr, + requested_addr, + target_location, + narrow_location, + raw_oop, + klass, + size, + false }; + } + + bool has_next() override { + return _next <= _num_archived_objects; + } + + AOTMapLogger::OopData next() override { + _current = _next; + AOTMapLogger::OopData result = capture(_current); + _next = _current + 1; + return result; + } + + AOTMapLogger::OopData obj_at(narrowOop* addr) override { + int dfs_index = (int)(*addr); + if (dfs_index == 0) { + return null_data(); + } else { + return capture(dfs_index); + } + } + + AOTMapLogger::OopData obj_at(oop* addr) override { + int dfs_index = (int)cast_from_oop(*addr); + if (dfs_index == 0) { + return null_data(); + } else { + return capture(dfs_index); + } + } + + GrowableArrayCHeap* roots() override { + GrowableArrayCHeap* result = new GrowableArrayCHeap(); + + for (int i = 0; i < _num_roots; ++i) { + int object_index = object_index_for_root_index(i); + result->append(capture(object_index)); + } + + return result; + } + }; + + assert(_is_in_use, "printing before initializing?"); + + return new StreamedLoaderOopIterator(buffer_start, (int)info->streamed_heap()->num_archived_objects()); +} + +#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/aotStreamedHeapLoader.hpp b/src/hotspot/share/cds/aotStreamedHeapLoader.hpp new file mode 100644 index 00000000000..d436af35dd0 --- /dev/null +++ b/src/hotspot/share/cds/aotStreamedHeapLoader.hpp @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2018, 2024, 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_AOTSTREAMEDHEAPLOADER_HPP +#define SHARE_CDS_AOTSTREAMEDHEAPLOADER_HPP + +#include "cds/aotMapLogger.hpp" +#include "cds/filemap.hpp" +#include "memory/allocation.hpp" +#include "memory/allStatic.hpp" +#include "oops/oopsHierarchy.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/macros.hpp" +#include "utilities/stack.hpp" + +#if INCLUDE_CDS_JAVA_HEAP + +// The streaming archive heap loader loads Java objects using normal allocations. It requires the objects +// to be ordered in DFS order already at dump time, given the set of roots into the archived heap. +// Since the objects are ordered in DFS order, that means that walking them linearly through the archive +// is equivalent to performing a DFS traversal, but without pushing and popping anything. +// +// The advantage of this pre-ordering, other than the obvious locality improvement, is that we can have +// a separate thread, the AOTThread, perform this walk, in a way that allows us to split the archived +// heap into three separate zones. The first zone contains objects that have been transitively materialized, +// the second zone contains objects that are currently being materialized, and the last zone contains +// objects that have not and are not about to be touched by the AOT thread. +// Whenever a new root is traversed by the AOT thread, the zones are shifted atomically under a lock. +// +// Visualization of the three zones: +// +// +--------------------------------------+-------------------------+----------------------------------+ +// | transitively materialized | currently materializing | not yet materialized | +// +--------------------------------------+-------------------------+----------------------------------+ +// +// Being able to split the memory into these three zones, allows the bootstrapping thread and potential +// other threads to be able to, under a lock, traverse a root, and know how to coordinate with the +// concurrent AOT thread. Whenever the traversal finds an object in the "transitively materialized" +// zone, then we know such objects don't need any processing at all. As for "currently materializing", +// we know that if we just stay out of the way and let the AOT thread finish its current root, then +// the transitive closure of such objects will be materialized. And the AOT thread can materialize faster +// then the rest as it doesn't need to perform any traversal. Finally, as for objects in the "not yet +// materialized" zone, we know that we can trace through it without stepping on the feed of the AOT thread +// which has published it won't be tracing anything in there. +// +// What we get from this, is fast iterative traversal from the AOT thread (IterativeObjectLoader) +// while allowing lazyness and concurrency with the rest of the program (TracingObjectLoader). +// This way the AOT thread can remove the bulk of the work of materializing the Java objects from +// the critical bootstrapping thread. +// +// When we start materializing objects, we have not yet come to the point in the bootstrapping where +// GC is allowed. This is a two edged sword. On the one hand side, we can materialize objects faster +// when we know there is no GC to coordinate with, but on the other hand side, if we need to perform +// a GC when allocating memory for archived objects, we will bring down the entire JVM. To deal with this, +// the AOT thread asks the GC for a budget of bytes it is allowed to allocate before GC is allowed. +// When we get to the point in the bootstrapping where GC is allowed, we resume materializing objects +// that didn't fit in the budget. Before we let the application run, we force materialization of any +// remaining objects that have not been materialized by the AOT thread yet, so that we don't get +// surprising OOMs due to object materialization while the program is running. +// +// The object format of the archived heap is similar to a normal object. However, references are encoded +// as DFS indices, which in the end map to what index the object is in the buffer, as they are laid out +// in DFS order. The DFS indices start at 1 for the first object, and hence the number 0 represents +// null. The DFS index of objects is a core identifier of objects in this approach. From this index +// it is possible to find out what offset the archived object has into the buffer, as well as finding +// mappings to Java heap objects that have been materialized. +// +// The table mapping DFS indices to Java heap objects is filled in when an object is allocated. +// Materializing objects involves allocating the object, initializing it, and linking it with other +// objects. Since linking the object requires whatever is being referenced to be at least allocated, +// the iterative traversal will first allocate all of the objects in its zone being worked on, and then +// perform initialization and linking in a second pass. What these passes have in common is that they +// are trivially parallelizable, should we ever need to do that. The tracing materialization links +// objects when going "back" in the DFS traversal. +// +// The forwarding information for the mechanism contains raw oops before GC is allowed, and as we +// enable GC in the bootstrapping, all raw oops are handleified using OopStorage. All handles are +// handed back from the AOT thread when materialization has finished. The switch from raw oops to +// using OopStorage handles, happens under a lock while no iteration nor tracing is allowed. +// +// The initialization code is also performed in a faster way when the GC is not allowed. In particular, +// before GC is allowed, we perform raw memcpy of the archived object into the Java heap. Then the +// object is initialized with IS_DEST_UNINITIALIZED stores. The assumption made here is that before +// any GC activity is allowed, we shouldn't have to worry about concurrent GC threads scanning the +// memory and getting tripped up by that. Once GC is enabled, we revert to a bit more careful approach +// that uses a pre-computed bitmap to find the holes where oops go, and carefully copy only the +// non-oop information with memcpy, while the oops are set separately with HeapAccess stores that +// should be able to cope well with concurrent activity. +// +// The marked bit pattern of the mark word of archived heap objects is used for signalling which string +// objects should be interned. From the dump, some referenced strings were interned. This is +// really an identity property. We don't need to dump the entire string table as a way of communicating +// this identity property. Instead we intern strings on-the-fly, exploiting the dynamic object +// level linking that this approach has chosen to our advantage. + +class FileMapInfo; +class OopStorage; +class Thread; +struct AOTHeapTraversalEntry; + +struct alignas(AOTHeapTraversalEntry* /* Requirement of Stack */) AOTHeapTraversalEntry { + int _pointee_object_index; + int _base_object_index; + int _heap_field_offset_bytes; +}; + +class AOTStreamedHeapLoader { + friend class InflateReferenceOopClosure; +private: + static FileMapRegion* _heap_region; + static FileMapRegion* _bitmap_region; + static OopStorage* _oop_storage; + static int* _roots_archive; + static OopHandle _roots; + static BitMapView _oopmap; + static bool _is_in_use; + static bool _allow_gc; + static bool _objects_are_handles; + static int _previous_batch_last_object_index; + static int _current_batch_last_object_index; + static size_t _allocated_words; + static int _current_root_index; + static size_t _num_archived_objects; + static int _num_roots; + static size_t _heap_region_used; + static bool _loading_all_objects; + + static size_t* _object_index_to_buffer_offset_table; + static void** _object_index_to_heap_object_table; + static int* _root_highest_object_index_table; + + static bool _waiting_for_iterator; + static bool _swapping_root_format; + + + template + class InPlaceLinkingOopClosure; + + static oop allocate_object(oopDesc* archive_object, markWord mark, size_t size, TRAPS); + static int object_index_for_root_index(int root_index); + static int highest_object_index_for_root_index(int root_index); + static size_t buffer_offset_for_object_index(int object_index); + static oopDesc* archive_object_for_object_index(int object_index); + static size_t buffer_offset_for_archive_object(oopDesc* archive_object); + template + static BitMap::idx_t obj_bit_idx_for_buffer_offset(size_t buffer_offset); + + template + static void copy_payload_carefully(oopDesc* archive_object, + oop heap_object, + BitMap::idx_t header_bit, + BitMap::idx_t start_bit, + BitMap::idx_t end_bit, + LinkerT linker); + + template + static void copy_object_impl(oopDesc* archive_object, + oop heap_object, + size_t size, + LinkerT linker); + + static void copy_object_eager_linking(oopDesc* archive_object, oop heap_object, size_t size); + + static void switch_object_index_to_handle(int object_index); + static oop heap_object_for_object_index(int object_index); + static void set_heap_object_for_object_index(int object_index, oop heap_object); + + static int archived_string_value_object_index(oopDesc* archive_object); + + static bool materialize_early(TRAPS); + static void materialize_late(TRAPS); + static void cleanup(); + static void log_statistics(); + + class TracingObjectLoader { + static oop materialize_object(int object_index, Stack& dfs_stack, TRAPS); + static oop materialize_object_inner(int object_index, Stack& dfs_stack, TRAPS); + static void copy_object_lazy_linking(int object_index, + oopDesc* archive_object, + oop heap_object, + size_t size, + Stack& dfs_stack); + static void drain_stack(Stack& dfs_stack, TRAPS); + static oop materialize_object_transitive(int object_index, Stack& dfs_stack, TRAPS); + + static void wait_for_iterator(); + + public: + static oop materialize_root(int root_index, Stack& dfs_stack, TRAPS); + }; + + class IterativeObjectLoader { + static void initialize_range(int first_object_index, int last_object_index, TRAPS); + static size_t materialize_range(int first_object_index, int last_object_index, TRAPS); + + public: + static bool has_more(); + static void materialize_next_batch(TRAPS); + }; + + static void install_root(int root_index, oop heap_object); + + static void await_gc_enabled(); + static void await_finished_processing(); + +public: + static void initialize(); + static void enable_gc(); + static void materialize_thread_object(); + static oop materialize_root(int root_index); + static oop get_root(int root_index); + static void clear_root(int index); + static void materialize_objects(); + static void finish_materialize_objects(); + static bool is_in_use() { return _is_in_use; } + static void finish_initialization(FileMapInfo* info); + + static AOTMapLogger::OopDataIterator* oop_iterator(FileMapInfo* info, address buffer_start, address buffer_end); +}; + +#endif // SHARE_CDS_AOTSTREAMEDHEAPLOADER_HPP +#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/aotStreamedHeapWriter.cpp b/src/hotspot/share/cds/aotStreamedHeapWriter.cpp new file mode 100644 index 00000000000..16acebc7d8d --- /dev/null +++ b/src/hotspot/share/cds/aotStreamedHeapWriter.cpp @@ -0,0 +1,614 @@ +/* + * 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. + * + * 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. + * + */ + +#include "cds/aotReferenceObjSupport.hpp" +#include "cds/aotStreamedHeapWriter.hpp" +#include "cds/cdsConfig.hpp" +#include "cds/filemap.hpp" +#include "cds/heapShared.inline.hpp" +#include "cds/regeneratedClasses.hpp" +#include "classfile/modules.hpp" +#include "classfile/stringTable.hpp" +#include "classfile/systemDictionary.hpp" +#include "gc/shared/collectedHeap.hpp" +#include "memory/iterator.inline.hpp" +#include "memory/oopFactory.hpp" +#include "memory/universe.hpp" +#include "oops/compressedOops.hpp" +#include "oops/objArrayOop.inline.hpp" +#include "oops/oop.inline.hpp" +#include "oops/oopHandle.inline.hpp" +#include "oops/typeArrayKlass.hpp" +#include "oops/typeArrayOop.hpp" +#include "runtime/java.hpp" +#include "runtime/mutexLocker.hpp" +#include "utilities/bitMap.inline.hpp" +#include "utilities/stack.inline.hpp" + +#if INCLUDE_CDS_JAVA_HEAP + +GrowableArrayCHeap* AOTStreamedHeapWriter::_buffer = nullptr; + +// The following are offsets from buffer_bottom() +size_t AOTStreamedHeapWriter::_buffer_used; +size_t AOTStreamedHeapWriter::_roots_offset; +size_t AOTStreamedHeapWriter::_forwarding_offset; +size_t AOTStreamedHeapWriter::_root_highest_object_index_table_offset; + +GrowableArrayCHeap* AOTStreamedHeapWriter::_source_objs; + +AOTStreamedHeapWriter::BufferOffsetToSourceObjectTable* AOTStreamedHeapWriter::_buffer_offset_to_source_obj_table; +AOTStreamedHeapWriter::SourceObjectToDFSOrderTable* AOTStreamedHeapWriter::_dfs_order_table; + +int* AOTStreamedHeapWriter::_roots_highest_dfs; +size_t* AOTStreamedHeapWriter::_dfs_to_archive_object_table; + +static const int max_table_capacity = 0x3fffffff; + +void AOTStreamedHeapWriter::init() { + if (CDSConfig::is_dumping_heap()) { + _buffer_offset_to_source_obj_table = new (mtClassShared) BufferOffsetToSourceObjectTable(8, max_table_capacity); + + int initial_source_objs_capacity = 10000; + _source_objs = new GrowableArrayCHeap(initial_source_objs_capacity); + } +} + +void AOTStreamedHeapWriter::delete_tables_with_raw_oops() { + delete _source_objs; + _source_objs = nullptr; + + delete _dfs_order_table; + _dfs_order_table = nullptr; +} + +void AOTStreamedHeapWriter::add_source_obj(oop src_obj) { + _source_objs->append(src_obj); +} + +class FollowOopIterateClosure: public BasicOopIterateClosure { + Stack* _dfs_stack; + oop _src_obj; + bool _is_java_lang_ref; + +public: + FollowOopIterateClosure(Stack* dfs_stack, oop src_obj, bool is_java_lang_ref) : + _dfs_stack(dfs_stack), + _src_obj(src_obj), + _is_java_lang_ref(is_java_lang_ref) {} + + void do_oop(narrowOop *p) { do_oop_work(p); } + void do_oop( oop *p) { do_oop_work(p); } + +private: + template void do_oop_work(T *p) { + size_t field_offset = pointer_delta(p, _src_obj, sizeof(char)); + oop obj = HeapShared::maybe_remap_referent(_is_java_lang_ref, field_offset, HeapAccess<>::oop_load(p)); + if (obj != nullptr) { + _dfs_stack->push(obj); + } + } +}; + +int AOTStreamedHeapWriter::cmp_dfs_order(oop* o1, oop* o2) { + int* o1_dfs = _dfs_order_table->get(*o1); + int* o2_dfs = _dfs_order_table->get(*o2); + return *o1_dfs - *o2_dfs; +} + +void AOTStreamedHeapWriter::order_source_objs(GrowableArrayCHeap* roots) { + Stack dfs_stack; + _dfs_order_table = new (mtClassShared) SourceObjectToDFSOrderTable(8, max_table_capacity); + _roots_highest_dfs = NEW_C_HEAP_ARRAY(int, (size_t)roots->length(), mtClassShared); + _dfs_to_archive_object_table = NEW_C_HEAP_ARRAY(size_t, (size_t)_source_objs->length() + 1, mtClassShared); + + for (int i = 0; i < _source_objs->length(); ++i) { + oop obj = _source_objs->at(i); + _dfs_order_table->put(cast_from_oop(obj), -1); + _dfs_order_table->maybe_grow(); + } + + int dfs_order = 0; + + for (int i = 0; i < roots->length(); ++i) { + oop root = roots->at(i); + + if (root == nullptr) { + log_info(aot, heap)("null root at %d", i); + continue; + } + + dfs_stack.push(root); + + while (!dfs_stack.is_empty()) { + oop obj = dfs_stack.pop(); + assert(obj != nullptr, "null root"); + int* dfs_number = _dfs_order_table->get(cast_from_oop(obj)); + if (*dfs_number != -1) { + // Already visited in the traversal + continue; + } + _dfs_order_table->put(cast_from_oop(obj), ++dfs_order); + _dfs_order_table->maybe_grow(); + + FollowOopIterateClosure cl(&dfs_stack, obj, AOTReferenceObjSupport::check_if_ref_obj(obj)); + obj->oop_iterate(&cl); + } + + _roots_highest_dfs[i] = dfs_order; + } + + _source_objs->sort(cmp_dfs_order); +} + +void AOTStreamedHeapWriter::write(GrowableArrayCHeap* roots, + ArchiveStreamedHeapInfo* heap_info) { + assert(CDSConfig::is_dumping_heap(), "sanity"); + allocate_buffer(); + order_source_objs(roots); + copy_source_objs_to_buffer(roots); + map_embedded_oops(heap_info); + populate_archive_heap_info(heap_info); +} + +void AOTStreamedHeapWriter::allocate_buffer() { + int initial_buffer_size = 100000; + _buffer = new GrowableArrayCHeap(initial_buffer_size); + _buffer_used = 0; + ensure_buffer_space(1); // so that buffer_bottom() works +} + +void AOTStreamedHeapWriter::ensure_buffer_space(size_t min_bytes) { + // We usually have very small heaps. If we get a huge one it's probably caused by a bug. + guarantee(min_bytes <= max_jint, "we dont support archiving more than 2G of objects"); + _buffer->at_grow(to_array_index(min_bytes)); +} + +void AOTStreamedHeapWriter::copy_roots_to_buffer(GrowableArrayCHeap* roots) { + int length = roots->length(); + size_t byte_size = align_up(sizeof(int) + sizeof(int) * (size_t)length, (size_t)HeapWordSize); + + size_t new_used = _buffer_used + byte_size; + ensure_buffer_space(new_used); + + int* mem = offset_to_buffered_address(_buffer_used); + memset(mem, 0, byte_size); + *mem = length; + + for (int i = 0; i < length; i++) { + // Do not use arrayOop->obj_at_put(i, o) as arrayOop is outside of the real heap! + oop o = roots->at(i); + int dfs_index = o == nullptr ? 0 : *_dfs_order_table->get(cast_from_oop(o)); + mem[i + 1] = dfs_index; + } + log_info(aot, heap)("archived obj roots[%d] = %zu bytes, mem = %p", length, byte_size, mem); + + _roots_offset = _buffer_used; + _buffer_used = new_used; +} + +template +void AOTStreamedHeapWriter::write(T value) { + size_t new_used = _buffer_used + sizeof(T); + ensure_buffer_space(new_used); + T* mem = offset_to_buffered_address(_buffer_used); + *mem = value; + _buffer_used = new_used; +} + +void AOTStreamedHeapWriter::copy_forwarding_to_buffer() { + _forwarding_offset = _buffer_used; + + write(0); // The first entry is the null entry + + // Write a mapping from object index to buffer offset + for (int i = 1; i <= _source_objs->length(); i++) { + size_t buffer_offset = _dfs_to_archive_object_table[i]; + write(buffer_offset); + } +} + +void AOTStreamedHeapWriter::copy_roots_max_dfs_to_buffer(int roots_length) { + _root_highest_object_index_table_offset = _buffer_used; + + for (int i = 0; i < roots_length; ++i) { + int highest_dfs = _roots_highest_dfs[i]; + write(highest_dfs); + } + + if ((roots_length % 2) != 0) { + write(-1); // Align up to a 64 bit word + } +} + +static bool is_interned_string(oop obj) { + if (!java_lang_String::is_instance(obj)) { + return false; + } + + ResourceMark rm; + int len; + jchar* name = java_lang_String::as_unicode_string_or_null(obj, len); + if (name == nullptr) { + fatal("Insufficient memory for dumping"); + } + return StringTable::lookup(name, len) == obj; +} + +static BitMap::idx_t bit_idx_for_buffer_offset(size_t buffer_offset) { + if (UseCompressedOops) { + return BitMap::idx_t(buffer_offset / sizeof(narrowOop)); + } else { + return BitMap::idx_t(buffer_offset / sizeof(HeapWord)); + } +} + +bool AOTStreamedHeapWriter::is_dumped_interned_string(oop obj) { + return is_interned_string(obj) && HeapShared::get_cached_oop_info(obj) != nullptr; +} + +void AOTStreamedHeapWriter::copy_source_objs_to_buffer(GrowableArrayCHeap* roots) { + for (int i = 0; i < _source_objs->length(); i++) { + oop src_obj = _source_objs->at(i); + HeapShared::CachedOopInfo* info = HeapShared::get_cached_oop_info(src_obj); + assert(info != nullptr, "must be"); + size_t buffer_offset = copy_one_source_obj_to_buffer(src_obj); + info->set_buffer_offset(buffer_offset); + + OopHandle handle(Universe::vm_global(), src_obj); + _buffer_offset_to_source_obj_table->put_when_absent(buffer_offset, handle); + _buffer_offset_to_source_obj_table->maybe_grow(); + + int dfs_order = i + 1; + _dfs_to_archive_object_table[dfs_order] = buffer_offset; + } + + copy_roots_to_buffer(roots); + copy_forwarding_to_buffer(); + copy_roots_max_dfs_to_buffer(roots->length()); + + log_info(aot)("Size of heap region = %zu bytes, %d objects, %d roots", + _buffer_used, _source_objs->length() + 1, roots->length()); +} + +template +void update_buffered_object_field(address buffered_obj, int field_offset, T value) { + T* field_addr = cast_to_oop(buffered_obj)->field_addr(field_offset); + *field_addr = value; +} + +static bool needs_explicit_size(oop src_obj) { + Klass* klass = src_obj->klass(); + int lh = klass->layout_helper(); + + // Simple instances or arrays don't need explicit size + if (Klass::layout_helper_is_instance(lh)) { + return Klass::layout_helper_needs_slow_path(lh); + } + + return !Klass::layout_helper_is_array(lh); +} + +size_t AOTStreamedHeapWriter::copy_one_source_obj_to_buffer(oop src_obj) { + if (needs_explicit_size(src_obj)) { + // Explicitly write object size for more complex objects, to avoid having to + // pretend the buffer objects are objects when loading the objects, in order + // to read the size. Most of the time, the layout helper of the class is enough. + write(src_obj->size()); + } + size_t byte_size = src_obj->size() * HeapWordSize; + assert(byte_size > 0, "no zero-size objects"); + + size_t new_used = _buffer_used + byte_size; + assert(new_used > _buffer_used, "no wrap around"); + + ensure_buffer_space(new_used); + + if (is_interned_string(src_obj)) { + java_lang_String::hash_code(src_obj); // Sets the hash code field(s) + java_lang_String::set_deduplication_forbidden(src_obj); // Allows faster interning at runtime + assert(java_lang_String::hash_is_set(src_obj), "hash must be set"); + } + + address from = cast_from_oop
          (src_obj); + address to = offset_to_buffered_address
          (_buffer_used); + assert(is_object_aligned(_buffer_used), "sanity"); + assert(is_object_aligned(byte_size), "sanity"); + memcpy(to, from, byte_size); + + if (java_lang_Module::is_instance(src_obj)) { + // These native pointers will be restored explicitly at run time. + Modules::check_archived_module_oop(src_obj); + update_buffered_object_field(to, java_lang_Module::module_entry_offset(), nullptr); + } else if (java_lang_ClassLoader::is_instance(src_obj)) { +#ifdef ASSERT + // We only archive these loaders + if (src_obj != SystemDictionary::java_platform_loader() && + src_obj != SystemDictionary::java_system_loader()) { + assert(src_obj->klass()->name()->equals("jdk/internal/loader/ClassLoaders$BootClassLoader"), "must be"); + } +#endif + update_buffered_object_field(to, java_lang_ClassLoader::loader_data_offset(), nullptr); + } + + size_t buffered_obj_offset = _buffer_used; + _buffer_used = new_used; + + return buffered_obj_offset; +} + +// Oop mapping + +inline void AOTStreamedHeapWriter::store_oop_in_buffer(oop* buffered_addr, int dfs_index) { + *(ssize_t*)buffered_addr = dfs_index; +} + +inline void AOTStreamedHeapWriter::store_oop_in_buffer(narrowOop* buffered_addr, int dfs_index) { + *(int32_t*)buffered_addr = (int32_t)dfs_index; +} + +template void AOTStreamedHeapWriter::mark_oop_pointer(T* buffered_addr, CHeapBitMap* oopmap) { + // Mark the pointer in the oopmap + size_t buffered_offset = buffered_address_to_offset((address)buffered_addr); + BitMap::idx_t idx = bit_idx_for_buffer_offset(buffered_offset); + oopmap->set_bit(idx); +} + +template void AOTStreamedHeapWriter::map_oop_field_in_buffer(oop obj, T* field_addr_in_buffer, CHeapBitMap* oopmap) { + if (obj == nullptr) { + store_oop_in_buffer(field_addr_in_buffer, 0); + } else { + int dfs_index = *_dfs_order_table->get(obj); + store_oop_in_buffer(field_addr_in_buffer, dfs_index); + } + + mark_oop_pointer(field_addr_in_buffer, oopmap); +} + +void AOTStreamedHeapWriter::update_header_for_buffered_addr(address buffered_addr, oop src_obj, Klass* src_klass) { + assert(UseCompressedClassPointers, "Archived heap only supported for compressed klasses"); + narrowKlass nk = ArchiveBuilder::current()->get_requested_narrow_klass(src_klass); + + markWord mw = markWord::prototype(); + oopDesc* fake_oop = (oopDesc*)buffered_addr; + + // We need to retain the identity_hash, because it may have been used by some hashtables + // in the shared heap. This also has the side effect of pre-initializing the + // identity_hash for all shared objects, so they are less likely to be written + // into during run time, increasing the potential of memory sharing. + if (src_obj != nullptr) { + intptr_t src_hash = src_obj->identity_hash(); + mw = mw.copy_set_hash(src_hash); + } + + if (is_interned_string(src_obj)) { + // Mark the mark word of interned string so the loader knows to link these to + // the string table at runtime. + mw = mw.set_marked(); + } + + if (UseCompactObjectHeaders) { + fake_oop->set_mark(mw.set_narrow_klass(nk)); + } else { + fake_oop->set_mark(mw); + fake_oop->set_narrow_klass(nk); + } +} + +class AOTStreamedHeapWriter::EmbeddedOopMapper: public BasicOopIterateClosure { + oop _src_obj; + address _buffered_obj; + CHeapBitMap* _oopmap; + bool _is_java_lang_ref; + +public: + EmbeddedOopMapper(oop src_obj, address buffered_obj, CHeapBitMap* oopmap) + : _src_obj(src_obj), + _buffered_obj(buffered_obj), + _oopmap(oopmap), + _is_java_lang_ref(AOTReferenceObjSupport::check_if_ref_obj(src_obj)) {} + + void do_oop(narrowOop *p) { EmbeddedOopMapper::do_oop_work(p); } + void do_oop( oop *p) { EmbeddedOopMapper::do_oop_work(p); } + +private: + template + void do_oop_work(T *p) { + size_t field_offset = pointer_delta(p, _src_obj, sizeof(char)); + oop obj = HeapShared::maybe_remap_referent(_is_java_lang_ref, field_offset, HeapAccess<>::oop_load(p)); + AOTStreamedHeapWriter::map_oop_field_in_buffer(obj, (T*)(_buffered_obj + field_offset), _oopmap); + } +}; + +static void log_bitmap_usage(const char* which, BitMap* bitmap, size_t total_bits) { + // The whole heap is covered by total_bits, but there are only non-zero bits within [start ... end). + size_t start = bitmap->find_first_set_bit(0); + size_t end = bitmap->size(); + log_info(aot)("%s = %7zu ... %7zu (%3zu%% ... %3zu%% = %3zu%%)", which, + start, end, + start * 100 / total_bits, + end * 100 / total_bits, + (end - start) * 100 / total_bits); +} + +// Update all oop fields embedded in the buffered objects +void AOTStreamedHeapWriter::map_embedded_oops(ArchiveStreamedHeapInfo* heap_info) { + size_t oopmap_unit = (UseCompressedOops ? sizeof(narrowOop) : sizeof(oop)); + size_t heap_region_byte_size = _buffer_used; + heap_info->oopmap()->resize(heap_region_byte_size / oopmap_unit); + + for (int i = 0; i < _source_objs->length(); i++) { + oop src_obj = _source_objs->at(i); + HeapShared::CachedOopInfo* info = HeapShared::get_cached_oop_info(src_obj); + assert(info != nullptr, "must be"); + address buffered_obj = offset_to_buffered_address
          (info->buffer_offset()); + + update_header_for_buffered_addr(buffered_obj, src_obj, src_obj->klass()); + + EmbeddedOopMapper mapper(src_obj, buffered_obj, heap_info->oopmap()); + src_obj->oop_iterate(&mapper); + HeapShared::remap_dumped_metadata(src_obj, buffered_obj); + }; + + size_t total_bytes = (size_t)_buffer->length(); + log_bitmap_usage("oopmap", heap_info->oopmap(), total_bytes / oopmap_unit); +} + +size_t AOTStreamedHeapWriter::source_obj_to_buffered_offset(oop src_obj) { + HeapShared::CachedOopInfo* p = HeapShared::get_cached_oop_info(src_obj); + return p->buffer_offset(); +} + +address AOTStreamedHeapWriter::source_obj_to_buffered_addr(oop src_obj) { + return offset_to_buffered_address
          (source_obj_to_buffered_offset(src_obj)); +} + +oop AOTStreamedHeapWriter::buffered_offset_to_source_obj(size_t buffered_offset) { + OopHandle* oh = _buffer_offset_to_source_obj_table->get(buffered_offset); + if (oh != nullptr) { + return oh->resolve(); + } else { + return nullptr; + } +} + +oop AOTStreamedHeapWriter::buffered_addr_to_source_obj(address buffered_addr) { + return buffered_offset_to_source_obj(buffered_address_to_offset(buffered_addr)); +} + +void AOTStreamedHeapWriter::populate_archive_heap_info(ArchiveStreamedHeapInfo* info) { + assert(!info->is_used(), "only set once"); + + size_t heap_region_byte_size = _buffer_used; + assert(heap_region_byte_size > 0, "must archived at least one object!"); + + info->set_buffer_region(MemRegion(offset_to_buffered_address(0), + offset_to_buffered_address(_buffer_used))); + info->set_roots_offset(_roots_offset); + info->set_num_roots((size_t)HeapShared::pending_roots()->length()); + info->set_forwarding_offset(_forwarding_offset); + info->set_root_highest_object_index_table_offset(_root_highest_object_index_table_offset); + info->set_num_archived_objects((size_t)_source_objs->length()); +} + +AOTMapLogger::OopDataIterator* AOTStreamedHeapWriter::oop_iterator(ArchiveStreamedHeapInfo* heap_info) { + class StreamedWriterOopIterator : public AOTMapLogger::OopDataIterator { + private: + int _current; + int _next; + + address _buffer_start; + + int _num_archived_objects; + int _num_archived_roots; + int* _roots; + + public: + StreamedWriterOopIterator(address buffer_start, + int num_archived_objects, + int num_archived_roots, + int* roots) + : _current(0), + _next(1), + _buffer_start(buffer_start), + _num_archived_objects(num_archived_objects), + _num_archived_roots(num_archived_roots), + _roots(roots) { + } + + AOTMapLogger::OopData capture(int dfs_index) { + size_t buffered_offset = _dfs_to_archive_object_table[dfs_index]; + address buffered_addr = _buffer_start + buffered_offset; + oop src_obj = AOTStreamedHeapWriter::buffered_offset_to_source_obj(buffered_offset); + assert(src_obj != nullptr, "why is this null?"); + oopDesc* raw_oop = (oopDesc*)buffered_addr; + Klass* klass = src_obj->klass(); + size_t size = src_obj->size(); + + intptr_t target_location = (intptr_t)buffered_offset; + uint32_t narrow_location = checked_cast(dfs_index); + + address requested_addr = (address)buffered_offset; + + return { buffered_addr, + requested_addr, + target_location, + narrow_location, + raw_oop, + klass, + size, + false }; + } + + bool has_next() override { + return _next <= _num_archived_objects; + } + + AOTMapLogger::OopData next() override { + _current = _next; + AOTMapLogger::OopData result = capture(_current); + _next = _current + 1; + return result; + } + + AOTMapLogger::OopData obj_at(narrowOop* addr) override { + int dfs_index = (int)(*addr); + if (dfs_index == 0) { + return null_data(); + } else { + return capture(dfs_index); + } + } + + AOTMapLogger::OopData obj_at(oop* addr) override { + int dfs_index = (int)cast_from_oop(*addr); + if (dfs_index == 0) { + return null_data(); + } else { + return capture(dfs_index); + } + } + + GrowableArrayCHeap* roots() override { + GrowableArrayCHeap* result = new GrowableArrayCHeap(); + + for (int i = 0; i < _num_archived_roots; ++i) { + int object_index = _roots[i]; + result->append(capture(object_index)); + } + + return result; + } + }; + + MemRegion r = heap_info->buffer_region(); + address buffer_start = address(r.start()); + + size_t roots_offset = heap_info->roots_offset(); + int* roots = ((int*)(buffer_start + roots_offset)) + 1; + + return new StreamedWriterOopIterator(buffer_start, (int)heap_info->num_archived_objects(), (int)heap_info->num_roots(), roots); +} + +#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/aotStreamedHeapWriter.hpp b/src/hotspot/share/cds/aotStreamedHeapWriter.hpp new file mode 100644 index 00000000000..bde82f8ce29 --- /dev/null +++ b/src/hotspot/share/cds/aotStreamedHeapWriter.hpp @@ -0,0 +1,162 @@ +/* + * 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_AOTSTREAMEDHEAPWRITER_HPP +#define SHARE_CDS_AOTSTREAMEDHEAPWRITER_HPP + +#include "cds/aotMapLogger.hpp" +#include "cds/heapShared.hpp" +#include "memory/allocation.hpp" +#include "memory/allStatic.hpp" +#include "oops/oopHandle.hpp" +#include "utilities/bitMap.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/macros.hpp" +#include "utilities/resizableHashTable.hpp" + +class MemRegion; + +#if INCLUDE_CDS_JAVA_HEAP +class AOTStreamedHeapWriter : AllStatic { + class EmbeddedOopMapper; + static GrowableArrayCHeap* _buffer; + + // The number of bytes that have written into _buffer (may be smaller than _buffer->length()). + static size_t _buffer_used; + + // The bottom of the copy of Heap::roots() inside this->_buffer. + static size_t _roots_offset; + + // Offset to the forwarding information + static size_t _forwarding_offset; + + // Offset to dfs bounds information + static size_t _root_highest_object_index_table_offset; + + static GrowableArrayCHeap* _source_objs; + + typedef ResizeableHashTable BufferOffsetToSourceObjectTable; + + static BufferOffsetToSourceObjectTable* _buffer_offset_to_source_obj_table; + + typedef ResizeableHashTable SourceObjectToDFSOrderTable; + static SourceObjectToDFSOrderTable* _dfs_order_table; + + static int* _roots_highest_dfs; + static size_t* _dfs_to_archive_object_table; + + static int cmp_dfs_order(oop* o1, oop* o2); + + static void allocate_buffer(); + static void ensure_buffer_space(size_t min_bytes); + + // Both Java bytearray and GrowableArraty use int indices and lengths. Do a safe typecast with range check + static int to_array_index(size_t i) { + assert(i <= (size_t)max_jint, "must be"); + return (int)i; + } + static int to_array_length(size_t n) { + return to_array_index(n); + } + + template static T offset_to_buffered_address(size_t offset) { + return (T)(_buffer->adr_at(to_array_index(offset))); + } + + static address buffer_bottom() { + return offset_to_buffered_address
          (0); + } + + // The exclusive end of the last object that was copied into the buffer. + static address buffer_top() { + return buffer_bottom() + _buffer_used; + } + + static bool in_buffer(address buffered_addr) { + return (buffer_bottom() <= buffered_addr) && (buffered_addr < buffer_top()); + } + + static size_t buffered_address_to_offset(address buffered_addr) { + assert(in_buffer(buffered_addr), "sanity"); + return buffered_addr - buffer_bottom(); + } + + static void order_source_objs(GrowableArrayCHeap* roots); + static void copy_roots_to_buffer(GrowableArrayCHeap* roots); + static void copy_source_objs_to_buffer(GrowableArrayCHeap* roots); + static size_t copy_one_source_obj_to_buffer(oop src_obj); + + template + static void write(T value); + static void copy_forwarding_to_buffer(); + static void copy_roots_max_dfs_to_buffer(int roots_length); + + static void map_embedded_oops(ArchiveStreamedHeapInfo* info); + static bool is_in_requested_range(oop o); + static oop requested_obj_from_buffer_offset(size_t offset); + + static oop load_oop_from_buffer(oop* buffered_addr); + static oop load_oop_from_buffer(narrowOop* buffered_addr); + inline static void store_oop_in_buffer(oop* buffered_addr, int dfs_index); + inline static void store_oop_in_buffer(narrowOop* buffered_addr, int dfs_index); + + template static void mark_oop_pointer(T* buffered_addr, CHeapBitMap* oopmap); + template static void map_oop_field_in_buffer(oop obj, T* field_addr_in_buffer, CHeapBitMap* oopmap); + + static void update_header_for_buffered_addr(address buffered_addr, oop src_obj, Klass* src_klass); + + static void populate_archive_heap_info(ArchiveStreamedHeapInfo* info); + +public: + static void init() NOT_CDS_JAVA_HEAP_RETURN; + + static void delete_tables_with_raw_oops(); + static void add_source_obj(oop src_obj); + static void write(GrowableArrayCHeap*, ArchiveStreamedHeapInfo* heap_info); + static address buffered_heap_roots_addr() { + return offset_to_buffered_address
          (_roots_offset); + } + + static size_t buffered_addr_to_buffered_offset(address buffered_addr) { + assert(buffered_addr != nullptr, "should not be null"); + return size_t(buffered_addr) - size_t(buffer_bottom()); + } + + static bool is_dumped_interned_string(oop obj); + + static size_t source_obj_to_buffered_offset(oop src_obj); + static address source_obj_to_buffered_addr(oop src_obj); + + static oop buffered_offset_to_source_obj(size_t buffered_offset); + static oop buffered_addr_to_source_obj(address buffered_addr); + + static AOTMapLogger::OopDataIterator* oop_iterator(ArchiveStreamedHeapInfo* heap_info); +}; +#endif // INCLUDE_CDS_JAVA_HEAP +#endif // SHARE_CDS_AOTSTREAMEDHEAPWRITER_HPP diff --git a/src/hotspot/share/cds/aotThread.cpp b/src/hotspot/share/cds/aotThread.cpp new file mode 100644 index 00000000000..26a6f4291cd --- /dev/null +++ b/src/hotspot/share/cds/aotThread.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2024, 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. + * + * 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. + * + */ + +#include "cds/aotStreamedHeapLoader.hpp" +#include "cds/aotThread.hpp" +#include "cds/heapShared.hpp" +#include "classfile/javaClasses.hpp" +#include "classfile/javaThreadStatus.hpp" +#include "classfile/vmClasses.hpp" +#include "classfile/vmSymbols.hpp" +#include "jfr/jfr.hpp" +#include "runtime/javaThread.inline.hpp" +#include "runtime/mutexLocker.hpp" +#include "runtime/osThread.hpp" +#include "runtime/thread.hpp" +#include "runtime/threads.hpp" +#include "utilities/exceptions.hpp" + +AOTThread* AOTThread::_aot_thread; +bool AOTThread::_started; + +// Starting the AOTThread is tricky. We wish to start it as early as possible, as +// that increases the amount of curling this thread can do for the application thread +// that is concurrently starting. But there are complications starting a thread this +// early. The java.lang.Thread class is not initialized and we may not execute any +// Java bytecodes yet. This is an internal thread, so we try to keep the bookkeeping +// minimal and use a logical ThreadIdentifier for JFR and monitor identity. The real +// thread object is created just after the main thread creates its Thread object, after +// the Thread class has been initialized. +void AOTThread::initialize() { +#if INCLUDE_CDS_JAVA_HEAP + EXCEPTION_MARK; + + // Spin up a thread without thread oop, because the java.lang classes + // have not yet been initialized, and hence we can't allocate the Thread + // object yet. + AOTThread* thread = new AOTThread(&aot_thread_entry); + _aot_thread = thread; + +#if INCLUDE_JVMTI + // The line below hides JVMTI events from this thread (cf. should_hide_jvmti_events()) + // This is important because this thread runs before JVMTI monitors are set up appropriately. + // Therefore, callbacks would not work as intended. JVMTI has no business peeking at how we + // materialize primordial objects from the AOT cache. + thread->toggle_is_disable_suspend(); +#endif + + JavaThread::vm_exit_on_osthread_failure(thread); + _started = true; + + // Note that the Thread class is not initialized yet at this point. We + // can run a bit concurrently until the Thread class is initialized; then + // materialize_thread_object is called to inflate the thread object. + + // The thread needs an identifier. This thread is fine with a temporary ID + // assignment; it will terminate soon anyway. + int64_t tid = ThreadIdentifier::next(); + thread->set_monitor_owner_id(tid); + + { + MutexLocker mu(THREAD, Threads_lock); + Threads::add(thread); + } + + JFR_ONLY(Jfr::on_java_thread_start(THREAD, thread);) + + os::start_thread(thread); +#endif +} + +void AOTThread::materialize_thread_object() { +#if INCLUDE_CDS_JAVA_HEAP + if (!_started) { + // No thread object to materialize + return; + } + + EXCEPTION_MARK; + + HandleMark hm(THREAD); + Handle thread_oop = JavaThread::create_system_thread_object("AOTThread", CHECK); + + java_lang_Thread::release_set_thread(thread_oop(), _aot_thread); + _aot_thread->set_threadOopHandles(thread_oop()); +#endif +} + +void AOTThread::aot_thread_entry(JavaThread* jt, TRAPS) { +#if INCLUDE_CDS_JAVA_HEAP + AOTStreamedHeapLoader::materialize_objects(); + _aot_thread = nullptr; // AOT thread will get destroyed after this point +#endif +} diff --git a/src/hotspot/share/cds/aotThread.hpp b/src/hotspot/share/cds/aotThread.hpp new file mode 100644 index 00000000000..644363e685b --- /dev/null +++ b/src/hotspot/share/cds/aotThread.hpp @@ -0,0 +1,52 @@ +/* + * 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_AOTTHREAD_HPP +#define SHARE_CDS_AOTTHREAD_HPP + +#include "runtime/javaThread.hpp" +#include "utilities/macros.hpp" + +// A hidden from external view JavaThread for materializing archived objects + +class AOTThread : public JavaThread { +private: + static bool _started; + static AOTThread* _aot_thread; + static void aot_thread_entry(JavaThread* thread, TRAPS); + AOTThread(ThreadFunction entry_point) : JavaThread(entry_point) {}; + +public: + static void initialize(); + + // Hide this thread from external view. + virtual bool is_hidden_from_external_view() const { return true; } + + static void materialize_thread_object(); + + static bool aot_thread_initialized() { return _started; }; + bool is_aot_thread() const { return true; }; +}; + +#endif // SHARE_CDS_AOTTHREAD_HPP diff --git a/src/hotspot/share/cds/archiveBuilder.cpp b/src/hotspot/share/cds/archiveBuilder.cpp index 539c2672cf6..3c7f25a950b 100644 --- a/src/hotspot/share/cds/archiveBuilder.cpp +++ b/src/hotspot/share/cds/archiveBuilder.cpp @@ -28,7 +28,6 @@ #include "cds/aotMapLogger.hpp" #include "cds/aotMetaspace.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/archiveUtils.hpp" #include "cds/cdsConfig.hpp" #include "cds/cppVtables.hpp" @@ -1175,11 +1174,13 @@ void ArchiveBuilder::print_stats() { _alloc_stats.print_stats(int(_ro_region.used()), int(_rw_region.used())); } -void ArchiveBuilder::write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_info) { +void ArchiveBuilder::write_archive(FileMapInfo* mapinfo, ArchiveMappedHeapInfo* mapped_heap_info, ArchiveStreamedHeapInfo* streamed_heap_info) { // Make sure NUM_CDS_REGIONS (exported in cds.h) agrees with // AOTMetaspace::n_regions (internal to hotspot). assert(NUM_CDS_REGIONS == AOTMetaspace::n_regions, "sanity"); + ResourceMark rm; + write_region(mapinfo, AOTMetaspace::rw, &_rw_region, /*read_only=*/false,/*allow_exec=*/false); write_region(mapinfo, AOTMetaspace::ro, &_ro_region, /*read_only=*/true, /*allow_exec=*/false); write_region(mapinfo, AOTMetaspace::ac, &_ac_region, /*read_only=*/false,/*allow_exec=*/false); @@ -1188,14 +1189,19 @@ void ArchiveBuilder::write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_i ArchivePtrMarker::initialize_rw_ro_maps(&_rw_ptrmap, &_ro_ptrmap); size_t bitmap_size_in_bytes; - char* bitmap = mapinfo->write_bitmap_region(ArchivePtrMarker::rw_ptrmap(), ArchivePtrMarker::ro_ptrmap(), heap_info, + char* bitmap = mapinfo->write_bitmap_region(ArchivePtrMarker::rw_ptrmap(), + ArchivePtrMarker::ro_ptrmap(), + mapped_heap_info, + streamed_heap_info, bitmap_size_in_bytes); - if (heap_info->is_used()) { - _total_heap_region_size = mapinfo->write_heap_region(heap_info); + if (mapped_heap_info != nullptr && mapped_heap_info->is_used()) { + _total_heap_region_size = mapinfo->write_mapped_heap_region(mapped_heap_info); + } else if (streamed_heap_info != nullptr && streamed_heap_info->is_used()) { + _total_heap_region_size = mapinfo->write_streamed_heap_region(streamed_heap_info); } - print_region_stats(mapinfo, heap_info); + print_region_stats(mapinfo, mapped_heap_info, streamed_heap_info); mapinfo->set_requested_base((char*)AOTMetaspace::requested_base_address()); mapinfo->set_header_crc(mapinfo->compute_header_crc()); @@ -1210,7 +1216,7 @@ void ArchiveBuilder::write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_i } if (log_is_enabled(Info, aot, map)) { - AOTMapLogger::dumptime_log(this, mapinfo, heap_info, bitmap, bitmap_size_in_bytes); + AOTMapLogger::dumptime_log(this, mapinfo, mapped_heap_info, streamed_heap_info, bitmap, bitmap_size_in_bytes); } CDS_JAVA_HEAP_ONLY(HeapShared::destroy_archived_object_cache()); FREE_C_HEAP_ARRAY(char, bitmap); @@ -1226,7 +1232,9 @@ void ArchiveBuilder::count_relocated_pointer(bool tagged, bool nulled) { _relocated_ptr_info._num_nulled_ptrs += nulled ? 1 : 0; } -void ArchiveBuilder::print_region_stats(FileMapInfo *mapinfo, ArchiveHeapInfo* heap_info) { +void ArchiveBuilder::print_region_stats(FileMapInfo *mapinfo, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info) { // Print statistics of all the regions const size_t bitmap_used = mapinfo->region_at(AOTMetaspace::bm)->used(); const size_t bitmap_reserved = mapinfo->region_at(AOTMetaspace::bm)->used_aligned(); @@ -1244,22 +1252,22 @@ void ArchiveBuilder::print_region_stats(FileMapInfo *mapinfo, ArchiveHeapInfo* h print_bitmap_region_stats(bitmap_used, total_reserved); - if (heap_info->is_used()) { - print_heap_region_stats(heap_info, total_reserved); + if (mapped_heap_info != nullptr && mapped_heap_info->is_used()) { + print_heap_region_stats(mapped_heap_info->buffer_start(), mapped_heap_info->buffer_byte_size(), total_reserved); + } else if (streamed_heap_info != nullptr && streamed_heap_info->is_used()) { + print_heap_region_stats(streamed_heap_info->buffer_start(), streamed_heap_info->buffer_byte_size(), total_reserved); } aot_log_debug(aot)("total : %9zu [100.0%% of total] out of %9zu bytes [%5.1f%% used]", - total_bytes, total_reserved, total_u_perc); + total_bytes, total_reserved, total_u_perc); } void ArchiveBuilder::print_bitmap_region_stats(size_t size, size_t total_size) { aot_log_debug(aot)("bm space: %9zu [ %4.1f%% of total] out of %9zu bytes [100.0%% used]", - size, size/double(total_size)*100.0, size); + size, size/double(total_size)*100.0, size); } -void ArchiveBuilder::print_heap_region_stats(ArchiveHeapInfo *info, size_t total_size) { - char* start = info->buffer_start(); - size_t size = info->buffer_byte_size(); +void ArchiveBuilder::print_heap_region_stats(char* start, size_t size, size_t total_size) { char* top = start + size; aot_log_debug(aot)("hp space: %9zu [ %4.1f%% of total] out of %9zu bytes [100.0%% used] at " INTPTR_FORMAT, size, size/double(total_size)*100.0, size, p2i(start)); diff --git a/src/hotspot/share/cds/archiveBuilder.hpp b/src/hotspot/share/cds/archiveBuilder.hpp index 815a6f07273..9a628439039 100644 --- a/src/hotspot/share/cds/archiveBuilder.hpp +++ b/src/hotspot/share/cds/archiveBuilder.hpp @@ -39,7 +39,8 @@ #include "utilities/hashTable.hpp" #include "utilities/resizableHashTable.hpp" -class ArchiveHeapInfo; +class ArchiveMappedHeapInfo; +class ArchiveStreamedHeapInfo; class CHeapBitMap; class FileMapInfo; class Klass; @@ -245,9 +246,11 @@ private: size_t _num_nulled_ptrs; } _relocated_ptr_info; - void print_region_stats(FileMapInfo *map_info, ArchiveHeapInfo* heap_info); + void print_region_stats(FileMapInfo *map_info, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info); void print_bitmap_region_stats(size_t size, size_t total_size); - void print_heap_region_stats(ArchiveHeapInfo* heap_info, size_t total_size); + void print_heap_region_stats(char* start, size_t size, size_t total_size); // For global access. static ArchiveBuilder* _current; @@ -434,7 +437,9 @@ public: void make_klasses_shareable(); void make_training_data_shareable(); void relocate_to_requested(); - void write_archive(FileMapInfo* mapinfo, ArchiveHeapInfo* heap_info); + void write_archive(FileMapInfo* mapinfo, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info); void write_region(FileMapInfo* mapinfo, int region_idx, DumpRegion* dump_region, bool read_only, bool allow_exec); @@ -502,6 +507,7 @@ public: return (Symbol*)current()->get_buffered_addr((address)src_symbol); } + static void log_as_hex(address base, address top, address requested_base, bool is_heap = false); void print_stats(); void report_out_of_space(const char* name, size_t needed_bytes); diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp deleted file mode 100644 index 6efc8f6fe1e..00000000000 --- a/src/hotspot/share/cds/archiveHeapLoader.cpp +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (c) 2018, 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. - * - * 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. - * - */ - -#include "cds/aotMetaspace.hpp" -#include "cds/archiveHeapLoader.inline.hpp" -#include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" -#include "classfile/classLoaderDataShared.hpp" -#include "classfile/systemDictionaryShared.hpp" -#include "gc/shared/collectedHeap.hpp" -#include "logging/log.hpp" -#include "memory/iterator.inline.hpp" -#include "memory/resourceArea.hpp" -#include "memory/universe.hpp" -#include "sanitizers/ub.hpp" -#include "utilities/bitMap.inline.hpp" -#include "utilities/copy.hpp" - -#if INCLUDE_CDS_JAVA_HEAP - -bool ArchiveHeapLoader::_is_mapped = false; -bool ArchiveHeapLoader::_is_loaded = false; - -bool ArchiveHeapLoader::_narrow_oop_base_initialized = false; -address ArchiveHeapLoader::_narrow_oop_base; -int ArchiveHeapLoader::_narrow_oop_shift; - -// Support for loaded heap. -uintptr_t ArchiveHeapLoader::_loaded_heap_bottom = 0; -uintptr_t ArchiveHeapLoader::_loaded_heap_top = 0; -uintptr_t ArchiveHeapLoader::_dumptime_base = UINTPTR_MAX; -uintptr_t ArchiveHeapLoader::_dumptime_top = 0; -intx ArchiveHeapLoader::_runtime_offset = 0; -bool ArchiveHeapLoader::_loading_failed = false; - -// Support for mapped heap. -uintptr_t ArchiveHeapLoader::_mapped_heap_bottom = 0; -bool ArchiveHeapLoader::_mapped_heap_relocation_initialized = false; -ptrdiff_t ArchiveHeapLoader::_mapped_heap_delta = 0; - -// Every mapped region is offset by _mapped_heap_delta from its requested address. -// See FileMapInfo::heap_region_requested_address(). -ATTRIBUTE_NO_UBSAN -void ArchiveHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) { - assert(!_mapped_heap_relocation_initialized, "only once"); - if (!UseCompressedOops) { - assert(dumptime_oop_shift == 0, "sanity"); - } - assert(can_map(), "sanity"); - init_narrow_oop_decoding(CompressedOops::base() + delta, dumptime_oop_shift); - _mapped_heap_bottom = (intptr_t)mapped_heap_bottom; - _mapped_heap_delta = delta; - _mapped_heap_relocation_initialized = true; -} - -void ArchiveHeapLoader::init_narrow_oop_decoding(address base, int shift) { - assert(!_narrow_oop_base_initialized, "only once"); - _narrow_oop_base_initialized = true; - _narrow_oop_base = base; - _narrow_oop_shift = shift; -} - -void ArchiveHeapLoader::fixup_region() { - FileMapInfo* mapinfo = FileMapInfo::current_info(); - if (is_mapped()) { - mapinfo->fixup_mapped_heap_region(); - } else if (_loading_failed) { - fill_failed_loaded_heap(); - } - if (is_in_use()) { - if (!CDSConfig::is_using_full_module_graph()) { - // Need to remove all the archived java.lang.Module objects from HeapShared::roots(). - ClassLoaderDataShared::clear_archived_oops(); - } - } -} - -// ------------------ Support for Region MAPPING ----------------------------------------- - -// Patch all the embedded oop pointers inside an archived heap region, -// to be consistent with the runtime oop encoding. -class PatchCompressedEmbeddedPointers: public BitMapClosure { - narrowOop* _start; - - public: - PatchCompressedEmbeddedPointers(narrowOop* start) : _start(start) {} - - bool do_bit(size_t offset) { - narrowOop* p = _start + offset; - narrowOop v = *p; - assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); - oop o = ArchiveHeapLoader::decode_from_mapped_archive(v); - RawAccess::oop_store(p, o); - return true; - } -}; - -class PatchCompressedEmbeddedPointersQuick: public BitMapClosure { - narrowOop* _start; - uint32_t _delta; - - public: - PatchCompressedEmbeddedPointersQuick(narrowOop* start, uint32_t delta) : _start(start), _delta(delta) {} - - bool do_bit(size_t offset) { - narrowOop* p = _start + offset; - narrowOop v = *p; - assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); - narrowOop new_v = CompressedOops::narrow_oop_cast(CompressedOops::narrow_oop_value(v) + _delta); - assert(!CompressedOops::is_null(new_v), "should never relocate to narrowOop(0)"); -#ifdef ASSERT - oop o1 = ArchiveHeapLoader::decode_from_mapped_archive(v); - oop o2 = CompressedOops::decode_not_null(new_v); - assert(o1 == o2, "quick delta must work"); -#endif - RawAccess::oop_store(p, new_v); - return true; - } -}; - -class PatchUncompressedEmbeddedPointers: public BitMapClosure { - oop* _start; - intptr_t _delta; - - public: - PatchUncompressedEmbeddedPointers(oop* start, intx runtime_offset) : - _start(start), - _delta(runtime_offset) {} - - PatchUncompressedEmbeddedPointers(oop* start) : - _start(start), - _delta(ArchiveHeapLoader::mapped_heap_delta()) {} - - bool do_bit(size_t offset) { - oop* p = _start + offset; - intptr_t dumptime_oop = (intptr_t)((void*)*p); - assert(dumptime_oop != 0, "null oops should have been filtered out at dump time"); - intptr_t runtime_oop = dumptime_oop + _delta; - RawAccess::oop_store(p, cast_to_oop(runtime_oop)); - return true; - } -}; - -void ArchiveHeapLoader::patch_compressed_embedded_pointers(BitMapView bm, - FileMapInfo* info, - MemRegion region) { - narrowOop dt_encoded_bottom = info->encoded_heap_region_dumptime_address(); - narrowOop rt_encoded_bottom = CompressedOops::encode_not_null(cast_to_oop(region.start())); - log_info(aot)("patching heap embedded pointers: narrowOop 0x%8x -> 0x%8x", - (uint)dt_encoded_bottom, (uint)rt_encoded_bottom); - - // Optimization: if dumptime shift is the same as runtime shift, we can perform a - // quick conversion from "dumptime narrowOop" -> "runtime narrowOop". - narrowOop* patching_start = (narrowOop*)region.start() + FileMapInfo::current_info()->heap_oopmap_start_pos(); - if (_narrow_oop_shift == CompressedOops::shift()) { - uint32_t quick_delta = (uint32_t)rt_encoded_bottom - (uint32_t)dt_encoded_bottom; - log_info(aot)("heap data relocation quick delta = 0x%x", quick_delta); - if (quick_delta == 0) { - log_info(aot)("heap data relocation unnecessary, quick_delta = 0"); - } else { - PatchCompressedEmbeddedPointersQuick patcher(patching_start, quick_delta); - bm.iterate(&patcher); - } - } else { - log_info(aot)("heap data quick relocation not possible"); - PatchCompressedEmbeddedPointers patcher(patching_start); - bm.iterate(&patcher); - } -} - -// Patch all the non-null pointers that are embedded in the archived heap objects -// in this (mapped) region -void ArchiveHeapLoader::patch_embedded_pointers(FileMapInfo* info, - MemRegion region, address oopmap, - size_t oopmap_size_in_bits) { - BitMapView bm((BitMap::bm_word_t*)oopmap, oopmap_size_in_bits); - if (UseCompressedOops) { - patch_compressed_embedded_pointers(bm, info, region); - } else { - PatchUncompressedEmbeddedPointers patcher((oop*)region.start() + FileMapInfo::current_info()->heap_oopmap_start_pos()); - bm.iterate(&patcher); - } -} - -// ------------------ Support for Region LOADING ----------------------------------------- - -// The CDS archive remembers each heap object by its address at dump time, but -// the heap object may be loaded at a different address at run time. This structure is used -// to translate the dump time addresses for all objects in FileMapInfo::space_at(region_index) -// to their runtime addresses. -struct LoadedArchiveHeapRegion { - int _region_index; // index for FileMapInfo::space_at(index) - size_t _region_size; // number of bytes in this region - uintptr_t _dumptime_base; // The dump-time (decoded) address of the first object in this region - intx _runtime_offset; // If an object's dump time address P is within in this region, its - // runtime address is P + _runtime_offset - uintptr_t top() { - return _dumptime_base + _region_size; - } -}; - -void ArchiveHeapLoader::init_loaded_heap_relocation(LoadedArchiveHeapRegion* loaded_region) { - _dumptime_base = loaded_region->_dumptime_base; - _dumptime_top = loaded_region->top(); - _runtime_offset = loaded_region->_runtime_offset; -} - -bool ArchiveHeapLoader::can_load() { - return Universe::heap()->can_load_archived_objects(); -} - -class ArchiveHeapLoader::PatchLoadedRegionPointers: public BitMapClosure { - narrowOop* _start; - intx _offset; - uintptr_t _base; - uintptr_t _top; - - public: - PatchLoadedRegionPointers(narrowOop* start, LoadedArchiveHeapRegion* loaded_region) - : _start(start), - _offset(loaded_region->_runtime_offset), - _base(loaded_region->_dumptime_base), - _top(loaded_region->top()) {} - - bool do_bit(size_t offset) { - assert(UseCompressedOops, "PatchLoadedRegionPointers for uncompressed oops is unimplemented"); - narrowOop* p = _start + offset; - narrowOop v = *p; - assert(!CompressedOops::is_null(v), "null oops should have been filtered out at dump time"); - uintptr_t o = cast_from_oop(ArchiveHeapLoader::decode_from_archive(v)); - assert(_base <= o && o < _top, "must be"); - - o += _offset; - ArchiveHeapLoader::assert_in_loaded_heap(o); - RawAccess::oop_store(p, cast_to_oop(o)); - return true; - } -}; - -bool ArchiveHeapLoader::init_loaded_region(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_region, - MemRegion& archive_space) { - size_t total_bytes = 0; - FileMapRegion* r = mapinfo->region_at(AOTMetaspace::hp); - r->assert_is_heap_region(); - if (r->used() == 0) { - return false; - } - - assert(is_aligned(r->used(), HeapWordSize), "must be"); - total_bytes += r->used(); - loaded_region->_region_index = AOTMetaspace::hp; - loaded_region->_region_size = r->used(); - loaded_region->_dumptime_base = (uintptr_t)mapinfo->heap_region_dumptime_address(); - - assert(is_aligned(total_bytes, HeapWordSize), "must be"); - size_t word_size = total_bytes / HeapWordSize; - HeapWord* buffer = Universe::heap()->allocate_loaded_archive_space(word_size); - if (buffer == nullptr) { - return false; - } - - archive_space = MemRegion(buffer, word_size); - _loaded_heap_bottom = (uintptr_t)archive_space.start(); - _loaded_heap_top = _loaded_heap_bottom + total_bytes; - - loaded_region->_runtime_offset = _loaded_heap_bottom - loaded_region->_dumptime_base; - - return true; -} - -bool ArchiveHeapLoader::load_heap_region_impl(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_region, - uintptr_t load_address) { - uintptr_t bitmap_base = (uintptr_t)mapinfo->map_bitmap_region(); - if (bitmap_base == 0) { - _loading_failed = true; - return false; // OOM or CRC error - } - - FileMapRegion* r = mapinfo->region_at(loaded_region->_region_index); - if (!mapinfo->read_region(loaded_region->_region_index, (char*)load_address, r->used(), /* do_commit = */ false)) { - // There's no easy way to free the buffer, so we will fill it with zero later - // in fill_failed_loaded_heap(), and it will eventually be GC'ed. - log_warning(aot)("Loading of heap region %d has failed. Archived objects are disabled", loaded_region->_region_index); - _loading_failed = true; - return false; - } - assert(r->mapped_base() == (char*)load_address, "sanity"); - log_info(aot)("Loaded heap region #%d at base " INTPTR_FORMAT " top " INTPTR_FORMAT - " size %6zu delta %zd", - loaded_region->_region_index, load_address, load_address + loaded_region->_region_size, - loaded_region->_region_size, loaded_region->_runtime_offset); - - uintptr_t oopmap = bitmap_base + r->oopmap_offset(); - BitMapView bm((BitMap::bm_word_t*)oopmap, r->oopmap_size_in_bits()); - - if (UseCompressedOops) { - PatchLoadedRegionPointers patcher((narrowOop*)load_address + FileMapInfo::current_info()->heap_oopmap_start_pos(), loaded_region); - bm.iterate(&patcher); - } else { - PatchUncompressedEmbeddedPointers patcher((oop*)load_address + FileMapInfo::current_info()->heap_oopmap_start_pos(), loaded_region->_runtime_offset); - bm.iterate(&patcher); - } - return true; -} - -bool ArchiveHeapLoader::load_heap_region(FileMapInfo* mapinfo) { - assert(can_load(), "loaded heap for must be supported"); - init_narrow_oop_decoding(mapinfo->narrow_oop_base(), mapinfo->narrow_oop_shift()); - - LoadedArchiveHeapRegion loaded_region; - memset(&loaded_region, 0, sizeof(loaded_region)); - - MemRegion archive_space; - if (!init_loaded_region(mapinfo, &loaded_region, archive_space)) { - return false; - } - - if (!load_heap_region_impl(mapinfo, &loaded_region, (uintptr_t)archive_space.start())) { - assert(_loading_failed, "must be"); - return false; - } - - init_loaded_heap_relocation(&loaded_region); - _is_loaded = true; - - return true; -} - -class VerifyLoadedHeapEmbeddedPointers: public BasicOopIterateClosure { - HashTable* _table; - - public: - VerifyLoadedHeapEmbeddedPointers(HashTable* table) : _table(table) {} - - virtual void do_oop(narrowOop* p) { - // This should be called before the loaded region is modified, so all the embedded pointers - // must be null, or must point to a valid object in the loaded region. - narrowOop v = *p; - if (!CompressedOops::is_null(v)) { - oop o = CompressedOops::decode_not_null(v); - uintptr_t u = cast_from_oop(o); - ArchiveHeapLoader::assert_in_loaded_heap(u); - guarantee(_table->contains(u), "must point to beginning of object in loaded archived region"); - } - } - virtual void do_oop(oop* p) { - oop v = *p; - if(v != nullptr) { - uintptr_t u = cast_from_oop(v); - ArchiveHeapLoader::assert_in_loaded_heap(u); - guarantee(_table->contains(u), "must point to beginning of object in loaded archived region"); - } - } -}; - -void ArchiveHeapLoader::finish_initialization() { - if (is_loaded()) { - // These operations are needed only when the heap is loaded (not mapped). - finish_loaded_heap(); - if (VerifyArchivedFields > 0) { - verify_loaded_heap(); - } - } - if (is_in_use()) { - patch_native_pointers(); - intptr_t bottom = is_loaded() ? _loaded_heap_bottom : _mapped_heap_bottom; - - // The heap roots are stored in one or more segments that are laid out consecutively. - // The size of each segment (except for the last one) is max_size_in_{elems,bytes}. - HeapRootSegments segments = FileMapInfo::current_info()->heap_root_segments(); - HeapShared::init_root_segment_sizes(segments.max_size_in_elems()); - intptr_t first_segment_addr = bottom + segments.base_offset(); - for (size_t c = 0; c < segments.count(); c++) { - oop segment_oop = cast_to_oop(first_segment_addr + (c * segments.max_size_in_bytes())); - assert(segment_oop->is_objArray(), "Must be"); - HeapShared::add_root_segment((objArrayOop)segment_oop); - } - } -} - -void ArchiveHeapLoader::finish_loaded_heap() { - HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; - HeapWord* top = (HeapWord*)_loaded_heap_top; - - MemRegion archive_space = MemRegion(bottom, top); - Universe::heap()->complete_loaded_archive_space(archive_space); -} - -void ArchiveHeapLoader::verify_loaded_heap() { - log_info(aot, heap)("Verify all oops and pointers in loaded heap"); - - ResourceMark rm; - HashTable table; - VerifyLoadedHeapEmbeddedPointers verifier(&table); - HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; - HeapWord* top = (HeapWord*)_loaded_heap_top; - - for (HeapWord* p = bottom; p < top; ) { - oop o = cast_to_oop(p); - table.put(cast_from_oop(o), true); - p += o->size(); - } - - for (HeapWord* p = bottom; p < top; ) { - oop o = cast_to_oop(p); - o->oop_iterate(&verifier); - p += o->size(); - } -} - -void ArchiveHeapLoader::fill_failed_loaded_heap() { - assert(_loading_failed, "must be"); - if (_loaded_heap_bottom != 0) { - assert(_loaded_heap_top != 0, "must be"); - HeapWord* bottom = (HeapWord*)_loaded_heap_bottom; - HeapWord* top = (HeapWord*)_loaded_heap_top; - Universe::heap()->fill_with_objects(bottom, top - bottom); - } -} - -class PatchNativePointers: public BitMapClosure { - Metadata** _start; - - public: - PatchNativePointers(Metadata** start) : _start(start) {} - - bool do_bit(size_t offset) { - Metadata** p = _start + offset; - *p = (Metadata*)(address(*p) + AOTMetaspace::relocation_delta()); - return true; - } -}; - -void ArchiveHeapLoader::patch_native_pointers() { - if (AOTMetaspace::relocation_delta() == 0) { - return; - } - - FileMapRegion* r = FileMapInfo::current_info()->region_at(AOTMetaspace::hp); - if (r->mapped_base() != nullptr && r->has_ptrmap()) { - log_info(aot, heap)("Patching native pointers in heap region"); - BitMapView bm = FileMapInfo::current_info()->ptrmap_view(AOTMetaspace::hp); - PatchNativePointers patcher((Metadata**)r->mapped_base() + FileMapInfo::current_info()->heap_ptrmap_start_pos()); - bm.iterate(&patcher); - } -} -#endif // INCLUDE_CDS_JAVA_HEAP diff --git a/src/hotspot/share/cds/archiveUtils.cpp b/src/hotspot/share/cds/archiveUtils.cpp index 43da3cf9da8..842668509cf 100644 --- a/src/hotspot/share/cds/archiveUtils.cpp +++ b/src/hotspot/share/cds/archiveUtils.cpp @@ -25,7 +25,6 @@ #include "cds/aotLogging.hpp" #include "cds/aotMetaspace.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.inline.hpp" #include "cds/archiveUtils.hpp" #include "cds/cdsConfig.hpp" #include "cds/classListParser.hpp" diff --git a/src/hotspot/share/cds/cdsConfig.cpp b/src/hotspot/share/cds/cdsConfig.cpp index a5d1f78b76f..7976f690b8b 100644 --- a/src/hotspot/share/cds/cdsConfig.cpp +++ b/src/hotspot/share/cds/cdsConfig.cpp @@ -24,11 +24,10 @@ #include "cds/aotLogging.hpp" #include "cds/aotMapLogger.hpp" -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsConfig.hpp" #include "cds/classListWriter.hpp" #include "cds/filemap.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoaderDataShared.hpp" #include "classfile/moduleEntry.hpp" #include "code/aotCodeCache.hpp" @@ -893,11 +892,6 @@ static const char* check_options_incompatible_with_dumping_heap() { return "UseCompressedClassPointers must be true"; } - // Almost all GCs support heap region dump, except ZGC (so far). - if (UseZGC) { - return "ZGC is not supported"; - } - return nullptr; #else return "JVM not configured for writing Java heap objects"; @@ -969,7 +963,7 @@ bool CDSConfig::is_dumping_heap() { } bool CDSConfig::is_loading_heap() { - return ArchiveHeapLoader::is_in_use(); + return HeapShared::is_archived_heap_in_use(); } bool CDSConfig::is_using_full_module_graph() { @@ -981,7 +975,7 @@ bool CDSConfig::is_using_full_module_graph() { return false; } - if (is_using_archive() && ArchiveHeapLoader::can_use()) { + if (is_using_archive() && HeapShared::can_use_archived_heap()) { // Classes used by the archived full module graph are loaded in JVMTI early phase. assert(!(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env()), "CDS should be disabled if early class hooks are enabled"); diff --git a/src/hotspot/share/cds/cdsEnumKlass.cpp b/src/hotspot/share/cds/cdsEnumKlass.cpp index f771eeec3d7..1bf6ba4eba8 100644 --- a/src/hotspot/share/cds/cdsEnumKlass.cpp +++ b/src/hotspot/share/cds/cdsEnumKlass.cpp @@ -22,9 +22,8 @@ * */ -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsEnumKlass.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/systemDictionaryShared.hpp" #include "classfile/vmClasses.hpp" #include "memory/resourceArea.hpp" @@ -109,7 +108,7 @@ void CDSEnumKlass::archive_static_field(int level, KlassSubGraphInfo* subgraph_i } bool CDSEnumKlass::initialize_enum_klass(InstanceKlass* k, TRAPS) { - if (!ArchiveHeapLoader::is_in_use()) { + if (!HeapShared::is_archived_heap_in_use()) { return false; } @@ -121,14 +120,14 @@ bool CDSEnumKlass::initialize_enum_klass(InstanceKlass* k, TRAPS) { log_info(aot, heap)("Initializing Enum class: %s", k->external_name()); } - oop mirror = k->java_mirror(); int i = 0; for (JavaFieldStream fs(k); !fs.done(); fs.next()) { if (fs.access_flags().is_static()) { int root_index = info->enum_klass_static_field_root_index_at(i++); fieldDescriptor& fd = fs.field_descriptor(); assert(fd.field_type() == T_OBJECT || fd.field_type() == T_ARRAY, "must be"); - mirror->obj_field_put(fd.offset(), HeapShared::get_root(root_index, /*clear=*/true)); + oop root_object = HeapShared::get_root(root_index, /*clear=*/true); + k->java_mirror()->obj_field_put(fd.offset(), root_object); } } return true; diff --git a/src/hotspot/share/cds/cdsHeapVerifier.cpp b/src/hotspot/share/cds/cdsHeapVerifier.cpp index 59c91c834d6..65063b4b005 100644 --- a/src/hotspot/share/cds/cdsHeapVerifier.cpp +++ b/src/hotspot/share/cds/cdsHeapVerifier.cpp @@ -28,6 +28,7 @@ #include "classfile/classLoaderDataGraph.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/moduleEntry.hpp" +#include "classfile/stringTable.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/systemDictionaryShared.hpp" @@ -386,7 +387,7 @@ inline bool CDSHeapVerifier::do_entry(OopHandle& orig_obj_handle, HeapShared::Ca if (java_lang_String::is_instance(orig_obj) && HeapShared::is_dumped_interned_string(orig_obj)) { // It's quite often for static fields to have interned strings. These are most likely not // problematic (and are hard to filter). So we will ignore them. - return true; /* keep on iterating */ + return true; } StaticFieldInfo* info = _table.get(orig_obj); diff --git a/src/hotspot/share/cds/cds_globals.hpp b/src/hotspot/share/cds/cds_globals.hpp index 3e3062097f9..447914b3101 100644 --- a/src/hotspot/share/cds/cds_globals.hpp +++ b/src/hotspot/share/cds/cds_globals.hpp @@ -76,6 +76,12 @@ "Dump the names all loaded classes, that could be stored into " \ "the CDS archive, in the specified file") \ \ + product(bool, AOTStreamableObjects, false, DIAGNOSTIC, \ + "Archive the Java heap in a generic streamable object format") \ + \ + product(bool, AOTEagerlyLoadObjects, false, DIAGNOSTIC, \ + "Load streamable objects synchronously without concurrency") \ + \ product(ccstr, SharedClassListFile, nullptr, \ "Override the default CDS class list") \ \ diff --git a/src/hotspot/share/cds/dynamicArchive.cpp b/src/hotspot/share/cds/dynamicArchive.cpp index 6fac1676b9f..85e59e23f8c 100644 --- a/src/hotspot/share/cds/dynamicArchive.cpp +++ b/src/hotspot/share/cds/dynamicArchive.cpp @@ -28,11 +28,11 @@ #include "cds/aotLogging.hpp" #include "cds/aotMetaspace.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/archiveUtils.inline.hpp" #include "cds/cds_globals.hpp" #include "cds/cdsConfig.hpp" #include "cds/dynamicArchive.hpp" +#include "cds/heapShared.hpp" #include "cds/lambdaFormInvokers.hpp" #include "cds/lambdaProxyClassDictionary.hpp" #include "cds/regeneratedClasses.hpp" @@ -353,8 +353,7 @@ void DynamicArchiveBuilder::write_archive(char* serialized_data, AOTClassLocatio assert(dynamic_info != nullptr, "Sanity"); dynamic_info->open_as_output(); - ArchiveHeapInfo no_heap_for_dynamic_dump; - ArchiveBuilder::write_archive(dynamic_info, &no_heap_for_dynamic_dump); + ArchiveBuilder::write_archive(dynamic_info, nullptr, nullptr); address base = _requested_dynamic_archive_bottom; address top = _requested_dynamic_archive_top; diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index b52861cecef..ae92ce31058 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -24,16 +24,16 @@ #include "cds/aotClassLocation.hpp" #include "cds/aotLogging.hpp" +#include "cds/aotMappedHeapLoader.hpp" +#include "cds/aotMappedHeapWriter.hpp" #include "cds/aotMetaspace.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.inline.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/archiveUtils.inline.hpp" #include "cds/cds_globals.hpp" #include "cds/cdsConfig.hpp" #include "cds/dynamicArchive.hpp" #include "cds/filemap.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/altHashing.hpp" #include "classfile/classFileStream.hpp" #include "classfile/classLoader.hpp" @@ -217,6 +217,7 @@ void FileMapHeader::populate(FileMapInfo *info, size_t core_region_alignment, _compact_strings = CompactStrings; _compact_headers = UseCompactObjectHeaders; if (CDSConfig::is_dumping_heap()) { + _object_streaming_mode = HeapShared::is_writing_streaming_mode(); _narrow_oop_mode = CompressedOops::mode(); _narrow_oop_base = CompressedOops::base(); _narrow_oop_shift = CompressedOops::shift(); @@ -283,40 +284,51 @@ void FileMapHeader::print(outputStream* st) { } st->print_cr("============ end regions ======== "); - st->print_cr("- core_region_alignment: %zu", _core_region_alignment); - st->print_cr("- obj_alignment: %d", _obj_alignment); - st->print_cr("- narrow_oop_base: " INTPTR_FORMAT, p2i(_narrow_oop_base)); - st->print_cr("- narrow_oop_shift %d", _narrow_oop_shift); - st->print_cr("- compact_strings: %d", _compact_strings); - st->print_cr("- compact_headers: %d", _compact_headers); - st->print_cr("- max_heap_size: %zu", _max_heap_size); - st->print_cr("- narrow_oop_mode: %d", _narrow_oop_mode); - st->print_cr("- compressed_oops: %d", _compressed_oops); - st->print_cr("- compressed_class_ptrs: %d", _compressed_class_ptrs); - st->print_cr("- narrow_klass_pointer_bits: %d", _narrow_klass_pointer_bits); - st->print_cr("- narrow_klass_shift: %d", _narrow_klass_shift); - st->print_cr("- cloned_vtables_offset: 0x%zx", _cloned_vtables_offset); - st->print_cr("- early_serialized_data_offset: 0x%zx", _early_serialized_data_offset); - st->print_cr("- serialized_data_offset: 0x%zx", _serialized_data_offset); - st->print_cr("- jvm_ident: %s", _jvm_ident); - st->print_cr("- class_location_config_offset: 0x%zx", _class_location_config_offset); - st->print_cr("- verify_local: %d", _verify_local); - st->print_cr("- verify_remote: %d", _verify_remote); - st->print_cr("- has_platform_or_app_classes: %d", _has_platform_or_app_classes); - st->print_cr("- requested_base_address: " INTPTR_FORMAT, p2i(_requested_base_address)); - st->print_cr("- mapped_base_address: " INTPTR_FORMAT, p2i(_mapped_base_address)); - st->print_cr("- heap_root_segments.roots_count: %d" , _heap_root_segments.roots_count()); - st->print_cr("- heap_root_segments.base_offset: 0x%zx", _heap_root_segments.base_offset()); - st->print_cr("- heap_root_segments.count: %zu", _heap_root_segments.count()); - st->print_cr("- heap_root_segments.max_size_elems: %d", _heap_root_segments.max_size_in_elems()); - st->print_cr("- heap_root_segments.max_size_bytes: %zu", _heap_root_segments.max_size_in_bytes()); - st->print_cr("- _heap_oopmap_start_pos: %zu", _heap_oopmap_start_pos); - st->print_cr("- _heap_ptrmap_start_pos: %zu", _heap_ptrmap_start_pos); - st->print_cr("- _rw_ptrmap_start_pos: %zu", _rw_ptrmap_start_pos); - st->print_cr("- _ro_ptrmap_start_pos: %zu", _ro_ptrmap_start_pos); - st->print_cr("- use_optimized_module_handling: %d", _use_optimized_module_handling); - st->print_cr("- has_full_module_graph %d", _has_full_module_graph); - st->print_cr("- has_aot_linked_classes %d", _has_aot_linked_classes); + st->print_cr("- core_region_alignment: %zu", _core_region_alignment); + st->print_cr("- obj_alignment: %d", _obj_alignment); + st->print_cr("- narrow_oop_base: " INTPTR_FORMAT, p2i(_narrow_oop_base)); + st->print_cr("- narrow_oop_shift %d", _narrow_oop_shift); + st->print_cr("- compact_strings: %d", _compact_strings); + st->print_cr("- compact_headers: %d", _compact_headers); + st->print_cr("- max_heap_size: %zu", _max_heap_size); + st->print_cr("- narrow_oop_mode: %d", _narrow_oop_mode); + st->print_cr("- compressed_oops: %d", _compressed_oops); + st->print_cr("- compressed_class_ptrs: %d", _compressed_class_ptrs); + st->print_cr("- narrow_klass_pointer_bits: %d", _narrow_klass_pointer_bits); + st->print_cr("- narrow_klass_shift: %d", _narrow_klass_shift); + st->print_cr("- cloned_vtables_offset: 0x%zx", _cloned_vtables_offset); + st->print_cr("- early_serialized_data_offset: 0x%zx", _early_serialized_data_offset); + st->print_cr("- serialized_data_offset: 0x%zx", _serialized_data_offset); + st->print_cr("- jvm_ident: %s", _jvm_ident); + st->print_cr("- class_location_config_offset: 0x%zx", _class_location_config_offset); + st->print_cr("- verify_local: %d", _verify_local); + st->print_cr("- verify_remote: %d", _verify_remote); + st->print_cr("- has_platform_or_app_classes: %d", _has_platform_or_app_classes); + st->print_cr("- requested_base_address: " INTPTR_FORMAT, p2i(_requested_base_address)); + st->print_cr("- mapped_base_address: " INTPTR_FORMAT, p2i(_mapped_base_address)); + + st->print_cr("- object_streaming_mode: %d", _object_streaming_mode); + st->print_cr("- mapped_heap_header"); + st->print_cr(" - root_segments"); + st->print_cr(" - roots_count: %d", _mapped_heap_header.root_segments().roots_count()); + st->print_cr(" - base_offset: 0x%zx", _mapped_heap_header.root_segments().base_offset()); + st->print_cr(" - count: %zu", _mapped_heap_header.root_segments().count()); + st->print_cr(" - max_size_elems: %d", _mapped_heap_header.root_segments().max_size_in_elems()); + st->print_cr(" - max_size_bytes: %zu", _mapped_heap_header.root_segments().max_size_in_bytes()); + st->print_cr(" - oopmap_start_pos: %zu", _mapped_heap_header.oopmap_start_pos()); + st->print_cr(" - oopmap_ptrmap_pos: %zu", _mapped_heap_header.ptrmap_start_pos()); + st->print_cr("- streamed_heap_header"); + st->print_cr(" - forwarding_offset: %zu", _streamed_heap_header.forwarding_offset()); + st->print_cr(" - roots_offset: %zu", _streamed_heap_header.roots_offset()); + st->print_cr(" - num_roots: %zu", _streamed_heap_header.num_roots()); + st->print_cr(" - root_highest_object_index_table_offset: %zu", _streamed_heap_header.root_highest_object_index_table_offset()); + st->print_cr(" - num_archived_objects: %zu", _streamed_heap_header.num_archived_objects()); + + st->print_cr("- _rw_ptrmap_start_pos: %zu", _rw_ptrmap_start_pos); + st->print_cr("- _ro_ptrmap_start_pos: %zu", _ro_ptrmap_start_pos); + st->print_cr("- use_optimized_module_handling: %d", _use_optimized_module_handling); + st->print_cr("- has_full_module_graph %d", _has_full_module_graph); + st->print_cr("- has_aot_linked_classes %d", _has_aot_linked_classes); } bool FileMapInfo::validate_class_location() { @@ -896,12 +908,14 @@ void FileMapInfo::write_region(int region, char* base, size_t size, assert(CDSConfig::is_dumping_heap(), "sanity"); #if INCLUDE_CDS_JAVA_HEAP assert(!CDSConfig::is_dumping_dynamic_archive(), "must be"); - requested_base = (char*)ArchiveHeapWriter::requested_address(); - if (UseCompressedOops) { - mapping_offset = (size_t)((address)requested_base - CompressedOops::base()); - assert((mapping_offset >> CompressedOops::shift()) << CompressedOops::shift() == mapping_offset, "must be"); + if (HeapShared::is_writing_mapping_mode()) { + requested_base = (char*)AOTMappedHeapWriter::requested_address(); + if (UseCompressedOops) { + mapping_offset = (size_t)((address)requested_base - CompressedOops::base()); + assert((mapping_offset >> CompressedOops::shift()) << CompressedOops::shift() == mapping_offset, "must be"); + } } else { - mapping_offset = 0; // not used with !UseCompressedOops + requested_base = nullptr; } #endif // INCLUDE_CDS_JAVA_HEAP } else { @@ -954,7 +968,10 @@ size_t FileMapInfo::remove_bitmap_zeros(CHeapBitMap* map) { return first_set; } -char* FileMapInfo::write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_ptrmap, ArchiveHeapInfo* heap_info, +char* FileMapInfo::write_bitmap_region(CHeapBitMap* rw_ptrmap, + CHeapBitMap* ro_ptrmap, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info, size_t &size_in_bytes) { size_t removed_rw_leading_zeros = remove_bitmap_zeros(rw_ptrmap); size_t removed_ro_leading_zeros = remove_bitmap_zeros(ro_ptrmap); @@ -962,22 +979,27 @@ char* FileMapInfo::write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_p header()->set_ro_ptrmap_start_pos(removed_ro_leading_zeros); size_in_bytes = rw_ptrmap->size_in_bytes() + ro_ptrmap->size_in_bytes(); - if (heap_info->is_used()) { + if (mapped_heap_info != nullptr && mapped_heap_info->is_used()) { // Remove leading and trailing zeros - size_t removed_oop_leading_zeros = remove_bitmap_zeros(heap_info->oopmap()); - size_t removed_ptr_leading_zeros = remove_bitmap_zeros(heap_info->ptrmap()); - header()->set_heap_oopmap_start_pos(removed_oop_leading_zeros); - header()->set_heap_ptrmap_start_pos(removed_ptr_leading_zeros); + assert(HeapShared::is_writing_mapping_mode(), "unexpected dumping mode"); + size_t removed_oop_leading_zeros = remove_bitmap_zeros(mapped_heap_info->oopmap()); + size_t removed_ptr_leading_zeros = remove_bitmap_zeros(mapped_heap_info->ptrmap()); + mapped_heap_info->set_oopmap_start_pos(removed_oop_leading_zeros); + mapped_heap_info->set_ptrmap_start_pos(removed_ptr_leading_zeros); - size_in_bytes += heap_info->oopmap()->size_in_bytes(); - size_in_bytes += heap_info->ptrmap()->size_in_bytes(); + size_in_bytes += mapped_heap_info->oopmap()->size_in_bytes(); + size_in_bytes += mapped_heap_info->ptrmap()->size_in_bytes(); + } else if (streamed_heap_info != nullptr && streamed_heap_info->is_used()) { + assert(HeapShared::is_writing_streaming_mode(), "unexpected dumping mode"); + + size_in_bytes += streamed_heap_info->oopmap()->size_in_bytes(); } // The bitmap region contains up to 4 parts: - // rw_ptrmap: metaspace pointers inside the read-write region - // ro_ptrmap: metaspace pointers inside the read-only region - // heap_info->oopmap(): Java oop pointers in the heap region - // heap_info->ptrmap(): metaspace pointers in the heap region + // rw_ptrmap: metaspace pointers inside the read-write region + // ro_ptrmap: metaspace pointers inside the read-only region + // *_heap_info->oopmap(): Java oop pointers in the heap region + // mapped_heap_info->ptrmap(): metaspace pointers in the heap region char* buffer = NEW_C_HEAP_ARRAY(char, size_in_bytes, mtClassShared); size_t written = 0; @@ -987,28 +1009,45 @@ char* FileMapInfo::write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_p region_at(AOTMetaspace::ro)->init_ptrmap(written, ro_ptrmap->size()); written = write_bitmap(ro_ptrmap, buffer, written); - if (heap_info->is_used()) { + if (mapped_heap_info != nullptr && mapped_heap_info->is_used()) { + assert(HeapShared::is_writing_mapping_mode(), "unexpected dumping mode"); FileMapRegion* r = region_at(AOTMetaspace::hp); - r->init_oopmap(written, heap_info->oopmap()->size()); - written = write_bitmap(heap_info->oopmap(), buffer, written); + r->init_oopmap(written, mapped_heap_info->oopmap()->size()); + written = write_bitmap(mapped_heap_info->oopmap(), buffer, written); - r->init_ptrmap(written, heap_info->ptrmap()->size()); - written = write_bitmap(heap_info->ptrmap(), buffer, written); + r->init_ptrmap(written, mapped_heap_info->ptrmap()->size()); + written = write_bitmap(mapped_heap_info->ptrmap(), buffer, written); + } else if (streamed_heap_info != nullptr && streamed_heap_info->is_used()) { + assert(HeapShared::is_writing_streaming_mode(), "unexpected dumping mode"); + FileMapRegion* r = region_at(AOTMetaspace::hp); + + r->init_oopmap(written, streamed_heap_info->oopmap()->size()); + written = write_bitmap(streamed_heap_info->oopmap(), buffer, written); } write_region(AOTMetaspace::bm, (char*)buffer, size_in_bytes, /*read_only=*/true, /*allow_exec=*/false); return buffer; } -size_t FileMapInfo::write_heap_region(ArchiveHeapInfo* heap_info) { +#if INCLUDE_CDS_JAVA_HEAP +size_t FileMapInfo::write_mapped_heap_region(ArchiveMappedHeapInfo* heap_info) { char* buffer_start = heap_info->buffer_start(); size_t buffer_size = heap_info->buffer_byte_size(); write_region(AOTMetaspace::hp, buffer_start, buffer_size, false, false); - header()->set_heap_root_segments(heap_info->heap_root_segments()); + header()->set_mapped_heap_header(heap_info->create_header()); return buffer_size; } +size_t FileMapInfo::write_streamed_heap_region(ArchiveStreamedHeapInfo* heap_info) { + char* buffer_start = heap_info->buffer_start(); + size_t buffer_size = heap_info->buffer_byte_size(); + write_region(AOTMetaspace::hp, buffer_start, buffer_size, true, false); + header()->set_streamed_heap_header(heap_info->create_header()); + return buffer_size; +} +#endif // INCLUDE_CDS_JAVA_HEAP + // Dump bytes to file -- at the current file position. void FileMapInfo::write_bytes(const void* buffer, size_t nbytes) { @@ -1076,7 +1115,7 @@ void FileMapInfo::close() { * Same as os::map_memory() but also pretouches if AlwaysPreTouch is enabled. */ static char* map_memory(int fd, const char* file_name, size_t file_offset, - char *addr, size_t bytes, bool read_only, + char* addr, size_t bytes, bool read_only, bool allow_exec, MemTag mem_tag) { char* mem = os::map_memory(fd, file_name, file_offset, addr, bytes, mem_tag, AlwaysPreTouch ? false : read_only, @@ -1087,6 +1126,17 @@ static char* map_memory(int fd, const char* file_name, size_t file_offset, return mem; } +char* FileMapInfo::map_heap_region(FileMapRegion* r, char* addr, size_t bytes) { + return ::map_memory(_fd, + _full_path, + r->file_offset(), + addr, + bytes, + r->read_only(), + r->allow_exec(), + mtJavaHeap); +} + // JVM/TI RedefineClasses() support: // Remap the shared readonly space to shared readwrite, private. bool FileMapInfo::remap_shared_readonly_as_readwrite() { @@ -1254,35 +1304,40 @@ MapArchiveResult FileMapInfo::map_region(int i, intx addr_delta, char* mapped_ba } // The return value is the location of the archive relocation bitmap. -char* FileMapInfo::map_bitmap_region() { - FileMapRegion* r = region_at(AOTMetaspace::bm); +char* FileMapInfo::map_auxiliary_region(int region_index, bool read_only) { + FileMapRegion* r = region_at(region_index); if (r->mapped_base() != nullptr) { return r->mapped_base(); } - bool read_only = true, allow_exec = false; + const char* region_name = shared_region_name[region_index]; + bool allow_exec = false; char* requested_addr = nullptr; // allow OS to pick any location - char* bitmap_base = map_memory(_fd, _full_path, r->file_offset(), + char* mapped_base = map_memory(_fd, _full_path, r->file_offset(), requested_addr, r->used_aligned(), read_only, allow_exec, mtClassShared); - if (bitmap_base == nullptr) { - AOTMetaspace::report_loading_error("failed to map relocation bitmap"); + if (mapped_base == nullptr) { + AOTMetaspace::report_loading_error("failed to map %d region", region_index); return nullptr; } - if (VerifySharedSpaces && !r->check_region_crc(bitmap_base)) { - aot_log_error(aot)("relocation bitmap CRC error"); - if (!os::unmap_memory(bitmap_base, r->used_aligned())) { - fatal("os::unmap_memory of relocation bitmap failed"); + if (VerifySharedSpaces && !r->check_region_crc(mapped_base)) { + aot_log_error(aot)("region %d CRC error", region_index); + if (!os::unmap_memory(mapped_base, r->used_aligned())) { + fatal("os::unmap_memory of region %d failed", region_index); } return nullptr; } r->set_mapped_from_file(true); - r->set_mapped_base(bitmap_base); - aot_log_info(aot)("Mapped %s region #%d at base " INTPTR_FORMAT " top " INTPTR_FORMAT " (%s)", + r->set_mapped_base(mapped_base); + aot_log_info(aot)("Mapped %s region #%d at base %zu top %zu (%s)", is_static() ? "static " : "dynamic", - AOTMetaspace::bm, p2i(r->mapped_base()), p2i(r->mapped_end()), - shared_region_name[AOTMetaspace::bm]); - return bitmap_base; + region_index, p2i(r->mapped_base()), p2i(r->mapped_end()), + region_name); + return mapped_base; +} + +char* FileMapInfo::map_bitmap_region() { + return map_auxiliary_region(AOTMetaspace::bm, false); } bool FileMapInfo::map_aot_code_region(ReservedSpace rs) { @@ -1429,59 +1484,48 @@ size_t FileMapInfo::readonly_total() { } #if INCLUDE_CDS_JAVA_HEAP -MemRegion FileMapInfo::_mapped_heap_memregion; bool FileMapInfo::has_heap_region() { return (region_at(AOTMetaspace::hp)->used() > 0); } -// Returns the address range of the archived heap region computed using the -// current oop encoding mode. This range may be different than the one seen at -// dump time due to encoding mode differences. The result is used in determining -// if/how these regions should be relocated at run time. -MemRegion FileMapInfo::get_heap_region_requested_range() { - FileMapRegion* r = region_at(AOTMetaspace::hp); - size_t size = r->used(); - assert(size > 0, "must have non-empty heap region"); +static void on_heap_region_loading_error() { + if (CDSConfig::is_using_aot_linked_classes()) { + // It's too late to recover -- we have already committed to use the archived metaspace objects, but + // the archived heap objects cannot be loaded, so we don't have the archived FMG to guarantee that + // all AOT-linked classes are visible. + // + // We get here because the heap is too small. The app will fail anyway. So let's quit. + aot_log_error(aot)("%s has aot-linked classes but the archived " + "heap objects cannot be loaded. Try increasing your heap size.", + CDSConfig::type_of_archive_being_loaded()); + AOTMetaspace::unrecoverable_loading_error(); + } + CDSConfig::stop_using_full_module_graph(); +} - address start = heap_region_requested_address(); - address end = start + size; - aot_log_info(aot)("Requested heap region [" INTPTR_FORMAT " - " INTPTR_FORMAT "] = %8zu bytes", - p2i(start), p2i(end), size); +void FileMapInfo::stream_heap_region() { + assert(object_streaming_mode(), "This should only be done for the streaming approach"); - return MemRegion((HeapWord*)start, (HeapWord*)end); + if (map_auxiliary_region(AOTMetaspace::hp, /*readonly=*/true) != nullptr) { + HeapShared::initialize_streaming(); + } else { + on_heap_region_loading_error(); + } } void FileMapInfo::map_or_load_heap_region() { + assert(!object_streaming_mode(), "This should only be done for the mapping approach"); bool success = false; - if (can_use_heap_region()) { - if (ArchiveHeapLoader::can_map()) { - success = map_heap_region(); - } else if (ArchiveHeapLoader::can_load()) { - success = ArchiveHeapLoader::load_heap_region(this); - } else { - if (!UseCompressedOops && !ArchiveHeapLoader::can_map()) { - AOTMetaspace::report_loading_error("Cannot use CDS heap data. Selected GC not compatible -XX:-UseCompressedOops"); - } else { - AOTMetaspace::report_loading_error("Cannot use CDS heap data. UseEpsilonGC, UseG1GC, UseSerialGC, UseParallelGC, or UseShenandoahGC are required."); - } - } + if (AOTMappedHeapLoader::can_map()) { + success = AOTMappedHeapLoader::map_heap_region(this); + } else if (AOTMappedHeapLoader::can_load()) { + success = AOTMappedHeapLoader::load_heap_region(this); } if (!success) { - if (CDSConfig::is_using_aot_linked_classes()) { - // It's too late to recover -- we have already committed to use the archived metaspace objects, but - // the archived heap objects cannot be loaded, so we don't have the archived FMG to guarantee that - // all AOT-linked classes are visible. - // - // We get here because the heap is too small. The app will fail anyway. So let's quit. - aot_log_error(aot)("%s has aot-linked classes but the archived " - "heap objects cannot be loaded. Try increasing your heap size.", - CDSConfig::type_of_archive_being_loaded()); - AOTMetaspace::unrecoverable_loading_error(); - } - CDSConfig::stop_using_full_module_graph("archive heap loading failed"); + on_heap_region_loading_error(); } } @@ -1489,6 +1533,10 @@ bool FileMapInfo::can_use_heap_region() { if (!has_heap_region()) { return false; } + if (!object_streaming_mode() && !Universe::heap()->can_load_archived_objects() && !UseG1GC) { + // Incompatible object format + return false; + } if (JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env()) { ShouldNotReachHere(); // CDS should have been disabled. // The archived objects are mapped at JVM start-up, but we don't know if @@ -1503,7 +1551,7 @@ bool FileMapInfo::can_use_heap_region() { } // We pre-compute narrow Klass IDs with the runtime mapping start intended to be the base, and a shift of - // ArchiveBuilder::precomputed_narrow_klass_shift. We enforce this encoding at runtime (see + // HeapShared::precomputed_narrow_klass_shift. We enforce this encoding at runtime (see // CompressedKlassPointers::initialize_for_given_encoding()). Therefore, the following assertions must // hold: address archive_narrow_klass_base = (address)header()->mapped_base_address(); @@ -1512,21 +1560,28 @@ bool FileMapInfo::can_use_heap_region() { aot_log_info(aot)("CDS archive was created with max heap size = %zuM, and the following configuration:", max_heap_size()/M); + aot_log_info(aot)(" narrow_klass_base at mapping start address, narrow_klass_pointer_bits = %d, narrow_klass_shift = %d", archive_narrow_klass_pointer_bits, archive_narrow_klass_shift); - aot_log_info(aot)(" narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d", - narrow_oop_mode(), p2i(narrow_oop_base()), narrow_oop_shift()); + if (UseCompressedOops) { + aot_log_info(aot)(" narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d", + narrow_oop_mode(), p2i(narrow_oop_base()), narrow_oop_shift()); + } aot_log_info(aot)("The current max heap size = %zuM, G1HeapRegion::GrainBytes = %zu", MaxHeapSize/M, G1HeapRegion::GrainBytes); aot_log_info(aot)(" narrow_klass_base = " PTR_FORMAT ", arrow_klass_pointer_bits = %d, narrow_klass_shift = %d", p2i(CompressedKlassPointers::base()), CompressedKlassPointers::narrow_klass_pointer_bits(), CompressedKlassPointers::shift()); - aot_log_info(aot)(" narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d", - CompressedOops::mode(), p2i(CompressedOops::base()), CompressedOops::shift()); - aot_log_info(aot)(" heap range = [" PTR_FORMAT " - " PTR_FORMAT "]", - UseCompressedOops ? p2i(CompressedOops::begin()) : - UseG1GC ? p2i((address)G1CollectedHeap::heap()->reserved().start()) : 0L, - UseCompressedOops ? p2i(CompressedOops::end()) : - UseG1GC ? p2i((address)G1CollectedHeap::heap()->reserved().end()) : 0L); + if (UseCompressedOops) { + aot_log_info(aot)(" narrow_oop_mode = %d, narrow_oop_base = " PTR_FORMAT ", narrow_oop_shift = %d", + CompressedOops::mode(), p2i(CompressedOops::base()), CompressedOops::shift()); + } + if (!object_streaming_mode()) { + aot_log_info(aot)(" heap range = [" PTR_FORMAT " - " PTR_FORMAT "]", + UseCompressedOops ? p2i(CompressedOops::begin()) : + UseG1GC ? p2i((address)G1CollectedHeap::heap()->reserved().start()) : 0L, + UseCompressedOops ? p2i(CompressedOops::end()) : + UseG1GC ? p2i((address)G1CollectedHeap::heap()->reserved().end()) : 0L); + } int err = 0; if ( archive_narrow_klass_base != CompressedKlassPointers::base() || @@ -1570,204 +1625,10 @@ bool FileMapInfo::can_use_heap_region() { return true; } -// The actual address of this region during dump time. -address FileMapInfo::heap_region_dumptime_address() { - FileMapRegion* r = region_at(AOTMetaspace::hp); - assert(CDSConfig::is_using_archive(), "runtime only"); - assert(is_aligned(r->mapping_offset(), sizeof(HeapWord)), "must be"); - if (UseCompressedOops) { - return /*dumptime*/ (address)((uintptr_t)narrow_oop_base() + r->mapping_offset()); - } else { - return heap_region_requested_address(); - } -} - -// The address where this region can be mapped into the runtime heap without -// patching any of the pointers that are embedded in this region. -address FileMapInfo::heap_region_requested_address() { - assert(CDSConfig::is_using_archive(), "runtime only"); - FileMapRegion* r = region_at(AOTMetaspace::hp); - assert(is_aligned(r->mapping_offset(), sizeof(HeapWord)), "must be"); - assert(ArchiveHeapLoader::can_use(), "GC must support mapping or loading"); - if (UseCompressedOops) { - // We can avoid relocation if each region's offset from the runtime CompressedOops::base() - // is the same as its offset from the CompressedOops::base() during dumptime. - // Note that CompressedOops::base() may be different between dumptime and runtime. - // - // Example: - // Dumptime base = 0x1000 and shift is 0. We have a region at address 0x2000. There's a - // narrowOop P stored in this region that points to an object at address 0x2200. - // P's encoded value is 0x1200. - // - // Runtime base = 0x4000 and shift is also 0. If we map this region at 0x5000, then - // the value P can remain 0x1200. The decoded address = (0x4000 + (0x1200 << 0)) = 0x5200, - // which is the runtime location of the referenced object. - return /*runtime*/ (address)((uintptr_t)CompressedOops::base() + r->mapping_offset()); - } else { - // This was the hard-coded requested base address used at dump time. With uncompressed oops, - // the heap range is assigned by the OS so we will most likely have to relocate anyway, no matter - // what base address was picked at duump time. - return (address)ArchiveHeapWriter::NOCOOPS_REQUESTED_BASE; - } -} - -bool FileMapInfo::map_heap_region() { - if (map_heap_region_impl()) { -#ifdef ASSERT - // The "old" regions must be parsable -- we cannot have any unused space - // at the start of the lowest G1 region that contains archived objects. - assert(is_aligned(_mapped_heap_memregion.start(), G1HeapRegion::GrainBytes), "must be"); - - // Make sure we map at the very top of the heap - see comments in - // init_heap_region_relocation(). - MemRegion heap_range = G1CollectedHeap::heap()->reserved(); - assert(heap_range.contains(_mapped_heap_memregion), "must be"); - - address heap_end = (address)heap_range.end(); - address mapped_heap_region_end = (address)_mapped_heap_memregion.end(); - assert(heap_end >= mapped_heap_region_end, "must be"); - assert(heap_end - mapped_heap_region_end < (intx)(G1HeapRegion::GrainBytes), - "must be at the top of the heap to avoid fragmentation"); -#endif - - ArchiveHeapLoader::set_mapped(); - return true; - } else { - return false; - } -} - -bool FileMapInfo::map_heap_region_impl() { - assert(UseG1GC, "the following code assumes G1"); - - FileMapRegion* r = region_at(AOTMetaspace::hp); - size_t size = r->used(); - if (size == 0) { - return false; // no archived java heap data - } - - size_t word_size = size / HeapWordSize; - address requested_start = heap_region_requested_address(); - - aot_log_info(aot)("Preferred address to map heap data (to avoid relocation) is " INTPTR_FORMAT, p2i(requested_start)); - - // allocate from java heap - HeapWord* start = G1CollectedHeap::heap()->alloc_archive_region(word_size, (HeapWord*)requested_start); - if (start == nullptr) { - AOTMetaspace::report_loading_error("UseSharedSpaces: Unable to allocate java heap region for archive heap."); - return false; - } - - _mapped_heap_memregion = MemRegion(start, word_size); - - // Map the archived heap data. No need to call MemTracker::record_virtual_memory_tag() - // for mapped region as it is part of the reserved java heap, which is already recorded. - char* addr = (char*)_mapped_heap_memregion.start(); - char* base; - - if (AOTMetaspace::use_windows_memory_mapping() || UseLargePages) { - // With UseLargePages, memory mapping may fail on some OSes if the size is not - // large page aligned, so let's use read() instead. In this case, the memory region - // is already commited by G1 so we don't need to commit it again. - if (!read_region(AOTMetaspace::hp, addr, - align_up(_mapped_heap_memregion.byte_size(), os::vm_page_size()), - /* do_commit = */ !UseLargePages)) { - dealloc_heap_region(); - aot_log_error(aot)("Failed to read archived heap region into " INTPTR_FORMAT, p2i(addr)); - return false; - } - // Checks for VerifySharedSpaces is already done inside read_region() - base = addr; - } else { - base = map_memory(_fd, _full_path, r->file_offset(), - addr, _mapped_heap_memregion.byte_size(), r->read_only(), - r->allow_exec(), mtJavaHeap); - if (base == nullptr || base != addr) { - dealloc_heap_region(); - AOTMetaspace::report_loading_error("UseSharedSpaces: Unable to map at required address in java heap. " - INTPTR_FORMAT ", size = %zu bytes", - p2i(addr), _mapped_heap_memregion.byte_size()); - return false; - } - - if (VerifySharedSpaces && !r->check_region_crc(base)) { - dealloc_heap_region(); - AOTMetaspace::report_loading_error("UseSharedSpaces: mapped heap region is corrupt"); - return false; - } - } - - r->set_mapped_base(base); - - // If the requested range is different from the range allocated by GC, then - // the pointers need to be patched. - address mapped_start = (address) _mapped_heap_memregion.start(); - ptrdiff_t delta = mapped_start - requested_start; - if (UseCompressedOops && - (narrow_oop_mode() != CompressedOops::mode() || - narrow_oop_shift() != CompressedOops::shift())) { - _heap_pointers_need_patching = true; - } - if (delta != 0) { - _heap_pointers_need_patching = true; - } - ArchiveHeapLoader::init_mapped_heap_info(mapped_start, delta, narrow_oop_shift()); - - if (_heap_pointers_need_patching) { - char* bitmap_base = map_bitmap_region(); - if (bitmap_base == nullptr) { - AOTMetaspace::report_loading_error("CDS heap cannot be used because bitmap region cannot be mapped"); - dealloc_heap_region(); - _heap_pointers_need_patching = false; - return false; - } - } - aot_log_info(aot)("Heap data mapped at " INTPTR_FORMAT ", size = %8zu bytes", - p2i(mapped_start), _mapped_heap_memregion.byte_size()); - aot_log_info(aot)("CDS heap data relocation delta = %zd bytes", delta); - return true; -} - -narrowOop FileMapInfo::encoded_heap_region_dumptime_address() { - assert(CDSConfig::is_using_archive(), "runtime only"); - assert(UseCompressedOops, "sanity"); - FileMapRegion* r = region_at(AOTMetaspace::hp); - return CompressedOops::narrow_oop_cast(r->mapping_offset() >> narrow_oop_shift()); -} - -void FileMapInfo::patch_heap_embedded_pointers() { - if (!ArchiveHeapLoader::is_mapped() || !_heap_pointers_need_patching) { - return; - } - - char* bitmap_base = map_bitmap_region(); - assert(bitmap_base != nullptr, "must have already been mapped"); - - FileMapRegion* r = region_at(AOTMetaspace::hp); - ArchiveHeapLoader::patch_embedded_pointers( - this, _mapped_heap_memregion, - (address)(region_at(AOTMetaspace::bm)->mapped_base()) + r->oopmap_offset(), - r->oopmap_size_in_bits()); -} - -void FileMapInfo::fixup_mapped_heap_region() { - if (ArchiveHeapLoader::is_mapped()) { - assert(!_mapped_heap_memregion.is_empty(), "sanity"); - - // Populate the archive regions' G1BlockOffsetTables. That ensures - // fast G1BlockOffsetTable::block_start operations for any given address - // within the archive regions when trying to find start of an object - // (e.g. during card table scanning). - G1CollectedHeap::heap()->populate_archive_regions_bot(_mapped_heap_memregion); - } -} - -// dealloc the archive regions from java heap -void FileMapInfo::dealloc_heap_region() { - G1CollectedHeap::heap()->dealloc_archive_regions(_mapped_heap_memregion); -} #endif // INCLUDE_CDS_JAVA_HEAP +// Unmap a memory region in the address space. + void FileMapInfo::unmap_regions(int regions[], int num_regions) { for (int r = 0; r < num_regions; r++) { int idx = regions[r]; @@ -1775,8 +1636,6 @@ void FileMapInfo::unmap_regions(int regions[], int num_regions) { } } -// Unmap a memory region in the address space. - void FileMapInfo::unmap_region(int i) { FileMapRegion* r = region_at(i); char* mapped_base = r->mapped_base(); @@ -1808,7 +1667,6 @@ void FileMapInfo::assert_mark(bool check) { FileMapInfo* FileMapInfo::_current_info = nullptr; FileMapInfo* FileMapInfo::_dynamic_archive_info = nullptr; -bool FileMapInfo::_heap_pointers_need_patching = false; bool FileMapInfo::_memory_mapping_failed = false; // Open the shared archive file, read and validate the header diff --git a/src/hotspot/share/cds/filemap.hpp b/src/hotspot/share/cds/filemap.hpp index a58271eefc7..b97b46a7c26 100644 --- a/src/hotspot/share/cds/filemap.hpp +++ b/src/hotspot/share/cds/filemap.hpp @@ -27,12 +27,14 @@ #include "cds/aotMetaspace.hpp" #include "cds/archiveUtils.hpp" +#include "cds/heapShared.hpp" #include "include/cds.h" #include "logging/logLevel.hpp" #include "memory/allocation.hpp" #include "oops/array.hpp" #include "oops/compressedOops.hpp" #include "utilities/align.hpp" +#include "utilities/bitMap.hpp" // To understand the layout of the CDS archive file: // @@ -43,7 +45,6 @@ static const int JVM_IDENT_MAX = 256; class AOTClassLocationConfig; -class ArchiveHeapInfo; class BitMapView; class CHeapBitMap; class ClassFileStream; @@ -114,6 +115,7 @@ private: bool _compact_headers; // value of UseCompactObjectHeaders uintx _max_heap_size; // java max heap size during dumping CompressedOops::Mode _narrow_oop_mode; // compressed oop encoding mode + bool _object_streaming_mode; // dump was created for object streaming bool _compressed_oops; // save the flag UseCompressedOops bool _compressed_class_ptrs; // save the flag UseCompressedClassPointers int _narrow_klass_pointer_bits; // save number of bits in narrowKlass @@ -139,12 +141,12 @@ private: // some expensive operations. bool _has_aot_linked_classes; // Was the CDS archive created with -XX:+AOTClassLinking bool _has_full_module_graph; // Does this CDS archive contain the full archived module graph? - HeapRootSegments _heap_root_segments; // Heap root segments info - size_t _heap_oopmap_start_pos; // The first bit in the oopmap corresponds to this position in the heap. - size_t _heap_ptrmap_start_pos; // The first bit in the ptrmap corresponds to this position in the heap. size_t _rw_ptrmap_start_pos; // The first bit in the ptrmap corresponds to this position in the rw region size_t _ro_ptrmap_start_pos; // The first bit in the ptrmap corresponds to this position in the ro region + ArchiveMappedHeapHeader _mapped_heap_header; + ArchiveStreamedHeapHeader _streamed_heap_header; + // The following are parameters that affect MethodData layout. u1 _compiler_type; uint _type_profile_level; @@ -192,6 +194,7 @@ public: char* cloned_vtables() const { return from_mapped_offset(_cloned_vtables_offset); } char* early_serialized_data() const { return from_mapped_offset(_early_serialized_data_offset); } char* serialized_data() const { return from_mapped_offset(_serialized_data_offset); } + bool object_streaming_mode() const { return _object_streaming_mode; } const char* jvm_ident() const { return _jvm_ident; } char* requested_base_address() const { return _requested_base_address; } char* mapped_base_address() const { return _mapped_base_address; } @@ -201,23 +204,25 @@ public: bool compressed_class_pointers() const { return _compressed_class_ptrs; } int narrow_klass_pointer_bits() const { return _narrow_klass_pointer_bits; } int narrow_klass_shift() const { return _narrow_klass_shift; } - HeapRootSegments heap_root_segments() const { return _heap_root_segments; } bool has_full_module_graph() const { return _has_full_module_graph; } - size_t heap_oopmap_start_pos() const { return _heap_oopmap_start_pos; } - size_t heap_ptrmap_start_pos() const { return _heap_ptrmap_start_pos; } size_t rw_ptrmap_start_pos() const { return _rw_ptrmap_start_pos; } size_t ro_ptrmap_start_pos() const { return _ro_ptrmap_start_pos; } + // Heap archiving + const ArchiveMappedHeapHeader* mapped_heap() const { return &_mapped_heap_header; } + const ArchiveStreamedHeapHeader* streamed_heap() const { return &_streamed_heap_header; } + + void set_streamed_heap_header(ArchiveStreamedHeapHeader header) { _streamed_heap_header = header; } + void set_mapped_heap_header(ArchiveMappedHeapHeader header) { _mapped_heap_header = header; } + void set_has_platform_or_app_classes(bool v) { _has_platform_or_app_classes = v; } void set_cloned_vtables(char* p) { set_as_offset(p, &_cloned_vtables_offset); } void set_early_serialized_data(char* p) { set_as_offset(p, &_early_serialized_data_offset); } void set_serialized_data(char* p) { set_as_offset(p, &_serialized_data_offset); } void set_mapped_base_address(char* p) { _mapped_base_address = p; } - void set_heap_root_segments(HeapRootSegments segments) { _heap_root_segments = segments; } - void set_heap_oopmap_start_pos(size_t n) { _heap_oopmap_start_pos = n; } - void set_heap_ptrmap_start_pos(size_t n) { _heap_ptrmap_start_pos = n; } void set_rw_ptrmap_start_pos(size_t n) { _rw_ptrmap_start_pos = n; } void set_ro_ptrmap_start_pos(size_t n) { _ro_ptrmap_start_pos = n; } + void copy_base_archive_name(const char* name); void set_class_location_config(AOTClassLocationConfig* table) { @@ -273,7 +278,6 @@ private: static FileMapInfo* _current_info; static FileMapInfo* _dynamic_archive_info; - static bool _heap_pointers_need_patching; static bool _memory_mapping_failed; public: @@ -303,11 +307,12 @@ public: address narrow_oop_base() const { return header()->narrow_oop_base(); } int narrow_oop_shift() const { return header()->narrow_oop_shift(); } uintx max_heap_size() const { return header()->max_heap_size(); } - HeapRootSegments heap_root_segments() const { return header()->heap_root_segments(); } size_t core_region_alignment() const { return header()->core_region_alignment(); } - size_t heap_oopmap_start_pos() const { return header()->heap_oopmap_start_pos(); } - size_t heap_ptrmap_start_pos() const { return header()->heap_ptrmap_start_pos(); } + const ArchiveMappedHeapHeader* mapped_heap() const { return header()->mapped_heap(); } + const ArchiveStreamedHeapHeader* streamed_heap() const { return header()->streamed_heap(); } + + bool object_streaming_mode() const { return header()->object_streaming_mode(); } CompressedOops::Mode narrow_oop_mode() const { return header()->narrow_oop_mode(); } char* cloned_vtables() const { return header()->cloned_vtables(); } @@ -324,6 +329,7 @@ public: bool is_mapped() const { return _is_mapped; } void set_is_mapped(bool v) { _is_mapped = v; } const char* full_path() const { return _full_path; } + char* map_heap_region(FileMapRegion* r, char* addr, size_t bytes); void set_requested_base(char* b) { header()->set_requested_base(b); } char* requested_base_address() const { return header()->requested_base_address(); } @@ -363,23 +369,29 @@ public: void write_region(int region, char* base, size_t size, bool read_only, bool allow_exec); size_t remove_bitmap_zeros(CHeapBitMap* map); - char* write_bitmap_region(CHeapBitMap* rw_ptrmap, CHeapBitMap* ro_ptrmap, ArchiveHeapInfo* heap_info, + char* write_bitmap_region(CHeapBitMap* rw_ptrmap, + CHeapBitMap* ro_ptrmap, + ArchiveMappedHeapInfo* mapped_heap_info, + ArchiveStreamedHeapInfo* streamed_heap_info, size_t &size_in_bytes); - size_t write_heap_region(ArchiveHeapInfo* heap_info); + size_t write_mapped_heap_region(ArchiveMappedHeapInfo* heap_info) NOT_CDS_JAVA_HEAP_RETURN_(0); + size_t write_streamed_heap_region(ArchiveStreamedHeapInfo* heap_info) NOT_CDS_JAVA_HEAP_RETURN_(0); void write_bytes(const void* buffer, size_t count); void write_bytes_aligned(const void* buffer, size_t count); size_t read_bytes(void* buffer, size_t count); static size_t readonly_total(); MapArchiveResult map_regions(int regions[], int num_regions, char* mapped_base_address, ReservedSpace rs); void unmap_regions(int regions[], int num_regions); + + // Object loading support + void stream_heap_region() NOT_CDS_JAVA_HEAP_RETURN; void map_or_load_heap_region() NOT_CDS_JAVA_HEAP_RETURN; - void fixup_mapped_heap_region() NOT_CDS_JAVA_HEAP_RETURN; - void patch_heap_embedded_pointers() NOT_CDS_JAVA_HEAP_RETURN; + bool has_heap_region() NOT_CDS_JAVA_HEAP_RETURN_(false); - MemRegion get_heap_region_requested_range() NOT_CDS_JAVA_HEAP_RETURN_(MemRegion()); bool read_region(int i, char* base, size_t size, bool do_commit); char* map_bitmap_region(); bool map_aot_code_region(ReservedSpace rs); + char* map_forwarding_region(); void unmap_region(int i); void close(); bool is_open() { return _file_open; } @@ -434,25 +446,17 @@ public: const char* vm_version() { return header()->jvm_ident(); } + bool can_use_heap_region(); private: bool open_for_read(); void seek_to_position(size_t pos); - bool map_heap_region_impl() NOT_CDS_JAVA_HEAP_RETURN_(false); - void dealloc_heap_region() NOT_CDS_JAVA_HEAP_RETURN; - bool can_use_heap_region(); - bool load_heap_region() NOT_CDS_JAVA_HEAP_RETURN_(false); - bool map_heap_region() NOT_CDS_JAVA_HEAP_RETURN_(false); - void init_heap_region_relocation(); + MapArchiveResult map_region(int i, intx addr_delta, char* mapped_base_address, ReservedSpace rs); bool relocate_pointers_in_core_regions(intx addr_delta); - - static MemRegion _mapped_heap_memregion; + char* map_auxiliary_region(int region_index, bool read_only); public: - address heap_region_dumptime_address() NOT_CDS_JAVA_HEAP_RETURN_(nullptr); - address heap_region_requested_address() NOT_CDS_JAVA_HEAP_RETURN_(nullptr); - narrowOop encoded_heap_region_dumptime_address(); private: diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index 3f4d584b0f5..357b317ee49 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -26,17 +26,20 @@ #include "cds/aotClassInitializer.hpp" #include "cds/aotClassLocation.hpp" #include "cds/aotLogging.hpp" +#include "cds/aotMappedHeapLoader.hpp" +#include "cds/aotMappedHeapWriter.hpp" #include "cds/aotMetaspace.hpp" #include "cds/aotOopChecker.hpp" #include "cds/aotReferenceObjSupport.hpp" +#include "cds/aotStreamedHeapLoader.hpp" +#include "cds/aotStreamedHeapWriter.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/archiveUtils.hpp" +#include "cds/cds_globals.hpp" #include "cds/cdsConfig.hpp" #include "cds/cdsEnumKlass.hpp" #include "cds/cdsHeapVerifier.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "cds/regeneratedClasses.hpp" #include "classfile/classLoaderData.hpp" #include "classfile/javaClasses.inline.hpp" @@ -64,6 +67,7 @@ #include "prims/jvmtiExport.hpp" #include "runtime/arguments.hpp" #include "runtime/fieldDescriptor.inline.hpp" +#include "runtime/globals_extension.hpp" #include "runtime/init.hpp" #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" @@ -91,7 +95,57 @@ struct ArchivableStaticFieldInfo { } }; -DumpedInternedStrings *HeapShared::_dumped_interned_strings = nullptr; +// Anything that goes in the header must be thoroughly purged from uninitialized memory +// as it will be written to disk. Therefore, the constructors memset the memory to 0. +// This is not the prettiest thing, but we need to know every byte is initialized, +// including potential padding between fields. + +ArchiveMappedHeapHeader::ArchiveMappedHeapHeader(size_t ptrmap_start_pos, + size_t oopmap_start_pos, + HeapRootSegments root_segments) { + memset((char*)this, 0, sizeof(*this)); + _ptrmap_start_pos = ptrmap_start_pos; + _oopmap_start_pos = oopmap_start_pos; + _root_segments = root_segments; +} + +ArchiveMappedHeapHeader::ArchiveMappedHeapHeader() { + memset((char*)this, 0, sizeof(*this)); +} + +ArchiveMappedHeapHeader ArchiveMappedHeapInfo::create_header() { + return ArchiveMappedHeapHeader{_ptrmap_start_pos, + _oopmap_start_pos, + _root_segments}; +} + +ArchiveStreamedHeapHeader::ArchiveStreamedHeapHeader(size_t forwarding_offset, + size_t roots_offset, + size_t num_roots, + size_t root_highest_object_index_table_offset, + size_t num_archived_objects) { + memset((char*)this, 0, sizeof(*this)); + _forwarding_offset = forwarding_offset; + _roots_offset = roots_offset; + _num_roots = num_roots; + _root_highest_object_index_table_offset = root_highest_object_index_table_offset; + _num_archived_objects = num_archived_objects; +} + +ArchiveStreamedHeapHeader::ArchiveStreamedHeapHeader() { + memset((char*)this, 0, sizeof(*this)); +} + +ArchiveStreamedHeapHeader ArchiveStreamedHeapInfo::create_header() { + return ArchiveStreamedHeapHeader{_forwarding_offset, + _roots_offset, + _num_roots, + _root_highest_object_index_table_offset, + _num_archived_objects}; +} + +HeapArchiveMode HeapShared::_heap_load_mode = HeapArchiveMode::_uninitialized; +HeapArchiveMode HeapShared::_heap_write_mode = HeapArchiveMode::_uninitialized; size_t HeapShared::_alloc_count[HeapShared::ALLOC_STAT_SLOTS]; size_t HeapShared::_alloc_size[HeapShared::ALLOC_STAT_SLOTS]; @@ -142,8 +196,6 @@ static ArchivableStaticFieldInfo fmg_archive_subgraph_entry_fields[] = { KlassSubGraphInfo* HeapShared::_dump_time_special_subgraph; ArchivedKlassSubGraphInfoRecord* HeapShared::_run_time_special_subgraph; GrowableArrayCHeap* HeapShared::_pending_roots = nullptr; -GrowableArrayCHeap* HeapShared::_root_segments = nullptr; -int HeapShared::_root_segment_max_size_elems; OopHandle HeapShared::_scratch_basic_type_mirrors[T_VOID+1]; MetaspaceObjToOopHandleTable* HeapShared::_scratch_objects_table = nullptr; @@ -239,10 +291,147 @@ void HeapShared::reset_archived_object_states(TRAPS) { HeapShared::ArchivedObjectCache* HeapShared::_archived_object_cache = nullptr; +bool HeapShared::is_archived_heap_in_use() { + if (HeapShared::is_loading()) { + if (HeapShared::is_loading_streaming_mode()) { + return AOTStreamedHeapLoader::is_in_use(); + } else { + return AOTMappedHeapLoader::is_in_use(); + } + } + + return false; +} + +bool HeapShared::can_use_archived_heap() { + FileMapInfo* static_mapinfo = FileMapInfo::current_info(); + if (static_mapinfo == nullptr) { + return false; + } + if (!static_mapinfo->has_heap_region()) { + return false; + } + if (!static_mapinfo->object_streaming_mode() && + !Universe::heap()->can_load_archived_objects() && + !UseG1GC) { + // Incompatible object format + return false; + } + + return true; +} + +bool HeapShared::is_too_large_to_archive(size_t size) { + if (HeapShared::is_writing_streaming_mode()) { + return false; + } else { + return AOTMappedHeapWriter::is_too_large_to_archive(size); + } +} + +bool HeapShared::is_too_large_to_archive(oop obj) { + if (HeapShared::is_writing_streaming_mode()) { + return false; + } else { + return AOTMappedHeapWriter::is_too_large_to_archive(obj); + } +} + +bool HeapShared::is_string_too_large_to_archive(oop string) { + typeArrayOop value = java_lang_String::value_no_keepalive(string); + return is_too_large_to_archive(value); +} + +void HeapShared::initialize_loading_mode(HeapArchiveMode mode) { + assert(_heap_load_mode == HeapArchiveMode::_uninitialized, "already set?"); + assert(mode != HeapArchiveMode::_uninitialized, "sanity"); + _heap_load_mode = mode; +}; + +void HeapShared::initialize_writing_mode() { + assert(!FLAG_IS_ERGO(AOTStreamableObjects), "Should not have been ergonomically set yet"); + + if (!CDSConfig::is_dumping_archive()) { + // We use FLAG_IS_CMDLINE below because we are specifically looking to warn + // a user that explicitly sets the flag on the command line for a JVM that is + // not dumping an archive. + if (FLAG_IS_CMDLINE(AOTStreamableObjects)) { + log_warning(cds)("-XX:%cAOTStreamableObjects was specified, " + "AOTStreamableObjects is only used for writing " + "the AOT cache.", + AOTStreamableObjects ? '+' : '-'); + } + } + + // The below checks use !FLAG_IS_DEFAULT instead of FLAG_IS_CMDLINE + // because the one step AOT cache creation transfers the AOTStreamableObjects + // flag value from the training JVM to the assembly JVM using an environment + // variable that sets the flag as ERGO in the assembly JVM. + if (FLAG_IS_DEFAULT(AOTStreamableObjects)) { + // By default, the value of AOTStreamableObjects should match !UseCompressedOops. + FLAG_SET_DEFAULT(AOTStreamableObjects, !UseCompressedOops); + } else if (!AOTStreamableObjects && UseZGC) { + // Never write mapped heap with ZGC + if (CDSConfig::is_dumping_archive()) { + log_warning(cds)("Heap archiving without streaming not supported for -XX:+UseZGC"); + } + FLAG_SET_ERGO(AOTStreamableObjects, true); + } + + if (CDSConfig::is_dumping_archive()) { + // Select default mode + assert(_heap_write_mode == HeapArchiveMode::_uninitialized, "already initialized?"); + _heap_write_mode = AOTStreamableObjects ? HeapArchiveMode::_streaming : HeapArchiveMode::_mapping; + } +} + +void HeapShared::initialize_streaming() { + assert(is_loading_streaming_mode(), "shouldn't call this"); + if (can_use_archived_heap()) { + AOTStreamedHeapLoader::initialize(); + } +} + +void HeapShared::enable_gc() { + if (AOTStreamedHeapLoader::is_in_use()) { + AOTStreamedHeapLoader::enable_gc(); + } +} + +void HeapShared::materialize_thread_object() { + if (AOTStreamedHeapLoader::is_in_use()) { + AOTStreamedHeapLoader::materialize_thread_object(); + } +} + +void HeapShared::add_to_dumped_interned_strings(oop string) { + assert(HeapShared::is_writing_mapping_mode(), "Only used by this mode"); + AOTMappedHeapWriter::add_to_dumped_interned_strings(string); +} + +void HeapShared::finalize_initialization(FileMapInfo* static_mapinfo) { + if (HeapShared::is_loading()) { + if (HeapShared::is_loading_streaming_mode()) { + // Heap initialization can be done only after vtables are initialized by ReadClosure. + AOTStreamedHeapLoader::finish_initialization(static_mapinfo); + } else { + // Finish up archived heap initialization. These must be + // done after ReadClosure. + AOTMappedHeapLoader::finish_initialization(static_mapinfo); + } + } +} + +HeapShared::CachedOopInfo* HeapShared::get_cached_oop_info(oop obj) { + OopHandle oh(Universe::vm_global(), obj); + CachedOopInfo* result = _archived_object_cache->get(oh); + oh.release(Universe::vm_global()); + return result; +} + bool HeapShared::has_been_archived(oop obj) { assert(CDSConfig::is_dumping_heap(), "dump-time only"); - OopHandle oh(&obj); - return archived_object_cache()->get(oh) != nullptr; + return get_cached_oop_info(obj) != nullptr; } int HeapShared::append_root(oop obj) { @@ -256,59 +445,45 @@ int HeapShared::append_root(oop obj) { return _pending_roots->append(obj); } -objArrayOop HeapShared::root_segment(int segment_idx) { - if (CDSConfig::is_dumping_heap()) { - assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread"); - } else { - assert(CDSConfig::is_using_archive(), "must be"); - } - - objArrayOop segment = (objArrayOop)_root_segments->at(segment_idx).resolve(); - assert(segment != nullptr, "should have been initialized"); - return segment; -} - -void HeapShared::get_segment_indexes(int idx, int& seg_idx, int& int_idx) { - assert(_root_segment_max_size_elems > 0, "sanity"); - - // Try to avoid divisions for the common case. - if (idx < _root_segment_max_size_elems) { - seg_idx = 0; - int_idx = idx; - } else { - seg_idx = idx / _root_segment_max_size_elems; - int_idx = idx % _root_segment_max_size_elems; - } - - assert(idx == seg_idx * _root_segment_max_size_elems + int_idx, - "sanity: %d index maps to %d segment and %d internal", idx, seg_idx, int_idx); -} - -// Returns an objArray that contains all the roots of the archived objects oop HeapShared::get_root(int index, bool clear) { assert(index >= 0, "sanity"); assert(!CDSConfig::is_dumping_heap() && CDSConfig::is_using_archive(), "runtime only"); - assert(!_root_segments->is_empty(), "must have loaded shared heap"); - int seg_idx, int_idx; - get_segment_indexes(index, seg_idx, int_idx); - oop result = root_segment(seg_idx)->obj_at(int_idx); + assert(is_archived_heap_in_use(), "getting roots into heap that is not used"); + + oop result; + if (HeapShared::is_loading_streaming_mode()) { + result = AOTStreamedHeapLoader::get_root(index); + } else { + assert(HeapShared::is_loading_mapping_mode(), "must be"); + result = AOTMappedHeapLoader::get_root(index); + } + if (clear) { clear_root(index); } + return result; } +void HeapShared::finish_materialize_objects() { + if (AOTStreamedHeapLoader::is_in_use()) { + AOTStreamedHeapLoader::finish_materialize_objects(); + } +} + void HeapShared::clear_root(int index) { assert(index >= 0, "sanity"); assert(CDSConfig::is_using_archive(), "must be"); - if (ArchiveHeapLoader::is_in_use()) { - int seg_idx, int_idx; - get_segment_indexes(index, seg_idx, int_idx); + if (is_archived_heap_in_use()) { if (log_is_enabled(Debug, aot, heap)) { - oop old = root_segment(seg_idx)->obj_at(int_idx); - log_debug(aot, heap)("Clearing root %d: was " PTR_FORMAT, index, p2i(old)); + log_debug(aot, heap)("Clearing root %d: was %zu", index, p2i(get_root(index, false /* clear */))); + } + if (HeapShared::is_loading_streaming_mode()) { + AOTStreamedHeapLoader::clear_root(index); + } else { + assert(HeapShared::is_loading_mapping_mode(), "must be"); + AOTMappedHeapLoader::clear_root(index); } - root_segment(seg_idx)->obj_at_put(int_idx, nullptr); } } @@ -320,81 +495,84 @@ bool HeapShared::archive_object(oop obj, oop referrer, KlassSubGraphInfo* subgra return true; } - if (ArchiveHeapWriter::is_too_large_to_archive(obj->size())) { + if (is_too_large_to_archive(obj)) { log_debug(aot, heap)("Cannot archive, object (" PTR_FORMAT ") is too large: %zu", p2i(obj), obj->size()); debug_trace(); return false; - } else { - AOTOopChecker::check(obj); // Make sure contents of this oop are safe. - - count_allocation(obj->size()); - ArchiveHeapWriter::add_source_obj(obj); - CachedOopInfo info = make_cached_oop_info(obj, referrer); - - OopHandle oh(Universe::vm_global(), obj); - archived_object_cache()->put_when_absent(oh, info); - archived_object_cache()->maybe_grow(); - mark_native_pointers(obj); - - Klass* k = obj->klass(); - if (k->is_instance_klass()) { - // Whenever we see a non-array Java object of type X, we mark X to be aot-initialized. - // This ensures that during the production run, whenever Java code sees a cached object - // of type X, we know that X is already initialized. (see TODO comment below ...) - - if (InstanceKlass::cast(k)->is_enum_subclass() - // We can't rerun of enum classes (see cdsEnumKlass.cpp) so - // we must store them as AOT-initialized. - || (subgraph_info == _dump_time_special_subgraph)) - // TODO: we do this only for the special subgraph for now. Extending this to - // other subgraphs would require more refactoring of the core library (such as - // move some initialization logic into runtimeSetup()). - // - // For the other subgraphs, we have a weaker mechanism to ensure that - // all classes in a subgraph are initialized before the subgraph is programmatically - // returned from jdk.internal.misc.CDS::initializeFromArchive(). - // See HeapShared::initialize_from_archived_subgraph(). - { - AOTArtifactFinder::add_aot_inited_class(InstanceKlass::cast(k)); - } - - if (java_lang_Class::is_instance(obj)) { - Klass* mirror_k = java_lang_Class::as_Klass(obj); - if (mirror_k != nullptr) { - AOTArtifactFinder::add_cached_class(mirror_k); - } - } else if (java_lang_invoke_ResolvedMethodName::is_instance(obj)) { - Method* m = java_lang_invoke_ResolvedMethodName::vmtarget(obj); - if (m != nullptr) { - if (RegeneratedClasses::has_been_regenerated(m)) { - m = RegeneratedClasses::get_regenerated_object(m); - } - InstanceKlass* method_holder = m->method_holder(); - AOTArtifactFinder::add_cached_class(method_holder); - } - } - } - - if (log_is_enabled(Debug, aot, heap)) { - ResourceMark rm; - LogTarget(Debug, aot, heap) log; - LogStream out(log); - out.print("Archived heap object " PTR_FORMAT " : %s ", - p2i(obj), obj->klass()->external_name()); - if (java_lang_Class::is_instance(obj)) { - Klass* k = java_lang_Class::as_Klass(obj); - if (k != nullptr) { - out.print("%s", k->external_name()); - } else { - out.print("primitive"); - } - } - out.cr(); - } - - return true; } + + AOTOopChecker::check(obj); // Make sure contents of this oop are safe. + count_allocation(obj->size()); + + if (HeapShared::is_writing_streaming_mode()) { + AOTStreamedHeapWriter::add_source_obj(obj); + } else { + AOTMappedHeapWriter::add_source_obj(obj); + } + + OopHandle oh(Universe::vm_global(), obj); + CachedOopInfo info = make_cached_oop_info(obj, referrer); + archived_object_cache()->put_when_absent(oh, info); + archived_object_cache()->maybe_grow(); + + Klass* k = obj->klass(); + if (k->is_instance_klass()) { + // Whenever we see a non-array Java object of type X, we mark X to be aot-initialized. + // This ensures that during the production run, whenever Java code sees a cached object + // of type X, we know that X is already initialized. (see TODO comment below ...) + + if (InstanceKlass::cast(k)->is_enum_subclass() + // We can't rerun of enum classes (see cdsEnumKlass.cpp) so + // we must store them as AOT-initialized. + || (subgraph_info == _dump_time_special_subgraph)) + // TODO: we do this only for the special subgraph for now. Extending this to + // other subgraphs would require more refactoring of the core library (such as + // move some initialization logic into runtimeSetup()). + // + // For the other subgraphs, we have a weaker mechanism to ensure that + // all classes in a subgraph are initialized before the subgraph is programmatically + // returned from jdk.internal.misc.CDS::initializeFromArchive(). + // See HeapShared::initialize_from_archived_subgraph(). + { + AOTArtifactFinder::add_aot_inited_class(InstanceKlass::cast(k)); + } + + if (java_lang_Class::is_instance(obj)) { + Klass* mirror_k = java_lang_Class::as_Klass(obj); + if (mirror_k != nullptr) { + AOTArtifactFinder::add_cached_class(mirror_k); + } + } else if (java_lang_invoke_ResolvedMethodName::is_instance(obj)) { + Method* m = java_lang_invoke_ResolvedMethodName::vmtarget(obj); + if (m != nullptr) { + if (RegeneratedClasses::has_been_regenerated(m)) { + m = RegeneratedClasses::get_regenerated_object(m); + } + InstanceKlass* method_holder = m->method_holder(); + AOTArtifactFinder::add_cached_class(method_holder); + } + } + } + + if (log_is_enabled(Debug, aot, heap)) { + ResourceMark rm; + LogTarget(Debug, aot, heap) log; + LogStream out(log); + out.print("Archived heap object " PTR_FORMAT " : %s ", + p2i(obj), obj->klass()->external_name()); + if (java_lang_Class::is_instance(obj)) { + Klass* k = java_lang_Class::as_Klass(obj); + if (k != nullptr) { + out.print("%s", k->external_name()); + } else { + out.print("primitive"); + } + } + out.cr(); + } + + return true; } class MetaspaceObjToOopHandleTable: public HashTableget_oop(src); } -void HeapShared::init_dumping() { - _scratch_objects_table = new (mtClass)MetaspaceObjToOopHandleTable(); - _pending_roots = new GrowableArrayCHeap(500); + void HeapShared::init_dumping() { + _scratch_objects_table = new (mtClass)MetaspaceObjToOopHandleTable(); + _pending_roots = new GrowableArrayCHeap(500); } void HeapShared::init_scratch_objects_for_basic_type_mirrors(TRAPS) { @@ -641,7 +819,7 @@ void HeapShared::copy_java_mirror(oop orig_mirror, oop scratch_m) { static objArrayOop get_archived_resolved_references(InstanceKlass* src_ik) { if (SystemDictionaryShared::is_builtin_loader(src_ik->class_loader_data())) { objArrayOop rr = src_ik->constants()->resolved_references_or_null(); - if (rr != nullptr && !ArchiveHeapWriter::is_too_large_to_archive(rr)) { + if (rr != nullptr && !HeapShared::is_too_large_to_archive(rr)) { return HeapShared::scratch_resolved_references(src_ik->constants()); } } @@ -649,6 +827,7 @@ static objArrayOop get_archived_resolved_references(InstanceKlass* src_ik) { } void HeapShared::archive_strings() { + assert(HeapShared::is_writing_mapping_mode(), "should not reach here"); oop shared_strings_array = StringTable::init_shared_strings_array(); bool success = archive_reachable_objects_from(1, _dump_time_special_subgraph, shared_strings_array); assert(success, "shared strings array must not point to arrays or strings that are too large to archive"); @@ -661,15 +840,6 @@ int HeapShared::archive_exception_instance(oop exception) { return append_root(exception); } -void HeapShared::mark_native_pointers(oop orig_obj) { - if (java_lang_Class::is_instance(orig_obj)) { - ArchiveHeapWriter::mark_native_pointer(orig_obj, java_lang_Class::klass_offset()); - ArchiveHeapWriter::mark_native_pointer(orig_obj, java_lang_Class::array_klass_offset()); - } else if (java_lang_invoke_ResolvedMethodName::is_instance(orig_obj)) { - ArchiveHeapWriter::mark_native_pointer(orig_obj, java_lang_invoke_ResolvedMethodName::vmtarget_offset()); - } -} - void HeapShared::get_pointer_info(oop src_obj, bool& has_oop_pointers, bool& has_native_pointers) { OopHandle oh(&src_obj); CachedOopInfo* info = archived_object_cache()->get(oh); @@ -698,7 +868,7 @@ void HeapShared::start_scanning_for_oops() { // Cache for recording where the archived objects are copied to create_archived_object_cache(); - if (UseCompressedOops || UseG1GC) { + if (HeapShared::is_writing_mapping_mode() && (UseG1GC || UseCompressedOops)) { aot_log_info(aot)("Heap range = [" PTR_FORMAT " - " PTR_FORMAT "]", UseCompressedOops ? p2i(CompressedOops::begin()) : p2i((address)G1CollectedHeap::heap()->reserved().start()), @@ -714,19 +884,26 @@ void HeapShared::start_scanning_for_oops() { } void HeapShared::end_scanning_for_oops() { - archive_strings(); + if (is_writing_mapping_mode()) { + archive_strings(); + } delete_seen_objects_table(); } -void HeapShared::write_heap(ArchiveHeapInfo *heap_info) { +void HeapShared::write_heap(ArchiveMappedHeapInfo* mapped_heap_info, ArchiveStreamedHeapInfo* streamed_heap_info) { { NoSafepointVerifier nsv; CDSHeapVerifier::verify(); check_special_subgraph_classes(); } - StringTable::write_shared_table(); - ArchiveHeapWriter::write(_pending_roots, heap_info); + if (HeapShared::is_writing_mapping_mode()) { + StringTable::write_shared_table(); + AOTMappedHeapWriter::write(_pending_roots, mapped_heap_info); + } else { + assert(HeapShared::is_writing_streaming_mode(), "are there more modes?"); + AOTStreamedHeapWriter::write(_pending_roots, streamed_heap_info); + } ArchiveBuilder::OtherROAllocMark mark; write_subgraph_info_table(); @@ -1067,19 +1244,6 @@ void HeapShared::write_subgraph_info_table() { } } -void HeapShared::add_root_segment(objArrayOop segment_oop) { - assert(segment_oop != nullptr, "must be"); - assert(ArchiveHeapLoader::is_in_use(), "must be"); - if (_root_segments == nullptr) { - _root_segments = new GrowableArrayCHeap(10); - } - _root_segments->push(OopHandle(Universe::vm_global(), segment_oop)); -} - -void HeapShared::init_root_segment_sizes(int max_size_elems) { - _root_segment_max_size_elems = max_size_elems; -} - void HeapShared::serialize_tables(SerializeClosure* soc) { #ifndef PRODUCT @@ -1100,10 +1264,10 @@ static void verify_the_heap(Klass* k, const char* which) { log_info(aot, heap)("Verify heap %s initializing static field(s) in %s", which, k->external_name()); - VM_Verify verify_op; - VMThread::execute(&verify_op); - - if (VerifyArchivedFields > 1 && is_init_completed()) { + if (VerifyArchivedFields == 1) { + VM_Verify verify_op; + VMThread::execute(&verify_op); + } else if (VerifyArchivedFields == 2 && is_init_completed()) { // At this time, the oop->klass() of some archived objects in the heap may not // have been loaded into the system dictionary yet. Nevertheless, oop->klass() should // have enough information (object size, oop maps, etc) so that a GC can be safely @@ -1129,7 +1293,7 @@ static void verify_the_heap(Klass* k, const char* which) { // this case, we will not load the ArchivedKlassSubGraphInfoRecord and will clear its roots. void HeapShared::resolve_classes(JavaThread* current) { assert(CDSConfig::is_using_archive(), "runtime only!"); - if (!ArchiveHeapLoader::is_in_use()) { + if (!is_archived_heap_in_use()) { return; // nothing to do } resolve_classes_for_subgraphs(current, archive_subgraph_entry_fields); @@ -1188,7 +1352,7 @@ void HeapShared::initialize_java_lang_invoke(TRAPS) { // should be initialized before any Java code can access the Fruit class. Note that // HashSet itself doesn't necessary need to be an aot-initialized class. void HeapShared::init_classes_for_special_subgraph(Handle class_loader, TRAPS) { - if (!ArchiveHeapLoader::is_in_use()) { + if (!is_archived_heap_in_use()) { return; } @@ -1220,7 +1384,7 @@ void HeapShared::init_classes_for_special_subgraph(Handle class_loader, TRAPS) { void HeapShared::initialize_from_archived_subgraph(JavaThread* current, Klass* k) { JavaThread* THREAD = current; - if (!ArchiveHeapLoader::is_in_use()) { + if (!is_archived_heap_in_use()) { return; // nothing to do } @@ -1356,9 +1520,6 @@ void HeapShared::resolve_or_init(Klass* k, bool do_init, TRAPS) { void HeapShared::init_archived_fields_for(Klass* k, const ArchivedKlassSubGraphInfoRecord* record) { verify_the_heap(k, "before"); - // Load the subgraph entry fields from the record and store them back to - // the corresponding fields within the mirror. - oop m = k->java_mirror(); Array* entry_field_records = record->entry_field_records(); if (entry_field_records != nullptr) { int efr_len = entry_field_records->length(); @@ -1366,7 +1527,10 @@ void HeapShared::init_archived_fields_for(Klass* k, const ArchivedKlassSubGraphI for (int i = 0; i < efr_len; i += 2) { int field_offset = entry_field_records->at(i); int root_index = entry_field_records->at(i+1); + // Load the subgraph entry fields from the record and store them back to + // the corresponding fields within the mirror. oop v = get_root(root_index, /*clear=*/true); + oop m = k->java_mirror(); if (k->has_aot_initialized_mirror()) { assert(v == m->obj_field(field_offset), "must be aot-initialized"); } else { @@ -1445,7 +1609,7 @@ class HeapShared::OopFieldPusher: public BasicOopIterateClosure { template void do_oop_work(T *p) { int field_offset = pointer_delta_as_int((char*)p, cast_from_oop(_referencing_obj)); oop obj = HeapAccess::oop_load_at(_referencing_obj, field_offset); - if (!CompressedOops::is_null(obj)) { + if (obj != nullptr) { if (_is_java_lang_ref && AOTReferenceObjSupport::skip_field(field_offset)) { // Do not follow these fields. They will be cleared to null. return; @@ -1494,7 +1658,7 @@ HeapShared::CachedOopInfo HeapShared::make_cached_oop_info(oop obj, oop referrer } void HeapShared::init_box_classes(TRAPS) { - if (ArchiveHeapLoader::is_in_use()) { + if (is_archived_heap_in_use()) { vmClasses::Boolean_klass()->initialize(CHECK); vmClasses::Character_klass()->initialize(CHECK); vmClasses::Float_klass()->initialize(CHECK); @@ -1739,8 +1903,8 @@ class VerifySharedOopClosure: public BasicOopIterateClosure { protected: template void do_oop_work(T *p) { - oop obj = RawAccess<>::oop_load(p); - if (!CompressedOops::is_null(obj)) { + oop obj = HeapAccess<>::oop_load(p); + if (obj != nullptr) { HeapShared::verify_reachable_objects_from(obj); } } @@ -2041,7 +2205,7 @@ bool HeapShared::is_a_test_class_in_unnamed_module(Klass* ik) { void HeapShared::initialize_test_class_from_archive(JavaThread* current) { Klass* k = _test_class; - if (k != nullptr && ArchiveHeapLoader::is_in_use()) { + if (k != nullptr && is_archived_heap_in_use()) { JavaThread* THREAD = current; ExceptionMark em(THREAD); const ArchivedKlassSubGraphInfoRecord* record = @@ -2062,11 +2226,18 @@ void HeapShared::initialize_test_class_from_archive(JavaThread* current) { void HeapShared::init_for_dumping(TRAPS) { if (CDSConfig::is_dumping_heap()) { setup_test_class(ArchiveHeapTestClass); - _dumped_interned_strings = new (mtClass)DumpedInternedStrings(INITIAL_TABLE_SIZE, MAX_TABLE_SIZE); init_subgraph_entry_fields(CHECK); } } +void HeapShared::init_heap_writer() { + if (HeapShared::is_writing_streaming_mode()) { + AOTStreamedHeapWriter::init(); + } else { + AOTMappedHeapWriter::init(); + } +} + void HeapShared::archive_object_subgraphs(ArchivableStaticFieldInfo fields[], bool is_full_module_graph) { _num_total_subgraph_recordings = 0; @@ -2117,23 +2288,12 @@ void HeapShared::archive_object_subgraphs(ArchivableStaticFieldInfo fields[], #endif } -// Keep track of the contents of the archived interned string table. This table -// is used only by CDSHeapVerifier. -void HeapShared::add_to_dumped_interned_strings(oop string) { - assert_at_safepoint(); // DumpedInternedStrings uses raw oops - assert(!ArchiveHeapWriter::is_string_too_large_to_archive(string), "must be"); - bool created; - _dumped_interned_strings->put_if_absent(string, true, &created); - if (created) { - // Prevent string deduplication from changing the value field to - // something not in the archive. - java_lang_String::set_deduplication_forbidden(string); - _dumped_interned_strings->maybe_grow(); - } -} - bool HeapShared::is_dumped_interned_string(oop o) { - return _dumped_interned_strings->get(o) != nullptr; + if (is_writing_mapping_mode()) { + return AOTMappedHeapWriter::is_dumped_interned_string(o); + } else { + return AOTStreamedHeapWriter::is_dumped_interned_string(o); + } } // These tables should be used only within the CDS safepoint, so @@ -2142,10 +2302,12 @@ bool HeapShared::is_dumped_interned_string(oop o) { void HeapShared::delete_tables_with_raw_oops() { assert(_seen_objects_table == nullptr, "should have been deleted"); - delete _dumped_interned_strings; - _dumped_interned_strings = nullptr; - - ArchiveHeapWriter::delete_tables_with_raw_oops(); + if (is_writing_mapping_mode()) { + AOTMappedHeapWriter::delete_tables_with_raw_oops(); + } else { + assert(is_writing_streaming_mode(), "what other mode?"); + AOTStreamedHeapWriter::delete_tables_with_raw_oops(); + } } void HeapShared::debug_trace() { @@ -2242,6 +2404,35 @@ void HeapShared::print_stats() { avg_size(_total_obj_size, _total_obj_count)); } +bool HeapShared::is_metadata_field(oop src_obj, int offset) { + bool result = false; + do_metadata_offsets(src_obj, [&](int metadata_offset) { + if (metadata_offset == offset) { + result = true; + } + }); + return result; +} + +void HeapShared::remap_dumped_metadata(oop src_obj, address archived_object) { + do_metadata_offsets(src_obj, [&](int offset) { + Metadata** buffered_field_addr = (Metadata**)(archived_object + offset); + Metadata* native_ptr = *buffered_field_addr; + + if (native_ptr == nullptr) { + return; + } + + if (RegeneratedClasses::has_been_regenerated(native_ptr)) { + native_ptr = RegeneratedClasses::get_regenerated_object(native_ptr); + } + + address buffered_native_ptr = ArchiveBuilder::current()->get_buffered_addr((address)native_ptr); + address requested_native_ptr = ArchiveBuilder::current()->to_requested(buffered_native_ptr); + *buffered_field_addr = (Metadata*)requested_native_ptr; + }); +} + bool HeapShared::is_archived_boot_layer_available(JavaThread* current) { TempNewSymbol klass_name = SymbolTable::new_symbol(ARCHIVED_BOOT_LAYER_CLASS); InstanceKlass* k = SystemDictionary::find_instance_klass(current, klass_name, Handle()); diff --git a/src/hotspot/share/cds/heapShared.hpp b/src/hotspot/share/cds/heapShared.hpp index cc41fb1dec7..2c782f7231b 100644 --- a/src/hotspot/share/cds/heapShared.hpp +++ b/src/hotspot/share/cds/heapShared.hpp @@ -47,7 +47,6 @@ class MetaspaceObjToOopHandleTable; class ResourceBitMap; struct ArchivableStaticFieldInfo; -class ArchiveHeapInfo; #define ARCHIVED_BOOT_LAYER_CLASS "jdk/internal/module/ArchivedBootLayer" #define ARCHIVED_BOOT_LAYER_FIELD "archivedBootLayer" @@ -137,12 +136,152 @@ class ArchivedKlassSubGraphInfoRecord { }; #endif // INCLUDE_CDS_JAVA_HEAP -struct LoadedArchiveHeapRegion; +enum class HeapArchiveMode { + _uninitialized, + _mapping, + _streaming +}; + +class ArchiveMappedHeapHeader { + size_t _ptrmap_start_pos; // The first bit in the ptrmap corresponds to this position in the heap. + size_t _oopmap_start_pos; // The first bit in the oopmap corresponds to this position in the heap. + HeapRootSegments _root_segments; // Heap root segments info + +public: + ArchiveMappedHeapHeader(); + ArchiveMappedHeapHeader(size_t ptrmap_start_pos, + size_t oopmap_start_pos, + HeapRootSegments root_segments); + + size_t ptrmap_start_pos() const { return _ptrmap_start_pos; } + size_t oopmap_start_pos() const { return _oopmap_start_pos; } + HeapRootSegments root_segments() const { return _root_segments; } + + // This class is trivially copyable and assignable. + ArchiveMappedHeapHeader(const ArchiveMappedHeapHeader&) = default; + ArchiveMappedHeapHeader& operator=(const ArchiveMappedHeapHeader&) = default; +}; + + +class ArchiveStreamedHeapHeader { + size_t _forwarding_offset; // Offset of forwarding information in the heap region. + size_t _roots_offset; // Start position for the roots + size_t _root_highest_object_index_table_offset; // Offset of root dfs depth information + size_t _num_roots; // Number of embedded roots + size_t _num_archived_objects; // The number of archived heap objects + +public: + ArchiveStreamedHeapHeader(); + ArchiveStreamedHeapHeader(size_t forwarding_offset, + size_t roots_offset, + size_t num_roots, + size_t root_highest_object_index_table_offset, + size_t num_archived_objects); + + size_t forwarding_offset() const { return _forwarding_offset; } + size_t roots_offset() const { return _roots_offset; } + size_t num_roots() const { return _num_roots; } + size_t root_highest_object_index_table_offset() const { return _root_highest_object_index_table_offset; } + size_t num_archived_objects() const { return _num_archived_objects; } + + // This class is trivially copyable and assignable. + ArchiveStreamedHeapHeader(const ArchiveStreamedHeapHeader&) = default; + ArchiveStreamedHeapHeader& operator=(const ArchiveStreamedHeapHeader&) = default; +}; + +class ArchiveMappedHeapInfo { + MemRegion _buffer_region; // Contains the archived objects to be written into the CDS archive. + CHeapBitMap _oopmap; + CHeapBitMap _ptrmap; + HeapRootSegments _root_segments; + size_t _oopmap_start_pos; // How many zeros were removed from the beginning of the bit map? + size_t _ptrmap_start_pos; // How many zeros were removed from the beginning of the bit map? + +public: + ArchiveMappedHeapInfo() : + _buffer_region(), + _oopmap(128, mtClassShared), + _ptrmap(128, mtClassShared), + _root_segments(), + _oopmap_start_pos(), + _ptrmap_start_pos() {} + bool is_used() { return !_buffer_region.is_empty(); } + + MemRegion buffer_region() { return _buffer_region; } + void set_buffer_region(MemRegion r) { _buffer_region = r; } + + char* buffer_start() { return (char*)_buffer_region.start(); } + size_t buffer_byte_size() { return _buffer_region.byte_size(); } + + CHeapBitMap* oopmap() { return &_oopmap; } + CHeapBitMap* ptrmap() { return &_ptrmap; } + + void set_oopmap_start_pos(size_t start_pos) { _oopmap_start_pos = start_pos; } + void set_ptrmap_start_pos(size_t start_pos) { _ptrmap_start_pos = start_pos; } + + void set_root_segments(HeapRootSegments segments) { _root_segments = segments; }; + HeapRootSegments root_segments() { return _root_segments; } + + ArchiveMappedHeapHeader create_header(); +}; + +class ArchiveStreamedHeapInfo { + MemRegion _buffer_region; // Contains the archived objects to be written into the CDS archive. + CHeapBitMap _oopmap; + size_t _roots_offset; // Offset of the HeapShared::roots() object, from the bottom + // of the archived heap objects, in bytes. + size_t _num_roots; + + size_t _forwarding_offset; // Offset of forwarding information from the bottom + size_t _root_highest_object_index_table_offset; // Offset to root dfs depth information + size_t _num_archived_objects; // The number of archived objects written into the CDS archive. + +public: + ArchiveStreamedHeapInfo() + : _buffer_region(), + _oopmap(128, mtClassShared), + _roots_offset(), + _forwarding_offset(), + _root_highest_object_index_table_offset(), + _num_archived_objects() {} + + bool is_used() { return !_buffer_region.is_empty(); } + + void set_buffer_region(MemRegion r) { _buffer_region = r; } + MemRegion buffer_region() { return _buffer_region; } + char* buffer_start() { return (char*)_buffer_region.start(); } + size_t buffer_byte_size() { return _buffer_region.byte_size(); } + + CHeapBitMap* oopmap() { return &_oopmap; } + void set_roots_offset(size_t n) { _roots_offset = n; } + size_t roots_offset() { return _roots_offset; } + void set_num_roots(size_t n) { _num_roots = n; } + size_t num_roots() { return _num_roots; } + void set_forwarding_offset(size_t n) { _forwarding_offset = n; } + void set_root_highest_object_index_table_offset(size_t n) { _root_highest_object_index_table_offset = n; } + void set_num_archived_objects(size_t n) { _num_archived_objects = n; } + size_t num_archived_objects() { return _num_archived_objects; } + + ArchiveStreamedHeapHeader create_header(); +}; class HeapShared: AllStatic { friend class VerifySharedOopClosure; public: + static void initialize_loading_mode(HeapArchiveMode mode) NOT_CDS_JAVA_HEAP_RETURN; + static void initialize_writing_mode() NOT_CDS_JAVA_HEAP_RETURN; + + inline static bool is_loading() NOT_CDS_JAVA_HEAP_RETURN_(false); + + inline static bool is_loading_streaming_mode() NOT_CDS_JAVA_HEAP_RETURN_(false); + inline static bool is_loading_mapping_mode() NOT_CDS_JAVA_HEAP_RETURN_(false); + + inline static bool is_writing() NOT_CDS_JAVA_HEAP_RETURN_(false); + + inline static bool is_writing_streaming_mode() NOT_CDS_JAVA_HEAP_RETURN_(false); + inline static bool is_writing_mapping_mode() NOT_CDS_JAVA_HEAP_RETURN_(false); + static bool is_subgraph_root_class(InstanceKlass* ik); // Scratch objects for archiving Klass::java_mirror() @@ -151,9 +290,22 @@ public: static oop scratch_java_mirror(oop java_mirror) NOT_CDS_JAVA_HEAP_RETURN_(nullptr); static bool is_archived_boot_layer_available(JavaThread* current) NOT_CDS_JAVA_HEAP_RETURN_(false); + static bool is_archived_heap_in_use() NOT_CDS_JAVA_HEAP_RETURN_(false); + static bool can_use_archived_heap() NOT_CDS_JAVA_HEAP_RETURN_(false); + static bool is_too_large_to_archive(size_t size); + static bool is_string_too_large_to_archive(oop string); + static bool is_too_large_to_archive(oop obj); + + static void initialize_streaming() NOT_CDS_JAVA_HEAP_RETURN; + static void enable_gc() NOT_CDS_JAVA_HEAP_RETURN; + static void materialize_thread_object() NOT_CDS_JAVA_HEAP_RETURN; + static void add_to_dumped_interned_strings(oop string) NOT_CDS_JAVA_HEAP_RETURN; + static void finalize_initialization(FileMapInfo* static_mapinfo) NOT_CDS_JAVA_HEAP_RETURN; + private: #if INCLUDE_CDS_JAVA_HEAP - static DumpedInternedStrings *_dumped_interned_strings; + static HeapArchiveMode _heap_load_mode; + static HeapArchiveMode _heap_write_mode; // statistics constexpr static int ALLOC_STAT_SLOTS = 16; @@ -282,8 +434,6 @@ private: static ArchivedKlassSubGraphInfoRecord* _run_time_special_subgraph; // for initializing classes during run time. static GrowableArrayCHeap* _pending_roots; - static GrowableArrayCHeap* _root_segments; - static int _root_segment_max_size_elems; static OopHandle _scratch_basic_type_mirrors[T_VOID+1]; static MetaspaceObjToOopHandleTable* _scratch_objects_table; @@ -326,16 +476,6 @@ private: static void resolve_or_init(Klass* k, bool do_init, TRAPS); static void init_archived_fields_for(Klass* k, const ArchivedKlassSubGraphInfoRecord* record); - static int init_loaded_regions(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_regions, - MemRegion& archive_space); - static void sort_loaded_regions(LoadedArchiveHeapRegion* loaded_regions, int num_loaded_regions, - uintptr_t buffer); - static bool load_regions(FileMapInfo* mapinfo, LoadedArchiveHeapRegion* loaded_regions, - int num_loaded_regions, uintptr_t buffer); - static void init_loaded_heap_relocation(LoadedArchiveHeapRegion* reloc_info, - int num_loaded_regions); - static void fill_failed_loaded_region(); - static void mark_native_pointers(oop orig_obj); static bool has_been_archived(oop orig_obj); static void prepare_resolved_references(); static void archive_strings(); @@ -380,10 +520,7 @@ private: return _archived_object_cache; } - static CachedOopInfo* get_cached_oop_info(oop orig_obj) { - OopHandle oh(&orig_obj); - return _archived_object_cache->get(oh); - } + static CachedOopInfo* get_cached_oop_info(oop orig_obj); static int archive_exception_instance(oop exception); @@ -391,14 +528,19 @@ private: KlassSubGraphInfo* subgraph_info, oop orig_obj); - static void add_to_dumped_interned_strings(oop string); static bool is_dumped_interned_string(oop o); // Scratch objects for archiving Klass::java_mirror() static void set_scratch_java_mirror(Klass* k, oop mirror); static void remove_scratch_objects(Klass* k); + static bool is_metadata_field(oop src_obj, int offset); + template static void do_metadata_offsets(oop src_obj, T callback); + static void remap_dumped_metadata(oop src_obj, address archived_object); + inline static void remap_loaded_metadata(oop obj); + inline static oop maybe_remap_referent(bool is_java_lang_ref, size_t field_offset, oop referent); static void get_pointer_info(oop src_obj, bool& has_oop_pointers, bool& has_native_pointers); static void set_has_native_pointers(oop src_obj); + static uintptr_t archive_location(oop src_obj); // We use the HeapShared::roots() array to make sure that objects stored in the // archived heap region are not prematurely collected. These roots include: @@ -432,7 +574,9 @@ private: #endif // INCLUDE_CDS_JAVA_HEAP public: - static void write_heap(ArchiveHeapInfo* heap_info) NOT_CDS_JAVA_HEAP_RETURN; + static void finish_materialize_objects() NOT_CDS_JAVA_HEAP_RETURN; + + static void write_heap(ArchiveMappedHeapInfo* mapped_heap_info, ArchiveStreamedHeapInfo* streamed_heap_info) NOT_CDS_JAVA_HEAP_RETURN; static objArrayOop scratch_resolved_references(ConstantPool* src); static void add_scratch_resolved_references(ConstantPool* src, objArrayOop dest) NOT_CDS_JAVA_HEAP_RETURN; static void init_dumping() NOT_CDS_JAVA_HEAP_RETURN; @@ -448,9 +592,8 @@ private: static void initialize_from_archived_subgraph(JavaThread* current, Klass* k) NOT_CDS_JAVA_HEAP_RETURN; static void init_for_dumping(TRAPS) NOT_CDS_JAVA_HEAP_RETURN; + static void init_heap_writer() NOT_CDS_JAVA_HEAP_RETURN; static void write_subgraph_info_table() NOT_CDS_JAVA_HEAP_RETURN; - static void add_root_segment(objArrayOop segment_oop) NOT_CDS_JAVA_HEAP_RETURN; - static void init_root_segment_sizes(int max_size_elems) NOT_CDS_JAVA_HEAP_RETURN; static void serialize_tables(SerializeClosure* soc) NOT_CDS_JAVA_HEAP_RETURN; #ifndef PRODUCT @@ -472,22 +615,13 @@ private: static void scan_java_class(Klass* k); static void scan_java_mirror(oop orig_mirror); static void copy_and_rescan_aot_inited_mirror(InstanceKlass* ik); -}; -#if INCLUDE_CDS_JAVA_HEAP -class DumpedInternedStrings : - public ResizeableHashTable -{ -public: - DumpedInternedStrings(unsigned size, unsigned max_size) : - ResizeableHashTable(size, max_size) {} + static void log_heap_roots(); + + static intptr_t log_target_location(oop source_oop); + static void log_oop_info(outputStream* st, oop source_oop, address archived_object_start, address archived_object_end); + static void log_oop_info(outputStream* st, oop source_oop); + static void log_oop_details(oop source_oop, address buffered_addr); }; -#endif #endif // SHARE_CDS_HEAPSHARED_HPP diff --git a/src/hotspot/share/cds/heapShared.inline.hpp b/src/hotspot/share/cds/heapShared.inline.hpp new file mode 100644 index 00000000000..8b323b067d7 --- /dev/null +++ b/src/hotspot/share/cds/heapShared.inline.hpp @@ -0,0 +1,114 @@ +/* + * 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_CDS_HEAPSHARED_INLINE_HPP +#define SHARE_CDS_HEAPSHARED_INLINE_HPP + +#include "cds/heapShared.hpp" + +#include "cds/aotReferenceObjSupport.hpp" +#include "cds/regeneratedClasses.hpp" +#include "classfile/javaClasses.hpp" +#include "utilities/macros.hpp" + +#if INCLUDE_CDS_JAVA_HEAP + +inline bool HeapShared::is_loading() { + return _heap_load_mode != HeapArchiveMode::_uninitialized; +} + +inline bool HeapShared::is_loading_streaming_mode() { + assert(_heap_load_mode != HeapArchiveMode::_uninitialized, "not initialized yet"); + return _heap_load_mode == HeapArchiveMode::_streaming; +} + +inline bool HeapShared::is_loading_mapping_mode() { + assert(_heap_load_mode != HeapArchiveMode::_uninitialized, "not initialized yet"); + return _heap_load_mode == HeapArchiveMode::_mapping; +} + +inline bool HeapShared::is_writing() { + return _heap_write_mode != HeapArchiveMode::_uninitialized; +} + +inline bool HeapShared::is_writing_streaming_mode() { + assert(_heap_write_mode != HeapArchiveMode::_uninitialized, "not initialized yet"); + return _heap_write_mode == HeapArchiveMode::_streaming; +} + +inline bool HeapShared::is_writing_mapping_mode() { + assert(_heap_write_mode != HeapArchiveMode::_uninitialized, "not initialized yet"); + return _heap_write_mode == HeapArchiveMode::_mapping; +} + +// Keep the knowledge about which objects have what metadata in one single place +template +void HeapShared::do_metadata_offsets(oop src_obj, T callback) { + if (java_lang_Class::is_instance(src_obj)) { + assert(java_lang_Class::klass_offset() < java_lang_Class::array_klass_offset(), + "metadata offsets must be sorted"); + callback(java_lang_Class::klass_offset()); + callback(java_lang_Class::array_klass_offset()); + } else if (java_lang_invoke_ResolvedMethodName::is_instance(src_obj)) { + callback(java_lang_invoke_ResolvedMethodName::vmtarget_offset()); + } +} + +inline void HeapShared::remap_loaded_metadata(oop src_obj) { + do_metadata_offsets(src_obj, [&](int offset) { + Metadata* metadata = src_obj->metadata_field(offset); + if (metadata != nullptr) { + metadata = (Metadata*)(address(metadata) + AOTMetaspace::relocation_delta()); + src_obj->metadata_field_put(offset, metadata); + } + }); +} + +inline oop HeapShared::maybe_remap_referent(bool is_java_lang_ref, size_t field_offset, oop referent) { + if (referent == nullptr) { + return nullptr; + } + + if (is_java_lang_ref && AOTReferenceObjSupport::skip_field((int)field_offset)) { + return nullptr; + } + + if (java_lang_Class::is_instance(referent)) { + Klass* k = java_lang_Class::as_Klass(referent); + if (RegeneratedClasses::has_been_regenerated(k)) { + referent = RegeneratedClasses::get_regenerated_object(k)->java_mirror(); + } + // When the source object points to a "real" mirror, the buffered object should point + // to the "scratch" mirror, which has all unarchivable fields scrubbed (to be reinstated + // at run time). + referent = HeapShared::scratch_java_mirror(referent); + assert(referent != nullptr, "must be"); + } + + return referent; +} + +#endif // INCLUDE_CDS_JAVA_HEAP + +#endif // SHARE_CDS_HEAPSHARED_INLINE_HPP diff --git a/src/hotspot/share/classfile/classLoaderDataGraph.cpp b/src/hotspot/share/classfile/classLoaderDataGraph.cpp index 61404fdf9db..b6f7915db71 100644 --- a/src/hotspot/share/classfile/classLoaderDataGraph.cpp +++ b/src/hotspot/share/classfile/classLoaderDataGraph.cpp @@ -38,6 +38,7 @@ #include "memory/resourceArea.hpp" #include "runtime/atomicAccess.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/init.hpp" #include "runtime/mutex.hpp" #include "runtime/safepoint.hpp" #include "runtime/safepointVerifiers.hpp" @@ -149,7 +150,8 @@ ClassLoaderData* ClassLoaderDataGraph::add_to_graph(Handle loader, bool has_clas // We mustn't GC until we've installed the ClassLoaderData in the Graph since the CLD // contains oops in _handles that must be walked. GC doesn't walk CLD from the // loader oop in all collections, particularly young collections. - NoSafepointVerifier no_safepoints; + // Before is_init_completed(), GC is not allowed to run. + NoSafepointVerifier no_safepoints(is_init_completed()); cld = new ClassLoaderData(loader, has_class_mirror_holder); diff --git a/src/hotspot/share/classfile/classLoaderDataShared.cpp b/src/hotspot/share/classfile/classLoaderDataShared.cpp index 2a59a3339b6..7a7743edd03 100644 --- a/src/hotspot/share/classfile/classLoaderDataShared.cpp +++ b/src/hotspot/share/classfile/classLoaderDataShared.cpp @@ -24,7 +24,7 @@ #include "cds/aotLogging.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "cds/serializeClosure.hpp" #include "classfile/classLoaderData.inline.hpp" #include "classfile/classLoaderDataShared.hpp" @@ -152,6 +152,35 @@ void ArchivedClassLoaderData::clear_archived_oops() { // ------------------------------ +void ClassLoaderDataShared::load_archived_platform_and_system_class_loaders() { +#if INCLUDE_CDS_JAVA_HEAP + // The streaming object loader prefers loading the class loader related objects before + // the CLD constructor which has a NoSafepointVerifier. + if (!HeapShared::is_loading_streaming_mode()) { + return; + } + + // Ensure these class loaders are eagerly materialized before their CLDs are created. + HeapShared::get_root(_platform_loader_root_index, false /* clear */); + HeapShared::get_root(_system_loader_root_index, false /* clear */); + + if (Universe::is_module_initialized() || !CDSConfig::is_using_full_module_graph()) { + return; + } + + // When using the full module graph, we need to load unnamed modules too. + ModuleEntry* platform_loader_module_entry = _archived_platform_loader_data.unnamed_module(); + if (platform_loader_module_entry != nullptr) { + platform_loader_module_entry->preload_archived_oops(); + } + + ModuleEntry* system_loader_module_entry = _archived_system_loader_data.unnamed_module(); + if (system_loader_module_entry != nullptr) { + system_loader_module_entry->preload_archived_oops(); + } +#endif +} + static ClassLoaderData* null_class_loader_data() { ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); assert(loader_data != nullptr, "must be"); diff --git a/src/hotspot/share/classfile/classLoaderDataShared.hpp b/src/hotspot/share/classfile/classLoaderDataShared.hpp index 944d415af5c..39d0a89418f 100644 --- a/src/hotspot/share/classfile/classLoaderDataShared.hpp +++ b/src/hotspot/share/classfile/classLoaderDataShared.hpp @@ -38,6 +38,7 @@ class ClassLoaderDataShared : AllStatic { static bool _full_module_graph_loaded; CDS_JAVA_HEAP_ONLY(static void ensure_module_entry_table_exists(oop class_loader);) public: + static void load_archived_platform_and_system_class_loaders() NOT_CDS_JAVA_HEAP_RETURN; static void restore_archived_modules_for_preloading_classes(JavaThread* current) NOT_CDS_JAVA_HEAP_RETURN; #if INCLUDE_CDS_JAVA_HEAP static void ensure_module_entry_tables_exist(); diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index ac701e8364f..e41af702601 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -25,9 +25,8 @@ #include "cds/aotMetaspace.hpp" #include "cds/aotReferenceObjSupport.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/altHashing.hpp" #include "classfile/classLoaderData.inline.hpp" #include "classfile/javaClasses.inline.hpp" @@ -978,7 +977,7 @@ void java_lang_Class::fixup_mirror(Klass* k, TRAPS) { } if (k->in_aot_cache() && k->has_archived_mirror_index()) { - if (ArchiveHeapLoader::is_in_use()) { + if (HeapShared::is_archived_heap_in_use()) { bool present = restore_archived_mirror(k, Handle(), Handle(), Handle(), CHECK); assert(present, "Missing archived mirror for %s", k->external_name()); return; diff --git a/src/hotspot/share/classfile/moduleEntry.cpp b/src/hotspot/share/classfile/moduleEntry.cpp index 88b59540d04..5fb3d6f2d13 100644 --- a/src/hotspot/share/classfile/moduleEntry.cpp +++ b/src/hotspot/share/classfile/moduleEntry.cpp @@ -546,6 +546,10 @@ void ModuleEntry::load_from_archive(ClassLoaderData* loader_data) { JFR_ONLY(INIT_ID(this);) } +void ModuleEntry::preload_archived_oops() { + (void)HeapShared::get_root(_archived_module_index, false /* clear */); +} + void ModuleEntry::restore_archived_oops(ClassLoaderData* loader_data) { assert(CDSConfig::is_using_archive(), "runtime only"); Handle module_handle(Thread::current(), HeapShared::get_root(_archived_module_index, /*clear=*/true)); diff --git a/src/hotspot/share/classfile/moduleEntry.hpp b/src/hotspot/share/classfile/moduleEntry.hpp index 1074c88f010..2e1852c5369 100644 --- a/src/hotspot/share/classfile/moduleEntry.hpp +++ b/src/hotspot/share/classfile/moduleEntry.hpp @@ -206,6 +206,7 @@ public: static Array* write_growable_array(GrowableArray* array); static GrowableArray* restore_growable_array(Array* archived_array); void load_from_archive(ClassLoaderData* loader_data); + void preload_archived_oops(); void restore_archived_oops(ClassLoaderData* loader_data); void clear_archived_oops(); static void verify_archived_module_entries() PRODUCT_RETURN; diff --git a/src/hotspot/share/classfile/modules.cpp b/src/hotspot/share/classfile/modules.cpp index 522d1d0842d..baf2acfb78c 100644 --- a/src/hotspot/share/classfile/modules.cpp +++ b/src/hotspot/share/classfile/modules.cpp @@ -739,6 +739,8 @@ void Modules::init_archived_modules(JavaThread* current, Handle h_platform_loade ModuleEntryTable::patch_javabase_entries(current, java_base_module); } + ClassLoaderDataShared::load_archived_platform_and_system_class_loaders(); + ClassLoaderData* platform_loader_data = SystemDictionary::register_loader(h_platform_loader); SystemDictionary::set_platform_loader(platform_loader_data); ClassLoaderDataShared::restore_java_platform_loader_from_archive(platform_loader_data); diff --git a/src/hotspot/share/classfile/stringTable.cpp b/src/hotspot/share/classfile/stringTable.cpp index c6c1c7a31bd..6f9d5d11562 100644 --- a/src/hotspot/share/classfile/stringTable.cpp +++ b/src/hotspot/share/classfile/stringTable.cpp @@ -22,11 +22,10 @@ * */ +#include "cds/aotMappedHeapLoader.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.inline.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/altHashing.hpp" #include "classfile/compactHashtable.hpp" #include "classfile/javaClasses.inline.hpp" @@ -80,7 +79,7 @@ OopHandle StringTable::_shared_strings_array; int StringTable::_shared_strings_array_root_index; inline oop StringTable::read_string_from_compact_hashtable(address base_address, u4 index) { - assert(ArchiveHeapLoader::is_in_use(), "sanity"); + assert(AOTMappedHeapLoader::is_in_use(), "sanity"); objArrayOop array = (objArrayOop)(_shared_strings_array.resolve()); oop s; @@ -316,13 +315,13 @@ void StringTable::create_table() { _local_table = new StringTableHash(start_size_log_2, END_SIZE, REHASH_LEN, true); _oop_storage = OopStorageSet::create_weak("StringTable Weak", mtSymbol); _oop_storage->register_num_dead_callback(&gc_notification); +} #if INCLUDE_CDS_JAVA_HEAP - if (ArchiveHeapLoader::is_in_use()) { - _shared_strings_array = OopHandle(Universe::vm_global(), HeapShared::get_root(_shared_strings_array_root_index)); - } -#endif +void StringTable::load_shared_strings_array() { + _shared_strings_array = OopHandle(Universe::vm_global(), HeapShared::get_root(_shared_strings_array_root_index)); } +#endif void StringTable::item_added() { AtomicAccess::inc(&_items_count); @@ -932,10 +931,14 @@ void StringtableDCmd::execute(DCmdSource source, TRAPS) { // Sharing #if INCLUDE_CDS_JAVA_HEAP size_t StringTable::shared_entry_count() { + assert(HeapShared::is_loading_mapping_mode(), "should not reach here"); return _shared_table.entry_count(); } oop StringTable::lookup_shared(const StringWrapper& name, unsigned int hash) { + if (!AOTMappedHeapLoader::is_in_use()) { + return nullptr; + } assert(hash == hash_wrapped_string(name), "hash must be computed using java_lang_String::hash_code"); // len is required but is already part of StringWrapper, so 0 is used @@ -943,6 +946,9 @@ oop StringTable::lookup_shared(const StringWrapper& name, unsigned int hash) { } oop StringTable::lookup_shared(const jchar* name, int len) { + if (!AOTMappedHeapLoader::is_in_use()) { + return nullptr; + } StringWrapper wrapped_name(name, len); // len is required but is already part of StringWrapper, so 0 is used return _shared_table.lookup(wrapped_name, java_lang_String::hash_code(name, len), 0); @@ -955,6 +961,8 @@ void StringTable::allocate_shared_strings_array(TRAPS) { return; } + assert(HeapShared::is_writing_mapping_mode(), "should not reach here"); + CompileBroker::wait_for_no_active_tasks(); precond(CDSConfig::allow_only_single_java_thread()); @@ -977,7 +985,7 @@ void StringTable::allocate_shared_strings_array(TRAPS) { log_info(aot)("allocated string table for %d strings", total); - if (!ArchiveHeapWriter::is_too_large_to_archive(single_array_size)) { + if (!HeapShared::is_too_large_to_archive(single_array_size)) { // The entire table can fit in a single array objArrayOop array = oopFactory::new_objArray(vmClasses::Object_klass(), total, CHECK); _shared_strings_array = OopHandle(Universe::vm_global(), array); @@ -988,7 +996,7 @@ void StringTable::allocate_shared_strings_array(TRAPS) { size_t primary_array_size = objArrayOopDesc::object_size(primary_array_length); size_t secondary_array_size = objArrayOopDesc::object_size(_secondary_array_max_length); - if (ArchiveHeapWriter::is_too_large_to_archive(secondary_array_size)) { + if (HeapShared::is_too_large_to_archive(secondary_array_size)) { // This can only happen if you have an extremely large number of classes that // refer to more than 16384 * 16384 = 26M interned strings! Not a practical concern // but bail out for safety. @@ -1014,7 +1022,7 @@ void StringTable::allocate_shared_strings_array(TRAPS) { primaryHandle()->obj_at_put(i, secondary); log_info(aot)("string table array (secondary)[%d] length = %d", i, len); - assert(!ArchiveHeapWriter::is_too_large_to_archive(secondary), "sanity"); + assert(!HeapShared::is_too_large_to_archive(secondary), "sanity"); } assert(total == 0, "must be"); @@ -1024,10 +1032,11 @@ void StringTable::allocate_shared_strings_array(TRAPS) { #ifndef PRODUCT void StringTable::verify_secondary_array_index_bits() { + assert(HeapShared::is_writing_mapping_mode(), "should not reach here"); int max; for (max = 1; ; max++) { size_t next_size = objArrayOopDesc::object_size(1 << (max + 1)); - if (ArchiveHeapWriter::is_too_large_to_archive(next_size)) { + if (HeapShared::is_too_large_to_archive(next_size)) { break; } } @@ -1050,6 +1059,7 @@ void StringTable::verify_secondary_array_index_bits() { // [2] Store the index and hashcode into _shared_table. oop StringTable::init_shared_strings_array() { assert(CDSConfig::is_dumping_heap(), "must be"); + assert(HeapShared::is_writing_mapping_mode(), "should not reach here"); objArrayOop array = (objArrayOop)(_shared_strings_array.resolve()); verify_secondary_array_index_bits(); @@ -1057,11 +1067,11 @@ oop StringTable::init_shared_strings_array() { int index = 0; auto copy_into_array = [&] (WeakHandle* val) { oop string = val->peek(); - if (string != nullptr && !ArchiveHeapWriter::is_string_too_large_to_archive(string)) { + if (string != nullptr && !HeapShared::is_string_too_large_to_archive(string)) { // If string is too large, don't put it into the string table. - // - If there are no other refernences to it, it won't be stored into the archive, + // - If there are no other references to it, it won't be stored into the archive, // so we are all good. - // - If there's a referece to it, we will report an error inside HeapShared.cpp and + // - If there's a reference to it, we will report an error inside HeapShared.cpp and // dumping will fail. HeapShared::add_to_dumped_interned_strings(string); if (!_is_two_dimensional_shared_strings_array) { @@ -1095,7 +1105,7 @@ void StringTable::write_shared_table() { int index = 0; auto copy_into_shared_table = [&] (WeakHandle* val) { oop string = val->peek(); - if (string != nullptr && !ArchiveHeapWriter::is_string_too_large_to_archive(string)) { + if (string != nullptr && !HeapShared::is_string_too_large_to_archive(string)) { unsigned int hash = java_lang_String::hash_code(string); writer.add(hash, index); index ++; @@ -1109,6 +1119,7 @@ void StringTable::write_shared_table() { } void StringTable::set_shared_strings_array_index(int root_index) { + assert(HeapShared::is_writing_mapping_mode(), "should not reach here"); _shared_strings_array_root_index = root_index; } @@ -1118,7 +1129,7 @@ void StringTable::serialize_shared_table_header(SerializeClosure* soc) { if (soc->writing()) { // Sanity. Make sure we don't use the shared table at dump time _shared_table.reset(); - } else if (!ArchiveHeapLoader::is_in_use()) { + } else if (!AOTMappedHeapLoader::is_in_use()) { _shared_table.reset(); } diff --git a/src/hotspot/share/classfile/stringTable.hpp b/src/hotspot/share/classfile/stringTable.hpp index 9194d0b8002..839e9d9053d 100644 --- a/src/hotspot/share/classfile/stringTable.hpp +++ b/src/hotspot/share/classfile/stringTable.hpp @@ -128,7 +128,7 @@ private: // [2] _is_two_dimensional_shared_strings_array = true: _shared_strings_array is an Object[][] // This happens when there are too many elements in the shared table. We store them // using two levels of objArrays, such that none of the arrays are too big for - // ArchiveHeapWriter::is_too_large_to_archive(). In this case, the index is splited into two + // AOTMappedHeapWriter::is_too_large_to_archive(). In this case, the index is splited into two // parts. Each shared string is stored as _shared_strings_array[primary_index][secondary_index]: // // [bits 31 .. 14][ bits 13 .. 0 ] @@ -147,6 +147,7 @@ private: static oop lookup_shared(const jchar* name, int len) NOT_CDS_JAVA_HEAP_RETURN_(nullptr); static size_t shared_entry_count() NOT_CDS_JAVA_HEAP_RETURN_(0); static void allocate_shared_strings_array(TRAPS) NOT_CDS_JAVA_HEAP_RETURN; + static void load_shared_strings_array() NOT_CDS_JAVA_HEAP_RETURN; static oop init_shared_strings_array() NOT_CDS_JAVA_HEAP_RETURN_(nullptr); static void write_shared_table() NOT_CDS_JAVA_HEAP_RETURN; static void set_shared_strings_array_index(int root_index) NOT_CDS_JAVA_HEAP_RETURN; diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index 2f7001c86b3..5c49a32b8d0 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -1185,6 +1185,7 @@ void SystemDictionary::preload_class(Handle class_loader, InstanceKlass* ik, TRA ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); oop java_mirror = ik->archived_java_mirror(); precond(java_mirror != nullptr); + assert(java_lang_Class::module(java_mirror) != nullptr, "must have been archived"); Handle pd(THREAD, java_lang_Class::protection_domain(java_mirror)); PackageEntry* pkg_entry = ik->package(); @@ -1202,7 +1203,6 @@ void SystemDictionary::preload_class(Handle class_loader, InstanceKlass* ik, TRA update_dictionary(THREAD, ik, loader_data); } - assert(java_lang_Class::module(java_mirror) != nullptr, "must have been archived"); assert(ik->is_loaded(), "Must be in at least loaded state"); } diff --git a/src/hotspot/share/classfile/vmClasses.cpp b/src/hotspot/share/classfile/vmClasses.cpp index fbb234d95c0..0a3d33f4c5b 100644 --- a/src/hotspot/share/classfile/vmClasses.cpp +++ b/src/hotspot/share/classfile/vmClasses.cpp @@ -23,10 +23,12 @@ */ #include "cds/aotLinkedClassBulkLoader.hpp" -#include "cds/archiveHeapLoader.hpp" +#include "cds/aotMappedHeapLoader.hpp" #include "cds/cdsConfig.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" +#include "classfile/classLoaderDataShared.hpp" #include "classfile/dictionary.hpp" #include "classfile/javaClasses.hpp" #include "classfile/systemDictionary.hpp" @@ -132,21 +134,28 @@ void vmClasses::resolve_all(TRAPS) { CollectedHeap::set_filler_object_klass(vmClasses::Object_klass()); #if INCLUDE_CDS if (CDSConfig::is_using_archive()) { - // It's unsafe to access the archived heap regions before they - // are fixed up, so we must do the fixup as early as possible - // before the archived java objects are accessed by functions - // such as java_lang_Class::restore_archived_mirror and - // ConstantPool::restore_unshareable_info (restores the archived - // resolved_references array object). - // - // ArchiveHeapLoader::fixup_regions fills the empty - // spaces in the archived heap regions and may use - // vmClasses::Object_klass(), so we can do this only after - // Object_klass is resolved. See the above resolve_through() - // call. No mirror objects are accessed/restored in the above call. - // Mirrors are restored after java.lang.Class is loaded. - ArchiveHeapLoader::fixup_region(); - +#if INCLUDE_CDS_JAVA_HEAP + if (HeapShared::is_loading() && HeapShared::is_loading_mapping_mode()) { + // It's unsafe to access the archived heap regions before they + // are fixed up, so we must do the fixup as early as possible + // before the archived java objects are accessed by functions + // such as java_lang_Class::restore_archived_mirror and + // ConstantPool::restore_unshareable_info (restores the archived + // resolved_references array object). + // + // AOTMappedHeapLoader::fixup_regions fills the empty + // spaces in the archived heap regions and may use + // vmClasses::Object_klass(), so we can do this only after + // Object_klass is resolved. See the above resolve_through() + // call. No mirror objects are accessed/restored in the above call. + // Mirrors are restored after java.lang.Class is loaded. + AOTMappedHeapLoader::fixup_region(); + } + if (HeapShared::is_archived_heap_in_use() && !CDSConfig::is_using_full_module_graph()) { + // Need to remove all the archived java.lang.Module objects from HeapShared::roots(). + ClassLoaderDataShared::clear_archived_oops(); + } +#endif // INCLUDE_CDS_JAVA_HEAP // Initialize the constant pool for the Object_class assert(Object_klass()->in_aot_cache(), "must be"); Object_klass()->constants()->restore_unshareable_info(CHECK); diff --git a/src/hotspot/share/gc/shared/collectedHeap.cpp b/src/hotspot/share/gc/shared/collectedHeap.cpp index bed6a2f22e6..c8dd39e72be 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.cpp +++ b/src/hotspot/share/gc/shared/collectedHeap.cpp @@ -631,6 +631,10 @@ void CollectedHeap::before_exit() { stop(); } +size_t CollectedHeap::bootstrap_max_memory() const { + return MaxNewSize; +} + #ifndef PRODUCT bool CollectedHeap::promotion_should_fail(volatile size_t* count) { diff --git a/src/hotspot/share/gc/shared/collectedHeap.hpp b/src/hotspot/share/gc/shared/collectedHeap.hpp index 3b5865e0001..659106f9c19 100644 --- a/src/hotspot/share/gc/shared/collectedHeap.hpp +++ b/src/hotspot/share/gc/shared/collectedHeap.hpp @@ -500,6 +500,7 @@ protected: virtual bool can_load_archived_objects() const { return false; } virtual HeapWord* allocate_loaded_archive_space(size_t size) { return nullptr; } virtual void complete_loaded_archive_space(MemRegion archive_space) { } + virtual size_t bootstrap_max_memory() const; virtual bool is_oop(oop object) const; // Non product verification and debugging. diff --git a/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp b/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp index 50155a66951..128ba4152dc 100644 --- a/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp +++ b/src/hotspot/share/gc/shared/stringdedup/stringDedupConfig.cpp @@ -22,6 +22,7 @@ * */ +#include "cds/cdsConfig.hpp" #include "classfile/altHashing.hpp" #include "gc/shared/stringdedup/stringDedupConfig.hpp" #include "logging/log.hpp" diff --git a/src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp b/src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp index 5f04be97b74..cfa276c0de0 100644 --- a/src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp +++ b/src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp @@ -22,6 +22,8 @@ * */ +#include "cds/aotMappedHeapLoader.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/altHashing.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/stringTable.hpp" @@ -514,6 +516,7 @@ void StringDedup::Table::install(typeArrayOop obj, uint hash_code) { // access to a String that is incompletely constructed; the value could be // set before the coder. bool StringDedup::Table::try_deduplicate_shared(oop java_string) { + assert(!HeapShared::is_loading_streaming_mode(), "should not reach here"); typeArrayOop value = java_lang_String::value(java_string); assert(value != nullptr, "precondition"); assert(TypeArrayKlass::cast(value->klass())->element_type() == T_BYTE, "precondition"); @@ -559,6 +562,7 @@ bool StringDedup::Table::try_deduplicate_shared(oop java_string) { } bool StringDedup::Table::try_deduplicate_found_shared(oop java_string, oop found) { + assert(!HeapShared::is_loading_streaming_mode(), "should not reach here"); _cur_stat.inc_known_shared(); typeArrayOop found_value = java_lang_String::value(found); if (found_value == java_lang_String::value(java_string)) { @@ -609,7 +613,8 @@ bool StringDedup::Table::deduplicate_if_permitted(oop java_string, void StringDedup::Table::deduplicate(oop java_string) { assert(java_lang_String::is_instance(java_string), "precondition"); _cur_stat.inc_inspected(); - if ((StringTable::shared_entry_count() > 0) && + if (AOTMappedHeapLoader::is_in_use() && + (StringTable::shared_entry_count() > 0) && try_deduplicate_shared(java_string)) { return; // Done if deduplicated against shared StringTable. } diff --git a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp index 38f055c34b6..22a59b5ac18 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp @@ -25,7 +25,7 @@ */ -#include "cds/archiveHeapWriter.hpp" +#include "cds/aotMappedHeapWriter.hpp" #include "classfile/systemDictionary.hpp" #include "gc/shared/classUnloadingContext.hpp" #include "gc/shared/fullGCForwarding.hpp" @@ -2770,7 +2770,7 @@ HeapWord* ShenandoahHeap::allocate_loaded_archive_space(size_t size) { // // CDS would guarantee no objects straddle multiple regions, as long as regions are as large // as MIN_GC_REGION_ALIGNMENT. - guarantee(ShenandoahHeapRegion::region_size_bytes() >= ArchiveHeapWriter::MIN_GC_REGION_ALIGNMENT, "Must be"); + guarantee(ShenandoahHeapRegion::region_size_bytes() >= AOTMappedHeapWriter::MIN_GC_REGION_ALIGNMENT, "Must be"); ShenandoahAllocRequest req = ShenandoahAllocRequest::for_cds(size); return allocate_memory(req); diff --git a/src/hotspot/share/gc/z/zArguments.cpp b/src/hotspot/share/gc/z/zArguments.cpp index 2435c6fb31f..f2ff35a6a43 100644 --- a/src/hotspot/share/gc/z/zArguments.cpp +++ b/src/hotspot/share/gc/z/zArguments.cpp @@ -208,6 +208,13 @@ void ZArguments::initialize() { FLAG_SET_DEFAULT(LogEventsBufferEntries, 250); } + if (VerifyArchivedFields > 0) { + // ZGC doesn't support verifying at arbitrary points as our normal state is that everything in the + // heap looks completely insane. Only at some particular points does the heap look sort of sane. + // So instead of verifying we trigger a GC that does its own verification when it's suitable. + FLAG_SET_DEFAULT(VerifyArchivedFields, 2); + } + // Verification before startup and after exit not (yet) supported FLAG_SET_DEFAULT(VerifyDuringStartup, false); FLAG_SET_DEFAULT(VerifyBeforeExit, false); diff --git a/src/hotspot/share/gc/z/zCollectedHeap.cpp b/src/hotspot/share/gc/z/zCollectedHeap.cpp index 1fbb4b25e2d..db55fff673a 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.cpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.cpp @@ -34,6 +34,7 @@ #include "gc/z/zGeneration.inline.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zHeap.inline.hpp" +#include "gc/z/zHeuristics.hpp" #include "gc/z/zJNICritical.hpp" #include "gc/z/zNMethod.hpp" #include "gc/z/zObjArrayAllocator.hpp" @@ -298,6 +299,10 @@ void ZCollectedHeap::unregister_nmethod(nmethod* nm) { ZNMethod::purge_nmethod(nm); } +size_t ZCollectedHeap::bootstrap_max_memory() const { + return MaxHeapSize - ZHeuristics::significant_young_overhead(); +} + void ZCollectedHeap::verify_nmethod(nmethod* nm) { // Does nothing } diff --git a/src/hotspot/share/gc/z/zCollectedHeap.hpp b/src/hotspot/share/gc/z/zCollectedHeap.hpp index 07366b35d30..19c9ab1bbdf 100644 --- a/src/hotspot/share/gc/z/zCollectedHeap.hpp +++ b/src/hotspot/share/gc/z/zCollectedHeap.hpp @@ -115,6 +115,8 @@ public: void pin_object(JavaThread* thread, oop obj) override; void unpin_object(JavaThread* thread, oop obj) override; + size_t bootstrap_max_memory() const override; + void print_heap_on(outputStream* st) const override; void print_gc_on(outputStream* st) const override; bool print_location(outputStream* st, void* addr) const override; diff --git a/src/hotspot/share/gc/z/zDirector.cpp b/src/hotspot/share/gc/z/zDirector.cpp index a85d3df6a81..9ff56ce74bb 100644 --- a/src/hotspot/share/gc/z/zDirector.cpp +++ b/src/hotspot/share/gc/z/zDirector.cpp @@ -32,6 +32,7 @@ #include "gc/z/zLock.inline.hpp" #include "gc/z/zStat.hpp" #include "logging/log.hpp" +#include "runtime/init.hpp" ZDirector* ZDirector::_director; @@ -916,6 +917,12 @@ void ZDirector::run_thread() { // Main loop while (wait_for_tick()) { ZDirectorStats stats = sample_stats(); + + if (!is_init_completed()) { + // Not allowed to start GCs yet + continue; + } + if (!start_gc(stats)) { adjust_gc(stats); } diff --git a/src/hotspot/share/jfr/support/jfrThreadLocal.cpp b/src/hotspot/share/jfr/support/jfrThreadLocal.cpp index 480d28f8c55..5fe5546e0a9 100644 --- a/src/hotspot/share/jfr/support/jfrThreadLocal.cpp +++ b/src/hotspot/share/jfr/support/jfrThreadLocal.cpp @@ -477,11 +477,10 @@ traceid JfrThreadLocal::external_thread_id(const Thread* t) { return JfrRecorder::is_recording() ? thread_id(t) : jvm_thread_id(t); } -static inline traceid load_java_thread_id(const Thread* t) { +static inline traceid load_java_thread_id(const JavaThread* t) { assert(t != nullptr, "invariant"); - assert(t->is_Java_thread(), "invariant"); - oop threadObj = JavaThread::cast(t)->threadObj(); - return threadObj != nullptr ? AccessThreadTraceId::id(threadObj) : 0; + oop threadObj = t->threadObj(); + return threadObj != nullptr ? AccessThreadTraceId::id(threadObj) : static_cast(t->monitor_owner_id()); } #ifdef ASSERT @@ -502,7 +501,7 @@ traceid JfrThreadLocal::assign_thread_id(const Thread* t, JfrThreadLocal* tl) { if (tid == 0) { assert(can_assign(t), "invariant"); if (t->is_Java_thread()) { - tid = load_java_thread_id(t); + tid = load_java_thread_id(JavaThread::cast(t)); tl->_jvm_thread_id = tid; AtomicAccess::store(&tl->_vthread_id, tid); return tid; diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp index 69afe5c6450..db0435044ca 100644 --- a/src/hotspot/share/memory/universe.cpp +++ b/src/hotspot/share/memory/universe.cpp @@ -23,10 +23,9 @@ */ #include "cds/aotMetaspace.hpp" -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsConfig.hpp" #include "cds/dynamicArchive.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/classLoaderDataShared.hpp" @@ -323,7 +322,7 @@ void Universe::archive_exception_instances() { } void Universe::load_archived_object_instances() { - if (ArchiveHeapLoader::is_in_use()) { + if (HeapShared::is_archived_heap_in_use()) { for (int i = T_BOOLEAN; i < T_VOID+1; i++) { int index = _archived_basic_type_mirror_indices[i]; if (!is_reference_type((BasicType)i) && index >= 0) { @@ -559,10 +558,8 @@ void Universe::genesis(TRAPS) { void Universe::initialize_basic_type_mirrors(TRAPS) { #if INCLUDE_CDS_JAVA_HEAP if (CDSConfig::is_using_archive() && - ArchiveHeapLoader::is_in_use() && + HeapShared::is_archived_heap_in_use() && _basic_type_mirrors[T_INT].resolve() != nullptr) { - assert(ArchiveHeapLoader::can_use(), "Sanity"); - // check that all basic type mirrors are mapped also for (int i = T_BOOLEAN; i < T_VOID+1; i++) { if (!is_reference_type((BasicType)i)) { @@ -571,7 +568,7 @@ void Universe::initialize_basic_type_mirrors(TRAPS) { } } } else - // _basic_type_mirrors[T_INT], etc, are null if archived heap is not mapped. + // _basic_type_mirrors[T_INT], etc, are null if not using an archived heap #endif { for (int i = T_BOOLEAN; i < T_VOID+1; i++) { @@ -911,6 +908,21 @@ jint universe_init() { return JNI_EINVAL; } + // Add main_thread to threads list to finish barrier setup with + // on_thread_attach. Should be before starting to build Java objects in + // the AOT heap loader, which invokes barriers. + { + JavaThread* main_thread = JavaThread::current(); + MutexLocker mu(Threads_lock); + Threads::add(main_thread); + } + + HeapShared::initialize_writing_mode(); + + // Create the string table before the AOT object archive is loaded, + // as it might need to access the string table. + StringTable::create_table(); + #if INCLUDE_CDS if (CDSConfig::is_using_archive()) { // Read the data structures supporting the shared spaces (shared @@ -933,7 +945,6 @@ jint universe_init() { #endif SymbolTable::create_table(); - StringTable::create_table(); if (strlen(VerifySubSet) > 0) { Universe::initialize_verify_flags(); @@ -1178,6 +1189,7 @@ bool universe_post_init() { MemoryService::add_metaspace_memory_pools(); MemoryService::set_universe_heap(Universe::heap()); + #if INCLUDE_CDS AOTMetaspace::post_initialize(CHECK_false); #endif diff --git a/src/hotspot/share/oops/constantPool.cpp b/src/hotspot/share/oops/constantPool.cpp index b072c7f26ec..95a43b07bd7 100644 --- a/src/hotspot/share/oops/constantPool.cpp +++ b/src/hotspot/share/oops/constantPool.cpp @@ -24,10 +24,8 @@ #include "cds/aotConstantPoolResolver.hpp" #include "cds/archiveBuilder.hpp" -#include "cds/archiveHeapLoader.hpp" -#include "cds/archiveHeapWriter.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" #include "classfile/javaClasses.inline.hpp" @@ -358,7 +356,7 @@ objArrayOop ConstantPool::prepare_resolved_references_for_archiving() { int index = object_to_cp_index(i); if (tag_at(index).is_string()) { assert(java_lang_String::is_instance(obj), "must be"); - if (!ArchiveHeapWriter::is_string_too_large_to_archive(obj)) { + if (!HeapShared::is_string_too_large_to_archive(obj)) { scratch_rr->obj_at_put(i, obj); } continue; @@ -398,7 +396,7 @@ void ConstantPool::restore_unshareable_info(TRAPS) { if (vmClasses::Object_klass_is_loaded()) { ClassLoaderData* loader_data = pool_holder()->class_loader_data(); #if INCLUDE_CDS_JAVA_HEAP - if (ArchiveHeapLoader::is_in_use() && + if (HeapShared::is_archived_heap_in_use() && _cache->archived_references() != nullptr) { oop archived = _cache->archived_references(); // Create handle for the archived resolved reference array object diff --git a/src/hotspot/share/oops/klass.cpp b/src/hotspot/share/oops/klass.cpp index d9041cc54f4..b30ec2f4887 100644 --- a/src/hotspot/share/oops/klass.cpp +++ b/src/hotspot/share/oops/klass.cpp @@ -22,9 +22,8 @@ * */ -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.inline.hpp" #include "classfile/classLoaderDataGraph.inline.hpp" @@ -900,7 +899,7 @@ void Klass::restore_unshareable_info(ClassLoaderData* loader_data, Handle protec if (this->has_archived_mirror_index()) { ResourceMark rm(THREAD); log_debug(aot, mirror)("%s has raw archived mirror", external_name()); - if (ArchiveHeapLoader::is_in_use()) { + if (HeapShared::is_archived_heap_in_use()) { bool present = java_lang_Class::restore_archived_mirror(this, loader, module_handle, protection_domain, CHECK); diff --git a/src/hotspot/share/oops/objArrayOop.hpp b/src/hotspot/share/oops/objArrayOop.hpp index 27042b22e7e..82bb41b5fd1 100644 --- a/src/hotspot/share/oops/objArrayOop.hpp +++ b/src/hotspot/share/oops/objArrayOop.hpp @@ -35,7 +35,7 @@ class Klass; // Evaluating "String arg[10]" will create an objArrayOop. class objArrayOopDesc : public arrayOopDesc { - friend class ArchiveHeapWriter; + friend class AOTMappedHeapWriter; friend class ObjArrayKlass; friend class Runtime1; friend class psPromotionManager; diff --git a/src/hotspot/share/oops/oopsHierarchy.cpp b/src/hotspot/share/oops/oopsHierarchy.cpp index a62d37ce2ba..21b8a57795d 100644 --- a/src/hotspot/share/oops/oopsHierarchy.cpp +++ b/src/hotspot/share/oops/oopsHierarchy.cpp @@ -33,7 +33,6 @@ CheckOopFunctionPointer check_oop_function = nullptr; void oop::register_oop() { assert (CheckUnhandledOops, "should only call when CheckUnhandledOops"); - if (!Universe::is_fully_initialized()) return; // This gets expensive, which is why checking unhandled oops is on a switch. Thread* t = Thread::current_or_null(); if (t != nullptr && t->is_Java_thread()) { @@ -43,7 +42,6 @@ void oop::register_oop() { void oop::unregister_oop() { assert (CheckUnhandledOops, "should only call when CheckUnhandledOops"); - if (!Universe::is_fully_initialized()) return; // This gets expensive, which is why checking unhandled oops is on a switch. Thread* t = Thread::current_or_null(); if (t != nullptr && t->is_Java_thread()) { diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp index 34d2d614d22..5af8edbb758 100644 --- a/src/hotspot/share/prims/jni.cpp +++ b/src/hotspot/share/prims/jni.cpp @@ -3491,6 +3491,10 @@ enum VM_Creation_State { volatile VM_Creation_State vm_created = NOT_CREATED; +bool is_vm_created() { + return AtomicAccess::load(&vm_created) == COMPLETE; +} + // Indicate whether it is safe to recreate VM. Recreation is only // possible after a failed initial creation attempt in some cases. volatile int safe_to_recreate_vm = 1; diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp index 96437882584..69d1fa2c974 100644 --- a/src/hotspot/share/prims/jvmtiExport.cpp +++ b/src/hotspot/share/prims/jvmtiExport.cpp @@ -22,6 +22,7 @@ * */ +#include "cds/aotThread.hpp" #include "classfile/javaClasses.inline.hpp" #include "classfile/moduleEntry.hpp" #include "classfile/vmClasses.hpp" @@ -1485,6 +1486,13 @@ void JvmtiExport::post_thread_start(JavaThread *thread) { } assert(thread->thread_state() == _thread_in_vm, "must be in vm state"); + if (thread->is_aot_thread()) { + // The AOT thread is hidden from view but has no thread oop when it starts due + // to bootstrapping complexity, so we check for it before checking for bound + // virtual threads. When exiting it is filtered out due to being hidden. + return; + } + EVT_TRIG_TRACE(JVMTI_EVENT_THREAD_START, ("[%s] Trg Thread Start event triggered", JvmtiTrace::safe_get_thread_name(thread))); diff --git a/src/hotspot/share/prims/jvmtiRawMonitor.cpp b/src/hotspot/share/prims/jvmtiRawMonitor.cpp index 85a7714fb29..df8a0fb0275 100644 --- a/src/hotspot/share/prims/jvmtiRawMonitor.cpp +++ b/src/hotspot/share/prims/jvmtiRawMonitor.cpp @@ -22,6 +22,7 @@ * */ +#include "cds/aotThread.hpp" #include "memory/allocation.inline.hpp" #include "prims/jvmtiRawMonitor.hpp" #include "runtime/atomicAccess.hpp" @@ -29,6 +30,7 @@ #include "runtime/javaThread.hpp" #include "runtime/orderAccess.hpp" #include "runtime/threads.hpp" +#include "runtime/threadSMR.hpp" JvmtiRawMonitor::QNode::QNode(Thread* thread) : _next(nullptr), _prev(nullptr), _event(thread->_ParkEvent), @@ -39,10 +41,15 @@ GrowableArray* JvmtiPendingMonitors::_monitors = new (mtServiceability) GrowableArray(1, mtServiceability); void JvmtiPendingMonitors::transition_raw_monitors() { - assert((Threads::number_of_threads()==1), - "Java thread has not been created yet or more than one java thread " - "is running. Raw monitor transition will not work"); JavaThread* current_java_thread = JavaThread::current(); + +#ifdef ASSERT + for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thread = jtiwh.next(); ) { + assert(thread == current_java_thread || thread->is_aot_thread(), + "Didn't expect concurrent application threads at this point"); + } +#endif + { ThreadToNativeFromVM ttnfvm(current_java_thread); for (int i = 0; i < count(); i++) { diff --git a/src/hotspot/share/prims/whitebox.cpp b/src/hotspot/share/prims/whitebox.cpp index f5d1edd28f4..8f0a2320288 100644 --- a/src/hotspot/share/prims/whitebox.cpp +++ b/src/hotspot/share/prims/whitebox.cpp @@ -23,11 +23,11 @@ */ #include "cds.h" +#include "cds/aotMappedHeapLoader.hpp" #include "cds/aotMetaspace.hpp" -#include "cds/archiveHeapLoader.hpp" #include "cds/cdsConstants.hpp" #include "cds/filemap.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/classLoaderDataGraph.hpp" #include "classfile/classLoaderStats.hpp" @@ -2205,6 +2205,9 @@ WB_ENTRY(jboolean, WB_CDSMemoryMappingFailed(JNIEnv* env, jobject wb)) WB_END WB_ENTRY(jboolean, WB_IsSharedInternedString(JNIEnv* env, jobject wb, jobject str)) + if (!HeapShared::is_loading_mapping_mode()) { + return false; + } ResourceMark rm(THREAD); oop str_oop = JNIHandles::resolve(str); int length; @@ -2217,7 +2220,7 @@ WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz)) WB_END WB_ENTRY(jboolean, WB_AreSharedStringsMapped(JNIEnv* env)) - return ArchiveHeapLoader::is_mapped(); + return AOTMappedHeapLoader::is_mapped(); WB_END WB_ENTRY(void, WB_LinkClass(JNIEnv* env, jobject wb, jclass clazz)) @@ -2230,7 +2233,7 @@ WB_ENTRY(void, WB_LinkClass(JNIEnv* env, jobject wb, jclass clazz)) WB_END WB_ENTRY(jboolean, WB_AreOpenArchiveHeapObjectsMapped(JNIEnv* env)) - return ArchiveHeapLoader::is_mapped(); + return AOTMappedHeapLoader::is_mapped(); WB_END WB_ENTRY(jboolean, WB_IsCDSIncluded(JNIEnv* env)) @@ -2260,10 +2263,21 @@ WB_ENTRY(jboolean, WB_IsJVMCISupportedByGC(JNIEnv* env)) #endif WB_END -WB_ENTRY(jboolean, WB_CanWriteJavaHeapArchive(JNIEnv* env)) +static bool canWriteJavaHeapArchive() { return !CDSConfig::are_vm_options_incompatible_with_dumping_heap(); +} + +WB_ENTRY(jboolean, WB_CanWriteJavaHeapArchive(JNIEnv* env)) + return canWriteJavaHeapArchive(); WB_END +WB_ENTRY(jboolean, WB_CanWriteMappedJavaHeapArchive(JNIEnv* env)) + return canWriteJavaHeapArchive() && !AOTStreamableObjects; +WB_END + +WB_ENTRY(jboolean, WB_CanWriteStreamedJavaHeapArchive(JNIEnv* env)) + return canWriteJavaHeapArchive() && AOTStreamableObjects; +WB_END WB_ENTRY(jboolean, WB_IsJFRIncluded(JNIEnv* env)) #if INCLUDE_JFR @@ -3040,6 +3054,8 @@ static JNINativeMethod methods[] = { {CC"isC2OrJVMCIIncluded", CC"()Z", (void*)&WB_isC2OrJVMCIIncluded }, {CC"isJVMCISupportedByGC", CC"()Z", (void*)&WB_IsJVMCISupportedByGC}, {CC"canWriteJavaHeapArchive", CC"()Z", (void*)&WB_CanWriteJavaHeapArchive }, + {CC"canWriteMappedJavaHeapArchive", CC"()Z", (void*)&WB_CanWriteMappedJavaHeapArchive }, + {CC"canWriteStreamedJavaHeapArchive", CC"()Z", (void*)&WB_CanWriteStreamedJavaHeapArchive }, {CC"cdsMemoryMappingFailed", CC"()Z", (void*)&WB_CDSMemoryMappingFailed }, {CC"clearInlineCaches0", CC"(Z)V", (void*)&WB_ClearInlineCaches }, diff --git a/src/hotspot/share/runtime/javaThread.cpp b/src/hotspot/share/runtime/javaThread.cpp index f52be5d740e..28bc47c4c74 100644 --- a/src/hotspot/share/runtime/javaThread.cpp +++ b/src/hotspot/share/runtime/javaThread.cpp @@ -121,7 +121,7 @@ size_t JavaThread::_stack_size_at_create = 0; #define HOTSPOT_THREAD_PROBE_stop HOTSPOT_THREAD_STOP #define DTRACE_THREAD_PROBE(probe, javathread) \ - { \ + if (!javathread->is_aot_thread()) { \ ResourceMark rm(this); \ int len = 0; \ const char* name = (javathread)->name(); \ @@ -763,7 +763,7 @@ void JavaThread::run() { void JavaThread::thread_main_inner() { assert(JavaThread::current() == this, "sanity check"); - assert(_threadObj.peek() != nullptr, "just checking"); + assert(_threadObj.peek() != nullptr || is_aot_thread(), "just checking"); // Execute thread entry point unless this thread has a pending exception. // Note: Due to JVMTI StopThread we can have pending exceptions already! diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp index 8274d767e4e..e4707a342a7 100644 --- a/src/hotspot/share/runtime/mutexLocker.cpp +++ b/src/hotspot/share/runtime/mutexLocker.cpp @@ -79,6 +79,7 @@ Monitor* CompileThread_lock = nullptr; Monitor* Compilation_lock = nullptr; Mutex* CompileStatistics_lock = nullptr; Mutex* DirectivesStack_lock = nullptr; +Monitor* AOTHeapLoading_lock = nullptr; Monitor* Terminator_lock = nullptr; Monitor* InitCompleted_lock = nullptr; Monitor* BeforeExit_lock = nullptr; @@ -330,7 +331,9 @@ void mutex_init() { MUTEX_DEFL(Threads_lock , PaddedMonitor, CompileThread_lock, true); MUTEX_DEFL(Compile_lock , PaddedMutex , MethodCompileQueue_lock); - MUTEX_DEFL(JNICritical_lock , PaddedMonitor, AdapterHandlerLibrary_lock); // used for JNI critical regions + MUTEX_DEFL(Module_lock , PaddedMutex , AdapterHandlerLibrary_lock); + MUTEX_DEFL(AOTHeapLoading_lock , PaddedMonitor, Module_lock); + MUTEX_DEFL(JNICritical_lock , PaddedMonitor, AOTHeapLoading_lock); // used for JNI critical regions MUTEX_DEFL(Heap_lock , PaddedMonitor, JNICritical_lock); MUTEX_DEFL(PerfDataMemAlloc_lock , PaddedMutex , Heap_lock); @@ -353,7 +356,6 @@ void mutex_init() { MUTEX_DEFL(PSOldGenExpand_lock , PaddedMutex , Heap_lock, true); } #endif - MUTEX_DEFL(Module_lock , PaddedMutex , ClassLoaderDataGraph_lock); MUTEX_DEFL(SystemDictionary_lock , PaddedMonitor, Module_lock); #if INCLUDE_JVMCI // JVMCIRuntime_lock must be acquired before JVMCI_lock to avoid deadlock diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp index 8cd408c99c9..74fe4650b7c 100644 --- a/src/hotspot/share/runtime/mutexLocker.hpp +++ b/src/hotspot/share/runtime/mutexLocker.hpp @@ -81,6 +81,7 @@ extern Monitor* TrainingReplayQueue_lock; // a lock held when class are a extern Monitor* CompileTaskWait_lock; // a lock held when CompileTasks are waited/notified extern Mutex* CompileStatistics_lock; // a lock held when updating compilation statistics extern Mutex* DirectivesStack_lock; // a lock held when mutating the dirstack and ref counting directives +extern Monitor* AOTHeapLoading_lock; // a lock used to guard materialization of AOT heap objects extern Monitor* Terminator_lock; // a lock used to guard termination of the vm extern Monitor* InitCompleted_lock; // a lock used to signal threads waiting on init completed extern Monitor* BeforeExit_lock; // a lock used to guard cleanups and shutdown hooks diff --git a/src/hotspot/share/runtime/safepointVerifiers.cpp b/src/hotspot/share/runtime/safepointVerifiers.cpp index 00b55e7d25f..6eb61efe0ca 100644 --- a/src/hotspot/share/runtime/safepointVerifiers.cpp +++ b/src/hotspot/share/runtime/safepointVerifiers.cpp @@ -30,13 +30,19 @@ #ifdef ASSERT -NoSafepointVerifier::NoSafepointVerifier() : _thread(Thread::current()) { +NoSafepointVerifier::NoSafepointVerifier(bool active) : _thread(Thread::current()), _active(active) { + if (!_active) { + return; + } if (_thread->is_Java_thread()) { JavaThread::cast(_thread)->inc_no_safepoint_count(); } } NoSafepointVerifier::~NoSafepointVerifier() { + if (!_active) { + return; + } if (_thread->is_Java_thread()) { JavaThread::cast(_thread)->dec_no_safepoint_count(); } diff --git a/src/hotspot/share/runtime/safepointVerifiers.hpp b/src/hotspot/share/runtime/safepointVerifiers.hpp index 62a1732803f..8d309a973d8 100644 --- a/src/hotspot/share/runtime/safepointVerifiers.hpp +++ b/src/hotspot/share/runtime/safepointVerifiers.hpp @@ -38,8 +38,9 @@ class NoSafepointVerifier : public StackObj { private: Thread *_thread; + bool _active; public: - NoSafepointVerifier() NOT_DEBUG_RETURN; + explicit NoSafepointVerifier(bool active = true) NOT_DEBUG_RETURN; ~NoSafepointVerifier() NOT_DEBUG_RETURN; }; diff --git a/src/hotspot/share/runtime/thread.hpp b/src/hotspot/share/runtime/thread.hpp index 4aa8c14056a..240821e90bd 100644 --- a/src/hotspot/share/runtime/thread.hpp +++ b/src/hotspot/share/runtime/thread.hpp @@ -313,6 +313,7 @@ class Thread: public ThreadShadow { virtual bool is_JfrRecorder_thread() const { return false; } virtual bool is_AttachListener_thread() const { return false; } virtual bool is_monitor_deflation_thread() const { return false; } + virtual bool is_aot_thread() const { return false; } // Convenience cast functions CompilerThread* as_Compiler_thread() const { diff --git a/src/hotspot/share/runtime/threads.cpp b/src/hotspot/share/runtime/threads.cpp index 10c3636273d..f7f755a37b3 100644 --- a/src/hotspot/share/runtime/threads.cpp +++ b/src/hotspot/share/runtime/threads.cpp @@ -27,7 +27,7 @@ #include "cds/aotMetaspace.hpp" #include "cds/cds_globals.hpp" #include "cds/cdsConfig.hpp" -#include "cds/heapShared.hpp" +#include "cds/heapShared.inline.hpp" #include "classfile/classLoader.hpp" #include "classfile/javaClasses.hpp" #include "classfile/javaThreadStatus.hpp" @@ -102,6 +102,7 @@ #include "services/management.hpp" #include "services/threadIdTable.hpp" #include "services/threadService.hpp" +#include "utilities/debug.hpp" #include "utilities/dtrace.hpp" #include "utilities/events.hpp" #include "utilities/macros.hpp" @@ -383,6 +384,8 @@ void Threads::initialize_java_lang_classes(JavaThread* main_thread, TRAPS) { initialize_class(vmSymbols::java_lang_reflect_Method(), CHECK); initialize_class(vmSymbols::java_lang_ref_Finalizer(), CHECK); + HeapShared::materialize_thread_object(); + // Phase 1 of the system initialization in the library, java.lang.System class initialization call_initPhase1(CHECK); @@ -563,7 +566,8 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // Initialize OopStorage for threadObj JavaThread::_thread_oop_storage = OopStorageSet::create_strong("Thread OopStorage", mtThread); - // Attach the main thread to this os thread + // Attach the main thread to this os thread. It is added to the threads list inside + // universe_init(), within init_globals(). JavaThread* main_thread = new JavaThread(); main_thread->set_thread_state(_thread_in_vm); main_thread->initialize_thread_current(); @@ -577,7 +581,9 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // Set the _monitor_owner_id now since we will run Java code before the Thread instance // is even created. The same value will be assigned to the Thread instance on init. - main_thread->set_monitor_owner_id(ThreadIdentifier::next()); + const int64_t main_thread_tid = ThreadIdentifier::next(); + guarantee(main_thread_tid == 3, "Must equal the PRIMORDIAL_TID used in Threads.java"); + main_thread->set_monitor_owner_id(main_thread_tid); if (!Thread::set_as_starting_thread(main_thread)) { vm_shutdown_during_initialization( @@ -613,14 +619,6 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // of hangs during error reporting. WatcherThread::start(); - // Add main_thread to threads list to finish barrier setup with - // on_thread_attach. Should be before starting to build Java objects in - // init_globals2, which invokes barriers. - { - MutexLocker mu(Threads_lock); - Threads::add(main_thread); - } - status = init_globals2(); if (status != JNI_OK) { Threads::remove(main_thread, false); @@ -704,6 +702,9 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // No more stub generation allowed after that point. StubCodeDesc::freeze(); + // Prepare AOT heap loader for GC. + HeapShared::enable_gc(); + #ifdef ADDRESS_SANITIZER Asan::initialize(); #endif @@ -899,6 +900,9 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // take a while to process their first tick). WatcherThread::run_all_tasks(); + // Finish materializing AOT objects + HeapShared::finish_materialize_objects(); + create_vm_timer.end(); #ifdef ASSERT _vm_complete = true; diff --git a/src/hotspot/share/utilities/exceptions.cpp b/src/hotspot/share/utilities/exceptions.cpp index 22a8cd6e0ef..b54474ea6d6 100644 --- a/src/hotspot/share/utilities/exceptions.cpp +++ b/src/hotspot/share/utilities/exceptions.cpp @@ -581,12 +581,13 @@ inline void ExceptionMark::check_no_pending_exception() { } } +extern bool is_vm_created(); ExceptionMark::~ExceptionMark() { if (_thread->has_pending_exception()) { Handle exception(_thread, _thread->pending_exception()); _thread->clear_pending_exception(); // Needed to avoid infinite recursion - if (is_init_completed()) { + if (is_vm_created()) { ResourceMark rm; exception->print(); fatal("ExceptionMark destructor expects no pending exceptions"); diff --git a/src/hotspot/share/utilities/macros.hpp b/src/hotspot/share/utilities/macros.hpp index 1d2e651d674..9bdf4c2dd1f 100644 --- a/src/hotspot/share/utilities/macros.hpp +++ b/src/hotspot/share/utilities/macros.hpp @@ -615,7 +615,7 @@ #define COMPILER_HEADER(basename) XSTR(COMPILER_HEADER_STEM(basename).hpp) #define COMPILER_HEADER_INLINE(basename) XSTR(COMPILER_HEADER_STEM(basename).inline.hpp) -#if INCLUDE_CDS && INCLUDE_G1GC && defined(_LP64) +#if INCLUDE_CDS && defined(_LP64) #define INCLUDE_CDS_JAVA_HEAP 1 #define CDS_JAVA_HEAP_ONLY(x) x #define NOT_CDS_JAVA_HEAP(x) diff --git a/test/hotspot/jtreg/ProblemList-AotJdk.txt b/test/hotspot/jtreg/ProblemList-AotJdk.txt index 8be9a73359d..af3994289df 100644 --- a/test/hotspot/jtreg/ProblemList-AotJdk.txt +++ b/test/hotspot/jtreg/ProblemList-AotJdk.txt @@ -7,6 +7,7 @@ runtime/symbols/TestSharedArchiveConfigFile.java 0000000 generic-all gc/arguments/TestG1HeapSizeFlags.java 0000000 generic-all gc/arguments/TestParallelHeapSizeFlags.java 0000000 generic-all gc/arguments/TestSerialHeapSizeFlags.java 0000000 generic-all +gc/arguments/TestVerifyBeforeAndAfterGCFlags.java 0000000 generic-all gc/arguments/TestCompressedClassFlags.java 0000000 generic-all gc/TestAllocateHeapAtMultiple.java 0000000 generic-all diff --git a/test/hotspot/jtreg/TEST.ROOT b/test/hotspot/jtreg/TEST.ROOT index df8c0183b33..c298a74dc25 100644 --- a/test/hotspot/jtreg/TEST.ROOT +++ b/test/hotspot/jtreg/TEST.ROOT @@ -85,6 +85,8 @@ requires.properties= \ vm.cds.supports.aot.class.linking \ vm.cds.supports.aot.code.caching \ vm.cds.write.archived.java.heap \ + vm.cds.write.mapped.java.heap \ + vm.cds.write.streamed.java.heap \ vm.continuations \ vm.jvmti \ vm.graal.enabled \ diff --git a/test/hotspot/jtreg/TEST.groups b/test/hotspot/jtreg/TEST.groups index 2f58670b90e..d4f1470aea5 100644 --- a/test/hotspot/jtreg/TEST.groups +++ b/test/hotspot/jtreg/TEST.groups @@ -313,7 +313,8 @@ tier3_gc_gcold = \ tier1_gc_gcbasher = \ gc/stress/gcbasher/TestGCBasherWithG1.java \ gc/stress/gcbasher/TestGCBasherWithSerial.java \ - gc/stress/gcbasher/TestGCBasherWithParallel.java + gc/stress/gcbasher/TestGCBasherWithParallel.java \ + gc/stress/gcbasher/TestGCBasherWithZ.java tier1_gc_shenandoah = \ gc/shenandoah/options/ \ diff --git a/test/hotspot/jtreg/gc/TestPLABAdaptToMinTLABSize.java b/test/hotspot/jtreg/gc/TestPLABAdaptToMinTLABSize.java index e1e29432f53..8e201fb6e8a 100644 --- a/test/hotspot/jtreg/gc/TestPLABAdaptToMinTLABSize.java +++ b/test/hotspot/jtreg/gc/TestPLABAdaptToMinTLABSize.java @@ -24,7 +24,7 @@ package gc; /* - * @test TestPLABAdaptToMinTLABSizeG1 + * @test id=G1 * @bug 8289137 * @summary Make sure that Young/OldPLABSize adapt to MinTLABSize setting. * @requires vm.gc.G1 @@ -35,7 +35,7 @@ package gc; */ /* - * @test TestPLABAdaptToMinTLABSizeParallel + * @test id=Parallel * @bug 8289137 * @summary Make sure that Young/OldPLABSize adapt to MinTLABSize setting. * @requires vm.gc.Parallel diff --git a/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithZ.java b/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithZ.java index 4057dc0b9e8..310c090d017 100644 --- a/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithZ.java +++ b/test/hotspot/jtreg/gc/stress/gcbasher/TestGCBasherWithZ.java @@ -33,7 +33,7 @@ import java.io.IOException; * @requires vm.gc.Z * @requires vm.flavor == "server" & !vm.emulatedClient * @summary Stress ZGC - * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx384m -server -XX:+UseZGC gc.stress.gcbasher.TestGCBasherWithZ 120000 + * @run main/othervm/timeout=200 -Xlog:gc*=info -Xmx384m -XX:+UseZGC gc.stress.gcbasher.TestGCBasherWithZ 120000 */ /* @@ -43,7 +43,7 @@ import java.io.IOException; * @requires vm.gc.Z * @requires vm.flavor == "server" & !vm.emulatedClient & vm.opt.ClassUnloading != false * @summary Stress ZGC with nmethod barrier forced deoptimization enabled. - * @run main/othervm/timeout=200 -Xlog:gc*=info,nmethod+barrier=trace -Xmx384m -server -XX:+UseZGC + * @run main/othervm/timeout=200 -Xlog:gc*=info,nmethod+barrier=trace -Xmx384m -XX:+UseZGC * -XX:+UnlockDiagnosticVMOptions -XX:+DeoptimizeNMethodBarriersALot -XX:-Inline * gc.stress.gcbasher.TestGCBasherWithZ 120000 */ diff --git a/test/hotspot/jtreg/runtime/cds/AOTMapTest.java b/test/hotspot/jtreg/runtime/cds/AOTMapTest.java index dff98090859..101e2ccc5d1 100644 --- a/test/hotspot/jtreg/runtime/cds/AOTMapTest.java +++ b/test/hotspot/jtreg/runtime/cds/AOTMapTest.java @@ -39,19 +39,27 @@ import java.util.ArrayList; public class AOTMapTest { public static void main(String[] args) throws Exception { - doTest(false); + doTest(false, false); + doTest(false, true); if (Platform.is64bit()) { // There's no oop/klass compression on 32-bit. - doTest(true); + doTest(true, false); + doTest(true, true); } } - public static void doTest(boolean compressed) throws Exception { + public static void doTest(boolean compressed, boolean streamHeap) throws Exception { ArrayList vmArgs = new ArrayList<>(); // Use the same heap size as make/Images.gmk vmArgs.add("-Xmx128M"); + vmArgs.add("-XX:+UnlockDiagnosticVMOptions"); + if (streamHeap) { + vmArgs.add("-XX:+AOTStreamableObjects"); + } else { + vmArgs.add("-XX:-AOTStreamableObjects"); + } if (Platform.is64bit()) { // These options are available only on 64-bit. diff --git a/test/hotspot/jtreg/runtime/cds/SharedStrings.java b/test/hotspot/jtreg/runtime/cds/SharedStrings.java index d6741790ff3..db0bc3264b2 100644 --- a/test/hotspot/jtreg/runtime/cds/SharedStrings.java +++ b/test/hotspot/jtreg/runtime/cds/SharedStrings.java @@ -25,7 +25,7 @@ * @test * @summary Check to make sure that shared strings in the bootstrap CDS archive * are actually shared - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @requires vm.flagless * @library /test/lib * @build SharedStringsWb jdk.test.whitebox.WhiteBox diff --git a/test/hotspot/jtreg/runtime/cds/SharedStringsDedup.java b/test/hotspot/jtreg/runtime/cds/SharedStringsDedup.java index c555268026d..da5025b07b5 100644 --- a/test/hotspot/jtreg/runtime/cds/SharedStringsDedup.java +++ b/test/hotspot/jtreg/runtime/cds/SharedStringsDedup.java @@ -24,7 +24,7 @@ /** * @test SharedStringsDedup * @summary Test -Xshare:auto with shared strings and -XX:+UseStringDeduplication - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @library /test/lib * @run driver SharedStringsDedup */ diff --git a/test/hotspot/jtreg/runtime/cds/SharedStringsRunAuto.java b/test/hotspot/jtreg/runtime/cds/SharedStringsRunAuto.java index 271fb2ec255..5774d71d089 100644 --- a/test/hotspot/jtreg/runtime/cds/SharedStringsRunAuto.java +++ b/test/hotspot/jtreg/runtime/cds/SharedStringsRunAuto.java @@ -24,7 +24,7 @@ /** * @test SharedStringsAuto * @summary Test -Xshare:auto with shared strings. - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @library /test/lib * @run driver SharedStringsRunAuto */ diff --git a/test/hotspot/jtreg/runtime/cds/SharedSymbolTableBucketSize.java b/test/hotspot/jtreg/runtime/cds/SharedSymbolTableBucketSize.java index e29bf18eb96..2db4ab2df23 100644 --- a/test/hotspot/jtreg/runtime/cds/SharedSymbolTableBucketSize.java +++ b/test/hotspot/jtreg/runtime/cds/SharedSymbolTableBucketSize.java @@ -43,8 +43,9 @@ public class SharedSymbolTableBucketSize { + Integer.valueOf(bucket_size)); CDSTestUtils.checkMappingFailure(output); - String s = output.firstMatch("Average bucket size : .*"); - Float f = Float.parseFloat(s.substring(25)); + String regex = "Average bucket size : ([0-9]+\\.[0-9]+).*"; + String s = output.firstMatch(regex, 1); + Float f = Float.parseFloat(s); int size = Math.round(f); if (size != bucket_size) { throw new Exception("FAILED: incorrect bucket size " + size + diff --git a/test/hotspot/jtreg/runtime/cds/TestDefaultArchiveLoading.java b/test/hotspot/jtreg/runtime/cds/TestDefaultArchiveLoading.java index 4bca1ed4581..acff3191300 100644 --- a/test/hotspot/jtreg/runtime/cds/TestDefaultArchiveLoading.java +++ b/test/hotspot/jtreg/runtime/cds/TestDefaultArchiveLoading.java @@ -55,6 +55,7 @@ * @requires vm.cds.default.archive.available * @requires vm.cds.write.archived.java.heap * @requires vm.bits == 64 + * @requires !vm.gc.Z * @library /test/lib * @modules java.base/jdk.internal.misc * java.management @@ -68,6 +69,7 @@ * @requires vm.cds.default.archive.available * @requires vm.cds.write.archived.java.heap * @requires vm.bits == 64 + * @requires !vm.gc.Z * @library /test/lib * @modules java.base/jdk.internal.misc * java.management diff --git a/test/hotspot/jtreg/runtime/cds/appcds/TestParallelGCWithCDS.java b/test/hotspot/jtreg/runtime/cds/appcds/TestParallelGCWithCDS.java index be7e69b076c..1730b569548 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/TestParallelGCWithCDS.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/TestParallelGCWithCDS.java @@ -121,24 +121,23 @@ public class TestParallelGCWithCDS { out.shouldNotContain(errMsg); out.shouldHaveExitValue(0); - if (!dumpWithParallel && execWithParallel) { - // We dumped with G1, so we have an archived heap. At exec time, try to load them into - // a small ParallelGC heap that may be too small. - System.out.println("2. Exec with " + execGC); - out = TestCommon.exec(helloJar, - execGC, - small1, - small2, - "-Xmx4m", - coops, - "-Xlog:cds", - "Hello"); - if (out.getExitValue() == 0) { - out.shouldContain(HELLO); - out.shouldNotContain(errMsg); - } else { - out.shouldNotHaveFatalError(); - } + // Regardless of which GC dumped the heap, there will be an object archive, either + // created with mapping if dumped with G1, or streaming if dumped with parallel GC. + // At exec time, try to load them into a small ParallelGC heap that may be too small. + System.out.println("2. Exec with " + execGC); + out = TestCommon.exec(helloJar, + execGC, + small1, + small2, + "-Xmx4m", + coops, + "-Xlog:cds", + "Hello"); + if (out.getExitValue() == 0) { + out.shouldContain(HELLO); + out.shouldNotContain(errMsg); + } else { + out.shouldNotHaveFatalError(); } } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/TestSerialGCWithCDS.java b/test/hotspot/jtreg/runtime/cds/appcds/TestSerialGCWithCDS.java index 402ad0b8744..87fa01956c8 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/TestSerialGCWithCDS.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/TestSerialGCWithCDS.java @@ -140,9 +140,8 @@ public class TestSerialGCWithCDS { out.shouldNotContain(errMsg); int n = 2; - if (dumpWithSerial == false && execWithSerial == true) { - // We dumped with G1, so we have an archived heap. At exec time, try to load them into - // a small SerialGC heap that may be too small. + if (execWithSerial == true) { + // At exec time, try to load archived objects into a small SerialGC heap that may be too small. String[] sizes = { "4m", // usually this will success load the archived heap "2m", // usually this will fail to load the archived heap, but app can launch diff --git a/test/hotspot/jtreg/runtime/cds/appcds/TestZGCWithAOTHeap.java b/test/hotspot/jtreg/runtime/cds/appcds/TestZGCWithAOTHeap.java new file mode 100644 index 00000000000..567c8da73cb --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/TestZGCWithAOTHeap.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2022, 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. + * + * 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. + */ + +/* + * @test Loading and writing AOT archived heap objects with ZGC + * @requires vm.cds + * @requires vm.gc.Z + * @requires vm.gc.G1 + * + * @comment don't run this test if any -XX::+Use???GC options are specified, since they will + * interfere with the test. + * @requires vm.gc == null + * + * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds + * @compile test-classes/Hello.java + * @run driver TestZGCWithAOTHeap + */ + +import jdk.test.lib.Platform; +import jdk.test.lib.process.OutputAnalyzer; + +public class TestZGCWithAOTHeap { + public final static String HELLO = "Hello World"; + static String helloJar; + + public static void main(String... args) throws Exception { + helloJar = JarBuilder.build("hello", "Hello"); + + // Check if we can use ZGC during dump time, or run time, or both. + test(false, true, true, true); + test(true, false, true, true); + test(true, true, true, true); + test(false, true, false, true); + test(false, true, true, false); + test(true, false, true, false); + test(true, true, true, false); + test(false, true, false, false); + } + + final static String G1 = "-XX:+UseG1GC"; + final static String Z = "-XX:+UseZGC"; + + static void test(boolean dumpWithZ, boolean execWithZ, boolean shouldStream, boolean shouldUseCOH) throws Exception { + String unlockDiagnostic = "-XX:+UnlockDiagnosticVMOptions"; + String dumpGC = dumpWithZ ? Z : G1; + String execGC = execWithZ ? Z : G1; + String generalErrMsg = "Cannot use CDS heap data."; + String coopsErrMsg = generalErrMsg + " Selected GC not compatible -XX:-UseCompressedOops"; + String coops = "-XX:-UseCompressedOops"; + String coh = shouldUseCOH ? "-XX:+UseCompactObjectHeaders" : "-XX:-UseCompactObjectHeaders"; + String stream = shouldStream ? "-XX:+AOTStreamableObjects" : "-XX:-AOTStreamableObjects"; + String eagerLoading = "-XX:+AOTEagerlyLoadObjects"; + OutputAnalyzer out; + + System.out.println("0. Dump with " + dumpGC + ", " + coops + ", " + coh + ", " + stream); + out = TestCommon.dump(helloJar, + new String[] {"Hello"}, + dumpGC, + coops, + coh, + "-XX:+UnlockDiagnosticVMOptions", + stream, + "-Xlog:cds,aot,aot+heap"); + out.shouldContain("Dumping shared data to file:"); + out.shouldHaveExitValue(0); + + System.out.println("1. Exec with " + execGC + ", " + coops + ", " + coh); + out = TestCommon.exec(helloJar, + unlockDiagnostic, + execGC, + coops, + coh, + "-Xlog:cds,aot,aot+heap", + "Hello"); + if (!shouldStream && execWithZ) { + // Only when dumping without streaming and executing with ZGC do we expect there + // to be a problem. With -XX:+AOTClassLinking, the problem is worse. + if (out.getExitValue() == 0) { + out.shouldContain(HELLO); + out.shouldContain(generalErrMsg); + } else { + out.shouldHaveExitValue(1); + } + } else { + out.shouldContain(HELLO); + out.shouldNotContain(generalErrMsg); + out.shouldHaveExitValue(0); + } + + // Regardless of which GC dumped the heap, there will be an object archive, either + // created with mapping if dumped with G1, or streaming if dumped with parallel GC. + // At exec time, try to load them into a small ZGC heap that may be too small. + System.out.println("2. Exec with " + execGC + ", " + coops + ", " + coh); + out = TestCommon.exec(helloJar, + unlockDiagnostic, + execGC, + "-Xmx4m", + coops, + coh, + "-Xlog:cds,aot,aot+heap", + "Hello"); + if (out.getExitValue() == 0) { + if (!shouldStream && execWithZ) { + out.shouldContain(coopsErrMsg); + } else { + out.shouldNotContain(generalErrMsg); + } + } else { + out.shouldHaveExitValue(1); + } + out.shouldNotHaveFatalError(); + + if (shouldStream) { + System.out.println("3. Exec with " + execGC + ", " + coops + ", " + coh + ", " + eagerLoading); + out = TestCommon.exec(helloJar, + unlockDiagnostic, + execGC, + coops, + coh, + eagerLoading, + "-Xlog:cds,aot,aot+heap", + "Hello"); + if (!shouldStream && execWithZ) { + // Only when dumping without streaming and executing with ZGC do we expect there + // to be a problem. With -XX:+AOTClassLinking, the problem is worse. + if (out.getExitValue() == 0) { + out.shouldContain(HELLO); + out.shouldContain(generalErrMsg); + } else { + out.shouldHaveExitValue(1); + } + } else { + out.shouldContain(HELLO); + out.shouldNotContain(generalErrMsg); + out.shouldHaveExitValue(0); + } + } + } +} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotClassLinking/AOTCacheWithZGC.java b/test/hotspot/jtreg/runtime/cds/appcds/aotClassLinking/AOTCacheWithZGC.java deleted file mode 100644 index a7c7362b845..00000000000 --- a/test/hotspot/jtreg/runtime/cds/appcds/aotClassLinking/AOTCacheWithZGC.java +++ /dev/null @@ -1,59 +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. - * - * 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. - * - */ - -/** - * @test - * @summary -XX:AOTMode=create should be compatible with ZGC - * @bug 8352775 - * @requires vm.cds - * @requires vm.gc.Z - * @library /test/lib - * @build AOTCacheWithZGC - * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar AOTCacheWithZGCApp - * @run driver AOTCacheWithZGC - */ - -import jdk.test.lib.cds.SimpleCDSAppTester; -import jdk.test.lib.process.OutputAnalyzer; - -public class AOTCacheWithZGC { - public static void main(String... args) throws Exception { - SimpleCDSAppTester.of("AOTCacheWithZGC") - .addVmArgs("-XX:+UseZGC", "-Xlog:cds", "-Xlog:aot") - .classpath("app.jar") - .appCommandLine("AOTCacheWithZGCApp") - .setProductionChecker((OutputAnalyzer out) -> { - // AOT-linked classes required cached Java heap objects, which is not - // yet supported by ZGC. - out.shouldContain("Using AOT-linked classes: false"); - }) - .runAOTWorkflow(); - } -} - -class AOTCacheWithZGCApp { - public static void main(String[] args) { - - } -} diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotCode/AOTCodeCompressedOopsTest.java b/test/hotspot/jtreg/runtime/cds/appcds/aotCode/AOTCodeCompressedOopsTest.java index e1d132dd984..09290960d2f 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/aotCode/AOTCodeCompressedOopsTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/aotCode/AOTCodeCompressedOopsTest.java @@ -27,6 +27,8 @@ * @summary Sanity test of AOT Code Cache with compressed oops configurations * @requires vm.cds.supports.aot.code.caching * @requires vm.compMode != "Xcomp" + * @requires vm.bits == 64 + * @requires vm.opt.final.UseCompressedOops * @comment The test verifies AOT checks during VM startup and not code generation. * No need to run it with -Xcomp. It takes a lot of time to complete all * subtests with this flag. diff --git a/test/hotspot/jtreg/runtime/cds/appcds/cacheObject/ArchivedIntegerCacheTest.java b/test/hotspot/jtreg/runtime/cds/appcds/cacheObject/ArchivedIntegerCacheTest.java index b92940c7f5e..8b18876aeb4 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/cacheObject/ArchivedIntegerCacheTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/cacheObject/ArchivedIntegerCacheTest.java @@ -28,9 +28,11 @@ * @requires vm.cds.write.archived.java.heap * @library /test/jdk/lib/testlibrary /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @compile --add-exports java.base/jdk.internal.misc=ALL-UNNAMED CheckIntegerCacheApp.java ArchivedIntegerHolder.java + * @build jdk.test.whitebox.WhiteBox + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar WhiteBox.jar jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar boxCache.jar CheckIntegerCacheApp * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar boxCache-boot.jar ArchivedIntegerHolder - * @run driver ArchivedIntegerCacheTest + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:./WhiteBox.jar ArchivedIntegerCacheTest */ import java.nio.file.Files; @@ -39,8 +41,10 @@ import java.nio.file.Paths; import jdk.test.lib.cds.CDSTestUtils; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.helpers.ClassFileInstaller; +import jdk.test.whitebox.WhiteBox; public class ArchivedIntegerCacheTest { + private static WhiteBox WB = WhiteBox.getWhiteBox(); public static String[] mixArgs(String... args) { String bootJar = ClassFileInstaller.getJarPath("boxCache-boot.jar"); @@ -133,7 +137,9 @@ public class ArchivedIntegerCacheTest { "-Xlog:cds+heap=info", "-Xlog:gc+region+cds", "-Xlog:gc+region=trace")); - TestCommon.checkDump(output, - "Cannot archive the sub-graph referenced from [Ljava.lang.Integer; object"); + if (WB.canWriteMappedJavaHeapArchive()) { + // The mapping AOT heap archiving mechanism is unable to cache larger objects. + TestCommon.checkDump(output, "Cannot archive the sub-graph referenced from [Ljava.lang.Integer; object"); + } } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/PrintSharedArchiveAndExit.java b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/PrintSharedArchiveAndExit.java index e44d02118c9..bc208fd3df9 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/customLoader/PrintSharedArchiveAndExit.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/customLoader/PrintSharedArchiveAndExit.java @@ -37,7 +37,7 @@ * jdk.test.lib.classloader.ClassUnloadCommon$TestFailure * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar hello_custom.jar CustomLoadee * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar WhiteBox.jar jdk.test.whitebox.WhiteBox - * @run driver PrintSharedArchiveAndExit + * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:./WhiteBox.jar PrintSharedArchiveAndExit */ import jdk.test.lib.process.OutputAnalyzer; @@ -45,6 +45,8 @@ import jdk.test.lib.helpers.ClassFileInstaller; import jdk.test.whitebox.WhiteBox; public class PrintSharedArchiveAndExit { + private static WhiteBox WB = WhiteBox.getWhiteBox(); + public static void main(String[] args) throws Exception { run(); } @@ -82,7 +84,11 @@ public class PrintSharedArchiveAndExit { .shouldContain("Shared Builtin Dictionary") .shouldContain("Shared Unregistered Dictionary") .shouldMatch("Number of shared symbols: \\d+") - .shouldMatch("Number of shared strings: \\d+") .shouldMatch("VM version: .*"); + + if (WB.canWriteMappedJavaHeapArchive()) { + // With the mapping object dumper, the string table is dumped. + output.shouldMatch("Number of shared strings: \\d+"); + } } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/PrintSharedArchiveAndExit.java b/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/PrintSharedArchiveAndExit.java index a9e616021da..13fa84ac205 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/PrintSharedArchiveAndExit.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/dynamicArchive/PrintSharedArchiveAndExit.java @@ -43,8 +43,11 @@ import jdk.test.lib.cds.CDSTestUtils; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.helpers.ClassFileInstaller; +import jdk.test.whitebox.WhiteBox; + public class PrintSharedArchiveAndExit extends DynamicArchiveTestBase { private static final String ARCHIVE_NAME = CDSTestUtils.getOutputFileName("top.jsa"); + private static final WhiteBox WB = WhiteBox.getWhiteBox(); public static void main(String... args) throws Exception { runTest(PrintSharedArchiveAndExit::testPrtNExit); @@ -92,8 +95,11 @@ public class PrintSharedArchiveAndExit extends DynamicArchiveTestBase { .shouldContain("Shared Builtin Dictionary") .shouldContain("Shared Unregistered Dictionary") .shouldMatch("Number of shared symbols: \\d+") - .shouldMatch("Number of shared strings: \\d+") .shouldMatch("VM version: .*"); - }); + if (WB.canWriteMappedJavaHeapArchive()) { + // With the mapping object archiving mechanism, the string table is dumped + output.shouldMatch("Number of shared strings: \\d+"); + } + }); } } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/ExerciseGC.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/ExerciseGC.java index 0668ebfa300..7cad887a5d9 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/ExerciseGC.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/ExerciseGC.java @@ -25,8 +25,7 @@ /* * @test * @summary Exercise GC with shared strings - * @requires vm.cds.write.archived.java.heap - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib * @build HelloStringGC jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/FlagCombo.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/FlagCombo.java index 18bcf6da79c..0f0820aaa34 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/FlagCombo.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/FlagCombo.java @@ -25,8 +25,7 @@ /** * @test * @summary Test relevant combinations of command line flags with shared strings - * @requires vm.cds.write.archived.java.heap & vm.hasJFR - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap & vm.hasJFR * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @build HelloString * @run driver FlagCombo @@ -36,8 +35,7 @@ * @test * @summary Test relevant combinations of command line flags with shared strings * @comment A special test excluding the case that requires JFR - * @requires vm.cds.write.archived.java.heap & !vm.hasJFR - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap & !vm.hasJFR * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @build HelloString * @run driver FlagCombo noJfr @@ -53,7 +51,7 @@ public class FlagCombo { SharedStringsUtils.dump(TestCommon.list("HelloString"), "SharedStringsBasic.txt", "-Xlog:cds,aot+hashtables"); - SharedStringsUtils.runWithArchive("HelloString", "-XX:+UseG1GC"); + SharedStringsUtils.runWithArchive("HelloString"); if (args.length == 0) { SharedStringsUtils.runWithArchiveAuto("HelloString", diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/IncompatibleOptions.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/IncompatibleOptions.java index 527c0043a6f..ddbfe2ed862 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/IncompatibleOptions.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/IncompatibleOptions.java @@ -100,8 +100,12 @@ public class IncompatibleOptions { // Uncompressed OOPs testDump(1, "-XX:+UseG1GC", "-XX:-UseCompressedOops", null, false); + testExec(1, "-XX:+UseG1GC", "-XX:-UseCompressedOops", null, false); + + // Try with ZGC if (GC.Z.isSupported()) { - testDump(1, "-XX:+UseZGC", "-XX:-UseCompressedOops", null, false); + testDump(2, "-XX:+UseZGC", "-XX:-UseCompressedOops", null, false); + testExec(2, "-XX:+UseZGC", "-XX:-UseCompressedOops", null, false); } // Dump heap objects with Parallel, Serial, Shenandoah GC @@ -112,39 +116,62 @@ public class IncompatibleOptions { } // Explicitly archive with compressed oops, run without. - testDump(5, "-XX:+UseG1GC", "-XX:+UseCompressedOops", null, false); - testExec(5, "-XX:+UseG1GC", "-XX:-UseCompressedOops", - COMPRESSED_OOPS_NOT_CONSISTENT, true); + testDump(3, "-XX:+UseG1GC", "-XX:+UseCompressedOops", null, false); + testExec(3, "-XX:+UseG1GC", "-XX:-UseCompressedOops", COMPRESSED_OOPS_NOT_CONSISTENT, true); // NOTE: No warning is displayed, by design // Still run, to ensure no crash or exception - testExec(6, "-XX:+UseParallelGC", "", "", false); - testExec(7, "-XX:+UseSerialGC", "", "", false); + testExec(3, "-XX:+UseParallelGC", "", "", false); + testExec(3, "-XX:+UseSerialGC", "", "", false); + + // Explicitly archive with object streaming with one GC, run with other GCs. + testDump(4, "-XX:+UseG1GC", "-XX:+AOTStreamableObjects", null, false); + testExec(4, "-XX:+UseParallelGC", "", "", false); + testExec(4, "-XX:+UseSerialGC", "", "", false); + + if (GC.Z.isSupported()) { + testExec(4, "-XX:+UseZGC", "", COMPRESSED_OOPS_NOT_CONSISTENT, true); + } + + // Explicitly archive with object streaming and COOPs with one GC, run with other GCs. + testDump(4, "-XX:-UseCompressedOops", "-XX:+AOTStreamableObjects", null, false); + testExec(4, "-XX:+UseG1GC", "", COMPRESSED_OOPS_NOT_CONSISTENT, true); + testExec(4, "-XX:+UseParallelGC", "", COMPRESSED_OOPS_NOT_CONSISTENT, true); + testExec(4, "-XX:+UseSerialGC", "", COMPRESSED_OOPS_NOT_CONSISTENT, true); + + testExec(4, "-XX:+UseParallelGC", "-XX:-UseCompressedOops", "", false); + testExec(4, "-XX:+UseSerialGC", "-XX:-UseCompressedOops", "", false); + testExec(4, "-XX:+UseG1GC", "-XX:-UseCompressedOops", "", false); // Test various oops encodings, by varying ObjectAlignmentInBytes and heap sizes - testDump(9, "-XX:+UseG1GC", "-XX:ObjectAlignmentInBytes=8", null, false); - testExec(9, "-XX:+UseG1GC", "-XX:ObjectAlignmentInBytes=16", - OBJ_ALIGNMENT_MISMATCH, true); + testDump(5, "-XX:+UseG1GC", "-XX:ObjectAlignmentInBytes=8", null, false); + testExec(5, "-XX:+UseG1GC", "-XX:ObjectAlignmentInBytes=16", OBJ_ALIGNMENT_MISMATCH, true); + + testDump(6, "-XX:+AOTStreamableObjects", "-XX:ObjectAlignmentInBytes=8", null, false); + testExec(6, "-XX:+AOTStreamableObjects", "-XX:ObjectAlignmentInBytes=16", OBJ_ALIGNMENT_MISMATCH, true); // Implicitly archive with compressed oops, run without. // Max heap size for compressed oops is around 31G. // UseCompressedOops is turned on by default when heap // size is under 31G, but will be turned off when heap // size is greater than that. - testDump(10, "-XX:+UseG1GC", "-Xmx1g", null, false); - testExec(10, "-XX:+UseG1GC", "-Xmx32g", null, true); + testDump(7, "-XX:+UseG1GC", "-Xmx1g", null, false); + testExec(7, "-XX:+UseG1GC", "-Xmx32g", null, true); // Explicitly archive without compressed oops and run with. - testDump(11, "-XX:+UseG1GC", "-XX:-UseCompressedOops", null, false); - testExec(11, "-XX:+UseG1GC", "-XX:+UseCompressedOops", null, true); + testDump(8, "-XX:+UseG1GC", "-XX:-UseCompressedOops", null, false); + testExec(8, "-XX:+UseG1GC", "-XX:+UseCompressedOops", null, true); // Implicitly archive without compressed oops and run with. - testDump(12, "-XX:+UseG1GC", "-Xmx32G", null, false); - testExec(12, "-XX:+UseG1GC", "-Xmx1G", null, true); + testDump(9, "-XX:+UseG1GC", "-Xmx32G", null, false); + testExec(9, "-XX:+UseG1GC", "-Xmx1G", null, true); // CompactStrings must match between dump time and run time - testDump(13, "-XX:+UseG1GC", "-XX:-CompactStrings", null, false); - testExec(13, "-XX:+UseG1GC", "-XX:+CompactStrings", + testDump(10, "-XX:+UseG1GC", "-XX:-CompactStrings", null, false); + testExec(10, "-XX:+UseG1GC", "-XX:+CompactStrings", COMPACT_STRING_MISMATCH, true); - testDump(14, "-XX:+UseG1GC", "-XX:+CompactStrings", null, false); - testExec(14, "-XX:+UseG1GC", "-XX:-CompactStrings", + testDump(11, "-XX:+UseG1GC", "-XX:+CompactStrings", null, false); + testExec(11, "-XX:+UseG1GC", "-XX:-CompactStrings", + COMPACT_STRING_MISMATCH, true); + testDump(11, "-XX:+AOTStreamableObjects", "-XX:+CompactStrings", null, false); + testExec(11, "-XX:+AOTStreamableObjects", "-XX:-CompactStrings", COMPACT_STRING_MISMATCH, true); } @@ -154,6 +181,7 @@ public class IncompatibleOptions { System.out.println("Testcase: " + testCaseNr); OutputAnalyzer output = TestCommon.dump(appJar, TestCommon.list("Hello"), TestCommon.concat(vmOptionsPrefix, + "-XX:+UnlockDiagnosticVMOptions", "-XX:+UseCompressedOops", collectorOption, "-XX:SharedArchiveConfigFile=" + TestCommon.getSourceFile("SharedStringsBasic.txt"), @@ -181,11 +209,13 @@ public class IncompatibleOptions { if (!extraOption.isEmpty()) { output = TestCommon.exec(appJar, TestCommon.concat(vmOptionsPrefix, + "-XX:+UnlockDiagnosticVMOptions", "-XX:+UseCompressedOops", collectorOption, "-Xlog:cds", extraOption, "HelloString")); } else { output = TestCommon.exec(appJar, TestCommon.concat(vmOptionsPrefix, + "-XX:+UnlockDiagnosticVMOptions", "-XX:+UseCompressedOops", collectorOption, "-Xlog:cds", "HelloString")); } diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/InternSharedString.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/InternSharedString.java index ed8e582b213..89136ebdc4d 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/InternSharedString.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/InternSharedString.java @@ -25,8 +25,8 @@ /* * @test * @summary Test shared strings together with string intern operation - * @requires vm.cds.write.archived.java.heap * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib * @compile InternStringTest.java * @build jdk.test.whitebox.WhiteBox @@ -34,6 +34,10 @@ * @run driver InternSharedString */ +// This test requires the vm.cds.write.mapped.java.heap specifically as it has expectations +// about using the mechanism for dumping the entire string table, which the streaming solution +// does not do. + public class InternSharedString { public static void main(String[] args) throws Exception { SharedStringsUtils.run(args, InternSharedString::test); diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/LargePages.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/LargePages.java index f431dd6e807..bab63d099c9 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/LargePages.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/LargePages.java @@ -25,8 +25,7 @@ /* * @test * @summary Basic shared string test with large pages - * @requires vm.cds.write.archived.java.heap - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @build HelloString * @run driver LargePages diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasic.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasic.java index f746e2c0e73..7de1c48df2a 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasic.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasic.java @@ -25,7 +25,7 @@ /* * @test * @summary Basic test for shared strings - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib * @build HelloString * @run driver SharedStringsBasic @@ -33,6 +33,10 @@ import jdk.test.lib.cds.CDSOptions; import jdk.test.lib.cds.CDSTestUtils; +// This test requires the vm.cds.write.mapped.java.heap specifically as it has expectations +// about using the mechanism for dumping the entire string table, which the streaming solution +// does not do. + // This test does not use SharedStringsUtils.dumpXXX() // and SharedStringsUtils.runWithXXX() intentionally: // - in order to demonstrate the basic use of the functionality diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasicPlus.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasicPlus.java index dacf74ebe3a..6145ea7719b 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasicPlus.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsBasicPlus.java @@ -25,14 +25,17 @@ /* * @test * @summary Basic plus test for shared strings - * @requires vm.cds.write.archived.java.heap - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib * @build HelloStringPlus jdk.test.whitebox.WhiteBox * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run driver SharedStringsBasicPlus */ +// This test requires the vm.cds.write.mapped.java.heap specifically as it has expectations +// about using the mechanism for dumping the entire string table, which the streaming solution +// does not do. + public class SharedStringsBasicPlus { public static void main(String[] args) throws Exception { SharedStringsUtils.run(args, SharedStringsBasicPlus::test); diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsHumongous.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsHumongous.java index 05519e1f4dd..cc470eb68d0 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsHumongous.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsHumongous.java @@ -26,7 +26,7 @@ * @test * @summary Use a shared string allocated in a humongous G1 region. * @comment -- the following implies that G1 is used (by command-line or by default) - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @requires vm.gc.G1 * * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib @@ -35,6 +35,11 @@ * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xbootclasspath/a:. SharedStringsHumongous */ + +// The problem with humongous strings, or humongous objects in general, does not +// exist with the streaming heap loader. Therefore, this test requres the mapping mode. +// Further more, humongous regions are a bit specific to G1, so G1 is needed. + import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsStress.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsStress.java index 1114870d1d3..c51a67c445b 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsStress.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsStress.java @@ -25,11 +25,16 @@ /* * @test * @summary Write a lots of shared strings. - * @requires vm.cds.write.archived.java.heap + * @requires vm.cds.write.mapped.java.heap * @library /test/hotspot/jtreg/runtime/cds/appcds /test/lib * @build HelloString * @run driver/timeout=2600 SharedStringsStress */ + +// This test requires the vm.cds.write.mapped.java.heap specifically as it has expectations +// about using the mechanism for dumping the entire string table, which the streaming solution +// does not do. + import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsUtils.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsUtils.java index 181f23d8396..2b2e1194c63 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsUtils.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsUtils.java @@ -96,7 +96,7 @@ public class SharedStringsUtils { String appJar = TestCommon.getTestJar(TEST_JAR_NAME_FULL); String[] args = - TestCommon.concat(extraOptions, "-XX:+UseCompressedOops", + TestCommon.concat(extraOptions, "-XX:SharedArchiveConfigFile=" + TestCommon.getSourceFile(sharedDataFile)); args = TestCommon.concat(childVMOptionsPrefix, args); @@ -124,7 +124,7 @@ public class SharedStringsUtils { String appJar = TestCommon.getTestJar(TEST_JAR_NAME_FULL); String[] args = TestCommon.concat(extraOptions, - "-cp", appJar, "-XX:+UseCompressedOops", className); + "-cp", appJar, className); args = TestCommon.concat(childVMOptionsPrefix, args); OutputAnalyzer output = TestCommon.execAuto(args); @@ -142,8 +142,7 @@ public class SharedStringsUtils { String className, String... extraOptions) throws Exception { String appJar = TestCommon.getTestJar(TEST_JAR_NAME_FULL); - String[] args = TestCommon.concat(extraOptions, - "-XX:+UseCompressedOops", className); + String[] args = TestCommon.concat(extraOptions, className); args = TestCommon.concat(childVMOptionsPrefix, args); OutputAnalyzer output = TestCommon.exec(appJar, args); diff --git a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsWbTest.java b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsWbTest.java index 95ea1cf9bb0..20dbad30441 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsWbTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/sharedStrings/SharedStringsWbTest.java @@ -25,14 +25,17 @@ /* * @test * @summary White box test for shared strings - * @requires vm.cds.write.archived.java.heap - * @requires vm.gc == null + * @requires vm.cds.write.mapped.java.heap * @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds * @build jdk.test.whitebox.WhiteBox SharedStringsWb * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox * @run driver SharedStringsWbTest */ +// This test requires the vm.cds.write.mapped.java.heap specifically as it has expectations +// about using the mechanism for dumping the entire string table, which the streaming solution +// does not do. + import java.io.*; import jdk.test.whitebox.WhiteBox; diff --git a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java index 4452abe3cc0..2c74eab945e 100644 --- a/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java +++ b/test/hotspot/jtreg/serviceability/sa/ClhsdbPrintAll.java @@ -34,7 +34,7 @@ import jtreg.SkippedException; * @requires vm.hasSA * @requires (os.arch != "riscv64" | !(vm.cpu.features ~= ".*qemu.*")) * @library /test/lib - * @run main/othervm/timeout=2400 -Xmx1g ClhsdbPrintAll + * @run main/othervm/timeout=2400 -Xmx2g ClhsdbPrintAll */ public class ClhsdbPrintAll { diff --git a/test/jdk/TEST.ROOT b/test/jdk/TEST.ROOT index c7605946a5f..f22b316e19a 100644 --- a/test/jdk/TEST.ROOT +++ b/test/jdk/TEST.ROOT @@ -100,6 +100,8 @@ requires.properties= \ vm.compiler2.enabled \ vm.cds \ vm.cds.write.archived.java.heap \ + vm.cds.write.mapped.java.heap \ + vm.cds.write.streamed.java.heap \ vm.continuations \ vm.musl \ vm.asan \ diff --git a/test/jtreg-ext/requires/VMProps.java b/test/jtreg-ext/requires/VMProps.java index 3c06c97b37a..dbc7a916885 100644 --- a/test/jtreg-ext/requires/VMProps.java +++ b/test/jtreg-ext/requires/VMProps.java @@ -126,6 +126,8 @@ public class VMProps implements Callable> { map.put("vm.cds.supports.aot.class.linking", this::vmCDSSupportsAOTClassLinking); map.put("vm.cds.supports.aot.code.caching", this::vmCDSSupportsAOTCodeCaching); map.put("vm.cds.write.archived.java.heap", this::vmCDSCanWriteArchivedJavaHeap); + map.put("vm.cds.write.mapped.java.heap", this::vmCDSCanWriteMappedArchivedJavaHeap); + map.put("vm.cds.write.streamed.java.heap", this::vmCDSCanWriteStreamedArchivedJavaHeap); map.put("vm.continuations", this::vmContinuations); // vm.graal.enabled is true if Graal is used as JIT map.put("vm.graal.enabled", this::isGraalEnabled); @@ -485,11 +487,28 @@ public class VMProps implements Callable> { /** * @return true if it's possible for "java -Xshare:dump" to write Java heap objects * with the current set of jtreg VM options. For example, false will be returned - * if -XX:-UseCompressedClassPointers is specified, + * if -XX:-UseCompressedClassPointers is specified. */ protected String vmCDSCanWriteArchivedJavaHeap() { - return "" + ("true".equals(vmCDS()) && WB.canWriteJavaHeapArchive() - && isCDSRuntimeOptionsCompatible()); + return "" + ("true".equals(vmCDS()) && WB.canWriteJavaHeapArchive()); + } + + /** + * @return true if it's possible for "java -Xshare:dump" to write Java heap objects + * with the current set of jtreg VM options. For example, false will be returned + * if -XX:-UseCompressedClassPointers is specified. + */ + protected String vmCDSCanWriteMappedArchivedJavaHeap() { + return "" + ("true".equals(vmCDS()) && WB.canWriteMappedJavaHeapArchive()); + } + + /** + * @return true if it's possible for "java -Xshare:dump" to write Java heap objects + * with the current set of jtreg VM options. For example, false will be returned + * if -XX:-UseCompressedClassPointers is specified. + */ + protected String vmCDSCanWriteStreamedArchivedJavaHeap() { + return "" + ("true".equals(vmCDS()) && WB.canWriteStreamedJavaHeapArchive()); } /** @@ -514,31 +533,6 @@ public class VMProps implements Callable> { } } - /** - * @return true if the VM options specified via the "test.cds.runtime.options" - * property is compatible with writing Java heap objects into the CDS archive - */ - protected boolean isCDSRuntimeOptionsCompatible() { - String jtropts = System.getProperty("test.cds.runtime.options"); - if (jtropts == null) { - return true; - } - String CCP_DISABLED = "-XX:-UseCompressedClassPointers"; - String G1GC_ENABLED = "-XX:+UseG1GC"; - String PARALLELGC_ENABLED = "-XX:+UseParallelGC"; - String SERIALGC_ENABLED = "-XX:+UseSerialGC"; - for (String opt : jtropts.split(",")) { - if (opt.equals(CCP_DISABLED)) { - return false; - } - if (opt.startsWith(GC_PREFIX) && opt.endsWith(GC_SUFFIX) && - !opt.equals(G1GC_ENABLED) && !opt.equals(PARALLELGC_ENABLED) && !opt.equals(SERIALGC_ENABLED)) { - return false; - } - } - return true; - } - /** * @return "true" if this VM supports continuations. */ diff --git a/test/lib/jdk/test/whitebox/WhiteBox.java b/test/lib/jdk/test/whitebox/WhiteBox.java index 558feeec78f..5741745e064 100644 --- a/test/lib/jdk/test/whitebox/WhiteBox.java +++ b/test/lib/jdk/test/whitebox/WhiteBox.java @@ -799,6 +799,8 @@ public class WhiteBox { public native boolean isJFRIncluded(); public native boolean isDTraceIncluded(); public native boolean canWriteJavaHeapArchive(); + public native boolean canWriteMappedJavaHeapArchive(); + public native boolean canWriteStreamedJavaHeapArchive(); public native void linkClass(Class c); public native boolean areOpenArchiveHeapObjectsMapped(); From 354910381a9319723d43a6182269b5449c02a527 Mon Sep 17 00:00:00 2001 From: Harshitha Onkar Date: Fri, 7 Nov 2025 17:48:27 +0000 Subject: [PATCH 511/561] 8353755: Add a helper method to Util - findComponent() Reviewed-by: aivanov, tr --- test/jdk/javax/swing/regtesthelpers/Util.java | 68 ++++++++++++++----- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/test/jdk/javax/swing/regtesthelpers/Util.java b/test/jdk/javax/swing/regtesthelpers/Util.java index 5f81384028e..ddbf32f938d 100644 --- a/test/jdk/javax/swing/regtesthelpers/Util.java +++ b/test/jdk/javax/swing/regtesthelpers/Util.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -21,14 +21,32 @@ * questions. */ -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; +import java.util.function.Predicate; + +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.SwingUtilities; + +import static javax.swing.SwingUtilities.isEventDispatchThread; /** *

          This class contains utilities useful for regression testing. @@ -123,26 +141,44 @@ public class Util { } /** - * Find a sub component by class name. - * Always run this method on the EDT thread + * Find a subcomponent by class name. */ public static Component findSubComponent(Component parent, String className) { - String parentClassName = parent.getClass().getName(); + return findComponent((Container) parent, + c -> c.getClass() + .getName() + .contains(className)); + } - if (parentClassName.contains(className)) { - return parent; + /** + * Find a component based on predicate. + */ + public static Component findComponent(final Container container, + final Predicate predicate) { + try { + if (isEventDispatchThread()) { + return findComponentImpl(container, predicate); + } else { + return Util.invokeOnEDT(() -> findComponentImpl(container, predicate)); + } + } catch (Exception e) { + throw new RuntimeException("Error occurred while finding component", e); } + } - if (parent instanceof Container) { - for (Component child : ((Container) parent).getComponents()) { - Component subComponent = findSubComponent(child, className); - - if (subComponent != null) { - return subComponent; + private static Component findComponentImpl(final Container container, + final Predicate predicate) { + for (Component child : container.getComponents()) { + if (predicate.test(child)) { + return child; + } + if (child instanceof Container cont && cont.getComponentCount() > 0) { + Component result = findComponentImpl(cont, predicate); + if (result != null) { + return result; } } } - return null; } From a90fc2661a7c11077ea17d37563dfb3dfba28016 Mon Sep 17 00:00:00 2001 From: Roger Riggs Date: Fri, 7 Nov 2025 17:48:49 +0000 Subject: [PATCH 512/561] 8371421: [AIX] new test ProcessCloseTest fails Reviewed-by: mdoerr --- test/jdk/java/lang/Process/ProcessCloseTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/jdk/java/lang/Process/ProcessCloseTest.java b/test/jdk/java/lang/Process/ProcessCloseTest.java index 3e4040b62f1..13fe8446f46 100644 --- a/test/jdk/java/lang/Process/ProcessCloseTest.java +++ b/test/jdk/java/lang/Process/ProcessCloseTest.java @@ -117,8 +117,8 @@ public class ProcessCloseTest { ProcessCommand.STDOUT_CLOSE, ExitStatus.NORMAL), List.of(ExitStatus.NORMAL)), - Arguments.of(List.of(CAT_PROGRAM, "NoSuchFile.txt"), - List.of(ProcessCommand.STDERR_PRINT_ALL_LINES, + Arguments.of(javaArgs(ChildCommand.STDERR_MARCO, ChildCommand.PROCESS_EXIT1), + List.of(ProcessCommand.STDERR_EXPECT_POLO, ProcessCommand.STDOUT_EXPECT_EMPTY), List.of(ExitStatus.FAIL)), Arguments.of(javaArgs(ChildCommand.STDOUT_MARCO), From 9bc23608fb5719c3e977b5839efed5bc3f64a268 Mon Sep 17 00:00:00 2001 From: Harshitha Onkar Date: Fri, 7 Nov 2025 18:41:43 +0000 Subject: [PATCH 513/561] 8371364: Refactor javax/swing/JFileChooser/FileSizeCheck.java to use Util.findComponent() Reviewed-by: aivanov --- .../swing/JFileChooser/FileSizeCheck.java | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/test/jdk/javax/swing/JFileChooser/FileSizeCheck.java b/test/jdk/javax/swing/JFileChooser/FileSizeCheck.java index 056ce38a098..6d92032e0d1 100644 --- a/test/jdk/javax/swing/JFileChooser/FileSizeCheck.java +++ b/test/jdk/javax/swing/JFileChooser/FileSizeCheck.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,6 @@ import java.nio.file.Paths; import java.util.Arrays; import java.util.Locale; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Predicate; import javax.swing.AbstractButton; import javax.swing.JFileChooser; @@ -52,6 +51,8 @@ import javax.swing.WindowConstants; * @requires (os.family == "linux") * @summary Verifies if the size of an empty file is shown as 0.0 KB * as well as checks the displayed file sizes are rounded up + * @library /javax/swing/regtesthelpers + * @build Util * @run main FileSizeCheck */ public class FileSizeCheck { @@ -228,31 +229,15 @@ public class FileSizeCheck { } private static AbstractButton findDetailsButton(final Container container) { - Component result = findComponent(container, + Component result = Util.findComponent(container, c -> c instanceof JToggleButton button && "Details".equals(button.getToolTipText())); return (AbstractButton) result; } private static JTable findTable(final Container container) { - Component result = findComponent(container, - c -> c instanceof JTable); + Component result = Util.findComponent(container, + c -> c instanceof JTable); return (JTable) result; } - - private static Component findComponent(final Container container, - final Predicate predicate) { - for (Component child : container.getComponents()) { - if (predicate.test(child)) { - return child; - } - if (child instanceof Container cont && cont.getComponentCount() > 0) { - Component result = findComponent(cont, predicate); - if (result != null) { - return result; - } - } - } - return null; - } } From 2c3c4707c0ac7f4432ada9621f4b2e5fe4aef51f Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Fri, 7 Nov 2025 19:33:21 +0000 Subject: [PATCH 514/561] 8354548: Update CLDR to Version 48.0 Reviewed-by: joehw, jlu --- make/data/cldr/LICENSE | 2 +- make/data/cldr/common/bcp47/calendar.xml | 2 + make/data/cldr/common/bcp47/number.xml | 1 + make/data/cldr/common/bcp47/timezone.xml | 21 +- make/data/cldr/common/dtd/cldrTest.dtd | 14 +- make/data/cldr/common/dtd/ldml.dtd | 55 +- make/data/cldr/common/dtd/ldml.xsd | 131 +- make/data/cldr/common/dtd/ldmlBCP47.dtd | 5 +- make/data/cldr/common/dtd/ldmlBCP47.xsd | 7 +- make/data/cldr/common/dtd/ldmlOpenOffice.dtd | 13 +- .../data/cldr/common/dtd/ldmlSupplemental.dtd | 15 +- .../data/cldr/common/dtd/ldmlSupplemental.xsd | 11 +- make/data/cldr/common/main/ab.xml | 15 +- make/data/cldr/common/main/af.xml | 624 +- make/data/cldr/common/main/ak.xml | 1164 +- make/data/cldr/common/main/am.xml | 551 +- make/data/cldr/common/main/an.xml | 3 + make/data/cldr/common/main/ar.xml | 797 +- make/data/cldr/common/main/ar_SA.xml | 4 +- make/data/cldr/common/main/as.xml | 451 +- make/data/cldr/common/main/asa.xml | 4 + make/data/cldr/common/main/ast.xml | 41 +- make/data/cldr/common/main/az.xml | 428 +- make/data/cldr/common/main/az_Cyrl.xml | 4 + make/data/cldr/common/main/ba.xml | 12361 ++++++++++- make/data/cldr/common/main/bal.xml | 5 + make/data/cldr/common/main/bal_Latn.xml | 11 +- make/data/cldr/common/main/bas.xml | 4 + make/data/cldr/common/main/be.xml | 490 +- make/data/cldr/common/main/be_TARASK.xml | 12 +- make/data/cldr/common/main/bew.xml | 24 +- make/data/cldr/common/main/bg.xml | 304 +- make/data/cldr/common/main/blo.xml | 677 +- make/data/cldr/common/main/bm_Nkoo.xml | 2 + make/data/cldr/common/main/bn.xml | 596 +- make/data/cldr/common/main/bn_IN.xml | 1 + make/data/cldr/common/main/bqi.xml | 342 + make/data/cldr/common/main/bqi_IR.xml | 14 + make/data/cldr/common/main/br.xml | 549 +- make/data/cldr/common/main/brx.xml | 81 +- make/data/cldr/common/main/bs.xml | 1309 +- make/data/cldr/common/main/bs_Cyrl.xml | 25 +- make/data/cldr/common/main/bua.xml | 198 + make/data/cldr/common/main/bua_RU.xml | 14 + make/data/cldr/common/main/ca.xml | 457 +- make/data/cldr/common/main/ca_ES_VALENCIA.xml | 2 - make/data/cldr/common/main/ccp.xml | 29 +- make/data/cldr/common/main/ce.xml | 16 +- make/data/cldr/common/main/ceb.xml | 506 +- make/data/cldr/common/main/chr.xml | 230 +- make/data/cldr/common/main/ckb.xml | 204 +- make/data/cldr/common/main/co.xml | 299 +- make/data/cldr/common/main/cop.xml | 4190 ++++ make/data/cldr/common/main/cs.xml | 397 +- make/data/cldr/common/main/csw.xml | 4 - make/data/cldr/common/main/cu.xml | 4 + make/data/cldr/common/main/cv.xml | 17246 +++++++++++----- make/data/cldr/common/main/cy.xml | 474 +- make/data/cldr/common/main/da.xml | 317 +- make/data/cldr/common/main/de.xml | 422 +- make/data/cldr/common/main/de_AT.xml | 4 + make/data/cldr/common/main/de_CH.xml | 144 +- make/data/cldr/common/main/de_LI.xml | 6 +- make/data/cldr/common/main/de_LU.xml | 5 - make/data/cldr/common/main/doi.xml | 6 +- make/data/cldr/common/main/dsb.xml | 337 +- make/data/cldr/common/main/dua.xml | 4 + make/data/cldr/common/main/dv.xml | 6 + make/data/cldr/common/main/dyo.xml | 4 + make/data/cldr/common/main/dz.xml | 11 +- make/data/cldr/common/main/ee.xml | 25 +- make/data/cldr/common/main/el.xml | 272 +- make/data/cldr/common/main/en.xml | 1167 +- make/data/cldr/common/main/en_001.xml | 148 +- make/data/cldr/common/main/en_150.xml | 2 + make/data/cldr/common/main/en_AE.xml | 12 +- make/data/cldr/common/main/en_AT.xml | 2 + make/data/cldr/common/main/en_AU.xml | 114 +- make/data/cldr/common/main/en_CA.xml | 237 +- make/data/cldr/common/main/en_CH.xml | 4 +- make/data/cldr/common/main/en_EE.xml | 20 + make/data/cldr/common/main/en_GB.xml | 197 +- make/data/cldr/common/main/en_GE.xml | 25 + make/data/cldr/common/main/en_IN.xml | 75 +- make/data/cldr/common/main/en_JP.xml | 458 + make/data/cldr/common/main/en_LT.xml | 20 + make/data/cldr/common/main/en_LV.xml | 20 + make/data/cldr/common/main/en_MH.xml | 12 +- make/data/cldr/common/main/en_MP.xml | 12 +- make/data/cldr/common/main/en_MV.xml | 1 + make/data/cldr/common/main/en_NL.xml | 3 + make/data/cldr/common/main/en_PL.xml | 2 + make/data/cldr/common/main/en_PT.xml | 2 + make/data/cldr/common/main/en_RO.xml | 2 + make/data/cldr/common/main/en_SI.xml | 2 + make/data/cldr/common/main/en_SK.xml | 2 + make/data/cldr/common/main/en_Shaw.xml | 1462 ++ make/data/cldr/common/main/en_UA.xml | 20 + make/data/cldr/common/main/en_US_POSIX.xml | 2 + make/data/cldr/common/main/eo.xml | 6906 ++++--- make/data/cldr/common/main/es.xml | 352 +- make/data/cldr/common/main/es_419.xml | 248 +- make/data/cldr/common/main/es_AR.xml | 7 +- make/data/cldr/common/main/es_BO.xml | 2 - make/data/cldr/common/main/es_CL.xml | 8 +- make/data/cldr/common/main/es_CO.xml | 6 +- make/data/cldr/common/main/es_CR.xml | 2 - make/data/cldr/common/main/es_DO.xml | 4 +- make/data/cldr/common/main/es_EC.xml | 8 +- make/data/cldr/common/main/es_GQ.xml | 4 + make/data/cldr/common/main/es_GT.xml | 2 - make/data/cldr/common/main/es_HN.xml | 2 - make/data/cldr/common/main/es_MX.xml | 83 +- make/data/cldr/common/main/es_NI.xml | 2 - make/data/cldr/common/main/es_PA.xml | 2 - make/data/cldr/common/main/es_PE.xml | 2 - make/data/cldr/common/main/es_PY.xml | 8 +- make/data/cldr/common/main/es_US.xml | 189 +- make/data/cldr/common/main/es_UY.xml | 1 + make/data/cldr/common/main/es_VE.xml | 8 +- make/data/cldr/common/main/et.xml | 408 +- make/data/cldr/common/main/eu.xml | 714 +- make/data/cldr/common/main/ewo.xml | 4 + make/data/cldr/common/main/fa.xml | 634 +- make/data/cldr/common/main/fa_AF.xml | 10 + make/data/cldr/common/main/ff.xml | 4 + make/data/cldr/common/main/ff_Adlm.xml | 82 +- make/data/cldr/common/main/fi.xml | 430 +- make/data/cldr/common/main/fil.xml | 311 +- make/data/cldr/common/main/fo.xml | 52 +- make/data/cldr/common/main/fr.xml | 450 +- make/data/cldr/common/main/fr_CA.xml | 1352 +- make/data/cldr/common/main/frr.xml | 439 +- make/data/cldr/common/main/fur.xml | 2 - make/data/cldr/common/main/fy.xml | 14 +- make/data/cldr/common/main/ga.xml | 945 +- make/data/cldr/common/main/gaa.xml | 22 +- make/data/cldr/common/main/gd.xml | 749 +- make/data/cldr/common/main/gl.xml | 494 +- make/data/cldr/common/main/gsw.xml | 12 +- make/data/cldr/common/main/gu.xml | 286 +- make/data/cldr/common/main/ha.xml | 1064 +- make/data/cldr/common/main/haw.xml | 14 +- make/data/cldr/common/main/he.xml | 1120 +- make/data/cldr/common/main/hi.xml | 330 +- make/data/cldr/common/main/hi_Latn.xml | 69 +- make/data/cldr/common/main/hr.xml | 451 +- make/data/cldr/common/main/hsb.xml | 331 +- make/data/cldr/common/main/hu.xml | 336 +- make/data/cldr/common/main/hy.xml | 453 +- make/data/cldr/common/main/ia.xml | 247 +- make/data/cldr/common/main/id.xml | 323 +- make/data/cldr/common/main/ie.xml | 905 +- make/data/cldr/common/main/ig.xml | 1149 +- make/data/cldr/common/main/ii.xml | 2 +- make/data/cldr/common/main/is.xml | 283 +- make/data/cldr/common/main/it.xml | 442 +- make/data/cldr/common/main/it_CH.xml | 8 +- make/data/cldr/common/main/ja.xml | 372 +- make/data/cldr/common/main/jgo.xml | 2 +- make/data/cldr/common/main/jv.xml | 314 +- make/data/cldr/common/main/ka.xml | 541 +- make/data/cldr/common/main/kaa.xml | 44 +- make/data/cldr/common/main/kab.xml | 196 +- make/data/cldr/common/main/kea.xml | 51 +- make/data/cldr/common/main/kek.xml | 78 + make/data/cldr/common/main/kek_GT.xml | 14 + make/data/cldr/common/main/kgp.xml | 18 +- make/data/cldr/common/main/kk.xml | 510 +- make/data/cldr/common/main/kk_Arab.xml | 9843 ++++----- make/data/cldr/common/main/kl.xml | 14 +- make/data/cldr/common/main/km.xml | 228 +- make/data/cldr/common/main/kn.xml | 348 +- make/data/cldr/common/main/ko.xml | 393 +- make/data/cldr/common/main/kok.xml | 2962 ++- make/data/cldr/common/main/kok_Latn.xml | 1460 +- make/data/cldr/common/main/ks.xml | 20 +- make/data/cldr/common/main/ks_Deva.xml | 2 +- make/data/cldr/common/main/ksf.xml | 4 + make/data/cldr/common/main/ksh.xml | 10 +- make/data/cldr/common/main/ku.xml | 3691 +++- make/data/cldr/common/main/ku_Arab.xml | 27 + make/data/cldr/common/main/ku_Arab_IQ.xml | 15 + make/data/cldr/common/main/ku_Arab_IR.xml | 15 + make/data/cldr/common/main/ku_Latn.xml | 14 + make/data/cldr/common/main/ku_Latn_IQ.xml | 15 + make/data/cldr/common/main/ku_Latn_SY.xml | 15 + make/data/cldr/common/main/ku_Latn_TR.xml | 15 + make/data/cldr/common/main/kxv.xml | 61 +- make/data/cldr/common/main/kxv_Deva.xml | 29 +- make/data/cldr/common/main/kxv_Orya.xml | 29 +- make/data/cldr/common/main/kxv_Telu.xml | 29 +- make/data/cldr/common/main/ky.xml | 207 +- make/data/cldr/common/main/la.xml | 30 + make/data/cldr/common/main/lb.xml | 15 +- make/data/cldr/common/main/lij.xml | 15 +- make/data/cldr/common/main/lld.xml | 177 +- make/data/cldr/common/main/lmo.xml | 2 +- make/data/cldr/common/main/ln.xml | 4 + make/data/cldr/common/main/lo.xml | 346 +- make/data/cldr/common/main/lt.xml | 462 +- make/data/cldr/common/main/luy.xml | 6 + make/data/cldr/common/main/lv.xml | 371 +- make/data/cldr/common/main/lzz.xml | 24 + make/data/cldr/common/main/lzz_TR.xml | 14 + make/data/cldr/common/main/mai.xml | 23 +- make/data/cldr/common/main/mg.xml | 4 +- make/data/cldr/common/main/mgo.xml | 2 +- make/data/cldr/common/main/mi.xml | 93 +- make/data/cldr/common/main/mk.xml | 438 +- make/data/cldr/common/main/ml.xml | 761 +- make/data/cldr/common/main/mn.xml | 773 +- make/data/cldr/common/main/mr.xml | 573 +- make/data/cldr/common/main/ms.xml | 285 +- make/data/cldr/common/main/ms_Arab.xml | 2 + make/data/cldr/common/main/mt.xml | 5 - make/data/cldr/common/main/mww.xml | 101 + make/data/cldr/common/main/mww_Hmnp.xml | 14 + make/data/cldr/common/main/mww_Hmnp_US.xml | 15 + make/data/cldr/common/main/my.xml | 257 +- make/data/cldr/common/main/nds.xml | 10 +- make/data/cldr/common/main/ne.xml | 469 +- make/data/cldr/common/main/nl.xml | 1056 +- make/data/cldr/common/main/nmg.xml | 4 + make/data/cldr/common/main/nn.xml | 80 +- make/data/cldr/common/main/no.xml | 571 +- make/data/cldr/common/main/nqo.xml | 11 +- make/data/cldr/common/main/nso.xml | 66 +- make/data/cldr/common/main/oc.xml | 291 +- make/data/cldr/common/main/oc_ES.xml | 158 +- make/data/cldr/common/main/oka.xml | 23 + make/data/cldr/common/main/oka_CA.xml | 14 + make/data/cldr/common/main/oka_US.xml | 14 + make/data/cldr/common/main/om.xml | 210 +- make/data/cldr/common/main/or.xml | 349 +- make/data/cldr/common/main/pa.xml | 783 +- make/data/cldr/common/main/pap.xml | 453 +- make/data/cldr/common/main/pcm.xml | 274 +- make/data/cldr/common/main/pi.xml | 16 + make/data/cldr/common/main/pi_Latn.xml | 14 + make/data/cldr/common/main/pi_Latn_GB.xml | 15 + make/data/cldr/common/main/pl.xml | 329 +- make/data/cldr/common/main/pms.xml | 120 + make/data/cldr/common/main/pms_IT.xml | 14 + make/data/cldr/common/main/prg.xml | 4 + make/data/cldr/common/main/ps.xml | 543 +- make/data/cldr/common/main/ps_PK.xml | 5 + make/data/cldr/common/main/pt.xml | 335 +- make/data/cldr/common/main/pt_PT.xml | 171 +- make/data/cldr/common/main/qu.xml | 89 +- make/data/cldr/common/main/rif.xml | 1534 +- make/data/cldr/common/main/rm.xml | 6027 +++++- make/data/cldr/common/main/ro.xml | 396 +- make/data/cldr/common/main/root.xml | 689 +- make/data/cldr/common/main/ru.xml | 654 +- make/data/cldr/common/main/rw.xml | 171 +- make/data/cldr/common/main/sa.xml | 10 + make/data/cldr/common/main/sah.xml | 4 + make/data/cldr/common/main/sat.xml | 7 +- make/data/cldr/common/main/sc.xml | 1007 +- make/data/cldr/common/main/scn.xml | 4231 ++-- make/data/cldr/common/main/sd.xml | 546 +- make/data/cldr/common/main/sd_Deva.xml | 32 +- make/data/cldr/common/main/se.xml | 4 + make/data/cldr/common/main/se_FI.xml | 9 +- make/data/cldr/common/main/sg.xml | 6 + make/data/cldr/common/main/sgs.xml | 39 + make/data/cldr/common/main/sgs_LT.xml | 14 + make/data/cldr/common/main/shn.xml | 11104 +++++++++- make/data/cldr/common/main/si.xml | 569 +- make/data/cldr/common/main/sk.xml | 288 +- make/data/cldr/common/main/sl.xml | 404 +- make/data/cldr/common/main/smn.xml | 4 + make/data/cldr/common/main/so.xml | 356 +- make/data/cldr/common/main/sq.xml | 270 +- make/data/cldr/common/main/sr.xml | 300 +- make/data/cldr/common/main/sr_Cyrl_BA.xml | 23 +- make/data/cldr/common/main/sr_Cyrl_ME.xml | 8 +- make/data/cldr/common/main/sr_Latn.xml | 310 +- make/data/cldr/common/main/sr_Latn_BA.xml | 23 +- make/data/cldr/common/main/sr_Latn_ME.xml | 8 +- make/data/cldr/common/main/st.xml | 4 +- make/data/cldr/common/main/su.xml | 4 - make/data/cldr/common/main/suz.xml | 19 + make/data/cldr/common/main/suz_Deva.xml | 14 + make/data/cldr/common/main/suz_Deva_NP.xml | 15 + make/data/cldr/common/main/suz_Sunu.xml | 20 + make/data/cldr/common/main/suz_Sunu_NP.xml | 15 + make/data/cldr/common/main/sv.xml | 513 +- make/data/cldr/common/main/sv_AX.xml | 59 + make/data/cldr/common/main/sv_FI.xml | 162 +- make/data/cldr/common/main/sw.xml | 407 +- make/data/cldr/common/main/sw_KE.xml | 65 +- make/data/cldr/common/main/syr.xml | 758 +- make/data/cldr/common/main/szl.xml | 18 +- make/data/cldr/common/main/ta.xml | 893 +- make/data/cldr/common/main/ta_MY.xml | 2 + make/data/cldr/common/main/ta_SG.xml | 2 + make/data/cldr/common/main/te.xml | 470 +- make/data/cldr/common/main/tg.xml | 178 +- make/data/cldr/common/main/th.xml | 349 +- make/data/cldr/common/main/ti.xml | 404 +- make/data/cldr/common/main/ti_ER.xml | 5 - make/data/cldr/common/main/tk.xml | 435 +- make/data/cldr/common/main/tn.xml | 22 +- make/data/cldr/common/main/to.xml | 243 +- make/data/cldr/common/main/tok.xml | 669 +- make/data/cldr/common/main/tpi.xml | 4 + make/data/cldr/common/main/tr.xml | 315 +- make/data/cldr/common/main/trv.xml | 2 +- make/data/cldr/common/main/trw.xml | 13 +- make/data/cldr/common/main/tt.xml | 1086 +- make/data/cldr/common/main/tyv.xml | 708 + make/data/cldr/common/main/tzm.xml | 4 + make/data/cldr/common/main/ug.xml | 11 +- make/data/cldr/common/main/uk.xml | 707 +- make/data/cldr/common/main/ur.xml | 478 +- make/data/cldr/common/main/ur_IN.xml | 3 +- make/data/cldr/common/main/uz.xml | 366 +- make/data/cldr/common/main/uz_Arab.xml | 4 + make/data/cldr/common/main/uz_Cyrl.xml | 71 +- make/data/cldr/common/main/vec.xml | 87 +- make/data/cldr/common/main/vi.xml | 431 +- make/data/cldr/common/main/vmw.xml | 6 +- make/data/cldr/common/main/vo.xml | 2 +- make/data/cldr/common/main/wae.xml | 2 +- make/data/cldr/common/main/wal.xml | 2 +- make/data/cldr/common/main/wo.xml | 69 +- make/data/cldr/common/main/xh.xml | 475 +- make/data/cldr/common/main/xnr.xml | 47 +- make/data/cldr/common/main/xog.xml | 4 + make/data/cldr/common/main/yav.xml | 2 + make/data/cldr/common/main/yo.xml | 391 +- make/data/cldr/common/main/yo_BJ.xml | 163 +- make/data/cldr/common/main/yrl.xml | 18 +- make/data/cldr/common/main/yrl_CO.xml | 6 +- make/data/cldr/common/main/yrl_VE.xml | 6 +- make/data/cldr/common/main/yue.xml | 385 +- make/data/cldr/common/main/yue_Hans.xml | 1146 +- make/data/cldr/common/main/zh.xml | 412 +- make/data/cldr/common/main/zh_Hans_MY.xml | 27 +- make/data/cldr/common/main/zh_Hant.xml | 410 +- make/data/cldr/common/main/zh_Hant_HK.xml | 203 +- make/data/cldr/common/main/zu.xml | 108 +- .../cldr/common/properties/coverageLevels.txt | 23 +- .../supplemental/attributeValueValidity.xml | 19 +- .../common/supplemental/coverageLevels.xml | 418 +- .../cldr/common/supplemental/dayPeriods.xml | 518 +- .../common/supplemental/languageGroup.xml | 102 +- .../cldr/common/supplemental/languageInfo.xml | 5 + .../common/supplemental/likelySubtags.xml | 175 +- .../cldr/common/supplemental/metaZones.xml | 87 +- .../common/supplemental/numberingSystems.xml | 1 + .../cldr/common/supplemental/ordinals.xml | 10 +- .../data/cldr/common/supplemental/plurals.xml | 20 +- .../data/cldr/common/supplemental/rgScope.xml | 32 +- .../cldr/common/supplemental/subdivisions.xml | 2 +- .../common/supplemental/supplementalData.xml | 1032 +- .../supplemental/supplementalMetadata.xml | 25 +- make/data/cldr/common/supplemental/units.xml | 27 +- .../cldr/common/supplemental/windowsZones.xml | 2 +- .../build/tools/cldrconverter/Bundle.java | 42 +- .../tools/cldrconverter/CopyrightHeaders.java | 84 +- .../tools/cldrconverter/LDMLParseHandler.java | 8 +- .../share/classes/java/util/Locale.java | 33 +- .../java/util/spi/LocaleServiceProvider.java | 2 + src/java.base/share/legal/cldr.md | 2 +- src/jdk.localedata/share/legal/cldr.md | 2 +- .../TestCompactNumber.java | 293 +- .../text/Format/NumberFormat/Bug8132125.java | 8 +- .../java/time/chrono/TestEraDisplayName.java | 6 +- .../time/format/Skeletons_en_US.properties | 27 +- .../java/time/format/Skeletons_ja.properties | 27 +- .../time/format/TestLocalizedPattern.java | 4 +- .../time/format/TestUnicodeExtension.java | 140 +- .../java/util/Calendar/CalendarDataTest.java | 7 +- .../util/Calendar/CldrFormatNamesTest.java | 62 +- .../util/Locale/bcp47u/DisplayNameTests.java | 12 +- .../java/util/Locale/bcp47u/FormatTests.java | 4 +- .../bcp47u/spi/LocaleNameProviderTests.java | 6 +- .../provider/foo/LocaleNameProviderImpl.java | 4 +- .../util/TimeZone/CLDRDisplayNamesTest.java | 22 +- test/jdk/sun/text/resources/LocaleData.cldr | 89 +- .../sun/text/resources/LocaleDataTest.java | 1 + .../util/resources/TimeZone/Bug6317929.java | 69 +- .../util/resources/TimeZone/Bug6442006.java | 8 +- .../util/resources/TimeZone/Bug8139107.java | 14 +- .../resources/cldr/DateTimeRoundTripTest.java | 62 + .../resources/cldr/TimeZoneNamesTest.java | 112 +- .../plugins/IncludeLocalesPluginTest.java | 26 +- 390 files changed, 116085 insertions(+), 37257 deletions(-) create mode 100644 make/data/cldr/common/main/bqi.xml create mode 100644 make/data/cldr/common/main/bqi_IR.xml create mode 100644 make/data/cldr/common/main/bua.xml create mode 100644 make/data/cldr/common/main/bua_RU.xml create mode 100644 make/data/cldr/common/main/en_EE.xml create mode 100644 make/data/cldr/common/main/en_GE.xml create mode 100644 make/data/cldr/common/main/en_JP.xml create mode 100644 make/data/cldr/common/main/en_LT.xml create mode 100644 make/data/cldr/common/main/en_LV.xml create mode 100644 make/data/cldr/common/main/en_UA.xml create mode 100644 make/data/cldr/common/main/kek.xml create mode 100644 make/data/cldr/common/main/kek_GT.xml create mode 100644 make/data/cldr/common/main/ku_Arab.xml create mode 100644 make/data/cldr/common/main/ku_Arab_IQ.xml create mode 100644 make/data/cldr/common/main/ku_Arab_IR.xml create mode 100644 make/data/cldr/common/main/ku_Latn.xml create mode 100644 make/data/cldr/common/main/ku_Latn_IQ.xml create mode 100644 make/data/cldr/common/main/ku_Latn_SY.xml create mode 100644 make/data/cldr/common/main/ku_Latn_TR.xml create mode 100644 make/data/cldr/common/main/lzz.xml create mode 100644 make/data/cldr/common/main/lzz_TR.xml create mode 100644 make/data/cldr/common/main/mww.xml create mode 100644 make/data/cldr/common/main/mww_Hmnp.xml create mode 100644 make/data/cldr/common/main/mww_Hmnp_US.xml create mode 100644 make/data/cldr/common/main/oka.xml create mode 100644 make/data/cldr/common/main/oka_CA.xml create mode 100644 make/data/cldr/common/main/oka_US.xml create mode 100644 make/data/cldr/common/main/pi.xml create mode 100644 make/data/cldr/common/main/pi_Latn.xml create mode 100644 make/data/cldr/common/main/pi_Latn_GB.xml create mode 100644 make/data/cldr/common/main/pms.xml create mode 100644 make/data/cldr/common/main/pms_IT.xml create mode 100644 make/data/cldr/common/main/sgs.xml create mode 100644 make/data/cldr/common/main/sgs_LT.xml create mode 100644 make/data/cldr/common/main/suz.xml create mode 100644 make/data/cldr/common/main/suz_Deva.xml create mode 100644 make/data/cldr/common/main/suz_Deva_NP.xml create mode 100644 make/data/cldr/common/main/suz_Sunu.xml create mode 100644 make/data/cldr/common/main/suz_Sunu_NP.xml create mode 100644 test/jdk/sun/util/resources/cldr/DateTimeRoundTripTest.java diff --git a/make/data/cldr/LICENSE b/make/data/cldr/LICENSE index ca907d75617..9065fe54d8b 100644 --- a/make/data/cldr/LICENSE +++ b/make/data/cldr/LICENSE @@ -1,4 +1,4 @@ -UNICODE LICENSE V3 +UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE diff --git a/make/data/cldr/common/bcp47/calendar.xml b/make/data/cldr/common/bcp47/calendar.xml index 33640c1c1db..9b8bc3e9c1b 100644 --- a/make/data/cldr/common/bcp47/calendar.xml +++ b/make/data/cldr/common/bcp47/calendar.xml @@ -45,6 +45,8 @@ For terms of use, see http://www.unicode.org/copyright.html + + diff --git a/make/data/cldr/common/bcp47/number.xml b/make/data/cldr/common/bcp47/number.xml index 7d242ac07e1..b74bb44f574 100644 --- a/make/data/cldr/common/bcp47/number.xml +++ b/make/data/cldr/common/bcp47/number.xml @@ -105,6 +105,7 @@ For terms of use, see http://www.unicode.org/copyright.html + diff --git a/make/data/cldr/common/bcp47/timezone.xml b/make/data/cldr/common/bcp47/timezone.xml index b173ad4c80d..c0bb0793473 100644 --- a/make/data/cldr/common/bcp47/timezone.xml +++ b/make/data/cldr/common/bcp47/timezone.xml @@ -17,14 +17,14 @@ For terms of use, see http://www.unicode.org/copyright.html - + - + - + @@ -130,6 +130,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -167,7 +168,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -177,7 +178,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -193,8 +194,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + @@ -202,7 +203,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -220,7 +221,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -305,7 +306,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + diff --git a/make/data/cldr/common/dtd/cldrTest.dtd b/make/data/cldr/common/dtd/cldrTest.dtd index 456c842c735..b2111d754b0 100644 --- a/make/data/cldr/common/dtd/cldrTest.dtd +++ b/make/data/cldr/common/dtd/cldrTest.dtd @@ -1,13 +1,12 @@ + + @@ -48,4 +47,3 @@ Except as contained in this notice, the name of a copyright holder shall not be - diff --git a/make/data/cldr/common/dtd/ldml.dtd b/make/data/cldr/common/dtd/ldml.dtd index 4ef94ba67ca..aebedd33a43 100644 --- a/make/data/cldr/common/dtd/ldml.dtd +++ b/make/data/cldr/common/dtd/ldml.dtd @@ -42,7 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -64,6 +64,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + @@ -277,6 +279,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + @@ -456,7 +460,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -1528,7 +1532,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -1718,7 +1722,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -1765,6 +1769,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + + + + + @@ -1963,7 +1976,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -2267,6 +2280,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + + + + + + + + + + + + + + + + + + @@ -3100,12 +3135,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + + + + + + + + + diff --git a/make/data/cldr/common/dtd/ldml.xsd b/make/data/cldr/common/dtd/ldml.xsd index 973251f2f69..3ee2c75ed75 100644 --- a/make/data/cldr/common/dtd/ldml.xsd +++ b/make/data/cldr/common/dtd/ldml.xsd @@ -128,10 +128,10 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file - + - + @@ -182,6 +182,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -203,6 +204,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -696,6 +698,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -718,6 +721,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -1196,12 +1200,15 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file - - - - + + + + + + + @@ -4512,6 +4519,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -4634,6 +4642,28 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + + + + + + + + + + + + + + + + + + + + + + @@ -5099,6 +5129,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -5830,6 +5861,72 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8049,6 +8146,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -8070,6 +8168,27 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + + + + + + + + + + + + + + + + + + + + + diff --git a/make/data/cldr/common/dtd/ldmlBCP47.dtd b/make/data/cldr/common/dtd/ldmlBCP47.dtd index 21ab9e836b7..f379972009c 100644 --- a/make/data/cldr/common/dtd/ldmlBCP47.dtd +++ b/make/data/cldr/common/dtd/ldmlBCP47.dtd @@ -12,7 +12,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -72,6 +72,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + diff --git a/make/data/cldr/common/dtd/ldmlBCP47.xsd b/make/data/cldr/common/dtd/ldmlBCP47.xsd index 3abe9785334..6ba36d5feb6 100644 --- a/make/data/cldr/common/dtd/ldmlBCP47.xsd +++ b/make/data/cldr/common/dtd/ldmlBCP47.xsd @@ -24,10 +24,10 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file - + - + @@ -120,6 +120,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -134,6 +135,8 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + + diff --git a/make/data/cldr/common/dtd/ldmlOpenOffice.dtd b/make/data/cldr/common/dtd/ldmlOpenOffice.dtd index a643b80f392..557d0250a6e 100644 --- a/make/data/cldr/common/dtd/ldmlOpenOffice.dtd +++ b/make/data/cldr/common/dtd/ldmlOpenOffice.dtd @@ -1,11 +1,8 @@ @@ -60,7 +57,7 @@ openOffice:quarter4Abbreviation?)> - + diff --git a/make/data/cldr/common/dtd/ldmlSupplemental.dtd b/make/data/cldr/common/dtd/ldmlSupplemental.dtd index 6667ea902b9..271e50dbfcf 100644 --- a/make/data/cldr/common/dtd/ldmlSupplemental.dtd +++ b/make/data/cldr/common/dtd/ldmlSupplemental.dtd @@ -12,7 +12,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -147,6 +147,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -274,7 +275,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -770,7 +771,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -996,6 +997,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + + @@ -1090,7 +1097,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + diff --git a/make/data/cldr/common/dtd/ldmlSupplemental.xsd b/make/data/cldr/common/dtd/ldmlSupplemental.xsd index b7c64ddb38d..17445fc07b0 100644 --- a/make/data/cldr/common/dtd/ldmlSupplemental.xsd +++ b/make/data/cldr/common/dtd/ldmlSupplemental.xsd @@ -65,10 +65,10 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file - + - + @@ -374,6 +374,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -2183,12 +2184,18 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + + + + + + diff --git a/make/data/cldr/common/main/ab.xml b/make/data/cldr/common/main/ab.xml index 07e0dfa4fae..a2348a2f634 100644 --- a/make/data/cldr/common/main/ab.xml +++ b/make/data/cldr/common/main/ab.xml @@ -2072,7 +2072,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пномпен - + Кантон @@ -2746,9 +2746,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Мраҭашәаратәи Африка - Мраҭашәаратәи Африка, астандартә аамҭа - Мраҭашәаратәи Африка, аԥхынтәи аамҭа + Мраҭашәаратәи Африка @@ -3136,6 +3134,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гаиана + + + Ҳаваи-алеуттәи астандартә аамҭа + + Ҳаваи-алеуттәи аамҭа @@ -3686,6 +3689,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ {0} {1} diff --git a/make/data/cldr/common/main/af.xml b/make/data/cldr/common/main/af.xml index 17355745ca1..269c1767e37 100644 --- a/make/data/cldr/common/main/af.xml +++ b/make/data/cldr/common/main/af.xml @@ -46,6 +46,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Azerbeidjans Azeri Baskir + Baloetsji Balinees Basaa Belarussies @@ -118,8 +119,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ekajuk Grieks Engels - Engels (VK) - Engels (VSA) Esperanto Spaans Estnies @@ -230,6 +229,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Keuls Koerdies + Koerdies + Koermandji Kumyk Komi Kornies @@ -328,7 +329,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Wes-Ojibwa Okanagan Oromo - Oriya + Odia Osseties Pandjabi Pangasinan @@ -522,7 +523,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + @@ -629,6 +630,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombië Clippertoneiland + Sark Costa Rica Kuba Kaap Verde @@ -874,33 +876,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numeriese rangskikking Rangskiksterkte Geldeenheid - Uursiklus (12 vs 24) + Emoji-voorstelling + Uursiklus (12 vs. 24) Reëlafbreek-styl + Lynafbrekingsteken in woorde Maatstelsel Syfers + Afbrekingsteken ná afkorting Tydsone Lokaalvariant Privaat gebruik Boeddhistiese kalender + Boeddhis Chinese kalender + Chinees Koptiese kalender + Kopties Dangi-kalender + Dangi Etiopiese kalender + Etiopies Etiopiese Amete Alem-kalender + Etiopiese Amete Alem Gregoriaanse kalender + Gregoriaans Hebreeuse kalender + Hebreeus Indiese nasionale kalender Islamitiese kalender + Hijri Islamitiese siviele kalender + Hijri (tabelvormige burgerlike kalender) Islamitiese kalender (Umm al-Qura) + Hijri (Umm al-Qura) ISO-8601-kalender Japannese kalender + Japannees Persiese kalender + Persies Minguo-kalender + Minguo Rekeningkundige geldeenheidformaat + Rekeningkunde Standaard geldeenheidformaat + Standaard Sorteer simbole Sorteer ignoreersimbole Sorteer aksente gewoonweg @@ -910,16 +931,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sorteer hoofletters eerste Sorteer nie kassensitief nie Sorteer kassensitief - Tradisionele Chinese sorteervolgorde - Groot5 Woordeboek-sorteervolgorde Verstek Unicode-rangskikvolgorde - Vereenvoudigde Chinese sorteervolgorde - GB2312 + Verstek Unicode Foonboek-sorteervolgorde Fonetiese sorteerorde Pinyin-sorteervolgorde Algemenedoel-soektog + Soektog Soek volgens Hangul-beginkonsonant Standaard rangskikvolgorde + Standaard Slag-sorteervolgorde Tradisionele sorteervolgorde Radikale-slag-sorteervolgorde @@ -935,18 +957,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vollewydte Halfwydte Numeries + Verstek + Emoji + Teks 12-uur-stelsel (0-11) + 12 (0–11) 12-uur-stelsel (1-12) + 12 (1–12) 24-uur-stelsel (0-23) + 24 (0–23) 24-uur-stelsel (1-24) + 24 (1–24) Losse reëlafbreek-styl + Los Normale reëlafbreek-styl + Normaal Streng reëlafbreek-styl + Streng + Breek als + Hou als + Normaal + Hou in frases BGN-transliterasie UNGEGN-transliterasie Metrieke stelsel + Metriek Imperiale maatstelsel + VK VSA-maatstelsel + VSA Arabies-Indiese syfers Uitgebreide Arabies-Indiese syfers Armeense syfers @@ -991,6 +1030,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tibettaanse syfers Tradisionele syfers Vai-syfers + Af + Aan Metrieke stelsel @@ -1007,7 +1048,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [aáâ b c d eéèêë f g h iîï j k l m n oôö p q r s t uû v w x y z] [àåäã æ ç íì óò úùü ý] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] - [  \- ‑ , % ‰ + 0 1 2 3 4 5 6 7 8 9] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] @@ -1046,6 +1086,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -1054,6 +1097,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -1071,18 +1117,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E hh:mm B E hh:mm:ss B E d - E hh:mm a - E hh:mm:ss a y G + MM-y G M/d/y GGGGG + E, dd-MM-y G MMM y G d MMM y G E d MMM y G - h a hh:mm a hh:mm:ss a d/M - E M/d + E, d/M d MMM E d MMM d MMMM @@ -1100,9 +1145,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ y G - - h B – h B - d – d @@ -1335,10 +1377,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mn v n - o - m - a - n + die oggend + in die middag + in die aand + in die nag @@ -1348,15 +1390,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ aand nag - - mn - v - n - o - m - a - n - @@ -1432,6 +1465,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -1440,6 +1476,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -1463,7 +1502,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y G dd MMM y G E dd MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1488,9 +1526,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 'week' w 'van' Y - - h B – h B - hh:mm B – hh:mm B hh:mm B – hh:mm B @@ -1535,7 +1570,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM y – E d MMM y G - h a – h a h – h a @@ -1552,7 +1586,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm a – h:mm a v - h a – h a v h – h a v @@ -2072,7 +2105,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Onbekende stad + Onbekende ligging Doebai @@ -2080,8 +2113,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kaboel + + Rothera-navorsingstasie + + + Troll-stasie + + + Syowa-stasie + + + Mawson-stasie + + + Davis-stasie + - Wostok + Wostok-stasie + + + Casey-stasie + + + Dumont d’Urville-stasie + + + McMurdo-stasie Wene @@ -2120,7 +2177,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zürich - Paas + Paaseiland Kaap Verde @@ -2194,7 +2251,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bisjkek - Enderbury + Kantoneiland Comore @@ -2223,36 +2280,39 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Luxemburg + + Kwajalein Atoll + Macau Maledive - - Bahia Banderas - Meksikostad Koeala-Loempoer - - Nouméa - Katmandoe Muskat + + Marquesas-eilande + Karatsji Warskou + + Pitcairn-eilande + Asore @@ -2316,6 +2376,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiëf + + Wake-eiland + Beulah, Noord-Dakota @@ -2337,9 +2400,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ho Tsji Minhstad - - Mata-Utu - Afganistan-tyd @@ -2371,14 +2431,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Wes-Afrika-tyd - Wes-Afrika-standaardtyd - Wes-Afrika-somertyd + Wes-Afrika-tyd - WAT WAT - WAST @@ -2502,9 +2558,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Aserbeidjan-tyd - Aserbeidjan-standaardtyd - Aserbeidjan-somertyd + Azerbeidjan-tyd + Azerbeidjan-standaardtyd + Azerbeidjan-somertyd @@ -2614,7 +2670,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Dumont-d’Urville-tyd + Dumont d’Urville-tyd @@ -2735,6 +2791,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guiana-tyd + + + Hawaii-Aleoete-standaardtyd + + Hawaii-Aleoete-tyd @@ -3316,7 +3377,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -3327,34 +3387,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤0 k + ¤ 0 k ¤0 k + ¤ 0 k ¤00 k + ¤ 00 k ¤00 k + ¤ 00 k ¤000 k + ¤ 000 k ¤000 k + ¤ 000 k ¤0 m + ¤ 0 m ¤0 m + ¤ 0 m ¤00 m + ¤ 00 m ¤00 m + ¤ 00 m ¤000 m ¤ 000 m ¤000 m ¤ 000 m ¤0 mjd + ¤ 0 mjd ¤0 mjd + ¤ 0 mjd ¤00 mjd + ¤ 00 mjd ¤00 mjd + ¤ 00 mjd ¤000 mjd ¤ 000 mjd ¤000 mjd ¤ 000 mjd ¤0 bn + ¤ 0 bn ¤0 bn + ¤ 0 bn ¤00 bn + ¤ 00 bn ¤00 bn + ¤ 00 bn ¤000 bn ¤ 000 bn - ¤ 000 bn + ¤000 bn ¤ 000 bn @@ -3434,7 +3512,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Botswana-pula - Belarusiese roebel + Belarussiese roebel + Belarussiese roebel + Belarussiese roebel р. @@ -3502,7 +3582,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Etiopiese birr - Euro + euro euro euro @@ -3538,8 +3618,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guatemalaanse kwetsal - Guatemalaanse kwetsal - Guatemalaanse kwetsal Guyanese dollar @@ -3567,8 +3645,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Indiese roepee - Indiese rupee - Indiese rupee + Indiese roepee + Indiese roepee Irakse dinar @@ -3631,7 +3709,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Liberiese dollar - Lesotho loti + Lesotho-loti + Lesotho-loti + Lesotho-loti Litause litas @@ -3781,7 +3861,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sierra Leoniese leone - Sierra Leoniese leone (1964—2022) + Sierra Leoniese leone (1964–2022) + Sierra Leoniese leone (1964–2022) + Sierra Leoniese leone (1964–2022) Somaliese sjieling @@ -3875,6 +3957,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oos-Karibiese dollar + + Karibiese gulde + Karibiese gulde + Karibiese gulde + Wes-Afrikaanse CFA-frank @@ -3902,6 +3989,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwiese dollar + + Zimbabwiese goud + Zimbabwiese goud + Zimbabwiese goud + {0}+ @@ -4098,7 +4190,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0} items - + + dele + {0} deel + {0} dele + + dele per miljoen {0} deel per miljoen {0} dele per miljoen @@ -4116,6 +4213,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} per tienduisend {0} per tienduisend + + glukose + {0} glukose + {0} glukose + liter per kilometer {0} liter per kilometer @@ -4316,6 +4418,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} newton {0} newton + + kilowattuur per 100 kilometer + {0} kilowattuur per 100 kilometer + {0} kilowattuur per 100 kilometer + gigahertz {0} gigahertz @@ -4583,6 +4690,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimeter kwik {0} millimeter kwik + + kwik + {0} kwik + {0} kwik + pond per vierkante duim {0} pond per vierkante duim @@ -4667,7 +4779,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kelvin - pondvoet + pondvoetkrag {0} pondvoetkrag {0} pondvoet @@ -4677,20 +4789,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} newtonmeter - kubieke kilometers + kubieke kilometer {0} kubieke kilometer - {0} kubieke kilometers + {0} kubieke kilometer - kubieke meters + kubieke meter {0} kubieke meter - {0} kubieke meters + {0} kubieke meter {0} per kubieke meter - kubieke sentimeters + kubieke sentimeter {0} kubieke sentimeter - {0} kubieke sentimeters + {0} kubieke sentimeter {0} per kubieke sentimeter @@ -4714,18 +4826,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kubieke duim - megaliters + megaliter {0} megaliter - {0} megaliters + {0} megaliter - hektoliters + hektoliter {0} hektoliter - {0} hektoliters + {0} hektoliter + liter {0} liter - {0} liters + {0} liter {0} per liter @@ -4753,6 +4866,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrieke koppie {0} metrieke koppies + + m. vl. ons + {0} m. vl. ons + {0} m. vl. ons + {0} acre-voet {0} acre-voet @@ -4765,7 +4883,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Britse gelling - {0} Britse gelling + {0} Br. gelling {0} Britse gelling @@ -4788,9 +4906,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} vloeistofons - Imp. vloeistofonse - {0} Imp. vloeistofons - {0} Imp. vloeistofonse + Br. vloeistofonse + {0} Br. vloeistofons + {0} Br. vloeistofonse eetlepels @@ -4808,11 +4926,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dessertlepel {0} dessertlepel - {0} dessertlepel + {0} dessertlepels Engelse dessertlepel - {0} Engelse dessertlepel + {0} Br. dessertlepel {0} Engelse dessertlepel @@ -4825,20 +4943,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Engelse kwartgelling {0} Engelse kwartgelling - - lig - {0} lig - {0} lig + + steradiaal + {0} steradiaal + {0} steradiaal - + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farads + {0} farad + {0} farad + + + henries + {0} henry + {0} henries + + + siemens + {0} siemens + {0} siemens + + + IT-kalorie + {0} IT-kalorie + {0} IT-kalorieë + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + kilogramkrag + {0} kilogramkrag + {0} kilogramkrag + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} webers + + deeltjies per miljard {0} deeltjie per miljard {0} deeltjies per miljard - nagte - {0} nag - {0} nagte {0} per nag @@ -4927,7 +5102,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmol/l {0} mmol/l - + + deel + {0} deel + {0} deel + + dele/miljoen {0} d.p.m. {0} d.p.m. @@ -4941,6 +5121,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ per tienduisend + + Glk + {0} Glk + {0} Glk + liter/km {0} l/km @@ -5087,8 +5272,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ megapieksels - {0} MP - {0} MP dpcm @@ -5102,6 +5285,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ stippels + {0} stippel + {0} stippels myl @@ -5297,9 +5482,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} hl {0} hl - - liters - dl {0} dl @@ -5325,6 +5507,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} m. kop {0} m. kop + + m. vl. ons + {0} m. vl. ons + {0} m. vl. ons + acre-voet {0} acre-vt. @@ -5368,9 +5555,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} vl.oz. - Imp. vl.oz. - {0} Imp. vl.oz. - {0} Imp. vl.oz. + Br. vl. oz. + {0} Br. vl. oz. + {0} Br. vl. oz. e. @@ -5378,7 +5565,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} e. - tl. + t. {0} tl. {0} tl. @@ -5393,9 +5580,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} dstlpl. - dstlpl. Eng. - {0} dstlpl. Eng. - {0} dstlpl. Eng. + Br. dessertlepels + {0} Br. dl. + {0} Br. dl. druppel @@ -5404,7 +5591,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dragme vloeistof - {0} dr. vl. + {0} dragme {0} dr. vl. @@ -5422,12 +5609,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kwart Eng. {0} kwart Eng. + + IT-kal. + {0} IT-kal. + {0} IT-kal. + lig {0} lig {0} lig - + deeltjies/miljard {0} deeltjie/miljard {0} deeltjies/miljard @@ -5479,22 +5671,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}″ {0}″ - - {0}km² - {0}km² - - - {0}ha - {0}ha - - meters² - {0}m² - {0}m² - - - {0}cm² - {0}cm² + meter² {0}myl² @@ -5505,20 +5683,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ac - {0}jt.² - {0}jt.² - - - {0}vt.² - {0}vt.² - - - {0}dm.² - {0}dm.² - - - {0}donum - {0}donum + jt.² {0}kar. @@ -5537,10 +5702,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}item {0}item - + + deel + {0} deel + {0} deel + + d.p.m. - {0}d.p.m. - {0} d.p.m. % @@ -5555,6 +5723,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glk + {0} Glk + {0} Glk + l/km {0}l/km @@ -5611,8 +5784,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}kb - {0}greep - {0}greep + {0} B + {0} B {0}bis @@ -5716,10 +5889,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}N {0}N - - {0}kWh/100km - {0}kWh/100km - {0}GHz {0}GHz @@ -5745,10 +5914,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}px {0}px - - {0} MP - {0} MP - {0}ppcm {0}ppcm @@ -5763,8 +5928,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ stippel - {0}stippel - {0}stippel + {0} stippel + {0} stippels {0}R⊕ @@ -5781,69 +5946,28 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}μm {0}μm - - {0}nm - {0}nm - - - {0}pm - {0}pm - - - {0}myl - {0}myl - - {0}jt. - {0}jt. + jt. vt. - {0}vt. - {0}vt. {0}″ {0}″ - - {0}pc - {0}pc - lj - {0} lj - {0} lj {0}AE {0}AE - - {0}fur - {0}fur - - - {0}vaam - {0}vaam - - - {0}sm. - {0}sm. - - - {0}smi - {0}smi - pte. - {0}pt. - {0}pt. R☉ - {0}R☉ - {0}R☉ {0}lx @@ -5951,6 +6075,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg {0}mmHg + + {0} Hg + {0} Hg + {0}lb./vk.dm {0}lb./vk.dm @@ -6021,14 +6149,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}Nm {0}Nm - - {0}km³ - {0}km³ - - - {0}cm³ - {0}cm³ - {0}myl³ {0}myl³ @@ -6047,39 +6167,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dm³ {0}dm³ - - {0}ML - {0}ML - - - {0}hl - {0}hl - liter - {0}l - {0}l - - - {0}dl - {0}dl - - - {0}cl - {0}cl - - - {0}ml - {0}ml pt. - {0}mpt. - {0}mpt. - - {0}m.kop - {0}m.kop + + m. vl. ons + {0} m. vl. ons + {0} m. vl. ons {0}ac.-vt. @@ -6116,15 +6213,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}vl.oz. - Imp vl.oz. - {0}Im.vl.oz. - {0}Im.vl.oz. + Br. vl. oz. + {0} Br. vl. oz. + {0} Br. vl. oz. {0}e. {0}e. + t. {0}tl. {0}tl. @@ -6137,14 +6235,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dstlpl. - {0}dlpl.Eng - {0}dlpl.Eng + Br. dl. + {0} Br. dl. + {0} Br. dl. - {0}dr - {0}dr + {0} dr. + {0} dr. + vl. dr. {0}dr.vl. {0}dr.vl. @@ -6161,22 +6261,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}kw.Eng. {0}kw.Eng - - lig - {0} lig - {0} lig + + {0} C + {0} C - - deeltjies/miljard + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + IT-kal. + {0} IT-kal. + {0} IT-kal. + + + {0} Gy + {0} Gy + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + ppb {0}deeltjie/miljard {0}deeltjies/miljard - - nagte - {0} nag - {0} nagte - {0}/nag - hh:mm @@ -6200,10 +6322,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}, {1} - - {0}, {1} - {0}, {1} - {0} {1} {0} {1} @@ -6536,7 +6654,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Müller - Zalta + Zelda Herman Stander diff --git a/make/data/cldr/common/main/ak.xml b/make/data/cldr/common/main/ak.xml index f2417e895de..773fdfc5530 100644 --- a/make/data/cldr/common/main/ak.xml +++ b/make/data/cldr/common/main/ak.xml @@ -14,12 +14,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Afrikaans Akan - Amarik + Amariki Arabeke Arabeke Kasa Nhyehyɛeɛ Foforɔ Asamese Asturiani Asabegyanni + Balukyi Belarus kasa Bɔlgeria kasa Harianvi @@ -42,13 +43,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Swisalande Gyaaman Dɔgri Sɔɔbia a ɛwɔ fam + Ayigbe Greek kasa Borɔfo Ngresi Borɔfo Amɛrika Borɔfo Esperanto Spain kasa - Spain kasa (Laaten Amɛrika) Estonia kasa Baske Pɛɛhyia kasa @@ -306,7 +307,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bolivia Caribbean Netherlands Brazil - Bahama + Bahamase Butan Bouvet Island Bɔtswana @@ -327,8 +328,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kyaena Kolombia Klepatin Aeland + Sark Kɔsta Rika - Kuba + Kiuba Kepvɛdfo Islands Kurakaw Buronya Supɔ @@ -349,7 +351,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sahara Atɔeɛ Ɛritrea Spain - Ithiopia + Yitiopia Yuropu Nkabomkuo Yuropu Fam Finland @@ -386,7 +388,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Heiti Hangari Canary Islands - Indɔnehyia + Ndoniihyia Aereland Israe Isle of Man @@ -394,7 +396,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Britenfo Man Wɔ India Po No Mu Kyagɔso Akyipalego Irak - Iran + Yiran Aesland Itali Gyɛsi @@ -406,7 +408,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kambodia Kiribati Kɔmɔrɔs - Saint Kitts ne Nɛves + Saint Kitts ne Nevis Korea Atifi Korea Anaafoɔ Kuweti @@ -489,7 +491,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sweden Singapɔ Saint Helena - Slovinia + Slovenia Svalbard ne Jan Mayen Slovakia Sɛra Liɔn @@ -553,9 +555,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nyiyie Kwan Sika Dɔnhwere Nkɔmmaeɛ (12 anaa 24) - Line Break Nhyehyɛeɛ + Line Break Nhyehyɛeɛ Ketee Nsusudeɛ Sestɛm - Nɛma + Nɔma Budafoɔ Kalɛnna @@ -565,12 +567,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yitiopia Kalɛnna Yitiopia Amete Alɛm Kalɛnna Gregorian Kalɛnna + Gregorian Hibri Kalɛnda Higyiri Kalɛnda Higyiri Kalɛnda (tabula, sivil epokyi Higyiri Kalɛnda (Ummm al-Kura) ISO-8601 Kalɛnna - Gyapanfoɔ Kalɛnda + Gyapanfoɔ Kalɛnna Pɛɛsiafoɔ Kalɛnda Minguo Kalɛnda Sika Nkotabuo Fɔmate @@ -578,6 +581,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Koodu Korɔ Nyiyie Kwan a ɛdi Kan Daa-Botaeɛ Adehwehwɛ Nyiyie Kwan Susudua + Susudua Nnɔnhwere 12 Sestɛm (0–11) Nnɔnhwere 12 Sestɛm (1–12 Nnɔnhwere 24 Sestɛm (0–23) @@ -713,33 +717,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Ɔpɛpɔn - Ɔgyefoɔ - Ɔbɛnem - Oforisuo - Kɔtɔnimma - Ayɛwohomumu - Kutawonsa - Ɔsanaa - Ɛbɔ - Ahinime - Obubuo - Ɔpɛnimma - - Ɔ - Ɔ - Ɔ + Ɔp + Ɔg + Ɔb O K A - K - Ɔ - Ɛ - A - O - Ɔ + Ku + A + S + O + N + D Ɔpɛpɔn @@ -757,20 +747,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Ɔpɛpɔn - Ɔgyefoɔ - Ɔbɛnem - Oforisuo - Kɔtɔnimma - Ayɛwohomumu - Kutawonsa - Ɔsanaa - Ɛbɔ - Ahinime - Obubuo - Ɔpɛnimma - Ɔ Ɔ @@ -785,26 +761,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic O Ɔ - - Ɔpɛpɔn - Ɔgyefoɔ - Ɔbɛnem - Oforisuo - Kɔtɔnimma - Ayɛwohomumu - Kutawonsa - Ɔsanaa - Ɛbɔ - Ahinime - Obubuo - Ɔpɛnimma - - Kwe + Kwa + Dwo + Ben + Wuk + Yaw + Fia + Mem + + + Kwa Dwo Ben Wuk @@ -813,7 +784,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mem - Kwasiada + Sun Dwoada Benada Wukuada @@ -823,6 +794,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + Kwa + Dwo + Ben + Wuk + Yaw + Fia + Mem + K D @@ -832,8 +812,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic F M + + Kwa + Dwo + Ben + Wuk + Yaw + Fia + Mem + - Kwasiada + Sun Dwoada Benada Wukuada @@ -858,29 +847,31 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kɔta a ɛtɔ so nnan - - - Kɔta1 - Kɔta2 - Kɔta3 - Kɔta4 - - - Kɔta a ɛdi kan - kɔta a ɛtɔ so mmienu - Kɔta a ɛtɔ so mmiɛnsa - Kɔta a ɛtɔ so nnan - - AN - EW + ANW + + + an + anw + + + AN + ANW + + AN + ANW + + + AN + ANW + AN ANW @@ -903,23 +894,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEE, MMMM d, y + EEE, d, MMMM, y yMMMMEEEEdd - MMMM d, y + d, MMMM, y - MMM d, y + d, MMM, y - M/d/yy + d/M/yy yyMMdd @@ -976,9 +967,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} - - {1}, {0} - h:mm a @@ -1045,9 +1033,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM – MMM - - MMM d – MMM d - E, MMM d – E, MMM d E, MMM d – E, MMM d @@ -1087,12 +1072,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic berɛ - - berɛ - - - berɛ - Afe afe a atwam @@ -1107,32 +1086,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic mfeɛ {0} a atwam - - afe a atwam - afe yi - afe a ɛdi hɔ - - afe {0} mu - mfeɛ {0} mu - - - afe {0} a atwam - mfeɛ {0} a atwam - - - - afe a atwam - afe yi - afe a ɛdi hɔ - - afe {0} mu - mfeɛ {0} mu - - - afe {0} a atwam - mfeɛ {0} a atwam - - kɔta kɔta a atwam @@ -1147,19 +1100,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kɔta ahodoɔ {0} a atwam - - kɔta - - kɔta {0} mu - kɔta ahodoɔ {0} mu - - - kɔta {0} a atwam - kɔta ahodoɔ {0} a atwam - - - kɔta kɔta {0} mu kɔta {0} mu @@ -1184,22 +1125,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - bosome a atwam - bosome yi - bosome a ɛdi hɔ - - bosome {0} mu - abosome{0} mu - - - bosome {0} a atwam - abosome{0} a atwam - - - - bosome a atwam - bosome yi - bosome a ɛdi hɔ bosome {0} mu abosome{0} mu @@ -1224,26 +1149,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic nnawɔtwe a ɛtɔ so {0}mu - - Nnawɔtwe - nnawɔtwe a atwam - nnawɔtwe yi - nnawɔtwe a ɛdi hɔ - - nnawɔtwe {0} mu - nnawɔtwe {0} mu - - - nnawɔtwe{0} a atwam - nnawɔtwe{0} a atwam - - nnawɔtwe a ɛtɔ so {0}mu - - Nnawɔtwe - nnawɔtwe a atwam - nnawɔtwe yi - nnawɔtwe a ɛdi hɔ nnawɔtwe {0} mu. nnawɔtwe {0} mu @@ -1252,17 +1158,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic nnawɔtwe{0} a atwam nnawɔtwe {0} a atwam - nnawɔtwe a ɛtɔ so {0}mu bosome mu nnawɔtwe - - bosome mu nnawɔtwe - - - bosome mu nnawɔtwe - Da nnora @@ -1277,59 +1176,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic nna{0} a atwam - - Ndeda ɛnnora - Ndɛ ɛnnɛ - Ɔkyena - - da {0} mu - nna {0} mu - - - da{0} a atwam - nna{0} a atwam - - ɛnnora ɛnnɛ Ɔkyena - - da {0} mu - nna {0} mu - - - da{0} a atwam - nna{0} a atwam - afe mu da - - afe mu da - - - afe mu da - nnawɔtwe mu da - - nnawɔtwe mu da - - - nnawɔtwe mu da - nnawɔtwe mu da wɔ bosome mu - - nnawɔtwe mu da wɔ bosome mu - - - nnawɔtwe mu da wɔ bosome mu - Kwasiada a atwam Kwasiada yi @@ -1343,32 +1203,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kwasiada {0} a atwam - - Kwasiada a atwam - Kwasiada yi - Kwasiada a ɛdi hɔ - - Kwasiada {0} mu - Kwasiada {0} mu - - - Kwasiada {0} a atwam - Kwasiada {0} a atwam - - - - Kwasiada a atwam - Kwasiada yi - Kwasiada a ɛdi hɔ - - Kwasiada {0} mu - Kwasiada {0} mu - - - Kwasiada {0} a atwam - Kwasiada {0} a atwam - - Dwoada a atwam Dwoada yi @@ -1382,32 +1216,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dwoada {0} a atwam - - Dwoada a atwam - Dwoada yi - Dwoada a ɛdi hɔ - - Dwoada {0} mu - Dwoada {0} mu - - - Dwoada {0} a atwam - Dwoada {0} a atwam - - - - Dwoada a atwam - Dwoada yi - Dwoada a ɛdi hɔ - - Dwoada {0} mu - Dwoada {0} mu - - - Dwoada {0} a atwam - Dwoada {0} a atwam - - Benada a atwam Benada yi @@ -1421,32 +1229,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Benada {0} a atwam - - Benada a atwam - Benada yi - Benada a ɛdi hɔ - - Benada {0} mu - Benada {0} mu - - - Benada {0} a atwam - Benada {0} a atwam - - - - Benada a atwam - Benada yi - Benada a ɛdi hɔ - - Benada {0} mu - Benada {0} mu - - - Benada {0} a atwam - Benada {0} a atwam - - Wukuada a atwam Wukuada yi @@ -1460,32 +1242,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wukuada {0} a atwam - - Wukuada a atwam - Wukuada yi - Wukuada a ɛdi hɔ - - Wukuada {0} mu - Wukuada {0} mu - - - Wukuada {0} a atwam - Wukuada {0} a atwam - - - - Wukuada a atwam - Wukuada yi - Wukuada a ɛdi hɔ - - Wukuada {0} mu - Wukuada {0} mu - - - Wukuada {0} a atwam - Wukuada {0} a atwam - - Yawoada a atwam Yawoada yi @@ -1499,32 +1255,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yawoada {0} a atwam - - Yawoada a atwam - Yawoada yi - Yawoada a ɛdi hɔ - - Yawoada {0} mu - Yawoada {0} mu - - - Yawoada {0} a atwam - Yawoada {0} a atwam - - - - Yawoada a atwam - Yawoada yi - Yawoada a ɛdi hɔ - - Yawoada {0} mu - Yawoada {0} mu - - - Yawoada {0} a atwam - Yawoada {0} a atwam - - Fiada a atwam Fiada yi @@ -1538,49 +1268,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fiada {0} a atwam - - Fiada a atwam - Fiada yi - Fiada a ɛdi hɔ - - Fiada {0} mu - Fiada {0} mu - - - Fiada {0} a atwam - Fiada {0} a atwam - - - - Fiada a atwam - Fiada yi - Fiada a ɛdi hɔ - - Fiada {0} mu - Fiada {0} mu - - - Fiada {0} a atwam - Fiada {0} a atwam - - Memeneda a atwam Memeneda yi - Memeneda a ɛdi hɔ - - Memeneda {0} mu - Memeneda {0} mu - - - Memeneda {0} a atwam - Memeneda {0} a atwam - - - - Memeneda a atwam - Memeneda yi - Memeneda a ɛdi hɔ + next Saturday Memeneda {0} mu Memeneda {0} mu @@ -1593,25 +1284,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Memeneda a atwam Memeneda yi - Memeneda a ɛdi hɔ - - Memeneda {0} mu - Memeneda {0} mu - - - Memeneda {0} a atwam - Memeneda {0} a atwam - - - - anɔpa/anwummerɛ + next Saturday anɔpa/anwummerɛ - - anɔpa/anwummerɛ - dɔnhwere dɔnhwere yi @@ -1624,28 +1301,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic nnɔnhwere {0} a atwam - - dɔnhwere - - dɔnhwere {0} mu - nnɔnhwere {0} mu - - - dɔnhwere {0} a atwam - nnɔnhwere {0} a atwam - - - - dɔnhwere - - dɔnhwere {0} mu - nnɔnhwere {0} mu - - - dɔnhwere {0} a atwam - nnɔnhwere {0} a atwam - - sima sima yi @@ -1658,60 +1313,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic sima {0} a atwam - - sima - - sima {0} mu - sima {0} mu - - - sima {0} a atwam - sima {0} a atwam - - - - sima - - sima {0} mu - sima {0} mu - - - sima {0} a atwam - sima {0} a atwam - - Simasin seesei - anibuo {0} mu - nnibuo {0} mu + simasin {0} mu + simasin {0} mu - anibuo {0} a atwam - nnibuo {0} a atwam + simasin {0} a atwam + simasin {0} a atwam - Simasin - anibuo {0} mu - nnibuo {0} mu + simasin {0} mu + simasin {0} mu - anibuo {0} a atwam - nnibuo {0} a atwam + simasin {0} a atwam + simasin {0} a atwam - Simasin - anibuo {0} mu - nnibuo {0} mu + simasin {0} mu + simasin {0} mu - anibuo {0} a atwam - nnibuo {0} a atwam + simasin {0} a atwam + simasin {0} a atwam @@ -1720,9 +1351,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic nkyekyɛmu - - nkyekyɛmu - Berɛ {0} @@ -1829,9 +1457,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wagadugu - - Sɔfia - Budwumbura @@ -1949,6 +1574,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nikosia + + Prage + Busingye @@ -1959,7 +1587,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gyibuuti - Kɔpɛhangɛne + Kopehegan Dɔmeneka @@ -1980,7 +1608,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kanari - Kyuta + kiweta Hɛlsinki @@ -1997,9 +1625,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pɔnpei + + Farosu + - Ingresi Awia Berɛ + Engresi Awia Berɛ Lɔndɔn @@ -2063,9 +1694,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yerusalem - - Kɔɔkata - Kyagɔs @@ -2075,9 +1703,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Rɛɛkgyavik - - Roma - Jɛɛsi @@ -2090,14 +1715,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kɔmɔrɔ - - Kemanfo - Aktau - Aktopɛ + Aatobe Kostanay @@ -2117,12 +1739,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lɛsembɛg - - Kasablanka - - - Monako - Kyisinau @@ -2136,7 +1752,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kwagyaleene - Magyuro + Madwuro Skɔpgye @@ -2183,6 +1799,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Matamɔrɔso + + Kankun + Kukyin @@ -2208,7 +1827,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Muskat - Maakesase + Maakesase Supᴐ Pɔt Morɛsbi @@ -2246,15 +1865,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yɛkatɛrinbɛg + + Yiikusk + Kyita Kamkyatka - - Guadaakanaa - Stɔkhɔm @@ -2279,9 +1898,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lowa Prinse Kɔta - - Damaskɔso - Grand Tuk @@ -2297,6 +1913,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Spain Pɔɔto + + Kiivu + + + Wake Supᴐ + Ankɔragyi @@ -2388,9 +2010,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Afrika Atɔeɛ Berɛ - Afrika Atɔeɛ Susudua Berɛ - Afrika Atɔeɛ Awia Berɛ + Afrika Atɔeɛ Berɛ @@ -2545,7 +2165,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Brunei Darusalam Berɛ + Brunei Berɛ @@ -2740,6 +2360,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gayana Berɛ + + + Hawaii-Aleutian Susudua Berɛ + + Hawaii-Aleutian Berɛ @@ -2800,9 +2425,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Irkutsk Berɛ - Irkutsk Susudua Berɛ - Irkutsk Awia Berɛ + Yiikusk Berɛ + Yiikusk Susudua Berɛ + Yiikusk Awia Berɛ @@ -3275,7 +2900,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -3309,11 +2933,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ 000M ¤000M ¤ 000M + ¤0G ¤ 0G + ¤0G ¤ 0G - ¤00B - ¤ 00B - ¤00B + ¤00G + ¤ 00G + ¤00G ¤ 00G ¤000G ¤ 000G @@ -3340,8 +2966,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Afghanfoɔ Afghani - Afghanfoɔ Afghani - Afghanfoɔ Afghani Albania Lek @@ -3350,49 +2974,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic Amɛnia dram - Amɛnia dram - Amɛnia dram Nɛdɛlande Antɛlia guuda - Nɛdɛlande Antɛlia guuda - Nɛdɛlande Antɛlia guuda Angola Kwanza Agɛntina peso - Agɛntina peso - Agɛntina peso Ɔstrelia Dɔla Aruba flɔrin - Aruba flɔrin - Aruba flɔrin Azɛbagyan manat - Azɛbagyan manat - Azɛbagyan manat Bɔsnia-Hɛzegɔvina nsesa maake - Bɔsnia-Hɛzegɔvina nsesa maake - Bɔsnia-Hɛzegɔvina nsesa maake Babadɔso dɔla - Babadɔso dɔla - Babadɔso dɔla Bangladehye taka - Bangladehye taka - Bangladehye taka Bɔɔgaria lɛv @@ -3407,46 +3015,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bɛɛmuda dɔla - Bɛɛmuda dɔla - Bɛɛmuda dɔla Brunei dɔla - Brunei dɔla - Brunei dɔla Bolivia boliviano - Bolivia boliviano - Bolivia boliviano Brazil reale - Brazil reale - Brazil reale Bahama dɔla - Bahama dɔla - Bahama dɔla Butanfoɔ ngutrum - Butanfoɔ ngutrum - Butanfoɔ ngutrum Botswana Pula Bɛlaruhyia ruble - Bɛlaruhyia ruble - Bɛlaruhyia ruble Belize Dɔla - Belize Dɔla - Belize Dɔla Kanada Dɔla @@ -3461,59 +3053,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kyili Peso - Kyili Peso - Kyili Peso kyaena yuan (offshore) - kyaena yuan (offshore) - kyaena yuan (offshore) - kyaena yuan - kyaena yuan - kyaena yuan + Kyaena yuan + Kyaena yuan + Kyaena yuan Kolombia peso - Kolombia peso - Kolombia peso Kɔsta Rika kɔlɔn - Kɔsta Rika kɔlɔn - Kɔsta Rika kɔlɔn Kuba nsesa peso - Kuba nsesa peso - Kuba nsesa peso Kuba peso - Kuba peso - Kuba peso Ɛskudo Kyɛk koruna - Kyɛk koruna - Kyɛk koruna Gyebuti Frank Danefoɔ krone - Danefoɔ krone - Danefoɔ krone Dɔmenika peso - Dɔmenika peso - Dɔmenika peso Ɔlgyeria Dina @@ -3528,25 +3102,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Itiopia Bir - Iro + yuro + yuro + yuro Figyi Dɔla - Figyi Dɔla - Figyi Dɔla Fɔkland Aelande Pɔn - Fɔkland Aelande Pɔn - Fɔkland Aelande Pɔn Breten Pɔn Gyɔɔgyia lari - Gyɔɔgyia lari - Gyɔɔgyia lari Ghana Sidi (1979–2007) @@ -3557,39 +3127,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gyebrotaa pɔn - Gyebrotaa pɔn - Gyebrotaa pɔn Gambia Dalasi Gini franke - Gini franke - Gini franke Gini Frank Guatemala kwɛtsaa - Guatemala kwɛtsaa - Guatemala kwɛtsaa Gayana dɔla - Gayana dɔla - Gayana dɔla Hɔnkɔn Dɔla - Hɔnkɔn Dɔla - Hɔnkɔn Dɔla Hɔndura lɛmpira - Hɔndura lɛmpira - Hɔndura lɛmpira Krohyia kuna @@ -3598,52 +3156,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic Haiti gɔɔde - Haiti gɔɔde - Haiti gɔɔde Hangari fɔrint - Hangari fɔrint - Hangari fɔrint Indɔnihyia rupia - Indɔnihyia rupia - Indɔnihyia rupia Israel hyekel foforɔ - Israel hyekel foforɔ - Israel hyekel foforɔ India Rupi Irak dinaa - Irak dinaa - Irak dinaa Irak dinaa Yiranfoɔ rial - Yiranfoɔ rial - Yiranfoɔ rial Icelandfoɔ Króna - Icelandfoɔ króna + Icelandfoɔ krónur Icelandfoɔ krónur Gyameka dɔla - Gyameka dɔla - Gyameka dɔla Gyɔɔdan dinaa - Gyɔɔdan dinaa - Gyɔɔdan dinaa Gyapan Yɛn @@ -3653,56 +3195,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kagyɛstan som - Kagyɛstan som - Kagyɛstan som Kambodia riel - Kambodia riel - Kambodia riel Komoro Frank Korea Atifi won - Korea Atifi won - Korea Atifi won Korea Anaafoɔ won - Korea Anaafoɔ won - Korea Anaafoɔ won Kuwait dinaa - Kuwait dinaa - Kuwait dinaa Kayemanfo Aelande dɔla - Kayemanfo Aelande dɔla - Kayemanfo Aelande dɔla Kagyastan tenge - Kagyastan tenge - Kagyastan tenge Laohyia kip - Laohyia kip - Laohyia kip Lɛbanon pɔn - Lɛbanon pɔn - Lɛbanon pɔn Sri Lankafoɔ rupee - Sri Lankafoɔ rupee - Sri Lankafoɔ rupee Laeberia Dɔla @@ -3731,18 +3253,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mayamaa kyat - Mayamaa kyat - Mayamaa kyat Mongoliafoɔ tugrike - Mongoliafoɔ tugrike - Mongoliafoɔ tugrike Makaw pataka - Makaw pataka - Makaw pataka Mɔretenia Ouguiya (1973–2017) @@ -3755,31 +3271,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Maldivefoɔ rufiyaa - Maldivefoɔ rufiyaa - Maldivefoɔ rufiyaa Malawi Kwakya - Malawi Kwakya - Malawi Kwakya Mɛksiko pɛso - Mɛksiko pɛso - Mɛksiko pɛso Malaahyia ringgit - Malaahyia ringgit - Malaahyia ringgit Mozambik Metical Mozambik mɛtikaa - Mozambik mɛtikaa - Mozambik mɛtikaa Namibia Dɔla @@ -3789,8 +3295,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nikaragua kɔɔdɔba - Nikaragua kɔɔdɔba - Nikaragua kɔɔdɔba Nɔɔwee Krone @@ -3799,58 +3303,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nepalfoɔ rupee - Nepalfoɔ rupee - Nepalfoɔ rupee New Zealand Dɔla - New Zealand Dɔla - New Zealand Dɔla Oman rial - Oman rial - Oman rial Panama baaboa - Panama baaboa - Panama baaboa Pɛruvia sol - Pɛruvia sol - Pɛruvia sol Papua New Gini kina - Papua New Gini kina - Papua New Gini kina Filipine peso - Filipine peso - Filipine peso Pakistanfoɔ rupee - Pakistanfoɔ rupee - Pakistanfoɔ rupee Pɔlihye zloty - Pɔlihye zloty - Pɔlihye zloty Paragayana guarani - Paragayana guarani - Paragayana guarani Kata riyaa - Kata riyaa - Kata riyaa Romania Leu @@ -3859,13 +3341,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sɛɛbia dinaa - Sɛɛbia dinaa - Sɛɛbia dinaa Rɔhyia rubuu - Rɔhyia rubuu - Rɔhyia rubuu Rewanda Frank @@ -3875,8 +3353,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Solomon Aeland Dɔla - Solomon Aeland Dɔla - Solomon Aeland Dɔla Seyhyɛls Rupi @@ -3894,8 +3370,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Singapɔɔ dɔla - Singapɔɔ dɔla - Singapɔɔ dɔla St Helena Pɔn @@ -3911,13 +3385,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Suriname dɔla - Suriname dɔla - Suriname dɔla Sudan Anaafoɔ Pɔn - Sudan Anaafoɔ Pɔn - Sudan Anaafoɔ Pɔn Sao Tome ne Principe Dobra (1977–2017) @@ -3927,26 +3397,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Siria pɔn - Siria pɔn - Siria pɔn - Lilangeni + Swazi lilangeni + Swazi lilangeni + Swazi lilangeni Tai bat - Tai bat - Tai bat Tagyikistan somoni - Tagyikistan somoni - Tagyikistan somoni Tɛkmɛstan manat - Tɛkmɛstan manat - Tɛkmɛstan manat Tunisia Dina @@ -3958,13 +3422,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tɛki lira - Tɛki lira - Tɛki lira Trinidad ne Tobago dɔla - Trinidad ne Tobago dɔla - Trinidad ne Tobago dɔla Taewanfoɔ dɔla foforɔ @@ -3976,8 +3436,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yukren hryvnia - Yukren hryvnia - Yukren hryvnia Uganda Hyelen @@ -3987,13 +3445,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yurugueɛ peso - Yurugueɛ peso - Yurugueɛ peso Yusbɛkistan som - Yusbɛkistan som - Yusbɛkistan som Venezuelan bolívar @@ -4002,13 +3456,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Viɛtnamfoɔ dɔn - Viɛtnamfoɔ dɔn - Viɛtnamfoɔ dɔn Vanuatu vatu - Vanuatu vatu - Vanuatu vatu Samoa Tala @@ -4017,18 +3467,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Afrika Mfinimfini Sefa - Afrika Mfinimfini Sefa - Afrika Mfinimfini Sefa Karibine Apueeɛ dɔla - Karibine Apueeɛ dɔla - Karibine Apueeɛ dɔla + + + Karibiafoᴐ giida + Karibiafoᴐ giida + Karibiafoᴐ giida ahodoᴐ Afrika Atɔeɛ Sefa - Afrika Atɔeɛ Sefa - Afrika Atɔeɛ Sefa AAS @@ -4043,8 +3492,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yɛmɛn rial - Yɛmɛn rial - Yɛmɛn rial Afrika Anaafo Rand @@ -4054,12 +3501,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Zambia Kwakya - Zambia Kwakya - Zambia Kwakya Zimbabwe Dɔla + + Zimbabwe sika kᴐkᴐᴐ + Zimbabwe sika kᴐkᴐᴐ + Zimbabwe sika kᴐkᴐᴐ + da {0} @@ -4072,9 +3522,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dɛci{0} - - sɛnti{0} - mili{0} @@ -4135,32 +3582,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic ntwaho {0} - radian {0} radian {0} radian - digrii digrii {0} digrii {0} - aakesima aakesima {0} aakesima {0} - - aakesɛkɛnse - {0} aakesɛkɛnse - {0} aakesɛkɛnse - - Eka {0} eka {0} eka - karat {0} karat {0} karat @@ -4174,18 +3611,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimole lita biara {0} milimole lita biara {0} - - adeɛ - adeɛ {0} - adeɛ {0} - - - paat ɔpepem biara + paat ɔpepem biara {0} paat ɔpepem biara {0} - ɔha nkyɛmu ɔha nkyɛmu {0} ɔha nkyɛmu {0} @@ -4195,17 +3625,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic pɛɛmile {0} - pɛɛmiride pɛɛmiride {0} pɛɛmiride {0} - mole {0} mole {0} mole - lita kilomita biara lita kilomita biara {0} lita kilomita biara {0} @@ -4215,12 +3642,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic lita kilomita 100 biara {0} - mile galɔn biara mile galɔn biara {0} - mile galɔn biara {0} + {0} mpg US - mile Imp. galɔn biara mile Imp. galɔn biara {0} mile Imp. galɔn biara {0} @@ -4280,7 +3705,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} dec - mfeɛ mfeɛ {0} mfeɛ {0} mfeɛ biara {0} @@ -4291,24 +3715,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} q - bosome Bosome {0} Bosome {0} bosome biara {0} - nnawɔtwe nnawɔtwe {0} nnawɔtwe {0} nnawɔtwe biara {0} - - nna - da {0} - nna {0} - - dɔnhwere dɔnhwere {0} dɔnhwere {0} @@ -4319,9 +3735,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic sima sini - sima sini {0} + {0} s sima sini {0} - sima sini biara {0} millisɛkɛns @@ -4329,22 +3744,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millisɛkɛns - μsecs {0} mikrosɛkɛn {0} mikrosɛkɛns - nanosɛkɛns {0} nanosɛkɛn - {0} nanosɛkɛns + {0} ns - fɔs mu pɔn fɔs mu pɔn {0} fɔs mu pɔn {0} - newton {0} newton {0} newton @@ -4357,7 +3768,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic taipografik ems - pixels {0} pixel {0} pixels @@ -4371,12 +3781,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic pixels sɛntimita biara{0} - pixels inkye biara pixels inkye biara{0} pixels inkye biara{0} - asaase radiɔs asaase radiɔs {0} asaase radiɔs{0} @@ -4406,7 +3814,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimita milimita {0} - milimita {0} + {0} mm mikromita @@ -4424,40 +3832,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic pikomita {0} - kwansini kwansini {0} kwansini {0} - yaase yaase {0} yaase {0} - ananmɔn ananmɔn {0} {0} ft ananmɔn biara {0} - inkyisi inkyisi {0} inkyisi {0} inkyisi biara {0} - paasɛk paasɛk {0} paasɛk {0} - kanea mfeɛ kanea mfeɛ {0} kanea mfeɛ {0} astrɔnɔmikaa winit - astrɔnɔmikaa winit {0} + {0} au astrɔnɔmikaa winit {0} @@ -4481,35 +3883,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic miaase-skandinavian {0} - pɔnse pɔnse {0} pɔnse {0} - sola radii sola radii {0} sola radii {0} - lux {0} lux {0} lux - kandela {0} kandela {0} kandela - - lumen - - sola luminɔsitise sola luminɔsitise {0} sola luminɔsitise {0} - mɛtreke tons mɛtreke tons {0} mɛtreke tons {0} @@ -4520,7 +3913,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic kilograme biara {0} - grame grame {0} {0} g grame biara {0} @@ -4533,14 +3925,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic mikrograme mikrograme {0} - mikrograme {0} + {0} μg {0} ton {0} tons - pɔns pɔns {0} pɔns {0} pɔns biara {0} @@ -4557,30 +3948,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic troy awnse {0} - karat - karat {0} + {0} CD karat {0} - daatin daatin {0} daatin {0} - Asaase mass Asaase mass {0} Asaase mass {0} - sola mass sola mass {0} sola mass {0} + + poma + {0}poma + {0}poma + - - Pɔ {0} + {0} kn Pɔ {0} + + hyew° + {0} hyew digrii + {0} hyew digrii + pɔn-fɔs-ananmɔn pɔn-fɔs-ananmɔn {0} @@ -4592,15 +3988,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} newton-mita - lita {0} l {0} lita - - pints - - kuruwa kuruwa {0} kuruwa {0} @@ -4615,42 +4006,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic atere fa {0} - bare bare {0} bare {0} - atere atere {0} atere {0} - koko ko {0} koko {0} - drɔm drɔm fl {0} drɔm fl {0} - - gyega - gyega {0} - gyega {0} - - - kanea - kanea {0} - kanea {0} - - - paat ɔpepepem biara + paat ɔpepepem biara {0} paat ɔpepepem biara {0} - anadwo {0} anadwo anadwo{0} anadwo biara{0} @@ -4658,7 +4033,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic kadinaa akwankyerɛ {0} apueɛ - {0} atifi {0} anaafoɔ {0} atɔeɛ @@ -4692,7 +4066,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic adeɛ {0} adeɛ {0} - + paat ɔpepem biara @@ -4760,8 +4134,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic dɔnhwere - - μsecs + + simasini nanosɛkɛns @@ -4848,10 +4222,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} gr {0} gr + + poma + {0}poma + {0}poma + {0} mph {0} mph + + hyew° + lita @@ -4875,7 +4257,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ko {0} - drɔm drɔm {0} drɔm {0} @@ -4893,7 +4274,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kanea {0} kanea {0} - + paat ɔpepepem biara @@ -4907,106 +4288,38 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - radian - - - digrii - - - aakesima - - aakesɛkɛnse - - - Eka - - - karat - - - milimol/lita - - - adeɛ - adeɛ {0} - adeɛ {0} - - - paat ɔpepem biara - - - ɔha nkyɛmu - - - pɛɛmiride - - - lita kilomita biara - - - mile galɔn biara + {0}″ + {0}″ mpg UK - - PByte + + GB B {0}B {0}B - - mfeɛ - - - bosome - - - nnawɔtwe - da - da {0} - nna {0} - - dɔnhwere + + simasini μsec - - fɔs mu pɔn - - - asaase radiɔs - - - m - - - yaase - - ananmɔn {0}′ - {0}′ + {0} ft - inkyisi {0}″ {0}″ - - paasɛk - - - kanea mfeɛ - fɛɛlɔɔne @@ -5016,47 +4329,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic pts - - sola radii - - - lux - - - sola luminɔsitise - - - grame - - - pɔns - - - oz troy - - - karat - - - daatin - - - Asaase mass - - - sola mass - gr {0}gr {0}gr - - {0} mph - {0} mph - - - lita + + poma + {0}poma + {0}poma pt @@ -5064,51 +4345,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}/gal - - kuruwa - - dsp - {0}dsp + {0} dsp {0}dsp dr - ko {0} - ko {0} fl.dr. - drɔm fl {0} + drɔm {0} drɔm fl {0} - - gyega - gyega {0} - gyega {0} - pn - {0} pn - {0} pn - - kanea - kanea {0} - kanea {0} - - - paat ɔpepepem biara - - - anadwo - anadwo{0} - anadwo{0} - {0}/anadwo - - - akwankyerɛ - @@ -5120,35 +4371,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, anaa {1} {0} anaa {1} - - {0}, anaa {1} - {0} anaa {1} - - - {0}, anaa {1} - {0} anaa {1} - - - {0}, ne {1} - - - {0}, ne {1} - {0} ne {1} - - - {0}, ne {1} - {0} ne {1} - {0} {1} {0} {1} {0} {1} {0} {1} - - {0}, ne {1} - {0} ne {1} - @@ -5160,7 +4388,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} — kɔmpatebiliti {0} — ɛnkloso {0} — ɛstɛndɛde - {0} rehwɛ bɛnkum {0} rehwɛ nifa {0} — histɔrike {0} — mɛsɛleniɔso @@ -5290,7 +4517,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic tete nɔma deɛ ɔdinaafoɔ prɔpɔɔhyen nɔma - atwerɛdeɛ akɛseɛ nkumaa pono so nɔma ziro a yɛapae mu @@ -5317,7 +4543,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ∅∅∅ Wooster ∅∅∅ - Jr + Ketewa MP diff --git a/make/data/cldr/common/main/am.xml b/make/data/cldr/common/main/am.xml index aa3e9dbded4..c3ddab8d741 100644 --- a/make/data/cldr/common/main/am.xml +++ b/make/data/cldr/common/main/am.xml @@ -215,7 +215,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ደቡባዊ ሃይዳ ዕብራይስጥ ሕንድኛ - ሕንድኛ (ላቲን) ሂሊጋይኖን ህሞንግ ክሮሽያንኛ @@ -283,6 +282,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ባፊያ ኮሎኝኛ ኩርድሽ + ኩርድሽ + ኩርድሽ ኩማይክ ኮሚ ኮርኒሽ @@ -711,6 +712,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ቻይና ኮሎምቢያ ክሊፐርቶን ደሴት + ሳርክ ኮስታሪካ ኩባ ኬፕቨርዴ @@ -952,33 +954,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ የቁጥር ድርደራ የድርደራ አቅም ምንዛሪ + ስሜት ገላጭ ምስል አቀራረብ የሰዓት ዑደት (12 ወይም 24) መስመር መስበሪያ ቅጥ + የመስመር መሰባበር በቃላት ውስጥ የመለኪያ ስርዓት ቁጥሮች + ከአህጽሮተ ቃል በኋላ የዐረፍተ ነገር መቋረጥ የሰዓት ሰቅ የአካባቢ አይነት ለግል ጥቅም የቡዲስት ቀን አቆጣጠር + ቡዲስት የቻይና የቀን አቆጣጠር + ቻይንኛ የኮፕቲክ የቀን አቆጣጠር + ኮፕቲክ የዳንጊ የቀን አቆጣጠር + ዳንጊ የኢትዮጵያ የቀን አቆጣጠር + ኢትዮፒክ የኢትዮፒክ አመተ አለም የቀን አቆጣጠር + ኢትዮፒክ ዓመተ ዓለም የግሪጎሪያን የቀን አቆጣጠር + ግሪጎሪያን የእብራዊያን የቀን አቆጣጠር + ሂብሩ የህንድ ብሔራዊ የቀን አቆጣጠር የሂጅራ የቀን አቆጣጠር + ሂጅራ የሂጅራ የቀን አቆጣጠር (ታቡላር፣ ሲቪል አፖች) + ሂጅራ (ታቡላር፣ የሲቪል ዘመን) የሂጅራ የቀን አቆጣጠር (ኡም አል-ቁራ) + ሂጅራ (ኡሙ አል-ቁራ) ISO-8601 የቀን አቆጣጠር የጃፓን የቀን አቆጣጠር + ጃፓንኛ የፐርሽያ የቀን አቆጣጠር + ፐርሽያን የሚንጉ የቀን አቆጣጠር + ሚንጉ የሂሳብ ምንዛሪ ቅርጸት + የሂሳብ አያያዝ መደበኛ የምንዛሪ ቅርጸት + መደበኛ ምልክቶችን ደርድር ችላ ባይ ምልክቶችን ደርድር የፊደል ጭረቶችን እንደመደበኛ ደርድር @@ -988,16 +1009,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ አቢይ ሆሄ መጀመሪያ ደርድር ያለመልከፊደል ትብ ደርድር በመልከፊደል ትብ ደርድር - የባህላዊ ቻይንኛ የድርድር ቅደም ተከተል - ትልቅ5 የመዝገበ ቃላት የድርድር ቅደም ተከተል የነባሪ ዩኒኮድ የድርድር ቅደም ተከተል - የቀለለ የቻይንኛ የድርደራ ቅደም ተከተል - GB2312 + ነባሪ ዩኒኮድ የስልክ ደብተር ድርድር ቅደም ተከተል የፎነቲክ ድርደራ ቅደም ተከተል ፒንይን የድርድር ቅደም ተከተል ለጠቅላላ ጉዳይ ፍለጋ + ፍለጋ በሃንጉል የመጀመሪያ ተነባቢ ፈልግ መደበኛ የድርድር ቅደም ተከተል + መደበኛ የበትር ድርድር ቅደም ተከተል ባህላዊ የድርድር ቅደም ተከተል የመሰረታዊ በትር ድርድር ቅደም ተከተል @@ -1013,18 +1035,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ሙሉ ወርድ ግማሽ ወርድ አሃዛዊ + ነባሪ + ስሜት ገላጭ ምስል + ጽሑፍ የ12 ሰዓት ስርዓት (0–11) + 12 (0–11) የ12 ሰዓት ስርዓት (1–12) + 12 (1–12) የ24 ሰዓት ስርዓት (0–23) + 24 (0–23) የ24 ሰዓት ስርዓት (1–24) + 24 (1–24) ላላ ያለ መስመር መስበሪያ ቅጥ + ልቅ መደበኛ መስመር መስበሪያ ቅጥ + መደበኛ ጠበቅ ያለ መስመር መስበሪያ ቅጥ + ጥብቅ + ሁሉንም ሰብረው + ሁሉንም አቆይ + መደበኛ + በዓረፍተ ነገሮች ውስጥ ያስቀምጡ ዩኤስ ቢጂኤን ትራንስሊትሬሽን ዩኤን ጂኢጂኤን ትራንስሊትሬሽን ሜትሪክ ስርዓት + መለኪያ ኢምፔሪያል የመለኪያ ስርዓት + ዩኬ የአሜሪካ መለኪያ ስርዓት + ዩኤስ የአረቢክ-ኢንዲክ አሃዞች የተራዘሙ የአረቢክ-ኢንዲክ አሃዞች የአርመንኛ ቁጥሮች @@ -1069,6 +1108,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ የቲቤት አሃዞች ተለምዷዊ ቁጥሮች የቫይ አሃዞች + ጠፍቷል + በርቷል ሜትሪክ @@ -1098,13 +1139,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM፣ y G + GGGGG y-MM + GGGGG y-MM-dd + GGGGG y-MM-dd, E + + + HH–HH + + + HH–HH v + + - ዓ/ዓ ዓ/ም @@ -1133,7 +1184,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM፣ y G E, MMMM d + GGGGG y-MM + GGGGG y-MM-dd + GGGGG y-MM-dd, E + + + HH–HH + + + HH–HH v + + @@ -1164,21 +1226,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1} በ {0} + {1} {0} + + {1} በ {0} + {1} {0} + + {1} በ {0} + {1} {0} + + {1} በ {0} + E d @@ -1415,10 +1489,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ጥዋት - ከሰዓት - ማታ - ሌሊት @@ -1426,7 +1496,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ዓመተ ዓለም ዓመተ ምሕረት - ዓ/ም ዓ/ዓ @@ -1506,13 +1575,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss E d + E a h E a h:mm E a h:mm:ss y G + M/y G d/M/y GGGGG + E d/M/y G MMM y G MMM d y G E MMM d y G @@ -1520,6 +1593,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H a h:mm a h:mm:ss + a h v d/M E፣ d/M E፣ MMM d @@ -1538,6 +1612,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} – {1} + + B h – B h + GGGGG M/y – GGGGG M/y GGGGG M/y – M/y @@ -1681,14 +1758,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ይህ ሩብ የሚቀጥለው ሩብ - +{0} ሩብ - +{0} ሩብ + በ{0} ሩብ + በ{0} ሩብ {0} ሩብ በፊት {0} ሩብ በፊት + + + በ{0} ሩብ + በ{0} ሩብ + + + + + በ{0} ሩብ + በ{0} ሩብ + + ወር ያለፈው ወር @@ -1990,6 +2079,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ +HHmm;-HHmm ጂ ኤም ቲ{0} ጂ ኤም ቲ + ጂ ኤም ቲ+ {0} ሰዓት {0} የቀን ብርሃን ሰዓት {0} መደበኛ ሰዓት @@ -2611,9 +2701,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ፍኖም ፔንህ - ኢንደርበሪ - - ካንቶን @@ -3283,9 +3370,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - የምዕራብ አፍሪካ ሰዓት - የምዕራብ አፍሪካ መደበኛ ሰዓት - የምዕራብ አፍሪካ ክረምት ሰዓት + የምዕራብ አፍሪካ ሰዓት @@ -3642,6 +3727,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ የጉያና ሰዓት + + + የሃዋይ አሌኡት መደበኛ ሰዓት አቆጣጠር + + የሃዋይ አሌኡት ሰዓት አቆጣጠር @@ -4225,7 +4315,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4775,6 +4864,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ የምዕራብ ካሪብያን ዶላር + + የካሪቢያን ጊልደር + የካሪቢያን ጊልደር + የካሪቢያን ጊልደር + የምዕራብ አፍሪካ ሴፋ ፍራንክ @@ -4799,6 +4893,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ የዚምቧቡዌ ዶላር + + የዚምባብዌ ወርቅ + የዚምባብዌ ወርቅ + የዚምባብዌ ወርቅ + {0}+ @@ -4822,9 +4921,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ሚሊ{0} - - ማይክሮ{0} - ናኖ{0} @@ -4861,18 +4957,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ኤክሳ {0} - - ዜታ {0} - - - ዮታ {0} - - - ሮና {0} - - - ዮቢ {0} - {0} በ{1} @@ -4891,14 +4975,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ጂ-ኃይል - ኡደት {0} ኡደት {0} ኡደት {0} ኡደት {0} ኡደቶች - ራዲ {0} ራዲ {0} ራዲያን {0} ራዲ @@ -4922,11 +5004,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ካሬ ሜትር {0} ካሬ ሜትር - - ስኴር ያርድ - {0} ስኴር ያርድ - {0} ስኴር ያርድ - ጋሻ @@ -4940,7 +5017,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ንጥሎች {0} ንጥሎች - + + ክፍል + {0} ክፍል + {0} ክፍል + + {0} ppm {0} ክፍል በየሚሊዮን {0} ppm @@ -4964,6 +5046,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} moles + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + ሊትሮች በ100 ኪሎሜትሮች {0} ሊትር በ100 ኪሎሜትሮች @@ -5031,7 +5118,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ማይክሮሰከንድ - አምፒር {0} አምፒር {0} አምፒር {0} አምፒር @@ -5044,33 +5130,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ohms - ቮልት {0} ቮልት {0} ቮልት {0} ቮልት {0} ቮልቶች - - ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - - - ኪጁ - {0} ኪጁ - {0} ኪጁ - {0} ኪጁ - {0} ኪጁ - - - ጁልስ - {0} ጁልስ - {0} ጁልስ - {0} ጁልስ - {0} ጁልስ - {0} ኒ {0} ኒውተን @@ -5084,34 +5148,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ኪሎዋት-ሰዓታት በየ 100 ኪሎሜትሮች {0} ኪሎዋት-ሰዓታት በየ 100 ኪሎሜትሮች - - ጊጋኸርዝ - {0} ጊጋኸርዝ - {0} ጊጋኸርዝ - {0} ጊጋኸርዝ - {0} ጊጋኸርዝ - - - ሜጋኸርዝ - {0} ሜጋኸርዝ - {0} ሜጋኸርዝ - {0} ሜጋኸርዝ - {0} ሜጋኸርዝ - - - ኪሎኸርዝ - {0} ኪሎኸርዝ - {0} ኪሎኸርዝ - {0} ኪሎኸርዝ - {0} ኪሎኸርዝ - - - ኸርዝ - {0} ኸርዝ - {0} ኸርዝ - {0} ኸርዝ - {0} ኸርዝ - ታይፖግራፊክ em @@ -5202,15 +5238,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ግራም {0} ግራም - - ሚግ - {0} ሚግ - {0} ሚግ - {0} ሚግ - {0} ሚግ - - ማግ {0} ማግ {0} ማይክሮ ግራም {0} ማግ @@ -5223,11 +5251,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} CD {0} ካራቶች - - ዳልተንስ - {0} ዳልተንስ - {0} ዳልተንስ - {0} ኤርዝማስስ {0} ኤርዝማስስ @@ -5236,19 +5259,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ሶላር ማስስ {0} ሶላር ማስስ - - ጊጋ ዋት - {0} ጊዋ - {0} ጊዋ - {0} ጊዋ - {0} ጊዋ - ሜጋ ዋት - {0} ሜዋ - {0} ሜዋ - {0} ሜዋ - {0} ሜዋ {0} ኪሎዋት @@ -5264,10 +5276,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ሚሊ ዋት - {0} ሚዋ - {0} ሚዋ - {0} ሚዋ - {0} ሚዋ {0} የፈረስ ጉልበት @@ -5316,7 +5324,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ዲግሪ ፋራንሃይት - {0} ኬ {0} ኬልቪን {0} ኬ @@ -5332,24 +5339,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ኩቢክ ማይል {0} ኩቢክ ማይል - - ኪዩቢክ ያርድ - {0} ኪዩቢክ ያርድ - {0} ኪዩቢክ ያርድ - - - ሜጋሊትር - {0} ሜሊ - {0} ሜሊ - {0} ሜሊ - {0} ሜሊ - ሄክቶሊትር - {0} ሄሊ - {0} ሄሊ - {0} ሄሊ - {0} ሄሊ {0} ሊትር @@ -5378,46 +5369,47 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ሜትሪክ ፒንቶች - ጋሎን {0}/ጋሎን {0}/ጋሎን - {0}/ጋሎን - - - ኳርትስ - {0} ኳርትስ - {0} ኳርትስ - - - ኩባያ - {0} ኩባያ - {0} ኩባያ Imp. fluid ኦንስስ {0} Imp. fluid ኦንስስ {0} Imp. fluid ኦንስስ - - የሻይ ማንኪያ - {0} የሻይ ማንኪያ - {0} የሻይ ማንኪያ - - - የሻይ ማንኪያዎች - {0} የሻይ ማንኪያዎች - {0} የሻይ ማንኪያዎች - {0} በርሜል {0} በርሜሎች - - ብርሃን - {0} ብርሃን - {0} ብርሃን - {0} ብርሃን - {0} ብርሃን + + ካታልስ + {0} ካት + {0} ካት + + + ሄነሪስ + {0} ሄ + {0} ሄ + + + ካሎሪ [IT] + {0} ካሎሪ [IT] + {0} ካሎሪ [IT] + + + ኪሎግራም - ኃይል + {0} ኪግ-ኃይል + {0} ኪግ-ኃይል + + + ቴስላስ + {0} ቴ + {0} ቴ + + + ዌበርስ + {0} ዌበ + {0} ዌበ ለሊት @@ -5425,7 +5417,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/ለሊት {0}/ለሊት {0}/ለሊት - {0}/ለሊት ዓቢይ አቅጣጫ @@ -5613,12 +5604,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ንጥል {0} ንጥል + + ክፍል + {0} ክፍል + {0} ክፍል + ፐርሰንት በማይል + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + ሊ/ኪሜ {0} ሊ/ኪሜ @@ -6284,6 +6285,36 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} የፈሳሽ መለኪያ {0} የፈሳሽ መለኪያ + + ካት + {0} ካት + {0} ካት + + + + {0} ሄ + {0} ሄ + + + ካሎሪ-IT + {0} ካሎሪ-IT + {0} ካሎሪ-IT + + + ኪግ-ኃይል + {0} ኪግ-ኃይል + {0} ኪግ-ኃይል + + + + {0} ቴ + {0} ቴ + + + ዌበ + {0} ዌበ + {0} ዌበ + ብርሃን {0} ብርሃን @@ -6304,28 +6335,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - ማይክሮ{0} - - - ዜታ {0} - - - ዮታ {0} - - - ሮና {0} - - - ዮቢ {0} - ኡደ {0} ኡደ {0}ኡደ - ራዲ {0}ራዲ {0}ራዲ @@ -6345,17 +6360,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ማይል² {0} ማይል² - - {0} ስኴር ያርድ - {0} ስኴር ያርድ - {0} ጫማ² {0} ጫማ² + + ክፍል + {0} ክፍል + {0} ክፍል + % + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + {0}ሊበ100ኪሜ {0}ሊበ100ኪሜ @@ -6403,51 +6424,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ሰ {0} ሰ - - አምፒር - {0} አምፒር - {0} አምፒር - - - ቮልት - {0} ቮልት - {0} ቮልት - - - ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - {0} ኪሎ ካሎሪ - - - ኪጁ - {0} ኪጁ - {0} ኪጁ - - - ጁልስ - {0} ጁልስ - {0} ጁልስ - - - ጊጋኸርዝ - {0} ጊጋኸርዝ - {0} ጊጋኸርዝ - - - ሜጋኸርዝ - {0} ሜጋኸርዝ - {0} ሜጋኸርዝ - - - ኪሎኸርዝ - {0} ኪሎኸርዝ - {0} ኪሎኸርዝ - - - ኸርዝ - {0} ኸርዝ - {0} ኸርዝ - {0} ሜፒ {0} ሜፒ @@ -6465,33 +6441,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ሚሊግራም {0} ሚሊግራም - - ማግ - {0} ማግ - {0} ማግ - ካራት - - ዳልተንስ - {0} ዳልተንስ - {0} ዳልተንስ - ጊዋ - {0} ጊዋ - {0} ጊዋ - - - ሜዋ - {0} ሜዋ - {0} ሜዋ - - - ሚዋ - {0} ሚዋ - {0} ሚዋ {0} የፈረስ ኃይል @@ -6521,26 +6475,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}° {0}° - - - {0} ኬ - {0} ኬ - - - ኪዩቢክ ያርድ - {0} ኪዩቢክ ያርድ - {0} ኪዩቢክ ያርድ - - ሜጋሊትር {0} ሜጋሊትር {0} ሜጋሊትር - - ሄሊ - {0} ሄሊ - {0} ሄሊ - {0} ሚሊ {0} ሚሊ @@ -6550,30 +6488,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ኤጫ - ጋሎን {0} ጋሎን {0} ጋሎን - {0}/ጋሎን - - - ኳርትስ - {0} ኳርትስ - {0} ኳርትስ - - - ኩባያ - {0} ኩባያ - {0} ኩባያ - - - የሻይ ማንኪያ - {0} የሻይ ማንኪያ - {0} የሻይ ማንኪያ - - - የሻይ ማንኪያዎች - {0} የሻይ ማንኪያዎች - {0} የሻይ ማንኪያዎች {0} ክመ @@ -6583,16 +6499,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ፈመ {0} ፈመ - - ብርሃን - {0} ብርሃን - {0} ብርሃን + + ካት + {0} ካት + {0} ካት - - ለሊቶች - {0} ለሊት - {0} ለሊት - {0}/ለሊት + + + {0} ሄ + {0} ሄ + + + ካሎሪ-IT + {0} ካሎሪ-IT + {0} ካሎሪ-IT + + + ኪግ-ኃይል + {0} ኪግ-ኃይል + {0} ኪግ-ኃይል + + + + {0} ቴ + {0} ቴ + + + ዌበ + {0} ዌበ + {0} ዌበ @@ -6609,22 +6544,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ወይም {1} {0} ወይም {1} - - {0} ወይም {1} - - - {0} ወይም {1} - - - {0} እና {1} - - - {0} እና {1} - - - {0} እና {1} - {0} እና {1} - diff --git a/make/data/cldr/common/main/an.xml b/make/data/cldr/common/main/an.xml index 6349366dec4..cd6d6405d07 100644 --- a/make/data/cldr/common/main/an.xml +++ b/make/data/cldr/common/main/an.xml @@ -1066,9 +1066,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) {0} {1} diff --git a/make/data/cldr/common/main/ar.xml b/make/data/cldr/common/main/ar.xml index a17155fcd2e..63ae709d94b 100644 --- a/make/data/cldr/common/main/ar.xml +++ b/make/data/cldr/common/main/ar.xml @@ -291,6 +291,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ لغة البافيا لغة الكولونيان الكردية + الكردية + الكرمانجية القموقية الكتيناي الكومي @@ -478,7 +480,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ لوشوتسيد الجنوبية الساموائية السامي الجنوبي - اللول سامي + السامي لولي الإيناري سامي السكولت سامي الشونا @@ -555,7 +557,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ الفيندا البندقية الفيتنامية - الماكوا + الماكوا لغة الفولابوك الفوتيك الفونجو @@ -809,6 +811,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ الصين كولومبيا جزيرة كليبيرتون + سارك كوستاريكا كوبا الرأس الأخضر @@ -1067,35 +1070,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ الفرز الرقمي قوة الفرز العملة + عرض الرموز التعبيرية نظام التوقيت (12 مقابل 24) نمط فصل السطور + فصل السطور وسط الكلمات نظام القياس الأرقام + فاصل الجملة بعد الاختصار المنطقة الزمنية متغيرات اللغة استخدام خاص التقويم البوذي + البوذي التقويم الصيني + الصيني التقويم القبطي + القبطي تقويم دانجي + دانجي التقويم الإثيوبي + الإثيوبي تقويم أميتي أليم الإثيوبي + أميتي أليم الإثيوبي التقويم الميلادي + الميلادي التقويم العبري + العبري التقويم القومي الهندي التقويم الهجري + الهجري التقويم الهجري المدني + الهجري المدني التقويم الهجري (السعودية - الرؤية) التقويم الهجري (الحسابات الفلكية) + الهجري (الحسابات الفلكية) التقويم الهجري (أم القرى) + الهجري (أم القرى) تقويم ISO-8601 التقويم الياباني + الياباني التقويم الفارسي + الفارسي تقويم مينجو + مينجو تنسيق العملة للحسابات + حسابات تنسيق العملة القياسي + قياسي تصنيف الرموز تصنيف تجاهل الرموز تصنيف اللكنات بشكل عادي @@ -1105,21 +1128,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ تصنيف الأحرف الكبيرة أولاً تصنيف بحسب الأحرف غير الحساسة لحالة الأحرف تصنيف بحسب حساسية الأحرف - الترتيب حسب اللغة الصينية التقليدية (Big5) ترتيب الفرز السابق: للتوافق + التوافق الترتيب حسب القاموس + القاموس ترتيب فرز Unicode الافتراضي - الترتيب حسب اللغة الصينية المبسّطة (GB2312) + Unicode افتراضي الترتيب حسب دليل الهاتف + دليل الهاتف الترتيب حسب اللفظ + حسب اللفظ الترتيب حسب نظام بنيين الصيني + بنيين الصيني بحث لأغراض عامة + بحث بحث باستخدام حرف الهانغول الساكن الأول ترتيب الفرز القياسي + قياسي الترتيب حسب نظام كتابة المجموع الصيني + نظام كتابة المجموع الصيني ترتيب تقليدي + تقليدي الترتيب حسب نظام الكتابة بالجذر والمجموع + نظام الكتابة بالجذر والمجموع الترتيب حسب نظام بوبوموفو + نظام بوبوموفو التصفية بدون تسوية تصنيف Unicode طبيعي تصنيف الأرقام على حدة @@ -1132,18 +1165,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ عرض كامل نصف العرض رقمي + افتراضي + رمز تعبيري + نص نظام 12 ساعة (0–11) + 12 (0–11) نظام 12 ساعة (1–12) + 12 (1–12) نظام 24 ساعة (0–23) + 24 (0–23) نظام 24 ساعة (1–24) + 24 (1–24) نمط فصل السطور: متباعد + متباعد نمط فصل السطور: عادي + عادي نمط فصل السطور: متقارب + متقارب + فصل الكل + الاحتفاظ بالكل + عادي + عدم فصل العبارات بي جي إن يو إن جي إي جي إن النظام المتري + متري نظام القياس البريطاني + بريطاني نظام القياس الأمريكي + أمريكي الأرقام العربية الهندية الأرقام العربية الهندية الممتدة الأرقام الأرمينية @@ -1188,6 +1238,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ الأرقام التبتية أرقام تقليدية أرقام فاي + غير مفعّل + مفعّل النظام المتري @@ -1211,6 +1263,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [ا ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي] [\u061C\u200E \- ‑ , ٫ ٬ . % ٪ ‰ ؉ + 0٠ 1١ 2٢ 3٣ 4٤ 5٥ 6٦ 7٧ 8٨ 9٩] [\- ‐‑ – — ، ؛ \: ! ؟ . … ' " « » ( ) \[ \]] + [\- ‐‑ ، . /] ؟ [\: ∶] @@ -1344,11 +1397,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}، {0} + E، d y G d‏/M‏/y G + E، M/d/y G MMM y G d MMM y G E، d MMM y G @@ -1694,6 +1751,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} في {0} + + {1} في {0} + @@ -1702,6 +1762,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} في {0} + + {1} في {0} + @@ -1716,7 +1779,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E، d y G + MM، y G dd-MM-y GGGGG + E d/M/y G MMM y G d MMM y G E، d MMM y G @@ -1954,6 +2019,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + y-MM G + E، y/M/d G + + @@ -2812,6 +2883,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ غرينتش{0} غرينتش + غرينتش+? توقيت {0} توقيت {0} الصيفي توقيت {0} الرسمي @@ -3168,6 +3240,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ استر + + كويهايكيو + بونتا أريناز @@ -3433,9 +3508,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ بنوم بنه - اندربيرج - - كانتون @@ -4105,9 +4177,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - توقيت غرب أفريقيا - توقيت غرب أفريقيا الرسمي - توقيت غرب أفريقيا الصيفي + توقيت غرب أفريقيا @@ -4463,15 +4533,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ توقيت الخليج - - GST - توقيت غيانا + + + توقيت هاواي ألوتيان الرسمي + + توقيت هاواي ألوتيان @@ -5128,6 +5200,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + {1}⁄{0} + {1} {0} + {1} {0}⁠ + + + {1}⁄{0} + {1} {0} + {1} {0}⁠ + + + {1} {0}⁠ + @@ -5142,92 +5227,103 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} {1} {0} {1} + + + + ‏#,##0.00 ¤;‏-#,##0.00 ¤ + + + ؜#,##0.00;(؜#,##0.00) + + + ‏#,##0.00 ¤;‏-#,##0.00 ¤ - ‏#,##0.00;‏-#,##0.00 + ‏#,##0.00 ¤;‏-#,##0.00 ¤ + ‏#,##0.00;‏-#,##0.00 ؜#,##0.00¤;(؜#,##0.00¤) ؜#,##0.00 ¤;(؜#,##0.00 ¤) - #,##0.00;(#,##0.00) + ؜#,##0.00;(؜#,##0.00) - 0 ألف ¤ - 0 ألف ¤ - 0 ألف ¤ - 0 ألف ¤ - 0 ألف ¤ - 0 ألف ¤ - 00 ألف ¤ - 00 ألف ¤ - 00 ألف ¤ - 00 ألف ¤ - 00 ألف ¤ - 00 ألف ¤ - 000 ألف ¤ - 000 ألف ¤ - 000 ألف ¤ - 000 ألف ¤ - 000 ألف ¤ - 000 ألف ¤ - 0 مليون ¤ - 0 مليون ¤ - 0 مليون ¤ - 0 مليون ¤ - 0 مليون ¤ - 0 مليون ¤ - 00 مليون ¤ - 00 مليون ¤ - 00 مليون ¤ - 00 مليون ¤ - 00 مليون ¤ - 00 مليون ¤ - 000 مليون ¤ - 000 مليون ¤ - 000 مليون ¤ - 000 مليون ¤ - 000 مليون ¤ - 000 مليون ¤ - 0 مليار ¤ - 0 مليار ¤ - 0 مليار ¤ - 0 مليار ¤ - 0 مليار ¤ - 0 مليار ¤ - 00 مليار ¤ - 00 مليار ¤ - 00 مليار ¤ - 00 مليار ¤ - 00 مليار ¤ - 00 مليار ¤ - 000 مليار ¤ - 000 مليار ¤ - 000 مليار ¤ - 000 مليار ¤ - 000 مليار ¤ - 000 مليار ¤ - 0 ترليون ¤ - 0 ترليون ¤ - 0 ترليون ¤ - 0 ترليون ¤ - 0 ترليون ¤ - 0 ترليون ¤ - 00 ترليون ¤ - 00 ترليون ¤ - 00 ترليون ¤ - 00 ترليون ¤ - 00 ترليون ¤ - 00 ترليون ¤ - 000 ترليون ¤ - 000 ترليون ¤ - 000 ترليون ¤ - 000 ترليون ¤ - 000 ترليون ¤ - 000 ترليون ¤ + ‏0 ألف ¤ + ‏0 ألف ¤ + ‏0 ألف ¤ + ‏0 آلاف ¤ + ‏0 ألف ¤ + ‏0 ألف ¤ + ‏00 ألف ¤ + ‏00 ألف ¤ + ‏00 ألف ¤ + ‏00 ألف ¤ + ‏00 ألف ¤ + ‏00 ألف ¤ + ‏000 ألف ¤ + ‏000 ألف ¤ + ‏000 ألف ¤ + ‏000 ألف ¤ + ‏000 ألف ¤ + ‏000 ألف ¤ + ‏0 مليون ¤ + ‏0 مليون ¤ + ‏0 مليون ¤ + ‏0 مليون ¤ + ‏0 مليون ¤ + ‏0 مليون ¤ + ‏00 مليون ¤ + ‏00 مليون ¤ + ‏00 مليون ¤ + ‏00 مليون ¤ + ‏00 مليون ¤ + ‏00 مليون ¤ + ‏000 مليون ¤ + ‏000 مليون ¤ + ‏000 مليون ¤ + ‏000 مليون ¤ + ‏000 مليون ¤ + ‏000 مليون ¤ + ‏0 مليار ¤ + ‏0 مليار ¤ + ‏0 مليار ¤ + ‏0 مليار ¤ + ‏0 مليار ¤ + ‏0 مليار ¤ + ‏00 مليار ¤ + ‏00 مليار ¤ + ‏00 مليار ¤ + ‏00 مليار ¤ + ‏00 مليار ¤ + ‏00 مليار ¤ + ‏000 مليار ¤ + ‏000 مليار ¤ + ‏000 مليار ¤ + ‏000 مليار ¤ + ‏000 مليار ¤ + ‏000 مليار ¤ + ‏0 ترليون ¤ + ‏0 ترليون ¤ + ‏0 ترليون ¤ + ‏0 ترليون ¤ + ‏0 ترليون ¤ + ‏0 ترليون ¤ + ‏00 ترليون ¤ + ‏00 ترليون ¤ + ‏00 ترليون ¤ + ‏00 ترليون ¤ + ‏00 ترليون ¤ + ‏00 ترليون ¤ + ‏000 ترليون ¤ + ‏000 ترليون ¤ + ‏000 ترليون ¤ + ‏000 ترليون ¤ + ‏000 ترليون ¤ + ‏000 ترليون ¤ {0} ¤¤ @@ -6132,6 +6228,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ دولار شرق الكاريبي + + غيلدر كاريبي + غيلدر كاريبي + غيلدر كاريبي + غيلدر كاريبي + غيلدر كاريبي + غيلدر كاريبي + غيلدر كاريبي + حقوق السحب الخاصة @@ -6202,6 +6307,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ دولار زمبابوي + + ذهب زيمبابوي + ذهب زيمبابوي + ذهب زيمبابوي + ذهب زيمبابوي + ذهب زيمبابوي + ذهب زيمبابوي + ذهب زيمبابوي + دولار زمبابوي 2009 @@ -6492,7 +6606,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} عنصرًا {0} عنصر - + + جزء + {0} جزء + {0} جزء + جزآن + {0} أجزاء + {0} جزءًا + {0} جزء + + masculine جزء في المليون {0} جزء في المليون @@ -6526,6 +6649,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + + سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + masculine لتر لكل كيلومتر @@ -7147,6 +7279,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مليمتر زئبقي {0} مليمتر زئبقي + + زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + رطل لكل بوصة مربعة {0} رطل لكل بوصة مربعة @@ -7367,6 +7508,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + + أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} أونصة سائلة مترية + {0} لكل غالون @@ -7461,7 +7611,133 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} رشّة {0} رشّة - + + ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + + + كاتال + {0} كاتال + {0} كاتال + {0} كاتال + {0} كاتال + {0} كاتال + {0} كاتال + + + كولوم + {0} كولوم + {0} كولوم + {0} كولوم + {0} كولوم + {0} كولوم + {0} كولوم + + + فاراد + {0} فاراد + {0} فاراد + {0} فاراد + {0} فاراد + {0} فاراد + {0} فاراد + + + هنري + {0} هنري + {0} هنري + {0} هنري + {0} هنري + {0} هنري + {0} هنري + + + سيمنز + {0} سيمنز + {0} سيمنز + {0} سيمنز + {0} سيمنز + {0} سيمنز + {0} سيمنز + + + سعرة-it + {0} سعرة-it + {0} سعرة-it + {0} سعرة-it + {0} سعرة-it + {0} سعرة-it + {0} سعرة-it + + + بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + + + زيفرت + {0} زيفرت + {0} زيفرت + {0} زيفرت + {0} زيفرت + {0} زيفرت + {0} زيفرت + + + جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + + + كيلوغرام ثقلي + {0} كيلوغرام ثقلي + {0} كيلوغرام ثقلي + {0} كيلوغرام ثقلي + {0} كيلوغرام ثقلي + {0} كيلوغرام ثقلي + {0} كيلوغرام ثقلي + + + تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + + + ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + + + ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئية + {0} ضوئي + {0} ضوئي + + masculine جزء بالمليار {0} جزء بالمليار @@ -7474,12 +7750,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine ليالي - {0} ليلة - ليلة - ليلتان - {0} ليالٍ - {0} ليلةً - {0} ليلة {0} في الليلة @@ -7781,7 +8051,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} عنصرًا {0} عنصر - + + جزء + {0} جزء + {0} جزء + جزآن + {0} أجزاء + {0} جزءًا + {0} جزء + + جزء/مليون {0} جزء/مليون {0} جزء/مليون @@ -7817,6 +8096,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مول {0} مول + + سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + لتر/كم {0} لتر/كم @@ -8761,6 +9049,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ملم زئبقي {0} ملم زئبقي + + زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + رطل/بوصة مربعة {0} رطل/بوصة² @@ -9070,6 +9367,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} كوب متري {0} كوب متري + + أونصة س مترية + {0} أونصة س مترية + {0} أونصة س مترية + {0} أونصة س مترية + {0} أونصة س مترية + {0} أونصة س مترية + {0} أونصة س مترية + فدان قدم {0} فدان قدم @@ -9243,7 +9549,133 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ربع غالون إمبراطوري {0} ربع غالون إمبراطوري - + + ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + + + كات + {0} كات + {0} كات + {0} كات + {0} كات + {0} كات + {0} كات + + + كول + {0} كول + {0} كول + {0} كول + {0} كول + {0} كول + {0} كول + + + ف + {0} ف + {0} ف + {0} ف + {0} ف + {0} ف + {0} ف + + + ه + {0} ه + {0} ه + {0} ه + {0} ه + {0} ه + {0} ه + + + س + {0} س + {0} س + {0} س + {0} س + {0} س + {0} س + + + سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + + + بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + + + زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + + + جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + + + كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + + + تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + + + ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + + + ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئية + {0} ضوئي + {0} ضوئي + + جزء/مليار {0} جزء/مليار {0} جزء/مليار @@ -9326,6 +9758,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} عنصر {0} عنصر + + جزء + {0} جزء + {0} جزء + جزآن + {0} أجزاء + {0} جزءًا + {0} جزء + ٪ @@ -9341,6 +9782,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ؊ {0} ؊ + + سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + {0} سكّري + ل/كم {0} ل/كم @@ -9596,6 +10046,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ك واط {0} ك واط + + زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + {0} زئبقي + رطل/بوصة² @@ -9640,6 +10099,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ل {0} ل + + أونصة س م + {0} أونصة س م + {0} أونصة س م + {0} أونصة س م + {0} أونصة س م + {0} أونصة س م + {0} أونصة س م + أونصة س {0} أونصة س @@ -9683,24 +10151,139 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} قدح {0} قدح - - جزء/مليار - {0} جزء/مليار - {0} جزء/مليار - جزآن/مليار - {0} أجزاء/مليار - {0} جزءًا/مليار - {0} جزء/مليار + + ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + {0} ستراديان + + + كات + {0} كات + {0} كات + {0} كات + {0} كات + {0} كات + {0} كات + + + كول + {0} كول + {0} كول + {0} كول + {0} كول + {0} كول + {0} كول + + + ف + {0} ف + {0} ف + {0} ف + {0} ف + {0} ف + {0} ف + + + ه + {0} ه + {0} ه + {0} ه + {0} ه + {0} ه + {0} ه + + + س + {0} س + {0} س + {0} س + {0} س + {0} س + {0} س + + + سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + {0} سع-it + + + بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + {0} بيكريل + + + زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + {0} زيف + + + جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + {0} جراي + + + كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + {0} كغ ث + + + تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + {0} تسلا + + + ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + {0} ويبر + + + ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئي + {0} ضوئية + {0} ضوئي + {0} ضوئي - ليلة {0} ل {0} ل {0} ل {0} ل {0} ل {0} ل - {0}/ل diff --git a/make/data/cldr/common/main/ar_SA.xml b/make/data/cldr/common/main/ar_SA.xml index aafe7e5e7c7..db79c9ea1c8 100644 --- a/make/data/cldr/common/main/ar_SA.xml +++ b/make/data/cldr/common/main/ar_SA.xml @@ -133,7 +133,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} بوصة مربعة {0} بوصة مربعة - + {0} جزء في المليون {0} جزء في المليون جزءان في المليون @@ -367,7 +367,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} قيراطًا {0} قيراط - + {0} جزء/مليون {0} جزء/مليون جزءان/مليون diff --git a/make/data/cldr/common/main/as.xml b/make/data/cldr/common/main/as.xml index 1eeb5591b56..b02fb84beea 100644 --- a/make/data/cldr/common/main/as.xml +++ b/make/data/cldr/common/main/as.xml @@ -42,8 +42,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ অৱধী আয়মাৰা আজেৰবাইজানী - আজেৰি বাছখিৰ + বালুচী বালিনীজ বাছা বেলাৰুছীয় @@ -226,6 +226,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ বাফিয়া কোলোগনিয়ান কুৰ্ডিচ + কুৰ্ডিশ্ব + কুৰ্ডিশ্ব কুমিক কোমি কোৰ্নিচ @@ -619,6 +621,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ চীন কলম্বিয়া ক্লিপাৰটোন দ্বীপ + চাৰ্ক কোষ্টা ৰিকা কিউবা কেপ ভার্দে @@ -852,49 +855,87 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ মুদ্ৰা সজ্জা সজোৱা ক্ৰম মুদ্ৰা + ইম’জীৰ উপস্থাপনা ঘণ্টীয়া চক্ৰ (১২ বনাম ২৪) পংক্তি বিচ্ছেদ শৈলী + শব্দৰ মাজত শাৰীৰ বিভাজন জোখ-মাখৰ প্ৰণালী সংখ্যা + বৌদ্ধ কেলেণ্ডাৰ + বৌদ্ধ চীনা কেলেণ্ডাৰ + চীনা ক’প্টিক কেলেণ্ডাৰ + ক’প্টিক দাংগি কেলেণ্ডাৰ + দাংগি ইথিঅ’পিক কেলেণ্ডাৰ + ইথিঅ’পিক ইথিঅ’পিক এমিটি এলেম কেলেণ্ডাৰ + ইথিঅ’পিক এমিটি এলেম গ্ৰেগোৰিয়ান কেলেণ্ডাৰ + গ্ৰেগোৰিয়ান হিব্ৰু কেলেণ্ডাৰ + হিব্ৰু ভাৰতীয় ৰাষ্ট্ৰীয় পঞ্জিকা + ভাৰতীয় ৰাষ্ট্ৰীয় হিজৰি কেলেণ্ডাৰ + হিজৰি হিজৰি কেলেণ্ডাৰ (টেবুলাৰ, নাগৰিক যুগ) + হিজৰি (টেবুলাৰ, নাগৰিক যুগ) হিজৰি কেলেণ্ডাৰ (উম অল-কুৰা) + হিজৰি (উম অল-কুৰা) আই. এছ. অ’.-৮৬০১ কেলেণ্ডাৰ জাপানী কেলেণ্ডাৰ + জাপানী ফাৰ্চী কেলেণ্ডাৰ + ফাৰ্চী চীনা প্ৰজাতন্ত্ৰৰ কেলেণ্ডাৰ + চীনা প্ৰজাতন্ত্ৰ গাণনিক মুদ্ৰা সজ্জা + গাণনিক মান্য মুদ্ৰা সজ্জা - পৰম্পৰাগত চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - Big5 + মান্য ডিফ’ল্ট ইউনিকোড সজোৱা ক্ৰম - সৰল চীনা শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - GB2312 + ডিফ’ল্ট ইউনিকোড টেলিফোন বহিৰ মতেশৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম পিন্‌য়িন শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম - সাধাৰণ উদ্দেশ্যে অনুসন্ধান + সাধাৰণ উদ্দেশ্যে সন্ধান + সন্ধান মান্য সজোৱা ক্ৰম + মান্য স্ট্ৰোক শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম পৰম্পৰাগতভাবে শৃঙ্খলাবদ্ধ কৰাৰ ক্ৰম + ডিফ’ল্ট + ইম’জী + পাঠ্য ১২ ঘণ্টীয়া প্ৰণালী (০–১১) + ১২ (০–১১) ১২ (০–১১) ১২ ঘণ্টীয়া প্ৰণালী (১–১২) + ১২ (১–১২) ১২ (১–১২) ২৪ ঘণ্টীয়া প্ৰণালী (০–২৩) + 24 (0–23) Hour Cycle (12 vs 24) others… ২৪ (০–২৩) …অন্য ঘণ্টীয়া প্ৰণালী(১২ বনাম ২৪): ২৪ (০–২৩) ৩ (০–২৩) ২৪ ঘণ্টীয়া প্ৰণালী (১–২৪) + ২৪ (১–২৪) ২৪ (১–২৪) ঢিলা পংক্তি বিচ্ছেদ শৈলী + ঢিলা সাধাৰণ পংক্তি বিচ্ছেদ শৈলী + সাধাৰণ কঠোৰ পংক্তি বিচ্ছেদ শৈলী + পংক্তি বিচ্ছেদ + আটাইবোৰ বিভাজন কৰক + আটাইবোৰ ৰাখক + সাধাৰণ + ব্যাক্যাংশত ৰাখক মেট্ৰিক প্ৰণালী + মেট্ৰিক ইম্পেৰিয়েল জোখ-মাখৰ প্ৰণালী + ইম্পেৰিয়েল মাৰ্কিন যুক্তৰাষ্ট্ৰৰ জোখ-মাখৰ প্ৰণালী + মাৰ্কিন আৰবী-ভাৰতীয় অংক বিস্তাৰিত আৰবী-ভাৰতীয় অংক আৰ্মেনীয় সংখ্যা @@ -935,6 +976,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ থাই অংক তিব্বতী অংক ভেই সংখ্যা + + মেট্ৰিক @@ -982,7 +1025,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -991,9 +1034,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} বজাত - - {1} 'at' {0} - @@ -1201,27 +1241,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - am - pm - - - AM - PM - - - - AM - PM - - - AM - PM - - - AM - PM + পূৰ্বাহ্ন + অপৰাহ্ন @@ -2158,6 +2180,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইষ্টাৰ + + কোইহাইক + পুণ্টা এৰিনাছ @@ -2423,9 +2448,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ নোম পেন্‌হ - এণ্ডৰবাৰী - - কেণ্টন @@ -3095,9 +3117,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - পশ্চিম আফ্ৰিকাৰ সময় - পশ্চিম আফ্ৰিকাৰ মান সময় - পশ্চিম আফ্ৰিকাৰ গ্ৰীষ্মকালীন সময় + পশ্চিম আফ্ৰিকাৰ সময় @@ -3447,6 +3467,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ গায়ানাৰ সময় + + + হাৱাই-এলিউশ্বনৰ মান সময় + + হাৱাই-এলিউশ্বনৰ সময় @@ -3955,6 +3980,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ beng + + : + . @@ -4004,8 +4032,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 0 নিযুত 00 নিযুত 00 নিযুত - 000 নিঃ - 000 নিঃ + 0 নিঃ + 0 নিঃ 0 শঃ কোঃ 0 শঃ কোঃ 00 শঃ কোঃ @@ -4021,6 +4049,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + never + @@ -4031,7 +4062,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - #,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) @@ -4039,10 +4074,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) @@ -4052,26 +4089,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ 0 হাজাৰ ¤ 00 হাজাৰ ¤ 00 হাজাৰ - ¤ 000 লাখ - ¤ 000 লাখ + ¤ 0 লাখ + ¤ 0 লাখ ¤ 0 নিযুত ¤ 0 নিযুত ¤ 00 নিযুত ¤ 00 নিযুত - ¤ 000 নিযুত - ¤ 000 নিযুত - ¤ 0 শত কোটি - ¤ 0 শত কোটি - ¤ 00 শত কোটি - ¤ 00 শত কোটি - ¤ 000 শত কোটি - ¤ 000 শত কোটি - ¤ 0 শত পৰাৰ্দ্ধ - ¤ 0 শত পৰাৰ্দ্ধ - ¤ 00 শত পৰাৰ্দ্ধ - ¤ 00 শত পৰাৰ্দ্ধ - ¤ 000 শত পৰাৰ্দ্ধ - ¤ 000 শত পৰাৰ্দ্ধ + ¤ 0 নিঃ + ¤ 0 নিঃ + ¤ 0 শঃ কোঃ + ¤ 0 শঃ কোঃ + ¤ 00 শঃ কোঃ + ¤ 00 শঃ কোঃ + ¤ 000 শঃ কঃ + ¤ 000 শঃ কঃ + ¤ 0 শঃ পঃ + ¤ 0 শঃ পঃ + ¤ 00 শঃ পঃ + ¤ 00 শঃ পঃ + ¤ 000 শঃ পঃ + ¤ 000 শঃ পঃ {0} ¤¤ @@ -4079,8 +4116,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ সংযুক্ত আৰব আমিৰাত ডিৰহেম - UAE ডিৰহেম - UAE ডিৰহেম আফগান আফগানী @@ -4563,6 +4598,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইষ্ট কেৰিবিয়ান ডলাৰ + + কেৰিবীয়ান গিল্ডাৰ + কেৰিবীয়ান গিল্ডাৰ + কেৰিবীয়ান গিল্ডাৰ + পশ্চিম আফ্ৰিকান CFA ফ্ৰেংক @@ -4583,6 +4623,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ জাম্বিয়ান কোৱাচা + + জিম্বাৱীয় সোণ + জিম্বাৱীয় সোণ + জিম্বাৱীয় সোণ + {0}+ @@ -4754,7 +4799,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ আইটেমসমূহ - + + অংশ + {0} অংশ + {0} অংশ + + প্ৰতি মিলিয়নত ভাগ প্ৰতি মিলিয়নত {0} ভাগ প্ৰতি মিলিয়নত {0} ভাগ @@ -4772,6 +4822,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} পাৰমিৰেইড {0} পাৰমিৰেইড + + গ্লুক’জ + {0} গ্লুঃ + {0}গ্লুঃ + প্ৰতি কিলোমিটাৰত লিটাৰ প্ৰতি কিলোমিটাৰত {0} লিটাৰ @@ -5131,6 +5186,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মিলিমিটাৰ মাৰ্কিউৰী {0} মিলিমিটাৰ মাৰ্কিউৰী + + মাৰ্কিঃ + {0} মাৰ্কিঃ + {0} মাৰ্কিঃ + প্ৰতি বৰ্গ ইঞ্চিত পাউণ্ড {0} প্ৰতি বৰ্গ ইঞ্চিত পাউণ্ড @@ -5283,6 +5343,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মেট্ৰিক কাপ {0} মেট্ৰিক কাপ + + ফ্লুঃ আঃ মেঃ + {0} ফ্লুঃ আঃ মেঃ + {0}ফ্লুঃ আঃ মেঃ + {0} একৰ-ফুট {0} একৰ-ফুট @@ -5334,22 +5399,76 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ইম্পেৰিয়েল কুৱাৰ্ট {0} ইম্পেৰিয়েল কুৱাৰ্ট - - আলোক - {0} আলোক - {0} আলোক + + ষ্টেৰাডিয়ান + {0} ষ্টেৰাঃ + {0} ষ্টেৰাঃ - + + কাটাল + {0} কাটাঃ + {0} কাটাঃ + + + কুলম্ব + {0} কুঃ + {0} কুঃ + + + ফাৰাড + {0}ফাঃ + {0} ফাঃ + + + হেনৰী + {0} হেনঃ + {0}হেনঃ + + + ছিয়েমেন + {0} ছিয়েঃ + {0} ছিয়েঃ + + + কেল’ৰি-আইটি + {0}কেল-আইটি + {0} কেল-আইটি + + + বেকাৰেল + {0} বেঃ + {0} বেঃ + + + চিয়েভাৰ্ট + {0} এচভিঃ + {0} এচভিঃ + + + গ্ৰে + {0} গ্ৰে + {0} গ্ৰে + + + কিলোগ্ৰাম-বল + {0} কিঃগ্ৰাঃবঃ + {0} কিঃগ্ৰাঃবঃ + + + টেচলা + {0} টেঃ + {0} টেঃ + + + ৱেবাৰ + {0} ৱেঃ + {0} ৱেঃ + + প্ৰতি বিলিয়নত অংশ {0} প্ৰতি বিলিয়নত অংশ {0} প্ৰতি বিলিয়নত অংশ - - নিশা - {0} নিশা - {0} নিশা - {0}/নিশা - প্ৰধান দিক্-নিৰ্দেশনা {0} পূব @@ -5542,7 +5661,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} টা আইটেম {0} টা আইটেম - + + অংশ + {0} অংশ + {0} অংশ + + ভাগ/মিলিয়ন @@ -5559,6 +5683,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ম’ল {0} ম’ল + + গ্লুঃ + {0} গ্লুঃ + {0} গ্লুঃ + লিটাৰ/কিঃ মিঃ {0} লিঃ/কিঃ মিঃ @@ -6056,8 +6185,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmHg - {0} mmHg - {0} mmHg + {0} মিঃমিঃমাৰ্কিঃ + {0}মিঃমিঃমাৰ্কিঃ + + + মাৰ্কিঃ + {0} মাৰ্কিঃ + {0} মাৰ্কিঃ বাৰ @@ -6181,6 +6315,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মেঃ কাঃ {0} মেঃ কাঃ + + ফ্লুঃ আঃ মেঃ + {0}ফ্লুঃ আঃ মেঃ + {0} ফ্লুঃ আঃ মেঃ + একৰ-ফুট {0} এঃ-ফুঃ @@ -6259,12 +6398,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} পিঞ্চ {0} পিঞ্চ + + ষ্টেৰাঃ + {0} ষ্টেৰাঃ + {0}ষ্টেৰাঃ + + + কাটাঃ + {0} কাটাঃ + {0} কাটাঃ + + + কুঃ + {0} কুঃ + {0} কুঃ + + + ফাঃ + {0} ফাঃ + {0} ফাঃ + + + হেনঃ + {0} হেনঃ + {0} হেনঃ + + + ছিয়েঃ + {0} ছিয়েঃ + {0} ছিয়েঃ + + + কেল’ৰি-আইটি + {0} কেল-আইটি + {0} কেল-আইটি + + + বেঃ + {0}বেঃ + {0}বেঃ + + + এচভিঃ + {0} এচভিঃ + {0} এচভিঃ + + + গ্ৰে + {0}গ্ৰে + {0} গ্ৰে + + + কিঃগ্ৰাঃবঃ + {0} কিঃগ্ৰাঃবঃ + {0} কিঃগ্ৰাঃবঃ + + + টেঃ + {0} টেঃ + {0} টেঃ + + + ৱেঃ + {0} ৱেঃ + {0} ৱেঃ + আলোক {0} আলোক {0} আলোক - + অংশ/বিলিয়ন @@ -6367,7 +6571,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}″ {0}″ - + + অংশ + {0} অংশ + {0} অংশ + + ppm {0}ppm {0}ppm @@ -6381,6 +6590,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + গ্লুঃ + {0} গ্লুঃ + {0} গ্লুঃ + ল/১০০ ক.ম. @@ -6435,9 +6649,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}কেলৰি {0}কেলৰি - - N - {0}kWh/100km {0} kWh/100km @@ -6477,6 +6688,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ L☉ + + {0} মিঃমিঃমাৰ্কিঃ + {0}মিঃমিঃমাৰ্কিঃ + + + মাৰ্কিঃ + {0} মাৰ্কিঃ + {0} মাৰ্কিঃ + ″ Hg {0}″ Hg @@ -6502,6 +6722,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}° {0}° + + ফ্লুঃ আঃ মেঃ + {0}ফ্লুঃ আঃ মেঃ + {0} ফ্লুঃ আঃ মেঃ + {0}টিস্পুন {0}টিস্পুন @@ -6515,21 +6740,79 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dsp-Imp {0}dsp-Imp + + ষ্টেৰাঃ + {0} ষ্টেৰাঃ + {0}ষ্টেৰাঃ + + + কাটাঃ + {0} কাটাঃ + {0} কাটাঃ + + + কুঃ + {0} কুঃ + {0} কুঃ + + + ফাঃ + {0} ফাঃ + {0} ফাঃ + + + হেনঃ + {0} হেনঃ + {0} হেনঃ + + + ছিয়েঃ + {0} ছিয়েঃ + {0} ছিয়েঃ + + + কেল’ৰি-আইটি + {0} কেল-আইটি + {0} কেল-আইটি + + + বেঃ + {0}বেঃ + {0}বেঃ + + + এচভিঃ + {0} এচভিঃ + {0} এচভিঃ + + + গ্ৰে + {0} গ্ৰে + {0}গ্ৰে + + + কিঃগ্ৰাঃবঃ + {0} কিঃগ্ৰাঃবঃ + {0} কিঃগ্ৰাঃবঃ + + + টেঃ + {0} টেঃ + {0} টেঃ + + + ৱেঃ + {0} ৱেঃ + {0} ৱেঃ + - আলোক {0}আলোক {0}আলোক - + {0}ppb {0}ppb - - নিশা - {0} নিশা - {0} নিশা - {0}/নিশা - diff --git a/make/data/cldr/common/main/asa.xml b/make/data/cldr/common/main/asa.xml index 1e8e9139baf..7830fb83ecd 100644 --- a/make/data/cldr/common/main/asa.xml +++ b/make/data/cldr/common/main/asa.xml @@ -556,6 +556,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ast.xml b/make/data/cldr/common/main/ast.xml index bf948f4bead..f7b55524bed 100644 --- a/make/data/cldr/common/main/ast.xml +++ b/make/data/cldr/common/main/ast.xml @@ -1198,13 +1198,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendariu de la República de China formatu monetariu contable formatu monetariu estándar - orde de clasificación chinu tradicional - Big5 orde de clasificación anterior, por compatibilidá orde de clasificación de diccionariu orde de clasificación Unicode predetermináu orde de clasificación Emoji regles d’ordenamientu europees - orde de clasificación chinu simplificáu - GB2312 orde de clasificación de llista telefónica orde de clasificación pinyin gueta xeneral @@ -1705,20 +1703,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - antes de la Encarnación - después de la Encarnación - - - a. E. - d. E. - - - aE - dE - - @@ -3376,11 +3360,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hora braniega de {0} Hora estándar de {0} - - HST - HST - HDT - Honolulu @@ -3556,9 +3535,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tokiu - - Enderbury - Pyong Yang @@ -3768,9 +3744,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Hora d’África del oeste - Hora estándar d’África del oeste - Hora braniega d’África del oeste + Hora d’África del oeste @@ -4206,6 +4180,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hora de La Guyana + + + Hora estándar de Hawaii-Aleutianes + + Hora de Hawaii-Aleutianes @@ -4772,6 +4751,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -6431,7 +6414,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimol per llitru {0} milimoles per llitru - + partes per millón {0} parte per millón {0} partes per millón @@ -7343,7 +7326,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmol/L {0}mmol/L - + {0}ppm {0}ppm diff --git a/make/data/cldr/common/main/az.xml b/make/data/cldr/common/main/az.xml index c349944c7a5..d7d104f7a97 100644 --- a/make/data/cldr/common/main/az.xml +++ b/make/data/cldr/common/main/az.xml @@ -124,7 +124,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ taita alman Avstriya almancası - İsveçrə yüksək almancası delaver slavey doqrib @@ -257,10 +256,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kabarda-çərkəz tiyap makond - kabuverdian + kabuverdianu koro konqo - kaiqanq + kaynqanq xazi xotan koyra çiini @@ -287,6 +286,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia köln kürd + kürd dili + kurmanci (kürd dili) dialekti kumık kutenay komi @@ -805,6 +806,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Çin Kolumbiya Klipperton adası + sark (ingilis dili) dialekti Kosta Rika Kuba Kabo-Verde @@ -1039,45 +1041,85 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Valyuta Formatı Sıralama Valyuta + Emojilərin təqdim edilməsi Saat Sikli (12 / 24) Sətirdən sətrə keçirmə üslubu + Sözlərin bölünərək sətirdən-sətrə keçirilməsi Ölçü Sistemi Rəqəmlər + Abreviaturadan sonra cümlə kəsintisi Buddist təqvimi + Buddist Çin təqvimi + Çin Kopt təqvimi + Qibti Dangi təqvimi + Dangi Efiop təqvimi + Efiop Efiop amet-alem təqvimi - Qreqorian təqvimi + Efiop Amete Alem + Qriqori təqvimi + Qriqori Yəhudi Təqvimi + Yəhudi Hindi təqvimi Hicri təqvimi + Hicri Hicri təqvimi (tabulyar, vətəndaşlıq dövrü) + Hicri (cədvəl, mülki dövr) Hicri təqvim (tabulyar, astromonik dövr) + Hicri (cədvəl, astronomik dövr) Hicri təqvim (Umm əl-Qura) + Hicri (Umm əl-Qura) ISO-8601 Təqvimi Yapon Təqvimi + Yapon İran Təqvimi + İran Minquo Təqvimi + Minquo Uçot Valyuta Formatı + Valyuta formatı: Uçot Standart Valyuta Formatı + Valyuta formatı: Standart Standart Unicode Sıralama + Defolt unikod Pinyin təqvimi Ümumi Məqsədli Axtarış + Axtarış Standart Sıralama + Standart + Emojilərin təqdim edilməsi: Standart + Emoji + Mətn 12 Saatlıq Sistem (0–11) + 12 (0–11) 12 Saatlıq Sistem (0–12) + 12 (1–12) 24 Saatlıq Sistem (0–23) + 24 (0–23) 24 Saatlıq Sistem (0–23) + 24 (1–24) Sərbəst sətirdən sətrə keçirmə üslubu + Sərbəst Normal sətirdən sətrə keçirmə üslubu + Normal Sərt sətirdən sətrə keçirmə üslubu + Ciddi + Hamısını böl + Hamısını saxla + Normal + İfadələrdə saxla Metrik Sistem + Metrik İmperial Ölçü Sistemi + Birləşmiş Krallıq ABŞ Ölçü Sistemi + Birləşmiş Ştatlar Ərəb-Hind Rəqəmləri Genişlənmiş Ərəb-Hind Rəqəmləri Erməni Rəqəmləri @@ -1118,6 +1160,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tay Rəqəmləri Tibet Rəqəmləri Vai rəqəmləri + Deaktiv + Aktiv Metrik @@ -1138,9 +1182,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1210,11 +1251,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a + G MM/y GGGGG d M y + G dd/MM/y, E G MMM y G d MMM y G d MMM y, E - h a h:mm a h:mm:ss a dd.MM @@ -1230,6 +1272,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G MMMM y + + B h – B h + B h – h + + + B h:mm – B h:mm + B h:mm – h:mm + B h:mm – h:mm + GGGGG MM/y– GGGGG MM/y GGGGG MM/y – MM/y @@ -1264,10 +1315,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G d MMM, E – d MMM y, E G d MMM y, E – d MMM y, E - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1278,10 +1325,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - dd.MM – dd.MM dd.MM – dd.MM @@ -1291,11 +1334,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dd.MM, E – dd.MM, E - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E + d – d MMM GGGGG MM/y – MM/y @@ -1316,8 +1355,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G MMM y – MMM y - G d–d MMM y - G d MMM y – d MMM + G MMM d – d, y + G MMM d – MMM d, y G d MMM y – d MMM y @@ -1525,13 +1564,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}/{0} + + {1}/{0} + {1} {0} - {1} 'at' {0} + {1}/{0} + + + {1}/{0} @@ -1541,6 +1586,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1549,6 +1597,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + B h @@ -1559,11 +1610,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E E h:mm a E h:mm:ss a - GGGGG d MMM y + G M y + G d M y + G d M y, E G MMM y G d MMM y G d MMM y, E - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1586,6 +1638,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Y, w 'həftə' + + B h – B h + B h–h + + + B h:mm–B h:mm + B h:mm–h:mm + B h:mm–h:mm + GGGGG MM.y – GGGGG MM.y GGGGG MM.y – MM.y @@ -1615,15 +1676,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G d MMM y – d MMM y - G d MMM, E – d MMM y, E + G d MMM, E – d MMM, E, y G d MMM y, E – d MMM y, E G d MMM, E – d MMM y, E G d MMM y, E – d MMM y, E - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1634,10 +1691,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - dd.MM – dd.MM dd.MM – dd.MM @@ -1673,12 +1726,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y – MMM y - d MMM y – d MMM + d – d MMM y + d MMM – d MMM y d MMM y – d MMM y - d MMM y, E – d MMM, E - d MMM y, E – d MMM, E + E, d MMM – E, d MMM y + E, d MMM – E, d MMM y d MMM y, E – d MMM y, E @@ -1721,6 +1775,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + G MM/y + G dd/MM/y, E + + @@ -1843,7 +1903,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hft. günü - ayın həftə günü + ayın həftəiçi günü ay hft. günü @@ -1899,9 +1959,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - keçən ÇƏ + keçən Ç.ax. bu ÇƏ gələn ÇƏ + + {0} çərşənbə axşamı sonra + {0} çərşənbə axşamı ərzində + keçən çərşənbə @@ -2057,9 +2121,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angilya - - Tirana - Syova @@ -2300,6 +2361,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pasxa + + Koyayke + Santyaqo @@ -2512,7 +2576,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pnom Pen - Enderböri + Kanton Kirimati @@ -2977,9 +3041,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Qərbi Afrika Vaxtı - Qərbi Afrika Standart Vaxtı - Qərbi Afrika Yay Vaxtı + Qərbi Afrika Vaxtı @@ -2998,9 +3060,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Şimali Mərkəzi Amerika Vaxtı - Şimali Mərkəzi Amerika Standart Vaxtı - Şimali Mərkəzi Amerika Yay Vaxtı + Mərkəzi Amerika saat qurşağı + Mərkəzi Amerika Standart Vaxtı + Mərkəzi Amerika yay vaxtı @@ -3061,7 +3123,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Atlantik Vaxt + Atlantik saat qurşağı Atlantik Standart Vaxt Atlantik Yay Vaxtı @@ -3329,6 +3391,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Qayana Vaxtı + + + Havay-Aleut Standart Vaxtı + + Havay-Aleut Vaxtı @@ -3748,6 +3815,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Çuuk Vaxtı + + + Türkiya vaxtı + Türkiya standart vaxtı + Türkiya yay vaxtı + + Türkmənistan Vaxtı @@ -3926,13 +4000,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 + + + #,##0.00 ¤ + #,##0.00 ¤ - #,##0.00;(#,##0.00) + #,##0.00 ¤ + #,##0.00 @@ -3943,24 +4030,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 00K ¤ 000K ¤ 000K ¤ - 0M ¤ - 0M ¤ - 00M ¤ - 00M ¤ - 000M ¤ - 000M ¤ - 0G ¤ - 0G ¤ - 00G ¤ - 00G ¤ - 000G ¤ - 000G ¤ - 0T ¤ - 0T ¤ - 00T ¤ - 00T ¤ - 000T ¤ - 000T ¤ + 0 mln ¤ + 0 mln ¤ + 00 mln ¤ + 00 mln ¤ + 000 mln ¤ + 000 mln ¤ + 0 mlrd ¤ + 0 mlrd ¤ + 00 mlrd ¤ + 00 mlrd ¤ + 000 mlrd ¤ + 000 mlrd ¤ + 0 trln ¤ + 0 trln ¤ + 00 trln ¤ + 00 trln ¤ + 000 trln ¤ + 000 trln ¤ @@ -5183,6 +5270,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Şərqi Karib dolları Şərqi Karib dolları + + Karib gilderi + Karib gilderi + Karib gilderi + Fransız Gızıl Frankı Fransız gızıl frankı @@ -5276,6 +5368,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabve dolları (1980–2008) Zimbabve dolları (1980–2008) + + Zimbabve Qızılı + Zimbabve qızılı + Zimbabve qızılı + Zimbabve Dolları (2009) Zimbabve dolları (2009) @@ -5486,7 +5583,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimol/litr {0} millimol/litr - + + hissə + {0} hissə + {0} hissə + + milyonda hissəcik {0} milyonda hissəcik {0} milyonda hissəcik @@ -5503,6 +5605,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} permiriada {0} permiriada + + qlükoza + {0} qlükoza + {0} qlükoza + litr/kilometr {0} litr/kilometr @@ -5890,6 +5997,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimetr civə sütunu {0} millimetr civə sütunu + + civə + funt/kvadrat düym {0} funt/kvadrat düym @@ -6021,6 +6131,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millilitr {0} millilitr + + metrik maye unsiyası + {0} metrik maye unsiyası + {0} metrik maye unsiyası + akr-fut {0} akr-fut @@ -6088,21 +6203,61 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} İmp. kvarta {0} İmp. kvarta - - işıq - {0} işıq - {0} işıq + + steradian - - bir milyarda düşən hissə sayı - bir milyarda düşən {0} hissə - bir milyarda düşən {0} hissə + + katal - - gecə - {0} gecə - {0} gecə - {0}/gecə + + kulomb + {0} kulomb + {0} kulomb + + + farad + + + henri + + + simen + + + kalori-IT + {0} kalori [IT] + {0} kal-IT + + + bekkerel + {0} bekkerel + {0} bekkerel + + + zivert + {0} zivert + {0} zivert + + + qrey + {0} Qy + {0} Qy + + + kiloqram qüvvə + {0} kqq + {0} kqq + + + tesla + + + veber + + + milyardda hissə + milyardda {0} hissə + milyardda {0} hissə kardinal istiqamət @@ -6220,7 +6375,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} element {0} element - + + hissə + {0} hissə + {0} hissə + + hissəcik/milyon {0} hs/mln {0} hs/mln @@ -6234,6 +6394,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ permiriada + + Qlk + {0} Qlk + {0} Qlk + l/km {0} l/km @@ -6585,6 +6750,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} sL {0} sL + + mmu + {0} mmu + {0} mmu + buşel {0} buşel @@ -6657,13 +6827,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kvarta İmp. {0} kvarta İmp. + + kulomb + {0} kulomb + {0} kulomb + + + kal-IT + {0} kal-IT + {0} kal-IT + + + Bk + {0} Bk + {0} Bk + + + Zv + {0} Zv + {0} Zv + + + Qy + {0} Qy + {0} Qy + + + kqq + {0} kqq + {0} kqq + işıq {0} işıq {0} işıq - + hissə/milyard + {0} hissə/milyard + {0} hissə/milyard gecə @@ -6707,9 +6909,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ft² {0} ft² - - {0} hs/mln - {0}ppm + + hissə + {0} hissə + {0} hissə % @@ -6720,6 +6923,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Qlk + {0} Qlk + {0} Qlk + {0} mil/imq {0} mil/imq @@ -6893,6 +7101,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mf {0} mf + + mmu + {0} mmu + {0} mmu + ak-ft {0} ak-ft @@ -6924,16 +7137,47 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt-Imp. {0}qt-Imp. + + K + {0} K + {0} K + + + kal-IT + {0} kal-IT + {0} kal-IT + + + Bk + {0} Bk + {0} Bk + + + Zv + {0} Zv + {0} Zv + + + Qy + {0} Qy + {0} Qy + + + kqq + {0} kqq + {0} kqq + - işıq {0}işıq {0}işıq + + {0} hissə/milyard + {0} hissə/milyard + - gecə {0}gecə {0}gecə - {0}/gecə diff --git a/make/data/cldr/common/main/az_Cyrl.xml b/make/data/cldr/common/main/az_Cyrl.xml index 64b3e0669f3..dc96f5cacd7 100644 --- a/make/data/cldr/common/main/az_Cyrl.xml +++ b/make/data/cldr/common/main/az_Cyrl.xml @@ -1070,6 +1070,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ba.xml b/make/data/cldr/common/main/ba.xml index 468134a046d..72ba3e243ad 100644 --- a/make/data/cldr/common/main/ba.xml +++ b/make/data/cldr/common/main/ba.xml @@ -12,11 +12,12370 @@ CLDR data files are interpreted according to the LDML specification (http://unic - башҡорт теле + афар + абхаз + африкаанс + агем + акан + амхар + арагон + оболо + левант ғәрәп + ғәрәп + әҙәби ғәрәп + мапуче + ассам + асу + астурий + әзербайжан + әзери + башҡорт + балудж + басаа + белорус + бемба + бетави + бена + болгар + харьянви + көнбайыш белудж + бходжпури + ании + тай дам + бамбара + бенгал + тибет + бәхтиәр + бретон + бодо + босний + акоосе + бүрәт + блин + каталан + каддо + атсам + чакма + чечен + себуано + чига + чоктав + чероки + чикасо + үҙәк курд + курд, үҙәк + курд, сорани + корсика + копт + чех + һаҙлыҡлы кри + сиркәү славян + сыуаш + валлий + дат + таита + немец + немец (Австрия) + немец (Швейцария) + зарма + догри + түбәнге лужиц + дуала + дивехи + джола фоньи + дзонг-кэ + эмбу + эве + грек + инглиз + инглиз (Австралия) + инглиз (Канада) + инглиз (Британия) + инглиз (АҠШ) + эсперанто + испан + испан (Латин Америкаһы) + испан (Европа) + испан (Мексика) + эстон + баск + эвондо + фарсы + дари + фула + фин + филиппин + фарер + француз + француз (Канада) + француз (Швейцария) + каджун француз + төньяҡ фриз + фриул + көнбайыш фриз + ирланд + га + шотланд гэл + геэз + галисий + гуарани + швейцария немец + гуджарати + гусии + мэн + хауса + гавай + иврит + һинди + һинди (латиница) + һинглиш + хмонг нджуа + хорват + үрге лужи + гаити креол + венгр + әрмән + интерлингва + индонез + интерлингве + игбо + сычуань и + идо + исланд + итальян + инуктитут + япон + ложбан + нгомба + мачаме + ява + грузин + ҡарағалпаҡ + кабил + джу + камба + тьяп + маконде + кабувердьяну + кекчи + кеньянг + каинганг + койра Чиини + кикуйю + ҡаҙаҡ + како + калааллисут + календжин + кхмер + каннада + корей + конкани + кпелле + кашмири + шамбала + бафия + кёльн + курд + курд + курманджи + корн + куви + ҡырғыҙ + латин + ланги + люксембург + ганда + лигур + лакота + ладин + ломбард + лингала + лаос + луизиана креол + төньяҡ лури + литва + латгал + луба-катанга + луо + лухья + латыш + лаз + майтхили + масаи + мокша + меру + морисьен + малагаси + макуа-меетто + мета + мокено + маори + микмау + македон + малаялам + монгол + манипури + мохаук + маратхи + малай + мальта + мунданг + бер нисә тел + мускоги + хмонг дав + бирма + эрзә + мазандеран + мин нан ҡытай + нама + норвег букмол + төньяҡ ндебеле + түбәнге немец + түбәнге саксон + непал + нидерланд + фламанд + квасио + норвег нюнорск + нгиембун + норвег + н’ко + көньяҡ ндебеле + төньяҡ сото + нуэр + навахо + ньянджа + ньянколе + окситан + оканаган + оромо + одия + осетин + осейдж + панджаби + папьяменто + нигерия пиджины + пали + пиджин + поляк + пьемонт + прус + пушту + португал + португал (Бразилия) + португал (Европа) + кечуа + киче + раджастхани + рохинджа + риф + романш + рунди + румын + молдов + ромбо + урыҫ + киньяруанда + руа + санскрит + саха + самбуру + сантали + сангу + сардин + сицилия + синдхи + көньяҡ курд + төньяҡ саам + сена + койраборо Сенни + санго + самогит + ташельхит + шан + сингал + сидамо + словак + сараиики + словен + көньяҡ саам + луле саам + инари саам + сколт саам + шона + сомали + албан + серб + свати + сахо + көньяҡ сото + сундан + сунвар + швед + суахили + конго суахили + сүриә + силез + тамил + телугу + тесо + тажик + тай + тигринья + тигре + төркмән + тсвана + тонга + токи пона + ток писин + төрөк + тароко + торвали + тсонга + татар + тасавак + тува + үҙәк атлас тамазигхт + уйғыр + украин + билдәһеҙ тел + урду + үзбәк + ваи + венда + венет + вьетнам + макуа + волапюк + вунджо + валлон + вальзер + волайтта + вальпири + волоф + коса + кангри + сога + янгбен + идиш + йоруба + ньенгату + кантональ + кантональ ҡытай + чжуан + стандарт марокко тамазигхт + ҡытай + мандарин ҡытай + ҡытай (ябайлаштырылған) + мандарин ҡытай (ябайлаштырылған) + ҡытай (традицион) + мандарин ҡытай (традицион) + зулу + лингвистик йөкмәткеһеҙ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + донъя + Африка + Төньяҡ Америка + Көньяҡ Америка + Океания + Көнбайыш Африка + Үҙәк Америка + Көнсығыш Африка + Төньяҡ Африка + Үҙәк Африка + Көньяҡ Африка + Америка + Төньяҡ Америка төбәге + Кариб бассейны + Көнсығыш Азия + Көньяҡ Азия + Көньяҡ-Көнсығыш Азия + Көньяҡ Европа + Австралазия + Меланезия + Микронезия төбәге + Полинезия + Азия + Үҙәк Азия + Көнбайыш Азия + Европа + Көнсығыш Европа + Төньяҡ Европа + Көнбайыш Европа + Тропик Африка + Латин Америка + Асеншен утрауы + Андорра + Берләшкән Ғәрәп Әмирлектәре + Афғанстан + Антигуа һәм Барбуда + Ангилья + Албания + Әрмәнстан + Ангола + Антарктида + Аргентина + Америка Самоаһы + Австрия + Австралия + Аруба + Аланд утрауҙары + Әзербайжан + Босния һәм Герцеговина + Барбадос + Бангладеш + Бельгия + Буркина-Фасо + Болгария + Бәхрәйн + Бурунди + Бенин + Сен-Бартелеми + Бермуд утрауҙары + Бруней + Боливия + Карибтағы Нидерланд + Бразилия + Багам утрауҙары + Бутан + Буве утрауы + Ботсвана + Беларусь + Белиз + Канада + Кокос утрауҙары + Конго - Киншаса + Конго (КДР) + Үҙәк Африка Республикаһы + Конго - Браззавиль + Конго Республикаһы + Швейцария + Кот-д’Ивуар + Кук утрауҙары + Чили + Камерун + Ҡытай + Колумбия + Клиппертон утрауы + Сарк + Коста-Рика + Куба + Кабо-Верде + Кюрасао + Раштыуа Утрауы + Кипр + Чехия + Чех Республикаһы + Германия + Диего-Гарсия + Джибути + Дания + Доминика + Доминикан Республикаһы + Алжир + Сеута һәм Мелилья + Эквадор + Эстония + Мысыр + Көнбайыш Сахара + Эритрея + Испания + Эфиопия + Европа Берлеге + Еврозона + Финляндия + Фиджи + Фолкленд утрауҙары + Фолкленд (Мальвин) утрауҙары + Микронезия + Фарер утрауҙары + Франция + Габон + Бөйөк Британия + Британия + Гренада + Грузия + Француз Гвианаһы + Гернси + Гана + Гибралтар + Гренландия + Гамбия + Гвинея + Гваделупа + Экваториаль Гвинея + Греция + Көньяҡ Георгия һәм Көньяҡ Сандвич утрауҙары + Гватемала + Гуам + Гвинея-Бисау + Гайана + Гонконг, Ҡытай МАР-ы + Гонконг + Херд һәм Макдональд утрауҙары + Гондурас + Хорватия + Гаити + Венгрия + Канар утрауҙары + Индонезия + Ирландия + Израиль + Мэн утрауы + Һиндостан + Британияның Һинд океанындағы биләмәһе + Чагос архипелагы + Ираҡ + Иран + Исландия + Италия + Джерси + Ямайка + Иордания + Япония + Кения + Ҡырғыҙстан + Камбоджа + Кирибати + Комор утрауҙары + Сент-Китс һәм Невис + Төньяҡ Корея + Көньяҡ Корея + Кувейт + Кайман утрауҙары + Ҡаҙағстан + Лаос + Ливан + Сент-Люсия + Лихтенштейн + Шри-Ланка + Либерия + Лесото + Литва + Люксембург + Латвия + Ливия + Марокко + Монако + Молдова + Черногория + Сен-Мартен + Мадагаскар + Маршалл утрауҙары + Төньяҡ Македония + Мали + Мьянма (Бирма) + Монголия + Макао, Ҡытай МАР-ы + Макао + Төньяҡ Мариан утрауҙары + Мартиника + Мавритания + Монтсеррат + Мальта + Маврикий + Мальдив утрауҙары + Малави + Мексика + Малайзия + Мозамбик + Намибия + Яңы Каледония + Нигер + Норфолк утрауы + Нигерия + Никарагуа + Нидерланд + Норвегия + Непал + Науру + Ниуэ + Яңы Зеландия + Аотеароа (Яңы Зеландия) + Оман + Панама + Перу + Француз Полинезияһы + Папуа – Яңы Гвинея + Филиппин + Пакистан + Польша + Сен-Пьер һәм Микелон + Питкэрн утрауҙары + Пуэрто-Рико + Фәләстин территориялары + Фәләстин + Португалия + Палау + Парагвай + Катар + Тышҡы Океания + Реюньон + Румыния + Сербия + Рәсәй + Руанда + Сәғүд Ғәрәбстаны + Соломон утрауҙары + Сейшель утрауҙары + Судан + Швеция + Сингапур + Изге Елена утрауы + Словения + Шпицберген һәм Ян-Майен + Словакия + Сьерра-Леоне + Сан-Марино + Сенегал + Сомали + Суринам + Көньяҡ Судан + Сан-Томе һәм Принсипи + Сальвадор + Синт-Мартен + Сүриә + Эсватини + Свазиленд + Тристан-да-Кунья + Төркс һәм Кайкос утрауҙары + Чад + Францияның Көньяҡ Биләмәләре + Того + Тайланд + Тажикстан + Токелау + Тимор-Лесте + Көнсығыш Тимор + Төркмәнстан + Тунис + Тонга + Төркиә + Тринидад һәм Тобаго + Тувалу + Тайвань + Танзания + Украина + Уганда + АҠШ-ның ситтәге утрауҙары + Берләшкән Милләттәр Ойошмаһы + Америка Ҡушма Штаттары + АҠШ + Уругвай + Үзбәкстан + Ватикан + Сент-Винсент һәм Гренадиндар + Венесуэла + Британия Виргин утрауҙары + АҠШ Виргин утрауҙары + Вьетнам + Вануату + Уоллис һәм Футуна + Самоа + псевдоакценттар + псевдо ике яҡлы + Косово + Йәмән + Майотта + Көньяҡ Африка Республикаһы + Замбия + Зимбабве + Билдәһеҙ төбәк + + + традицион немец орфографияһы + Стандартлаштырылған резия орфографияһы + 1996 йылғы немец орфографияһы + 1606 йылға тиклемге һуңғы урта быуат француз теле + Иртә яңы француз + академик + 1943 йылғы орфографик формулировка + ALA-LC романлаштырыуы, 1997 йылғы баҫма + Алуку диалекты + 1990 йылғы португал теле орфография килешеүе + берҙәм төрки латин алфавиты + Ании (баланка диалекты) + Кабувердьяну (барлавенто диалект төркөмө) + Сан-Джорджио/Била диалекты + Богорич алфавиты + Бунтлинг + 1945 йылғы португал-бразил орфография конвенцияһы + Дайнко алфавиты + Серб (экав әйтелеше) + Иртә яңы инглиз + Халыҡ-ара фонетик алфавит + Урал фонетик алфавиты + Хепбёрн романлаштырыуы + Серб (иекав әйтелеше) + дөйөм орфография + Стандарт орфография + Резия (липоваз диалекты) + Метелько алфавиты + Монотоник + Ндьюка диалекты + Натисоне диалекты + Гнива/Нива диалекты + Хәҙерге волапюк + Осеакко/Осояне диалекты + Оксфорд инглиз һүҙлеге орфографияһы + Памака диалекты + пиньинь романизацияһы + Политоник + компьютер + Үҙгәртелгән орфография + Классик волапюк + Резия + Сахо + шотланд стандарт инглиз теле + скаус + столвиццо/солбица диалекты + Кабувердьяну (сотавенто диалект төркөмө) + тарашкевица орфографияһы + берҙәм орфография + берҙәм үҙгәртелгән орфография + унифон фонетик алфавиты + Валенсия + Уэйд-Джайлз романлаштырыуы + + + календарь + валюта форматы + теҙеү тәртибе + валюта + эмодзи күренеше + сәғәт форматы (12 йәки 24 сәғәтлек) + юл күсереү стиле + һүҙҙәрҙе күсереү стиле + үлсәү системаһы + һандар + ҡыҫҡартманан һуң һөйләмде бүлеү + + + будда календары + будда + ҡытай календары + ҡытай + копт календары + копт + данги календары + данги + эфиоп календары + эфиоп + эфиоп амете-алем календары + эфиоп (амете-алем) + григориан календары + григориан + йәһүд календары + йәһүд + Һиндостан милли календары + Һиндостан милли + һижри календарь + һижри + һижри календарь (таблицалы, граждандар эпохаһы) + һижри (таблицалы, граждандар дәүере) + Һижри календарь (Сәғүд Ғәрәбстаны) + һижри календарь (таблицалы, астрономик эпоха) + һижри (таблицалы, астрономик дәүер) + һижри календарь (Үмм әл-Ҡура) + һижри (Үмм әл-Ҡура) + ISO-8601 календары + япон календары + япон + фарсы календары + фарсы + минго календары + минго + бухгалтер валюта форматы + бухгалтер + стандарт валюта форматы + стандарт + элекке теҙеү тәртибе (ярашлылыҡ өсөн) + ярашлылыҡ + һүҙлексә теҙеү тәртибе + һүҙлексә + Стандарт Unicode теҙеү тәртибе + Стандарт Unicode + эмодзи + европа теҙеү ҡағиҙәләре + телефон китабыса теҙеү тәртибе + телефон китабы + фонетик + пиньинь теҙеү тәртибе + пиньинь + дөйөм маҡсатлы эҙләү + эҙләү + хангыль буйынса (баш тартынҡы менән) эҙләү + ғәҙәти тәртип + ғәҙәти + һыҙыҡтар буйынса теҙеү тәртибе + һыҙыҡтар буйынса + традицион теҙеү тәртибе + традицион + радикал-һыҙыҡ теҙеү тәртибе + радикал-һыҙыҡ + чжуинь теҙеү тәртибе + чжуинь + стандарт + эмодзи + текст + 12 сәғәтлек формат (0–11) + 12 сәғәтлек (0–11) + 12 сәғәтлек формат (1–12) + 12 сәғәтлек (1–12) + 24 сәғәтлек формат (0–23) + 24 сәғәтлек (0–23) + 24 сәғәтлек формат (1–24) + 24 сәғәтлек (1–24) + йомшаҡ юл күсереү + йомшаҡ + ғәҙәти юл күсереү + ғәҙәти + ҡаты юл күсереү + ҡаты + барыһын да күсереү + барыһын да һаҡлау + ғәҙәти стиль + фразаларҙа һаҡлау + метрик система + метрик + Британия үлсәмдәр системаһы + Бөйөк Британия + АҠШ үлсәү системаһы + АҠШ + ахом цифрҙары + ғәрәп-һинд цифрҙары + киңәйтелгән ғәрәп-һинд цифрҙары + әрмән һандары + әрмән бәләкәй һандары + бали цифрҙары + бенгал цифрҙары + брахми цифрҙары + чакма цифрҙары + чам цифрҙары + кириллица һандары + деванагари цифрҙары + дивес акуру цифрҙары + эфиоп һандары + тулы киңлектәге һандар + гарай цифрҙары + грузин цифрҙары + гунжала гонди цифрҙары + масарам гонди цифрҙары + грек цифрҙары + грек бәләкәй һандары + гуджарати цифрҙары + гурунг кхема цифрҙары + гурмукхи цифрҙары + ҡытай унлы цифрҙары + ябайлаштырылған ҡытай цифрҙары + ябайлаштырылған ҡытай финанс һандары + традицион ҡытай һандары + традицион ҡытай финанс һандары + йәһүд һандары + пахавх хмонг цифрҙары + ньякенг пуачуэ хмонг цифрҙары + ява цифрҙары + япон һандары + япон финанс һандары + кайа ли цифрҙары + кави цифрҙары + кхмер цифрҙары + каннада цифрҙары + кират рай цифрҙары + тай тхам хора цифрҙары + тай тхам тхам цифрҙары + лаос цифрҙары + ғәрәп цифрҙары + лепча цифрҙары + лимбу цифрҙары + математик ҡалын цифрҙар + математик ике һыҙыҡлы цифрҙар + математик монокиңлектәге цифрҙар + математик ҡырҡылмаған ҡалын цифрҙар + математик ҡырҡылмаған цифрҙар + малаялам цифрҙары + моди цифрҙары + монгол цифрҙары + мро цифрҙары + мейтей майек цифрҙары + мьянма цифрҙары + мьянма көнсығыш пво карен цифрҙары + мьянма пао цифрҙары + мьянма шан цифрҙары + мьянма тай лаинг цифрҙары + наг мундари цифрҙары + н’ко цифрҙары + ол чики цифрҙары + ол онал цифрҙары + одиа цифрҙары + османия цифрҙары + контурлы цифрҙар + ханифи рохинджа цифрҙары + рим һандары + рим бәләкәй һандары + саураштра цифрҙары + шарада цифрҙары + худавади цифрҙары + сингал лит цифрҙары + сора сомпенг цифрҙары + сундан цифрҙары + сунувар цифрҙары + такри цифрҙары + яңы тай луэ цифрҙары + традицион тамил цифрҙары + тамил цифрҙары + телугу цифрҙары + тай цифрҙары + тибет цифрҙары + тирхута цифрҙары + тангса цифрҙары + толонг сики цифрҙары + ваи цифрҙары + варанг сити цифрҙары + ванчо цифрҙары + һүндерелгән + ҡабыҙылған + + + метрик + Бөйөк Британия + АҠШ + + + Тел: {0} + Яҙыу: {0} + Төбәк: {0} + [а ә б в г ғ д ҙ её ж з и й к ҡ л м н ң о ө п р с ҫ т у ү ф х һ ц ч ш щ ъ ы ь э ю я] [А Ә Б В Г Ғ Д Ҙ ЕЁ Ж З И Й К Ҡ Л М Н Ң О Ө П Р С Ҫ Т У Ү Ф Х Һ Ц Ч Ш Щ Ъ Ы Ь Э Ю Я] + [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + + + + + + будда эраһы + + + бэ + + + + + + EEEE, d MMMM y 'й'. G + + + + + d MMMM y 'й'. G + + + + + d MMM y 'й'. G + + + + + dd.MM.y G + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + y 'й'. G + dd.MM.y G + MMM y 'й'. G + d MMM y 'й'. G + E, d MMM y 'й'. G + dd.MM + E, dd.MM + d MMM + E, d MMM + d MMMM + MM.y GGGGG + dd.MM.y GGGGG + E, dd.MM.y GGGGG + MMM y 'й'. G + d MMM y 'й'. G + E, d MMM y 'й'. G + MMMM y 'й'. G + QQQ y 'й'. G + QQQQ y 'й'. G + + + {0} – {1} + + y G – y G + y – y G + + + MM.y GGGGG – MM.y GGGGG + MM.y – MM.y GGGGG + MM.y – MM.y GGGGG + + + dd.MM.y – dd.MM.y GGGGG + dd.MM.y GGGGG – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + + + E, dd.MM.y – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + + + MMM y 'й'. G – MMM y 'й'. G + MMM – MMM y 'й'. G + MMM y – MMM y 'йй'. G + + + d–d MMM y 'й'. G + d MMM y 'й'. G – d MMM y 'й'. G + d MMM – d MMM y 'й'. G + d MMM y – d MMM y 'йй'. G + + + E, d MMM – E, d MMM y 'й'. G + E, d MMM y 'й'. G – E, d MMM y 'й'. G + E, d MMM – E, d MMM y 'й'. G + E, d MMM y – E, d MMM y 'йй'. G + + + HH–HH 'сәғ'. + + + + + + + + + Тут + Баба + Хатор + Киахк + Тоба + Амшир + Барамхат + Барамуда + Башанс + Паона + Эпеп + Месра + Наси + + + Тут + Баба + Хатор + Киахк + Тоба + Амшир + Барамхат + Барамуда + Башанс + Паона + Эпеп + Месра + Наси + + + + + Тут + Баба + Хатор + Киахк + Тоба + Амшир + Барамхат + Барамуда + Башанс + Паона + Эпеп + Месра + Наси + + + Тут + Баба + Хатор + Киахк + Тоба + Амшир + Барамхат + Барамуда + Башанс + Паона + Эпеп + Месра + Наси + + + + + + + + + мескерем + текемт + хедар + тахсас + тер + йекатит + мегабит + миазиа + генбот + сене + хамле + нехассе + пагумен + + + мескерем + текемт + хедар + тахсас + тер + йекатит + мегабит + миазиа + генбот + сене + хамле + нехассе + пагумен + + + + + мескерем + текемт + хедар + тахсас + тер + йекатит + мегабит + миазиа + генбот + сене + хамле + нехассе + пагумен + + + мескерем + текемт + хедар + тахсас + тер + йекатит + мегабит + миазиа + генбот + сене + хамле + нехассе + пагумен + + + + + + Инкарнация эраһына тиклем + Инкарнация эраһы + + + И.Э.Т. + И.Э. + + + И.Э.Т. + И.Э. + + + + + + + + EEEE, d MMMM y 'й'. G + + + + + d MMMM y 'й'. G + + + + + d MMM y 'й'. G + + + + + dd.MM.y G + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + E, h a + E, h:mm a + E, HH:mm + E hh:mm:ss a + E, HH:mm:ss + y 'й'. G + dd.MM.y G + MMM y 'й'. G + d MMM y 'й'. G + E, d MMM y 'й'. G + HH 'сәғ'. + hh:mm a + hh:mm:ss a + HH 'сәғ'. v + dd.MM + E, dd.MM + d MMM + E, d MMM + d MMMM + MM.y GGGGG + dd.MM.y GGGGG + E, dd.MM.y GGGGG + MMM y 'й'. G + d MMM y 'й'. G + E, d MMM y 'й'. G + MMMM y 'й'. G + QQQ y 'й'. G + QQQQ y 'й'. G + + + {0} – {1} + + h B – h B + + + h:mm B – h:mm B + + + y G – y G + y – y G + + + MM.y GGGGG – MM.y GGGGG + MM.y – MM.y GGGGG + MM.y – MM.y GGGGG + + + dd.MM.y – dd.MM.y GGGGG + dd.MM.y GGGGG – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + + + E, dd.MM.y – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + E, dd.MM.y G – E, dd.MM.y GGGGG + + + MMM y 'й'. G – MMM y 'й'. G + MMM – MMM y 'й'. G + MMM y – MMM y 'йй'. G + + + d–d MMM y 'й'. G + d MMM y 'й'. G – d MMM y 'й'. G + d MMM – d MMM y 'й'. G + d MMM y – d MMM y 'йй'. G + + + E, d MMM – E, d MMM y 'й'. G + E, d MMM y 'й'. G – E, d MMM y 'й'. G + E, d MMM – E, d MMM y 'й'. G + E, d MMM y – E, d MMM y 'йй'. G + + + HH–HH 'сәғ'. + + + HH–HH 'сәғ'. v + + + dd.MM – dd.MM + dd.MM – dd.MM + + + E, dd.MM – E, dd.MM + E, dd.MM – E, dd.MM + + + d–d MMM + d MMM – d MMM + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + y – y G + + + MM.y – MM.y GGGGG + MM.y – MM.y GGGGG + + + dd.MM.y – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + dd.MM.y – dd.MM.y GGGGG + + + E, dd.MM.y – E, dd.MM.y GGGGG + E, dd.MM.y – E, dd.MM.y GGGGG + E, dd.MM.y – E, dd.MM.y GGGGG + + + MMM – MMM y 'й'. G + MMM y 'й'. – MMM y 'й'. G + + + d–d MMM y 'й'. G + d MMM – d MMM y 'й'. G + d MMM y 'й'. – d MMM y 'й'. G + + + E, d MMM – E, d MMM y 'й'. G + E, d MMM – E, d MMM y 'й'. G + E, d MMM y 'й'. – E, d MMM y 'й'. G + + + MMMM – MMMM y 'й'. G + MMMM y 'й'. – MMMM y 'й'. G + + + + + + + + + ғин. + фев. + мар. + апр. + май + июн. + июл. + авг. + сент. + окт. + нояб. + дек. + + + Ғ + Ф + М + А + М + И + И + А + С + О + Н + Д + + + ғинуар + февраль + март + апрель + май + июнь + июль + август + сентябрь + октябрь + ноябрь + декабрь + + + + + ғин. + фев. + мар. + апр. + май + июн. + июл. + авг. + сент. + окт. + нояб. + дек. + + + Ғ + Ф + М + А + М + И + И + А + С + О + Н + Д + + + ғинуар + февраль + март + апрель + май + июнь + июль + август + сентябрь + октябрь + ноябрь + декабрь + + + + + + + йәк. + дүш. + шиш. + шар. + кес. + йом. + шәм. + + + Й + Д + Ш + Ш + К + Й + Ш + + + йш + дш + шш + шр + кс + йм + шб + + + йәкшәмбе + дүшәмбе + шишәмбе + шаршамбы + кесаҙна + йома + шәмбе + + + + + йәк. + дүш. + шиш. + шар. + кес. + йом. + шәм. + + + Й + Д + Ш + Ш + К + Й + Ш + + + йш + дш + шш + шр + кс + йм + шб + + + йәкшәмбе + дүшәмбе + шишәмбе + шаршамбы + кесаҙна + йома + шәмбе + + + + + + + 1-се кв. + 2-се кв. + 3-сө кв. + 4-се кв. + + + 1-се квартал + 2-се квартал + 3-сө квартал + 4-се квартал + + + + + 1-се кв. + 2-се кв. + 3-сө кв. + 4-се кв. + + + 1-се квартал + 2-се квартал + 3-сө квартал + 4-се квартал + + + + + + беҙҙең эраға тиклем + беҙҙең эраға тиклем + беҙҙең эра + беҙҙең эра + + + б.э.т. + б.э. + + + б.э.т. + б.э.т. + б.э. + б.э. + + + + + + d MMMM, EEEE, y 'й'. + + + + + d MMMM, y 'й'. + + + + + d MMM, y 'й'. + + + + + dd.MM.y + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + E, h B + E, h a + E h:mm a + E, HH:mm + E h:mm:ss a + E, HH:mm:ss + G y 'й'. + G MM.y + G dd.MM.y + MMM, G y 'й'. + d MMM, G y 'й'. + d MMM, E, G y 'й'. + HH 'сәғ'. + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v + HH 'сәғ'. v + dd.MM + dd.MM, E + d MMM + d MMM, E + d MMMM + MMMM 'айының' W 'аҙнаһы' + dd.MM.y + dd.MM.y, E + MMM, y 'й'. + d MMM, y 'й'. + d MMM, E, y 'й'. + MMMM, y 'й'. + QQQ, y 'й'. + QQQQ, y 'й'. + Y 'йылдың' w 'аҙнаһы' + + + {0} – {1} + + h B – h B + + + h:mm B – h:mm B + + + G y 'й'. – G y 'й'. + G y – y 'йй'. + + + G y.MM – G y.MM + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – G dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – G dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + MMM, G y 'й'. – MMM, G y 'й'. + MMM–MMM, G y 'й'. + MMM, G y 'й'. – MMM, G y 'й'. + + + d–d MMM, G y 'й'. + d MMM, G y 'й'. – d MMM, G y 'й'. + d MMM – d MMM, G y 'й'. + d MMM, G y 'й'. – d MMM, G y 'й'. + + + d MMM, E, G y 'й'. – d MMM, E, G y 'й'. + d MMM, E, G y 'й'. – d MMM, E, G y 'й'. + d MMM, E – d MMM, E, G y 'й'. + d MMM, E, G y 'й'. – d MMM, E, G y 'й'. + + + h a – h a + + + h:mm a – h:mm a + h:mm–h:mm a + h:mm–h:mm a + + + h:mm a – h:mm a v + h:mm–h:mm a v + h:mm–h:mm a v + + + h a – h a v + + + dd.MM – dd.MM + dd.MM – dd.MM + + + dd.MM, E – dd.MM, E + dd.MM, E – dd.MM, E + + + d–d MMM + d MMM – d MMM + + + d MMM, E – d MMM, E + d MMM, E – d MMM, E + + + MM.y – MM.y + MM.y – MM.y + + + dd.MM.y – dd.MM.y + dd.MM.y – dd.MM.y + dd.MM.y – dd.MM.y + + + dd.MM.y, E – dd.MM.y, E + dd.MM.y, E – dd.MM.y, E + dd.MM.y, E – dd.MM.y, E + + + MMM–MMM, y 'й'. + y 'й'., MMM – y 'й'., MMM + + + d–d MMM, y 'й'. + d MMM – d MMM, y 'й'. + d MMM, y 'й'. – d MMM, y 'й'. + + + d MMM, E – d MMM, E, y 'й'. + d MMM, E, – d MMM, E, y 'й'. + d MMM, E, y 'й'. – d MMM, E, y 'й'. + + + MMMM–MMMM, y 'й'. + MMMM, y 'й'. – MMMM, y 'й'. + + + + + + + + + тишрей + хешван + кислев + тевет + шват + адар I + адар + адар II + нисан + ияр + сиван + таммуз + ав + элул + + + тишрей + хешван + кислев + тевет + шват + адар I + адар + адар II + нисан + ияр + сиван + таммуз + ав + элул + + + + + тишрей + хешван + кислев + тевет + шват + адар I + адар + адар II + нисан + ияр + сиван + таммуз + ав + элул + + + тишрей + хешван + кислев + тевет + шват + адар I + адар + адар II + нисан + ияр + сиван + таммуз + ав + элул + + + + + + донъя яратылышынан + + + + + + + + Чайтра + Вайшакха + Джьештха + Ашадха + Сравана + Бхадра + Асвина + Картика + Аграхаяна + Пауша + Магха + Пхалгуна + + + Чайтра + Вайшакха + Джьештха + Ашадха + Сравана + Бхадра + Асвина + Картика + Аграхаяна + Пауша + Магха + Пхалгуна + + + + + Чайтра + Вайшакха + Джьештха + Ашадха + Сравана + Бхадра + Асвина + Картика + Аграхаяна + Пауша + Магха + Пхалгуна + + + Чайтра + Вайшакха + Джьештха + Ашадха + Сравана + Бхадра + Асвина + Картика + Аграхаяна + Пауша + Магха + Пхалгуна + + + + + + Сака + + + Сака + + + Сака + + + + + + + + мөх. + сәф. + раб. I + раб. II + йом. I + йом. II + рәж. + шәғ. + рам. + шәү. + зөлҡ. + зөлх. + + + мөхәррәм + сәфәр + рабиғүл әүүәл + рабиғүл ахыр + йомадиәл әүүәл + йомадиәл ахыр + рәжәб + шәғбан + рамаҙан + шәүүәл + зөлҡәғиҙә + зөлхизә + + + + + мөх. + сәф. + раб. I + раб. II + йом. I + йом. II + рәж. + шәғ. + рам. + шәү. + зөлҡ. + зөлх. + + + мөхәррәм + сәфәр + рабиғүл әүүәл + рабиғүл ахыр + йомадиәл әүүәл + йомадиәл ахыр + рәжәб + шәғбан + рамаҙан + шәүүәл + зөлҡәғиҙә + зөлхизә + + + + + + Һижрәттән һуң + Һижрәткә тиклем + + + + + + + Тайка (645–650) + Хакути (650–671) + Хакухо (672–686) + Сючё (686–701) + Тайхо (701–704) + Кэйун (704–708) + Вадо (708–715) + Рэйки (715–717) + Йоро (717–724) + Дзинки (724–729) + Тэмпьё (729–749) + Тэмпьё-кампо (749–749) + Тэмпьё-сёхо (749–757) + Тэмпьё-ходзи (757–765) + Тэмпьё-дзинго (765–767) + Дзинго-кэйун (767–770) + Хоки (770–780) + Тэн-о (781–782) + Энряку (782–806) + Дайдо (806–810) + Конин (810–824) + Тэнтё (824–834) + Дзёва (834–848) + Кадзё (848–851) + Ниндзю (851–854) + Сайко (854–857) + Тэн-ан (857–859) + Дзёган (859–877) + Гангё (877–885) + Нинна (885–889) + Кампё (889–898) + Сётай (898–901) + Энги (901–923) + Энтё (923–931) + Дзёхэй (931–938) + Тэнгё (938–947) + Тэнряку (947–957) + Тэнтоку (957–961) + Ова (961–964) + Кохо (964–968) + Анна (968–970) + Тэнроку (970–973) + Тэнъэн (973–976) + Дзёген (976–978) + Тэнгэн (978–983) + Эйкан (983–985) + Канна (985–987) + Эйэн (987–989) + Эйсо (989–990) + Сёряку (990–995) + Тётоку (995–999) + Тёхо (999–1004) + Канко (1004–1012) + Тёва (1012–1017) + Каннин (1017–1021) + Дзиан (1021–1024) + Мандзю (1024–1028) + Тёген (1028–1037) + Тёряку (1037–1040) + Тёкю (1040–1044) + Кантоку (1044–1046) + Эйсё (1046–1053) + Тэнги (1053–1058) + + + + + + + эра + + + эра + + + эра + + + йыл + былтыр + быйыл + киләһе йылда + + {0} йылдан + + + {0} йыл элек + + + + й. + былтыр + быйыл + киләһе йылда + + {0} йылдан + + + {0} йыл элек + + + + й. + былтыр + быйыл + киләһе йылда + + {0} йылдан + + + {0} йыл элек + + + + квартал + үткән кварталда + был кварталда + киләһе кварталда + + {0} кварталдан + + + {0} квартал элек + + + + кв. + үткән кв. + был кв. + киләһе кв. + + {0} кв. һуң + + + {0} кв. элек + + + + кв. + үткән кв. + был кв. + киләһе кв. + + {0} кв. һуң + + + {0} кв. элек + + + + ай + үткән айҙа + был айҙа + киләһе айҙа + + {0} айҙан + + + {0} ай элек + + + + ай + үткән айҙа + был айҙа + киләһе айҙа + + {0} айҙан + + + {0} ай элек + + + + ай + үткән айҙа + был айҙа + киләһе айҙа + + {0} айҙан + + + {0} ай элек + + + + аҙна + үткән аҙнала + был аҙнала + киләһе аҙнала + + {0} аҙнанан + + + {0} аҙна элек + + {0} аҙнаһында + + + аҙна + үткән аҙнала + был аҙнала + киләһе аҙнала + + {0} аҙнанан + + + {0} аҙн. элек + + {0} аҙнаһында + + + аҙна + үткән аҙнала + был аҙнала + киләһе аҙнала + + {0} аҙнанан + + + {0} аҙна элек + + {0} аҙнаһында + + + ай аҙнаһы + + + ай аҙн. + + + ай аҙн. + + + көн + кисә + бөгөн + иртәгә + + {0} көндән + + + {0} көн элек + + + + көн + кисә + бөгөн + иртәгә + + {0} көндән + + + {0} көн элек + + + + көн + кисә + бөгөн + иртәгә + + {0} көндән + + + {0} көн элек + + + + йыл көнө + + + йыл көнө + + + йыл көнө + + + аҙна көнө + + + аҙна көнө + + + аҙна көнө + + + айҙың аҙна көнө + + + айҙ. аҙн. к. + + + айҙ. аҙн. к. + + + үткән йәкшәмбелә + был йәкшәмбелә + киләһе йәкшәмбелә + + {0} йәкшәмбенән һуң + + + {0} йәкшәмбе элек + + + + үткән йәк. + был йәк. + киләһе йәк. + + {0} йәк. һуң + + + {0} йәк. элек + + + + үткән йш + был йш + киләһе йш + + {0} йш һуң + + + {0} йш элек + + + + үткән дүшәмбелә + был дүшәмбелә + киләһе дүшәмбелә + + {0} дүшәмбенән һуң + + + {0} дүшәмбе элек + + + + үткән дүш. + был дүш. + киләһе дүш. + + {0} дүш. һуң + + + {0} дүш. элек + + + + үткән дш + был дш + киләһе дш + + {0} дш һуң + + + {0} дш элек + + + + үткән шишәмбелә + был шишәмбелә + киләһе шишәмбелә + + {0} шишәмбенән һуң + + + {0} шишәмбелә элек + + + + үткән шиш. + был шиш. + киләһе шиш. + + {0} шиш. һуң + + + {0} шиш. элек + + + + үткән шш + был шш + киләһе шш + + {0} шш һуң + + + {0} шш элек + + + + үткән шаршамбыла + был шаршамбыла + киләһе шаршамбыла + + {0} шаршамбынан һуң + + + {0} шаршамбы элек + + + + үткән шар. + был шар. + киләһе шар. + + {0} шар. һуң + + + {0} шар. элек + + + + үткән шр + был шр + киләһе шр + + {0} шр һуң + + + {0} шр элек + + + + үткән кесаҙнала + был кесаҙнала + киләһе кесаҙнала + + {0} кесаҙнанан һуң + + + {0} кесаҙна элек + + + + үткән кес. + был кес. + киләһе кес. + + {0} кес. һуң + + + {0} кес. элек + + + + үткән кс + был кс + киләһе кс + + {0} кс һуң + + + {0} кс элек + + + + үткән йомала + был йомала + киләһе йомала + + {0} йоманан һуң + + + {0} йома элек + + + + үткән йом. + был йом. + киләһе йом. + + {0} йом. һуң + + + {0} йом. элек + + + + үткән йм + был йм + киләһе йм + + {0} йм һуң + + + {0} йм элек + + + + үткән шәмбелә + был шәмбелә + киләһе шәмбелә + + {0} шәмбенән һуң + + + {0} шәмбе элек + + + + үткән шәм. + был шәм. + киләһе шәм. + + {0} шәм. һуң + + + {0} шәм. элек + + + + үткән шб + был шб + киләһе шб + + {0} шб һуң + + + {0} шб элек + + + + AM/PM + + + AM/PM + + + AM/PM + + + сәғәт + был сәғәттә + + {0} сәғәттән + + + {0} сәғәт элек + + + + сәғ. + был сәғәттә + + {0} сәғәттән + + + {0} сәғ. элек + + + + сәғ + был сәғәттә + + {0} сәғәттән + + + {0} сәғ. элек + + + + минут + был минутта + + {0} минуттан + + + {0} минут элек + + + + мин. + был минутта + + {0} минуттан + + + {0} мин. элек + + + + мин + был минутта + + {0} минуттан + + + {0} мин. элек + + + + секунд + хәҙер + + {0} секундтан + + + {0} секунд элек + + + + сек. + хәҙер + + {0} секундтан + + + {0} сек. элек + + + + сек + хәҙер + + {0} секундтан + + + {0} сек. элек + + + + сәғәт бүлкәте + + + бүлкәт + + + бүлкәт + + + + {0} ваҡыты + {0} йәйге ваҡыты + {0} стандарт ваҡыты + + + Координацияланған универсаль ваҡыт + + + + Билдәһеҙ урын + + + Андорра + + + Дубай + + + Кабул + + + Антигуа + + + Ангилья + + + Тирана + + + Ереван + + + Луанда + + + Ротера станцияһы + + + Палмер + + + Тролль станцияһы + + + Сёва станцияһы + + + Моусон станцияһы + + + Дейвис + + + Восток станцияһы + + + Кейси станцияһы + + + Дюмон-д’Юрвиль станцияһы + + + Мак-Мердо станцияһы + + + Рио-Гальегос + + + Мендоса + + + Сан-Хуан + + + Ушуая + + + Ла-Риоха + + + Сан-Луис + + + Катамарка + + + Сальта + + + Жужуй + + + Тукуман + + + Кордова + + + Буэнос-Айрес + + + Паго-Паго + + + Вена + + + Перт + + + Юкла + + + Дарвин + + + Аделаида + + + Брокен-Хилл + + + Мельбурн + + + Хобарт + + + Линдеман + + + Сидней + + + Брисбен + + + Маккуори утрауы + + + Лорд-Хау утрауы + + + Аруба + + + Мариехамн + + + Баҡы + + + Сараево + + + Барбадос + + + Дакка + + + Брюссель + + + Уагадугу + + + София + + + Бәхрәйн + + + Бужумбура + + + Порто-Ново + + + Сен-Бартелеми + + + Бермуд + + + Бруней + + + Ла-Пас + + + Кралендейк + + + Эйрунепе + + + Риу-Бранку + + + Порту-Велью + + + Боа-Виста + + + Манаус + + + Куяба + + + Сантарен + + + Кампу-Гранди + + + Белен + + + Арагуаина + + + Сан-Паулу + + + Баия + + + Форталеза + + + Масейо + + + Ресифи + + + Фернанду-ди-Норонья + + + Нассау + + + Тхимпху + + + Габороне + + + Минск + + + Белиз + + + Доусон + + + Уайтхорс + + + Инувик + + + Ванкувер + + + Форт Нельсон + + + Доусон-Крик + + + Крестон + + + Эдмонтон + + + Свифт-Керрент + + + Кеймбридж-Бей + + + Регина + + + Виннипег + + + Резольют + + + Ранкин-Инлет + + + Атикокан + + + Торонто + + + Икалуит + + + Монктон + + + Галифакс + + + Гус-Бей + + + Глейс-Бей + + + Блан-Саблон + + + Сент-Джонс + + + Кокос утрауҙары + + + Киншаса + + + Лубумбаши + + + Банги + + + Браззавиль + + + Цюрих + + + Абиджан + + + Раротонга + + + Пасха утрауы + + + Койхайке + + + Пунта-Аренас + + + Сантьяго + + + Дуала + + + Өрөмсө + + + Шанхай + + + Богота + + + Коста-Рика + + + Гавана + + + Кабо-Верде + + + Кюрасао + + + Раштыуа утрауы + + + Никосия + + + Фамагуста + + + Прага + + + Бүзинген + + + Берлин + + + Джибути + + + Копенгаген + + + Доминика + + + Санто-Доминго + + + Алжир + + + Галапагос утрауҙары + + + Гуаякиль + + + Таллин + + + Ҡаһирә + + + Эль-Аюн + + + Асмэра + + + Канар утрауҙары + + + Сеута + + + Мадрид + + + Аддис-Абеба + + + Хельсинки + + + Фиджи + + + Стэнли + + + Трук + + + Понпеи + + + Косрае + + + Фарер утрауҙары + + + Париж + + + Либревиль + + + + Бөйөк Британия йәйге ваҡыты + + Лондон + + + Гренада + + + Тбилиси + + + Кайенна + + + Гернси + + + Аккра + + + Гибралтар + + + Туле + + + Нуук + + + Скорсбисунн + + + Денмарксхавн + + + Банжул + + + Конакри + + + Гваделупа + + + Малабо + + + Афина + + + Көньяҡ Георгия + + + Гватемала + + + Гуам + + + Бисау + + + Гайана + + + Гонконг + + + Тегусигальпа + + + Загреб + + + Порт-о-Пренс + + + Будапешт + + + Джакарта + + + Понтианак + + + Макасар + + + Джаяпура + + + + Ирландия стандарт ваҡыты + + Дублин + + + Иерусалим + + + Мэн утрауы + + + Калькутта + + + Чагос + + + Бағдад + + + Тәһран + + + Рейкьявик + + + Рим + + + Джерси + + + Ямайка + + + Амман + + + Токио + + + Найроби + + + Бешкәк + + + Пномпень + + + Кантон утрауы + + + Киритимати + + + Тарава + + + Комор утрауҙары + + + Сент-Китс + + + Пхеньян + + + Сеул + + + Кувейт + + + Кайман утрауҙары + + + Аҡтау + + + Уральск + + + Атырау + + + Аҡтүбә + + + Ҡостанай + + + Ҡыҙылурҙа + + + Алматы + + + Вьентьян + + + Бейрут + + + Сент-Люсия + + + Вадуц + + + Коломбо + + + Монровия + + + Масеру + + + Вильнюс + + + Люксембург + + + Рига + + + Триполи + + + Касабланка + + + Монако + + + Кишинев + + + Подгорица + + + Мариго + + + Антананариву + + + Кваджалейн + + + Маджуро + + + Скопье + + + Бамако + + + Янгон + + + Ховд + + + Улан-Батор + + + Макао + + + Сайпан + + + Мартиника + + + Нуакшот + + + Монтсеррат + + + Мальта + + + Маврикий + + + Мальдив утрауҙары + + + Блантайр + + + Тихуана + + + Эрмосильо + + + Сьюдад-Хуарес + + + Масатлан + + + Чиуауа + + + Баия-де-Бандерас + + + Охинага + + + Монтеррей + + + Мехико + + + Матаморос + + + Мерида + + + Канкун + + + Куала-Лумпур + + + Кучинг + + + Мапуту + + + Виндхук + + + Нумеа + + + Ниамей + + + Норфолк утрауы + + + Лагос + + + Манагуа + + + Амстердам + + + Осло + + + Катманду + + + Науру + + + Ниуэ + + + Чатем утрауҙары + + + Окленд + + + Маскат + + + Панама + + + Лима + + + Таити + + + Маркиз утрауҙары + + + Гамбье утрауҙары + + + Порт-Морсби + + + Бугенвиль + + + Манила + + + Карачи + + + Варшава + + + Сен-Пьер + + + Питкэрн утрауҙары + + + Пуэрто-Рико + + + Газа + + + Хеврон + + + Азор утрауҙары + + + Мадейра + + + Лиссабон + + + Палау + + + Асунсьон + + + Катар + + + Реюньон + + + Бухарест + + + Белград + + + Калининград + + + Мәскәү + + + Волгоград + + + Һарытау + + + Әстерхан + + + Ульяновск + + + Киров + + + Һамар + + + Екатеринбург + + + Омск + + + Новосибирск + + + Барнаул + + + Томск + + + Новокузнецк + + + Красноярск + + + Иркутск + + + Чита + + + Якутск + + + Владивосток + + + Хандыга + + + Сахалин + + + Усть-Нера + + + Магадан + + + Среднеколымск + + + Камчатка + + + Анадырь + + + Кигали + + + Эр-Рияд + + + Гуадалканал + + + Маэ + + + Хартум + + + Стокгольм + + + Сингапур + + + Изге Елена утрауы + + + Любляна + + + Лонгйир + + + Братислава + + + Фритаун + + + Сан-Марино + + + Дакар + + + Могадишо + + + Парамарибо + + + Джуба + + + Сан-Томе + + + Сальвадор + + + Лоуэр-Принс-Куотер + + + Дәмәшк + + + Мбабане + + + Гранд-Терк + + + Нджамена + + + Кергулен утрауҙары + + + Ломе + + + Бангкок + + + Дүшәнбе + + + Факаофо + + + Дили + + + Ашхабад + + + Тунис + + + Тонгатапу + + + Истанбул + + + Порт-оф-Спейн + + + Фунафути + + + Тайпей + + + Дар-эс-Салам + + + Киев + + + Симферополь + + + Кампала + + + Мидуэй атоллы + + + Уэйк утрауы + + + Адак + + + Ном + + + Анкоридж + + + Якутат + + + Ситка + + + Джуно + + + Метлакатла + + + Лос-Анджелес + + + Бойсе + + + Финикс + + + Денвер + + + Бойла, Төньяҡ Дакота + + + Нью-Салем, Төньяк Дакота + + + Үҙәк, Төньяҡ Дакота + + + Чикаго + + + Меномини + + + Винсеннес, Индиана + + + Питерсберг, Индиана + + + Телл-Сити + + + Нокс, Индиана + + + Уинамак, Индиана + + + Маренго, Индиана + + + Индианаполис + + + Луисвилл + + + Вевей, Индиана + + + Монтиселло, Кентукки + + + Детройт + + + Нью-Йорк + + + Монтевидео + + + Сәмәрҡәнд + + + Ташкент + + + Ватикан + + + Сент-Винсент + + + Каракас + + + Тортола + + + Сент-Томас + + + Хошимин + + + Эфате + + + Уоллис һәм Футуна + + + Апиа + + + Аден + + + Майотта + + + Йоханнесбург + + + Лусака + + + Хараре + + + + Акри ваҡыты + Акри стандарт ваҡыты + Акри йәйге ваҡыты + + + + + Афғанстан ваҡыты + + + + + Үҙәк Африка ваҡыты + + + + + Көнсығыш Африка ваҡыты + + + + + Көньяҡ Африка стандарт ваҡыты + + + + + Көнбайыш Африка ваҡыты + + + + + Аляска ваҡыты + Аляска стандарт ваҡыты + Аляска йәйге ваҡыты + + + AKT + AKST + AKST + + + + + Алматы ваҡыты + Алматы стандарт ваҡыты + Алматы йәйге ваҡыты + + + + + Амазон ваҡыты + Амазон стандарт ваҡыты + Амазон йәйге ваҡыты + + + + + Үҙәк Америка ваҡыты + Үҙәк Америка стандарт ваҡыты + Үҙәк Америка йәйге ваҡыты + + + CT + CST + CDT + + + + + Көнсығыш Америка ваҡыты + Көнсығыш Америка стандарт ваҡыты + Көнсығыш Америка йәйге ваҡыты + + + ET + EST + EDT + + + + + Төньяҡ Америка Тау ваҡыты + Төньяҡ Америка Тау стандарт ваҡыты + Төньяҡ Америка Тау йәйге ваҡыты + + + MT + MST + MDT + + + + + Тымыҡ океан ваҡыты + Тымыҡ океан стандарт ваҡыты + Тымыҡ океан йәйге ваҡыты + + + PT + PST + PDT + + + + + Анадырь ваҡыты + Анадырь стандарт ваҡыты + Анадырь йәйге ваҡыты + + + + + Самоа ваҡыты + Самоа стандарт ваҡыты + Самоа йәйге ваҡыты + + + + + Аҡтау ваҡыты + Аҡтау стандарт ваҡыты + Аҡтау йәйге ваҡыты + + + + + Аҡтүбә ваҡыты + Аҡтүбә стандарт ваҡыты + Аҡтүбә йәйге ваҡыты + + + + + Сәғүд Ғәрәбстаны ваҡыты + Сәғүд Ғәрәбстаны стандарт ваҡыты + Сәғүд Ғәрәбстаны йәйге ваҡыты + + + + + Аргентина ваҡыты + Аргентина стандарт ваҡыты + Аргентина йәйге ваҡыты + + + + + Көнбайыш Аргентина ваҡыты + Көнбайыш Аргентина стандарт ваҡыты + Көнбайыш Аргентина йәйге ваҡыты + + + + + Әрмәнстан ваҡыты + Әрмәнстан стандарт ваҡыты + Әрмәнстан йәйге ваҡыты + + + + + Атлантик ваҡыты + Атлантик стандарт ваҡыты + Атлантик йәйге ваҡыты + + + + + Үҙәк Австралия ваҡыты + Үҙәк Австралия стандарт ваҡыты + Үҙәк Австралия йәйге ваҡыты + + + + + Үҙәк Австралия көнбайыш ваҡыты + Үҙәк Австралия көнбайыш стандарт ваҡыты + Үҙәк Австралия көнбайыш йәйге ваҡыты + + + + + Көнсығыш Австралия ваҡыты + Көнсығыш Австралия стандарт ваҡыты + Көнсығыш Австралия йәйге ваҡыты + + + + + Көнбайыш Австралия ваҡыты + Көнбайыш Австралия стандарт ваҡыты + Көнбайыш Австралия йәйге ваҡыты + + + + + Әзербайжан ваҡыты + Әзербайжан стандарт ваҡыты + Әзербайжан йәйге ваҡыты + + + + + Азор утрауҙары ваҡыты + Азор утрауҙары стандарт ваҡыты + Азор утрауҙары йәйге ваҡыты + + + + + Бангладеш ваҡыты + Бангладеш стандарт ваҡыты + Бангладеш йәйге ваҡыты + + + + + Бутан ваҡыты + + + + + Боливия ваҡыты + + + + + Бразилия ваҡыты + Бразилия стандарт ваҡыты + Бразилия йәйге ваҡыты + + + + + Бруней ваҡыты + + + + + Кабо-Верде ваҡыты + Кабо-Верде стандарт ваҡыты + Кабо-Верде йәйге ваҡыты + + + + + Кейси ваҡыты + + + + + Чаморро стандарт ваҡыты + + + + + Чатем ваҡыты + Чатем стандарт ваҡыты + Чатем йәйге ваҡыты + + + + + Чили ваҡыты + Чили стандарт ваҡыты + Чили йәйге ваҡыты + + + + + Ҡытай ваҡыты + Ҡытай стандарт ваҡыты + Ҡытай йәйге ваҡыты + + + + + Раштыуа утрауы ваҡыты + + + + + Кокос утрауҙары ваҡыты + + + + + Колумбия ваҡыты + Колумбия стандарт ваҡыты + Колумбия йәйге ваҡыты + + + + + Кук утрауҙары ваҡыты + Кук утрауҙары стандарт ваҡыты + Кук утрауҙары йәйге ваҡыты + + + + + Куба ваҡыты + Куба стандарт ваҡыты + Куба йәйге ваҡыты + + + + + Дейвис ваҡыты + + + + + Дюмон-д’Юрвиль ваҡыты + + + + + Көнсығыш Тимор ваҡыты + + + + + Пасха утрауы ваҡыты + Пасха утрауы стандарт ваҡыты + Пасха утрауы йәйге ваҡыты + + + + + Эквадор ваҡыты + + + + + Үҙәк Европа ваҡыты + Үҙәк Европа стандарт ваҡыты + Үҙәк Европа йәйге ваҡыты + + + + + Көнсығыш Европа ваҡыты + Көнсығыш Европа стандарт ваҡыты + Көнсығыш Европа йәйге ваҡыты + + + + + Мәскәү ваҡыты + + + + + Көнбайыш Европа ваҡыты + Көнбайыш Европа стандарт ваҡыты + Көнбайыш Европа йәйге ваҡыты + + + + + Фолкленд утрауҙары ваҡыты + Фолкленд утрауҙары стандарт ваҡыты + Фолкленд утрауҙары йәйге ваҡыты + + + + + Фиджи ваҡыты + Фиджи стандарт ваҡыты + Фиджи йәйге ваҡыты + + + + + Француз Гвианаһы ваҡыты + + + + + Француз Көньяҡ һәм Антарктика ваҡыты + + + + + Галапагос ваҡыты + + + + + Гамбье ваҡыты + + + + + Грузия ваҡыты + Грузия стандарт ваҡыты + Грузия йәйге ваҡыты + + + + + Гилберт утрауҙары ваҡыты + + + + + Гринвич буйынса уртаса ваҡыт + + + + + Гренландия ваҡыты + Гренландия стандарт ваҡыты + Гренландия йәйге ваҡыты + + + + + Көнсығыш Гренландия ваҡыты + Көнсығыш Гренландия стандарт ваҡыты + Көнсығыш Гренландия йәйге ваҡыты + + + + + Көнбайыш Гренландия ваҡыты + Көнбайыш Гренландия стандарт ваҡыты + Көнбайыш Гренландия йәйге ваҡыты + + + + + Гуам стандарт ваҡыты + + + + + Фарсы ҡултығы стандарт ваҡыты + + + + + Гайана ваҡыты + + + + + Гавай-Алеут стандарт ваҡыты + + + + + Гавай-Алеут ваҡыты + Гавай-Алеут стандарт ваҡыты + Гавай-Алеут йәйге ваҡыты + + + + + Гонконг ваҡыты + Гонконг стандарт ваҡыты + Гонконг йәйге ваҡыты + + + + + Ховд ваҡыты + Ховд стандарт ваҡыты + Ховд йәйге ваҡыты + + + + + Һиндостан стандарт ваҡыты + + + + + Һинд океаны ваҡыты + + + + + Һинд-Ҡытай ваҡыты + + + + + Үҙәк Индонезия ваҡыты + + + + + Көнсығыш Индонезия + + + + + Көнбайыш Индонезия + + + + + Иран ваҡыты + Иран стандарт ваҡыты + Иран йәйге ваҡыты + + + + + Иркутск ваҡыты + Иркутск стандарт ваҡыты + Иркутск йәйге ваҡыты + + + + + Израиль ваҡыты + Израиль стандарт ваҡыты + Израиль йәйге ваҡыты + + + + + Япония ваҡыты + Япония стандарт ваҡыты + Япония йәйге ваҡыты + + + + + Камчатка ваҡыты + Камчатка стандарт ваҡыты + Камчатка йәйге ваҡыты + + + + + Ҡаҙағстан ваҡыты + + + + + Көнсығыш Ҡаҙағстан ваҡыты + + + + + Көнбайыш Ҡаҙағстан ваҡыты + + + + + Корея ваҡыты + Корея стандарт ваҡыты + Корея йәйге ваҡыты + + + + + Косрае ваҡыты + + + + + Красноярск ваҡыты + Красноярск стандарт ваҡыты + Красноярск йәйге ваҡыты + + + + + Ҡырғыҙстан ваҡыты + + + + + Ланка ваҡыты + + + + + Лайн утрауҙары ваҡыты + + + + + Лорд-Хау ваҡыты + Лорд-Хау стандарт ваҡыты + Лорд-Хау йәйге ваҡыты + + + + + Макао ваҡыты + Макао стандарт ваҡыты + Макао йәйге ваҡыты + + + + + Магадан ваҡыты + Магадан стандарт ваҡыты + Магадан йәйге ваҡыты + + + + + Малайзия ваҡыты + + + + + Мальдив утрауҙары ваҡыты + + + + + Маркиз утрауҙары ваҡыты + + + + + Маршалл Утрауҙары ваҡыты + + + + + Маврикий ваҡыты + Маврикий стандарт ваҡыты + Маврикий йәйге ваҡыты + + + + + Моусон ваҡыты + + + + + Мексика Тымыҡ океан ваҡыты + Мексика Тымыҡ океан стандарт ваҡыты + Мексика Тымыҡ океан йәйге ваҡыты + + + + + Улан-Батор ваҡыты + Улан-Батор стандарт ваҡыты + Улан-Батор йәйге ваҡыты + + + + + Мәскәү ваҡыты + Мәскәү стандарт ваҡыты + Мәскәү йәйге ваҡыты + + + + + Мьянма ваҡыты + + + + + Науру ваҡыты + + + + + Непал ваҡыты + + + + + Яңы Каледония ваҡыты + Яңы Каледония стандарт ваҡыты + Яңы Каледония йәйге ваҡыты + + + + + Яңы Зеландия ваҡыты + Яңы Зеландия стандарт ваҡыты + Яңы Зеландия йәйге ваҡыты + + + + + Ньюфаундленд ваҡыты + Ньюфаундленд стандарт ваҡыты + Ньюфаундленд йәйге ваҡыты + + + + + Ниуэ ваҡыты + + + + + Норфолк ваҡыты + Норфолк стандарт ваҡыты + Норфолк йәйге ваҡыты + + + + + Фернанду-ди-Норонья ваҡыты + Фернанду-ди-Норонья стандарт ваҡыты + Фернанду-ди-Норонья йәйге ваҡыты + + + + + Новосибирск ваҡыты + Новосибирск стандарт ваҡыты + Новосибирск йәйге ваҡыты + + + + + Омск ваҡыты + Омск стандарт ваҡыты + Омск йәйге ваҡыты + + + + + Пакистан ваҡыты + Пакистан стандарт ваҡыты + Пакистан йәйге ваҡыты + + + + + Палау ваҡыты + + + + + Папуа – Яңы Гвинея + + + + + Парагвай ваҡыты + Парагвай стандарт ваҡыты + Парагвай йәйге ваҡыты + + + + + Перу ваҡыты + Перу стандарт ваҡыты + Перу йәйге ваҡыты + + + + + Филиппин ваҡыты + Филиппин стандарт ваҡыты + Филиппин йәйге ваҡыты + + + + + Феникс утрауҙары ваҡыты + + + + + Сен-Пьер һәм Микелон ваҡыты + Сен-Пьер һәм Микелон стандарт ваҡыты + Сен-Пьер һәм Микелон йәйге ваҡыты + + + + + Питкэрн ваҡыты + + + + + Понпеи ваҡыты + + + + + Төньяҡ Корея ваҡыты + + + + + Ҡыҙылурҙа ваҡыты + Ҡыҙылурҙа стандарт ваҡыты + Ҡыҙылурҙа йәйге ваҡыты + + + + + Реюньон ваҡыты + + + + + Ротера ваҡыты + + + + + Сахалин ваҡыты + Сахалин стандарт ваҡыты + Сахалин йәйге ваҡыты + + + + + Һамар ваҡыты + Һамар стандарт ваҡыты + Һамар йәйге ваҡыты + + + + + Америка Самоаһы ваҡыты + Америка Самоаһы стандарт ваҡыты + Америка Самоаһы йәйге ваҡыты + + + + + Сейшел утрауҙары ваҡыты + + + + + Сингапур стандарт ваҡыты + + + + + Соломон утрауҙары ваҡыты + + + + + Көньяҡ Георгия ваҡыты + + + + + Суринам ваҡыты + + + + + Сёва ваҡыты + + + + + Таити ваҡыты + + + + + Тайвань ваҡыты + Тайвань стандарт ваҡыты + Тайвань йәйге ваҡыты + + + + + Тажикстан ваҡыты + + + + + Токелау ваҡыты + + + + + Тонга ваҡыты + Тонга стандарт ваҡыты + Тонга йәйге ваҡыты + + + + + Чуук ваҡыты + + + + + Төркмәнстан ваҡыты + Төркмәнстан стандарт ваҡыты + Төркмәнстан йәйге ваҡыты + + + + + Тувалу ваҡыты + + + + + Уругвай ваҡыты + Уругвай стандарт ваҡыты + Уругвай йәйге ваҡыты + + + + + Үзбәкстан ваҡыты + Үзбәкстан стандарт ваҡыты + Үзбәкстан йәйге ваҡыты + + + + + Вануату ваҡыты + Вануату стандарт ваҡыты + Вануату йәйге ваҡыты + + + + + Венесуэла ваҡыты + + + + + Владивосток ваҡыты + Владивосток стандарт ваҡыты + Владивосток йәйге ваҡыты + + + + + Волгоград ваҡыты + Волгоград стандарт ваҡыты + Волгоград йәйге ваҡыты + + + + + Восток ваҡыты + + + + + Уэйк утрауы ваҡыты + + + + + Уоллис һәм Футуна ваҡыты + + + + + Якутск ваҡыты + Якутск стандарт ваҡыты + Якутск йәйге ваҡыты + + + + + Екатеринбург ваҡыты + Екатеринбург стандарт ваҡыты + Екатеринбург йәйге ваҡыты + + + + + Юкон ваҡыты + + + + + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + +   + + + + + 0 мең + 00 мең + 000 мең + 0 миллион + 00 миллион + 000 миллион + 0 миллиард + 00 миллиард + 000 миллиард + 0 триллион + 00 триллион + 000 триллион + + + + + 0 мең + 00 мең + 000 мең + 0 млн + 00 млн + 000 млн + 0 млрд + 00 млрд + 000 млрд + 0 трлн + 00 трлн + 000 трлн + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 ¤ + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + + + + + + Андорра песетаһы + Андорра песетаһы + + + Берләшкән Ғәрәп Әмирлектәре дирһәме + Берләшкән Ғәрәп Әмирлектәре дирһамы + + + Афған афғаниһы (1927–2002) + Афған афғаниһы (1927–2002) + + + Афған афғаниһы + Афған афғаниһы + + + Албания лекы (1946–1965) + Албания лекы (1946–1965) + + + Албания лекы + Албания лекы + + + Әрмән драмы + Әрмән драмы + + + Нидерланд Антил гульдены + Нидерланд Антил гульдены + + + Ангола кванзаһы + Ангола кванзаһы + + + Ангола кванзаһы (1977–1991) + Ангола кванзаһы (1977–1991) + + + Ангола яңы кванзаһы (1990–2000) + Ангола яңы кванзаһы (1990–2000) + + + Ангола көйләнгән кванзаһы (1995–1999) + Ангола көйләнгән кванзаһы (1995–1999) + + + Аргентина аустралы + Аргентина аустралы + + + Аргентина песоһы (1970–1983) + Аргентина песоһы (1970–1983) + + + Аргентина песоһы (1881–1970) + Аргентина песоһы (1881–1970) + + + Аргентина песоһы (1983–1985) + Аргентина песоһы (1983–1985) + + + Аргентина песоһы + Аргентина песоһы + + + Австрия шиллингы + Австрия шиллингы + + + Австралия доллары + Австралия доллары + + + Аруба флорины + Аруба флорины + + + Әзербайжан манаты (1993–2006) + Әзербайжан манаты (1993–2006) + + + Әзербайжан манаты + Әзербайжан манаты + + + Босния һәм Герцеговина динары (1992–1994) + Босния һәм Герцеговина динары (1992–1994) + + + Босния һәм Герцеговина алмашынмалы маркаһы + Босния һәм Герцеговина алмашынмалы маркаһы + + + Босния һәм Герцеговина яңы динары (1994–1997) + Босния һәм Герцеговина яңы динары (1994–1997) + + + Барбадос доллары + Барбадос доллары + + + Бангладеш такаһы + Бангладеш такаһы + + + Бельгия франкы (алмашынмалы) + Бельгия франкы (алмашынмалы) + + + Бельгия франкы + Бельгия франкы + + + Бельгия франкы (финанс) + Бельгия франкы (финанс) + + + Болгар ҡаты левы + Болгар ҡаты левы + + + Болгар социалистик левы + Болгар социалистик левы + + + Болгария левы + Болгария левы + + + Болгар левы (1879–1952) + Болгар левы (1879–1952) + + + Бәхрәйн динары + Бәхрәйн динары + + + Бурунди франкы + Бурунди франкы + + + Бермуд доллары + Бермуд доллары + + + Бруней доллары + Бруней доллары + + + Боливия боливианоһы + Боливия боливианоһы + + + Боливия боливианоһы (1863–1963) + Боливия боливианоһы (1863–1963) + + + Боливия песоһы + Боливия песоһы + + + Боливия мвдолы + Боливия мвдолы + + + Бразилия яңы крузейроһы (1967–1986) + Бразилия яңы крузейроһы (1967–1986) + + + Бразилия крузадоһы (1986–1989) + Бразилия крузадоһы (1986–1989) + + + Бразилия крузейроһы (1990–1993) + Бразилия крузейроһы (1990–1993) + + + Бразилия реалы + Бразилия реалы + + + Бразилия яңы крузадоһы (1989–1990) + Бразилия яңы крузадоһы (1989–1990) + + + Бразилия крузейроһы (1993–1994) + Бразилия крузейроһы (1993–1994) + + + Бразилия крузейроһы (1942–1967) + Бразилия крузейроһы (1942–1967) + + + Багам доллары + Багам доллары + + + Бутан нгултрумы + Бутан нгултрумы + + + Бирма кьяты + Бирма кьяты + + + Ботсвана пулаһы + Ботсвана пулаһы + + + Беларусь рубле (1994–1999) + Беларусь рубле (1994–1999) + + + Беларусь рубле + Беларусь рубле + + + Беларусь рубле (2000–2016) + Беларусь рубле (2000–2016) + + + Белиз доллары + Белиз доллары + + + Канада доллары + Канада доллары + + + Конго франкы + Конго франкы + + + WIR евроһы + WIR евроһы + + + Швейцария франкы + Швейцария франкы + + + WIR франкы + WIR франкы + + + Чили эскудоһы + Чили эскудоһы + + + Чили иҫәп берәмеге (UF) + Чили иҫәп берәмеге (UF) + + + Чили песоһы + Чили песоһы + + + Ҡытай юане (офшор) + Ҡытай юане (офшор) + + + Ҡытай Халыҡ Банкы доллары + Ҡытай Халыҡ Банкы доллары + + + Ҡытай юане + Ҡытай юане + + + Колумбия песоһы + Колумбия песоһы + + + Колумбия реаль хаҡ берәмеге + Колумбия реаль хаҡ берәмеге + + + Коста-Рика колоны + Коста-Рика колоны + + + Сербия динары (2002–2006) + Сербия динары (2002–2006) + + + Чехословакия ҡаты кронаһы + Чехословакия ҡаты кронаһы + + + Куба алмашынмалы песоһы + Куба алмашынмалы песоһы + + + Куба песоһы + Куба песоһы + + + Кабо-Верде эскудоһы + Кабо-Верде эскудоһы + + + Кипр фунты + Кипр фунты + + + Чехия кронаһы + Чехия кронаһы + + + Көнсығыш Германия маркаһы + Көнсығыш Германия маркаһы + + + Германия маркаһы + Германия маркаһы + + + Джибути франкы + Джибути франкы + + + Дания кронаһы + Дания кронаһы + + + Доминикан песоһы + Доминикан песоһы + + + Алжир динары + Алжир динары + + + Эквадор сукреһы + Эквадор сукреһы + + + Эквадор даими хаҡ берәмеге + Эквадор даими хаҡ берәмеге + + + Эстония кронаһы + Эстония кронаһы + + + Мысыр фунты + Мысыр фунты + + + Эритрея накфаһы + Эритрея накфаһы + + + Испания песетаһы (A иҫәбе) + Испания песетаһы (A иҫәбе) + + + Испания песетаһы (алмашынмалы иҫәп) + Испания песетаһы (алмашынмалы иҫәп) + + + Испания песетаһы + Испания песетаһы + + + Эфиопия быры + Эфиопия быры + + + Евро + Евро + + + Финляндия маркаһы + Финляндия маркаһы + + + Фиджи доллары + Фиджи доллары + + + Фолкленд утрауҙары фунты + Фолкленд утрауҙары фунты + + + Франция франкы + Франция франкы + + + Британия фунт стерлингы + Британия фунт стерлингы + + + Грузия купон лариты + Грузия купон лариты + + + Грузия лариһы + Грузия лариһы + + + Гана седиһы (1979–2007) + Гана седиһы (1979–2007) + + + Гана седиһы + Гана седиһы + + + Гибралтар фунты + Гибралтар фунты + + + Гамбия даласиһы + Гамбия даласиһы + + + Гвинея франкы + Гвинея франкы + + + Гвинея силиһы + Гвинея силиһы + + + Экваториаль Гвинея эквелеһы + Экваториаль Гвинея эквелеһы + + + Греция драхмаһы + Греция драхмаһы + + + Гватемала кетсале + Гватемала кетсале + + + Португал Гвинея эскудоһы + Португал Гвинея эскудоһы + + + Гвинея-Бисау песоһы + Гвинея-Бисау песоһы + + + Гайана доллары + Гайана доллары + + + Гонконг доллары + Гонконг доллары + + + Гондурас лемпираһы + Гондурас лемпираһы + + + Хорватия динары + Хорватия динары + + + Хорватия кунаһы + Хорватия кунаһы + + + Гаити гурды + Гаити гурды + + + Венгрия форинты + Венгрия форинты + + + Индонезия рупияһы + Индонезия рупияһы + + + Ирландия фунты + Ирландия фунты + + + Израиль фунты + Израиль фунты + + + Израиль шекеле (1980–1985) + Израиль шекеле (1980–1985) + + + Израиль яңы шекеле + Израиль яңы шекеле + + + Һиндостан рупияһы + Һиндостан рупияһы + + + Ираҡ динары + Ираҡ динары + + + Иран риалы + Иран риалы + + + Исландия кронаһы (1918–1981) + Исландия кронаһы (1918–1981) + + + Исландия кронаһы + Исландия кронаһы + + + Италия лираһы + Италия лираһы + + + Ямайка доллары + Ямайка доллары + + + Иордания динары + Иордания динары + + + Япон иенаһы + Япон иенаһы + + + Кения шиллингы + Кения шиллингы + + + Ҡырғыҙстан һумы + Ҡырғыҙстан сомы + + + Камбоджа риеле + Камбоджа риеле + + + Комор франкы + Комор франкы + + + Төньяҡ Корея воны + Төньяҡ Корея воны + + + Көньяҡ Корея хваны (1953–1962) + Көньяҡ Корея хваны (1953–1962) + + + Көньяҡ Корея воны (1945–1953) + Көньяҡ Корея воны (1945–1953) + + + Көньяҡ Корея воны + Көньяҡ Корея воны + + + Кувейт динары + Кувейт динары + + + Кайман утрауҙары доллары + Кайман утрауҙары доллары + + + Ҡаҙағстан тәңкәһе + Ҡаҙағстан тәңкәһе + + + Лаос кипы + Лаос кипы + + + Ливан фунты + Ливан фунты + + + Шри-Ланка рупияһы + Шри-Ланка рупияһы + + + Либерия доллары + Либерия доллары + + + Лесото лотиһы + Лесото лотиһы + + + Латвия литы + Латвия литы + + + Литва талоны + Литва талоны + + + Люксембург алмашынмалы франкы + Люксембург алмашынмалы франкы + + + Люксембург франкы + Люксембург франкы + + + Люксембург финанс франкы + Люксембург финанс франкы + + + Латвия латы + Латвия латы + + + Латвия рубле + Латвия рубле + + + Ливия динары + Ливия динары + + + Марокко дирһәме + Марокко дирһәме + + + Марокко франкы + Марокко франкы + + + Монако франкы + Монако франкы + + + Молдова купоны + Молдова купоны + + + Молдова лейе + Молдова лейе + + + Мадагаскар ариариһы + Мадагаскар ариариһы + + + Мадагаскар франкы + Мадагаскар франкы + + + Македония денары + Македония денары + + + Македония денары (1992–1993) + Македония денары (1992–1993) + + + Мали франкы + Мали франкы + + + Мьянма кьяты + Мьянма кьяты + + + Монголия тугригы + Монголия тугригы + + + Макао патакаһы + Макао патакаһы + + + Мавритания угияһы (1973–2017) + Мавритания угияһы (1973–2017) + + + Мавритания угияһы + Мавритания угияһы + + + Мальта лираһы + Мальта лираһы + + + Мальта фунты + Мальта фунты + + + Маврикий рупияһы + Маврикий рупияһы + + + Мальдив рупияһы (1947–1981) + Мальдив рупияһы (1947–1981) + + + Мальдив руфияһы + Мальдив руфияһы + + + Малави квачаһы + Малави квачаһы + + + Мексика песоһы + Мексика песоһы + + + Мексика көмөш песоһы (1861–1992) + Мексика көмөш песоһы (1861–1992) + + + Мексика инвестиция берәмеге + Мексика инвестиция берәмеге + + + Малайзия ринггиты + Малайзия ринггиты + + + Мозамбик эскудоһы + Мозамбик эскудоһы + + + Мозамбик метикалы (1980–2006) + Мозамбик метикалы (1980–2006) + + + Мозамбик метикалы + Мозамбик метикалы + + + Намибия доллары + Намибия доллары + + + Нигерия найраһы + Нигерия найраһы + + + Никарагуа кордобаһы (1988–1991) + Никарагуа кордобаһы (1988–1991) + + + Никарагуа кордобаһы + Никарагуа кордобаһы + + + Нидерланд гульдены + Нидерланд гульдены + + + Норвегия кронаһы + Норвегия кронаһы + + + Непал рупияһы + Непал рупияһы + + + Яңы Зеландия доллары + Яңы Зеландия доллары + + + Оман риалы + Оман риалы + + + Панама бальбоаһы + Панама бальбоаһы + + + Перу интиһы + Перу интиһы + + + Перу соле + Перу соле + + + Перу солеһы (1863–1965) + Перу солеһы (1863–1965) + + + Папуа - Яңы Гвинея кинаһы + Папуа - Яңы Гвинея кинаһы + + + Филиппин песоһы + Филиппин песоһы + + + Пакистан рупияһы + Пакистан рупияһы + + + Польша злотыйы + Польша злотыйы + + + Польша злотыйы (1950–1995) + Польша злотыйы (1950–1995) + + + Португалия эскудоһы + Португалия эскудоһы + + + Парагвай гуараниһы + Парагвай гуараниһы + + + Катар риалы + Катар риалы + + + Родезия доллары + Родезия доллары + + + Румын лейе (1952–2006) + Румын лейе (1952–2006) + + + Румын лейе + Румын лейе + + + Сербия динары + Сербия динары + + + Рәсәй рубле + Рәсәй рубле + + + Рәсәй рубле (1991–1998) + Рәсәй рубле (1991–1998) + р. + + + Руанда франкы + Руанда франкы + + + Сәғүд риалы + Сәғүд риалы + + + Соломон утрауҙары доллары + Соломон утрауҙары доллары + + + Сейшел рупияһы + Сейшел рупияһы + + + Судан динары (1992–2007) + Судан динары (1992–2007) + + + Судан фунты + Судан фунты + + + Судан фунты (1957–1998) + Судан фунты (1957–1998) + + + Швеция кронаһы + Швеция кронаһы + + + Сингапур доллары + Сингапур доллары + + + Изге Елена утрауы фунты + Изге Елена утрауы фунты + + + Словения толары + Словения толары + + + Словакия кронаһы + Словакия кронаһы + + + Сьерра-Леоне леонеһы + Сьерра-Леоне леонеһы + + + Сьерра-Леоне леонеһы (1964–2022) + Сьерра-Леоне леонеһы (1964–2022) + + + Сомали шиллингы + Сомали шиллингы + + + Суринам доллары + Суринам доллары + + + Суринам гульдены + Суринам гульдены + + + Көньяҡ Судан фунты + Көньяҡ Судан фунты + + + Сан-Томе һәм Принсипи добраһы (1977–2017) + Сан-Томе һәм Принсипи добраһы (1977–2017) + + + Сан-Томе һәм Принсипи добраһы + Сан-Томе һәм Принсипи добраһы + + + СССР рубле + СССР рубле + + + Сальвадор колоны + Сальвадор колоны + + + Сүриә фунты + Сүриә фунты + + + Свазиленд лилангениһы + Свазиленд лилангениһы + + + Таиланд баты + Таиланд баты + + + Тажикстан рубле + Тажикстан рубле + + + Тажикстан сомониһы + Тажикстан сомониһы + + + Төркмәнстан манаты (1993–2009) + Төркмәнстан манаты (1993–2009) + + + Төркмәнстан манаты + Төркмәнстан манаты + + + Тунис динары + Тунис динары + + + Тонга паангаһы + Тонга паангаһы + + + Тимор эскудоһы + Тимор эскудоһы + + + Төрөк лираһы (1922–2005) + Төрөк лираһы (1922–2005) + + + Төрөк лираһы + Төрөк лираһы + + + Тринидад һәм Тобаго доллары + Тринидад һәм Тобаго доллары + + + Яңы Тайвань доллары + Яңы Тайвань доллары + + + Танзания шиллингы + Танзания шиллингы + + + Украина гривнаһы + Украина гривнаһы + + + Украина карбованецы + Украина карбованецы + + + Уганда шиллингы (1966–1987) + Уганда шиллингы (1966–1987) + + + Уганда шиллингы + Уганда шиллингы + + + АҠШ доллары + АҠШ доллары + $ + + + АҠШ доллары (киләһе көн) + АҠШ доллары (киләһе көн) + + + АҠШ доллары (шул уҡ көн) + АҠШ доллары (шул уҡ көн) + + + Уругвай песоһы (индексланған берәмектәр) + Уругвай песоһы (индексланған берәмектәр) + + + Уругвай песоһы (1975–1993) + Уругвай песоһы (1975–1993) + + + Уругвай песоһы + Уругвай песоһы + + + Уругвай номиналь эш хаҡы индексы берәмеге + Уругвай номиналь эш хаҡы индексы берәмеге + + + Үзбәкстан һумы + Үзбәкстан һумы + + + Венесуэла боливары (1871–2008) + Венесуэла боливары (1871–2008) + + + суверенлы боливар + суверенлы боливар + + + Венесуэла боливары (2008–2018) + Венесуэла боливары (2008–2018) + + + Венесуэла боливары + Венесуэла боливары + + + Вьетнам донгы + Вьетнам донгы + + + Вьетнам донгы (1978–1985) + Вьетнам донгы (1978–1985) + + + Вануату ватуһы + Вануату ватуһы + + + Самоа талаһы + Самоа талаһы + + + Үҙәк Африка КФА франкы + Үҙәк Африка КФА франкы + + + көмөш + труа унция көмөш + + + алтын + труа унция алтын + + + Европа композит берәмеге + Европа композит берәмеге + + + Европа аҡса берәмеге + Европа аҡса берәмеге + + + Европа иҫәп берәмеге (XBC) + Европа иҫәп берәмеге (XBC) + + + Европа иҫәп берәмеге (XBD) + Европа иҫәп берәмеге (XBD) + + + Көнсығыш Кариб доллары + Көнсығыш Кариб доллары + + + Кариб гульдены + Кариб гульдены + + + Махсус үтес алыу хоҡуҡтары + Махсус үтес алыу хоҡуҡтары + + + Европа валюта берәмеге + Европа валюта берәмеге + + + Франция алтын франкы + Франция алтын франкы + + + Франция UIC-франкы + Франция UIC-франкы + + + Көнбайыш Африка КФА франкы + Көнбайыш Африка КФА франкы + F CFA + + + палладий + труа унция палладий + + + Француз Тымыҡ океан франкы + Француз Тымыҡ океан франкы + + + ағалтын + труа унция ағалтын + + + RINET фондтары + RINET фондтары + + + Сукре + Сукре + + + тест валюта берәмеге + тест валюта берәмеге + + + АБР иҫәп берәмеге + АБР иҫәп берәмеге + + + Билдәһеҙ валюта + Билдәһеҙ валюта + + + Йәмән динары + Йәмән динары + + + Йәмән риалы + Йәмән риалы + + + Югославия ҡаты динары (1966–1990) + Югославия ҡаты динары (1966–1990) + + + Югославия яңы динары (1994–2002) + Югославия яңы динары (1994–2002) + + + Югославия алмашынмалы динары (1990–1992) + Югославия алмашынмалы динары (1990–1992) + + + Югославия реформаланған динары (1992–1993) + Югославия реформаланған динары (1992–1993) + + + Көньяҡ Африка рэнды (финанс) + Көньяҡ Африка рэнды (финанс) + + + Көньяҡ Африка рэнды + Көньяҡ Африка рэнды + + + Замбия квачаһы (1968–2012) + Замбия квачаһы (1968–2012) + + + Замбия квачаһы + Замбия квачаһы + + + Заир яңы заиры (1993–1998) + Заир яңы заиры (1993–1998) + + + Заир заиры (1971–1993) + Заир заиры (1971–1993) + + + Зимбабве доллары (1980–2008) + Зимбабве доллары (1980–2008) + + + Зимбабве алтыны + Зимбабве алтыны + + + Зимбабве доллары (2009–2024) + Зимбабве доллары (2009–2024) + + + Зимбабве доллары (2008) + Зимбабве доллары (2008) + + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0}+ + + + {0} көн + {0} уңға боролоғоҙ. + + + + + + деци{0} + + + санти{0} + + + милли{0} + + + микро{0} + + + нано{0} + + + пико{0} + + + фемто{0} + + + атто{0} + + + зепто{0} + + + иокто{0} + + + ронто{0} + + + квекто{0} + + + дека{0} + + + гекто{0} + + + кило{0} + + + мега{0} + + + гига{0} + + + тера{0} + + + пета{0} + + + экса{0} + + + зетта{0} + + + иотта{0} + + + ронна{0} + + + кветта{0} + + + киби{0} + + + меби{0} + + + гиби{0} + + + теби{0} + + + пеби{0} + + + эксби{0} + + + зеби{0} + + + йоби{0} + + + квадрат {0} + + + куб {0} + + + g-көс + {0} g-көс + + + квадрат секундҡа метр + {0} квадрат секундҡа метр + + + әйләнештәр + {0} әйләнеш + + + радиандар + {0} радиан + + + градустар + {0} градус + + + минуттар + {0} минут + + + секундтар + {0} секунд + + + квадрат километрҙар + {0} квадрат километр + квадрат километрға {0} + + + гектарҙар + {0} гектар + + + квадрат метрҙар + {0} квадрат метр + квадрат метрға {0} + + + квадрат сантиметрҙар + {0} квадрат сантиметр + квадрат сантиметрға {0} + + + квадрат милдәр + {0} квадрат миль + квадрат милгә {0} + + + акрҙар + {0} акр + + + квадрат ярдтар + {0} квадрат ярд + + + квадрат футтар + {0} квадрат фут + + + квадрат дюймдар + {0} квадрат дюйм + {0} квадрат дюймға + + + дунамдар + {0} дунам + + + караттар + {0} карат + + + децилитрға миллиграмм + {0} миллиграмм децилитрға + + + литрға миллимоль + {0} миллимоль литрға + + + әйберҙәр + {0} әйбер + + + өлөштәр + {0} өлөш + + + миллионға өлөш + {0} өлөш/млн + + + процент + {0} процент + + + промилле + {0} промилле + + + промириад + {0} промириад + + + молдәр + {0} моль + + + глюкоза + {0} глюкоза + + + километрға литр + {0} литр километрға + + + 100 километрға литр + {0} литр 100 километрға + + + галлонға милдәр + {0} галлонға миль + + + Империя галлонына милдәр + {0} Империя галлонына миль + + + петабайттар + {0} петабайт + + + терабайттар + {0} терабайт + + + терабиттар + {0} терабит + + + гигабайттар + {0} гигабайт + + + гигабиттар + {0} гигабит + + + мегабайттар + {0} мегабайт + + + мегабиттар + {0} мегабит + + + килобайттар + {0} килобайт + + + килобиттар + {0} килобит + + + байттар + {0} байт + + + биттар + {0} бит + + + быуаттар + {0} быуат + + + йыл тиҫтәләре + {0} йыл тиҫтәһе + + + йылдар + {0} йыл + {0}/йыл + + + кварталдар + {0} квартал + {0}/квартал + + + айҙар + {0} ай + {0} айына + + + аҙналар + {0} аҙна + {0}/аҙна + + + көндәр + {0} көн + {0}/көн + + + сәғәт + {0} сәғәт + {0}/сәғәт + + + минуттар + {0} минут + {0}/минут + + + секундтар + {0} секунд + {0}/секунд + + + миллисекундтар + {0} миллисекунд + + + микросекундтар + {0} микросекунд + + + наносекундтар + {0} наносекунд + + + амперҙар + {0} ампер + + + миллиамперҙар + {0} миллиампер + + + омдар + {0} Ом + + + вольттар + {0} вольт + + + килокалориялар + {0} килокалория + + + калориялар + {0} калория + + + килоджоулдәр + {0} килоджоуль + + + джоулдәр + {0} джоуль + + + киловатт-сәғәттәр + {0} киловатт-сәғәт + + + электронвольттар + {0} электронвольт + + + Британия йылылыҡ берәмектәре + {0} Британия йылылыҡ берәмеге + + + АҠШ термдары + {0} АҠШ термы + + + фунт-көс + {0} фунт-көс + + + ньютондар + {0} ньютон + + + 100 километрға киловатт-сәғәт + {0} киловатт-сәғәт 100 километрға + + + гигагерцтар + {0} гигагерц + + + мегагерцтар + {0} мегагерц + + + килогерцтар + {0} килогерц + + + герцтар + {0} герц + + + типографик эм + {0} эм + + + пикселдәр + {0} пиксел + + + мегапикселдәр + {0} мегапиксел + + + сантиметрға пикселдар + {0} пиксел сантиметрға + + + дюймға пикселдар + {0} пиксел дюймға + + + ер радиусы + {0} ер радиусы + + + километрҙар + {0} километр + километрға {0} + + + метрҙар + {0} метр + метрға {0} + + + дециметрҙар + {0} дециметр + + + сантиметрҙар + {0} сантиметр + {0}/см + + + миллиметрҙар + {0} миллиметр + + + микрометрҙар + {0} микрометр + + + нанометрҙар + {0} нанометр + + + пикометрҙар + {0} пикометр + + + милдәр + {0} миль + + + ярдтар + {0} ярд + + + футтар + {0} фут + футҡа {0} + + + дюймдар + {0} дюйм + дюймға {0} + + + парсектар + {0} парсек + + + яҡтылыҡ йылдары + {0} яҡтылыҡ йылы + + + астрономик берәмектәр + {0} астрономик берәмек + + + {0} сажин + + + диңгеҙ милдәре + {0} диңгеҙ миле + + + скандинав милдәре + {0} скандинав миле + + + пункттар + {0} пункт + + + ҡояш радиустары + {0} ҡояш радиусы + + + люкстар + {0} люкс + + + канделалар + {0} кандела + + + люмен + {0} люмен + + + ҡояш яҡтылыҡтары + {0} ҡояш яҡтылығы + + + тонналар + {0} т + + + килограммдар + {0} килограмм + {0} килограммға + + + граммдар + {0} грамм + {0} граммға + + + миллиграммдар + {0} миллиграмм + + + микрограммдар + {0} микрограмм + + + тонналар + {0} тонна + + + стоундар + {0} стоун + + + фунттар + {0} фунт + {0} фунтҡа + + + унциялар + {0} унция + {0} унцияға + + + трой унциялары + {0} трой унцияһы + + + караттар + {0} карат + + + дальтондар + {0} дальтон + + + Ер массалары + {0} Ер массаһы + + + ҡояш массалары + {0} ҡояш массаһы + + + грандар + {0} гран + + + гигаваттар + {0} гигаватт + + + мегаваттар + {0} мегаватт + + + киловаттар + {0} киловатт + + + ватттар + {0} ватт + + + милливаттар + {0} милливатт + + + ат көсө + {0} ат көсө + + + терегөмөш бағанаһы миллиметрҙары + {0} терегөмөш бағанаһы миллиметры + + + терегөмөш бағанаһы + {0} тер. бағ. + + + квадрат дюймға фунт-көс + {0} квадрат дюймға фунт-көс + + + терегөмөш бағанаһы дюймдары + {0} терегөмөш бағанаһы дюймдары + + + барҙар + {0} бар + + + миллибарҙар + {0} миллибар + + + атмосфералар + {0} атмосфера + + + паскалдәр + {0} паскаль + + + гектопаскалдәр + {0} гектопаскаль + + + килопаскалдәр + {0} килопаскаль + + + мегапаскалдәр + {0} мегапаскаль + + + сәғәтенә километр + {0} сәғәтенә километр + + + секундҡа метр + {0} секундҡа метр + + + сәғәтенә миль + {0} сәғәтенә миль + + + төйөндәр + {0} төйөн + + + Бофорт + Бофорт {0} + + + температура градустары + {0} градус + + + Цельсий градустары + {0} Цельсий градусы + + + Фаренгейт градустары + {0} Фаренгейт градусы + + + кельвиндар + {0} кельвин + + + фунт-фут + {0} фунт-фут + + + ньютон-метрҙар + {0} ньютон-метр + + + куб километрҙар + {0} куб километр + + + куб метрҙар + {0} куб метр + {0} куб метрға + + + куб сантиметрҙар + {0} куб сантиметр + {0} куб сантиметрға + + + куб милдәр + {0} куб миль + + + куб ярдтар + {0} куб ярд + + + куб футтар + {0} куб фут + + + куб дюймдар + {0} куб дюйм + + + мегалитрҙар + {0} мегалитр + + + гектолитрҙар + {0} гектолитр + + + литрҙар + {0} литр + {0} литрға + + + децилитрҙар + {0} децилитр + + + сантилитрҙар + {0} сантилитр + + + миллилитрҙар + {0} миллилитр + + + метрик пинталар + {0} метрик пинта + + + метрик сынаяҡтар + {0} метрик сынаяҡ + + + метрик шыйыҡ унциялар + {0} метрик шыйыҡ унция + + + акр-футтар + {0} акр-фут + + + бушелдәр + {0} бушель + + + галлондар + {0} галлон + галлонға {0} + + + империя галлондары + {0} империя галлоны + {0} империя галлонына + + + кварталар + {0} кварта + + + пинталар + {0} пинта + + + Империя пинталары + {0} Империя пинтаһы + + + сынаяҡтар + {0} сынаяҡ + + + шыйыҡ унциялар + {0} шыйыҡ унция + + + империя шыйыҡ унциялары + {0} империя шыйыҡ унцияһы + + + аш ҡалаҡтары + {0} аш ҡалағы + + + сәй ҡалаҡтары + {0} сәй ҡалағы + + + баррелдәр + {0} баррель + + + десерт ҡалаҡтары + {0} десерт ҡалағы + + + империя десерт ҡалаҡтары + {0} империя десерт ҡалағы + + + тамсылар + {0} тамсы + + + драхмалар + {0} драхма + + + джиггерҙар + {0} джиггер + + + семтемдәр + {0} семтем + + + Империя кварталары + {0} империя квартаһы + + + стерадиандар + {0} стерадиан + + + каталдар + {0} катал + + + кулондар + {0} кулон + + + фарадтар + {0} фарад + + + генри + {0} генри + + + сименстар + {0} сименс + + + халыҡ-ара калориялар + {0} халыҡ-ара калория + + + Британия йылылыҡ берәмектәре [IT] + {0} Британия йылылыҡ берәмеге [IT] + + + беккерелдәр + {0} беккерель + + + зиверттар + {0} зиверт + + + грейҙар + {0} грей + + + килограмм-көс + {0} килограмм-көс + + + родтар + {0} род + + + сылбырҙар + {0} сылбыр + + + теслалар + {0} тесла + + + веберҙар + {0} вебер + + + ранкиндар + {0} ранкин + + + фортнайттар + {0} фортнайт + + + слагтар + {0} слаг + + + бензин эквиваленты + {0} бензин эквиваленты + + + рин [JP] + + + сун [JP] + {0} сун [JP] + + + шаку [JP] + {0} шаку [JP] + + + шаку [туҡыма, JP] + {0} шаку [туҡыма, JP] + + + кен [JP] + {0} кен [JP] + + + джо [JP] + {0} джо [JP] + + + ри [JP] + {0} ри [JP] + + + бу [JP] + {0} бу [JP] + + + се [JP] + {0} се [JP] + + + чо [JP] + {0} чо [JP] + + + косажи [JP] + {0} косажи [JP] + + + осажи [JP] + {0} осажи [JP] + + + сынаяҡ [JP] + {0} сынаяҡ [JP] + + + шаку [күләм, JP] + {0} шаку [күләм, JP] + + + сай [JP] + {0} сай [JP] + + + то [JP] + {0} то [JP] + + + коку [JP] + {0} коку [JP] + + + яҡтылыҡ + {0} яҡтылыҡ + + + фун [JP] + {0} фун [JP] + + + миллиардҡа өлөш + {0} өлөш миллиардҡа + + + төндәр + {0} төн + {0}/төн + + + кардиналь йүнәлеш + {0} көнсығыш оҙонлоҡ + {0} төньяҡ киңлек + {0} көньяҡ киңлек + {0} көнбайыш оҙонлоҡ + + + + + д{0} + + + с{0} + + + м{0} + + + мк{0} + + + н{0} + + + п{0} + + + ф{0} + + + а{0} + + + з{0} + + + и{0} + + + р{0} + + + кв{0} + + + да{0} + + + г{0} + + + к{0} + + + М{0} + + + Г{0} + + + Т{0} + + + П{0} + + + Э{0} + + + З{0} + + + И{0} + + + Р{0} + + + Кв{0} + + + Ки{0} + + + Ми{0} + + + Ги{0} + + + Ти{0} + + + Пи{0} + + + Эи{0} + + + Зи{0} + + + Йи{0} + + + g-көс + + + м/с² + {0} м/с² + + + әйләнеш + {0} әйләнеш + + + радиан + {0} рад + + + градустар + + + мин + + + сек + + + км² + {0} км² + {0}/км² + + + гектарҙар + {0} гектар + + + м² + {0} м² + {0}/м² + + + см² + {0} см² + {0}/см² + + + кв. милдәр + {0} кв. миль + {0}/ми² + + + акр + {0} акр + + + ярд² + {0} ярд² + + + фут² + {0} фут² + + + дюйм² + {0} дюйм² + {0}/дюйм² + + + дунамдар + {0} дунам + + + кар + {0} кар + + + мг/дл + {0} мг/дл + + + ммоль/л + {0} ммоль/л + + + әйбер + {0} әйбер + + + өлөш + {0} өлөш + + + өлөш/миллион + {0} өлөш/млн + + + моль + {0} моль + + + глюкоза + + + л/км + {0} л/км + + + л/100 км + {0} л/100 км + + + милдәр/галлон + {0} галлонға миль + + + милдәр/имп. галлон + {0} миль/имп. гал + + + ПБ + {0} ПБ + + + ТБ + {0} ТБ + + + Тбит + {0} Тбит + + + ГБ + {0} ГБ + + + Гбит + {0} Гбит + + + МБ + {0} МБ + + + Мбит + {0} Мбит + + + кБ + {0} кБ + + + кбит + {0} кбит + + + байт + {0} Б + + + бит + {0} бит + + + б. + {0} б. + + + йый тиҫт. + {0} йыл тиҫтәһе + + + йылдар + {0} йыл + {0}/й + + + кварт. + {0} кварт. + {0}/кв + + + айҙар + {0} ай + {0}/ай + + + аҙн. + {0} аҙна + {0}/аҙна + + + көндәр + {0} көн + {0}/көн + + + сәғәт + {0} сәғәт + {0}/сәғ + + + мин + {0} мин + {0}/мин + + + сек + {0} с + {0}/с + + + мс + {0} мс + + + мкс + {0} мкс + + + нс + {0} нс + + + А + {0} А + + + мА + {0} мА + + + Ом + {0} Ом + + + В + {0} В + + + ккал + {0} ккал + + + кал + {0} кал + + + килоджоуль + {0} кДж + + + джоуль + {0} Дж + + + кВт⋅сәғ + {0} кВт⋅сәғ + + + эВ + {0} эВ + + + БТЕ + {0} БТЕ + + + АҠШ термаһы + {0} АҠШ термы + + + фунт-көс + {0} фнт-көс + + + ньютон + {0} Н + + + кВт⋅сәғ/100 км + {0} кВт⋅сәғ/100 км + + + ГГц + {0} ГГц + + + МГц + {0} МГц + + + кГц + {0} кГц + + + Гц + {0} Гц + + + эм + {0} эм + + + пкс + {0} пкс + + + Мпкс + {0} Мпкс + + + пкс/см + {0} пкс/см + + + пкс/дюйм + {0} пкс/дюйм + + + ер радиусы + + + км + {0} км + {0}/км + + + м + {0} м + {0}/м + + + дм + {0} дм + + + см + {0} см + {0}/см + + + мм + {0} мм + + + мкм + {0} мкм + + + нм + {0} нм + + + пм + {0} пм + + + милдәр + {0} миль + + + ярд + {0} ярд + + + фут + {0} фут + {0}/фут + + + дюйм + {0} дюйм + {0}/дюйм + + + парсек + {0} пк + + + яҡтылыҡ йылдары + {0} яҡт. й. + + + а. б. + {0} а. б. + + + фурлонг + {0} фурлонг + + + диңгеҙ милдәре + {0} диңгеҙ миле + + + ск. ми + {0} ск. ми + + + пкт + {0} пкт + + + ҡояш радиустары + + + лк + {0} лк + + + кд + {0} кд + + + лм + {0} лм + + + ҡояш яҡтылыҡтары + + + т + {0} т + + + кг + {0} кг + {0}/кг + + + грам + {0} г + {0}/г + + + мг + {0} мг + + + мкг + {0} мкг + + + АҠШ тоннаһы + {0} амер. т + + + стоун + {0} стоун + + + фунттар + {0} фнт + {0}/фнт + + + унц. + {0} унция + {0}/унц. + + + тр. унц. + {0} тр. унц. + + + карат + {0} кар + + + дальтон + {0} Да + + + Ер массалары + + + ҡояш массалары + + + гран + {0} гран + + + ГВт + {0} ГВт + + + МВт + {0} МВт + + + кВт + {0} кВт + + + ватттар + {0} Вт + + + мВт + {0} мВт + + + ат көсө + {0} ат көсө + + + тер. бағ. мм + {0} тер. бағ. мм + + + тер. бағ. + {0} тер. бағ. + + + ф/дюйм² + {0} ф/дюйм² + + + тер. бағ. дюймдары + {0} тер. бағ. д. + + + бар + {0} бар + + + мбар + {0} мбар + + + атм + {0} атм + + + Па + {0} Па + + + гПа + {0} гПа + + + кПа + {0} кПа + + + МПа + {0} МПа + + + км/сәғ + {0} км/сәғ + + + м/с + {0} м/с + + + миль/сәғ. + {0} миль/сәғ + + + төйөн + {0} төйөн + + + Бфт + {0} Бфт + + + градустар + + + К + {0} К + + + фунт-фут + {0} фунт-фут + + + Н⋅м + {0} Н⋅м + + + км³ + {0} км³ + + + м³ + {0} м³ + {0}/м³ + + + см³ + {0} см³ + {0}/см³ + + + миль³ + {0} миль³ + + + ярд³ + {0} ярд³ + + + фут³ + {0} фут³ + + + дюйм³ + {0} дюйм³ + + + Мл + {0} Мл + + + гл + {0} гл + + + литрҙар + {0} л + {0}/л + + + дл + {0} дл + + + сл + {0} сл + + + мл + {0} мл + + + мпт + {0} мпт + + + м. сынаяҡтар + {0} м. сынаяҡ + + + м.ш.у. + {0} м.ш.у. + + + акрофут + {0} акрофут + + + бушель + {0} буш. + + + галлон + {0} галлон + {0}/галлон + + + империя галлондары + {0} имп. галл. + {0}/имп. галл. + + + кварталар + {0} кварта + + + пинта + {0} пинта + + + сынаяҡ + {0} сынаяҡ + + + шыйыҡ унциялар + {0} шыйыҡ унция + + + империя ш. унциялары + {0} имп. шыйыҡ унция + + + аш ҡалағы + {0} аш ҡалағы + + + сәй ҡалағы + {0} сәй ҡалағы + + + баррель + {0} барр. + + + десерт ҡалағы + {0} десерт ҡалағы + + + имп. десерт ҡалағы + {0} имп. десерт ҡалағы + + + тамсы + {0} тамсы + + + драхмалар + {0} драхма + + + джиггер + {0} джиггер + + + семтем + {0} семтем + + + имп. кварта + {0} имп. кварт. + + + ср + {0} ср + + + кат + {0} кат + + + Кл + {0} Кл + + + Ф + {0} Ф + + + Гн + {0} Гн + + + См + {0} См + + + халыҡ-ара кал. + {0} х.а.кал. + + + Бк + {0} Бк + + + Зв + {0} Зв + + + Гр + {0} Гр + + + кгк + {0} кгк + + + род + {0} род + + + {0} сылбыр + + + Тл + {0} Тл + + + Вб + {0} Вб + + + фртнт. + {0} фортнайт + + + слаг + {0} слаг + + + газ эквиваленты + {0} газ эквиваленты + + + яҡтылыҡ + {0} яҡтылыҡ + + + өлөш/млрд + {0} өлөш/млрд + + + төндәр + {0} төн + {0}/төн + + + йүнәлеш + {0} көнсығыш + {0} төньяҡ + {0} көньяҡ + {0} көнбайыш + + + + + д{0} + + + с{0} + + + м{0} + + + мк{0} + + + н{0} + + + п{0} + + + ф{0} + + + а{0} + + + з{0} + + + и{0} + + + р{0} + + + кв{0} + + + да{0} + + + г{0} + + + к{0} + + + М{0} + + + Г{0} + + + Т{0} + + + П{0} + + + Э{0} + + + З{0} + + + И{0} + + + Р{0} + + + Кв{0} + + + Ки{0} + + + Ми{0} + + + Ги{0} + + + Ти{0} + + + Пи{0} + + + Эи{0} + + + Зи{0} + + + Йи{0} + + + g-көс + {0}Gs + + + м/с² + {0} м/с² + + + әйләнеш + {0} әйләнеш + + + рад + {0} рад + + + гр. + + + мин + + + сек + + + км² + {0} км² + {0}/км² + + + га + {0} гектар + + + м² + {0} м² + {0}/м² + + + см² + {0} см² + {0}/см² + + + ми² + {0} ми² + {0}/ми² + + + акр + {0} акр + + + ярд² + {0} ярд² + + + фут² + {0} фут² + + + дюйм² + {0} дюйм² + {0}/дюйм² + + + дун. + {0} дунам + + + кар + {0} карат + + + мг/дл + {0} мг/дл + + + ммоль/л + {0} ммоль/л + + + әйбер + {0} әйбер + + + өлөш + {0} өлөш + + + өлөш/млн + {0} өлөш/млн + + + моль + {0} моль + + + глюкоза + + + л/км + {0} л/км + + + л/100 км + {0} л/100 км + + + миль/гал + {0} галлонға миль + + + миль/имп. гал + {0} миль/имп. гал + + + ПБ + {0} ПБ + + + ТБ + {0} ТБ + + + Тбит + {0} Тбит + + + ГБ + {0} ГБ + + + Гбит + {0} Гбит + + + МБ + {0} МБ + + + Мбит + {0} Мбит + + + кБ + {0} кБ + + + кбит + {0} кбит + + + Б + {0} Б + + + бит + {0} бит + + + б. + {0} б. + + + й. тиҫт. + {0} йыл тиҫтәһе + + + й. + {0} й. + {0}/й + + + кварт. + {0} кварт. + {0}/кв + + + ай. + {0} ай + {0}/ай + + + аҙн. + {0} аҙна + {0}/аҙна + + + көн. + {0} көн + {0}/көн + + + сәғ. + {0} сәғ. + {0}/сәғ + + + мин + {0} мин. + {0}/мин + + + с + {0} с + {0}/с + + + мс + {0} мс + + + мкс + {0} мкс + + + нс + {0} нс + + + А + {0} А + + + мА + {0} мА + + + Ом + {0} Ом + + + В + {0} В + + + ккал + {0} ккал + + + кал + {0} кал + + + кДж + {0} кДж + + + Дж + {0} Дж + + + кВт⋅сәғ + {0} кВт⋅сәғ + + + эВ + {0} эВ + + + БТЕ + {0} БТЕ + + + АҠШ термы + {0} АҠШ термы + + + фунт-көс + {0} фунт-көс + + + Н + {0}Н + + + кВт⋅сәғ/100 км + {0} кВт⋅сәғ/100 км + + + ГГц + {0} ГГц + + + МГц + {0} МГц + + + кГц + {0} кГц + + + Гц + {0} Гц + + + эм + {0} эм + + + пкс + {0} пкс + + + Мпкс + {0} Мпкс + + + пкс/см + {0} пкс/см + + + пкс/дюйм + {0} пкс/дюйм + + + ер радиусы + + + км + {0} км + {0}/км + + + м + {0} м + {0}/м + + + дм + {0} дм + + + см + {0} см + {0}/см + + + мм + {0} мм + + + мкм + {0} мкм + + + нм + {0} нм + + + пм + {0} пм + + + миль + {0} миля + + + ярд + {0} ярд + + + фут + {0} фут + {0}/фут + + + дюйм + {0} дюйм + {0}/дюйм + + + пк + {0} пк + + + яҡт. й. + {0} яҡт. й. + + + а. е. + {0} а. б. + + + фрл + {0} фрл + + + саж. + + + диңгеҙ миле + {0} диңгеҙ миле + + + ск. ми + {0} ск. ми + + + пкт + {0} пкт + + + ҡояш радиустары + + + лк + {0}лк + + + кд + {0}кд + + + лм + {0}лм + + + ҡояш яҡтылыҡтары + + + т + {0} т + + + кг + {0} кг + {0}/кг + + + г + {0} г + {0}/г + + + мг + {0} мг + + + мкг + {0} мкг + + + т + {0} амер. тонна + + + стн + {0} стоун + + + фнт + {0} фнт + {0}/фнт + + + унц. + {0} унция + {0}/унц. + + + тр. унц. + {0} тр. унц. + + + кар + {0} карат + + + дальтон + {0} Да + + + Ер массалары + {0}M⊕ + + + ҡояш массалары + {0}M☉ + + + гран + {0} гран + + + ГВт + {0} ГВт + + + МВт + {0} МВт + + + кВт + {0} кВт + + + Вт + {0} Вт + + + мВт + {0} мВт + + + ат көсө + {0} ат көсө + + + тер. бағ. мм + {0} тер. бағ. мм + + + тер. бағ. + {0} тер. бағ. + + + ф/дюйм² + {0} ф/дюйм² + + + тер. бағ. д. + {0} тер. бағ. д. + + + бар + {0} бар + + + мбар + {0} мбар + + + атм + {0} атм + + + Па + {0} Па + + + гПа + {0} гПа + + + кПа + {0} кПа + + + МПа + {0} МПа + + + км/сәғ + {0} км/сәғ + + + м/с + {0} м/с + + + ми/сәғ. + {0} ми/сәғ + + + төйөн + {0} төйөн + + + Бфт + {0} Бфт + + + градустар + + + {0} °C + + + К + {0} К + + + фунт-фут + {0} фунт-фут + + + Н⋅м + {0}Н⋅м + + + км³ + {0} км³ + + + м³ + {0} м³ + {0}/м³ + + + см³ + {0} см³ + {0}/см³ + + + миль³ + {0} миль³ + + + ярд³ + {0} ярд³ + + + фут³ + {0} фут³ + + + дюйм³ + {0} дюйм³ + + + Мл + {0} Мл + + + гл + {0} гл + + + л + {0} л + {0}/л + + + дл + {0} дл + + + сл + {0} сл + + + мл + {0} мл + + + мпт + {0} мпт + + + м. сынаяҡ + {0} м. сынаяҡ + + + м.ш.у. + {0} м.ш.у. + + + акр-фут + {0} акрофут + + + буш. + {0} бушель + + + гал. + {0} галлон + {0}/галлон + + + имп. галл. + {0} имп. галл. + {0}/имп. галл. + + + кварт. + {0} кварта + + + пинт. + {0} пинта + + + сынаяҡ + {0} сынаяҡ + + + шыйыҡ унция + {0} шыйыҡ унция + + + имп. ш. унцияһы + {0} имп. ш. унция + + + аш ҡ. + {0} аш ҡалағы + + + сәй ҡ. + {0} сәй ҡалағы + + + барр. + {0} баррель + + + дес. ҡ. + {0} десерт ҡалағы + + + империя дес. ҡ. + {0} имп. десерт ҡалағы + + + тамсы + {0} тамсы + + + шыйыҡ драхма + {0} шыйыҡ драхма + + + джиггер + {0} джиггер + + + семтем + {0} семтем + + + имп. кварта + {0} имп. кварта + + + ср + {0}ср + + + кат + {0}кат + + + Кл + {0} Кл + + + Ф + {0} Ф + + + Гн + {0} Гн + + + См + {0} См + + + х.а.кал. + {0} х.а.кал. + + + Бк + {0} Бк + + + Зв + {0} Зв + + + Гр + {0} Гр + + + кгк + {0} кгк + + + род + + + Тл + {0} Тл + + + Вб + {0} Вб + + + фртнт. + {0} фортнайт + + + слаг + {0} слаг + + + бензин эквиваленты + {0} газ эквиваленты + + + рин [JP] + + + сун [JP] + + + шаку [JP] + + + шаку [туҡыма, JP] + + + кен [JP] + + + джо [JP] + {0} jo [JP] + + + косажи [JP] + + + осажи [JP] + + + шаку [күләм, JP] + + + сай [JP] + + + то [JP] + + + коку [JP] + + + яҡтылыҡ + {0} яҡтылыҡ + + + фун [JP] + + + өлөш/млрд + {0} өлөш/млрд + + + төндәр + {0} төн + {0}/төн + + + йүн. + {0} көнсығыш + {0} төньяҡ + {0} көньяҡ + {0} көнбайыш + + + + hh:mm + + + hh:mm:ss + + + mm:ss + + + + + {0} һәм {1} + {0} һәм {1} + + + {0} йәки {1} + {0} йәки {1} + + + {0} йәки {1} + {0} йәки {1} + + + {0} йәки {1} + {0} йәки {1} + + + {0} һәм {1} + {0} һәм {1} + + + {0} һәм {1} + {0} һәм {1} + + + {0} һәм {1} + {0} һәм {1} + + + {0} һәм {1} + {0} һәм {1} + + + {0} һәм {1} + {0} һәм {1} + + + + + эйе:э + юҡ:ю + + + + {0} — бөтәһе + {0} — ярашлылыҡ + {0} — эсендә + {0} — киңәйтелгән + {0} һулға ҡарай + {0} уңға ҡарай + {0} — тарихи + {0} — төрлө + {0} — башҡа + яҙмалар — {0} + {0} һыҙыҡтар + аҫҡы индекс {0} + өҫкө индекс {0} + эшмәкәрлек + Африка яҙмаһы + Америка яҙмаһы + хайуан + хайуан йәки тәбиғәт + уҡтар + тән + ҡумта һыҙмаһы + Брайль шрифты + бина + маркер йәки йондоҙ + тартынҡы джамо + валюта символы + һыҙыҡ йәки тоташтырғыс + һан + дингбат + күрәҙәлек символы + аҫҡа табан уҡ + аҫҡа-өҫкә табан уҡ + Көнсығыш Азия яҙмаһы + эмодзи + Европа яҙмаһы + ҡатын-ҡыҙ + флаг + флагтар + аҙыҡ-түлек һәм эсемлектәр + формат + формат һәм буш урындар + тулы киңлектәге вариант + геометрик форма + ярты киңлектәге вариант + Хан иероглифы + Хан радикалдары + ханча + Ханзи (ябайлаштырылған) + Ханзи (традицион) + йөрәк + тарихи яҙма + идеографик тасуирлау символы + япон канаһы + канбун + кандзи + клавиша + һулға табан уҡ + һулға-уңға табан уҡ + хәрефкә оҡшаш символ + сикләнгән ҡулланыу + ир-ат + математик символ + Урта Көнсығыш яҙмаһы + төрлө + заманса яҙма + модификаторҙар + музыкаль символ + тәбиғәт + арауыҡһыҙ символдар + һандар + объект + башҡа + парлы + кеше + фонетик алфавит + пиктограмма + урын + үҫемлек + тыныш билдәләре + уңға табан уҡ + билдә йәки символ + бәләкәй варианттар + смайлик + смайлик йәки кеше + Көньяҡ Азия яҙмаһы + Көньяҡ-Көнсығыш Азия яҙмаһы + арауыҡтар + спорт + символ + техник символ + тон билдәһе + сәйәхәт + сәйәхәт йәки урын + өҫкә табан уҡтар + вариант + һуҙынҡы джамо + һауа торошо + Көнбайыш Азия яҙмаһы + буш урындар + + + курсив + оптик ҙурлыҡ + ҡыялыҡ + киңлек + ауырлыҡ + ҡулъяҙма + яҙыу + текст + исем + дисплей + плакат + артҡа ҡыя + тура + ҡыя + артыҡ ҡыя + ультраҡыҫҡартылған + артыҡ ҡыҫҡартылған + ҡыҫҡартылған + ярым ҡыҫҡартылған + нормаль + ярым киңәйтелгән + киңәйтелгән + артыҡ киңәйтелгән + ультракиңәйтелгән + нәҙек + үтә нәҙек + нәҙек + ярым нәҙек + китап + ғәҙәти + уртаса + ярым ҡалын + ҡалын + үтә ҡалын + ҡара + артыҡ ҡара + вертикаль кәсерҙәр + баш хәреф аралығы + өҫтәмә лигатуралар + диагональ кәсерҙәр + һыҙыҡлы һандар + иҫке стиль һандары + рәт һандары + пропорциональ һандар + бәләкәй баш хәрефтәр + таблица һандары + һыҙылған нуль + + + und ba + {0}{1} + + {title} {given} {given2} {surname} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {given-informal-monogram-allCaps}{surname-monogram-allCaps} + + + {given} {given2-initial} {surname} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given-initial}{given2-initial} {surname} + + + {given-informal} {surname-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {title} {given} {given2} {generation}, {credentials} + + + {surname} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps}{given-informal-monogram-allCaps} + + + {surname} {given} {given2-initial} {generation}, {credentials} + + + {surname} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {given-initial}{given2-initial} + + + {surname} {given-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname-core}, {given} {given2} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given-initial}{given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + Урал + + + Ирина + Яҡупова + + + Азамат + Салауат улы + Фаттахов + + + ∅∅∅ + Азамат + ∅∅∅ + Салауат улы + ∅∅∅ + Фаттахов + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + Синдбад + + + Кете + Мюллер + + + Цецилия + Хэмиш + Штёбер + + + проф., д-р + Ада Корнелия + Неле + Сезар Мартин + фон + Брюль + Гонсалес Доминго + кесе + м. ф. д. + + diff --git a/make/data/cldr/common/main/bal.xml b/make/data/cldr/common/main/bal.xml index c8dec39faaa..99aa704a43c 100644 --- a/make/data/cldr/common/main/bal.xml +++ b/make/data/cldr/common/main/bal.xml @@ -385,6 +385,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic گرین‌وِچ مین ٹائم + + + هئواییئے گیشّتگێن ساهت + + هئواییئے ساهت diff --git a/make/data/cldr/common/main/bal_Latn.xml b/make/data/cldr/common/main/bal_Latn.xml index 576ae907516..99b83dd9327 100644 --- a/make/data/cldr/common/main/bal_Latn.xml +++ b/make/data/cldr/common/main/bal_Latn.xml @@ -997,13 +997,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mingu-Chini sáldar Hesáb, Zarr Káleb Zarray anjárén káleb - Chini Rabyati Red o band Pésari Red o band, pa hamdapiá Labzbaladi Red o band Aslén Yunikodi Red o band Emóji Red o band Yuropi Red o bandi Rahband - Sádah kortagén Chini Red o band - GB2312 Pawnbokki Red o band Pinyi Red o band Ám Kári Shóház @@ -2955,9 +2953,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Rónendi Aprikáay wahd - Rónendi Aprikáay anjári wahd - Rónendi Aprikáay garmági wahd + Rónendi Aprikáay wahd @@ -3307,6 +3303,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyánáay wahd + + + Hawái/Alushiay anjári wahd + + Hawái/Alushiay wahd diff --git a/make/data/cldr/common/main/bas.xml b/make/data/cldr/common/main/bas.xml index ddba778be4d..533f61c67d7 100644 --- a/make/data/cldr/common/main/bas.xml +++ b/make/data/cldr/common/main/bas.xml @@ -583,6 +583,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/be.xml b/make/data/cldr/common/main/be.xml index 3e074c52d8d..88a333804ad 100644 --- a/make/data/cldr/common/main/be.xml +++ b/make/data/cldr/common/main/be.xml @@ -46,6 +46,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ аймара азербайджанская башкірская + белуджская балійская басаа беларуская @@ -239,6 +240,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафія кёльнская курдская + курдская + курманджы кумыцкая комі корнская @@ -646,6 +649,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Кітай Калумбія Востраў Кліпертан + Сарк Коста-Рыка Куба Каба-Вердэ @@ -879,42 +883,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ фармат валюты парадак сартавання валюта + прэзентацыя эмодзі гадзінны цыкл (12 або 24) правілы разрыву радка + стыль пераносу слоў сістэма мер лічбы + разрыў сказа пасля скарачэння будыйскі каляндар + будыйскі кітайскі каляндар + кітайскі копцкі каляндар + копцкі каляндар дангі + дангі эфіопскі каляндар + эфіопскі эфіопскі каляндар Аметэ Алем + эфіопскі (Аметэ Алем) грыгарыянскі каляндар + грыгарыянскі яўрэйскі каляндар + яўрэйскі каляндар хіджры + хіджра свецкі каляндар хіджры (таблічны) + хіджра (свецкі, таблічны) каляндар хіджры (Ум аль-Кура) + хіджра (Ум аль-Кура) каляндар ISO-8601 японскі каляндар + японскі персідскі каляндар + персідскі каляндар Міньго + Міньго бухгалтарскі фармат валюты + бухгалтарскі стандартны фармат валюты + стандартны стандартны парадак сартавання Унікод + стандартны (Унікод) універсальны пошук + пошук стандартны парадак сартавання + стандартны + стандартныя сімвалы + эмодзі + тэкставыя сімвалы 12-гадзінны фармат часу (0-11) + 12-гадзінны (0–11) 12-гадзінны фармат часу (1-12) + 12-гадзінны (1–12) 24-гадзінны фармат часу (0-23) + 24-гадзінны (0–23) 24-гадзінны фармат часу (1-24) + 24-гадзінны (1–24) нястрогія правілы разрыву радка + нястрогія звычайныя правілы разрыву радка + звычайныя строгія правілы разрыву радка + строгія + пераносіць усё + захаваць усё + звычайны + захоўваць у фразах метрычная сістэма мер + метрычная брытанская сістэма мер + брытанская амерыканская сістэма мер + амерыканская арабска-індыйскія лічбы пашыраная сістэма арабска-індыйскіх лічбаў армянскія лічбы @@ -955,6 +998,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тайскія лічбы тыбецкія лічбы лічбы ваі + выключана + уключана метрычная @@ -1126,7 +1171,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ LLL y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a d.M @@ -1500,10 +1544,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d MMM y 'г'. G E, d MMM y 'г'. G hh a + H h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'г' v d.M E, d.M d MMM @@ -1578,7 +1624,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1600,7 +1645,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1663,8 +1707,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ год - у мінулым годзе - у гэтым годзе + летась + сёлета у наступным годзе праз {0} год @@ -1682,7 +1726,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ г. у мін. годзе - у гэтым годзе + сёлета у наст. годзе праз {0} г. @@ -2075,9 +2119,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} сб таму - - AM/PM - гадзіна у гэту гадзіну @@ -2532,6 +2573,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Вялікадня востраў + + Кайайке + Пунта-Арэнас @@ -2797,9 +2841,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пнампень - Эндэрберы - - Кантон @@ -3469,9 +3510,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Заходнеафрыканскі час - Заходнеафрыканскі стандартны час - Заходнеафрыканскі летні час + Заходнеафрыканскі час @@ -3821,6 +3860,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Час Гаяны + + + Гавайска-Алеуцкі стандартны час + + Гавайска-Алеуцкі час @@ -4421,6 +4465,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -5590,6 +5638,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ усходнекарыбскага долара EC$ + + карыбскі гульдэн + карыбскі гульдэн + карыбскія гульдэны + карыбскіх гульдэнаў + карыбскага гульдэна + заходнеафрыканскі франк КФА заходнеафрыканскі франк КФА @@ -5632,6 +5687,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ замбійскіх квач замбійскай квачы + + зімбабвійскі залаты + зімбабвійскі залаты + зімбабвійскія залатыя + зімбабвійскіх залатых + зімбабвійскага залатога + ≈{0} @@ -5893,7 +5955,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} элементаў {0} элемента - + + часткі + {0} частка + {0} часткі + {0} частак + {0} часткі + + часткі на мільён {0} частка на мільён {0} часткі на мільён @@ -5924,6 +5993,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ молі + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + літры на кіламетр {0} літр на кіламетр @@ -6619,6 +6695,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} міліметраў ртутнага слупа {0} міліметра ртутнага слупа + + ртутнага слупка + {0} ртутнага слупка + {0} ртутнага слупка + {0} ртутнага слупка + {0} ртутнага слупка + фунты на квадратную цалю {0} фунт на квадратную цалю @@ -6849,6 +6932,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метрычных кубкаў {0} метрычнага кубка + + метрычныя вадкія унцыі + {0} метрычная вадкая унцыя + {0} метрычныя вадкія унцыі + {0} метрычных вадкіх унцый + {0} метрычнай вадкай унцыі + бушалі {0} бушаль @@ -6932,7 +7022,105 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ брыт. кварты - + + стэрадыяны + {0} стэрадыян + {0} стэрадыяны + {0} стэрадыянаў + {0} стэрадыяна + + + каталы + {0} катал + {0} каталы + {0} каталаў + {0} катала + + + кулоны + {0} кулон + {0} кулоны + {0} кулонаў + {0} кулона + + + фарады + {0} фарад + {0} фарады + {0} фарадаў + {0} фарада + + + генры + {0} генры + {0} генры + {0} генры + {0} генры + + + сіменсы + {0} сіменс + {0} сіменсы + {0} сіменсаў + {0} сіменса + + + міжнародныя калорыі + {0} міжнародная калорыя + {0} міжнародныя калорыі + {0} міжнародных калорый + {0} міжнароднай калорыі + + + бекерэлі + {0} бекерэль + {0} бекерэлі + {0} бекерэляў + {0} бекерэля + + + зіверты + {0} зіверт + {0} зіверты + {0} зівертаў + {0} зіверта + + + грэі + {0} грэй + {0} грэі + {0} грэяў + {0} грэя + + + кілаграм-сілы + {0} кілаграм-сіла + {0} кілаграм-сілы + {0} кілаграм-сіл + {0} кілаграм-сілы + + + тэслы + {0} тэсла + {0} тэслы + {0} тэслаў + {0} тэслы + + + веберы + {0} вебер + {0} веберы + {0} вебераў + {0} вебера + + + скорасць святла + {0} скорасць святла + {0} скорасці святла + {0} скарасцей святла + {0} скорасці святла + + частак на мільярд {0} частка на мільярд {0} часткі на мільярд @@ -6940,7 +7128,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} часткі на мільярд - ночы {0} ноч {0} ночы {0} начэй @@ -6998,6 +7185,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ г{0} + + к{0} + М{0} @@ -7189,6 +7379,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} элем. {0} элем. + + ч. + {0} ч. + {0} ч. + {0} ч. + {0} ч. + {0} % {0} % @@ -7214,6 +7411,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моль {0} молі + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + л/км {0} л/км @@ -7920,6 +8124,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мм рт. сл. {0} мм рт. сл. + + рт. сл. + {0} рт. сл. + {0} рт. сл. + {0} рт. сл. + {0} рт. сл. + фунты на кв. цалю {0} фунт на кв. цалю @@ -8165,6 +8376,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мет. кубкаў {0} мет. кубка + + м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + акр-футы {0} акр-фут @@ -8300,7 +8518,105 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} брыт. кварт {0} брыт. кварты - + + ср + {0} ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + {0} См + + + калм + {0} калм + {0} калм + {0} калм + {0} калм + + + Бк + {0} Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + {0} Гр + + + кгс + {0} кгс + {0} кгс + {0} кгс + {0} кгс + + + Тл + {0} Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + {0} Вб + + + ск. святла + {0} ск. святла + {0} ск. святла + {0} ск. святла + {0} ск. святла + + частак/мільярд {0} ч/млрд {0} ч/млрд @@ -8310,7 +8626,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ночы {0} ноч - {0} ноч + {0} ночы {0} начэй {0} ночы {0}/ноч @@ -8330,12 +8646,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}{1} + + ч. + {0} ч. + {0} ч. + {0} ч. + {0} ч. + {0}% {0}% {0}% {0}% + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} амер. тэрм {0} амер. тэрмы @@ -8348,26 +8678,132 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} фунт-сіл {0} фунт-сілы + + рт. сл. + {0} рт. сл. + {0} рт. сл. + {0} рт. сл. + {0} рт. сл. + + + м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + {0} м. вадк. унц. + {0} дэс. лыжка {0} дэс. лыжкі {0} дэс. лыжак {0} дэс. лыжкі - + + ср + {0} ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + {0} См + + + калм + {0} калм + {0} калм + {0} калм + {0} калм + + + Бк + {0} Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + {0} Гр + + + кгс + {0} кгс + {0} кгс + {0} кгс + {0} кгс + + + Тл + {0} Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + {0} Вб + + + с + {0} с + {0} с + {0} с + {0} с + + ч/млрд - {0} ч/млрд - {0} ч/млрд - {0} ч/млрд - {0} ч/млрд - ночы {0} ноч {0} ночы {0} начэй {0} ночы - {0}/ноч {0} У diff --git a/make/data/cldr/common/main/be_TARASK.xml b/make/data/cldr/common/main/be_TARASK.xml index ff9db1f909d..fd293dec873 100644 --- a/make/data/cldr/common/main/be_TARASK.xml +++ b/make/data/cldr/common/main/be_TARASK.xml @@ -1361,13 +1361,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Аўганістанскі час - - - Заходнеафрыканскі час - Заходнеафрыканскі змоўчны час - Заходнеафрыканскі летні час - - Час Аляскі @@ -1670,6 +1663,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Час Пэрсыдзкага заліву + + + Гавайска-Алэвуцкі змоўчны час + + Гавайска-Алевуцкі час diff --git a/make/data/cldr/common/main/bew.xml b/make/data/cldr/common/main/bew.xml index 2c39d42b48b..0c6f4c0a49c 100644 --- a/make/data/cldr/common/main/bew.xml +++ b/make/data/cldr/common/main/bew.xml @@ -62,10 +62,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bambara Benggala Tibèt + Bahtiar Brèton Boro Bosni Akosé + Buriat Bugis Belin Katalan @@ -89,6 +91,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kurdi, Tenga Cilkotin Korsikan + Gibti Micip Kri Wètan Kidul Kri Dataran @@ -228,6 +231,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bapia Kèl Kurdi + Kurdi Kumuk Komi Kornis @@ -278,7 +282,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Maori Mikmak Minangkabo - Makèdoni + Makédoni Malayalam Monggol Manipur @@ -337,6 +341,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Papiamèn Palau Pijin Nigéria + Pali Pijin Pol Malisèt-Pasamakuodi @@ -850,7 +855,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sint-Martèn (Prasman) Madagaskar Pulo Marsal - Makèdoni Lor + Makédoni Lor Mali Mianmar (Birma) Monggoli @@ -1099,13 +1104,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Almenak Bingkok Pormat Mata Uang Pembukuan Pormat Mata Uang Pakem - Rèntètan Sortir Tionghoa Terdisionil - Big5 Rèntètan Sortir Sebelonnya, bakal kecocokan Rèntètan Sortir Kamus Rèntètan Sortir Bawaan Unicode Rèntètan Sortir Émoji Aturan Pengrèntètan Èropa - Rèntètan Sortir Tionghoa Ringkes - GB2312 Rèntètan Sortir Buku Telepon Rèntètan Sortir Pin-in Rèntètan Sortir Kerobah @@ -3119,9 +3122,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waktu Aprika Kulon - Waktu Pakem Aprika Kulon - Waktu Musim Pentèr Aprika Kulon + Waktu Aprika Kulon @@ -3504,6 +3505,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Waktu Guyana + + + Waktu Pakem Hawai-Aléut + + Waktu Hawai-Aléut @@ -4939,7 +4945,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimol per lèter {0} milimol per lèter - + bagèan per juta {0} bagèan per juta @@ -5567,7 +5573,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic biji {0} biji - + bagèan/juta diff --git a/make/data/cldr/common/main/bg.xml b/make/data/cldr/common/main/bg.xml index e7a63e3da12..71aee54bb15 100644 --- a/make/data/cldr/common/main/bg.xml +++ b/make/data/cldr/common/main/bg.xml @@ -276,6 +276,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафия кьолнски кюрдски + кюрдски + курманджи кумикски кутенай коми @@ -792,6 +794,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Китай Колумбия остров Клипертон + Сарк Коста Рика Куба Кабо Верде @@ -1065,33 +1068,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Сортиране на цифрите Сила на сортиране валута + Представяне на емотикон Часови формат (12- или 24-часов) Стил за нов ред + Нов ред в средата на думите Мерна система цифри + прекъсване на изречение след съкращение Часова зона Вариант на локала Собствена употреба будистки календар + будистки китайски календар + китайски коптски календар + коптски корейски календар + корейски етиопски календар + етиопски етиопски календар Амит Алем + етиопски Амит Алем григориански календар + григориански еврейски календар + еврейски Индийски граждански календар ислямски календар - ислямски цивилен календар - ислямски календар (Ум ал-Кура) + Хиджра + ислямски календар Хиджра + календар Хиджра + ислямски календар Хиджра (Ум ал-Кура) + Хиджра (Ум ал-Кура) календар съгласно ISO 8601 японски календар + японски персийски календар + персийски календар на Република Китай + календар Мингуо формат на валута за счетоводни цели + счетоводен стандартен формат на валута + стандартен Сортиране по символи Сортиране с пренебрегване на символи Нормално сортиране по диакритични знаци @@ -1101,21 +1123,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Сортиране първо по горен регистър Сортиране без различаване на регистъра на буквите Сортиране с различаване на регистъра на буквите - Традиционен китайски (Big5) предишен ред на сортиране, за съвместимост + съвместимост Речников ред на сортиране + речник ред на сортиране в Unicode по подразбиране - Опростен китайски (GB2312) + по подразбиране Unicode Азбучен ред + азбучен Фонетичен ред на сортиране + фонетичен Сортиране Пинин + Пинин търсене с общо предназначение + търсене Търсене по първоначални съгласни в хангул стандартен ред на сортиране + стандартен Сортиране по щрих + щрих Традиционно сортиране + традиционно Ред на сортиране по ключове и черти + ключове и черти ред на сортиране Бопомофо + Бопомофо Сортиране без нормализиране Нормализирано сортиране в Уникод Сортиране на цифрите индивидуално @@ -1128,18 +1160,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ С пълна ширина С половин ширина Цифрови + по подразбиране + емоджи + текст 12-часова система (0 – 11) + 12 (0 – 11) 12-часова система (1 – 12) + 12 (1 – 12) 24-часова система (0 – 23) + 24 (0 – 23) 24-часова система (1 – 24) + 24 (1 – 24) Свободен стил за нов ред + Свободен Нормален стил за нов ред + Нормален Строг стил за нов ред + Строг + Разделяне на всички + Запазване на всички + Нормално + Запазване във фразите АКГН (BGN) ГЕСГИ ООН (UNGEGN) Метрична система + Метрична Имперска мерна система + Обединено кралство Мерна система на САЩ + САЩ арабско-индийски цифри разширени арабско-индийски цифри арменски цифри @@ -1184,6 +1233,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тибетски цифри Традиционни цифри цифри във ваи + изкл. + вкл. метрична @@ -1248,6 +1299,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -1256,6 +1310,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -1292,6 +1349,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm 'ч'. h:mm:ss 'ч'. a HH:mm:ss 'ч'. + HH 'ч' v M d.MM E, d.MM @@ -1652,6 +1710,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} 'ч' + @@ -1660,11 +1721,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} 'ч' + {1}, {0} + + {1}, {0} 'ч' + @@ -1675,15 +1742,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h 'ч'. B h:mm 'ч'. B h:mm:ss 'ч'. B + E, h B E, h:mm 'ч'. B E, h:mm:ss 'ч'. B E, d + E, h a E, h:mm 'ч'. a E, HH:mm 'ч'. E, h:mm:ss 'ч'. a E, HH:mm:ss 'ч'. y 'г'. G + M.y 'г'. G dd.MM.y 'г'. GGGGG + E, d.M.y 'г'. G MM.y 'г'. G d.MM.y 'г'. G E, d.MM.y 'г'. G @@ -1700,6 +1771,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm:ss 'ч'. v h:mm 'ч'. a v HH:mm 'ч'. v + h 'ч'. a v + HH 'ч' v d.MM E, d.MM MM @@ -2558,6 +2631,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гринуич{0} Гринуич + Гринуич+? {0} – лятно часово време {0} – стандартно време @@ -2913,6 +2987,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Великденски остров + + Койайке + Пунта Аренас @@ -3178,9 +3255,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пном Пен - Ендърбъри - - Кантон @@ -3850,9 +3924,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Западноафриканско време - Западноафриканско стандартно време - Западноафриканско лятно часово време + Западноафриканско време @@ -4209,6 +4281,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гаяна + + + Хавайско-алеутско стандартно време + + Хавайско-алеутско време @@ -4791,9 +4868,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + #,##0.00 #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -6079,6 +6159,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ източнокарибски долара XCD + + Карибски гулден + Карибски гулден + Карибски гулден + Специални права на тираж @@ -6172,6 +6257,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ зимбабвийски долар зимбабвийски долара + + Зимбабвийско злато + Зимбабвийско злато + Зимбабвийско злато + Зимбабвийски долар (2009) зимбабвийски долар (2009) @@ -6306,7 +6396,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метра за секунда на квадрат - оборот + обороти {0} оборот {0} оборота @@ -6395,7 +6485,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} единица {0} единици - + + части + {0} част + {0} части + + части на милион {0} част на милион {0} части на милион @@ -6415,9 +6510,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ молове - {0} мол + {0} mol {0} мола + + глюкоза + {0} глюкоза + {0} глюкоза + литри на километър {0} литър на километър @@ -6935,6 +7035,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} милиметър живачен стълб {0} милиметра живачен стълб + + живачен стълб + фунтове на квадратен инч {0} фунт на квадратен инч @@ -7108,6 +7211,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метрична чаша {0} метрични чаши + + метрични течни унции + {0} метрична течна унция + {0} метрични течни унции + акър-футове {0} акър-фут @@ -7190,20 +7298,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} имперска кварта {0} имперски кварти - - светлина - {0} светлина - {0} светлина + + стерадиани + {0} стерадиан + {0} стерадиана - + + катали + {0} катал + {0} катала + + + кулони + {0} кулон + {0} кулона + + + фаради + {0} фарад + {0} фарада + + + хенри + {0} хенри + {0} хенри + + + сименс + {0} сименс + {0} сименса + + + калории [IT] + {0} калория [IT] + {0} калории [IT] + + + бекерели + {0} бекерел + {0} бекерела + + + сиверти + {0} сиверт + {0} сиверта + + + грей + {0} грей + {0} грея + + + килограм-сила + {0} килограм-сила + {0} килограма-сила + + + тесла + {0} тесла + {0} тесла + + + вебери + {0} вебер + {0} вебера + + части на милиард {0} част на милиард {0} части на милиард - нощи - {0} нощ - {0} нощи {0} на нощ @@ -7250,6 +7415,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ед. {0} ед. + + част + {0} част + {0} част + процент @@ -7258,8 +7428,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ мол - {0} мол - {0} мол + {0} mol + {0} mol + + + Glc + {0} Glc + {0} Glc l/km @@ -7554,12 +7729,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} имп. кварта {0} имп. кварти + + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + светлина {0} светлина {0} светлина - + части/милиард @@ -7584,12 +7792,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} кв. миля {0} кв. мили + + част + {0} част + {0} част + % + + mol + {0} mol + {0} mol + + + Glc + PB @@ -7661,16 +7882,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} брит. дес. лъж. {0} брит. дес. лъж. - - светлина - {0} светлина - {0} светлина + + {0} kat + {0} kat - - нощи - {0} нощ - {0} нощи - {0}/нощ + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + ppb diff --git a/make/data/cldr/common/main/blo.xml b/make/data/cldr/common/main/blo.xml index a19f37f2d06..d4ca17e28be 100644 --- a/make/data/cldr/common/main/blo.xml +++ b/make/data/cldr/common/main/blo.xml @@ -15,36 +15,350 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} : {1} + Afaar kagɩja + Abkhase kagɩja + Saʊtafrɩka kagɩja + Agem kagɩja + Akan kagɩja + Amhariiki kagɩja + Aragonɛs kagɩja + oboloo kagɩja + gjakalaŋ kagɩlaarɩbuja gɩlaaribuja gɩlaaribuja ŋgɩɖee kǝ ba na fʊba na + mapushi kagɩja + Assamɛs kagɩja + Asuu kagɩja + Asturiya kagɩja + Asɛrbayijanii kagɩja + Aserii kagɩja + Bashikiiri kagɩja + Balushii kagɩja + Basaa kagɩja + Belarusiya kagɩja + Bɛmba kagɩja + Betawii kagɩja + Bena kagɩja + Bulgariya kagɩja + Haryaŋfiki kagɩja + Gɩbaloshiija + Bojpuri kagɩja anii kagɩja - baŋglaa kagɩja + Taii Ɖam kagɩja + Bambaraa kagɩja + Baŋgǝla kagɩja + Tibetaŋ kagɩja (Gɩtibetaŋja) + Baktiyarii kagɩja + Bretɔn kagɩja + Boɖo kagɩja + Bosniya kagɩja + Akoose kagɩja + Buriyaat kagɩja + Bliin kagɩja + Katalan kagɩja + Canaɖo kagɩja + Atsam kagɩja + Shakma kagɩja + Sheshɛn kagɩja + Sebuwanoo kagɩja + Shiga kagɩja + Shɔktaʊ kagɩja + Sherokee kagɩja + Shikasawʊ kagɩja + Kurɖish gɩcɩɩca kagɩja + Kurɖish, gɩcɩɩca kagɩja + Kurɖish, Sorani kagɩja + Kɔrsikan kagɩja + Kɔptik kagɩja + Cɛk kagɩja + sʊwampii kree kagɩja + Shʊrshʊ kagɩja + Shufash kagɩja + Gɩwɛlshja + Ɖanǝmaakɩ kagɩja + Tayɩta kagɩja (Gɩtayɩtaja) gɩjaamaja + Gɩsarmaja + Ɖogri kagɩja + sɔrabɩyan atǝntǝn kagɩja + Ɖuwala kagɩja + Ɖifehii kagɩja + jola-fonyii kagɩja + Ɖsɔŋgkha kagɩja + ɛmbuu kagɩja + gɩyigbeja + grɛɛkɩ kagɩja gɛɛshɩ gɛɛshɩ (Ganɔ gaɖɔŋkɔnɔ kabʊtǝna Amalɩka nɩ) gɛɛshɩ (GKA) + Ɛspɛrnatoo kagɩja gɩspaŋja gɩspaŋja (latɛŋ kaAmalɩkatǝna) + Ɛstonia kagɩja + Baske kagɩja + Ɛwonɖoo kagɩja + pɛrsɩaŋ kagɩja + ɖaarii kagɩja + gɩfǝlanɖɩja + finiish kagɩja + filipinoo kagɩja + faroɛsi kagɩja gɩfɔnɔ + Kajun kagɩfɔnɔ + friisɔŋ gʊnyɩpɛnɛlaŋ kagɩja + friula kagɩja + Gɩfrisianja + irlanɖɛɛ kagɩja + gaa kagɩja + skɔtiishɩ kagɩja + gɛɛsɩ kagɩja + galisiaŋ kagɩja + gaaranii kagɩja + suisi jaama kagɩja + gujaratii kagɩja + gusii kagɩja + mansɩ kagɩja + gɩgambrɩja + hawahiyaŋ kagɩja + hebree kagɩja + hinɖii kagɩja hinɖii kagɩja (latɛŋ kʊja) hiŋgliishɩ kagɩja + Hmoŋg ŋjʊwaa kagɩja + Kʊrwasiya kagɩja + Upɛr Sɔrbɩyaŋ kagɩja + haɩtiɛŋ kreɔlɩ kagɩja + hɔŋgrii kagɩja + Armeniya kagɩja + ɛntɛrliŋgua kagɩja Ɛnɖonosii kagɩja + ɛntɛrliŋguɩ kagɩja + ibo kagɩja + sishuaŋ yii kagɩja + iɖoo kagɩja + islanɖii kagɩja gɩtaliija + inuktituu kagɩja gɩjapaŋja + lɔbaŋ kagɩja + ŋgomba kagɩja + masham kagɩja + jafanɛɛ kagɩja + jɔrjia kagɩja + Karaa Kalpaakɩ kagɩja + kabil kagɩja + juu kagɩja + kambaa kagɩja + Gɩtɩyapja + makɔnɖee kagɩja + kapfɛɛ kagɩja + Kekshii kagɩja + Keniyaa kagɩja + kaɩŋgan kagɩja + koyira-shiinii kagɩja + kikuyuu kagɩja + kasaakɩ kagɩja + kakoo kagɩja + kalaalisut kagɩja + kalaŋjɩn kagɩja + kamɛr kagɩja + kananɖa kagɩja Koree kagɩja + koŋkanii kagɩja + kpɛl kagɩja + kashimirii kagɩja + shambalaa kagɩja + Bafiya kagɩja + Kolonyiya kagɩja + kurɖikɩ kagɩja + Kʊrɖiishi kagɩja + Kʊrmanjii kagɩja + Kɔrnish kagɩja + Kʊfii kagɩja + kirgis kagɩja + latɛŋ kagɩja + Laŋgii kagɩja + Lʊsɛŋburgiishi kagɩja + ganɖaa kagɩja + Liguriaŋ kagɩja + Lakotaa kagɩja + Laɖɛŋ kagɩja + Lɔmbaarɩ kagɩja + liŋgalaa kagɩja + lawo kagɩja + luwisaana kreyɔl kagɩja + lorii gʊnyɩpɛnɛlaŋ kagɩja + lituyanii kagɩja + Latɩgalɩyaŋ Kagɩja + luba-kataŋgaa kagɩja + luwo kagɩja + luyaa kagɩja + latɩfɩyaŋ kagɩja + Laas kagɩja + mayitilii kagɩja + Masaɩ kagɩja + moshaa kagɩja + meruu kagɩja + kreyol-morisi kagɩja + malagaasɩ kagɩja + Makuwa-meeto kagɩja + metaa kagɩja + Moshenoo kagɩja + maworii kagɩja + Mikmaawʊ kagɩja + maseɖoniya kagɩja + maalayalam kagɩja + moŋgolii kagɩja + manipurii kagɩja + mowak kagɩja + maratii kagɩja + malɛɛ kagɩja + maltɛsɩ kagɩja + manɖaŋgɩ kagɩja + ɩkrǝ tuutuuma + kriki kagɩja + Burmɛs kagɩja + Ɛrsia kagɩja + masanɖarii kɩja + namaa kagɩja + nɔrfɛɛjɩ bokimalɩ kagɩja + nɖebelee gʊnyɩpɛnɛlaŋ kagɩja + jaama atǝntǝn kagɩja + jaama atǝntǝn kagɩja (Holanɖ) + nepal kagɩja Holanɖ kagɩja + kʊwasiyo kagɩja + nɔrfɛɛjɩ ninɔrisikɩ kagɩja + ŋgiyembuu kagɩja + nɔrfɛɛjɩ kagɩja + ŋkoo kagɩja + nɖebelee gʊnyɩsonolaŋ kagɩja + sotoo gʊnyɩpɛnɛlaŋ kagɩja + nuyɛr kagɩja + nafaɖo kagɩja + shewa kagɩja + niyaŋkolee kagɩja + oksitaŋ kagɩja + oromoo kagɩja + oɖia kagɩja + osɛtiiki kagɩja + Osage kagɩja + Pʊŋjabii kagɩja + papiamantoo kagɩja + piɖijin nanjiriya kagɩja + Pijiŋ kagɩja Polanɖ kagɩja + Piyeɖmɔŋtɛsɩ kagɩja + Prʊsiaŋ kagɩja + pashɩtoo kagɩja gɩpɔrtigalja + Keshʊwaa kagɩja + Kishee kagɩja + Rajastanii kagɩja + Rɔhiŋgiyaa kagɩja + Rifiyaŋ kagɩja + Romaŋshɩ kagɩja + Rʊnɖii kagɩja + Romaniaŋ kagɩja + Romaniaŋ kagɩja (Mɔlɖafiya) + Rɔŋboo kagɩja gɩrɔɔshɩyaja + kiŋyarwan kagɩja + rʊwaa kagɩja + saŋskriitɩ kagɩja + Gɩyakutuja + samburu + santalii kagɩja + saŋguu kagɩja + sarɖiniaŋ kagɩja + sisiliaŋ kagɩja + sɛnɖii kagɩja + Kʊrɖish gʊnyɩsonolaŋ kaja kagɩja + samee + senaa kagɩja + koyirabɔrɔ-senii kagɩja + saŋgoo kagɩja + samburuu kagɩja + Tashelhiiti kagɩja (Gɩtashelhiitija) + Shaŋ kagɩja + sɛnhalaa kagɩja + Siɖamoo kagɩja + slofaakɩ kagɩja + Gɩsarayikiija + slofenia kagɩja + Samii gʊnyɩsonolaŋ kaja kagɩja + Lʊl Samii kagɩja + inarii samii kagɩja + skɔltɩ samii kagɩja + shonaa kagɩja + somalii kagɩja + Albaniya kagɩja + sɛrbiaŋ kagɩja + sʊwatii kagɩja + Sawoo kagɩja + sotoo gʊnyɩsonolaŋ kaja kagɩja + sunɖanɛsɩ kagɩja + sʊwɛɛɖɩ kagɩja + sʊwahilii kagɩja + Ccŋgoo sʊwahilii kagɩja + siriyaakɩ kagɩja + Sisiliyaŋ kagɩja + Tamil kagɩja (Gɩtamilja) + Telugu kagɩja (Gɩteluguja) + Teso kagɩja (Gɩtesoja) + Tajiik kagɩja taɩ kagɩja + Tigrinyaa kagɩja + Tiigr kagɩja + Tirkmɛn kagɩja + Cʊwanaa kagɩja (Gɩcʊwanaja) + Tɔŋgaŋ kagɩja (Gɩtɔŋgaŋja) + Toki Ponaa kagɩja + TɔkPisin kagɩja gɩturkiija + Taroko kagɩja (Gɩtarokoja) + Tɔɔrwalii kagɩja + Sɔŋgaa kagɩja (Gɩsɔŋgaja) + Tatar kagɩja + Tasawak kagɩja (Gɩtasawakǝja) + Tufiniyaŋ kagɩja + Tamaasit Atlas kagɩcɩɩca kagɩja + gɩwigurja + Ukraɩnɩya kagɩja gɩkrǝ ŋgɩɖee kʊyɔʊ ʊ mana ma + Gɩurɖuja + Usbɛkɩ kagɩja + Gɩfayɩja + Fanɖa kagɩja + Fenɛsiaŋ kagɩja + Gɩfɩɛtɩnamɛɛsɩja + Makʊwa kagɩja + Folapuku kagɩja + Gɩfunjoja + Gɩwalɔnja + Gɩwalsaja + Gɩwolaɩtaja + Gɩwarpurija + Gɩwolofja + Gɩsoosaja + Kaŋgrii kagɩja + sogaa kagɩja + Gɩyaŋgbɛnja + Gɩyiɖiishija + Gɩyorubaja + ŋyeeŋgatuu kagɩja + Kantonɛs kagɩja + Kantonɛs kagɩcaɩnaja + Gɩsʊaŋja + morooko tamsiik ka (tututu) kagɩja gɩcaɩnaja manɖarɛŋ gɩcaɩnaja, manɖarɛŋ gɩcaɩnaja gɩburoka gɩcaɩnaja manɖarɛŋ gɩburoka gɩcaɩnaja tututu gɩcaɩnaja manɖarɛŋ tututu + Gɩsuluja + gɩkrǝ kakoɖǝn ɩ mana @@ -385,6 +699,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Etiyopii kɩshilé na kɩŋɔrɔ ɩtʊrka Etiyopii kɩshilé na kɩŋɔrɔ ɩtʊrka (Amete Alɛm) Gregɔɔ ‘ɩshilé n’‘ɩŋɔrɔ ɩtʊrka + Gregɔɔ kaja Yahuuɖi kǝbaja bɩshilé na bɩŋɔrɔ ɩtʊrka Inɖiya kɩshilé na kɩŋɔrɔ ɩtʊrka gɩnǝma kɩshilé na kɩŋɔrɔ ɩtʊrka @@ -392,11 +707,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic gɩnǝma kɩshilé na kɩŋɔrɔ ɩtʊrka akʊn aŋɔrɔ (Sauɖiya) gɩnǝma kɩshilé na kɩŋɔrɔ ɩtʊrka aɖʊ (ɩŋɔripi ɩceuka katam) gɩnǝma kɩshilé na kɩŋɔrɔ ɩtʊrka (Um al-Kra) - ISO-8601 kɩshilé na kɩŋɔrɔ ɩtʊrka + Gregɔɔ ‘ɩshilé n’‘ɩŋɔrɔ ɩtʊrka (asǝba na gaja) Japaŋ kɩshilé na kɩŋɔrɔ ɩtʊrka Pɛrs kǝbaja bɩshilé na kɩŋɔrɔ ɩtʊrka miŋguwo kɩshilé na kɩŋɔrɔ ɩtʊrka ɩbii kʊnyaʊ ɖeiɖei + ɖeiɖei mɛta kʊfaŋʊ kayaashɩ Gɛɛshɩ kʊfaŋʊ kayaashɩ Amalɩka kʊfaŋʊ kayaashɩ @@ -414,8 +730,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic - [aáàâ b c ɖ eéèê ǝ{ǝ́}{ǝ̀}{ǝ̂} ɛ{ɛ́}{ɛ̀}{ɛ̂} f g {gb} h iíìî ɩ{ɩ́}{ɩ̀}{ɩ̂} j k {kp} l mḿ{m̀} nńǹ {ny} ŋ{ŋ́}{ŋ̀} {ŋm} oóòô ɔ{ɔ́}{ɔ̀}{ɔ̂} p r s {sh} t uúùû ʊ{ʊ́}{ʊ̀}{ʊ̂} w y] - [ăǎåäãā{a̰} æ ɓ ćç d ɗ ĕěëẽēḛ {ǝ̃}{ǝ̄}{ǝ̰} {ə̌} {ɛ̌}{ɛ̃}{ɛ̄}{ɛ̰} ƒ ɣ {hw} ĭǐïĩīḭ ij {ɩ̃}{ɩ̄}{ɩ̰} {m̌}{m̄} ňñ{n̄} {ŋw} ŏǒöõøō{o̰} œ {ɔ̌}{ɔ̃}{ɔ̄}{ɔ̰} ř šſ ß ŭǔüūṵ {̃ũ} {ʊ̌}{ʊ̃}{ʊ̄}{ʊ̰} v ʋ x {xw} ÿ ƴ z ʒ {̃ʼ}] + [aáàâ ǝ{ǝ́}{ǝ̀}{ǝ̂} b c ɖ eéèê ɛ{ɛ́}{ɛ̀}{ɛ̂} f g {gb} h iíìî ɩ{ɩ́}{ɩ̀}{ɩ̂} j k {kp} l mḿ{m̀} nńǹ {ny} ŋ{ŋ́}{ŋ̀} {ŋm} oóòô ɔ{ɔ́}{ɔ̀}{ɔ̂} p r s {sh} t uúùû ʊ{ʊ́}{ʊ̀}{ʊ̂} w y] + [ăǎåäãā{a̰} æ {ǝ̃}{ǝ̄}{ǝ̰} ɓ ćç d ɗ ĕěëẽēḛ {ə̌} {ɛ̌}{ɛ̃}{ɛ̄}{ɛ̰} ƒ ɣ {hw} ĭǐïĩīḭ ij {ɩ̃}{ɩ̄}{ɩ̰} {m̌}{m̄} ňñ{n̄} {ŋw} ŏǒöõøō{o̰} œ {ɔ̌}{ɔ̃}{ɔ̄}{ɔ̰} q ř šſ ß ŭǔüūṵ {̃ũ} {ʊ̌}{ʊ̃}{ʊ̄}{ʊ̰} v ʋ x {xw} ÿ ƴ z ʒ {̃ʼ}] [   \- ‑ , . % ‰ ‱ + 0 1 2² 3³ 4 5 6 7 8 9 {ʲᵃ} {ᵏᵃ}] [_ \- ‐‑ – — ― , ; \: ! ? . … '‘’ ‹ › "“” « » ( ) \[ \] \{ \} § @ * / \\ \& # % ‰ ‱ † ‡ • ‣ ‧ ′ ″ ° < = > | ¦ ~] @@ -446,7 +762,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - M/d/y GGGGG + M/d/y G @@ -473,12 +789,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d + E, h a E, h a mm E, HH:mm E, h a mm:ss E, HH:mm:ss y G - M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d y G E, MMM d y G @@ -489,9 +808,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, MMM d y G y G - M/y GGGGG - M/d/y GGGGG - E, M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d y G E, MMM d y G @@ -558,7 +877,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM d – d - MMM d – MMM d E, MMM d – E, MMM d @@ -762,17 +1080,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEEE, MMMM d y + EEEE, MMMM d/y - MMMM d y + y MMMM d - MMM d y + MMM d/y @@ -825,22 +1143,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h B mm - h B mm:ss - E h B mm - E h B mm:ss E d - E h a mm - E h a mm:ss + E h:mm a + E h:mm:ss a y G + M/y G M/d/y G + E, M/d/y G MMM y G MMM d y G E, MMM d y G - h a mm - h a mm:ss - h a mm:ss v - h a mm v + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v M/d E, M/d E, MMM d @@ -851,8 +1167,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic M/d/y E, M/d/y MMM y - MMM d y - E, MMM d y + MMM d/y + E, MMM d/y MMMM y QQQ y QQQQ y @@ -910,25 +1226,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH – HH - h a mm – h a mm - h a mm – h a mm - h a mm – h a mm + h:mm a – h:mm a + h:mm a – h:mm a + h:mm a – h:mm a HH:mm – HH:mm HH:mm – HH:mm - h a mm a – h a mm v - h a mm – h a mm v - h a mm – h a mm v + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v HH:mm – HH:mm v HH:mm – HH:mm v - h a – h a v h a – h a v @@ -950,7 +1265,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM d – d - MMM d – MMM d E, MMM d – E, MMM d @@ -1244,7 +1558,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - mpá nɖee kʊyɔʊ ʊ mana ma + gaɖu ŋgaɖee kʊyɔʊ ʊ mana ma Anɖɔraa @@ -1252,6 +1566,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ɖubaɩ + + Kabuul + Antiguwaa @@ -1318,6 +1635,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Katamarkaa + + Saltaa + Huhuyi @@ -1477,6 +1797,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Timfu + + Gaboronee + Mɩns @@ -1525,6 +1848,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Raŋkɩn Ɩnlɛɛtɩ + + Atikokaan + Torɔntoo @@ -1576,6 +1902,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ista + + Koihaiik + + + Punta Arenaasɩ + Santiyagoo @@ -1588,6 +1920,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Shaŋgaɩ + + Bogotaa + Kɔsta Rikaa @@ -1714,12 +2049,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tuule + + Nuuku + Itokɔrtoomiiti Ɖanǝmarkɩhaʊn + + Banjuul + Konakrii @@ -1825,7 +2166,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nɔm Pɛn - + Kantɔn @@ -2323,6 +2664,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kiyɛf + + Simferopool + Kampalaa @@ -2335,9 +2679,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Aɖak + + Noome + Aŋkɔraajɩ + + Yakutaatɩ + Sitkaa @@ -2480,9 +2830,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Garɩɖontǝna gɩteŋshilelaŋ kaakɔŋkɔŋɔ̀ - Garɩɖontǝna gɩteŋshilelaŋ kaakɔŋkɔŋɔ̀ ɖeiɖei - Garɩɖontǝna gɩteŋshilelaŋ kaakɔŋkɔŋɔ̀ gafʊbaka + Garɩɖontǝna gɩteŋshilelaŋ kaakɔŋkɔŋɔ̀ @@ -2529,9 +2877,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Apiya kaakɔŋkɔŋɔ̀ - Apiya kaakɔŋkɔŋɔ̀ ɖeiɖei - Apiya kaakɔŋkɔŋɔ̀ gafʊbaka + Samowa kaakɔŋkɔŋɔ̀ + Samowa kaakɔŋkɔŋɔ̀ ɖeiɖei + Samowa kaakɔŋkɔŋɔ̀ gafʊbaka @@ -2637,7 +2985,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Brunɛɩ Ɖarusalaam kaakɔŋkɔŋɔ̀ + Brunɛɩ kaakɔŋkɔŋɔ̀ @@ -2840,6 +3188,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyanaa kaakɔŋkɔŋɔ̀ + + + Awayɩɩ n’Alewutii kaakɔŋkɔŋɔ̀ ɖeiɖei + + Awayɩɩ n’Alewutii kaakɔŋkɔŋɔ̀ @@ -2856,9 +3209,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Hɔfɖǝ kaakɔŋkɔŋɔ̀ - Hɔfɖǝ kaakɔŋkɔŋɔ̀ ɖeiɖei - Hɔfɖǝ kaakɔŋkɔŋɔ̀ gafʊbaka + Kɔfɖǝ kaakɔŋkɔŋɔ̀ + Kɔfɖǝ kaakɔŋkɔŋɔ̀ ɖeiɖei + Kɔfɖǝ kaakɔŋkɔŋɔ̀ gafʊbaka @@ -3173,12 +3526,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ponapee kaakɔŋkɔŋɔ̀ + Poonpei kaakɔŋkɔŋɔ̀ - Pɩyɔŋyaŋ kaakɔŋkɔŋɔ̀ + Koree gʊnyɩpɛnɛlaŋ kaakɔŋkɔŋɔ̀ @@ -3200,9 +3553,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Samowa kaakɔŋkɔŋɔ̀ - Samowa kaakɔŋkɔŋɔ̀ ɖeiɖei - Samowa kaakɔŋkɔŋɔ̀ gafʊbaka + Samowa Amalɩka kaja kaakɔŋkɔŋɔ̀ + Samowa Amalɩka kaja kaakɔŋkɔŋɔ̀ ɖeiɖei + Samowa Amalɩka kaja kaakɔŋkɔŋɔ̀ gafʊbaka @@ -3242,9 +3595,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Taɩpei kaakɔŋkɔŋɔ̀ - Taɩpei kaakɔŋkɔŋɔ̀ ɖeiɖei - Taɩpei kaakɔŋkɔŋɔ̀ gafʊbaka + Taɩwan kaakɔŋkɔŋɔ̀ + Taɩwan kaakɔŋkɔŋɔ̀ ɖeiɖei + Taɩwan kaakɔŋkɔŋɔ̀ gafʊbaka @@ -3362,6 +3715,88 @@ CLDR data files are interpreted according to the LDML specification (http://unic ,   + + + + baa kotoku 0 + kotoku 0 + ɩkotoku 0 + baa kotoku 00 + kotoku 00 + ɩkotoku 00 + baa kotoku 000 + kotoku 000 + ɩkotoku 000 + baa gakuli 0 + gakuli 0 + bʊkuli 0 + baa gakuli 00 + gakuli 00 + bʊkuli 00 + baa gakuli 000 + gakuli 000 + bʊkuli 000 + baa ŋkulo 0 + ŋkulo 0 + akulo 0 + baa ŋkulo 00 + ŋkulo 00 + akulo 00 + baa ŋkulo 000 + ŋkulo 000 + akulo 000 + baa ŋkrǝ 0 + ŋkrǝ 0 + akrǝ 0 + baa ŋkrǝ 00 + ŋkrǝ 00 + akrǝ 00 + baa ŋkrǝ 000 + ŋkrǝ 000 + akrǝ 000 + + + + + kt 0 + kt 0 + ɩkt 0 + kt 00 + kt 00 + ɩkt 00 + kt 000 + kt 000 + ɩkt 000 + gkl 0 + gkl 0 + bkl 0 + gkl 00 + gkl 00 + bkl 00 + gkl 000 + gkl 000 + bkl 000 + ŋkl 0 + ŋkl 0 + akl 0 + ŋkl 00 + ŋkl 00 + akl 00 + ŋkl 000 + ŋkl 000 + akl 000 + ŋkr 0 + ŋkr 0 + akr 0 + ŋkr 00 + ŋkr 00 + akr 00 + ŋkr 000 + ŋkr 000 + akr 000 + + + @@ -3373,6 +3808,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;¤ -#,##0.00 + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + + + ¤ kt 0 + ¤ kt 0 + ¤ ɩkt 0 + ¤ kt 00 + ¤ kt 00 + ¤ ɩkt 00 + ¤ kt 000 + ¤ kt 000 + ¤ ɩkt 000 + ¤ gkl 0 + ¤ gkl 0 + ¤ bkl 0 + ¤ gkl 00 + ¤ gkl 00 + ¤ bkl 00 + ¤ gkl 000 + ¤ gkl 000 + ¤ bkl 000 + ¤ ŋkl 0 + ¤ ŋkl 0 + ¤ akl 0 + ¤ ŋkl 00 + ¤ ŋkl 00 + ¤ akl 00 + ¤ ŋkl 000 + ¤ ŋkl 000 + ¤ akl 000 + ¤ ŋkr 0 + ¤ ŋkr 0 + ¤ akr 0 + ¤ ŋkr 00 + ¤ ŋkr 00 + ¤ akr 00 + ¤ ŋkr 000 + ¤ ŋkr 000 + ¤ akr 000 {1} {0} @@ -4292,6 +4773,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Karayiib gajakalaŋ kaɖala Karayiib gajakalaŋ kɩɖala + + Karayiib kafɔlɔrɛŋ + baa Karayiib kafɔlɔrɛŋ + Karayiib kafɔlɔrɛŋ + Karayiib kɩfɔlɔrɛŋ + Garɩɖontǝna gɩteŋshilelaŋ kasɛɛfa baa Garɩɖontǝna gɩteŋshilelaŋ kasɛɛfa @@ -4328,6 +4815,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sambii kakʊwaasha Sambii kɩkʊwaasha + + Simbabʊwee kawura + baa Simbabʊwee kawura + Simbabʊwee kawura + Simbabʊwee kɩwura + baa ʊshilé {0} @@ -4560,6 +5053,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic bʊkɔ {0} ayɔkɔ {0} + + ɩpaartɩ + ɩshɩnʊn nɩ ɩshɩnʊn nɩ {0} @@ -4578,6 +5074,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic mol {0} ɩmol {0} + + gulukoos kaja + baa gulukoos {0} + gulukoos kaja {0} + gulukoos kaja {0} + ɩlitri kiloomɛta nɩ baa litri kiloomɛta nɩ {0} @@ -5020,6 +5522,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic mɛrkiir kamilimɛta {0} mɛrkiir kɩmilimɛta {0} + + mɛrkiir kaja + mɛrkiir kasǝkǝmǝ baa mɛrkiir kansǝkǝmǝ {0} @@ -5265,6 +5770,42 @@ CLDR data files are interpreted according to the LDML specification (http://unic ʊkɩtɩʊ {0} ɩkɩtɩʊ {0} + + ɩsɩteraɖiyaan + baa sɩteraɖiyaan {0} + sɩteraɖiyaan {0} + ɩsɩteraɖiyaan {0} + + + ɩkataal + + + ɩkʊlɔɔm + + + ɩfaraaɖɩ + + + ɩhɛnrii + + + ɩsimɛɛnsɩ + + + ɩbɛkɛrɛɛl + + + ɩsɩfɛɛrtɩ + + + ɩgrɛɛ + + + ɩtɛsɩlaa + + + ɩwɛbaasɩ + pɔɩɩ pɔɩɩ {0} @@ -5385,7 +5926,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic item {0} item {0} - + ppm {0} ppm {0} ppm {0} @@ -5410,6 +5951,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic mol {0} mol {0} + + Glc + L/km {0} L/km {0} @@ -6020,7 +6564,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic light {0} light {0} - + ppb {0} ppb {0} ppb {0} @@ -6140,7 +6684,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic item{0} item{0} - + ppm{0} ppm{0} ppm{0} @@ -6165,6 +6709,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic mol{0} mol{0} + + Glc + L/km{0} L/km{0} @@ -6768,7 +7315,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic light{0} light{0} - + ppb{0} ppb{0} ppb{0} @@ -6932,13 +7479,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Abɖu-Tɔyib + MUSA GOMINA ʊŋono Mustafa Tafa + Alɛ + ∅∅∅ KALAM + ∅∅∅ ajala Alaaji @@ -6951,7 +7502,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Alfɔns + Rolanɖ MANƉELA + + Prof. Ɖr. + Samʊwɛl + Sam + Fostɛɛŋ + fan + ƉAM + ƉOMIŊGO + Jr + + diff --git a/make/data/cldr/common/main/bm_Nkoo.xml b/make/data/cldr/common/main/bm_Nkoo.xml index fa4ebf3626c..9973eca7e1b 100644 --- a/make/data/cldr/common/main/bm_Nkoo.xml +++ b/make/data/cldr/common/main/bm_Nkoo.xml @@ -156,6 +156,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/bn.xml b/make/data/cldr/common/main/bn.xml index fea3fe71eb0..5609b377a70 100644 --- a/make/data/cldr/common/main/bn.xml +++ b/make/data/cldr/common/main/bn.xml @@ -54,7 +54,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ বেলুচী বালিনীয় বাসা - বেলারুশিয় + বেলারুশীয় বেজা বেম্বা বেনা @@ -94,7 +94,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ চিনুক জার্গন চকটাও চিপেওয়ান - চেরোকী + চেরোকি চেইয়েন মধ্য কুর্দিশ কুর্দিশ, মধ্য @@ -128,7 +128,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ডিংকা জার্মা ডোগরি - নিম্নতর সোর্বিয়ান + সোর্বিয়ান (নিম্নতর) দুয়ালা মধ্য ডাচ দিবেহি @@ -145,8 +145,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ এলামাইট ইংরেজি ইংরেজি (যুক্তরাজ্য) - ইংরেজি (আমেরিকা) - ইংরেজি (যুক্তরাষ্ট্র) + ইংরেজি (মার্কিন যুক্তরাষ্ট্র) মধ্য ইংরেজি এস্পেরান্তো স্প্যানিশ @@ -158,7 +157,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ দারি ফ্যাঙ্গ ফান্তি - ফুলাহ্ + ফুলা ফিনিশ ফিলিপিনো ফিজিয়ান @@ -181,7 +180,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ স্কটিশ-গ্যেলিক গীজ গিলবার্টিজ - গ্যালিশিয় + গ্যালিশীয় মধ্য-উচ্চ জার্মানি গুয়ারানি প্রাচীন উচ্চ জার্মানি @@ -207,7 +206,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ হ্‌মোঙ হিরি মোতু ক্রোয়েশীয় - উচ্চ সোর্বিয়ান + সোর্বিয়ান (উচ্চ) Xiang চীনা হাইতিয়ান ক্রেওল হাঙ্গেরীয় @@ -220,7 +219,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইবিবিও ইন্দোনেশীয় ইন্টারলিঙ্গ - ইগ্‌বো + ইগবো সিচুয়ান য়ি ইনুপিয়াক পশ্চিম কানাডিয় ইনুক্টিটুট @@ -228,7 +227,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইঙ্গুশ ইডো আইসল্যান্ডীয় - ইতালিয় + ইতালীয় ইনুক্টিটুট জাপানি লোজবান @@ -265,7 +264,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ কন্নড় কোরিয়ান কমি-পারমিআক - কোঙ্কানি + কোঙ্কণী কোস্রাইন ক্‌পেল্লে কানুরি @@ -277,13 +276,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ বাফিয়া কলোগনিয়ান কুর্দিশ + কুর্দিশ + কুরমাঞ্জি কুমিয়াক কুটেনাই কোমি কর্ণিশ কোয়াক’ওয়ালা কুভি - কির্গিজ + কিরগিজ লাতিন লাদিনো লাঙ্গি @@ -304,7 +305,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ লোজি উত্তরাঞ্চলীয় লুরি সামিয়া - লিথুয়েনীয় + লিথুয়ানীয় লুবা-কাটাঙ্গা লুবা-লুলুয়া লুইসেনো @@ -312,7 +313,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ লুয়ো মিজো লুইয়া - লাত্‌ভীয় + লাটভিয় মাদুরেজ মাগাহি মৈথিলি @@ -332,9 +333,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ মাওরি মিকম্যাক মিনাংকাবাউ - ম্যাসিডোনীয় - মালায়ালাম - মঙ্গোলিয় + ম্যাসেডোনিয়া + মালয়ালম + মোঙ্গোলীয় মাঞ্চু মণিপুরী ইন্নু-এমুন @@ -342,7 +343,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ মসি মারাঠি মালয় - মল্টিয় + মল্টীয় মুদাঙ্গ একাধিক ভাষা মুস্কোগী @@ -356,9 +357,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ নামা নরওয়েজিয়ান বোকমাল উত্তর এন্দেবেলে - নিম্ন জার্মানি + জার্মান (নিম্ন) লো স্যাক্সন - নেপালী + নেপালি নেওয়ারি এন্দোঙ্গা নিয়াস @@ -389,18 +390,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ওজি-ক্রী পশ্চিম ওজিবোয়া ওকানাগান - অরোমো + ওরোমো ওড়িয়া ওসেটিক ওসেজ অটোমান তুর্কি - পাঞ্জাবী + পাঞ্জাবি পাঙ্গাসিনান পাহ্লাভি পাম্পাঙ্গা পাপিয়ামেন্টো পালায়ুয়ান - নাইজেরিয় পিজিন + নাইজেরীয় পিজিন প্রাচীন ফার্সি ফোনিশীয়ান পালি @@ -411,9 +412,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ প্রুশিয়ান প্রাচীন প্রোভেনসাল পাশতু - পুশতো - পর্তুগীজ - পর্তুগীজ (ইউরোপ) + পর্তুগিজ + পর্তুগিজ (ব্রাজিল) + পর্তুগিজ (ইউরোপ) কেচুয়া কি‘চে রাজস্থানী @@ -432,7 +433,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ রাওয়া সংস্কৃত সান্দাওয়ে - শাখা + ইয়াকুট সামারিটান আরামিক সামবুরু সাসাক @@ -453,7 +454,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ সার্বো-ক্রোয়েশিয় তাচেলহিত শান - সিংহলী + সিংহলি সিডামো স্লোভাক স্লোভেনীয় @@ -511,7 +512,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ নায়াসা টোঙ্গা টোকি পোনা টোক পিসিন - তুর্কী + তুর্কি তারোকো সঙ্গা সিমশিয়ান @@ -549,7 +550,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ওলোফ উ চীনা কাল্মাইক - জোসা + খোসা কাংরি সোগা ইয়াও @@ -560,15 +561,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইওরুবা নহিংগাটু ক্যান্টোনিজ - চীনা, ক্যানটোনীজ - ঝু্য়াঙ + চীনা, ক্যান্টোনিজ + ঝুয়াং জাপোটেক চিত্র ভাষা জেনাগা আদর্শ মরক্কোন তামাজিগাত চীনা চীনা, ম্যান্ডারিন - চীনা ম্যান্ডারিন সরলীকৃত + চীনা ম্যান্ডারিন (সরলীকৃত) ম্যান্ডারিন চীনা (ঐতিহ্যবাহী) জুলু জুনি @@ -602,14 +603,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + - + @@ -658,11 +659,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + - + @@ -686,7 +687,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + @@ -790,7 +791,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ কোকোস (কিলিং) দ্বীপপুঞ্জ কঙ্গো-কিনশাসা কঙ্গো(DRC) - মধ্য আফ্রিকার প্রজাতন্ত্র + মধ্য আফ্রিকান প্রজাতন্ত্র কঙ্গো - ব্রাজাভিল কঙ্গো (প্রজাতন্ত্র) সুইজারল্যান্ড @@ -802,6 +803,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ চীন কলম্বিয়া ক্লিপারটন দ্বীপপুঞ্জ + সার্ক দ্বীপ কোস্টারিকা কিউবা কেপ ভার্দে @@ -899,7 +901,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ লাক্সেমবার্গ লাটভিয়া লিবিয়া - মোরক্কো + মরক্কো মোনাকো মলডোভা মন্টিনিগ্রো @@ -995,7 +997,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ তিউনিসিয়া টোঙ্গা তুরস্ক - ত্রিনিনাদ ও টোব্যাগো + ত্রিনিদাদ ও টোবাগো টুভালু তাইওয়ান তাঞ্জানিয়া @@ -1037,7 +1039,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ক্যালেন্ডার - মুদ্র্যা ফরম্যাট + মুদ্রা বিন্যাস প্রতীক বাছাইকরণ উপেক্ষা করুন বিপরীত করা স্বরাঘাত বাছাইকরণ বড়হাতের/ছোটহাতের অক্ষর ক্রম @@ -1047,35 +1049,56 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ সংখ্যাসূচক বাছাইকরণ বাছাইকরণ শক্তি মুদ্রা + ইমোজি উপস্থাপনা সময়ের হিসাব (১২ বা ২৪) লাইন বিভাজক শৈলী - পরিমাপ সিস্টেম + শব্দদ্বয়ের মধ্যে লাইন বিভাজক + পরিমাপ পদ্ধতি সংখ্যা - সময় জোন + শব্দ সংক্ষেপণের পর বাক্য ভাঙা + সময় অঞ্চল স্থানীয় ভিন্নতা বক্তিগত- ব্যবহার বৌদ্ধ ক্যালেন্ডার + বৌদ্ধ চীনা ক্যালেন্ডার + চীনা কপটিক ক্যালেন্ডার - দাঙ্গী ক্যালেন্ডার + কপটিক + দাঙ্গি ক্যালেন্ডার + দাঙ্গি ইথিওপিক ক্যালেন্ডার + ইথিওপীয় ইথিওপিও আমেতে আলেম ক্যালেন্ডার + ইথিওপীয় আমেতে আলেম গ্রিগোরিয়ান ক্যালেন্ডার + গ্রেগরীয় হিব্রু ক্যালেন্ডার + হিব্রু ভারতীয় জাতীয় বর্ষপঞ্জী + ভারতীয় জাতীয় ইসলামিক ক্যালেন্ডার - ইসলামিক-সিভিল বর্ষপঞ্জী + হিজরি + ইসলামিক ক্যালেন্ডার (ছকবদ্ধ, নাগরিক বর্ষপঞ্জি) + হিজরি (ছকবদ্ধ, নাগরিক বর্ষপঞ্জি) ইসলামিক বর্ষপঞ্জী (সৌদি আরব, দৃশ্যমান) ইসলামিক বর্ষপঞ্জী (ছকবদ্ধ, জ্যোতির্বিদ্যীয় যুগ) + হিজরি (ছকবদ্ধ, জ্যোতির্বিদ্যীয় যুগ) ইসলামিক বর্ষপঞ্জী (উম্মা আল-কুরআ) - ISO-861 ক্যালেন্ডার + হিজরি (উম্মা আল-কুরআ) + গ্রেগরীয় ক্যালেন্ডার (প্রথম বর্ষ) জাপানি ক্যালেন্ডার + জাপানি ফারসি ক্যালেন্ডার + ফারসি মিঙ্গুও ক্যালেন্ডার + মিঙ্গুও হিসাবের মুদ্রা বিন্যাস + অ্যাকাউন্টিং মানক মুদ্রা বিন্যাস + মানক প্রতীক বাছাই করুন উপেক্ষা প্রতীক বাছাই করুন স্বরাঘাত সাধারণতভাবে বাছাই করুন @@ -1085,22 +1108,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ প্রথমে বড়হাতের অক্ষর বাছাই করুন কেস অসংবেদী বাছাই করুন কেস সংবেদী বাছাই করুন - প্রথাগত চীনা সজ্জাক্রম - বিগ৫ আগের বাছাইয়ের ক্রম, সামঞ্জস্যের জন্য অভিধান বাছাই বিন্যাস ডিফল্ট ইউনিকোড বাছাই বিন্যাস + ডিফল্ট ইউনিকোড ইমোজি বাছাই ক্রম ইউরোপীয় ক্রম বিন্যাসের নিয়মাবলী - সাধারণ চীনা সজ্জাক্রম - জিবি২৩১২ ফোনবুক সজ্জাক্রম ধ্বনি নির্দেশক বাছাই ক্রম পিনিন সজ্জাক্রম রিফর্মড বাছাই বিন্যাস সাধারণ-উদ্দেশ্যে অনুসন্ধান + সার্চ হাঙ্গুল প্রাথমিক ব্যঞ্জনবর্ণ দ্বারা অনুসন্ধান করুন আদর্শ বাছাই বিন্যাস + মানক আবর্তিত সজ্জাক্রম প্রথাগত বাছাই বিন্যাস + প্রথাগত রাডিকেল স্ট্রোক বাছাই বিন্যাস ঝুইন সজ্জাক্রম স্বাভাবিক ছাড়া বাছাই করুন @@ -1115,18 +1140,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ পূর্ণপ্রস্থ পর্যন্ত অর্ধপ্রস্থ পর্যন্ত সাংখিক + ডিফল্ট + ইমোজি + টেক্সট ১২ ঘণ্টার হিসাবে (০–১১) + ১২ (০–১১) ১২ ঘণ্টার হিসাবে (১–১২) + ১২ (১–১২) ২৪ ঘণ্টার হিসাবে (০–২৩) + ২৪ (০–২৩) ২৪ ঘণ্টার হিসাবে (১–২৪) + ২৪ (১–২৪) আলগা লাইন বিভাজক শৈলী + আলগা সাধারণ লাইন বিভাজক শৈলী + সাধারণ টাইট লাইন বিভাজক শৈলী + টাইট + সবেতেই বিভাজক রাখুন + সব রেখে দিন + স্বাভাবিক + ব্যাক্যাংশে বিভাজক ইউএস বিজিএন বর্ণান্তরণ ইউএন জিইজিএন বর্ণান্তরণ - মেট্রিক সিস্টেম + মেট্রিক পদ্ধতি + মেট্রিক ইম্পেরিয়াল পরিমাপ সিস্টেম + যুক্তরাজ্য মার্কিন যুক্তরাষ্ট্রের পরিমাপ সিস্টেম + মার্কিন যুক্তরাষ্ট্র অহম সংখ্যা আরবি-ভারতীয় সংখ্যা প্রসারিত আরবি -ভারতীয় সংখ্যা @@ -1182,7 +1224,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ মায়ানমার থাই লেয়িং সংখ্যা স্থানীয় সংখ্যা এন’কো সংখ্যা - ওল চিকি সংখ্যা + অলচিকি সংখ্যা ওড়িয়া সংখ্যা ওসমানিয় সংখ্যা রোমান সংখ্যা @@ -1204,6 +1246,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ঐতিহ্যগত সংখ্যাসূচক ভাই সংখ্যা ওয়ারেং সিটি সংখ্যা + বন্ধ + চালু মেট্রিক @@ -1219,18 +1263,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [় ৺ অ আ ই ঈ উ ঊ ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঃ ঁ ক {ক্ষ} খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড{ড়} ঢ{ঢ়} ণ ত ৎ থ দ ধ ন প ফ ব ভ ম য{য়} র ল শ ষ স হ ঽ া ি ী ু ূ ৃ ৄ ৢ ৣ ে ৈ ো ৌ ্ ৗ] [\u200C\u200D ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৰ ৱ] - [অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ক {ক্ষ} খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ] + [অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ক {ক্ষ} খ গ ঘ চ ছ জ ঝ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ] [\- ‑ , . % ‰ + 0০ 1১ 2২ 3৩ 4৪ 5৫ 6৬ 7৭ 8৮ 9৯] - [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [\- ‐‑ – — , ; \: ! ? . … । ॥ '‘’ "“” ( ) \[ \] § @ * / # † ‡ ′ ″] + [। ॥] + [\- ‑ , . /] {0} … … {0} {0} … {1} [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1278,12 +1321,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - যুগ ০ - যুগ ১ - - @@ -1322,12 +1359,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - যুগ ০ - যুগ ১ - - @@ -1361,6 +1392,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} এ {0} + + {1}: {0} + @@ -1369,21 +1403,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} এ {0} + + {1}: {0} + {1} {0} + + {1}, {0} + {1} {0} + + {1}, {0} + + E B h d E y G + M/y G d/M/y GGGGG + E, d/M/y G MMM y G d MMM, y G E, d MMM, y G @@ -1525,8 +1571,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ডিসে - জানুয়ারী - ফেব্রুয়ারী + জানুয়ারি + ফেব্রুয়ারি মার্চ এপ্রিল মে @@ -1549,10 +1595,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ জুন জুলাই আগস্ট - সেপ্টেম্বর - অক্টোবর + সেপ্ট + অক্টো নভেম্বর - ডিসেম্বর + ডিসে জা @@ -1568,6 +1614,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ডি + + জানুয়ারি + ফেব্রুয়ারি + মার্চ + এপ্রিল + মে + জুন + জুলাই + আগস্ট + সেপ্টেম্বর + অক্টোবর + নভেম্বর + ডিসেম্বর + @@ -1658,7 +1718,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - খ্রীষ্টাব্দ + খ্রিস্টপূর্বাব্দ + খ্রিস্টাব্দ খ্রিস্টপূর্ব @@ -1724,6 +1785,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} এ {0} + + {1} {0}-এ + @@ -1740,6 +1804,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1748,11 +1815,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + + E B h d E y G + MM-y G dd-MM-y GGGGG + E, dd-MM-y G MMM y G d MMM, y G E, d MMM, y G @@ -1918,10 +1991,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + চৈত্র + বৈশাখ + জ্যৈষ্ঠ + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + চৈত্র বৈশাখ - জৈষ্ঠ্য + জ্যৈষ্ঠ আষাঢ় শ্রাবণ ভাদ্র @@ -1934,6 +2021,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + চৈত্র + বৈশাখ + জ্যৈষ্ঠ + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + @@ -1948,6 +2049,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ১১ ১২ + + চৈত্র + বৈশাখ + জ্যৈষ্ঠ + আষাঢ় + শ্রাবণ + ভাদ্র + আশ্বিন + কার্তিক + অগ্রহায়ণ + পৌষ + মাঘ + ফাল্গুন + @@ -1960,7 +2075,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - মহররম + মুহররম সফর রবিউল আউয়াল রবিউস সানি @@ -1974,7 +2089,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ জ্বিলহজ্জ - মহররম + মুহররম সফর রবিউল আউয়াল রবিউস সানি @@ -1989,6 +2104,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + মুহররম + সফর + রবিউল আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউস সানি + রজব + শা‘বান + রমজান + শাওয়াল + জ্বিলকদ + জ্বিলহজ্জ + @@ -2003,6 +2132,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ১১ ১২ + + মুহররম + সফর + রবিউল আউয়াল + রবিউস সানি + জমাদিউল আউয়াল + জমাদিউস সানি + রজব + শা‘বান + রমজান + শাওয়াল + জ্বিলকদ + জ্বিলহজ্জ + @@ -2010,6 +2153,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ যুগ + + + M/y G + E, d/M/y G + + @@ -2260,12 +2409,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ঘণ্টা এই ঘণ্টায় - {0} ঘন্টায় - {0} ঘন্টায় + {0} ঘণ্টায় + {0} ঘণ্টায় - {0} ঘন্টা আগে - {0} ঘন্টা আগে + {0} ঘণ্টা আগে + {0} ঘণ্টা আগে + + + + + {0} ঘণ্টায় + {0} ঘণ্টায় + + + {0} ঘণ্টা আগে + {0} ঘণ্টা আগে + + + + + {0} ঘণ্টায় + {0} ঘণ্টায় + + + {0} ঘণ্টা আগে + {0} ঘণ্টা আগে @@ -2298,12 +2467,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} সেকেন্ড আগে - - - {0} সেকেন্ড আগে - {0} সেকেন্ড আগে - - সময় অঞ্চল @@ -2669,6 +2832,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ইস্টার + + কোয়আইকে + পুন্টা আরেনাস @@ -2934,9 +3100,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ নম পেন - এন্ডারবারি - - ক্যান্টন @@ -3613,9 +3776,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - পশ্চিম আফ্রিকা সময় - পশ্চিম আফ্রিকা মানক সময় - পশ্চিম আফ্রিকা গ্রীষ্মকালীন সময় + পশ্চিম আফ্রিকা সময় @@ -3846,9 +4007,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - কোলোম্বিয়া সময় + কলম্বিয়া সময় কোলোম্বিয়া মানক সময় - কোলোম্বিয়া গ্রীষ্মকালীন সময় + কলম্বিয়া গ্রীষ্মকালীন সময় @@ -3998,6 +4159,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ গুয়ানা সময় + + + হাওয়াই-আলেউত মানক সময় + + হাওয়াই-আলেউত সময় @@ -4451,6 +4617,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ চুক সময় + + + তুর্কী সময় + তুর্কী মান সময় + তুর্কী গ্রীষ্মকাল সময় + + তুর্কমেনিস্তান সময় @@ -4594,10 +4767,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 00 কো 000 কো 000 কো - 00 শত কো - 00শত কো - 000কো - 000কো + 0 শত কো + 0শত কো + 0কো + 0কো 0 লা'.'কো'.' 0 লা'.'কো'.' 00 লা'.'কো'.' @@ -4625,8 +4798,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##,##0.00¤ - #,##,##0.00 ¤ - #,##,##0.00 + #,##,##0.00 ¤ + #,##,##0.00 #,##,##0.00¤;(#,##,##0.00¤) @@ -4664,14 +4837,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 000 কো ¤ 000 কো¤ 000 কো ¤ - 0000 কো¤ - 0000 কো ¤ - 0000 কো¤ - 0000 কো ¤ - 00000 কো¤ - 00000 কো ¤ - 00000 কো¤ - 00000 কো ¤ + 0 শত কো¤ + 0 শত কো ¤ + 0শত কো¤ + 0শত কো ¤ + 0কো¤ + 0কো ¤ + 0কো¤ + 0কো ¤ 0 লা'.'কো'.'¤ 0 লা'.'কো'.' ¤ 0 লা'.'কো'.'¤ @@ -5321,13 +5494,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ সিয়েরা লিয়নের লিয়ন - সিয়েরা লিয়নের লিয়ন - সিয়েরা লিয়নের লিয়ন সিয়েরা লিয়নের লিয়ন (1964—2022) - সিয়েরা লিয়নের লিয়ন (1964—2022) - সিয়েরা লিয়নের লিয়ন (1964—2022) সোমালি শিলিং @@ -5466,6 +5635,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ পূর্ব ক্যারাবিয়ান ডলার + + ক্যারিবিয়ান গিল্ডার + ক্যারিবিয়ান গিল্ডার + ক্যারিবিয়ান গিল্ডার + ইউরোপীয় মুদ্রা একক @@ -5528,6 +5702,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ জিম্বাবুয়ে ডলার (১৯৮০–২০০৮) + + জিম্বাবায়েন গোল্ড + জিম্বাবোয়েন গোল্ড + জিম্বাবোয়েন গোল্ড + জিম্বাবুয়ে ডলার (২০০৯) @@ -5721,7 +5900,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মিলিমোল, প্রতি লিটারে {0} মিলিমোল, প্রতি লিটারে - + + পার্ট + {0} পার্ট + {0} পার্ট + + ভাগ, প্রতি মিলিয়নে {0} ভাগ, প্রতি মিলিয়নে {0} ভাগ, প্রতি মিলিয়নে @@ -5738,10 +5922,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} পারমিরিয়াড {0} পারমিরিয়াড - - মোল্স - {0} মোল - {0} মোল্স + + গ্লুকোজ + {0} গ্লুকোজ + {0} গ্লুকোজ লিটার, প্রতি কিলোমিটারে @@ -5813,6 +5997,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} শতাব্দী {0} শতাব্দী + + ঘণ্টা + {0} ঘণ্টা + {0} ঘণ্টা + {0} প্রতি ঘণ্টা + {0} মিলিসেকেন্ড {0} মিলিসেকেন্ড @@ -5870,7 +6060,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ কিলোওয়াট ঘন্টা - {0} কিলোওয়াট ঘন্টা + {0} কিলোওয়াট ঘণ্টা {0} কিলোওয়াট ঘন্টা @@ -5883,9 +6073,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ব্রিটিশ থার্মাল ইউনিট - নিউটন্স {0} নিউটন - {0} নিউটন্স + {0} নিউটন কিলোওয়াট-ঘণ্টা প্রতি 100 কিলোমিটার @@ -5992,8 +6181,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} পিকোমিটার - {0} parsec - {0} parsecs + পারসেক + {0} পারসেক + {0} পারসেক জ্যোতির্বিজ্ঞান একক @@ -6159,17 +6349,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মেগাপাস্কাল - ঘন্টা প্রতি কিলোমিটার - {0} ঘন্টা প্রতি কিলোমিটার - {0} ঘন্টা প্রতি কিলোমিটার + ঘণ্টা প্রতি কিলোমিটার + {0} কিলোমিটার প্রতি ঘণ্টা + {0} কিলোমিটার প্রতি ঘণ্টা {0} মিটার প্রতি সেকেন্ড {0} মিটার প্রতি সেকেন্ড - {0} ঘন্টা প্রতি মাইল - {0} ঘন্টা প্রতি মাইল + ঘণ্টা প্রতি মাইল + {0} মাইল প্রতি ঘণ্টা + {0} মাইল প্রতি ঘণ্টা নট @@ -6276,6 +6467,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মেট্রিক কাপ {0} মেট্রিক কাপ + + মেট্রিক ফ্লুইড আউন্স + {0} মেট্রিক ফ্লুইড আউন্স + {0} মেট্রিক ফ্লুইড আউন্স + একর-ফুট {0} একর-ফুট @@ -6355,17 +6551,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp. quart {0} Imp. quart - + + স্টেরেডিয়ান + {0} স্টেরেডিয়ান + {0} স্টেরেডিয়ান + + + ক্যাটাল + {0} ক্যাটাল + {0} ক্যাটাল + + + কুলম্ব + {0} কুলম্ব + {0} কুলম্ব + + + ফ্যারাড + {0} ফ্যারাড + {0} ফ্যারাড + + + হেনরি + {0} হেনরি + {0} হেনরি + + + সিমেন্স + {0} সিমেন্স + {0} সিমেন্স + + + ক্যালোরি [IT] + {0} ক্যালোরি [IT] + {0} ক্যালোরি [IT] + + + বেকেরেল + {0} বেকেরেল + {0} বেকেরেল + + + সিভার্ট + {0} সিভার্ট + {0} সিভার্ট + + + গ্রে + {0} গ্রে + {0} গ্রে + + + কিলোগ্রাম-ফোর্স + {0} কিলোগ্রাম-ফোর্স + {0} কিলোগ্রাম-ফোর্স + + + টেসলা + {0} টেসলা + {0} টেসলা + + + ওয়েবার + {0} ওয়েবার + {0} ওয়েবার + + + আলোক + {0} আলোক + {0} আলোক + + পার্ট প্রতি বিলিয়ন {0} পার্ট প্রতি বিলিয়ন {0} পার্ট প্রতি বিলিয়ন - - রাত্রি - {0} রাত্রি - {0} রাত্রি - {0}/রাত্রি - প্রধান দিকনির্দেশ {0} পূর্ব @@ -6521,6 +6781,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} আইটেম {0} আইটেম + + পার্ট + {0} পার্ট + {0} পার্ট + শতাংশ @@ -6535,6 +6800,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} মোল {0} মোল + + Glc + {0} Glc + {0} Glc + লিটার/কিমি @@ -6611,9 +6881,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/দিন - ঘন্টা - {0} ঘন্টা - {0} ঘন্টা + ঘণ্টা + {0} ঘণ্টা + {0} ঘণ্টা {0} প্রতি ঘন্টা @@ -6742,7 +7012,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} প্রতি ইঞ্চি - parsecs + পারসেক আলোকবর্ষ @@ -6757,6 +7027,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ সৌর রেডি + + ক্যান্ডেলা + সৌর ঔজ্জ্বল্য @@ -6811,7 +7084,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ মিটার প্রতি সেকেন্ড - ঘন্টা প্রতি মাইল + মাইল/ঘণ্টা {0} mph {0} mph @@ -6862,7 +7135,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} চিমটে {0} চিমটে - + + cal-IT + {0} cal-IT + {0} cal-IT + + + আলোক + {0} আলোক + {0} আলোক + + পার্ট/ বিলিয়ন @@ -6971,9 +7254,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} দুনাম {0} দুনাম + + পার্ট + {0} পার্ট + {0} পার্ট + + + Glc + mpg UK {0}m/gUK @@ -6992,10 +7283,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/সপ্তাহ - - {0}/দিন - + ঘণ্টা {0} ঘঃ {0} ঘঃ {0}/ঘ: @@ -7053,6 +7342,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/ইঞ্চি + + পারসেক + pts @@ -7109,7 +7401,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}m/s - মাইল/ঘ: + মাইল/ঘণ্টা {0}mph {0}mph @@ -7165,15 +7457,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}fl.dr. {0}fl.dr. - + + cal-IT + + + আলোক + {0} আলোক + {0} আলোক + + {0}ppb {0} ppb - রাত্রি {0}রাত্রি {0}রাত্রি - {0}/রাত্রি {0}উ @@ -7428,7 +7726,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ জেনদায়া - আইরিন + শ্রেয়া চৌধুরী diff --git a/make/data/cldr/common/main/bn_IN.xml b/make/data/cldr/common/main/bn_IN.xml index 9bb515a431a..5d32b4dd124 100644 --- a/make/data/cldr/common/main/bn_IN.xml +++ b/make/data/cldr/common/main/bn_IN.xml @@ -143,6 +143,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##,##0.00 + ¤ #,##,##0.00 ¤#,##,##0.00;(¤#,##,##0.00) diff --git a/make/data/cldr/common/main/bqi.xml b/make/data/cldr/common/main/bqi.xml new file mode 100644 index 00000000000..71989380cbd --- /dev/null +++ b/make/data/cldr/common/main/bqi.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + {0}، {1} + + + عروی + عروی استاندارد مودرن + بنگلا + لوری بختیاری + آلمانی + آلمانی اوتریشی + آلمانی روء سوییس + اینگیلیسی + اینگیلیسی اوستورولیایی + اینگیلیسی کانادایی + اینگیلیسی بیریتانیایی + اینگیلیسی آمریکایی + اسپانیایی + اسپانیایی آمریکای لاتین + اسپانیایی اوروپایی + اسپانیایی مکزیکی + فرانسوی + فرانسوی کانادایی + فرانسوی سوییسی + هیندی لاتین + اندونزیایی + ایتالیایی + ژاپونی + کوره ای + هولندی + فلاندری + لهستووی + پورتقالی + پورتقالی بریزیلی + پورتقالی اوروپایی + روسی + تایلندی + تورکی + زوون نشناخته + چینی + چینی، ماندارین + چینی ساده وابیده + چینی ماندارین ساده وابیده + چینی سونتی + چینی سونتی ماندارین + + + + + + + + + + + + + + + + ایران + + + متریک + بریتانیایی + امریکایی + + + زوون: {0} + تور: {0} + ناحیه: {0} + + + + + right-to-left + + + + + [ً ٌ ٍ ّ ٔ ء آ أ ؤ ئ ا ب پ ة ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ه و ی] + [ـ\u200C\u200D\u200E\u200F َ ُ ِ ْ ٖ ٰ إ ك ى ي] + [آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ه و ی] + [\u200E , ٫ ٬ . % ٪ ‰ ؉ + − 0۰ 1۱ 2۲ 3۳ 4۴ 5۵ 6۶ 7۷ 8۸ 9۹] + [\- ‐‑ ، ٫ ٬ ؛ \: ! ؟ . … ‹ › « » ( ) \[ \] * / \\] + + + « + » + + + + + + + + + + ژانویه + فوریه + مارس + آوریل + مهٔ + ژوئن + ژوئیه + اوت + سپتامبر + اکتبر + نوامبر + دسامبر + + + + + + + یه شمبه + دوشمبه + سه شمبه + چار شمبه + پنجشمبه + جومه + شمبه + + + + + + + پیش ز ظهر + بعد ز ظهر + + + + + + y/M/d + d MMM y + + + {0} تا {1} + + + + + + + دوران + + + سال + سال گوذشته + امسال + سال نیایی + + + سال + سال گوذشته + امسال + سال نیایی + + + سال + سال گوذشته + امسال + سال نیایی + + + سه ماهه + + + سه ماهه + + + سه ماهه + + + ما + ما گوذشته + ای ما + ما نیایی + + + ما + ما گوذشته + ای ما + ما نیایی + + + ما + ما گوذشته + ای ما + ما نیایی + + + هفته + هفته گوذشته + ای هفته + هفته نیایی + هفته {0} + + + هفته + هفته گوذشته + ای هفته + هفته نیایی + هفته {0} + + + هفته + هفته گوذشته + ای هفته + هفته نیایی + هفته {0} + + + روز + دوش + امروز + صوه + + + روز + دوش + امروز + صوه + + + روز + دوش + امروز + صوه + + + روز هفته + + + پ.ظ/ب.ظ + + + ساعت + + + ساعت + + + ساعت + + + دیقه + + + دیقه + + + دیقه + + + ثانیه + + + ثانیه + + + ثانیه + + + جاگه زمووی + + + + ‎+HH:mm;‎−HH:mm + {0} گرینویچ + گرینویچ + مجال {0} + مجال توستووی {0} + مجال عادی {0} + + + مجال گرینویچ + + + + + + + ٪ + + + +‎ + ‎− + + + ‎+ + ‎− + + + + + ‎¤ #,##0.00 + ‎#,##0.00 + + + ‎¤ #,##0.00;‎(¤ #,##0.00) + ‎#,##0.00;‎(#,##0.00) + + + + + + + ‎¤ #,##0.00 + ‎¤ #,##0.00 + ‎#,##0.00 + + + ‎¤ #,##0.00;‎(¤ #,##0.00) + ‎¤ #,##0.00;‎(¤ #,##0.00) + ‎#,##0.00;‎(#,##0.00) + + + + + 0 هزار ¤ + 00 هزار ¤ + + + + + diff --git a/make/data/cldr/common/main/bqi_IR.xml b/make/data/cldr/common/main/bqi_IR.xml new file mode 100644 index 00000000000..0367e273a8c --- /dev/null +++ b/make/data/cldr/common/main/bqi_IR.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/br.xml b/make/data/cldr/common/main/br.xml index b42fcdbb756..d3d70a0621b 100644 --- a/make/data/cldr/common/main/br.xml +++ b/make/data/cldr/common/main/br.xml @@ -23,11 +23,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic adygeieg avesteg arabeg Tunizia - afrikaans + afrikaaneg afrihili aghem ainoueg - akan + akaneg akadeg alabamaeg aleouteg @@ -60,7 +60,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic azerbaidjaneg azeri bachkir - baloutchi + baloutcheg balineg bavarieg basaa @@ -70,13 +70,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic bena bulgareg baloutchi ar Cʼhornôg - bhojpuri + bhojpureg bislama bikol bini siksika + aniieg bambara - bengali + bengaleg tibetaneg brezhoneg braj @@ -94,7 +95,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic atsam chakmaeg tchetcheneg - cebuano + cebuanoeg chigaeg chamorru chibcha @@ -102,7 +103,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic marieg choktaw chipewyan - cherokee + cherokieg cheyenne kurdeg sorani kurdeg kreiz @@ -122,7 +123,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kachoubeg krieg ar gwernioù slavoneg iliz - tchouvatch + tchouvatcheg kembraeg daneg dakota @@ -171,7 +172,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dareg fang fanti - fula + fulaeg finneg filipineg finneg traoñienn an Torne @@ -190,7 +191,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic frioulaneg frizeg ar Cʼhornôg iwerzhoneg - ga + gaeg gagaouzeg sinaeg Gan gayo @@ -207,17 +208,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic grebo hencʼhresianeg alamaneg Suis - gujarati + gujarateg gusiieg manaveg gwich’in - haousa + haousaeg haideg sinaeg Hakka hawaieg haideg ar Su hebraeg - hindi + hindieg + hindieg (latin) + Hinglish hiligaynon hmong hiri motu @@ -230,12 +233,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic halkomelemeg armenianeg herero - interlingua + interlinguaeg iban ibibio indonezeg interlingue - igbo + igboeg yieg Sichuan inupiaq inuktitut Kanada ar Cʼhornôg @@ -271,11 +274,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic koyra chiini kikuyu kwanyama - kazak + kazakeg kakoeg greunlandeg kalendjineg - khmer + khmereg kimbundu kanareg koreaneg @@ -287,17 +290,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic krio karelieg kurukh - kashmiri + kashmireg shambala bafiaeg koluneg kurdeg + kurdeg + kurmandji koumikeg kutenai komieg kerneveureg kwakwaleg - kirgiz + kirgizeg latin ladino langi @@ -346,14 +351,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic mikmakeg minangkabau makedoneg - malayalam + malayalameg mongoleg manchou manipuri montagneg mohawk more - marathi + maratheg marieg ar Cʼhornôg malayseg malteg @@ -389,7 +394,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic novial nkoeg ndebele ar Su - sotho an Norzh + sothoeg an Norzh nouereg navacʼho newari klasel @@ -405,11 +410,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ojibweg ar Cʼhornôg okanaganeg oromoeg - oriya + oriyaeg oseteg osage turkeg otoman - punjabi + punjabeg pangasinan pahlavi pampanga @@ -429,14 +434,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic malisiteg-pasamawkodieg henbruseg henbrovañseg - pachto + pachtoeg portugaleg portugaleg Brazil portugaleg Europa kechuaeg kʼicheʼ kichuaeg Chimborazo - rajasthani + rajasthaneg rapanui rarotonga romagnoleg @@ -486,7 +491,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sámi Skolt shona soninke - somali + somalieg sogdieg albaneg serbeg @@ -494,12 +499,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic serer swati sahoeg - sotho ar Su + sothoeg ar Su sundaneg sukuma sumereg svedeg - swahili + swahilieg swahili Kongo komoreg sirieg klasel @@ -513,9 +518,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic tesoeg tereno tetum - tadjik - thai - tigrigna + tadjikeg + thaieg + tigrignaeg tigreaneg tiv turkmeneg @@ -524,8 +529,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic klingon tinglit tamacheg - tswana - tonga + tswanaeg + tongaeg nyasa tonga toki pona tok pisin @@ -534,7 +539,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic taroko tsonga tsimshian - tatar + tatareg tutchoneg an Norzh tumbuka tuvalu @@ -549,7 +554,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ukraineg umbundu yezh dianav - ourdou + ourdoueg ouzbekeg vai venda @@ -566,10 +571,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic walamo waray washo - wolof + wolofeg sinaeg Wu kalmouk - xhosa + xhosaeg megreleg sogaeg yao @@ -577,7 +582,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic yangben yemba yiddish - yorouba + yoroubaeg nengatoueg kantoneg sinaeg, kantoneg @@ -660,6 +665,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -691,7 +697,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Bed + bed Afrika Norzhamerika Suamerika @@ -724,9 +730,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Amerika Latin Enez Ascension Andorra - Emirelezhioù Arab Unanet + Emirelezhioù-Arab-Unanet Afghanistan - Antigua ha Barbuda + Antigua-ha-Barbuda Anguilla Albania Armenia @@ -739,7 +745,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Aruba Inizi Åland Azerbaidjan - Bosnia ha Herzegovina + Bosnia-ha-Herzegovina Barbados Bangladesh Belgia @@ -748,8 +754,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bahrein Burundi Benin - Saint Barthélemy - Bermuda + Sant-Bertele + Bermudez Brunei Bolivia Karib Nederlandat @@ -768,7 +774,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kongo - Brazzaville Kongo (Republik) Suis - Aod an Olifant + Aod-an-Olifant Aod Olifant Inizi Cook Chile @@ -776,6 +782,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sina Kolombia Enez Clipperton + Sark Costa Rica Kuba Kab-Glas @@ -800,7 +807,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Spagn Etiopia Unaniezh Europa - takad an euro + Takad an euro Finland Fidji Inizi Falkland @@ -821,7 +828,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gambia Ginea Gwadeloup - Ginea ar Cʼheheder + Ginea-ar-Cʼheheder Gres Inizi Georgia ar Su hag Inizi Sandwich ar Su Guatemala @@ -830,7 +837,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyana Hong Kong RMD Sina Hong Kong - Inizi Heard ha McDonald + Inizi Heard-ha-McDonald Honduras Kroatia Haiti @@ -839,9 +846,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Indonezia Iwerzhon Israel - Enez Vanav + Enez-Vanav India - Tiriad breizhveurat Meurvor Indez + Tiriad breizhveurat Meurvor Indez + Enezeg Chagos Iraq Iran Island @@ -855,9 +863,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kambodja Kiribati Komorez - Saint Kitts ha Nevis - Korea an Norzh - Korea ar Su + Saint Kitts-ha-Nevis + Norzhkorea + Sukorea Koweit Inizi Cayman Kazakstan @@ -876,15 +884,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Monaco Moldova Montenegro - Saint Martin + Sant-Martin Madagaskar Inizi Marshall Makedonia an Norzh Mali Myanmar (Birmania) Mongolia - Macau RMD Sina - Macau + Makao RMD Sina + Makao Inizi Mariana an Norzh Martinik Maouritania @@ -897,7 +905,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Malaysia Mozambik Namibia - Kaledonia Nevez + Kaledonia-Nevez Niger Enez Norfolk Nigeria @@ -937,7 +945,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sechelez Soudan Sveden - Singapour + Singapoura Saint-Helena Slovenia Svalbard @@ -947,15 +955,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Senegal Somalia Surinam - Susoudan - São Tomé ha Príncipe + Soudan ar Su + São-Tomé-ha-Príncipe Salvador Sint Maarten Siria Eswatini Swaziland Tristan da Cunha - Inizi Turks ha Caicos + Inizi Turks-ha-Caicos Tchad Douaroù aostral Frañs Togo @@ -968,7 +976,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tunizia Tonga Turkia - Trinidad ha Tobago + Trinidad-ha-Tobago Tuvalu Taiwan Tanzania @@ -981,16 +989,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Uruguay Ouzbekistan Vatikan - Sant Visant hag ar Grenadinez + Sant-Visant hag ar Grenadinez Venezuela Inizi Gwercʼh Breizh-Veur Inizi Gwercʼh ar Stadoù-Unanet Viêt Nam Vanuatu - Wallis ha Futuna + Wallis-ha-Futuna Samoa - pouez-mouezh gaou - BiDi gaou + Falstiredoù + Falsdaoudu Kosovo Yemen Mayotte @@ -1128,13 +1136,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic deiziadur boudaat + boudaat deiziadur sinaat + sinaat deiziadur kopt + kopt deiziadur dangi + dangi deiziadur etiopiat + etiopiat deiziadur etiopiat Amete Alem + etiopiat Amete Alem deiziadur gregorian + gregorian deiziadur hebraek + hebraek deiziadur indian deiziadur islamek deiziadur islamek keodedel @@ -1143,34 +1159,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic deiziadur islamek (Umm al-Qura) deiziadur ISO-8601 deiziadur japanat + japanat deiziadur persek + persek deiziadur Republik Sina + Republik Sina furmad unanenn jediñ furmad moneiz standart - urzh rummañ sinaek hengounel - Big5 + standart urzh rummañ ar geriadur urzh rummañ Unicode dre ziouer + Unicode dre ziouer urzh rummañ ar fromlunioù reolennoù urzhiañ europat - urzh rummañ sinaek eeunaet - GB2312 urzh rummañ al levr-pellgomz urzh rummañ pinyin enklask hollek urzh rummañ standart + standart urzh rummañ an tresoù urzh rummañ hengounel urzh rummañ UniHan urzh rummañ Zhuyin + dre ziouer + emoji + skrid reizhiad 12 eurvezh (0–11) + 12 (0–11) reizhiad 12 eurvezh (1–12) + 12 (1–12) reizhiad 24 eurvezh (0–23) + 24 (0–23) reizhiad 24 eurvezh (1–24) + 24 (1–24) stil torr linenn lezober + lezober stil torr linenn boas + boas stil torr linenn strizh + strizh reizhiad vetrek + metrek reizhiad vuzuliañ RU + muzuliañ RU reizhiad vuzuliañ SU + muzuliañ SU sifroù ahomek sifroù arabek indian sifroù arabek indian astennet @@ -1550,6 +1583,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'da' {0} + @@ -1558,6 +1594,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'da' {0} + @@ -1574,6 +1613,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM/y G + dd/MM/y G + E, dd/MM/y G MMM y G d MMM y G E d MMM y G @@ -1884,6 +1926,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'da' {0} + @@ -1892,6 +1937,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'da' {0} + @@ -1902,12 +1950,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + {1}, {0} + + + {1}, {0} + E d E h:mm a E h:mm:ss a y G + MM/y G + dd/MM/y G + E, dd/MM/y G MMM y G d MMM y G E d MMM y G @@ -1916,6 +1973,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm:ss a h:mm:ss a v h:mm a v + HH'e' v MM dd/MM E dd/MM @@ -1948,21 +2006,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic y – y G - MM/y GGGGG – MM/y GGGGG - MM/y – MM/y GGGGG - MM/y – MM/y GGGGG + MM/y G – MM/y G + MM/y – MM/y G + MM/y – MM/y G - dd/MM/y – dd/MM/y GGGGG - dd/MM/y GGGGG – dd/MM/y GGGGG - dd/MM/y – dd/MM/y GGGGG - dd/MM/y – dd/MM/y GGGGG + dd/MM/y – dd/MM/y G + dd/MM/y G – dd/MM/y G + dd/MM/y – dd/MM/y G + dd/MM/y – dd/MM/y G - E dd/MM/y – E dd/MM/y GGGGG - E dd/MM/y GGGGG – E dd/MM/y GGGGG - E dd/MM/y – E dd/MM/y GGGGG - E dd/MM/y – E dd/MM/y GGGGG + E dd/MM/y – E dd/MM/y G + E dd/MM/y G – E dd/MM/y G + E dd/MM/y – E dd/MM/y G + E dd/MM/y – E dd/MM/y G MMM y G – MMM y G @@ -2868,6 +2926,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + UTC{0} + UTC + UTC+? eur {0} eur hañv {0} eur cʼhoañv {0} @@ -2880,7 +2941,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - kêr dianav + Lecʼhiadur dianav Kaboul @@ -2901,17 +2962,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bahrein - Saint Barthélemy + Sant-Bertele Bermudez - - Belém - - - São Paulo - Mensk @@ -2924,17 +2979,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Enez Pask - - Ürümqi - - - Bogotá - La Habana - Kab Glas + Kab-Glas Levkosía @@ -2985,7 +3034,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Jibraltar - Qânâq + Qaanaaq Nuuk (Godthåb) @@ -3011,9 +3060,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Manav - - Calcutta - Reykjavík @@ -3035,9 +3081,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saint Kitts - - Pʼyongyang - Koweit @@ -3063,7 +3106,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dar el Beida (Casablanca) - Macau + Makao Martinik @@ -3077,6 +3120,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kêr Vecʼhiko + + Noumea + Masqat @@ -3084,7 +3130,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Panamá - Markiz + Inizi Markiz Varsovia @@ -3092,6 +3138,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mikelon + + Inizi Pitcairn + Azorez @@ -3129,14 +3178,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Singapour - Saint Helena + Saint-Helena Muqdisho - - São Tomé - Salvador @@ -3149,14 +3195,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kergelenn - - Lomé - Tuniz - Kiev + Kyyiv + + + Inizi Midway + + + Enez Wake Toshkent @@ -3165,11 +3214,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Vatikan - Sant Visant + Sant-Visant Kêr Hô-Chi-Minh + + Wallis-ha-Futuna + eur Afghanistan @@ -3192,9 +3244,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Afrika ar Cʼhornôg - eur cʼhoañv Afrika ar Cʼhornôg - eur hañv Afrika ar Cʼhornôg + eur Afrika ar Cʼhornôg @@ -3255,9 +3305,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Apia - eur cʼhoañv Apia - eur hañv Apia + eur Samoa + eur cʼhoañv Samoa + eur hañv Samoa @@ -3363,7 +3413,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Brunei Darussalam + eur Brunei @@ -3531,7 +3581,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Amzer keitat Greenwich (AKG) + amzer keitat Greenwich (AKG) @@ -3563,6 +3613,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic eur Guyana + + + eur cʼhoañv Hawaii hag an Aleouted + + eur Hawaii hag an Aleouted @@ -3579,9 +3634,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Hovd - eur cʼhoañv Hovd - eur hañv Hovd + eur Khovd + eur cʼhoañv Khovd + eur hañv Khovd @@ -3642,6 +3697,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic eur hañv Japan + + + eur Kazakstan + + eur Kazakstan ar Reter @@ -3777,9 +3837,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Kaledonia Nevez - eur cʼhoañv Kaledonia Nevez - eur hañv Kaledonia Nevez + eur Kaledonia-Nevez + eur cʼhoañv Kaledonia-Nevez + eur hañv Kaledonia-Nevez @@ -3848,7 +3908,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Papoua-Ginea-Nevez + eur Papoua Ginea-Nevez @@ -3896,7 +3956,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Pʼyongyang + eur Norzhkorea @@ -3918,9 +3978,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Samoa - eur cʼhoañv Samoa - eur hañv Samoa + eur Samoa Amerikan + eur cʼhoañv Samoa Amerikan + eur hañv Samoa Amerikan @@ -3960,9 +4020,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Taipei - eur cʼhoañv Taipei - eur hañv Taipei + eur Taiwan + eur cʼhoañv Taiwan + eur hañv Taiwan @@ -4046,12 +4106,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - eur Wake Island + eur Enez Wake - eur Wallis ha Futuna + eur Wallis-ha-Futuna @@ -4068,6 +4128,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic eur hañv Yekaterinbourg + + + eur Yukon + + @@ -4165,134 +4230,90 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00;(#,##0.00) + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 0 G¤ - 0 G ¤ - 0 G¤ - 0 G ¤ - 0 G¤ - 0 G ¤ - 0 G¤ - 0 G ¤ - 0 G¤ - 0 G ¤ - 00 G¤ - 00 G ¤ - 00 G¤ - 00 G ¤ - 00 G¤ - 00 G ¤ - 00 G¤ - 00 G ¤ - 00 G¤ - 00 G ¤ - 000 G¤ - 000 G ¤ - 000 G¤ - 000 G ¤ - 000 G¤ - 000 G ¤ - 000 G¤ - 000 G ¤ - 000 G¤ - 000 G ¤ - 0 T¤ - 0 T ¤ - 0 T¤ - 0 T ¤ - 0 T¤ - 0 T ¤ - 0 T¤ - 0 T ¤ - 0 T¤ - 0 T ¤ - 00 T¤ - 00 T ¤ - 00 T¤ - 00 T ¤ - 00 T¤ - 00 T ¤ - 00 T¤ - 00 T ¤ - 00 T¤ - 00 T ¤ - 000 T¤ - 000 T ¤ - 000 T¤ - 000 T ¤ - 000 T¤ - 000 T ¤ - 000 T¤ - 000 T ¤ - 000 T¤ - 000 T ¤ + 0k ¤ + 0k ¤ + 0k ¤ + 0k ¤ + 0k ¤ + 00k ¤ + 00k ¤ + 00k ¤ + 00k ¤ + 00k ¤ + 000k ¤ + 000k ¤ + 000k ¤ + 000k ¤ + 000k ¤ + 0M ¤ + 0M ¤ + 0M ¤ + 0M ¤ + 0M ¤ + 00M ¤ + 00M ¤ + 00M ¤ + 00M ¤ + 00M ¤ + 000M ¤ + 000M ¤ + 000M ¤ + 000M ¤ + 000M ¤ + 0G ¤ + 0G ¤ + 0G ¤ + 0G ¤ + 0G ¤ + 00G ¤ + 00G ¤ + 00G ¤ + 00G ¤ + 00G ¤ + 000G ¤ + 000G ¤ + 000G ¤ + 000G ¤ + 000G ¤ + 0T ¤ + 0T ¤ + 0T ¤ + 0T ¤ + 0T ¤ + 00T ¤ + 00T ¤ + 00T ¤ + 00T ¤ + 00T ¤ + 000T ¤ + 000T ¤ + 000T ¤ + 000T ¤ + 000T ¤ {0} {1} @@ -8651,7 +8672,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmol/l {0}mmol/l - + {0}ppm {0}ppm {0}ppm @@ -9916,16 +9937,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic und br ko vi yue zh - Yann + Yann - Katell - ar Gall + Katell + ar Gall - Yann - Erwan - ar Go + Yann + Erwan + ar Go Prof. Dr. diff --git a/make/data/cldr/common/main/brx.xml b/make/data/cldr/common/main/brx.xml index 2181aaefd8d..32484232b61 100644 --- a/make/data/cldr/common/main/brx.xml +++ b/make/data/cldr/common/main/brx.xml @@ -1059,9 +1059,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic मिंगुव’ फान्जामुथि मुद्रानि नुथायखौ हिसाब लाखिनाय थाखोआरि मुद्रानि नुथाय - पारम्पारिक चीनी वर्गीकरण बीग फ़ाईव गरहाजिर इउनिकड रान्नायनि फारि - सरलीकृत चीनी वर्गीकरण जीबी2312 दूरभाष निर्देशिका वर्गीकरण पिनयीन वर्गीकरण सादारन-जाहोननि नायगिरनाय @@ -1551,13 +1549,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic GGGGG dd-MM-y G y MMM E d a नि h - a नि h:mm:ss v a h:mm v M/d E, M/d d-MMM E, MMM d - MMMM d E, MMMM d M/y dd-MM-y @@ -1648,7 +1644,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic d/M – d/M - d/M –/dM + d/M – d/M d/M, E –d/M, E @@ -2575,9 +2571,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic नॉम पेन - एन्डारबारी - - केन्ट’न @@ -3251,9 +3244,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - सोनाब आफ्रिकानि सम - सोनाब आफ्रिकानि थाखोआरि सम - सोनाब आफ्रिकानि दैज्लां सम + सोनाब आफ्रिकानि सम @@ -3636,6 +3627,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic गुयाना सम + + + हावाई-एल्युतियान थाखोआरि सम + + हावाई-एल्युतियान सम @@ -4084,6 +4080,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic चूक सम + + + तुर्की टाईम + तुर्की स्टैंडर्ड टाईम + तुर्की समर टाईम + + तुर्कमेनीस्तान सम @@ -4249,39 +4252,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + ¤ #,##,##0.00 + ¤ #,##,##0.00 #,##,##0.00 ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) - ¤000K - ¤000K - ¤0M - ¤0M - ¤00M - ¤00M - ¤000M - ¤000M - ¤0B - ¤0B - ¤00B - ¤00B - ¤000B - ¤000B - ¤0T - ¤0T - ¤00T - ¤00T - ¤000T - ¤000T + ¤ 0के + ¤ 0के + ¤ 00के + ¤ 00के + ¤ 000के + ¤ 000के + ¤ 0एम + ¤ 0एम + ¤ 00एम + ¤ 00एम + ¤ 000एम + ¤ 000एम + ¤ 0बि + ¤ 0बि + ¤ 00बि + ¤ 00बि + ¤ 000बि + ¤ 000बि + ¤ 0ति + ¤ 0ति + ¤ 00ति + ¤ 00ति + ¤ 000ति + ¤ 000ति {0} ¤¤ diff --git a/make/data/cldr/common/main/bs.xml b/make/data/cldr/common/main/bs.xml index 2ef4a63d10e..0a0b8821719 100644 --- a/make/data/cldr/common/main/bs.xml +++ b/make/data/cldr/common/main/bs.xml @@ -279,6 +279,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kelnski kurdski + kurdski + kurmanji kumik kutenai komi @@ -872,6 +874,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kina Kolumbija Ostrvo Clipperton + Sark Kostarika Kuba Zelenortska Ostrva @@ -1224,35 +1227,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numeričko sortiranje Jačina sortiranja Valuta + Emoji prezentacija Format vremena (12 ili 24) Stil prijeloma reda + Prelom reda u riječi Mjerni sistem Brojevi + Prelom rečenice nakon skraćenice Vremenska zona Varijanta zemlje/jezika Privatna upotreba budistički kalendar + budistički kineski kalendar + kineski koptski kalendar + koptski dangi kalendar + dangi etiopski kalendar + etiopski etiopski kalendar "Amete Alem" + etiopski Amete Alem gregorijanski kalendar + gregorijanski hebrejski kalendar + hebrejski indijski nacionalni kalendar islamski kalendar + islamski islamski građanski kalendar, tabelarni + islamski (tabelarni, građanski) islamski kalendar za Saudijsku Arabiju islamski kalendar, tabelarni, astronomska epoha islamski kalendar, Umm al-Qura + islamski (Umm al-Qura) kalendar ISO-8601 japanski kalendar + japanski perzijski kalendar + perzijski kalendar Republike Kine + Republika Kina računovodstveni format valute + Računovodstvo standardni format valute + Standardno Poredaj simbole Poredaj zanemarujući simbole Poredaj naglaske normalno @@ -1262,19 +1284,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Poredaj prvo velika slova Poredaj zanemarujući veličinu Poredaj u skladu s veličinom slova - Tradicionalno kinesko sortiranje Prethodno sortiranje radi usklađenosti Rječničko sortiranje standardno Unicode sortiranje + standardni Unicode Sortiranje po emoji sličicama Evropska pravila sortiranja - Pojednostavljeno kinesko sortiranje - GB2312 Sortiranje kao telefonski imenik Fonetsko sortiranje Pinjin sortiranje općenito pretraživanje + pretraga Pretraživanje po početnom suglasniku hangula standardno sortiranje + standardno Sortiranje po broju crta Tradicionalno sortiranje sortiranje prema korijenu i potezu @@ -1291,18 +1314,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Široki Uski Numerički + Zadano + Emoji + Tekst 12-satni format (0–11) + 12 (0–11) 12-satni format (1–12) + 12 (1–12) 24-satni format (0–23) + 24 (0–23) 24-satni format (1–24) + 24 (1–24) Slobodni stil prijeloma reda + Slobodni Normalni stil prijeloma reda + Normalni Strogi stil prijeloma reda + Strogi + podijeli sve + zadrži sve + normalno + zadrži u fazama US BGN transliteracija UN GEGN transliteracija metrički sistem + Metrički britanski mjerni sistem + UK američki mjerni sistem + američki ahom cifre arapsko-indijski brojevi prošireni arapsko-indijski brojevi @@ -1388,6 +1428,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vai cifre warang citi cifre vančo cifre + Uključeno + Isključeno metrički @@ -1578,16 +1620,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - h B – h B - - - h:mm B – h:mm B - - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1598,54 +1630,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - - - MM-dd – MM-dd - MM-dd – MM-dd - - - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E - - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - - - y-MM – y-MM - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - - - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - U MMM – U MMM - - - U MMM d – MMM d - U MMM d – U MMM d - - - U MMM d, E – MMM d, E - U MMM d, E – MMM d, E - U MMM d, E – U MMM d, E - - - U MMMM – U MMMM - @@ -1683,6 +1667,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -1691,6 +1678,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -1711,7 +1701,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y. G d. MMM y. G E, d. MMM y. G - h a H hh:mm a hh:mm:ss a @@ -1733,54 +1722,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B d. – d. - - G y – G y - - - GGGGG y-MM – GGGGG y-MM - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM - - - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – GGGGG y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - - - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – GGGGG y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - - - G y MMM – G y MMM - G y MMM – y MMM - - - G y MMM d – G y MMM d - G y MMM d – MMM d - G y MMM d – y MMM d - - - G y MMM d, E – MMM d, E - G y MMM d, E – G y MMM d, E - G y MMM d, E – MMM d, E - G y MMM d, E – y MMM d, E - - h a – h a h – h'h' a @@ -1797,7 +1748,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v - h a – h a v h – h 'h' a v @@ -1846,7 +1796,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d. – d. MMM y. G d. MMM – d. MMM y. G - G y MMM d – y MMM d E, dd. – E, dd. MMM y. G @@ -1877,6 +1826,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ nov dec + + jan + feb + mar + apr + may + jun + jul + aug + sep + okt + nov + dec + januar februar @@ -1987,20 +1950,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ navečer po noći - - a. m. - p. m. - prijepodne popodne - - a. m. - p. m. - prijepodne popodne @@ -2078,6 +2033,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -2086,6 +2044,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -2113,7 +2074,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y. G d. MMM y. G E, d. MMM y. G - h a hh:mm a hh:mm:ss a h:mm:ss a (v) @@ -2147,11 +2107,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -2192,12 +2150,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM – E, d. MMM y. G - G y MMM d, E – G y MMM d, E - G y MMM d, E – MMM d, E - G y MMM d, E – y MMM d, E - - - h a – h a HH – HH'h' @@ -2221,7 +2173,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h 'h' a v @@ -2499,6 +2450,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mj. + prošli mj. + ovaj mj. + sljedeći mj. za {0} mj. za {0} mj. @@ -2528,26 +2482,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sedmica u kojoj je {0} - sed. + sedm. + prošle sedm. + ove sedm. + sljedeće sedm. - za {0} sed. - za {0} sed. - za {0} sed. + za {0} sedm. + za {0} sedm. + za {0} sedm. - prije {0} sed. - prije {0} sed. - prije {0} sed. + prije {0} sedm. + prije {0} sedm. + prije {0} sedm. + + + + sedm. + prošle sedm. + ove sedm. + sljedeće sedm. + + za {0} sedm. + za {0} sedm. + za {0} sedm. + + + prije {0} sedm. + prije {0} sedm. + prije {0} sedm. sedmica u mjesecu - sed. u mj. + sedm. u mj. - s. u mj. + sedm. u mj. dan @@ -2567,16 +2540,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ prije {0} dana - + - za {0} d. - za {0} d. - za {0} d. + za {0} dan + za {0} dana + za {0} dana - prije {0} d. - prije {0} d. - prije {0} d. + prije {0} dan + prije {0} dana + prije {0} dana @@ -2600,9 +2573,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dan u mj. - - d. u mj. - prošla nedjelja ova nedjelja @@ -2619,9 +2589,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošla ned. - ova ned. - sljedeća ned. + prošla ned + ova ned + sljedeća ned + + za {0} ned + za {0} ned + za {0} ned + + + prije {0} ned + prije {0} ned + prije {0} ned + + + + prošla ned + ova ned + sljedeća ned + + za {0} ned + za {0} ned + za {0} ned + + + prije {0} ned + prije {0} ned + prije {0} ned + prošli ponedjeljak @@ -2639,7 +2634,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošli pon. + prošli pon ovaj pon. sljedeći pon @@ -2653,21 +2648,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ prije {0} pon - - prošli pon. - ovaj pon. - sljedeći pon. - - za {0} pon - za {0} pon - za {0} pon - - - prije {0} pon - prije {0} pon - prije {0} pon - - prošli utorak ovaj utorak @@ -2684,14 +2664,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošli uto. - ovaj uto. - sljedeći uto. + prošli uto + ovaj uto + sljedeći uto + + za {0} uto + za {0} uto + za {0} uto + + + prije {0} uto + prije {0} uto + prije {0} uto + prošli uto ovaj uto sljedeći uto + + za {0} uto + za {0} uto + za {0} uto + + + prije {0} uto + prije {0} uto + prije {0} uto + prošla srijeda @@ -2709,14 +2709,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošla sri. - ova sri. - sljedeća sri. + prošla sri + ova sri + sljedeća sri + + za {0} sri + za {0} sri + za {0} sri + + + prije {0} sri + prije {0} sri + prije {0} sri + prošla sri ova sri sljedeća sri + + za {0} sri + za {0} sri + za {0} sri + + + prije {0} sri + prije {0} sri + prije {0} sri + prošli četvrtak @@ -2734,14 +2754,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošli čet. - ovaj čet. - sljedeći čet. + prošli čet + ovaj čet + sljedeći čet + + za {0} čet + za {0} čet + za {0} čet + + + prije {0} čet + prije {0} čet + prije {0} čet + prošli čet ovaj čet sljedeći čet + + za {0} čet + za {0} čet + za {0} čet + + + prije {0} čet + prije {0} čet + prije {0} čet + prošli petak @@ -2759,9 +2799,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošli pet. - ovaj pet. - sljedeći pet. + prošli pet + ovaj pet + sljedeći pet + + za {0} pet + za {0} pet + za {0} pet + + + prije {0} pet + prije {0} pet + prije {0} pet + + + + prošli pet + ovaj pet + sljedeći pet + + za {0} pet + za {0} pet + za {0} pet + + + prije {0} pet + prije {0} pet + prije {0} pet + prošla subota @@ -2779,9 +2844,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - prošla sub. - ova sub. - sljedeća sub. + prošla sub + ova sub + sljedeća sub + + za {0} sub + za {0} sub + za {0} sub + + + prije {0} sub + prije {0} sub + prije {0} sub + + + + prošla sub + ova sub + sljedeća sub + + za {0} sub + za {0} sub + za {0} sub + + + prije {0} sub + prije {0} sub + prije {0} sub + prijepodne/poslijepodne @@ -2821,13 +2911,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ min za {0} min - za {0} min. - za {0} min. + za {0} min + za {0} min - prije {0} min. - prije {0} min. - prije {0} min. + prije {0} min + prije {0} min + prije {0} min + + + + + za {0} min + za {0} min + za {0} min + + + prije {0} min + prije {0} min + prije {0} min @@ -2857,9 +2959,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ prije {0} sek. - - s - vremenska zona @@ -2892,9 +2991,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angvila - - Tirana - Jerevan @@ -3050,9 +3146,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pnom Pen - - Enderbury - Pjongjang @@ -3289,9 +3382,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Zapadnoafričko vrijeme - Zapadnoafričko standardno vrijeme - Zapadnoafričko ljetno vrijeme + Zapadnoafričko vrijeme @@ -3692,6 +3783,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gvajansko vrijeme + + + Havajsko-aleućansko standardno vrijeme + + Havajsko-aleućansko vrijeme @@ -4142,6 +4238,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Čučko vrijeme + + + Turska vreme + Turska standardno vreme + Turska letnje računanje vremena + + turkmenistansko vrijeme @@ -4614,10 +4717,224 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4661,6 +4978,236 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + Andorska pezeta @@ -6008,13 +6555,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ slovačkih kuna - Sijeraleonski leone + sijeraleonski leone sijeraleonski leone sijeraleonska leona sijeraleonskih leona - Sijeraleonski leone (1964—2022) + sijeraleonski leone (1964—2022) sijeraleonski leone (1964—2022) sijeraleonska leona (1964—2022) sijeraleonskih leona (1964—2022) @@ -6317,6 +6864,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ istočnokaripskih dolara XCD + + karipski gulden + karipski gulden + karipska guldena + karipskih guldena + Posebna prava posebno crtaće pravo @@ -6462,6 +7015,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabvejska dolara (1980–2008) zimbabvejski dolari (1980–2008) + + zimbabveansko zlato + zimbabveansko zlato + zimbabveanska zlata + zimbabveanskih zlata + Zimbabvejski dolar (2009) zimbabvejski dolaz (2009) @@ -6488,17 +7047,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + femto{0} + + + ato{0} + + + zepto{0} + + + jokto{0} + ronto{0} - kuekto{0} + kvekto{0} + + + deka{0} + + + eksa{0} + + + zeta{0} + + + jota{0} - ronna{0} + rona{0} - quetta{0} + kveta{0} kibi{0} @@ -6516,13 +7099,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ pebi{0} - exbi{0} + eksbi{0} zebi{0} - yobe{0} + jobi{0} kvadratni {0} @@ -6640,7 +7223,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimola po litru {0} milimola po litru - + + dijelovi + {0} dio + {0} dijela + {0} dijelova + + dijelovi na milion {0} dio na milion {0} dijela na milion @@ -6670,6 +7259,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mola {0} mola + + glukoze + {0} glukoze + {0} glukoze + {0} glukoze + litri po kilometru {0} litar po kilometru @@ -6983,6 +7578,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} po kilometru + metri {0} metar {0} metra {0} metara @@ -7237,6 +7833,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetra živinog stuba {0} milimetara živinog stuba + + žive + {0} žive + {0} žive + {0} žive + funte po kvadratnom inču {0} funta po kvadratnom inču @@ -7317,7 +7919,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Beafort Beafort {0} - B {0} + Beafort {0} Beafort {0} @@ -7442,6 +8044,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metričke šolje {0} metričkih šolja + + tekuće unce + {0} tekuća unca + {0} tekuće unce + {0} tekućih unci + jutar-stope {0} jutar-stopa @@ -7497,7 +8105,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. tekućih unci - kašike {0} kašika {0} kašike {0} kašika @@ -7538,11 +8145,97 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imperijalna kvarca {0} imperijalnih kvarca + + steradijani + {0} steradijan + {0} steradijana + {0} steradijana + + + katali + {0} katal + {0} katala + {0} katala + + + kuloni + {0} kulon + {0} kulona + {0} kulona + + + faradi + {0} farad + {0} farada + {0} farada + + + henriji + {0} henri + {0} henrija + {0} henrija + + + simensi + {0} simens + {0} simensa + {0} simensa + + + kalorije [IT] + {0} kalorija [IT] + {0} kalorije [IT] + {0} kalorija [IT] + + + bekereli + {0} bekerel + {0} bekerela + {0} bekerela + + + siverti + {0} sivert + {0} siverta + {0} siverta + + + greji + {0} grej + {0} greja + {0} grejeva + + + kilogram-sile + {0} kilogram-sila + {0} kilogram-sile + {0} kilogram-sila + + + tesle + {0} tesla + {0} tesle + {0} tesle + + + veberi + {0} veber + {0} vebera + {0} vebera + + + svjetlo + {0} svjetlo + {0} svjetla + {0} svjetala + + + dijelovi na milijardu + {0} dio na milijardu + {0} dijela na milijardu + {0} dijelova na milijardu + - noći - {0} noć - {0} noći - {0} noći {0} po noći @@ -7580,9 +8273,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ katastarska jutra - {0} ac - {0} ac - {0} ac dunumi @@ -7602,9 +8292,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} stavke {0} stavki - + + dio + {0} dio + {0} dijela + {0} dijelova + + dijelovi/milion + + Glc + {0} Glc + {0} Glc + {0} Glc + L/100 km {0} L/100 km @@ -7722,9 +8424,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ džuli - - kW-sat - BTU {0} BTU @@ -7838,6 +8537,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + {0} Hg + {0} Hg + {0} Hg + čv {0} čv @@ -7979,6 +8683,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. kvarta {0} imp. kvarata + + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + + + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + + + {0} S + {0} S + {0} S + + + cal [IT] + {0} cal IT + {0} cal IT + {0} cal IT + + + {0} Bq + {0} Bq + {0} Bq + + + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + + + svjetlo + {0} svjetlo + {0} svjetla + {0} svjetala + noći {0} noć @@ -7997,13 +8758,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ aker - {0} ac - {0} ac - {0} ac - + + dio + {0} dio + {0} dijela + {0} dijelova + + ppm + + Glc + {0} Glc + {0} Glc + {0} Glc + {0} B {0} B @@ -8068,11 +8838,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kWh/100 km {0}kWh/100 km - - {0}ppcm - {0} ppcm - {0}ppcm - {0}ppi {0} ppi @@ -8091,9 +8856,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tačka - - m - mi @@ -8129,6 +8891,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} gr {0} gr + + {0} Hg + {0} Hg + {0} Hg + {0} mb {0} mbar @@ -8139,65 +8906,69 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}° {0}° - - {0}°F - {0} °F - {0}°F - - - Ml - - - hl - litar {0}l {0}l {0}l - - dl - {0} dl - {0} dl - {0} dl - - - cl - {0} cl - {0} cl - {0} cl - - - ml - {0} ml - {0} ml - {0} ml - kšk. - {0} kšk. - {0} kšk. - {0} kšk. - - - kšč. - {0} kšč. - {0} kšč. - {0} kšč. imp. kvart - {0} imp. kvart - {0} imp. kvarta - {0} imp. kvarata - - noći - {0} noć - {0} noći - {0} noći - {0}/noć + + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + + + {0} F + {0} F + {0} F + + + {0} S + {0} S + {0} S + + + cal [IT] + {0} cal IT + {0} cal IT + {0} cal IT + + + {0} Bq + {0} Bq + {0} Bq + + + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + + + svjetlo + {0} svjetlo + {0} svjetla + {0} svjetala {0}I diff --git a/make/data/cldr/common/main/bs_Cyrl.xml b/make/data/cldr/common/main/bs_Cyrl.xml index dda7b7539b8..204c0826069 100644 --- a/make/data/cldr/common/main/bs_Cyrl.xml +++ b/make/data/cldr/common/main/bs_Cyrl.xml @@ -1144,10 +1144,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Календар Републике Кине рачуноводствени формат валуте стандардни формат валуте - Традиционално кинеско сортирање Редослед сортирања у речнику задани Unicode редослијед сортирања - Поједностављено кинеско сортирање Сортирање као телефонски именик Пињин сортирање Реформисани редослед сортирања @@ -3145,9 +3143,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пном Пен - - Ендербери - Киритимати @@ -3819,9 +3814,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Западно-афричко вријеме - Западно-афричко стандардно вријеме - Западно-афричко љетње рачунање времена + Западно-афричко вријеме @@ -4204,6 +4197,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гвајана вријеме + + + Хавајско-алеутско стандардно вријеме + + Хавајско-алеутско вријеме @@ -4654,6 +4652,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Трук вријеме + + + Турска време + Турска стандардно време + Турска летње рачунање времена + + Туркменистан вријеме @@ -4821,6 +4826,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/bua.xml b/make/data/cldr/common/main/bua.xml new file mode 100644 index 00000000000..190524d1e3e --- /dev/null +++ b/make/data/cldr/common/main/bua.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + буряад + англи + + + + + + Ород Улас + + + Мэтрик + ЕБ + АНУ + + + + [а б в г д её ж з и й к л м н о ө п р с т у ү ф х һ ц ч ш щ ъ ы ь э ю я] + [{а́} {е́} {и́} {о́} {у́} {ы́} {э́} {ю́} {я́}] + [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + + + « + » + + + + + + + + + + нэгэдүгээр һара + хоёрдугаар һара + гурбадугаар һара + дүрбэдүгээр һара + табадугаар һара + зургадугаар һара + долодугаар һара + наймадугаар һара + юһэдүгээр һара + арбадугаар һара + арбан нэгэдүгээр һара + арбан хоёрдугаар һара + + + + + + + Ни + Да + Ми + Һа + Пү + Ба + Би + + + нима + дабаа + мигмар + һарба + пүрбэ + баасан + бимба + + + + + + G y MM 'һарын' d + G y MM 'һарын' d, E + MM 'һарын' d + E, MM 'һарын' d + MM 'һарын' d + dd.MM.y + y 'оной' MM 'һарын' d + y 'оной' MM 'һарын' d, E + y 'оной' MMMM + + + {0} – {1} + + G y MM 'һарын' d–d + G y MM 'һарын' d – G y MM 'һарын' d + G y MM 'һарын' d – MM 'һарын' d + G y MM 'һарын' d – y MM 'һарын' d + + + G y MM 'һарын' d, E – MM 'һарын' d, E + G y MM 'һарын' d, E – G y MM 'һарын' d, E + G y MM 'һарын' d, E – MM 'һарын' d, E + G y MM 'һарын' d, E – y MM 'һарын' d, E + + + MM 'һарын' d – d + MM 'һарын' d – MM 'һарын' d + + + MM 'һарын' d, E – MM 'һарын' d, E + MM 'һарын' d, E – MM 'һарын' d, E + + + y MMM – MMM + + + y 'оной' MMM d – d + y 'оной' MM 'һарын' d – MM 'һарын' d + y 'оной' MMMM d – y 'оной' MMMM d + + + y 'оной' MM 'һарын' d, E – y 'оной' MM 'һарын' d, E + E, MM 'һарын' d – E, MM 'һарын' d, y + E, MM 'һарын' d, y – E, MM 'һарын' d, y + + + y 'оной' MMMM – MMMM + y 'оной' MMMM – y 'оной' MMMM + + + + + + + + үнгэрэгшэ жэл + энэ жэл + хойто жэл + + + үнгэрэгшэ һара + энэ һара + хойто һара + + + үнгэрэгшэ долоон хоног + энэ долоон хоног + хойто долоон хоног + + + үсэгэлдэр + мүнөө + үглөөдэр + + + үнгэрэгшэ нима + энэ нима + хойто нима + + + + + + Гринвичын саг + + + + + + + , +   + + + + + #,##0 % + + + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + diff --git a/make/data/cldr/common/main/bua_RU.xml b/make/data/cldr/common/main/bua_RU.xml new file mode 100644 index 00000000000..e17cd74dc1f --- /dev/null +++ b/make/data/cldr/common/main/bua_RU.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/ca.xml b/make/data/cldr/common/main/ca.xml index ddcab9cdd02..6ab5971a512 100644 --- a/make/data/cldr/common/main/ca.xml +++ b/make/data/cldr/common/main/ca.xml @@ -314,6 +314,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurd + kurd + kurmanji kúmik kutenai komi @@ -905,7 +907,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Xina Colòmbia Illa Clipperton - Sark + Sark Costa Rica Cuba Cap Verd @@ -1206,33 +1208,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ordre numèric força de l’ordre moneda + presentació de l’emoji sistema horari (12 h o 24 h) estil de salt de línia + salt de línia entre paraules sistema de mesures xifres + pausa després de les abreviatures zona horària variant local ús privat calendari budista + budista calendari xinès + xinès calendari copte + copte calendari dangi + dangi calendari etíop + etíop calendari etíop amete-alem + etíop amete-alem calendari gregorià + gregorià calendari hebreu + hebreu calendari hindú calendari islàmic + civil islàmic calendari civil islàmic + civil islàmic calendari islàmic (Umm al-Qura) + islàmic (Umm al-Qura) calendari ISO-8601 calendari japonès + japonès calendari persa + persa calendari de la República de Xina + de la República de Xina format de moneda comptable + comptable format de moneda estàndard + estàndard Ordena els símbols Ordena sense tenir en compte els símbols Ordena els accents de manera normal @@ -1242,22 +1263,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordena amb majúscules primer Ordena sense distingir majúscules i minúscules Ordena amb detecció de majúscules i minúscules - ordre del xinès tradicional - Big5 ordre anterior, per a compatibilitat + compatibilitat ordre de diccionari + diccionari ordre Unicode predeterminat + unicode predeterminat normes europees d’ordenació - ordre del xinès simplificat - GB2312 ordre de la guia telefònica + guia telefònica ordre fonètic + fonètic ordre pinyin + pinyin cerca de propòsit general + cerca cerca per consonant inicial del hangul ordre estàndard + estàndard ordre dels traços + traços ordre tradicional + tradicional ordre de traços radicals + traços radicals ordre zhuyin + zhuyin Ordena sense normalització Ordena per caràcters Unicode normalitzats Ordena els dígits individualment @@ -1270,18 +1301,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ amplada completa amplada mitjana Numèric + predeterminada + emoji + text sistema de 12 hores (0–11) + 12 (0–11) sistema de 12 hores (1–12) + 12 (1–12) sistema de 24 hores (0–23) + 24 (0–23) sistema de 24 hores (1–24) + 24 (1–24) salt de línia flexible + flexible salt de línia normal + normal salt de línia estricte + estricte + divideix-ho tot + conserva-ho tot + normal + conserva en sintagmes sistema de transliteració BGN sistema de transliteració UNGEGN sistema mètric + mètric sistema imperial d’unitats + imperial sistema d’unitats dels EUA + EUA xifres indoaràbigues xifres indoaràbigues ampliades nombres armenis @@ -1338,6 +1386,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dígits tibetans Numerals tradicionals dígits vai + desactivada + activada mètric @@ -1363,9 +1413,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\- ‐‑ – — , ; \: ! ¡ ? ¿ . … '‘’ "“” « » ( ) \[ \] § @ * / \\ \& # † ‡ ′ ″] {0}… {0}… {1} - - [\: ∶] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1518,6 +1565,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'a' 'les' {0} + + {1} 'a' 'les' {0} + @@ -1526,35 +1576,46 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'a' 'les' {0} + + {1} 'a' 'les' {0} + {1}, {0} + + {1} 'a' 'les' {0} + {1}, {0} + + {1} 'a' 'les' {0} + E d E h:mm a E h:mm:ss a y G + M/y G dd-MM-y GGGGG + E, d/M/y G LLL y G d MMM y G E, d MMM y G LLLL 'del' y G d MMMM 'del' y G E, d MMMM 'del' y G - h a H h:mm a H:mm h:mm:ss a H:mm:ss + H 'h' v d/M E, d/M d MMM @@ -1576,12 +1637,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ y G - - h B – h B - - - h:mm B – h:mm B - y G – y G y – y G @@ -1928,6 +1983,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, 'a' 'les' {0} + + {1}, 'a' 'les' {0} + @@ -1936,6 +1994,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, 'a' 'les' {0} + + {1}, 'a' 'les' {0} + @@ -1954,14 +2015,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm:ss a E H:mm:ss y G + M/y G dd-MM-y GGGGG + E, d/M/y G LLL y G d MMM 'del' y G E, d MMM 'del' y G LLLL 'del' y G d MMMM 'del' y G E, d MMMM 'del' y G - h a H h:mm a H:mm @@ -1975,6 +2037,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm v h:mm a (vvvv) H:mm (vvvv) + H 'h' v d/M E d/M d MMM @@ -2036,10 +2099,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM, y G E, d MMM, y – E, d MMM, y G - - h a – h a - h–h a - H–H @@ -2061,10 +2120,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm–H:mm v H:mm–H:mm v - - h a – h a v - h–h a v - H–H v @@ -2579,18 +2634,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ciutat desconeguda - - Tirana - - - Río Gallegos - - - Tucumán - - - Córdoba - Viena @@ -2606,27 +2649,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bermudes - - Eirunepé - - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - Blanc Sablon @@ -2663,9 +2685,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Alger - - Galápagos - Caire, el @@ -2735,12 +2754,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tòquio - - Enderbury - - - Canton - Saint Kitts @@ -2780,9 +2793,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mònaco - - Khovd - Macau @@ -2792,18 +2802,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maurici - - Mazatlán - Ciutat de Mèxic Cancun - - Nouméa - Katmandú @@ -2906,9 +2910,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damasc - - N’Djamena - Duixanbé @@ -2973,9 +2974,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de l’Àfrica occidental - Hora estàndard de l’Àfrica occidental - Hora d’estiu de l’Àfrica occidental + Hora de l’Àfrica occidental @@ -3274,9 +3273,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de les illes Malvines - Hora estàndard de les illes Malvines - Hora d’estiu de les illes Malvines + Hora de les illes Falkland + Hora estàndard de les illes Falkland + Hora d’estiu de les illes Falkland @@ -3357,6 +3356,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora de Guyana + + + Hora estàndard de Hawaii-Aleutianes + + Hora de Hawaii-Aleutianes @@ -3790,6 +3794,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora de Chuuk + + + Hora de Turquia + Hora estàndard de Turquia + Hora d’estiu de Turquia + + Hora del Turkmenistan @@ -3948,42 +3959,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) - 0 k¤ - 0 k¤ - 00 k¤ - 00 k¤ - 000 k¤ - 000 k¤ - 0 M¤ - 0 M¤ - 00 M¤ - 00 M¤ - 000 M¤ - 000 M¤ - 0000 M¤ - 0000 M¤ - 00 kM¤ - 00 kM¤ - 000 kM¤ - 000 kM¤ - 0 B¤ - 0 B¤ - 00 B¤ - 00 B¤ - 000 B¤ - 000 B¤ + 0 k ¤ + 0 k ¤ + 00 k ¤ + 00 k ¤ + 000 k ¤ + 000 k ¤ + 0 M ¤ + 0 M ¤ + 00 M ¤ + 00 M ¤ + 000 M ¤ + 000 M ¤ + 0000 M ¤ + 0000 M ¤ + 00 kM ¤ + 00 kM ¤ + 000 kM ¤ + 000 kM ¤ + 0 B ¤ + 0 B ¤ + 00 B ¤ + 00 B ¤ + 000 B ¤ + 000 B ¤ @@ -5365,6 +5388,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dòlars del Carib Oriental XCD + + florí de les Antilles + florí de les Antilles + florins de les Antilles + XCG + drets especials de gir @@ -5476,6 +5505,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dòlar zimbabuès (1980–2008) dòlars zimbabuesos (1980–2008) + + or de Zimbàbue + or de Zimbàbue + or de Zimbàbue + dòlar zimbabuès (2009) dòlar zimbabuès (2009) @@ -5730,8 +5764,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - - masculine + + parts + {0} part + {0} parts + + + feminine parts per milió {0} part per milió {0} parts per milió @@ -5757,6 +5796,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} mols + + de glucosa + {0} de glucosa + {0} de glucosa + masculine litres per quilòmetre @@ -6007,7 +6051,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - kilowatt hora per 100 quilòmetres + kilowatts hora per 100 quilòmetres {0} kilowatt hora per 100 quilòmetres {0} kilowatts hora per 100 quilòmetres @@ -6336,6 +6380,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mil·límetre de mercuri {0} mil·límetres de mercuri + + de mercuri + {0} de mercuri + {0} de mercuri + lliures per polzada quadrada {0} lliura per polzada quadrada @@ -6536,6 +6585,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} tassa mètrica {0} tasses mètriques + + unces líquides mètriques + {0} unça líquida mètrica + {0} unces líquides mètriques + acre-peu {0} acre-peu @@ -6624,23 +6678,84 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ quarts imperials + + estereoradians + {0} estereoradian + {0} estereoradians + + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calories [IT] + {0} caloria [IT] + {0} calories [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + quilograms força + {0} quilogram força + {0} quilograms força + + + tesles + {0} tesla + {0} tesles + + + webers + {0} weber + {0} webers + feminine - llum - {0} llum - {0} llum + {0} llums + {0} llums - - masculine - part per mil milions + + feminine + parts per mil milions {0} part per mil milions {0} parts per mil milions feminine - nits - {0} nit - {0} nits {0} per nit @@ -6700,7 +6815,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ítem {0} ítems - + parts/milió @@ -6718,6 +6833,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -6930,8 +7048,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ gra - {0} gra - {0} grans + {0} gr + {0} gr W @@ -6946,6 +7064,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + d‘Hg + {0} d‘Hg + {0} d‘Hg + {0} bar {0} bars @@ -7066,13 +7189,40 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quart imperial {0} quarts imperials + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + llum - {0} llum - {0} llum + {0} llums + {0} llums - - part/mil milions + + parts/mil milions nits @@ -7118,7 +7268,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mM/l - + ppm @@ -7130,6 +7280,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + s. {0} s. @@ -7213,13 +7366,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ g + + gr + {0} gr + {0} gr + {0}kW {0}kW + + d‘Hg + {0} d‘Hg + {0} d‘Hg + - {0} mb - {0} mb + {0} mbar + {0} mbars {0}°F @@ -7247,16 +7410,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt imp {0} qt imp + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + - llum - {0} llum - {0} llum + {0} llums + {0} llums + + + ppb nit {0}/nit - {0}/nit - {0}/nit + {0}/nits diff --git a/make/data/cldr/common/main/ca_ES_VALENCIA.xml b/make/data/cldr/common/main/ca_ES_VALENCIA.xml index 0a0c226a32b..6ecb1bdbf1d 100644 --- a/make/data/cldr/common/main/ca_ES_VALENCIA.xml +++ b/make/data/cldr/common/main/ca_ES_VALENCIA.xml @@ -99,8 +99,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendari xinés calendari japonés - ordre del xinés tradicional - Big5 - ordre del xinés simplificat - GB2312 diff --git a/make/data/cldr/common/main/ccp.xml b/make/data/cldr/common/main/ccp.xml index c0f2ad0b8bd..7a1aeabd71a 100644 --- a/make/data/cldr/common/main/ccp.xml +++ b/make/data/cldr/common/main/ccp.xml @@ -1035,10 +1035,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𑄜𑄪𑄣𑄴𑄣𑄳𑄠𑄬 𑄝𑄧𑄢𑄧𑄦𑄘𑄧𑄢𑄴 𑄦𑄧𑄢𑄧𑄇𑄴 𑄝𑄬𑄭𑄣𑄧𑄚 𑄇𑄬𑄥𑄴 𑄃𑄧𑄥𑄧𑄁𑄝𑄬𑄘𑄩 𑄝𑄬𑄭𑄣𑄧𑄚 𑄇𑄬𑄥𑄴 𑄥𑄧𑄁𑄝𑄘𑄩 𑄝𑄬𑄭𑄣𑄧𑄚 - 𑄛𑄳𑄢𑄧𑄗𑄉𑄧𑄖𑄧 𑄌𑄩𑄚 𑄥𑄧𑄎𑄴𑄎𑄇𑄳𑄢𑄟𑄴-𑄝𑄨𑄉𑄴𑄻 𑄇𑄧𑄙𑄖𑄢 𑄝𑄬𑄭𑄣𑄧𑄚𑄢𑄴 𑄚𑄨𑄠𑄮𑄟𑄴 𑄓𑄨𑄜𑄧𑄣𑄴𑄑𑄴 𑄃𑄨𑄃𑄪𑄚𑄨𑄇𑄮𑄓𑄴 𑄝𑄬𑄭𑄣𑄧𑄚 - 𑄃𑄧𑄎𑄬𑄃𑄧𑄌𑄴 𑄌𑄩𑄚 𑄥𑄎𑄚-𑄎𑄨𑄝𑄨𑄸𑄹𑄷𑄸 𑄜𑄮𑄚𑄴𑄝𑄪𑄇𑄴 𑄥𑄎𑄚 𑄢𑄳𑄦𑄧 𑄝𑄬𑄭𑄣𑄧𑄚 𑄛𑄨𑄚𑄨𑄚𑄴 𑄥𑄎𑄚 @@ -3207,9 +3205,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 𑄛𑄧𑄏𑄨𑄟𑄬𑄘𑄨 𑄃𑄜𑄳𑄢𑄨𑄇 𑄃𑄧𑄇𑄴𑄖𑄧 - 𑄛𑄧𑄏𑄨𑄟𑄬𑄘𑄨 𑄃𑄜𑄳𑄢𑄨𑄇 𑄟𑄚𑄧𑄇𑄴 𑄃𑄧𑄇𑄴𑄖𑄧 - 𑄛𑄧𑄏𑄨𑄟𑄬𑄘𑄨 𑄃𑄜𑄳𑄢𑄨𑄇 𑄉𑄧𑄢𑄧𑄟𑄴𑄇𑄣𑄧𑄢𑄴 𑄃𑄧𑄇𑄴𑄖𑄧 + 𑄛𑄧𑄏𑄨𑄟𑄬𑄘𑄨 𑄃𑄜𑄳𑄢𑄨𑄇 𑄃𑄧𑄇𑄴𑄖𑄧 @@ -3585,6 +3581,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𑄉𑄪𑄠𑄚 𑄃𑄧𑄇𑄴𑄖𑄧 + + + 𑄦𑄧𑄃𑄮𑄠𑄭-𑄃𑄣𑄬𑄃𑄪𑄖𑄴 𑄟𑄚𑄧𑄇𑄴 𑄃𑄧𑄇𑄴𑄖𑄧 + + 𑄦𑄃𑄮𑄠𑄭 𑄃𑄳𑄠𑄣𑄨𑄃𑄪𑄑𑄨𑄠𑄚𑄴 𑄃𑄧𑄇𑄴𑄖𑄧 @@ -4155,6 +4156,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##,##0.00;(#,##,##0.00) + + + 0G¤ + 0G ¤ + 00G¤ + 00G ¤ + 000G¤ + 000G ¤ + 0T¤ + 0T ¤ + 00T¤ + 00T ¤ + 000T¤ + 000T ¤ + + {0} {1} {0} {1} @@ -5070,7 +5087,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 𑄟𑄨𑄣𑄨𑄟𑄮𑄣𑄴, 𑄛𑄳𑄢𑄧𑄖𑄨 𑄣𑄨𑄑𑄢𑄬 {0} 𑄟𑄨𑄣𑄨𑄟𑄮𑄣𑄴, 𑄛𑄳𑄢𑄧𑄖𑄨 𑄣𑄨𑄑𑄢𑄬 - + 𑄞𑄇𑄴, 𑄛𑄳𑄢𑄧𑄖𑄨 𑄘𑄧𑄌𑄴 𑄣𑄬𑄉 {0} 𑄞𑄧𑄇𑄴, 𑄛𑄳𑄢𑄧𑄖𑄨 𑄘𑄧𑄌𑄴 𑄣𑄉𑄬 {0} 𑄞𑄧𑄇𑄴, 𑄛𑄳𑄢𑄧𑄖𑄨 𑄘𑄧𑄌𑄴 𑄣𑄉𑄬 diff --git a/make/data/cldr/common/main/ce.xml b/make/data/cldr/common/main/ce.xml index 90a35254b99..ac301facbbd 100644 --- a/make/data/cldr/common/main/ce.xml +++ b/make/data/cldr/common/main/ce.xml @@ -1862,9 +1862,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пномпень - - Эндерберин, гӀ-е - Киритимати @@ -2526,9 +2523,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Малхбузен Африка - Малхбузен Африка, стандартан хан - Малхбузен Африка, аьхкенан хан + Малхбузен Африка @@ -2878,6 +2873,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гайана + + + Гавайн-алеутийн стандартан хан + + Гавайн-алеутийн хан @@ -3441,6 +3441,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ceb.xml b/make/data/cldr/common/main/ceb.xml index 89746056e89..7c184eb46cf 100644 --- a/make/data/cldr/common/main/ceb.xml +++ b/make/data/cldr/common/main/ceb.xml @@ -22,18 +22,22 @@ the LDML specification (http://unicode.org/reports/tr35/) German Swiss High German English - Britanikong English + English (British) English (UK) English (America) English (US) Espanyol - Espanyol (Europa) - Pranses + Spanish (Latin America) + Spanish (Europe) + Spanish (Mexico) + French + French (Canada) + French (Switzerland) Hindi Hinglish Indonesian - Italyano - Hinapon + Italian + Japanese Korean Dutch Flemish @@ -42,8 +46,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Russian Thai Turkish - Wala Mailhing Pinulongan - Inintsik + Wala mailhi nga pinulongan + Chinese Chinese, Mandarin Pinasimple nga Chinese Pinasimple nga Mandarin Chinese @@ -51,7 +55,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Tradisyonal nga Mandarin Chinese - + @@ -64,7 +68,7 @@ the LDML specification (http://unicode.org/reports/tr35/) - kalibutan + kalibotan Africa North America South America @@ -149,6 +153,7 @@ the LDML specification (http://unicode.org/reports/tr35/) China Colombia Clipperton Island + Sark Costa Rica Cuba Cape Verde @@ -288,7 +293,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Peru French Polynesia Papua New Guinea - Pilipinas + Philippines Pakistan Poland St. Pierre & Miquelon @@ -342,6 +347,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Tunisia Tonga Turkiye + Turkey Trinidad & Tobago Tuvalu Taiwan @@ -349,8 +355,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Ukraine Uganda U.S. Outlying Islands - Hiniusang Kanasoran - Estados Unidos + United Nations + United States US Uruguay Uzbekistan @@ -380,8 +386,10 @@ the LDML specification (http://unicode.org/reports/tr35/) Gregorian nga Kalendaryo - Kalendaryo sa ISO-8601 + Gregorian + Gregorian nga Kalendaryo (Tuig Una) Standard nga Paagi sa Paghan-ay + Standard Mga Western Digit @@ -507,6 +515,7 @@ the LDML specification (http://unicode.org/reports/tr35/) MMM d – d, y G MMM d, y G – MMM d, y G MMM d – MMM d, y G + MMM d, y – MMM d, y G E, MMM d – E, MMM d, y G @@ -599,7 +608,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Hunyo Hulyo Agosto - Septyembre + Septiyembre Oktubre Nobyembre Disyembre @@ -629,7 +638,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Hunyo Hulyo Agosto - Septyembre + Septiyembre Oktubre Nobyembre Disyembre @@ -678,7 +687,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Q4 - unang quarter + ika-1 nga quarter + ika-2 nga quarter + ika-3 nga quarter + ika-4 nga quarter + + + + + ika-1 nga quarter ika-2 nga quarter ika-3 nga quarter ika-4 nga quarter @@ -696,9 +713,9 @@ the LDML specification (http://unicode.org/reports/tr35/) Sa Wala Pa Si Kristo - Wala Pa ang Common Era + Wala Pa ang Komon nga Panahon Anno Domini - Komong Panahon + Komon nga Panahon BC @@ -788,11 +805,10 @@ the LDML specification (http://unicode.org/reports/tr35/) E h:mm a E h:mm:ss a y G - M/d/y GGGGG + M/d/y G MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -823,21 +839,21 @@ the LDML specification (http://unicode.org/reports/tr35/) y – y G - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y G – M/y G + M/y – M/y G + M/y – M/y G - M/d/y – M/d/y GGGGG - M/d/y GGGGG – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + M/d/y – M/d/y G + M/d/y G – M/d/y G + M/d/y – M/d/y G + M/d/y – M/d/y G - E, M/d/y – E, M/d/y GGGGG - E, M/d/y GGGGG – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG + E, M/d/y – E, M/d/y G + E, M/d/y G – E, M/d/y G + E, M/d/y – E, M/d/y G + E, M/d/y – E, M/d/y G MMM y G – MMM y G @@ -971,7 +987,13 @@ the LDML specification (http://unicode.org/reports/tr35/) miaging semana karong semanaha sunod nga semana - ang semana sa {0} + sa semana sa {0} + + + sa semana sa {0} + + + sa seman sa {0} adlaw @@ -1015,14 +1037,13 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa {0} Daylight nga Oras sa {0} Standard nga Oras sa {0} - {1} {0} Coordinated Universal Time - Wala Mailhing Lungsod + Wala Mailhing Lokasyon @@ -1034,11 +1055,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Irish Standard Time - - Enderbury - - Siyudad sa Ho Chi Minh + Ho Chi Minh City @@ -1057,14 +1075,12 @@ the LDML specification (http://unicode.org/reports/tr35/) - Standard nga Oras sa South Africa + South Africa Standard Time - Oras sa West Africa - Standard nga Oras sa West Africa - Oras sa Ting-init sa West Africa + Oras sa West Africa @@ -1077,8 +1093,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Amazon - Standard nga Oras sa Amazon - Oras sa Ting-init sa Amazon + Amazon Standard Time + Amazon Summer Time @@ -1112,36 +1128,36 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Apia - Standard nga Oras sa Apia - Daylight nga Oras sa Apia + Samoa Standard Time + Samoa Daylight Time Oras sa Arabia - Standard nga Oras sa Arabia - Daylight nga Oras sa Arabia + Arabian Standard Time + Arabian Daylight Time Oras sa Argentina - Standard nga Oras sa Argentina - Oras sa Ting-init sa Argentina + Argentina Standard Time + Argentina Summer Time Oras sa Western Argentina - Standard nga Oras sa Western Argentina - Oras sa Ting-init sa Western Argentina + Western Argentina Standard Time + Western Argentina Summer Time Oras sa Armenia - Standard nga Oras sa Armenia - Oras sa Ting-init sa Armenia + Armenia Standard Time + Armenia Summer Time @@ -1154,50 +1170,50 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Central Australia - Standard nga Oras sa Central Australia - Daylight nga Oras sa Central Australia + Australian Central Standard Time + Australian Central Daylight Time Oras sa Central Western Australia - Standard nga Oras sa Central Western Australia - Daylight nga Oras sa Central Western Australia + Australian Central Western Standard Time + Australian Central Western Daylight Time Oras sa Eastern Australia - Standard nga Oras sa Eastern Australia - Daylight nga Oras sa Eastern Australia + Australian Eastern Standard Time + Australian Eastern Daylight Time Oras sa Western Australia - Standard nga Oras sa Western Australia - Daylight nga Oras sa Western Australia + Australian Western Standard Time + Australian Western Daylight Time Oras sa Azerbaijan - Standard nga Oras sa Azerbaijan - Oras sa Ting-init sa Azerbaijan + Azerbaijan Standard Time + Azerbaijan Summer Time Oras sa Azores - Standard nga Oras sa Azores - Oras sa Ting-init sa Azores + Azores Standard Time + Azores Summer Time Oras sa Bangladesh - Standard nga Oras sa Bangladesh - Oras sa Ting-init sa Bangladesh + Bangladesh Standard Time + Bangladesh Summer Time @@ -1213,8 +1229,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Brasilia - Standard nga Oras sa Brasilia - Oras sa Ting-init sa Brasilia + Brasilia Standard Time + Brasilia Summer Time @@ -1225,34 +1241,34 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Cape Verde - Standard nga Oras sa Cape Verde - Oras sa Ting-init sa Cape Verde + Cape Verde Standard Time + Cape Verde Summer Time - Standard nga Oras sa Chamorro + Chamorro Standard Time Oras sa Chatham - Standard nga Oras sa Chatham - Daylight nga Oras sa Chatham + Chatham Standard Time + Chatham Daylight Time Oras sa Chile - Standard nga Oras sa Chile - Oras sa Ting-init sa Chile + Chile Standard Time + Chile Summer Time Oras sa China - Standard nga Oras sa China - Daylight nga Oras sa China + China Standard Time + China Daylight Time @@ -1268,22 +1284,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Colombia - Standard nga Oras sa Colombia - Oras sa Ting-init sa Colombia + Colombia Standard Time + Colombia Summer Time Oras sa Cook Islands - Standard nga Oras sa Cook Islands - Katungang Oras sa Ting-init sa Cook Islands + Cook Islands Standard Time + Cook Islands Summer Time Oras sa Cuba - Standard nga Oras sa Cuba - Daylight nga Oras sa Cuba + Cuba Standard Time + Cuba Daylight Time @@ -1304,8 +1320,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Easter Island - Standard nga Oras sa Easter Island - Oras sa Ting-init sa Easter Island + Easter Island Standard Time + Easter Island Summer Time @@ -1316,15 +1332,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Central Europe - Standard nga Oras sa Central Europe - Oras sa Ting-init sa Central Europe + Central European Standard Time + Central European Summer Time Oras sa Eastern Europe - Standard nga Oras sa Eastern Europe - Oras sa Ting-init sa Eastern Europe + Eastern European Standard Time + Eastern European Summer Time @@ -1335,22 +1351,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Western Europe - Standard nga Oras sa Western Europe - Oras sa Ting-init sa Western Europe + Western European Standard Time + Western European Summer Time Oras sa Falkland Islands - Standard nga Oras sa Falkland Islands - Oras sa Ting-init sa Falkland Islands + Falkland Islands Standard Time + Falkland Islands Summer Time Oras sa Fiji - Standard nga Oras sa Fiji - Oras sa Ting-init sa Fiji + Fiji Standard Time + Fiji Summer Time @@ -1376,8 +1392,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Georgia - Standard nga Oras sa Georgia - Oras sa Ting-init sa Georgia + Georgia Standard Time + Georgia Summer Time @@ -1393,20 +1409,20 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa East Greenland - Standard nga Oras sa East Greenland - Oras sa Ting-init sa East Greenland + East Greenland Standard Time + East Greenland Summer Time Oras sa West Greenland - Standard nga Oras sa West Greenland - Oras sa Ting-init sa West Greenland + West Greenland Standard Time + West Greenland Summer Time - Standard nga Oras sa Gulf + Gulf Standard Time @@ -1414,30 +1430,35 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Guyana + + + Hawaii-Aleutian Standard Time + + Oras sa Hawaii-Aleutian - Standard nga Oras sa Hawaii-Aleutian - Daylight nga Oras sa Hawaii-Aleutian + Hawaii-Aleutian Standard Time + Hawaii-Aleutian Daylight Time Oras sa Hong Kong - Standard nga Oras sa Hong Kong - Oras sa Ting-init sa Hong Kong + Hong Kong Standard Time + Hong Kong Summer Time Oras sa Hovd - Standard nga Oras sa Hovd - Oras sa Ting-init sa Hovd + Khovd Standard Time + Khovd Summer Time - Standard nga Oras sa India + India Standard Time @@ -1468,29 +1489,29 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Iran - Standard nga Oras sa Iran - Daylight nga Oras sa Iran + Iran Standard Time + Iran Daylight Time Oras sa Irkutsk - Standard nga Oras sa Irkutsk - Oras sa Ting-init sa Irkutsk + Irkutsk Standard Time + Irkutsk Summer Time Oras sa Israel - Standard nga Oras sa Israel - Daylight nga Oras sa Israel + Israel Standard Time + Israel Daylight Time Oras sa Japan - Standard nga Oras sa Japan - Daylight nga Oras sa Japan + Japan Standard Time + Japan Daylight Time @@ -1511,8 +1532,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Korea - Standard nga Oras sa Korea - Daylight nga Oras sa Korea + Korean Standard Time + Korean Daylight Time @@ -1523,8 +1544,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Krasnoyarsk - Standard nga Oras sa Krasnoyarsk - Oras sa Ting-init sa Krasnoyarsk + Krasnoyarsk Standard Time + Krasnoyarsk Summer Time @@ -1540,15 +1561,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Lord Howe - Standard nga Oras sa Lord Howe - Daylight nga Oras sa Lord Howe + Lord Howe Standard Time + Lord Howe Daylight Time Oras sa Magadan - Standard nga Oras sa Magadan - Oras sa Ting-init sa Magadan + Magadan Standard Time + Magadan Summer Time @@ -1574,8 +1595,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Mauritius - Standard nga Oras sa Mauritius - Oras sa Ting-init sa Mauritius + Mauritius Standard Time + Mauritius Summer Time @@ -1586,22 +1607,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Mexican Pacific - Standard nga Oras sa Mexican Pacific - Daylight nga Oras sa Mexican Pacific + Mexican Pacific Standard Time + Mexican Pacific Daylight Time Oras sa Ulaanbaatar - Standard nga Oras sa Ulaanbaatar - Oras sa Ting-init sa Ulaanbaatar + Ulaanbaatar Standard Time + Ulaanbaatar Summer Time Oras sa Moscow - Standard nga Oras sa Moscow - Oras sa Ting-init sa Moscow + Moscow Standard Time + Moscow Summer Time @@ -1622,22 +1643,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa New Caledonia - Standard nga Oras sa New Caledonia - Oras sa Ting-init sa New Caledonia + New Caledonia Standard Time + New Caledonia Summer Time Oras sa New Zealand - Standard nga Oras sa New Zealand - Daylight nga Oras sa New Zealand + New Zealand Standard Time + New Zealand Daylight Time Oras sa Newfoundland - Standard nga Oras sa Newfoundland - Daylight nga Oras sa Newfoundland + Newfoundland Standard Time + Newfoundland Daylight Time @@ -1648,36 +1669,36 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Norfolk Island - Standard nga Oras sa Norfolk Island - Daylight nga Oras sa Norfolk Island + Norfolk Island Standard Time + Norfolk Island Daylight Time Oras sa Fernando de Noronha - Standard nga Oras sa Fernando de Noronha - Oras sa Ting-init sa Fernando de Noronha + Fernando de Noronha Standard Time + Fernando de Noronha Summer Time Oras sa Novosibirsk - Standard nga Oras sa Novosibirsk - Oras sa Ting-init sa Novosibirsk + Novosibirsk Standard Time + Novosibirsk Summer Time Oras sa Omsk - Standard nga Oras sa Omsk - Oras sa Ting-init sa Omsk + Omsk Standard Time + Omsk Summer Time Oras sa Pakistan - Standard nga Oras sa Pakistan - Oras sa Ting-init sa Pakistan + Pakistan Standard Time + Pakistan Summer Time @@ -1693,22 +1714,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Paraguay - Standard nga Oras sa Paraguay - Oras sa Ting-init sa Paraguay + Paraguay Standard Time + Paraguay Summer Time Oras sa Peru - Standard nga Oras sa Peru - Oras sa Ting-init sa Peru + Peru Standard Time + Peru Summer Time Oras sa Pilipinas - Standard nga Oras sa Pilipinas - Oras sa Ting-init sa Pilipinas + Philippine Standard Time + Philippine Summer Time @@ -1719,8 +1740,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa St. Pierre & Miquelon - Standard nga Oras sa St. Pierre & Miquelon - Daylight nga Oras sa St. Pierre & Miquelon + St. Pierre & Miquelon Standard Time + St. Pierre & Miquelon Daylight Time @@ -1751,15 +1772,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Sakhalin - Standard nga Oras sa Sakhalin - Oras sa Ting-init sa Sakhalin + Sakhalin Standard Time + Sakhalin Summer Time Oras sa Samoa - Standard nga Oras sa Samoa - Daylight nga Oras sa Samoa + American Samoa Standard Time + American Samoa Daylight Time @@ -1769,7 +1790,7 @@ the LDML specification (http://unicode.org/reports/tr35/) - Standard nga Oras sa Singapore + Singapore Standard Time @@ -1799,9 +1820,9 @@ the LDML specification (http://unicode.org/reports/tr35/) - Oras sa Taipei - Standard nga Oras sa Taipei - Daylight nga Oras sa Taipei + Oras sa Taiwan + Taiwan Standard Time + Taiwan Daylight Time @@ -1817,8 +1838,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Tonga - Standard nga Oras sa Tonga - Oras sa Ting-init sa Tonga + Tonga Standard Time + Tonga Summer Time @@ -1829,8 +1850,8 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Turkmenistan - Standard nga Oras sa Turkmenistan - Oras sa Ting-init sa Turkmenistan + Turkmenistan Standard Time + Turkmenistan Summer Time @@ -1841,22 +1862,22 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Uruguay - Standard nga Oras sa Uruguay - Oras sa Ting-init sa Uruguay + Uruguay Standard Time + Uruguay Summer Time Oras sa Uzbekistan - Standard nga Oras sa Uzbekistan - Oras sa Ting-init sa Uzbekistan + Uzbekistan Standard Time + Uzbekistan Summer Time Oras sa Vanuatu - Standard nga Oras sa Vanuatu - Oras sa Ting-init sa Vanuatu + Vanuatu Standard Time + Vanuatu Summer Time @@ -1867,15 +1888,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Vladivostok - Standard nga Oras sa Vladivostok - Oras sa Ting-init sa Vladivostok + Vladivostok Standard Time + Vladivostok Summer Time Oras sa Volgograd - Standard nga Oras sa Volgograd - Oras sa Ting-init sa Volgograd + Volgograd Standard Time + Volgograd Summer Time @@ -1896,15 +1917,15 @@ the LDML specification (http://unicode.org/reports/tr35/) Oras sa Yakutsk - Standard nga Oras sa Yakutsk - Oras sa Ting-init sa Yakutsk + Yakutsk Standard Time + Yakutsk Summer Time Oras sa Yekaterinburg - Standard nga Oras sa Yekaterinburg - Oras sa Ting-init sa Yekaterinburg + Yekaterinburg Standard Time + Yekaterinburg Summer Time @@ -1915,11 +1936,50 @@ the LDML specification (http://unicode.org/reports/tr35/) + + + + 0 ka libo + 0 ka libo + 00 ka libo + 00 ka libo + 000 ka libo + 000 ka libo + 0 ka milyon + 0 ka milyon + 00 ka milyon + 00 ka milyon + 000 ka milyon + 000 ka milyon + 0 ka bilyon + 0 ka bilyon + 00 ka bilyon + 00 ka bilyon + 000 ka bilyon + 000 ka bilyon + 0 ka trilyon + 0 ka trilyon + 00 ka trilyon + 00 ka trilyon + 000 ka trilyon + 000 ka trilyon + + + + + 0B + 0B + 00B + 00B + 000B + 000B + + + ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -1927,6 +1987,58 @@ the LDML specification (http://unicode.org/reports/tr35/) #,##0.00;(#,##0.00) + + + ¤0K + ¤ 0K + ¤0K + ¤ 0K + ¤00K + ¤ 00K + ¤00K + ¤ 00K + ¤000K + ¤ 000K + ¤000K + ¤ 000K + ¤0M + ¤ 0M + ¤0M + ¤ 0M + ¤00M + ¤ 00M + ¤00M + ¤ 00M + ¤000M + ¤ 000M + ¤000M + ¤ 000M + ¤0B + ¤ 0B + ¤0B + ¤ 0B + ¤00B + ¤ 00B + ¤00B + ¤ 00B + ¤000B + ¤ 000B + ¤000B + ¤ 000B + ¤0T + ¤ 0T + ¤0T + ¤ 0T + ¤00T + ¤ 00T + ¤00T + ¤ 00T + ¤000T + ¤ 000T + ¤000T + ¤ 000T + + {0} {1} {1} {0} @@ -2094,7 +2206,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Costa Rican Colon Costa Rican colon - Costa Rican colóns + Costa Rican colons Cuban Convertible Peso @@ -2434,7 +2546,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Nicaraguan Cordoba Nicaraguan cordoba - Nicaraguan córdobas + Nicaraguan cordobas Norwegian Krone @@ -2579,7 +2691,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Sao Tome & Principe Dobra Sao Tome & Principe dobra - São Tomé & Príncipe dobras + Sao Tome & Principe dobras Syrian Pound @@ -2665,7 +2777,7 @@ the LDML specification (http://unicode.org/reports/tr35/) Venezuelan Bolivar Venezuelan bolivar - Venezuelan bolívars + Venezuelan bolivars Vietnamese Dong @@ -2692,6 +2804,11 @@ the LDML specification (http://unicode.org/reports/tr35/) East Caribbean dollar East Caribbean dollars + + Carribean guilder + Carribean guilder + Carribean guilder + West African CFA Franc West African CFA franc @@ -2722,6 +2839,11 @@ the LDML specification (http://unicode.org/reports/tr35/) Zambian kwacha Zambian kwachas + + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + {0}+ @@ -2928,7 +3050,7 @@ the LDML specification (http://unicode.org/reports/tr35/) {0} ka millimole kada litro {0} ka mga millimole kada litro - + mga part per million {0} ka part per million {0} ka mga part per million @@ -3736,7 +3858,7 @@ the LDML specification (http://unicode.org/reports/tr35/) millimol/litro - + mga part/million diff --git a/make/data/cldr/common/main/chr.xml b/make/data/cldr/common/main/chr.xml index 64fdcf84734..492f616e627 100644 --- a/make/data/cldr/common/main/chr.xml +++ b/make/data/cldr/common/main/chr.xml @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᎠᏎᏆᏣᏂ ᎠᏎᎵ ᏆᏍᎯᎩᎠ + ᏆᎷᏥ ᏆᎵᏁᏏ ᏆᏌᎠ ᏇᎳᎷᏏ @@ -224,6 +225,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏆᏫᎠ ᎪᎶᏂᎠᏂ ᎫᏗᏏ + ᎫᏗᏍᎯ + ᎫᎹᏥ ᎫᎻᎧ ᎪᎻ ᏎᎷᎭ @@ -619,6 +622,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏓᎶᏂᎨᏍᏛ ᎪᎸᎻᏈᎢᎠ ᎦᏂᏴᏔᏅᎣᏓᎸ ᎤᎦᏚᏛᎢ + ᏌᎬ ᎪᏍᏓ ᎵᎧ ᎫᏆ ᎢᎬᎾᏕᎾ ᎢᏤᏳᏍᏗ @@ -847,42 +851,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᎠᏕᎳ ᏱᎬᏁᎸᎯ ᏗᎦᏅᏃᏙᏗ ᏕᎦᏅᏃᏛᎢ ᎠᏕᎳ + ᎢᎼᏥ ᏓᎾᏓᏁᎲᎢ ᏑᏟᎶᏓ ᎠᏓᏁᏟᏴᏎᎬ (12 vs 24) ᎠᏍᏓᏅᏅ ᎠᏲᏍᏔᏅᎩ ᏂᏚᏍᏛ + ᎠᏍᏓᏅᏅ ᎠᏍᏆᎵᏍᏗ ᎪᏪᎵ ᎠᏟᎶᏛ ᏄᏍᏗᏓᏅᎢ ᏗᏎᏍᏗ + ᏗᏒᏍᏙᏗ ᎠᏍᏆᎵᏍᏗ ᎠᏂᏬ ᏊᏗᏍᏘ ᏅᏙ ᏗᏎᏍᏗ + ᏊᏗᏍᏘ ᏓᎶᏂᎨᏍᏛ ᏅᏙ ᏗᏎᏍᏗ + ᏓᎶᏂᎨᏍᏛ ᎧᏘ ᏅᏙ ᏗᏎᏍᏗ + ᎧᏘ ᏓᏂᎩ ᏅᏙ ᏗᏎᏍᏗ + ᏓᏂᎩ ᎢᏗᏯᏈᎩ ᏅᏙ ᏗᏎᏍᏗ + ᎡᏘᎣᏈᎠ ᎡᏘᎣᏈᎠ ᎠᎺᏖ ᎠᎴᎻ ᏅᏙ ᏗᏎᏍᏗ + ᎡᏘᎣᏈᎠ ᎠᎺᏖ ᎠᎴᎻ ᎩᎴᎪᎵᎠᏂ ᏅᏙ ᏗᏎᏍᏗ + ᎩᎴᎪᎵᎠᏂ ᎠᏂᏈᎷ ᏅᏙ ᏗᏎᏍᏗ + ᎠᏂᏈᎷ ᎢᏍᎳᎻᎩ ᏅᏙ ᏗᏎᏍᏗ + ᎢᏌᎳᎻᎩ ᎢᏌᎳᎻᎩ ᏅᏙ ᏗᏎᏍᏗ (ᏴᏫ ᎡᏆᎩ) + ᎢᏌᎳᎻᎩ (ᏴᏫ ᎡᏆᎩ) ᎢᏌᎳᎻᎩ ᏅᏙ ᏗᏎᏍᏗ (ᎥᎻ ᎠᎵ-ᏊᎳ) + ᎢᏌᎳᎻᎩ (ᎥᎻ ᎠᎵ-ᏊᎳ) ISO-8601 ᏅᏙ ᏗᏎᏍᏗ ᏣᏆᏂᏏ ᏅᏙ ᏗᏎᏍᏗ + ᏣᏆᏂᏏ ᏇᏏᎠᏂ ᏅᏙ ᏗᏎᏍᏗ + ᏇᏏᎠᏂ ᏍᎦᏚᎩ ᎾᎿ ᏓᎶᏂᎨᏍᏛ ᏅᏙ ᏗᏎᏍᏗ + ᏍᎦᏚᎩ ᎾᎿ ᏓᎶᏂᎨᏍᏛ ᎠᏕᎳ ᏗᏎᎯᎯ ᎠᏕᎳ ᏱᎬᏁᎸᎯ + ᎠᏕᎳ ᏗᏎᎯᎯ ᎠᏟᎶᏍᏗ ᎠᏕᎳ ᏱᎬᏁᎸᎯ + ᎠᏟᎶᏍᏗ ᎠᏓᏁᏟᏴᏗᏍᎩ Unicode ᏗᎦᏅᏃᏙᏗ ᏕᎦᏅᏃᏛᎢ + ᎠᏓᏁᏟᏴᏗᏍᎩ Unicode ᏂᎦᎥ-ᎢᏳᏱᎸᏗ ᎠᏱᏍᏗ + ᎠᏱᏍᏗ ᎠᏟᎶᏍᏗ ᏗᎦᏅᏃᏙᏗ ᏕᎦᏅᏃᏛᎢ + ᎠᏟᎶᏍᏗ + ᎠᏓᏁᏟᏴᏗᏍᎩ + ᎢᎼᏥ + ᏕᎪᏪᎸ 12 ᎢᏳᏟᎶᏓ ᏄᏍᏗᏓᏅᎢ (0–11) + 12 (0–11) 12 ᎢᏳᏟᎶᏓ ᏄᏍᏗᏓᏅᎢ (1–12) + 12 (1–12) 24 ᎢᏳᏟᎶᏓ ᏄᏍᏗᏓᏅᎢ (0–23) + 24 (0–23) 24 ᎢᏳᏟᎶᏓ ᏄᏍᏗᏓᏅᎢ (1–24) + 24 (1–24) ᏩᎾᎢ ᎠᏍᏓᏅᏅ ᎠᏲᏍᏔᏅᎩ ᏂᏚᏍᏛ + ᏩᎾᎢ ᎠᏍᏓᏅᏅ ᏱᎬᏍᏗᎭᏊ ᎠᏍᏓᏅᏅ ᎠᏲᏍᏔᏅᎩ ᏂᏚᏍᏛ + ᏱᎬᏍᏗᎭᏊ ᎤᎶᏒᏍᏔᏅᎯ ᎠᏍᏓᏅᏅ ᎠᏲᏍᏔᏅᎩ ᏂᏚᏍᏛ + ᎤᎶᏒᏍᏔᏅᎯ + ᎠᏍᏆᎵᏍᏗ ᏂᎦᏓ + ᎠᏍᏆᏂᎪᏙᏗ ᏂᎦᏓ + ᏱᎬᏍᏗᎭᏊ + ᎠᏍᏆᏂᎪᏙᏗ ᎾᎿ ᎪᏪᎵ ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᏄᏍᏗᏓᏅᎢ + ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᏂᎬᎾᏛᎢ ᎤᏓᏤᎵᎦᏯ ᎠᏟᎶᏛ ᏄᏍᏗᏓᏅᎢ + UK US ᎠᏟᎶᏛ ᏄᏍᏗᏓᏅᎢ + US ᎠᎳᏈ-ᎡᏂᏗᎩ ᏗᏎᏍᏗ ᎦᏅᎯᏛ ᎠᎳᏈ-ᎡᏂᏗᎩ ᏗᏎᏍᏗ ᎠᎳᎻᎠᏂ ᏗᏎᏍᏗ @@ -923,6 +966,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏔᏱ ᏗᏎᏍᏗ ᏘᏇᏔᏂ ᏗᏎᏍᏗ ᏩᏱ ᏗᏎᏍᏗ + ᎤᏣᏘᎾ + ᎾᎿ ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ @@ -940,9 +985,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1007,7 +1049,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic d E y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -1343,6 +1387,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} ᎤᎾᎢ {0} + + {1} ᎤᎾᎢ {0} + @@ -1351,6 +1398,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} ᎤᎾᎢ {0} + + {1} ᎤᎾᎢ {0} + @@ -1365,7 +1415,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic d E y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -2038,11 +2090,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᎪᎯ ᎢᎦ ᎠᏟᎢᎵᏒ {0} ᎠᏟᎶᏍᏗ ᎠᏟᎢᎵᏒ - - HST - HST - HDT - ᎭᏃᎷᎷ @@ -2395,6 +2442,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏥᏌᏕᎴᎯᏌᏅ + + ᎪᎭᎢᏇ + ᏊᏔ ᎡᏫᎾᏍ @@ -2660,9 +2710,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᎿᎻ ᏇᏂ - ᎡᏂᏇᎵ - - ᎧᏛᏂ @@ -3332,9 +3379,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ᏭᏕᎵᎬ ᎬᎿᎨᏍᏛ ᎠᏟᎢᎵᏒ - ᏭᏕᎵᎬ ᎬᎿᎨᏍᏛ ᎠᏟᎶᏍᏗ ᎠᏟᎢᎵᏒ - ᏭᏕᎵᎬ ᎬᎿᎨᏍᏛ ᎪᎩ ᎠᏟᎢᎵᏒ + ᏭᏕᎵᎬ ᎬᎿᎨᏍᏛ ᎠᏟᎢᎵᏒ @@ -3714,6 +3759,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᎦᏯᎾ ᎠᏟᎢᎵᏒ + + + ᎭᏩᏱ-ᎠᎵᏳᏏᎠᏂ ᎠᏟᎶᏍᏗ ᎠᏟᎢᎵᏒ + + + HAST + + ᎭᏩᏱ-ᎠᎵᏳᏏᎠᏂ ᎠᏟᎢᎵᏒ @@ -4264,7 +4317,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4803,6 +4855,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏗᎧᎸᎬ ᎨᏆᏙᏯ ᎠᏕᎳ + + ᎧᏈᏇᎠᎾ + ᎧᏈᏇᎠᎾ ᎠᏕᎳ + ᎧᏈᏇᎠᎾ ᎠᏕᎳ + ᏭᏕᎵᎬ ᎬᎿᎨᏍᏛ CFA ᎠᏕᎳ @@ -4823,6 +4880,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᏏᎻᏆᏇ ᎠᏕᎳ + + ᏏᎻᏆᏇᎠᏂ + ᏏᎻᏆᏇᎠᏂ ᎠᏕᎳ + ᏏᎻᏆᏇᎠᏂ ᎠᏕᎳ + {0}+ @@ -5042,7 +5104,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᏌᏉ ᎢᏯᎦᎨᎵᏁᎢ ᎼᎵ ᎵᏔᎢ ᎢᏳᏓᎵ {0} ᏌᏉ ᎢᏯᎦᎨᎵᏁᎢ ᎠᏂᎼᎵ ᎵᏔᎢ ᎢᏳᏓᎵ - + + ᎢᎦᏛ + {0} ᎢᎦᏛ + {0} ᎢᎦᏛᎭ + + ᏚᏙᏢᏒ ᎢᏳᏆᏗᏅᏛ ᎢᏳᏓᎵ {0} ᎤᏙᏢᏒ ᎢᏳᏆᏗᏅᏛ ᎢᏳᏓᎵ {0} ᏚᏙᏢᏒ ᎢᏳᏆᏗᏅᏛ ᎢᏳᏓᎵ @@ -5064,6 +5131,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᎼᎴ {0} ᎼᎴᏍ + + ᎾᎿ ᎦᎷᎪᏏ + {0} ᎾᎿ ᎦᎷᎪᏏ + {0} ᎾᎿ ᎦᎷᎪᏏ + ᏗᎵᏔᎢ ᎠᎦᏴᎵ ᎠᏟᎶᏍᏗ ᎢᏳᏓᎵ {0} ᎵᏔᎢ ᎠᎦᏴᎵ ᎠᏟᎶᏍᏗ ᎢᏳᏓᎵ @@ -5547,6 +5619,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᏌᏉ ᎢᏯᎦᎨᎵᏁᎢ ᎠᏟᎶᏗ ᎾᎿ ᎹᎫᎢ {0} ᏌᏉ ᎢᏯᎦᎨᎵᏁᎢ ᏗᏟᎶᏗ ᎾᎿ ᎹᎫᎢ + + ᎾᎿ ᎹᎫᎢ + {0} ᎾᎿ ᎹᎫᎢ + {0} ᎾᎿ ᎹᎫᎢ + ᎢᏧᏓᎨᏓ ᏅᎩ ᏧᏅᏏᎩ ᎢᏏᏔᏗᏍᏗ ᎢᏳᏓᎵ {0} ᏑᏓᎨᏓ ᏅᎩ ᏧᏅᏏᎩ ᎢᏏᏔᏗᏍᏗ ᎢᏳᏓᎵ @@ -5719,6 +5796,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᎤᎵᏍᏈᏗ {0} ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᏧᎵᏍᏈᏗ + + ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᎤᏓᏁᎯ ᎢᏯᎣᏂᏏ + ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᎤᏓᏁᎯ ᎣᏂᏏ + {0} ᎠᏂᎩᎸᏥ ᏂᏓᏳᏓᎴᏅᎯ ᏗᏎᏍᏗ ᎤᏓᏁᎯ ᎢᏯᎣᏂᏏ + {0} ᏑᏟᎶᏛ-ᎢᎳᏏᏗ {0} ᏑᏟᎶᏛ-ᎢᏗᎳᏏᏗ @@ -5796,22 +5878,76 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᏂᎬᎾᏛᎢ ᎤᏓᏤᎵᎦᏯ ᏅᎩ ᎢᏗᎧᎵᎢ {0} ᏂᎬᎾᏛᎢ ᎤᏓᏤᎵᎦᏯ ᏅᎩ ᎢᏗᎧᎵᎢ - - ᎠᏨᏍᏗ - {0} ᎠᏨᏍᏗ - {0} ᎠᏨᏍᏗ + + ᏍᏘᏇᏗᎠᏂᏍ + {0} ᏍᏘᏇᏗᎠᏂ + {0} ᏍᏘᏇᏗᎠᏂᏍ - + + ᎧᏔᎵᏍ + {0} ᎧᏔᎵ + {0} ᎧᏔᎵᏍ + + + ᎠᏂᎪᎶᎻᏍ + {0} ᎪᎶᎻᏍ + {0} ᎠᏂᎪᎶᎻᏍ + + + ᏆᏇᏗᏍ + {0} ᏆᏇᏗ + {0} ᏆᏇᏗᏍ + + + ᎯᏂᏫᏍ + {0} ᎯᏂᏫ + {0} ᎯᏂᏫᏍ + + + ᏏᎺᏂᏍ + {0} ᏏᎺᏂᏍ + {0} ᏏᎺᏂᏍ + + + ᏗᏓᎵᏥᏍᏗᏍᎩ [IT] + {0} ᎠᏓᎵᏥᏍᏗᏍᎩ [IT] + {0} ᏗᏓᎵᏥᏍᏗᏍᎩ [IT] + + + ᏘᎯ ᎠᎩᎪᏍᎦ + {0} ᏘᎯ ᎠᎩᎪᏍᎦ + {0} ᏘᎯ ᏗᎩᎪᏍᎦ + + + ᏗᏏᏇᏘ + {0} ᏏᏇᏘ + {0} ᏗᏏᏇᏘ + + + ᎤᏍᎪᎸ ᎠᏂᏌᎪᏂᎨ + {0} ᎤᏍᎪᎸ ᏌᎪᏂᎨ + {0} ᎤᏍᎪᎸ ᎠᏂᏌᎪᏂᎨ + + + ᎠᎦᏴᎵ ᎤᏍᏗ ᏂᏚᏓᎨᏒ-ᎦᏌᏙᏯᏍᏗ + {0} ᎠᏍᏴᎵ ᎤᏍᏗ ᏗᏚᏓᎨᏒ-ᎦᏌᏙᏯᏍᏗ + {0} ᎠᏍᏴᎵ ᎤᏍᏗ ᏂᏚᏓᎨᏒ-ᎦᏌᏙᏯᏍᏗ + + + ᏖᏍᎳᏍ + {0} ᏖᏍᎳ + {0} ᏖᏍᎳᏍ + + + ᏪᏆᏍ + {0} ᏪᏆ + {0} ᏪᏆᏍ + + ᏚᏙᏢᏒ ᎢᏳᏓᎵ ᎢᏳᏔᎵᎳᏗᏅᏛ {0} ᎤᏙᏢᏒ ᎢᏳᏓᎵ ᎢᏳᏔᎵᎳᏗᏅᏛ {0} ᏚᏙᏢᏒ ᎢᏳᏓᎵ ᎢᏳᏔᎵᎳᏗᏅᏛ - - ᏚᎵᏏᏂᏒ - {0} ᎤᏒ - {0} ᏚᎵᏏᏂᏒ - {0}/ᎤᏒ - ᏅᎩ ᏫᏂᏚᏳᎪᏛᎢ {0} ᏗᎧᎸᎬ @@ -5893,7 +6029,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᏑᏓᎴᎩ {0} ᎢᏳᏓᎴᎩ - + + ᎢᎦᏛ + {0} ᎢᎦᏛ + {0} ᎢᎦᏛ + + ᏚᏙᏢᏒ/ᎢᏳᏆᏗᏅᏛ @@ -6278,12 +6419,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ᏗᏓᏇᏄᎩᏍᏗ {0} ᏗᏓᏇᏄᎩᏍᏗ + + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + ᎠᏨᏍᏗ {0} ᎠᏨᏍᏗ {0} ᎠᏨᏍᏗ - + ᏚᏙᏢᏒ/ᎢᏳᏔᎵᎳᏗᏅᏛ @@ -6394,7 +6544,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmol/L {0}mmol/L - + + ᎢᎦᏛ + {0} ᎢᎦᏛ + {0} ᎢᎦᏛ + + ppm {0}ppm {0}ppm @@ -7108,20 +7263,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}qt-Imp. {0}qt-Imp. + + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + - ᎠᏨᏍᏗ {0}ᎠᏨᏍᏗ {0}ᎠᏨᏍᏗ - + + ppb {0}ppb {0}ppb - ᏚᎵᏏᏂᏒ {0}ᎤᏒ {0}ᏚᎵᏏᏂᏒ - {0}/ᎤᏒ {0}Ꮧ diff --git a/make/data/cldr/common/main/ckb.xml b/make/data/cldr/common/main/ckb.xml index a52891df344..a39ca3d5054 100644 --- a/make/data/cldr/common/main/ckb.xml +++ b/make/data/cldr/common/main/ckb.xml @@ -71,6 +71,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic چێرۆکی شایان کوردیی ناوەندی + کوردیی، سۆرانی کۆرسیکی فەرەنسیی سیشێلی چێکی @@ -193,9 +194,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic بافیا کۆلۆنی کوردی + کوردی + کرمانجی کوومیک کۆمی کۆڕنی + کوڤی كرگیزی لاتینی لادینۆ @@ -387,6 +391,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic وۆلۆف کالمیک سسوسا + کانگری سۆگا یانگبێن یێمبا @@ -395,6 +400,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic کانتۆنی ئەمازیغیی مەغریب چینی + جینی، مەنداری چینی (چینیی ئاسانکراو) چینی (چینیی دێرین) زوولوو @@ -535,6 +541,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic چین کۆلۆمبیا دوورگەی کلیپێرتۆن + سارک کۆستاریکا کووبا کەیپڤەرد @@ -597,6 +604,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic دوورگەی مان ھیندستان ھەرێمی بەریتانی لە ئۆقیانووسی ھیند + ھەرێمی بەریتانی لە ئۆقیانووسی ھیندی عێراق ئێران ئایسلەند @@ -662,6 +670,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic نائوروو نیووئی نیوزیلاند + نیوزلەندا عومان پاناما پێروو @@ -715,6 +724,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic تاجیکستان تۆکێلاو تیمۆری ڕۆژھەڵات + تەیموری ڕۆژهەڵات تورکمانستان توونس تۆنگا @@ -761,12 +771,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ڕۆژژمێری چینی ڕۆژژمێری زاینیی + زاینی ڕۆژژمێری عیبری ڕۆژژمێری نەتەوەیی ھیندی - ڕۆژژمێری کۆچیی مانگی + ڕۆژژمێری کۆچیی + هیجری ISO-8601 ڕۆژژمێری ڕۆژژمێری کۆچیی ھەتاوی + فارسی ڕیزکردنی داواکری ستاندارد + ستاندارد ژمارە عەربی-ھیندییەکان ژمارە گوجەراتییەکان ژمارە خمێرییەکان @@ -818,7 +832,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd @@ -1124,6 +1138,47 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + موحەرەم + سەفەر + رەبیعی یەکەم + ڕەبیعی دووەم + جەمادی یەکەم + جەمادی دووەم + ڕەجەب + شەعبان + ڕەمەزان + شەوال + زولقەعدە + زولحجە + + + + + موحەرەم + سەفەر + رەبیعی یەکەم + ڕەبیعی دووەم + جەمادی یەکەم + جەمادی دووەم + ڕەجەب + شەعبان + ڕەمەزان + شەوال + زولقەعدە + زولحجە + + + + + + کۆچیی + + + @@ -1172,7 +1227,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic هەفتەی {0} - ڕۆژ دوێنێ ئەمڕۆ سبەی @@ -1202,6 +1256,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic بەکاتی {0} کاتی {0} هاوینە کاتی {0} فەرمی + + شوێنی نەناسراو + @@ -1229,24 +1286,75 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} {1} + + درهەمی ئیماڕاتی + ئەفغانیی ئەفغانستان + + درامی ئەرمینیایی + + + پێسۆی ئەرجەنتینی + + + دۆلاری ئوسترالی + + + مەنەتی ئازەربایجانی + + + تەکەی بەنگالی + دیناری بەحرەینی + + دۆلاری بروونایی + دۆلاری بەلیزی دۆلاری کەنەدی + + فرانکی سویسری + + + یەننی چینی + + + کرۆنی دانیمارکی + دیناری جەزائیری + + جونەی میسڕی + یورۆ + + دۆلاری فیجیی + + + پاوەنی بەریتانی + + + لاری جۆرجیی + + + ڕوپیەی ئیندۆنیزی + + + شەخەلی ئیسرائیلی + + + ڕوپیەی هیندی + دیناری عێراقی د.ع.‏ @@ -1257,18 +1365,90 @@ CLDR data files are interpreted according to the LDML specification (http://unic دیناری ئوردنی + + یەنی یابانی + + + سۆمی قیڕغستانی + + + ڕیالی کەمبۆدی + دیناری کووەیتی + + تەنگەی کازاخستانی + + + لیرەی کوبنانی + + + ڕوپیەی سریلانکی + + + دیناری لیبی + + + درهەمی مەغریبی + + + توگریکی مەنگۆلی + + + ڕوفیەی ماڵدیڤی + + + ڕینگەی مالیزی + + + کرۆنی نەرویجی + + + ڕوپیەی نیپاڵی + + + دۆلاری نیوزیکلەندی + ڕیاڵی عومانی + + کینای پاپوا گینیایی نوێ + + + پێسۆی فلیپینی + + + ڕوپیەی پاکستانی + ڕیاڵی قەتەری + + ڕوبڵی ڕووسی + ڕیاڵی سەعوودی + + دۆلاری دورگەی سۆلۆمۆن + + + جونەی سودانی + + + کرۆنی سویدی + + + دۆلاری سینگاپووری + + + سۆمۆنی تاجیکستانی + + + مەنەتی تورکمانستانی + دیناری توونس @@ -1278,9 +1458,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic دۆلاری ترینیداد و تۆباگۆ + + دۆلاری تایوانی نوێ + + + سۆمی ئۆزبەکستانی + + + دۆنگی ڤێتنامی + + + تەلەی ساموایی + زێڕ + + پارەی نەناسراو + + + ڕیالی یەمەنی + diff --git a/make/data/cldr/common/main/co.xml b/make/data/cldr/common/main/co.xml index b102b74c2bd..2110dece8a3 100644 --- a/make/data/cldr/common/main/co.xml +++ b/make/data/cldr/common/main/co.xml @@ -27,13 +27,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic inglese inglese australianu inglese canadianu - inglese americanu inglese (S.U.) spagnolu + estone finlandese francese francese canadianu francese sguizzeru + hindì (latinu) ungarese indunesianu talianu @@ -63,6 +64,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + @@ -73,67 +76,178 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mondu Africa Oceania + America Centrale Americhe + Australasia + Melanesia + Regione Micronesiana + Pulinesia Asia Europa America latina + Isula Ascension + Andorra + Emirati Arabi Uniti + Antigua è Barbuda + Anguilla + Albania + Armenia + Angola Antarticu + Argentina + Samoa Americana Austria Australia + Aruba + Bosnia è Herzegovina + Barbados Belgica + Bulgaria + Burundi + San Bartulumeu + Bermuda + Bolivia + Brasile + Belize Canada + Isule Cocos (Keeling) + Congo - Kinshasa + Congo (DRC) + Republica d’Africa Centrale + Congo - Brazzaville + Republica di u Congo Svizzera + Isule Cook + Cile China + Isula Clipperton Costa Rica Cuba - Republica cecca + Isula Christmas + Cecchia Alemagna + Diego Garcia Danimarca + Dominica Republica Duminicana + Algeria + Estonia + Egittu Spagna Unione europea + Eurozona Finlandia + Isule Falkland + Micronesia + Isule Faroe Francia Reame Unitu R.U. + Grenada + Georgia + Guiana francese + Gambia + Guadalupe Grecia Guatemala + Guiana + Isule Heard è McDonald + Croazia Ungheria Irlanda Israele + Isula di Man India Iran Islanda Italia + Jamaica Giappone + Comore + St. Kitts è Nevis Libanu Santa Lucia + Liberia + Lituania + Lettonia + LIbia + Monaco + Montenegro San Martinu + Isule Marshall + Mali Mungulia + Macao SAR China + Macao Martinica + Mauritania + Malta Messicu Malesia + Namibia + Nova Caledunia + Isula Norfolk + Nigeria Nicaragua Nederlanda Nurvegia + Nauru + Niue Nova Zelanda + Nova Zelanda Aotearoa Panama Perù + Pulinesia Francese + Papuasia Nova Guinea Filippine + St. Pierre è Miquelon + Isule Pitcairn + Puerto Rico Palestina Portugallu + Palau + Rumania Serbia Russia + Isule Solomon + Svezia + Slovenia Sluvacchia + Sierra Leone + San Marino + Somalia + Suriname + El Salvadore Siria + Tristan da Cunha + Isule Turks è Caicos + Togo + Tunisia + Tonga Turchia + Trinidad è Tobago + Tuvalu + Tanzania + Ucrania + Uganda + Isule U.S. Outlying Nazioni Unite Stati Uniti S.U. + Cità di u Vaticanu + Venezuela + Isule Vergine Britaniche + Isule Vergine Americane + Vanuatu + Wallis è Futuna + Samoa + Kosovo + Zambia regione scunnisciuta calendariu gregurianu + gregorianu calendariu ISO 8601 ordine di classificazione standardizatu cifri occidentale @@ -153,8 +267,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic [aà b c {chj} d eè f g {ghj} h iìï j l m n oò p q r s {sc} {sg} t uùü v z] [â æ ç éêë î k ñ ô œ úû w x yÿ] [A B C {CHJ} D E F G {GHJ} H I J L M N O P Q R S {SC} {SG} T U V Z] - [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] - {0}… + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” « » ( ) \[ \] § @ * / \& # † ‡ ′ ″] + ? « @@ -168,12 +282,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEEE d MMMM 'di' 'u' y G + EEEE d LLLL 'di' 'u' y G - d MMMM 'di' 'u' y G + d LLLL 'di' 'u' y G @@ -200,7 +314,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1} 'à' {0} @@ -208,6 +322,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + E d + E h 'ore' + y G + MM-y G + dd-MM-y G + E dd-MM-y G + d MMM y G + E d MMM y G + dd-MM + E dd/MM + d MMM + E d MMM + d MMMM + MM/y G + dd/MM/y G + E dd/MM/y G + MMM y G + MMM d, y G + E d MMM y G + MMMM y G + QQQ y G + QQQQ y G + @@ -392,12 +530,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1}, {0} + {1} 'à' {0} + + + {1} 'à' {0} + + + {1} 'à' {0} - {1}, {0} + {1} 'à' {0} + + + {1} 'à' {0} + + + {1} 'à' {0} @@ -407,7 +557,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1} 'à' {0} + + + {1} 'à' {0} + + + {1} 'à' {0} @@ -416,39 +572,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM/y G dd/MM/y G - MMM y G - d MMM y G - E d MMM y G - h a + E dd/MM/y G + MMM 'di' 'u' y G + d MMM 'di' 'u' y G + E d MMM 'di' 'u' y G + HH'o' h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH'o' v dd/MM E dd/MM - d MMM + d 'di' MMM E d MMM d MMMM 'settimana' W MMMM MM/y dd/MM/y E dd/MM/y - MMM y - d MMM y - E d MMM y + MMM 'di' 'u' y + d 'di' MMM 'di' 'u' y + E d 'di' MMM 'di' 'u' y LLLL 'di' 'u' y QQQ y QQQQ 'di' 'u' y 'settimana' w 'di' 'u' Y + + y G – y G + y – y G + + + M/y G – M/y G + M/y – M/y G + M/y – M/y G + + + dd/MM/y – dd/MM/y G + dd/MM/y G – dd/MM/y G + dd/MM/y – dd/MM/y G + dd/MM/y – dd/MM/y G + + + E dd/MM/y – E dd/MM/y G + E dd/MM/y G – E dd/MM/y G + E dd/MM/y – E dd/MM/y G + E dd/MM/y – E dd/MM/y G + + + MMM 'di' 'u' y G – MMM 'di' 'u' y G + MMM – MMM 'di' 'u' y G + MMM 'di' 'u' y – MMM 'di' 'u' y G + + + d – d MMM 'di' 'u' y G + d MMM 'di' 'u' y G – d MMM 'di' 'u' y G + d MMM – d MMM 'di' 'u' y G + d MMM 'di' 'u' y – d MMM 'di' 'u' y G + + + E d MMM – E d MMM 'di' 'u' y G + E d MMM 'di' 'u' y G – E d MMM 'di' 'u' y G + E d MMM – E d MMM 'di' 'u' y G + E d MMM 'di' 'u' y – E d MMM 'di' 'u' y G + h a – h a h – h a - HH – HH + HH – HH 'o' h:mm a – h:mm a @@ -480,22 +677,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic dd/MM – dd/MM - E dd/MM – dd/MM - E dd/MM – dd/MM + E dd/MM – E dd/MM + E dd/MM – E dd/MM - MMM – MMM + LLL – LLL + + + d–d 'di' LLL + d 'di' LLL – d 'di' LLL + + + E d 'di' MMM – E d 'di' MMM + E d 'di' MMM – E d 'di' MMM + + + MM/y – MM/y + MM/y – MM/y + + + dd/MM/y – dd/MM/y + dd/MM/y – dd/MM/y + dd/MM/y – dd/MM/y + + + E dd/MM/y – E dd/MM/y + E dd/MM/y – E dd/MM/y + E dd/MM/y – E dd/MM/y - MMM–MMM y + MMM – MMM 'di' 'u' y + MMM 'di' 'u' y – MMM 'di' 'u' y - d – d MMM y - d MMM y – d MMM y + d – d MMM 'di' 'u' y + d MMM – d MMM 'di' 'u' y + d MMM – d MMM 'di' 'u' y + + + E d 'di' LLL – E d 'di' LLL 'di' 'u' y + E d 'di' LLL – E d 'di' LLL 'di' 'u' y + E d 'di' LLL 'di' 'u' y – E d 'di' LLL 'di' 'u' y - LLLL–LLLL y - LLLL y – LLLL y + LLLL–LLLL 'di' 'u' y + LLLL 'di' 'u' y – LLLL 'di' 'u' y @@ -544,9 +770,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic sett. + settim. scorsa + sta settim. + settim. chì vene st. + settim. scorsa + sta settim. + settim. chì vene ghjornu @@ -613,7 +845,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ,   - @@ -622,13 +853,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00) ¤ + + + #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00) ¤ + #,##0.00 ¤;(#,##0.00) ¤ #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/cop.xml b/make/data/cldr/common/main/cop.xml index fe7f39e1517..1cfec40e8cc 100644 --- a/make/data/cldr/common/main/cop.xml +++ b/make/data/cldr/common/main/cop.xml @@ -10,9 +10,4199 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + ϯⲙⲉⲧⲁϥⲣⲓⲕⲁⲛⲍ + ϯⲙⲉⲧⲁⲕⲁⲛ + ϯⲙⲉⲧⲁⲙϩⲁⲣⲓ + ϯⲙⲉⲧⲁⲣⲁⲃⲟⲥ + ϯⲙⲉⲧⲁⲣⲁⲃⲟⲥ + ϯⲙⲉⲧⲁⲥⲥⲁⲙⲉⲥ + ϯⲙⲉⲧⲁⲥⲧⲟⲩⲣⲓ + ϯⲙⲉⲧⲁⲍⲉⲣⲃⲁϫⲁⲛⲓ + ϯⲙⲉⲧⲁⲍⲉⲣⲓ + ϯⲙⲉⲧⲃⲁⲗⲟⲩϣⲓ + ϯⲙⲉⲧⲃⲉⲗⲁⲣⲟⲩⲥⲓ + ϯⲙⲉⲧⲃⲟⲩⲗⲅⲁⲣⲓ + ϯⲙⲉⲧϩⲁⲣⲓⲁⲛⲃⲓ + ϯⲙⲉⲧⲃⲟϫⲡⲟⲩⲣⲓ + ϯⲙⲉⲧⲁⲛⲓⲓ + ϯⲙⲉⲧⲃⲁⲛⲅⲗⲓ + ϯⲙⲉⲧⲃⲣⲉⲧⲟⲛ + ϯⲙⲉⲧⲃⲟⲇⲟ + ϯⲙⲉⲧⲃⲟⲥⲛⲓ + ϯⲙⲉⲧⲕⲁⲧⲁⲗⲁⲛ + ϯⲙⲉⲧⲥⲉⲃⲟⲩⲁⲛ + ϯⲙⲉⲧϭⲉⲣⲟⲩⲕⲓ + ϯⲙⲉⲧⲣⲉⲙⲛ̀ⲭⲏⲙⲓ + ϯⲙⲉⲧϭⲉⲕⲓ + ϯⲙⲉⲧⲥⲟⲩⲁⲙⲡⲓ ⲕⲣⲓ + ϯⲙⲉⲧϭⲟⲩⲃⲁϣ + ϯⲙⲉⲧⲟⲩⲉⲗϣⲓ + ϯⲙⲉⲧⲇⲁⲛⲙⲁⲣⲕ + ϯⲙⲉⲧϫⲉⲣⲙⲁⲛⲓⲟⲥ + ϯⲙⲉⲧⲁⲗⲙⲁⲛⲓ ⲛ̀ⲁⲩⲥⲑⲣⲓⲁ + ϯⲙⲉⲧⲁⲗⲙⲁⲛⲓ ⲛ̀ⲥⲟⲩⲓⲥⲣⲁ ⲉⲧϭⲟⲥⲓ + ϯⲙⲉⲧⲇⲟⲣⲓ + ϯⲙⲉⲧⲥⲏⲧⲥⲟⲣⲃⲓ + ϯⲙⲉⲧⲉⲩⲉ + ⲙⲉⲧⲟⲩⲉⲓⲛⲓⲛ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ ⲛ̀ⲁⲩⲥⲑⲧⲣⲁⲗⲓⲁ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ ⲛ̀ⲕⲁⲛⲁⲇⲁ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ ⲙ̀ⲃⲣⲓⲑⲁⲛⲓⲁ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ ⲛ̀ϯⲙⲉⲧⲟⲩⲣⲟ ⲉⲧϩⲱⲧⲡ + ϯⲙⲉⲧⲁⲅⲅⲗⲉⲕⲟⲥ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁ + ϯⲙⲉⲧⲉⲥⲡⲉⲣⲁⲛⲑⲟ + ϯⲙⲉⲧⲉⲥⲡⲁⲛⲓ + ϯⲙⲉⲧⲉⲥⲡⲁⲛⲓ ⲁⲙⲣⲓⲕⲁ ⲗⲁⲑⲓⲛⲓ + ϯⲙⲉⲧⲉⲥⲡⲁⲛⲓ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ϯⲙⲉⲧⲉⲥⲡⲁⲛⲓ ⲙ̀ⲙⲉⲝⲓⲕⲟ + ϯⲙⲉⲧⲉⲥⲑⲟⲛⲓⲁ + ϯⲙⲉⲧⲃⲁⲥⲕ + ϯⲙⲉⲧⲡⲉⲣⲥⲓⲥ + ϯⲙⲉⲧϥⲟⲩⲗⲁ + ϯⲙⲉⲧϥⲓⲛⲗⲁⲛⲇ + ϯⲙⲉⲧⲫⲓⲗⲓⲡⲓⲛ + ϯⲙⲉⲧϥⲁⲣⲟⲥⲉ + ϯⲙⲉⲧϥⲉⲣⲉⲛⲥⲉⲟⲥ + ϯⲙⲉⲧϥⲉⲣⲉⲛⲥⲉⲟⲥ ⲛ̀ⲕⲁⲛⲁⲇⲁ + ϯⲙⲉⲧϥⲉⲣⲉⲛⲥⲉⲟⲥ ⲛ̀ⲥⲟⲩⲓⲥⲣⲁ + ϯⲙⲉⲧϥⲣⲓⲍⲓ ⲛ̀ⲉⲙⲉⲛⲧ + ϯⲙⲉⲧⲁⲓⲉⲣⲗⲁⲛⲇⲓ + ϯⲙⲉⲧϫⲁ + ϯⲙⲉⲧⲥⲕⲟⲧⲗⲁⲛⲇ ⲅⲁⲗⲓⲕⲓ + ϯⲙⲉⲧⲅⲁⲗⲉⲕⲟⲥ + ϯⲙⲉⲧⲅⲟⲩϫⲁⲣⲁⲑⲓ + ϯⲙⲉⲧϩⲁⲩⲍⲁ + ϯⲙⲉⲧϩⲉⲃⲣⲉⲟⲥ + ϯⲙⲉⲧϩⲉⲛⲧⲟⲩ + ϯⲙⲉⲧϩⲉⲛⲧⲟⲩ ⲛ̀ⲗⲁⲧⲓⲛⲓ + ϯⲙⲉⲧϩⲓⲛⲅⲗⲓϣ + ϯⲙⲉⲧⲕⲣⲟⲩⲁⲑⲓ + ϯⲙⲉⲧⲥⲟⲣⲃⲓ ⲛ̀ϣⲱⲓ + ϯⲙⲉⲧϩⲁⲛⲅⲁⲣⲓ + ϯⲙⲉⲧⲁⲣⲙⲉⲛⲓⲟⲥ + ϯⲙⲉⲧⲓⲛⲑⲉⲣⲗⲓⲛⲅⲟⲩⲓ + ϯⲙⲉⲧⲓⲛⲇⲟⲛⲓⲥⲓ + ϯⲙⲉⲧⲓⲛⲑⲉⲣⲗⲓⲛⲅⲟⲩⲓ + ϯⲙⲉⲧⲓⲅⲃⲟ + ϯⲙⲉⲧⲥⲓϣⲟⲩⲁⲛ + ϯⲙⲉⲧⲁⲓⲥⲗⲁⲛⲇ + ϯⲙⲉⲧϩⲓⲧⲁⲗⲓⲕⲟⲥ + ϯⲙⲉⲧⲓⲁⲡⲁⲛⲓ + ϯⲙⲉⲧϫⲁⲃⲁⲛⲓ + ϯⲙⲉⲧⲅⲉⲟⲣⲅⲓⲟⲥ + ϯⲙⲉⲧⲕⲁⲃⲟⲩⲃⲉⲣⲇⲓⲁⲛⲟⲩ + ϯⲙⲉⲧⲕⲁⲓⲛⲅⲁⲛⲅⲓ + ϯⲙⲉⲧⲕⲁⲍⲁϧⲓ + ϯⲙⲉⲧϧⲙⲉⲣⲓ + ϯⲙⲉⲧⲕⲁⲛⲛⲁⲇⲓ + ϯⲙⲉⲧⲕⲟⲣⲓ + ϯⲙⲉⲧⲕⲟⲛⲕⲁⲛⲓ + ϯⲙⲉⲧⲕⲁϣⲙⲓⲣⲓ + ϯⲙⲉⲧⲕⲟⲩⲣⲇⲓ + ϯⲙⲉⲧⲕⲟⲩⲣⲇⲓ + ϯⲙⲉⲧⲕⲩⲣⲙⲁⲛϫⲓ + ϯⲙⲉⲧⲕⲟⲩⲓ + ϯⲙⲉⲧⲕⲩⲣⲅⲩⲍⲓ + ϯⲙⲉⲧⲗⲟⲩⲝⲟⲙⲃⲟⲩⲣⲓ + ϯⲙⲉⲧⲗⲓⲅⲟⲩⲣⲓ + ϯⲙⲉⲧⲗⲟⲙⲃⲁⲣⲇⲓ + ϯⲙⲉⲧⲗⲁⲟ + ϯⲙⲉⲧⲗⲓⲑⲟⲩⲁⲛⲓ + ϯⲙⲉⲧⲗⲁⲧⲃⲓ + ϯⲙⲉⲧⲙⲁⲓⲑⲓⲗⲓ + ϯⲙⲉⲧⲙⲁⲟⲣⲓ + ϯⲙⲉⲧⲙⲁⲕⲉⲇⲟⲛⲓ + ϯⲙⲉⲧⲙⲁⲗⲁⲓⲁⲗⲁⲙ + ϯⲙⲉⲧⲙⲟⲛⲅⲟⲗⲓ + ϯⲙⲉⲧⲙⲁⲛⲓⲡⲟⲩⲣⲓ + ϯⲙⲉⲧⲙⲁⲣⲁⲑⲓ + ϯⲙⲉⲧⲙⲁⲗⲁⲓ + ϯⲙⲉⲧⲙⲁⲗⲑⲓ + ϩⲁⲛⲙⲏϣ ⲛ̀ⲁⲥⲡⲓ + ϯⲙⲉⲧⲃⲟⲩⲣⲙⲓ + ϯⲙⲉⲧⲥⲏⲧϫⲉⲣⲙⲁⲛⲓ + ϯⲙⲉⲧⲛⲉⲡⲁⲗⲓ + ϯⲙⲉⲧϩⲟⲗⲁⲛⲇ + ϯⲙⲉϥⲗⲁⲙⲁⲛⲕ + ϯⲙⲉⲧⲛⲟⲣⲟⲩⲓⲅⲓ ⲛⲩⲛⲟⲣⲥⲕ + ϯⲙⲉⲧⲛⲟⲣⲟⲩⲓⲅⲓ + ϯⲙⲉⲧⲛ̀ⲕⲟ + ϯⲙⲉⲧⲥⲟⲑⲟⲛ̀ϩⲏⲧ + ϯⲙⲉⲧⲟⲕⲥⲓⲧⲁⲛ + ϯⲙⲉⲧⲟⲣⲟⲙⲟ + ϯⲙⲉⲧⲟⲇⲓ + ϯⲙⲉⲧⲡⲟⲩⲛϫⲁⲃⲓ + ϯⲙⲉⲧⲛⲁⲓϫⲓⲣⲓ + ϯⲙⲉⲧⲡⲟⲗⲁⲛⲇⲓ + ϯⲙⲉⲧⲡⲣⲟⲩⲥⲓ + ϯⲙⲉⲧⲡⲁϣⲑⲟ + ϯⲙⲉⲧⲡⲟⲣⲧⲟⲩⲅⲁⲗⲓ + ϯⲙⲉⲧⲡⲟⲣⲧⲟⲩⲅⲁⲗⲓ ⲙ̀ⲃⲣⲁⲍⲓⲗ + ϯⲙⲉⲧⲡⲟⲣⲧⲟⲩⲅⲁⲗⲓ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ϯⲙⲉⲧⲕⲟⲩⲉϣⲟⲩⲁ + ϯⲙⲉⲧⲣⲁϫⲁⲥⲑⲁⲛⲓ + ϯⲙⲉⲧⲣⲟⲙⲁⲛϣⲓ + ϯⲙⲉⲧⲣⲟⲙⲁⲛⲓ + ϯⲙⲉⲧⲣⲟⲩⲥⲓ + ϯⲙⲉⲧⲕⲓⲛⲓⲁⲣⲟⲩⲁⲛⲇⲓ + ϯⲙⲉⲧⲥⲁⲛⲥⲕⲣⲓⲑ + ϯⲙⲉⲧⲓⲁⲕⲟⲩⲧ + ϯⲙⲉⲧⲥⲁⲛⲑⲁⲗⲓ + ϯⲙⲉⲧⲥⲁⲣⲇⲓⲛⲓ + ϯⲙⲉⲧⲥⲓⲛⲇⲓ + ϯⲙⲉⲧⲥⲓⲛϩⲁⲗⲁ + ϯⲙⲉⲧⲥⲗⲟⲃⲁⲕ + ϯⲙⲉⲧⲥⲗⲟⲃⲉⲛⲓ + ϯⲙⲉⲧⲥⲟⲙⲁⲗⲓ + ϯⲙⲉⲧⲁⲗⲃⲁⲛⲓⲁ + ϯⲙⲉⲧⲥⲉⲣⲃⲓ + ϯⲙⲉⲧⲥⲟⲑⲟ ⲛ̀ⲣⲏⲥ + ϯⲙⲉⲧⲥⲟⲩⲇⲁⲛⲓ + ϯⲙⲉⲧⲥⲟⲩⲓⲇⲓ + ϯⲙⲉⲧⲥⲟⲩⲁϩⲓⲗⲓ + ϯⲙⲉⲧⲁⲥⲥⲩⲣⲟⲥ + ϯⲙⲉⲧⲥⲓⲗⲉⲥⲓⲁⲛ + ϯⲙⲉⲧⲑⲁⲙⲓⲗⲓ + ϯⲙⲉⲧⲑⲉⲗⲟⲩⲅⲟⲩ + ϯⲙⲉⲧⲑⲁϫⲓⲕⲓ + ϯⲙⲉⲧⲑⲁⲓⲗⲁⲛⲇⲓ + ϯⲙⲉⲧⲑⲓⲅⲣⲓⲛⲓ + ϯⲙⲉⲧⲑⲟⲩⲣⲕⲙⲁⲛⲓ + ϯⲙⲉⲧⲑ̀ⲥⲟⲩⲁⲛⲓ + ϯⲙⲉⲧⲑⲟⲛⲅⲁⲛⲓ + ϯⲙⲉⲧⲭⲟⲝⲓⲥ + ϯⲙⲉⲧⲑⲁⲣⲑⲁⲣ + ϯⲙⲉⲧⲟⲩⲏⲅⲟⲩⲣ + ϯⲙⲉⲧⲟⲩⲕⲣⲁⲛⲓ + ⲟⲩⲁⲥⲡⲓ ⲛ̀ⲁⲧⲥⲟⲩⲏⲛ + ϯⲙⲉⲧⲟⲩⲣⲇⲟⲩ + ϯⲙⲉⲧⲟⲩⲍⲃⲉⲕⲓ + ϯⲙⲉⲧⲃⲉⲛⲉⲑⲓ + ϯⲙⲉⲧⲃⲓⲉⲑⲛⲁⲙⲓ + ϯⲙⲉⲧⲙⲁϧⲟⲩⲁ + ϯⲙⲉⲧⲟⲩⲟⲗⲟϥ + ϯⲙⲉⲧⲝⲟⲍⲁ + ϯⲙⲉⲧⲕⲁⲛⲅⲣⲓ + ϯⲙⲉⲧⲓⲟⲣⲟⲩⲃⲁ + ϯⲙⲉⲧⲛⲓⲛⲅⲁⲧⲟⲩ + ϯⲙⲉⲧⲕⲁⲛⲑⲟⲛⲓ + ϯⲙⲉⲧϭⲓⲛⲁ, ϯⲙⲉⲧⲕⲁⲛⲑⲟⲛⲓ + ϯⲙⲉⲧⲍⲟⲩⲁⲛⲅ + ϯⲙⲉⲧϭⲓⲛⲁ + ϯⲙⲉⲧϭⲓⲛⲁ, ⲙⲁⲛⲇⲁⲣⲓⲛ + ϯⲙⲉⲧϭⲓⲛⲁ ⲛ̀ϩⲁⲡⲗⲟⲩⲥ + ϯⲙⲉⲧⲙⲁⲛⲇⲁⲣⲓⲛ ⲛ̀ϭⲓⲛⲁ ⲛ̀ⲁⲡⲗⲟⲩⲥ + ϯⲙⲉⲧϭⲛⲓⲁ ⲛ̀ⲣⲉⲙⲕⲁϩⲥ + ϯⲙⲉⲧⲙⲁⲛⲇⲁⲣⲓⲛ ⲛ̀ϭⲓⲛⲁ ⲛ̀ⲣⲉⲙⲕⲁϩⲥ + ϯⲙⲉⲧⲍⲟⲩⲗⲟⲩ + ⲙ̀ⲙⲟⲛ ⲁⲥⲡⲓ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ⲡⲓⲑⲟ + ϯⲫⲣⲓⲕⲓⲁ + ϯⲁⲙⲉⲣⲓⲕⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ϯⲁⲙⲉⲣⲓⲕⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ϯⲟⲥⲉⲁⲛⲓⲁ + ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲉⲙⲉⲛⲧ + ϯⲁⲙⲉⲣⲓⲕⲁ ⲛ̀ⲑⲙⲏϯ + ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ϯⲫⲣⲓⲕⲓⲁ ⲛ̀ⲑⲙⲏϯ + ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ⲛⲓⲁⲙⲉⲣⲓⲕⲁ + ϯⲁⲙⲉⲣⲓⲕⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ϯⲕⲁⲣⲓⲃⲓ + ϯⲁⲥⲓⲁ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ϯⲁⲥⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ϯⲁⲥⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ ⲓⲉⲃⲧ + ϯⲉⲩⲣⲟⲡⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ϯⲁⲩⲥⲧⲣⲁⲗⲁⲍⲓⲁ + ϯⲙⲁⲉⲗⲁⲛⲉⲍⲓⲁ + ϯⲙⲓⲕⲣⲟⲛⲉⲍⲓⲁ + ϯⲡⲟⲗⲩⲛⲉⲍⲓⲁ + ϯⲁⲥⲓⲁ + ϯⲁⲥⲓⲁ ⲛ̀ⲑⲙⲏϯ + ϯⲁⲥⲓⲁ ⲙ̀ⲡⲉⲙⲉⲛⲧ + ϯⲉⲩⲣⲟⲡⲁ + ϯⲉⲩⲣⲟⲡⲁ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ϯⲉⲩⲣⲟⲡⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ϯⲉⲩⲣⲟⲡⲁ ⲙ̀ⲡⲉⲙⲉⲛⲧ + ϯⲫⲣⲓⲕⲓⲁ ⲉⲧⲥⲏⲧ ⲙ̀ⲡϣⲁϥⲉ + ϯⲁⲙⲉⲣⲓⲕⲁ ⲛ̀ⲗⲁⲑⲓⲛⲓ + ϯⲙⲟⲩⲓ ⲛ̀ⲁⲥⲉⲛϣⲓⲟⲛ + ϯⲁⲛⲇⲟⲣⲁ + ⲛⲓⲉⲙⲁⲣⲁⲧ ⲛ̀ⲁⲣⲁⲃⲟⲥ ⲉⲧϩⲱⲧⲡ + ϯⲁϥⲅⲁⲛⲓⲥⲑⲁⲛ + ⲁⲛⲧⲓⲅⲟⲩⲁ & ⲃⲁⲣⲃⲟⲩⲇⲁ + ϯⲁⲛⲅⲟⲩⲓⲗⲗⲁ + ϯⲁⲗⲃⲁⲛⲓⲁ + ϯⲁⲣⲙⲉⲛⲓⲁ + ϯⲁⲛⲅⲟⲗⲁ + ⲁⲛⲑⲁⲣⲕⲧⲓⲕⲁ + ϯⲁⲣϫⲉⲛⲧⲓⲛ + ⲥⲁⲙⲟⲩⲁ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + ϯⲁⲩⲥⲑⲣⲓⲁ + ϯⲁⲩⲥⲑⲧⲣⲁⲗⲓⲁ + ϯⲁⲣⲟⲩⲃⲁ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲁⲗⲁⲛⲇ + ⲁⲇⲟⲩⲣⲃⲁⲇⲁⲅⲁⲛ + ϯⲃⲟⲥⲛⲓⲁ & ϩⲉⲣⲍⲉⲅⲟⲃⲓⲛⲁ + ϯⲃⲁⲣⲃⲁⲇⲟⲥ + ϯⲃⲁⲛⲅⲗⲁⲇⲉϣ + ϯⲃⲉⲗϫⲓⲕⲁ + ⲃⲟⲩⲣⲕⲓⲛⲁ ϥⲁⲥⲟ + ϯⲃⲟⲩⲗⲅⲁⲣⲓⲁ + ϯⲃⲁϩⲣⲉⲛ + ϯⲃⲟⲩⲣⲟⲩⲛⲇⲓ + ϯⲃⲉⲛⲓⲛ + ⲥⲁⲛⲧ ⲃⲁⲣⲑⲉⲗⲉⲙⲓ + ϯⲃⲉⲣⲙⲟⲩⲇⲁ + ϯⲃⲣⲟⲩⲛⲉⲓ + ϯⲃⲟⲗⲓⲃⲓⲁ + ϯⲕⲁⲣⲓⲃⲓ ⲛ̀ϩⲟⲗⲗⲁⲛⲇⲁ + ϯⲃⲣⲁⲍⲓⲗ + ϯⲃⲁϩⲁⲙⲁ + ϯⲃϩⲟⲩⲑⲁⲛ + ϯⲙⲟⲩⲓ ⲛ̀ⲃⲟⲩⲃⲉⲧ + ϯⲃⲟⲑⲥⲟⲩⲁⲛⲁ + ϯⲃⲉⲗⲁⲣⲟⲩⲥ + ϯⲃⲉⲗⲓⲍⲉ + ϯⲕⲁⲛⲁⲇⲁ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲕⲟⲥ + ⲕⲟⲛⲅⲟ ⲕⲓⲛϣⲁⲥⲁ + ⲕⲟⲛⲅⲟ ⲇⲣⲥ + ϯⲙⲉⲧϣ̀ⲗⲟⲗ ⲙ̀ⲫⲣⲓⲕⲓⲁ ⲛ̀ⲑⲙⲏϯ + ⲕⲟⲛⲅⲟ - ⲃⲣⲁⲍⲁⲃⲓⲗ + ϯⲕⲟⲛⲅⲟ + ϯⲥⲟⲩⲓⲥⲣⲁ + ϯⲕⲟⲧ ⲇⲓⲃⲟⲩⲁⲣ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲩⲕ + ϯϭⲓⲗⲉ + ϯⲕⲁⲙⲉⲣⲟⲩⲛ + ϯϭⲓⲛⲁ + ϯⲕⲟⲗⲟⲙⲃⲓⲁ + ϯⲙⲟⲩⲓ ⲛ̀ⲕⲗⲓⲡⲉⲣⲑⲟⲛ + ⲥⲁⲣⲕ + ⲕⲟⲥⲑⲁ ⲣⲓⲕⲁ + ϯⲕⲟⲩⲃⲁ + ϯⲕⲁⲡ ⲃⲉⲣⲇⲉ + ϯⲕⲟⲩⲣⲁⲥⲁⲟ + ϯⲙⲟⲩⲓ ⲛ̀ⲭⲣⲓⲥⲧⲙⲁⲥ + ⲕⲩⲡⲣⲟⲥ + ϯϭⲉⲕⲓⲁ + ϯⲙⲉⲧϣ̀ⲗⲟⲗ ⲛ̀ϭⲉⲕ + ϯⲁⲗⲙⲁⲛⲓⲁ + ⲇⲓⲉⲅⲟ ⲅⲁⲣⲥⲓⲁ + ϯⲇϫⲓⲃⲟⲩⲑⲓ + ϯⲇⲉⲛⲙⲁⲣⲕ + ϯⲇⲟⲙⲓⲛⲓⲕⲁ + ϯⲇⲟⲙⲓⲛⲓⲕⲁⲛ + ϯⲁⲗϫⲉⲣⲓⲁ + ⲥⲉⲩⲑⲁ & ⲙⲉⲗⲓⲗⲗⲁ + ϯⲉⲕⲟⲩⲁⲇⲟⲣ + ϯⲉⲥⲑⲟⲛⲓⲁ + ⲭⲏⲙⲓ + ⲡⲓϣⲁϥⲉ ⲙ̀ⲡⲉⲙⲉⲛⲧ + ϯⲉⲣⲓⲑⲣⲓⲁ + ⲉⲥⲡⲁⲛⲓⲁ + ⲉⲑⲁⲩϣ + ϯⲙⲉⲧⲣⲉⲙⲉⲩⲣⲟⲡⲁ ⲉⲧϩⲱⲧⲡ + ϯⲉⲩⲣⲟⲍⲟⲛ + ϯϥⲓⲛⲗⲁⲛⲇ + ϥⲓⲇϫⲓ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ (ⲓⲥⲗⲁⲥ ⲙⲁⲗⲃⲓⲛⲁⲥ) + ⲙⲓⲕⲣⲟⲛⲉⲍⲓⲁ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲁⲣⲟⲉ + ϯϥⲉⲣⲉⲛⲥⲁ + ϯⲅⲁⲃⲟⲛ + ϯⲙⲉⲧⲟⲩⲣⲟ ⲉⲧϩⲱⲧⲡ + ϯⲅⲣⲉⲛⲁⲇⲁ + ϯⲅⲉⲟⲣⲅⲓⲁ + ϯⲅⲟⲩⲓⲁⲛⲁ ⲛ̀ϥⲉⲣⲉⲛⲥⲉⲟⲥ + ϯⲅⲟⲩⲉⲣⲛⲉⲥⲓ + ϯⲅⲁⲛⲁ + ϯϫⲓⲃⲣⲁⲗⲑⲁⲣ + ϯⲅⲣⲓⲛⲗⲁⲛⲇ + ϯⲅⲁⲙⲃⲓⲁ + ϯⲅⲓⲛⲉⲁ + ϯⲅⲟⲩⲁⲇⲉⲗⲟⲩⲡ + ⲅⲓⲛⲉⲁ ⲛ̀ⲉⲕⲟⲩⲁⲑⲱⲣ + ϯⲉⲗⲗⲁⲥ + ϫⲉⲟⲣϫⲓⲁ ⲛ̀ⲣⲏⲥ & ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲥⲁⲛⲇⲟⲩⲓϭ + ϯⲅⲟⲩⲁⲑⲉⲙⲁⲗⲁ + ⲅⲟⲩⲁⲙ + ϯⲅⲓⲛⲉⲁ ⲃⲓⲥⲁⲩ + ϯⲅⲩⲁⲛⲁ + ϩⲟⲛⲅ ⲕⲟⲛⲅ ⲥⲁⲣ ϭⲓⲛⲁ + ϯϩⲟⲛⲅ ⲕⲟⲛⲅ + ϩⲉⲣⲇ & ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲙⲁⲕⲇⲟⲛⲁⲗⲇ + ϯϩⲟⲛⲇⲟⲩⲣⲁⲥ + ϯⲕⲣⲟⲁⲑⲓⲁ + ϯϩⲁⲓⲑⲓ + ϯϩⲁⲛⲅⲁⲣⲓⲁ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲁⲛⲁⲣⲓ + ϯⲓⲛⲇⲟⲛⲉⲥⲓⲁ + ϯⲁⲓⲉⲣⲗⲁⲛⲇⲁ + ⲡⲓⲥⲣⲁⲏⲗ + ⲅⲟⲩⲉⲣⲛⲥⲓ + ϯϩⲉⲛⲧⲟⲩ + ⲛⲓⲑⲱϣ ⲙⲃⲣⲓⲑⲁⲛⲓⲁ ⲛ̀ⲱⲕⲉⲁⲛⲟⲥ ⲛ̀ϩⲉⲛⲧⲟⲩ + ⲡⲓⲁⲣⲭⲏⲡⲉⲗⲁⲅⲟ ⲛ̀ϭⲁⲅⲟⲥ + ⲓⲣⲁⲕ + ϯⲡⲉⲣⲥⲓⲁ + ϯⲁⲓⲥⲗⲁⲛⲇⲁ + ϯϩⲩⲧⲁⲗⲓⲁ + ϯϫⲉⲣⲥⲓ + ϯϫⲁⲙⲁⲓⲕⲁ + ⲡⲓⲓⲟⲣⲇⲁⲛⲏⲥ + ϯⲓⲁⲡⲁⲛ + ϯⲕⲉⲛⲓⲁ + ϯⲕⲩⲣⲅⲩⲥⲑⲁⲛ + ϯⲕⲁⲙⲃⲟⲇⲓⲁ + ⲕⲓⲣⲓⲃⲁⲑⲓ + ϯⲕⲟⲙⲟⲣⲟⲥ + ⲥⲁⲛⲧ ⲕⲓⲧⲥ & ⲛⲉⲃⲓⲥ + ϯⲕⲟⲣⲉⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ϯⲕⲟⲣⲉⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ⲕⲟⲩⲉⲧ + ϯⲕⲁⲓⲙⲁⲛ ⲙⲟⲩⲓ + ϯⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + ϯⲗⲁⲟⲥ + ⲡⲓⲖⲓⲃⲁⲛⲟⲥ + ⲥⲁⲛⲧ ⲗⲟⲩϭⲓⲁ + ϯⲗⲓϣⲑⲉⲛϣⲑⲁⲓⲛ + ϯⲥⲣⲓⲗⲁⲛⲕⲁ + ϯⲗⲓⲃⲉⲣⲓⲁ + ϯⲗⲉⲥⲟⲑⲟ + ϯⲗⲓⲑⲟⲩⲁⲛⲓⲁ + ϯⲗⲟⲩⲝⲟⲙⲃⲟⲩⲣⲅ + ϯⲗⲁⲑⲃⲓⲁ + ⲗⲩⲃⲓⲏ + ϯⲙⲁⲣⲁⲕⲉϣ + ϯⲙⲟⲛⲁⲕⲟ + ϯⲙⲟⲗⲇⲟⲃⲁ + ϯⲙⲟⲛⲑⲉⲛⲉⲅⲣⲟ + ⲥⲁⲛⲧ ⲙⲁⲣⲑⲓⲛ + ϯⲙⲁⲇⲁⲅⲁⲥⲕⲁⲣ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲙⲁⲣϣⲁⲗ + ϯⲙⲁⲕⲉⲇⲟⲛⲓⲁ ⲛ̀ⲉⲙϩⲓⲧ + ϯⲙⲁⲗⲓ + ϯⲙⲩⲁⲛⲙⲁⲣ + ϯⲙⲁⲛⲅⲟⲗⲓⲁ + ⲙⲁⲕⲁⲟ ⲥⲁⲣ ϭⲓⲛⲁ + ϯⲙⲁⲕⲁⲟ + ⲛⲓⲙⲟⲓ ⲙ̀ⲡⲉⲙϩⲓⲧ ⲙ̀ⲙⲁⲣⲓⲁⲛⲁ + ϯⲙⲁⲣⲑⲓⲛⲓⲕ + ϯⲙⲁⲩⲣⲓⲑⲁⲛⲓⲁ + ϯⲙⲟⲛⲥⲉⲣⲁⲧ + ϯⲙⲁⲗⲑⲁ + ϯⲙⲁⲩⲣⲓⲑⲓⲟⲩⲥ + ⲙⲁⲗⲇⲓⲃ + ϯⲙⲁⲗⲁⲩⲓ + ϯⲙⲉⲝⲓⲕⲟ + ϯⲙⲁⲗⲉⲍⲓⲁ + ϯⲙⲟⲍⲁⲙⲃⲓⲕ + ϯⲛⲁⲙⲓⲃⲓⲁ + ⲛⲓⲟⲩ ⲕⲁⲗⲉⲇⲟⲛⲓⲁ + ϯⲛⲓϫⲉⲣ + ϯⲙⲟⲩⲓ ⲛⲛ̀ⲟⲣϥⲟⲕ + ϯⲛⲓϫⲉⲣⲓⲁ + ϯⲛⲓⲕⲁⲣⲁⲅⲩⲟⲁ + ϯϩⲟⲗⲁⲛⲇⲁ + ϯⲛⲟⲣⲟⲩⲓϫⲓⲁ + ϯⲛⲉⲡⲁⲗ + ⲛⲁⲩⲣⲟⲩ + ⲛⲓⲟⲩⲉ + ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + ⲁⲟⲑⲉⲁⲣⲟⲁ ⲛⲓⲟⲩ ⲍⲓⲗⲁⲛⲇⲁ + ⲟⲙⲁⲛ + ϯⲡⲁⲛⲁⲙⲁ + ϯⲡⲉⲣⲟⲩ + ⲡⲟⲗⲓⲛⲉⲍⲓⲁ ⲛ̀ϥⲉⲣⲉⲛⲥⲟⲥ + ⲡⲁⲡⲟⲩⲁ ⲛⲓⲟⲩ ⲅⲓⲛⲉⲁ + ϯⲫⲓⲗⲓⲡⲡⲓⲛ + ϯⲡⲁⲕⲓⲥⲑⲁⲛ + ϯⲡⲟⲗⲁⲛⲇⲁ + ⲥⲁⲛⲧ ⲡⲓⲉⲣ & ⲙⲓⲕⲉⲗⲟⲛ + ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲡⲓⲑⲕⲉⲣⲛ + ⲡⲟⲩⲉⲣⲑⲟ ⲣⲓⲕⲟ + ⲫⲩⲗⲓⲥⲧⲓⲓⲙ + ϯⲡⲟⲣⲑⲟⲩⲅⲁⲗ + ⲡⲁⲗⲁⲩ + ϯⲡⲁⲣⲁⲅⲟⲩⲁⲓ + ⲕⲁⲑⲁⲣ + ϯⲟⲥⲉⲁⲛⲓⲁ + ϯⲣⲉⲓⲟⲩⲛⲓⲟⲛ + ϯⲣⲟⲙⲁⲛⲓⲁ + ϯⲥⲉⲣⲃⲓⲁ + ϯⲣⲟⲩⲥⲓⲁ + ϯⲣⲟⲩⲁⲛⲇⲁ + ϯⲥⲁⲟⲩⲇⲓ ⲛ̀ⲁⲣⲁⲃⲟⲥ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲥⲟⲗⲟⲙⲟⲛ + ϯⲥⲓϭⲉⲗ + ϯⲥⲟⲩⲇⲁⲛ + ϯⲥⲟⲩⲉⲇ + ϯⲥⲓⲛⲅⲁⲡⲟⲣ + ⲥⲁⲛⲧ ϩⲉⲗⲁⲛⲁ + ϯⲥⲗⲟⲃⲉⲛⲓⲁ + ⲥⲃⲁⲗⲃⲁⲣⲇ & ⲓⲁⲛ ⲙⲁⲩⲉⲛ + ϯⲥⲗⲟⲃⲁⲕⲓⲁ + ϯⲥⲓⲉⲣⲁ ⲗⲉⲟⲛ + ⲥⲁⲛ ⲙⲁⲣⲓⲛⲟ + ϯⲥⲉⲛⲉⲅⲁⲗ + ϯⲥⲟⲙⲁⲗⲓⲁ + ϯⲥⲟⲩⲣⲓⲛⲁⲙ + ϯⲥⲟⲩⲇⲁⲛ ⲛ̀ⲣⲏⲥ + ⲥⲁⲟ ⲑⲟⲙⲉ & ⲡⲣⲓⲛⲥⲓⲡ + ⲉⲗ ⲥⲁⲗⲃⲁⲇⲟⲣ + ⲥⲓⲛⲧ ⲙⲁⲁⲣⲑⲉⲛ + ϯⲥⲩⲣⲓⲁ + ϯⲉⲥⲟⲩⲁⲑⲓⲛⲓ + ϯⲥⲟⲩⲁⲍⲓⲗⲁⲛⲇ + ⲑⲣⲓⲥⲑⲁⲛ ⲇⲁ ⲕⲟⲩⲛϩⲁ + ⲑⲟⲩⲣⲕϣ & ⲕⲁⲓⲕⲟⲥ + ϯϭⲁⲇ + ⲛⲓⲑⲱϣ ⲛ̀ϥⲉⲣⲉⲛⲥⲟⲥ ⲙ̀ⲙⲁⲣⲏⲥ + ϯⲑⲟⲅⲟ + ϯⲑⲁⲓⲗⲁⲛⲇ + ϯⲑⲁϫⲓⲕⲓⲥⲑⲁⲛ + ⲑⲟⲕⲉⲗⲁⲩ + ϯⲑⲙⲟⲣ - ⲗⲉⲥⲑⲉ + ϯⲑⲓⲙⲟⲣ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ϯⲑⲟⲩⲣⲕⲙⲁⲛⲓⲥⲑⲁⲛ + ϯⲑⲟⲩⲛⲓⲥ + ⲑⲟⲛⲅⲁ + ϯⲑⲟⲩⲣⲕⲓⲁ + ⲧⲣⲓⲛⲓⲇⲁⲇ & ⲧⲟⲃⲁⲅⲟ + ⲑⲟⲩⲃⲁⲗⲟⲩ + ϯⲑⲁⲓⲟⲩⲁⲛ + ϯⲑⲁⲛⲍⲁⲛⲓⲁ + ϯⲟⲩⲕⲣⲁⲛⲓⲁ + ϯⲟⲩⲅⲁⲛⲇⲁ + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲁⲩⲑⲗⲁⲓⲛⲅ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁ + ⲛⲓϣ̀ⲗⲟⲗ ⲉⲧϩⲱⲧⲡ + ⲛⲓⲑⲱϣ ⲉⲧϩⲱⲧⲡ + ϯⲟⲩⲣⲟⲅⲟⲩⲁⲓ + ϯⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + ϯⲃⲁⲧⲓⲕⲁⲛ + ⲥⲁⲛ ⲃⲓⲛⲥⲉⲛⲧ & ⲅⲣⲉⲛⲁⲇⲓⲛⲍ + ϯⲃⲉⲛⲉⲍⲟⲩⲉⲗⲁ + ⲃⲓⲣϫⲓⲛ ⲙⲟⲩⲓ ⲃⲣⲓⲑⲁⲛⲓⲁ + ⲃⲓⲣϫⲓⲛ ⲙⲟⲩⲓ ⲁⲙⲉⲣⲓⲕⲁ + ϯⲃⲓⲉⲑⲛⲁⲙ + ⲃⲁⲛⲁⲑⲟⲩ + ⲟⲩⲁⲗⲗⲓⲥ & ϥⲟⲩⲧⲟⲩⲛⲁ + ⲥⲁⲙⲟⲁ + ⲯⲉⲩⲇⲟ ϫⲓⲛⲧⲁⲟⲩⲟ + ⲯⲉⲩⲇⲟ ⲃⲓⲇⲓ + ϯⲕⲟⲥⲟⲃⲟ + ⲓⲉⲙⲉⲛ + ϯⲙⲁⲓⲟⲧ + ϯⲫⲣⲓⲕⲓⲁ ⲛ̀ⲣⲏⲥ + ϯⲍⲁⲙⲃⲓⲁ + ϯⲍⲓⲙⲃⲁⲃⲟⲩⲉ + ⲟⲩⲙⲁ ⲛ̀ⲁⲧⲥⲟⲩⲏⲛ + + + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ + + + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲙ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲇⲁ + ⲣⲉⲙⲛ̀ⲃⲟⲩⲇⲁ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲭⲏⲙⲓ + ⲣⲉⲙⲛ̀ⲭⲏⲙⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲇⲁⲛⲅⲓ + ⲣⲉⲙⲛ̀ⲇⲁⲛⲅⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ + ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ ⲛ̀ⲁⲙⲉⲑⲉ ⲁⲗⲉⲙ + ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ ⲛ̀ⲁⲙⲉⲑⲉ ⲁⲗⲉⲙ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲙ̀ⲙⲉⲧⲅⲣⲩⲅⲟⲣⲓⲟⲥ + ⲙⲉⲧⲅⲣⲩⲅⲟⲣⲓⲟⲥ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲉⲃⲣⲉⲟⲥ + ⲙⲉⲧϩⲉⲃⲣⲉⲟⲥ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲓϫⲣⲓ + ϯⲙⲉⲧϩⲓϫⲣⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲓϫⲣⲁ (ⲑⲁⲃⲩⲗⲁⲣ, ⲉⲡⲟϧ) + ⲣⲉⲙⲛⲛ̀ϩⲓϫⲣⲓ (ⲑⲁⲃⲩⲗⲁⲣ, ⲉⲡⲟϧ) + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲓϫⲣⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲓϫⲣⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ϩⲓϫⲣⲓ + ϯⲙⲉⲧϩⲓϫⲣⲓ (ⲟⲩⲙ ⲁⲗ ⲕⲟⲩⲣⲁ) + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲙ̀ⲙⲉⲧⲅⲣⲩⲅⲟⲣⲓⲟⲥ (ⲣⲟⲙⲡⲓ ⲛ̀ϣⲱⲣⲡ) + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲁⲡⲁⲛⲓ + ⲣⲉⲙⲛ̀ⲓⲁⲡⲁⲛⲓ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲉⲣⲥⲟⲥ + ⲣⲉⲙⲛ̀ⲡⲉⲣⲥⲟⲥ + ϯⲙⲉⲧⲥⲱⲟⲩⲧⲉⲛ ⲙ̀ⲙⲓⲛⲅⲟⲩⲟ + ⲙⲓⲛⲅⲟⲩⲟ + + + ϯⲁⲥⲡⲓ: {0} + ⲡ̀ϫⲓⲛⲥ̀ϧⲁⲓ: {0} + ϯⲭⲱⲣⲁ: {0} + + [ⲁ ⲃ ⲅ ⲇ ⲉ ⲋ ⲍ ⲏ ⲑ ⲓ ⲕ ⲗ ⲙ ⲛ ⲝ ⲟ ⲡ ⲣ ⲥ ⲧ ⲩ ⲫ ⲭ ⲯ ⲱ ϣ ϥ ϧ ϩ ϫ ϭ ϯ] [⳥ ⳦ ⳧ ⳨ ⳩ ⳪ ⳤ] [– ⸗ , ; \: . ⳹ ⳾ ⳼ ⳿ ( )] + + + + + + + Ⲑⲱⲟⲩⲧ + Ⲡⲁⲟⲡⲓ + Ⲁⲑⲱⲣ + Ⲭⲟⲓⲁⲕ + Ⲧⲱⲃⲓ + Ⲙⲉϣⲓⲣ + Ⲡⲁⲣⲉⲙϩⲁⲧ + Ⲫⲁⲣⲙⲟⲩⲑⲓ + Ⲡⲁϣⲟⲛⲥ + Ⲡⲁⲱⲛⲓ + Ⲉⲡⲓⲡ + Ⲙⲉⲥⲱⲣⲓ + Ⲡⲓⲕⲟⲩϫⲓ ⲛ̀ⲁ̀ⲃⲟⲧ + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + ⲉ̅ + ⲋ̅ + ⲍ̅ + ⲏ̅ + ⲑ̅ + ⲓ̅ + ⲓ̅ⲁ̅ + ⲓ̅ⲃ̅ + ⲓ̅ⲅ̅ + + + Ⲑⲱⲟⲩⲧ + Ⲡⲁⲟⲡⲓ + Ⲁⲑⲱⲣ + Ⲭⲟⲓⲁⲕ + Ⲧⲱⲃⲓ + Ⲙⲉϣⲓⲣ + Ⲡⲁⲣⲉⲙϩⲁⲧ + Ⲫⲁⲣⲙⲟⲩⲑⲓ + Ⲡⲁϣⲟⲛⲥ + Ⲡⲁⲱⲛⲓ + Ⲉⲡⲓⲡ + Ⲙⲉⲥⲱⲣⲓ + Ⲡⲓⲕⲟⲩϫⲓ ⲛ̀ⲁ̀ⲃⲟⲧ + + + + + Ⲑⲱⲟⲩⲧ + Ⲡⲁⲟⲡⲓ + Ⲁⲑⲱⲣ + Ⲭⲟⲓⲁⲕ + Ⲧⲱⲃⲓ + Ⲙⲉϣⲓⲣ + Ⲡⲁⲣⲉⲙϩⲁⲧ + Ⲫⲁⲣⲙⲟⲩⲑⲓ + Ⲡⲁϣⲟⲛⲥ + Ⲡⲁⲱⲛⲓ + Ⲉⲡⲓⲡ + Ⲙⲉⲥⲱⲣⲓ + Ⲡⲓⲕⲟⲩϫⲓ ⲛ̀ⲁ̀ⲃⲟⲧ + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + ⲉ̅ + ⲋ̅ + ⲍ̅ + ⲏ̅ + ⲑ̅ + ⲓ̅ + ⲓ̅ⲁ̅ + ⲓ̅ⲃ̅ + ⲓ̅ⲅ̅ + + + Ⲑⲱⲟⲩⲧ + Ⲡⲁⲟⲡⲓ + Ⲁⲑⲱⲣ + Ⲭⲟⲓⲁⲕ + Ⲧⲱⲃⲓ + Ⲙⲉϣⲓⲣ + Ⲡⲁⲣⲉⲙϩⲁⲧ + Ⲫⲁⲣⲙⲟⲩⲑⲓ + Ⲡⲁϣⲟⲛⲥ + Ⲡⲁⲱⲛⲓ + Ⲉⲡⲓⲡ + Ⲙⲉⲥⲱⲣⲓ + Ⲡⲓⲕⲟⲩϫⲓ ⲛ̀ⲁ̀ⲃⲟⲧ + + + + + + + + + ⲓⲁⲛⲟⲩⲁⲣⲓ + ⲫⲉⲃⲣⲟⲩⲁⲣⲓ + ⲙⲁⲣⲧⲓ + ⲁⲡⲣⲓⲗⲓ + ⲙⲁⲓⲟ + ⲓⲟⲩⲛⲓⲟⲩ + ⲓⲟⲩⲗⲓⲟⲩ + ⲁⲩⲅⲟⲩⲥⲑⲟⲩ + ⲥⲉⲡⲧⲉⲙⲃⲣⲓ + ⲟⲕⲧⲱⲃⲣⲓ + ⲛⲟⲉⲙⲃⲣⲓ + ⲇⲉⲕⲉⲙⲃⲣⲓ + + + + + + + + + + + + + + + + + ⲓⲁⲛⲟⲩⲁⲣⲓ + ⲫⲉⲃⲣⲟⲩⲁⲣⲓ + ⲙⲁⲣⲧⲓ + ⲁⲡⲣⲓⲗⲓ + ⲙⲁⲓⲟ + ⲓⲟⲩⲛⲓⲟⲩ + ⲓⲟⲩⲗⲓⲟⲩ + ⲁⲩⲅⲟⲩⲥⲑⲟⲩ + ⲥⲉⲡⲧⲉⲙⲃⲣⲓ + ⲟⲕⲧⲱⲃⲣⲓ + ⲛⲟⲉⲙⲃⲣⲓ + ⲇⲉⲕⲉⲙⲃⲣⲓ + + + + + ⲓⲁⲛⲟⲩⲁⲣⲓ + ⲫⲉⲃⲣⲟⲩⲁⲣⲓ + ⲙⲁⲣⲧⲓ + ⲁⲡⲣⲓⲗⲓ + ⲙⲁⲓⲟ + ⲓⲟⲩⲛⲓⲟⲩ + ⲓⲟⲩⲗⲓⲟⲩ + ⲁⲩⲅⲟⲩⲥⲑⲟⲩ + ⲥⲉⲡⲧⲉⲙⲃⲣⲓ + ⲟⲕⲧⲱⲃⲣⲓ + ⲛⲟⲉⲙⲃⲣⲓ + ⲇⲉⲕⲉⲙⲃⲣⲓ + + + + + + + + + + + + + + + + + ⲓⲁⲛⲟⲩⲁⲣⲓ + ⲫⲉⲃⲣⲟⲩⲁⲣⲓ + ⲙⲁⲣⲧⲓ + ⲁⲡⲣⲓⲗⲓ + ⲙⲁⲓⲟ + ⲓⲟⲩⲛⲓⲟⲩ + ⲓⲟⲩⲗⲓⲟⲩ + ⲁⲩⲅⲟⲩⲥⲑⲟⲩ + ⲥⲉⲡⲧⲉⲙⲃⲣⲓ + ⲟⲕⲧⲱⲃⲣⲓ + ⲛⲟⲉⲙⲃⲣⲓ + ⲇⲉⲕⲉⲙⲃⲣⲓ + + + + + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲟⲩⲁⲓ + ⲡⲓⲥ̀ⲛⲁⲩ + ⲡⲓϣⲟⲙⲧ + ⲡⲓϥ̀ⲧⲟⲩ + ⲡⲓⲧ̀ⲓⲟⲩ + ⲡⲓⲥⲟⲟⲩ + ⲡⲓϣⲁϣϥ + + + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲁ̅ + ⲡⲓⲃ̅ + ⲡⲓⲅ̅ + ⲡⲓⲇ̅ + ⲡⲓⲉ̅ + ⲡⲓⲋ̅ + ⲡⲓⲍ̅ + + + ⲡⲓⲟⲩⲁⲓ + ⲡⲓⲥ̀ⲛⲁⲩ + ⲡⲓϣⲟⲙⲧ + ⲡⲓϥ̀ⲧⲟⲩ + ⲡⲓⲧ̀ⲓⲟⲩ + ⲡⲓⲥⲟⲟⲩ + ⲡⲓϣⲁϣϥ + + + + + + + ⲡⲓⲁ̅ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲃ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲅ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲇ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + + + ⲡⲓϩⲟⲩⲓⲧ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲥ̀ⲛⲁⲩ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩϣⲟⲙⲧ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩϥ̀ⲧⲟⲩ ⲛ̀ⲣⲉϥⲧⲟⲩ + + + + + ⲡⲓⲁ̅ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲃ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲅ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲇ︦ ⲛ̀ⲣⲉϥⲧⲟⲩ + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + + + ⲡⲓϩⲟⲩⲓⲧ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩⲥ̀ⲛⲁⲩ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩϣⲟⲙⲧ ⲛ̀ⲣⲉϥⲧⲟⲩ + ⲡⲓⲙⲁϩϥ̀ⲧⲟⲩ ⲛ̀ⲣⲉϥⲧⲟⲩ + + + + + + + Ϧ︦Ⲙ︦ + Ⲙ︦Ⲙ︦ + + + Ϧ︦Ⲙ︦ + Ⲙ︦Ⲙ︦ + + + ϧⲁϫⲉⲛ ⲙⲉⲣⲓ + ⲙⲉⲛⲉⲛⲥⲁ ⲙⲉⲣⲓ + + + + + Ϧ︦Ⲙ︦ + Ⲙ︦Ⲙ︦ + + + Ϧ︦Ⲙ︦ + Ⲙ︦Ⲙ︦ + + + ϧⲁϫⲉⲛ ⲙⲉⲣⲓ + ⲙⲉⲛⲉⲛⲥⲁ ⲙⲉⲣⲓ + + + + + + ϧⲁϫⲉⲛ ⲡⲓⲭⲣⲓⲥⲧⲟⲥ + ϧⲁϫⲉⲛ ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲓⲛⲟⲛ + ⲙⲉⲛⲉⲛⲥⲁ ⲡⲓⲭⲣⲓⲥⲧⲟⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲓⲛⲟⲛ + + + ϧⲁϫⲉⲛ ⲡⲭ︦ⲥ︦ + Ϧ︦Ⲥ︦Ⲕ︦ + ⲙⲉⲛⲉⲛⲥⲁ ⲡⲭ︦ⲥ︦ + Ⲥ︦Ⲕ︦ + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + E h:mm a + E h:mm:ss a + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v + + + + + + + + ⲙⲟⲩϩ. + ⲥⲁϥ. + ⲣⲁⲃ. I + ⲣⲁⲃ. II + ϫⲟⲩⲙ. I + ϫⲟⲩⲙ. II + ⲣⲁϫ. + ϣⲁ. + ⲣⲁⲙ. + ϣⲁⲩ. + ⲇⲟⲩⲗ-ⲕ. + ⲇⲟⲩⲗ-ϩ. + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + ⲉ̅ + ⲋ̅ + ⲍ̅ + ⲏ̅ + ⲑ̅ + ⲓ̅ + ⲓ̅ⲁ̅ + ⲓ̅ⲃ̅ + + + ⲙⲟⲩϩⲁⲣⲣⲁⲙ + ⲥⲁϥⲁⲣ + ⲣⲁⲃⲓʻ I + ⲣⲁⲃⲓʻ II + ϫⲟⲩⲙⲁⲇⲁ I + ϫⲟⲩⲙⲁⲇⲁ II + ⲣⲁϫⲁⲃ + ϣⲁʻⲃⲁⲛ + ⲣⲁⲙⲁⲇⲁⲛ + ϣⲁⲟⲩⲁⲗ + ⲇⲟⲩⲗ-ⲕⲓʻⲇⲁϩ + ⲇⲟⲩⲗ-ϩⲓϫϫⲁ + + + + + ⲙⲟⲩϩ. + ⲥⲁϥ. + ⲣⲁⲃ. I + ⲣⲁⲃ. II + ϫⲟⲩⲙ. I + ϫⲟⲩⲙ. II + ⲣⲁϫ. + ϣⲁ. + ⲣⲁⲙ. + ϣⲁⲩ. + ⲇⲟⲩⲗ-ⲕ. + ⲇⲟⲩⲗ-ϩ. + + + ⲁ̅ + ⲃ̅ + ⲅ̅ + ⲇ̅ + ⲉ̅ + ⲋ̅ + ⲍ̅ + ⲏ̅ + ⲑ̅ + ⲓ̅ + ⲓ̅ⲁ̅ + ⲓ̅ⲃ̅ + + + ⲙⲟⲩϩⲁⲣⲣⲁⲙ + ⲥⲁϥⲁⲣ + ⲣⲁⲃⲓʻ I + ⲣⲁⲃⲓʻ II + ϫⲟⲩⲙⲁⲇⲁ I + ϫⲟⲩⲙⲁⲇⲁ II + ⲣⲁϫⲁⲃ + ϣⲁʻⲃⲁⲛ + ⲣⲁⲙⲁⲇⲁⲛ + ϣⲁⲟⲩⲁⲗ + ⲇⲟⲩⲗ-ⲕⲓʻⲇⲁϩ + ⲇⲟⲩⲗ-ϩⲓϫϫⲁ + + + + + + ⲁϩ + + + + + + + ⲡ̀ⲥⲏⲟⲩ + + + ⲡ̀ⲥⲏⲟⲩ + + + ⲡ̀ⲥⲏⲟⲩ + + + ⲣⲟⲙⲡⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲧⲁⲥⲥⲓⲛⲓ + ⲧⲁⲓⲣⲟⲙⲡⲓ ⲑⲁⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲑⲛⲏⲟⲩ + + + ⲣⲟⲙⲡⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲧⲁⲥⲥⲓⲛⲓ + ⲧⲁⲓⲣⲟⲙⲡⲓ ⲑⲁⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲑⲛⲏⲟⲩ + + + ⲣⲟⲙⲡⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲧⲁⲥⲥⲓⲛⲓ + ⲧⲁⲓⲣⲟⲙⲡⲓ ⲑⲁⲓ + ϯⲣⲟⲙⲡⲓ ⲉⲑⲛⲏⲟⲩ + + + ⲣⲉϥⲧⲟⲩ + ⲡⲓⲣⲉϥⲧⲟⲩ ⲛ̀ϧⲁⲉ + ⲡⲁⲓⲣⲉϥⲧⲟⲩ + ⲡⲓⲣⲉϥⲧⲟⲩ ⲉⲑⲛⲏⲟⲩ + + + ⲣⲉϥⲧⲟⲩ + + + ⲣⲉϥⲧⲟⲩ + + + ⲁⲃⲟⲧ + ⲡⲓⲁⲃⲟⲧ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲃⲟⲧ ⲫⲁⲓ + ⲡⲓⲁⲃⲟⲧ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲃⲟⲧ + ⲡⲓⲁⲃⲟⲧ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲃⲟⲧ ⲫⲁⲓ + ⲡⲓⲁⲃⲟⲧ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲃⲟⲧ + ⲡⲓⲁⲃⲟⲧ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲃⲟⲧ ⲫⲁⲓ + ⲡⲓⲁⲃⲟⲧ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲛϣⲁϣϥ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲛϣⲁϣϥ ⲫⲁⲓ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲛϣⲁϣϥ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲛϣⲁϣϥ ⲫⲁⲓ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲛϣⲁϣϥ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁⲛϣⲁϣϥ ⲫⲁⲓ + ⲡⲓⲁⲛϣⲁϣϥ ⲉⲑⲛⲏⲟⲩ + + + ⲁⲛϣⲁϣϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲁⲛϣⲁϣϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲁⲛϣⲁϣϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲉϩⲟⲟⲩ + ⲛ̀ⲥⲁϥ + ⲙ̀ⲫⲟⲟⲩ + ⲛ̀ⲣⲁⲥϯ + + + ⲉϩⲟⲟⲩ + ⲛ̀ⲥⲁϥ + ⲙ̀ⲫⲟⲟⲩ + ⲛ̀ⲣⲁⲥϯ + + + ⲉϩⲟⲟⲩ + ⲛ̀ⲥⲁϥ + ⲙ̀ⲫⲟⲟⲩ + ⲛ̀ⲣⲁⲥϯ + + + ⲉϩⲟⲟⲩ ⲛ̀ϯⲣⲟⲙⲡⲓ + + + ⲉϩⲟⲟⲩ ⲛ̀ϯⲣⲟⲙⲡⲓ + + + ⲉϩⲟⲟⲩ ⲛ̀ϯⲣⲟⲙⲡⲓ + + + ⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϣϥ + + + ⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϣϥ + + + ⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϣϥ + + + ⲛⲓⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲛⲓⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲛⲓⲉϩⲟⲟⲩ ⲙ̀ⲡⲓⲁⲛϣⲁϥ ⲙ̀ⲡⲓⲁⲃⲟⲧ + + + ⲡⲓⲟⲩⲁⲓ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲟⲩⲁⲓ ⲫⲁⲓ + ⲡⲓⲟⲩⲁⲓ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲁ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁ̅ ⲫⲁⲓ + ⲡⲓⲁ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲁ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲁ̅ ⲫⲁⲓ + ⲡⲓⲁ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲥ̀ⲛⲁⲩ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲥⲛⲁⲩ ⲫⲁⲓ + ⲡⲓⲥ̀ⲛⲁⲩ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲃ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲃ̅ ⲫⲁⲓ + ⲡⲓⲃ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲃ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲃ̅ ⲫⲁⲓ + ⲡⲓⲃ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓϣⲟⲙⲧ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓϣⲟⲙⲧ ⲫⲁⲓ + ⲡⲓϣⲟⲙⲧ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲅ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲅ̅ ⲫⲁⲓ + ⲡⲓⲅ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲅ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲅ̅ ⲫⲁⲓ + ⲡⲓⲅ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓϥ̀ⲧⲟⲩ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓϥ̀ⲧⲟⲩ ⲫⲁⲓ + ⲡⲓϥ̀ⲧⲟⲩ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲇ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲇ̅ ⲫⲁⲓ + ⲡⲓⲇ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲇ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲇ̅ ⲫⲁⲓ + ⲡⲓⲇ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲧ̀ⲓⲟⲩ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲧ̀ⲓⲟⲩ ⲫⲁⲓ + ⲡⲓⲧ̀ⲓⲟⲩ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲉ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲉ̅ ⲫⲁⲓ + ⲡⲓⲉ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲉ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲉ̅ ⲫⲁⲓ + ⲡⲓⲉ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲥⲟⲟⲩ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲥⲟⲟⲩ ⲫⲁⲓ + ⲡⲓⲥⲟⲟⲩ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲋ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲋ̅ ⲫⲁⲓ + ⲡⲓⲋ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲋ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲋ̅ ⲫⲁⲓ + ⲡⲓⲋ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓϣⲁϣϥ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓϣⲁϣϥ ⲫⲁⲓ + ⲡⲓϣⲁϣϥ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲍ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲍ̅ ⲫⲁⲓ + ⲡⲓⲍ̅ ⲉⲑⲛⲏⲟⲩ + + + ⲡⲓⲍ̅ ⲉⲧⲁϥⲥⲓⲛⲓ + ⲡⲁⲓⲍ̅ ⲫⲁⲓ + ⲡⲓⲍ̅ ⲉⲑⲛⲏⲟⲩ + + + ϧⲁϫⲉⲛ ⲙⲉⲣⲓ/ⲙⲉⲛⲉⲛⲥⲁ ⲙⲉⲣⲓ + + + ϧⲁϫⲉⲛ ⲙⲉⲣⲓ/ⲙⲉⲛⲉⲛⲥⲁ ⲙⲉⲣⲓ + + + ϧⲁϫⲉⲛ ⲙⲉⲣⲓ/ⲙⲉⲛⲉⲛⲥⲁ ⲙⲉⲣⲓ + + + ⲟⲩⲛⲟⲩ + ⲧⲁⲓⲟⲩⲛⲟⲩ ⲑⲁⲓ + + + ⲟⲩⲛⲟⲩ + + + ⲟⲩⲛⲟⲩ + + + ⲥⲟⲩⲥⲟⲩ + ⲡⲁⲓⲥⲟⲩⲥⲟⲩ ⲫⲁⲓ + + + ⲥⲟⲩⲥⲟⲩ + + + ⲥⲟⲩⲥⲟⲩ + + + ⲙⲁϩⲥ̀ⲛⲁⲩ + ϯⲛⲟⲩ + + + ⲙⲁϩⲥ̀ⲛⲁⲩ + + + ⲙⲁϩⲥ̀ⲛⲁⲩ + + + ϯⲍⲱⲛⲏ ⲙ̀ⲡⲓⲥⲏⲟⲩ + + + ϯⲍⲱⲛⲏ + + + ϯⲍⲱⲛⲏ + + + + ⲡ̀ⲥⲏⲟⲩ {0} + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ {0} + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ {0} + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲁⲑⲟⲗⲓⲕⲟⲛ + + + + ⲁⲧⲥⲱⲟⲩⲛ + + + ⲁⲛⲇⲟⲣⲣⲁ + + + ⲇⲟⲩⲃⲁⲓ + + + ⲕⲁⲃⲟⲩⲗ + + + ⲁⲛⲑⲓⲅⲁ + + + ⲁⲛⲅⲓⲗⲁ + + + ⲑⲓⲣⲁⲛⲁ + + + ⲓⲉⲣⲉⲃⲁⲛ + + + ⲗⲟⲩⲁⲛⲇⲁ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲣⲟⲑⲉⲣⲁ + + + ⲡⲁⲗⲙⲉⲣ ⲗⲁⲛⲇ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲑⲣⲟⲗⲗ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ϣⲟⲩⲁ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲙⲁⲩⲥⲟⲛ + + + ⲇⲁⲃⲓⲥ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲃⲟⲥⲑⲟⲕ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲕⲁⲍⲉⲓ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲇⲟⲩⲙⲟⲛⲧ ⲇⲟⲩⲣⲃⲓⲗ + + + ⲡⲓⲙⲁⲛ̀ⲟϩⲓ ⲛ̀ⲙⲕⲙⲟⲩⲣⲇⲟ + + + ⲣⲓⲟ ⲅⲁⲗⲗⲉⲅⲟⲥ + + + ⲙⲉⲛⲇⲟⲍⲁ + + + ⲥⲁⲛ ⲓⲟⲩⲁⲛ + + + ⲟⲩϣⲟⲩⲟⲩⲁⲓⲁ + + + ⲗⲁ ⲣⲓⲟϫⲁ + + + ⲥⲁⲛ ⲗⲟⲩⲓⲥ + + + ⲕⲁⲑⲁⲙⲁⲣⲕⲁ + + + ⲥⲁⲗⲑⲁ + + + ϫⲟⲩϫⲟⲩⲓ + + + ⲑⲟⲩⲕⲟⲩⲙⲁⲛ + + + ⲕⲟⲣⲇⲟⲃⲁ + + + ⲃⲟⲩⲉⲛⲟⲥ ⲁⲓⲣⲉⲥ + + + ⲡⲁⲅⲟ ⲡⲁⲅⲟ + + + ⲃⲓⲉⲛⲛⲁ + + + ⲡⲉⲣⲑ + + + ⲉⲩⲕⲗⲁ + + + ⲇⲁⲣⲟⲩⲓⲛ + + + ⲁⲇⲉⲗⲁⲓⲇ + + + ⲃⲣⲟⲕⲉⲛ ϩⲓⲗ + + + ⲙⲉⲗⲃⲟⲩⲣⲛ + + + ϩⲟⲃⲁⲣⲧ + + + ⲗⲓⲛⲇⲉⲙⲁⲛ + + + ⲥⲓⲇⲛⲉⲓ + + + ⲃⲣⲓⲥⲃⲁⲛ + + + ϯⲙⲟⲩⲓ ⲙ̀ⲙⲁⲕⲟⲩⲁⲣⲓ + + + ϯⲙⲟⲩⲓ ⲛ̀ⲗⲟⲣⲇ ϩⲟⲩⲉ + + + ⲁⲣⲟⲩⲃⲁ + + + ⲙⲁⲣⲓⲉϩⲁⲙⲛ + + + ⲃⲁⲕⲟⲩ + + + ⲥⲁⲣⲁⲓⲉⲃⲟ + + + ⲃⲁⲣⲃⲁⲇⲟⲥ + + + ⲇⲁⲕⲁ + + + ⲃⲣⲟⲩⲝⲉⲗ + + + ⲟⲩⲁⲅⲁⲇⲟⲩⲅⲟⲩ + + + ⲥⲟϥⲓⲁ + + + ⲃⲁϩⲣⲁⲓⲛ + + + ⲃⲟⲩϫⲟⲩⲙⲃⲟⲩⲣⲁ + + + ⲡⲟⲣⲑⲟ-ⲛⲟⲃⲟ + + + ⲥⲁⲛⲧ ⲃⲁⲣⲑⲉⲗⲉⲙⲓ + + + ⲃⲉⲣⲙⲟⲩⲇⲁ + + + ⲃⲣⲟⲩⲛⲉⲓ + + + ⲗⲁ ⲡⲁⲍ + + + ⲕⲣⲁⲗⲉⲛⲇⲓⲕ + + + ⲉⲓⲣⲟⲩⲛⲉⲡⲉ + + + ⲣⲓⲟ ⲃⲣⲁⲛⲕⲟ + + + ⲡⲟⲣⲑⲟ ⲃⲉⲗϩⲟ + + + ⲃⲟⲁ ⲃⲓⲥⲑⲁ + + + ⲙⲁⲛⲁⲩⲥ + + + ⲕⲟⲩⲓⲁⲃⲁ + + + ⲥⲁⲛⲑⲁⲣⲉⲙ + + + ⲕⲁⲙⲡⲟ ⲅⲣⲁⲛⲇⲉ + + + ⲃⲉⲗⲉⲙ + + + ⲁⲣⲁⲅⲟⲩⲁⲓⲛⲁ + + + ⲥⲁⲟ ⲡⲁⲩⲗⲟ + + + ⲃⲁϩⲓⲁ + + + ϥⲟⲣⲑⲁⲗⲉⲍⲁ + + + ⲙⲁⲥⲉⲓⲟ + + + ⲣⲉⲥⲓϥⲉ + + + ϥⲉⲣⲛⲁⲛⲇⲟ ⲇⲉ ⲛⲟⲣⲟⲛϩⲁ + + + ⲛⲁⲥⲥⲁⲩ + + + ⲑⲓⲙⲫⲟⲩ + + + ⲅⲁⲃⲟⲣⲟⲛ + + + ⲙⲓⲛⲥⲕ + + + ⲃⲉⲗⲓⲍⲉ + + + ⲇⲁⲩⲥⲟⲛ + + + ⲟⲩⲁⲓⲑϩⲱⲣⲥ + + + ⲓⲛⲟⲩⲃⲓⲕ + + + ⲃⲁⲛⲕⲟⲩⲃⲉⲣ + + + ϥⲟⲣⲧ ⲛⲉⲗⲥⲟⲛ + + + ⲇⲁⲩⲥⲟⲛ ⲕⲣⲓⲕ + + + ⲕⲣⲉⲥⲑⲟⲛ + + + ⲉⲇⲙⲟⲛⲑⲟⲛ + + + ⲥⲟⲩⲓϥⲧ ⲕⲁⲣⲉⲛⲧ + + + ⲧ̀ⲕⲟⲧⲥⲓ ⲛ̀ⲕⲁⲙⲃⲣⲓⲇϫ + + + ⲣⲉϫⲓⲛⲁ + + + ⲟⲩⲓⲛⲛⲓⲡⲉⲅ + + + ⲣⲉⲍⲟⲗⲟⲩⲑⲉ + + + ⲣⲁⲛⲕⲓⲛ ⲓⲛⲗⲉⲧ + + + ⲁⲑⲓⲕⲟⲕⲁⲛ + + + ⲑⲟⲣⲟⲛⲑⲟ + + + ⲓⲕⲁⲗⲟⲩⲓⲧ + + + ⲙⲟⲛⲕⲑⲟⲛ + + + ϩⲁⲗⲓϥⲁⲝ + + + ⲅⲟⲩⲥ ⲃⲁⲓ + + + ⲅⲗⲁⲥ ⲃⲁⲓ + + + ⲃⲗⲁⲛⲕ-ⲥⲁⲃⲗⲟⲛ + + + ⲥⲁⲛⲧ ϫⲟⲛⲍ + + + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲕⲟⲥ + + + ⲕⲓⲛϣⲁⲥⲁ + + + ⲗⲟⲩⲃⲟⲩⲙⲃⲁϣⲓ + + + ⲃⲁⲛⲅⲟⲩⲓ + + + ⲃⲣⲁⲍⲁⲃⲓⲗ + + + ⲍⲟⲩⲣⲓϧ + + + ⲁⲃⲓϫⲓⲁⲛ + + + ⲣⲁⲣⲟⲑⲟⲛⲅⲁ + + + ⲙⲟⲩⲓ ⲛ̀ⲓⲥⲑⲉⲣ + + + ⲕⲟⲩϩⲁⲓⲕ + + + ⲡⲟⲩⲛⲑⲁ ⲁⲣⲉⲛⲁⲥ + + + ⲥⲁⲛⲑⲓⲁⲅⲟ + + + ⲇⲟⲩⲁⲗⲁ + + + ⲟⲩⲣⲟⲩⲙⲕⲓ + + + ϣⲁⲛⲅⲁⲓ + + + ⲃⲟⲅⲟⲑⲁ + + + ⲕⲟⲥⲑⲁ ⲣⲓⲕⲁ + + + ϩⲁⲃⲁⲛⲁ + + + ⲕⲁⲡ ⲃⲉⲣⲇ + + + ⲕⲟⲩⲣⲁⲕⲁⲟ + + + ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲣⲓⲥⲧⲙⲁⲥ + + + ⲛⲓⲕⲟⲥⲓⲁ + + + ϥⲁⲙⲁⲅⲟⲩⲥⲑⲁ + + + ⲡⲣⲁⲅ + + + ⲃⲟⲩⲍⲓⲛⲅⲉⲛ + + + ⲃⲉⲣⲗⲓⲛ + + + ϫⲓⲃⲟⲩⲑⲓ + + + ⲕⲟⲡⲉⲛϩⲁⲅⲉⲛ + + + ⲇⲟⲙⲓⲛⲓⲕⲁ + + + ⲥⲁⲛⲑⲟ ⲇⲟⲙⲓⲛⲅⲟ + + + ⲁⲗϫⲓⲉⲣ + + + ⲙⲟⲩⲓ ⲛ̀ⲅⲁⲗⲁⲡⲁⲅⲟⲥ + + + ⲅⲟⲩⲁⲓⲁⲕⲓⲗ + + + ⲑⲁⲗⲗⲓⲛ + + + ⲕⲁϩⲓⲣⲁ + + + ⲉⲗ ⲁⲓⲟⲩⲛ + + + ⲁⲥⲙⲁⲣⲁ + + + ⲕⲁⲛⲁⲣⲓⲥ + + + ⲥⲉⲩⲑⲁ + + + ⲙⲁⲇⲣⲓⲇ + + + ⲁⲇⲓⲥ ⲁⲃⲁⲃⲁ + + + ϩⲉⲗⲥⲉⲛⲕⲓ + + + ϥⲓϫⲓ + + + ⲥⲑⲁⲛⲗⲓ + + + ϭⲟⲩⲕ + + + ⲡⲟⲛϩⲡⲉⲓ + + + ⲕⲟⲥⲣⲁⲉ + + + ϥⲁⲣⲟⲉⲥ + + + ⲡⲁⲣⲓⲥ + + + ⲗⲓⲃⲣⲉⲃⲓⲗ + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲙⲃⲣⲓⲑⲁⲛⲓⲁ + + ⲗⲟⲛⲇⲟⲛ + + + ⲅⲣⲉⲛⲁⲇⲁ + + + ⲑⲉⲃⲗⲓⲥⲓ + + + ⲕⲁⲓⲉⲛⲛⲉ + + + ⲅⲟⲩⲉⲣⲛⲥⲓ + + + ⲁⲕⲣⲁ + + + ϫⲓⲃⲣⲁⲗⲑⲁⲣ + + + ⲑⲟⲩⲗⲉ + + + ⲛⲟⲩⲟⲩⲕ + + + ⲓⲑⲟⲕⲟⲣⲧⲟⲣⲙⲓⲧ + + + ⲇⲁⲛⲙⲁⲣⲕϣⲁⲃⲛ + + + ⲃⲁⲛϫⲟⲩⲗ + + + ⲕⲟⲛⲁⲕⲣⲓ + + + ⲅⲟⲩⲁⲇⲉⲗⲟⲩⲡ + + + ⲙⲁⲗⲁⲃⲟ + + + ⲁⲑⲏⲛⲁⲥ + + + ⲅⲉⲟⲣⲅⲓⲁ ⲙ̀ⲙⲁⲣⲏⲥ + + + ⲅⲟⲩⲁⲑⲉⲙⲁⲗⲁ + + + ⲅⲟⲩⲁⲙ + + + ⲃⲓⲥⲥⲁⲩ + + + ⲅⲓⲁⲛⲁ + + + ϩⲟⲛⲅ ⲕⲟⲛⲅ + + + ⲑⲉⲅⲟⲩⲥⲓⲅⲁⲗⲡⲁ + + + ⲍⲁⲅⲣⲉⲃ + + + ⲡⲟⲣⲧ-ⲁⲩ-ⲡⲣⲓⲛⲥ + + + ⲃⲟⲩⲇⲁⲡⲉⲥⲧ + + + ϫⲁⲕⲁⲣⲑⲁ + + + ⲡⲟⲛⲑⲓⲁⲛⲁⲕ + + + ⲙⲁⲕⲁⲥⲥⲁⲣ + + + ϫⲁⲓⲁⲡⲟⲩⲣⲁ + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲓⲉⲣⲗⲁⲛⲇⲁ + + ⲇⲟⲩⲃⲗⲓⲛ + + + ⲓⲉⲣⲟⲩⲥⲁⲗⲏⲙ + + + ⲁⲓⲥⲉⲗ ⲛ̀ⲙⲁⲛ + + + ⲕⲁⲗⲕⲟⲑⲁ + + + ϣⲁⲅⲟⲥ + + + ⲃⲁⲅⲇⲁⲇ + + + ⲑⲉϩⲣⲁⲛ + + + ⲣⲉⲕⲓⲁⲃⲓⲕ + + + ⲣⲱⲙⲏ + + + ϫⲉⲣⲥⲓ + + + ϫⲁⲙⲁⲓⲕⲁ + + + ⲁⲙⲙⲁⲛ + + + ⲑⲟⲕⲓⲟ + + + ⲛⲁⲓⲣⲟⲃⲓ + + + ⲃⲓϣⲕⲉⲕ + + + ⲫⲛⲟⲙ ⲡⲉⲛϩ + + + ⲕⲁⲛⲑⲟⲛ + + + ⲕⲓⲣⲓⲑⲙⲁⲑⲓ + + + ⲑⲁⲣⲁⲟⲩⲁ + + + ⲕⲟⲙⲟⲣⲉⲥ + + + ⲥⲁⲛⲧ ⲕⲓⲑⲥ + + + ⲡⲓⲟⲛⲅⲓⲁⲛⲅ + + + ⲥⲉⲟⲩⲗ + + + ⲕⲟⲩⲁⲓⲧ + + + ⲕⲁⲓⲙⲁⲛ + + + ⲁⲕⲑⲁⲩ + + + ⲟⲣⲁⲗ + + + ⲁⲑⲓⲣⲁⲩ + + + ⲁⲕⲑⲟⲃ + + + ⲕⲟⲥⲑⲁⲛⲁⲩ + + + ⲕⲓⲍⲓⲗⲟⲣⲇⲁ + + + ⲁⲗⲙⲁⲑⲓ + + + ⲃⲓⲉⲛⲑⲓⲁⲛ + + + ⲃⲉⲓⲣⲟⲩⲧ + + + ⲥⲁⲛⲧ ⲗⲟⲩϭⲓⲁ + + + ⲃⲁⲇⲟⲩⲍ + + + ⲕⲟⲗⲟⲙⲃⲟ + + + ⲙⲟⲛⲣⲟⲃⲓⲁ + + + ⲙⲁⲥⲉⲣⲟⲩ + + + ⲃⲓⲗⲛⲓⲟⲩⲥ + + + ⲗⲟⲩⲝⲟⲙⲃⲟⲩⲣⲅ + + + ⲣⲓⲅⲁ + + + ⲑⲣⲓⲡⲟⲗⲓⲥ + + + ⲕⲁⲍⲁⲃⲗⲁⲛⲕⲁ + + + ⲙⲟⲛⲁⲕⲟ + + + ϭⲓⲍⲓⲛⲁⲩ + + + ⲡⲟⲇⲅⲟⲣⲓⲕⲁ + + + ⲙⲁⲣⲓⲅⲟⲧ + + + ⲁⲛⲑⲁⲛⲁⲛⲁⲣⲓⲃⲟ + + + ⲕⲟⲩⲁϫⲁⲗⲉⲓⲛ ⲁⲑⲟⲗⲗ + + + ⲙⲁϫⲟⲩⲣⲟ + + + ⲥⲕⲟⲡⲓⲉ + + + ⲃⲁⲙⲁⲕⲟ + + + ⲓⲁⲛⲅⲟⲛ + + + ϧⲟⲃⲇ + + + ⲟⲩⲗⲁⲛⲃⲁⲑⲁⲣ + + + ⲙⲁⲕⲁⲩ + + + ⲥⲁⲓⲡⲁⲛ + + + ⲙⲁⲣⲑⲓⲛⲓⲕ + + + ⲛⲟⲩⲁⲕϣⲟⲧ + + + ⲙⲟⲛⲑⲥⲉⲣⲁⲧ + + + ⲙⲁⲗⲑⲁ + + + ⲙⲁⲩⲣⲓⲑⲓⲟⲩⲥ + + + ⲙⲁⲗⲇⲓⲃ + + + ⲃⲗⲁⲛⲑⲓⲣ + + + ⲑⲓϫⲟⲩⲁⲛⲁ + + + ϩⲉⲣⲙⲟⲍⲓⲗⲗⲟ + + + ⲥⲓⲟⲩⲇⲁⲇ ⲓⲟⲩⲁⲣⲉⲍ + + + ⲙⲁⲍⲁⲑⲗⲁⲛ + + + ϣⲓϩⲟⲩⲁϩⲟⲩⲁ + + + ⲃⲁⲓⲁ ⲇⲉ ⲃⲁⲛⲇⲉⲣⲁⲥ + + + ⲟϫⲓⲛⲁⲅⲁ + + + ⲙⲟⲛⲑⲉⲣⲉⲓ + + + ⲙⲉⲝⲓⲕⲟ ⲡⲟⲗⲓⲥ + + + ⲙⲁⲑⲁⲙⲟⲣⲟⲥ + + + ⲙⲉⲣⲓⲇⲁ + + + ⲕⲁⲛⲕⲟⲩⲛ + + + ⲕⲟⲩⲁⲗⲁ ⲗⲟⲩⲙⲡⲟⲩⲣ + + + ⲕⲟⲩϭⲓⲛⲅ + + + ⲙⲁⲡⲟⲩⲑⲟ + + + ⲟⲩⲓⲛⲇϩⲟⲕ + + + ⲛⲟⲩⲙⲉⲁ + + + ⲛⲓⲁⲙⲉⲓ + + + ϯⲙⲟⲩⲓ ⲛⲛ̀ⲟⲣϥⲟⲗⲕ + + + ⲗⲁⲅⲟⲥ + + + ⲙⲁⲛⲁⲅⲟⲩⲁ + + + ⲁⲙⲥⲑⲉⲣⲇⲁⲙ + + + ⲟⲥⲗⲟ + + + ⲕⲁⲑⲙⲁⲛⲇⲟⲩ + + + ⲛⲁⲩⲣⲟⲩ + + + ⲛⲓⲟⲩⲉ + + + ⲛⲓⲙⲟⲩⲓ ⲛ̀ϭⲁⲑⲁⲙ + + + ⲁⲩⲕⲗⲁⲛⲇ + + + ⲙⲁⲥⲕⲁⲧ + + + ⲡⲁⲛⲁⲙⲁ + + + ⲗⲓⲙⲁ + + + ⲑⲁϩⲓⲑⲓ + + + ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲙⲁⲣⲕⲉⲥⲁⲥ + + + ⲅⲁⲙⲃⲓⲉⲣ + + + ⲡⲟⲣⲑ ⲙⲟⲣⲉⲥⲃⲓ + + + ⲃⲟⲩⲅⲁⲓⲛⲃⲓⲗ + + + ⲙⲁⲛⲓⲗⲁ + + + ⲕⲁⲣⲁϭⲓ + + + ⲟⲩⲁⲣⲥⲟ + + + ⲥⲁⲛ-ⲡⲓⲉⲣ + + + ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲡⲓⲑⲕⲉⲣⲛ + + + ⲡⲟⲩⲉⲣⲑⲟ ⲣⲓⲕⲟ + + + ⲅⲁⲍⲁ + + + ϩⲉⲃⲣⲟⲛ + + + ⲁⲍⲟⲣⲉⲥ + + + ⲙⲁⲇⲉⲓⲣⲁ + + + ⲗⲓϣⲃⲟⲛⲁ + + + ⲡⲁⲗⲁⲩ + + + ⲁⲥⲟⲩⲛⲥⲓⲟⲛ + + + ⲕⲁⲑⲁⲣ + + + ⲣⲉⲓⲟⲩⲛⲓⲟⲛ + + + ⲃⲟⲩϧⲁⲣⲉⲥⲧ + + + ⲃⲉⲗⲅⲣⲁⲇ + + + ⲕⲁⲗⲓⲛⲓⲛⲅⲣⲁⲇ + + + ⲙⲟⲥⲕⲟ + + + ⲃⲟⲗⲅⲟⲅⲣⲁⲇ + + + ⲥⲁⲣⲁⲑⲟⲃ + + + ⲁⲥⲑⲣⲁϧⲁⲛ + + + ⲟⲩⲗⲓⲁⲛⲟⲃⲥⲕ + + + ⲕⲓⲣⲟⲃ + + + ⲥⲁⲙⲁⲣⲁ + + + ⲓⲉⲕⲁⲑⲣⲓⲛⲃⲟⲩⲣⲅ + + + ⲟⲙⲥⲕ + + + ⲛⲟⲃⲟⲥⲓⲃⲓⲣⲥⲕ + + + ⲃⲁⲣⲛⲁⲩⲗ + + + ⲑⲟⲙⲥⲕ + + + ⲛⲟⲃⲟⲕⲟⲩⲍⲛⲉⲑⲥⲕ + + + ⲕⲣⲁⲥⲛⲟⲓⲁⲣⲥⲕ + + + ⲓⲣⲕⲟⲩⲑⲥⲕ + + + ϭⲓⲑⲁ + + + ⲓⲁⲕⲟⲩⲑⲥⲕ + + + ⲃⲗⲁⲇⲓⲃⲟⲥⲑⲟⲕ + + + ϧⲁⲛⲇⲓⲅⲁ + + + ⲥⲁϧⲁⲗⲓⲛ + + + ⲟⲩⲥⲧ-ⲛⲉⲣⲁ + + + ⲙⲁⲅⲁⲇⲁⲛ + + + ⲥⲣⲉⲇⲛⲉⲕⲟⲗⲓⲙⲥⲕ + + + ⲕⲁⲙϭⲁⲑⲕⲁ + + + ⲁⲛⲁⲇⲓⲣ + + + ⲕⲓⲅⲁⲗⲓ + + + ⲣⲓⲁⲇ + + + ⲅⲟⲩⲁⲇⲁⲗⲕⲁⲛⲁⲗ + + + ⲙⲁϩⲉ + + + ϧⲁⲣⲑⲟⲩⲙ + + + ⲥⲑⲟⲕϩⲟⲗⲙ + + + ⲥⲓⲛⲅⲁⲡⲟⲣ + + + ⲥⲁⲛⲧ ϩⲉⲗⲁⲛⲁ + + + ⲗϫⲟⲩⲃⲗϫⲁⲛⲁ + + + ⲗⲟⲛⲅⲓⲏⲣⲃⲁⲓⲉⲛ + + + ⲃⲣⲁⲑⲓⲥⲗⲁⲃⲁ + + + ϥⲣⲓⲑⲁⲩⲛ + + + ⲥⲁⲛ ⲙⲁⲣⲓⲛⲟ + + + ⲇⲁⲕⲁⲣ + + + ⲙⲟⲅⲁⲇⲓϣⲟ + + + ⲡⲁⲣⲁⲙⲁⲣⲓⲃⲟ + + + ϫⲟⲩⲃⲁ + + + ⲥⲁⲟ ⲑⲟⲙⲉ + + + ⲉⲗ ⲥⲁⲗⲃⲁⲇⲟⲣ + + + ⲗⲟⲩⲉⲣ ⲡⲣⲓⲛⲥ + + + ⲇⲁⲙⲁⲥⲕⲟⲥ + + + ⲙⲃⲁⲃⲁⲛ + + + ⲅⲣⲁⲛⲇ ⲑⲟⲩⲣⲕ + + + ⲛϫⲁⲙⲉⲛⲁ + + + ⲙⲟⲩⲓ ⲛ̀ⲕⲉⲣⲅⲉⲗⲉⲛ + + + ⲗⲟⲙⲉ + + + ⲃⲁⲛⲕⲟⲕ + + + ⲇⲟⲩϣⲁⲛⲃ + + + ϥⲁⲕⲁⲟϥⲟ + + + ⲇⲓⲗⲓ + + + ⲁϣⲅⲁⲃⲁⲧ + + + ⲑⲟⲩⲛⲓⲥ + + + ⲑⲟⲛⲅⲁⲑⲁⲡⲟⲩ + + + ⲓⲥⲑⲁⲙⲃⲟⲩⲗ + + + ⲡⲟⲣⲧ ⲛ̀ⲉⲥⲡⲁⲛⲓⲁ + + + ϥⲟⲩⲛⲁϥⲟⲩⲑⲓ + + + ⲑⲁⲓⲡⲉⲓ + + + ⲇⲁⲣ ⲉⲥ ⲥⲁⲗⲁⲙ + + + ⲕⲓⲉⲃ + + + ⲥⲓⲙϥⲉⲣⲟⲡⲟⲗ + + + ⲕⲁⲙⲡⲁⲗⲁ + + + ⲙⲓⲇⲟⲩⲁⲓ ⲁⲑⲟⲗⲗ + + + ϯⲙⲟⲩⲓ ⲛ̀ⲟⲩⲁⲕ + + + ⲁⲇⲁⲕ + + + ⲛⲟⲙⲉ + + + ⲁⲛⲕⲟⲣⲁϫ + + + ⲓⲁⲕⲟⲩⲑⲁⲧ + + + ⲥⲓⲑⲕⲁ + + + ϫⲟⲩⲛⲉⲁⲩ + + + ⲙⲉⲧⲗⲁⲕⲁⲗⲑⲁ + + + ⲗⲟⲥ ⲁⲅⲅⲉⲗⲉⲥ + + + ⲃⲟⲓⲍⲉ + + + ⲫⲓⲛⲓⲝ + + + ⲇⲉⲛⲃⲉⲣ + + + ⲃⲉⲩⲗⲁ, ⲇⲁⲕⲟⲑⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + + + ⲛⲓⲟⲩ ⲥⲁⲗⲉⲙ, ⲇⲁⲕⲟⲑⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + + + ⲥⲉⲛⲑⲉⲣ, ⲇⲁⲕⲟⲑⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + + + ϣⲓⲕⲁⲅⲟ + + + ⲙⲉⲛⲟⲙⲓⲛⲓ + + + ⲃⲓⲛⲥⲉⲛⲛⲉⲥ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲡⲉⲑⲉⲣⲥⲃⲟⲩⲣⲅ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲑⲉⲗ ⲥⲓⲑⲓ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲛⲟⲝ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲟⲩⲓⲛⲁⲙⲁⲕ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲙⲁⲣⲉⲛⲅⲟ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲓⲛⲇⲓⲁⲛⲁⲡⲟⲗⲓⲥ + + + ⲗⲟⲓⲥⲃⲓⲗ + + + ⲃⲉⲃⲉⲁⲓ, ⲓⲛⲇⲓⲁⲛⲁ + + + ⲙⲟⲛⲑⲓⲥⲉⲗⲗⲟ, ⲕⲉⲛⲧⲁⲕⲓ + + + ⲇⲉⲑⲣⲟⲓⲧ + + + ⲛⲓⲟⲩ ⲓⲟⲣⲕ + + + ⲙⲟⲛⲑⲉⲃⲓⲇⲉⲟ + + + ⲥⲁⲙⲁⲣⲕⲁⲛⲇ + + + ⲑⲁϣⲕⲉⲛⲧ + + + ⲃⲁⲑⲓⲕⲁⲛ + + + ⲥⲁⲛⲧ ⲃⲓⲛⲥⲉⲛⲧ + + + ⲕⲁⲣⲁⲕⲁⲥ + + + ⲑⲟⲣⲟⲗⲁ + + + ⲥⲁⲛⲧ ⲑⲟⲙⲁⲥ + + + ϩⲟ ϭⲓ ⲙⲓⲛϩ + + + ⲉϥⲁⲧ + + + ⲟⲩⲁⲗⲗⲓⲥ & ϥⲟⲩⲑⲟⲩⲛⲁ + + + ⲁⲡⲓⲁ + + + ⲁⲇⲁⲛ + + + ⲙⲁⲓⲟⲧ + + + ⲓⲟϩⲁⲛⲥⲃⲟⲩⲣⲅ + + + ⲗⲟⲩⲍⲁⲕⲁ + + + ϩⲁⲣⲁⲣⲉ + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁϥⲅⲁⲛⲓⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲛ̀̀ⲑⲙⲏϯ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲉⲓⲉⲃⲧ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟϩⲣⲟⲥ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲗⲁⲥⲕⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲗⲁⲥⲕⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲁⲗⲁⲥⲕⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲙⲁⲍⲟⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲙⲁⲍⲟⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲁⲙⲁⲍⲟⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲙⲏϯ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲑⲙⲏϯ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲑⲙⲏϯ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲓⲉⲃⲧ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲉⲓⲉⲃⲧ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲧⲱⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲓⲧⲱⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲓⲧⲱⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲁⲙⲟⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲥⲁⲙⲟⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲥⲁⲙⲟⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲣⲁⲃⲟⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲣⲁⲃⲟⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲁⲣⲁⲃⲟⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲣⲙⲉⲛⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲣⲙⲉⲛⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲁⲣⲙⲉⲛⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲑⲗⲁⲛⲑⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲑⲗⲁⲛⲑⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲁⲑⲗⲁⲛⲑⲓⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲁⲩⲥⲧⲣⲁⲗⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲍⲉⲣⲃⲁⲓϫⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲍⲉⲣⲃⲁⲓϫⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲁⲍⲉⲣⲃⲁⲓϫⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲍⲟⲣⲉⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲁⲍⲟⲣⲉⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲁⲍⲟⲣⲉⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲁⲛⲅⲗⲁⲇⲉϣ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲃⲁⲛⲅⲗⲁⲇⲉϣ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲃⲁⲛⲅⲗⲁⲇⲉϣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲟⲩⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲟⲗⲓⲃⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲣⲁⲍⲓⲗ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲃⲣⲁⲍⲓⲗ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲃⲣⲁⲍⲓⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲣⲟⲩⲛⲉⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲁⲡ ⲃⲉⲣⲇⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲕⲁⲡ ⲃⲉⲣⲇⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲕⲁⲡ ⲃⲉⲣⲇⲉ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϭⲁⲙⲟⲣⲟ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲁⲑⲁⲙ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϣⲁⲑⲁⲙ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ϣⲁⲑⲁⲙ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϭⲓⲗⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϭⲓⲗⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ϭⲓⲗⲉ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϭⲓⲛⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϭⲓⲛⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛⲧⲟⲟⲩⲓ ⲛ̀ϭⲓⲛⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲙⲟⲩⲓ ⲛ̀ⲭⲣⲓⲥⲧⲙⲁⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲕⲟⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲟⲗⲟⲙⲃⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲕⲟⲗⲟⲙⲃⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲕⲟⲗⲟⲙⲃⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲩⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲩⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲟⲩⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲉ ⲕⲟⲩⲃⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲧⲉ ⲕⲟⲩⲃⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲧⲉ ⲕⲟⲩⲃⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲇⲁⲩⲓⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲇⲟⲩⲣⲙⲟⲛⲧ ⲇⲟⲩⲣⲃⲓⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲓⲙⲟⲣ-ⲗⲉⲥⲧ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲥⲑⲉⲣ ⲁⲓⲥⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲥⲑⲉⲣ ⲁⲓⲥⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲓⲥⲑⲉⲣ ⲁⲓⲥⲗⲁⲛⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲉⲕⲟⲩⲁⲇⲟⲣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲉⲩⲣⲟⲡⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + + + + + ⲟⲩⲕⲉ ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + + + + + ⲡⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + ⲡⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲉⲩⲣⲟⲡⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϥⲓⲇϫⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϥⲓⲇϫⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ϥⲓⲇϫⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲅⲩⲁⲛⲁ ⲛ̀ϥⲉⲣⲉⲛⲥⲟⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϥⲉⲣⲉⲛⲥⲟⲥ ⲙ̀ⲡⲓⲣⲏⲥ & ⲁⲛⲧⲁⲣⲕⲑⲓⲕⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲅⲁⲗⲁⲡⲁⲅⲟⲥ + + + + + ̀ⲡⲥⲟⲏⲩ ⲛ̀ⲅⲁⲙⲃⲓⲉⲣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ϫⲓⲗⲃⲉⲣⲧ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲙⲏϯ ⲛ̀ⲅⲣⲓⲛⲓϭ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡϣⲱⲙ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + ̀ⲡⲥⲏⲟⲩ ⲙ̀̀ⲡϣⲱⲙ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲧⲉ ⲅⲣⲓⲛⲗⲁⲛⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲅⲟⲗϥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲅⲩⲁⲛⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϩⲁⲟⲩⲁⲓ-ⲁⲗⲉⲩⲑⲓⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲁⲟⲩⲁⲓ-ⲁⲗⲉⲩⲑⲓⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϩⲁⲟⲩⲁⲓ-ⲁⲗⲉⲩⲑⲓⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ϩⲁⲟⲩⲁⲓ-ⲁⲗⲉⲩⲑⲓⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲛⲅ ⲕⲟⲛⲅ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϩⲟⲛⲅ ⲕⲟⲛⲅ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ϩⲟⲛⲅ ⲕⲟⲛⲅ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϧⲟⲃⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϧⲟⲃⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ϧⲟⲃⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϩⲉⲛⲧⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲱⲕⲉⲁⲛⲟⲥ ⲛ̀ϩⲉⲛⲧⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲛⲇⲟϭⲓⲛⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀̀ⲑⲙⲏϯ ⲛ̀ⲓⲛⲇⲟⲛⲉⲥⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲓⲛⲇⲟⲛⲉⲥⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲓⲛⲇⲟⲛⲉⲥⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲣⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲣⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲓⲣⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲣⲕⲟⲩⲧⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲣⲕⲟⲩⲧⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲓⲣⲕⲟⲩⲧⲥⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲥⲣⲁⲏⲗ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲓⲥⲣⲁⲏⲗ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲡⲓⲥⲣⲁⲏⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲁⲡⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲁⲡⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲓⲁⲡⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲟⲣⲉⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲕⲟⲣⲉⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲕⲟⲣⲉⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲟⲥⲣⲁⲉ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲣⲁⲥⲛⲟⲓⲁⲣⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲕⲣⲁⲥⲛⲟⲓⲁⲣⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲕⲣⲁⲥⲛⲟⲓⲁⲣⲥⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲩⲣⲅⲩⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲗⲓⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲗⲟⲣⲇ ϩⲟⲩⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲗⲟⲣⲇ ϩⲟⲩⲉ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲗⲟⲣⲇ ϩⲟⲩⲉ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲅⲁⲇⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲙⲁⲅⲁⲇⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲙⲁⲅⲁⲇⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲗⲉⲍⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲗⲇⲓⲃ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲣⲕⲉⲥⲁⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲙⲁⲣϣⲁⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲩⲣⲓⲑⲓⲟⲩⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲙⲁⲩⲣⲓⲑⲓⲟⲩⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲙⲁⲩⲣⲓⲑⲓⲟⲩⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲁⲩⲥⲟⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲉⲝⲓⲕⲟ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲙⲉⲝⲓⲕⲟ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲙ̀ⲙⲉⲝⲓⲕⲟ ⲙ̀ⲡⲁⲥⲓϥⲓⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟⲩⲗⲁⲛⲃⲁⲧⲁⲣ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲟⲩⲗⲁⲛⲃⲁⲧⲁⲣ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲟⲩⲗⲁⲛⲃⲁⲧⲁⲣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲟⲥⲕⲟ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲙⲟⲥⲕⲟ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲙⲟⲥⲕⲟ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲓⲁⲛⲙⲁⲣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲁⲩⲣⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲉⲡⲁⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲟⲩⲕⲁⲗⲉⲇⲟⲛⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲓⲟⲩⲕⲁⲗⲉⲇⲟⲛⲓⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲛⲓⲟⲩⲕⲁⲗⲉⲇⲟⲛⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛⲛ̀ⲓⲟⲩϥⲁⲩⲛⲇⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛⲛ̀ⲓⲟⲩϥⲁⲩⲛⲇⲗⲁⲛⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛⲛ̀ⲓⲟⲩϥⲁⲩⲛⲇⲗⲁⲛⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲟⲩⲉ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲛⲟⲣϥⲟⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲛⲟⲣϥⲟⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲛⲟⲣϥⲟⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϥⲉⲣⲛⲁⲛⲇⲟ ⲇⲉ ⲛⲟⲣⲟⲛϩⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ϥⲉⲣⲛⲁⲛⲇⲟ ⲇⲉ ⲛⲟⲣⲟⲛϩⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ϥⲉⲣⲛⲁⲛⲇⲟ ⲇⲉ ⲛⲟⲣⲟⲛϩⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲟⲃⲟⲥⲓⲃⲓⲣⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲛⲟⲃⲟⲥⲓⲃⲓⲣⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲛⲟⲃⲟⲥⲓⲃⲓⲣⲥⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟⲙⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲟⲙⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲟⲙⲥⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲁⲕⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲁⲕⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲁⲕⲓⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲙⲡⲁⲗⲁⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲁⲡⲟⲩⲁ ⲛⲓⲟⲩⲅⲓⲛⲉⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲁⲣⲁⲅⲟⲩⲁⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲁⲣⲁⲅⲟⲩⲁⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲁⲣⲁⲅⲟⲩⲁⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲉⲣⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲡⲉⲣⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲡⲉⲣⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲫⲓⲗⲓⲡⲡⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲫⲓⲗⲓⲡⲡⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲫⲓⲗⲓⲡⲡⲓⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲙ̀ⲫⲓⲛⲓⲝ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲁⲛⲧ ⲡⲓⲉⲣ & ⲙⲓⲕⲉⲗⲟⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲥⲁⲛⲧ ⲡⲓⲉⲣ & ⲙⲓⲕⲉⲗⲟⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲥⲁⲛⲧ ⲡⲓⲉⲣ & ⲙⲓⲕⲉⲗⲟⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲑⲕⲁⲓⲣⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲟϩⲛⲡⲉⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲕⲟⲣⲉⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲣⲉⲓⲟⲩⲛⲓⲟⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲣⲟⲑⲉⲣⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲁϧⲁⲗⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲥⲁϧⲁⲗⲓⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲥⲁϧⲁⲗⲓⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲁⲙⲟⲣⲁ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲥⲁⲙⲟⲣⲁ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲥⲁⲙⲟⲣⲁ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲩϣⲉⲗ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲥⲓⲛⲅⲁⲡⲟⲣ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲥⲟⲗⲟⲙⲟⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲣⲏⲥ ⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲟⲩⲣⲓⲛⲁⲙ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲥⲩⲟⲩⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲁϩⲓⲑⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲁⲓⲟⲩⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲑⲁⲓⲟⲩⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲧⲟⲟⲩⲓ ⲛ̀ⲑⲁⲓⲟⲩⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲁϫⲓⲕⲓⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲟⲕⲉⲗⲁⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲟⲛⲅⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲑⲟⲛⲅⲁ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲑⲟⲛⲅⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϭⲟⲩⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲟⲩⲣⲕⲙⲉⲛⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲑⲟⲩⲣⲕⲙⲉⲛⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲑⲟⲩⲣⲕⲙⲉⲛⲓⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲑⲟⲩⲃⲁⲗⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟⲩⲣⲟⲩⲅⲩⲟⲁⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲟⲩⲣⲟⲩⲅⲟⲩⲁⲓ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲟⲩⲣⲟⲩⲅⲟⲩⲁⲓ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲁⲛⲁⲑⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲃⲁⲛⲁⲑⲟⲩ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲃⲁⲛⲁⲑⲟⲩ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲉⲛⲉⲍⲟⲩⲉⲗⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲗⲁⲇⲓⲃⲟⲥⲑⲟⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲃⲗⲁⲇⲓⲃⲟⲥⲑⲟⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲃⲗⲁⲇⲓⲃⲟⲥⲑⲟⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲃⲟⲗⲅⲟⲅⲣⲁⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲙ̀ⲃⲟⲗⲅⲟⲅⲣⲁⲇ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲙ̀ⲃⲟⲗⲅⲟⲅⲣⲁⲇ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲃⲟⲥⲑⲟⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲙ̀ⲡⲓⲙⲟⲩⲓ ⲛ̀ⲟⲩⲁⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲟⲩⲁⲗⲓⲥ & ϥⲟⲩⲑⲟⲩⲛⲁ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲁⲕⲟⲩⲧⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲁⲕⲟⲩⲧⲥⲕ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲓⲁⲕⲟⲩⲧⲥⲕ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲉⲕⲁⲑⲉⲣⲓⲛⲃⲟⲩⲣⲅ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϩⲟⲣⲟⲥ ⲛ̀ⲓⲉⲕⲁⲑⲉⲣⲓⲛⲃⲟⲩⲣⲅ + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ϣⲱⲙ ⲛ̀ⲓⲉⲕⲁⲑⲉⲣⲓⲛⲃⲟⲩⲣⲅ + + + + + ⲡ̀ⲥⲏⲟⲩ ⲛ̀ⲓⲟⲩⲕⲟⲛ + + + + + + + + ⲡⲓⲇⲉⲣϩⲁⲙ ⲛ̀ⲧⲉ ⲛⲓⲉⲙⲁⲣⲁⲧ ⲛ̀ⲁⲣⲁⲃⲟⲥ ⲉⲧϩⲱⲧⲡ + nⲓⲇⲉⲣϩⲁⲙ ⲛ̀ⲧⲉ ⲛⲓⲉⲙⲁⲣⲁⲧ ⲛ̀ⲁⲣⲁⲃⲟⲥ ⲉⲧϩⲱⲧⲡ + + + ⲡⲓⲁϥⲅⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲁϥⲅⲁⲛⲓⲥⲑⲁⲛ + ⲛⲓⲁϥⲅⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲁϥⲅⲁⲛⲓⲥⲑⲁⲛ + + + ⲡⲓⲗⲉⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲗⲃⲁⲛⲓⲁ + ⲡⲓⲗⲉⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲗⲃⲁⲛⲓⲁ + + + ⲡⲓⲇⲣⲁⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣⲙⲉⲛⲓⲁ + ⲛⲓⲇⲣⲁⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣⲙⲉⲛⲓⲁ + + + ⲡⲓⲅⲓⲗⲇⲉⲣ ⲛ̀ⲣⲉⲙⲛ̀ϩⲟⲗⲁⲛⲇⲁ ⲁⲛⲑⲓⲗⲉⲁ + ⲛⲓⲅⲓⲗⲇⲉⲣ ⲛ̀ⲣⲉⲙⲛ̀ϩⲟⲗⲁⲛⲇⲁ ⲁⲛⲑⲓⲗⲉⲁ + + + ⲡⲓⲕⲟⲩⲁⲛⲍⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲛⲅⲟⲗⲁ + ⲛⲓⲕⲟⲩⲁⲛⲍⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲛⲅⲟⲗⲁ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣϫⲉⲛⲑⲓⲛ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲩⲥⲑⲧⲣⲁⲗⲓⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲩⲥⲑⲧⲣⲁⲗⲓⲁ + + + ⲡⲓϥⲗⲟⲣⲓⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣⲟⲩⲃⲁ + ⲛⲓϥⲗⲟⲣⲓⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲣⲟⲩⲃⲁ + + + ⲡⲓⲙⲁⲛⲁⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲍⲉⲣⲃⲁⲓϫⲁⲛ + ⲛⲓⲙⲁⲛⲁⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲍⲉⲣⲃⲁⲓϫⲁⲛ + + + ⲡⲓⲙⲁⲣⲕ ⲛ̀ⲧⲉ ⲃⲟⲥⲛⲓⲁ-ϩⲉⲣⲍⲉⲅⲟⲃⲓⲛⲁ + ⲛⲓⲙⲁⲣⲕ ⲛ̀ⲧⲉ ⲃⲟⲥⲛⲓⲁ-ϩⲉⲣⲍⲉⲅⲟⲃⲓⲛⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁⲣⲃⲁⲇⲓⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁⲣⲃⲁⲇⲓⲁ + + + ⲡⲓⲑⲁⲕⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁⲛⲅⲗⲁⲇⲉϣ + ⲛⲓⲑⲁⲕⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁⲛⲅⲗⲁⲇⲉϣ + + + ⲡⲓⲗⲉⲃ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲗⲅⲁⲣⲓⲁ + ⲡⲓⲗⲉⲃ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲗⲅⲁⲣⲓⲁ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁϩⲣⲁⲓⲛ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁϩⲣⲁⲓⲛ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲣⲟⲩⲛⲇⲓ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲣⲟⲩⲛⲇⲓ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲣⲙⲟⲩⲇⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲣⲙⲟⲩⲇⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲃⲣⲟⲩⲛⲉⲓ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲃⲣⲟⲩⲛⲉⲓ + + + ⲡⲓⲃⲟⲗⲓⲃⲓⲁⲛⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲗⲓⲃⲓⲁ + ⲛⲓⲃⲟⲗⲓⲃⲓⲁⲛⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲗⲓⲃⲓⲁ + + + ⲡⲓⲣⲉⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲣⲁⲍⲓⲗ + ⲛⲓⲣⲉⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲣⲁⲍⲓⲗ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁϩⲁⲙⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲁϩⲁⲙⲁ + + + ⲡⲓⲛⲅⲟⲩⲗⲑⲣⲟⲩⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲑⲁⲛⲁ + ⲛⲓⲛⲅⲟⲩⲗⲑⲣⲟⲩⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲩⲑⲁⲛⲁ + + + ⲡⲓⲡⲟⲩⲗⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲑⲥⲟⲩⲁⲛⲁ + ⲛⲓⲡⲟⲩⲗⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲟⲑⲥⲟⲩⲁⲛⲁ + + + ⲡⲓⲣⲟⲩⲃⲉⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲗⲁⲣⲟⲩⲥ + ⲛⲓⲣⲟⲩⲃⲉⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲗⲁⲣⲟⲩⲥ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲙ̀ⲃⲉⲗⲓⲍⲉ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲙ̀ⲃⲉⲗⲓⲍⲉ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲛⲁⲇⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲛⲁⲇⲁ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲛⲅⲟ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲛⲅⲟ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲓⲥⲣⲁ + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲓⲥⲣⲁ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲗⲉ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲗⲉ + + + ⲡⲓⲓⲟⲩⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + ⲡⲓⲓⲟⲩⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + + + ⲡⲓⲓⲟⲩⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + ⲡⲓⲓⲟⲩⲁⲛ ⲛ̀ⲣⲉⲙⲛ̀ϭⲓⲛⲁ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲗⲟⲙⲃⲓⲁ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲗⲟⲙⲃⲓⲁ + + + ⲡⲓⲕⲟⲗⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲥⲑⲁⲣⲓⲕⲁ + ⲛⲓⲕⲟⲗⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲥⲑⲁⲣⲓⲕⲁ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲃⲁ ̀ⲛⲣⲉϥϣⲓⲃϯ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲃⲁ ̀ⲛⲣⲉϥϣⲓⲃϯ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲃⲁ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲃⲁ + + + ⲡⲓⲉⲥⲕⲟⲩⲇⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲡⲃⲉⲣⲇⲉ + ⲛⲓⲉⲥⲕⲟⲩⲇⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲡⲃⲉⲣⲇⲉ + + + ⲡⲓⲕⲟⲣⲟⲩⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ϭⲉⲕ + ⲛⲓⲕⲟⲣⲟⲩⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ϭⲉⲕ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲉⲣⲉⲙⲛ̀ⲇϫⲓⲃⲟⲩⲑⲓ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ⲉⲣⲉⲙⲛ̀ⲇϫⲓⲃⲟⲩⲑⲓ + + + ⲡⲓⲕⲣⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲇⲁⲛⲙⲁⲣⲕ + ⲡⲓⲕⲣⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲇⲁⲛⲙⲁⲣⲕ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲇⲟⲙⲓⲛⲓⲕⲁⲛ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲇⲟⲙⲓⲛⲓⲕⲁⲛ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲗϫⲉⲣⲓⲁ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲗϫⲉⲣⲓⲁ + + + ⲡⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲭⲏⲙⲓ + ⲛⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲭⲏⲙⲓ + + + ⲡⲓⲛⲁⲕϥⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲣⲓⲑⲣⲓⲁ + ⲛⲓⲛⲁⲕϥⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲣⲓⲑⲣⲓⲁ + + + ⲡⲓⲃⲓⲣⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ + ⲛⲓⲃⲓⲣⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲉⲑⲁⲩϣ + + + ⲉⲩⲣⲟ + ⲉⲩⲣⲟ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ϥⲓⲇϫⲓ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ϥⲓⲇϫⲓ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲛⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲛⲙⲟⲩⲓ ⲛ̀ϥⲟⲕⲗⲁⲛⲇ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲣⲓⲑⲁⲛⲓⲁ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲣⲓⲑⲁⲛⲓⲁ + + + ⲡⲓⲗⲁⲣⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + ⲛⲓⲗⲁⲣⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲉⲟⲣⲅⲓⲁ + + + ⲡⲓⲥⲉⲇⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲁⲛⲁ + ⲛⲓⲥⲉⲇⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲁⲛⲁ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲅⲓⲃⲣⲁⲗⲑⲁⲣ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲅⲓⲃⲣⲁⲗⲑⲁⲣ + + + ⲡⲓⲇⲁⲗⲁⲥⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲁⲙⲃⲓⲁ + ⲛⲓⲇⲁⲗⲁⲥⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲁⲙⲃⲓⲁ + + + ⲡⲓⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲓⲛⲉⲁ + ⲛⲓⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲓⲛⲉⲁ + + + ⲡⲓⲕⲉⲑⲍⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲟⲩⲁⲑⲉⲙⲁⲗⲁ + ⲛⲓⲕⲉⲑⲍⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲟⲩⲁⲑⲉⲙⲁⲗⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲩⲁⲛⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲅⲩⲁⲛⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ϩⲟⲛⲅ ⲕⲟⲛⲅ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ϩⲟⲛⲅ ⲕⲟⲛⲅ + + + ⲡⲓⲗⲉⲙⲡⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ϩⲟⲛⲇⲟⲩⲣⲁ + ⲛⲓⲗⲉⲙⲡⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ϩⲟⲛⲇⲟⲩⲣⲁ + + + ⲡⲓⲕⲟⲩⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲣⲟⲩⲁⲑⲓⲁ + ⲛⲓⲕⲟⲩⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲣⲟⲩⲁⲑⲓⲁ + + + ⲡⲓⲅⲟⲩⲣⲇ ⲛ̀ⲣⲉⲙⲛ̀ϩⲁⲓⲑⲓ + ⲛⲓⲅⲟⲩⲣⲇ ⲛ̀ⲣⲉⲙⲛ̀ϩⲁⲓⲑⲓ + + + ⲡⲓϥⲟⲣⲓⲛⲧ ⲛ̀ⲣⲉⲙⲛ̀ϩⲁⲛⲅⲁⲣⲓⲁ + ⲛⲓϥⲟⲣⲓⲛⲧ ⲛ̀ⲣⲉⲙⲛ̀ϩⲁⲛⲅⲁⲣⲓⲁ + + + ⲡⲓⲣⲟⲩⲡⲓⲁϩ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲛⲇⲟⲛⲉⲥⲓⲁ + ⲛⲓⲣⲟⲩⲡⲓⲁϩ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲛⲇⲟⲛⲉⲥⲓⲁ + + + ⲡⲓϣⲉⲕⲉⲗ ⲙ̀ⲃⲉⲣⲓ ⲙ̀ⲡⲓⲥⲣⲁⲏⲗ + ⲛⲓϣⲉⲕⲉⲗ ⲙ̀ⲃⲉⲣⲓ ⲙ̀ⲡⲓⲥⲣⲁⲏⲗ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙ̀ⲛ̀ϩⲉⲛⲧⲟⲩ + ⲛⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙ̀ⲛ̀ϩⲉⲛⲧⲟⲩ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲣⲁⲕ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲣⲁⲕ + + + ⲡⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲣⲁⲛ + ⲛⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲣⲁⲛ + + + ⲡⲓⲕⲣⲟⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲓⲥⲗⲁⲛⲇⲁ + ⲡⲓⲕⲣⲟⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲁⲓⲥⲗⲁⲛⲇⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ϫⲁⲙⲁⲓⲕⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ϫⲁⲙⲁⲓⲕⲁ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲟⲣⲇⲁⲛⲏⲥ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲟⲣⲇⲁⲛⲏⲥ + + + ⲡⲓⲓⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲁⲡⲁⲛ + ⲡⲓⲓⲉⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲁⲡⲁⲛ + + + ⲡⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲉⲛⲓⲁ + ⲛⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲉⲛⲓⲁ + + + ⲡⲓⲥⲟⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲩⲣⲅⲩⲥⲑⲁⲛ + ⲛⲓⲥⲟⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲩⲣⲅⲩⲥⲑⲁⲛ + + + ⲡⲓⲣⲓⲉⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲙⲃⲟⲩⲇⲓⲁ + ⲛⲓⲣⲓⲉⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲙⲃⲟⲩⲇⲓⲁ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲙⲟⲣⲓ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲙⲟⲣⲓ + + + ⲡⲓⲟⲩⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲣⲉⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + ⲡⲓⲟⲩⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲣⲉⲁ ⲙ̀ⲡⲉⲙϩⲓⲧ + + + ⲡⲓⲟⲩⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲣⲉⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ⲡⲓⲟⲩⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲣⲉⲁ ⲙ̀ⲡⲓⲣⲏⲥ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲁⲓⲧ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲟⲩⲁⲓⲧ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲁⲓⲙⲁⲛ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲕⲁⲓⲙⲁⲛ + + + ⲡⲓⲑⲉⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + ⲛⲓⲑⲉⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲍⲁϧⲉⲥⲑⲁⲛ + + + ⲡⲓⲕⲓⲡ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲁⲟ + ⲛⲓⲕⲓⲡ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲁⲟ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲓⲃⲁⲛⲟⲛ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲓⲃⲁⲛⲟⲛ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲣⲓⲗⲁⲛⲕⲁ + ⲛⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲣⲓⲗⲁⲛⲕⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲁⲓⲃⲉⲣⲓⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲁⲓⲃⲉⲣⲓⲁ + + + ⲡⲓⲗⲓⲗⲁⲛⲅⲉⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲁⲍⲓ + ⲛⲓⲗⲓⲗⲁⲛⲅⲉⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲁⲍⲓ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲓⲃⲓⲁ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲗⲓⲃⲓⲁ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲣⲁⲕⲉϣ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲣⲁⲕⲉϣ + + + ⲡⲓⲗⲉⲩ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲟⲗⲇⲟⲃⲁ + ⲡⲓⲗⲉⲩ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲟⲗⲇⲟⲃⲁ + + + ⲡⲓⲁⲣⲓⲁⲣⲓ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲁⲅⲁⲥ + ⲛⲓⲁⲣⲓⲁⲣⲓ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲁⲅⲁⲥ + + + ⲡⲓⲇⲉⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲕⲉⲇⲟⲛⲓⲁ + ⲡⲓⲇⲉⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲕⲉⲇⲟⲛⲓⲁ + + + ⲡⲓⲕⲩⲁⲧ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲩⲁⲛⲙⲁⲣ + ⲛⲓⲕⲩⲁⲧ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲩⲁⲛⲙⲁⲣ + + + ⲡⲓⲑⲟⲩⲅⲣⲓⲕ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲟⲛⲅⲟⲗⲓⲁ + ⲛⲓⲑⲟⲩⲅⲣⲓⲕ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲟⲛⲅⲟⲗⲓⲁ + + + ⲡⲓⲡⲁⲑⲁⲕⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲕⲁⲛⲓ + ⲛⲓⲡⲁⲑⲁⲕⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲕⲁⲛⲓ + + + ⲡⲓⲟⲩⲅⲟⲩⲓⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲩⲣⲓⲑⲁⲛⲓⲁ + ⲛⲓⲟⲩⲅⲟⲩⲓⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲩⲣⲓⲑⲁⲛⲓⲁ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲩⲣⲓⲑⲓⲟⲩⲥ + ⲛⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲩⲣⲓⲑⲓⲟⲩⲥ + + + ⲡⲓⲣⲟⲩϥⲓⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲇⲓⲃ + ⲛⲓⲣⲟⲩϥⲓⲁ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲇⲓⲃ + + + ⲡⲓⲕⲟⲩⲁϭⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲙⲁⲗⲁⲩⲓ + ⲛⲓⲕⲟⲩⲁϭⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲙⲁⲗⲁⲩⲓ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲙⲉⲝⲓⲕⲟ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲙⲉⲝⲓⲕⲟ + + + ⲡⲓⲣⲓⲛⲅⲓⲧ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲉⲍⲓⲁ + ⲛⲓⲣⲓⲛⲅⲓⲧ ⲛ̀ⲣⲉⲙⲛⲙ̀ⲁⲗⲉⲍⲓⲁ + + + ⲡⲓⲙⲉⲑⲓⲕⲁⲗ ⲛ̀ⲣⲉⲛⲙ̀ⲟⲍⲁⲙⲃⲓⲕ + ⲛⲓⲙⲉⲑⲓⲕⲁⲗ ⲛ̀ⲣⲉⲛⲙ̀ⲟⲍⲁⲙⲃⲓⲕ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲁⲙⲓⲃⲓⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲁⲙⲓⲃⲓⲁ + + + ⲡⲓⲛⲁⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲁⲓⲅⲉⲣⲓⲁ + ⲛⲓⲛⲁⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲁⲓⲅⲉⲣⲓⲁ + + + ⲡⲓⲕⲟⲣⲇⲟⲃⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲓⲕⲁⲣⲁⲅⲟⲩⲁ + ⲛⲓⲕⲟⲣⲇⲟⲃⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲓⲕⲁⲣⲁⲅⲟⲩⲁ + + + ⲡⲓⲕⲣⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲟⲣⲟⲩⲓⲅ + ⲡⲓⲕⲣⲟⲛ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲟⲣⲟⲩⲓⲅ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲉⲡⲁⲗ + ⲛⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲉⲡⲁⲗ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲛⲓⲟⲩⲍⲓⲗⲁⲛⲇⲁ + + + ⲡⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲙⲁⲛ + ⲛⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲙⲁⲛ + + + ⲡⲓⲃⲁⲗⲃⲟⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲛⲁⲙⲁ + ⲛⲓⲃⲁⲗⲃⲟⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲛⲁⲙⲁ + + + ⲡⲓⲅⲟⲩⲁⲣⲁⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲣⲁⲅⲟⲩⲁⲓ + ⲛⲓⲅⲟⲩⲁⲣⲁⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲣⲁⲅⲟⲩⲁⲓ + + + ⲡⲓⲕⲓⲛⲁ ⲛ̀ⲧⲉ ⲡⲁⲡⲟⲩⲁ ⲛⲓⲟⲩ ⲅⲓⲛⲉⲁ + ⲛⲓⲕⲓⲛⲁ ⲛ̀ⲧⲉ ⲡⲁⲡⲟⲩⲁ ⲛⲓⲟⲩ ⲅⲓⲛⲉⲁ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲫⲓⲗⲓⲡⲡⲓⲛ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲫⲓⲗⲓⲡⲡⲓⲛ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲕⲓⲥⲑⲁⲛ + ⲛⲓⲣⲟⲩⲡⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲁⲕⲓⲥⲑⲁⲛ + + + ⲡⲓⲍⲗⲟⲑⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲟⲗⲁⲛⲇⲁ + ⲛⲓⲍⲗⲟⲑⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲟⲗⲁⲛⲇⲁ + + + ⲡⲓⲥⲟⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲉⲣⲟⲩ + ⲛⲓⲥⲟⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲡⲉⲣⲟⲩ + + + ⲡⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲑⲁⲣ + ⲛⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲑⲁⲣ + + + ⲡⲓⲗⲉⲩ ⲛ̀ⲣⲉⲙⲛ̀ⲣⲟⲙⲁⲛⲓⲁ + ⲡⲓⲗⲉⲩ ⲛ̀ⲣⲉⲙⲛ̀ⲣⲟⲙⲁⲛⲓⲁ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲉⲣⲃⲓⲁ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲉⲣⲃⲓⲁ + + + ⲡⲓⲣⲟⲩⲃⲉⲗ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲣⲟⲩⲥⲓⲁ + ⲛⲓⲣⲟⲩⲃⲉⲗ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲣⲟⲩⲥⲓⲁ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲣⲟⲩⲁⲛⲇⲁ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ⲣⲉⲙⲛ̀ⲣⲟⲩⲁⲛⲇⲁ + + + ⲡⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲁⲟⲩⲇⲓ + ⲛⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲁⲟⲩⲇⲓ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲥⲟⲗⲟⲙⲟⲛ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲛⲓⲙⲟⲩⲓ ⲛ̀ⲥⲟⲗⲟⲙⲟⲛ + + + ⲡⲓⲣⲟⲩⲡⲓ ⲣ̀ⲉⲙⲛ̀ⲥⲓϣⲉⲗ + ⲛⲓⲣⲟⲩⲡⲓ ⲣ̀ⲉⲙⲛ̀ⲥⲓϣⲉⲗ + + + ⲡⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲇⲁⲛ + ⲛⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲇⲁⲛ + + + ⲡⲓⲕⲣⲟⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲓⲇ + ⲡⲓⲕⲣⲟⲛⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲓⲇ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲓⲛⲅⲁⲡⲟⲣ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲓⲛⲅⲁⲡⲟⲣ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲧⲉ ⲥⲁⲛⲧ ϩⲉⲗⲉⲛⲁ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲧⲉ ⲥⲁⲛⲧ ϩⲉⲗⲉⲛⲁ + + + ⲡⲓⲗⲉⲟⲛ ⲛ̀ⲧⲉ ⲥⲓⲉⲣⲁⲗⲉⲟⲛ + ⲛⲓⲗⲉⲟⲛ ⲛ̀ⲧⲉ ⲥⲓⲉⲣⲁⲗⲉⲟⲛ + + + ⲡⲓⲗⲉⲟⲛ ⲛ̀ⲧⲉ ⲥⲓⲉⲣⲁⲗⲉⲟⲛ (1964—2022) + ⲛⲓⲗⲉⲟⲛ ⲛ̀ⲧⲉ ⲥⲓⲉⲣⲁⲗⲉⲟⲛ (1964—2022) + + + ⲡⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲙⲁⲗⲓⲁ + ⲛⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲙⲁⲗⲓⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲣⲓⲛⲁⲙ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲣⲓⲛⲁⲙ + + + ⲡⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲇⲁⲛ ⲙ̀ⲡⲓⲣⲏⲥ + ⲛⲓⲅⲉⲛⲉϩ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲇⲁⲛ ⲙ̀ⲡⲓⲣⲏⲥ + + + ⲡⲓⲇⲟⲃⲣⲁ ⲛ̀ⲧⲉ ⲥⲁⲟ ⲑⲟⲙⲉ & ⲡⲣⲓⲛⲥⲓⲡ ⲇⲟⲃⲣⲁ + ⲛⲓⲇⲟⲃⲣⲁ ⲛ̀ⲧⲉ ⲥⲁⲟ ⲑⲟⲙⲉ & ⲡⲣⲓⲛⲥⲓⲡ ⲇⲟⲃⲣⲁ + + + ⲡⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲁⲥⲥⲩⲣⲟⲥ + ⲛⲓⲡⲁⲩⲛⲇ ⲛ̀ⲣⲉⲙ̀ⲛ̀ⲁⲥⲥⲩⲣⲟⲥ + + + ⲡⲓⲗⲓⲗⲁⲛⲅⲉⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲁⲍⲓ + ⲡⲓⲉ̀ⲙⲁⲗⲁⲛⲅⲉⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲟⲩⲁⲍⲓ + + + ⲡⲓⲃⲁϩⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁⲓⲗⲁⲛⲇ + ⲡⲓⲃⲁϩⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁⲓⲗⲁⲛⲇ + + + ⲡⲓⲥⲟⲙⲟⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁϫⲓⲕⲓⲥⲑⲁⲛ + ⲛⲓⲥⲟⲙⲟⲛⲓ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁϫⲓⲕⲓⲥⲑⲁⲛ + + + ⲡⲓⲙⲁⲛⲁⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲣⲕⲙⲉⲛⲓⲥⲑⲁⲛ + ⲡⲓⲙⲁⲛⲁⲧ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲣⲕⲙⲉⲛⲓⲥⲑⲁⲛ + + + ⲡⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲛⲓⲥ + ⲛⲓⲇⲓⲛⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲛⲓⲥ + + + ⲡⲓⲡⲁʻⲁⲛⲅⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲛⲅⲁ + ⲡⲓⲡⲁʻⲁⲛⲅⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲛⲅⲁ + + + ⲡⲓⲗⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲣⲕⲓⲁ + ⲡⲓⲗⲓⲣⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲟⲩⲣⲕⲓⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲑⲣⲓⲛⲓⲇⲁⲇ & ⲑⲟⲃⲁⲅⲟ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲑⲣⲓⲛⲓⲇⲁⲇ & ⲑⲟⲃⲁⲅⲟ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲛⲓⲟⲩ ⲑⲁⲓⲟⲩⲁⲛ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲧⲉ ⲛⲓⲟⲩ ⲑⲁⲓⲟⲩⲁⲛ + + + ⲡⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁⲛⲍⲁⲛⲓⲁ + ⲛⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲑⲁⲛⲍⲁⲛⲓⲁ + + + ⲡⲓϩⲣⲩⲃⲛⲓⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲕⲣⲁⲛⲓⲁ + ⲛⲓϩⲣⲩⲃⲛⲓⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲕⲣⲁⲛⲓⲁ + + + ⲡⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲅⲁⲛⲇⲁ + ⲛⲓϣⲓⲗⲓⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲅⲁⲛⲇⲁ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲛ̀ⲁⲙⲉⲣⲓⲕⲁⲛⲟⲥ + + + ⲡⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲣⲟⲩⲅⲟⲩⲁⲓ + ⲛⲓⲡⲉⲥⲟ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲣⲟⲩⲅⲟⲩⲁⲓ + + + ⲡⲓⲥⲟⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + ⲡⲓⲥⲟⲙ ⲛ̀ⲣⲉⲙⲛ̀ⲟⲩⲍⲃⲉⲕⲓⲥⲑⲁⲛ + + + ⲡⲓⲃⲟⲗⲓⲃⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲛⲉⲍⲟⲩⲉⲗⲁ + ⲛⲓⲃⲟⲗⲓⲃⲁⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲉⲛⲉⲍⲟⲩⲉⲗⲁ + + + ⲡⲓⲇⲟⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲓⲉⲑⲛⲁⲙ + ⲡⲓⲇⲟⲛⲅ ⲛ̀ⲣⲉⲙⲛ̀ⲃⲓⲉⲑⲛⲁⲙ + + + ⲡⲓⲃⲁⲑⲟⲩ ⲛ̀ⲧⲉ ⲃⲁⲛⲁⲑⲟⲩ + ⲛⲓⲃⲁⲑⲟⲩ ⲛ̀ⲧⲉ ⲃⲁⲛⲁⲑⲟⲩ + + + ⲡⲓⲑⲁⲗⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲁⲙⲟⲁ + ⲛⲓⲑⲁⲗⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲥⲁⲙⲟⲁ + + + ⲡⲓϥⲣⲁⲛⲕ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲛ̀̀ⲑⲙⲏϯ + ⲛⲓϥⲣⲁⲛⲕ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲛ̀̀ⲑⲙⲏϯ + + + ⲡⲓⲇⲟⲗⲗⲁⲣ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲕⲁⲣⲓⲃⲓ + ⲛⲓⲇⲟⲗⲗⲁⲣ ⲙ̀ⲡⲉⲓⲉⲃⲧ ⲛ̀ⲕⲁⲣⲓⲃⲓ + + + ⲡⲓⲅⲓⲗⲇⲉⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲣⲓⲃⲓ + ⲛⲓⲅⲓⲗⲇⲉⲣ ⲛ̀ⲣⲉⲙⲛ̀ⲕⲁⲣⲓⲃⲓ + + + ⲡⲓϥⲣⲁⲛⲕ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ + ⲛⲓϥⲣⲁⲛⲕ ⲙ̀ⲡⲉⲙⲉⲛⲧ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ + + + ⲡⲓϥⲣⲁⲛⲕ ⲥϥⲡ + ⲛⲓϥⲣⲁⲛⲕ ⲥϥⲡ + + + ⲟⲩϩⲁⲧ ⲛ̀ⲁⲧⲥⲟⲩⲏⲛ + (ⲟⲩϩⲁⲧ ⲛ̀ⲁⲧⲥⲟⲩⲏⲛ) + + + ⲡⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲉⲙⲉⲛ + ⲛⲓⲣⲓⲁⲗ ⲛ̀ⲣⲉⲙⲛ̀ⲓⲉⲙⲉⲛ + + + ⲡⲓⲣⲁⲛⲇ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ + ⲡⲓⲣⲁⲛⲇ ⲛ̀ϯⲫⲣⲓⲕⲓⲁ ⲙ̀ⲡⲓⲣⲏⲥ + + + ⲡⲓⲕⲟⲩⲁϭⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲍⲁⲙⲃⲓⲁ + ⲛⲓⲕⲟⲩⲁϭⲁ ⲛ̀ⲣⲉⲙⲛ̀ⲍⲁⲙⲃⲓⲁ + + + ⲡⲓⲛⲟⲩⲃ ⲛ̀ⲣⲉⲙⲛ̀ⲍⲓⲙⲃⲁⲃⲟⲩⲉⲓ + ⲡⲓⲛⲟⲩⲃ ⲛ̀ⲣⲉⲙⲛ̀ⲍⲓⲙⲃⲁⲃⲟⲩⲉⲓ + + + + {0} ⲛⲓⲉϩⲟⲟⲩ + + + + + {0}, ⲛⲉⲙ {1} + {0} ⲛⲉⲙ {1} + + + {0}, ⲓⲉ {1} + {0} ⲓⲉ {1} + + + {0}, ⲓⲉ {1} + {0} ⲓⲉ {1} + + + {0}, ⲓⲉ {1} + {0} ⲓⲉ {1} + + + {0}, & {1} + {0} & {1} + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + diff --git a/make/data/cldr/common/main/cs.xml b/make/data/cldr/common/main/cs.xml index 47b0c97a132..a4685374342 100644 --- a/make/data/cldr/common/main/cs.xml +++ b/make/data/cldr/common/main/cs.xml @@ -120,6 +120,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ čipevajština čerokézština čejenština + čikasavština kurdština (sorání) kurdština (centrální) čilkotinština @@ -323,6 +324,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kolínština kurdština + kurdština + kurmándží kumyčtina kutenajština komijština @@ -344,6 +347,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ lillooetština livonština lakotština + ladinština lombardština lingalština laoština @@ -930,6 +934,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Čína Kolumbie Clippertonův ostrov + Sark Kostarika Kuba Kapverdy @@ -1177,33 +1182,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Číselné řazení Míra řazení Měna + Zobrazení emodži Hodinový cyklus (12 vs. 24) Styl zalamování řádků + Zalamování řádků uprostřed slova Měrná soustava Čísla + Zlom věty za zkratkou Časové pásmo Varianta národního prostředí Soukromé použití Buddhistický kalendář + Buddhistický Čínský kalendář + Čínský Koptský kalendář + Koptský Korejský kalendář Dangi + Korejský Dangi Etiopský kalendář + Etiopský Etiopský kalendář (amete alem) + Etiopský (amete alem) Gregoriánský kalendář + Gregoriánský Hebrejský kalendář + Hebrejský Indický národní kalendář Kalendář podle hidžry + Podle hidžry Kalendář podle hidžry (občanský) + Podle hidždy (občanský) Kalendář podle hidžry (Umm al-Qura) + Podle hidžry (Umm al-Qura) Kalendář ISO-8601 Japonský kalendář + Japonský Perský kalendář + Perský Kalendář Čínské republiky + Čínské republiky Účetní měnový formát + Účetní Standardní měnový formát + Standardní Řadit symboly Při řazení ignorovat symboly Normální řazení akcentů @@ -1213,22 +1237,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nejdříve řadit velká písmena Nerozlišovat při řazení velká a malá písmena Rozlišovat při řazení velká a malá písmena - Řazení pro tradiční čínštinu – Big5 Předchozí řazení, kompatibilita + Kompatibilita Slovníkové řazení + Slovník Výchozí řazení Unicode + Výchozí Unicode Evropské řazení - Řazení pro zjednodušenou čínštinu – GB2312 Řazení telefonního seznamu + Telefonní seznam Fonetické řazení + Fonetické Řazení podle pchin-jinu + Podle pchin-jinu Obecné hledání + Hledání Vyhledávat podle počáteční souhlásky písma hangul Standardní řazení + Standardní Řazení podle tahů + Podle tahů Tradiční řazení + Tradiční Řazení podle radikálů + Podle radikálů Řazení podle ču-jinu + Podle ču-jinu Řadit bez normalizace Řadit podle normalizovaného kódování Unicode Řadit číslice jednotlivě @@ -1241,18 +1275,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Plná šířka Poloviční šířka Numerický + Výchozí + Emodži + Text 12hodinový systém (0–11) + 12 (0–11) 12hodinový systém (1–12) + 12 (1–12) 24hodinový systém (0–23) + 24 (0–23) 24hodinový systém (1–24) + 24 (1–24) Volný styl zalamování řádků + Volný Běžný styl zalamování řádků + Běžný Striktní styl zalamování řádků + Striktní + Zalamovat vše + Ponechat vše + Normální + Ponechat ve frázích Transliterace podle BGN Transliterace podle UNGEGN Metrická soustava + Metrická Britská měrná soustava + Britská Americká měrná soustava + Americká Arabsko-indické číslice Rozšířené arabsko-indické číslice Arménské číslice @@ -1301,6 +1352,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tibetské číslice Tradiční číslovky Vaiské číslice + Ne + Ano metrický @@ -1565,6 +1618,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'v' {0} + + {1} 'v' {0} + @@ -1573,6 +1629,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'v' {0} + + {1} 'v' {0} + @@ -1592,18 +1651,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm:ss a E H:mm:ss y G + M/y G d. M. y GGGGG + E d. M. y G LLLL y G d. M. y G E d. M. y G d. MMMM y G E d. MMMM y G - h a H h:mm a H:mm h:mm:ss a H:mm:ss + H 'h' v d. M. E d. M. d. M. @@ -1625,12 +1686,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ y G - - h B – h B - - - h:mm B – h:mm B - d.–d. @@ -1672,10 +1727,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d. M. – E d. M. y G E d. M. y – E d. M. y G - - h a – h a - h–h a - H–H @@ -1706,10 +1757,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm–H:mm, vvvv H:mm–H:mm, vvvv - - h a – h a v - h–h a v - H–H v @@ -2032,13 +2079,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm:ss a E H:mm:ss y G + M/y G d. M. y GGGGG + E, d. M. y G LLLL y G d. M. y G E d. M. y G d. MMMM y G E d. MMMM y G - h a H h:mm a H:mm @@ -2052,6 +2100,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm v h:mm a, vvvv H:mm, vvvv + H 'h' v d. M. E d. M. d. M. @@ -2079,12 +2128,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ w. 'týden' 'roku' Y - - h B – h B - - - h:mm B – h:mm B - d.–d. @@ -2126,10 +2169,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d. M. – E d. M. y G E d. M. y – E d. M. y G - - h a – h a - h–h a - H–H @@ -2160,10 +2199,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm–H:mm, vvvv H:mm–H:mm, vvvv - - h a – h a v - h–h a v - H–H v @@ -2841,11 +2876,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ +H:mm;-H:mm časové pásmo {0} - - HST - HST - HDT - Honolulu @@ -2862,15 +2892,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kábul - - Tirana - Jerevan - - Córdoba - Vídeň @@ -2895,15 +2919,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Brunej - - Santarém - - - Belém - - - São Paulo - Bahía @@ -2928,9 +2943,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Šanghaj - - Bogotá - Kostarika @@ -3051,7 +3063,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Phnompenh - Enderbury + Kanton (ostrov) Komory @@ -3125,24 +3137,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maledivy - - Mazatlán - Bahia Banderas - - Ciudad de México - Merida Kučing - - Nouméa - Káthmándú @@ -3224,9 +3227,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Rijád - - Mahé - Chartúm @@ -3257,9 +3257,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kerguelenovy ostrovy - - Lomé - Dušanbe @@ -3328,9 +3325,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - západoafrický čas - západoafrický standardní čas - západoafrický letní čas + západoafrický čas @@ -3753,6 +3748,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ guyanský čas + + + havajsko-aleutský standardní čas + + havajsko-aleutský čas @@ -4203,6 +4203,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chuukský čas + + + Turecký čas + Turecký standardní čas + Turecký letní čas + + turkmenský čas @@ -4389,7 +4396,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -6383,6 +6393,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ východokaribského dolaru východokaribských dolarů + + karibský gulden + karibský gulden + karibské guldeny + karibského guldenu + karibských guldenů + SDR @@ -6544,6 +6561,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabwského dolaru (1980–2008) zimbabwských dolarů (1980–2008) + + zimbabwský zlatý + zimbabwský zlatý + zimbabwské zlaté + zimbabwského zlatého + zimbabwských zlatých + zimbabwský dolar (2009) zimbabwský dolar (2009) @@ -7288,7 +7312,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} položkami {0} položkách - + + díly + {0} díl + {0} díly + {0} dílu + {0} dílů + + inanimate díly z milionu {0} díl z milionu @@ -7428,6 +7459,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} moly {0} molech + + glukózy + {0} glukózy + {0} glukózy + {0} glukózy + {0} glukózy + inanimate litry na kilometr @@ -9126,7 +9164,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ inanimate - body {0} bod {0} bod {0} bodu @@ -9648,11 +9685,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetry rtuťového sloupce {0} milimetrech rtuťového sloupce {0} milimetru rtuťového sloupce - {0} milimetrů rtuťového sloupce - {0} milimetrům rtuťového sloupce - {0} milimetrů rtuťového sloupce - {0} milimetry rtuťového sloupce - {0} milimetrech rtuťového sloupce + {0} milimetru rtuťového sloupce + {0} milimetru rtuťového sloupce + {0} milimetru rtuťového sloupce + {0} milimetru rtuťového sloupce + {0} milimetru rtuťového sloupce {0} milimetrů rtuťového sloupce {0} milimetrů rtuťového sloupce {0} milimetrům rtuťového sloupce @@ -9660,6 +9697,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetry rtuťového sloupce {0} milimetrech rtuťového sloupce + + rtuťový sloupec + {0} rtuťového sloupce + {0} rtuťového sloupce + {0} rtuťového sloupce + {0} rtuťového sloupce + libry na čtvereční palec {0} libra na čtvereční palec @@ -10412,6 +10456,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrickými šálky {0} metrických šálcích + + metrické duté unce + {0} metrická dutá unce + {0} metrické duté unce + {0} metrické duté unce + {0} metrických dutých uncí + akro-stopy {0} akro-stopa @@ -10533,9 +10584,99 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} britského kvartu {0} britských kvartů + + steradiány + {0} steradián + {0} steradiány + {0} steradiánu + {0} steradiánů + + + kataly + {0} katal + {0} kataly + {0} katalu + {0} katalů + + + coulomby + {0} coulomb + {0} coulomby + {0} coulombu + {0} coulombů + + + farady + {0} farad + {0} farady + {0} faradu + {0} faradů + + + henry + {0} henry + {0} henry + {0} henry + {0} henry + + + siemensy + {0} siemens + {0} siemensy + {0} siemensu + {0} siemensů + + + kalorie-IT + {0} kalorie-IT + {0} kalorie-IT + {0} kalorie-IT + {0} kalorií-IT + + + becquerely + {0} becquerel + {0} becquerely + {0} becquerelu + {0} becquerelů + + + sieverty + {0} sievert + {0} sievert + {0} sieverty + {0} sievertu + + + graye + {0} gray + {0} graye + {0} graye + {0} grayů + + + kilogramy síly + {0} kilogram síly + {0} kilogramy síly + {0} kilogramu síly + {0} kilogramů síly + + + tesly + {0} tesla + {0} tesly + {0} tesly + {0} tesel + + + webery + {0} weber + {0} webery + {0} weberu + {0} weberů + neuter - světlo {0} světlo {0} světlo {0} světlu @@ -10561,7 +10702,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} světly {0} světlech - + feminine částice na miliardu {0} částice na miliardu @@ -10591,7 +10732,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - noci {0} noc {0} noc {0} noci @@ -10680,6 +10820,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} položky {0} položek + + díl + {0} díl + {0} díly + {0} dílu + {0} dílů + {0} % {0} % @@ -10698,6 +10845,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -11015,6 +11165,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp. + + {0} kat + {0} kat + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} sievertů + {0} Sv + {0} Sv + {0} Sv + světlo {0} světlo @@ -11022,11 +11197,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} světla {0} světel - + částic/mld. {0} částice na mld {0} částice na mld - {0} částic na mld + {0} částice na mld {0} částic na mld @@ -11053,6 +11228,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} pol. {0} pol. + + díl + {0} díl + {0} díly + {0} dílu + {0} dílů + + + Glc + l/100km {0} l/100km @@ -11190,20 +11375,42 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} šp. {0} šp. + + {0} kat + {0} kat + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + - světlo {0} sv. {0} sv. {0} sv. {0} sv. - - noci - {0} noc - {0} noci - {0} noci - {0} nocí - {0}/noc + + {0} částice na mld + {0} částice na mld + {0} částice na mld + {0} částic na mld {0}E diff --git a/make/data/cldr/common/main/csw.xml b/make/data/cldr/common/main/csw.xml index 2ee952b51c6..df2831a0543 100644 --- a/make/data/cldr/common/main/csw.xml +++ b/make/data/cldr/common/main/csw.xml @@ -256,28 +256,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm:ss a zzzz - h:mm:ss a zzzz ahmmsszzzz h:mm:ss a z - h:mm:ss a z ahmmssz h:mm:ss a - h:mm:ss a ahmmss h:mm a - h:mm a ahmm diff --git a/make/data/cldr/common/main/cu.xml b/make/data/cldr/common/main/cu.xml index 45f45dd1f36..fb7ba399694 100644 --- a/make/data/cldr/common/main/cu.xml +++ b/make/data/cldr/common/main/cu.xml @@ -677,6 +677,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ {0} {1} diff --git a/make/data/cldr/common/main/cv.xml b/make/data/cldr/common/main/cv.xml index 69207a5c275..d4d1aeb7925 100644 --- a/make/data/cldr/common/main/cv.xml +++ b/make/data/cldr/common/main/cv.xml @@ -12,591 +12,608 @@ CLDR data files are interpreted according to the LDML specification (http://unic - афар - абхаз - африканс - агем - акан - амхар - арагон - оболо - левант араб - арап - арап литератури - мапуче - ассам - асу - астури - азербайджан - пушкӑрт - белудж - бас - белорусси - бемба - батав - бен - пӑлхар - харианви - хӗвеланӑҫ балочи - бохжпури - ания - хура таи - бамбар - бенгал - тибет - бретань - бодо - босни - акоос - билин - каталан - каддо - атсам - чакма - чеченец - себуано - кига - чоктав - чероки - чикасав - вăтаçĕр курд - тӗп курд - курд (соран) - корсикан - чех - шурлӑх кри - чиркӳ-славян - чӑваш - валлий - датчан - тайта - нимӗҫ - австрин нимӗҫ - швейцарин нимӗҫ - зарма - догри - аялти серб - дуал - мальдив - диола-фоньи - дзонг-кэ - эмбу - эве - грек - акӑлчан - австралин акӑлчан - канадӑн акӑлчан - британин акӑлчан - америкӑн акӑлчан - эсперанто - испани - латинла америкӑн испани - европӑн испани - мексикӑн испани - эстон - баск - эвондо - фарси - фарси (Афганистан) - фул - фин - филиппин - фарер - франци - канадӑн франци - швейцарӗн франци - каджун француз - ҫурҫӗр фризӗ - фриул - хӗвеланӑҫ фриз - ирланд - га - гэль - геэз - галис - гуаран - швейцари нимӗҫ - гуджарат - гусии - мэн - хауса - гавай - иврит - хинди - хинди чӗлхи (латин) - хинди (латин) - монг - хорват - тури сорбиан - венгер - армян - интерлинг - индонези - интерлингве - игбо - носу (сичуан) - идо - исланди - итали - инуктитут - япони - ложбан - нгомба - мачам - яван - грузин - каракалпак - кабиль - каджи - камба - туар - маконде - кабувердьян - камерун - каинганг - койра чиини - куикуй - казах - како - гренланди - календжин - кхмер - каннада - корей - конкани - кпелле - кашмир - шамбала - бафи - кельн - курд - корн - куви - киргиз - латин - ланго - люксембург - ганда - лигур - лакота - тироль - ломбард - лингал - лаос - луизиан креоль - ҫурҫӗр лури - литва - латгал латыш - луба-катанга - луо - лухья - латыш - майтхили - масайсем - мокшан - меру - маврика креолӗ - малагас - макуа-мето - мета - мотено - маори - микмак - македон - малаялам - монгол - манипур - мохук - маратхи - малай - мальтисем - мундир - тӗрлӗ ҫемье чӗлхисем - крик - бирман - эрзян - мазандеран - нама - норвег букмол - ҫурҫӗр ндебеле - аялти нимĕç - аялти нимĕç (Нидерланд) - непал - голланди - фламанди - квасио - норвег нюнорск - нгиембунд - норвег - нко (манинка) - кӑнтӑр ндебеле - ҫурҫӗр сото - нуэр - навахо - ньяндж - ньянколе - окситан - оромо - оди (ори) - осетин - оседжи - панджаби - папьяменто - нигер креоль - пиджин - поляк - прусси - пушту - португали - бразилин португали - европӑн португали - кечуа - киче - раджастан - рохиндж - риффиан (бербер) - романш - рунди - румын - молдаван - ромбо - вырӑс - киньяруанд - руанда - санскрит - якут - самбуру - сантали - сангу - сардин - сицил - синдхи - кӑнтӑр алтай - ҫурҫӗр саам - сена - койраборо сенни - санго - тахелхит (бербер) - шан - сингал - сидама - словак - сирайки - словен - кӑнтӑр саам - луле-саам - инар-саам - колтта-саам - шона - сомали - албан - серб - свази - сахо - кӑнтӑр сото - сундан - швед - суахили - суахили (Конго - Киншаса) - сири - силез - тамил - телугу - тесо - таджик - тай - тигринья - тигре - туркмен - тсвана - тонган - токи пона - ток писин - турккӑ - тароко - торвали - тсонга - тутар - тасавак - тува - Вӑтам Атлас тамазигт - уйгур - украина + афар чӗлхи + абхаз чӗлхи + африкаанс чӗлхи + агем чӗлхи + акан чӗлхи + амхар чӗлхи + арагон чӗлхи + оболо чӗлхи + левант арап чӗлхи + араб чӗлхи + хальхи стандартлӑ араб чӗлхи + мапуче чӗлхи + ассам чӗлхи + асу чӗлхи + астури чӗлхи + азербайджан чӗлхи + пушкӑрт чӗлхи + белудж чӗлхи + баса чӗлхи + беларус чӗлхи + бемба чӗлхи + батав чӗлхи + бена чӗлхи + болгар чӗлхи + харианви чӗлхи + анӑҫ белудж чӗлхи + бходжпури чӗлхи + ании чӗлхи + тай-дам чӗлхи + бамбара чӗлхи + бенгал чӗлхи + тибет чӗлхи + бахтияр чӗлхи + бретон чӗлхи + бодо чӗлхи + босни чӗлхи + акоосе чӗлхи + бурят чӗлхи + билин чӗлхи + каталан чӗлхи + каддо чӗлхи + атсам чӗлхи + чакма чӗлхи + чечен чӗлхи + себуано чӗлхи + кига чӗлхи + чоктав чӗлхи + чероки чӗлхи + чикасав чӗлхи + вӑта курд чӗлхи + курд (сорани) чӗлхи + корсикан чӗлхи + копт чӗлхи + чех чӗлхи + шурти кри чӗлхи + чиркӳ славян чӗлхи + чӑваш чӗлхи + валли чӗлхи + датчан чӗлхи + таита чӗлхи + нимӗҫ чӗлхи + австри нимӗҫ чӗлхи + швейцари тури нимӗҫ чӗлхи + джерма чӗлхи + догри чӗлхи + анатри лужица чӗлхи + дуала чӗлхи + мальдив чӗлхи + диола-фоньи чӗлхи + дзонг-кэ чӗлхи + эмбу чӗлхи + эве чӗлхи + грек чӗлхи + акӑлчан чӗлхи + австрали акӑлчан чӗлхи + канада акӑлчан чӗлхи + британи акӑлчан чӗлхи + америка акӑлчан чӗлхи + эсперанто чӗлхи + испан чӗлхи + латинла америка испан чӗлхи + европа испан чӗлхи + мексика испан чӗлхи + эстон чӗлхи + баск чӗлхи + эвондо чӗлхи + перс чӗлхи + дари чӗлхи + фула чӗлхи + финн чӗлхи + филиппин чӗлхи + фарер чӗлхи + француз чӗлхи + канада француз чӗлхи + швейцари француз чӗлхи + каджун француз чӗлхи + ҫур ҫӗр фриз чӗлхи + фриу чӗлхи + анӑҫ фриз чӗлхи + ирланд чӗлхи + га чӗлхи + гэл чӗлхи + геэз чӗлхи + галиси чӗлхи + гуарани чӗлхи + швейцари нимӗҫ чӗлхи + гуджарати чӗлхи + гуси чӗлхи + мэн чӗлхи + хауса чӗлхи + гавай чӗлхи + иврит чӗлхи + хинди чӗлхи + хинди чӗлхи (латин ҫырулӑхӗ) + хинглиш чӗлхи + хмонг-ну чӗлхи + хорват чӗлхи + тури лужица чӗлхи + гаитян чӗлхи + венгер чӗлхи + эрмен чӗлхи + интерлингва чӗлхи + индонези чӗлхи + интерлингве чӗлхи + игбо чӗлхи + носу чӗлхи + идо чӗлхи + исланд чӗлхи + итальян чӗлхи + инуктитут чӗлхи + япон чӗлхи + ложбан чӗлхи + нгомба чӗлхи + мачаме чӗлхи + яван чӗлхи + грузин чӗлхи + каракалпак чӗлхи + кабил чӗлхи + каджи чӗлхи + камба чӗлхи + тьяп чӗлхи + маконде чӗлхи + кабувердьяну чӗлхи + кекчи чӗлхи + ньянг чӗлхи + каинганг чӗлхи + койра-чиини чӗлхи + кикуйю чӗлхи + казах чӗлхи + како чӗлхи + гренланд чӗлхи + календжин чӗлхи + кхмер чӗлхи + каннада чӗлхи + корей чӗлхи + конкани чӗлхи + кпелле чӗлхи + кашмири чӗлхи + шамбала чӗлхи + бафи чӗлхи + кёльн чӗлхи + курд чӗлхи + курд чӗлхи + курманджи чӗлхи + корн чӗлхи + куви чӗлхи + кӑркӑс чӗлхи + латин чӗлхи + ланго чӗлхи + люксембург чӗлхи + ганда чӗлхи + лигур чӗлхи + лакота чӗлхи + ладин чӗлхи + ломбард чӗлхи + лингала чӗлхи + лаос чӗлхи + луизиан креол чӗлхи + ҫур ҫӗр лур чӗлхи + литва чӗлхи + латгал чӗлхи + луба-катанга чӗлхи + луо чӗлхи + лухья чӗлхи + латыш чӗлхи + лаз чӗлхи + майтхили чӗлхи + масаи чӗлхи + мӑкшӑ чӗлхи + меру чӗлхи + маврики креол чӗлхи + малагас чӗлхи + макуа-меетто чӗлхи + мета чӗлхи + мокен чӗлхи + маори чӗлхи + микмак чӗлхи + македон чӗлхи + малаялам чӗлхи + монгол чӗлхи + манипур чӗлхи + мохаук чӗлхи + маратхи чӗлхи + малай чӗлхи + мальта чӗлхи + мунданг чӗлхи + тӗрлӗ ҫемьеллӗ чӗлхе + крик чӗлхи + хмонг-доу чӗлхи + бирман чӗлхи + ирҫе чӗлхи + мазандеран чӗлхи + миньнань чӗлхи + нама чӗлхи + букмол норвег чӗлхи + ҫур ҫӗр ндебеле чӗлхи + анатри нимӗҫ чӗлхи + анатри саксон чӗлхи + непал чӗлхи + нидерланд чӗлхи + фламанд чӗлхи + квасио чӗлхи + нюнорск норвег чӗлхи + нгиембунд чӗлхи + норвег чӗлхи + нко чӗлхи + кӑнтӑр ндебеле чӗлхи + ҫур ҫӗр сото чӗлхи + нуэр чӗлхи + навахо чӗлхи + ньянджа чӗлхи + ньянколе чӗлхи + окситан чӗлхи + оканаган чӗлхи + оромо чӗлхи + ори чӗлхи + осетин чӗлхи + оседжи чӗлхи + панджаби чӗлхи + папьяменто чӗлхи + нигери креол чӗлхи + пали чӗлхи + соломон пиджин чӗлхи + поляк чӗлхи + пьемонт чӗлхи + прусс чӗлхи + пушту чӗлхи + португал чӗлхи + бразили португал чӗлхи + португали португал чӗлхи + кечуа чӗлхи + киче чӗлхи + раджастхани чӗлхи + рохинджа чӗлхи + риф чӗлхи + романш чӗлхи + рунди чӗлхи + румын чӗлхи + молдаван чӗлхи + ромбо чӗлхи + вырӑс чӗлхи + киньяруанда чӗлхи + руанда чӗлхи + санскрит чӗлхи + саха чӗлхи + самбуру чӗлхи + сантали чӗлхи + сангу чӗлхи + сардин чӗлхи + сицил чӗлхи + синдхи чӗлхи + кӑнтӑр алтай чӗлхи + ҫур ҫӗр саам чӗлхи + сена чӗлхи + койраборо-сенни чӗлхи + санго чӗлхи + жемайт чӗлхи + ташельхит чӗлхи + шан чӗлхи + сингал чӗлхи + сидама чӗлхи + словак чӗлхи + сирайки чӗлхи + словен чӗлхи + кӑнтӑр саам чӗлхи + луле-саам чӗлхи + инари саам чӗлхи + колтта-саам чӗлхи + шона чӗлхи + сомали чӗлхи + албан чӗлхи + серб чӗлхи + свази чӗлхи + сахо чӗлхи + кӑнтӑр сото чӗлхи + сундан чӗлхи + сунвар чӗлхи + швед чӗлхи + суахили чӗлхи + конго суахили чӗлхи + сири чӗлхи + силез чӗлхи + тамил чӗлхи + телугу чӗлхи + тесо чӗлхи + таджик чӗлхи + тай чӗлхи + тигринья чӗлхи + тигре чӗлхи + туркмен чӗлхи + тсвана чӗлхи + тонган чӗлхи + токипона чӗлхи + ток-писин чӗлхи + турккӑ чӗлхи + седек чӗлхи + торвали чӗлхи + тсонга чӗлхи + тутар чӗлхи + тасавак чӗлхи + тува чӗлхи + вӑта атлас тамазигхт чӗлхи + уйгур чӗлхи + украин чӗлхи паллӑ мар чӗлхе - урду - узбек - ваи - венда - венециан - вьетнам - макуа - воляпюк - вунджо - валлон (бельги) - вальзер (нимӗҫ) - воламо - вальбири - волоф - кхоса - кангри - сога - янгбен - идиш - йоруба - ньенгату - кантон - чжуан - тамазигт - китай - ҫурҫӗр китай - китай, ҫӑмӑллатнӑ ҫыру - ҫурҫӗр китай, ҫӑмӑллатнӑ ҫыру - китай, традициллӗ ҫыру - ҫурҫӗр китай, традициллӗ ҫыру - зулу - чӗлхе материал ҫук + урду чӗлхи + узбек чӗлхи + ваи чӗлхи + венда чӗлхи + венет чӗлхи + вьетнам чӗлхи + макуа чӗлхи + волапюк чӗлхи + вунджо чӗлхи + валлон чӗлхи + валлис чӗлхи + воламо чӗлхи + вальбири чӗлхи + волоф чӗлхи + коса чӗлхи + кангри чӗлхи + сога чӗлхи + янгбен чӗлхи + идиш чӗлхи + йоруба чӗлхи + ньенгату чӗлхи + кантон чӗлхи + чжуань чӗлхи + тамазигхт чӗлхи + китай чӗлхи + ҫур ҫӗр китай чӗлхи + ҫӑмӑллатнӑ китай чӗлхи + ҫӑмӑллатнӑ ҫур ҫӗр китай чӗлхи + йӑлана кӗнӗ китай чӗлхи + йӑлана кӗнӗ ҫур ҫӗр китай чӗлхи + зулу чӗлхи + чӗлхе материалӗ ҫук - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + тӗнче Африка - Ҫурҫӗр Америка + Ҫур ҫӗр Америка Кӑнтӑр Америка Океани Анӑҫ Африка - Тӗп Америка - Хӗвелтухӑҫ Африка - Ҫурҫӗр Африка - Тӗп Африка + Вӑта Америка + Тухӑҫ Африка + Ҫур ҫӗр Африка + Вӑта Африка Кӑнтӑр Африка Америка - Ҫурҫӗр Америка регион - Карибсем - Хӗвелтухӑҫ Ази + Ҫур ҫӗр Америка регионӗ + Кариб + Тухӑҫ Ази Кӑнтӑр Ази - Кӑнтӑр хӗвелтухӑҫ Ази + Кӑнтӑр тухӑҫ Ази Кӑнтӑр Европа Австралази Меланези - Микронези регион + Микронези Полинези Ази - Тӗп Ази + Вӑта Ази Анӑҫ Ази Европа - Хӗвелтухӑҫ Европа - Ҫурҫӗр Европа + Тухӑҫ Европа + Ҫур ҫӗр Европа Анӑҫ Европа - Тропик Африка + Сахара ҫум Африка Латинла Америка Вознесени утравӗ Андорра - Арапсен Пӗрлешӳллӗ Эмирачӗ + Пӗрлешнӗ Араб Эмирачӗсем Афганистан - Антигуа тата Барбуда + Антигуапа Барбуда Ангилья Албани Армени Ангола Антарктида Аргентина - Америка Самоа + Америка Самойи Австри Австрали Аруба - Аланди утравӗсем + Аланд утравӗсем Азербайджан Боснипе Герцеговина Барбадос @@ -609,22 +626,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Бенин Сен-Бартелеми Бермуд утравӗсем - Бруней-Даруссалам + Бруней Боливи - Бонэйр, Синт-Эстатиус тата Саба + Бонэйр, Синт-Эстатиуспа Саба Бразили - Пахам утравӗсем + Багама утравӗсем Бутан Буве утравӗ Ботсвана - Беларуҫ + Беларусь Белиз Канада Кокос утравӗсем - Конго - Киншаса - Конго (КДР) - Тӗп Африка Республики - Конго - Браззавиль + Конго + Конго Демократиллӗ Республики + Вӑта Африка Республики + Конго-Браззавиль Конго Республики Швейцари Кот-д’Ивуар @@ -634,7 +651,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Китай Колумби Клиппертон утравӗ - Сарк + Сарк Коста-Рика Куба Кабо-Верде @@ -644,13 +661,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Чехи Чех Республики Германи - Диего-Гарсия + Диего-Гарси Джибути Дани Доминика - Доминикан Республики + Доминика Республики Алжир - Сеута тата Мелилья + Сеутӑпа Мелили Эквадор Эстони Египет @@ -658,12 +675,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Эритрей Испани Эфиопи - Европа пӗрлешӗвӗ - Еврозон + Европа Пӗрлешӗвӗ + Еврозона Финлянди Фиджи Фолкленд утравӗсем - Фолкленд (Мальвински) утравӗсем + Фолкленд утравӗсем (Мальвина утравӗсем) Микронези Фарер утравӗсем Франци @@ -672,7 +689,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Британи Гренада Грузи - Франци Гвиана + Франци Гвиани Гернси Гана Гибралтар @@ -680,16 +697,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гамби Гвиней Гваделупа - Экваториаллӑ Гвиней + Экваторти Гвинея Греци - Кӑнтӑр Георги тата Сандвичев утравӗсем + Кӑнтӑр Георгипе Кӑнтӑр Сандвич утравӗсем Гватемала Гуам Гвиней-Бисау Гайана - Гонконг (САР) + Гонконг (ЯАР) Гонконг - Херд тата Макдональд утравӗ + Хердпа Макдональд утравӗсем Гондурас Хорвати Гаити @@ -700,9 +717,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Израиль Мэн утравӗ Инди - Британин территори Инди океанӗре - Британи территори Инди океанӗре - Чагос архипелаге + Инди океанӗнчи Британи территорийӗ + Чагос архипелагӗ Ирак Иран Исланди @@ -712,19 +728,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Иордани Япони Кени - Киргизи + Кӑркӑсстан Камбоджа Кирибати Комор утравӗсем - Сент-Китс тата Невис - КХДР - Корей Республики + Сент-Китспа Невис + Ҫур ҫӗр Корея + Кӑнтӑр Корея Кувейт Кайман утравӗсем Казахстан Лаос Ливан - Сент-Люсия + Сент-Люси Лихтенштейн Шри-Ланка Либери @@ -739,20 +755,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Черногори Сен-Мартен Мадагаскар - Маршаллов утравӗсем - Ҫурҫӗр Македони + Маршалл утравӗсем + Ҫур ҫӗр Македони Мали Мьянма (Бирма) Монголи - Макао (САР) + Макао (ЯАР) Макао - Ҫурҫӗр Мариан утравӗсем + Ҫур ҫӗр Мариан утравӗсем Мартиника Мавритани Монтсеррат Мальта Маврики - Мальдивсем + Мальдив Малави Мексика Малайзи @@ -773,15 +789,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Оман Панама Перу - Франци Полинези - Папуа — Ҫӗнӗ Гвиней - Филиппинсем + Франци Полинезийӗ + Папуа — Ҫӗнӗ Гвинея + Филиппин Пакистан Польша - Сен-Пьер & Микелон + Сен-Пьерпа Микелон Питкэрн утравӗсем Пуэрто-Рико - Палестинӑн территорийӗсем + Палестина территорийӗсем Палестина Португали Палау @@ -801,7 +817,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сингапур Сӑваплӑ Елена утравӗ Словени - Шпицберген тата Ян-Майен + Шпицбергенпа Ян-Майен Словаки Сьерра-Леоне Сан-Марино @@ -809,49 +825,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сомали Суринам Кӑнтӑр Судан - Сан-Томе тата Принсипи + Сан-Томепе Принсипи Сальвадор Синт-Мартен Сири Эсватини Свазиленд - Тристан-да-Кунья - Тёркс тата Кайкос утравӗсем + Тристан-да-Куни + Тёркспа Кайкос утравӗсем Чад - Франци Кӑнтӑр территорийӗсем + Францин Кӑнтӑр территорийӗсем Того Таиланд Таджикистан Токелау - Хӗвелтухӑҫ Тимор + Тухӑҫ Тимор Тимор-Лесте Туркменистан Тунис Тонга Турци - Тринидад тата Тобаго + Тринидадпа Тобаго Тувалу Тайвань Танзани Украина Уганда - Тулашӗнчи утравӗсем (АПШ) - Пӗрлешӳллӗ Нацисен Организацийӗ - Пӗрлешӗннӗ Штатсем + АПШ-н тулаш пӗчӗк утравӗсем + Пӗрлешнӗ Нацисен Организацийӗ + Пӗрлешнӗ Штатсем АПШ Уругвай Узбекистан Ватикан - Сент-Винсент тата Гренадины + Сент-Винсентпа Гренада Венесуэла - Британин Виргини утравӗсем - Виргини утравӗсем (АПШ) + Виргин утравӗсем (Британи) + Виргин утравӗсем (АПШ) Вьетнам Вануату - Уоллис тата Футуна + Уоллиспа Футуна Самоа - псевдакцентсем - псевд-Bidi + суя акцент + суя биди Косово Йемен Майотта @@ -861,279 +877,337 @@ CLDR data files are interpreted according to the LDML specification (http://unic паллӑ мар регион - Нимӗҫ йӑлана кӗнӗ орфографийӗ - Стандартизациленӗ резьян орфографийӗ - 1996 ҫултан пуҫласа нимӗҫ орфографийӗн правилисем - Француз каярахпа вӑтам ӗмӗрӗ 1606 ҫулччен - Француз ирхи çĕнĕ вăхăт - Академи - 1943 ҫулхи орфографийӗ - AKUAPEM локализаци - ALALC97 локализаци - Алукулу диалекчӗ - ANPEZO локализаци - AO1990 орфографийӗ - ARANES локализаци - ARKAIKA локализаци - ASANTE локализаци - AUVERN локализаци - Унификациленӗ тӗрӗк-латин алфавичӗ - BALANKA локализаци - BARLA локализаци - BASICENG локализаци - BAUDDHA локализаци - BCIAV локализаци - BCIZBL локализаци - BISCAYAN локализаци - Сан-Гиоргио диалекчӗ - BLASL локализаци - Бохорич алфавичӗ - Бунтлинг - BORNHOLM локализаци - CISAUP локализаци - COLB1945 локализаци - CORNU локализаци - CREISS локализаци - DAJNKO локализаци - EKAVSK локализаци - EMODENG локализаци - FASCIA локализаци - FODOM локализаци - Тӗнчери фонетика алфавичӗ - FONKIRSH локализаци - FONNAPA локализаци - Урал чӗлхисен фонетика алфавичӗ - FONXSAMP локализаци - GALLO локализаци - GASCON локализаци - GHERD локализаци - GRCLASS локализаци - GRITAL локализаци - GRMISTR локализаци - HEPBURN локализаци - HOGNORSK локализаци - HSISTEMO локализаци - IJEKAVSK локализаци - ITIHASA локализаци - IVANCHOV локализаци - JAUER локализаци - JYUTPING локализаци - Пӗтӗмӗшле орфографийӗ - KOCIEWIE локализаци - KSCOR локализаци - LAUKIKA локализаци - LEMOSIN локализаци - LENGADOC локализаци - Резьян чӗлхин липовецла диалекчӗ - LTG1929 локализаци - LTG2007 локализаци - LUNA1918 локализаци - METELKO локализаци - Пӗр кĕвĕллĕ - NDYUKA локализаци - Надиж диалекчӗ - NEWFOUND локализаци - NICARD локализаци - Гнива-нжив диалекчӗ - NULIK локализаци - Осеакла-осоянла диалект - OXENDICT локализаци - PAHAWH2 локализаци - PAHAWH3 локализаци - PAHAWH4 локализаци - PAMAKA локализаци - PEANO локализаци - PEHOEJI локализаци - PETR1708 локализаци - Пиньинь локализаци - Нумай тонлӑ - Компьютер - PROVENC локализаци - PUTER локализаци - Ҫӗнӗрен пӑхса тухнӑ орфографийӗ - RIGIK локализаци - Резьян - RUMGR локализаци - Сахо - Англо-шотланди - Ливерпуль - Ансат - Столици-солбицки диалект - SOTAV локализаци - SPANGLIS локализаци - SURMIRAN локализаци - SURSILV локализаци - SUTSILV локализаци - SYNNEJYL локализаци - TAILO локализаци - Тарашкевиц - TONGYONG локализаци - TUNUMIIT локализаци - Пӗрлешӳллӗ орфографийӗ - Пӗрлешӳллӗ ҫӗнӗрен пӑхса тухнӑ орфографийӗ - ULSTER локализаци - UNIFON локализаци - VAIDIKA локализаци - VALBADIA локализаци - Валенси - VALLADER локализаци - VECDRUKA локализаци - VIVARAUP локализаци - Уэйд – Джайлз системи - XSISTEMO локализаци + Нимӗҫ йӑлана кӗнӗ орфографийӗ + Стандартизациленӗ резьян орфографийӗ + 1996 ҫултан пуҫласа нимӗҫ орфографийӗн правилисем + Француз каярахпа вӑтам ӗмӗрӗ 1606 ҫулччен + Француз ирхи çĕнĕ вăхăт + Академи + 1943 ҫулхи орфографийӗ + AKUAPEM локализаци + ALALC97 локализаци + Алукулу диалекчӗ + ANPEZO локализаци + AO1990 орфографийӗ + ARANES локализаци + ARKAIKA локализаци + ASANTE локализаци + AUVERN локализаци + Унификациленӗ тӗрӗк-латин алфавичӗ + BALANKA локализаци + BARLA локализаци + BASICENG локализаци + BAUDDHA локализаци + BCIAV локализаци + BCIZBL локализаци + BISCAYAN локализаци + Сан-Гиоргио диалекчӗ + BLASL локализаци + Бохорич алфавичӗ + Бунтлинг + BORNHOLM локализаци + CISAUP локализаци + COLB1945 локализаци + CORNU локализаци + CREISS локализаци + DAJNKO локализаци + EKAVSK локализаци + EMODENG локализаци + FASCIA локализаци + FODOM локализаци + Тӗнчери фонетика алфавичӗ + FONKIRSH локализаци + FONNAPA локализаци + Урал чӗлхисен фонетика алфавичӗ + FONXSAMP локализаци + GALLO локализаци + GASCON локализаци + GHERD локализаци + GRCLASS локализаци + GRITAL локализаци + GRMISTR локализаци + HANOI локализаци + HEPBURN локализаци + HOGNORSK локализаци + HSISTEMO локализаци + HUETT локализаци + IJEKAVSK локализаци + ITIHASA локализаци + IVANCHOV локализаци + JAUER локализаци + JYUTPING локализаци + Пӗтӗмӗшле орфографийӗ + KLEINSCH локализаци + KOCIEWIE локализаци + KSCOR локализаци + LAUKIKA локализаци + LEIDENTR локализаци + LEMOSIN локализаци + LENGADOC локализаци + Резьян чӗлхин липовецла диалекчӗ + LTG1929 локализаци + LTG2007 локализаци + LUNA1918 локализаци + MDCEGYP локализаци + MDCTRANS локализаци + METELKO локализаци + Пӗр кĕвĕллĕ + NDYUKA локализаци + Надиж диалекчӗ + NEWFOUND локализаци + NICARD локализаци + Гнива-нжив диалекчӗ + NULIK локализаци + Осеакла-осоянла диалект + OXENDICT локализаци + PAHAWH2 локализаци + PAHAWH3 локализаци + PAHAWH4 локализаци + PAMAKA локализаци + PEANO локализаци + PEHOEJI локализаци + PETR1708 локализаци + Пиньинь локализаци + Нумай тонлӑ + Компьютер + PROVENC локализаци + PUTER локализаци + Ҫӗнӗрен пӑхса тухнӑ орфографийӗ + Классикӑлла Волапюк + Резьян + RUMGR локализаци + Сахо + SAIGON локализаци + Англо-шотланди + Ливерпуль + Ансат + Столици-солбицки диалект + Кабуредиан Сотавенто-диалектлӑ ушкӑнӗ + SPANGLIS локализаци + SURMIRAN локализаци + SURSILV локализаци + SUTSILV локализаци + SYNNEJYL локализаци + TAILO локализаци + Тарашкевиц + TONGYONG локализаци + TUNUMIIT локализаци + Пӗрлешӳллӗ орфографийӗ + Пӗрлешӳллӗ ҫӗнӗрен пӑхса тухнӑ орфографийӗ + ULSTER локализаци + UNIFON локализаци + VAIDIKA локализаци + VALBADIA локализаци + Валенси + VALLADER локализаци + VECDRUKA локализаци + VIVARAUP локализаци + Уэйд – Джайлз системи + XSISTEMO локализаци - çулталăк кĕнеки - валюта формачӗ - сортировка йӗрки - валюта - вӑхӑт формачӗ (12- е 24-сехет) - çĕнĕ йĕркерен пуçла стилӗ - виҫев системи - цифрисем + календарь + валюта формачӗ + сортлав йӗрки + валюта + эмодзи кӑтартӑвӗ + вӑхӑт формачӗ (12 е 24 сехетлӗ) + йӗрке куҫарӑвӗн стилӗ + сӑмах куҫарӑвӗн стилӗ + виҫе системи + хисеп паллисем + кӗсекетӳ хыҫҫӑнхи предложени татӑлӑвӗ - будда çулталăк кĕнеки - китай çулталăк кĕнеки - копт çулталăк кĕнеки - данги çулталăк кĕнеки - эфиопи çулталăк кĕнеки - амете-алем эфиопи çулталăк кĕнеки + буддистсен календарӗ + буддистсен + китай календарӗ + китай + копт календарӗ + копт + данги календарӗ + данги + эфиоп календарӗ + эфиоп + эфиоп амете-алем календарӗ + эфиоп амете-алем грегориан календарӗ - еврей çулталăк кĕнеки - инди наци çулталăк кĕнеки - хиджра çулталăк кĕнеки - хиджра граждан çулталăк кĕнеки (таблици) - хиджра çулталăк кĕнеки (Сауд Аравийӗ) - хиджра çулталăк кĕнеки (таблица, астрономи тапхӑрӗ) - хиджра çулталăк кĕнеки (Умм аль-Кура) - календарӗ ISO-8601 - япони çулталăк кĕнеки - перси çулталăк кĕнеки - Миньго çулталăк кĕнеки - финанс формачӗ - валюта стандартлӑ формачӗ - йӑлана кӗнӗ китай - big5 - иртнĕ сортировка йӗрки - сортировка йӗрки словарĕ - Юникодри яланхи сортировка йӗрки - эмодзи сортировка йӗрки - Европа сортировка правилисем - китай сортировкӑн ансат йӗрки - GB2312 - телефон кӗнекине сортировка йӗрке - пиньинь сортировка йӗрки - шырани - хангыльти пуҫламӑш килӗшӳпе шырав - стандартлӑ сортировка - йĕр сортировка йӗрке - йӑлана кӗнӗ сортировка йӗрки - уҫҫисем тӑрӑх, унтан йӗрсем тӑрӑх сортировка - чжуинь сортировка йӗрки - 12-сехет (0-11) вӑхӑт формачӗ - 12-сехет (1-12) вӑхӑт формачӗ - 24-сехет (0-23) вӑхӑт формачӗ - 24-сехет (1-24) вӑхӑт формачӗ - çĕнĕ йĕркерен пуçла ирӗклӗ стилӗ - çĕнĕ йĕркерен пуçла яланхи стилӗ - çĕнĕ йĕркерен пуçла хаяр стилӗ - метрикăлла виçев пĕрчисем - британи виҫев системи - америка виҫев системи - ахом цифрисем - араб-инди цифрисем - араб-инди цифрисем анлӑ системи - армян цифрисем - аялти регистрти армян цифрисем - бали цифрисем - бенгали цифрисем - брахмӑллӑ цифрӑсем - чакма цифрисем - чам цифрисем - çырулăхе славян цифрисем - деванагари цифрисем - дайвз акуру цифрисем - эфиопи цифрисем - тулли сарлакăш цифрисем - гарай цифрисем - грузин цифрисем - гунджала гонди цифрисем - масарам гонди цифрисем - грек цифрисем - аялти регистрти грек цифрисем - гуджарати цифрисем - гурунги кхема цифрисем - гурмукхи цифрисем - китай вуншарлă цифрисем - китай ансат цифрисем - китай ансат финанс цифрисем - китай йăлана кĕнĕ цифрисем - китай йăлана кĕнĕ финанс цифрисем - иврит цифрисем - пахау цифрисем - наякинг пуачу хмонг цифрисем - яван цифрисем - япони цифрисем - япони финанс цифрисем - кайя ли цифрисем - кави цифрисем - кхмер цифрисем - каннад цифрисем - кират рай цифрисем - ланна цифрисем - тай тхам цифрисем - лаос цифрисем - хальхи араб цифрисем - лепча цифрисем - лимб цифрисем - математика самăр цифрисем - математика хăвăл цифрисене - математика цифрисем - математика самăр сан-сериф цифрисем - математика сан-сериф цифрисем - малаялам цифрисем - моди цифрисем - монгол цифрисем - мро цифрисем - манипури цифрисем - бирман цифрисем - бирман тухӑҫӗнчи пво карен цифрисем - бирман пао цифрисем - бирман шан цифрисем - бирман таи лаи цифрисем - наг мундари цифрисем - нко цифрисем - ол-чики цифрисем - ол онал цифрисем - ория цифрисем - исмания цифрисем - самăр цифрисем - ханифи цифрисем - рим цифрисем - аялти регистрти рим цифрисем - саураштра цифрисем - шарада цифрисем - худавади цифрисем - синхала цифрисем - сора-сомпенг цифрисем - судан цифрисем - сунвари цифрисем - такри цифрисем - ҫӗнӗ тай-лю цифрисем - тамильти йӑлана кӗнӗ цифрисем - тамиль цифрисем - телугу цифрисем - тай цифрисем - тибет цифрисем - тирхута цифрисем - тангса цифрисем - вай цифрисем - варанг-кшити цифрисем - ванчо цифрисем + грегориан + еврей календарӗ + еврей + Инди наци календарӗ + Инди наци + хиджра календарӗ + хиджра + хиджра календарӗ (таблицӑллӑ, граждан) + хиджра (таблицӑллӑ, граждан) + хиджра календарӗ (Сауд Аравийӗ) + хиджра календарӗ (таблицӑллӑ, астрономи тапхӑрӗ) + хиджра (таблицӑллӑ, астрономи тапхӑрӗ) + хиджра календарӗ (Умм аль-Кура) + хиджра (Умм аль-Кура) + ISO-8601 календарӗ + япон календарӗ + япон + перс календарӗ + перс + Миньго календарӗ + Миньго + финанс формачӗ + финанс + стандартлӑ валюта формачӗ + стандартлӑ + килӗшӳллӗ сортлав йӗрки + килӗшӳллӗ + словарь сортлав йӗрки + словарь + стандартлӑ Юникод сортлав йӗрки + стандартлӑ Юникод + эмодзи сортлав йӗрки + европа сортлав правилисем + телефон кӗнеки сортлав йӗрки + телефон кӗнеки + фонетика + пиньинь сортлав йӗрки + пиньинь + шырав + шырав + хангылӗн пӗрремӗш хупӑ сас палли тӑрӑх шырав + стандартлӑ сортлав йӗрки + стандартлӑ + йӗрсемпе сортлав йӗрки + йӗрсемпе + йӑлана кӗнӗ сортлав йӗрки + йӑлана кӗнӗ + уҫӑ-йӗрпе сортлав йӗрки + уҫӑ-йӗрпе + чжуинь сортлав йӗрки + чжуинь + яланхилле + эмодзи + текст + 12 сехетлӗ вӑхӑт формачӗ (0–11) + 12 (0–11) + 12 сехетлӗ вӑхӑт формачӗ (1–12) + 12 (1–12) + 24 сехетлӗ вӑхӑт формачӗ (0–23) + 24 (0–23) + 24 сехетлӗ вӑхӑт формачӗ (1–24) + 24 (1–24) + йӗрке куҫарӑвӗн ирӗклӗ стилӗ + ирӗклӗ + йӗрке куҫарӑвӗн йӗркеллӗ стилӗ + йӗркеллӗ + йӗрке куҫарӑвӗн ҫирӗп стилӗ + ҫирӗп + пурне те куҫармалла + пурне те упрамалла + йӗркеллӗ + сӑмах ҫаврӑнӑшӗсенче упрамалла + метрла виҫе системи + метрла + акӑлчанла виҫе системи + акӑлчанла + америкӑлла виҫе системи + америкӑлла + ахом хисеп паллисем + араб-инди хисеп паллисем + анлӑ араб-инди хисеп паллисем + эрмен хисеп паллисем + эрмен пӗчӗк хисеп паллисем + бали хисеп паллисем + бенгал хисеп паллисем + брахма хисеп паллисем + чакма хисеп паллисем + чам хисеп паллисем + кирилл хисеп паллисем + деванагари хисеп паллисем + дивехи-акуру хисеп паллисем + эфиоп хисеп паллисем + тулли сарлакӑш хисеп паллисем + гарай хисеп паллисем + грузин хисеп паллисем + гунджала-гонди хисеп паллисем + масарам-гонди хисеп паллисем + грек хисеп паллисем + грек пӗчӗк хисеп паллисем + гуджарати хисеп паллисем + кхема хисеп паллисем + гурмукхи хисеп паллисем + китай вуншарлӑ хисеп паллисем + ҫӑмӑлатнӑ китай хисеп паллисем + ҫӑмӑлатнӑ китай финанс хисеп паллисем + йӑлана кӗнӗ китай хисеп паллисем + йӑлана кӗнӗ китай финанс хисеп паллисем + иврит хисеп паллисем + пахау хисеп паллисем + ньякенг-пуачуэ хисеп паллисем + яван хисеп паллисем + япон хисеп паллисем + япон финанс хисеп паллисем + кая-ли хисеп паллисем + кави хисеп паллисем + кхмер хисеп паллисем + каннада хисеп паллисем + кират-рай хисеп паллисем + ланна хисеп паллисем + тхам хисеп паллисем + лаос хисеп паллисем + хальхи араб хисеп паллисем + лепча хисеп паллисем + лимбу хисеп паллисем + хулӑн математика хисеп паллисем + чӗнтӗрлӗ математика хисеп паллисем + пӗр сарлакӑшлӑ математика хисеп паллисем + гротеск математика хисеп паллисем + хулӑн гротеск математика хисеп паллисем + малаялам хисеп паллисем + моди хисеп паллисем + монгол хисеп паллисем + мро хисеп паллисем + манипури хисеп паллисем + мьянма хисеп паллисем + тухӑҫ пво-карен мьянма хисеп паллисем + пао мьянма хисеп паллисем + шан мьянма хисеп паллисем + тай-лаи мьянма хисеп паллисем + наг-мундари хисеп паллисем + нко хисеп паллисем + ол-чики хисеп паллисем + ол-онал хисеп паллисем + ори хисеп паллисем + осман хисеп паллисем + ӗлкеллӗ хисеп паллисем + ханифи хисеп паллисем + рим хисеп паллисем + рим пӗчӗк хисеп паллисем + саураштра хисеп паллисем + шарада хисеп паллисем + худавади хисеп паллисем + сингал хисеп паллисем + сора-сонпенг хисеп паллисем + судан хисеп паллисем + сунвар хисеп паллисем + такри хисеп паллисем + ҫӗнӗ тай-ныа хисеп паллисем + йӑлана кӗнӗ тамил хисеп паллисем + тамил хисеп паллисем + телугу хисеп паллисем + тай хисеп паллисем + тибет хисеп паллисем + тирхута хисеп паллисем + тангса хисеп паллисем + толонг-сики хисеп паллисем + ваи хисеп паллисем + варанг-кшити хисеп паллисем + ванчо хисеп паллисем + сӳнтернӗ + ҫутнӑ - Метрикӑлла - Акӑлчан - Америка + Метрла + Акӑлчанла + Америкӑлла Чӗлхе: {0} @@ -1146,13 +1220,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic [{а́} {е́} {и́} {о́} {у́} {ы́} {э́} {ю́} {я́}] [АӐ Б В Г Д ЕӖЁ Ж З И Й К Л М Н О П Р С Ҫ Т УӲ Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я] [\- ‑ , % ‰ + 0 1 2 3 4 5 6 7 8 9] - [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” « » ( ) \[ \] \{ \} § @ * / \& #] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1161,508 +1232,42 @@ CLDR data files are interpreted according to the LDML specification (http://unic « » - - + + - будда эра + буддизм саманири - бэ + б. с. - бэ + б. с. - - - - h a – h a - h–h a - - - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a - - - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - кăрлач - на­рăс - пуш - ака - çу - çĕртме - утă - çурла - авăн - юпа - чÿк - раштав - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - - - тот - бабэ - хатур - кихак - тубэ - амшир - барамхат - бармуда - башнас - бауна - абиб - мисра - наси - - - тот - бабэ - хатур - кихак - тубэ - амшир - барамхат - бармуда - башнас - бауна - абиб - мисра - наси - - - - - тот - бабэ - хатур - кихак - тубэ - амшир - барамхат - бармуда - башнас - бауна - абиб - мисра - наси - - - тот - бабэ - хатур - кихак - тубэ - амшир - барамхат - бармуда - башнас - бауна - абиб - мисра - наси - - - - - - Диоклетиан ҫитиччен - Диоклетиан хыҫҫӑн - - - Диокл.ҫтчн - Диокл.хҫн - - - Дкл.ҫтчн - Дкл.хҫн - - - - - - h a – h a - h–h a - - - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a - - - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v - - - - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - кăрлач - на­рăс - пуш - ака - çу - çĕртме - утă - çурла - авăн - юпа - чÿк - раштав - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - - - - - - - - ҫуркунне пуҫланать - ҫумӑр шывӗ - хурт-кӑпшанкӑ вӑранать - çурхи кунпа çĕр танлашăвĕ - йăлтăр та янкӑр уяр - тӗштырӑ ҫумӑр - ҫу пуҫланать - тулли тырӑ - пучахри тырӑ - кун таврӑнни - лĕп ăшă - шăрăх - кӗркунне пуҫланать - шӑрӑх вӗҫленни - шурӑ сывлӑм - кӗркунне кунпа ҫӗр танлашни - сивӗ сывлӑм - сивӗтет - хӗл пуҫланать - юр ҫуни - вӑйлӑ юр ҫӑвать - кун хутшӑнни - вӑйсӑр сивӗ - хаяр сивĕ - - - ҫуркунне пуҫланать - ҫумӑр шывӗ - хурт-кӑпшанкӑ вӑранать - çурхи кунпа çĕр танлашăвĕ - йăлтăр та янкӑр уяр - тӗштырӑ ҫумӑр - ҫу пуҫланать - тулли тырӑ - пучахри тырӑ - кун таврӑнни - лĕп ăшă - шăрăх - кӗркунне пуҫланать - шӑрӑх вӗҫленни - шурӑ сывлӑм - кӗркунне кунпа ҫӗр танлашни - сивӗ сывлӑм - сивӗтет - хӗл пуҫланать - юр ҫуни - вӑйлӑ юр ҫӑвать - кун хутшӑнни - вӑйсӑр сивӗ - хаяр сивĕ - - - ҫуркунне пуҫланать - ҫумӑр шывӗ - хурт-кӑпшанкӑ вӑранать - çурхи кунпа çĕр танлашăвĕ - йăлтăр та янкӑр уяр - тӗштырӑ ҫумӑр - ҫу пуҫланать - тулли тырӑ - пучахри тырӑ - кун таврӑнни - лĕп ăшă - шăрăх - кӗркунне пуҫланать - шӑрӑх вӗҫленни - шурӑ сывлӑм - кӗркунне кунпа ҫӗр танлашни - сивӗ сывлӑм - сивӗтет - хӗл пуҫланать - юр ҫуни - вӑйлӑ юр ҫӑвать - кун хутшӑнни - вӑйсӑр сивӗ - хаяр сивĕ - - - - - - - - h a – h a - h–h a - - - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a - - - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v - - - - - - - - - мескерем - текемт - хедар - тахсас - тер - якатит - магабит - миазия - генбот - сэнэ - хамлэ - нахасэ - эпагомен - - - мескерем - текемт - хедар - тахсас - тер - якатит - магабит - миазия - генбот - сэнэ - хамлэ - нахасэ - эпагомен - - - - - мескерем - текемт - хедар - тахсас - тер - якатит - магабит - миазия - генбот - сэнэ - хамлэ - нахасэ - эпагомен - - - мескерем - текемт - хедар - тахсас - тер - якатит - магабит - миазия - генбот - сэнэ - хамлэ - нахасэ - эпагомен - - - - - - пирĕн эрăчченхи (Христус пурнăçланничен) - пирĕн самана - - - прн.эрчнх. - прн.смн. - - - прн.эрчнх. - прн.смн. - - - - - - h a – h a - h–h a - - - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a - - - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v - - - - - - EEEE, d MMMM y 'ҫ'. G + G y, MMMM, d, EEEE - d MMMM y 'ҫ'. G + G y, MMMM, d - d MMM y 'ҫ'. G + G y, MMM, d - dd.MM.y G + G y.MM.dd @@ -1688,125 +1293,2931 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E, d - ccc, h:mm a - ccc HH:mm - ccc, h:mm:ss a - ccc HH:mm:ss - y 'ҫ'. G - dd.MM.y G - LLL y 'ҫ'. G - d MMM y 'ҫ'. G - E, d MMM y 'ҫ'. G - dd.MM - E, dd.MM - d MMM - ccc, d MMM - d MMMM - y 'ҫ'. G - y 'ҫ'. G - MM.y G - dd.MM.y G - E, dd.MM.y G - LLL y 'ҫ'. G - d MMM y 'ҫ'. G - E, d MMM y 'ҫ'. G - LLLL y 'ҫ'. G - QQQ y 'ҫ'. G - QQQQ y 'ҫ'. G + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + - y 'ҫ'. G – y 'ҫ'. G - y–y 'ҫҫ'. G + G y – G y + G y–y - MM.y G – MM.y G - MM.y – MM.y G - MM.y – MM.y G + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM - dd.MM.y – dd.MM.y G - dd.MM.y G – dd.MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y G – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) - LLL y 'ҫ'. G – LLL y 'ҫ'. G - LLL – LLL y 'ҫ'. G - LLL y – LLL y 'ҫҫ'. G + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM - d–d MMM y 'ҫ'. G - d MMM y 'ҫ'. G – d MMM y 'ҫ'. G - d MMM – d MMM y 'ҫ'. G - d MMM y – d MMM y 'ҫҫ'. G + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM y 'ҫ'. G – ccc, d MMM y 'ҫ'. G - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM y – ccc, d MMM y 'ҫҫ'. G + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM + + + + + + + + + 1-мӗш уйӑх + 2-мӗш уйӑх + 3-мӗш уйӑх + 4-мӗш уйӑх + 5-мӗш уйӑх + 6-мӗш уйӑх + 7-мӗш уйӑх + 8-мӗш уйӑх + 9-мӗш уйӑх + 10-мӗш уйӑх + 11-мӗш уйӑх + 12-мӗш уйӑх + + + пӗрремӗш уйӑх + иккӗмӗш уйӑх + виҫҫӗмӗш уйӑх + тӑваттӑмӗш уйӑх + пиллӗкмӗш уйӑх + улттӑмӗш уйӑх + ҫиччӗмӗш уйӑх + саккӑрмӗш уйӑх + тӑххӑрмӗш уйӑх + вуннӑмӗш уйӑх + вун пӗрмӗш уйӑх + вун иккӗмӗш уйӑх + + + + + 1-мӗш уйӑх + 2-мӗш уйӑх + 3-мӗш уйӑх + 4-мӗш уйӑх + 5-мӗш уйӑх + 6-мӗш уйӑх + 7-мӗш уйӑх + 8-мӗш уйӑх + 9-мӗш уйӑх + 10-мӗш уйӑх + 11-мӗш уйӑх + 12-мӗш уйӑх + + + пӗрремӗш уйӑх + иккӗмӗш уйӑх + виҫҫӗмӗш уйӑх + тӑваттӑмӗш уйӑх + пиллӗкмӗш уйӑх + улттӑмӗш уйӑх + ҫиччӗмӗш уйӑх + саккӑрмӗш уйӑх + тӑххӑрмӗш уйӑх + вуннӑмӗш уйӑх + вун пӗрмӗш уйӑх + вун иккӗмӗш уйӑх + + + + + + + йӗкӗр {0} + + + йӗкӗр {0} + + + йӗкӗр {0} + + + + + йӗкӗр {0} + + + + + йӗкӗр {0} + + + йӗкӗр {0} + + + йӗкӗр {0} + + + + + + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + + + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + + + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + + + + + личунь + юйшуй + цзинчжэ + чуньфэнь + цинмин + гуюй + лися + сяомань + манчжун + сячжи + сяошу + дашу + лицю + чушу + байлу + цюфэнь + ханьлу + шуанцзян + лидун + сяосюэ + дасюэ + дунчжи + сяохань + дахань + + + личунь + юйшуй + цзинчжэ + чуньфэнь + цинмин + гуюй + лися + сяомань + манчжун + сячжи + сяошу + дашу + лицю + чушу + байлу + цюфэнь + ханьлу + шуанцзян + лидун + сяосюэ + дасюэ + дунчжи + сяохань + дахань + + + личунь + юйшуй + цзинчжэ + чуньфэнь + цинмин + гуюй + лися + сяомань + манчжун + сячжи + сяошу + дашу + лицю + чушу + байлу + цюфэнь + ханьлу + шуанцзян + лидун + сяосюэ + дасюэ + дунчжи + сяохань + дахань + + + + + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + цзя-цзы + и-чоу + бин-инь + дин-мао + у-чэнь + цзи-сы + гэн-у + синь-вэй + жэнь-шэнь + гуй-ю + цзя-сюй + и-хай + бин-цзы + дин-чоу + у-инь + цзи-мао + гэн-чэнь + синь-сы + жэнь-у + гуй-вэй + цзя-шэнь + и-ю + бин-сюй + дин-хай + у-цзы + цзи-чоу + гэн-инь + синь-мао + жэнь-чэнь + гуй-сы + цзя-у + и-вэй + бин-шэнь + дин-ю + у-сюй + цзи-хай + гэн-цзы + синь-чоу + жэнь-инь + гуй-мао + цзя-чэнь + и-сы + бин-у + дин-вэй + у-шэнь + цзи-ю + гэн-сюй + синь-хай + жэнь-цзы + гуй-чоу + цзя-инь + и-мао + бин-чэнь + дин-сы + у-у + цзи-вэй + гэн-шэнь + синь-ю + жэнь-сюй + гуй-хай + + + + + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + цзы + чоу + инь + мао + чэнь + сы + у + вэй + шэнь + ю + сюй + хай + + + + + + + + r (U), MMMM, d, EEEE + + + + + r (U), MMMM, d + + + + + r, MMM, d + + + + + r.MM.dd + + + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + B h + B h:mm + B h:mm:ss + E, B h + E, B h:mm + E, B h:mm:ss + r (U) + r, MMM + r, MMM, d + r, MMM, d, E + r (U), MMMM + r (U), MMMM, d + r (U), MMMM, d, E + a h + HH 'сех' + a h:mm + a h:mm:ss + a h (v) + HH 'сех' (v) + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + U, MM + U, MM.dd + U, MMM + U, MMM, d + r (U) + r (U) + r.MM + r.MM.dd + r.MM.dd (E) + r, MMM + r, MMM, d + r, MMM, d, E + r (U), MMMM + r (U), MMMM, d + r (U), MMMM, d, E + r (U), QQQ + r (U), QQQQ + + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' v M–M - dd.MM – dd.MM - dd.MM – dd.MM + MM.dd – MM.dd + MM.dd – MM.dd - E, dd.MM – E, dd.MM - E, dd.MM – E, dd.MM + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM - d–d MMM - d MMM – d MMM + MMM, d–d + MMM, d – MMM, d - ccc, d MMM – ccc, d MMM - ccc, d MMM – ccc, d MMM + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E - y–y 'ҫҫ'. G + U – U - MM.y – MM.y G - MM.y – MM.y G + y.MM – y.MM + y.MM – y.MM - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) - LLL – LLL y 'ҫ'. G - LLL y 'ҫ'. – LLL y 'ҫ'. G + U, MMM – MMM + U, MMM – U, MMM - d–d MMM y 'ҫ'. G - d MMM – d MMM y 'ҫ'. G - d MMM y 'ҫ'. – d MMM y 'ҫ'. G + U, MMM, d–d + U, MMM, d – MMM, d + U, MMM, d – U, MMM, d - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM y 'ҫ'. – ccc, d MMM y 'ҫ'. G + U, MMM, d, E – MMM, d, E + U, MMM, d, E – MMM, d, E + U, MMM, d, E – U, MMM, d, E - LLLL – LLLL y 'ҫ'. G - LLLL y 'ҫ'. – LLLL y 'ҫ'. G + U, MMMM – MMMM + U, MMMM – U, MMMM + + + + + + + + + тот + бабэ + хатур + кихак + тубэ + амшир + барамхат + бармуда + башнас + бауна + абиб + мисра + наси + + + + + + Диоклетиантан + + + Диокл-т. + + + Д-т. + + + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM + + + + + + + + + 1-мӗш уйӑх + 2-мӗш уйӑх + 3-мӗш уйӑх + 4-мӗш уйӑх + 5-мӗш уйӑх + 6-мӗш уйӑх + 7-мӗш уйӑх + 8-мӗш уйӑх + 9-мӗш уйӑх + 10-мӗш уйӑх + 11-мӗш уйӑх + 12-мӗш уйӑх + + + пӗрремӗш уйӑх + иккӗмӗш уйӑх + виҫҫӗмӗш уйӑх + тӑваттӑмӗш уйӑх + пиллӗкмӗш уйӑх + улттӑмӗш уйӑх + ҫиччӗмӗш уйӑх + саккӑрмӗш уйӑх + тӑххӑрмӗш уйӑх + вуннӑмӗш уйӑх + вун пӗрмӗш уйӑх + вун иккӗмӗш уйӑх + + + + + 1-мӗш уйӑх + 2-мӗш уйӑх + 3-мӗш уйӑх + 4-мӗш уйӑх + 5-мӗш уйӑх + 6-мӗш уйӑх + 7-мӗш уйӑх + 8-мӗш уйӑх + 9-мӗш уйӑх + 10-мӗш уйӑх + 11-мӗш уйӑх + 12-мӗш уйӑх + + + пӗрремӗш уйӑх + иккӗмӗш уйӑх + виҫҫӗмӗш уйӑх + тӑваттӑмӗш уйӑх + пиллӗкмӗш уйӑх + улттӑмӗш уйӑх + ҫиччӗмӗш уйӑх + саккӑрмӗш уйӑх + тӑххӑрмӗш уйӑх + вуннӑмӗш уйӑх + вун пӗрмӗш уйӑх + вун иккӗмӗш уйӑх + + + + + + + йӗкӗр {0} + + + йӗкӗр {0} + + + йӗкӗр {0} + + + + + йӗкӗр {0} + + + + + йӗкӗр {0} + + + йӗкӗр {0} + + + йӗкӗр {0} + + + + + + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + + + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + + + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + + + + + ипчхун + усу + кёнъчхип + чхунбун + чхёнъмён + когу + ипха + соман + манъджон + хачи + сосо + дэсо + ипхчху + чхосо + пэкхро + чхупун + халло + санъган + ипдон + сосоль + дэсоль + тонъджи + сохан + дэхан + + + ипчхун + усу + кёнъчхип + чхунбун + чхёнъмён + когу + ипха + соман + манъджон + хачи + сосо + дэсо + ипхчху + чхосо + пэкхро + чхупун + халло + санъган + ипдон + сосоль + дэсоль + тонъджи + сохан + дэхан + + + ипчхун + усу + кёнъчхип + чхунбун + чхёнъмён + когу + ипха + соман + манъджон + хачи + сосо + дэсо + ипхчху + чхосо + пэкхро + чхупун + халло + санъган + ипдон + сосоль + дэсоль + тонъджи + сохан + дэхан + + + + + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + кап-ча + ыль-чхук + пёнъ-ин + чонъ-мё + му-чин + ки-са + кёнъ-о + син-ми + им-син + ке-ю + кап-суль + ыль-хэ + пёнъ-ча + чонъ-чхук + му-ин + ки-мё + кёнъ-чин + син-са + им-о + ке-ми + кап-син + ыль-ю + пёнъ-суль + чонъ-хэ + му-ча + ки-чхук + кёнъ-ин + син-мё + им-чин + ке-са + кап-о + ыль-ми + пёнъ-син + чонъ-ю + му-суль + ки-хэ + кёнъ-ча + син-чхук + им-ин + ке-мё + кап-чин + ыль-са + пёнъ-о + чонъ-ми + му-син + ки-ю + кёнъ-суль + син-хэ + им-ча + ке-чхук + кап-ин + ыль-мё + пёнъ-чин + чонъ-са + му-о + ки-ми + кёнъ-син + син-ю + им-суль + ке-хэ + + + + + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + ча + чхук + ин + мё + чин + са + о + ми + син + ю + суль + хэ + + + + + + + + r (U), MMMM, d, EEEE + + + + + r (U), MMMM, d + + + + + r, MMM, d + + + + + r.MM.dd + + + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + r (U) + r, MMM + r, MMM, d + r, MMM, d, E + r (U), MMMM + r (U), MMMM, d + r (U), MMMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + U, MM + U, MM.dd + U, MMM + U, MMM, d + r (U) + r (U) + r.MM + r.MM.dd + r.MM.dd (E) + r, MMM + r, MMM, d + r, MMM, d, E + r (U), MMMM + r (U), MMMM, d + r (U), MMMM, d, E + r (U), QQQ + r (U), QQQQ + + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' v + + + M–M + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + U – U + + + y.MM – y.MM + y.MM – y.MM + + + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd + + + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) + + + U, MMM – MMM + U, MMM – U, MMM + + + U, MMM, d–d + U, MMM, d – MMM, d + U, MMM, d – U, MMM, d + + + U, MMM, d, E – MMM, d, E + U, MMM, d, E – MMM, d, E + U, MMM, d, E – U, MMM, d, E + + + U, MMMM – MMMM + U, MMMM – U, MMMM + + + + + + + + + мескерем + текемт + хедар + тахсас + тер + якатит + магабит + миазия + генбот + сэнэ + хамлэ + нахасэ + эпагомен + + + + + + тӗнче пуҫланнӑран + + + т. п-р. + + + т. п-р. + + + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM + + + + + + + + тӗнче пуҫланнӑран + + + т. п-р. + + + т. п-р. + + + + + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + B h + B h:mm + B h:mm:ss + E, B h + E, B h:mm + E, B h:mm:ss + E, a h + E, a h:mm + E, HH:mm + E, a h:mm:ss + E, HH:mm:ss + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + a h + HH 'сех' + a h:mm + a h:mm:ss + a h (v) + HH 'сех' (v) + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + M–M + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -1820,7 +4231,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic пуш ака ҫу - ҫӗр. + ҫӗрт. утӑ ҫур. авӑн @@ -1844,6 +4255,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + кӑр. + нар. + пуш + ака + ҫу + ҫӗрт. + утӑ + ҫур. + авӑн + юпа + чӳк + раш. + К Н @@ -1863,25 +4288,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic - выр. - тун. - ытл. - юн. - кӗҫ. - эр. - шӑм. + вр + тн + ыт + юн + кҫ + эр + шм + + + вр + тн + ыт + юн + кҫ + эр + шм - вырсарникун - тунтикун - ытларикун - юнкун - кӗҫнерникун - эрнекун - шӑматкун + вырсарни кун + тунти кун + ытлари кун + юн кун + кӗҫнерни кун + эрне кун + шӑмат кун + + вр + тн + ыт + юн + кҫ + эр + шм + В Т @@ -1891,67 +4334,135 @@ CLDR data files are interpreted according to the LDML specification (http://unic Э Ш + + вр + тн + ыт + юн + кҫ + эр + шм + + + вырсарни кун + тунти кун + ытлари кун + юн кун + кӗҫнерни кун + эрне кун + шӑмат кун + - 1-мӗш кв. - 2-мӗш кв. - 3-мӗш кв. - 4-мӗш кв. + 1-мӗш чӗр. + 2-мӗш чӗр. + 3-мӗш чӗр. + 4-мӗш чӗр. - 1-мӗш квартал - 2-мӗш квартал - 3-мӗш квартал - 4-мӗш квартал + 1-мӗш чӗрӗк + 2-мӗш чӗрӗк + 3-мӗш чӗрӗк + 4-мӗш чӗрӗк + + + + + 1-мӗш чӗр. + 2-мӗш чӗр. + 3-мӗш чӗр. + 4-мӗш чӗр. + + + 1-мӗш чӗрӗк + 2-мӗш чӗрӗк + 3-мӗш чӗрӗк + 4-мӗш чӗрӗк + + + + к. у. + к. х. + + + к. у. + к. х. + + + к. у. + к. х. + + + + + к. у. + к. х. + + + к. у. + к. х. + + + к. у. + к. х. + + + - Христос ҫуралнӑ кунччен - пирӗн эрӑччен - Христос ҫуралнӑ кунран - хальхи эрӑ + хальхи саманачченхи + хальхи саманачченхи + хальхи саманари + хальхи саманари - п. э. - х. э. + х. с-ч. + х. с. + + х. с-ч. + х. с-ч. + х. с. + х. с. + - EEEE, d MMMM y 'ҫ'. + y, MMMM, d, EEEE - d MMMM y 'ҫ'. + y, MMMM, d - d MMM y 'ҫ'. + y, MMM, d - dd.MM.y + y.MM.dd - HH:mm:ss zzzz + HH:mm:ss (zzzz) - HH:mm:ss z + HH:mm:ss (z) @@ -1987,124 +4498,183 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ccc, h:mm B - ccc, h:mm:ss B - ccc, d - E h:mm:ss a - y 'ҫ'. G - dd.MM.y GGGGG - LLL y 'ҫ'. G - d MMM y 'ҫ'. G - E, d MMM y 'ҫ'. G - h:mm a - h:mm:ss a - h:mm:ss a v - dd.MM - E, dd.MM - d MMM - ccc, d MMM - d MMMM - MMMM W-'мӗш' 'эрни' - MM.y - dd.MM.y - ccc, dd.MM.y 'ҫ'. - LLL y 'ҫ'. - d MMM y 'ҫ'. - E, d MMM y 'ҫ'. - LLLL y 'ҫ'. - QQQ y 'ҫ'. - QQQQ y 'ҫ'. - w-'мӗш' 'эрни' Y 'ҫ'. + B h + B h:mm + B h:mm:ss + E, B h + ccc, B h:mm + ccc, B h:mm:ss + d, ccc + E, a h + E, a h:mm + E, HH:mm + E, a h:mm:ss + E, HH:mm:ss + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + a h + HH 'сех' + a h:mm + a h:mm:ss + a h:mm:ss (v) + HH:mm:ss (v) + a h:mm (v) + HH:mm (v) + a h (v) + HH 'сех' (v) + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + MMMM, W-'мӗш' 'эрне' + MMMM, W-'мӗш' 'эрне' + MMMM, W-'мӗш' 'эрне' + y.MM + y.MM.dd + y.MM.dd (ccc) + y, MMM + y, MMM, d + y, MMM, d, E + y, MMMM + y, QQQ + y, QQQQ + Y, w-'мӗш' 'эрне' + Y, w-'мӗш' 'эрне' + Y, w-'мӗш' 'эрне' + + {0} ({1}) + - - y 'ҫ'. G – y 'ҫ'. G - y–y 'ҫҫ'. G + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm - MM.y G – MM.y G - MM.y – MM.y G - MM.y – MM.y G + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM - dd.MM.y – dd.MM.y G - dd.MM.y G – dd.MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y G – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) - LLL y 'ҫ'. G – LLL y 'ҫ'. G - LLL – LLL y 'ҫ'. G - LLL y – LLL y 'ҫҫ'. G + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM - d–d MMM y 'ҫ'. G - d MMM y 'ҫ'. G – d MMM y 'ҫ'. G - d MMM – d MMM y 'ҫ'. G - d MMM y – d MMM y 'ҫҫ'. G + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM y 'ҫ'. G – ccc, d MMM y 'ҫ'. G - ccc, d MMM – ccc, d MMM y 'ҫ'. G - ccc, d MMM y – ccc, d MMM y 'ҫҫ'. G + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + a h – a h + a h–h + + + HH–HH 'сех' + + + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm + + + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) + + + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) M–M - dd.MM – dd.MM - dd.MM – dd.MM + MM.dd – MM.dd + MM.dd – MM.dd - E, dd.MM – E, dd.MM - E, dd.MM – E, dd.MM + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM - d–d MMM - d MMM – d MMM + MMM, d–d + MMM, d – MMM, d - E, d MMM – E, d MMM - E, d MMM – E, d MMM + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E - MM.y – MM.y - MM.y – MM.y + y.MM – y.MM + y.MM – y.MM - dd.MM.y – dd.MM.y - dd.MM.y – dd.MM.y - dd.MM.y – dd.MM.y + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd + y.MM.dd – y.MM.dd - ccc, dd.MM.y – ccc, dd.MM.y - ccc, dd.MM.y – ccc, dd.MM.y - ccc, dd.MM.y – ccc, dd.MM.y + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) + y.MM.dd (E) – y.MM.dd (E) - LLL – LLL y 'ҫ'. - LLL y 'ҫ'. – LLL y 'ҫ'. + y, MMM – MMM + y, MMM – y, MMM - d–d MMM y 'ҫ'. - d MMM – d MMM y 'ҫ'. - d MMM y 'ҫ'. – d MMM y 'ҫ'. + y, MMM, d–d + y, MMM, d – MMM, d + y, MMM, d – y, MMM, d - ccc, d – ccc, d MMM y 'ҫ'. - ccc, d MMM – ccc, d MMM y 'ҫ'. - ccc, d MMM y 'ҫ'. – ccc, d MMM y 'ҫ'. + y, MMM, d, E – MMM, d, E + y, MMM, d, E – MMM, d, E + y, MMM, d, E – y, MMM, d, E - LLLL – LLLL y 'ҫ'. - LLLL y 'ҫ'. – LLLL y 'ҫ'. + y, MMMM – MMMM + y, MMMM – y, MMMM @@ -2112,98 +4682,251 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - тишрей - хешван - кислев - тевет - шеват - адар I - адар - адар II - нисан - ияр - сиван - таммуз - ав - элул - - тишрей - хешван - кислев - тевет - шеват - адар I - адар - адар II - нисан - ияр - сиван - таммуз - ав - элул + тишрей + хешван + кислев + тевет + шеват + адар-алеф + адар + адар-бет + нисан + ияр + сиван + таммуз + ав + элул - - тишрей - хешван - кислев - тевет - шеват - адар I - адар - адар II - нисан - ияр - сиван - таммуз - ав - элул - - тишрей - хешван - кислев - тевет - шеват - адар I - адар - адар II - нисан - ияр - сиван - таммуз - ав - элул + тишрей + хешван + кислев + тевет + шеват + адар-алеф + адар + адар-бет + нисан + ияр + сиван + таммуз + ав + элул - çут тĕнче пулса кайни + тӗнче пуҫланнӑран + + т. п-р. + + + т. п-р. + + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH 'сех' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -2211,96 +4934,231 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - чайтра - ваисакха - джанштха - асадха - сравана - бхадра - азвина - картика - аграхайана - пауза - магха - пхалгуна - - чайтра - ваисакха - джанштха - асадха - сравана - бхадра - азвина - картика - аграхайана - пауза - магха - пхалгуна - - - - - чайтра - ваисакха - джанштха - асадха - сравана - бхадра - азвина - картика - аграхайана - пауза - магха - пхалгуна - - - чайтра - ваисакха - джанштха - асадха - сравана - бхадра - азвина - картика - аграхайана - пауза - магха - пхалгуна + чайтра + ваисакха + джанштха + асадха + сравана + бхадра + азвина + картика + аграхайана + пауза + магха + пхалгуна - Сака + Сака саманари - Сака + Сака с. - Сака + Сака с. + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH 'сех' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -2309,95 +5167,247 @@ CLDR data files are interpreted according to the LDML specification (http://unic - мух. - саф. - раб. I - раб. II - джум. I - джум. II - радж. - шааб. - рам. - шав. - зуль-к. - зуль-х. + мух. + саф. + раб. I + раб. II + джум. I + джум. II + радж. + шааб. + рам. + шав. + зуль-к. + зуль-х. - мухаррам - сафар - раби-уль-авваль - раби-уль-ахир - джумад-уль-авваль - джумад-уль-ахир - раджаб - шаабан - рамадан - шавваль - зуль-каада - зуль-хиджжа - - - - - мух. - саф. - раб. I - раб. II - джум. I - джум. II - радж. - шааб. - рам. - шав. - зуль-к. - зуль-х. - - - мухаррам - сафар - раби-уль-авваль - раби-уль-ахир - джумад-уль-авваль - джумад-уль-ахир - раджаб - шаабан - рамадан - шавваль - зуль-каада - зуль-хиджжа + мухаррам + сафар + раби-уль-авваль + раби-уль-ахир + джумад-уль-авваль + джумад-уль-ахир + раджаб + шаабан + рамадан + шавваль + зуль-каада + зуль-хиджжа - хиджра хыҫҫӑн + хиджра хыҫҫӑнхи + хиджрӑччен - хиджра хҫн + х. х. + х-ч. - х-ра хҫн + х. х. + х-ч. + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -2405,742 +5415,921 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Тайка тапхăрĕ (645–650) - Хакути тапхăрĕ (650–671) - Хакухо тапхăрĕ (672–686) - Сючё тапхăрĕ (686–701) - Тайхо тапхăрĕ (701–704) - Кёюн тапхăрĕ (704–708) - Вадо тапхăрĕ (708–715) - Рэйки тапхăрĕ (715–717) - Ёро тапхăрĕ (717–724) - Дзинки тапхăрĕ (724–729) - Темпьё тапхăрĕ (729–749) - Темпьё тапхăрĕ (749–749) - Темпьё-Сьохо тапхăрĕ (749-757) - Темпьё-Ходзи тапхăрĕ (757-765) - Темпьё-Ходзи тапхăрĕ (765-767) - Джинго-Кёюн тапхăрĕ (767-770) - Хоки тапхăрĕ (770–780) - Теньё тапхăрĕ (781–782) - Енряку тапхăрĕ (782–806) - Дайдо тапхăрĕ (806–810) - Конин тапхăрĕ (810–824) - Тентьо тапхăрĕ (824–834) - Шова тапхăрĕ (834–848) - Кайо тапхăрĕ (848–851) - Ниндзю тапхăрĕ (851–854) - Сайко тапхăрĕ (854–857) - Теннан тапхăрĕ (857–859) - Йоган тапхăрĕ (859–877) - Генкей тапхăрĕ (877–885) - Нинна тапхăрĕ (885–889) - Кампьё тапхăрĕ (889–898) - Сьотай тапхăрĕ (898–901) - Энги тапхăрĕ (901–923) - Ентьо тапхăрĕ (923–931) - Сьёхэй тапхăрĕ (931–938) - Тенгьо тапхăрĕ (938–947) - Тенрияку тапхăрĕ (947–957) - Тентоку тапхăрĕ (957–961) - Ова тапхăрĕ (961–964) - Кохо тапхăрĕ (964–968) - Анна тапхăрĕ (968–970) - Тенроку тапхăрĕ (970–973) - Теньен тапхăрĕ (973–976) - Дзьоген тапхăрĕ (976–978) - Тенген тапхăрĕ (978–983) - Ейкан тапхăрĕ (983–985) - Канна тапхăрĕ (985–987) - Ейен тапхăрĕ (987–989) - Ейсо тапхăрĕ (989–990) - Сёряку тапхăрĕ (990–995) - Тётоку тапхăрĕ (995–999) - Тёхо тапхăрĕ (999–1004) - Канко тапхăрĕ (1004–1012) - Тёва тапхăрĕ (1012–1017) - Каннин тапхăрĕ (1017–1021) - Дзиан тапхăрĕ (1021–1024) - Мандзю тапхăрĕ (1024–1028) - Тёгэн тапхăрĕ (1028–1037) - Тёряку тапхăрĕ (1037–1040) - Тёкю тапхăрĕ (1040–1044) - Катоку тапхăрĕ (1044–1046) - Эйсо тапхăрĕ (1046–1053) - Тэнги тапхăрĕ (1053–1058) - Кохэй тапхăрĕ (1058–1065) - Дзиряку тапхăрĕ (1065–1069) - Энкю тапхăрĕ (1069–1074) - Сёхо тапхăрĕ (1074–1077) - Сёряку тапхăрĕ (1077–1081) - Эйхо тапхăрĕ (1081–1084) - Отоку тапхăрĕ (1084–1087) - Кандзи тапхăрĕ (1087–1094) - Кахо тапхăрĕ (1094–1096) - Эйтё тапхăрĕ (1096–1097) - Сётоку тапхăрĕ (1097–1099) - Кова тапхăрĕ (1099–1104) - Тёдзи тапхăрĕ (1104–1106) - Касё тапхăрĕ (1106–1108) - Тэннин тапхăрĕ (1108–1110) - Тэнъэй тапхăрĕ (1110–1113) - Эйкю тапхăрĕ (1113–1118) - Гэнъэй тапхăрĕ (1118–1120) - Хоан тапхăрĕ (1120–1124) - Тэндзи тапхăрĕ (1124–1126) - Дайдзи тапхăрĕ (1126–1131) - Тэнсё тапхăрĕ (1131–1132) - Тёсё тапхăрĕ (1132–1135) - Хоэн тапхăрĕ (1135–1141) - Эйдзи тапхăрĕ (1141–1142) - Кодзи тапхăрĕ (1142–1144) - Тэнё тапхăрĕ (1144–1145) - Кюан тапхăрĕ (1145–1151) - Нимпэй тапхăрĕ (1151–1154) - Кюдзю тапхăрĕ (1154–1156) - Хогэн тапхăрĕ (1156–1159) - Хэйдзи тапхăрĕ (1159–1160) - Эйряку тапхăрĕ (1160–1161) - Охо тапхăрĕ (1161–1163) - Тёкан тапхăрĕ (1163–1165) - Эйман тапхăрĕ (1165–1166) - Нинъан тапхăрĕ (1166–1169) - Као тапхăрĕ (1169–1171) - Сёан тапхăрĕ (1171–1175) - Ангэн тапхăрĕ (1175–1177) - Дзисё тапхăрĕ (1177–1181) - Ёва тапхăрĕ (1181–1182) - Дзюэй тапхăрĕ (1182–1184) - Гэнрюку тапхăрĕ (1184–1185) - Бундзи тапхăрĕ (1185–1190) - Кэнкю тапхăрĕ (1190–1199) - Сёдзи тапхăрĕ (1199–1201) - Кэннин тапхăрĕ (1201–1204) - Гэнкю тапхăрĕ (1204–1206) - Кэнъэй тапхăрĕ (1206–1207) - Сёгэн тапхăрĕ (1207–1211) - Кэнряку тапхăрĕ (1211–1213) - Кэмпо тапхăрĕ (1213–1219) - Сёкю тапхăрĕ (1219–1222) - Дзёо тапхăрĕ (1222–1224) - Гэннин тапхăрĕ (1224–1225) - Кароку тапхăрĕ (1225–1227) - Антэй тапхăрĕ (1227–1229) - Канки тапхăрĕ (1229–1232) - Дзёэй тапхăрĕ (1232–1233) - Тэмпуку тапхăрĕ (1233–1234) - Бунряку тапхăрĕ (1234–1235) - Катэй тапхăрĕ (1235–1238) - Рякунин тапхăрĕ (1238–1239) - Энъо тапхăрĕ (1239–1240) - Ниндзи тапхăрĕ (1240–1243) - Кангэн тапхăрĕ (1243–1247) - Ходзи тапхăрĕ (1247–1249) - Кэнтё тапхăрĕ (1249–1256) - Когэн тапхăрĕ (1256–1257) - Сёка тапхăрĕ (1257–1259) - Сёгэн тапхăрĕ (1259–1260) - Бунъо тапхăрĕ (1260–1261) - Котё тапхăрĕ (1261–1264) - Бунъэй тапхăрĕ (1264–1275) - Кэндзи тапхăрĕ (1275–1278) - Коан тапхăрĕ (1278–1288) - Сёо тапхăрĕ (1288–1293) - Эйнин тапхăрĕ (1293–1299) - Сёан тапхăрĕ (1299–1302) - Кэнгэн тапхăрĕ (1302–1303) - Кагэн тапхăрĕ (1303–1306) - Токудзи тапхăрĕ (1306–1308) - Энкэй тапхăрĕ (1308–1311) - Отё тапхăрĕ (1311–1312) - Сёва тапхăрĕ (1312–1317) - Бумпо тапхăрĕ (1317–1319) - Гэно тапхăрĕ (1319–1321) - Гэнкё тапхăрĕ (1321–1324) - Сётю тапхăрĕ (1324–1326) - Карэки тапхăрĕ (1326–1329) - Гэнтоку тапхăрĕ (1329–1331) - Гэнко тапхăрĕ (1331–1334) - Кэмму тапхăрĕ (1334–1336) - Энгэн тапхăрĕ (1336–1340) - Кококу тапхăрĕ (1340–1346) - Сёхэй тапхăрĕ (1346–1370) - Кэнтоку тапхăрĕ (1370–1372) - Бунтю тапхăрĕ (1372–1375) - Иэндзю тапхăрĕ (1375–1379) - Коряку тапхăрĕ (1379–1381) - Кова тапхăрĕ (1381–1384) - Гэнтю тапхăрĕ (1384–1392) - Мэйтоку тапхăрĕ (1384–1387) - Какэй тапхăрĕ (1387–1389) - Коо тапхăрĕ (1389–1390) - Мэйтоку тапхăрĕ (1390–1394) - Оэй тапхăрĕ (1394–1428) - Сётё тапхăрĕ (1428–1429) - Эйкё тапхăрĕ (1429–1441) - Какицу тапхăрĕ (1441–1444) - Банъан тапхăрĕ (1444–1449) - Хотоку тапхăрĕ (1449–1452) - Кётоку тапхăрĕ (1452–1455) - Косё тапхăрĕ (1455–1457) - Тёроку тапхăрĕ (1457–1460) - Кансё тапхăрĕ (1460–1466) - Бунсё тапхăрĕ (1466–1467) - Онин тапхăрĕ (1467–1469) - Буммэй тапхăрĕ (1469–1487) - Тёкё тапхăрĕ (1487–1489) - Энтоку тапхăрĕ (1489–1492) - Мэйо тапхăрĕ (1492–1501) - Бунки тапхăрĕ (1501–1504) - Эйсё тапхăрĕ (1504–1521) - Тайэй тапхăрĕ (1521–1528) - Кёроку тапхăрĕ (1528–1532) - Тэммон тапхăрĕ (1532–1555) - Кодзи тапхăрĕ (1555–1558) - Эйроку тапхăрĕ (1558–1570) - Гэнки тапхăрĕ (1570–1573) - Тэнсё тапхăрĕ (1573–1592) - Бунроку тапхăрĕ (1592–1596) - Кэйтё тапхăрĕ (1596–1615) - Гэнва тапхăрĕ (1615–1624) - Канъэй тапхăрĕ (1624–1644) - Сёхо тапхăрĕ (1644–1648) - Кэйан тапхăрĕ (1648–1652) - Сё тапхăрĕ (1652–1655) - Мэйряку тапхăрĕ (1655–1658) - Мандзи тапхăрĕ (1658–1661) - Камбун тапхăрĕ (1661–1673) - Эмпо тапхăрĕ (1673–1681) - Тэнва тапхăрĕ (1681–1684) - Дзёкё тапхăрĕ (1684–1688) - Гэнроку тапхăрĕ (1688–1704) - Хоэй тапхăрĕ (1704–1711) - Сётоку тапхăрĕ (1711–1716) - Кёхо тапхăрĕ (1716–1736) - Гэмбун тапхăрĕ (1736–1741) - Кампо тапхăрĕ (1741–1744) - Энкё тапхăрĕ (1744–1748) - Канъэн тапхăрĕ (1748–1751) - Хоряку тапхăрĕ (1751–1764) - Мэйва тапхăрĕ (1764–1772) - Анъэй тапхăрĕ (1772–1781) - Тэммэй тапхăрĕ (1781–1789) - Кансэй тапхăрĕ (1789–1801) - Кёва тапхăрĕ (1801–1804) - Бунка тапхăрĕ (1804–1818) - Бунсэй тапхăрĕ (1818–1830) - Тэмпо тапхăрĕ (1830–1844) - Кока тапхăрĕ (1844–1848) - Каэй тапхăрĕ (1848–1854) - Ансэй тапхăрĕ (1854–1860) - Манъэн тапхăрĕ (1860–1861) - Бункю тапхăрĕ (1861–1864) - Гендзи тапхăрĕ (1864–1865) - Кейо тапхăрĕ (1865–1868) - Мэйдзи тапхăрĕ - Тайсьо тапхăрĕ - Сьова тапхăрĕ - Хэйсэй тапхăрĕ - Рэйва тапхăрĕ + Тайка (645–650) + Хакути (650–671) + Хакухо (672–686) + Сютё (686–701) + Тайхо (701–704) + Кёун (704–708) + Вадо (708–715) + Рэйки (715–717) + Ёро (717–724) + Дзинки (724–729) + Тэмпьё (729–749) + Тэмпьё-Канпо (749–749) + Тэмпьё-Сёхо (749-757) + Тэмпьё-Ходзи (757-765) + Тэмпьё-Дзинго (765-767) + Дзинго-Кёун (767-770) + Хоки (770–781) + Тэнъо (781–782) + Энряку (782–806) + Дайдо (806–810) + Конин (810–824) + Тэнтьё (824–834) + Дзёва (834–848) + Касё (848–851) + Ниндзю (851–854) + Сайко (854–857) + Тэнъан (857–859) + Дзёган (859–877) + Гангё (877–885) + Нинна (885–889) + Канпё (889–898) + Сётай (898–901) + Энги (901–923) + Энтё (923–931) + Дзёхей (931–938) + Тэнгё (938–947) + Тэнряку (947–957) + Тэнтоку (957–961) + Ова (961–964) + Кохо (964–968) + Анна (968–970) + Тэнроку (970–973) + Тэнъэн (973–976) + Дзёгэн (976–978) + Тэнгэн (978–983) + Эйкан (983–985) + Канна (985–987) + Эйэн (987–989) + Эйсо (989–990) + Сёряку (990–995) + Тётоку (995–999) + Тёхо (999–1004) + Канко (1004–1012) + Тёва (1012–1017) + Каннин (1017–1021) + Дзиан (1021–1024) + Мандзю (1024–1028) + Тёгэн (1028–1037) + Тёряку (1037–1040) + Тёкю (1040–1044) + Кантоку (1044–1046) + Эйсё (1046–1053) + Тэнги (1053–1058) + Кохэй (1058–1065) + Дзиряку (1065–1069) + Энкю (1069–1074) + Дзюхо (1074–1077) + Дзёряку (1077–1081) + Эйхо (1081–1084) + Отоку (1084–1087) + Кандзи (1087–1094) + Кахо (1094–1096) + Эйтё (1096–1097) + Дзётоку (1097–1099) + Кова (1099–1104) + Тёдзи (1104–1106) + Кадзё (1106–1108) + Тэннин (1108–1110) + Тэнъэй (1110–1113) + Эйкю (1113–1118) + Гэнъэй (1118–1120) + Хоан (1120–1124) + Тэндзи (1124–1126) + Дайдзи (1126–1131) + Тэнсё (1131–1132) + Тёсё (1132–1135) + Хоэн (1135–1141) + Эйдзи (1141–1142) + Кодзи (1142–1144) + Тэнъё (1144–1145) + Кюан (1145–1151) + Нимпэй (1151–1154) + Кюдзю (1154–1156) + Хогэн (1156–1159) + Хэйдзи (1159–1160) + Эйряку (1160–1161) + Охо (1161–1163) + Тёкан (1163–1165) + Эйман (1165–1166) + Нинъан (1166–1169) + Као (1169–1171) + Дзёан (1171–1175) + Ангэн (1175–1177) + Дзисё (1177–1181) + Ёва (1181–1182) + Дзюэй (1182–1184) + Гэнрюку (1184–1185) + Бундзи (1185–1190) + Кэнкю (1190–1199) + Сёдзи (1199–1201) + Кэннин (1201–1204) + Гэнкю (1204–1206) + Кэнъэй (1206–1207) + Дзёгэн (1207–1211) + Кэнряку (1211–1213) + Кэмпо (1213–1219) + Дзёкю (1219–1222) + Дзёо (1222–1224) + Гэннин (1224–1225) + Кароку (1225–1227) + Антэй (1227–1229) + Канги (1229–1232) + Дзёэй (1232–1233) + Тэмпуку (1233–1234) + Бунряку (1234–1235) + Катэй (1235–1238) + Рякунин (1238–1239) + Энъо (1239–1240) + Ниндзи (1240–1243) + Кангэн (1243–1247) + Ходзи (1247–1249) + Кэнтё (1249–1256) + Когэн (1256–1257) + Сёка (1257–1259) + Сёгэн (1259–1260) + Бунъо (1260–1261) + Котё (1261–1264) + Бунъэй (1264–1275) + Кэндзи (1275–1278) + Коан (1278–1288) + Сёо (1288–1293) + Эйнин (1293–1299) + Сёан (1299–1302) + Кэнгэн (1302–1303) + Кагэн (1303–1306) + Токудзи (1306–1308) + Энкё (1308–1311) + Отё (1311–1312) + Сёва (1312–1317) + Бумпо (1317–1319) + Гэнъо (1319–1321) + Гэнко (1321–1324) + Сётю (1324–1326) + Каряку (1326–1329) + Гэнтоку (1329–1331) + Гэнко (1331–1334) + Кэнму (1334–1336) + Энгэн (1336–1340) + Кококу (1340–1346) + Сёхэй (1346–1370) + Кэнтоку (1370–1372) + Бунтю (1372–1375) + Тэндзю (1375–1379) + Коряку (1379–1381) + Кова (1381–1384) + Гэнтю (1384–1392) + Ситоку (1384–1387) + Какэй (1387–1389) + Коо (1389–1390) + Мэйтоку (1390–1394) + Оэй (1394–1428) + Сётё (1428–1429) + Эйкё (1429–1441) + Какицу (1441–1444) + Бунъан (1444–1449) + Хотоку (1449–1452) + Кётоку (1452–1455) + Кёсё (1455–1457) + Тёроку (1457–1460) + Кансё (1460–1466) + Бунсё (1466–1467) + Онин (1467–1469) + Бунмэй (1469–1487) + Тёкё (1487–1489) + Энтоку (1489–1492) + Мэйо (1492–1501) + Бунки (1501–1504) + Эйсё (1504–1521) + Дайэй (1521–1528) + Кёроку (1528–1532) + Тэнбун (1532–1555) + Кодзи (1555–1558) + Эйроку (1558–1570) + Гэнки (1570–1573) + Тэнсё (1573–1592) + Бунроку (1592–1596) + Кэйтё (1596–1615) + Гэнна (1615–1624) + Канъэй (1624–1644) + Сёхё (1644–1648) + Кэйан (1648–1652) + Дзёо (1652–1655) + Мэйрэки (1655–1658) + Мандзи (1658–1661) + Камбун (1661–1673) + Эмпо (1673–1681) + Тэнна (1681–1684) + Дзёкё (1684–1688) + Гэнроку (1688–1704) + Хоэй (1704–1711) + Сётоку (1711–1716) + Кёхо (1716–1736) + Гэмбун (1736–1741) + Кампо (1741–1744) + Энкё (1744–1748) + Канъэн (1748–1751) + Хореки (1751–1764) + Мэйва (1764–1772) + Анъэй (1772–1781) + Тэнмэй (1781–1789) + Кансэй (1789–1801) + Кёва (1801–1804) + Бунка (1804–1818) + Бунсэй (1818–1830) + Тэнпо (1830–1844) + Кока (1844–1848) + Каэй (1848–1854) + Ансэй (1854–1860) + Манъэн (1860–1861) + Бункю (1861–1864) + Гэндзи (1864–1865) + Кейо (1865–1868) + Мэйдзи + Тайсё + Сёва + Хэйсэй + Рэйва - Тайка тпхр. (645–650) - Хакути тпхр. (650–671) - Хакухо тпхр. (672–686) - Сючё тпхр. (686–701) - Тайхо тпхр. (701–704) - Кёюн тпхр. (704–708) - Вадо тпхр. (708–715) - Рэйки тпхр. (715–717) - Ёро тпхр. (717–724) - Дзинки тпхр. (724–729) - Темпьё тпхр. (729–749) - Т.-кампо тпхр. (749–749) - Темпьё-Сьохо тпхр. (749-757) - Темпьё-Ходзи тпхр. (757-765) - Темпьё-Ходзи тпхр. (765-767) - Джинго-Кёюн тпхр. (767-770) - Хоки тпхр. (770–780) - Теньё тпхр. (781–782) - Енряку тпхр. (782–806) - Дайдо тпхр. (806–810) - Конин тпхр. (810–824) - Тентьо тпхр. (824–834) - Шова тпхр. (834–848) - Кайо тпхр. (848–851) - Ниндзю тпхр. (851–854) - Сайко тпхр. (854–857) - Теннан тпхр. (857–859) - Йоган тпхр. (859–877) - Генкей тпхр. (877–885) - Нинна тпхр. (885–889) - Кампьё тпхр. (889–898) - Сьотай тпхр. (898–901) - Энги тпхр. (901–923) - Ентьо тпхр. (923–931) - Сьёхэй тпхр. (931–938) - Тенгьо тпхр. (938–947) - Тенрияку тпхр. (947–957) - Тентоку тпхр. (957–961) - Ова тпхр. (961–964) - Кохо тпхр. (964–968) - Анна тпхр. (968–970) - Тенроку тпхр. (970–973) - Теньен тпхр. (973–976) - Дзьоген тпхр. (976–978) - Тенген тпхр. (978–983) - Ейкан тпхр. (983–985) - Канна тпхр. (985–987) - Ейен тпхр. (987–989) - Ейсо тпхр. (989–990) - Сёряку тпхр. (990–995) - Тётоку тпхр. (995–999) - Тёхо тпхр. (999–1004) - Канко тпхр. (1004–1012) - Тёва тпхр. (1012–1017) - Каннин тпхр. (1017–1021) - Дзиан тпхр. (1021–1024) - Мандзю тпхр. (1024–1028) - Тёгэн тпхр. (1028–1037) - Тёряку тпхр. (1037–1040) - Тёкю тпхр. (1040–1044) - Катоку тпхр. (1044–1046) - Эйсо тпхр. (1046–1053) - Тэнги тпхр. (1053–1058) - Кохэй тпхр. (1058–1065) - Дзиряку тпхр. (1065–1069) - Энкю тпхр. (1069–1074) - Сёхо тпхр. (1074–1077) - Сёряку тпхр. (1077–1081) - Эйхо тпхр. (1081–1084) - Отоку тпхр. (1084–1087) - Кандзи тпхр. (1087–1094) - Кахо тпхр. (1094–1096) - Эйтё тпхр. (1096–1097) - Сётоку тпхр. (1097–1099) - Кова тпхр. (1099–1104) - Тёдзи тпхр. (1104–1106) - Касё тпхр. (1106–1108) - Тэннин тпхр. (1108–1110) - Тэнъэй тпхр. (1110–1113) - Эйкю тпхр. (1113–1118) - Гэнъэй тпхр. (1118–1120) - Хоан тпхр. (1120–1124) - Тэндзи тпхр. (1124–1126) - Дайдзи тпхр. (1126–1131) - Тэнсё тпхр. (1131–1132) - Тёсё тпхр. (1132–1135) - Хоэн тпхр. (1135–1141) - Эйдзи тпхр. (1141–1142) - Кодзи тпхр. (1142–1144) - Тэнё тпхр. (1144–1145) - Кюан тпхр. (1145–1151) - Нимпэй тпхр. (1151–1154) - Кюдзю тпхр. (1154–1156) - Хогэн тпхр. (1156–1159) - Хэйдзи тпхр. (1159–1160) - Эйряку тпхр. (1160–1161) - Охо тпхр. (1161–1163) - Тёкан тпхр. (1163–1165) - Эйман тпхр. (1165–1166) - Нинъан тпхр. (1166–1169) - Као тпхр. (1169–1171) - Сёан тпхр. (1171–1175) - Ангэн тпхр. (1175–1177) - Дзисё тпхр. (1177–1181) - Ёва тпхр. (1181–1182) - Дзюэй тпхр. (1182–1184) - Гэнрюку тпхр. (1184–1185) - Бундзи тпхр. (1185–1190) - Кэнкю тпхр. (1190–1199) - Сёдзи тпхр. (1199–1201) - Кэннин тпхр. (1201–1204) - Гэнкю тпхр. (1204–1206) - Кэнъэй тпхр. (1206–1207) - Сёгэн тпхр. (1207–1211) - Кэнряку тпхр. (1211–1213) - Кэмпо тпхр. (1213–1219) - Сёкю тпхр. (1219–1222) - Дзёо тпхр. (1222–1224) - Гэннин тпхр. (1224–1225) - Кароку тпхр. (1225–1227) - Антэй тпхр. (1227–1229) - Канки тпхр. (1229–1232) - Дзёэй тпхр. (1232–1233) - Тэмпуку тпхр. (1233–1234) - Бунряку тпхр. (1234–1235) - Катэй тпхр. (1235–1238) - Рякунин тпхр. (1238–1239) - Энъо тпхр. (1239–1240) - Ниндзи тпхр. (1240–1243) - Кангэн тпхр. (1243–1247) - Ходзи тпхр. (1247–1249) - Кэнтё тпхр. (1249–1256) - Когэн тпхр. (1256–1257) - Сёка тпхр. (1257–1259) - Сёгэн тпхр. (1259–1260) - Бунъо тпхр. (1260–1261) - Котё тпхр. (1261–1264) - Бунъэй тпхр. (1264–1275) - Кэндзи тпхр. (1275–1278) - Коан тпхр. (1278–1288) - Сёо тпхр. (1288–1293) - Эйнин тпхр. (1293–1299) - Сёан тпхр. (1299–1302) - Кэнгэн тпхр. (1302–1303) - Кагэн тпхр. (1303–1306) - Токудзи тпхр. (1306–1308) - Энкэй тпхр. (1308–1311) - Отё тпхр. (1311–1312) - Сёва тпхр. (1312–1317) - Бумпо тпхр. (1317–1319) - Гэно тпхр. (1319–1321) - Гэнкё тпхр. (1321–1324) - Сётю тпхр. (1324–1326) - Карэки тпхр. (1326–1329) - Гэнтоку тпхр. (1329–1331) - Гэнко тпхр. (1331–1334) - Кэмму тпхр. (1334–1336) - Энгэн тпхр. (1336–1340) - Кококу тпхр. (1340–1346) - Сёхэй тпхр. (1346–1370) - Кэнтоку тпхр. (1370–1372) - Бунтю тпхр. (1372–1375) - Иэндзю тпхр. (1375–1379) - Коряку тпхр. (1379–1381) - Кова тпхр. (1381–1384) - Гэнтю тпхр. (1384–1392) - Мэйтоку тпхр. (1384–1387) - Какэй тпхр. (1387–1389) - Коо тпхр. (1389–1390) - Мэйтоку тпхр. (1390–1394) - Оэй тпхр. (1394–1428) - Сётё тпхр. (1428–1429) - Эйкё тпхр. (1429–1441) - Какицу тпхр. (1441–1444) - Банъан тпхр. (1444–1449) - Хотоку тпхр. (1449–1452) - Кётоку тпхр. (1452–1455) - Косё тпхр. (1455–1457) - Тёроку тпхр. (1457–1460) - Кансё тпхр. (1460–1466) - Бунсё тпхр. (1466–1467) - Онин тпхр. (1467–1469) - Буммэй тпхр. (1469–1487) - Тёкё тпхр. (1487–1489) - Энтоку тпхр. (1489–1492) - Мэйо тпхр. (1492–1501) - Бунки тпхр. (1501–1504) - Эйсё тпхр. (1504–1521) - Тайэй тпхр. (1521–1528) - Кёроку тпхр. (1528–1532) - Тэммон тпхр. (1532–1555) - Кодзи тпхр. (1555–1558) - Эйроку тпхр. (1558–1570) - Гэнки тпхр. (1570–1573) - Тэнсё тпхр. (1573–1592) - Бунроку тпхр. (1592–1596) - Кэйтё тпхр. (1596–1615) - Гэнва тпхр. (1615–1624) - Канъэй тпхр. (1624–1644) - Сёхо тпхр. (1644–1648) - Кэйан тпхр. (1648–1652) - Сё тпхр. (1652–1655) - Мэйряку тпхр. (1655–1658) - Мандзи тпхр. (1658–1661) - Камбун тпхр. (1661–1673) - Эмпо тпхр. (1673–1681) - Тэнва тпхр. (1681–1684) - Дзёкё тпхр. (1684–1688) - Гэнроку тпхр. (1688–1704) - Хоэй тпхр. (1704–1711) - Сётоку тпхр. (1711–1716) - Кёхо тпхр. (1716–1736) - Гэмбун тпхр. (1736–1741) - Кампо тпхр. (1741–1744) - Энкё тпхр. (1744–1748) - Канъэн тпхр. (1748–1751) - Хоряку тпхр. (1751–1764) - Мэйва тпхр. (1764–1772) - Анъэй тпхр. (1772–1781) - Тэммэй тпхр. (1781–1789) - Кансэй тпхр. (1789–1801) - Кёва тпхр. (1801–1804) - Бунка тпхр. (1804–1818) - Бунсэй тпхр. (1818–1830) - Тэмпо тпхр. (1830–1844) - Кока тпхр. (1844–1848) - Каэй тпхр. (1848–1854) - Ансэй тпхр. (1854–1860) - Манъэн тпхр. (1860–1861) - Бункю тпхр. (1861–1864) - Гендзи тпхр. (1864–1865) - Кейо тпхр. (1865–1868) - Мэйдзи тпхр. - Тайсьо тпхр. - Сьова тпхр. - Хэйсэй тпхр. - Рэйва тпхр. + Тайка (645–650) + Хакути (650–671) + Хакухо (672–686) + Сютё (686–701) + Тайхо (701–704) + Кёун (704–708) + Вадо (708–715) + Рэйки (715–717) + Ёро (717–724) + Дзинки (724–729) + Тэмпьё (729–749) + Тэмпьё-Канпо (749–749) + Тэмпьё-Сёхо (749-757) + Тэмпьё-Ходзи (757-765) + Тэмпьё-Дзинго (765-767) + Дзинго-Кёун (767-770) + Хоки (770–781) + Тэнъо (781–782) + Энряку (782–806) + Дайдо (806–810) + Конин (810–824) + Тэнтьё (824–834) + Дзёва (834–848) + Касё (848–851) + Ниндзю (851–854) + Сайко (854–857) + Тэнъан (857–859) + Дзёган (859–877) + Гангё (877–885) + Нинна (885–889) + Канпё (889–898) + Сётай (898–901) + Энги (901–923) + Энтё (923–931) + Дзёхей (931–938) + Тэнгё (938–947) + Тэнряку (947–957) + Тэнтоку (957–961) + Ова (961–964) + Кохо (964–968) + Анна (968–970) + Тэнроку (970–973) + Тэнъэн (973–976) + Дзёгэн (976–978) + Тэнгэн (978–983) + Эйкан (983–985) + Канна (985–987) + Эйэн (987–989) + Эйсо (989–990) + Сёряку (990–995) + Тётоку (995–999) + Тёхо (999–1004) + Канко (1004–1012) + Тёва (1012–1017) + Каннин (1017–1021) + Дзиан (1021–1024) + Мандзю (1024–1028) + Тёгэн (1028–1037) + Тёряку (1037–1040) + Тёкю (1040–1044) + Кантоку (1044–1046) + Эйсё (1046–1053) + Тэнги (1053–1058) + Кохэй (1058–1065) + Дзиряку (1065–1069) + Энкю (1069–1074) + Дзюхо (1074–1077) + Дзёряку (1077–1081) + Эйхо (1081–1084) + Отоку (1084–1087) + Кандзи (1087–1094) + Кахо (1094–1096) + Эйтё (1096–1097) + Дзётоку (1097–1099) + Кова (1099–1104) + Тёдзи (1104–1106) + Кадзё (1106–1108) + Тэннин (1108–1110) + Тэнъэй (1110–1113) + Эйкю (1113–1118) + Гэнъэй (1118–1120) + Хоан (1120–1124) + Тэндзи (1124–1126) + Дайдзи (1126–1131) + Тэнсё (1131–1132) + Тёсё (1132–1135) + Хоэн (1135–1141) + Эйдзи (1141–1142) + Кодзи (1142–1144) + Тэнъё (1144–1145) + Кюан (1145–1151) + Нимпэй (1151–1154) + Кюдзю (1154–1156) + Хогэн (1156–1159) + Хэйдзи (1159–1160) + Эйряку (1160–1161) + Охо (1161–1163) + Тёкан (1163–1165) + Эйман (1165–1166) + Нинъан (1166–1169) + Као (1169–1171) + Дзёан (1171–1175) + Ангэн (1175–1177) + Дзисё (1177–1181) + Ёва (1181–1182) + Дзюэй (1182–1184) + Гэнрюку (1184–1185) + Бундзи (1185–1190) + Кэнкю (1190–1199) + Сёдзи (1199–1201) + Кэннин (1201–1204) + Гэнкю (1204–1206) + Кэнъэй (1206–1207) + Дзёгэн (1207–1211) + Кэнряку (1211–1213) + Кэмпо (1213–1219) + Дзёкю (1219–1222) + Дзёо (1222–1224) + Гэннин (1224–1225) + Кароку (1225–1227) + Антэй (1227–1229) + Канги (1229–1232) + Дзёэй (1232–1233) + Тэмпуку (1233–1234) + Бунряку (1234–1235) + Катэй (1235–1238) + Рякунин (1238–1239) + Энъо (1239–1240) + Ниндзи (1240–1243) + Кангэн (1243–1247) + Ходзи (1247–1249) + Кэнтё (1249–1256) + Когэн (1256–1257) + Сёка (1257–1259) + Сёгэн (1259–1260) + Бунъо (1260–1261) + Котё (1261–1264) + Бунъэй (1264–1275) + Кэндзи (1275–1278) + Коан (1278–1288) + Сёо (1288–1293) + Эйнин (1293–1299) + Сёан (1299–1302) + Кэнгэн (1302–1303) + Кагэн (1303–1306) + Токудзи (1306–1308) + Энкё (1308–1311) + Отё (1311–1312) + Сёва (1312–1317) + Бумпо (1317–1319) + Гэнъо (1319–1321) + Гэнко (1321–1324) + Сётю (1324–1326) + Каряку (1326–1329) + Гэнтоку (1329–1331) + Гэнко (1331–1334) + Кэнму (1334–1336) + Энгэн (1336–1340) + Кококу (1340–1346) + Сёхэй (1346–1370) + Кэнтоку (1370–1372) + Бунтю (1372–1375) + Тэндзю (1375–1379) + Коряку (1379–1381) + Кова (1381–1384) + Гэнтю (1384–1392) + Ситоку (1384–1387) + Какэй (1387–1389) + Коо (1389–1390) + Мэйтоку (1390–1394) + Оэй (1394–1428) + Сётё (1428–1429) + Эйкё (1429–1441) + Какицу (1441–1444) + Бунъан (1444–1449) + Хотоку (1449–1452) + Кётоку (1452–1455) + Кёсё (1455–1457) + Тёроку (1457–1460) + Кансё (1460–1466) + Бунсё (1466–1467) + Онин (1467–1469) + Бунмэй (1469–1487) + Тёкё (1487–1489) + Энтоку (1489–1492) + Мэйо (1492–1501) + Бунки (1501–1504) + Эйсё (1504–1521) + Дайэй (1521–1528) + Кёроку (1528–1532) + Тэнбун (1532–1555) + Кодзи (1555–1558) + Эйроку (1558–1570) + Гэнки (1570–1573) + Тэнсё (1573–1592) + Бунроку (1592–1596) + Кэйтё (1596–1615) + Гэнна (1615–1624) + Канъэй (1624–1644) + Сёхё (1644–1648) + Кэйан (1648–1652) + Дзёо (1652–1655) + Мэйрэки (1655–1658) + Мандзи (1658–1661) + Камбун (1661–1673) + Эмпо (1673–1681) + Тэнна (1681–1684) + Дзёкё (1684–1688) + Гэнроку (1688–1704) + Хоэй (1704–1711) + Сётоку (1711–1716) + Кёхо (1716–1736) + Гэмбун (1736–1741) + Кампо (1741–1744) + Энкё (1744–1748) + Канъэн (1748–1751) + Хореки (1751–1764) + Мэйва (1764–1772) + Анъэй (1772–1781) + Тэнмэй (1781–1789) + Кансэй (1789–1801) + Кёва (1801–1804) + Бунка (1804–1818) + Бунсэй (1818–1830) + Тэнпо (1830–1844) + Кока (1844–1848) + Каэй (1848–1854) + Ансэй (1854–1860) + Манъэн (1860–1861) + Бункю (1861–1864) + Гэндзи (1864–1865) + Кейо (1865–1868) + Мэйдзи + Тайсё + Сёва + Хэйсэй + Рэйва - Тайка (645–650) - Хакути (650–671) - Хакухо (672–686) - Сючё (686–701) - Тайхо (701–704) - Кёюн (704–708) - Вадо (708–715) - Рэйки (715–717) - Ёро (717–724) - Дзинки (724–729) - Темпьё (729–749) - Темпьё-кампо (749–749) - Темпьё-Сьохо (749-757) - Темпьё-Ходзи (757-765) - Темпьё-Ходзи (765-767) - Джинго-Кёюн (767-770) - Хоки (770–780) - Теньё (781–782) - Енряку (782–806) - Дайдо (806–810) - Конин (810–824) - Тентьо (824–834) - Шова (834–848) - Кайо (848–851) - Ниндзю (851–854) - Сайко (854–857) - Теннан (857–859) - Йоган (859–877) - Генкей (877–885) - Нинна (885–889) - Кампьё (889–898) - Сьотай (898–901) - Энги (901–923) - Ентьо (923–931) - Сьёхэй (931–938) - Тенгьо (938–947) - Тенрияку (947–957) - Тентоку (957–961) - Ова (961–964) - Кохо (964–968) - Анна (968–970) - Тенроку (970–973) - Теньен (973–976) - Дзьоген (976–978) - Тенген (978–983) - Ейкан (983–985) - Канна (985–987) - Ейен (987–989) - Ейсо (989–990) - Сёряку (990–995) - Тётоку (995–999) - Тёхо (999–1004) - Канко (1004–1012) - Тёва (1012–1017) - Каннин (1017–1021) - Дзиан (1021–1024) - Мандзю (1024–1028) - Тёгэн (1028–1037) - Тёряку (1037–1040) - Тёкю (1040–1044) - Катоку (1044–1046) - Эйсо (1046–1053) - Тэнги (1053–1058) - Кохэй (1058–1065) - Дзиряку (1065–1069) - Энкю (1069–1074) - Сёхо (1074–1077) - Сёряку (1077–1081) - Эйхо (1081–1084) - Отоку (1084–1087) - Кандзи (1087–1094) - Кахо (1094–1096) - Эйтё (1096–1097) - Сётоку (1097–1099) - Кова (1099–1104) - Тёдзи (1104–1106) - Касё (1106–1108) - Тэннин (1108–1110) - Тэнъэй (1110–1113) - Эйкю (1113–1118) - Гэнъэй (1118–1120) - Хоан (1120–1124) - Тэндзи (1124–1126) - Дайдзи (1126–1131) - Тэнсё (1131–1132) - Тёсё (1132–1135) - Хоэн (1135–1141) - Эйдзи (1141–1142) - Кодзи (1142–1144) - Тэнё (1144–1145) - Кюан (1145–1151) - Нимпэй (1151–1154) - Кюдзю (1154–1156) - Хогэн (1156–1159) - Хэйдзи (1159–1160) - Эйряку (1160–1161) - Охо (1161–1163) - Тёкан (1163–1165) - Эйман (1165–1166) - Нинъан (1166–1169) - Као (1169–1171) - Сёан (1171–1175) - Ангэн (1175–1177) - Дзисё (1177–1181) - Ёва (1181–1182) - Дзюэй (1182–1184) - Гэнрюку (1184–1185) - Бундзи (1185–1190) - Кэнкю (1190–1199) - Сёдзи (1199–1201) - Кэннин (1201–1204) - Гэнкю (1204–1206) - Кэнъэй (1206–1207) - Сёгэн (1207–1211) - Кэнряку (1211–1213) - Кэмпо (1213–1219) - Сёкю (1219–1222) - Дзёо (1222–1224) - Гэннин (1224–1225) - Кароку (1225–1227) - Антэй (1227–1229) - Канки (1229–1232) - Дзёэй (1232–1233) - Тэмпуку (1233–1234) - Бунряку (1234–1235) - Катэй (1235–1238) - Рякунин (1238–1239) - Энъо (1239–1240) - Ниндзи (1240–1243) - Кангэн (1243–1247) - Ходзи (1247–1249) - Кэнтё (1249–1256) - Когэн (1256–1257) - Сёка (1257–1259) - Сёгэн (1259–1260) - Бунъо (1260–1261) - Котё (1261–1264) - Бунъэй (1264–1275) - Кэндзи (1275–1278) - Коан (1278–1288) - Сёо (1288–1293) - Эйнин (1293–1299) - Сёан (1299–1302) - Кэнгэн (1302–1303) - Кагэн (1303–1306) - Токудзи (1306–1308) - Энкэй (1308–1311) - Отё (1311–1312) - Сёва (1312–1317) - Бумпо (1317–1319) - Гэно (1319–1321) - Гэнкё (1321–1324) - Сётю (1324–1326) - Карэки (1326–1329) - Гэнтоку (1329–1331) - Гэнко (1331–1334) - Кэмму (1334–1336) - Энгэн (1336–1340) - Кококу (1340–1346) - Сёхэй (1346–1370) - Кэнтоку (1370–1372) - Бунтю (1372–1375) - Иэндзю (1375–1379) - Коряку (1379–1381) - Кова (1381–1384) - Гэнтю (1384–1392) - Мэйтоку (1384–1387) - Какэй (1387–1389) - Коо (1389–1390) - Мэйтоку (1390–1394) - Оэй (1394–1428) - Сётё (1428–1429) - Эйкё (1429–1441) - Какицу (1441–1444) - Банъан (1444–1449) - Хотоку (1449–1452) - Кётоку (1452–1455) - Косё (1455–1457) - Тёроку (1457–1460) - Кансё (1460–1466) - Бунсё (1466–1467) - Онин (1467–1469) - Буммэй (1469–1487) - Тёкё (1487–1489) - Энтоку (1489–1492) - Мэйо (1492–1501) - Бунки (1501–1504) - Эйсё (1504–1521) - Тайэй (1521–1528) - Кёроку (1528–1532) - Тэммон (1532–1555) - Кодзи (1555–1558) - Эйроку (1558–1570) - Гэнки (1570–1573) - Тэнсё (1573–1592) - Бунроку (1592–1596) - Кэйтё (1596–1615) - Гэнва (1615–1624) - Канъэй (1624–1644) - Сёхо (1644–1648) - Кэйан (1648–1652) - Сё (1652–1655) - Мэйряку (1655–1658) - Мандзи (1658–1661) - Камбун (1661–1673) - Эмпо (1673–1681) - Тэнва (1681–1684) - Дзёкё (1684–1688) - Гэнроку (1688–1704) - Хоэй (1704–1711) - Сётоку (1711–1716) - Кёхо (1716–1736) - Гэмбун (1736–1741) - Кампо (1741–1744) - Энкё (1744–1748) - Канъэн (1748–1751) - Хоряку (1751–1764) - Мэйва (1764–1772) - Анъэй (1772–1781) - Бунка (1804–1818) - Кансэй (1789–1801) - Кёва (1801–1804) - Бунка (1804–1818) - Бунсэй (1818–1830) - Тэмпо (1830–1844) - Кока (1844–1848) - Каэй (1848–1854) - Ансэй (1854–1860) - Манъэн (1860–1861) - Бункю (1861–1864) - Гендзи (1864–1865) - Кейо (1865–1868) - Мэйдзи - Тайсьо - Сьова - Хэйсэй - Рэйва + Тайка + Хакути + Хакухо + Сютё + Тайхо + Кэйун + Вадо + Рэйки + Ёро + Дзинки + Тэмпьё + Тэмпьё-Канпо + Тэмпьё-Сёхо + Тэмпьё-Ходзи + Тэмпьё-Дзинго + Дзинго-Кэйун + Хоки + Тэнъо + Энряку + Дайдо + Конин + Тэнтьё + Дзёва + Касё + Ниндзю + Сайко + Тэнъан + Дзёган + Гангё + Нинна + Канпё + Сётай + Энги + Энтё + Дзёхей + Тэнгё + Тэнряку + Тэнтоку + Ова + Кохо + Анна + Тэнроку + Тэнъэн + Дзёгэн + Тэнгэн + Эйкан + Канна + Эйэн + Эйсо + Сёряку + Тётоку + Тёхо + Канко + Тёва + Каннин + Дзиан + Мандзю + Тёгэн + Тёряку + Тёкю + Кантоку + Эйсё + Тэнги + Кохэй + Дзиряку + Энкю + Дзюхо + Дзёряку + Эйхо + Отоку + Кандзи + Кахо + Эйтё + Дзётоку + Кова + Тёдзи + Кадзё + Тэннин + Тэнъэй + Эйкю + Гэнъэй + Хоан + Тэндзи + Дайдзи + Тэнсё + Тёсё + Хоэн + Эйдзи + Кодзи + Тэнъё + Кюан + Нимпэй + Кюдзю + Хогэн + Хэйдзи + Эйряку + Охо + Тёкан + Эйман + Нинъан + Као + Дзёан + Ангэн + Дзисё + Ёва + Дзюэй + Гэнрюку + Бундзи + Кэнкю + Сёдзи + Кэннин + Гэнкю + Кэнъэй + Дзёгэн + Кэнряку + Кэмпо + Дзёкю + Дзёо + Гэннин + Кароку + Антэй + Канги + Дзёэй + Тэмпуку + Бунряку + Катэй + Рякунин + Энъо + Ниндзи + Кангэн + Ходзи + Кэнтё + Когэн + Сёка + Сёгэн + Бунъо + Котё + Бунъэй + Кэндзи + Коан + Сёо + Эйнин + Сёан + Кэнгэн + Кагэн + Токудзи + Энкё + Отё + Сёва + Бумпо + Гэнъо + Гэнко + Сётю + Каряку + Гэнтоку + Гэнко + Кэнму + Энгэн + Кококу + Сёхэй + Кэнтоку + Бунтю + Тэндзю + Коряку + Кова + Гэнтю + Ситоку + Какэй + Коо + Мэйтоку + Оэй + Сётё + Эйкё + Какицу + Бунъан + Хотоку + Кётоку + Кёсё + Тёроку + Кансё + Бунсё + Онин + Бунмэй + Тёкё + Энтоку + Мэйо + Бунки + Эйсё + Дайэй + Кёроку + Тэнбун + Кодзи + Эйроку + Гэнки + Тэнсё + Бунроку + Кэйтё + Гэнна + Канъэй + Сёхё + Кэйан + Дзёо + Мэйрэки + Мандзи + Камбун + Эмпо + Тэнна + Дзёкё + Гэнроку + Хоэй + Сётоку + Кёхо + Гэмбун + Кампо + Энкё + Канъэн + Хореки + Мэйва + Анъэй + Тэнмэй + Кансэй + Кёва + Бунка + Бунсэй + Тэнпо + Кока + Каэй + Ансэй + Манъэн + Бункю + Гэндзи + Кейо + Мэйдзи + Тайсё + Сёва + Хэйсэй + Рэйва + + + + G, y, MMMM, d, EEEE + + + + + G, y, MMMM, d + + + + + G, y, MMM, d + + + + + GGGGG, y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G, y + G, y.MM + G, y.MM.dd + G, y.MM.dd (E) + G, y, MMM + G, y, MMM, d + G, y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G, y + G, y + G, y.MM + G, y.MM.dd + G, y.MM.dd (E) + G, y, MMM + G, y, MMM, d + G, y, MMM, d, E + G, y, MMMM + G, y, QQQ + G, y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G, y – G, y + G, y–y + + + G, y.MM – G, y.MM + G, y.MM – y.MM + G, y.MM – y.MM + + + G, y.MM.dd – y.MM.dd + G, y.MM.dd – G, y.MM.dd + G, y.MM.dd – y.MM.dd + G, y.MM.dd – y.MM.dd + + + G, y.MM.dd (E) – y.MM.dd (E) + G, y.MM.dd (E) – G, y.MM.dd (E) + G, y.MM.dd (E) – y.MM.dd (E) + G, y.MM.dd (E) – y.MM.dd (E) + + + G, y, MMM – G, y, MMM + G, y, MMM – MMM + G, y, MMM – y, MMM + + + G, y, MMM, d–d + G, y, MMM, d – G, y, MMM, d + G, y, MMM, d – MMM, d + G, y, MMM, d – y, MMM, d + + + G, y, MMM, d, E – MMM, d, E + G, y, MMM, d, E – G, y, MMM, d, E + G, y, MMM, d, E – MMM, d, E + G, y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH 'сех' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G, y–y + + + G, y.MM – y.MM + G, y.MM – y.MM + + + G, y.MM.dd – y.MM.dd + G, y.MM.dd – y.MM.dd + G, y.MM.dd – y.MM.dd + + + G, y.MM.dd (E) – y.MM.dd (E) + G, y.MM.dd (E) – y.MM.dd (E) + G, y.MM.dd (E) – y.MM.dd (E) + + + G, y, MMM – MMM + G, y, MMM – y, MMM + + + G, y, MMM, d–d + G, y, MMM, d – MMM, d + G, y, MMM, d – y, MMM, d + + + G, y, MMM, d, E – MMM, d, E + G, y, MMM, d, E – MMM, d, E + G, y, MMM, d, E – y, MMM, d, E + + + G, y, MMMM – MMMM + G, y, MMMM – y, MMMM @@ -3148,96 +6337,231 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - фарвардин - ордибехешт - хордад - тир - мордад - шахривер - мехр - абан - азер - дей - бахман - эсфанд - - фарвардин - ордибехешт - хордад - тир - мордад - шахривер - мехр - абан - азер - дей - бахман - эсфанд - - - - - фарвардин - ордибехешт - хордад - тир - мордад - шахривер - мехр - абан - азер - дей - бахман - эсфанд - - - фарвардин - ордибехешт - хордад - тир - мордад - шахривер - мехр - абан - азер - дей - бахман - эсфанд + фарвардин + ордибехешт + хордад + тир + мордад + шахривер + мехр + абан + азер + дей + бахман + эсфанд - перси ҫулӗ + хиджра хыҫҫӑнхи - перс ҫулӗ + х. х. - перс ҫ. + х. х. + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH 'сех' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH 'сех' (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -3245,37 +6569,216 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Китай республикин никӗсӗ таран - Миньго + Китай Республики йӗркеличченхи + Китай Республики йӗркеленӗрен - К.р-ки нкс.трн. - Миньго + респ. й-ч. + респ. й-р. - Миньго ҫтчн - Миньго + р. й-ч. + р. й-р. + + + + G y, MMMM, d, EEEE + + + + + G y, MMMM, d + + + + + G y, MMM, d + + + + + GGGGG y.MM.dd + + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d, E + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + MM.dd + MM.dd (E) + MMM, d + MMM, d, E + MMMM, d + G y + G y + G y.MM + G y.MM.dd + G y.MM.dd (E) + G y, MMM + G y, MMM, d + G y, MMM, d, E + G y, MMMM + G y, QQQ + G y, QQQQ + + + B h – B h + B h–h + + + B h:mm – B h:mm + B h:mm–h:mm + B h:mm–h:mm + + + G y – G y + G y–y + + + G y.MM – G y.MM + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – G y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – G y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – G y, MMM + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – G y, MMM, d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – G y, MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + - h a – h a - h–h a + a h – a h + a h–h + + + HH–HH - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + a h:mm – a h:mm + a h:mm–h:mm + a h:mm–h:mm - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + a h:mm – a h:mm (v) + a h:mm–h:mm (v) + a h:mm–h:mm (v) + + + HH:mm–HH:mm (v) + HH:mm–HH:mm (v) - h a – h a v - h–h a v + a h – a h (v) + a h–h (v) + + + HH–HH (v) + + + MM.dd – MM.dd + MM.dd – MM.dd + + + MM.dd (E) – MM.dd (E) + MM.dd (E) – MM.dd (E) + + + MMM – MMM + + + MMM, d–d + MMM, d – MMM, d + + + MMM, d, E – MMM, d, E + MMM, d, E – MMM, d, E + + + G y–y + + + G y.MM – y.MM + G y.MM – y.MM + + + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + G y.MM.dd – y.MM.dd + + + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + G y.MM.dd (E) – y.MM.dd (E) + + + G y, MMM – MMM + G y, MMM – y, MMM + + + G y, MMM, d–d + G y, MMM, d – MMM, d + G y, MMM, d – y, MMM, d + + + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – MMM, d, E + G y, MMM, d, E – y, MMM, d, E + + + G y, MMMM – MMMM + G y, MMMM – y, MMMM @@ -3283,73 +6786,107 @@ CLDR data files are interpreted according to the LDML specification (http://unic - эра + самана + + + сам. + + + сам. ҫул пӗлтӗр кӑҫал - ҫитес ҫул + ҫитес ҫулта - +{0} ҫултан + {0} ҫултан + {0} ҫултан + {0} ҫултан - -{0} ҫул каялла + {0} ҫул каялла + {0} ҫул каялла + {0} ҫул каялла - ҫ. пӗлтӗр кӑҫал - ҫитес ҫ. + ҫитес ҫулта - +{0} ҫ. + {0} ҫултан + {0} ҫултан + {0} ҫултан - -{0} ҫ. каялла + {0} ҫул каялла + {0} ҫул каялла + {0} ҫул каялла + ҫул + пӗлтӗр + кӑҫал + ҫитес ҫулта - +{0} ҫ. + {0} ҫултан + {0} ҫултан + {0} ҫултан - -{0} ҫ. к-ла + {0} ҫул каялла + {0} ҫул каялла + {0} ҫул каялла - квартал - иртнӗ квартал - ку квартал - ҫитес квартал + чӗрӗк + иртнӗ чӗрӗкре + ку чӗрӗкре + ҫитес чӗрӗкре - урлӑ +{0} кварталтан + {0} чӗрӗкрен + {0} чӗрӗкрен + {0} чӗрӗкрен - -{0} квартал каялла + {0} чӗрӗк каялла + {0} чӗрӗк каялла + {0} чӗрӗк каялла - кв. - иртнӗ кв. - ку кв. - ҫитес кв. + чӗр. + иртнӗ чӗр. + ку чӗр. + ҫитес чӗр. - урлӑ +{0} кв. + {0} чӗрӗкрен + {0} чӗрӗкрен + {0} чӗрӗкрен - -{0} кв. каялла + {0} чӗрӗк каялла + {0} чӗрӗк каялла + {0} чӗр. каялла - и-нӗ кв. - ку кв. - ҫ-с кв. + чӗр. + иртнӗ чӗр. + ку чӗр. + ҫитес чӗр. - урлӑ +{0} кв. + {0} чӗрӗкрен + {0} чӗрӗкрен + {0} чӗрӗкрен - -{0} кв. к-ла + {0} чӗрӗк каялла + {0} чӗрӗк каялла + {0} чӗр. каялла @@ -3358,73 +6895,93 @@ CLDR data files are interpreted according to the LDML specification (http://unic ку уйӑхра ҫитес уйӑхра - +{0} уйӑхран + {0} уйӑхран + {0} уйӑхран + {0} уйӑхран - -{0} уйӑх каялла + {0} уйӑх каялла + {0} уйӑх каялла + {0} уйӑх каялла - уй. - иртнӗ уй. - ку уй. - ҫитес уй. - +{0} уй. + {0} уйӑхран + {0} уйӑхран + {0} уйӑхран - -{0} уй. каялла + {0} уйӑх каялла + {0} уйӑх каялла + {0} уй. каялла + уйӑх - +{0} уй. + {0} уйӑхран + {0} уйӑхран + {0} уйӑхран - -{0} уй. к-ла + {0} уйӑх каялла + {0} уйӑх каялла + {0} уй. каялла эрне иртнӗ эрнере - ҫак эрнере + ку эрнере ҫитес эрнере - +{0} эрнерен + {0} эрнерен + {0} эрнерен + {0} эрнерен - -{0} эрне каялла + {0} эрне каялла + {0} эрне каялла + {0} эрне каялла - эрнере {0} + {0} эрнинче - эр. - иртнӗ эр. - ҫак эр. - ҫитес эр. + иртнӗ эрн. + ку эрн. + ҫитес эрн. - +{0} эр. + {0} эрнерен + {0} эрнерен + {0} эрнерен - -{0} эр. каялла + {0} эрне каялла + {0} эрне каялла + {0} эрн. каялла + {0} эрнинче + эрне + иртнӗ эрн. + ку эрн. + ҫитес эрн. - +{0} эр. + {0} эрнерен + {0} эрнерен + {0} эрнерен - -{0} эр. к-ла + {0} эрне каялла + {0} эрне каялла + {0} эрн. каялла + {0} эрнинче - уйӑхӑн эрни - - - уй. эрни - - - уй. эр. + уйӑхӑн эрни кун @@ -3432,395 +6989,530 @@ CLDR data files are interpreted according to the LDML specification (http://unic паян ыран - +{0} кунтан + {0} кунтан + {0} кунтан + {0} кунтан - -{0} кун каялла + {0} кун каялла + {0} кун каялла + {0} кун каялла - кн. - +{0} к. + {0} кунтан + {0} кунтан + {0} кунтан - -{0} к. каялла + {0} кун каялла + {0} кун каялла + {0} кун каялла + кун - +{0} к. + {0} кунтан + {0} кунтан + {0} кунтан - -{0} к. к-ла + {0} кун каялла + {0} кун каялла + {0} кун каялла - ҫулталӑкӑн кунӗ + ҫулталӑкӑн кунӗ - ҫул. кунӗ - - - ҫул. кн. + ҫул. кунӗ - эрнери кун + эрнен кунӗ + + + эрн. кунӗ + + + эрн. кунӗ - эрнен кунӗ + уйӑхӑн кунӗ - эр. кунӗ + уйӑхӑн кунӗ - эр. кн. + уй. кунӗ - иртнӗ вырсарникун - ку вырсарникун - ҫитес вырсарникун + иртнӗ вырсарни кун + ку вырсарни кун + ҫитес вырсарни кун - +{0} вырсарникун + {0} вырсарни кунтан + {0} вырсарни кунтан + {0} вырсарни кунтан - -{0} вырсарникун + {0} вырсарни кун каялла + {0} вырсарни кун каялла + {0} вырсарни кун каялла - иртнӗ вырсарни - ку вырсарни - ҫитес вырсарни + иртнӗ вр + ку вр + ҫитес вр - +{0} вырсарни + {0} вырсарни кунтан + {0} вырсарни кунтан + {0} вр-тан - -{0} вырсарни + {0} вырсарни кун каялла + {0} вырсарни кун каялла + {0} вр каялла - иртнӗ Вр - ку Вр - ҫитес Вр + иртнӗ вр + ку вр + ҫитес вр - +{0} Вр + {0} вырсарни кунтан + {0} вырсарни кунтан + {0} вр-тан - -{0} Вр + {0} вырсарни кун каялла + {0} вырсарни кун каялла + {0} вр каялла - иртнӗ тунтикун - ку тунтикун - ҫитес тунтикун + иртнӗ тунти кун + ку тунти кун + ҫитес тунти кун - +{0} тунтикун + {0} тунти кунтан + {0} тунти кунтан + {0} тунти кунтан - -{0} тунтикун + {0} тунти кун каялла + {0} тунти кун каялла + {0} тунти кун каялла - иртнӗ тунти - ку тунти - ҫитес тунти + иртнӗ тн + ку тн + ҫитес тн - +{0} тунти + {0} тунти кунтан + {0} тунти кунтан + {0} тн-тан - -{0} тунти + {0} тунти кун каялла + {0} тунти кун каялла + {0} тн каялла - иртнӗ Тн - ку Тн - ҫитес Тн + иртнӗ тн + ку тн + ҫитес тн - +{0} Тн + {0} тунти кунтан + {0} тунти кунтан + {0} тн-тан - -{0} Тн + {0} тунти кун каялла + {0} тунти кун каялла + {0} тн каялла - иртнӗ ытларикун - ку ытларикун - ҫитес ытларикун + иртнӗ ытлари кун + ку ытлари кун + ҫитес ытлари кун - +{0} ытларикун + {0} ытлари кунтан + {0} ытлари кунтан + {0} ытлари кунтан - -{0} ытларикун + {0} ытлари кун каялла + {0} ытлари кун каялла + {0} ытлари кун каялла - иртнӗ ытлари - ку ытлари - ҫитес ытлари + иртнӗ ыт + ку ыт + ҫитес ыт - +{0} ытлари + {0} ытлари кунтан + {0} ытлари кунтан + {0} ыт-тан - -{0} ытлари + {0} ытлари кун каялла + {0} ытлари кун каялла + {0} ыт каялла - иртнӗ Ыт - ку Ыт - ҫитес Ыт + иртнӗ ыт + ку ыт + ҫитес ыт - +{0} Ыт + {0} ытлари кунтан + {0} ытлари кунтан + {0} ыт-тан - -{0} Ыт + {0} ытлари кун каялла + {0} ытлари кун каялла + {0} ыт каялла - иртнӗ юнкун - ку юнкун - ҫитес юнкун + иртнӗ юн кун + ку юн кун + ҫитес юн кун - +{0} юнкун + {0} юн кунтан + {0} юн кунтан + {0} юн кунтан - -{0} юнкун + {0} юн кун каялла + {0} юн кун каялла + {0} юн кун каялла - иртнӗ юн - ку юн - ҫитес юн + иртнӗ юн + ку юн + ҫитес юн - +{0} юн + {0} юн кунтан + {0} юн кунтан + {0} юн-тан - -{0} юн + {0} юн кун каялла + {0} юн кун каялла + {0} юн каялла - иртнӗ Юн - ҫитес Юн - ҫитес Юн - +{0} Юн + {0} юн кунтан + {0} юн кунтан + {0} юн-тан - -{0} Юн + {0} юн кун каялла + {0} юн кун каялла + {0} юн каялла - иртнӗ кӗҫнерникун - ку кӗҫнерникун - ҫитес кӗҫнерникун + иртнӗ кӗҫнерни кун + ку кӗҫнерни кун + ҫитес кӗҫнерни кун - +{0} кӗҫнерникун + {0} кӗҫнерни кунтан + {0} кӗҫнерни кунтан + {0} кӗҫнерни кунтан - -{0} кӗҫнерникун + {0} кӗҫнерни кун каялла + {0} кӗҫнерни кун каялла + {0} кӗҫнерни кун каялла - иртнӗ кӗҫнерни - ку кӗҫнерни - ҫитес кӗҫнерни + иртнӗ кҫ + ку кҫ + ҫитес кҫ - +{0} кӗҫнерни + {0} кӗҫнерни кунтан + {0} кӗҫнерни кунтан + {0} кҫ-тан - -{0} кӗҫнерни + {0} кӗҫнерни кун каялла + {0} кӗҫнерни кун каялла + {0} кҫ каялла - иртнӗ Кҫ - ку Кҫ - ҫитес Кҫ + иртнӗ кҫ + ку кҫ + ҫитес кҫ - +{0} Кҫ + {0} кӗҫнерни кунтан + {0} кӗҫнерни кунтан + {0} кҫ-тан - -{0} Кҫ + {0} кӗҫнерни кун каялла + {0} кӗҫнерни кун каялла + {0} кҫ каялла - иртнӗ эрнекун - ку эрнекун - ҫитес эрнекун + иртнӗ эрне кун + ку эрне кун + ҫитес эрне кун - +{0} эрнекун + {0} эрне кунтан + {0} эрне кунтан + {0} эрне кунтан - -{0} эрнекун + {0} эрне кун каялла + {0} эрне кун каялла + {0} эрне кун каялла - иртнӗ эрнекун - ку эрнекун - ҫитес эрнекун + иртнӗ эр + ку эр + ҫитес эр - +{0} эрнекун + {0} эрне кунтан + {0} эрне кунтан + {0} эр-тан - -{0} эрнекун + {0} эрне кун каялла + {0} эрне кун каялла + {0} эр каялла - иртн.эрнекун - ҫк.эрнекун - ҫтс.эрнекун + иртнӗ эр + ку эр + ҫитес эр - +{0} эрнекун + {0} эрне кунтан + {0} эрне кунтан + {0} эр-тан - -{0} эрнекун + {0} эрне кун каялла + {0} эрне кун каялла + {0} эр каялла - иртнӗ шӑматкун - ку шӑматкун - ҫитес шӑматкун + иртнӗ шӑмат кун + ку шӑмат кун + ҫитес шӑмат кун - +{0} шӑматкун + {0} шӑмат кунтан + {0} шӑмат кунтан + {0} шӑмат кунтан - -{0} шӑматкун + {0} шӑмат кун каялла + {0} шӑмат кун каялла + {0} шӑмат кун каялла - иртнӗ шӑмат - ку шӑмат - ҫитес шӑмат + иртнӗ шм + ку шм + ҫитес шм - +{0} шӑмат + {0} шӑмат кунтан + {0} шӑмат кунтан + {0} шм-тан - -{0} шӑмат + {0} шӑмат кун каялла + {0} шӑмат кун каялла + {0} шм каялла - иртнӗ Шм - ку Шм - ҫитес Шм + иртнӗ шм + ку шм + ҫитес шм - +{0} Шм + {0} шӑмат кунтан + {0} шӑмат кунтан + {0} шм-тан - -{0} Шм + {0} шӑмат кун каялла + {0} шӑмат кун каялла + {0} шм каялла + + к. у./к. х. + - AM/PM + к. у./к. х. + + + КУ/КХ сехет - ҫак сехетре + ку сехетре - +{0} сехетрен + {0} сехетрен + {0} сехетрен + {0} сехетрен - -{0} сехет каялла + {0} сехет каялла + {0} сехет каялла + {0} сехет каялла - с. - ҫак сех. + сех. + ку сех. - +{0} сех. + {0} сехетрен + {0} сехетрен + {0} сехетрен - -{0} сех. каялла + {0} сехет каялла + {0} сехет каялла + {0} сех. каялла - с - ҫак сех. + сех + ку сех. - +{0} сех. + {0} сехетрен + {0} сехетрен + {0} сехетрен - -{0} сех. к-ла + {0} сехет каялла + {0} сехет каялла + {0} сех. каялла минут - ҫак минутра + ку минутра - +{0} минутран + {0} минутран + {0} минутран + {0} минутран - -{0} минут каялла + {0} минут каялла + {0} минут каялла + {0} минут каялла мин. - ҫак мин. + ку мин. - +{0} мин. + {0} минутран + {0} минутран + {0} минутран - -{0} мин. каялла + {0} минут каялла + {0} минут каялла + {0} мин. каялла мин - ҫак мин. + ку мин. - +{0} мин. + {0} минутран + {0} минутран + {0} минутран - -{0} мин. к-ла + {0} минут каялла + {0} минут каялла + {0} мин. каялла - секунд - халӗ + ҫеккунт + халь - +{0} ҫекундран + {0} ҫеккунтран + {0} ҫеккунтран + {0} ҫеккунтран - -{0} ҫеккунт каялла + {0} ҫеккунт каялла + {0} ҫеккунт каялла + {0} ҫеккунт каялла - сек. - халӗ + ҫек. + халь - +{0} ҫек. + {0} ҫеккунтран + {0} ҫеккунтран + {0} ҫеккунтран - -{0} ҫек. каялла + {0} ҫеккунт каялла + {0} ҫеккунт каялла + {0} ҫек. каялла - сек - халӗ + ҫ + халь - +{0} ҫ + {0} ҫеккунтран + {0} ҫеккунтран + {0} ҫ-ран - -{0} ҫ к-ла + {0} ҫеккунт каялла + {0} ҫеккунт каялла + {0} ҫ каялла - пӗр сехетри зона + вӑхӑт тӑрӑхӗ + + + вӑх. тӑрӑхӗ + + + вӑх. тӑрӑхӗ + {0} вӑхӑчӗ {0} ҫуллахи вӑхӑчӗ {0} стандартлӑ вӑхӑчӗ - - - Гавай стандартлӑ вӑхӑчӗ - Гавай стандартлӑ вӑхӑчӗ - Гавай ҫуллахи вӑхӑчӗ - - - Пӗтӗм тӗнчери координацилене вӑхӑчӗ + Пӗтӗм тӗнчери килӗштернӗ вӑхӑт - - ПТКВ (UTC) - Паллӑ мар хула @@ -3874,7 +7566,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кейси - Дюмон-д’Юрвиль Дюмон-д’Юрвиль + Дюмон-д’Юрвиль Мак-Мердо @@ -3895,7 +7587,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ла-Риоха - Сан-Луис Сан-Луис + Сан-Луис Катамарка @@ -3997,7 +7689,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сен-Бартелеми - Бермуд утравӗсем + Бермуда Бруней @@ -4039,7 +7731,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Арагуаина - Сан-Паулу Сан-Паулу + Сан-Паулу Баия @@ -4084,7 +7776,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ванкувер - Форт Нельсон + Форт-Нельсон Доусон-Крик @@ -4165,7 +7857,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Раротонга - Мӑнкун утравӗ + Мӑн кун утравӗ + + + Койхик Пунта-Аренас @@ -4270,7 +7965,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Стэнли - Трук + Чуук Понпеи @@ -4336,7 +8031,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Малабо - Афинсем + Афина Кӑнтӑр Георги @@ -4431,7 +8126,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пномпень - + Кантон @@ -4441,7 +8136,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Тарава - Коморсем + Комор утравӗсем Сент-Китс @@ -4519,7 +8214,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Монако - Кишинев + Кишинёв Подгорица @@ -4570,10 +8265,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Мальта - Маврикий + Маврики - Мальдивсем + Мальдива Блантайр @@ -4585,7 +8280,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Эрмосильо - Сьюдад-Хуарес + Сьюдад-Хуарес Масатлан @@ -4678,7 +8373,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Маркизас утравӗсем - Гамбье утравӗсем + Гамбье Порт-Морсби @@ -4747,19 +8442,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Волгоград - Саратов + Сарӑту - Астрахань + Аҫтӑрхан - Ульяновск + Чӗмпӗр Киров - Самара + Самар Екатеринбург @@ -4798,7 +8493,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Хандыга - Сахалин утравӗ + Сахалин Усть-Нера @@ -4810,7 +8505,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Среднеколымск - Петропавловск-Камчатски + Петропавловск-Камчатский Анадырь @@ -4867,7 +8562,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Джуба - Сан-Томе Сан-Томе + Сан-Томе Сальвадор @@ -4930,7 +8625,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Дар-эс-Салам - Киев + Кийӳ Симферополь @@ -4942,7 +8637,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Мидуэй - Уэйк + Уэйк утравӗ Адак @@ -4978,13 +8673,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Денвер - Бойла, Ҫурҫӗр Дакота + Бойла, Ҫур ҫӗр Дакота - Нью-Сейлем, Ҫурҫӗр Дакота + Нью-Сейлем, Ҫур ҫӗр Дакота - Центр, Ҫурҫӗр Дакота + Сентер, Ҫурҫӗр Дакота Чикаго @@ -5059,7 +8754,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Эфате - Уоллис + Уоллиспа Футуна Апиа @@ -5081,14 +8776,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Акри вӑхӑчӗ - Акри стандартлӑ вӑхӑчӗ - Акри ҫуллахи вӑхӑчӗ + Акри вӑхӑчӗ + Акри стандартлӑ вӑхӑчӗ + Акри ҫуллахи вӑхӑчӗ - ACT Acre - ACT Acre - ACST Acre + ACT Acre + ACT Acre + ACST Acre @@ -5096,23 +8791,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic Афганистан вӑхӑчӗ - AFT + AFT - Тӗп Африка вӑхӑчӗ + Вӑта Африка вӑхӑчӗ - CAT + CAT - Хӗвелтухӑҫ Африка вӑхӑчӗ + Тухӑҫ Африка вӑхӑчӗ - EAT + EAT @@ -5120,19 +8815,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кӑнтӑр Африка вӑхӑчӗ - SAST + SAST - Анӑҫ Африка вӑхӑчӗ - Анӑҫ Африка стандартлӑ вӑхӑчӗ - Анӑҫ Африка ҫуллахи вӑхӑчӗ + Анӑҫ Африка вӑхӑчӗ - WAT - WAT - WAST + WAT @@ -5142,21 +8833,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Аляска ҫуллахи вӑхӑчӗ - AKT - AKST - AKDT + AKT + AKST + AKDT - Алматы вӑхӑчӗ - Алматы стандартлӑ вӑхӑчӗ - Алматы ҫуллахи вӑхӑчӗ + Алматы вӑхӑчӗ + Алматы стандартлӑ вӑхӑчӗ + Алматы ҫуллахи вӑхӑчӗ - ALMT - ALMT - ALMT DST + ALMT + ALMT + ALMT DST @@ -5166,45 +8857,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic Амазонка ҫуллахи вӑхӑчӗ - AMT - AMT - AMST + AMT + AMT + AMST - Тӗп Америка вӑхӑчӗ - Тӗп Америка стандартлӑ вӑхӑчӗ - Тӗп Америка ҫуллахи вӑхӑчӗ + Вӑта Америка вӑхӑчӗ + Вӑта Америка стандартлӑ вӑхӑчӗ + Вӑта Америка ҫуллахи вӑхӑчӗ - CT - CST - CDT + CT + CST + CDT - Хӗвелтухӑҫ Америка вӑхӑчӗ - Хӗвелтухӑҫ Америка стандартлӑ вӑхӑчӗ - Хӗвелтухӑҫ Америка ҫуллахи вӑхӑчӗ + Тухӑҫ Америка вӑхӑчӗ + Тухӑҫ Америка стандартлӑ вӑхӑчӗ + Тухӑҫ Америка ҫуллахи вӑхӑчӗ - ET - EST - EDT + ET + EST + EDT - Ту вӑхӑчӗ (Ҫурҫӗр Америка) - Стандартлӑ ту вӑхӑчӗ (Ҫурҫӗр Америка) - Ҫуллахи ту вӑхӑчӗ (Ҫурҫӗр Америка) + Ту вӑхӑчӗ + Ту стандартлӑ вӑхӑчӗ + Ту ҫуллахи вӑхӑчӗ - MT - MST - MDT + MT + MST + MDT @@ -5214,21 +8905,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Лӑпкӑ океан ҫуллахи вӑхӑчӗ - PT - PST - PDT + PT + PST + PDT - Анадырь вӑхӑчӗ - Анадырь стандартлӑ вӑхӑчӗ - Анадырь ҫуллахи вӑхӑчӗ + Анадырь вӑхӑчӗ + Анадырь стандартлӑ вӑхӑчӗ + Анадырь ҫуллахи вӑхӑчӗ - ANAT - ANAT - ANAST + ANAT + ANAT + ANAST @@ -5238,45 +8929,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic Апиа ҫуллахи вӑхӑчӗ - SST Samoa Apia - SST Samoa Apia - SST Samoa Apia DST + SST Samoa Apia + SST Samoa Apia + SST Samoa Apia DST - Актау вӑхӑчӗ - Актау стандартлӑ вӑхӑчӗ - Актау ҫуллахи вӑхӑчӗ + Актау вӑхӑчӗ + Актау стандартлӑ вӑхӑчӗ + Актау ҫуллахи вӑхӑчӗ - ALMT Aktau - ALMT Aktau - ALMT Aktau DST + ALMT Aktau + ALMT Aktau + ALMT Aktau DST - Актобе вӑхӑчӗ - Актобе стандартлӑ вӑхӑчӗ - Актобе ҫуллахи вӑхӑчӗ + Актобе вӑхӑчӗ + Актобе стандартлӑ вӑхӑчӗ + Актобе ҫуллахи вӑхӑчӗ - AQTT - AQTT - AQTT DST + AQTT + AQTT + AQTT DST - Арап вӑхӑчӗ - Арап стандартлӑ вӑхӑчӗ - Арап ҫуллахи вӑхӑчӗ + Сауд Аравийӗ вӑхӑчӗ + Сауд Аравийӗ стандартлӑ вӑхӑчӗ + Сауд Аравийӗ ҫуллахи вӑхӑчӗ - AST Arabia - AST Arabia - ADT Arabia + AST Arabia + AST Arabia + ADT Arabia @@ -5286,9 +8977,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Аргентина ҫуллахи вӑхӑчӗ - ART - ART - ARST + ART + ART + ARST @@ -5298,9 +8989,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ Аргентина ҫуллахи вӑхӑчӗ - WART - WART - WARST + WART + WART + WARST @@ -5310,9 +9001,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Армени ҫуллахи вӑхӑчӗ - AMT Armenia - AMT Armenia - AMST Armenia + AMT Armenia + AMT Armenia + AMST Armenia @@ -5322,45 +9013,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic Атлантика ҫуллахи вӑхӑчӗ - AT - AST - ADT + AT + AST + ADT - Тӗп Австрали вӑхӑчӗ - Тӗп Австрали стандартлӑ вӑхӑчӗ - Тӗп Австрали ҫуллахи вӑхӑчӗ + Вӑта Австрали вӑхӑчӗ + Вӑта Австрали стандартлӑ вӑхӑчӗ + Вӑта Австрали ҫуллахи вӑхӑчӗ - ACST - ACST - ACDT + ACST + ACST + ACDT - Тӗп Австрали анӑҫ вӑхӑчӗ - Тӗп Австрали анӑҫ стандартлӑ вӑхӑчӗ - Тӗп Австрали анӑҫ ҫуллахи вӑхӑчӗ + Анӑҫ Вӑта Австрали вӑхӑчӗ + Анӑҫ Вӑта Австрали стандартлӑ вӑхӑчӗ + Анӑҫ Вӑта Австрали ҫуллахи вӑхӑчӗ - ACWST - ACWST - ACWDT + ACWST + ACWST + ACWDT - Хӗвелтухӑҫ Австрали вӑхӑчӗ - Хӗвелтухӑҫ Австрали стандартлӑ вӑхӑчӗ - Хӗвелтухӑҫ Австрали ҫуллахи вӑхӑчӗ + Тухӑҫ Австрали вӑхӑчӗ + Тухӑҫ Австрали стандартлӑ вӑхӑчӗ + Тухӑҫ Австрали ҫуллахи вӑхӑчӗ - AEST - AEST - AEDT + AEST + AEST + AEDT @@ -5370,9 +9061,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ Австрали ҫуллахи вӑхӑчӗ - AWST - AWST - AWDT + AWST + AWST + AWDT @@ -5382,9 +9073,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Азербайджан ҫуллахи вӑхӑчӗ - AZT - AZT - AZST + AZT + AZT + AZST @@ -5394,9 +9085,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Азор утравӗсен ҫуллахи вӑхӑчӗ - AZOT - AZOT - AZOST + AZOT + AZOT + AZOST @@ -5406,9 +9097,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Бангладеш ҫуллахи вӑхӑчӗ - BST Bangladesh - BST Bangladesh - BDT Bangladesh + BST Bangladesh + BST Bangladesh + BDT Bangladesh @@ -5416,7 +9107,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Бутан вӑхӑчӗ - BTT + BTT @@ -5424,7 +9115,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Боливи вӑхӑчӗ - BOT + BOT @@ -5434,17 +9125,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Бразили ҫуллахи вӑхӑчӗ - BRT - BRT - BRST + BRT + BRT + BRST - Бруней-Даруссалам вӑхӑчӗ + Бруней вӑхӑчӗ - BNT + BNT @@ -5454,17 +9145,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кабо-Верде ҫуллахи вӑхӑчӗ - CVT - CVT - CVST + CVT + CVT + CVST - Кейси вӑхӑчӗ + Кейси вӑхӑчӗ - CAST + CAST @@ -5472,7 +9163,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Чаморро вӑхӑчӗ - ChST + ChST @@ -5482,9 +9173,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Чатем ҫуллахи вӑхӑчӗ - CHAST - CHAST - CHADT + CHAST + CHAST + CHADT @@ -5494,9 +9185,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Чили ҫуллахи вӑхӑчӗ - CLT - CLT - CLST + CLT + CLT + CLST @@ -5506,17 +9197,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Китай ҫуллахи вӑхӑчӗ - CST China - CST China - CST China DST + CST China + CST China + CST China DST - Раштав утравӗн вӑхӑчӗ + Раштав утравӗ вӑхӑчӗ - CXT + CXT @@ -5524,7 +9215,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кокос утравӗсен вӑхӑчӗ - CCT + CCT @@ -5534,21 +9225,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Колумби ҫуллахи вӑхӑчӗ - COT - COT - COST + COT + COT + COST - Кукӑн утравӗсен вӑхӑчӗ - Кукӑн утравӗсен стандартлӑ вӑхӑчӗ - Кукӑн утравӗсен ҫуллахи вӑхӑчӗ + Кук утравӗсен вӑхӑчӗ + Кук утравӗсен стандартлӑ вӑхӑчӗ + Кук утравӗсен ҫуллахи вӑхӑчӗ - CKT - CKT - CKT DST + CKT + CKT + CKT DST @@ -5558,9 +9249,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Куба ҫуллахи вӑхӑчӗ - CST Cuba - CST Cuba - CDT Cuba + CST Cuba + CST Cuba + CDT Cuba @@ -5568,7 +9259,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Дейвис вӑхӑчӗ - DAVT + DAVT @@ -5576,27 +9267,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Дюмон-д’Юрвиль вӑхӑчӗ - DDUT + DDUT - Хӗвелтухӑҫ Тимор вӑхӑчӗ + Тухӑҫ Тимор вӑхӑчӗ - TLT + TLT - Мӑнкун утравӗн вӑхӑчӗ - Мӑнкун утравӗн стандартлӑ вӑхӑчӗ - Мӑнкун утравӗн ҫуллахи вӑхӑчӗ + Мӑн кун утравӗн вӑхӑчӗ + Мӑн кун утравӗн стандартлӑ вӑхӑчӗ + Мӑн кун утравӗн ҫуллахи вӑхӑчӗ - EAST - EAST - EASST + EAST + EAST + EASST @@ -5604,39 +9295,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic Эквадор вӑхӑчӗ - ECT Ecuador + ECT Ecuador - Тӗп Европа вӑхӑчӗ - Тӗп Европа стандартлӑ вӑхӑчӗ - Тӗп Европа ҫуллахи вӑхӑчӗ + Вӑта Европа вӑхӑчӗ + Вӑта Европа стандартлӑ вӑхӑчӗ + Вӑта Европа ҫуллахи вӑхӑчӗ - CET - CET - CEST + CET + CET + CEST - Хӗвелтухӑҫ Европа вӑхӑчӗ - Хӗвелтухӑҫ Европа стандартлӑ вӑхӑчӗ - Хӗвелтухӑҫ Европа ҫуллахи вӑхӑчӗ + Тухӑҫ Европа вӑхӑчӗ + Тухӑҫ Европа стандартлӑ вӑхӑчӗ + Тухӑҫ Европа ҫуллахи вӑхӑчӗ - EET - EET - EEST + EET + EET + EEST - Инҫет-хӗвелтухӑҫ Европа вӑхӑчӗ + Инҫет Тухӑҫ Европа вӑхӑчӗ - FEET + FEET @@ -5646,9 +9337,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ Европа ҫуллахи вӑхӑчӗ - WET - WET - WEST + WET + WET + WEST @@ -5658,9 +9349,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Фолкленд утравӗсен ҫуллахи вӑхӑчӗ - FKT - FKT - FKST + FKT + FKT + FKST @@ -5670,17 +9361,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Фиджи ҫуллахи вӑхӑчӗ - FJT - FJT - FJT Summer + FJT + FJT + FJT Summer - Франци Гвиана вӑхӑчӗ + Франци Гвианин вӑхӑчӗ - GFT + GFT @@ -5688,15 +9379,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Франци Кӑнтӑрпа Антарктика территорийӗсен вӑхӑчӗ - TAAF + TAAF - Галапагос утравӗсен вӑхӑчӗ + Галапагос вӑхӑчӗ - GALT + GALT @@ -5704,7 +9395,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гамбье вӑхӑчӗ - GAMT + GAMT @@ -5714,49 +9405,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic Грузи ҫуллахи вӑхӑчӗ - GET - GET - GEST + GET + GET + GEST - Гилбертӑн утравӗсен вӑхӑчӗ + Гилберт утравӗсен вӑхӑчӗ - GIT + GIT - Гринвичпа вӑтам вӑхӑчӗ + Гринвич вӑхӑчӗ - GMT + GMT - Гренланди вӑхӑчӗ - Гренланди стандартлӑ вӑхӑчӗ - Гренланди ҫуллахи вӑхӑчӗ + Гренланди вӑхӑчӗ + Гренланди стандартлӑ вӑхӑчӗ + Гренланди ҫуллахи вӑхӑчӗ - GNST - GNST - GNSST + GNST + GNST + GNSST - Хӗвелтухӑҫ Гринланди вӑхӑчӗ - Хӗвелтухӑҫ Гринланди стандартлӑ вӑхӑчӗ - Хӗвелтухӑҫ Гринланди ҫуллахи вӑхӑчӗ + Тухӑҫ Гренланди вӑхӑчӗ + Тухӑҫ Гренланди стандартлӑ вӑхӑчӗ + Тухӑҫ Гренланди ҫуллахи вӑхӑчӗ - EGT - EGT - EGST + EGT + EGT + EGST @@ -5766,25 +9457,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ ҫуллахи вӑхӑчӗ - WGT - WGT - WGST + WGT + WGT + WGST - Гуам стандартлӑ вӑхӑчӗ + Гуам стандартлӑ вӑхӑчӗ - GST Guam + GST Guam - Перси залив вӑхӑчӗ + Перс кӳлмекӗн вӑхӑчӗ - GST Gulf + GST Gulf @@ -5792,19 +9483,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гайана вӑхӑчӗ - GYT + GYT + + + + + Гавайи-Алеут стандартлӑ вӑхӑчӗ + + + HST - Гавайи Алеут вӑхӑчӗ - Гавайи Алеут стандартлӑ вӑхӑчӗ - Гавайи Алеут ҫуллахи вӑхӑчӗ + Гавайи-Алеут вӑхӑчӗ + Гавайи-Алеут стандартлӑ вӑхӑчӗ + Гавайи-Алеут ҫуллахи вӑхӑчӗ - HST - HST - HDT + HST + HST + HDT @@ -5814,9 +9513,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гонконг ҫуллахи вӑхӑчӗ - HKT - HKT - HKT DST + HKT + HKT + HKT DST @@ -5826,9 +9525,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ховд ҫуллахи вӑхӑчӗ - HOVT - HOVT - HOVST + HOVT + HOVT + HOVST @@ -5836,7 +9535,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Инди вӑхӑчӗ - IST Indian + IST Indian @@ -5844,7 +9543,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Инди океанӗ вӑхӑчӗ - IOT + IOT @@ -5852,23 +9551,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic Индокитай вӑхӑчӗ - ICT + ICT - Тӗп Индонези вӑхӑчӗ + Вӑта Индонези вӑхӑчӗ - CIT + CIT - Хӗвелтухӑҫ Индонези вӑхӑчӗ + Тухӑҫ Индонези вӑхӑчӗ - EIT + EIT @@ -5876,7 +9575,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ Индонези вӑхӑчӗ - WIT + WIT @@ -5886,9 +9585,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Иран ҫуллахи вӑхӑчӗ - IRST - IRST - IRST DST + IRST + IRST + IRST DST @@ -5898,9 +9597,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Иркутск ҫуллахи вӑхӑчӗ - IRKT - IRKT - IRKST + IRKT + IRKT + IRKST @@ -5910,9 +9609,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Израиль ҫуллахи вӑхӑчӗ - IST Israel - IST Israel - IDT + IST Israel + IST Israel + IDT @@ -5922,37 +9621,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic Япони ҫуллахи вӑхӑчӗ - JST - JST - JST DST + JST + JST + JST DST - Петропавловск-Камчаткăри вӑхӑчӗ - Петропавловск-Камчаткăри стандартлӑ вӑхӑчӗ - Петропавловск-Камчаткăри ҫуллахи вӑхӑчӗ + Петропавловск-Камчатский вӑхӑчӗ + Петропавловск-Камчатский стандартлӑ вӑхӑчӗ + Петропавловск-Камчатский ҫуллахи вӑхӑчӗ - PETT - PETST - PETDT + PETT + PETST + PETDT - Казахстан вӑхӑчӗ + Казахстан вӑхӑчӗ - Казахстан вхч + Казахстан вхч - Хӗвелтухӑҫ Казахстан вӑхӑчӗ + Тухӑҫ Казахстан вӑхӑчӗ - Хӗвелтухӑҫ Казахстан вхч + Хӗвелтухӑҫ Казахстан вхч @@ -5960,19 +9659,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Анӑҫ Казахстан вӑхӑчӗ - Анӑҫ Казахстан вхч + Анӑҫ Казахстан вхч - Корей вӑхӑчӗ - Корей стандартлӑ вӑхӑчӗ - Корей ҫуллахи вӑхӑчӗ + Корея вӑхӑчӗ + Корея стандартлӑ вӑхӑчӗ + Корея ҫуллахи вӑхӑчӗ - KST - KST - KST DST + KST + KST + KST DST @@ -5980,7 +9679,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Косрае вӑхӑчӗ - KOST + KOST @@ -5990,25 +9689,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic Красноярск ҫуллахи вӑхӑчӗ - KRAT - KRAT - KRAST + KRAT + KRAT + KRAST - Киргизи вӑхӑчӗ + Кӑркӑстан вӑхӑчӗ - KGT + KGT - Ланка вӑхӑчӗ + Шри-Ланка вӑхӑчӗ - SLST + SLST @@ -6016,7 +9715,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Лайн утравӗсен вӑхӑчӗ - LINT + LINT @@ -6026,21 +9725,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Лорд-Хау ҫуллахи вӑхӑчӗ - LHST - LHST - LHST Summer + LHST + LHST + LHST Summer - Макао вӑхӑчӗ - Макао стандартлӑ вӑхӑчӗ - Макао ҫуллахи вӑхӑчӗ + Макао вӑхӑчӗ + Макао стандартлӑ вӑхӑчӗ + Макао ҫуллахи вӑхӑчӗ - MST Macao - MST Macao - MST Macao DST + MST Macao + MST Macao + MST Macao DST @@ -6050,9 +9749,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Магадан ҫуллахи вӑхӑчӗ - MAGT - MAGT - MAGST + MAGT + MAGT + MAGST @@ -6060,15 +9759,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Малайзи вӑхӑчӗ - MYT + MYT - Мальдивсем вӑхӑчӗ + Мальдива вӑхӑчӗ - MVT + MVT @@ -6076,7 +9775,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Маркизас утравӗсен вӑхӑчӗ - MART + MART @@ -6084,19 +9783,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Маршалл утравӗсен вӑхӑчӗ - MHT + MHT - Маврикий вӑхӑчӗ - Маврикий стандартлӑ вӑхӑчӗ - Маврикий ҫуллахи вӑхӑчӗ + Маврики вӑхӑчӗ + Маврики стандартлӑ вӑхӑчӗ + Маврики ҫуллахи вӑхӑчӗ - MUT - MUT - MUST + MUT + MUT + MUST @@ -6104,7 +9803,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Моусон вӑхӑчӗ - MAWT + MAWT @@ -6114,9 +9813,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Мексика Лӑпкӑ океан ҫуллахи вӑхӑчӗ - PSTM - PSTM - PDTM + PSTM + PSTM + PDTM @@ -6126,9 +9825,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Улан-Батор ҫуллахи вӑхӑчӗ - ULAT - ULAT - ULAST + ULAT + ULAT + ULAST @@ -6138,9 +9837,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Мускав ҫуллахи вӑхӑчӗ - MSK - МСК - MSD + MSK + МСК + MSD @@ -6148,7 +9847,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Мьянма вӑхӑчӗ - MMT + MMT @@ -6156,7 +9855,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Науру вӑхӑчӗ - NRT + NRT @@ -6164,7 +9863,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Непал вӑхӑчӗ - NPT + NPT @@ -6174,9 +9873,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ҫӗнӗ Каледони ҫуллахи вӑхӑчӗ - NCT - NCT - NDT New Caledonia + NCT + NCT + NDT New Caledonia @@ -6186,9 +9885,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ҫӗнӗ Зеланди ҫуллахи вӑхӑчӗ - NZST - NZST - NZDT + NZST + NZST + NZDT @@ -6198,9 +9897,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ньюфаундленд ҫуллахи вӑхӑчӗ - NST - NST - NDT + NST + NST + NDT @@ -6208,7 +9907,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ниуэ вӑхӑчӗ - NUT + NUT @@ -6218,9 +9917,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Норфолк ҫуллахи вӑхӑчӗ - NFT - NFT - NFDT + NFT + NFT + NFDT @@ -6230,17 +9929,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Фернанду-ди-Норонья ҫуллахи вӑхӑчӗ - FNT - FNT - FNST + FNT + FNT + FNST - Мариансен ҫурҫӗрти утравӗсем вӑхӑчӗ + Ҫур ҫӗр Мариана утравӗсен вӑхӑчӗ - ChST NMI + ChST NMI @@ -6250,9 +9949,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Новосибирск ҫуллахи вӑхӑчӗ - NOVT - NOVT - NOVST + NOVT + NOVT + NOVST @@ -6262,9 +9961,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Омск ҫуллахи вӑхӑчӗ - OMST - OMST - OMSST + OMST + OMST + OMSST @@ -6274,9 +9973,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пакистан ҫуллахи вӑхӑчӗ - PKT - PKT - PKT DST + PKT + PKT + PKT DST @@ -6284,15 +9983,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Палау вӑхӑчӗ - PWT + PWT - Папуа — Ҫӗнӗ Гвиней вӑхӑчӗ + Папуа — Ҫӗнӗ Гвинея вӑхӑчӗ - PGT + PGT @@ -6302,9 +10001,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Парагвай ҫуллахи вӑхӑчӗ - PYT - PYT - PYST + PYT + PYT + PYST @@ -6314,41 +10013,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic Перу ҫуллахи вӑхӑчӗ - PET - PET - EDT Peru + PET + PET + EDT Peru - Филиппинсем вӑхӑчӗ - Филиппинсем стандартлӑ вӑхӑчӗ - Филиппинсем ҫуллахи вӑхӑчӗ + Филиппин вӑхӑчӗ + Филиппин стандартлӑ вӑхӑчӗ + Филиппин ҫуллахи вӑхӑчӗ - PST Philippine - PST Philippine - PST Philippine DST + PST Philippine + PST Philippine + PST Philippine DST - Феникс вӑхӑчӗ + Феникс утравӗсен вӑхӑчӗ - PHOT + PHOT - Сен-Пьер тата Микелон вӑхӑчӗ - Сен-Пьер тата Микелон стандартлӑ вӑхӑчӗ - Сен-Пьер тата Микелон ҫуллахи вӑхӑчӗ + Сен-Пьерпа Микелон вӑхӑчӗ + Сен-Пьерпа Микелон стандартлӑ вӑхӑчӗ + Сен-Пьерпа Микелон ҫуллахи вӑхӑчӗ - PMST - PMST - PMDT + PMST + PMST + PMDT @@ -6356,7 +10055,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Питкэрн вӑхӑчӗ - PST Pitcairn + PST Pitcairn @@ -6364,27 +10063,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Понпеи вӑхӑчӗ - PONT + PONT - Пхеньян + Ҫур ҫӗр Корея вӑхӑчӗ - PYT Korea + PYT Korea - Кызылорда вӑхӑчӗ - Кызылорда стандартлӑ вӑхӑчӗ - Кызылорда ҫуллахи вӑхӑчӗ + Кызылорда вӑхӑчӗ + Кызылорда стандартлӑ вӑхӑчӗ + Кызылорда ҫуллахи вӑхӑчӗ - QYZT - QYZT - QYZT DST + QYZT + QYZT + QYZT DST @@ -6392,7 +10091,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Реюньон вӑхӑчӗ - RET + RET @@ -6400,7 +10099,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ротера вӑхӑчӗ - ROTT + ROTT @@ -6410,21 +10109,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сахалин ҫуллахи вӑхӑчӗ - SAKT - SAKT - SAKST + SAKT + SAKT + SAKST - Самар вӑхӑчӗ - Самар стандартлӑ вӑхӑчӗ - Самар ҫуллахи вӑхӑчӗ + Самар вӑхӑчӗ + Самар стандартлӑ вӑхӑчӗ + Самар ҫуллахи вӑхӑчӗ - SAMT - SAMT - SAMST + SAMT + SAMT + SAMST @@ -6434,9 +10133,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Самоа ҫуллахи вӑхӑчӗ - SST Samoa - SST Samoa - SST Samoa DST + SST Samoa + SST Samoa + SST Samoa DST @@ -6444,7 +10143,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сейшел утравӗсен вӑхӑчӗ - SCT + SCT @@ -6452,7 +10151,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сингапур вӑхӑчӗ - SGT + SGT @@ -6460,7 +10159,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Соломон вӑхӑчӗ - SBT + SBT @@ -6468,7 +10167,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кӑнтӑр Георги вӑхӑчӗ - GST + GST @@ -6476,7 +10175,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Суринам вӑхӑчӗ - SRT + SRT @@ -6484,7 +10183,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сёва вӑхӑчӗ - SYOT + SYOT @@ -6492,19 +10191,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Таити вӑхӑчӗ - TAHT + TAHT - Тайпей вӑхӑчӗ - Тайпей стандартлӑ вӑхӑчӗ - Тайпей ҫуллахи вӑхӑчӗ + Тайвань вӑхӑчӗ + Тайвань стандартлӑ вӑхӑчӗ + Тайвань ҫуллахи вӑхӑчӗ - TWT - TWT - TWT DST + TWT + TWT + TWT DST @@ -6512,7 +10211,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Таджикистан вӑхӑчӗ - TJT + TJT @@ -6520,7 +10219,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Токелау вӑхӑчӗ - TKT + TKT @@ -6530,17 +10229,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Тонга ҫуллахи вӑхӑчӗ - TOT - TOT - TOST + TOT + TOT + TOST - Трук вӑхӑчӗ + Чуук вӑхӑчӗ - CHUT + CHUT @@ -6550,9 +10249,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Туркменистан ҫуллахи вӑхӑчӗ - TMT - TMT - TMT DST + TMT + TMT + TMT DST @@ -6560,7 +10259,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Тувалу вӑхӑчӗ - TVT + TVT @@ -6570,9 +10269,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Уругвай ҫуллахи вӑхӑчӗ - UYT - UYT - UYST + UYT + UYT + UYST @@ -6582,9 +10281,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Узбекистан ҫуллахи вӑхӑчӗ - UZT - UZT - UZT DST + UZT + UZT + UZT DST @@ -6594,9 +10293,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Вануату ҫуллахи вӑхӑчӗ - VUT - VUT - VUT DST + VUT + VUT + VUT DST @@ -6604,7 +10303,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Венесуэла вӑхӑчӗ - VnzlT + VnzlT @@ -6614,9 +10313,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Владивосток ҫуллахи вӑхӑчӗ - VLAT - VLAT - VLAST + VLAT + VLAT + VLAST @@ -6626,9 +10325,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Волгоград ҫуллахи вӑхӑчӗ - VOLT - VOLT - VOLST + VOLT + VOLT + VOLST @@ -6636,23 +10335,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic Восток вӑхӑчӗ - VOST + VOST - Уэйк вӑхӑчӗ + Уэйк утравӗ вӑхӑчӗ - WAKT + WAKT - Уоллис тата Футуна вӑхӑчӗ + Уоллиспа Футуна вӑхӑчӗ - WFT + WFT @@ -6662,9 +10361,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Якутск ҫуллахи вӑхӑчӗ - YAKT - YAKT - YAKST + YAKT + YAKT + YAKST @@ -6674,9 +10373,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Екатеринбург ҫуллахи вӑхӑчӗ - YEKT - YEKT - YEKST + YEKT + YEKT + YEKST @@ -6684,50 +10383,325 @@ CLDR data files are interpreted according to the LDML specification (http://unic Юкон вӑхӑчӗ - YST + YST + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + ,   + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар + + + хисеп мар - 0 пин - 00 пин - 000 пин - 0 миллион - 00 миллион - 000 миллион - 0 миллиард - 00 миллиард - 000 миллиард - 0 триллион - 00 триллион - 000 триллион + 0 пин + 0 пин + 0 пин + 00 пин + 00 пин + 00 пин + 000 пин + 000 пин + 000 пин + 0 млн + 0 млн + 0 млн + 00 млн + 00 млн + 00 млн + 000 млн + 000 млн + 000 млн + 0 млрд + 0 млрд + 0 млрд + 00 млрд + 00 млрд + 00 млрд + 000 млрд + 000 млрд + 000 млрд + 0 трлн + 0 трлн + 0 трлн + 00 трлн + 00 трлн + 00 трлн + 000 трлн + 000 трлн + 000 трлн - 0 пин - 00 пин - 000 пин - 0 млн - 00 млн - 000 млн - 0 млрд - 00 млрд - 000 млрд - 0 трлн - 00 трлн - 000 трлн + 0 пин + 0 пин + 00 пин + 00 пин + 000 пин + 000 пин + 0 млн + 0 млн + 00 млн + 00 млн + 000 млн + 000 млн + 0 млрд + 0 млрд + 00 млрд + 00 млрд + 000 млрд + 000 млрд + 0 трлн + 0 трлн + 00 трлн + 00 трлн + 000 трлн + 000 трлн + + + + #,##0 % + + + @@ -6735,94 +10709,1085 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) - 0 пин ¤ - 00 пин ¤ - 000 пин ¤ - 0 млн ¤ - 00 млн ¤ - 000 млн ¤ - 0 млрд ¤ - 00 млрд ¤ - 000 млрд ¤ - 0 трлн ¤ - 00 трлн ¤ - 000 трлн ¤ + 0 пин ¤ + 0 пин ¤ + 0 пин ¤ + 00 пин ¤ + 00 пин ¤ + 00 пин ¤ + 000 пин ¤ + 000 пин ¤ + 000 пин ¤ + 0 млн ¤ + 0 млн ¤ + 0 млн ¤ + 00 млн ¤ + 00 млн ¤ + 00 млн ¤ + 000 млн ¤ + 000 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 0 млрд ¤ + 0 млрд ¤ + 00 млрд ¤ + 00 млрд ¤ + 00 млрд ¤ + 000 млрд ¤ + 000 млрд ¤ + 000 млрд ¤ + 0 трлн ¤ + 0 трлн ¤ + 0 трлн ¤ + 00 трлн ¤ + 00 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ + 000 трлн ¤ + 000 трлн ¤ + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) - Андорра песийӗ - Андорра песийӗ + Андорра песи + Андорра песи + Андорра песи + Андорра песи - АПЭ дирхамӗ + Пӗрлешнӗ Араб Эмирачӗсен дирхамӗ + ПАЭ дирхамӗ + ПАЭ дирхамӗ + ПАЭ дирхамӗ - Афган афганийӗ (1927–2002) - Афган афганийӗ (1927–2002) + Афганистан афганийӗ (1927–2002) + Афганистан афганийӗ (1927–2002) + Афганистан афганийӗ (1927–2002) + Афганистан афганийӗ (1927–2002) - афганийӗ + Афганистан афганийӗ + Афганистан афганийӗ + Афганистан афганийӗ + Афганистан афганийӗ - Албани лек - Албани лек + Албани лекӗ (1946–1965) + Албани лекӗ (1946–1965) + Албани лекӗ (1946–1965) + Албани лекӗ (1946–1965) Албани лекӗ - Армяни драмӗ + Армени драмӗ + Армени драмӗ + Армени драмӗ + Армени драмӗ - Нидерланд Антиллиан гульденӗ + Нидерланд Антилӗн гульденӗ + Нидерланд Антилӗн гульденӗ + Нидерланд Антилӗн гульденӗ + Нидерланд Антилӗн гульденӗ - Ангола кванзӗ + Ангола кванзи + Ангола кванзи + Ангола кванзи + Ангола кванзи - Ангола кванзӗ (1977–1991) - Ангола кванзӗ (1977–1991) + Ангола кванзи (1977–1991) + Ангола кванзи (1977–1991) + Ангола кванзи (1977–1991) + Ангола кванзи (1977–1991) - Ангола ҫӗнӗ кванзӗ (1990–2000) - Ангола ҫӗнӗ кванзӗ (1990–2000) + Ангола ҫӗнӗ кванзи (1990–2000) + Ангола ҫӗнӗ кванзи (1990–2000) + Ангола ҫӗнӗ кванзи (1990–2000) + Ангола ҫӗнӗ кванзи (1990–2000) - Ангола деноминаци хыҫҫӑн кванзӗ (1995–1999) - Ангола деноминаци хыҫҫӑн кванзӗ (1995–1999) + Ангола реюстадо кванзӗ (1995–1999) + Ангола реюстадо кванзӗ (1995–1999) + Ангола реюстадо кванзӗ (1995–1999) + Ангола реюстадо кванзӗ (1995–1999) - Аргентин аусталӗ - Аргентин аусталӗ + Аргентина аустралӗ + Аргентина аустралӗ + Аргентина аустралӗ + Аргентина аустралӗ - Аргентин песийӗ лей (1970–1983) - Аргентин песийӗ лей (1970–1983) + Аргентина песо-лейӗ (1970–1983) + Аргентина песо-лейӗ (1970–1983) + Аргентина песо-лейӗ (1970–1983) + Аргентина песо-лейӗ (1970–1983) - Аргентин песийӗ (1881–1970) - Аргентин песийӗ (1881–1970) + Аргентина песи (1881–1970) + Аргентина песи (1881–1970) + Аргентина песи (1881–1970) + Аргентина песи (1881–1970) - Аргентин песийӗ (1983–1985) - Аргентин песийӗ (1983–1985) + Аргентина песи (1983–1985) + Аргентина песи (1983–1985) + Аргентина песи (1983–1985) + Аргентина песи (1983–1985) - Аргентина песийӗ + Аргентина песи + Аргентина песи + Аргентина песи + Аргентина песи - Австри шиллинг - Австри шиллинг + Австри шиллингӗ + Австри шиллингӗ + Австри шиллингӗ + Австри шиллингӗ Австрали долларӗ @@ -6831,22 +11796,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic Аруба флоринӗ - Азербайджан маначӗ (1993–2006) - Азербайджан маначӗ (1993–2006) + Азербайджан маначӗ (1993–2006) Азербайджан маначӗ - Боснипе Герцеговина динар (1992–1994) - Боснипе Герцеговина динар (1992–1994) + Боснипе Герцеговина динарӗ (1992–1994) + Боснипе Герцеговина динарӗ (1992–1994) + Боснипе Герцеговина динарӗ (1992–1994) + Боснипе Герцеговина динарӗ (1992–1994) - Боснипе Герцеговина конвертланакан марки + Боснипе Герцеговина конверсиленекен марки + Боснипе Герцеговина конверсиленекен марки + Боснипе Герцеговина конверсиленекен марки + Боснипе Герцеговина конверсиленекен марки - Боснипе Герцеговина ҫӗнӗ динар (1994–1997) - Боснипе Герцеговина ҫӗнӗ динар (1994–1997) + Боснипе Герцеговина ҫӗнӗ динарӗ (1994–1997) + Боснипе Герцеговина ҫӗнӗ динарӗ (1994–1997) + Боснипе Герцеговина ҫӗнӗ динарӗ (1994–1997) + Боснипе Герцеговина ҫӗнӗ динарӗ (1994–1997) Барбадос долларӗ @@ -6855,31 +11826,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic Бангладеш таки - Бельги конвертланакан франк - Бельги конвертланакан франк + Бельги конверсиленекен франкӗ + Бельги конверсиленекен франкӗ + Бельги конверсиленекен франкӗ + Бельги конверсиленекен франкӗ - Бельги франк - Бельги франк + Бельги франкӗ + Бельги франкӗ + Бельги франкӗ + Бельги франкӗ - Бельги франк (финанс) - Бельги франк (финанс) + Бельги франкӗ (финанс) + Бельги франкӗ (финанс) + Бельги франкӗ (финанс) + Бельги франкӗ (финанс) - Болгари хытӑ левӗ - Болгари хытӑ левӗ + Болгари хытӑ левӗ - Болгари социалистсен левӗ - Болгари социалистсен левӗ + Болгари социалистсен левӗ Болгари левӗ - Болгари левӗ (1879–1952) - Болгари левӗ (1879–1952) + Болгари левӗ (1879–1952) Бахрейн динарӗ @@ -6897,68 +11871,94 @@ CLDR data files are interpreted according to the LDML specification (http://unic Боливи боливианӗ - Боливи боливианӗ (1863–1963) - Боливи боливианӗ (1863–1963) + Боливи боливианӗ (1863–1963) - Боливи песийӗ - Боливи песийӗ + Боливи песи + Боливи песи + Боливи песи + Боливи песи - Боливи мвдол - Боливи мвдол + Боливи мвдолӗ + Боливи мвдолӗ + Боливи мвдолӗ + Боливи мвдолӗ - Бразили ҫӗнӗ крузейро (1967–1986) - Бразили ҫӗнӗ крузейро (1967–1986) + Бразили ҫӗнӗ крузейри (1967–1986) + Бразили ҫӗнӗ крузейри (1967–1986) + Бразили ҫӗнӗ крузейри (1967–1986) + Бразили ҫӗнӗ крузейри (1967–1986) - Бразили крузадо - Бразили крузадо + Бразили крузади (1986–1989) + Бразили крузади (1986–1989) + Бразили крузади (1986–1989) + Бразили крузади (1986–1989) - Бразили крузейро (1990–1993) - Бразили крузейро (1990–1993) + Бразили крузейри (1990–1993) + Бразили крузейри (1990–1993) + Бразили крузейри (1990–1993) + Бразили крузейри (1990–1993) Бразили реалӗ - Бразили ҫӗнӗ крузадо (1989–1990) - Бразили ҫӗнӗ крузадо (1989–1990) + Бразили ҫӗнӗ крузади (1989–1990) + Бразили ҫӗнӗ крузади (1989–1990) + Бразили ҫӗнӗ крузади (1989–1990) + Бразили ҫӗнӗ крузади (1989–1990) - Бразили крузейро (1993–1994) - Бразили крузейро (1993–1994) + Бразили крузейри (1993–1994) + Бразили крузейри (1993–1994) + Бразили крузейри (1993–1994) + Бразили крузейри (1993–1994) - Бразили крузейро (1942–1967) - Бразили крузейро (1942–1967) + Бразили крузейри (1942–1967) + Бразили крузейри (1942–1967) + Бразили крузейри (1942–1967) + Бразили крузейри (1942–1967) - Багам долларӗ + Багама долларӗ + Багама долларӗ + Багама долларӗ + Багама долларӗ Бутан нгултрумӗ - Бирман кьят - Бирман кьят + Бирман кьячӗ + Бирман кьячӗ + Бирман кьячӗ + Бирман кьячӗ Ботсвана пули - Белорусси тенкӗ (1994–1999) - Белорусси тенкӗ (1994–1999) + Беларусь рублӗ (1994–1999) + Беларусь рублӗ (1994–1999) + Беларусь рублӗ (1994–1999) + Беларусь рублӗ (1994–1999) - Беларуҫ тенкӗ - Беларуҫ тенки + Беларусь рублӗ + Беларусь рублӗ + Беларусь рублӗ + Беларусь рублӗ - Белорусси тенкӗ (2000–2016) - Белорусси тенкӗ (2000–2016) + Беларусь рублӗ (2000–2016) + Беларусь рублӗ (2000–2016) + Беларусь рублӗ (2000–2016) + Беларусь рублӗ (2000–2016) Белиз долларӗ @@ -6967,123 +11967,181 @@ CLDR data files are interpreted according to the LDML specification (http://unic Канада долларӗ - Конголези франкӗ + Конго франкӗ + Конго франкӗ + Конго франкӗ + Конго франкӗ - WIR евро - WIR евро + WIR еври + WIR еври + WIR еври + WIR еври Швейцари франкӗ - WIR франк - WIR франк + WIR франкӗ + WIR франкӗ + WIR франкӗ + WIR франкӗ - Чили эскудо - Чили эскудо + Чили эскуди + Чили эскуди + Чили эскуди + Чили эскуди - Чили расчет единици (UF) - Чили расчет единици (UF) + Чили татӑлу единици (UF) + Чили татӑлу единици (UF) + Чили татӑлу единици (UF) + Чили татӑлу единици (UF) - Чили песийӗ + Чили песи + Чили песи + Чили песи + Чили песи - Китай офшор юанӗ + Китай юанӗ (офшор) + Китай юанӗ (офшор) + Китай юанӗ (офшор) + Китай юанӗ (офшор) - Китай халӑх банкӗн доллар - Китай халӑх банкӗн доллар + Китай халӑх банкӗн долларӗ + Китай халӑх банкӗн долларӗ + Китай халӑх банкӗн долларӗ + Китай халӑх банкӗн долларӗ Китай юанӗ - Колумби песийӗ + Колумби песи + Колумби песи + Колумби песи + Колумби песи - Колумби чӑн тивĕçлĕ единици - Колумби чӑн тивĕçлĕ единици + Колумби чӑн хаклӑх единици + Колумби чӑн хаклӑх единици + Колумби чӑн хаклӑх единици + Колумби чӑн хаклӑх единици Коста-Рика колонӗ - Серби динарӗ (2002–2006) - Серби динарӗ (2002–2006) + Серби динарӗ (2002–2006) - Чехословак хытӑ кронӗ - Чехословак хытӑ кронӗ + Чехословаки хытӑ кронӗ + Чехословаки хытӑ кронӗ + Чехословаки хытӑ кронӗ + Чехословаки хытӑ кронӗ - Куба конвертланакан песийӗ + Куба конверсиленекен песи + Куба конверсиленекен песи + Куба конверсиленекен песи + Куба конверсиленекен песи - Куба песийӗ + Куба песи + Куба песи + Куба песи + Куба песи - Кабо-Верде эскудӗ + Кабо-Верде эскуди + Кабо-Верде эскуди + Кабо-Верде эскуди + Кабо-Верде эскуди - Кипр фунчӗ - Кипр фунчӗ + Кипр фунчӗ - Чехи кронӗ + Чехи крони + Чехи крони + Чехи крони + Чехи крони - Хӗвелтухӑҫ Германи марки - Хӗвелтухӑҫ Германи марки + Тухӑҫ Германи марки + Тухӑҫ Германи марки + Тухӑҫ Германи марки + Тухӑҫ Германи марки - Германи марки - Германи марки + Германи марки Джибути франкӗ - Дани кронӗ + Дани крони + Дани крони + Дани крони + Дани крони - Доминикан песийӗ + Доминика песи + Доминика песи + Доминика песи + Доминика песи Алжир динарӗ - Эквадор сукре - Эквадор сукре + Эквадор сукри + Эквадор сукри + Эквадор сукри + Эквадор сукри - Эквадор яланхи хаклӑхӑн единици - Эквадор яланхи хаклӑхӑн единици + Эквадор яланхи хаклӑх единици + Эквадор яланхи хаклӑх единици + Эквадор яланхи хаклӑх единици + Эквадор яланхи хаклӑх единици - Эстон кронӗ - Эстон кронӗ + Эстон крони + Эстон крони + Эстон крони + Эстон крони Египет фунчӗ - Эритрей накфӗ + Эритрей накфи + Эритрей накфи + Эритрей накфи + Эритрей накфи - Испани песета (А) - Испани песета (А) + Испани песети (А) + Испани песети (А) + Испани песети (А) + Испани песети (А) - Испани конвертланакан песета - Испани конвертланакан песета + Испани конверсиленекен песети + Испани конверсиленекен песети + Испани конверсиленекен песети + Испани конверсиленекен песети - Испани песета - Испани песета + Испани песети + Испани песети + Испани песети + Испани песети Эфиопи бырӗ @@ -7092,32 +12150,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic евро - Фин марка - Фин марка + Финлянди марки + Финлянди марки + Финлянди марки + Финлянди марки Фиджи долларӗ - Факланд утравӗсен фунчӗ + Фолкленд утравӗсен фунчӗ + Фолкленд утравӗсен фунчӗ + Фолкленд утравӗсен фунчӗ + Фолкленд утравӗсен фунчӗ - Француз франк - Француз франк + Франци франкӗ + Франци франкӗ + Франци франкӗ + Франци франкӗ Британи фунчӗ - Грузин купон - Грузин купон + Грузи купонӗ + Грузи купонӗ + Грузи купонӗ + Грузи купонӗ Грузи ларийӗ - Гана седи (1979–2007) - Гана седи (1979–2007) + Гана седийӗ (1979–2007) + Гана седийӗ (1979–2007) + Гана седийӗ (1979–2007) + Гана седийӗ (1979–2007) Гана седийӗ @@ -7132,27 +12201,40 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гвиней франкӗ - Гвиней сили - Гвиней сили + Гвиней силийӗ + Гвиней силийӗ + Гвиней силийӗ + Гвиней силийӗ - Экваториаллă Гвиней эквель - Экваториаллă Гвиней эквель + Экваторти Гвиней эквелӗ + Экваторти Гвиней эквелӗ + Экваторти Гвиней эквелӗ + Экваторти Гвиней эквелӗ - Грек драхми - Грек драхма + Греци драхми + Греци драхми + Греци драхми + Греци драхми - Гватемала кетсалӗ + Гватемала кетцалӗ + Гватемала кетцалӗ + Гватемала кетцалӗ + Гватемала кетцалӗ - Гвиней-Бисау эскудо - Гвиней-Бисау эскудо + Гвиней-Бисау эскуди + Гвиней-Бисау эскуди + Гвиней-Бисау эскуди + Гвиней-Бисау эскуди - Гвиней-Бисау песийӗ - Гвиней-Бисау песийӗ + Гвиней-Бисау песи + Гвиней-Бисау песи + Гвиней-Бисау песи + Гвиней-Бисау песи Гайана долларӗ @@ -7161,11 +12243,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гонконг долларӗ - Гондурас лемпирӗ + Гондурас лемпири + Гондурас лемпири + Гондурас лемпири + Гондурас лемпири - Хорват динар - Хорват динар + Хорвати динарӗ + Хорвати динарӗ + Хорвати динарӗ + Хорвати динарӗ Хорвати куни @@ -7180,19 +12267,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Индонези рупийӗ - Ирланди фунчӗ - Ирланди фунчӗ + Ирланди фунчӗ - Израиль фунчӗ - Израиль фунчӗ + Израиль фунчӗ - Израиль шекель (1980–1985) - Израиль шекель (1980–1985) + Израиль шекелӗ (1980–1985) + Израиль шекелӗ (1980–1985) + Израиль шекелӗ (1980–1985) + Израиль шекелӗ (1980–1985) - Ҫӗнӗ Израиль шекелӗ + Израиль ҫӗнӗ шекелӗ + Израиль ҫӗнӗ шекелӗ + Израиль ҫӗнӗ шекелӗ + Израиль ҫӗнӗ шекелӗ Инди рупийӗ @@ -7204,15 +12294,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Иран риалӗ - Исланди кронӗ (1918–1981) - Исланди кронӗ (1918–1981) + Исланди крони (1918–1981) + Исланди крони (1918–1981) + Исланди крони (1918–1981) + Исланди крони (1918–1981) - Исланди кронӗ + Исланди крони + Исланди крони + Исланди крони + Исланди крони - Итали лира - Итали лира + Итали лири + Итали лири + Итали лири + Итали лири Ямайка долларӗ @@ -7227,27 +12324,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кени шиллингӗ - Киргиз сомӗ + Кӑркӑсстан сомӗ + Кӑркӑсстан сомӗ + Кӑркӑсстан сомӗ + Кӑркӑсстан сомӗ Камбоджа риелӗ - Комора франкӗ + Комор франкӗ + Комор франкӗ + Комор франкӗ + Комор франкӗ - КХДР вони + Ҫур ҫӗр Корей вони + Ҫур ҫӗр Корей вони + Ҫур ҫӗр Корей вони + Ҫур ҫӗр Корей вони - Корей хван - Корей хван + Кӑнтӑр Корея хванӗ (1953–1962) + Кӑнтӑр Корея хванӗ (1953–1962) + Кӑнтӑр Корея хванӗ (1953–1962) + Кӑнтӑр Корея хванӗ (1953–1962) - Корей вони (1945–1953) - Корей вони (1945–1953) + Кӑнтӑр Корей вони (1945–1953) + Кӑнтӑр Корей вони (1945–1953) + Кӑнтӑр Корей вони (1945–1953) + Кӑнтӑр Корей вони (1945–1953) - Корей вони + Кӑнтӑр Корей вони + Кӑнтӑр Корей вони + Кӑнтӑр Корей вони + Кӑнтӑр Корей вони Кувейт динарӗ @@ -7256,7 +12369,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кайман утравӗсен долларӗ - Казах тенгейӗ + Казахстан тенги + Казахстан тенги + Казахстан тенги + Казахстан тенги Лаос кипӗ @@ -7265,7 +12381,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ливан фунчӗ - Шри-ланка рупийӗ + Шри-Ланка рупийӗ + Шри-Ланка рупийӗ + Шри-Ланка рупийӗ + Шри-Ланка рупийӗ Либери долларӗ @@ -7274,32 +12393,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic Лесото лотийӗ - Литва лит - Литва лит + Литва личӗ + Литва личӗ + Литва личӗ + Литва личӗ - Литва талон - Литва талон + Литва талонӗ + Литва талонӗ + Литва талонӗ + Литва талонӗ - Люксембург конвертланакан франк - Люксембург конвертланакан франк + Люксембург конверсиленекен франкӗ + Люксембург конверсиленекен франкӗ + Люксембург конверсиленекен франкӗ + Люксембург конверсиленекен франкӗ - Люксембург франк - Люксембург франк + Люксембург франкӗ + Люксембург франкӗ + Люксембург франкӗ + Люксембург франкӗ - Люксембург финанс франк - Люксембург финанс франк + Люксембург финанс франкӗ + Люксембург финанс франкӗ + Люксембург финанс франкӗ + Люксембург финанс франкӗ - Латви лат - Латви лат + Латви лачӗ + Латви лачӗ + Латви лачӗ + Латви лачӗ - Латви тенкĕ - Латви тенкĕ + Латви рублӗ + Латви рублӗ + Латви рублӗ + Латви рублӗ Ливи динарӗ @@ -7308,40 +12441,58 @@ CLDR data files are interpreted according to the LDML specification (http://unic Марокко дирхамӗ - Марокко франк - Марокко франк + Марокко франкӗ + Марокко франкӗ + Марокко франкӗ + Марокко франкӗ - Монако франк - Монако франк + Монако франкӗ + Монако франкӗ + Монако франкӗ + Монако франкӗ - Молдова купон - Молдова купон + Молдова купонӗ + Молдова купонӗ + Молдова купонӗ + Молдова купонӗ Молдова лайӗ - Малагаси ариарийӗ + Мадагаскар ариарийӗ + Мадагаскар ариарийӗ + Мадагаскар ариарийӗ + Мадагаскар ариарийӗ - Малагаси франк - Малагаси франк + Мадагаскар франкӗ + Мадагаскар франкӗ + Мадагаскар франкӗ + Мадагаскар франкӗ Македони денарӗ - Македони динар (1992–1993) - Македони динар (1992–1993) + Македони денарӗ (1992–1993) + Македони денарӗ (1992–1993) + Македони денарӗ (1992–1993) + Македони денарӗ (1992–1993) - Мали франк - Мали франк + Мали франкӗ + Мали франкӗ + Мали франкӗ + Мали франкӗ - Мьянман кьятӗ + Мьянма кьячӗ + Мьянма кьячӗ + Мьянма кьячӗ + Мьянма кьячӗ Монголи тугрикӗ @@ -7350,54 +12501,70 @@ CLDR data files are interpreted according to the LDML specification (http://unic Макао патаки - Мавритани угийӗ (1973–2017) - Мавритани угийӗ (1973–2017) + Мавритани угийӗ (1973–2017) Мавритани угийӗ - Мальта лира - Мальта лира + Мальта лири + Мальта лири + Мальта лири + Мальта лири - Мальта фунчӗ - Мальта фунчӗ + Мальта фунчӗ Маврики рупийӗ - Мальдив рупийӗ (1947–1981) - Мальдив рупийӗ (1947–1981) + Мальдив рупийӗ (1947–1981) - Мальдивсен руфийӗ + Мальдив руфийӗ + Мальдив руфийӗ + Мальдив руфийӗ + Мальдив руфийӗ - Малави квачӗ + Малави квачи + Малави квачи + Малави квачи + Малави квачи - Мексика песийӗ + Мексика песи + Мексика песи + Мексика песи + Мексика песи - Мексика кӗмӗл песийӗ (1861–1992) - Мексика кӗмӗл песийӗ (1861–1992) + Мексика кӗмӗл песи (1861–1992) + Мексика кӗмӗл песи (1861–1992) + Мексика кӗмӗл песи (1861–1992) + Мексика кӗмӗл песи (1861–1992) - Мексика инвестици единици (UDI) - Мексика инвестици единици (UDI) + Мексика инвестици единици + Мексика инвестици единици + Мексика инвестици единици + Мексика инвестици единици Малайзи ринггичӗ - Мозамбик эскудо - Мозамбик эскудо + Мозамбик эскуди + Мозамбик эскуди + Мозамбик эскуди + Мозамбик эскуди - Мозамбик метикал (1980–2006) - Мозамбик метикал (1980–2006) + Мозамбик метикалӗ (1980–2006) + Мозамбик метикалӗ (1980–2006) + Мозамбик метикалӗ (1980–2006) + Мозамбик метикалӗ (1980–2006) Мозамбик метикалӗ @@ -7406,21 +12573,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic Намиби долларӗ - Нигери найрӗ + Нигери найри + Нигери найри + Нигери найри + Нигери найри - Никарагуа кордобӗ (1988–1991) - Никарагуа кордобӗ (1988–1991) + Никарагуа кордоби (1988–1991) + Никарагуа кордоби (1988–1991) + Никарагуа кордоби (1988–1991) + Никарагуа кордоби (1988–1991) - Никарагуа кордобӗ + Никарагуа кордоби + Никарагуа кордоби + Никарагуа кордоби + Никарагуа кордоби - Нидерланд гульден - Нидерланд гульден + Нидерланд гульденӗ + Нидерланд гульденӗ + Нидерланд гульденӗ + Нидерланд гульденӗ - Норвеги кронӗ + Норвеги крони + Норвеги крони + Норвеги крони + Норвеги крони Непал рупийӗ @@ -7432,38 +12612,61 @@ CLDR data files are interpreted according to the LDML specification (http://unic Оман риалӗ - Панама бальбоа + Панама бальбойи + Панама бальбойи + Панама бальбойи + Панама бальбойи - Перу инти - Перу инти + Перу интийӗ + Перу интийӗ + Перу интийӗ + Перу интийӗ Перу солӗ - Перу соль (1863–1965) - Перу соль (1863–1965) + Перу солӗ (1863–1965) + Перу солӗ (1863–1965) + Перу солӗ (1863–1965) + Перу солӗ (1863–1965) - Папуа – Ҫӗнӗ Гвиней кини + Папуа – Ҫӗнӗ Гвинея кини + Папуа – Ҫӗнӗ Гвинея кини + Папуа – Ҫӗнӗ Гвинея кини + Папуа – Ҫӗнӗ Гвинея кини - Филиппин песийӗ + Филиппин песи + Филиппин песи + Филиппин песи + Филиппин песи - пакистан рупийӗ + Пакистан рупийӗ + Пакистан рупийӗ + Пакистан рупийӗ + Пакистан рупийӗ - Польша злотыйӗ + Польша злотӑйӗ + Польша злотӑйӗ + Польша злотӑйӗ + Польша злотӑйӗ - Польша злотыйӗ (1950–1995) - Польша злотыйӗ (1950–1995) + Польша злотӑйӗ (1950–1995) + Польша злотӑйӗ (1950–1995) + Польша злотӑйӗ (1950–1995) + Польша злотӑйӗ (1950–1995) - Португали эскудо - Португали эскудо + Португали эскуди + Португали эскуди + Португали эскуди + Португали эскуди Парагвай гуаранӗ @@ -7472,12 +12675,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Катар риалӗ - Родези доллар - Родези доллар + Родези долларӗ + Родези долларӗ + Родези долларӗ + Родези долларӗ - Румыни лейӗ (1952–2006) - Румыни лейӗ (1952–2006) + Румыни лейӗ (1952–2006) Румыни лейӗ @@ -7486,19 +12690,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic Серби динарӗ - Раҫҫей тенкӗ - Раҫҫей тенки + Раҫҫей рублӗ + Раҫҫей рублӗ + Раҫҫей рублӗ + Раҫҫей рублӗ - Раҫҫей тенкӗ (1991–1998) - Раҫҫей тенки (1991–1998) + Раҫҫей рублӗ (1991–1998) + Раҫҫей рублӗ (1991–1998) + Раҫҫей рублӗ (1991–1998) + Раҫҫей рублӗ (1991–1998) Руанда франкӗ - Сауд риялӗ + Сауд Аравийӗ риялӗ + Сауд Аравийӗ риялӗ + Сауд Аравийӗ риялӗ + Сауд Аравийӗ риялӗ Соломон утравӗсен долларӗ @@ -7507,18 +12718,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сейшел рупийӗ - Судан динар (1992–2007) - Судан динар (1992–2007) + Судан динарӗ (1992–2007) + Судан динарӗ (1992–2007) + Судан динарӗ (1992–2007) + Судан динарӗ (1992–2007) Судан фунчӗ - Судан фунчӗ (1957–1998) - Судан фунчӗ (1957–1998) + Судан фунчӗ (1957–1998) - Швеци кронӗ + Швеци крони + Швеци крони + Швеци крони + Швеци крони Сингапур долларӗ @@ -7527,18 +12742,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic Сӑваплӑ Елена утравӗн фунчӗ - Словени толар - Словени толар + Словени толарӗ + Словени толарӗ + Словени толарӗ + Словени толарӗ - Словак кронӗ - Словак кронӗ + Словаки крони + Словаки крони + Словаки крони + Словаки крони - леонӗ + Сьерра-Леоне леони + Сьерра-Леоне леони + Сьерра-Леоне леони + Сьерра-Леоне леони - леонӗ (1964—2022) + Сьерра-Леоне леони (1964–2022) + Сьерра-Леоне леони (1964–2022) + Сьерра-Леоне леони (1964–2022) + Сьерра-Леоне леони (1964–2022) Сомали шиллингӗ @@ -7547,72 +12772,115 @@ CLDR data files are interpreted according to the LDML specification (http://unic Суринам долларӗ - Суринам гульден - Суринам гульден + Суринам гульденӗ + Суринам гульденӗ + Суринам гульденӗ + Суринам гульденӗ Кӑнтӑр Судан фунчӗ - Сан-Томе и Принсипи добра - Сан-Томе и Принсипи добра + Сан-Томепе Принсипи добри (1977–2017) + Сан-Томепе Принсипи добри (1977–2017) + Сан-Томепе Принсипи добри (1977–2017) + Сан-Томепе Принсипи добри (1977–2017) - Сан-Томе тата Принсипи добрӗ + Сан-Томепе Принсипи добри + Сан-Томепе Принсипи добри + Сан-Томепе Принсипи добри + Сан-Томепе Принсипи добри - Совет тенкӗ - Совет тенки + ССРП рублӗ + ССРП рублӗ + ССРП рублӗ + ССРП рублӗ - Сальвадор колон - Сальвадор колон + Сальвадор колонӗ + Сальвадор колонӗ + Сальвадор колонӗ + Сальвадор колонӗ Сири фунчӗ - Свази лилангенийӗ + Эсватини лилангенийӗ + Эсватини лилангенийӗ + Эсватини лилангенийӗ + Эсватини лилангенийӗ - Таиланд барӗ + Таиланд бачӗ + Таиланд бачӗ + Таиланд бачӗ + Таиланд бачӗ - Таджик тенкӗ - Таджик тенки + Таджикистан рублӗ + Таджикистан рублӗ + Таджикистан рублӗ + Таджикистан рублӗ - Таджик сомонийӗ + Таджикистан сомонийӗ + Таджикистан сомонийӗ + Таджикистан сомонийӗ + Таджикистан сомонийӗ - Туркмен маначӗ (1993–2009) - Туркмен маначӗ (1993–2009) + Туркменистан маначӗ (1993–2009) + Туркменистан маначӗ (1993–2009) + Туркменистан маначӗ (1993–2009) + Туркменистан маначӗ (1993–2009) - Туркмен маначӗ + Туркменистан маначӗ + Туркменистан маначӗ + Туркменистан маначӗ + Туркменистан маначӗ - Тунези динарӗ + Тунис динарӗ + Тунис динарӗ + Тунис динарӗ + Тунис динарӗ - Тонган паанги + Тонга паанги + Тонга паанги + Тонга паанги + Тонга паанги - Тимор эскудо - Тимор эскудо + Тимор эскуди + Тимор эскуди + Тимор эскуди + Тимор эскуди - Турци лира (1922–2005) - Турци лира (1922–2005) + Турци лири (1922–2005) + Турци лири (1922–2005) + Турци лири (1922–2005) + Турци лири (1922–2005) Турци лири - Тринидад тата Тобаго долларӗ + Тринидадпа Тобаго долларӗ + Тринидадпа Тобаго долларӗ + Тринидадпа Тобаго долларӗ + Тринидадпа Тобаго долларӗ - Ҫӗнӗ Тайван долларӗ + Тайвань ҫӗнӗ долларӗ + Тайвань ҫӗнӗ долларӗ + Тайвань ҫӗнӗ долларӗ + Тайвань ҫӗнӗ долларӗ Танзани шиллингӗ @@ -7621,12 +12889,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Украина гривни - Украина карбованец - Украина карбованец + Украина карбованецӗ + Украина карбованецӗ + Украина карбованецӗ + Украина карбованецӗ - Уганда шиллинг (1966–1987) - Уганда шиллинг (1966–1987) + Уганда шиллингӗ (1966–1987) + Уганда шиллингӗ (1966–1987) + Уганда шиллингӗ (1966–1987) + Уганда шиллингӗ (1966–1987) Уганда шиллингӗ @@ -7636,42 +12908,61 @@ CLDR data files are interpreted according to the LDML specification (http://unic $ - АПШ долларӗ ыранхи кун - АПШ долларӗ ыранхи кун + АПШ долларӗ (ҫитес кун) + АПШ долларӗ (ҫитес кун) + АПШ долларӗ (ҫитес кун) + АПШ долларӗ (ҫитес кун) - АПШ долларӗ паянхи кун - АПШ долларӗ паянхи кун + АПШ долларӗ (ҫак кун) + АПШ долларӗ (ҫак кун) + АПШ долларӗ (ҫак кун) + АПШ долларӗ (ҫак кун) - Уругвай песийӗ (индексаци хыҫҫӑн единици) - Уругвай песийӗ (индексаци хыҫҫӑн единици) + Уругвай песи (индексациленӗ единица) + Уругвай песи (индексациленӗ единица) + Уругвай песи (индексациленӗ единица) + Уругвай песи (индексациленӗ единица) - Уругвай песийӗ (1975–1993) - Уругвай песийӗ (1975–1993) + Уругвай песи (1975–1993) + Уругвай песи (1975–1993) + Уругвай песи (1975–1993) + Уругвай песи (1975–1993) - Уругвай песийӗ + Уругвай песи + Уругвай песи + Уругвай песи + Уругвай песи - Уругвай номиналлӑ индексаци единици - Уругвай номиналлӑ индексаци единици + Уругвай номинал ӗҫ хакӗн индексӗн единици + Уругвай номинал ӗҫ хакӗн индексӗн единици + Уругвай номинал ӗҫ хакӗн индексӗн единици + Уругвай номинал ӗҫ хакӗн индексӗн единици - Узбек сумӗ + Узбекистан сумӗ + Узбекистан сумӗ + Узбекистан сумӗ + Узбекистан сумӗ - Венесуэла боливарӗ (1871–2008) - Венесуэла боливарӗ (1871–2008) + Венесуэла боливарӗ (1871–2008) - Суверенлă боливарӗ - Суверенлă боливарӗ + Венесуэла суверенлӑ боливарӗ + Венесуэла суверенлӑ боливарӗ + Венесуэла суверенлӑ боливарӗ + Венесуэла суверенлӑ боливарӗ - Венесуэль боливарӗ (2008–2018) - Венесуэль боливарӗ (2008–2018) + Венесуэла боливарӗ (2008–2018) + Венесуэла боливарӗ (2008–2018) + Венесуэла боливарӗ (2008–2018) + Венесуэла боливарӗ (2008–2018) Венесуэла боливарӗ @@ -7680,2680 +12971,3824 @@ CLDR data files are interpreted according to the LDML specification (http://unic Вьетнам донгӗ - Вьетнам донг (1978–1985) - Вьетнам донг (1978–1985) + Вьетнам донгӗ (1978–1985) + Вьетнам донгӗ (1978–1985) + Вьетнам донгӗ (1978–1985) + Вьетнам донгӗ (1978–1985) - Вануату ватуйӗ + Вануату ватувӗ + Вануату ватувӗ + Вануату ватувӗ + Вануату ватувӗ Самоа тали - Тӗп Африка КФА франкӗ + Вӑта Африка КФА франкӗ + Вӑта Африка КФА франкӗ + Вӑта Африка КФА франкӗ + Вӑта Африка КФА франкӗ - кӗмӗл - Трой унци кӗмӗл + кӗмӗл + Троя унцийӗ кӗмӗлпе + Троя унцийӗ кӗмӗлпе + Троя унцийӗ кӗмӗлпе - ылтӑн - Трой унци ылтӑн + ылтӑн + Троя унцийӗ ылтӑнпа + Троя унцийӗ ылтӑнпа + Троя унцийӗ ылтӑнпа - Европа хутлă единици - Европа хутлă единици + Европа сыпӑнчӑк единици + Европа сыпӑнчӑк единици + Европа сыпӑнчӑк единици + Европа сыпӑнчӑк единици - Европа укҫа единици - Европа укҫа единици + Европа укҫа единици - Европа расчет единицисем (XBС) - Европа расчет единицисем (XBС) + Европа тӳлев единици (XBС) + Европа тӳлев единици (XBС) + Европа тӳлев единици (XBС) + Европа тӳлев единици (XBС) - Европа расчет единицисем (XBD) - Европа расчет единицисем (XBD) + Европа тӳлев единици (XBD) + Европа тӳлев единици (XBD) + Европа тӳлев единици (XBD) + Европа тӳлев единици (XBD) - Хӗвелтухӑҫ Карибсем долларӗ + Тухӑҫ Кариб долларӗ + Тухӑҫ Кариб долларӗ + Тухӑҫ Кариб долларӗ + Тухӑҫ Кариб долларӗ - Кариб гульден - Кариб гульден + Кариб гульденӗ + Кариб гульденӗ + Кариб гульденӗ + Кариб гульденӗ - ятарлӑ заемлени прависем (СДР) - ятарлӑ заемлени прависем (СДР) + ятарлӑ йышӑну прависем (СДР) + ятарлӑ йышӑну прависем (СДР) + ятарлӑ йышӑну прависем (СДР) + ятарлӑ йышӑну прависем (СДР) - Европа валюта единици - Европа валюта единици + Европа валюта единици - Франци ылтӑн франк - Франци ылтӑн франк + Франци ылтӑн франкӗ + Франци ылтӑн франкӗ + Франци ылтӑн франкӗ + Франци ылтӑн франкӗ - Франци UIC-франк - Франци UIC-франк + Франци UIC франкӗ + Франци UIC франкӗ + Франци UIC франкӗ + Франци UIC франкӗ - КФА ВСЕАО франкӗ + Анӑҫ Африка КФА франкӗ + Анӑҫ Африка КФА франкӗ + Анӑҫ Африка КФА франкӗ + Анӑҫ Африка КФА франкӗ - паллади - Трой унци паллади + паллади + Троя унцийӗ палладипе + Троя унцийӗ палладипе + Троя унцийӗ палладипе - Франци Лӑпкӑ океан франкӗ + КФП франкӗ + КФП франкӗ + КФП франкӗ + КФП франкӗ - платина - Трой унци платина + платина + Троя унцийӗ платинӑпа + Троя унцийӗ платинӑпа + Троя унцийӗ платинӑпа - RINET фонд единици - RINET фонд единици + RINET фонд единици - сукре - сукре + сукре - тĕрĕслев валют код - тĕрĕслев валют код + тӗрӗслев валют кочӗ + тӗрӗслев валют кочӗ + тӗрӗслев валют кочӗ + тӗрӗслев валют кочӗ - ADB расчет единици - ADB расчет единици + ADB тӳлев единици + ADB тӳлев единици + ADB тӳлев единици + ADB тӳлев единици паллӑ мар валюта - Йемен динар - Йемен динар + Йемен динарӗ + Йемен динарӗ + Йемен динарӗ + Йемен динарӗ Йемен риалӗ - Югослави хытӑ динарӗ (1966–1990) - Югослави хытӑ динарӗ (1966–1990) + Югослави хытӑ динарӗ (1966–1990) - Югослави ҫӗнӗ динарӗ (1994–2002) - Югослави ҫӗнӗ динарӗ (1994–2002) + Югослави ҫӗнӗ динарӗ (1994–2002) - Югослави конвертланакан динарӗ (1990–1992) - Югослави конвертланакан динарӗ (1990–1992) + Югослави конверсиленекен динарӗ (1990–1992) + Югослави конверсиленекен динарӗ (1990–1992) + Югослави конверсиленекен динарӗ (1990–1992) + Югослави конверсиленекен динарӗ (1990–1992) - Югослави реформӑланӑ динарӗ (1992–1993) - Югослави реформӑланӑ динарӗ (1992–1993) + Югослави реформӑланӑ динарӗ (1992–1993) - Кӑнтӑр Африка рэндӗ (финанс) - Кӑнтӑр Африка рэндӗ (финанс) + Кӑнтӑр Африка рэнчӗ (финанс) + Кӑнтӑр Африка рэнчӗ (финанс) + Кӑнтӑр Африка рэнчӗ (финанс) + Кӑнтӑр Африка рэнчӗ (финанс) - Кӑнтӑр Африка рэндӗ + Кӑнтӑр Африка рэнчӗ + Кӑнтӑр Африка рэнчӗ + Кӑнтӑр Африка рэнчӗ + Кӑнтӑр Африка рэнчӗ - Замби квачи (1968–2012) - Замби квачи (1968–2012) + Замби квачи (1968–2012) Замби квачи - Ҫӗнӗ заир (1993–1998) - Ҫӗнӗ заир (1993–1998) + Заир ҫӗнӗ заирӗ (1993–1998) + Заир ҫӗнӗ заирӗ (1993–1998) + Заир ҫӗнӗ заирӗ (1993–1998) + Заир ҫӗнӗ заирӗ (1993–1998) - Заир (1971–1993) - Заир (1971–1993) + Заир заирӗ (1971–1993) + Заир заирӗ (1971–1993) + Заир заирӗ (1971–1993) + Заир заирӗ (1971–1993) - Зимбабве доллар (1980–2008) - Зимбабве доллар (1980–2008) + Зимбабве долларӗ (1980–2008) + Зимбабве долларӗ (1980–2008) + Зимбабве долларӗ (1980–2008) + Зимбабве долларӗ (1980–2008) + + + Зимбабве ылтӑнӗ + Зимбабве ылтӑнӗ + Зимбабве ылтӑнӗ + Зимбабве ылтӑнӗ - Зимбабве доллар (2009) - Зимбабве доллар (2009) + Зимбабве долларӗ (2009–2024) + Зимбабве долларӗ (2009–2024) + Зимбабве долларӗ (2009–2024) + Зимбабве долларӗ (2009–2024) - Зимбабве доллар (2008) - Зимбабве доллар (2008) + Зимбабве долларӗ (2008) + Зимбабве долларӗ (2008) + Зимбабве долларӗ (2008) + Зимбабве долларӗ (2008) ≈{0} - {0} кунсем - {0}-мӗш хӗреслӗ урамран сылтӑм енне пӑрӑнӑр + Пан улми ҫук. + {0} пан улми пур. Ӑна илесшӗн-и? + {0} пан улми пур. Вӗсене илесшӗн-и? + {0}-мӗш пан улми выртать. - деци{0} + деци{0} - санти{0} + санти{0} - милли{0} + милли{0} - микро{0} + микро{0} - нано{0} + нано{0} - пико{0} + пико{0} - фемто{0} + фемто{0} - атто{0} + атто{0} - зепто{0} + зепто{0} - иокто{0} + иокто{0} - ронто{0} + ронто{0} - квекто{0} + квекто{0} - дека{0} + дека{0} - гекто{0} + гекто{0} - кило{0} + кило{0} - мега{0} + мега{0} - гига{0} + гига{0} - тера{0} + тера{0} - пета{0} + пета{0} - экса{0} + экса{0} - зетта{0} + зетта{0} - иотта{0} + иотта{0} - ронна{0} + ронна{0} - кветта{0} + кветта{0} - киби{0} + киби{0} - меби{0} + меби{0} - гиби{0} + гиби{0} - теби{0} + теби{0} - пеби{0} + пеби{0} - эксби{0} + эксби{0} - зеби{0} + зеби{0} - йоби{0} + йоби{0} - тӑваткал {0} + тӑваткал {0} + тӑваткал {0} + тӑваткал {0} - кубла {0} + куб {0} + куб {0} + куб {0} + + + {0}-{1} - ирĕклĕн ӳкнин хăвăртланăвĕ - {0} ирĕклĕн ӳкнин хăвăртланăвĕ + ирӗклӗ ӳкни хӑвӑртланӑвӗ + {0} g + {0} g + {0} ирӗклӗ ӳкни хӑвӑртланӑвӗ - тӑваткал ҫеккунтра метр - тӑваткал ҫеккунтра {0} метр - - - çавра - {0} çавра + метр/тӑваткал ҫеккунт + {0} м/ҫ² + {0} м/ҫ² + {0} метр/тӑваткал ҫеккунт - радиан - {0} радиан + {0} рад + {0} рад + {0} рад - градус - {0} градус + {0}° + {0}° + {0}° - кĕтесле минут - {0} кĕтесле минут + пӗкӗ минучӗ + {0}′ + {0}′ + {0} пӗкӗ минучӗ - кĕтесле çеккунт - {0} кĕтесле çеккунт + пӗкӗ ҫеккунчӗ + {0}″ + {0}″ + {0} пӗкӗ ҫеккунчӗ - тӑваткал километр - {0} тӑваткал километр - {0}/тӑваткал километр + тӑваткал километр + {0} км² + {0} км² + {0} тӑваткал километр + {0}/тӑваткал километр - гектар - {0} гектар + гектар + {0} га + {0} га + {0} гектар - тӑваткал метр - {0} тӑваткал метр - {0}/тӑваткал метр + тӑваткал метр + {0} м² + {0} м² + {0} тӑваткал метр + {0}/тӑваткал метр - тӑваткал сантиметр - {0} тӑваткал сантиметр - {0}/тӑваткал сантиметр + тӑваткал сантиметр + {0} см² + {0} см² + {0} тӑваткал сантиметр + {0}/тӑваткал сантиметр - тӑваткал миля - {0} тӑваткал миля - {0}/тӑваткал миля - - - акр - {0} акр + тӑваткал миля + {0} ми² + {0} ми² + {0} тӑваткал миля + {0}/тӑваткал миля - тӑваткал ярд - {0} тӑваткал ярд + тӑваткал ярд + {0} ярд² + {0} ярд² + {0} тӑваткал ярд - тӑваткал фут - {0} тӑваткал фут + тӑваткал фут + {0} фт² + {0} фт² + {0} тӑваткал фут - тӑваткал дюйм - {0} тӑваткал дюйм - {0}/тӑваткал дюйм - - - дунам - {0} дунам + тӑваткал дюйм + {0} дюйм² + {0} дюйм² + {0} тӑваткал дюйм + {0}/тӑваткал дюйм - карат - {0} карат + {0} кар + {0} кар + {0} кар - децилитрӑ миллиграмм - {0} децилитрӑ миллиграмм + миллиграмм/децилитр + {0} мг/дл + {0} мг/дл + {0} миллиграмм/децилитр - литрлӑх миллимоль - {0} литрлӑх миллимоль + миллимоль/литр + {0} ммоль/л + {0} ммоль/л + {0} миллимоль/литр - объект - {0} объект + япала + {0} япала + {0} япала + {0} япала - - миллионмĕш пайĕ - {0} миллионмĕш пайĕ + + пай + {0} пай + {0} пай + {0} пай + + + миллионмĕш пайĕ + {0} млн⁻¹ + {0} млн⁻¹ + {0} миллионмĕш пайĕ - процент - {0} процент + процент + {0} % + {0} % + {0} процент - промиллĕ - {0} промиллĕ + промилле + {0} ‰ + {0} ‰ + {0} промилле - промириад - {0} промириад + промириад + {0} ‱ + {0} ‱ + {0} промириад - - моль - {0} моль + + глюкоза + {0} Глк + {0} Глк + {0} глюкоза - километрлӑх литр - километрлӑх {0} литр + литр/километр + {0} л/км + {0} л/км + {0} литр/километр - çĕр километрах литр - çĕр километрах {0} литр + литр/100 километр + {0} л/100 км + {0} л/100 км + {0} литр/100 километр - галлон ҫине миля - {0} галлон ҫине миля + миля/галлон + {0} ми/гал + {0} ми/гал + {0} миля/галлон - импери галлон ҫинче миля - {0} импери галлон ҫинче миля + миля/империлле галлон + {0} ми/имп. гал + {0} ми/имп. гал + {0} миля/империлле галлон - петабайт - {0} петабайт + петабайт + {0} Пбайт + {0} Пбайт + {0} петабайт - терабайт - {0} терабайт + терабайт + {0} Тбайт + {0} Тбайт + {0} терабайт - терабит - {0} терабит + терабит + {0} Тбит + {0} Тбит + {0} терабит - гигабайт - {0} гигабайт + гигабайт + {0} Гбайт + {0} Гбайт + {0} гигабайт - гигабит - {0} гигабит + гигабит + {0} Гбит + {0} Гбит + {0} гигабит - мегабайт - {0} мегабайт + мегабайт + {0} Мбайт + {0} Мбайт + {0} мегабайт - мегабит - {0} мегабит + мегабит + {0} Мбит + {0} Мбит + {0} мегабит - килобайт - {0} килобайт + килобайт + {0} кбайт + {0} кбайт + {0} килобайт - килобит - {0} килобит - - - байт - {0} байт - - - бит - {0} бит - - - ӗмӗрсем - {0} ӗмӗрсем + килобит + {0} кбит + {0} кбит + {0} килобит - вунҫуллӑх - {0} вунҫуллӑх + вунӑ ҫуллӑх + {0} вунӑ ҫ. + {0} вунӑ ҫ. + {0} вунӑ ҫуллӑх - ҫулталӑксем - {0} ҫулталӑксем - {0} ҫулталӑкра + ҫул + {0} ҫул + {0} ҫул + {0} ҫул - чӗрӗк - {0} чӗрӗк - {0}/чӗрӗк - - - уйăхсем - {0} уйӑхсем - {0}/уйӑх - - - эрне - {0} эрне - {0}/эрнере - - - кун - {0} кун - {0} кунне + {0} чӗр. + {0} чӗр. + {0} чӗр. - сехет - {0} сехет - {0} сехетре + {0} сех + {0} сех + {0} сех - минут - {0} минут - {0} минутра + минут + {0} мин + {0} мин + {0} минут + {0}/минут - ҫеккунт - {0} ҫеккунт - {0}/ҫеккунтра + ҫеккунт + {0} ҫ + {0} ҫ + {0} ҫеккунт + {0}/ҫеккунт - миллиҫеккунт - {0} миллиҫеккунт + миллиҫеккунт + {0} мҫ + {0} мҫ + {0} миллиҫеккунт - микроҫеккунт - {0} микроҫеккунт + микроҫеккунт + {0} мкҫ + {0} мкҫ + {0} микроҫеккунт - наноҫеккунт - {0} наноҫеккунт + наноҫеккунт + {0} нҫ + {0} нҫ + {0} наноҫеккунт - ампер - {0} ампер + ампер + {0} А + {0} А + {0} ампер - миллиампер - {0} миллиампер + миллиампер + {0} мА + {0} мА + {0} миллиампер - ом - {0} ом + ом + {0} Ом + {0} Ом + {0} ом - вольт - {0} вольт + вольт + {0} В + {0} В + {0} вольт - килокалори - {0} килокалори + килокалори + {0} ккал + {0} ккал + {0} килокалори - калори - {0} калори + калори + {0} кал + {0} кал + {0} калори - килоджоуль - {0} килоджоуль + килоджоуль + {0} кДж + {0} кДж + {0} килоджоуль - джоуль - {0} джоуль + джоуль + {0} Дж + {0} Дж + {0} джоуль - киловатт-сехет - {0} киловатт-сехет + киловатт-сехет + {0} кВт⋅сех + {0} кВт⋅сех + {0} киловатт-сехет - электронвольт - {0} электронвольт + электронвольт + {0} эВ + {0} эВ + {0} электронвольт - британи ӑшӑ единици - {0} британи ӑшӑ единици + Британи ӑшӑ виҫи + {0} БӐВ + {0} БӐВ + {0} Британи ӑшӑ виҫи - америка терм - {0} америка терм + АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ - кĕренке-вăй - {0} кĕренке-вăй + фунт-вӑй + {0} фнтв + {0} фнтв + {0} фунт-вӑй - ньютон - {0} ньютон + ньютон + {0} Н + {0} Н + {0} ньютон - çĕр километрах киловатт-сехет - çĕр километрах {0} киловатт-сехет + киловатт-сехет/100 километр + {0} кВт⋅сех/100 км + {0} кВт⋅сех/100 км + {0} киловатт-сехет/100 километр - гигагерц - {0} гигагерц + гигагерц + {0} ГГц + {0} ГГц + {0} гигагерц - мегагерц - {0} мегагерц + мегагерц + {0} МГц + {0} МГц + {0} мегагерц - килогерц - {0} килогерц + килогерц + {0} кГц + {0} кГц + {0} килогерц - герц - {0} герц - - - эм - {0} эм + герц + {0} Гц + {0} Гц + {0} герц - пиксельсем - {0} пиксельсем + пиксель + {0} пкс + {0} пкс + {0} пиксель - мегапиксельсем - {0} Мпкс + мегапиксель + {0} Мпкс + {0} Мпкс + {0} мегапиксель - сантиметрпалан пиксель тачӑлӑхӗ - {0} сантиметрпалан пиксель тачӑлӑхӗ + пиксель/сантиметр + {0} пкс/см + {0} пкс/см + {0} пиксель/сантиметр - дюймпалан пиксель тачӑлӑхӗ - {0} дюймпалан пиксель тачӑлӑхӗ + пиксель/дюйм + {0} пкс/дюйм + {0} пкс/дюйм + {0} пиксель/дюйм - ҫӗр радиусӗ - {0} ҫӗр радиусӗ + Ҫӗр радиусӗ + {0} R⊕ + {0} R⊕ + {0} Ҫӗр радиусӗ - километр - {0} км - {0}/километр + километр + {0} км + {0} км + {0} километр + {0}/километр - метр - {0} метр - {0}/метр + метр + {0} м + {0} м + {0} метр + {0}/метр - дециметр - {0} дециметр + дециметр + {0} дм + {0} дм + {0} дециметр - сантиметр - {0} сантиметр - {0}/сантиметр + сантиметр + {0} см + {0} см + {0} сантиметр + {0}/сантиметр - миллиметр - {0} миллиметр + миллиметр + {0} мм + {0} мм + {0} миллиметр - микрометр - {0}микрометр + микрометр + {0} мкм + {0} мкм + {0} микрометр - нанометр - {0} нанометр + нанометр + {0} нм + {0} нм + {0} нанометр - пикометр - {0} пикометр + пикометр + {0} пм + {0} пм + {0} пикометр - миля - {0} миля - - - ярд - {0} ярд + миля + {0} ми + {0} ми + {0} миля - фут - {0} фут - {0}/фут - - - дюйм - {0} дюйм - {0}/дюйм + фут + {0} фт + {0} фт + {0} фут + {0}/фут - парçек - {0} парçек + парсек + {0} пк + {0} пк + {0} парсек - çуттăн çулĕ - {0} çуттăн çулĕ + ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ - астрономилле пĕрчĕ - {0} астрономилле пĕрчĕ + астрономи виҫи + {0} а. в. + {0} а. в. + {0} астрономи виҫи - фурлонгсем - {0} фурлонгсем + фурлонг + {0} фрл + {0} фрл + {0} фурлонг - тинӗс чалӑш - {0} тинӗс чалӑш + тинӗс хӑлаҫӗ + {0} тинӗс хӑл. + {0} тинӗс хӑл. + {0} тинӗс хӑлаҫӗ - тинӗс милли - {0} тинӗс милли + тинӗс мили + {0} тинӗс ми + {0} тинӗс ми + {0} тинӗс мили - скандинави милли - {0} скандинави милли + скандинави мили + {0} ск. ми + {0} ск. ми + {0} скандинави мили - типографи пункчӗ - {0} типографи пункчӗ + пункт + {0} пкт + {0} пкт + {0} пункт - хӗвел радиусӗ - {0} хӗвел радиусӗ + Хӗвел радиусӗ + {0} R☉ + {0} R☉ + {0} Хӗвел радиусӗ - люкс - {0} люкс + люкс + {0} лк + {0} лк + {0} люкс - кандела - {0} кандела + кандела + {0} кд + {0} кд + {0} кандела - люмен - {0} люмен + люмен + {0} лм + {0} лм + {0} люмен - хĕвел çутатаслăхĕ - {0} хĕвел çутатаслăхĕ + Хӗвел ҫутатаслӑхӗ + {0} L☉ + {0} L☉ + {0} Хӗвел ҫутатаслӑхӗ - метрикăлла тонна - {0} метрикăлла тонна + {0} т + {0} т + {0} т - килограмм - {0} килограмм - {0}/килограмм + килограмм + {0} кг + {0} кг + {0} килограмм + {0}/килограмм - грамм - {0} грамм - {0}/грамм + грамм + {0} г + {0} г + {0} грамм + {0}/грамм - миллиграмм - {0} миллиграмм + миллиграмм + {0} мг + {0} мг + {0} миллиграмм - микрограмм - {0} микрограмм + микрограмм + {0} мкг + {0} мкг + {0} микрограмм - америка тонна - {0} америка тонна + америкӑлла тонна + {0} ам. тонна + {0} ам. тонна + {0} америкӑлла тонна - стоун - {0} стоун + {0} стн + {0} стн + {0} стн - кĕренке - {0} кĕренке - {0}/кĕренке - - - унци - {0} унци - {0}/унци + фунт + {0} фнт + {0} фнт + {0} фунт + {0}/фунт - трой унци - {0} трой унци + троя унцийӗ + {0} тр. унц. + {0} тр. унц. + {0} троя унцийӗ - метрикăлла карат - {0} метрикăлла карат + {0} кар + {0} кар + {0} кар - массăн атомла пĕрчи - {0} массăн атомла пĕрчи + {0} Да + {0} Да + {0} Да - Ҫӗр масси - {0} Ҫӗр масси + {0} M⊕ + {0} M⊕ + {0} M⊕ - Хӗвел масси - {0} Хӗвел масси - - - гран - {0} гран + {0} M☉ + {0} M☉ + {0} M☉ - гигаватт - {0} гигаватт + гигаватт + {0} ГВт + {0} ГВт + {0} гигаватт - мегаватт - {0} мегаватт + мегаватт + {0} МВт + {0} МВт + {0} мегаватт - киловатт - {0} киловатт + киловатт + {0} кВт + {0} кВт + {0} киловатт - ватт - {0} ватт + ватт + {0} Вт + {0} Вт + {0} ватт - милливатт - {0} милливатт + милливатт + {0} мВт + {0} мВт + {0} милливатт - лаша вӑйӗ - {0} лаша вӑйӗ + лаша вӑйӗ + {0} л. в. + {0} л. в. + {0} лаша вӑйӗ - чĕркĕмĕл юпи миллиметр - чĕркĕмĕл юпи {0} миллиметр + миллиметр чĕр кĕмĕл юпипе + {0} мм ч. к. ю. + {0} мм ч. к. ю. + {0} миллиметр чĕр кĕмĕл юпипе + + + чĕр кĕмĕл юпипе + {0} ч. к. ю. + {0} ч. к. ю. + {0} чĕр кĕмĕл юпипе - тӑваткал дюйм кӗренке - тӑваткал дюйм {0} кӗренке + фунт-вӑй/тӑваткал дюйм + {0} фнтв/дюйм² + {0} фнтв/дюйм² + {0} фунт-вӑй/тӑваткал дюйм - чĕркĕмĕл юпи дюйм - чĕркĕмĕл юпи {0} дюйм - - - бар - {0} бар + дюйм чĕр кĕмĕл юпипе + {0} дюйм ч. к. ю. + {0} дюйм ч. к. ю. + {0} дюйм чĕр кĕмĕл юпипе - миллибар - {0} миллибар + миллибар + {0} мбар + {0} мбар + {0} миллибар - физикăлла атмосфера - {0} физикăлла атмосфера + {0} атм + {0} атм + {0} атм - паскаль - {0} паскаль + паскаль + {0} Па + {0} Па + {0} паскаль - гектопаскаль - {0} гектопаскаль + гектопаскаль + {0} гПа + {0} гПа + {0} гектопаскаль - килопаскаль - {0} килопаскаль + килопаскаль + {0} кПа + {0} кПа + {0} килопаскаль - мегапаскаль - {0} мегапаскаль + мегапаскаль + {0} МПа + {0} МПа + {0} мегапаскаль - сехетре километр - сехетре {0} километр + километр/сехет + {0} км/сех + {0} км/сех + {0} километр/сехет - ҫеккунтра метр - ҫеккунтра {0} метр + метр/ҫеккунт + {0} м/ҫ + {0} м/ҫ + {0} метр/ҫеккунт - сехетре миля - сехетре {0} миля + миля/сехет + {0} ми/сех + {0} ми/сех + {0} миля/сехет - тĕвĕ - {0} тĕвĕ + узел + {0} уз + {0} уз + {0} узел - Бофорт шкали ҫинчи балл - {0} Бофорт шкали ҫинчи балл + Бофорт балӗ + {0} Бфт + {0} Бфт + {0} Бофорт балӗ - Цельсий градусĕ - {0} Цельсий градусĕ + Цельсий градусĕ + {0}°C + {0}°C + {0} Цельсий градусĕ - Фаренгейт градусĕ - {0} Фаренгейт градусĕ + Фаренгейт градусĕ + {0}°F + {0}°F + {0} Фаренгейт градусĕ - Кельвин - {0} Кельвин + кельвин + {0} К + {0} К + {0} кельвин - кĕренке-фут - {0} кĕренке-фут + фунт-вӑй-фут + {0} фнтв⋅фт + {0} фнтв⋅фт + {0} фунт-вӑй-фут - ньютон-метр - {0} ньютон-метр + ньютон-метр + {0} Н⋅м + {0} Н⋅м + {0} ньютон-метр - кубла километр - {0} кубла километр + куб километр + {0} км³ + {0} км³ + {0} куб километр - кубла метр - {0} кубла метр - {0}/кубла метр + куб метр + {0} м³ + {0} м³ + {0} куб метр + {0}/куб метр - кубла сантиметр - {0} кубла сантиметр - {0}/кубла сантиметр + куб сантиметр + {0} см³ + {0} см³ + {0} куб сантиметр + {0}/куб сантиметр - кубла милли - {0} кубла милли + куб миля + {0} ми³ + {0} ми³ + {0} куб миля - кубла ярд - {0} кубла ярд + куб ярд + {0} ярд³ + {0} ярд³ + {0} куб ярд - кубла фут - {0} кубла фут + куб фут + {0} фт³ + {0} фт³ + {0} куб фут - кубла дюйм - {0} кубла дюйм + куб дюйм + {0} дюйм³ + {0} дюйм³ + {0} куб дюйм - мегалитр - {0} мегалитр + {0} Мл + {0} Мл + {0} Мл - гектолитр - {0} гектолитр + гектолитр + {0} гл + {0} гл + {0} гектолитр - литр - {0} литр - {0}/литр + литр + {0} л + {0} л + {0} литр + {0}/литр - децилитр - {0} децилитр + децилитр + {0} дл + {0} дл + {0} децилитр - сантилитр - {0} сантилитр + сантилитр + {0} сл + {0} сл + {0} сантилитр - миллилитр - {0} миллилитр + миллилитр + {0} мл + {0} мл + {0} миллилитр - пинт-метрлӑ - {0} пинт-метрлӑ + метрла пинт + {0} мпт + {0} мпт + {0} метрла пинт - курка-метрлӑ - {0} курка-метрлӑ + метрла курка + {0} м. курка + {0} м. курка + {0} метрла курка + + + метрла шӗвӗ унци + {0} м. шӗвӗ унци + {0} м. шӗвӗ унци + {0} метрла шӗвӗ унци - акр-фут - {0} акр-фут + {0} акр-фт + {0} акр-фт + {0} акр-фт - бушел - {0} бушел + бушель + {0} бушель + {0} бушель + {0} бушель - галлон - {0} галлон - {0}/галлон + америкӑлла галлон + {0} ам. гал. + {0} ам. гал. + {0} америкӑлла галлон + {0}/америкӑлла галлон - импери галлон - {0} импери галлон - {0}/импери галлон + империлле галлон + {0} имп. гал. + {0} имп. гал. + {0} империлле галлон + {0}/империлле галлон - кварт - {0} кварт + америкӑлла кварт + {0} ам. кварт + {0} ам. кварт + {0} америкӑлла кварт - пинт - {0} пинт + америкӑлла пинт + {0} ам. пинт + {0} ам. пинт + {0} америкӑлла пинт + + + империлле пинт + {0} имп. пинт + {0} имп. пинт + {0} империлле пинт - чашӑк - {0} чашӑк + америкӑлла курка + {0} ам. курка + {0} ам. курка + {0} америкӑлла курка + + + империлле курка + {0} имп. курка + {0} имп. курка + {0} империлле курка - шӗвӗ унци - {0} шӗвӗ унци + америкӑлла шӗвӗ унци + {0} ам. шӗвӗ унци + {0} ам. шӗвӗ унци + {0} америкӑлла шӗвӗ унци - импери шӗвӗ унци - {0} импери шӗвӗ унци + империлле шӗвӗ унци + {0} имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. + {0} империлле шӗвӗ унци - апат кашӑкӗ - {0} апат кашӑкӗ + {0} апат каш. + {0} апат каш. + {0} апат каш. - чей кашӑкӗ - {0} чей кашӑкӗ + {0} чей каш. + {0} чей каш. + {0} чей каш. - баррель - {0} баррель + баррель + {0} барр. + {0} барр. + {0} баррель - пылак апат кашӑкӗ - {0} пылак апат кашӑкӗ + пылак апат кашӑкӗ + {0} пыл. апат каш. + {0} пыл. апат каш. + {0} пылак апат кашӑкӗ - импери пылак апат кашӑкӗ - {0} импери пылак апат кашӑкӗ + империлле пылак апат кашӑкӗ + {0} имп. пыл. апат каш. + {0} имп. пыл. апат каш. + {0} империлле пылак апат кашӑкӗ - тумлам - {0} тумлам + {0} тумл. + {0} тумл. + {0} тумл. - шĕвĕ драхма - {0} шĕвĕ драхма - - - чӗркке - {0} чӗркке + {0} шӗвӗ др. + {0} шӗвӗ др. + {0} шӗвӗ драхма - чĕптĕм - {0} чĕптĕм + {0} чӗпт. + {0} чӗпт. + {0} чӗптӗм - импери кварт - {0} импери кварт + империлле кварт + {0} имп. кварт + {0} имп. кварт + {0} империлле кварт + + + стерадиан + {0} ср + {0} ср + {0} стерадиан + + + катал + {0} кат + {0} кат + {0} катал + + + кулон + {0} Кл + {0} Кл + {0} кулон + + + фарад + {0} Ф + {0} Ф + {0} фарад + + + генри + {0} Гн + {0} Гн + {0} генри + + + сименс + {0} См + {0} См + {0} сименс + + + калори-IT + {0} кал-IT + {0} кал-IT + {0} калори-IT + + + Британи ӑшӑ виҫи-IT + {0} БӐВ-IT + {0} БӐВ-IT + {0} Британи ӑшӑ виҫи-IT + + + беккерель + {0} Бк + {0} Бк + {0} беккерель + + + зиверт + {0} Зв + {0} Зв + {0} зиверт + + + грей + {0} Гр + {0} Гр + {0} грей + + + килограмм-вӑй + {0} кгв + {0} кгв + {0} килограмм-вӑй + + + род + {0} род + {0} род + {0} род + + + чейн + {0} чейн + {0} чейн + {0} чейн + + + тесла + {0} Тл + {0} Тл + {0} тесла + + + вебер + {0} Вб + {0} Вб + {0} вебер + + + Ранкин градусӗ + {0} °R + {0} °R + {0} Ранкин градусӗ + + + икӗ эрнелӗх + {0} икӗ эрн. + {0} икӗ эрн. + {0} икӗ эрнелӗх + + + слаг + {0} слаг + {0} слаг + {0} слаг + + + бензин танлӑхӗпе + {0} бенз. тан. + {0} бенз. тан. + {0} бензин танлӑхӗпе + + + рин + {0} рин + {0} рин + {0} рин + + + сун + {0} сун + {0} сун + {0} сун + + + сяку + {0} сяку + {0} сяку + {0} сяку + + + кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + + + кэн + {0} кэн + {0} кэн + {0} кэн + + + дзё + {0} дзё + {0} дзё + {0} дзё + + + ри + {0} ри + {0} ри + {0} ри + + + бу + {0} бу + {0} бу + {0} бу + + + сэ + {0} сэ + {0} сэ + {0} сэ + + + тё + {0} тё + {0} тё + {0} тё + + + косадзи + {0} косадзи + {0} косадзи + {0} косадзи + + + осадзи + {0} осадзи + {0} осадзи + {0} осадзи + + + каппу + {0} каппу + {0} каппу + {0} каппу + + + секи + {0} секи + {0} секи + {0} секи + + + сай + {0} сай + {0} сай + {0} сай + + + то + {0} то + {0} то + {0} то + + + коку + {0} коку + {0} коку + {0} коку - ҫутӑ хӑвӑртлӑхӗ - {0} ҫутӑ хӑвӑртлӑхӗ + ҫутӑ + {0} ҫутӑ + {0} ҫутӑ + {0} ҫутӑ - - миллиардмĕш пайĕ - {0} миллиардмĕш пайĕ + + фун + {0} фун + {0} фун + {0} фун + + + миллиардмĕш пайĕ + {0} млрд⁻¹ + {0} млрд⁻¹ + {0} миллиардмĕш пайĕ - ҫӗрсем - {0} ҫӗрсем - {0}/ҫӗр + каҫ + {0} каҫ + {0} каҫ + {0} каҫ + {0}/каҫ - {0} хӗвелтухӑҫ тӑрӑхӗ - {0} ҫурҫӗр тӑрӑхӗ - {0} кӑнтӑр тӑрӑхӗ - {0} анăҫ тӑрӑхӗ + ен + тухӑҫ еннелле {0} + ҫур ҫӗр еннелле {0} + кӑнтӑр еннелле {0} + анӑҫ еннелле {0} - д{0} + д{0} - с{0} + с{0} - м{0} + м{0} - мк{0} + мк{0} - н{0} + н{0} - п{0} + п{0} - ф{0} + ф{0} - а{0} + а{0} - з{0} + з{0} - и{0} + и{0} - р{0} + р{0} - кв{0} + кв{0} - да{0} + да{0} - г{0} + г{0} - к{0} + к{0} - М{0} + М{0} - Г{0} + Г{0} - Т{0} + Т{0} - П{0} + П{0} - Э{0} + Э{0} - З{0} + З{0} - И{0} + И{0} - Р{0} + Р{0} - Кв{0} + Кв{0} - Ки{0} + Ки{0} - Ми{0} + Ми{0} - Ги{0} + Ги{0} - Ти{0} + Ти{0} - Пи{0} + Пи{0} - Эи{0} + Эи{0} - Зи{0} + Зи{0} - Йи{0} + Йи{0} - g - {0}g + g + {0} g + {0} g + {0} g - м/ҫ² - {0} м/ҫ² + м/ҫ² + {0} м/ҫ² + {0} м/ҫ² + {0} м/ҫ² - çавра - {0} çавра + çавра + {0} çавра + {0} çавра + {0} çавра - радиан - {0} радиан + рад + {0} рад + {0} рад + {0} рад - градус - {0} градус + градус + {0}° + {0}° + {0}° - минут - {0} минут + + {0}′ + {0}′ + {0}′ - çеккунт - {0} çеккунт + + {0}″ + {0}″ + {0}″ - км² - {0} км² - {0}/км² + км² + {0} км² + {0} км² + {0} км² + {0}/км² - га - {0} га + га + {0} га + {0} га + {0} га - м² - {0} м² - {0}/м² + м² + {0} м² + {0} м² + {0} м² + {0}/м² - см² - {0} см² - {0}/см² + см² + {0} см² + {0} см² + {0} см² + {0}/см² - ми² - {0} ми² - {0}/ми² + ми² + {0} ми² + {0} ми² + {0} ми² + {0}/ми² - акр - {0} акр + акр + {0} акр + {0} акр + {0} акр - ярд² - {0} ярд² + ярд² + {0} ярд² + {0} ярд² + {0} ярд² - фт² - {0} фт² + фт² + {0} фт² + {0} фт² + {0} фт² - дюйм² - {0} дюйм² - {0}/дюйм² + дюйм² + {0} дюйм² + {0} дюйм² + {0} дюйм² + {0}/дюйм² - дунам - {0} дунам + дунам + {0} дунам + {0} дунам + {0} дунам - карат - {0} карат + кар + {0} кар + {0} кар + {0} кар - мг/дл - {0} мг/дл + мг/дл + {0} мг/дл + {0} мг/дл + {0} мг/дл - ммоль/л - {0} ммоль/л + ммоль/л + {0} ммоль/л + {0} ммоль/л + {0} ммоль/л - объект - {0} объект + япала + {0} япала + {0} япала + {0} япала + + + пай + {0} пай + {0} пай + {0} пай + + + млн⁻¹ + {0} млн⁻¹ + {0} млн⁻¹ + {0} млн⁻¹ + + + {0} % + {0} % + {0} % + + + {0} ‰ + {0} ‰ + {0} ‰ + + + {0} ‱ + {0} ‱ + {0} ‱ - моль - {0} моль + моль + {0} моль + {0} моль + {0} моль + + + Глк + {0} Глк + {0} Глк + {0} Глк - л/км - {0} л/км + л/км + {0} л/км + {0} л/км + {0} л/км - л/100 км - {0} л/100 км + л/100 км + {0} л/100 км + {0} л/100 км + {0} л/100 км - ми/гал - {0} ми/гал + ми/гал + {0} ми/гал + {0} ми/гал + {0} ми/гал - мили/имп. гал - {0} ми/имп. гал + ми/имп. гал + {0} ми/имп. гал + {0} ми/имп. гал + {0} ми/имп. гал - Пбайт - {0} Пбайт + Пбайт + {0} Пбайт + {0} Пбайт + {0} Пбайт - Тбайт - {0} Тбайт + Тбайт + {0} Тбайт + {0} Тбайт + {0} Тбайт - Тбит - {0} Тбит + Тбит + {0} Тбит + {0} Тбит + {0} Тбит - Гбайт - {0} Гбайт + Гбайт + {0} Гбайт + {0} Гбайт + {0} Гбайт - Гбит - {0} Гбит + Гбит + {0} Гбит + {0} Гбит + {0} Гбит - Мбайт - {0} Мбайт + Мбайт + {0} Мбайт + {0} Мбайт + {0} Мбайт - Мбит - {0} Мбит + Мбит + {0} Мбит + {0} Мбит + {0} Мбит - Кбайт - {0} Кбайт + кбайт + {0} кбайт + {0} кбайт + {0} кбайт - кбит - {0} кбит + кбит + {0} кбит + {0} кбит + {0} кбит - байт - {0} байт + байт + {0} байт + {0} байт + {0} байт - бит - {0} бит + бит + {0} бит + {0} бит + {0} бит - ӗмӗр - {0} ӗмӗр + ӗмӗр + {0} ӗмӗр + {0} ӗмӗр + {0} ӗмӗр - вунҫул - {0} вунҫул + вунӑ ҫ. + {0} вунӑ ҫ. + {0} вунӑ ҫ. + {0} вунӑ ҫ. - ҫулсем - {0} ҫулсем - {0}/ҫул + ҫул + {0} ҫул + {0} ҫул + {0} ҫул + {0}/ҫул - чӗрӗк - {0} чӗрӗк - {0}/чӗрӗк + чӗр. + {0} чӗр. + {0} чӗр. + {0} чӗр. + {0}/чӗр. - уйӑх - {0} уйӑх - {0}/уйӑх + уйӑх + {0} уйӑх + {0} уйӑх + {0} уйӑх + {0}/уйӑх - эрне - {0} эрне - {0}/эрне + эрне + {0} эрне + {0} эрне + {0} эрне + {0}/эрне - кун - {0} кун - {0}/кун + кун + {0} кун + {0} кун + {0} кун + {0}/кун - сехет - {0} сехет - {0}/сехет + сех + {0} сех + {0} сех + {0} сех + {0}/сех - мин - {0} мин - {0}/мин + мин + {0} мин + {0} мин + {0} мин + {0}/мин - ҫ - {0} ҫ - {0}/ҫ + ҫ + {0} ҫ + {0} ҫ + {0} ҫ + {0}/ҫ - мҫ - {0} мҫ + мҫ + {0} мҫ + {0} мҫ + {0} мҫ - мкҫ - {0} мкҫ + мкҫ + {0} мкҫ + {0} мкҫ + {0} мкҫ - нҫ - {0} нҫ + нҫ + {0} нҫ + {0} нҫ + {0} нҫ - А - {0} А + А + {0} А + {0} А + {0} А - мА - {0} мА + мА + {0} мА + {0} мА + {0} мА - Ом - {0} Ом + Ом + {0} Ом + {0} Ом + {0} Ом - В - {0} В + В + {0} В + {0} В + {0} В - ккал - {0} ккал + ккал + {0} ккал + {0} ккал + {0} ккал - кал - {0} кал + кал + {0} кал + {0} кал + {0} кал - кДж - {0} кДж + кДж + {0} кДж + {0} кДж + {0} кДж - Дж - {0} Дж + Дж + {0} Дж + {0} Дж + {0} Дж - КВт⋅сехет - {0} КВт⋅сехет + кВт⋅сех + {0} кВт⋅сех + {0} кВт⋅сех + {0} кВт⋅сех - эВ - {0} эВ + эВ + {0} эВ + {0} эВ + {0} эВ - БӐЕ - {0} БӐЕ + БӐВ + {0} БӐВ + {0} БӐВ + {0} БӐВ - АПШ терм - {0} АПШ терм + АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ - кĕренке-вăй - {0} кĕренке-вăй + фнтв + {0} фнтв + {0} фнтв + {0} фнтв - Н - {0} Н + Н + {0} Н + {0} Н + {0} Н - кВт⋅ч/100 км - {0} кВт⋅ч/100 км + кВт⋅сех/100 км + {0} кВт⋅сех/100 км + {0} кВт⋅сех/100 км + {0} кВт⋅сех/100 км - ГГц - {0} ГГц + ГГц + {0} ГГц + {0} ГГц + {0} ГГц - МГц - {0} МГц + МГц + {0} МГц + {0} МГц + {0} МГц - кГц - {0} кГц + кГц + {0} кГц + {0} кГц + {0} кГц - Гц - {0} Гц + Гц + {0} Гц + {0} Гц + {0} Гц - эм - {0} эм + эм + {0} эм + {0} эм + {0} эм - пиксельсем - {0} пкс + пкс + {0} пкс + {0} пкс + {0} пкс - мегапиксельсем - {0} Мпкс + Мпкс + {0} Мпкс + {0} Мпкс + {0} Мпкс - пкс/см - {0} пкс/см + пкс/см + {0} пкс/см + {0} пкс/см + {0} пкс/см - пкс/дюйм - {0} пкс/дюйм + пкс/дюйм + {0} пкс/дюйм + {0} пкс/дюйм + {0} пкс/дюйм - ҫӗр радиусӗ - {0} ҫӗр радиусӗ + {0} R⊕ + {0} R⊕ + {0} R⊕ - км - {0} км - {0}/км + км + {0} км + {0} км + {0} км + {0}/км - м - {0} м - {0}/м + м + {0} м + {0} м + {0} м + {0}/м - дм - {0} дм + дм + {0} дм + {0} дм + {0} дм - см - {0} см - {0}/см + см + {0} см + {0} см + {0} см + {0}/см - мм - {0} мм + мм + {0} мм + {0} мм + {0} мм - мкм - {0} мкм + мкм + {0} мкм + {0} мкм + {0} мкм - нм - {0} нм + нм + {0} нм + {0} нм + {0} нм - пм - {0} пм + пм + {0} пм + {0} пм + {0} пм - ми - {0} ми + ми + {0} ми + {0} ми + {0} ми - ярд - {0} ярд + ярд + {0} ярд + {0} ярд + {0} ярд - фт - {0} фт - {0}/фт + фт + {0} фт + {0} фт + {0} фт + {0}/фт - дюйм - {0} дюйм - {0}/дюйм + дюйм + {0} дюйм + {0} дюйм + {0} дюйм + {0}/дюйм - пк - {0} пк + пк + {0} пк + {0} пк + {0} пк - çуттăн çулĕ - {0} çуттăн çулĕ + ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ - а.п. - {0} а.п. + а. в. + {0} а. в. + {0} а. в. + {0} а. в. - фурлонгсем - {0} фрл + фрл + {0} фрл + {0} фрл + {0} фрл - тинӗс чалӑш - {0} тинӗс чалӑш + тинӗс хӑл. + {0} тинӗс хӑл. + {0} тинӗс хӑл. + {0} тинӗс хӑл. - тнс.ми - {0} тинӗс милли + тинӗс ми + {0} тинӗс ми + {0} тинӗс ми + {0} тинӗс ми - ск.ми - {0} ск.ми + ск. ми + {0} ск. ми + {0} ск. ми + {0} ск. ми - пкт - {0} пкт + пкт + {0} пкт + {0} пкт + {0} пкт - хӗвел радиусӗ - {0} хӗвел радиусӗ + {0} R☉ + {0} R☉ + {0} R☉ - лк - {0} лк + лк + {0} лк + {0} лк + {0} лк - кд - {0} кд + кд + {0} кд + {0} кд + {0} кд - лм - {0} лм + лм + {0} лм + {0} лм + {0} лм - тонна - {0} тонна + т + {0} т + {0} т + {0} т - кг - {0} кг - {0}/кг + кг + {0} кг + {0} кг + {0} кг + {0}/кг - г - {0} г - {0}/г + г + {0} г + {0} г + {0} г + {0}/г - мг - {0} мг + мг + {0} мг + {0} мг + {0} мг - мкг - {0} мкг + мкг + {0} мкг + {0} мкг + {0} мкг - амер. тонна - {0} амер. тонна + ам. тонна + {0} ам. тонна + {0} ам. тонна + {0} ам. тонна - стоун - {0} стоун + стн + {0} стн + {0} стн + {0} стн - кĕренке - {0} кĕренке - {0}/кĕренке + фнт + {0} фнт + {0} фнт + {0} фнт + {0}/фнт - унци - {0} унци - {0}/унци + унци + {0} унци + {0} унци + {0} унци + {0}/унци - трой унци - {0} трой унци + тр. унцийӗ + {0} тр. унц. + {0} тр. унц. + {0} тр. унц. - карат - {0} карат + кар + {0} кар + {0} кар + {0} кар - дальтон - {0} дальтон + Да + {0} Да + {0} Да + {0} Да - Ҫӗр масси - {0} Ҫӗр масси + {0} M⊕ + {0} M⊕ + {0} M⊕ - Хӗвел масси - {0} Хӗвел масси + {0} M☉ + {0} M☉ + {0} M☉ - гран - {0} гран + гран + {0} гран + {0} гран + {0} гран - ГВт - {0} ГВт + ГВт + {0} ГВт + {0} ГВт + {0} ГВт - МВт - {0} МВт + МВт + {0} МВт + {0} МВт + {0} МВт - КВт - {0} КВт + кВт + {0} кВт + {0} кВт + {0} кВт - Вт - {0} Вт + Вт + {0} Вт + {0} Вт + {0} Вт - мВт - {0} мВт + мВт + {0} мВт + {0} мВт + {0} мВт - л.в. - {0} л.в. + л. в. + {0} л. в. + {0} л. в. + {0} л. в. - чĕркĕмĕл юпи мм - чĕркĕмĕл юпи {0} мм + мм ч. к. ю. + {0} мм ч. к. ю. + {0} мм ч. к. ю. + {0} мм ч. к. ю. + + + ч. к. ю. + {0} ч. к. ю. + {0} ч. к. ю. + {0} ч. к. ю. - дюйм² кӗренке - дюйм² {0} кӗренке + фнтв/дюйм² + {0} фнтв/дюйм² + {0} фнтв/дюйм² + {0} фнтв/дюйм² - чĕркĕмĕл юпи дюйм - чĕркĕмĕл юпи {0} дюйм + дюйм ч. к. ю. + {0} дюйм ч. к. ю. + {0} дюйм ч. к. ю. + {0} дюйм ч. к. ю. - бар - {0} бар + бар + {0} бар + {0} бар + {0} бар - мбар - {0} мбар + мбар + {0} мбар + {0} мбар + {0} мбар - атмосфера - {0} атмосфера + атм + {0} атм + {0} атм + {0} атм - Па - {0} Па + Па + {0} Па + {0} Па + {0} Па - гПа - {0} гПа + гПа + {0} гПа + {0} гПа + {0} гПа - кПа - {0} кПа + кПа + {0} кПа + {0} кПа + {0} кПа - МПа - {0} МПа + МПа + {0} МПа + {0} МПа + {0} МПа - км/сехет - {0} км/сехет + км/сех + {0} км/сех + {0} км/сех + {0} км/сех - м/ҫ - {0} м/ҫ + м/ҫ + {0} м/ҫ + {0} м/ҫ + {0} м/ҫ - ми/сехет - {0} ми/сехет + ми/сех + {0} ми/сех + {0} ми/сех + {0} ми/сех - тĕвĕ - {0} тĕвĕ + уз + {0} уз + {0} уз + {0} уз - Бофорт балл - {0} Бофорт балл + Бфт + {0} Бфт + {0} Бфт + {0} Бфт - К - {0} К + К + {0} К + {0} К + {0} К - кĕренке-фут - {0} кĕренке-фут + фнтв⋅фт + {0} фнтв⋅фт + {0} фнтв⋅фт + {0} фнтв⋅фт - Н⋅м - {0} Н⋅м + Н⋅м + {0} Н⋅м + {0} Н⋅м + {0} Н⋅м - км³ - {0} км³ + км³ + {0} км³ + {0} км³ + {0} км³ - м³ - {0} м³ - {0}/м³ + м³ + {0} м³ + {0} м³ + {0} м³ + {0}/м³ - см³ - {0} см³ - {0}/см³ + см³ + {0} см³ + {0} см³ + {0} см³ + {0}/см³ - ми³ - {0} ми³ + ми³ + {0} ми³ + {0} ми³ + {0} ми³ - ярд³ - {0} ярд³ + ярд³ + {0} ярд³ + {0} ярд³ + {0} ярд³ - фт³ - {0} фт³ + фт³ + {0} фт³ + {0} фт³ + {0} фт³ - дюйм³ - {0} дюйм³ + дюйм³ + {0} дюйм³ + {0} дюйм³ + {0} дюйм³ - мегалитр - {0} мегалитр + Мл + {0} Мл + {0} Мл + {0} Мл - гл - {0} гл + гл + {0} гл + {0} гл + {0} гл - л - {0} л - {0}/л + л + {0} л + {0} л + {0} л + {0}/л - дл - {0} дл + дл + {0} дл + {0} дл + {0} дл - сл - {0} сл + сл + {0} сл + {0} сл + {0} сл - мл - {0} мл + мл + {0} мл + {0} мл + {0} мл - мпт - {0} мпт + мпт + {0} мпт + {0} мпт + {0} мпт - курка-метрлӑ - {0} курка-метрлӑ + м. курка + {0} м. курка + {0} м. курка + {0} м. курка + + + м. шӗвӗ унци + {0} м. шӗвӗ унци + {0} м. шӗвӗ унци + {0} м. шӗвӗ унци - акр-фут - {0} акр-фут + акр-фт + {0} акр-фт + {0} акр-фт + {0} акр-фт - буш. - {0} буш. + бушель + {0} бушель + {0} бушель + {0} бушель - гал. - {0} гал. - {0}/гал. + ам. гал. + {0} ам. гал. + {0} ам. гал. + {0} ам. гал. + {0}/ам. гал. - импери галлон - {0} импери галлон - {0}/импери галлон + имп. гал. + {0} имп. гал. + {0} имп. гал. + {0} имп. гал. + {0}/имп. гал. - кварт - {0} кварт + ам. кварт + {0} ам. кварт + {0} ам. кварт + {0} ам. кварт - пинт - {0} пинт + ам. пинт + {0} ам. пинт + {0} ам. пинт + {0} ам. пинт + + + имп. пинт + {0} имп. пинт + {0} имп. пинт + {0} имп. пинт - чашӑк - {0} чашӑк + ам. курка + {0} ам. курка + {0} ам. курка + {0} ам. курка + + + имп. курка + {0} имп. курка + {0} имп. курка + {0} имп. курка - шӗвӗ унци - {0} шӗвӗ унци + ам. шӗвӗ унци + {0} ам. шӗвӗ унци + {0} ам. шӗвӗ унци + {0} ам. шӗвӗ унци - импери шӗвӗ унци - {0} импери шӗвӗ унци + имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. - апат кашӑкӗ - {0} апат кашӑкӗ + апат каш. + {0} апат каш. + {0} апат каш. + {0} апат каш. - чей кашӑкӗ - {0} чей кашӑкӗ + чей каш. + {0} чей каш. + {0} чей каш. + {0} чей каш. - барр. - {0} барр. + барр. + {0} барр. + {0} барр. + {0} барр. - плк.апат кшк. - {0} плк.апат кшк. + пыл. апат каш. + {0} пыл. апат каш. + {0} пыл. апат каш. + {0} пыл. апат каш. - имп. пылак апат кашӑкӗ - {0} имп.пылак апат кашӑкӗ + имп. пыл. апат каш. + {0} имп. пыл. апат каш. + {0} имп. пыл. апат каш. + {0} имп. пыл. апат каш. - тумлам - {0} тумлам + тумл. + {0} тумл. + {0} тумл. + {0} тумл. - шĕвĕ драхма - {0} шĕвĕ драхма + шӗвӗ др. + {0} шӗвӗ др. + {0} шӗвӗ др. + {0} шӗвӗ др. - чӗркке - {0} чӗркке + чӗркке + {0} чӗркке + {0} чӗркке + {0} чӗркке - чĕптĕм - {0} чĕптĕм + чӗпт. + {0} чӗпт. + {0} чӗпт. + {0} чӗпт. - импери кварт - {0} импери кварт + имп. кварт + {0} имп. кварт + {0} имп. кварт + {0} имп. кварт + + + ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + + + кал-IT + {0} кал-IT + {0} кал-IT + {0} кал-IT + + + БӐВ-IT + {0} БӐВ-IT + {0} БӐВ-IT + {0} БӐВ-IT + + + Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + + + кгв + {0} кгв + {0} кгв + {0} кгв + + + род + {0} род + {0} род + {0} род + + + чейн + {0} чейн + {0} чейн + {0} чейн + + + Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + + + {0} °R + {0} °R + {0} °R + + + икӗ эрн. + {0} икӗ эрн. + {0} икӗ эрн. + {0} икӗ эрн. + + + слаг + {0} слаг + {0} слаг + {0} слаг + + + бенз. тан. + {0} бенз. тан. + {0} бенз. тан. + {0} бенз. тан. + + + рин + {0} рин + {0} рин + {0} рин + + + сун + {0} сун + {0} сун + {0} сун + + + сяку + {0} сяку + {0} сяку + {0} сяку + + + кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + + + кэн + {0} кэн + {0} кэн + {0} кэн + + + дзё + {0} дзё + {0} дзё + {0} дзё + + + ри + {0} ри + {0} ри + {0} ри + + + бу + {0} бу + {0} бу + {0} бу + + + сэ + {0} сэ + {0} сэ + {0} сэ + + + тё + {0} тё + {0} тё + {0} тё + + + косадзи + {0} косадзи + {0} косадзи + {0} косадзи + + + осадзи + {0} осадзи + {0} осадзи + {0} осадзи + + + каппу + {0} каппу + {0} каппу + {0} каппу + + + секи + {0} секи + {0} секи + {0} секи + + + сай + {0} сай + {0} сай + {0} сай + + + то + {0} то + {0} то + {0} то + + + коку + {0} коку + {0} коку + {0} коку - ҫутӑ хӑвӑрт - {0} ҫутӑ хӑвӑрт + ҫутӑ + {0} ҫутӑ + {0} ҫутӑ + {0} ҫутӑ + + + фун + {0} фун + {0} фун + {0} фун + + + млрд⁻¹ + {0} млрд⁻¹ + {0} млрд⁻¹ + {0} млрд⁻¹ - ҫӗрсем - {0} ҫӗрсем - {0}/ҫӗр + каҫ + {0} каҫ + {0} каҫ + {0} каҫ + {0}/каҫ - енӗ - {0} х. т. - {0} ҫ. т. - {0} к. т. - {0} а. т. + ен + т. е. {0} + ҫ. е. {0} + к. е. {0} + а. е. {0} - - д{0} - - - с{0} - - - м{0} - - - мк{0} - - - н{0} - - - п{0} - - - ф{0} - - - а{0} - - - з{0} - - - и{0} - - - р{0} - - - кв{0} - - - да{0} - - - г{0} - - - к{0} - - - М{0} - - - Г{0} - - - Т{0} - - - П{0} - - - Э{0} - - - З{0} - - - И{0} - - - Р{0} - - - Кв{0} - - - Ки{0} - - - Ми{0} - - - Ги{0} - - - Ти{0} - - - Пи{0} - - - Эи{0} - - - Зи{0} - - - Йи{0} - - g - {0}g - - - м/ҫ² - {0} м/ҫ² - - - çавра - {0} çавра + {0} g + {0} g + {0} g - рад - {0} рад + рад + {0} рад + {0} рад + {0} рад - градус + {0}° + {0}° + {0}° - минут - {0} минут + + {0}′ + {0}′ + {0}′ - çеккунт - {0} çеккунт - - - км² - {0} км² - {0}/км² - - - га - {0} га - - - м² - {0} м² - {0}/м² - - - см² - {0} см² - {0}/см² - - - ми² - {0} ми² - {0}/ми² - - - акр - {0} акр - - - ярд² - {0} ярд² - - - фт² - {0} фт² - - - дюйм² - {0} дюйм² - {0}/дюйм² - - - дунам - {0} дунам + + {0}″ + {0}″ + {0}″ - кар - {0} кар - - - мг/дл - {0} мг/дл - - - ммоль/л - {0} ммоль/л + кар + {0} кар + {0} кар + {0} кар - объект - {0} объект + япала + {0} япала + {0} япала + {0} япала - - моль - {0} моль + + пай + {0} пай + {0} пай + {0} пай - - л/км - {0} л/км + + млн⁻¹ + {0} млн⁻¹ + {0} млн⁻¹ + {0} млн⁻¹ - - л/100 км - {0} л/100 км + + {0} % + {0} % + {0} % - - ми/гал - {0} ми/гал + + {0} ‰ + {0} ‰ + {0} ‰ + + + {0} ‱ + {0} ‱ + {0} ‱ + + + Глк + {0} Глк + {0} Глк + {0} Глк - ми/имп. гал - {0} ми/имп. гал + ми/имп. гал - Пб - {0} Пб + ПБ + {0} Пбайт + {0} Пбайт + {0} ПБ - Тб - {0} Тб + ТБ + {0} Тбайт + {0} Тбайт + {0} ТБ - Тбит - {0} Тбит + Тб + {0} Тбит + {0} Тбит + {0} Тб - Гб - {0} Гб + ГБ + {0} Гбайт + {0} Гбайт + {0} ГБ - Гбит - {0} Гбит + Гб + {0} Гбит + {0} Гбит + {0} Гб - Мб - {0} Мб + МБ + {0} Мбайт + {0} Мбайт + {0} МБ - Мбит - {0} Мбит + Мб + {0} Мбит + {0} Мбит + {0} Мб - Кб - {0} Кб + кБ + {0} кбайт + {0} кбайт + {0} кБ - кбит - {0} кбит + кб + {0} кбит + {0} кбит + {0} кб - Б - {0} Б - - - бит - {0} бит - - - ӗмӗр - {0} ӗмӗр + Б + {0} байт + {0} байт + {0} Б - внҫл - {0} внҫл + вунӑ ҫ. + {0} вунӑ ҫ. + {0} вунӑ ҫ. + {0} вунӑ ҫ. - ҫул. - {0} ҫул. - {0}/ҫул + ҫул + {0} ҫул + {0} ҫул + {0} ҫул - чрк - {0} чрк - {0}/чрк - - - уйӑх - {0} уйӑх - {0}/уйӑх - - - эрн. - {0} эрн. - {0}/эрн. - - - к. - {0} к. - {0}/к. + чӗр. + {0} чӗр. + {0} чӗр. + {0} чӗр. + {0}/чӗр. - схт - {0} схт - {0}/схт - - - мин - {0} мин - {0}/мин - - - ҫ - {0} ҫ - {0}/ҫ - - - мҫ - {0} мҫ - - - мкҫ - {0} мкҫ - - - нҫ - {0} нҫ - - - А - {0} А - - - мА - {0} мА - - - Ом - {0} Ом - - - В - {0} В - - - ккал - {0} ккал - - - кал - {0} кал - - - кДж - {0} кДж - - - Дж - {0} Дж + сех + {0} сех + {0} сех + {0} сех + {0}/сех - КВт⋅схт - {0} КВт⋅схт - - - эВ - {0} эВ + кВт⋅сех + {0} кВт⋅сех + {0} кВт⋅сех + {0} кВт⋅сех - БӐЕ - {0} БӐЕ + БӐВ + {0} БӐВ + {0} БӐВ + {0} БӐВ - АПШ терм - {0} АПШ терм + АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ + {0} АПШ термӗ - крнк-вăй - {0} крнк-вăй - - - Н - {0} Н + фнтв + {0} фнтв + {0} фнтв + {0} фнтв - кВт⋅ч/100 км - {0} кВт⋅ч/100 км - - - ГГц - {0} ГГц - - - МГц - {0} МГц - - - кГц - {0} кГц - - - Гц - {0} Гц - - - эм - {0} эм + кВт⋅сех/100 км + {0} кВт⋅сех/100 км + {0} кВт⋅сех/100 км + {0} кВт⋅сех/100 км - пкс - {0} пкс + пкс - Мпкс - {0} Мпкс - - - пкс/см - {0} пкс/см - - - пкс/дюйм - {0} пкс/дюйм + Мпкс - ҫӗр р-сӗ - {0} ҫӗр р-сӗ - - - км - {0} км - {0}/км - - - м - {0} м - {0}/м - - - дм - {0} дм - - - см - {0} см - {0}/см - - - мм - {0} мм - - - мкм - {0} мкм - - - нм - {0} нм - - - пм - {0} пм - - - ми - {0} ми - - - ярд - {0} ярд - - - фт - {0} фт - {0}/фт - - - дюйм - {0} дюйм - {0}/дюйм - - - пк - {0} пк + R⊕ + {0} R⊕ + {0} R⊕ + {0} R⊕ - ç.ç. - {0} ç.ç. + ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ + {0} ҫутӑ ҫулӗ - а.п. - {0} а.п. + а. в. + {0} а. в. + {0} а. в. + {0} а. в. - фрл - {0} фрл + фрл - тнс.члш. - {0} тнс.члш. + тинӗс хӑл. + {0} тинӗс хӑл. + {0} тинӗс хӑл. + {0} тинӗс хӑл. - тнс.ми - {0} тнс.ми + тинӗс ми + {0} тинӗс ми + {0} тинӗс ми + {0} тинӗс ми - ск.ми - {0} ск.ми - - - пкт - {0} пкт + ск. ми + {0} ск. ми + {0} ск. ми + {0} ск. ми - хӗвел р-с - {0} хӗвел р-с - - - лк - {0} лк - - - кд - {0} кд - - - лм - {0} лм + R☉ + {0} R☉ + {0} R☉ + {0} R☉ - т - {0} т - - - кг - {0} кг - {0}/кг - - - г - {0} г - {0}/г - - - мг - {0} мг - - - мкг - {0} мкг + т + {0} т + {0} т + {0} т - амер. т - {0} амер. т + ам. тонна + {0} ам. тонна + {0} ам. тонна + {0} ам. тонна - стн - {0} стн + стн + {0} стн + {0} стн + {0} стн - крнк - {0} крнк - {0}/крнк - - - унц. - {0} унц. - {0}/унц. + фнт + {0} фнт + {0} фнт + {0} фнт + {0}/фнт - тр. унц. - {0} тр. унц. + тр. унцийӗ + {0} тр. унц. + {0} тр. унц. + {0} тр. унц. - кар - {0} кар + кар + {0} кар + {0} кар + {0} кар - Да - {0} Да + Да + {0} Да + {0} Да + {0} Да - Ҫӗр масси - {0} Ҫӗр масси + M⊕ + {0} M⊕ + {0} M⊕ + {0} M⊕ - Хӗвел масси - {0} Хӗвел масси - - - гран - {0} гран - - - ГВт - {0} ГВт + M☉ + {0} M☉ + {0} M☉ + {0} M☉ - Мвт - {0} МВт + Мвт - КВт - {0} КВт - - - Вт - {0} Вт - - - мВт - {0} мВт + кВт + {0} кВт + {0} кВт + {0} кВт - л.в. - {0} л.в. + л. в. + {0} л. в. + {0} л. в. + {0} л. в. - ч.ю. мм - ч.ю. {0} мм + мм ч. к. ю. + {0} мм ч. к. ю. + {0} мм ч. к. ю. + {0} мм ч. к. ю. + + + ч. к. ю. + {0} ч. к. ю. + {0} ч. к. ю. + {0} ч. к. ю. - дюйм² крнк - дюйм² {0} крнк + фнтв/дюйм² + {0} фнтв/дюйм² + {0} фнтв/дюйм² + {0} фнтв/дюйм² - ч.ю. дюйм - ч.ю. {0} дюйм - - - бар - {0} бар - - - мбар - {0} мбар + дюйм ч. к. ю. + {0} дюйм ч. к. ю. + {0} дюйм ч. к. ю. + ч.ю. {0} дюйм - атм - {0} атм - - - Па - {0} Па - - - гПа - {0} гПа - - - кПа - {0} кПа - - - МПа - {0} МПа + атм + {0} атм + {0} атм + {0} атм - км/схт - {0} км/схт - - - м/ҫ - {0} м/ҫ + км/сех + {0} км/сех + {0} км/сех + {0} км/сех - ми/схт - {0} ми/схт + ми/сех + {0} ми/сех + {0} ми/сех + {0} ми/сех - тĕвĕ - {0} тĕвĕ + уз + {0} уз + {0} уз + {0} уз - Бфт - {0} Бфт - - - К - {0} К + Бфт + {0} Бфт + {0} Бфт + {0} Бфт - крнк-фт - {0} крнк-фт - - - Н⋅м - {0} Н⋅м - - - км³ - {0} км³ - - - м³ - {0} м³ - {0}/м³ - - - см³ - {0} см³ - {0}/см³ - - - ми³ - {0} ми³ - - - ярд³ - {0} ярд³ - - - фт³ - {0} фт³ - - - дюйм³ - {0} дюйм³ + фнтв⋅фт + {0} фнтв⋅фт + {0} фнтв⋅фт + {0} фнтв⋅фт - Мл - {0} Мл - - - гл - {0} гл - - - л - {0} л - {0}/л - - - дл - {0} дл - - - сл - {0} сл - - - мл - {0} мл - - - мпт - {0} мпт + Мл + {0} Мл + {0} Мл + {0} Мл - крк-мтрл - {0} крк-мтрл + м. курка + {0} м. курка + {0} м. курка + {0} м. курка + + + м. шӗвӗ унци + {0} м. шӗвӗ унци + {0} м. шӗвӗ унци + {0} м. шӗвӗ унци - акр-фт - {0} акр-фт + акр-фт + {0} акр-фт + {0} акр-фт + {0} акр-фт - буш. - {0} буш. + бушель + {0} бушель + {0} бушель + {0} бушель - гал. - {0} гал. - {0}/гал. + ам. гал. + {0} ам. гал. + {0} ам. гал. + {0} ам. гал. + {0}/ам. гал. - имп.гал. - {0} имп.гал. - {0}/имп.гал. + имп. гал. + {0} имп. гал. + {0} имп. гал. + {0} имп. гал. + {0}/имп. гал. - кварт - {0} кварт + ам. кварт + {0} ам. кварт + {0} ам. кварт + {0} ам. кварт - пинт - {0} пинт + ам. пинт + {0} ам. пинт + {0} ам. пинт + {0} ам. пинт + + + имп. пинт + {0} имп. пинт + {0} имп. пинт + {0} имп. пинт - чашӑк - {0} чашӑк + ам. курка + {0} ам. курка + {0} ам. курка + {0} ам. курка + + + имп. курка + {0} имп. курка + {0} имп. курка + {0} имп. курка - шӗвӗ унци - {0} шӗвӗ унци + ам. шӗвӗ унци + {0} ам. шӗвӗ унци + {0} ам. шӗвӗ унци + {0} ам. шӗвӗ унци - имп.шӗвӗ унци - {0} импери шӗвӗ унци + имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. + {0} имп. шӗвӗ унц. - апт.кшк. - {0} апт.кшк. + апат каш. + {0} апат каш. + {0} апат каш. + {0} апат каш. - ч.кшк. - {0} ч.кшк. - - - барр. - {0} барр. + чей каш. + {0} чей каш. + {0} чей каш. + {0} чей каш. - плк.апат кшк. - {0} плк.апат кшк. + пыл. апат каш. + {0} пыл. апат каш. + {0} пыл. апат каш. + {0} пыл. апат каш. - имп.плк. апат кшк. - {0} имп.плк.апат кшк. + имп. пыл. апат каш. + {0} имп. пыл. апат каш. + {0} имп. пыл. апат каш. + {0} имп. пыл. апат каш. - тмлм - {0} тмлм + тумл. + {0} тумл. + {0} тумл. + {0} тумл. - шĕвĕ др. - {0} шĕвĕ др. - - - чӗркке - {0} чӗркке + шӗвӗ др. + {0} шӗвӗ др. + {0} шӗвӗ др. + {0} шӗвӗ др. - чптм - {0} чптм + чӗпт. + {0} чӗпт. + {0} чӗпт. + {0} чӗпт. - имп.кварт - {0} имп.кварт + имп. кварт + {0} имп. кварт + {0} имп. кварт + {0} имп. кварт + + + ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + + + кал-IT + {0} кал-IT + {0} кал-IT + {0} кал-IT + + + БӐВ-IT + {0} БӐВ-IT + {0} БӐВ-IT + {0} БӐВ-IT + + + Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + + + кгв + {0} кгв + {0} кгв + {0} кгв + + + род + {0} род + {0} род + {0} род + + + чейн + {0} чейн + {0} чейн + {0} чейн + + + Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + + + {0} °R + {0} °R + {0} °R + + + икӗ эрн. + {0} икӗ эрн. + {0} икӗ эрн. + {0} икӗ эрн. + + + слаг + {0} слаг + {0} слаг + {0} слаг + + + бенз. тан. + {0} бенз. тан. + {0} бенз. тан. + {0} бенз. тан. + + + рин + {0} рин + {0} рин + {0} рин + + + сун + {0} сун + {0} сун + {0} сун + + + сяку + {0} сяку + {0} сяку + {0} сяку + + + кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + {0} кудзирадзяку + + + кэн + {0} кэн + {0} кэн + {0} кэн + + + дзё + {0} дзё + {0} дзё + {0} дзё + + + ри + {0} ри + {0} ри + {0} ри + + + бу + {0} бу + {0} бу + {0} бу + + + сэ + {0} сэ + {0} сэ + {0} сэ + + + тё + {0} тё + {0} тё + {0} тё + + + косадзи + {0} косадзи + {0} косадзи + {0} косадзи + + + осадзи + {0} осадзи + {0} осадзи + {0} осадзи + + + каппу + {0} каппу + {0} каппу + {0} каппу + + + секи + {0} секи + {0} секи + {0} секи + + + сай + {0} сай + {0} сай + {0} сай + + + то + {0} то + {0} то + {0} то + + + коку + {0} коку + {0} коку + {0} коку - ҫутӑ хврт - {0} ҫутӑ хврт + ҫутӑ + {0} ҫутӑ + {0} ҫутӑ + {0} ҫутӑ + + + фун + {0} фун + {0} фун + {0} фун + + + млрд⁻¹ + {0} млрд⁻¹ + {0} млрд⁻¹ + {0} млрд⁻¹ - ҫрсм - {0} ҫрсм - {0}/ҫӗр + каҫ + {0} каҫ + {0} каҫ + {0} каҫ + {0}/каҫ + + ен + т. е. {0} + ҫ. е. {0} + к. е. {0} + а. е. {0} + @@ -10378,327 +16813,326 @@ CLDR data files are interpreted according to the LDML specification (http://unic - çапла - ҫук + ҫапла:а + ҫук:ҫ - {0} — пурте - {0} — пӗрлӗх - {0} — хупӑ - {0} — анлӑлан - {0} сулахаялла - {0} сылтӑмалла - {0} — истори - {0} — тӗрлӗрен - {0} — ыттисем - сӗрме купӑссем — {0} - {0} штриха - сроклӑ индекс {0} - ҫӳлти индекс {0} - активлӑх - Африка ҫырулӑхӗ - Америка ҫырулӑхӗ - выльӑх - выльӑх е ҫутҫанталӑк - стрелка - ӳт-пӳ - тӳркӗтеслӗх - Брайль шрифчӗпе - ҫурт - пуля е ҫӑлтӑр - хупӑ та уҫӑ сасӑсем - валюта символӗ - тире е соединитель - цифра - дингбат - юмӑҫ символӗ - йӗппи аялалла - йӗппи аялалла ҫӳлелле - Тухӑҫ алфавичӗ - эмодзи - Европа ҫырулӑхӗ - хӗрарӑм - ялав - ялавсем - ҫимелли - формат - форматпа пробелӑсем - экран сарлакӑшӗ - геометри форми - сарлакӑшӗ ҫурри - Хань иероглифӗсем - Радикал (китай иероглифӗсем) - ханча - Ханзи (ансатланнӑ) - Ханзи (йӑлана кӗнӗ) - чӗре - историлле шрифт - идеографи сӑнав палли - Япони канӗ - камбун (китай ҫырӑвӗ) - кандзи (иероглиф) - брелок - стрелка сулахаялла - стрелка сулахаялла сылтӑмалла - саспалли символӗ - пӳлӗнчӗк усӑ курни - арҫын - математика символӗ - Ҫывӑх Хӗвелтухӑҫ чӗлхисем - тӗрлӗрен - хальхи шрифт - модификатор - музыка символӗ - ҫутҫанталӑк - пробелӑсӑр - цифрӑсем - объект - урӑх - мӑшӑр - ҫын - фонетика алфавичӗ - пиктограмма - вырӑн - ӳсентӑран - пунктуаци - стрелка сылтӑмалла - символ е паллӑ - пӗчӗк вариантсем - смайлик - смайлик е ҫын - Кӑнтӑр Азири чӗлхесем - Кӑнтӑр-Хӗвелтухӑҫ Ази чӗлхисем - интервал - спорт - символ - техника символӗ - тонна палли - ҫулҫӳрев - ҫулҫӳрев е вырӑн - стрелоксем ҫӳлелле - вариант - уҫӑ сасӑ - ҫанталӑк - Хӗвеланӑҫ Азири чӗлхесем - пробел + {0} — пурте + {0} — пӗрлӗх + {0} — хупӑ + {0} — анлӑлан + {0} сулахаялла + {0} сылтӑмалла + {0} — истори + {0} — тӗрлӗрен + {0} — ыттисем + сӗрме купӑссем — {0} + {0} штриха + {0} штриха + {0} штриха + сроклӑ индекс {0} + ҫӳлти индекс {0} + активлӑх + Африка ҫырулӑхӗ + Америка ҫырулӑхӗ + выльӑх + выльӑх е ҫутҫанталӑк + стрелка + ӳт-пӳ + тӳркӗтеслӗх + Брайль шрифчӗпе + ҫурт + пуля е ҫӑлтӑр + хупӑ та уҫӑ сасӑсем + валюта символӗ + тире е соединитель + цифра + дингбат + юмӑҫ символӗ + йӗппи аялалла + йӗппи аялалла ҫӳлелле + Тухӑҫ алфавичӗ + эмодзи + Европа ҫырулӑхӗ + хӗрарӑм + ялав + ялавсем + ҫимелли + формат + форматпа пробелӑсем + экран сарлакӑшӗ + геометри форми + сарлакӑшӗ ҫурри + Хань иероглифӗсем + Радикал (китай иероглифӗсем) + ханча + Ханзи (ансатланнӑ) + Ханзи (йӑлана кӗнӗ) + чӗре + историлле шрифт + идеографи сӑнав палли + Япони канӗ + камбун (китай ҫырӑвӗ) + кандзи (иероглиф) + брелок + стрелка сулахаялла + стрелка сулахаялла сылтӑмалла + саспалли символӗ + пӳлӗнчӗк усӑ курни + арҫын + математика символӗ + Ҫывӑх Хӗвелтухӑҫ чӗлхисем + тӗрлӗрен + хальхи шрифт + модификатор + музыка символӗ + ҫутҫанталӑк + пробелӑсӑр + цифрӑсем + объект + урӑх + мӑшӑр + ҫын + фонетика алфавичӗ + пиктограмма + вырӑн + ӳсентӑран + пунктуаци + стрелка сылтӑмалла + символ е паллӑ + пӗчӗк вариантсем + смайлик + смайлик е ҫын + Кӑнтӑр Азири чӗлхесем + Кӑнтӑр-Хӗвелтухӑҫ Ази чӗлхисем + интервал + спорт + символ + техника символӗ + тонна палли + ҫулҫӳрев + ҫулҫӳрев е вырӑн + стрелоксем ҫӳлелле + вариант + уҫӑ сасӑ + ҫанталӑк + Анӑҫ Ази ҫырулӑхӗ + пробел - тайлӑк - оптика виҫи - тайлӑм - сарлакӑшӗ - йывăрăш - тайлӑк - алӑ пусни - текст - титовани - экран (дисплей) - плакат - тайлӑк каялла - тӳрӗ - тайлăклă - экстра-тайлӑк - ультрӑна чӑмӑртанӑ - экстра чӑмӑртанӑ - чӑмӑртанӑ - ҫурри чӑмӑртанӑ - йĕркеллĕ - ҫурри сарлакарах - сарлакарах - экстра сарлакарах - ультрӑна сарлакарах - ҫинҫешке - ҫӑп-ҫӑмӑл - ҫӑмӑл - ҫурри ҫӑмӑл - книги - регуляр - вӑтам - ҫурри ҫуллӑ - ҫуллӑ - экстра ҫуллӑ - хура - питӗ хураскер - вертикаль вак - тӗп интервал - хушма лигатурӑсем - диагональ вак - аҫлӑк номерӗсем - кивӗ стиль цифрисем - йӗрке номерӗсем - пропорци хисепӗсем - пӗчӗккисем тӗп саспаллисем - таблица хисепӗсем - каснӑ ноль + тайлӑк + оптика виҫи + тайлӑм + сарлакӑшӗ + йывăрăш + тайлӑк + алӑ пусни + текст + титовани + экран (дисплей) + плакат + тайлӑк каялла + тӳрӗ + тайлăклă + экстра-тайлӑк + ультрӑна чӑмӑртанӑ + экстра чӑмӑртанӑ + чӑмӑртанӑ + ҫурри чӑмӑртанӑ + йĕркеллĕ + ҫурри сарлакарах + сарлакарах + экстра сарлакарах + ультрӑна сарлакарах + ҫинҫешке + ҫӑп-ҫӑмӑл + ҫӑмӑл + ҫурри ҫӑмӑл + книги + регуляр + вӑтам + ҫурри ҫуллӑ + ҫуллӑ + экстра ҫуллӑ + хура + питӗ хураскер + вертикаль вак + тӗп интервал + хушма лигатурӑсем + диагональ вак + аҫлӑк номерӗсем + кивӗ стиль цифрисем + йӗрке номерӗсем + пропорци хисепӗсем + пӗчӗккисем тӗп саспаллисем + таблица хисепӗсем + каснӑ ноль - und cv + und cv - {title} {given} {given2} {surname} — {generation}, {credentials} + {title} {given} {given2} {surname} — {generation}, {credentials} - {given-informal} {surname} + {given-informal} {surname} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {given-informal-monogram-allCaps}{surname-monogram-allCaps} - - - {title} {given} {given2} {surname} — {generation}, {credentials} + {given-informal-monogram-allCaps}{surname-monogram-allCaps} - {given-informal} {surname} + {given-informal} {surname} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {given-initial} {given2-initial} {surname} + {given-initial} {given2-initial} {surname} - {given-informal} {surname-initial} + {given-informal} {surname-initial} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname} {title} {given} {given2} {credentials} + {surname} {title} {given} {given2} {credentials} - {surname} {given-informal} + {surname} {given-informal} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps}{given-informal-monogram-allCaps} + {surname-monogram-allCaps}{given-informal-monogram-allCaps} - {surname} {given} {given2-initial}, {credentials} + {surname} {given} {given2-initial}, {credentials} - {surname} {given-informal} + {surname} {given-informal} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname} {given-initial} {given2-initial} + {surname} {given-initial} {given2-initial} - {surname} {given-initial} + {surname} {given-initial} - {title} {surname} + {title} {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname-core}, {given} {given2} {surname-prefix} + {surname-core}, {given} {given2} {surname-prefix} - {surname}, {given-informal} + {surname}, {given-informal} - {surname-core}, {given} {given2-initial} {surname-prefix} + {surname-core}, {given} {given2-initial} {surname-prefix} - {surname}, {given-informal} + {surname}, {given-informal} - {surname-core}, {given-initial} {given2-initial} {surname-prefix} + {surname-core}, {given-initial} {given2-initial} {surname-prefix} - {surname}, {given-informal} + {surname}, {given-informal} - Аталан + Аталан - Илемпи - Корнилова + Илемпи + Корнилова - Константин - Васильевич - Иванов + Константин + Васильевич + Иванов - ∅∅∅ - Николай - Коля - Иванович - ∅∅∅ - Ашмарин - ∅∅∅ - ∅∅∅ - ∅∅∅ + ∅∅∅ + Николай + Николай + Иванович + ∅∅∅ + Ашмарин + ∅∅∅ + ∅∅∅ + ∅∅∅ - Синдбад + Синдбад - Кете - Мюллер + Кете + Мюллер - Цецилия - Хэмиш - Штёбер + Цецилия + Хэмиш + Штёбер - проф., д-р - Ада Корнелия - Неле - Сезар Мартин - фон - Брюль - Гонсалес Доминго - мл. - к.м.н. + проф., д-р + Ада Корнелия + Неле + Сезар Мартин + фон + Брюль + Гонсалес Доминго + мл. + к.м.н. diff --git a/make/data/cldr/common/main/cy.xml b/make/data/cldr/common/main/cy.xml index 7b68a594923..7d5e5fd3d67 100644 --- a/make/data/cldr/common/main/cy.xml +++ b/make/data/cldr/common/main/cy.xml @@ -286,6 +286,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Baffia Cwleneg Cwrdeg + Cwrdeg + Cwrmanjeg Cwmiceg Comi Cernyweg @@ -749,6 +751,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tsieina Colombia Ynys Clipperton + Sarc Costa Rica Ciwba Cabo Verde @@ -889,7 +892,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Polynesia Ffrengig Papua Guinea Newydd Y Philipinau - Pakistan + Pacistan Gwlad Pwyl Saint-Pierre-et-Miquelon Ynysoedd Pitcairn @@ -1009,51 +1012,88 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Fformat Arian Trefn Math o Arian + Cyflwyniad Emoji Cylched Awr (12 vs 24) Arddull Toriad Llinell + Toriadau Llinell o fewn Geiriau System Fesur Rhifau + Toriad Brawddeg ar ôl Byrfodd Calendr Bwdaidd - Calendr Tseina + Bwdaidd + Calendr Tsieineaidd + Tsieineaidd Calendr y Coptiaid + Coptaidd Calendr Dangi + Dangi Calendr Ethiopia + Ethiopaidd Calendr Amete Alem Ethiopia + Amete Alem Ethiopia Calendr Gregori + Gregoraidd Calendr Hebreaidd + Hebreaidd Calendr Cenedlaethol India Calendr Hijri + Hijri Calendr Hijri (tabl, cyfnod sifil) + Hijri (tabl, cyfnod sifil) Calendr Hijri (Umm al-Qura) + Hijri (Umm al-Qura) Calendr ISO-8601 Calendr Japan + Japaneaidd Calendr Persia + Persiaidd Calendr Gweriniaeth Tseina + Gweriniaeth Tseina Fformat Arian Cyfrifeg + Cyfrifeg Fformat Arian Safonol - Trefn Traddodiadol Tsieina - Big5 + Safonol Trefn Geiriadur Trefn Rhagosodedig Unicode + Unicode Rhagosodedig Rheolau trefnu Ewropeaidd - Trefn Symledig Tsieina - GB2312 Trefn Llyfr Ffôn Trefn Pinyin Chwilio at Ddibenion Cyffredinol + Chwilio Trefn Safonol + Safonol Trefn Traddodiadol Trefn Zhuyin + Rhagosodedig + Emoji + Testun System 12 Awr (0–11) + 12 (0–11) System 12 Awr (1–12) + 12 (1–12) System 24 Awr (0–23) + 24 (0–23) System 24 Awr (1–24) + 24 (1–24) Arddull Toriad Llinell Rhydd + Rhydd Arddull Toriad Llinell Arferol + Arferol Arddull Torriad Llinell Caeth + Caeth + Torri’r cyfan + Cadw’r cyfan + Normal + Cadw mewn brawddegau System Fetrig + Metrig System Fesur Imperialaidd + DU System Fesur UDA + UDA Digidau Arabig-Indig Digidau Arabig-Indig Estynedig Rhifolion Armenaidd @@ -1096,6 +1136,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Digidau Thai Digidau Tibetaidd Digidau Vai + Wedi’i ddiffodd + Ymlaen Metrig @@ -1147,6 +1189,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'am' {0} + + {1} 'am' {0} + @@ -1155,6 +1200,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'am' {0} + + {1} 'am' {0} + @@ -1171,11 +1219,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a d/M @@ -1532,6 +1581,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'am' {0} + + {1} 'am' {0} + @@ -1540,6 +1592,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'am' {0} + + {1} 'am' {0} + @@ -1548,6 +1603,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1556,6 +1614,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + E, h:mm a @@ -1563,11 +1624,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, h:mm:ss a E, HH:mm:ss y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1601,7 +1663,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h a – h a h – h a @@ -1626,7 +1687,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -2517,33 +2577,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dinas Anhysbys - - Tucumán - Fienna Brwsel - - Eirunepé - - - Cuiabá - - - Belém - Bae Cambridge Ynys y Pasg - - Bogotá - Ynys y Nadolig @@ -2592,9 +2637,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Rhufain - - Enderbury - Kostanay @@ -2671,9 +2713,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Amser Gorllewin Affrica - Amser Safonol Gorllewin Affrica - Amser Haf Gorllewin Affrica + Amser Gorllewin Affrica @@ -3041,6 +3081,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Amser Guyana + + + Amser Safonol Hawaii-Aleutian + + Amser Hawaii-Aleutian @@ -3605,7 +3650,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5940,6 +5984,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ doler Dwyrain y Caribî doler Dwyrain y Caribî + + guilder Caribïaidd + guilder Caribïaidd + guilder Caribïaidd + guilder Caribïaidd + guilder Caribïaidd + guilder Caribïaidd + guilder Caribïaidd + Uned Arian Cyfred Ewropeaidd uned arian cyfred Ewropeaidd @@ -6075,6 +6128,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ doler Zimbabwe (1980–2008) doler Zimbabwe (1980–2008) + + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + Zimbabwean Gold + Doler Zimbabwe (2009) doler Zimbabwe (2009) @@ -6380,7 +6442,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmol/L {0} milimôl y litr - + + rhan + {0} rhan + {0} rhan + {0} ran + {0} rhan + {0} rhan + {0} rhan + + rhannau pob miliwn {0} rhan pob miliwn {0} rhan pob miliwn @@ -6416,6 +6487,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ molau + + o glwcos + {0} Glc + {0} o glwcos + {0} Glc + {0} Glc + {0} Glc + {0} Glc + litrau y cilometr {0} L/km @@ -7228,6 +7308,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} milimetr o fercwri + + o fercwri + pwysau y fodfedd sgwar {0} psi @@ -7518,6 +7601,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mc {0} cwpanaid metrig + + owns hylif metrig + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + {0} owns hylif metrig + erw-droedfeddi {0} erw-droedfedd @@ -7646,8 +7738,109 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chwart Imp + + steradianau + {0} sr + {0} steradian + {0} sr + {0} sr + {0} sr + {0} steradian + + + coulombs + {0} C + {0} coulomb + {0} C + {0} C + {0} C + {0} coulomb + + + ffaradau + {0} F + {0} ffarad + {0} F + {0} F + {0} F + {0} ffarad + + + henrys + {0} H + {0} henry + {0} H + {0} H + {0} H + {0} henry + + + siemensau + {0} S + {0} siemens + {0} S + {0} S + {0} S + {0} siemens + + + calorïau [IT] + {0} cal-IT + {0} calori [IT] + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + becquerel + {0} Bq + {0} becquerel + {0} Bq + {0} Bq + {0} Bq + {0} becquerel + + + sievert + {0} Sv + {0} sievert + {0} Sv + {0} Sv + {0} Sv + {0} sievert + + + gray + {0} Gy + {0} gray + {0} Gy + {0} Gy + {0} Gy + {0} gray + + + grym cilogram + + + teslâu + {0} T + {0} tesla + {0} T + {0} T + {0} T + {0} tesla + + + weberau + {0} Wb + {0} weber + {0} Wb + {0} Wb + {0} Wb + {0} weber + - golau golau golau golau @@ -7655,7 +7848,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ golau {0} golau - + rhannau fesul biliwn ppb {0} rhan fesul biliwn @@ -7664,16 +7857,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} rhan fesul biliwn {0} rhan fesul biliwn - - nosau - {0} noson - {0} noson - {0} noson - {0} noson - {0} noson - {0} noson - {0}/noson - cyfeiriad cardinal {0} i’r dwyrain @@ -7798,7 +7981,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} eitem {0} eitem - + + rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + + rhan/miliwn @@ -7819,6 +8011,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} môl {0} môl + + Glc + litrau/km @@ -8211,6 +8406,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + o Hg + metrau/eil @@ -8366,6 +8564,89 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cht Imp. {0} cht Imp. + + {0} sr + {0} sr + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} C + {0} C + {0} C + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + {0} S + {0} S + {0} S + + + cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} T + {0} T + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + golau golau @@ -8375,7 +8656,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} golau {0} golau - + rhannau/biliwn @@ -8520,9 +8801,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kt {0}kt + + rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + {0} rhan + % + + Glc + L/km {0}L/km @@ -9160,6 +9453,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg {0}mmHg + + o Hg + {0}psi {0}psi @@ -9484,8 +9780,90 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt Imp. {0}qt-Imp. + + {0} sr + {0} sr + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} C + {0} C + {0} C + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + {0} S + {0} S + {0} S + + + cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} T + {0} T + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + - golau {0} golau {0} golau {0} golau @@ -9493,7 +9871,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} golau {0} golau - + {0} ppb {0}ppb {0} ppb @@ -9502,14 +9880,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ppb - nosau {0} noson {0}noson {0}noson {0}noson {0}noson {0}noson - {0}/noson {0}dn diff --git a/make/data/cldr/common/main/da.xml b/make/data/cldr/common/main/da.xml index 56c7e15ea39..33673627040 100644 --- a/make/data/cldr/common/main/da.xml +++ b/make/data/cldr/common/main/da.xml @@ -294,6 +294,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurdisk + kurdisk + kurmanji kymyk kutenaj komi @@ -853,6 +855,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kina Colombia Clippertonøen + Sark Costa Rica Cuba Kap Verde @@ -1153,35 +1156,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numerisk sortering Sorteringsstyrke valuta + emojivisning timeur (12 vs. 24) linjeskift + linjeskift midt i ord målesystem tal + afsluttende tegnsætning efter fork. Tidszone Sprogvariant Privatbrug buddhistisk kalender + buddhistisk kinesisk kalender + kinesisk koptisk kalender + koptisk dangi-kalender + dangi etiopisk kalender + etiopisk etiopisk amete-alem-kalender + etiopisk amete-alem gregoriansk kalender + gregoriansk jødisk kalender + jødisk indisk nationalkalender hijri-kalender + hijri verdslig hijri-kalender + verdslig hijri islamisk kalender (Saudi-Arabien, observation) islamisk kalender (tabellarisk, astronomisk epoke) hijri-kalender (Umm al-Qura) + hijri (Umm al-Qura) ISO-8601-kalender japansk kalender + japansk persisk kalender + persisk kalender for Republikken Kina + Republikken Kina format for regnskabsvaluta + regnskab format for standardvaluta + standard Sortér efter symboler Sortér, og ignorer symboler Sortér efter accenter i normal rækkefølge @@ -1191,22 +1213,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sortér med store bogstaver først Sortér uden forskel på store og små bogstaver Sortér med skelnen mellem store og små bogstaver - sorteringsrækkefølge uforkortet kinesisk - Big5 tidligere sorteringsrækkefølge, kompatibilitet + kompatibilitet sorteringsrækkefølge for ordbog + ordbog Unicode-standardsorteringsrækkefølge + standard-Unicode europæisk sorteringsrækkefølge - sorteringsrækkefølge forkortet kinesisk - GB2312 sorteringsrækkefølge i telefonbøger + telefonbog fonetisk sorteringsrækkefølge + fonetisk pinyin-baseret sorteringsrækkefølge + pinyin generel søgning + søg sortér efter den første konsonant i hangul standardsorteringsrækkefølge + standard stregbaseret sorteringsrækkefølge + streg traditionel sorteringsrækkefølge - sortering efter streger i rodtegn + traditionel + sorteringsrækkefølge efter radikal-strøg + radikal-strøg zhuyin-sorteringsrækkefølge + zhuyin Sortér uden normalisering Sortér Unicode efter første normalisering Sortér efter individuelle cifre @@ -1219,18 +1251,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ fuld bredde halv bredde Numerisk + standard + emoji + tekst 12-timersur (0-11) + 12 (0–11) 12-timersur (1-12) + 12 (1–12) 24-timersur (0-23) + 24 (0–23) 24-timersur (1-24) + 24 (1–24) løst linjeskift + løst normalt linjeskift + normalt hårdt linjeskift + hårdt + bryd alle + behold alle + normal + behold i sætningsdele BGN UNGEGN metersystem + metrisk britisk målesystem + britisk amerikansk målesystem + amerikansk hindu-arabiske tal udvidede hindu-arabiske tal armenske tal @@ -1292,6 +1341,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tibetanske tal Traditionelle tal vai-tal + Fra + Til det metriske system @@ -1354,20 +1405,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 0. tidsregning - 1. tidsregning - - - 0. tidsr. - 1. tidsr. - - - 0. t. - 1. t. - - @@ -1389,20 +1426,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 0. tidsregning - 1. tidsregning - - - 0. tidsr. - 1. tidsr. - - - 0. t. - 1. t. - - @@ -1436,6 +1459,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1444,6 +1470,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} kl. {0} + @@ -1467,11 +1496,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E HH.mm.ss y G + M/y G d.M.y GGGGG + E, d/M/y G MMM y G d. MMM y G E d. MMM y G - h a h.mm a HH.mm h.mm.ss a @@ -1838,6 +1868,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1846,6 +1879,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1854,6 +1890,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'kl'. {0} + @@ -1862,6 +1901,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'kl'. {0} + h.mm B @@ -1875,11 +1917,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E HH.mm.ss y G + M/y G d.M.y GGGGG + E d/M/y G MMM y G d. MMM y G E d. MMM y G - h a h.mm a HH.mm h.mm.ss a @@ -1966,7 +2009,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a - h–h a h.mm a–h.mm a @@ -1988,7 +2030,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a v - h–h a v M–M @@ -2671,9 +2712,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ukendt by - - Tirana - Jerevan @@ -2686,18 +2724,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - São Paulo - Zürich Påskeøen - - Ürümqi - Kap Verde @@ -2751,7 +2783,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bisjkek - Enderbury + Canton Island Comorerne @@ -2878,9 +2910,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Vestafrikansk tid - Vestafrikansk normaltid - Vestafrikansk sommertid + Vestafrikansk tid @@ -3278,6 +3308,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyana-tid + + + Hawaii-Aleutian-normaltid + + Hawaii-Aleutian-tid @@ -3728,6 +3763,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuuk-tid + + + Tyrkisk tid + Tyrkisk normaltid + Tyrkisk sommertid + + Turkmensk tid @@ -3891,7 +3933,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -5240,6 +5285,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ østkaribisk dollar østkaribiske dollar + + caribiske gylden + caribiske gylden + caribiske gylden + SDR @@ -5350,6 +5400,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwisk dollar (1980–2008) Zimbabwiske dollar (1980–2008) + + Zimbabwe Gold + Zimbabwe Gold + Zimbabwe Gold + Zimbabwisk dollar (2009) Zimbabwisk dollar (2009) @@ -5641,7 +5696,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} enheder {0} enheders - + + parter + {0} part + {0} parter + + common parts per million {0} part per million @@ -5675,6 +5735,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} mols + + glukose + {0} glukose + {0} glukose + common liter pr. kilometer @@ -6384,6 +6449,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimeter kviksølv {0} millimeter kviksølvs + + kviksølv + {0} kviksølv + {0} kviksølv + pounds pr. kvadrattomme {0} pound pr. kvadrattomme @@ -6622,6 +6692,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metriske kopper {0} metriske koppers + + metriske flydende ounces + {0} metrisk flydende ounce + {0} metriske flydende ounces + acre-fod {0} acre-fod @@ -6726,7 +6801,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} britisk quart {0} britiske quarts - + + steradianer + {0} steradian + {0} steradianer + + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + international tabelkalorie + {0} calIT + {0} calIT + + + becquerel + {0} becquerel + {0} becquerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + kilopond + {0} kilopond + {0} kilopond + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + + + lys + {0} lys + {0} lys + + common milliardtedele {0} milliardtedel @@ -6736,7 +6881,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ common - nætter {0} nat {0} nats {0} nætter @@ -6815,6 +6959,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glk + {0} Glk + {0} Glk + l/km {0} l/km @@ -7025,9 +7174,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg - ″ Hg - {0} ″ Hg - {0} ″ Hg + tommer Hg + {0} tomme Hg + {0} tommer Hg km/t @@ -7148,7 +7297,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} britisk qt {0} britiske qt - + + {0} sr + {0} sr + + + kalorie [IT] + {0} calIT + {0} calIT + + + {0} Gy + {0} Gy + + + kp + {0} kp + {0} kp + + + lys + {0} lys + {0} lys + + dele/milliard @@ -7198,11 +7370,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/L + + p + {0} p + {0} p + % {0} % {0} % + + Glk + {0} Glk + {0} Glk + {0}mpgUK {0}mpgUK @@ -7281,7 +7463,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kWh/100 km - {0}kWh/100km + {0} kWh/100 km {0} kWh/100 km @@ -7414,11 +7596,28 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} br. qt. {0} br. qt. + + calIT + {0} calIT + {0} calIT + + + {0} Gy + {0} Gy + + + kp + {0} kp + {0} kp + + + lys + {0} lys + {0} lys + - nætter {0}nat {0}nætter - {0}/nat diff --git a/make/data/cldr/common/main/de.xml b/make/data/cldr/common/main/de.xml index 3ca5a3d1ec1..f2638088654 100644 --- a/make/data/cldr/common/main/de.xml +++ b/make/data/cldr/common/main/de.xml @@ -321,6 +321,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Kölsch Kurdisch + Kurdisch + Kurmandschi Kumükisch Kutenai Komi @@ -946,6 +948,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Kolumbien Clipperton-Insel + Sark Costa Rica Kuba Cabo Verde @@ -1224,35 +1227,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sortierung nach Zahlen Sortierstärke Währung + Emojidarstellung Stundenformat (12h/24h) Zeilenumbruchstil + Zeilenumbruch im Wortinneren Maßsystem Ziffern + Satzabbruch nach Abk. Zeitzone Lokale Variante Privatnutzung Buddhistischer Kalender + buddhistisch Chinesischer Kalender + chinesisch Koptischer Kalender + koptisch Dangi-Kalender + Dangi Äthiopischer Kalender + äthiopisch Äthiopischer Amätä-Aläm-Kalender + äthiopisch (Amätä Aläm) Gregorianischer Kalender - Hebräischer Kalender + gregorianisch + Jüdischer Kalender + jüdisch Indischer Nationalkalender - Hidschri-Kalender - Bürgerlicher Hidschri-Kalender (tabellarisch) + Hidschra-Kalender + Hidschra + Hidschra-Kalender (tabellarisch, nicht-astronomisch) + Hidschra (tabellarisch, nicht-astronomisch) Islamischer Kalender (Saudi-Arabien, Beobachtung) Islamischer Kalender (tabellarisch, astronomische Epoche) - Hidschri-Kalender (Umm al-Qura) + Hidschra-Kalender (Umm al-Qura) + Hidschra (Umm al-Qura) ISO-8601-Kalender Japanischer Kalender + japanisch Persischer Kalender + persisch Minguo-Kalender + Minguo Währungsformat (Buchhaltung) + Buchhaltung Währungsformat (Standard) + Standard Symbole sortieren Symbole sortieren ignorieren Akzente normal sortieren @@ -1262,23 +1284,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Großbuchstaben zuerst aufführen Ohne Groß-/Kleinschreibung sortieren Nach Groß-/Kleinschreibung sortieren - Traditionelle chinesische Sortierung (Big5) Vorherige Sortierung, Kompatibilität + Kompatibilität Lexikografische Sortierung + lexikografisch Unicode-Sortierung + Standard-Unicode Emoji-Sortierung Europäische Sortierregeln - Vereinfachte chinesische Sortierung (GB2312) Telefonbuch-Sortierung + Telefonbuch Phonetische Sortierung + phonetisch Pinyin-Sortierung + Pinyin Allgemeine Suche + Suche Suche nach Anfangsbuchstaben des koreanischen Alphabets Standard-Sortierung + Standard Strichfolge + Striche Traditionelle Sortierung + traditionell Radikal-und-Strich-Sortierung + Radikal und Strich Zhuyin-Sortierung + Zhuyin Ohne Normierung sortieren Nach Unicode sortieren Ziffern einzeln sortieren @@ -1291,18 +1323,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vollbreit Halbbreit Numerisch + Standard + Emoji + Text 12-Stunden-Format (0–11) + 12 (0–11) 12-Stunden-Format (1-12) + 12 (1–12) 24-Stunden-Format (0-23) + 24 (0–23) 24-Stunden-Format (1-24) + 24 (1–24) Lockerer Zeilenumbruch + Locker Normaler Zeilenumbruch + Normal Fester Zeilenumbruch + Fest + Überall erlaubt + Nirgendwo erlaubt + Normal + Wortgruppen erhalten BGN UNGEGN Metrisches System + Metrisch Britisches Maßsystem + Britisch US-Maßsystem + US-amerikanisch Ahom-Ziffern Arabisch-indische Ziffern Erweiterte arabisch-indische Ziffern @@ -1384,6 +1433,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vai-Ziffern Warang-Citi-Ziffern Wancho-Ziffern + Aus + Ein Internationales (SI) @@ -1404,13 +1455,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [aä b c d e f g h i j k l m n oö p q r s ß t uü v w x y z] [áàăâåãā æ ç éèĕêëē ğ íìĭîïİī ı ñ óòŏôøō œ ş úùŭûū ÿ] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] + [| ~] [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + [× | ~] [\: ∶] [''’ ՚ ᾽᾿ ʼ ߴ] - [££ ₤] [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -2094,6 +2146,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'um' {0} + + {1} 'um' {0} + @@ -2102,6 +2157,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'um' {0} + + {1} 'um' {0} + @@ -2119,7 +2177,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + y-MM G d.M.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMM y G @@ -2127,6 +2187,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH 'Uhr' h:mm a h:mm:ss a + HH 'Uhr' v d.M. E, d.M. d. MMM @@ -2462,6 +2523,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'um' {0} + + {1} 'um' {0} + @@ -2470,6 +2534,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'um' {0} + + {1} 'um' {0} + @@ -2482,25 +2549,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + h 'Uhr' B + E, h 'Uhr' B + E, h:mm 'Uhr' B + E, h:mm:ss 'Uhr' B E, d. + E, h a E h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + MM/y G dd.MM.y G + E, dd.MM.y G MMM y G d. MMM y G E, d. MMM y G - h 'Uhr' a + h a HH 'Uhr' h:mm a h:mm:ss a h:mm:ss a v h:mm a v + h a v + HH 'Uhr' v d.M. E, d.M. - d.MM. + dd.MM. dd.MM. d. MMM E, d. MMM @@ -2511,7 +2587,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ M/y d.M.y E, d.M.y - MM.y + MM/y dd.MM.y MMM y d. MMM y @@ -2574,8 +2650,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM y – E, d. MMM y G - h 'Uhr' a – h 'Uhr' a - h – h 'Uhr' a + h a – h a + h – h a HH–HH 'Uhr' @@ -2598,10 +2674,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm–HH:mm 'Uhr' v HH:mm–HH:mm 'Uhr' v - - h a – h a v - h–h a v - HH–HH 'Uhr' v @@ -3283,18 +3355,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Unbekannt - - Tirana - Eriwan Wostok - - Córdoba - Wien @@ -3310,21 +3376,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Brunei Darussalam - - São Paulo - Zürich Osterinsel - - Ürümqi - - - Bogotá - Havanna @@ -3340,9 +3397,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Prag - - Büsingen - Dschibuti @@ -3355,9 +3409,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kairo - - El Aaiún - Kanaren @@ -3416,9 +3467,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bischkek - - Enderbury - Komoren @@ -3551,12 +3599,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damaskus - - N’Djamena - - - Lomé - Duschanbe @@ -3610,9 +3652,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Westafrikanische Zeit - Westafrikanische Normalzeit - Westafrikanische Sommerzeit + Westafrikanische Zeit @@ -4015,6 +4055,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyana-Zeit + + + Hawaii-Aleuten-Normalzeit + + Hawaii-Aleuten-Zeit @@ -4355,7 +4400,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ponape-Zeit + Pohnpei-Zeit @@ -4465,6 +4510,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuuk-Zeit + + + Türkische Zeit + Türkische Normalzeit + Türkische Sommerzeit + + Turkmenistan-Zeit @@ -4629,7 +4681,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ @@ -5447,7 +5499,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Malediven-Rufiyaa Malediven-Rufiyaa - Malediven-Rupien + Malediven-Rufiyaa Malawi-Kwacha @@ -5897,6 +5949,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ostkaribischer Dollar Ostkaribische Dollar + + Karibischer Gulden + Karibischer Gulden + Karibische Gulden + Sonderziehungsrechte @@ -6005,6 +6062,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Simbabwe-Dollar (1980–2008) + + Simbabwe-Gold + Simbabwe-Gold + Simbabwe-Gold + Simbabwe-Dollar (2009) @@ -6363,7 +6425,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Karat {0} Karat {0} Karat - {0} Karats + {0} Karat {0} Karat {0} Karat {0} Karat @@ -6405,7 +6467,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Elementen {0} Elemente - + + Teile + {0} Teil + {0} Teile + + neuter Millionstel {0} Millionstel @@ -6459,12 +6526,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Mol {0} Mol {0} Mol - {0} Mols + {0} Mol {0} Mol {0} Mol {0} Mol {0} Mol + + Glukose + {0} Glukose + {0} Glukose + masculine Liter pro Kilometer @@ -6530,7 +6602,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Terabytes {0} Terabyte {0} Terabyte - {0} Terabyte + {0} Terabyte {0} Terabyte {0} Terabyte {0} Terabyte @@ -6553,7 +6625,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter Gigabytes {0} Gigabyte - {0} Gigabyte + {0} Gigabyte {0} Gigabyte {0} Gigabyte {0} Gigabyte @@ -6961,7 +7033,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Newton {0} Newton {0} Newton - {0} Newtons + {0} Newton {0} Newton {0} Newton {0} Newton @@ -7590,6 +7662,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Millimeter Quecksilbersäule {0} Millimeter Quecksilbersäule + + Quecksilber + {0} Quecksilber + {0} Quecksilber + Pfund pro Quadratzoll {0} Pfund pro Quadratzoll @@ -7968,6 +8045,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrischen Tassen {0} metrischen Tassen + + metrische Flüssigunzen + {0} metrische Flüssigunze + {0} metrische Flüssigunzen + {0} Acre-Foot {0} Acre-Feet @@ -8173,7 +8255,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp. Quart {0} Imp. Quart - + + Steradiant + {0} Steradiant + {0} Steradiant + + + Katal + {0} Katal + {0} Katal + + + Coulomb + {0} Coulomb + {0} Coulomb + + + Farad + {0} Farad + {0} Farad + + + Henry + {0} Henry + {0} Henry + + + Siemens + {0} Siemens + {0} Siemens + + + Internationale-Tafel-Kalorie + {0} Internationale-Tafel-Kalorie + {0} Internationale-Tafel-Kalorien + + + Becquerel + {0} Becquerel + {0} Becquerel + + + Sievert + {0} Sievert + {0} Sievert + + + Gray + {0} Gray + {0} Gray + + + Kraftkilogramm + {0} Krafatkilogramm + {0} Krafatkilogramm + + + Tesla + {0} Tesla + {0} Tesla + + + Weber + {0} Weber + {0} Weber + + + Lichtgeschwindigkeit + {0}-fache Lichtgeschwindigkeit + {0}-fache Lichtgeschwindigkeit + + neuter Milliardstel {0} Milliardstel @@ -8187,11 +8339,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - Übernachtungen - {0} Übernachtung - {0} Übernachtung - {0} Übernachtung - {0} Übernachtung + {0} Nacht + {0} Nacht + {0} Nacht + {0} Nacht {0} Übernachtungen {0} Übernachtungen {0} Übernachtungen @@ -8253,6 +8404,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Element {0} Elemente + + Teil + {0} Teil + {0} Teil + {0} % {0} % @@ -8265,6 +8421,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -8361,6 +8520,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Std. + Min. {0} Min. {0} Min. @@ -8390,6 +8550,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} J {0} J + + Newton + kWh/100 km {0} kWh/100 km @@ -8538,6 +8701,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Ta {0} Ta + + fl.oz. m. + {0} fl.oz. m. + {0} fl.oz. m. + Acre-Feet @@ -8562,7 +8730,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ fl oz - {0} fl oz + {0} fl.oz. {0} fl oz @@ -8615,7 +8783,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp.qt. {0} Imp.qt. - + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + calIT + {0} calIT + {0} calIT + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + Lichtgeschw. + {0}-fache Lichtg. + {0}-fache Lichtg. + + Milliardstel {0} Milliardstel {0} Milliardstel @@ -8683,6 +8885,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Elem. {0} Elem. + + Teil + {0} Teil + {0} Teil + {0}‰ {0}‰ @@ -8691,6 +8898,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glc + {0}Glc + {0}Glc + {0}l/km {0}l/km @@ -8758,6 +8970,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} T {0} T + + {0}h + {0}h + + + {0}ms + {0} ms + + + {0}μs + {0} μs + A {0}A @@ -8898,6 +9122,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W + + {0}mmHg + {0}mmHg + + + {0}Hg + {0}Hg + + + {0}psi + {0}psi + {0}°F {0}°F @@ -8913,6 +9149,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ l + + fl.oz. m. + ac ft @@ -8922,6 +9161,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp.gal {0}/Imp.gal + + fl.oz. + Im.fl.oz {0} Im.fl.oz @@ -8955,11 +9197,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp.qt {0} Imp.qt + + {0}sr + {0}sr + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + calIT + {0}calIT + {0}calIT + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0}T + {0}T + + + {0}Wb + {0}Wb + + + c + {0} c + {0} c + - Nächte {0}Nacht {0}Nächte - {0}/Nacht NOSW diff --git a/make/data/cldr/common/main/de_AT.xml b/make/data/cldr/common/main/de_AT.xml index 2c5005d9184..f3006e8c4a5 100644 --- a/make/data/cldr/common/main/de_AT.xml +++ b/make/data/cldr/common/main/de_AT.xml @@ -111,6 +111,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + + + ¤ #,##0.00 diff --git a/make/data/cldr/common/main/de_CH.xml b/make/data/cldr/common/main/de_CH.xml index d8c3c358004..08863f8192a 100644 --- a/make/data/cldr/common/main/de_CH.xml +++ b/make/data/cldr/common/main/de_CH.xml @@ -41,9 +41,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mass-System + Buddhistisch + Chinesisch + Koptisch + Äthiopisch + Äthiopisch Amäta Aläm + Gregorianisch + Hebräisch + Japanisch + Persisch Grossbuchstaben zuerst aufführen Ohne Gross-/Kleinschreibung sortieren Nach Gross-/Kleinschreibung sortieren + Lexikografisch + Unicode (Standard) + Phonetisch + Strichfolge + Traditionell britisches Mass-System US Mass-System @@ -73,7 +87,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + M/y G dd.MM.y GGGGG + E, MM.dd.Y G @@ -137,7 +153,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic . - + ' @@ -150,6 +166,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + + + 0 + 0 + ¤ 0 Mio'.' + ¤ 0 Mio'.' + ¤ 00 Mio'.' + ¤ 00 Mio'.' + ¤ 000 Mio'.' + ¤ 000 Mio'.' + ¤ 0 Mrd'.' + ¤ 0 Mrd'.' + ¤ 00 Mrd'.' + ¤ 00 Mrd'.' + ¤ 000 Mrd'.' + ¤ 000 Mrd'.' + ¤ 0 Bio'.' + ¤ 0 Bio'.' + ¤ 00 Bio'.' + ¤ 00 Bio'.' + ¤ 000 Bio'.' + ¤ 000 Bio'.' @@ -173,6 +219,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic São-toméischer Dobra (2018) São-toméischer Dobra (2018) + + Karibischer Gulden + Karibischer Gulden + @@ -184,6 +234,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Quadratfuss {0} Quadratfuss + + Punkte + {0} Punkt + {0} Punkte + + + {0} Mol + {0} Mol + {0} Mol + {0} Mole + {0} Molen + {0} Mole + + + Glucose + {0} Glucose + {0} Glucose + Quartal @@ -194,6 +262,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Fuss {0} pro Fuss + + Quecksilbersäule + {0} Quecksilbersäule + {0} Quecksilbersäule + {0} Beaufort {0} Beaufort @@ -209,18 +282,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Kubikfuss {0} Kubikfuss + + {0} Steradiant + {0} Steradianten + + + Coulombs + {0} Coulomb + {0} Coulombs + + + Kalorie [IT] + {0} Kalorie [IT] + {0} Kalorien [IT] + + + Kilogrammkraft + {0} Kilogrammkraft + {0} Kilogrammkraft + + + Punkt + {0} Punkt + {0} Punkte + + + {0} Glc + {0} Glc + Quartal Fuss + + {0} Hg + {0} Hg + {0} Bft {0} Bft + + {0} m. fl. oz. + {0} m. fl. oz. + Dram {0} dr. @@ -235,6 +344,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Prise {0} Prise + + {0} kat + {0} kat + + + kcal [IT] + {0} kcal [IT] + {0} kcal [IT] + + + {0} Bq + {0} Bq + + + + + Punkt + {0} Punkt + {0} Punkte + + + {0} m. fl. oz. + {0} m. fl. oz. + + + {0} kat + {0} kat + + + kcal [IT] + {0} kcal [IT] + {0} kcal [IT] + diff --git a/make/data/cldr/common/main/de_LI.xml b/make/data/cldr/common/main/de_LI.xml index 718cb336a1a..a26e00d8e02 100644 --- a/make/data/cldr/common/main/de_LI.xml +++ b/make/data/cldr/common/main/de_LI.xml @@ -31,7 +31,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic . - + ' @@ -44,6 +44,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + + + ¤ #,##0.00 diff --git a/make/data/cldr/common/main/de_LU.xml b/make/data/cldr/common/main/de_LU.xml index 4ec6b9f5bcb..d80e409bd12 100644 --- a/make/data/cldr/common/main/de_LU.xml +++ b/make/data/cldr/common/main/de_LU.xml @@ -22,11 +22,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - h a - - diff --git a/make/data/cldr/common/main/doi.xml b/make/data/cldr/common/main/doi.xml index b6c9dc75dfb..5f163f3a3b9 100644 --- a/make/data/cldr/common/main/doi.xml +++ b/make/data/cldr/common/main/doi.xml @@ -975,7 +975,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic मिलीमोल फी लीटर - + हिस्से फी दस लक्ख @@ -1499,7 +1499,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic मिलीमोल/लीटर - + हिस्से/दस लक्ख @@ -1942,7 +1942,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic मिलीमोल/ली - + हिफीदल diff --git a/make/data/cldr/common/main/dsb.xml b/make/data/cldr/common/main/dsb.xml index 486cd558ea6..53a8781b067 100644 --- a/make/data/cldr/common/main/dsb.xml +++ b/make/data/cldr/common/main/dsb.xml @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic aymaršćina azerbajdžanšćina baškiršćina + balučišćina balinezišćina basaa běłorušćina @@ -229,6 +230,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafia kelnšćina kurdišćina + kurdišćina + kurmandźišćina kumykšćina komišćina kornišćina @@ -621,6 +624,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic China Kolumbiska Clippertonowa kupa + Sark Kosta Rika Kuba Kap Verde @@ -848,42 +852,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic format płaśidła sortěrowański slěd pjenjeze + pśedstajenje emojija góźinowy cyklus (12 vs 24) system łamanja smužkow + łamanje smužki w słowje system měrow licby + pśetergnjenje sady pó skrotconce buddhistiski kalender + buddhistiski chinski kalender + chinski koptiski kalendaŕ + koptiski dangi kalender + dangiski etiopiski kalender + etiopiski etiopiski amete-alem-kalendaŕ + etiopiski Amete-Alem gregoriański kalender + gregorjaniski žydojski kalender + hebrejski islamski kalender + hijri islamski ciwilny kalendaŕ + islamski ciwilny islamski umalqui-kalendaŕ + islamski Umm al-Qura iso-8601-kalender japański kalender + japański persiski kalender + persiski kalender republiki China + minguo knigływjeźeński format płaśidła + knigływjeźenje standardny format płaśidła + standard sortěrowański slěd pó Unicoźe + standardne unicode-rědowanje powšykne pytanje + pytaj standardny sortěrowański slěd + standardne + default + emoji + tekst 12-góźinowy cyklus (0-11) + 12 (0–11) 12-góźinowy cyklus (1-12) + 12 (1–12) 24-góźinowy cyklus (0-23) + 24 (0–23) 24-góźinowy cyklus (1-24) + 24 (1–24) lichy stil łamanja smužkow + wólny běžny stil łamanja smužkow + normalny kšuty stil łamanja smužkow + kšuty + łam wšykno + zdźarž wšykno + normalne + w sadach metriski system + metriski britiski system měrow + britiski amerikański system měrow + ameriski arabisko-indiske cyfry rozšyrjone arabisko-indiske cyfry armeńske cyfry @@ -924,6 +967,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic thaiske cyfry tibetske cyfry vaiske cyfry + + jo metriski @@ -941,6 +986,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic [áàăâåäãąā æ ç ďđ éèĕêëėęē ğ íìĭîïİī ı ĺľ ňñ òŏôöőøō œ ř ş ß ť úùŭûůüűū ýÿ ż] [A B C Č Ć D E F G H {Ch} I J K Ł L M N O P Q R S Š Ś T U V W X Y Z Ž Ź] [\- ‐‑ – — , ; \: ! ? . … '‘’‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + [\- ‐‑ , . * / † ⚭] @@ -1003,21 +1049,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h 'hodź'. B + 'zeg'. h B + E 'zeg'. h B E, d. + E 'zeg'. h a E h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M/y G d.M.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMM y G - h 'hodź'. a - HH 'hodź'. + 'zeg'. h a + 'zeg'. HH h:mm a h:mm:ss a + 'zeg'. h a v + 'zeg'. HH v d.M. E, d.M. d. MMM @@ -1365,6 +1417,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'zeger' {0} + + {1} 'zeger' {0} + @@ -1373,6 +1428,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'zeger' {0} + + {1} 'zeger' {0} + @@ -1385,14 +1443,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic + 'zeg'. h B d. + E, 'zeg'. h B E, d. E, h:mm a E, 'zeg'. H:mm E, h:mm:ss a E, HH:mm:ss y G + M/y G d.M.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMM y G @@ -1404,6 +1466,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic H:mm:ss H:mm:ss v H:mm v + 'zeg'. h a v + 'zeg'. H v d.M. E, d.M. d. MMM @@ -2414,9 +2478,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Biškek - - Enderbury - Komory @@ -2568,9 +2629,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Pódwjacornoafriski cas - Pódwjacornoafriski standardny cas - Pódwjacornoafriski lěśojski cas + Pódwjacornoafriski cas @@ -2935,6 +2994,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyański cas + + + Hawaiisko-aleutski standardny cas + + Hawaiisko-aleutski cas @@ -3524,6 +3588,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + casy + @@ -3535,6 +3602,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4876,6 +4947,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic pódzajtšnokaribiske dolary pódzajtšnokaribiskich dolarow + + karibiski šesnak + karibiski šesnak + karibiskej šesnaka + karibiske šesnaki + karibiskich šesnakow + CFA-frank (BCEAO) CFA-frank (BCEAO) @@ -4918,6 +4996,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic sambiske kwachy sambiskich kwachow + + simbabwiske złoto + simbabwiske złoto + simbabwiskej złośe + simbabwiske złota + simbabwiskich złotow + ≈{0} @@ -5199,7 +5284,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kuski {0} kuskow - + + źěle + {0} źěl + {0} źěla + {0} źěle + {0} źělow + + milionśiny {0} milionśina {0} milionśinje @@ -5234,6 +5326,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mole {0} molow + + glukoze + {0} glukoze + {0} glukoze + {0} glukoze + {0} glukoze + litry na kilometer {0} liter na kilometer @@ -5948,6 +6047,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimetry słupika žywego slobra {0} milimetrow słupika žywego slobra + + žywoslobrowego słupika + {0} žywoslobrowego słupika + {0} žywoslobrowego słupika + {0} žywoslobrowego słupika + {0} žywoslobrowego słupika + punty na kwadratny col {0} punt na kwadratny col @@ -6195,6 +6301,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metriske taski {0} metriskich taskow + + metriske žydke unce + {0} žydka unca + {0} žydkej uncy + {0} žydke unce + {0} metriskich žydkich uncow + aker-crjeje {0} aker-crjej @@ -6316,6 +6429,97 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} britiske běrtyle {0} britiskich běrtylow + + steradiany + {0} steradian + {0} steradiana + {0} steradiany + {0} steradianow + + + katale + {0} katal + {0} katala + {0} katale + {0} katalow + + + coulomby + {0} coulomb + {0} coulomba + {0} coulomby + {0} coulombow + + + farady + {0} farad + {0} farada + {0} farady + {0} faradow + + + henryje + {0} henry + {0} henryja + {0} henryje + {0} henryjow + + + siemensy + {0} siemens + {0} siemensa + {0} siemense + {0} siemensow + + + kalorije [IT] + {0} kalorija [IT] + {0} kaloriji [IT] + {0} kalorije [IT] + {0} kalorijow [IT] + + + bequerele + {0} bequerel + {0} bequerela + {0} bequerele + {0} bequerelow + + + sieverty + {0} sievert + {0} sieverta + {0} sieverty + {0} sievertow + + + grayje + {0} gray + {0} grayja + {0} grayje + {0} grayjow + + + kilogramy-force + {0} kilogram-force + {0} kilograma-force + {0} kilogramy-force + {0} kilogramow-force + + + tesle + {0} tesla + {0} tesla + {0} tesla + {0} tesla + + + webery + {0} weber + {0} webera + {0} webery + {0} weberow + spěšnosć swětła {0} spěšnosć swětła @@ -6323,7 +6527,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} spěšnosći swětła {0} spěšnosćow swětła - + miliardnina {0} miliardnina {0} miliardninje @@ -6412,6 +6616,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kuse {0} kusow + + źěl + {0} źěl + {0} źěl + {0} źěl + {0} źěl + {0} % {0} % @@ -6430,6 +6641,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ‱ {0} ‱ + + Glc + {0} Glc + {0} Glc + {0} Glc + {0} Glc + l/km {0} l/km @@ -6597,6 +6815,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} PS {0} PS + + {0} Hg + {0} Hg + {0} Hg + {0} Hg + mph {0} mph @@ -6665,6 +6889,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic mc + + m. fl oz + {0} m. fl oz + {0} m. fl oz + {0} m. fl oz + {0} m. fl oz + gal {0} gal @@ -6754,6 +6985,86 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} šćipki {0} šćipkow + + steradian + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + {0} kat + + + {0} C + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + spěšnosć sw. {0} spěšnosć sw. @@ -6761,7 +7072,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} spěšnosći sw. {0} spěšnosćow sw. - + nano {0} nano {0} nano @@ -6853,7 +7164,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} c {0} c - + n {0} n {0} n diff --git a/make/data/cldr/common/main/dua.xml b/make/data/cldr/common/main/dua.xml index 547640b7b05..8a48674d70b 100644 --- a/make/data/cldr/common/main/dua.xml +++ b/make/data/cldr/common/main/dua.xml @@ -311,6 +311,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/dv.xml b/make/data/cldr/common/main/dv.xml index 77f725c086e..c474c98c4cf 100644 --- a/make/data/cldr/common/main/dv.xml +++ b/make/data/cldr/common/main/dv.xml @@ -134,6 +134,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 + #,##,##0.00 diff --git a/make/data/cldr/common/main/dyo.xml b/make/data/cldr/common/main/dyo.xml index baa17a6108f..9b42bafd14a 100644 --- a/make/data/cldr/common/main/dyo.xml +++ b/make/data/cldr/common/main/dyo.xml @@ -421,6 +421,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/dz.xml b/make/data/cldr/common/main/dz.xml index 85f7fb24bfe..eb96ad0f81a 100644 --- a/make/data/cldr/common/main/dz.xml +++ b/make/data/cldr/common/main/dz.xml @@ -592,7 +592,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd @@ -1582,9 +1582,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ནུབ་ཕྱོགས་ཨཕ་རི་ཀཱ་ཆུ་ཚོད - ནུབ་ཕྱོགས་ཨཕ་རི་ཀཱ་ཚད་ལྡན་ཆུ་ཚོད - ནུབ་ཕྱོགས་ཨཕ་རི་ཀཱ་བྱཱར་དུས་ཆུ་ཚོད + ནུབ་ཕྱོགས་ཨཕ་རི་ཀཱ་ཆུ་ཚོད @@ -1859,6 +1857,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic གུ་ཡ་ན་ཆུ་ཚོད + + + ཧ་ཝའི་-ཨེ་ལིའུ་ཤེན་ཚད་ལྡན་ཆུ་ཚོད + + ཧ་ཝའི་-ཨེ་ལིའུ་ཤེན་ཆུ་ཚོད diff --git a/make/data/cldr/common/main/ee.xml b/make/data/cldr/common/main/ee.xml index cbfdedbb836..f79d4ba617b 100644 --- a/make/data/cldr/common/main/ee.xml +++ b/make/data/cldr/common/main/ee.xml @@ -730,10 +730,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic japantɔwo ƒe kalenda persiatɔwo ƒe kalenda china repɔbliktɔwo ƒe kalenda tso 1912 - blema chinatɔwo ƒe ɖoɖomɔ nu nuɖoɖo ɖe nyagɔmeɖegbalẽ ƒe ɖoɖomɔ nu nuɖoɖo ɖe unicode ƒe ɖoɖo nu - chinagbe yeye ƒe ɖoɖomɔ nu fonegbalẽ me ɖoɖomɔ nu pinyin ɖoɖomɔ nu nudidi hena zazã gbadza @@ -1904,9 +1902,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ireland nutome gaƒoƒo me - - Enderbury - Macau @@ -1963,14 +1958,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic - West Africa game - West Africa nutome gaƒoƒo me - West Africa dzomeŋɔli gaƒoƒo me + West Africa game - WAT WAT - WAST @@ -2316,7 +2307,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Greenwich gaƒoƒo me + Greenwich gaƒoƒo @@ -2343,6 +2334,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyana gaƒoƒo me + + + Hawaii-Aleutia nutome gaƒoƒo me + + Hawaii-Aleutia gaƒoƒo me @@ -2778,6 +2774,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Chuuk gaƒoƒo me + + + Tɛrki gaƒoƒome + Tɛrki gaƒoƒoɖoanyime + Tɛrki dzomeŋɔli gaƒoƒome + + Turkmenistan gaƒoƒo me diff --git a/make/data/cldr/common/main/el.xml b/make/data/cldr/common/main/el.xml index b4843307d3a..f20ad945fe6 100644 --- a/make/data/cldr/common/main/el.xml +++ b/make/data/cldr/common/main/el.xml @@ -292,6 +292,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Μπάφια Κολωνικά Κουρδικά + Κουρδικά + Κουρμάντζι Κουμγιούκ Κουτενάι Κόμι @@ -370,6 +372,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Έρζια Μαζαντεράνι Ναούρου + Μιν Ναν Ναπολιτανικά Νάμα Νορβηγικά Μποκμάλ @@ -824,6 +827,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Κίνα Κολομβία Νήσος Κλίπερτον + Σαρκ Κόστα Ρίκα Κούβα Πράσινο Ακρωτήριο @@ -1101,35 +1105,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Αριθμητική ταξινόμηση Ισχύς ταξινόμησης Νόμισμα + Παρουσίαση emoji Κύκλος ωρών (12 ή 24) Στιλ αλλαγής γραμμών + Αλλαγή γραμμής ανάμεσα σε λέξεις Σύστημα μέτρησης Αριθμοί + Τέλος πρότασης μετά από σύντμηση Ζώνη ώρας Παραλλαγή τοπικών ρυθμίσεων Ιδιωτική χρήση Βουδιστικό ημερολόγιο + Βουδιστικό Κινεζικό ημερολόγιο + Κινεζικό Κοπτικό ημερολόγιο + Κοπτικό Κορεατικό ημερολόγιο ντάνγκι + Ντάνγκι Αιθιοπικό ημερολόγιο + Αιθιοπικό Αιθιοπικό ημερολόγιο Άμετ Άλεμ + Αιθιοπικό Άμετ Άλεμ Γρηγοριανό ημερολόγιο + Γρηγοριανό Εβραϊκό ημερολόγιο + Εβραϊκό Ινδικό εθνικό ημερολόγιο Ημερολόγιο Εγίρας + Εγίρα Ημερολόγιο Εγίρας (σε μορφή πίνακα, αστικό εποχής) + Εγίρα (σε μορφή πίνακα, αστικό εποχής) Ισλαμικό ημερολόγιο (Σαουδική Αραβία, θέαση) Ισλαμικό ημερολόγιο (δομημένο, αστρονομική εποχή) Ημερολόγιο Εγίρας (Umm al-Qura) + Εγίρα (Umm al-Qura) Ημερολόγιο ISO-8601 Ιαπωνικό ημερολόγιο + Ιαπωνικό Περσικό ημερολόγιο + Περσικό Ημερολόγιο της Δημοκρατίας της Κίνας + Δημοκρατίας της Κίνας Λογιστική μορφή νομίσματος + Λογιστική Τυπική μορφή νομίσματος + Τυπική Ταξινόμηση συμβόλων Ταξινόμηση με αγνόηση συμβόλων Κανονικά ταξινόμηση τόνων @@ -1139,22 +1162,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ταξινόμηση κεφαλαίων χαρακτήρων πρώτα Ταξινόμηση με διάκριση χαρακτήρων Ταξινόμηση χαρακτήρων διάκρισης - Σειρά ταξινόμησης Παραδοσιακών Κινεζικών - Big5 Προηγούμενη σειρά ταξινόμησης, για συμβατότητα + Συμβατότητα Σειρά ταξινόμησης λεξικού + Λεξικό Προεπιλεγμένη σειρά ταξινόμησης Unicode + Προεπιλεγμένη σειρά Unicode Ευρωπαϊκοί κανόνες ταξινόμησης - Σειρά ταξινόμησης Απλοποιημένων Κινεζικών - GB2312 Σειρά ταξινόμησης τηλεφωνικού καταλόγου + Τηλεφωνικός κατάλογος Φωνητική σειρά ταξινόμησης + Φωνητική Σειρά ταξινόμησης Πινγίν + Πινγίν Αναζήτηση γενικού τύπου + Αναζήτηση Αναζήτηση κατά αρχικό σύμφωνο Χανγκούλ Τυπική σειρά ταξινόμησης + Τυπική Σειρά ταξινόμησης κινήσεων + Κίνηση Παραδοσιακή σειρά ταξινόμησης + Παραδοσιακή Σειρά ταξινόμησης ριζικής αρίθμησης + Ριζική αρίθμηση Σειρά ταξινόμησης Τζουγίν + Τζουγίν Ταξινόμηση χωρίς κανονικοποίηση Κανονικοποιημένη ταξινόμηση Unicode Μεμονωμένη ταξινόμηση ψηφίων @@ -1167,18 +1200,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Πλήρους πλάτους Μισού πλάτους Αριθμητικό + Προεπιλογή + Emoji + Κείμενο 12ωρο σύστημα (0–11) + 12 (0–11) 12ωρο σύστημα (1–12) + 12 (1–12) 24ωρο σύστημα (0–23) + 24 (0–23) 24ωρο σύστημα (1–24) + 24 (1–24) Χαλαρό στιλ αλλαγής γραμμών + Χαλαρό Κανονικό στιλ αλλαγής γραμμών + Κανονικό Στενό στιλ αλλαγής γραμμών + Στενό + Διαχωρισμός όλων + Διατήρηση όλων + Κανονικό + Διατήρηση σε φράσεις Μεταγραφή BGN ΗΠΑ Μεταγραφή GEGN ΟΗΕ Μετρικό σύστημα + Μετρικό Αγγλοσαξονικό σύστημα μέτρησης + Αγγλοσαξονικό Αμερικανικό σύστημα μέτρησης + Αμερικανικό Αραβικο-ινδικά ψηφία Εκτεταμένα αραβικο-ινδικά ψηφία Αρμενικά αριθμητικά @@ -1223,6 +1273,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Θιβετανικά ψηφία Παραδοσιακά αριθμητικά Ψηφία Βάι + Απενεργοποίηση + Ενεργοποίηση Μετρικό @@ -1250,9 +1302,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1353,13 +1402,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM-y G d/M/y GGGGG + E, dd-MM-y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a + h a (vvvv) + HH'h' (vvvv) d/M E, d/M d MMM @@ -1425,7 +1477,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1439,7 +1490,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1766,14 +1816,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm:ss a y G d/M/y GGGGG + E, dd-MM-y G LLL y G d MMM y G E d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v + HH:mm:ss (vvvv) h:mm a v + HH:mm (vvvv) + HH'h' (vvvv) d/M E d/M MMM @@ -1844,7 +1897,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1858,7 +1910,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -2937,6 +2988,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Νήσος Πάσχα + + Κοϊάικε + Πούντα Αρένας @@ -3202,9 +3256,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Πνομ Πενχ - Έντερμπερι - - Καντών @@ -3849,6 +3900,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Χαράρε + + + Ώρα Άκρε + Χειμερινή ώρα Άκρε + Θερινή ώρα Άκρε + + Ώρα Αφγανιστάν @@ -3871,9 +3929,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ώρα Δυτικής Αφρικής - Χειμερινή ώρα Δυτικής Αφρικής - Θερινή ώρα Δυτικής Αφρικής + Ώρα Δυτικής Αφρικής @@ -4250,6 +4306,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ώρα Γουιάνας + + + Χειμερινή ώρα Χαβάης-Αλεούτιων Νήσων + + Ώρα Χαβάης-Αλεούτιων Νήσων @@ -4688,6 +4749,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ώρα Τσουκ + + + Ώρα Τουρκίας + Χειμερινή ώρα Τουρκίας + Θερινή ώρα Τουρκίας + + Ώρα Τουρκμενιστάν @@ -4764,9 +4832,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ώρα Αικατερίνμπουργκ - Χειμερινή ώρα Αικατερίνμπουργκ - Θερινή ώρα Αικατερίνμπουργκ + Ώρα Αικατερινούπολης + Χειμερινή ώρα Αικατερινούπολης + Θερινή ώρα Αικατερινούπολης @@ -4847,7 +4915,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -6194,6 +6265,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ δολάριο Ανατολικής Καραϊβικής δολάρια Ανατολικής Καραϊβικής + + γκίλντα Καραϊβικής + γκίλντα Καραϊβικής + γκίλντες Καραϊβικής + Ειδικά Δικαιώματα Ανάληψης ειδικό δικαίωμα ανάληψης @@ -6297,6 +6373,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ δολάριο Ζιμπάμπουε δολάρια Ζιμπάμπουε + + Χρυσός της Ζιμπάμπουε + Χρυσός της Ζιμπάμπουε + Χρυσός της Ζιμπάμπουε + Δολάριο Ζιμπάμπουε (2009) @@ -6635,7 +6716,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} στοιχεία {0} στοιχείων - + + μέρη + {0} μέρος + {0} μέρη + + neuter μέρη ανά εκατομμύριο {0} μέρος ανά εκατομμύριο @@ -6675,6 +6761,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter + + γλυκόζης + {0} γλυκόζης + {0} γλυκόζης + neuter λίτρα ανά χιλιόμετρο @@ -7334,8 +7425,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} καντέλα {0} καντέλα {0} καντέλας - {0} καντέλα - {0} καντέλα + {0} καντέλες + {0} καντέλες {0} καντέλων @@ -7516,6 +7607,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} χιλιοστόμετρα στήλης υδραργύρου {0} χιλιοστόμετρων στήλης υδραργύρου + + χιλιοστόμετρο στήλης υδραργύρου + {0} στήλης υδραργύρου + {0} στήλης υδραργύρου + λίβρες ανά τετραγωνική ίντσα {0} λίβρα ανά τετραγωνική ίντσα @@ -7809,6 +7905,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} μετρικά κύπελλα {0} μετρικών κύπελλων + + μετρική ουγγιά υγρών + {0} μετρική ουγγιά υγρών + {0} μετρικές ουγγιές υγρών + ακρ-πόδια {0} ακρ-πόδι @@ -7905,9 +8006,73 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} αγγλοσαξονικό τέταρτο του γαλονιού {0} αγγλοσαξονικά τέταρτα του γαλονιού + + στερακτίνια + {0} στερακτίνιο + {0} στερακτίνια + + + κατάλ + {0} κατάλ + {0} κατάλ + + + κουλόμπ + {0} κουλόμπ + {0} κουλόμπ + + + φαράντ + {0} φαράντ + {0} φαράντ + + + ανρί + {0} ανρί + {0} ανρί + + + ζίμενς + {0} ζίμενς + {0} ζίμενς + + + θερμίδες ΙΤ + {0} θερμίδα IT + {0} θερμίδες IT + + + μπεκερέλ + {0} μπεκερέλ + {0} μπεκερέλ + + + sievert + {0} sievert + {0} sievert + + + γκρέυ + {0} γκρέυ + {0} γκρέυ + + + χιλιόγραμμα δύναμης + {0} χιλιόγραμμο δύναμης + {0} χιλιόγραμμα δύναμης + + + τέσλα + {0} τέσλα + {0} τέσλα + + + βέμπερ + {0} βέμπερ + {0} βέμπερ + neuter - φως {0} φως {0} φως φωτός @@ -7915,7 +8080,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} φως {0} φωτός - + neuter μέρη στο δισεκατομμύριο {0} μέρος στο δισεκατομμύριο @@ -8136,7 +8301,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} στοιχείο {0} στοιχεία - + + μέρος + {0} μέρος + {0} μέρη + + μέρη/εκατ. @@ -8153,6 +8323,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} μολ {0} μολ + + Glc + λίτρα/χλμ. {0} λίτρο/χλμ. @@ -8567,6 +8740,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} μετρ. κύπελλο {0} μετρ. κύπελλα + + μ. ουγγιά υγρ. + μ. ουγγιά υγρ. + {0} μ. ουγγιές υγρ. + ακρ πόδια {0} ακρ πδ @@ -8664,12 +8842,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} αγγλ. τέτ. γαλ. {0} αγγλ. τέτ. γαλ. + + {0} kat + {0} kat + + + cal-IT + φως {0} φως {0} φως - + μέρη/δισεκατομμύριο @@ -8801,7 +8986,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ τ. ίντσες - + + μέρος + {0} μέρος + {0} μέρη + + ppm @@ -8813,6 +9003,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + λ/χλμ {0} λ/χλμ @@ -9054,6 +9247,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} μ. κύπ. {0} μ. κύπ. + + μ. ουγγιά υγρ. + {0} μ. ουγγιά υγρ. + {0} μ. ουγγιές υγρ. + ακρ πδ @@ -9074,16 +9272,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ δρ. όγκου + + {0} kat + {0} kat + + + cal-IT + φώς - {0} φως - {0} φως - - νύχτ. - {0} νύχτ. - {0} νύχτ. - {0}/νύχτ. + + ppb σημεία diff --git a/make/data/cldr/common/main/en.xml b/make/data/cldr/common/main/en.xml index ae1e61a78df..31114de0f39 100644 --- a/make/data/cldr/common/main/en.xml +++ b/make/data/cldr/common/main/en.xml @@ -100,6 +100,7 @@ annotations. Tibetan Bishnupriya Bakhtiari + Luri Bakhtiari Breton Braj Brahui @@ -132,6 +133,8 @@ annotations. Cheyenne Chickasaw Central Kurdish + Kurdish + Central Kurdish, Central Kurdish, Sorani Chilcotin @@ -312,6 +315,7 @@ annotations. Tyap Makonde Kabuverdianu + Qʼeqchiʼ Kenyang Koro Kongo @@ -346,6 +350,8 @@ annotations. Bafia Colognian Kurdish + Kurdish + Kurmanji Kumyk Kutenai Komi @@ -474,6 +480,7 @@ annotations. Oji-Cree Western Ojibwa Okanagan + Colville Salish Oromo Odia Ossetic @@ -493,6 +500,7 @@ annotations. Palatine German Phoenician Pali + Pāli Pijin Polish Piedmontese @@ -544,6 +552,8 @@ annotations. Sindhi Sassarese Sardinian Southern Kurdish + Kurdish + Southern Northern Sami Sami, Northern Seneca @@ -615,7 +625,7 @@ annotations. Tigre Tiv Turkmen - Tokelau + Tokelauan Tsakhur Tagalog Klingon @@ -721,6 +731,7 @@ annotations. + @@ -869,6 +880,7 @@ annotations. + @@ -889,6 +901,7 @@ annotations. + @@ -899,6 +912,7 @@ annotations. + @@ -1284,7 +1298,7 @@ annotations. Oseacco/Osojane dialect Oxford English Dictionary spelling Pamaka dialect - Pinyin Romanization + Pinyin romanization Polytonic Computer Revised Orthography @@ -1300,7 +1314,7 @@ annotations. Unified Revised Orthography Unifon phonetic alphabet Valencian - Wade-Giles Romanization + Wade-Giles romanization Calendar @@ -1317,15 +1331,15 @@ annotations. Currency Transform Destination Dictionary Break Exclusions - Emoji Presentation Style + Emoji Presentation First day of week Mixed-in Hour Cycle (12 vs 24) Input Method Keyboard Highest Ignored - Line Break Style - Line Breaks In Words Setting + CJK Line Break + Line Breaks within Words Transform Rules Measurement System Measurement Unit @@ -1333,7 +1347,7 @@ annotations. Region For Supplemental Data Transform Source Region Subdivision - Sentence Break Suppressions Type + Sentence Break After Abbr. Transform Machine Translated Time Zone @@ -1343,25 +1357,47 @@ annotations. Buddhist Calendar + Buddhist Chinese Calendar + Chinese Coptic Calendar + Coptic Dangi Calendar + Dangi Ethiopic Calendar + Ethiopic Ethiopic Amete Alem Calendar + Ethiopic Amete Alem Gregorian Calendar + Gregorian Hebrew Calendar + Hebrew Indian National Calendar + Indian National Hijri Calendar + Hijri Hijri Calendar (tabular, civil epoch) + Hijri (tabular, civil epoch) Hijri Calendar (Saudi Arabia, sighting) + + Hijri, Saudi Arabia sighting Hijri Calendar (tabular, astronomical epoch) + Hijri (tabular, astronomical epoch) Hijri Calendar (Umm al-Qura) - ISO-8601 Calendar + Hijri (Umm al-Qura) + Gregorian Calendar (ISO 8601 Weeks) + ISO 8601 Weeks + Gregorian Japanese Calendar + Japanese Persian Calendar + Persian Minguo Calendar + Minguo Accounting Currency Format + Accounting Standard Currency Format + Standard Sort Symbols Sort Ignoring Symbols Sort Accents Normally @@ -1371,23 +1407,36 @@ annotations. Sort Uppercase First Sort Case Insensitive Sort Case Sensitive - Traditional Chinese Sort Order - Big5 Previous Sort Order, for compatibility + Compatibility Dictionary Sort Order + Dictionary Default Unicode Sort Order + Default Unicode Emoji Sort Order + Emoji European Ordering Rules - Simplified Chinese Sort Order - GB2312 + European rules Phonebook Sort Order + Phonebook Phonetic Sort Order + Phonetic Pinyin Sort Order + Pinyin General-Purpose Search + Search Search By Hangul Initial Consonant + Korean initial consonant Standard Sort Order + Standard Stroke Sort Order + Stroke Traditional Sort Order + Traditional Radical-Stroke Sort Order + Radical-Stroke Zhuyin Sort Order + Zhuyin Sort Without Normalization Sort Unicode Normalized Sort Digits Individually @@ -1425,21 +1474,28 @@ annotations. To Titlecase To Uppercase To Zawgyi Myanmar Encoding - Use Default Presentation For Emoji Characters - Prefer Emoji Presentation For Emoji Characters - Prefer Text Presentation For Emoji Characters - First Day of Week Is Friday - First Day of Week Is Monday - First Day of Week Is Saturday - First Day of Week Is Sunday - First Day of Week Is Thursday - First Day of Week Is Tuesday - First Day of Week Is Wednesday + Default Presentation For Emoji + Default + Emoji Presentation For Emoji + Emoji + Text Presentation For Emoji + Text + First day of week: Friday + First day of week: Monday + First day of week: Saturday + First day of week: Sunday + First day of week: Thursday + First day of week: Tuesday + First day of week: Wednesday Hybrid 12 Hour System (0–11) + 12 (0–11) 12 Hour System (1–12) + 12 (1–12) 24 Hour System (0–23) + 24 (0–23) 24 Hour System (1–24) + 24 (1–24) Handwriting Input Method Pinyin Input Method Unspecified Input Method @@ -1474,16 +1530,42 @@ annotations. Vietnamese VIQR Keyboard Windows Keyboard Ignore Symbols affects spaces, punctuation, all symbols + + Shift Spaces, punctuation, all symbols Ignore Symbols affects spaces and punctuation only + Shift spaces, punctuation Ignore Symbols affects spaces only + Shift spaces, punctuation Ignore Symbols affects spaces, punctuation, non-currency symbols + Shift spaces, punctuation, non-currency symbols Loose Line Break Style + Loose Normal Line Break Style + Normal Strict Line Break Style + Strict Allow Line Breaks In All Words + Break all Prevent Line Breaks In All Words + Keep all Normal Line Breaks For Words + Normal Prevent Line Breaks In Phrases + Keep in phrases Encylopedia Aethiopica Transliteration US ALA-LOC Transliteration Beta Maṣāḥǝft Transliteration @@ -1517,8 +1599,11 @@ annotations. Hex transform using XML syntax Hex transform using XML decimal syntax Metric System + Metric Imperial Measurement System + UK US Measurement System + US Celsius Fahrenheit Kelvin @@ -1527,8 +1612,10 @@ annotations. Arabic-Indic Digits Extended Arabic-Indic Digits X Arabic-Indic Digits + Extended Arabic-Indic Armenian Numerals Armenian Lowercase Numerals + Armenian lowercase Balinese Digits Bangla Digits Bhaiksuki Digits @@ -1540,29 +1627,38 @@ annotations. Dives Akuru Digits Ethiopic Numerals Financial Numerals + Financial Full-Width Digits + Full-width Garay Digits Georgian Numerals Gunjala Gondi digits Masaram Gondi digits Greek Numerals Greek Lowercase Numerals + Greek lowercase Gujarati Digits Gurung Khema Digits Gurmukhi Digits Chinese Calendar Day-of-Month Numerals + Han-character day-of-month numbering for traditional calendars Chinese Decimal Numerals + Positional decimal system using Chinese number ideographs as digits Simplified Chinese Numerals Simplified Chinese Financial Numerals + Simplified Chinese financial Traditional Chinese Numerals Traditional Chinese Financial Numerals + Traditional Chinese financial Hebrew Numerals Pahawh Hmong Digits Nyiakeng Puachue Hmong Digits Javanese Digits Japanese Numerals Japanese Financial Numerals + Japanese financial Japanese Calendar Gannen Year Numerals + Japanese first-year Gannen numbering Kayah Li Digits Kawi Digits Khmer Digits @@ -1570,15 +1666,21 @@ annotations. Kirat Rai Digits Tai Tham Hora Digits Tai Tham Tham Digits + Tai Tham Tham (ecclesiastical) Lao Digits Western Digits Lepcha Digits Limbu Digits Mathematical Bold Digits + Mathematical bold Mathematical Double-Struck Digits + Mathematical double-struck Mathematical Monospace Digits + Mathematical monospace Mathematical Sans-Serif Bold Digits + Mathematical sans-serif bold Mathematical Sans-Serif Digits + Mathematical sans-serif Malayalam Digits Modi Digits Mongolian Digits @@ -1586,11 +1688,16 @@ annotations. Meetei Mayek Digits Myanmar Digits Myanmar Eastern Pwo Karen Digits + Myanmar Eastern Pwo Karen Myanmar Pao Digits + Myanmar Pao Myanmar Shan Digits + Myanmar Shan Myanmar Tai Laing Digits + Myanmar Tai Laing Nag Mundari Digits Native Digits + Native digits Newa Digits N’Ko Digits Ol Chiki Digits @@ -1598,11 +1705,15 @@ annotations. Odia Digits Osmanya Digits Outlined Digits + Outlined Hanifi Rohingya digits Roman Numerals + Roman uppercase Roman Lowercase Numerals + Roman lowercase Saurashtra Digits Segmented Digits + Segmented Sharada Digits Khudawadi Digits Sinhala Lith Digits @@ -1613,12 +1724,15 @@ annotations. New Tai Lue Digits Traditional Tamil Numerals Tamil Digits + Modern Tamil Telugu Digits Thai Digits Tibetan Digits Tirhuta Digits Tangsa Digits + Tolong Siki Digits Traditional Numerals + Traditional numerals Vai Digits Warang Citi Digits Wancho Digits @@ -1630,9 +1744,12 @@ annotations. From Publishing Punctuation To ASCII From Zawgyi Myanmar Encoding Sentence Breaks Without Abbreviation Handling + Off Suppress Sentence Breaks After Standard Abbreviations + On Unspecified Machine Translation POSIX Compliant Locale + POSIX variant Metric @@ -1671,8 +1788,9 @@ annotations. [a b c d e f g h i j k l m n o p q r s t u v w x y z] [áàăâåäãā æ ç éèĕêëē íìĭîïī ñ óòŏôöøō œ úùŭûüū ÿ] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] - [\- ‑ , . % ‰ + 0 1 2 3 4 5 6 7 8 9] + [\- ‑ , . % ‰ + − 0 1 2 3 4 5 6 7 8 9] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [\- ‐‑ , . /] @@ -1820,6 +1938,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -1828,6 +1949,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -1845,9 +1969,12 @@ annotations. h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d E + E h a + E h a E h:mm a E h:mm a E HH:mm @@ -1870,6 +1997,9 @@ annotations. h:mm:ss a h:mm:ss a HH:mm:ss + h a v + h a v + HH'h' v L M/d E, M/d @@ -2002,6 +2132,16 @@ annotations. + + + + Anno Martyrum + + + AM + + + @@ -2024,7 +2164,7 @@ annotations. - M/d/y GGGGG + M/d/y G GGGGGyMd @@ -2037,6 +2177,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -2045,6 +2188,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -2053,6 +2199,9 @@ annotations. {1}, {0} + + {1}, {0} + @@ -2061,6 +2210,9 @@ annotations. {1}, {0} + + {1}, {0} + h B @@ -2068,9 +2220,12 @@ annotations. h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d E + E h a + E h a E h:mm a E h:mm a E HH:mm @@ -2078,7 +2233,9 @@ annotations. E h:mm:ss a E HH:mm:ss y G - M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -2091,6 +2248,9 @@ annotations. h:mm:ss a h:mm:ss a HH:mm:ss + h a v + h a v + HH'h' v L M/d E, M/d @@ -2101,9 +2261,9 @@ annotations. mm:ss y G y G - M/y GGGGG - M/d/y GGGGG - E, M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -2143,21 +2303,21 @@ annotations. y – y G - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y G – M/y G + M/y – M/y G + M/y – M/y G - M/d/y – M/d/y GGGGG - M/d/y GGGGG – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + M/d/y – M/d/y G + M/d/y G – M/d/y G + M/d/y – M/d/y G + M/d/y – M/d/y G - E, M/d/y – E, M/d/y GGGGG - E, M/d/y GGGGG – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG + E, M/d/y – E, M/d/y G + E, M/d/y G – E, M/d/y G + E, M/d/y – E, M/d/y G + E, M/d/y – E, M/d/y G MMM y G – MMM y G @@ -2234,18 +2394,18 @@ annotations. y – y G - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y – M/y G + M/y – M/y G - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + M/d/y – M/d/y G + M/d/y – M/d/y G + M/d/y – M/d/y G - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG + E, M/d/y – E, M/d/y G + E, M/d/y – E, M/d/y G + E, M/d/y – E, M/d/y G MMM – MMM y G @@ -2631,6 +2791,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -2639,6 +2802,9 @@ annotations. {1} 'at' {0} + + {1} 'at' {0} + @@ -2647,6 +2813,9 @@ annotations. {1}, {0} + + {1}, {0} + @@ -2655,6 +2824,9 @@ annotations. {1}, {0} + + {1}, {0} + h B @@ -2662,9 +2834,12 @@ annotations. h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d E + E h a + E h a E h:mm a E h:mm a E HH:mm @@ -2672,7 +2847,9 @@ annotations. E h:mm:ss a E HH:mm:ss y G + M/y G M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -2691,6 +2868,9 @@ annotations. h:mm a v h:mm a v HH:mm v + h a v + h a v + HH'h' v L M/d E, M/d @@ -3157,8 +3337,13 @@ annotations. + + Anno Hegirae + Before Hijrah + AH + BH @@ -3179,7 +3364,7 @@ annotations. - M/d/y GGGGG + M/d/y G @@ -3189,7 +3374,9 @@ annotations. ccc d E y G - M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -3202,9 +3389,9 @@ annotations. MMMM d y G y G - M/y GGGGG - M/d/y GGGGG - E, M/d/y GGGGG + M/y G + M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -3241,6 +3428,89 @@ annotations. + + + + {1} 'at' {0} + + + {1} 'at' {0} + + + {1} 'at' {0} + + + + + {1} 'at' {0} + + + {1} 'at' {0} + + + {1} 'at' {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + d + ccc + d E + EEEE d + y G + M/y GGGGG + M/d/y GGGGG + E, M/d/y GGGGG + MMM y G + MMM d, y G + E, MMM d, y G + EEEE, MMM d, y G + L + M/d + E, M/d + EEEE, M/d + LLL + MMM d + E, MMM d + EEEE, MMM d + MMMM d + y G + y G + M/y GGGGG + M/d/y GGGGG + E, M/d/y GGGGG + EEEE, MMMM d, y G + MM y GGGGG + MMM y G + MMM d, y G + E, MMM d, y G + EEEE, MMMM d, y G + MMMM y G + QQQ y G + QQQQ y G + + @@ -3911,20 +4181,40 @@ annotations. {0} Daylight Time {0} Standard Time {1} ({0}) - - - HST - HST - HDT - - Coordinated Universal Time - Unknown City + Unknown Location + + + Rothera Station + + + Palmer Land + + + Troll Station + + + Showa Station + + + Mawson Station + + + Vostok Station + + + Casey Station + + + Dumont d’Urville Station + + + McMurdo Station Macquarie Island @@ -3941,6 +4231,15 @@ annotations. Christmas Island + + Galápagos Islands + + + Canaries + + + Faroes + British Summer Time @@ -3951,12 +4250,48 @@ annotations. Irish Standard Time + + Chagos Archipelago + + + Canton Island + + + Comoros + + + Aktau + Kostanay + + Kyzylorda + + + Kwajalein Atoll + + + Mexico City + Norfolk Island + + Chatham Islands + + + Marquesas Islands + + + Pitcairn Islands + + + Kerguelen Islands + + + Midway Atoll + Wake Island @@ -3992,9 +4327,7 @@ annotations. - West Africa Time - West Africa Standard Time - West Africa Summer Time + West Africa Time @@ -4422,6 +4755,14 @@ annotations. Guyana Time + + + Hawaii-Aleutian Standard Time + + + HST + + Hawaii-Aleutian Time @@ -4443,9 +4784,9 @@ annotations. - Hovd Time - Hovd Standard Time - Hovd Summer Time + Khovd Time + Khovd Standard Time + Khovd Summer Time @@ -4777,9 +5118,9 @@ annotations. - Qyzylorda Time - Qyzylorda Standard Time - Qyzylorda Summer Time + Kyzylorda Time + Kyzylorda Standard Time + Kyzylorda Summer Time @@ -4877,6 +5218,13 @@ annotations. Chuuk Time + + + Türkiye Time + Türkiye Standard Time + Türkiye Summer Time + + Turkmenistan Time @@ -5042,6 +5390,12 @@ annotations. + + {0}⁄{1} + {0} {1} + {0}⁠{1} + sometimes + @@ -5866,9 +6220,9 @@ annotations. KES - Kyrgystani Som - Kyrgystani som - Kyrgystani soms + Kyrgyz Som + Kyrgyz som + Kyrgyz soms KGS @@ -6823,12 +7177,12 @@ annotations. {0}+ - {0} day - {0} days - Take the {0}rd right. - Take the {0}st right. - Take the {0}th right. - Take the {0}nd right. + {0} day + {0} days + Take the {0}rd right. + Take the {0}st right. + Take the {0}th right. + Take the {0}nd right. @@ -7055,7 +7409,12 @@ annotations. {0} item {0} items - + + parts + {0} part + {0} parts + + parts per million {0} part per million {0} parts per million @@ -7080,6 +7439,11 @@ annotations. {0} mole {0} moles + + of glucose + {0} of glucose + {0} of glucose + liters per kilometer {0} liter per kilometer @@ -7617,6 +7981,11 @@ annotations. {0} millimeter of mercury {0} millimeters of mercury + + of mercury + {0} of mercury + {0} of mercury + pounds-force per square inch {0} pound-force per square inch @@ -7795,6 +8164,11 @@ annotations. {0} metric cup {0} metric cups + + metric fluid ounces + {0} metric fluid ounce + {0} metric fluid ounces + acre-feet {0} acre-foot @@ -7827,11 +8201,21 @@ annotations. {0} pint {0} pints + + pints Imperial + {0} pint Imperial + {0} pints Imperial + cups {0} cup {0} cups + + cups Imperial + {0} cup Imperial + {0} cups Imperial + fluid ounces {0} fluid ounce @@ -7892,17 +8276,202 @@ annotations. {0} Imp. quart {0} Imp. quarts + + steradians + {0} steradian + {0} steradians + + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calories [IT] + {0} calorie [IT] + {0} calories [IT] + + + British thermal units [IT] + {0} British thermal unit [IT] + {0} British thermal units [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + kilograms-force + {0} kilogram-force + {0} kilograms-force + + + rods + {0} rod + {0} rods + + + chains + {0} chain + {0} chains + + + teslas + {0} tesla + {0} teslas + + + webers + {0} weber + {0} webers + + + rankines + {0} rankine + {0} rankines + + + fortnights + {0} fortnight + {0} fortnights + + + slugs + {0} slug + {0} slugs + of gasoline equivalent {0} of gasoline equivalent {0} of gasoline equivalent + + rin [JP] + {0} rin [JP] + {0} rin [JP] + + + sun [JP] + {0} sun [JP] + {0} sun [JP] + + + shaku [JP] + {0} shaku [JP] + {0} shaku [JP] + + + shaku [cloth, JP] + {0} shaku [cloth, JP] + {0} shaku [cloth, JP] + + + ken [JP] + {0} ken [JP] + {0} ken [JP] + + + jo [JP] + {0} jo [JP] + {0} jo [JP] + + + ri [JP] + {0} ri [JP] + {0} ri [JP] + + + bu [JP] + {0} bu [JP] + {0} bu [JP] + + + se [JP] + {0} se [JP] + {0} se [JP] + + + cho [JP] + {0} cho [JP] + {0} cho [JP] + + + kosaji [JP] + {0} kosaji [JP] + {0} kosaji [JP] + + + osaji [JP] + {0} osaji [JP] + {0} osaji [JP] + + + cup [JP] + {0} cup [JP] + {0} cup [JP] + + + shaku [volume, JP] + {0} shaku [volume, JP] + {0} shaku [volume, JP] + + + sai [JP] + {0} sai [JP] + {0} sai [JP] + + + to [JP] + {0} to [JP] + {0} to [JP] + + + koku [JP] + {0} koku [JP] + {0} koku [JP] + light {0} light {0} light - + + fun [JP] + {0} fun [JP] + {0} fun [JP] + + parts per billion {0} part per billion {0} parts per billion @@ -8144,7 +8713,12 @@ annotations. {0} item {0} items - + + part + {0} part + {0} part + + parts/million {0} ppm {0} ppm @@ -8169,6 +8743,11 @@ annotations. {0} mol {0} mol + + Glc + {0} Glc + {0} Glc + liters/km {0} L/km @@ -8706,6 +9285,11 @@ annotations. {0} mmHg {0} mmHg + + of Hg + {0} of Hg + {0} of Hg + psi {0} psi @@ -8884,6 +9468,11 @@ annotations. {0} mc {0} mc + + fl oz m. + {0} fl oz m. + {0} fl oz m. + acre ft {0} ac ft @@ -8915,11 +9504,21 @@ annotations. {0} pt {0} pt + + pt Imp. + {0} pt Imp. + {0} pt Imp. + cups {0} c {0} c + + cup Imp + {0} cup Imp. + {0} cup Imp. + fl oz {0} fl oz @@ -8980,17 +9579,202 @@ annotations. {0} qt-Imp. {0} qt-Imp. + + sr + {0} sr + {0} sr + + + kat + {0} kat + {0} kat + + + C + {0} C + {0} C + + + F + {0} F + {0} F + + + H + {0} H + {0} H + + + S + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + BTU-IT + {0} BTU-IT + {0} BT-IT + + + Bq + {0} Bq + {0} Bq + + + Sv + {0} Sv + {0} Sv + + + Gy + {0} Gy + {0} Gy + + + kgf + {0} kgf + {0} kgf + + + rd + {0} rd + {0} rd + + + ch + {0} ch + {0} ch + + + T + {0} T + {0} T + + + Wb + {0} Wb + {0} Wb + + + °R + {0} °R + {0} °R + + + fw + {0} fw + {0} fw + + + slug + {0} slug + {0} slug + gas-equiv {0} gas-equiv {0} gas-equiv + + rin [JP] + {0} rin [JP] + {0} rin [JP] + + + sun [JP] + {0} sun [JP] + {0} sun [JP] + + + shaku [JP] + {0} shaku [JP] + {0} shaku [JP] + + + shaku [cloth, JP] + {0} shaku [cloth, JP] + {0} shaku [cloth, JP] + + + ken [JP] + {0} ken [JP] + {0} ken [JP] + + + jo [JP] + {0} jo [JP] + {0} jo [JP] + + + ri [JP] + {0} ri [JP] + {0} ri [JP] + + + bu [JP] + {0} bu [JP] + {0} bu [JP] + + + se [JP] + {0} se [JP] + {0} se [JP] + + + cho [JP] + {0} cho [JP] + {0} cho [JP] + + + kosaji [JP] + {0} kosaji [JP] + {0} kosaji [JP] + + + osaji [JP] + {0} osaji [JP] + {0} osaji [JP] + + + cup [JP] + {0} cup [JP] + {0} cup [JP] + + + shaku [vol, JP] + {0} shaku [vol, JP] + {0} shaku [vol, JP] + + + sai [JP] + {0} sai [JP] + {0} sai [JP] + + + to [JP] + {0} to [JP] + {0} to [JP] + + + koku [JP] + {0} koku [JP] + {0} koku [JP] + light {0} light {0} light - + + fun [JP] + {0} fun [JP] + {0} fun [JP] + + parts/billion {0} ppb {0} ppb @@ -9230,7 +10014,12 @@ annotations. {0}item {0}items - + + part + {0} part + {0} part + + ppm {0}ppm {0}ppm @@ -9255,6 +10044,11 @@ annotations. {0}mol {0}mol + + Glc + {0} Glc + {0} Glc + L/km {0}L/km @@ -9792,6 +10586,11 @@ annotations. {0}mmHg {0}mmHg + + of Hg + {0} of Hg + {0} of Hg + psi {0}psi @@ -9970,6 +10769,11 @@ annotations. {0}mc {0}mc + + fl oz m. + {0} fl oz m. + {0} fl oz m. + acre ft {0}ac ft @@ -9988,8 +10792,8 @@ annotations. Imp gal - {0}galIm - {0}galIm + {0}gal-Im + {0}gal-Im {0}/galIm @@ -10002,11 +10806,21 @@ annotations. {0}pt {0}pt + + pt Imp. + {0} pt Imp. + {0} pt Imp. + cup {0}c {0}c + + cup Imp + {0} cup Imp. + {0} cup Imp. + fl oz {0}fl oz @@ -10067,17 +10881,202 @@ annotations. {0}qt-Imp. {0}qt-Imp. + + sr + {0} sr + {0} sr + + + kat + {0} kat + {0} kat + + + C + {0} C + {0} C + + + F + {0} F + {0} F + + + H + {0} H + {0} H + + + S + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + BTU-IT + {0} BTU-IT + {0} BT-IT + + + Bq + {0} Bq + {0} Bq + + + Sv + {0} Sv + {0} Sv + + + Gy + {0} Gy + {0} Gy + + + kgf + {0} kgf + {0} kgf + + + rd + {0} rd + {0} rd + + + ch + {0} ch + {0} ch + + + T + {0} T + {0} T + + + Wb + {0} Wb + {0} Wb + + + °R + {0} °R + {0} °R + + + fw + {0} fw + {0} fw + + + slug + {0} slug + {0} slug + gas-equiv {0}gas-equiv {0}gas-equiv + + rin [JP] + {0} rin [JP] + {0} rin [JP] + + + sun [JP] + {0} sun [JP] + {0} sun [JP] + + + shaku [JP] + {0} shaku [JP] + {0} shaku [JP] + + + shaku [cloth, JP] + {0} shaku [cloth, JP] + {0} shaku [cloth, JP] + + + ken [JP] + {0} ken [JP] + {0} ken [JP] + + + jo [JP] + {0} jo [JP] + {0} jo [JP] + + + ri [JP] + {0} ri [JP] + {0} ri [JP] + + + bu [JP] + {0} bu [JP] + {0} bu [JP] + + + se [JP] + {0} se [JP] + {0} se [JP] + + + cho [JP] + {0} cho [JP] + {0} cho [JP] + + + kosaji [JP] + {0} kosaji [JP] + {0} kosaji [JP] + + + osaji [JP] + {0} osaji [JP] + {0} osaji [JP] + + + cup [JP] + {0} cup [JP] + {0} cup [JP] + + + shaku [vol, JP] + {0} shaku [vol, JP] + {0} shaku [vol, JP] + + + sai [JP] + {0} sai [JP] + {0} sai [JP] + + + to [JP] + {0} to [JP] + {0} to [JP] + + + koku [JP] + {0} koku [JP] + {0} koku [JP] + light {0}light {0}light - + + fun [JP] + {0} fun [JP] + {0} fun [JP] + + ppb {0}ppb {0}ppb diff --git a/make/data/cldr/common/main/en_001.xml b/make/data/cldr/common/main/en_001.xml index b538c4a2de7..1449bda6c0e 100644 --- a/make/data/cldr/common/main/en_001.xml +++ b/make/data/cldr/common/main/en_001.xml @@ -164,6 +164,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d dd/MM/y GGGGG + E, dd/MM/y G d MMM y G E, d MMM y G LL @@ -323,7 +324,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d - d/M/y G + dd/MM/y G + E, dd/MM/y G d MMM y G E, d MMM y G dd/MM @@ -460,14 +462,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E d dd/MM/y GGGGG + E, dd/MM/y G d MMM y G E, d MMM y G + LL dd/MM E dd/MM d MMM E d MMM d MMMM + MM/y GGGGG dd/MM/y GGGGG E, dd/MM/y GGGGG d MMM y G @@ -475,6 +481,128 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + + EEEE, d MMMM y G + + + + + d MMMM y G + + + + + d MMM y G + + + + + dd/MM/y GGGGG + GGGGGyMMdd + + + + + + E d + dd/MM/y GGGGG + d MMM y G + E, d MMM y G + LL + dd/MM + E, dd/MM + d MMM + E, d MMM + d MMMM + MM/y GGGGG + dd/MM/y GGGGG + E, dd/MM/y GGGGG + d MMM y G + E, d MMM y G + + + + d–d + + + y–y G + + + dd/MM/y – dd/MM/y GGGGG + dd/MM/y GGGGG – dd/MM/y GGGGG + dd/MM/y – dd/MM/y GGGGG + dd/MM/y – dd/MM/y GGGGG + + + E, dd/MM/y – E, dd/MM/y GGGGG + E, dd/MM/y GGGGG – E, dd/MM/y GGGGG + E, dd/MM/y – E, dd/MM/y GGGGG + E, dd/MM/y – E, dd/MM/y GGGGG + + + d–d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E, d MMM – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G + + + M–M + + + dd/MM – dd/MM + dd/MM – dd/MM + + + E dd/MM – E dd/MM + E dd/MM – E dd/MM + + + d–d MMM + d MMM – d MMM + + + E d – E d MMM + E d MMM – E d MMM + + + y–y G + + + MM/y – MM/y GGGGG + MM/y – MM/y GGGGG + + + dd/MM/y – dd/MM/y GGGGG + dd/MM/y – dd/MM/y GGGGG + dd/MM/y – dd/MM/y GGGGG + + + E, dd/MM/y – E, dd/MM/y GGGGG + E, dd/MM/y – E, dd/MM/y GGGGG + E, dd/MM/y – E, dd/MM/y GGGGG + + + d–d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E, d – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G + + + + @@ -778,28 +906,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - ∅∅∅ - ∅∅∅ - ∅∅∅ - - St Barthélemy St John’s - - Enderbury - St Kitts - - Aktau - St Lucia @@ -854,6 +969,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ∅∅∅ + + + ∅∅∅ + + ∅∅∅ diff --git a/make/data/cldr/common/main/en_150.xml b/make/data/cldr/common/main/en_150.xml index 412dd61dbb2..d895be5ea9c 100644 --- a/make/data/cldr/common/main/en_150.xml +++ b/make/data/cldr/common/main/en_150.xml @@ -71,9 +71,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 diff --git a/make/data/cldr/common/main/en_AE.xml b/make/data/cldr/common/main/en_AE.xml index 87a19fe34dd..c6dedc7e9dd 100644 --- a/make/data/cldr/common/main/en_AE.xml +++ b/make/data/cldr/common/main/en_AE.xml @@ -286,13 +286,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - ∅∅∅ - ∅∅∅ - ∅∅∅ - - ∅∅∅ @@ -340,6 +333,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ GST + + + ∅∅∅ + + ∅∅∅ diff --git a/make/data/cldr/common/main/en_AT.xml b/make/data/cldr/common/main/en_AT.xml index de4ddc030d3..b5e5c78b5e7 100644 --- a/make/data/cldr/common/main/en_AT.xml +++ b/make/data/cldr/common/main/en_AT.xml @@ -28,9 +28,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 diff --git a/make/data/cldr/common/main/en_AU.xml b/make/data/cldr/common/main/en_AU.xml index 923e42942d0..1336f9887bd 100644 --- a/make/data/cldr/common/main/en_AU.xml +++ b/make/data/cldr/common/main/en_AU.xml @@ -24,11 +24,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic World - St. Barthélemy - St. Kitts & Nevis - St. Lucia - St. Martin - St. Vincent & Grenadines + Antigua and Barbuda + Bosnia and Herzegovina + Ceuta and Melilla + South Georgia and South Sandwich Islands + Heard Island and McDonald Islands + St Kitts and Nevis + St Pierre and Miquelon + Svalbard and Jan Mayen + São Tomé and Príncipe + Turks and Caicos Islands + Trinidad and Tobago + St Vincent and the Grenadines + Wallis and Futuna Upper case / Lower case Ordering @@ -43,50 +51,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - - EEEE d MMMM y G - - - - - d MMMM y G - - - - - d MMM y G - - - - - dd/MM/y GGGGG - - - - - - {1}, {0} - - - - - {1}, {0} - - - - - {1}, {0} - - - - - {1}, {0} - - + E, d/M/y G EEEE d MMM y G EEEE d MMM EEEE d MMMM @@ -154,22 +121,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dec - - - Jan - Feb - Mar - Apr - May - June - July - Aug - Sept - Oct - Nov - Dec - - @@ -335,10 +286,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E d - LL E, d MMM - MM/y GGGGG @@ -466,6 +414,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + Wallis and Futuna + ACT @@ -501,6 +452,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic China Summer Time + + + French Southern and Antarctic Time + + Japan Time @@ -765,13 +721,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic arcmin. - {0} arcmin. - {0} arcmin. - - - arcsec. - {0} arcsec. - {0} arcsec. mg/dL @@ -794,16 +743,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} L/100 km {0} L/100 km - - miles/gal. US - {0} m.p.g. US - {0} m.p.g. US - - - miles/gal. - {0} m.p.g. - {0} m.p.g. - C {0} C @@ -826,16 +765,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} CM {0} CM - - mm Hg - {0} mm Hg - {0} mm Hg - - - in Hg - - mb {0} mb {0} mb diff --git a/make/data/cldr/common/main/en_CA.xml b/make/data/cldr/common/main/en_CA.xml index 924ad541521..0334e1eb826 100644 --- a/make/data/cldr/common/main/en_CA.xml +++ b/make/data/cldr/common/main/en_CA.xml @@ -164,7 +164,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d/M U-MM-dd d/M/U - d/M/r r-MM r-MM-dd d/M/r @@ -229,7 +228,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - M/d/y GGGGG + M/d/y G d/M/y GGGGG @@ -1030,7 +1029,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {0} Daylight Saving Time Saint-Barthélemy @@ -1043,9 +1041,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saint Lucia - - Rangoon - Saint Helena @@ -1055,197 +1050,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saint Thomas - - - AFT - - - - - Alaska Time - Alaska Standard Time - Alaska Daylight Saving Time - - - - - Central Time - Central Standard Time - Central Daylight Saving Time - - - - - Eastern Time - Eastern Standard Time - Eastern Daylight Saving Time - - - - - ART - - - - - ACWT - ACWST - ACWDT - - - - - AET - AEST - AEDT - - - - - AWST - AWDT - - - - - BST - - - - - BTT - - - - - BRT - BRST - - - - - BNT - - - - - CHAST - CHADT - - - - - CXT - - - - - CCT - - - - - COST - - - - - TLT - - - - - EAST - EASST - - - - - ECT - - - - - FKT - FKST - - French Southern and Antarctic Time - - - GALT - - - - - EGT - - - - - Gulf Time - - - - - GYT - - - - - IST - - - - - ICT - - - - - WITA - - - - - WIT - - - - - WIB - - - - - Iran Time - Iran Standard Time - Iran Daylight Saving Time - - - IRST - IRDT - - - - - MYT - - - - - MVT - - - - - NPT - - NT @@ -1253,32 +1062,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic NDT - - - FNT - - - - - PKT - - - - - PYT - PYST - - - - - PET - - Saint-Pierre-et-Miquelon Time Saint-Pierre-et-Miquelon Standard Time - Saint-Pierre-et-Miquelon Daylight Saving Time + Saint-Pierre-et-Miquelon Daylight Time PMT @@ -1286,24 +1074,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic PMDT - - - American Samoa Time - American Samoa Standard Time - Samoan Time - - - - - UYT - UYST - - - - - VET - - Wallis and Futuna Time @@ -1371,6 +1141,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic US$ + + Cg + unknown currency diff --git a/make/data/cldr/common/main/en_CH.xml b/make/data/cldr/common/main/en_CH.xml index 089854b073e..8a7cf48cef1 100644 --- a/make/data/cldr/common/main/en_CH.xml +++ b/make/data/cldr/common/main/en_CH.xml @@ -110,16 +110,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + ' · ¤ #,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 ¤ #,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 diff --git a/make/data/cldr/common/main/en_EE.xml b/make/data/cldr/common/main/en_EE.xml new file mode 100644 index 00000000000..08b7cc850d1 --- /dev/null +++ b/make/data/cldr/common/main/en_EE.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + , +   + + + diff --git a/make/data/cldr/common/main/en_GB.xml b/make/data/cldr/common/main/en_GB.xml index 2954f553cf4..73df8a91701 100644 --- a/make/data/cldr/common/main/en_GB.xml +++ b/make/data/cldr/common/main/en_GB.xml @@ -15,12 +15,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fulah + + + + + Line Breaks Within Words + + + Armenian Lowercase + Full-Width + Greek Lowercase + Simplified Chinese Financial + Traditional Chinese Financial + Japanese Financial + Native Digits + Roman Uppercase + Roman Lowercase + + E, d/M/y G EEEE, d MMM y G E dd/MM E d MMM @@ -126,7 +144,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - dd/MM/y G + E, d/M/y G EEEE, d MMM y G E dd/MM E d MMM @@ -136,15 +154,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic EEEE, d MMMM y + + d – d + EEEE d MMM – EEEE d MMM y G EEEE d MMM y G – EEEE d MMM y G EEEE d MMM – EEEE d MMM y G EEEE d MMM y – EEEE d MMM y G + + M – M + + + d – d MMM + E d MMM – E d MMM + + y – y + + + d – d MMM y + E, d MMM – E, d MMM y @@ -164,12 +197,69 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E d + E, d/M/y G + + + + + + + + EEEE, d MMMM y G + + + + + d MMMM y G + + + + + d MMM y G + + + + + d/M/y GGGGG + + + + + + + {1} 'at' {0} + + + + + {1} 'at' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + d/M/y GGGGG + E, d/M/y GGGGG EEEE, d MMM y G - LL - MM/y GGGGG - EEEE, d MMM y G - EEEE, d MMMM y G + L + d/M + E, d/M + EEEE, d/M + EEEE, d MMM + EEEE, d MMMM + M/y GGGGG + d/M/y GGGGG + E, d/M/y GGGGG + EEEE, d MMMM y G + EEEE, d MMMM y G @@ -180,15 +270,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic BST - - Bahia Banderas - - - Merida - - - Cancun - CET @@ -217,6 +298,92 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + 0k + 0k + 00k + 00k + 000k + 000k + 0m + 0m + 00m + 00m + 000m + 000m + 0bn + 0bn + 00bn + 00bn + 000bn + 000bn + 0tn + 0tn + 00tn + 00tn + 000tn + 000tn + + + + + + + ¤0k + ¤ 0k + ¤0k + ¤ 0k + ¤00k + ¤ 00k + ¤00k + ¤ 00k + ¤000k + ¤ 000k + ¤000k + ¤ 000k + ¤0m + ¤ 0m + ¤0m + ¤ 0m + ¤00m + ¤ 00m + ¤00m + ¤ 00m + ¤000m + ¤ 000m + ¤000m + ¤ 000m + ¤0bn + ¤ 0bn + ¤0bn + ¤ 0bn + ¤00bn + ¤ 00bn + ¤00bn + ¤ 00bn + ¤000bn + ¤ 000bn + ¤000bn + ¤ 000bn + ¤0tn + ¤ 0tn + ¤0tn + ¤ 0tn + ¤00tn + ¤ 00tn + ¤00tn + ¤ 00tn + ¤000tn + ¤ 000tn + ¤000tn + ¤ 000tn + + + + {0} diff --git a/make/data/cldr/common/main/en_GE.xml b/make/data/cldr/common/main/en_GE.xml new file mode 100644 index 00000000000..9c38932c636 --- /dev/null +++ b/make/data/cldr/common/main/en_GE.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + , + + + + + + + + + diff --git a/make/data/cldr/common/main/en_IN.xml b/make/data/cldr/common/main/en_IN.xml index d40501175db..38729d7acf8 100644 --- a/make/data/cldr/common/main/en_IN.xml +++ b/make/data/cldr/common/main/en_IN.xml @@ -12,13 +12,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Bengali - - - - - Bengali Digits Oriya Digits @@ -299,7 +292,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E d MMM, y G d MMM, y G E, d MMM, y G @@ -321,24 +313,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Kyzylorda - - - Khovd - GST - - - Khovd Time - Khovd Standard Time - Khovd Summer Time - - IST @@ -353,6 +332,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##,##0.### + + + 0 thousand + 0 thousand + 00 thousand + 00 thousand + 0 lakh + 0 lakh + 00 lakh + 00 lakh + 0 crore + 0 crore + 00 crore + 00 crore + 000 crore + 000 crore + 0000 crore + 0000 crore + 00000 crore + 00000 crore + 0 lakh crore + 0 lakh crore + 00 lakh crore + 00 lakh crore + 000 lakh crore + 000 lakh crore + + 0K @@ -393,8 +400,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##,##0.00 - ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 @@ -443,10 +450,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + Netherlands Antillean Guilder + Netherlands Antillean Guilders + Kyrgyzstani Som - Kyrgyzstani som - Kyrgyzstani soms + Kyrgyzstani Som + Kyrgyzstani Soms Kazakhstani Tenge @@ -477,9 +488,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Venezuelan bolívars - VEF - VEF - VEF + Venezuelan Bolívar + Venezuelan Bolívars + + + Caribbean Guilder + Caribbean Guilder + Caribbean Guilders + + + Zimbabwean Gold + Zimbabwean Gold diff --git a/make/data/cldr/common/main/en_JP.xml b/make/data/cldr/common/main/en_JP.xml new file mode 100644 index 00000000000..32e77fdbaf3 --- /dev/null +++ b/make/data/cldr/common/main/en_JP.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + EEEE, MMMM d, y G + + + + + MMMM d, y G + + + + + MMM d, y G + + + + + GGGGG y/MM/dd + + + + + + E H:mm + E H:mm:ss + G y + GGGGG y/MM/dd + H + H:mm + H:mm:ss + MM/dd + E, MM/dd + G y + G y + GGGGG y/MM + GGGGG y/MM/dd + GGGGG y/MM/dd, E + + + + G y – G y + G y – y + + + GGGGG y/MM – GGGGG y/MM + GGGGG y/MM – y/MM + GGGGG y/MM – y/MM + + + GGGGG y/MM/dd – y/MM/dd + GGGGG y/MM/dd – GGGGG y/MM/dd + GGGGG y/MM/dd – y/MM/dd + GGGGG y/MM/dd – y/MM/dd + + + GGGGG y/MM/dd, E – E, y/MM/dd, E + GGGGG y/MM/dd, E – GGGGG y/MM/dd, E + GGGGG y/MM/dd, E – y/MM/dd, E + GGGGG y/MM/dd, E – E, y/MM/dd, E + + + H – H + + + H:mm – H:mm + H:mm – H:mm + + + H:mm – H:mm v + H:mm – H:mm v + + + H – H v + + + MM/dd – MM/dd + MM/dd – MM/dd + + + E, MM/dd – E, MM/dd + E, MM/dd – E, MM/dd + + + GGGGG y/MM – y/MM + GGGGG y/MM – yMM + + + GGGGG y/MM/dd – y/MM/dd + GGGGG y/MM/dd – y/MM/dd + GGGGG y/MM/dd – y/MM/dd + + + GGGGG y/MM/dd, E – y/MM/dd, E + GGGGG y/MM/dd, E – y/MM/dd, E + GGGGG y/MM/dd, E – y/MM/dd, E + + + + + + + + + EEEE, MMMM d, y + + + + + MMMM d, y + + + + + MMM d, y + + + + + y/MM/dd + yMd + + + + + + + H:mm:ss zzzz + Hmmsszzzz + + + + + H:mm:ss z + Hmmssz + + + + + H:mm:ss + Hmmss + + + + + H:mm + Hmm + + + + + + y/MM/dd G + H + H:mm + H:mm:ss + H:mm:ss v + H:mm v + MM/y + y/MM/dd + E, y/MM/dd + + + + MM/y G – MM/y G + MM/y – MM/y G + MM/y – MM/y G + + + y/MM/dd – y/MM/dd G + y/MM/dd G – y/MM/dd G + y/MM/dd – y/MM/dd G + y/MM/dd – y/MM/dd G + + + E, y/MM/dd – E, y/MM/dd G + E, y/MM/dd G – E, y/MM/dd G + E, y/MM/dd – E, y/MM/dd G + E, y/MM/dd – E, y/MM/dd G + + + MM/y – MM/y + MM/y – MM/y + + + y/MM/dd – y/MM/dd + y/MM/dd – y/MM/dd + y/MM/dd – y/MM/dd + + + E, y/MM/dd – E, y/MM/dd + E, y/MM/dd – E, y/MM/dd + E, y/MM/dd – E, y/MM/dd + + + + + + + + + G y MMMM d, EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + GGGGG y/MM/dd + + + + + + G y + G y MMM d + G y MMM d, E + G y MMMM d, EEEE + G y + GGGGG y/MM + GGGGG y/MM/dd + GGGGG y/MM/dd EEEE + GGGGG y MMMM d, EEEE + GGGGG y MM + G y MMM + G y MMM d + G y MMM d, E + G y MMMM + G y QQQ + G y QQQQ + + + {0} – {1} + + h B – h B + h – h B + + + h:mm B – h:mm B + h:mm – h:mm B + h:mm – h:mm B + + + d – d + + + G y – G y + G y – y + + + G y/MM – G y/MM + G y/MM – y/MM + G y/MM – y/MM + + + G y/MM/dd – y/MM/dd + G y/MM/dd – G y/MM/dd + G y/MM/dd – y/MM/dd + G y/MM/dd – y/MM/dd + + + G y/MM/dd – y/MM/dd, E + G y/MM/dd – G y/MM/dd, E + G y/MM/dd, E – y/MM/dd, E + G y/MM/dd, E – y/MM/dd, E + + + G y MMM – G y MMM + G y MMM – MMM + G y MMM – y MMM + + + G y MMM d – d + G y MMM d – G y MMM d + G y MMM d – MMM d + G y MMM d – y MMM + + + G y MMM d, E – MMM d, E + G y MMM d, E – G y MMM d, E + G y MMM d, E – MMM d, E + G y MMM d, E – y MMM d, E + + + h a – h a + h – h a + + + HH – HH + + + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + H:mm – H:mm + H:mm – H:mm + + + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + H:mm – H:mm v + H:mm – H:mm v + + + h a – h a v + h – h a v + + + H – H v + + + M – M + + + M/d – M/d + M/d – M/d + + + MM/dd, E – MM/dd, E + M/dd, E – MM/dd, E + + + MMM – MMM + + + MMM d – d + MMM d – MMM d + + + E, MMM d – E, MMM d + E, MMM d – E, MMM d + + + y – y + + + y/MM – y/MM + y/MM – y/MM + + + y/MM/dd – y/MM/dd + y/MM/dd – y/MM/dd + y/MM/dd – y/MM/dd + + + y/MM/dd, E – y/MM/dd, E + y/MM/dd, E – y/MM/dd, E + y/MM/dd, E – y/MM/dd, E + + + y MMM – MMM + y MMM – y MMM + + + y MMM d – d + y MMM d – MMM d + y MMM d – y MMM d + + + y MMM d, E – E, MMM d, E + y MMM d, E – MMM d, E + y MMM d, E – y MMM d, E + + + y MMMM – MMMM + y MMMM – y MMMM + + + + + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + ∅∅∅ + + + + + ∅∅∅ + ∅∅∅ + ∅∅∅ + + + + + diff --git a/make/data/cldr/common/main/en_LT.xml b/make/data/cldr/common/main/en_LT.xml new file mode 100644 index 00000000000..c5c880fcc95 --- /dev/null +++ b/make/data/cldr/common/main/en_LT.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + , +   + + + diff --git a/make/data/cldr/common/main/en_LV.xml b/make/data/cldr/common/main/en_LV.xml new file mode 100644 index 00000000000..0dede606c74 --- /dev/null +++ b/make/data/cldr/common/main/en_LV.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + , +   + + + diff --git a/make/data/cldr/common/main/en_MH.xml b/make/data/cldr/common/main/en_MH.xml index 7f42c1cf96c..f48bd0b31be 100644 --- a/make/data/cldr/common/main/en_MH.xml +++ b/make/data/cldr/common/main/en_MH.xml @@ -13,13 +13,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - ∅∅∅ - ∅∅∅ - ∅∅∅ - - ∅∅∅ @@ -62,6 +55,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ∅∅∅ + + + ∅∅∅ + + ∅∅∅ diff --git a/make/data/cldr/common/main/en_MP.xml b/make/data/cldr/common/main/en_MP.xml index 43d42252bdd..285ca25a84c 100644 --- a/make/data/cldr/common/main/en_MP.xml +++ b/make/data/cldr/common/main/en_MP.xml @@ -13,13 +13,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - ∅∅∅ - ∅∅∅ - ∅∅∅ - - ∅∅∅ @@ -62,6 +55,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ∅∅∅ + + + ∅∅∅ + + ∅∅∅ diff --git a/make/data/cldr/common/main/en_MV.xml b/make/data/cldr/common/main/en_MV.xml index d6ebe136b06..b851e8ee2b0 100644 --- a/make/data/cldr/common/main/en_MV.xml +++ b/make/data/cldr/common/main/en_MV.xml @@ -97,6 +97,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 #,##0.00 diff --git a/make/data/cldr/common/main/en_NL.xml b/make/data/cldr/common/main/en_NL.xml index 7db1396ef36..e9bc5140768 100644 --- a/make/data/cldr/common/main/en_NL.xml +++ b/make/data/cldr/common/main/en_NL.xml @@ -20,9 +20,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;¤ -#,##0.00 + ¤ #,##0.00;¤ -#,##0.00 ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_PL.xml b/make/data/cldr/common/main/en_PL.xml index f450a26f0fd..61cd8e94f52 100644 --- a/make/data/cldr/common/main/en_PL.xml +++ b/make/data/cldr/common/main/en_PL.xml @@ -20,6 +20,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_PT.xml b/make/data/cldr/common/main/en_PT.xml index 83f5062f161..b1868f5d217 100644 --- a/make/data/cldr/common/main/en_PT.xml +++ b/make/data/cldr/common/main/en_PT.xml @@ -20,6 +20,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_RO.xml b/make/data/cldr/common/main/en_RO.xml index 26063dc6e4c..360ee380064 100644 --- a/make/data/cldr/common/main/en_RO.xml +++ b/make/data/cldr/common/main/en_RO.xml @@ -20,6 +20,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_SI.xml b/make/data/cldr/common/main/en_SI.xml index fa881408603..3cf0f92e428 100644 --- a/make/data/cldr/common/main/en_SI.xml +++ b/make/data/cldr/common/main/en_SI.xml @@ -21,6 +21,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_SK.xml b/make/data/cldr/common/main/en_SK.xml index 424e5132db9..d2c3f645ce2 100644 --- a/make/data/cldr/common/main/en_SK.xml +++ b/make/data/cldr/common/main/en_SK.xml @@ -21,6 +21,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/en_Shaw.xml b/make/data/cldr/common/main/en_Shaw.xml index 937d9e50698..7fedd656fc0 100644 --- a/make/data/cldr/common/main/en_Shaw.xml +++ b/make/data/cldr/common/main/en_Shaw.xml @@ -12,20 +12,414 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + + 𐑢𐑻𐑤𐑛 + ·𐑨𐑓𐑮𐑦𐑒𐑩 + ·𐑯𐑹𐑔 𐑩𐑥𐑧𐑮𐑦𐑒𐑩 + ·𐑕𐑬𐑔 𐑩𐑥𐑧𐑮𐑦𐑒𐑩 + ·𐑴𐑖𐑦𐑭𐑯𐑾 + ·𐑕𐑧𐑯𐑑𐑮𐑩𐑤 𐑩𐑥𐑧𐑮𐑦𐑒𐑩 ·𐑩𐑥𐑧𐑮𐑦𐑒𐑩𐑟 + ·𐑯𐑹𐑞𐑼𐑯 𐑩𐑥𐑧𐑮𐑦𐑒𐑩 + ·𐑒𐑨𐑮𐑦𐑚𐑰𐑩𐑯 + ·𐑕𐑳𐑞𐑼𐑯 𐑘𐑫𐑼𐑩𐑐 + 𐑥𐑲𐑒𐑮𐑴𐑯𐑰𐑟𐑩𐑯 𐑮𐑰𐑡𐑩𐑯 + ·𐑱𐑠𐑩 + ·𐑘𐑫𐑼𐑩𐑐 + ·𐑰𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐 + ·𐑯𐑹𐑞𐑼𐑯 𐑘𐑫𐑼𐑩𐑐 + ·𐑢𐑧𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐 + ·𐑤𐑨𐑑𐑦𐑯 𐑩𐑥𐑧𐑮𐑦𐑒𐑩 + ·𐑩𐑕𐑧𐑯𐑖𐑩𐑯 𐑲𐑤𐑩𐑯𐑛 + ·𐑨𐑯𐑛𐑹𐑩 + ·𐑿𐑯𐑲𐑑𐑩𐑛 𐑨𐑮𐑩𐑚 𐑧𐑥𐑦𐑮𐑩𐑑𐑕 + ·𐑨𐑓𐑜𐑨𐑯𐑦𐑕𐑑𐑭𐑯 + ·𐑨𐑙𐑜𐑢𐑦𐑤𐑩 + ·𐑨𐑤𐑚𐑱𐑯𐑾 + ·𐑨𐑙𐑜𐑴𐑤𐑩 + ·𐑨𐑯𐑑𐑸𐑒𐑑𐑦𐑒𐑩 + ·𐑸𐑡𐑩𐑯𐑑𐑰𐑯𐑩 + ·𐑩𐑥𐑧𐑮𐑦𐑒𐑩𐑯 𐑕𐑩𐑥𐑴𐑩 + ·𐑪𐑕𐑑𐑮𐑾 + ·𐑪𐑕𐑑𐑮𐑱𐑤𐑾 + ·𐑨𐑟𐑼𐑚𐑲𐑡𐑭𐑯 + ·𐑚𐑸𐑚𐑱𐑛𐑪𐑕 + ·𐑚𐑨𐑙𐑜𐑤𐑩𐑛𐑧𐑖 + ·𐑚𐑧𐑤𐑡𐑩𐑥 + ·𐑚𐑳𐑤𐑜𐑺𐑾 + ·𐑚𐑸𐑱𐑯 + ·𐑚𐑫𐑮𐑫𐑯𐑛𐑦 + ·𐑚𐑧𐑯𐑦𐑯 + ·𐑚𐑼𐑥𐑿𐑛𐑩 + ·𐑚𐑮𐑵𐑯𐑲 + ·𐑚𐑩𐑤𐑦𐑝𐑾 + ·𐑚𐑮𐑩𐑟𐑦𐑤 + ·𐑚𐑩𐑣𐑭𐑥𐑩𐑟 + ·𐑚𐑵𐑑𐑭𐑯 + ·𐑚𐑪𐑑𐑕𐑢𐑭𐑯𐑩 + ·𐑒𐑨𐑯𐑩𐑛𐑩 + ·𐑒𐑪𐑙𐑜𐑴 - ·𐑒𐑦𐑯𐑖𐑭𐑕𐑩 + ·𐑒𐑪𐑙𐑜𐑴 (𐑛𐑰𐑸𐑕𐑰) + ·𐑕𐑧𐑯𐑑𐑮𐑩𐑤 𐑨𐑓𐑮𐑦𐑒𐑩𐑯 𐑮𐑦𐑐𐑳𐑚𐑤𐑦𐑒 + ·𐑒𐑪𐑙𐑜𐑴 - ·𐑚𐑮𐑭𐑟𐑩𐑝𐑦𐑤 + ·𐑒𐑪𐑙𐑜𐑴 (𐑮𐑦𐑐𐑳𐑚𐑤𐑦𐑒) + ·𐑕𐑢𐑦𐑑𐑕𐑼𐑤𐑩𐑯𐑛 + ·𐑒𐑫𐑒 𐑲𐑤𐑩𐑯𐑛𐑟 + ·𐑗𐑦𐑤𐑦 + ·𐑒𐑨𐑥𐑼𐑵𐑯 + ·𐑗𐑲𐑯𐑩 + ·𐑒𐑩𐑤𐑳𐑥𐑚𐑾 + ·𐑒𐑪𐑕𐑑𐑩 𐑮𐑰𐑒𐑩 + ·𐑒𐑿𐑚𐑩 + ·𐑕𐑲𐑐𐑮𐑩𐑕 + ·𐑗𐑧𐑒𐑾 + ·𐑗𐑧𐑒 𐑮𐑦𐑐𐑳𐑚𐑤𐑦𐑒 + ·𐑡𐑻𐑥𐑩𐑯𐑦 + ·𐑡𐑦𐑚𐑵𐑑𐑦 + ·𐑛𐑧𐑯𐑥𐑸𐑒 + ·𐑛𐑩𐑥𐑦𐑯𐑦𐑒𐑩 + ·𐑛𐑩𐑥𐑦𐑯𐑦𐑒𐑩𐑯 𐑮𐑦𐑐𐑳𐑚𐑤𐑦𐑒 + ·𐑨𐑤𐑡𐑽𐑾 + ·𐑧𐑒𐑢𐑩𐑛𐑹 + ·𐑰𐑡𐑦𐑐𐑑 + ·𐑧𐑮𐑦𐑑𐑮𐑱𐑩 + ·𐑕𐑐𐑱𐑯 + ·𐑰𐑔𐑦𐑴𐑐𐑾 + ·𐑓𐑦𐑯𐑤𐑩𐑯𐑛 + ·𐑓𐑰𐑡𐑰 + ·𐑓𐑷𐑒𐑤𐑨𐑯𐑛 𐑲𐑤𐑩𐑯𐑛𐑟 + ·𐑓𐑷𐑒𐑤𐑨𐑯𐑛 𐑲𐑤𐑩𐑯𐑛𐑟 (·𐑦𐑕𐑤𐑨𐑟 𐑥𐑨𐑤𐑝𐑰𐑯𐑩𐑟) + ·𐑓𐑮𐑭𐑯𐑕 + ·𐑜𐑨𐑚𐑪𐑯 + ·𐑿𐑯𐑲𐑑𐑩𐑛 𐑒𐑦𐑙𐑛𐑩𐑥 + ·𐑿𐑒𐑱 + ·𐑜𐑮𐑩𐑯𐑱𐑛𐑩 + ·𐑡𐑹𐑡𐑩 + ·𐑜𐑭𐑯𐑩 + ·𐑡𐑦𐑚𐑮𐑷𐑤𐑑𐑼 + ·𐑜𐑨𐑥𐑚𐑾 + ·𐑜𐑦𐑯𐑦 + ·𐑜𐑮𐑰𐑕 + ·𐑜𐑢𐑭𐑑𐑩𐑥𐑭𐑤𐑩 + ·𐑜𐑲𐑭𐑯𐑩 + ·𐑣𐑪𐑙 𐑒𐑪𐑙 𐑕.𐑩.𐑮. ·𐑗𐑲𐑯𐑩 + ·𐑣𐑪𐑙 𐑒𐑪𐑙 + ·𐑣𐑪𐑯𐑛𐑘𐑫𐑼𐑩𐑕 + ·𐑒𐑮𐑴𐑱𐑖𐑩 + ·𐑣𐑱𐑑𐑦 + ·𐑣𐑳𐑙𐑜𐑼𐑦 + ·𐑦𐑯𐑛𐑩𐑯𐑰𐑠𐑩 + ·𐑲𐑼𐑤𐑩𐑯𐑛 + ·𐑦𐑟𐑮𐑱𐑤 + ·𐑦𐑯𐑛𐑾 + ·𐑚𐑮𐑦𐑑𐑦𐑖 𐑦𐑯𐑛𐑾𐑯 𐑴𐑖𐑩𐑯 𐑑𐑧𐑮𐑦𐑑𐑼𐑦 + ·𐑦𐑮𐑭𐑒 + ·𐑦𐑮𐑭𐑯 + ·𐑲𐑕𐑤𐑩𐑯𐑛 + ·𐑦𐑑𐑩𐑤𐑦 + ·𐑡𐑩𐑥𐑱𐑒𐑩 + ·𐑡𐑹𐑛𐑩𐑯 + ·𐑡𐑩𐑐𐑨𐑯 + ·𐑒𐑧𐑯𐑘𐑩 + ·𐑒𐑨𐑥𐑚𐑴𐑛𐑾 + ·𐑯𐑹𐑔 𐑒𐑼𐑾 + ·𐑕𐑬𐑔 𐑒𐑼𐑾 + ·𐑒𐑵𐑢𐑱𐑑 + ·𐑤𐑬𐑕 + ·𐑤𐑧𐑚𐑩𐑯𐑪𐑯 + ·𐑤𐑦𐑒𐑑𐑩𐑯𐑕𐑑𐑲𐑯 + ·𐑕𐑮𐑦 𐑤𐑨𐑯𐑒𐑩 + ·𐑤𐑲𐑚𐑽𐑾 + ·𐑤𐑩𐑕𐑵𐑑𐑵 + ·𐑤𐑦𐑔𐑿𐑱𐑯𐑾 + ·𐑤𐑳𐑒𐑕𐑩𐑥𐑚𐑻𐑜 + ·𐑤𐑦𐑚𐑾 + ·𐑥𐑼𐑪𐑒𐑴 + ·𐑥𐑪𐑯𐑩𐑒𐑴 + ·𐑥𐑨𐑛𐑩𐑜𐑨𐑕𐑒𐑼 + ·𐑥𐑸𐑖𐑩𐑤 𐑲𐑤𐑩𐑯𐑛𐑟 + ·𐑯𐑹𐑔 𐑥𐑨𐑕𐑩𐑛𐑴𐑯𐑾 + ·𐑥𐑭𐑤𐑦 + ·𐑥𐑘𐑨𐑯𐑥𐑸 (·𐑚𐑻𐑥𐑩) + ·𐑥𐑪𐑙𐑜𐑴𐑤𐑾 + ·𐑥𐑩𐑒𐑬 𐑒𐑪𐑙 𐑕.𐑩.𐑮. ·𐑗𐑲𐑯𐑩 + ·𐑥𐑩𐑒𐑬 + ·𐑥𐑹𐑦𐑑𐑱𐑯𐑾 + ·𐑥𐑪𐑯𐑑𐑕𐑼𐑨𐑑 + ·𐑥𐑷𐑤𐑑𐑩 + ·𐑥𐑼𐑦𐑖𐑩𐑕 + ·𐑥𐑩𐑤𐑭𐑢𐑦 + ·𐑥𐑧𐑒𐑕𐑦𐑒𐑴 + ·𐑥𐑩𐑤𐑱𐑠𐑩 + ·𐑥𐑴𐑟𐑨𐑥𐑚𐑰𐑒 + ·𐑯𐑩𐑥𐑦𐑚𐑾 + ·𐑯𐑰𐑠𐑺 + ·𐑯𐑲𐑡𐑽𐑾 + ·𐑯𐑦𐑒𐑼𐑭𐑜𐑢𐑩 + ·𐑯𐑧𐑞𐑼𐑤𐑩𐑯𐑛𐑟 + ·𐑯𐑹𐑢𐑱 + ·𐑯𐑦𐑐𐑷𐑤 + ·𐑯𐑭𐑵𐑮𐑵 + ·𐑯𐑿 𐑟𐑰𐑤𐑩𐑯𐑛 + ·𐑭𐑴𐑑𐑾𐑮𐑴𐑩 𐑯𐑿 𐑟𐑰𐑤𐑩𐑯𐑛 + ·𐑴𐑥𐑭𐑯 + ·𐑐𐑨𐑯𐑩𐑥𐑭 + ·𐑐𐑼𐑵 + ·𐑓𐑦𐑤𐑦𐑐𐑰𐑯𐑟 + ·𐑐𐑭𐑒𐑦𐑕𐑑𐑭𐑯 + ·𐑐𐑴𐑤𐑩𐑯𐑛 + ·𐑐𐑨𐑤𐑩𐑕𐑑𐑦𐑯𐑾𐑯 𐑑𐑧𐑮𐑦𐑑𐑼𐑦𐑟 + ·𐑐𐑨𐑤𐑩𐑕𐑑𐑲𐑯 + ·𐑐𐑹𐑗𐑩𐑜𐑩𐑤 + ·𐑐𐑨𐑮𐑩𐑜𐑢𐑲 + ·𐑒𐑳𐑑𐑸 + ·𐑮𐑩𐑥𐑱𐑯𐑾 + ·𐑕𐑻𐑚𐑾 + ·𐑮𐑳𐑖𐑩 + ·𐑮𐑵𐑨𐑯𐑛𐑩 + ·𐑕𐑬𐑛𐑦 𐑼𐑱𐑚𐑾 + ·𐑕𐑱𐑖𐑧𐑤𐑟 + ·𐑕𐑵𐑛𐑨𐑯 + ·𐑕𐑢𐑰𐑛𐑩𐑯 + ·𐑕𐑦𐑙𐑩𐑐𐑹 + ·𐑕𐑤𐑩𐑝𐑨𐑒𐑾 + ·𐑕𐑦𐑺𐑩 𐑤𐑦𐑴𐑯 + ·𐑕𐑨𐑯 𐑥𐑼𐑰𐑯𐑴 + ·𐑕𐑧𐑯𐑦𐑜𐑷𐑤 + ·𐑕𐑩𐑥𐑭𐑤𐑾 + ·𐑕𐑬𐑔 𐑕𐑵𐑛𐑨𐑯 + ·𐑧𐑤 𐑕𐑨𐑤𐑝𐑩𐑛𐑹 + ·𐑕𐑦𐑮𐑾 + ·𐑧𐑕𐑢𐑭𐑑𐑦𐑯𐑦 + ·𐑕𐑢𐑭𐑟𐑦𐑤𐑨𐑯𐑛 + ·𐑗𐑨𐑛 + ·𐑓𐑮𐑧𐑯𐑗 𐑕𐑳𐑞𐑼𐑯 𐑑𐑧𐑮𐑦𐑑𐑼𐑦𐑟 + ·𐑑𐑴𐑜𐑴 + ·𐑑𐑲𐑤𐑨𐑯𐑛 + ·𐑑𐑿𐑯𐑦𐑟𐑾 + ·𐑑𐑪𐑙𐑩 + ·𐑑𐑫𐑼𐑒𐑦𐑘𐑩 + ·𐑑𐑻𐑒𐑦 + ·𐑑𐑲𐑢𐑭𐑯 + ·𐑑𐑨𐑯𐑟𐑩𐑯𐑾 + ·𐑿𐑒𐑮𐑱𐑯 + ·𐑿𐑜𐑨𐑯𐑛𐑩 + ·𐑿𐑧𐑕 𐑬𐑑𐑤𐑲𐑦𐑙 𐑲𐑤𐑩𐑯𐑛𐑟 + ·𐑿𐑯𐑲𐑑𐑩𐑛 𐑕𐑑𐑱𐑑𐑕 + ·𐑿𐑧𐑕 + ·𐑘𐑫𐑼𐑩𐑜𐑢𐑲 + ·𐑝𐑨𐑑𐑦𐑒𐑩𐑯 𐑕𐑦𐑑𐑦 + ·𐑝𐑧𐑯𐑦𐑟𐑢𐑱𐑤𐑩 + ·𐑝𐑦𐑧𐑑𐑯𐑭𐑥 + ·𐑕𐑩𐑥𐑴𐑩 + 𐑕𐑿𐑛𐑴-𐑨𐑒𐑕𐑩𐑯𐑑𐑕 + 𐑕𐑿𐑛𐑴-𐑚𐑲𐑛𐑲 + ·𐑘𐑧𐑥𐑩𐑯 + ·𐑕𐑬𐑔 𐑨𐑓𐑮𐑦𐑒𐑩 + ·𐑟𐑨𐑥𐑚𐑾 + ·𐑟𐑦𐑥𐑚𐑭𐑚𐑢𐑱 + 𐑳𐑯𐑯𐑴𐑯 𐑮𐑰𐑡𐑩𐑯 + + 𐑤𐑱𐑑 𐑥𐑦𐑛𐑩𐑤 𐑓𐑮𐑧𐑯𐑗 𐑑 1606 + 𐑻𐑤𐑦 𐑥𐑪𐑛𐑼𐑯 𐑓𐑮𐑧𐑯𐑗 + + + 𐑒𐑨𐑤𐑦𐑯𐑛𐑼 + 𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑓𐑹𐑥𐑨𐑑 + 𐑕𐑹𐑑 𐑹𐑛𐑼 + 𐑒𐑳𐑮𐑩𐑯𐑕𐑦 + 𐑬𐑼 𐑕𐑲𐑒𐑩𐑤 (12 𐑹 24) + 𐑤𐑲𐑯 𐑚𐑮𐑱𐑒𐑕 𐑭𐑓𐑑𐑼 𐑢𐑻𐑛𐑟 + 𐑥𐑧𐑠𐑼𐑥𐑩𐑯𐑑 𐑕𐑦𐑕𐑑𐑩𐑥 + 𐑯𐑳𐑥𐑚𐑼𐑟 + 𐑕𐑧𐑯𐑑𐑩𐑯𐑕 𐑚𐑮𐑱𐑒 𐑭𐑓𐑑𐑼 𐑩𐑚𐑮. + + + 𐑜𐑮𐑦𐑜𐑹𐑾𐑯 𐑒𐑨𐑤𐑦𐑯𐑛𐑼 + 𐑜𐑮𐑦𐑜𐑹𐑾𐑯 + 𐑩𐑒𐑬𐑯𐑑𐑦𐑙 𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑓𐑹𐑥𐑨𐑑 + 𐑩𐑒𐑬𐑯𐑑𐑦𐑙 + 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑒𐑳𐑮𐑩𐑯𐑕𐑦 𐑓𐑹𐑥𐑨𐑑 + 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 + 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 + 12 𐑬𐑼 𐑕𐑦𐑕𐑑𐑩𐑥 (0–11) + 12 (0–11) + 12 𐑬𐑼 𐑕𐑦𐑕𐑑𐑩𐑥 (1–12) + 12 (1–12) + 24 𐑬𐑼 𐑕𐑦𐑕𐑑𐑩𐑥 (0–23) + 24 (0–23) + 24 𐑬𐑼 𐑕𐑦𐑕𐑑𐑩𐑥 (1–24) + 24 (1–24) + 𐑚𐑮𐑱𐑒 𐑷𐑤 + 𐑒𐑰𐑐 𐑷𐑤 + 𐑯𐑹𐑥𐑩𐑤 + 𐑒𐑰𐑐 𐑦𐑯 𐑓𐑮𐑱𐑟𐑩𐑟 + 𐑥𐑧𐑑𐑮𐑦𐑒 𐑕𐑦𐑕𐑑𐑩𐑥 + 𐑥𐑧𐑑𐑮𐑦𐑒 + 𐑦𐑥𐑐𐑽𐑾𐑤 𐑥𐑧𐑠𐑼𐑥𐑩𐑯𐑑 𐑕𐑦𐑕𐑑𐑩𐑥 + 𐑿𐑒𐑱 + 𐑿𐑧𐑕 𐑥𐑧𐑠𐑼𐑥𐑩𐑯𐑑 𐑕𐑦𐑕𐑑𐑩𐑥 + 𐑿𐑧𐑕 + 𐑢𐑧𐑕𐑑𐑼𐑯 𐑛𐑦𐑡𐑦𐑑𐑕 + 𐑪𐑓 + 𐑪𐑯 + 𐑥𐑧𐑑𐑮𐑦𐑒 + 𐑿𐑒𐑱 + 𐑿𐑧𐑕 + + 𐑤𐑨𐑙𐑜𐑢𐑦𐑡: {0} + 𐑕𐑒𐑮𐑦𐑐𐑑: {0} + 𐑮𐑰𐑡𐑩𐑯: {0} + [𐑐 𐑑 𐑒 𐑓 𐑔 𐑕 𐑖 𐑗 𐑘 𐑙 𐑚 𐑛 𐑜 𐑝 𐑞 𐑟 𐑠 𐑡 𐑢 𐑣 𐑤 𐑥 𐑦 𐑧 𐑨 𐑩 𐑪 𐑫 𐑬 𐑭 𐑮 𐑯 𐑰 𐑱 𐑲 𐑳 𐑴 𐑵 𐑶 𐑷 𐑸 𐑹 𐑺 𐑻 𐑼 𐑽 𐑾 𐑿] [𐑐 𐑑 𐑒 𐑓 𐑔 𐑕 𐑖 𐑗 𐑘 𐑙 𐑚 𐑛 𐑜 𐑝 𐑞 𐑟 𐑠 𐑡 𐑢 𐑣 𐑤 𐑥 𐑦 𐑧 𐑨 𐑩 𐑪 𐑫 𐑬 𐑭 𐑮 𐑯 𐑰 𐑱 𐑲 𐑳 𐑴 𐑵 𐑶 𐑷 𐑸 𐑹 𐑺 𐑻 𐑼 𐑽 𐑾 𐑿] + [\- ‐‑ – — , ; \: ! ? . … ' ‹ › « » ( ) \[ \] § @ * / \& # † ‡ ′ ″] + + + + « + » + + + + + + EEEE, d MMMM y G + + + + + d MMMM y G + + + + + d MMM y G + + + + + dd/MM/y GGGGG + + + + + + + {1}, {0} + + + {1} 𐑨𐑑 {0} + + + {1} 𐑨𐑑 {0} + + + + + {1}, {0} + + + {1} 𐑨𐑑 {0} + + + {1} 𐑨𐑑 {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + E d + y G + dd/MM/y GGGGG + LLL y G + d MMM y G + E, d MMM y G + dd/MM + E dd/MM + d MMM + E d MMM + d MMMM + y G + y G + MM/y GGGGG + dd/MM/y GGGGG + E, dd/MM/y GGGGG + LLL y G + d MMM y G + E, d MMM y G + LLLL y G + QQQ y G + QQQQ y G + + + + h – h B + + + h:mm – h:mm B + h:mm – h:mm B + + + y G – y G + y–y G + + + + @@ -43,6 +437,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic ·𐑯𐑴 ·𐑛𐑭 + + 𐑡 + 𐑓 + 𐑥 + 𐑱 + 𐑥 + 𐑡 + 𐑡 + 𐑷 + 𐑕 + 𐑪 + 𐑯 + 𐑛 + ·𐑡𐑨𐑙𐑘𐑭𐑢𐑺𐑰 ·𐑓𐑧𐑚𐑘𐑵𐑢𐑺𐑰 @@ -59,6 +467,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + ·𐑡𐑨𐑯 + ·𐑓𐑧𐑚 + ·𐑥𐑸𐑗 + ·𐑱𐑐𐑮 + ·𐑥𐑱 + ·𐑡𐑵𐑯 + ·𐑡𐑵𐑤 + ·𐑷𐑜 + ·𐑕𐑧𐑐 + ·𐑪𐑒𐑑 + ·𐑯𐑴𐑝 + ·𐑛𐑦𐑕 + 𐑡 𐑓 @@ -73,6 +495,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𐑯 𐑛 + + ·𐑡𐑨𐑯𐑿𐑼𐑦 + ·𐑓𐑧𐑚𐑮𐑵𐑼𐑦 + ·𐑥𐑸𐑗 + ·𐑱𐑐𐑮𐑩𐑤 + ·𐑥𐑱 + ·𐑡𐑵𐑯 + ·𐑡𐑩𐑤𐑲 + ·𐑷𐑜𐑩𐑕𐑑 + ·𐑕𐑧𐑐𐑑𐑧𐑥𐑚𐑼 + ·𐑪𐑒𐑑𐑴𐑚𐑼 + ·𐑯𐑴𐑝𐑧𐑥𐑚𐑼 + ·𐑛𐑦𐑕𐑧𐑥𐑚𐑼 + @@ -148,6 +584,231 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𐑨 + + + + EEEE, d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + dd/MM/y + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1}, {0} + + + {1} 𐑨𐑑 {0} + + + {1} 𐑨𐑑 {0} + + + + + {1}, {0} + + + {1} 𐑨𐑑 {0} + + + {1} 𐑨𐑑 {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + E d + y G + dd/MM/y G + LLL y G + d MMM y G + E, d MMM y G + dd/MM + E dd/MM + d MMM + E d MMM + d MMMM + 𐑢𐑰𐑒 W 𐑝 LLLL + 𐑢𐑰𐑒 W 𐑝 LLLL + MM/y + dd/MM/y + E, dd/MM/y + LLL y + d MMM y + E, d MMM y + LLLL y + QQQ y + QQQQ y + 𐑢𐑰𐑒 w 𐑝 Y + 𐑢𐑰𐑒 w 𐑝 Y + + + + h – h B + + + h:mm – h:mm B + h:mm – h:mm B + + + y G – y G + y – y G + + + M/y G – M/y G + M/y – M/y G + M/y – M/y G + + + dd/MM/y – dd/MM/y G + dd/MM/y G – dd/MM/y G + dd/MM/y – dd/MM/y G + dd/MM/y – dd/MM/y G + + + E, dd/MM/y – E, dd/MM/y G + E, dd/MM/y G – E, dd/MM/y G + E, dd/MM/y – E, dd/MM/y G + E, dd/MM/y – E, dd/MM/y G + + + LLL y G – MMM y G + LLL – MMM y G + LLL y – MMM y G + + + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E, d MMM – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G + + + h:mm – h:mm a + h:mm – h:mm a + + + h:mm – h:mm a v + h:mm – h:mm a v + + + M – M + + + dd/MM – dd/MM + dd/MM – dd/MM + + + E dd/MM – E dd/MM + E dd/MM – E dd/MM + + + LLL–MMM + + + d–d MMM + d MMM – d MMM + + + E d MMM – E d MMM + E d MMM – E d MMM + + + MM/y – MM/y + MM/y – MM/y + + + dd/MM/y – dd/MM/y + dd/MM/y – dd/MM/y + dd/MM/y – dd/MM/y + + + E, dd/MM/y – E, dd/MM/y + E, dd/MM/y – E, dd/MM/y + E, dd/MM/y – E, dd/MM/y + + + LLL – MMM y + LLL y – MMM y + + + d–d MMM y + d MMM – d MMM y + d MMM y – d MMM y + + + E, d MMM – E, d MMM y + E, d MMM – E, d MMM y + E, d MMM y – E, d MMM y + + + LLLL – MMMM y + LLLL y – MMMM y + + + @@ -156,15 +817,160 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𐑘𐑽 + 𐑤𐑭𐑕𐑑 𐑘𐑽 + 𐑞𐑦𐑕 𐑘𐑽 + 𐑯𐑧𐑒𐑕𐑑 𐑘𐑽 + + 𐑦𐑯 {0} 𐑘𐑽 + 𐑦𐑯 {0} 𐑘𐑽𐑟 + + + {0} 𐑘𐑽 𐑩𐑜𐑴 + {0} 𐑘𐑽𐑟 𐑩𐑜𐑴 + + + + 𐑤𐑭𐑕𐑑 𐑘𐑽 + 𐑞𐑦𐑕 𐑘𐑽 + 𐑯𐑧𐑒𐑕𐑑 𐑘𐑽 + + 𐑦𐑯 {0} 𐑘𐑽 + 𐑦𐑯 {0} 𐑘𐑽𐑕 + + + {0} 𐑘𐑽 𐑩𐑜𐑴 + {0} 𐑘𐑽𐑕 𐑩𐑜𐑴 + + + + 𐑤𐑭𐑕𐑑 𐑘𐑽 + 𐑯𐑧𐑒𐑕𐑑 𐑘𐑽 + + 𐑦𐑯 {0} 𐑘𐑽 + 𐑦𐑯 {0} 𐑘𐑽𐑕 + + + {0} 𐑘𐑽 𐑩𐑜𐑴 + {0} 𐑘𐑽𐑕 𐑩𐑜𐑴 + + + + 𐑤𐑭𐑕𐑑 𐑒𐑢𐑹𐑑𐑼 + 𐑞𐑦𐑕 𐑒𐑢𐑹𐑑𐑼 + 𐑯𐑧𐑒𐑕𐑑 𐑒𐑢𐑹𐑑𐑼 + + 𐑦𐑯 {0} 𐑒𐑢𐑹𐑑𐑼 + 𐑦𐑯 {0} 𐑒𐑢𐑹𐑑𐑼𐑟 + + + {0} 𐑒𐑢𐑹𐑑𐑼 𐑩𐑜𐑴 + {0} 𐑒𐑢𐑹𐑑𐑼𐑟 𐑩𐑜𐑴 + + + + + 𐑦𐑯 {0} 𐑒𐑢𐑑 + 𐑦𐑯 {0} 𐑒𐑢𐑑 + + + {0} 𐑒𐑢𐑑 𐑩𐑜𐑴 + {0} 𐑒𐑢𐑑 𐑩𐑜𐑴 + 𐑥𐑭𐑙𐑔 + 𐑤𐑭𐑕𐑑 𐑥𐑳𐑯𐑔 + 𐑞𐑦𐑕 𐑥𐑳𐑯𐑔 + 𐑯𐑧𐑒𐑕𐑑 𐑥𐑳𐑯𐑔 + + 𐑦𐑯 {0} 𐑥𐑳𐑯𐑔 + 𐑦𐑯 {0} 𐑥𐑳𐑯𐑔𐑕 + + + {0} 𐑥𐑳𐑯𐑔 𐑩𐑜𐑴 + {0} 𐑥𐑳𐑯𐑔𐑕 𐑩𐑜𐑴 + + + + 𐑤𐑭𐑕𐑑 𐑥𐑳 + 𐑞𐑦𐑕 𐑥𐑳 + 𐑯𐑧𐑒𐑕𐑑 𐑥𐑳 + + 𐑦𐑯 {0} 𐑥𐑳 + 𐑦𐑯 {0} 𐑥𐑳 + + + {0} 𐑥𐑳 𐑩𐑜𐑴 + {0} 𐑥𐑳 𐑩𐑜𐑴 + 𐑢𐑰𐑒 + 𐑤𐑭𐑕𐑑 𐑢𐑰𐑒 + 𐑞𐑦𐑕 𐑢𐑰𐑒 + 𐑯𐑧𐑒𐑕𐑑 𐑢𐑰𐑒 + + 𐑦𐑯 {0} 𐑢𐑰𐑒 + 𐑦𐑯 {0} 𐑢𐑰𐑒𐑕 + + + {0} 𐑢𐑰𐑒 𐑩𐑜𐑴 + {0} 𐑢𐑰𐑒𐑕 𐑩𐑜𐑴 + + 𐑞 𐑢𐑰𐑒 𐑝 {0} + + + 𐑤𐑭𐑕𐑑 𐑢 + 𐑞𐑦𐑕 𐑢 + 𐑯𐑧𐑒𐑕𐑑 𐑢 + + 𐑦𐑯 {0} 𐑢 + 𐑦𐑯 {0} 𐑢 + + + {0} 𐑢 𐑩𐑜𐑴 + {0} 𐑢 𐑩𐑜𐑴 + 𐑛𐑱 + 𐑘𐑧𐑕𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑥𐑪𐑮𐑴 + + 𐑦𐑯 {0} 𐑛𐑱 + 𐑦𐑯 {0} 𐑛𐑱𐑟 + + + {0} 𐑛𐑱 𐑩𐑜𐑴 + {0} 𐑛𐑱𐑟 𐑩𐑜𐑴 + + + + 𐑘𐑧𐑕𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑥𐑪𐑮𐑴 + + 𐑦𐑯 {0} 𐑛𐑱 + 𐑦𐑯 {0} 𐑛𐑱𐑕 + + + {0} 𐑛𐑱 𐑩𐑜𐑴 + {0} 𐑛𐑱𐑕 𐑩𐑜𐑴 + + + + 𐑘𐑧𐑕𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑛𐑱 + 𐑑𐑩𐑥𐑪𐑮𐑴 + + 𐑦𐑯 {0} 𐑛𐑱 + 𐑦𐑯 {0} 𐑛𐑱𐑕 + + + {0} 𐑛𐑱 𐑩𐑜𐑴 + {0} 𐑛𐑱𐑕 𐑩𐑜𐑴 + 𐑛𐑱 𐑝 𐑞 𐑢𐑰𐑒 @@ -174,12 +980,105 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𐑬𐑮 + 𐑞𐑦𐑕 𐑬𐑼 + + 𐑦𐑯 {0} 𐑬𐑼 + 𐑦𐑯 {0} 𐑬𐑼𐑟 + + + {0} 𐑬𐑼 𐑩𐑜𐑴 + {0} 𐑬𐑼𐑟 𐑩𐑜𐑴 + + + + 𐑞𐑦𐑕 𐑬𐑼 + + 𐑦𐑯 {0} 𐑬𐑼 + 𐑦𐑯 {0} 𐑬𐑼𐑕 + + + {0} 𐑬𐑼 𐑩𐑜𐑴 + {0} 𐑬𐑼𐑕 𐑩𐑜𐑴 + + + + 𐑞𐑦𐑕 𐑬𐑼 + + 𐑦𐑯 {0} 𐑬𐑼 + 𐑦𐑯 {0} 𐑬𐑼𐑕 + + + {0} 𐑬𐑼 𐑩𐑜𐑴 + {0} 𐑬𐑼𐑕 𐑩𐑜𐑴 + 𐑥𐑦𐑙𐑦𐑑 + 𐑞𐑦𐑕 𐑥𐑦𐑯𐑦𐑑 + + 𐑦𐑯 {0} 𐑥𐑦𐑯𐑦𐑑 + 𐑦𐑯 {0} 𐑥𐑦𐑯𐑦𐑑𐑕 + + + {0} 𐑥𐑦𐑯𐑦𐑑 𐑩𐑜𐑴 + {0} 𐑥𐑦𐑯𐑦𐑑𐑕 𐑩𐑜𐑴 + + + + 𐑞𐑦𐑕 𐑥𐑦𐑯𐑦𐑑 + + 𐑦𐑯 {0} 𐑥𐑦𐑯 + 𐑦𐑯 {0} 𐑥𐑦𐑯 + + + {0} 𐑥𐑦𐑯 𐑩𐑜𐑴 + {0} 𐑥𐑦𐑯 𐑩𐑜𐑴 + + + + 𐑞𐑦𐑕 𐑥𐑦𐑯𐑦𐑑 + + 𐑦𐑯 {0} 𐑥𐑦𐑯 + 𐑦𐑯 {0} 𐑥𐑦𐑯 + + + {0} 𐑥𐑦𐑯 𐑩𐑜𐑴 + {0} 𐑥𐑦𐑯 𐑩𐑜𐑴 + 𐑕𐑧𐑒𐑭𐑙𐑛 + 𐑯𐑬 + + 𐑦𐑯 {0} 𐑕𐑧𐑒𐑩𐑯𐑛 + 𐑦𐑯 {0} 𐑕𐑧𐑒𐑩𐑯𐑛𐑟 + + + {0} 𐑕𐑧𐑒𐑩𐑯𐑛 𐑩𐑜𐑴 + {0} 𐑕𐑧𐑒𐑩𐑯𐑛𐑟 𐑩𐑜𐑴 + + + + 𐑯𐑬 + + 𐑦𐑯 {0} 𐑕𐑧𐑒 + 𐑦𐑯 {0} 𐑕𐑧𐑒 + + + {0} 𐑕𐑧𐑒 𐑩𐑜𐑴 + {0} 𐑕𐑧𐑒 𐑩𐑜𐑴 + + + + 𐑯𐑬 + + 𐑦𐑯 {0} 𐑕𐑧𐑒 + 𐑦𐑯 {0} 𐑕𐑧𐑒 + + + {0} 𐑕𐑧𐑒 𐑩𐑜𐑴 + {0} 𐑕𐑧𐑒 𐑩𐑜𐑴 + 𐑟𐑴𐑯 @@ -188,13 +1087,576 @@ CLDR data files are interpreted according to the LDML specification (http://unic ·𐑜𐑥𐑑{0} ·𐑜𐑥𐑑 + 𐑜𐑥𐑑+? {0} 𐑑𐑲𐑥 + {0} 𐑛𐑱𐑤𐑲𐑑 𐑑𐑲𐑥 + {0} 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑑𐑲𐑥 + + + 𐑒𐑴𐑹𐑛𐑦𐑯𐑱𐑑𐑩𐑛 𐑿𐑯𐑦𐑝𐑻𐑕𐑩𐑤 𐑑𐑲𐑥 + + + 𐑿𐑑𐑰𐑒𐑰 + + + + 𐑳𐑯𐑯𐑴𐑯 𐑤𐑴𐑒𐑱𐑖𐑩𐑯 + + + + 𐑚𐑮𐑦𐑑𐑦𐑖 𐑕𐑳𐑥𐑼 𐑑𐑲𐑥 + + + + + 𐑲𐑮𐑦𐑖 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑑𐑲𐑥 + + + + + 𐑕𐑧𐑯𐑑𐑮𐑩𐑤 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑑𐑲𐑥 + 𐑕𐑧𐑯𐑑𐑮𐑩𐑤 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑑𐑲𐑥 + 𐑕𐑧𐑯𐑑𐑮𐑩𐑤 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑳𐑥𐑼 𐑑𐑲𐑥 + + + 𐑕𐑘𐑑 + 𐑕𐑘𐑑 + 𐑕𐑘𐑕𐑑 + + + + + 𐑰𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑑𐑲𐑥 + 𐑰𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑑𐑲𐑥 + 𐑰𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑳𐑥𐑼 𐑑𐑲𐑥 + + + 𐑰𐑘𐑑 + 𐑰𐑘𐑑 + 𐑰𐑘𐑕𐑑 + + + + + 𐑓𐑻𐑞𐑼-𐑰𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑑𐑲𐑥 + + + + + 𐑢𐑧𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑑𐑲𐑥 + 𐑢𐑧𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑑𐑨𐑯𐑛𐑼𐑛 𐑑𐑲𐑥 + 𐑢𐑧𐑕𐑑𐑼𐑯 𐑘𐑫𐑼𐑩𐑐𐑾𐑯 𐑕𐑳𐑥𐑼 𐑑𐑲𐑥 + + + 𐑢𐑘𐑑 + 𐑢𐑘𐑑 + 𐑢𐑘𐑕𐑑 + + + + + 𐑜𐑮𐑧𐑯𐑦𐑗 𐑥𐑰𐑯 𐑑𐑲𐑥 + + + 𐑜𐑥𐑑 + + + + + + + 0 𐑔𐑬𐑟𐑩𐑯𐑛 + 0 𐑔𐑬𐑟𐑩𐑯𐑛 + 00 𐑔𐑬𐑟𐑩𐑯𐑛 + 00 𐑔𐑬𐑟𐑩𐑯𐑛 + 000 𐑔𐑬𐑟𐑩𐑯𐑛 + 000 𐑔𐑬𐑟𐑩𐑯𐑛 + 0 𐑥𐑦𐑤𐑘𐑩𐑯 + 0 𐑥𐑦𐑤𐑘𐑩𐑯 + 00 𐑥𐑦𐑤𐑘𐑩𐑯 + 00 𐑥𐑦𐑤𐑘𐑩𐑯 + 000 𐑥𐑦𐑤𐑘𐑩𐑯 + 000 𐑥𐑦𐑤𐑘𐑩𐑯 + 0 𐑚𐑦𐑤𐑘𐑩𐑯 + 0 𐑚𐑦𐑤𐑘𐑩𐑯 + 00 𐑚𐑦𐑤𐑘𐑩𐑯 + 00 𐑚𐑦𐑤𐑘𐑩𐑯 + 000 𐑚𐑦𐑤𐑘𐑩𐑯 + 000 𐑚𐑦𐑤𐑘𐑩𐑯 + 0 𐑑𐑮𐑦𐑤𐑾𐑯 + 0 𐑑𐑮𐑦𐑤𐑾𐑯 + 00 𐑑𐑮𐑦𐑤𐑾𐑯 + 00 𐑑𐑮𐑦𐑤𐑾𐑯 + 000 𐑑𐑮𐑦𐑤𐑾𐑯 + 000 𐑑𐑮𐑦𐑤𐑾𐑯 + + + + + + + ¤#,##0.00 + + + ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) + + + + + + 𐑚𐑼𐑥𐑿𐑛𐑩𐑯 𐑛𐑪𐑤𐑼 + + + 𐑒𐑩𐑯𐑱𐑛𐑾𐑯 𐑛𐑪𐑤𐑼 + + + 𐑗𐑧𐑒 𐑒𐑩𐑮𐑵𐑯𐑩 + + + 𐑛𐑱𐑯𐑦𐑖 𐑒𐑮𐑴𐑯𐑩 + + + 𐑚𐑮𐑦𐑑𐑦𐑖 𐑐𐑬𐑯𐑛 + + + 𐑣𐑳𐑙𐑜𐑺𐑾𐑯 𐑓𐑪𐑮𐑦𐑯𐑑 + + + 𐑲𐑕𐑤𐑨𐑯𐑛𐑦𐑒 𐑒𐑮𐑴𐑯𐑩 + + + 𐑥𐑧𐑒𐑕𐑦𐑒𐑩𐑯 𐑐𐑱𐑕𐑴 + + + 𐑕𐑢𐑰𐑛𐑦𐑖 𐑒𐑮𐑴𐑯𐑩 + + + 𐑿𐑧𐑕 𐑛𐑪𐑤𐑼 + + + + {0}+ + + + {0} 𐑛𐑱 + {0} 𐑛𐑱𐑟 + 𐑑𐑱𐑒 𐑞 {0}𐑔 𐑮𐑲𐑑. + + + + + + 𐑛𐑧𐑒𐑱𐑛𐑟 + {0} 𐑛𐑧𐑒𐑱𐑛 + {0} 𐑛𐑧𐑒𐑱𐑛𐑟 + + + 𐑘𐑽𐑟 + {0} 𐑘𐑽 + {0} 𐑘𐑽𐑟 + {0} 𐑐𐑻 𐑘𐑽𐑟 + + + 𐑬𐑼𐑟 + + + 𐑥𐑦𐑯𐑦𐑑𐑕 + {0} 𐑥𐑦𐑯𐑦𐑑 + {0} 𐑥𐑦𐑯𐑦𐑑𐑕 + {0} 𐑐𐑻 𐑥𐑦𐑯𐑦𐑑 + + + 𐑕𐑧𐑒𐑩𐑯𐑛𐑟 + {0} 𐑕𐑧𐑒𐑩𐑯𐑛 + {0} 𐑕𐑧𐑒𐑩𐑯𐑛𐑟 + {0} 𐑐𐑻 𐑕𐑧𐑒𐑩𐑯𐑛 + + + 𐑒𐑦𐑤𐑪𐑥𐑦𐑑𐑼𐑟 + {0} 𐑒𐑦𐑤𐑪𐑥𐑦𐑑𐑼 + {0} 𐑒𐑦𐑤𐑪𐑥𐑦𐑑𐑼𐑟 + {0} 𐑐𐑻 𐑒𐑦𐑤𐑪𐑥𐑦𐑑𐑼 + + + 𐑥𐑦𐑑𐑼𐑟 + {0} 𐑥𐑦𐑑𐑼 + {0} 𐑥𐑦𐑑𐑼𐑟 + {0} 𐑐𐑻 𐑥𐑦𐑑𐑼𐑟 + + + 𐑛𐑧𐑕𐑦𐑥𐑦𐑑𐑼𐑟 + {0} 𐑛𐑧𐑕𐑦𐑥𐑦𐑑𐑼 + {0} 𐑛𐑧𐑕𐑦𐑥𐑦𐑑𐑼𐑟 + + + 𐑕𐑧𐑯𐑑𐑦𐑥𐑰𐑑𐑼𐑟 + {0} 𐑕𐑧𐑯𐑑𐑦𐑥𐑰𐑑𐑼 + {0} 𐑕𐑧𐑯𐑑𐑦𐑥𐑰𐑑𐑼𐑟 + {0} 𐑐𐑻 𐑕𐑧𐑯𐑑𐑦𐑥𐑰𐑑𐑼 + + + 𐑥𐑦𐑤𐑦𐑥𐑰𐑑𐑼𐑟 + {0} 𐑥𐑦𐑤𐑦𐑥𐑰𐑑𐑼 + {0} 𐑥𐑦𐑤𐑦𐑥𐑰𐑑𐑼𐑟 + + + 𐑥𐑲𐑒𐑮𐑴𐑥𐑰𐑑𐑼𐑟 + {0} 𐑥𐑲𐑒𐑮𐑴𐑥𐑰𐑑𐑼 + {0} 𐑥𐑲𐑒𐑮𐑴𐑥𐑰𐑑𐑼𐑟 + + + 𐑯𐑨𐑯𐑴𐑥𐑦𐑑𐑼𐑟 + {0} 𐑯𐑨𐑯𐑴𐑥𐑦𐑑𐑼 + {0} 𐑯𐑨𐑯𐑴𐑥𐑦𐑑𐑼𐑟 + + + 𐑐𐑰𐑒𐑴𐑥𐑦𐑑𐑼𐑟 + {0} 𐑐𐑰𐑒𐑴𐑥𐑦𐑑𐑼 + {0} 𐑐𐑰𐑒𐑴𐑥𐑦𐑑𐑼𐑟 + + + 𐑥𐑲𐑤𐑟 + {0} 𐑥𐑲𐑤 + {0} 𐑥𐑲𐑤𐑟 + + + 𐑘𐑸𐑛𐑟 + {0} 𐑘𐑸𐑛 + {0} 𐑘𐑸𐑛𐑟 + + + 𐑓𐑰𐑑 + {0} 𐑓𐑫𐑑 + {0} 𐑓𐑰𐑑 + {0} 𐑐𐑻 𐑓𐑫𐑑 + + + 𐑦𐑯𐑗𐑩𐑟 + {0} 𐑦𐑯𐑗 + {0} 𐑦𐑯𐑗𐑩𐑟 + {0} 𐑐𐑻 𐑦𐑯𐑗 + + + 𐑕𐑒𐑨𐑯𐑛𐑦𐑯𐑱𐑝𐑾𐑯 𐑥𐑲𐑤 + {0} 𐑕𐑒𐑨𐑯𐑛𐑦𐑯𐑱𐑝𐑾𐑯 𐑥𐑲𐑤 + {0} 𐑕𐑒𐑨𐑯𐑛𐑦𐑯𐑱𐑝𐑾𐑯 𐑥𐑲𐑤𐑟 + + + 𐑒𐑸𐑛𐑦𐑯𐑩𐑤 𐑛𐑦𐑮𐑧𐑒𐑖𐑩𐑯 + {0} 𐑰𐑕𐑑 + {0} 𐑯𐑹𐑔 + {0} 𐑕𐑬𐑔 + {0} 𐑢𐑧𐑕𐑑 + + + + + 𐑛𐑧𐑒 + {0} 𐑛𐑧𐑒 + {0} 𐑛𐑧𐑒 + + + 𐑘𐑽𐑟 + {0}/𐑘 + + + 𐑬𐑼𐑟 + + + 𐑥𐑦𐑯𐑟 + {0} 𐑥𐑦𐑯 + {0} 𐑥𐑦𐑯𐑟 + {0}/𐑥𐑦𐑯 + + + 𐑕𐑧𐑒𐑕 + {0} 𐑕𐑧𐑒 + {0} 𐑕𐑧𐑒𐑕 + {0}/𐑕 + + + 𐑥𐑲𐑤𐑟 + {0} 𐑥𐑲 + {0} 𐑥𐑲 + + + 𐑘𐑸𐑛𐑟 + {0} 𐑘𐑛 + {0} 𐑘𐑛 + + + 𐑓𐑰𐑑 + {0} 𐑓𐑑 + {0} 𐑓𐑑 + {0}/𐑓𐑑 + + + 𐑦𐑯𐑗𐑩𐑟 + {0} 𐑦𐑯 + {0} 𐑦𐑯 + {0}/𐑦𐑯 + + + 𐑛𐑦𐑮𐑧𐑒𐑖𐑩𐑯 + {0} 𐑰 + {0} 𐑯 + {0} 𐑕 + {0} 𐑢 + + + + + 𐑛𐑧𐑒 + {0}𐑛𐑧𐑒 + {0}𐑛𐑧𐑒 + + + {0}𐑘 + {0}𐑘 + {0}/𐑘 + + + 𐑬𐑼 + + + 𐑥𐑦𐑯 + {0}𐑥 + {0}𐑥 + {0}/𐑥𐑦𐑯 + + + 𐑕𐑧𐑒 + {0}𐑕 + {0}𐑕 + {0}/𐑕 + + + {0}𐑥𐑲 + {0}𐑥𐑲 + + + 𐑘𐑛 + {0}𐑘𐑛 + {0}𐑘𐑛 + + + 𐑓𐑑 + {0}′ + {0}′ + {0}/𐑓𐑑 + + + 𐑦𐑯 + {0}″ + {0}″ + {0}/𐑦𐑯 + + + 𐑛𐑦𐑮𐑧𐑒𐑖𐑩𐑯 + {0}𐑰 + {0}𐑯 + {0}𐑕 + {0}𐑢 + + + + + + {0} 𐑯 {1} + {0} 𐑯 {1} + + + {0} 𐑹 {1} + {0} 𐑹 {1} + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + 𐑘𐑧𐑕:𐑘 𐑯𐑴:𐑯 + + und en + informal + {0} + {0}{1} + + ·{title} {given} {given2} {surname} {generation}, {credentials} + + + ·{given-informal} {surname} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{given-monogram-allCaps}{given2-monogram-allCaps}{surname-monogram-allCaps} + + + ·{given-informal-monogram-allCaps}{surname-monogram-allCaps} + + + ·{given} {given2-initial} {surname} {generation}, {credentials} + + + ·{given-informal} {surname} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{surname-monogram-allCaps} + + + ·{given-informal-monogram-allCaps} + + + ·{given-initial}{given2-initial} {surname} + + + ·{given-informal} {surname-initial} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{surname-monogram-allCaps} + + + ·{given-informal-monogram-allCaps} + + + ·{surname} {title} {given} {given2} {generation}, {credentials} + + + ·{surname} {given-informal} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{surname-monogram-allCaps}{given-monogram-allCaps}{given2-monogram-allCaps} + + + ·{surname-monogram-allCaps}{given-informal-monogram-allCaps} + + + ·{surname} {given} {given2-initial} {generation}, {credentials} + + + ·{surname} {given-informal} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{surname-monogram-allCaps} + + + ·{given-informal-monogram-allCaps} + + + ·{surname} {given-initial}{given2-initial} + + + ·{surname} {given-initial} + + + ·{title} {surname} + + + ·{given-informal} + + + ·{surname-monogram-allCaps} + + + ·{given-informal-monogram-allCaps} + + + ·{surname-core}, {given} {given2} {surname-prefix} + + + ·{surname}, {given-informal} + + + ·{surname-core}, {given} {given2-initial} {surname-prefix} + + + ·{surname}, {given-informal} + + + ·{surname-core}, {given-initial}{given2-initial} {surname-prefix} + + + ·{surname}, {given-informal} + + + 𐑟𐑩𐑯𐑛𐑱𐑩 + + + 𐑲𐑮𐑰𐑯 + 𐑨𐑛𐑤𐑼 + + + 𐑥𐑺𐑦 𐑕𐑵 + 𐑣𐑱𐑥𐑦𐑖 + 𐑢𐑪𐑑𐑕𐑩𐑯 + + + 𐑥𐑮 + 𐑚𐑻𐑑𐑦 + 𐑣𐑧𐑯𐑮𐑦 𐑮𐑪𐑚𐑼𐑑 + ∅∅∅ + 𐑢𐑵𐑕𐑑𐑼 + ∅∅∅ + 𐑡𐑼 + 𐑥-𐑐 + + + 𐑕𐑦𐑯𐑚𐑨𐑛 + + + 𐑒𐑧𐑑𐑩 + 𐑥𐑦𐑤𐑼 + + + 𐑑𐑕𐑧𐑑𐑕𐑰𐑤𐑾 + 𐑣𐑱𐑥𐑦𐑖 + + + 𐑐𐑮𐑓 𐑛𐑼 + 𐑝𐑪𐑯 + 𐑚𐑮𐑰𐑤 + 𐑜𐑪𐑯𐑔𐑭𐑤𐑧𐑔 𐑛𐑪𐑥𐑦𐑙𐑜𐑴 + 𐑡𐑼 + 𐑥-𐑛 𐑛𐑛𐑕 + + diff --git a/make/data/cldr/common/main/en_UA.xml b/make/data/cldr/common/main/en_UA.xml new file mode 100644 index 00000000000..9e70011d6fb --- /dev/null +++ b/make/data/cldr/common/main/en_UA.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + , +   + + + diff --git a/make/data/cldr/common/main/en_US_POSIX.xml b/make/data/cldr/common/main/en_US_POSIX.xml index ce9b24ed41b..5e05f78e337 100644 --- a/make/data/cldr/common/main/en_US_POSIX.xml +++ b/make/data/cldr/common/main/en_US_POSIX.xml @@ -45,6 +45,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ 0.00 + ¤ 0.00 + 0.00 diff --git a/make/data/cldr/common/main/eo.xml b/make/data/cldr/common/main/eo.xml index e774c2af1ab..250a1dbeef7 100644 --- a/make/data/cldr/common/main/eo.xml +++ b/make/data/cldr/common/main/eo.xml @@ -14,530 +14,573 @@ CLDR data files are interpreted according to the LDML specification (http://unic afara abĥaza - aĉea - dangba - adigea + aĉea + dangba + adigea afrikansa - ajnua - akana - aleuta - sud-altaja + ajnua + akana + aleuta + sud-altaja amhara - aragona - angika + aragona + angika + araba levantenia araba - araba moderna norma - mapuĉa - arapaha - araba naĝda + araba moderna norma + mapuĉa + arapaha + araba naĝda asama - astura - atikameka - avara - avadhia + astura + atikameka + avara + avadhia ajmara azerbajĝana - azera + azera baŝkira - balia - basaa + baluĉa + balia + basaa belorusa - bemba - benaa + bemba + batavia + benaa bulgara - harjana - boĝpura - bislamo - edoa - siksika - aniia - bambara + harjana + boĝpura + Bislamo + edoa + nigrapieda + aniia + bambara bengala tibeta + baĥtiara bretona - bodoa - bosna - buĝia - bilena + bodoa + bosna + burjata + buĝia + bilena kataluna - kajuga - ĉakma - ĉeĉena - cebua - kiga - ĉamora - ĉuka - maria - ĉakta - ĉipevajana - ĉeroka - ĉejena - sorana - kurda, sorana - kurda centra - ĉilkotina + kajuga + ĉakma + ĉeĉena + cebua + kigaa + ĉamora + ĉuuka + maria + ĉaktaa + ĉipevajana + ĉeroka + ĉejena + kurda centra + kurda, centra + kurda, sorana + ĉilkotina korsika - miĉifa - kria jakob-golfa suda - kria preria - kria jakob-golfa norda - kria alka - algonkena (Norda Karolino) + kopta + miĉifa + kria jakob-golfa suda + kria preria + kria jakob-golfa norda + kria alka + algonkena (Norda Karolino) ĉeĥa - kria marĉa - malnovslava - ĉuvaŝa + kria marĉa + malnovslava + ĉuvaŝa kimra dana - dakotaa - dargva - taitaa + dakota + dargva + taitaa germana - germana aŭstra - germana svisa - dogriba - zarmaa - dogra - malsuprasoraba - dualaa - maldiva - djola - dzonko - dazaa - embua - evea - ibibioefika - ekaĝuka + germana aŭstra + germana svisa + dogriba + zarmaa + dogra + malsuprasoraba + dualaa + maldiva + djola + Dzonko + dazaa + embua + evea + efika + ekaĝuka greka angla - angla aŭstralia - angla kanada - angla brita - angla usona + angla aŭstralia + angla kanada + angla brita + angla usona Esperanto hispana - hispana amerika - hispana eŭropa - hispana meksika + hispana amerika + hispana eŭropa + hispana meksika estona eŭska - eunda + eunda persa - daria - fula + fula finna - filipina + filipina fiĝia feroa - fonua + fonua franca - franca kanada - franca svisa - kaĵun-franca - nord-frisa - friula - okcident-frisa + franca kanada + franca svisa + kaĵun-franca + nord-frisa + friula + okcident-frisa irlanda - gaa - skot-gaela - geeza - kiribata + skot-gaela + geeza + kiribata galega gvarania - gorontala - svisgermana + gorontala + svisgermana guĝarata - gusia - manksa - gviĉina + gusia + manksa + gviĉina haŭsa - haida + haida havaja - sud-haida + sud-haida hebrea - hinda - hiligajnona - mjaŭa + hindia + hindia (latina) + hinglish + hiligajnona + hmonga + verd-hmonga kroata - suprasoraba + suprasoraba haitia kreola hungara - hupa - halkomelema + hupa + halkomelema armena - herera - Interlingvao - ibana - ibibia + herera + Interlingvao + ibana + ibibia indonezia - Interlingveo - igba - jia - eskima - inuvialuktuna - iloka - inguŝa - Ido + Interlingveo + igba + jia + injupiaka + inuvialuktuna + iloka + inguŝa + Ido islanda itala - inuita + inuktituta japana - Loĵbano - kimaĉame + Loĵbano + ĉaga (Kimaĉame) java kartvela - kabila - kaĉina - kambaa - kabarda - makonda - kaboverda kreola - malinka (Koro) - kainganga + karakalpaka + kabila + kaĉina + kambaa + kabarda + makonda + kaboverda kreola + kekĉia + malinka (Koro) + kainganga kasia - kikuja - kuanjama + kikuja + kuanjama kazaĥa gronlanda - kalenĝina + kalenĝina kmera - kimbunda + kimbunda kanara korea - konkana - kpelea - kanura - karaĉaj-balkara - karela - kuruksa + konkana + kpelea + kanura + karaĉaj-balkara + karela + kuruksa kaŝmira - ŝambaa - kolonja + ŝambaa + kolonja kurda - kumika - komia - kornvala + kurda + kurmanĉa + kumika + komia + kornvala kirgiza - latino - judhispana - rangia + Latino + judhispana + rangia luksemburga - lezga - ganda - limburga - ligura - lilueta - lakota - lombarda + lezga + ganda + limburga + ligura + lilueta + lakota + ladina + lombarda lingala laŭa - luiziana kreola - lozia - nord-lura + luiziana kreola + lozia + nord-lura litova - katanga-luba - kasaja-luba - lundaa - lua - luhia + latgala + katanga-luba + kasaja-luba + lundaa + lua + luhia latva - madura - magaha - majtila - makasara - masaja - mokŝa - mendea - merua - maŭrica kreola + laza + madura + magaha + majtila + makasara + masaja + mokŝa + mendea + merua + maŭricia kreola malagasa - makua (Meetto) - marŝala + makua (Meetto) + marŝala maoria - mikmaka - minankabaŭa + mikmaka + minankabaŭa makedona malajalama mongola - manipura - inua - mohoka - mosia + manipura + inua + mohoka + mosia marata malaja malta - mundanga - pluraj lingvoj - krika - miranda + mundanga + pluraj lingvoj + krika + miranda + blank-hmonga birma - erzja - mazandarana + erzja + mazandarana naura - napola - nama + napola + nama dannorvega - nord-matabela - platgermana + nord-matabela + platgermana nepala - nevara - ndonga - niasa - niua + nevara + ndonga + niasa + niua nederlanda - flandra + flandra novnorvega norvega - nogaja - N’Ko - sud-matabela - nord-sota - nuera - navaha - njanĝa - njankora + nogaja + N’Ko + sud-matabela + nord-sota + nuera + navaha + njanĝa + njankora okcitana - oĝibva nordokcidenta - oĝibva centra - oĝibva okcidenta - okanagana + oĝibva nordokcidenta + oĝibva centra + oĝibva okcidenta + okanagana oroma - orijo - oseta + Orijo + oseta panĝaba - pangasina - pampanga - Papiamento - palaŭa - niĝeria piĝino - piĵina + pangasina + pampanga + Papiamento + palaŭa + niĝeria piĝino + palia + Piĵino pola + piemonta malesita-pasamakvodja - prusa - paŝtua + prusa + paŝtua portugala - portugala brazila - portugala eŭropa + portugala brazila + portugala eŭropa keĉua - raĝastana - rapanuia - maoria kukinsula - rohinĝa + kiĉea + raĝastana + rapanuia + maoria kukinsula + rohinĝa + rifa romanĉa burunda rumana - kiromba + moldava + ĉaga (Kirombo) rusa - arumana + arumana ruanda - rua - sanskrito - sandavea - jakuta - samburua - santala - gambaja - sarda - sicilia - skota + ĉaga (Rwa) + Sanskrito + sandavea + jakuta + samburua + santala + gambaja + sangua + sarda + sicilia + skota sinda - nord-samea + sud-kurda + nord-samea sangoa - serbo-Kroata - ŝelha - ŝana + ĵemajtia + serbokroata + ŝelha + ŝana sinhala + sidama slovaka + saraika slovena - sud-laŝucida + sud-laŝucida samoa - anar-samea - skolt-samea + sud-samea + lule-samea + anar-samea + skolt-samea ŝona - soninka + soninka somala albana serba - surinama + surinama svazia + saha sota - saliŝa nord-markola + saliŝa nord-markola sunda - sukuma + sukuma sveda svahila - maorea - siria - silezi-pola + komora + siria + silezi-pola tamila - sud-tuĉona + sud-tuĉona telugua - temna - tesa - tetuna + temna + tesa + tetuna taĝika - tagiŝa + tagiŝa taja - taltana + taltana tigraja - tigrea + tigrea turkmena tagaloga - klingona - tlingita + klingona + tlingita cvana - tongana - Tokipono - Tokpisino + tonga + Tokipono + Tokpisino turka - sedeka + sedeka + torvalia conga tatara - nord-tuĉona - tumbuka - tuvala - tahitia - tuva - tamaziĥta mez-atlasa - udmurta + nord-tuĉona + tumbuka + tuvala + tahitia + tuva + tamaziĥta mez-atlasa + udmurta ujgura ukraina - ovimbunda + ovimbunda nekonata lingvo - urduo + Urduo uzbeka - vaja - vendaa - venecia + vaja + vendaa + venecia vjetnama - makua - Volapuko - kivunja - valona - germana valza - varaja + makua + Volapuko + ĉaga (Kivunjo) + valona + germana valza + velajtaa + varaja volofa - vua - kalmuka + vua + kalmuka ksosa - kangra + kangra soga - jida + judgermana joruba - nengatua - kantona - ĉina kantona + nengatua + kantona + ĉina kantona ĝuanga - tamaziĥta maroka norma + tamaziĥta maroka norma ĉina - ĉina, normlingvo + ĉina, normlingvo ĉina simpligita - ĉina normlingvo simpligita + ĉina normlingvo simpligita ĉina tradicia - ĉina normlingvo tradicia + ĉina normlingvo tradicia zulua - zunjia + zunjia nelingvaĵo - zazaa + zazaa - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mondo - Afriko - Nordameriko - Sudameriko - Oceanio - Okcidenta Afriko - Centra Ameriko - Orienta Afriko - Norda Afriko - Centra Afriko - Suda Afriko - Amerikoj - Norda Ameriko - Kariba regiono - Orienta Azio - Suda Azio - Sud-orienta Azio - Suda Eŭropo - Aŭstralazio - Melanezio - Mikronezia regiono - Polinezio - Azio - Centra Azio - Okcidenta Azio - Eŭropo - Orienta Eŭropo - Norda Eŭropo - Okcidenta Eŭropo - Subsahara Afriko - Latinameriko - Ascension + Afriko + Nordameriko + Sudameriko + Oceanio + Okcidenta Afriko + Centra Ameriko + Orienta Afriko + Norda Afriko + Centra Afriko + Suda Afriko + Amerikoj + Norda Ameriko + Kariba regiono + Orienta Azio + Suda Azio + Sud-orienta Azio + Suda Eŭropo + Aŭstralazio + Melanezio + Mikronezia regiono + Polinezio + Azio + Centra Azio + Okcidenta Azio + Eŭropo + Orienta Eŭropo + Norda Eŭropo + Okcidenta Eŭropo + Subsahara Afriko + Latinameriko + Ascension Andoro Unuiĝintaj Arabaj Emirlandoj Afganujo - Antigvo kaj Barbudo + Antigvo kaj Barbudo Angvilo Albanujo Armenujo Angolo Antarkto Argentino - Usona Samoo + Usona Samoo Aŭstrujo Aŭstralio Arubo - Alando + Alando Azerbajĝano - Bosnujo kaj Hercegovino + Bosnujo kaj Hercegovino Barbado Bangladeŝo Belgujo @@ -546,25 +589,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic Barejno Burundo Benino - Sankta Bartolomeo + Sankta Bartolomeo Bermudoj Brunejo Bolivio - Kariba Nederlando + Kariba Nederlando Brazilo Bahamoj Butano - Buvetinsulo + Buvetinsulo Bocvano Belorusujo Belizo Kanado - Kokosinsuloj - Kongo Kinŝasa - Demokratia Respubliko Kongo - Centr-Afrika Respubliko - Kongo Brazavila - Respubliko Kongo + Kokosinsuloj + Kongo Kinŝasa + Demokratia Respubliko Kongo + Centr-Afriko + Kongo Brazavila + Respubliko Kongo Svisujo Ebur-Bordo Kukinsuloj @@ -572,46 +615,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kameruno Ĉinujo Kolombio - Klipertono - Sark + Klipertono + Sark Kostariko Kubo - Kaboverdo - Kuracao - Kristnaskinsulo + Kaboverdo + Kuracao + Kristnaskinsulo Kipro Ĉeĥujo - Ĉeĥa Respubliko + Ĉeĥa Respubliko Germanujo - Diego Garcia + Diego Garcia Ĝibutio Danujo Dominiko - Domingo + Dominika Respubliko Alĝerio - Ceŭto kaj Melilo + Ceŭto kaj Melilo Ekvadoro Estonujo - Egiptujo + Egiptujo Okcidenta Saharo Eritreo Hispanujo Etiopujo - Eŭropa Unio - Eŭrozono + Eŭropa Unio + Eŭrozono Finnlando - Fiĝoj - Falklandoj + Fiĝio + Falklandoj Mikronezio Ferooj Francujo Gabono Unuiĝinta Reĝlando - Britujo + Britujo Grenado Kartvelujo - Franca Gviano - Gernezejo + Franca Gujano + Gernezejo Ganao Ĝibraltaro Gronlando @@ -625,44 +668,44 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gvamo Gvineo-Bisaŭo Gujano - Honkongo + Honkongo (SAR de Ĉinujo) Herda kaj Makdonaldaj Insuloj Honduro Kroatujo Haitio Hungarujo - Kanarioj + Kanarioj Indonezio Irlando Israelo - Mankinsulo + Manksinsulo Hindujo - Brita Hindoceana Teritorio - Ĉagos-arĥipelago + Brita Hindoceana Teritorio + Ĉagos-arĥipelago Irako Irano Islando Italujo - Ĵerzejo + Ĵerzejo Jamajko Jordanio Japanujo Kenjo - Kirgizujo + Kirgizujo Kamboĝo Kiribato Komoroj - Sankta Kristoforo kaj Neviso - Nord-Koreo - Sud-Koreo + Sankta Kristoforo kaj Neviso + Nord-Koreujo + Sud-Koreujo Kuvajto - Kejmanoj - Kazaĥujo + Kajmana Insularo + Kazaĥujo Laoso Libano - Sankta Lucio + Sankta Lucio Liĥtenŝtejno - Srilanko + Srilanko Liberio Lesoto Litovujo @@ -672,19 +715,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Maroko Monako Moldavujo - Montenegro - Saint-Martin + Montenegro + Saint-Martin Madagaskaro Marŝaloj - Nord-Makedonujo + Nord-Makedonujo Malio - Birmo + Birmo Mongolujo - Makao + Makao (SAR de Ĉinujo) Nord-Marianoj Martiniko - Maŭritanujo - Moncerato + Maŭritanio + Moncerato Malto Maŭricio Maldivoj @@ -712,143 +755,242 @@ CLDR data files are interpreted according to the LDML specification (http://unic Filipinoj Pakistano Pollando - Sankta Piero kaj Mikelono + Sankta Piero kaj Mikelono Pitkarna Insulo - Puertoriko - Palestino + Puertoriko + Palestinaj teritorioj Portugalujo - Palaŭo + Palaŭo Paragvajo Kataro - malproksimaj insuletoj de Oceanio + malproksimaj insuletoj de Oceanio Reunio Rumanujo - Serbujo + Serbujo Rusujo Ruando - Sauda Arabujo + Sauda Arabujo Salomonoj Sejŝeloj Sudano Svedujo Singapuro - Sankta Heleno + Sankta Heleno Slovenujo - Svalbardo kaj Janmajeno + Svalbardo kaj Janmajeno Slovakujo - Sieraleono - Sanmarino + Sieraleono + Sanmarino Senegalo Somalujo Surinamo - Sud-Sudano - Santomeo kaj Principeo + Sud-Sudano + Santomeo kaj Principeo Salvadoro - Sint-Maarten + Sint-Maarten Sirio Svazilando - Tristan da Cunha - Turkoj kaj Kajkoj + Tristan da Cunha + Turkoj kaj Kajkoj Ĉado - Francaj Sudaj Teritorioj - Togolando + Francaj Sudaj Teritorioj + Togolando Tajlando Taĝikujo - Tokelao - Orienta Timoro + Tokelao + Orienta Timoro Turkmenujo Tunizio Tongo Turkujo - Turkio Trinidado kaj Tobago Tuvalo Tajvano Tanzanio - Ukrainujo + Ukrainujo Ugando Usonaj malgrandaj insuloj - Unuiĝintaj Nacioj + Unuiĝintaj Nacioj Usono Urugvajo Uzbekujo Vatikano - Sankta Vincento kaj Grenadinoj + Sankta Vincento kaj Grenadinoj Venezuelo Britaj Virgulininsuloj Usonaj Virgulininsuloj - Vjetnamo + Vjetnamujo Vanuatuo Valiso kaj Futuno Samoo - pseŭdo-supersignoj - pseŭdo-inversdirekta - Kosovo + pseŭdo-supersignoj + pseŭdo-inversdirekta + Kosovo Jemeno Majoto Sud-Afriko Zambio Zimbabvo - nekonata regiono + nekonata regiono - Arkaika - h-sistemo - x-sistemo + Arkaika + h-sistemo + x-sistemo - kalendaro - formo de valuto - ordigo - valuto + kalendaro + formo de valuto + ordigo + valuto + vidigo de miensimboloj + horloĝa sistemo (12- aŭ 24-hora) + stilo de linisalto + linisalto ene vortoj + mezur-sistemo + ciferoj + frazfino post mallongigo - budhaisma kalendaro - ĉina kalendaro - kopta kalendaro - korea kalendaro - etiopa kalendaro - gregoria kalendaro - juda kalendaro - islama kalendaro - tabela islama kalendaro - islama kalendaro (Umm al-Qura) - kalendaro ISO-8601 - japana kalendaro - persa kalendaro - kalendaro de Respubliko Ĉinujo - norma ordigo laŭ Unikodo - ĝeneral-uza serĉo - norma ordigo - eŭropaj ciferoj + budaisma kalendaro + budaisma + ĉina kalendaro + ĉina + kopta kalendaro + kopta + korea kalendaro + korea + etiopa kalendaro + etiopa + etiopa kalendaro (Amete Alem) + etiopa Amete Alem + gregoria kalendaro + gregoria + juda kalendaro + juda + islama kalendaro + islama + tabela islama kalendaro + tabela islama + islama kalendaro (Umm al-Qura) + islama Umm al-Qura + gregoria kalendaro (jaro unue) + japana kalendaro + japana + persa kalendaro + persa + kalendaro de Respubliko Ĉinujo + respublik-ĉina + kontista formo de valuto + kontista + norma formo de valuto + norma + norma ordigo laŭ Unikodo + norma laŭ Unikodo + ĝeneral-uza serĉo + serĉa + norma ordigo + norma + norma + miensimboloj + teksto + 12-hora sistemo (0–11) + 12 (0–11) + 12-hora sistemo (1–12) + 12 (1–12) + 24-hora sistemo (0–23) + 24 (0–23) + 24-hora sistemo (1–24) + 24 (1–24) + milda stilo de linisalto + milda + norma stilo de linisalto + norma + malmilda stilo de linisalto + malmilda + rompi ĉiujn + konservi ĉiujn + norma + konservi en frazoj + metra sistemo + metra + brita mezur-sistemo + brita + usona mezur-sistemo + usona + hind-arabaj ciferoj + hind-arabaj ciferoj etenditaj + armenaj ciferoj + armenaj ciferoj minusklaj + bengalaj ciferoj + ĉakmaj ciferoj + devanagaraj ciferoj + etiopaj ciferoj + ciferoj plenlarĝaj + kartvelaj ciferoj + grekaj ciferoj + grekaj ciferoj minusklaj + guĝarataj ciferoj + gurmukaj ciferoj + ĉinaj dekumaj ciferoj + simpligit-ĉinaj ciferoj + simpligit-ĉinaj financaj ciferoj + tradici-ĉinaj ciferoj + tradic-ĉinaj financaj ciferoj + hebreaj ciferoj + javaj ciferoj + japanaj ciferoj + japanaj financaj ciferoj + kmeraj ciferoj + kanaraj ciferoj + laŭaj ciferoj + eŭropaj ciferoj + malajalamaj ciferoj + manipuraj ciferoj + birmaj ciferoj + orijaj ciferoj + romaj ciferoj + romaj ciferoj minusklaj + tamilaj tradiciaj ciferoj + tamilaj ciferoj + teluguaj ciferoj + tajaj ciferoj + tibetaj ciferoj + vajaj ciferoj + ne + jes - metra - brita - usona + metra + brita + usona - Lingvo: {0} - Skribsistemo: {0} - Regiono: {0} + Lingvo: {0} + Skribsistemo: {0} + Regiono: {0} [a b c ĉ d e f g ĝ h ĥ i j ĵ k l m n o p r s ŝ t u ŭ v z] [q w x y] - [A B C Ĉ D E F G Ĝ H Ĥ I J Ĵ K L M N O P R S Ŝ T U Ŭ V Z] + [A B C Ĉ D E F G Ĝ H Ĥ I J Ĵ K L M N O P R S Ŝ T U V Z] [  , % ‰ + − 0 1 2 3 4 5 6 7 8 9] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] \{ \} /] - {0}… - …{0} + {0}… + …{0} + + « + » + - EEEE, 'la' d-'a' 'de' MMMM y G + EEEE, 'la' d-'a' 'de' MMMM y G @@ -865,104 +1007,125 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd - {1} {0} + {1} {0} - {1} 'je' {0} + {1} 'je' {0} + + + {1} 'je' {0} - {1} {0} + {1} {0} - {1} 'je' {0} + {1} 'je' {0} + + + {1} 'je' {0} - {1} {0} + {1} {0} + + + {1}, {0} + + + {1}, {0} - {1} {0} + {1} {0} - y G - d MMM y G - MMM y G - d MMM y G - E, d MMM y G - E, dd-MM - d MMM - E, d MMM - d MMMM - y G - y G - M y GGGGG - y-MM-dd GGGGG - E, y-MM-dd GGGGG - MMM y G - d MMM y G - E, d MMM y G - MMMM y G - QQQ 'de' y G - QQQQ 'de' y G + E h:mm a + E h:mm:ss a + y G + d MMM y G + E, d MMM y G + MMM y G + d MMM y G + E, d MMM y G + h:mm a + h:mm:ss a + HH'H' v + E, dd-MM + d MMM + E, d MMM + d MMMM + y G + y G + M y GGGGG + y-MM-dd GGGGG + E, y-MM-dd GGGGG + MMM y G + d MMM y G + E, d MMM y G + MMMM y G + QQQ 'de' y G + QQQQ 'de' y G + + h – h B + - h:mm – h:mm B - h:mm – h:mm B + h:mm – h:mm B + h:mm – h:mm B - d – d + d – d - y G – y G - y – y G + y G – y G + y – y G - MMM y GGGGG – MMM y GGGGG - MMM – MMM y GGGGG - MMM y – MMM y GGGGG + MMM y GGGGG – MMM y GGGGG + MMM – MMM y GGGGG + MMM y – MMM y GGGGG - d – d MMM y GGGGG - d MMM y GGGGG – d MMM y GGGGG - d MMM – d MMM y GGGGG - d MMM y – d MMM y GGGGG + d – d MMM y GGGGG + d MMM y GGGGG – d MMM y GGGGG + d MMM – d MMM y GGGGG + d MMM y – d MMM y GGGGG - E, d – E, d MMM y GGGGG - E, d MMM y GGGGG – E, d MMM y GGGGG - E, d MMM – E, d MMM y GGGGG - E, d MMM y – E, d MMM y GGGGG + E, d – E, d MMM y GGGGG + E, d MMM y GGGGG – E, d MMM y GGGGG + E, d MMM – E, d MMM y GGGGG + E, d MMM y – E, d MMM y GGGGG - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G - d MMM – d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d MMM – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, d – E, d MMM y G - E, d MMM y G – E, d MMM y G - E, d MMM – E, d MMM y G - E, d MMM y – E, d MMM y G + E, d – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G h–h a @@ -979,61 +1142,57 @@ CLDR data files are interpreted according to the LDML specification (http://unic h–h a v - M – M - - - MM-dd – MM-dd - MM-dd – MM-dd + M – M - E, MM-dd – E, MM-dd - E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd - MMM – MMM + MMM – MMM - d – d MMM - d MMM – d MMM + d – d MMM + d MMM – d MMM - E, d – E, d MMM - E, d MMM – E, d MMM + E, d – E, d MMM + E, d MMM – E, d MMM - y – y G + y – y G - y-MM – y-MM GGGGG - y-MM – y-MM GGGGG + y-MM – y-MM GGGGG + y-MM – y-MM GGGGG - y-MM-dd – y-MM-dd GGGGG - y-MM-dd – y-MM-dd GGGGG - y-MM-dd – y-MM-dd GGGGG + y-MM-dd – y-MM-dd GGGGG + y-MM-dd – y-MM-dd GGGGG + y-MM-dd – y-MM-dd GGGGG - E, y-MM-dd – E, y-MM-dd GGGGG - E, y-MM-dd – E, y-MM-dd GGGGG - E, y-MM-dd – E, y-MM-dd GGGGG + E, y-MM-dd – E, y-MM-dd GGGGG + E, y-MM-dd – E, y-MM-dd GGGGG + E, y-MM-dd – E, y-MM-dd GGGGG - MMM – MMM y G - MMM y – MMM y G + MMM – MMM y G + MMM y – MMM y G - d – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, d – E, d MMM y G - E, d MMM – E, d MMM y G - E, d MMM y – E, d MMM y G + E, d – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G - MMMM – MMMM y G - MMMM y – MMMM y G + MMMM – MMMM y G + MMMM y – MMMM y G @@ -1072,18 +1231,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - J - F - M - A - M - J - J - A - S - O - N - D + J + F + M + A + M + J + J + A + S + O + N + D @@ -1110,29 +1269,29 @@ CLDR data files are interpreted according to the LDML specification (http://unic - d - l - m - m - ĵ - v - s + d + l + m + m + ĵ + v + s - 1. jk. - 2. jk. - 3. jk. - 4. jk. + 1. jk. + 2. jk. + 3. jk. + 4. jk. - 1-a jarkvarono - 2-a jarkvarono - 3-a jarkvarono - 4-a jarkvarono + 1-a jarkvarono + 2-a jarkvarono + 3-a jarkvarono + 4-a jarkvarono @@ -1143,35 +1302,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic ptm - a - p + a + p - a - p + a + p - antaŭ nia erao - antaŭ Kristo - de nia erao - post Kristo + antaŭ nia erao + antaŭ Kristo + de nia erao + post Kristo - a.n.e. - a.K. - n.e. - p.K. + a.n.e. + a.K. + n.e. + p.K. - EEEE, 'la' d-'a' 'de' MMMM y + EEEE, 'la' d-'a' 'de' MMMM y @@ -1196,203 +1355,209 @@ CLDR data files are interpreted according to the LDML specification (http://unic - HH:mm:ss zzzz + HH:mm:ss zzzz Hmsszzzz - HH:mm:ss z + HH:mm:ss z - HH:mm:ss + HH:mm:ss - HH:mm + HH:mm - {1} {0} + {1} {0} - {1} 'je' {0} + {1} 'je' {0} + + + {1} 'je' {0} - {1} {0} + {1} {0} - {1} 'je' {0} + {1} 'je' {0} + + + {1} 'je' {0} - {1} {0} + {1}, {0} + + + {1}, {0} + + + {1}, {0} - {1} {0} + {1} {0} - y G - d MMM y G - MMM y G - d MMM y G - E, d MMM y G - E, MM-dd - MMM - d MMM - E, d MMM - d MMMM - W-'a' 'semajno' 'de' MMMM - W-'a' 'semajno' 'de' MMMM - E, y-MM-dd - MMM y - d MMM y - E, d MMM y - MMMM y - QQQ y - QQQQ 'de' y - w-'a' 'semajno' 'de' Y - w-'a' 'semajno' 'de' Y + E h:mm a + E h:mm:ss a + y G + d MMM y G + E, d MMM y G + MMM y G + d MMM y G + E, d MMM y G + HH'H' + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v + HH'H' v + E, MM-dd + MMM + d MMM + E, d MMM + d MMMM + W-'a' 'semajno' 'de' MMMM + W-'a' 'semajno' 'de' MMMM + E, y-MM-dd + MMM y + d MMM y + E, d MMM y + MMMM y + QQQ y + QQQQ 'de' y + w-'a' 'semajno' 'de' Y + w-'a' 'semajno' 'de' Y - d – d + d – d - y G – y G - y – y G + y G – y G + y – y G - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G - d – d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, d – E, d MMM y G - E, d MMM y G – E, d MMM y G - E, d MMM – E, d MMM y G - E, d MMM y – E, d MMM y G + E, d – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G - d – d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, d – E, d MMM y G - E, d MMM y G – E, d MMM y G - E, d MMM – E, d MMM y G - E, d MMM y – E, d MMM y G + E, d – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G - h a – h a - h – h a + h – h a - HH – HH + HH – HH - h:mm a – h:mm a - h:mm – h:mm a - h:mm – h:mm a + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a - HH:mm – HH:mm - HH:mm – HH:mm + HH:mm – HH:mm + HH:mm – HH:mm - h:mm a – h:mm a v - h:mm – h:mm a v - h:mm – h:mm a v + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v - HH:mm – HH:mm v - HH:mm – HH:mm v + HH:mm – HH:mm v + HH:mm – HH:mm v - h a – h a v - h – h a v + h – h a v - HH – HH v - - - MM-dd – MM-dd - MM-dd – MM-dd + HH–HH'H' v - E, MM-dd – E, MM-dd - E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd + E, MM-dd – E, MM-dd - MMM–MMM + MMM–MMM - d – d MMM - d MMM – d MMM + d – d MMM + d MMM – d MMM - E, d – E, d MMM - E, d MMM – E, d MMM + E, d – E, d MMM + E, d MMM – E, d MMM - y – y - - - y-MM – y-MM - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd + y – y - E, y-MM-dd – E, y-MM-dd - E, y-MM-dd – E, y-MM-dd - E, y-MM-dd – E, y-MM-dd + E, y-MM-dd – E, y-MM-dd + E, y-MM-dd – E, y-MM-dd + E, y-MM-dd – E, y-MM-dd - MMM – MMM y - MMM y – MMM y + MMM – MMM y + MMM y – MMM y - d–d MMM y - d MMM – d MMM y - d MMM y – d MMM y + d–d MMM y + d MMM – d MMM y + d MMM y – d MMM y - E, d – E, d MMM y - E, d MMM – E, d MMM y - E, d MMM y – E, d MMM y + E, d – E, d MMM y + E, d MMM – E, d MMM y + E, d MMM y – E, d MMM y - MMMM – MMMM y - MMMM y – MMMM y + MMMM – MMMM y + MMMM y – MMMM y @@ -1400,2371 +1565,2357 @@ CLDR data files are interpreted according to the LDML specification (http://unic - erao + erao - jaro - pasinta jaro - nuna jaro - venonta jaro + jaro + pasinta jaro + nuna jaro + venonta jaro - post {0} jaro - post {0} jaroj + post {0} jaro + post {0} jaroj - antaŭ {0} jaro - antaŭ {0} jaroj + antaŭ {0} jaro + antaŭ {0} jaroj - pasinta j. - nuna j. - venonta j. + pasinta j. + nuna j. + venonta j. - post {0} j. - post {0} j. + post {0} j. + post {0} j. - antaŭ {0} j. - antaŭ {0} j. + antaŭ {0} j. + antaŭ {0} j. - jarkvarono - pasinta jarkvarono - nuna jarkvarono - venonta jarkvarono + jarkvarono + pasinta jarkvarono + nuna jarkvarono + venonta jarkvarono - post {0} jarkvarono - post {0} jarkvaronoj + post {0} jarkvarono + post {0} jarkvaronoj - antaŭ {0} jarkvarono - antaŭ {0} jarkvaronoj + antaŭ {0} jarkvarono + antaŭ {0} jarkvaronoj - jk. + jk. - post {0} jk. - post {0} jk. + post {0} jk. + post {0} jk. - antaŭ {0} jk. - antaŭ {0} jk. + antaŭ {0} jk. + antaŭ {0} jk. - monato - pasinta monato - nuna monato - venonta monato + monato + pasinta monato + nuna monato + venonta monato - post {0} monato - post {0} monatoj + post {0} monato + post {0} monatoj - antaŭ {0} monato - antaŭ {0} monatoj + antaŭ {0} monato + antaŭ {0} monatoj - mon. - pasinta mon. - nuna mon. - venonta mon. + mon. + pasinta mon. + nuna mon. + venonta mon. - post {0} mon. - post {0} mon. + post {0} mon. + post {0} mon. - antaŭ {0} mon. - antaŭ {0} mon. + antaŭ {0} mon. + antaŭ {0} mon. - semajno - pasinta semajno - nuna semajno - venonta semajno + semajno + pasinta semajno + nuna semajno + venonta semajno - post {0} semajno - post {0} semajnoj + post {0} semajno + post {0} semajnoj - antaŭ {0} semajno - antaŭ {0} semajnoj + antaŭ {0} semajno + antaŭ {0} semajnoj - la semajno de {0} + la semajno de {0} - sem. - pasinta sem. - nuna sem. - venonta sem. + sem. + pasinta sem. + nuna sem. + venonta sem. - post {0} sem. - post {0} sem. + post {0} sem. + post {0} sem. - antaŭ {0} sem. - antaŭ {0} sem. + antaŭ {0} sem. + antaŭ {0} sem. - sem. de {0} + sem. de {0} - semajno de monato + semajno de monato - sem. de mon. + sem. de mon. - tago - hieraŭ - hodiaŭ - morgaŭ + tago + hieraŭ + hodiaŭ + morgaŭ - post {0} tago - post {0} tagoj + post {0} tago + post {0} tagoj - antaŭ {0} tago - antaŭ {0} tagoj + antaŭ {0} tago + antaŭ {0} tagoj - t. + t. + hier. + hod. + morg. - post {0} t. - post {0} t. + post {0} t. + post {0} t. - antaŭ {0} t. - antaŭ {0} t. + antaŭ {0} t. + antaŭ {0} t. - tago de jaro + tago de jaro + + + jartago - t. de j. + jartago - tago de semajno + tago de semajno - semajntago + semajntago - st. + st. - semajntago de monato + semajntago de monato - st. de monato + st. de monato + + + st. de mon. - pasinta dimanĉo - ĉi tiu dimanĉo - venonta dimanĉo + pasinta dimanĉo + ĉi tiu dimanĉo + venonta dimanĉo - post {0} dimanĉo - post {0} dimanĉoj + post {0} dimanĉo + post {0} dimanĉoj - antaŭ {0} dimanĉo - antaŭ {0} dimanĉoj + antaŭ {0} dimanĉo + antaŭ {0} dimanĉoj - pasinta di. - ĉi tiu di. - venonta di. + pasinta di. + ĉi tiu di. + venonta di. - post {0} di. - post {0} di. + post {0} di. + post {0} di. - antaŭ {0} di. - antaŭ {0} di. + antaŭ {0} di. + antaŭ {0} di. - pasinta d. - nuna d. - venonta d. + pasinta d. + nuna d. + venonta d. - post {0} d. - post {0} d. + post {0} d. + post {0} d. - antaŭ {0} d. - antaŭ {0} d. + antaŭ {0} d. + antaŭ {0} d. - pasinta lundo - ĉi tiu lundo - venonta lundo + pasinta lundo + ĉi tiu lundo + venonta lundo - post {0} lundo - post {0} lundoj + post {0} lundo + post {0} lundoj - antaŭ {0} lundo - antaŭ {0} lundoj + antaŭ {0} lundo + antaŭ {0} lundoj - pasinta lu. - ĉi tiu lu. - venonta lu. + pasinta lu. + ĉi tiu lu. + venonta lu. - post {0} lu. - post {0} lu. + post {0} lu. + post {0} lu. - antaŭ {0} lu. - antaŭ {0} lu. + antaŭ {0} lu. + antaŭ {0} lu. - pasinta l. - nuna l. - venonta l. + pasinta l. + nuna l. + venonta l. - post {0} l. - post {0} l. + post {0} l. + post {0} l. - antaŭ {0} l. - antaŭ {0} l. + antaŭ {0} l. + antaŭ {0} l. - pasinta mardo - ĉi tiu mardo - venonta mardo + pasinta mardo + ĉi tiu mardo + venonta mardo - post {0} mardo - post {0} mardoj + post {0} mardo + post {0} mardoj - antaŭ {0} mardo - antaŭ {0} mardoj + antaŭ {0} mardo + antaŭ {0} mardoj - pasinta ma. - ĉi tiu ma. - venonta ma. + pasinta ma. + ĉi tiu ma. + venonta ma. - post {0} ma. - post {0} ma. + post {0} ma. + post {0} ma. - antaŭ {0} ma. - antaŭ {0} ma. + antaŭ {0} ma. + antaŭ {0} ma. - pasinta ma. - nuna ma. - venonta ma. + pasinta ma. + nuna ma. + venonta ma. - pasinta merkredo - ĉi tiu merkredo - venonta merkredo + pasinta merkredo + ĉi tiu merkredo + venonta merkredo - post {0} merkredo - post {0} merkredoj + post {0} merkredo + post {0} merkredoj - antaŭ {0} merkredo - antaŭ {0} merkredoj + antaŭ {0} merkredo + antaŭ {0} merkredoj - pasinta me. - ĉi tiu me. - venonta me. + pasinta me. + ĉi tiu me. + venonta me. - post {0} me. - post {0} me. + post {0} me. + post {0} me. - antaŭ {0} me. - antaŭ {0} me. + antaŭ {0} me. + antaŭ {0} me. - pasinta me. - nuna me. - venonta me. + pasinta me. + nuna me. + venonta me. - pasinta ĵaŭdo - ĉi tiu ĵaŭdo - venonta ĵaŭdo + pasinta ĵaŭdo + ĉi tiu ĵaŭdo + venonta ĵaŭdo - post {0} ĵaŭdo - post {0} ĵaŭdoj + post {0} ĵaŭdo + post {0} ĵaŭdoj - antaŭ {0} ĵaŭdo - antaŭ {0} ĵaŭdoj + antaŭ {0} ĵaŭdo + antaŭ {0} ĵaŭdoj - pasinta ĵa. - ĉi tiu ĵa. - venonta ĵa. + pasinta ĵa. + ĉi tiu ĵa. + venonta ĵa. - post {0} ĵa. - post {0} ĵa. + post {0} ĵa. + post {0} ĵa. - antaŭ {0} ĵa. - antaŭ {0} ĵa. + antaŭ {0} ĵa. + antaŭ {0} ĵa. - pasinta ĵ. - nuna ĵ. - venonta ĵ. + pasinta ĵ. + nuna ĵ. + venonta ĵ. - post {0} ĵ. - post {0} ĵ. + post {0} ĵ. + post {0} ĵ. - antaŭ {0} ĵ. - antaŭ {0} ĵ. + antaŭ {0} ĵ. + antaŭ {0} ĵ. - pasinta vendredo - ĉi tiu vendredo - venonta vendredo + pasinta vendredo + ĉi tiu vendredo + venonta vendredo - post {0} vendredo - post {0} vendredoj + post {0} vendredo + post {0} vendredoj - antaŭ {0} vendredo - antaŭ {0} vendredoj + antaŭ {0} vendredo + antaŭ {0} vendredoj - pasinta ve. - ĉi tiu ve. - venonta ve. + pasinta ve. + ĉi tiu ve. + venonta ve. - post {0} ve. - post {0} ve. + post {0} ve. + post {0} ve. - antaŭ {0} ve. - antaŭ {0} ve. + antaŭ {0} ve. + antaŭ {0} ve. - pasinta v. - nuna v. - venonta v. + pasinta v. + nuna v. + venonta v. - post {0} v. - post {0} v. + post {0} v. + post {0} v. - antaŭ {0} v. - antaŭ {0} v. + antaŭ {0} v. + antaŭ {0} v. - pasinta sabato - ĉi tiu sabato - venonta sabato + pasinta sabato + ĉi tiu sabato + venonta sabato - post {0} sabato - post {0} sabatoj + post {0} sabato + post {0} sabatoj - antaŭ {0} sabato - antaŭ {0} sabatoj + antaŭ {0} sabato + antaŭ {0} sabatoj - pasinta sa. - ĉi tiu sa. - venonta sa. + pasinta sa. + ĉi tiu sa. + venonta sa. - post {0} sa. - post {0} sa. + post {0} sa. + post {0} sa. - antaŭ {0} sa. - antaŭ {0} sa. + antaŭ {0} sa. + antaŭ {0} sa. - pasinta s. - nuna s. - venonta s. + pasinta s. + nuna s. + venonta s. - post {0} s. - post {0} s. + post {0} s. + post {0} s. - antaŭ {0} s. - antaŭ {0} s. + antaŭ {0} s. + antaŭ {0} s. - tagotempo + tagtempo - mateno / posttagmezo / vespero + tagtempo + + + tagtempo - horo - nuna horo + horo + nuna horo - post {0} horo - post {0} horoj + post {0} horo + post {0} horoj - antaŭ {0} horo - antaŭ {0} horoj + antaŭ {0} horo + antaŭ {0} horoj - h + h - post {0} h - post {0} h + post {0} h + post {0} h - antaŭ {0} h - antaŭ {0} h + antaŭ {0} h + antaŭ {0} h - minuto - nuna minuto + minuto + nuna minuto - post {0} minuto - post {0} minutoj + post {0} minuto + post {0} minutoj - antaŭ {0} minuto - antaŭ {0} minutoj + antaŭ {0} minuto + antaŭ {0} minutoj - min. + min. - post {0} min. - post {0} min. + post {0} min. + post {0} min. - antaŭ {0} min. - antaŭ {0} min. + antaŭ {0} min. + antaŭ {0} min. - min + min - post {0} min - post {0} min + post {0} min + post {0} min - antaŭ {0} min - antaŭ {0} min + antaŭ {0} min + antaŭ {0} min - sekundo - nun + sekundo + nun - post {0} sekundo - post {0} sekundoj + post {0} sekundo + post {0} sekundoj - antaŭ {0} sekundo - antaŭ {0} sekundoj + antaŭ {0} sekundo + antaŭ {0} sekundoj - sek. + sek. - post {0} sek. - post {0} sek. + post {0} sek. + post {0} sek. - antaŭ {0} sek. - antaŭ {0} sek. + antaŭ {0} sek. + antaŭ {0} sek. - s + s - post {0} s - post {0} s + post {0} s + post {0} s - antaŭ {0} s - antaŭ {0} s + antaŭ {0} s + antaŭ {0} s - horzono + horzono - zono + zono - UTC{0} - UTC - tempo de {0} - somera tempo de {0} - norma tempo de {0} + UTC{0} + UTC + UTC+? + tempo: {0} + {0} (somera tempo) + {0} (norma tempo) - universala tempo kunordigita + universala tempo kunordigita - nekonata urbo + nekonata loko - Andoro + Andoro - Dubajurbo + Dubajurbo - Kabulo + Kabulo - Antigvo + Antigvo - Angvilo + Angvilo - Tirano + Tirano - Erevano + Erevano - Luando - - - Showa - - - Río Gallegos + Luando - Saltaurbo - - - Tucumán + Saltaurbo - Kordobo + Kordobo - Bonaero + Bonaero - Pagopago + Pagopago - Vieno + Vieno - Perto + Perto - Darvino + Darvino - Adelajdo + Adelajdo - Melburno + Melburno - Hobarto + Hobarto - Sidnejo + Sidnejo - Brisbano + Brisbano - Makvora insulo + Makvora insulo - Arubo + Arubo - Bakuo + Bakuo - Barbado + Barbado - Dako + Dako - Bruselo + Bruselo - Vagaduguo + Vagaduguo - Sofio + Sofio - Barejno + Barejno - Buĵumburo + Buĵumburo - Portonovo + Portonovo - Sankta Bartolomeo + Sankta Bartolomeo - Bermudoj + Bermudoj - Brunejo - - - Eirunepé + Brunejo - Manaŭso - - - Cuiabá - - - Santarém + Manaŭso - Belemo - - - Araguaína + Belemo - Sanpaŭlo + Sanpaŭlo - Bahio + Bahio - Fortalezo - - - Maceió - - - Fernando de Noronha + Fortalezo - Nasaŭo + Nasaŭo - Timbuo + Timbuo - Gaborono + Gaborono - Minsko + Minsko - Belizo + Belizo - Vankuvero + Vankuvero - Edmontono + Edmontono - Kembriĝa Golfo + Kembriĝa Golfo - Vinipego + Vinipego - Ikaluito + Ikaluito - Monktono + Monktono - Halifakso + Halifakso - Kokosinsuloj + Kokosinsuloj - Kinŝaso + Kinŝaso - Lubumbaŝo + Lubumbaŝo - Bango + Bango - Brazavilo + Brazavilo - Zuriko + Zuriko - Abiĝano + Abiĝano - Rarotongo + Rarotongo - Paskinsulo + Paskinsulo - Dualao + Dualao - Urumĉio + Urumĉio - Ŝanhajo + Ŝanhajo - Bogoto + Bogoto - Kostariko + Kostariko - Havano + Havano - Kaboverdo + Kaboverdo - Kuracao + Kuracao - Kristnaskinsulo + Kristnaskinsulo - Nikozio + Nikozio - Prago + Prago - Büsingen am Hochrhein + Büsingen am Hochrhein - Berlino + Berlino - Ĝibutio + Ĝibutio - Kopenhago + Kopenhago - Dominiko + Dominiko - Sankta Domingo + Sankta Domingo - Alĝero + Alĝero - Galapagoj + Galapagoj - Talino + Talino - Kairo + Kairo - Ajuno + Ajuno - Asmero + Asmero - Kanarioj + Kanarioj - Ceŭto + Ceŭto - Madrido + Madrido - Adisabebo + Adisabebo - Helsinko + Helsinko - Fiĝio + Fiĝio - Stanlejo + Stanlejo - Ĉuuk + Ĉuuk - Ponape + Ponape - Ferooj + Ferooj - Parizo + Parizo - Librevilo + Librevilo - brita somera tempo + brita somera tempo - Londono + Londono - Grenado + Grenado - Tbiliso + Tbiliso - Kajeno + Kajeno - Gernezejo + Gernezejo - Akrao + Akrao - Ĝibraltaro + Ĝibraltaro - Qaanaaq + Qaanaaq - Nuko + Nuko - Banjulo + Banjulo - Konakrio + Konakrio - Gvadelupo + Gvadelupo - Ateno + Ateno - Sud-Georgio + Sud-Georgio - Gvatemalo + Gvatemalo - Gvamo + Gvamo - Bisaŭo + Bisaŭo - Gujano + Gujano - Honkongo + Honkongo - Tegucigalpo + Tegucigalpo - Zagrebo + Zagrebo - Portoprinco + Portoprinco - Budapeŝto + Budapeŝto - Ĝakarto + Ĝakarto - irlanda norma tempo + irlanda norma tempo - Dublino + Dublino - Jerusalemo + Jerusalemo - Mankinsulo + Manksinsulo - Kolkato + Kolkato - Ĉagosoj + Ĉagosoj - Bagdado + Bagdado - Teherano + Teherano - Rejkjaviko + Rejkjaviko - Romo + Romo - Ĵerzejo + Ĵerzejo - Jamajko + Jamajko - Amano + Amano - Tokio + Tokio - Najrobio + Najrobio - Biŝkeko + Biŝkeko - Pnompeno + Pnompeno + + + Kanton-insulo - Taravo + Taravo - Komoroj + Komoroj - Sankta Kristoforo + Sankta Kristoforo - Pjongjango + Pjongjango - Seulo + Seulo - Kuvajto + Kuvajto - Kajmanoj + Kajmanoj - Aktau + Aktau - Oralo + Oralo - Atirau + Atirau - Aktobe + Aktobe - Kostanaj + Kostanaj - Kizilordo + Kizilordo - Almato + Almato - Vjentiano + Vjentiano - Bejruto + Bejruto - Sankta Lucio + Sankta Lucio - Vaduzo + Vaduzo - Kolombo + Kolombo - Monrovio + Monrovio - Maseruo + Maseruo - Vilno + Vilno - Luksemburgo + Luksemburgo - Rigo + Rigo - Tripolo + Tripolo - Kazablanko + Kazablanko - Monako + Monako - Kiŝinevo + Kiŝinevo - Podgorico + Podgorico - Marigoto + Marigoto - Skopjo + Skopjo - Ranguno + Ranguno - Ĥovd + Ĥovd - Ulanbatoro + Ulanbatoro - Makao + Makao - Saipano + Saipano - Martiniko + Martiniko - Nuakŝoto + Nuakŝoto - Moncerato + Moncerato - Malto + Malto - Maŭricio + Maŭricio - Maldivoj - - - Mazatlán + Maldivoj - Monterejo + Monterejo - Meksikurbo + Meksikurbo - Merido + Merido - Kankuno + Kankuno - Kualalumpuro + Kualalumpuro - Vindhuko + Vindhuko - Numeo + Numeo - Niamejo + Niamejo - Norfolkinsulo + Norfolkinsulo - Lagoso + Lagoso - Managvo + Managvo - Amsterdamo + Amsterdamo - Katmanduo + Katmanduo - Nauro + Nauro - Niuo + Niuo - Ĉathamo + Ĉathamo - Aŭklando + Aŭklando - Maskato + Maskato - Panamo + Panamo - Limo + Limo - Tahitio + Tahitio - Markizinsuloj + Markizinsuloj - Manilo + Manilo - Karaĉio + Karaĉio - Varsovio + Varsovio - Mikelono + Mikelono - Pitkarna Insulo + Pitkarna Insulo - Puertoriko + Puertoriko - Gazao + Gazao - Hebrono + Hebrono - Acoroj + Acoroj - Madejro + Madejro - Lisbono + Lisbono - Palaŭo + Palaŭo - Asunciono + Asunciono - Kataro + Kataro - Reunio + Reunio - Bukareŝto + Bukareŝto - Beogrado + Beogrado - Kaliningrado + Kaliningrado - Moskvo + Moskvo - Volgogrado + Volgogrado - Astraĥano + Astraĥano - Uljanovsko + Uljanovsko - Jekaterinburgo + Jekaterinburgo - Omsko + Omsko - Novosibirsko + Novosibirsko - Novokuznecko + Novokuznecko - Krasnojarsko + Krasnojarsko - Irkutsko + Irkutsko - Ĉita + Ĉita - Jakutsko + Jakutsko - Vladivostoko + Vladivostoko - Ĥandiga + Ĥandiga - Saĥaleno + Saĥaleno - Ustnero + Ustnero - Srednekolimsk + Srednekolimsk - Kamĉatko + Kamĉatko - Anadir + Anadir - Kigalo + Kigalo - Riado - - - Mahé + Riado - Ĥartumo + Ĥartumo - Stokholmo + Stokholmo - Singapuro + Singapuro - Sankta Heleno + Sankta Heleno - Ljubljano + Ljubljano - Longjerurbo + Longjerurbo - Bratislavo + Bratislavo - Fritaŭno + Fritaŭno - Sanmarino + Sanmarino - Dakaro + Dakaro - Mogadiŝo + Mogadiŝo - Ĝubao + Ĝubao - Santomeo + Santomeo - Salvadoro + Salvadoro - Damasko + Damasko - Mbabano + Mbabano - Granda Turko + Granda Turko - Niĝameno + Niĝameno - Kergelenoj + Kergelenoj - Lomeo + Lomeo - Bankoko + Bankoko - Duŝanbeo + Duŝanbeo - Dilo + Dilo - Aŝĥabado + Aŝĥabado - Tunizo + Tunizo - Istanbulo + Istanbulo - Portospeno + Portospeno - Funafutio + Funafutio - Tajpeo + Tajpeo - Daresalamo + Daresalamo - Kievo + Kievo - Simferopolo + Simferopolo - Kampalo + Kampalo - Midvejinsuloj + Midvejinsuloj - Vejkinsulo + Vejkinsulo - Losanĝeleso + Losanĝeleso - Fenikso + Fenikso - Denvero + Denvero - Beulah, Norda Dakoto + Beulah, Norda Dakoto - New Salem, Norda Dakoto + New Salem, Norda Dakoto - Center, Norda Dakoto + Center, Norda Dakoto - Ĉikago + Ĉikago - Vincennes, Indianao + Vincennes, Indianao - Petersburg, Indianao + Petersburg, Indianao - Tell City, Indianao + Tell City, Indianao - Knox, Indianao + Knox, Indianao - Winamac, Indianao + Winamac, Indianao - Marengo, Indianao + Marengo, Indianao - Indianapolo, Indianao + Indianapolo, Indianao - Vevay, Indianao + Vevay, Indianao - Monticello, Kentukio + Monticello, Kentukio - Detrojto + Detrojto - Novjorko + Nov-Jorko - Samarkando + Samarkando - Taŝkento + Taŝkento - Vatikano + Vatikano - Sankta Vincento + Sankta Vincento - Karakaso + Karakaso - Sankta Tomaso + Sankta Tomaso - Hoĉimino + Hoĉimino - Valiso + Valiso - Apio + Apio - Adeno + Adeno - Majoto + Majoto - Johanesburgo + Johanesburgo - Lusako + Lusako - Harareo + Harareo - afgana tempo + afgana tempo - centrafrika tempo + centrafrika tempo - orientafrika tempo + orientafrika tempo - sudafrika tempo + sudafrika tempo - okcidentafrika tempo - okcidentafrika norma tempo - okcidentafrika somera tempo + okcidentafrika tempo - alaska tempo - alaska norma tempo - alaska somera tempo + alaska tempo + alaska norma tempo + alaska somera tempo - amazonia tempo - amazonia norma tempo - amazonia somera tempo + amazona tempo + amazona norma tempo + amazona somera tempo - centra nordamerika tempo - centra nordamerika norma tempo - centra nordamerika somera tempo + centra nordamerika tempo + centra nordamerika norma tempo + centra nordamerika somera tempo - orienta nordamerika tempo - orienta nordamerika norma tempo - orienta nordamerika somera tempo + orienta nordamerika tempo + orienta nordamerika norma tempo + orienta nordamerika somera tempo - montara nordamerika tempo - montara nordamerika norma tempo - montara nordamerika somera tempo + montara nordamerika tempo + montara nordamerika norma tempo + montara nordamerika somera tempo - pacifika nordamerika tempo - pacifika nordamerika norma tempo - pacifika nordamerika somera tempo + pacifika nordamerika tempo + pacifika nordamerika norma tempo + pacifika nordamerika somera tempo - tempo: Apio - Apio (norma tempo) - Apio (somera tempo) + samoa tempo + samoa norma tempo + samoa somera tempo - araba tempo - araba norma tempo - araba somera tempo + araba tempo + araba norma tempo + araba somera tempo - argentina tempo - argentina norma tempo - argentina somera tempo + argentina tempo + argentina norma tempo + argentina somera tempo - okcident-argentina tempo - okcident-argentina norma tempo - okcident-argentina somera tempo + okcident-argentina tempo + okcident-argentina norma tempo + okcident-argentina somera tempo - armena tempo - armena norma tempo - armena somera tempo + armena tempo + armena norma tempo + armena somera tempo - atlantika nordamerika tempo - atlantika nordamerika norma tempo - atlantika nordamerika somera tempo + atlantika nordamerika tempo + atlantika nordamerika norma tempo + atlantika nordamerika somera tempo - centra aŭstralia tempo - centra aŭstralia norma tempo - centra aŭstralia somera tempo + centra aŭstralia tempo + centra aŭstralia norma tempo + centra aŭstralia somera tempo - centrokcidenta aŭstralia tempo - centrokcidenta aŭstralia norma tempo - centrokcidenta aŭstralia somera tempo + centrokcidenta aŭstralia tempo + centrokcidenta aŭstralia norma tempo + centrokcidenta aŭstralia somera tempo - orienta aŭstralia tempo - orienta aŭstralia norma tempo - orienta aŭstralia somera tempo + orienta aŭstralia tempo + orienta aŭstralia norma tempo + orienta aŭstralia somera tempo - okcidenta aŭstralia tempo - okcidenta aŭstralia norma tempo - okcidenta aŭstralia somera tempo + okcidenta aŭstralia tempo + okcidenta aŭstralia norma tempo + okcidenta aŭstralia somera tempo - azerbajĝana tempo - azerbajĝana norma tempo - azerbajĝana somera tempo + azerbajĝana tempo + azerbajĝana norma tempo + azerbajĝana somera tempo - tempo: Acoroj - Acoroj (norma tempo) - Acoroj (somera tempo) + tempo: Acoroj + Acoroj (norma tempo) + Acoroj (somera tempo) - bangladeŝa tempo - bangladeŝa norma tempo - bangladeŝa somera tempo + bangladeŝa tempo + bangladeŝa norma tempo + bangladeŝa somera tempo - butana tempo + butana tempo - bolivia tempo + bolivia tempo - brazilja tempo - brazilja norma tempo - brazilja somera tempo + brazilja tempo + brazilja norma tempo + brazilja somera tempo - bruneja tempo + bruneja tempo - kaboverda tempo - kaboverda norma tempo - kaboverda somera tempo + kaboverda tempo + kaboverda norma tempo + kaboverda somera tempo - ĉamora tempo + ĉamora tempo - ĉathama tempo - ĉathama norma tempo - ĉathama somera tempo + ĉathama tempo + ĉathama norma tempo + ĉathama somera tempo - ĉilia tempo - ĉilia norma tempo - ĉilia somera tempo + ĉilia tempo + ĉilia norma tempo + ĉilia somera tempo - ĉina tempo - ĉina norma tempo - ĉina somera tempo + ĉina tempo + ĉina norma tempo + ĉina somera tempo - kristnaskinsula tempo + kristnaskinsula tempo - kokosinsula tempo + kokosinsula tempo - kolombia tempo - kolombia norma tempo - kolombia somera tempo + kolombia tempo + kolombia norma tempo + kolombia somera tempo - kukinsula tempo - kukinsula norma tempo - kukinsula somera tempo + kukinsula tempo + kukinsula norma tempo + kukinsula somera tempo - tempo: Kubo - Kubo (norma tempo) - Kubo (somera tempo) + tempo: Kubo + Kubo (norma tempo) + Kubo (somera tempo) - tempo: Davis + tempo: Davis - tempo: Dumont d’Urville + tempo: Dumont d’Urville - orient-timora tempo + orient-timora tempo - paskinsula tempo - paskinsula norma tempo - paskinsula somera tempo + paskinsula tempo + paskinsula norma tempo + paskinsula somera tempo - ekvadora tempo + ekvadora tempo - centreŭropa tempo - centreŭropa norma tempo - centreŭropa somera tempo + centreŭropa tempo + centreŭropa norma tempo + centreŭropa somera tempo - orienteŭropa tempo - orienteŭropa norma tempo - orienteŭropa somera tempo + orienteŭropa tempo + orienteŭropa norma tempo + orienteŭropa somera tempo - ekstrem-orienteŭropa tempo + ekstrem-orienteŭropa tempo - okcidenteŭropa tempo - okcidenteŭropa norma tempo - okcidenteŭropa somera tempo + okcidenteŭropa tempo + okcidenteŭropa norma tempo + okcidenteŭropa somera tempo - falklanda tempo - falklanda norma tempo - falklanda somera tempo + falklanda tempo + falklanda norma tempo + falklanda somera tempo - fiĝia tempo - fiĝia norma tempo - fiĝia somera tempo + fiĝia tempo + fiĝia norma tempo + fiĝia somera tempo - tempo: Franca Gujano + tempo: Franca Gujano - tempo: Francaj Sudaj Teritorioj + tempo: Francaj Sudaj Teritorioj - galapaga tempo + galapaga tempo - tempo: Gambier + tempo: Gambier - kartvela tempo - kartvela norma tempo - kartvela somera tempo + kartvela tempo + kartvela norma tempo + kartvela somera tempo - gilbertinsula tempo + gilbertinsula tempo - universala tempo kunordigita + universala tempo kunordigita - orienta gronlanda tempo - orienta gronlanda norma tempo - orienta gronlanda somera tempo + orienta gronlanda tempo + orienta gronlanda norma tempo + orienta gronlanda somera tempo - okcidenta gronlanda tempo - okcidenta gronlanda norma tempo - okcidenta gronlanda somera tempo + okcidenta gronlanda tempo + okcidenta gronlanda norma tempo + okcidenta gronlanda somera tempo - arabgolfa norma tempo + arabgolfa norma tempo - gujana tempo + gujana tempo + + + + + Havajo-Aleutoj (norma tempo) - tempo: Havajo-Aleutoj - Havajo-Aleutoj (norma tempo) - Havajo-Aleutoj (somera tempo) + tempo: Havajo-Aleutoj + Havajo-Aleutoj (norma tempo) + Havajo-Aleutoj (somera tempo) - honkonga tempo - honkonga norma tempo - honkonga somera tempo + honkonga tempo + honkonga norma tempo + honkonga somera tempo - ĥovda tempo - ĥovda norma tempo - ĥovda somera tempo + ĥovda tempo + ĥovda norma tempo + ĥovda somera tempo - hinda norma tempo + hinda norma tempo - hindoceana tempo + hindoceana tempo - hindoĉina tempo + hindoĉina tempo - centr-indonezia tempo + centr-indonezia tempo - orient-indonezia tempo + orient-indonezia tempo - okcident-indonezia tempo + okcident-indonezia tempo - irana tempo - irana norma tempo - irana somera tempo + irana tempo + irana norma tempo + irana somera tempo - irkutska tempo - irkutska norma tempo - irkutska somera tempo + irkutska tempo + irkutska norma tempo + irkutska somera tempo - israela tempo - israela norma tempo - israela somera tempo + israela tempo + israela norma tempo + israela somera tempo - japana tempo - japana norma tempo - japana somera tempo + japana tempo + japana norma tempo + japana somera tempo - kazaĥa tempo + kazaĥa tempo - orient-kazaĥa tempo + orient-kazaĥa tempo - okcident-kazaĥa tempo + okcident-kazaĥa tempo - korea tempo - korea norma tempo - korea somera tempo + korea tempo + korea norma tempo + korea somera tempo - tempo: Kosrae + tempo: Kosrae - krasnojarska tempo - krasnojarska norma tempo - krasnojarska somera tempo + krasnojarska tempo + krasnojarska norma tempo + krasnojarska somera tempo - kirgiza tempo + kirgiza tempo - tempo: Liniaj Insuloj + tempo: Liniaj Insuloj - tempo: Lord Howe - Lord Howe (norma tempo) - Lord Howe (somera tempo) + tempo: Lord Howe + Lord Howe (norma tempo) + Lord Howe (somera tempo) - magadana tempo - magadana norma tempo - magadana somera tempo + magadana tempo + magadana norma tempo + magadana somera tempo - malajzia tempo + malajzia tempo - maldiva tempo + maldiva tempo - markizinsula tempo + markizinsula tempo - marŝalinsula tempo + marŝalinsula tempo - maŭricia tempo - maŭricia norma tempo - maŭricia somera tempo + maŭricia tempo + maŭricia norma tempo + maŭricia somera tempo - tempo: Mawson + tempo: Mawson - pacifika meksika tempo - pacifika meksika norma tempo - pacifika meksika somera tempo + pacifika meksika tempo + pacifika meksika norma tempo + pacifika meksika somera tempo - ulanbatora tempo - ulanbatora norma tempo - ulanbatora somera tempo + ulanbatora tempo + ulanbatora norma tempo + ulanbatora somera tempo - moskva tempo - moskva norma tempo - moskva somera tempo + moskva tempo + moskva norma tempo + moskva somera tempo - birma tempo + birma tempo - naura tempo + naura tempo - nepala tempo + nepala tempo - novkaledonia tempo - novkaledonia norma tempo - novkaledonia somera tempo + novkaledonia tempo + novkaledonia norma tempo + novkaledonia somera tempo - novzelanda tempo - novzelanda norma tempo - novzelanda somera tempo + novzelanda tempo + novzelanda norma tempo + novzelanda somera tempo - tempo: Novlando - Novlando (norma tempo) - Novlando (somera tempo) + tempo: Novlando + Novlando (norma tempo) + Novlando (somera tempo) - niua tempo + niua tempo - norfolkinsula tempo - norfolkinsula norma tempo - norfolkinsula somera tempo + norfolkinsula tempo + norfolkinsula norma tempo + norfolkinsula somera tempo - tempo: Fernando de Noronha - Fernando de Noronha (norma tempo) - Fernando de Noronha (somera tempo) + tempo: Fernando de Noronha + Fernando de Noronha (norma tempo) + Fernando de Noronha (somera tempo) - novosibirska tempo - novosibirska norma tempo - novosibirska somera tempo + novosibirska tempo + novosibirska norma tempo + novosibirska somera tempo - omska tempo - omska norma tempo - omska somera tempo + omska tempo + omska norma tempo + omska somera tempo - pakistana tempo - pakistana norma tempo - pakistana somera tempo + pakistana tempo + pakistana norma tempo + pakistana somera tempo - palaŭa tempo + palaŭa tempo - tempo: Papuo-Nov-Gvineo + tempo: Papuo-Nov-Gvineo - paragvaja tempo - paragvaja norma tempo - paragvaja somera tempo + paragvaja tempo + paragvaja norma tempo + paragvaja somera tempo - perua tempo - perua norma tempo - perua somera tempo + perua tempo + perua norma tempo + perua somera tempo - filipina tempo - filipina norma tempo - filipina somera tempo + filipina tempo + filipina norma tempo + filipina somera tempo - feniksinsula tempo + feniksinsula tempo - tempo: Sankta Piero kaj Mikelono - Sankta Piero kaj Mikelono (norma tempo) - Sankta Piero kaj Mikelono (somera tempo) + tempo: Sankta Piero kaj Mikelono + Sankta Piero kaj Mikelono (norma tempo) + Sankta Piero kaj Mikelono (somera tempo) - pitkarninsula tempo + pitkarninsula tempo - tempo: Ponape + tempo: Ponape - pjongjanga tempo + nord-korea tempo - tempo: Reunio + tempo: Reunio - tempo: Rothera + tempo: Rothera - saĥalena tempo - saĥalena norma tempo - saĥalena somera tempo + saĥalena tempo + saĥalena norma tempo + saĥalena somera tempo - samoa tempo - samoa norma tempo - samoa somera tempo + uson-samoa tempo + uson-samoa norma tempo + uson-samoa somera tempo - sejŝela tempo + sejŝela tempo - singapura norma tempo + singapura norma tempo - tempo: Salomonoj + tempo: Salomonoj - tempo: Sud-Georgio + tempo: Sud-Georgio - surinama tempo + surinama tempo - tempo: Showa + tempo: Showa - tahitia tempo + tahitia tempo - tajpea tempo - tajpea norma tempo - tajpea somera tempo + tajvana tempo + tajvana norma tempo + tajvana somera tempo - taĝika tempo + taĝika tempo - tokelaa tempo + tokelaa tempo - tonga tempo - tonga norma tempo - tonga somera tempo + tonga tempo + tonga norma tempo + tonga somera tempo - tempo: Ĉuuk + tempo: Ĉuuk - turkmena tempo - turkmena norma tempo - turkmena somera tempo + turkmena tempo + turkmena norma tempo + turkmena somera tempo - tuvala tempo + tuvala tempo - urugvaja tempo - urugvaja norma tempo - urugvaja somera tempo + urugvaja tempo + urugvaja norma tempo + urugvaja somera tempo - uzbeka tempo - uzbeka norma tempo - uzbeka somera tempo + uzbeka tempo + uzbeka norma tempo + uzbeka somera tempo - vanuatua tempo - vanuatua norma tempo - vanuatua somera tempo + vanuatua tempo + vanuatua norma tempo + vanuatua somera tempo - venezuela tempo + venezuela tempo - vladivostoka tempo - vladivostoka norma tempo - vladivostoka somera tempo + vladivostoka tempo + vladivostoka norma tempo + vladivostoka somera tempo - volgograda tempo - volgograda norma tempo - volgograda somera tempo + volgograda tempo + volgograda norma tempo + volgograda somera tempo - tempo: Vostok + tempo: Vostok - vejkinsula tempo + vejkinsula tempo - tempo: Valiso kaj Futuno + tempo: Valiso kaj Futuno - jakutska tempo - jakutska norma tempo - jakutska somera tempo + jakutska tempo + jakutska norma tempo + jakutska somera tempo - jekaterinburga tempo - jekaterinburga norma tempo - jekaterinburga somera tempo + jekaterinburga tempo + jekaterinburga norma tempo + jekaterinburga somera tempo - jukonia tempo + jukonia tempo @@ -3772,837 +3923,869 @@ CLDR data files are interpreted according to the LDML specification (http://unic , -   - - + + - 0 mil - 0 mil - 00 mil - 00 mil - 000 mil - 000 mil - 0 miliono - 0 milionoj - 00 miliono - 00 milionoj - 000 miliono - 000 milionoj - 0 miliardo - 0 miliardoj - 00 miliardo - 00 miliardoj - 000 miliardo - 000 miliardoj - 0 duiliono - 0 duilionoj - 00 duiliono - 00 duilionoj - 000 duiliono - 000 duilionoj + 0 mil + 0 mil + 00 mil + 00 mil + 000 mil + 000 mil + 0 miliono + 0 miliono + 00 milionoj + 00 milionoj + 000 milionoj + 000 milionoj + 0 miliardo + 0 miliardoj + 00 miliardoj + 00 miliardoj + 000 miliardoj + 000 miliardoj + 0 duiliono + 0 duilionoj + 00 duilionoj + 00 duilionoj + 000 duilionoj + 000 duilionoj - 0k - 0k - 00k - 00k - 000k - 000k + 0k + 0k + 00k + 00k + 000k + 000k - #,##0.00 ¤ + #,##0.00 ¤ + #,##0.00 ¤ - #,##0.00 ¤ + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) + + + 0k ¤ + 0k ¤ + 00k ¤ + 00k ¤ + 000k ¤ + 000k ¤ + 0M ¤ + 0M ¤ + 00M ¤ + 00M ¤ + 000M ¤ + 000M ¤ + 0G ¤ + 0G ¤ + 00G ¤ + 00G ¤ + 000G ¤ + 000G ¤ + 0T ¤ + 0T ¤ + 00T ¤ + 00T ¤ + 000T ¤ + 000T ¤ + + + {0} ¤¤ - dirhamo de Unuiĝintaj Arabaj Emirlandoj - UAE-dirhamo - UAE-dirhamoj + dirhamo de Unuiĝintaj Arabaj Emirlandoj + UAE-dirhamo + UAE-dirhamoj - afgana afganio - afgana afganio - afganaj afganioj + afgana afganio + afgana afganio + afganaj afganioj - albana leko - albana leko - albanaj lekoj + albana leko + albana leko + albanaj lekoj - armena dramo - armena dramo - armenaj dramoj + armena dramo + armena dramo + armenaj dramoj - nederlandantila guldeno - nederlandantila guldeno - nederlandantilaj guldenoj + nederlandantila guldeno + nederlandantila guldeno + nederlandantilaj guldenoj - angola kvanzo - angola kvanzo - angolaj kvanzoj + angola kvanzo + angola kvanzo + angolaj kvanzoj - argentina peso - argentina peso - argentinaj pesoj + argentina peso + argentina peso + argentinaj pesoj - aŭstralia dolaro - aŭstralia dolaro - aŭstraliaj dolaroj - AUD + aŭstralia dolaro + aŭstralia dolaro + aŭstraliaj dolaroj + AUD - aruba guldeno - aruba guldeno - arubaj guldenoj + aruba floreno + aruba floreno + arubaj florenoj - azerbajĝana manato - azerbajĝana manato - azerbajĝanaj manatoj + azerbajĝana manato + azerbajĝana manato + azerbajĝanaj manatoj - konvertebla marko de Bosnujo kaj Hercegovino - konvertebla marko - konverteblaj markoj + konvertebla marko de Bosnujo kaj Hercegovino + konvertebla marko + konverteblaj markoj - barbada dolaro - barbada dolaro - barbadaj dolaroj + barbada dolaro + barbada dolaro + barbadaj dolaroj - bangladeŝa tako - bangladeŝa tako - bangladeŝaj takoj + bangladeŝa tako + bangladeŝa tako + bangladeŝaj takoj - bulgara levo - bulgara levo - bulgaraj levoj + bulgara levo + bulgara levo + bulgaraj levoj - barejna dinaro - barejna dinaro - barejnaj dinaroj + barejna dinaro + barejna dinaro + barejnaj dinaroj - burunda franko - burunda franko - burundaj frankoj + burunda franko + burunda franko + burundaj frankoj - bermuda dolaro - bermuda dolaro - bermudaj dolaroj + bermuda dolaro + bermuda dolaro + bermudaj dolaroj - bruneja dolaro - bruneja dolaro - brunejaj dolaroj + bruneja dolaro + bruneja dolaro + brunejaj dolaroj - bolivia bolivjano - bolivia bolivjano - boliviaj bolivjanoj + bolivia bolivjano + bolivia bolivjano + boliviaj bolivjanoj - brazila realo - brazila realo - brazilaj realoj - BRL + brazila realo + brazila realo + brazilaj realoj + BRL - bahama dolaro - bahama dolaro - bahamaj dolaroj + bahama dolaro + bahama dolaro + bahamaj dolaroj - butana ngultrumo - butana ngultrumo - butanaj ngultrumoj + butana ngultrumo + butana ngultrumo + butanaj ngultrumoj - bocvana pulao - bocvana pulao - bocvanaj pulaoj + bocvana pulao + bocvana pulao + bocvanaj pulaoj - belorusa rublo - belorusa rublo - belorusaj rubloj + belorusa rublo + belorusa rublo + belorusaj rubloj - beliza dolaro - beliza dolaro - belizaj dolaroj + beliza dolaro + beliza dolaro + belizaj dolaroj - kanada dolaro - kanada dolaro - kanadaj dolaroj - CAD + kanada dolaro + kanada dolaro + kanadaj dolaroj + CAD - konga franko - konga franko - kongaj frankoj + konga franko + konga franko + kongaj frankoj - svisa franko - svisa franko - svisaj frankoj + svisa franko + svisa franko + svisaj frankoj - ĉilia peso - ĉilia peso - ĉiliaj pesoj + ĉilia peso + ĉilia peso + ĉiliaj pesoj - ĉina juano (eksterlanda uzo) - ĉina juano (eksterlande) - ĉinaj juanoj (eksterlande) + ĉina juano (eksterlanda uzo) + ĉina juano (eksterlande) + ĉinaj juanoj (eksterlande) - ĉinaj juanoj - ĉina juano - ĉinaj juanoj - CNY + ĉinaj juanoj + ĉina juano + ĉinaj juanoj + CNY - kolombia peso - kolombia peso - kolombiaj pesoj + kolombia peso + kolombia peso + kolombiaj pesoj - kostarika kolumbo - kostarika kolumbo - kostarikaj kolumboj + kostarika kolumbo + kostarika kolumbo + kostarikaj kolumboj - konvertebla kuba peso - konvertebla kuba peso - konverteblaj kubaj pesoj + konvertebla kuba peso + konvertebla kuba peso + konverteblaj kubaj pesoj - kuba peso - kuba peso - kubaj pesoj + kuba peso + kuba peso + kubaj pesoj - kaboverda eskudo - kaboverda eskudo - kaboverdaj eskudoj + kaboverda eskudo + kaboverda eskudo + kaboverdaj eskudoj - ĉeĥa krono - ĉeĥa krono - ĉeĥaj kronoj + ĉeĥa krono + ĉeĥa krono + ĉeĥaj kronoj - ĝibutia franko - ĝibutia franko - ĝibutiaj frankoj + ĝibutia franko + ĝibutia franko + ĝibutiaj frankoj - dana krono - dana krono - danaj kronoj + dana krono + dana krono + danaj kronoj - dominika peso - dominika peso - dominikaj pesoj + dominika peso + dominika peso + dominikaj pesoj - alĝeria dinaro - alĝeria dinaro - alĝeriaj dinaroj + alĝeria dinaro + alĝeria dinaro + alĝeriaj dinaroj - egipta pundo - egipta pundo - egiptaj pundoj + egipta pundo + egipta pundo + egiptaj pundoj - eritrea nakfo - eritrea nakfo - eritreaj nakfoj + eritrea nakfo + eritrea nakfo + eritreaj nakfoj - etiopa birro - etiopa birro - etiopaj birroj + etiopa birro + etiopa birro + etiopaj birroj - eŭro - eŭro - eŭroj + eŭro + eŭro + eŭroj - fiĝia dolaro - fiĝia dolaro - fiĝiaj dolaroj + fiĝia dolaro + fiĝia dolaro + fiĝiaj dolaroj - falklanda pundo - falklanda pundo - falklandaj pundoj + falklanda pundo + falklanda pundo + falklandaj pundoj - brita pundo - brita pundo - britaj pundoj - GBP + brita pundo + brita pundo + britaj pundoj + GBP - kartvela lario - kartvela lario - kartvelaj larioj + kartvela lario + kartvela lario + kartvelaj larioj - ganaa cedio - ganaa cedio - ganaaj cedioj + ganaa cedio + ganaa cedio + ganaaj cedioj + - ĝibraltara pundo - ĝibraltara pundo - ĝibraltaraj pundoj + ĝibraltara pundo + ĝibraltara pundo + ĝibraltaraj pundoj - gambia dalasio - gambia dalasio - gambiaj dalasioj + gambia dalasio + gambia dalasio + gambiaj dalasioj - gvinea franko - gvinea franko - gvineaj frankoj + gvinea franko + gvinea franko + gvineaj frankoj - gvatemala kecalo - gvatemala kecalo - gvatemalaj kecaloj + gvatemala kecalo + gvatemala kecalo + gvatemalaj kecaloj - gujana dolaro - gujana dolaro - gujanaj dolaroj + gujana dolaro + gujana dolaro + gujanaj dolaroj - honkonga dolaro - honkonga dolaro - honkongaj dolaroj - HKD + honkonga dolaro + honkonga dolaro + honkongaj dolaroj + HKD - hondura lempiro - hondura lempiro - honduraj lempiroj + hondura lempiro + hondura lempiro + honduraj lempiroj - kroata kunao - kroata kunao - kroataj kunaoj + kroata kunao + kroata kunao + kroataj kunaoj - haitia gurdo - haitia gurdo - haitiaj gurdoj + haitia gurdo + haitia gurdo + haitiaj gurdoj - hungara forinto - hungara forinto - hungaraj forintoj + hungara forinto + hungara forinto + hungaraj forintoj - indonezia rupio - indonezia rupio - indoneziaj rupioj + indonezia rupio + indonezia rupio + indoneziaj rupioj - israela nova siklo - israela nova siklo - israelaj novaj sikloj - ILS + israela nova siklo + israela nova siklo + israelaj novaj sikloj + ILS - hinda rupio - hinda rupio - hindaj rupioj - INR + hinda rupio + hinda rupio + hindaj rupioj + INR - iraka dinaro - iraka dinaro - irakaj dinaroj + iraka dinaro + iraka dinaro + irakaj dinaroj - irana rialo - irana rialo - iranaj rialoj + irana rialo + irana rialo + iranaj rialoj - islanda krono - islanda krono - islandaj kronoj + islanda krono + islanda krono + islandaj kronoj - jamajka dolaro - jamajka dolaro - jamajkaj dolaroj + jamajka dolaro + jamajka dolaro + jamajkaj dolaroj - jordania dinaro - jordania dinaro - jordaniaj dinaroj + jordania dinaro + jordania dinaro + jordaniaj dinaroj - japana eno - japana eno - japanaj enoj - JPY + japana eno + japana eno + japanaj enoj + JPY - kenja ŝilingo - kenja ŝilingo - kenjaj ŝilingoj + kenja ŝilingo + kenja ŝilingo + kenjaj ŝilingoj - kirgiza somo - kirgiza somo - kirgizaj somoj + kirgiza somo + kirgiza somo + kirgizaj somoj - kamboĝa rielo - kamboĝa rielo - kamboĝaj rieloj + kamboĝa rielo + kamboĝa rielo + kamboĝaj rieloj - komora franko - komora franko - komoraj frankoj + komora franko + komora franko + komoraj frankoj - nordkorea vono - nordkorea vono - nordkoreaj vonoj + nordkorea vono + nordkorea vono + nordkoreaj vonoj - sudkorea vono - sudkorea vono - sudkoreaj vonoj - KRW + sudkorea vono + sudkorea vono + sudkoreaj vonoj + KRW - kuvajta dinaro - kuvajta dinaro - kuvajtaj dinaroj + kuvajta dinaro + kuvajta dinaro + kuvajtaj dinaroj - kajmana dolaro - kajmana dolaro - kajmanaj dolaroj + kajmana dolaro + kajmana dolaro + kajmanaj dolaroj - kazaĥa tengo - kazaĥa tengo - kazaĥaj tengoj + kazaĥa tengo + kazaĥa tengo + kazaĥaj tengoj - laosa kipo - laosa kipo - laosaj kipoj + laosa kipo + laosa kipo + laosaj kipoj - libana liro - libana liro - libanaj liroj + libana liro + libana liro + libanaj liroj - srilanka rupio - srilanka rupio - srilankaj rupioj - + srilanka rupio + srilanka rupio + srilankaj rupioj + - liberia dolaro - liberia dolaro - liberiaj dolaroj + liberia dolaro + liberia dolaro + liberiaj dolaroj - lesota lotio - lesota lotio - lesotaj lotioj + lesota lotio + lesota lotio + lesotaj lotioj - libia dinaro - libia dinaro - libiaj dinaroj + libia dinaro + libia dinaro + libiaj dinaroj - maroka dirhamo - maroka dirhamo - marokaj dirhamoj + maroka dirhamo + maroka dirhamo + marokaj dirhamoj - moldava leo - moldava leo - moldavaj leoj + moldava leo + moldava leo + moldavaj leoj - madagaskara ariaro - madagaskara ariaro - madagaskaraj ariaroj + madagaskara ariaro + madagaskara ariaro + madagaskaraj ariaroj - makedona denaro - makedona denaro - makedonaj denaroj + makedona denaro + makedona denaro + makedonaj denaroj - birma kjato - birma kjato - birmaj kjatoj + birma kjato + birma kjato + birmaj kjatoj - mongola tugriko - mongola tugriko - mongolaj tugrikoj + mongola tugriko + mongola tugriko + mongolaj tugrikoj - makaa patako - makaa patako - makaaj patakoj + makaa patako + makaa patako + makaaj patakoj - maŭritania uguijao - maŭritania uguijao - maŭritaniaj uguijaoj + maŭritania uguijao + maŭritania uguijao + maŭritaniaj uguijaoj - maŭricia rupio - maŭricia rupio - maŭriciaj rupioj - + maŭricia rupio + maŭricia rupio + maŭriciaj rupioj + - maldiva rufijao - maldiva rufijao - maldivaj rufijaoj + maldiva rufijao + maldiva rufijao + maldivaj rufijaoj - malavia kvaĉo - malavia kvaĉo - malaviaj kvaĉoj + malavia kvaĉo + malavia kvaĉo + malaviaj kvaĉoj - meksika peso - meksika peso - meksikaj pesoj - MXN + meksika peso + meksika peso + meksikaj pesoj + MXN - malajzia ringito - malajzia ringito - malajziaj ringitoj + malajzia ringito + malajzia ringito + malajziaj ringitoj - mozambika metikalo - mozambika metikalo - mozambikaj metikaloj + mozambika metikalo + mozambika metikalo + mozambikaj metikaloj - namibia dolaro - namibia dolaro - namibiaj dolaroj + namibia dolaro + namibia dolaro + namibiaj dolaroj - niĝeria najro - niĝeria najro - niĝeriaj najroj + niĝeria najro + niĝeria najro + niĝeriaj najroj - nikaragva kordovo - nikaragva kordovo - nikaragvaj kordovoj + nikaragva kordovo + nikaragva kordovo + nikaragvaj kordovoj - norvega krono - norvega krono - norvegaj kronoj + norvega krono + norvega krono + norvegaj kronoj - nepala rupio - nepala rupio - nepalaj rupioj - + nepala rupio + nepala rupio + nepalaj rupioj + - novzelanda dolaro - novzelanda dolaro - novzelandaj dolaroj - NZD + novzelanda dolaro + novzelanda dolaro + novzelandaj dolaroj + NZD - omana rialo - omana rialo - omanaj rialoj + omana rialo + omana rialo + omanaj rialoj - panama balboo - panama balboo - panamaj balbooj + panama balboo + panama balboo + panamaj balbooj - perua suno - perua suno - peruaj sunoj + perua suno + perua suno + peruaj sunoj - papuonovgvinea kinao - papuonovgvinea kinao - papuonovgvineaj kinaoj + papuonovgvinea kinao + papuonovgvinea kinao + papuonovgvineaj kinaoj - filipina peso - filipina peso - filipinaj pesoj - PHP + filipina peso + filipina peso + filipinaj pesoj + PHP - pakistana rupio - pakistana rupio - pakistanaj rupioj - + pakistana rupio + pakistana rupio + pakistanaj rupioj + - pola zloto - pola zloto - polaj zlotoj + pola zloto + pola zloto + polaj zlotoj - paragvaja gvaranio - paragvaja gvaranio - paragvajaj gvaranioj + paragvaja gvaranio + paragvaja gvaranio + paragvajaj gvaranioj - katara rialo - katara rialo - kataraj rialoj + katara rialo + katara rialo + kataraj rialoj - rumana leo - rumana leo - rumanaj leoj + rumana leo + rumana leo + rumanaj leoj - serba dinaro - serba dinaro - serbaj dinaroj + serba dinaro + serba dinaro + serbaj dinaroj - rusa rublo - rusa rublo - rusaj rubloj + rusa rublo + rusa rublo + rusaj rubloj - ruanda franko - ruanda franko - ruandaj frankoj + ruanda franko + ruanda franko + ruandaj frankoj - sauda rialo - sauda rialo - saudaj rialoj + sauda rialo + sauda rialo + saudaj rialoj - salomona dolaro - salomona dolaro - salomonaj dolaroj + salomona dolaro + salomona dolaro + salomonaj dolaroj - sejŝela rupio - sejŝela rupio - sejŝelaj rupioj + sejŝela rupio + sejŝela rupio + sejŝelaj rupioj - sudana pundo - sudana pundo - sudanaj pundoj + sudana pundo + sudana pundo + sudanaj pundoj - sveda krono - sveda krono - svedaj kronoj + sveda krono + sveda krono + svedaj kronoj - singapura dolaro - singapura dolaro - singapuraj dolaroj + singapura dolaro + singapura dolaro + singapuraj dolaroj - sankthelena pundo - sankthelena pundo - sankthelenaj pundoj + sankthelena pundo + sankthelena pundo + sankthelenaj pundoj - sieraleona leono - sieraleona leono - sieraleonaj leonoj + sieraleona leono + sieraleona leono + sieraleonaj leonoj - sieraleona leono (1964–2022) - sieraleona leono (1964–2022) - sieraleonaj leonoj (1964–2022) + sieraleona leono (1964–2022) + sieraleona leono (1964–2022) + sieraleonaj leonoj (1964–2022) - somala ŝilingo - somala ŝilingo - somalaj ŝilingoj + somala ŝilingo + somala ŝilingo + somalaj ŝilingoj - surinama dolaro - surinama dolaro - surinamaj dolaroj + surinama dolaro + surinama dolaro + surinamaj dolaroj - sudsudana pundo - sudsudana pundo - sudsudanaj pundoj + sudsudana pundo + sudsudana pundo + sudsudanaj pundoj - santomea dobro - santomea dobro - santomeaj dobroj + santomea dobro + santomea dobro + santomeaj dobroj - siria pundo - siria pundo - siriaj pundoj + siria pundo + siria pundo + siriaj pundoj - svazilanda liliagenio - svazia lilangenio - svaziaj lilangenioj + svazilanda liliagenio + svazia lilangenio + svaziaj lilangenioj - taja bahto - taja bahto - tajaj bahtoj + taja bahto + taja bahto + tajaj bahtoj - taĝika somonio - taĝika somonio - taĝikaj somonioj + taĝika somonio + taĝika somonio + taĝikaj somonioj - turkmena manato - turkmena manato - turkmenaj manatoj + turkmena manato + turkmena manato + turkmenaj manatoj - tunizia dinaro - tunizia dinaro - tuniziaj dinaroj + tunizia dinaro + tunizia dinaro + tuniziaj dinaroj - tonga paangao - tonga paangao - tongaj paangaoj + tonga paangao + tonga paangao + tongaj paangaoj - turka liro - turka liro - turkaj liroj + turka liro + turka liro + turkaj liroj + TRY - trinidada dolaro - trinidada dolaro - trinidadaj dolaroj + trinidada dolaro + trinidada dolaro + trinidadaj dolaroj - tajvana nova dolaro - tajvana nova dolaro - tajvanaj novaj dolaroj - TWD - NT$ + tajvana nova dolaro + tajvana nova dolaro + tajvanaj novaj dolaroj + TWD - tanzania ŝilingo - tanzania ŝilingo - tanzaniaj ŝilingoj + tanzania ŝilingo + tanzania ŝilingo + tanzaniaj ŝilingoj - ukraina hrivno - ukraina hrivno - ukrainaj hrivnoj + ukraina hrivno + ukraina hrivno + ukrainaj hrivnoj - uganda ŝilingo - uganda ŝilingo - ugandaj ŝilingoj + uganda ŝilingo + uganda ŝilingo + ugandaj ŝilingoj - usona dolaro - usona dolaro - usonaj dolaroj - USD + usona dolaro + usona dolaro + usonaj dolaroj + USD - urugvaja peso - urugvaja peso - urugvajaj pesoj + urugvaja peso + urugvaja peso + urugvajaj pesoj - uzbeka somo - uzbeka somo - uzbekaj somoj + uzbeka somo + uzbeka somo + uzbekaj somoj - venezuela bolivaro - venezuela bolivaro - venezuelaj bolivaroj + venezuela bolivaro + venezuela bolivaro + venezuelaj bolivaroj - vjetnama dongo - vjetnama dongo - vjetnamaj dongoj - VND + vjetnama dongo + vjetnama dongo + vjetnamaj dongoj + VND - vanuatua vatuo - vanuatua vatuo - vanuatuaj vatuoj + vanuatua vatuo + vanuatua vatuo + vanuatuaj vatuoj - samoa talao - samoa talao - samoaj talaoj + samoa talao + samoa talao + samoaj talaoj - ekvatorafrika franko - ekvatorafrika franko - ekvatorafrikaj frankoj - XAF + ekvatorafrika franko + ekvatorafrika franko + ekvatorafrikaj frankoj + XAF arĝento @@ -4614,292 +4797,622 @@ CLDR data files are interpreted according to the LDML specification (http://unic eŭropa monunuo - orientkariba dolaro - orientkariba dolaro - orientkaribaj dolaroj - XCD + orientkariba dolaro + orientkariba dolaro + orientkaribaj dolaroj + XCD + + + kariba guldeno + kariba guldeno + karibaj guldenoj + XCG franca ora franko - okcidentafrika franko - okcidentafrika franko - okcidentafrikaj frankoj - XOF + okcidentafrika franko + okcidentafrika franko + okcidentafrikaj frankoj + XOF paladio - pacifika franko - pacifika franko - pacifikaj frankoj - XPF + pacifika franko + pacifika franko + pacifikaj frankoj + XPF plateno - nekonata monunuo - (nekunata monunuo) - (nekonata monunuo) + nekonata monunuo + (nekunata monunuo) + (nekonata monunuo) - jemena rialo - jemena rialo - jemenaj rialoj + jemena rialo + jemena rialo + jemenaj rialoj - sudafrika rando - sudafrika rando - sudafrikaj randoj + sudafrika rando + sudafrika rando + sudafrikaj randoj - zambia kvaĉo - zambia kvaĉo - zambiaj kvaĉoj + zambia kvaĉo + zambia kvaĉo + zambiaj kvaĉoj + + + zimbabva oro + zimbabva oro + zimbabvaj oroj - ≈{0} + ≈{0} - {0} tago - {0} tagoj - Turniĝu al {0}-a dekstro. + {0} tago + {0} tagoj + Turniĝu al {0}-a dekstro. + + deci{0} + + + centi{0} + + + mili{0} + + + mikro{0} + + + nano{0} + + + piko{0} + + + femto{0} + + + ato{0} + + + zepto{0} + + + jokto{0} + + + ronto{0} + + + kvekto{0} + + + deka{0} + + + hekto{0} + + + kilo{0} + + + mega{0} + + + giga{0} + + + tera{0} + + + peta{0} + + + eksa{0} + + + zeta{0} + + + jota{0} + + + rona{0} + + + kveta{0} + + + kibi{0} + + + mebi{0} + + + gibi{0} + + + tebi{0} + + + pebi{0} + + + eksbi{0} + + + zebi{0} + + + jobi{0} + - po {0} por {1} + po {0} je {1} + + + kvadrat{0} + kvadrat{0} + + + kub{0} + kub{0} - {0} oble {1} + {0}-{1} + + tera akcelo + {0} tera akcelo + {0} teraj akceloj + + + metroj en kvadrata sekundo + po {0} metro en kvadratsekundo + po {0} metroj en kvadratsekundo + + + rivoluoj + {0} rivoluo + {0} rivoluoj + + + radianoj + {0} radiano + {0} radianoj + + + gradoj + {0} grado + {0} gradoj + + + arkminutoj + {0} arkminuto + {0} arkminutoj + + + arksekundoj + {0} arksekundo + {0} arksekundoj + - kvadrataj kilometroj - {0} kvadrata kilometro - {0} kvadrataj kilometroj + kvadrataj kilometroj + {0} kvadratkilometro + {0} kvadratkilometroj + po {0} sur kvadratkilometro - hektaroj - {0} hektaro - {0} hektaroj + hektaroj + {0} hektaro + {0} hektaroj - kvadrataj metroj - {0} kvadrata metro - {0} kvadrataj metroj + kvadrataj metroj + {0} kvadratmetro + {0} kvadratmetroj + po {0} sur kvadratmetro - kvadrataj centimetroj - {0} kvadrata centimetro - {0} kvadrataj centimetroj + kvadrataj centimetroj + {0} kvadratcentimetro + {0} kvadratcentimetroj + po {0} sur kvadratcentimetro - kvadrataj mejloj - {0} kvadrata mejlo - {0} kvadrataj mejloj + kvadrataj mejloj + {0} kvadratmejlo + {0} kvadratmejloj + po {0} sur kvadratmejlo - akreoj - {0} akreo - {0} akreoj + akreoj + {0} akreo + {0} akreoj - kvadrataj jardoj - {0} kvadrata jardo - {0} kvadrataj jardoj + kvadrataj jardoj + {0} kvadratjardo + {0} kvadratjardoj - kvadrataj futoj - {0} kvadrata futo - {0} kvadrataj futoj + kvadrataj futoj + {0} kvadratfuto + {0} kvadratfutoj - kvadrataj coloj - {0} kvadrata colo - {0} kvadrataj coloj + kvadrataj coloj + {0} kvadratcolo + {0} kvadratcoloj + po {0} sur kvadratcolo + + + karatoj + {0} karato + {0} karatoj + + + miligramoj en decilitro + po {0} miligramo en decilitro + po {0} miligramoj en decilitro + + + milimoloj en litro + po {0} milimolo en litro + po {0} milimoloj en litro + + + ekzempleroj + {0} ekzemplero + {0} ekzempleroj + + + miliononoj + {0} milionono + {0} miliononoj + + + centonoj + {0} centono + {0} centonoj + + + milonoj + {0} milono + {0} milonoj + + + dekmilonoj + {0} dekmilono + {0} dekmilonoj + + + moloj + {0} molo + {0} moloj + + + da glukozo + {0} da glukozo + {0} da glukozo + + + litroj por kilometro + po {0} litro por kilometro + po {0} litroj por kilometro + + + litroj por 100 kilometroj + po {0} litro por 100 kilometroj + po {0} litroj por 100 kilometroj + + + petabitokoj + {0} petabitoko + {0} petabitokoj - terabajtoj - {0} terabajto - {0} terabajtoj + terabitokoj + {0} terabitoko + {0} terabitokoj - terabitoj - {0} terabito - {0} terabitoj + terabitoj + {0} terabito + {0} terabitoj - gigabajtoj - {0} gigabajto - {0} gigabajtoj + gigabitokoj + {0} gigabitoko + {0} gigabitokoj - gigabitoj - {0} gigabito - {0} gigabitoj + gigabitoj + {0} gigabito + {0} gigabitoj - megabajtoj - {0} megabajto - {0} megabajtoj + megabitokoj + {0} megabitoko + {0} megabitokoj - megabitoj - {0} megabito - {0} megabitoj + megabitoj + {0} megabito + {0} megabitoj - kilobajtoj - {0} kilobajto - {0} kilobajtoj + kilobitokoj + {0} kilobitoko + {0} kilobitokoj - kilobitoj - {0} kilobito - {0} kilobitoj + kilobitoj + {0} kilobito + {0} kilobitoj - bajtoj - {0} bajto - {0} bajtoj + bitokoj + {0} bitoko + {0} bitokoj - bitoj - {0} bito - {0} bitoj + bitoj + {0} bito + {0} bitoj - jarcentoj - {0} jarcento - {0} jarcentoj + jarcentoj + {0} jarcento + {0} jarcentoj - jardekoj - {0} jardeko - {0} jardekoj + jardekoj + {0} jardeko + {0} jardekoj - jaroj - {0} jaro - {0} jaroj - po {0} por jaro + jaroj + {0} jaro + {0} jaroj + po {0} en jaro + + + jarkvaronoj + {0} jarkvarono + {0} jarkvaronoj + po {0} en jarkvarono - monatoj - {0} monato - {0} monatoj + monatoj + {0} monato + {0} monatoj + po {0} en monato - semajnoj - {0} semajno - {0} semajnoj + semajnoj + {0} semajno + {0} semajnoj + po {0} en semajno - tagoj - {0} tago - {0} tagoj + tagoj + {0} tago + {0} tagoj + po {0} en tago - horoj - {0} horo - {0} horoj - {0} por horo + horoj + {0} horo + {0} horoj + po {0} en horo - minutoj - {0} minuto - {0} minutoj + minutoj + {0} minuto + {0} minutoj + po {0} en minuto - sekundoj - {0} sekundo - {0} sekundoj - {0} por sekundo + sekundoj + {0} sekundo + {0} sekundoj + po {0} en sekundo - milisekundoj - {0} milisekundo - {0} milisekundoj + milisekundoj + {0} milisekundo + {0} milisekundoj + + + mikrosekundoj + {0} mikrosekundo + {0} mikrosekundoj + + + nanosekundoj + {0} nanosekundo + {0} nanosekundoj + + + amperoj + {0} ampero + {0} amperoj + + + miliamperoj + {0} miliampero + {0} miliamperoj + + + omoj + {0} omo + {0} omoj + + + voltoj + {0} volto + {0} voltoj + + + kilokalorioj + {0} kilokalorio + {0} kilokalorioj + + + kalorioj + {0} kalorio + {0} kalorioj + + + kiloĵuloj + {0} kiloĵulo + {0} kiloĵuloj + + + ĵuloj + {0} ĵulo + {0} ĵuloj + + + kilovathoroj + {0} kilovathoro + {0} kilovathoroj + + + elektronvoltoj + {0} elektronvolto + {0} elektronvoltoj + + + neŭtonoj + {0} neŭtono + {0} neŭtonoj + + + kilovathoroj por 100 kilometroj + po {0} kilovathoro por 100 kilometroj + po {0} kilovathoroj por 100 kilometroj + + + gigahercoj + {0} gigaherco + {0} gigahercoj + + + megahercoj + {0} megaherco + {0} megahercoj + + + kilohercoj + {0} kiloherco + {0}kilohercoj + + + hercoj + {0} herco + {0} hercoj + + + terradiusoj + {0} terradiuso + {0} terradiusoj - kilometroj - {0} kilometro - {0} kilometroj + kilometroj + {0} kilometro + {0} kilometroj + po {0} en kilometro - metroj - {0} metro - {0} metroj + metroj + {0} metro + {0} metroj + po {0} en metro - decimetroj - {0} decimetro - {0} decimetroj + decimetroj + {0} decimetro + {0} decimetroj - centimetroj - {0} centimetro - {0} centimetroj + centimetroj + {0} centimetro + {0} centimetroj + po {0} en centimetro - milimetroj - {0} milimetro - {0} milimetroj + milimetroj + {0} milimetro + {0} milimetroj - mikrometroj - {0} mikrometro - {0} mikrometroj + mikrometroj + {0} mikrometro + {0} mikrometroj - nanometroj - {0} nanometro - {0} nanometroj + nanometroj + {0} nanometro + {0} nanometroj - pikometroj - {0} pikometro - {0} pikometroj + pikometroj + {0} pikometro + {0} pikometroj - mejloj - {0} mejlo - {0} mejloj + mejloj + {0} mejlo + {0} mejloj - jardoj - {0} jardo - {0} jardoj + jardoj + {0} jardo + {0} jardoj - futoj - {0} futo - {0} futoj + futoj + {0} futo + {0} futoj + po {0} en futo - coloj - {0} colo - {0} coloj + coloj + {0} colo + {0} coloj + po {0} en colo - parsekoj - {0} parseko - {0} parsekoj + parsekoj + {0} parseko + {0} parsekoj - lumjaroj - {0} lumjaro - {0} lumjaroj + lumjaroj + {0} lumjaro + {0} lumjaroj - astronomiaj unuoj - {0} astronomia unuo - {0} astronomiaj unuoj + astronomiaj unuoj + {0} astronomia unuo + {0} astronomiaj unuoj stadioj @@ -4912,311 +5425,1740 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} klaftoj - marmejloj - {0} marmejlo - {0} marmejloj + marmejloj + {0} marmejlo + {0} marmejloj + + + skandinavaj mejloj + {0} skandinava mejlo + {0} skandinavaj mejloj + + + punktoj tipografiaj + {0} punkto tipografia + {0} punktoj tipografiaj + + + sunradiusoj + {0} sunradiuso + {0} sunradiusoj + + + luksoj + {0} lukso + {0} luksoj + + + kandeloj + {0} kandelo + {0} kandeloj + + + lumenoj + {0} lumeno + {0} lumenoj + + + tunoj + {0} tuno + {0} tunoj - kilogramoj - {0} kilogramo - {0} kilogramoj + kilogramoj + {0} kilogramo + {0} kilogramoj + po {0} je kilogramo - gramoj - {0} gramo - {0} gramoj + gramoj + {0} gramo + {0} gramoj + po {0} je gramo + + + miligramoj + {0} miligramo + {0} miligramoj + + + mikrogramoj + {0} mikrogramo + {0} mikrogramoj + + + mallongaj tunoj + {0} mallonga tuno + {0} mallongaj tunoj + + + funtoj + {0} funto + {0} funtoj + po {0} je funto + + + uncoj + {0} unco + {0} uncoj + po {0} je unco + + + uncoj trojaj + {0} unco troja + {0} uncoj trojaj + + + karatoj + {0} karato + {0} karatoj + + + daltonoj + {0} daltono + {0} daltonoj + + + termasoj + {0} termaso + {0} termasoj + + + sunmasoj + {0} sunmaso + {0} sunmasoj + + + granoj + {0} grano + {0} granoj + + + gigavatoj + {0} gigavato + {0} gigavatoj + + + megavatoj + {0} megavato + {0} megavatoj + + + kilovatoj + {0} kilovato + {0} kilovatoj + + + vatoj + {0} vato + {0} vatoj + + + milivatoj + {0} milivato + {0} milivatoj + + + ĉevalpovoj + {0} ĉevalpovo + {0} ĉevalpovoj + + + milimetroj da hidrargo + {0} milimetro da hidrargo + {0} milimetroj da hidrargo + + + da hidrargo + {0} da hidrargo + {0} da hidrargo + + + funtfortoj sur kvadratcolo + {0} funtforto sur kvadratcolo + {0} funtfortoj sur kvadratcolo + + + coloj da hidrargo + {0} colo da hidrargo + {0} coloj da hidrargo + + + baroj + {0} baro + {0} baroj + + + milibaroj + {0} milibaro + {0} milibaroj + + + atmosferoj + {0} atmosfero + {0} atmosferoj + + + paskaloj + {0} paskalo + {0} paskaloj + + + hektopaskaloj + {0} hektopaskalo + {0} hektopaskaloj + + + kilopaskaloj + {0} kilopaskalo + {0} kilopaskaloj + + + megapaskaloj + {0} megapaskalo + {0} megapaskaloj - kilometroj en horo - {0} kilometro en horo - {0} kilometroj en horo + kilometroj en horo + {0} kilometro en horo + {0} kilometroj en horo + + + metroj en sekundo + po {0} metro en sekundo + po {0} metroj en sekundo + + + mejloj en horo + po {0} mejlo en horo + po {0} mejloj en horo + + + nodoj + {0} nodo + {0} nodoj + + + boforta skalo + {0} grado laŭ boforta skalo + {0} gradoj laŭ boforta skalo + + + gradoj de temperaturo + {0} grado de temperaturo + {0} gradoj de temperaturo - gradoj celsiaj - {0} grado celsia - {0} gradoj celsiaj + gradoj celsiaj + {0} grado celsia + {0} gradoj celsiaj + + + gradoj farenhejtaj + {0} grado farenhejta + {0} gradoj farenhejtaj + + + kelvinoj + {0} kelvino + {0} kelvinoj + + + neŭtono-metroj + {0} neŭtono-metro + {0} neŭtono-metroj + + + kubaj kilometroj + {0} kubkilometro + {0} kubkilometroj + + + kubaj metroj + {0} kubmetro + {0} kubmetroj + po {0} en kubmetro + + + kubaj centimetroj + {0} kubcentimetro + {0} kubcentimetroj + po {0} en kubcentimetro + + + megalitroj + {0} megalitro + {0} megalitroj + + + hektolitroj + {0} hektolitro + {0} hektolitroj - litroj - {0} litro - {0} litroj + litroj + {0} litro + {0} litroj + po {0} en litro + + + decilitroj + {0} decilitro + {0} decilitroj + + + centilitroj + {0} centilitro + {0} centilitroj + + + mililitroj + {0} mililitro + {0} mililitroj + + + duonkvartoj metraj + {0} duonkvarto metra + {0} duonkvartoj metraj + + + kvaronkvartoj metraj + {0} kvaronkvarto metra + {0} kvaronkvartoj metraj + + + fluiduncoj metraj + {0} fluidunco metra + {0} fluiduncoj metraj + + + kvaronkvartoj usonaj + {0} kvaronkvarto usona + {0} kvaronkvartoj usonaj + + + steradianoj + {0} steradiano + {0} steradianoj + + + kataloj + {0} katalo + {0} kataloj + + + kulomboj + {0} kulombo + {0} kulomboj + + + faradoj + {0} farado + {0} faradoj + + + henroj + {0} henro + {0} henroj + + + simensoj + {0} simenso + {0} simensoj + + + kalorioj [IT] + {0} kalorio [IT] + {0} kalorioj [IT] + + + bekereloj + {0} bekerelo + {0} bekereloj + + + sivertoj + {0} siverto + {0} sivertoj + + + grajoj + {0} grajo + {0} grajoj + + + kilogramfortoj + {0} kilogramforto + {0} kilogramfortoj + + + tesloj + {0} teslo + {0} tesloj + + + veberoj + {0} vebero + {0} veberoj + + + lum + {0} lum + {0} lum + + + miliardonoj + {0} miliardono + {0} miliardonoj - noktoj - {0} nokto - {0} noktoj - po {0} por nokto + noktoj + {0} nokto + {0} noktoj + po {0} en nokto - direkto - {0} oriente - {0} norde - {0} sude - {0} okcidente + mond-direkto + {0} oriente + {0} norde + {0} sude + {0} okcidente + + g₀ + {0} g₀ + {0} g₀ + + + {0} m/s² + {0} m/s² + + + riv. + {0} riv. + {0} riv. + + + {0} rad + {0} rad + + + ° + + + + + + + + + {0} km² + {0} km² + - ha + ha + {0} ha + {0} ha + + + {0} m² + {0} m² + + + {0} cm² + {0} cm² + + + {0} mi² + {0} mi² + + + akreoj + {0} akreo + {0} akreoj + + + {0} yd² + {0} yd² + + + {0} ft² + {0} ft² + + + {0} in² + {0} in² + + + karatoj + {0} kt + {0} kt + + + mg/dl + {0} mg/dl + {0} mg/dl + + + mmol/l + {0} mmol/l + {0} mmol/l + + + ekz. + {0} ekz. + {0} ekz. + + + {0} ppm + {0} ppm + + + {0} % + {0} % + + + {0} ‰ + {0} ‰ + + + {0} ‱ + {0} ‱ + + + {0} mol + {0} mol + + + Glc + + + l/km + {0} l/km + {0} l/km + + + l/100 km + {0} l/100 km + {0} l/100 km + + + {0} PB + {0} PB + + + {0} TB + {0} TB + + + {0} Tb + {0} Tb + + + {0} GB + {0} GB + + + {0} Gb + {0} Gb + + + {0} MB + {0} MB + + + {0} Mb + {0} Mb + + + {0} kB + {0} kB + + + {0} kb + {0} kb + + + B + {0} B + {0} B + + + b + {0} b + {0} b - jarcent. - {0} jarcent. - {0} jarcent. + jc. + {0} jc. + {0} jc. - jardek. - {0} jardek. - {0} jardek. + jd. + {0} jd. + {0} jd. - j. - {0} j. - {0} j. - {0}/j. + a + {0} a + {0} a + {0}/a + + + jk-onoj + {0} jk-ono + {0} jk-onoj + {0}/jk-ono - monato + mon. {0} mon. {0} mon. + {0}/mon. - semajno + sem. + {0} sem. + {0} sem. + {0}/sem. - tago - {0} t. - {0} t. + tagoj + {0} d + {0} d - horo - {0} h. - {0} h. - {0}/h. + h + {0} h + {0} h - minuto - {0} m. - {0} m. + {0} min + {0} min - sekundo - {0} s. - {0} s. - {0}/s. + s + {0} s + {0} s - milisekundo - {0} ms. - {0} ms. + {0} ms + {0} ms + + + {0} μs + {0} μs + + + {0} ns + {0} ns + + + A + {0} A + {0} A + + + {0} mA + {0} mA + + + Ω + {0} Ω + {0} Ω + + + V + {0} V + {0} V + + + {0} kcal + {0} kcal + + + {0} cal + {0} cal + + + {0} kJ + {0} kJ + + + J + {0} J + {0} J + + + {0} kWh + {0} kWh + + + {0} eV + {0} eV + + + {0} N + {0} N + + + kWh/100 km + {0} kWh/100 km + {0} kWh/100 km + + + {0} GHz + {0} GHz + + + {0} MHz + {0} MHz + + + {0} kHz + {0} kHz + + + {0} Hz + {0} Hz + + + {0} R⊕ + {0} R⊕ + + + {0} km + {0} km - m + m + {0} m + {0} m + + + {0} dm + {0} dm + + + {0} cm + {0} cm + + + {0} mm + {0} mm + + + {0} μm + {0} μm + + + {0} nm + {0} nm + + + {0} pm + {0} pm + + + {0} mi + {0} mi + + + {0} yd + {0} yd + + + {0} ft + {0} ft + + + {0} in + {0} in + + + {0} pc + {0} pc - lj - {0} lj - {0} lj + lj + {0} lj + {0} lj + + + {0} au + {0} au + + + {0} nmi + {0} nmi + + + {0} smi + {0} smi + + + punktoj + {0} punkto + {0} punktoj + + + {0} R☉ + {0} R☉ + + + {0} lx + {0} lx + + + {0} cd + {0} cd + + + {0} lm + {0} lm + + + {0} t + {0} t + + + {0} kg + {0} kg - g + g + {0} g + {0} g + + + {0} mg + {0} mg + + + {0} μg + {0} μg + + + m-l. tunoj + {0} m-l. tuno + {0} m-l. tunoj + + + {0} lb + {0} lb + + + {0} oz + {0} oz + + + {0} oz t + {0} oz t + + + karatoj + {0} ct + {0} ct + + + daltonoj + {0} Da + {0} Da + + + {0} M⊕ + {0} M⊕ + + + {0} M☉ + {0} M☉ + + + granoj + {0} gr + {0} gr + + + {0} GW + {0} GW + + + {0} MW + {0} MW + + + {0} kW + {0} kW + + + W + {0} W + {0} W + + + {0} mW + {0} mW + + + ĈP + {0} ĈP + {0} ĈP + + + mmHg + {0} mmHg + {0} mmHg + + + da Hg + {0} da Hg + {0} da Hg + + + lbf/in² + {0} lbf/in² + {0} lbf/in² + + + {0} inHg + {0} inHg + + + {0} bar + {0} bar + + + {0} mbar + {0} mbar + + + {0} atm + {0} atm + + + {0} Pa + {0} Pa + + + {0} hPa + {0} hPa + + + {0} kPa + {0} kPa + + + {0} MPa + {0} MPa + + + {0} km/h + {0} km/h + + + {0} m/s + {0} m/s + + + {0} mi/h + {0} mi/h + + + nodoj + {0} nodo + {0} nodoj + + + {0} Bft + {0} Bft + + + {0} ° + {0} ° - {0} °C - {0} °C + {0} °C + {0} °C + + + {0} °F + {0} °F + + + {0} K + {0} K + + + {0} N⋅m + {0} N⋅m + + + {0} km³ + {0} km³ + + + {0} m³ + {0} m³ + + + {0} cm³ + {0} cm³ + + + Ml + {0} Ml + {0} Ml + + + hl + {0} hl + {0} hl - L - {0} L - {0} L + l + {0} l + {0} l + + + dl + {0} dl + {0} dl + + + cl + {0} cl + {0} cl + + + ml + {0} ml + {0} ml + + + duonkvartoj metraj + {0} duonkvarto metra + {0} duonkvartoj metraj + + + kvaronkvartoj metraj + {0} kvaronkvarto metra + {0} kvaronkvartoj metraj + + + fl oz m. + {0} fl oz m. + {0} fl oz m. + + + kvaronkvartoj usonaj + {0} kvaronkvarto usona + {0} kvaronkvartoj usonaj + + + cal [IT] + {0} cal [IT] + {0} cal [IT] + + + lum + {0} lum + {0} lum + + + {0} ppb + {0} ppb - nokt. - {0} nokt. - {0} nokt. - {0}/nokto + nokt. + {0} nokt. + {0} nokt. + {0}/nokto - direkto - {0} E - {0} N - {0} S - {0} W + direkto + {0} E + {0} N + {0} S + {0} W + + g₀ + {0} g₀ + {0} g₀ + + + {0} m/s² + {0} m/s² + + + riv. + {0} riv. + {0} riv. + + + {0} rad + {0} rad + + + ° + + + + + + + - {0}km² - {0}km² + {0} km² + {0} km² - {0}ha - {0}ha + {0} ha + {0} ha - {0}m² - {0}m² + {0} m² + {0} m² - {0}cm² - {0}cm² + {0} cm² + {0} cm² + + + {0} mi² + {0} mi² + + + akreoj + {0} akreo + {0} akreoj + + + {0} yd² + {0} yd² + + + {0} ft² + {0} ft² + + + {0} in² + {0} in² + + + {0} kt + {0} kt + + + mg/dl + {0} mg/dl + {0} mg/dl + + + mmol/l + {0} mmol/l + {0} mmol/l + + + ekz. + {0} ekz. + {0} ekz. + + + {0} ppm + {0} ppm + + + {0} % + {0} % + + + {0} ‰ + {0} ‰ + + + {0} ‱ + {0} ‱ + + + {0} mol + {0} mol + + + Glc + + + l/km + {0} l/km + {0} l/km + + + l/100 km + {0} l/100 km + {0} l/100 km + + + {0} PB + {0} PB + + + {0} TB + {0} TB + + + {0} Tb + {0} Tb + + + {0} GB + {0} GB + + + {0} Gb + {0} Gb + + + {0} MB + {0} MB + + + {0} Mb + {0} Mb + + + {0} kB + {0} kB + + + {0} kb + {0} kb + + + B + {0} B + {0} B + + + b + {0} b + {0} b - jc. - {0} jc. - {0} jc. + jc. + {0} jc. + {0} jc. - jd. - {0} jd. - {0} jd. + jd. + {0} jd. + {0} jd. - a - {0} a - {0} a - {0}/a + a + {0} a + {0} a + {0}/a + + + jk-onoj + {0} jk-ono + {0} jk-onoj + {0}/jk-ono + + + mon. + {0}/mon. + + + sem. + {0} sem. + {0} sem. + {0}/sem. - t. - {0}t. - {0}t. + d + {0} d + {0} d - h. - {0}h. - {0}h. + h + {0} h + {0} h + {0}/h - m. - {0}m. - {0}m. + min + {0} min + {0} min - s. - {0}s. - {0}s. + s + {0} s + {0} s + {0}/s - ms. - {0}ms. - {0}ms. + ms + {0} ms + {0} ms + + + {0} μs + {0} μs + + + {0} ns + {0} ns + + + A + {0} A + {0} A + + + {0} mA + {0} mA + + + Ω + {0} Ω + {0} Ω + + + V + {0} V + {0} V + + + {0} kcal + {0} kcal + + + {0} cal + {0} cal + + + {0} kJ + {0} kJ + + + J + {0} J + {0} J + + + {0} kWh + {0} kWh + + + {0} eV + {0} eV + + + {0} N + {0} N + + + kWh/100 km + {0} kWh/100 km + {0} kWh/100 km + + + {0} GHz + {0} GHz + + + {0} MHz + {0} MHz + + + {0} kHz + {0} kHz + + + {0} Hz + {0} Hz + + + {0} R⊕ + {0} R⊕ - {0}km - {0}km + {0} km + {0} km - {0}m - {0}m + {0} m + {0} m - {0}dm - {0}dm + {0} dm + {0} dm - {0}cm - {0}cm + {0} cm + {0} cm - {0}mm - {0}mm + {0} mm + {0} mm - {0}μm - {0}μm + {0} μm + {0} μm - {0}nm - {0}nm + {0} nm + {0} nm - {0}pm - {0}pm + {0} pm + {0} pm + + + {0} mi + {0} mi + + + {0} yd + {0} yd + + + {0} ft + {0} ft + + + {0} in + {0} in - {0}pc - {0}pc + {0} pc + {0} pc - {0}lj - {0}lj + {0} lj + {0} lj - {0}au - {0}au + {0} au + {0} au + + + {0} nmi + {0} nmi + + + {0} smi + {0} smi + + + pt. + {0} pt. + {0} pt. + + + {0} R☉ + {0} R☉ + + + {0} lx + {0} lx + + + {0} cd + {0} cd + + + {0} lm + {0} lm + + + {0} t + {0} t - {0}kg - {0}kg + {0} kg + {0} kg - {0}g - {0}g + {0} g + {0} g + + + {0} mg + {0} mg + + + {0} μg + {0} μg + + + m-l. tunoj + {0} m-l. tuno + {0} m-l. tunoj + + + {0} lb + {0} lb + + + {0} oz + {0} oz + + + {0} oz t + {0} oz t + + + ct + {0} ct + {0} ct + + + {0} Da + {0} Da + + + {0} M⊕ + {0} M⊕ + + + {0} M☉ + {0} M☉ + + + gr + {0} gr + {0} gr + + + {0} GW + {0} GW + + + {0} MW + {0} MW + + + {0} kW + {0} kW + + + W + {0} W + {0} W + + + {0} mW + {0} mW + + + ĈP + {0} ĈP + {0} ĈP + + + mmHg + {0} mmHg + {0} mmHg + + + da Hg + {0} da Hg + {0} da Hg + + + lbf/in² + {0} lbf/in² + {0} lbf/in² + + + {0} inHg + {0} inHg + + + {0} bar + {0} bar + + + {0} mbar + {0} mbar + + + {0} atm + {0} atm + + + {0} Pa + {0} Pa + + + {0} hPa + {0} hPa + + + {0} kPa + {0} kPa + + + {0} MPa + {0} MPa - {0}km/h - {0}km/h + {0} km/h + {0} km/h + + + {0} m/s + {0} m/s + + + {0} mi/h + {0} mi/h + + + nd. + {0} nd. + {0} nd. + + + {0} Bft + {0} Bft + + + {0} ° + {0} ° - {0}°C - {0}°C + {0} °C + {0} °C + + + {0} °F + {0} °F + + + {0} K + {0} K + + + {0} N⋅m + {0} N⋅m + + + {0} km³ + {0} km³ + + + {0} m³ + {0} m³ + + + {0} cm³ + {0} cm³ + + + Ml + {0} Ml + {0} Ml + + + hl + {0} hl + {0} hl - {0}L - {0}L + l + {0} l + {0} l - - n. - {0} n. - {0} n. - {0}/n. + + dl + {0} dl + {0} dl + + + cl + {0} cl + {0} cl + + + ml + {0} ml + {0} ml + + + duonkvartoj m. + {0} duonkvarto m. + {0} duonkvartoj m. + + + kvaronkvartoj m. + {0} kvaronkvarto m. + {0} kvaronkvartoj m. + + + fl oz m. + {0} fl oz m. + {0} fl oz m. + + + kvaronkvartoj us. + {0} kvaronkvarto us. + {0} kvaronkvartoj us. + + + cal [IT] + {0} cal [IT] + {0} cal [IT] + + + lum + {0} lum + {0} lum + + + {0} ppb + {0} ppb - - direkto - - {0} kaj {1} - {0} kaj {1} + {0} kaj {1} + {0} kaj {1} - {0} aŭ {1} - {0} aŭ {1} - - - {0} aŭ {1} - {0} aŭ {1} - - - {0} aŭ {1} - {0} aŭ {1} + {0} aŭ {1} + {0} aŭ {1} - {0}, {1} - {0}, {1} + {0}, {1} + {0}, {1} - {0} k {1} - {0} k {1} + {0} k {1} + {0} k {1} - {0} {1} - {0} {1} - {0} {1} - {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} - {0}, {1} - {0}, {1} + {0}, {1} + {0}, {1} - jes:j - ne:n + jes:j + ne:n diff --git a/make/data/cldr/common/main/es.xml b/make/data/cldr/common/main/es.xml index 3ef6d339a66..d65824d006c 100644 --- a/make/data/cldr/common/main/es.xml +++ b/make/data/cldr/common/main/es.xml @@ -294,6 +294,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurdo + kurdo + kurmanji kumyk kutenai komi @@ -821,6 +823,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombia Isla Clipperton + Sark Costa Rica Cuba Cabo Verde @@ -1097,33 +1100,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ orden numérico intensidad de orden moneda + presentación del emoji ciclo horario (12 o 24 horas) estilo de salto de línea + salto de línea en palabras sistema de medición números + salto de oración después de abreviatura zona horaria variante local uso privado calendario budista + budista calendario chino + chino calendario cóptico + cóptico calendario dangi + dangi calendario etíope + etíope calendario etíope Amete Alem + etíope Amete Alem calendario gregoriano + gregoriano calendario hebreo + hebreo calendario nacional hindú calendario hijri + hijri calendario hijri tabular + hijri tabular calendario hijri Umm al-Qura + hijri Umm al-Qura calendario ISO-8601 calendario japonés + japonés calendario persa + persa calendario de la República de China + de la República de China formato de moneda de contabilidad + contabilidad formato de moneda estándar + estándar Ordenar símbolos Ordenar ignorando símbolos Ordenar acentos normalmente @@ -1133,22 +1155,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordenar empezando por mayúsculas Ordenar sin distinguir entre mayúsculas y minúsculas Ordenar distinguiendo entre mayúsculas y minúsculas - orden del chino tradicional - Big5 orden anterior, para compatibilidad + compatibilidad orden de diccionario + diccionario orden predeterminado de Unicode + predeterminado de Unicode reglas de ordenación europeas - orden del chino simplificado - GB2312 orden de listín telefónico + listín telefónico orden fonético + fonético orden pinyin + pinyin búsqueda de uso general + búsqueda Buscar por consonante inicial de hangul orden estándar + estándar orden de los trazos + trazos orden tradicional + tradicional orden de trazos radicales + trazos radicales orden zhuyin + zhuyin Ordenar sin normalización Ordenar con normalización Unicode Ordenar dígitos individualmente @@ -1161,18 +1193,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ancho completo ancho medio Numérico + predeterminado + emoji + texto sistema de 12 horas (0–11) + 12 (0–11) sistema de 12 horas (1–12) + 12 (1–12) sistema de 24 horas (0–23) + 24 (0–23) sistema de 24 horas (1–24) + 24 (1–24) estilo de salto de línea flexible + flexible estilo de salto de línea normal + normal estilo de salto de línea estricto + estricto + dividir todas + conservar todas + normal + conservar en sintagmas transliteración USBGN transliteración UNGEGN sistema métrico + métrico sistema imperial + británico sistema estadounidense + estadounidense dígitos indoarábigos dígitos indoarábigos extendidos números en armenio @@ -1217,6 +1266,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dígitos en tibetano Números tradicionales dígitos en vai + desactivado + activado métrico @@ -1267,9 +1318,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1408,11 +1456,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'a' 'las' {0} + {1}, {0} + + {1} 'a' 'las' {0} + @@ -1429,16 +1483,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G d/M/y GGGGG + E, d/M/y G MMM y G d MMM y G E, d MMM y G MMMM 'de' y G d 'de' MMMM 'de' y G E, d 'de' MMMM 'de' y G - h a h:mm a h:mm:ss a + H 'h' v d/M E, d/M d MMM @@ -1500,7 +1556,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1522,7 +1577,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1794,6 +1848,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'a' 'las' {0} + @@ -1812,14 +1869,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, h:mm:ss a E, H:mm:ss y G - d/M/y GGGGG + M/y G + d/M/y G + E, d/M/y G MMM y G d MMM y G E, d MMM y G MMMM 'de' y G d 'de' MMMM 'de' y G E, d 'de' MMMM 'de' y G - h a H h:mm a H:mm @@ -1831,6 +1889,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm:ss (vvvv) h:mm a v H:mm v + H 'h' v d/M E, d/M d/M @@ -1895,10 +1954,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM y G E, d MMM y – E, d MMM y G - - h a – h a - h–h a - H–H @@ -1920,10 +1975,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm–H:mm v H:mm–H:mm v - - h a – h a v - h–h a v - H–H v @@ -2671,21 +2722,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Anguila - - Tirana - Ereván - - Río Gallegos - - - Tucumán - - - Córdoba - Viena @@ -2725,36 +2764,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Brunéi - - Eirunepé - Río Branco Manaos - - Cuiabá - - - Santarém - Belén - - Araguaína - - - São Paulo - Bahía - - Maceió - Timbu @@ -2779,15 +2800,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Duala - - Ürümqi - Shanghái - - Bogotá - La Habana @@ -2815,21 +2830,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Argel - - Galápagos - Tallin El Cairo - - El Aaiún - - - Canarias - Adís Abeba @@ -2921,7 +2927,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tokio - Enderbury + Isla Kanton Comoras @@ -2992,12 +2998,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldivas - - Mazatlán - - - Ciudad de México - Numea @@ -3091,9 +3091,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riad - - Mahé - Jartum @@ -3124,9 +3121,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Yamena - - Lomé - Dusambé @@ -3225,9 +3219,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - hora de África occidental - hora estándar de África occidental - hora de verano de África occidental + hora de África occidental @@ -3621,6 +3613,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hora de Guyana + + + hora estándar de Hawái-Aleutianas + + hora de Hawái-Aleutianas @@ -4071,6 +4068,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hora de Chuuk + + + Hora de Turquía + Hora estándar de Turquía + Hora de verano de Turquía + + hora de Turkmenistán @@ -4234,7 +4238,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4245,24 +4252,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 00 mil ¤ 000 mil ¤ 000 mil ¤ - 0 M¤ - 0 M¤ - 00 M¤ - 00 M¤ - 000 M¤ - 000 M¤ - 0000 M¤ - 0000 M¤ - 00 mil M¤ - 00 mil M¤ - 000 mil M¤ - 000 mil M¤ - 0 B¤ - 0 B¤ - 00 B¤ - 00 B¤ - 000 B¤ - 000 B¤ + 0 M ¤ + 0 M ¤ + 00 M ¤ + 00 M ¤ + 000 M ¤ + 000 M ¤ + 0000 M ¤ + 0000 M ¤ + 00 mil M ¤ + 00 mil M ¤ + 000 mil M ¤ + 000 mil M ¤ + 0 B ¤ + 0 B ¤ + 00 B ¤ + 00 B ¤ + 000 B ¤ + 000 B ¤ @@ -5631,6 +5638,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dólar de Zimbabue + + oro zimbabuense + oro zimbabuense + oro zimbabuense + dólar zimbabuense @@ -5884,7 +5896,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - + + partes + {0} parte + {0} partes + + feminine partes por millón {0} parte por millón @@ -5911,6 +5928,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} moles + + de glucosa + {0} de glucosa + {0} de glucosa + masculine litros por kilómetro @@ -6536,6 +6558,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milímetro de mercurio {0} milímetros de mercurio + + de mercurio + {0} de mercurio + {0} de mercurio + libras por pulgada cuadrada {0} libra por pulgada cuadrada @@ -6744,6 +6771,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} taza métrica {0} tazas métricas + + onzas líquidas métricas + {0} onza líquida métrica + {0} onzas líquidas métricas + acres-pies {0} acre-pie @@ -6855,13 +6887,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cuarto imperial {0} cuartos imperiales + + estereorradianes + {0} estereorradián + {0} estereorradianes + + + katales + {0} katal + {0} katales + + + culombios + {0} culombio + {0} culombios + + + faradios + {0} faradio + {0} faradios + + + henrios + {0} henrio + {0} henrios + + + siemens + {0} siemens + {0} siemens + + + calorías [IT] + {0} caloría [IT] + {0} calorías [IT] + + + bequereles + {0} bequerel + {0} bequereles + + + siéverts + {0} siévert + {0} siéverts + + + grais + {0} gray + {0} grais + + + kilogramos fuerza + {0} kilogramo fuerza + {0} kilogramos fuerza + + + teslas + {0} tesla + {0} teslas + + + webers + {0} weber + {0} webers + feminine - luz - {0} luz - {0} luz - + feminine partes por millardo {0} parte por millardo @@ -6869,9 +6963,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - noches - {0} noche - {0} noches {0} por noche @@ -6920,6 +7011,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ítem {0} ítems + + parte + {0} parte + {0} partes + por ciento {0} % @@ -6935,6 +7031,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -7124,6 +7223,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + de Hg + {0} de Hg + {0} de Hg + {0} °C {0} °C @@ -7252,12 +7356,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt imp. {0} qt imp. + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} kgf + {0} kgf + luz {0} luz {0} luz - + partes/millardo @@ -7359,7 +7472,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ít {0}ít - + + parte + {0} parte + {0} partes + + {0}ppm {0}ppm @@ -7380,6 +7498,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glc + {0}l/km {0}l/km @@ -7810,6 +7931,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg {0}mmHg + + de Hg + {0} de Hg + {0} de Hg + {0}psi {0}psi @@ -8021,20 +8147,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt imp {0}qt imp + + cal-IT + - luz {0}luz {0}luz - + {0}ppb {0}ppb - noches {0}noche {0}noches - {0}/noche {0}E @@ -8356,7 +8482,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {surname} {surname2}, {title} {given} {given2} - {surname} {surname2}, {given-informal} + {surname}, {given-informal} {surname} {surname2}, {given-informal} diff --git a/make/data/cldr/common/main/es_419.xml b/make/data/cldr/common/main/es_419.xml index 1c73bc6db40..641447db5df 100644 --- a/make/data/cldr/common/main/es_419.xml +++ b/make/data/cldr/common/main/es_419.xml @@ -23,17 +23,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ vasco alemán de la alta edad antigua griego clásico - gujarati haitiano cabardiano karachái-bálkaro - cachemiro + kurmanyi genovés malabar manipuri ndebele del sur sesotho del norte - panyabí prusiano antiguo pashtún retorrománico @@ -41,7 +39,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ árabe (Chad) sami del sur sesotho del sur - swahili swahili (Congo) siríaco tetun @@ -95,10 +92,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ orden normalizado + presentación de emojis + saltos de línea entre palabras calendario islámico (Arabia Saudita) calendario islámico tabular + calendario chino ordenar símbolos ordenar ignorando símbolos ordenar acentos normalmente @@ -108,11 +108,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ordenar empezando por mayúsculas ordenar sin distinguir entre mayúsculas y minúsculas ordenar distinguiendo entre mayúsculas y minúsculas + unicode predeterminado reglas de orden europeas orden de agenda telefónica + agenda telefónica + fonética + trazo + trazo radical + introducir saltos + conservar todos + conservar en frases dígitos en tirh números traducionales dígitos en Warang Citi + no + Alfabeto: {0} @@ -394,12 +404,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM – E d MMM 'de' y G E d MMM 'de' y – E d MMM 'de' y G - - h a–h a - - - h:mm a–h:mm a v - h a–h a v @@ -571,12 +575,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ día hábil del mes - - - en {0} domingo - en {0} domingos - - a.m./p.m. @@ -589,9 +587,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hora universal coordinada - - ciudad desconocida - Nasáu @@ -601,9 +596,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Santiago - - Büsingen - Islas Canarias @@ -779,7 +771,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 + ¤ #,##0.00 + + + ¤ #,##0.00 @@ -788,14 +783,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ 0 K ¤0 K ¤ 0 K - ¤00 K - ¤ 00 K - ¤00 K - ¤ 00 K - ¤000 K - ¤ 000 K - ¤000 K - ¤ 000 K + ¤00 k + ¤ 00 k + ¤00 k + ¤ 00 k + ¤000 k + ¤ 000 k + ¤000 k + ¤ 000 k ¤0 M ¤ 0 M ¤0 M @@ -812,14 +807,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ 0000 M ¤0000 M ¤ 0000 M - ¤00 MRD - ¤ 00 MRD - ¤00 MRD - ¤ 00 MRD - ¤000 MRD - ¤ 000 MRD - ¤000 MRD - ¤ 000 MRD + ¤00 mil M + ¤ 00 mil M + ¤00 mil M + ¤ 00 mil M + ¤000 mil M + ¤ 000 mil M + ¤000 mil M + ¤ 000 mil M ¤0 B ¤ 0 B ¤0 B @@ -924,6 +919,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} unidad de fuerza gravitacional {0} unidades de fuerza gravitacional + + {0} parte + {0} partes + amperes {0} ampere @@ -992,7 +991,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} onza fluida {0} onzas fluidas - + + {0} siemens + {0} siemens + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + partes por mil millones {0} parte por mil millones {0} partes por mil millones @@ -1007,6 +1020,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ grados + + {0} parte + {0} parte + {0} mpg imp. {0} mpg imp. @@ -1084,6 +1101,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} hp {0} hp + + fl oz m + {0} fl oz m + {0} fl oz m + pintas {0} pt @@ -1103,17 +1125,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cdta. {0} cdtas. + + partes/mil millones + {0} ppmm + {0} ppmm + metros² + + {0}parte + {0}parte + + + {0}Glc + {0}Glc + a. {0}a. @@ -1140,10 +1175,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}thm EE.UU. {0}thm EE.UU. - - {0} kWh/100km - {0} kWh/100km - {0}p {0}p @@ -1180,14 +1211,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hp {0}hp - - B {0} - B {0} + + {0}de Hg + {0}de Hg {0}ml {0}ml + + fl oz m + {0}fl oz m + {0}fl oz m + {0} ac ft {0}ac ft @@ -1201,9 +1237,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}bbl {0}bbl - - {0} luz - {0} luz + + {0}sr + {0}sr + + + {0}kat + {0}kat + + + {0}C + {0}C + + + {0}F + {0}F + + + {0}H + {0}H + + + {0}S + {0}S + + + {0}cal-IT + {0}cal-IT + + + {0}Bq + {0}Bq + + + {0}Sv + {0}Sv + + + {0}Gy + {0}Gy + + + {0}kgf + {0}kgf + + + {0}T + {0}T + + + {0}Wb + {0}Wb + + + ppmm + {0}ppmm + {0}ppmm {0} noche @@ -1216,67 +1305,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} — Extendido {0} — Histórico {0} — Miscelánea - Símbolos de escritura — {0} - Símbolos de escritura de África - Símbolos de escritura de América - animal - naturaleza y animales - flecha - cuerpo - Cuadro de dibujo - edificio - Jamo consonántico - símbolos de monedas - Guion/conector - dígitos - Flechas hacia arriba y hacia abajo - Símbolos de escritura de Europa - femenino - bandera - banderas - Formato - formato y espacio duro - Variantes de formato de ancho completo - Formas geométricas + Cuadros de dibujo Variantes de formato de ancho medio - caracteres Han - Radicales Han Hanzi (simplificado) Hanzi (tradicional) - corazón - Símbolos de escritura históricos Kana japonés - tecla mayus - Flechas hacia la derecha y hacia la izquierda - símbolos con letras - uso limitado - Símbolos de escritura de Oriente Medio - Miscelánea - sistemas de escritura modernos - Modificador - naturaleza - sin espaciado - otros - Asociado - persona - alfabeto fonético - lugar - planta - señal o símbolo - Variantes de formato pequeño - Caras sonrientes - sistemas de escritura de Asia del Sur - sistemas de escritura de Asia Sudoriental - deporte - símbolo - marcas tonales - viaje - viajes y destinos - variantes - Jamo vocálico - clima - sistemas de escritura de Asia Occidental - espacio duro + Clima ancho diff --git a/make/data/cldr/common/main/es_AR.xml b/make/data/cldr/common/main/es_AR.xml index 03b6e24afba..eb90b063702 100644 --- a/make/data/cldr/common/main/es_AR.xml +++ b/make/data/cldr/common/main/es_AR.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -181,9 +179,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm–HH:mm HH:mm–HH:mm - - h:mm a – h:mm a v - HH:mm–HH:mm v HH:mm–HH:mm v @@ -309,6 +304,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/es_BO.xml b/make/data/cldr/common/main/es_BO.xml index 645549fbcf5..89cb92dfd07 100644 --- a/make/data/cldr/common/main/es_BO.xml +++ b/make/data/cldr/common/main/es_BO.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_CL.xml b/make/data/cldr/common/main/es_CL.xml index f5c2f863db9..63b6af9f5e6 100644 --- a/make/data/cldr/common/main/es_CL.xml +++ b/make/data/cldr/common/main/es_CL.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -301,6 +299,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/es_CO.xml b/make/data/cldr/common/main/es_CO.xml index 2919b0a070f..c36b3901eb4 100644 --- a/make/data/cldr/common/main/es_CO.xml +++ b/make/data/cldr/common/main/es_CO.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -66,7 +64,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d MMM 'de' y G - {0} ‘al’ {1} + {0} al {1} d 'a' d @@ -265,7 +263,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic d 'de' MMM 'de' y - {0} ‘al’ {1} + {0} al {1} d 'a' d diff --git a/make/data/cldr/common/main/es_CR.xml b/make/data/cldr/common/main/es_CR.xml index 693ace12f91..b11058c94be 100644 --- a/make/data/cldr/common/main/es_CR.xml +++ b/make/data/cldr/common/main/es_CR.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_DO.xml b/make/data/cldr/common/main/es_DO.xml index 99a314f62e4..752562a350f 100644 --- a/make/data/cldr/common/main/es_DO.xml +++ b/make/data/cldr/common/main/es_DO.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -142,6 +140,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/es_EC.xml b/make/data/cldr/common/main/es_EC.xml index a813242deaa..9b00018403c 100644 --- a/make/data/cldr/common/main/es_EC.xml +++ b/make/data/cldr/common/main/es_EC.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -212,6 +210,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/es_GQ.xml b/make/data/cldr/common/main/es_GQ.xml index 556267534f4..eaacd908006 100644 --- a/make/data/cldr/common/main/es_GQ.xml +++ b/make/data/cldr/common/main/es_GQ.xml @@ -16,6 +16,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 + ¤ #,##0.00 + + + ¤ #,##0.00 diff --git a/make/data/cldr/common/main/es_GT.xml b/make/data/cldr/common/main/es_GT.xml index 9137c3bd3d5..8f3924b4f7b 100644 --- a/make/data/cldr/common/main/es_GT.xml +++ b/make/data/cldr/common/main/es_GT.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_HN.xml b/make/data/cldr/common/main/es_HN.xml index 9be7f572ca7..ac4278011e4 100644 --- a/make/data/cldr/common/main/es_HN.xml +++ b/make/data/cldr/common/main/es_HN.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_MX.xml b/make/data/cldr/common/main/es_MX.xml index be625c9581e..6046b9fc4ee 100644 --- a/make/data/cldr/common/main/es_MX.xml +++ b/make/data/cldr/common/main/es_MX.xml @@ -51,11 +51,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic sotho septentrional ojibwa del noroeste ojibwa del oeste - punyabí árabe chadiano lushootseed del sur siswati - suajili suajili del Congo siriaco tutchone del sur @@ -86,7 +84,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendario minguo + minguo orden de clasificación de Unicode predeterminado + fonético + trazos + trazos radicales + dividir todo + conservar todo dígitos en gujarati dígitos en manipuri dígitos ol chiki @@ -268,9 +272,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm–HH:mm HH:mm–HH:mm - - h:mm a – h:mm a v - HH:mm–HH:mm v HH:mm–HH:mm v @@ -400,10 +401,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic el domingo pasado este domingo el domingo próximo - - dentro de {0} domingo - dentro de {0} domingos - el lunes pasado @@ -448,7 +445,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic en {0} h - en {0} n + en {0} h @@ -592,50 +589,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 0000 M¤ - 0000 M ¤ - 0000 M¤ - 0000 M ¤ - 00 MRD ¤ - 00 MRD ¤ - 000 MRD ¤ - 000 MRD ¤ - 0 B¤ - 0 B ¤ - 0 B¤ - 0 B ¤ - 00 B¤ - 00 B ¤ - 00 B¤ - 00 B ¤ - 000 B¤ - 000 B ¤ - 000 B¤ - 000 B ¤ + ¤0 k + ¤ 0 k + ¤0 k + ¤ 0 k @@ -948,30 +905,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} atm {0}atm + + {0} cal-IT + {0} cal-IT + {0} — Históricos {0} — Varios mujer - Formato y espacio duro tecla - Símbolos con letras - Uso limitado hombre - Sistemas de escritura modernos - Otros - Alfabeto fonético - Símbolos de señales/estándar cara sonriente - Sistemas de escritura de Asia Sudoriental - Símbolos - Marcas tonales - Viajes y destinos - Variantes tiempo - Sistemas de escritura de Asia Occidental - Espacio duro mediana diff --git a/make/data/cldr/common/main/es_NI.xml b/make/data/cldr/common/main/es_NI.xml index 068c1766308..ab947f3752b 100644 --- a/make/data/cldr/common/main/es_NI.xml +++ b/make/data/cldr/common/main/es_NI.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_PA.xml b/make/data/cldr/common/main/es_PA.xml index 76ae5a0e0eb..4a2742aa13e 100644 --- a/make/data/cldr/common/main/es_PA.xml +++ b/make/data/cldr/common/main/es_PA.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_PE.xml b/make/data/cldr/common/main/es_PE.xml index aa0c0b9ab24..6ea4973ddd3 100644 --- a/make/data/cldr/common/main/es_PE.xml +++ b/make/data/cldr/common/main/es_PE.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof diff --git a/make/data/cldr/common/main/es_PY.xml b/make/data/cldr/common/main/es_PY.xml index 33fb2a11578..622cfe2bcb6 100644 --- a/make/data/cldr/common/main/es_PY.xml +++ b/make/data/cldr/common/main/es_PY.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -179,6 +177,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;¤ -#,##0.00 + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/es_US.xml b/make/data/cldr/common/main/es_US.xml index 98d53c4b12d..988aceeb3f0 100644 --- a/make/data/cldr/common/main/es_US.xml +++ b/make/data/cldr/common/main/es_US.xml @@ -44,6 +44,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ingusetio cabilio karachay-balkar + kurdo kurmanyi ligur creole de Luisiana lorí del norte @@ -100,11 +101,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Islas menores alejadas de EE. UU. + calendario coreano + coreano + chino + predeterminado Unicode + fonético + sistema piyin + trazos + trazos radicales + sistema zhuyin + emoticón + dividir todo + mantener todo + regular + mantener en frases dígitos chakma dígitos en gujarati dígitos javaneses dígitos meetei mayek dígitos ol chiki + desactivado + activado imperial @@ -124,6 +141,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + MM-y G + E, dd-MM-y G E, d/M/y GGGGG @@ -150,7 +169,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 1er trimestre 2.º trimestre - 3.º trimestre + 3er trimestre 4.º trimestre @@ -234,6 +253,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic E HH:mm E h:mm:ss a E HH:mm:ss + MM-y G + E, dd-MM-y G d MMM y G HH:mm:ss (vvvv) d/MM @@ -259,9 +280,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm–HH:mm HH:mm–HH:mm - - h:mm a – h:mm a v - HH:mm–HH:mm v HH:mm–HH:mm v @@ -316,12 +334,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic día sem. de m - - - dentro de {0} domingo - dentro de {0} domingos - - el mie. pasado este mié. @@ -333,11 +345,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - HST - HST - HDT - Honolulu @@ -476,6 +483,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de las islas Gilbert + + + HST + + HAT @@ -543,26 +555,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤00 B - ¤ 00 B - ¤00 B - ¤ 00 B - ¤000 B - ¤ 000 B - ¤000 B - ¤ 000 B - ¤0 T - ¤ 0 T - ¤0 T - ¤ 0 T - ¤00 T - ¤ 00 T - ¤00 T - ¤ 00 T - ¤000 T - ¤ 000 T - ¤000 T - ¤ 000 T + ¤00 K + ¤ 00 K + ¤00 K + ¤ 00 K + ¤000 K + ¤ 000 K + ¤000 K + ¤ 000 K @@ -618,6 +618,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwacha zambiano kwachas zambianos + + oro de Zimbabue + {0}a @@ -629,12 +632,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic centí{0} + + picó{0} + ronto {0} quecto {0} + + partes por millón + {0} parte por millón + {0} partes por millón + por ciento @@ -721,6 +732,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} libra fuerza-pie {0} libra fuerza-pies + + onza líquida métrica + acres-pies {0} acre-pie @@ -736,18 +750,73 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} dracma fluida {0} dreacmas fluidas + + estereorradián + + + katal + + + culombio + + + faradio + + + henrio + + + simens + {0} siemens + {0} siemens + + + caloría IT + {0} caloría IT + {0} calorías IT + + + sievert + + + gray + + + kilopondio + {0} kilopondio + {0} kilopondios + + + tesla + + + weber + - {0} luz + {0} de luces {0} luces + + parte por millón + {0} ppm + {0} ppm + + + {0} partes/millón + {0} pts./M + % + + {0} Glc + {0} Glc + byte @@ -838,12 +907,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} fl dracma {0} fl dracmas - - {0} luz - {0} de luces + + {0} F + {0} F - - partes/mil millones + + cal. IT + {0} cal. IT + {0} cal. IT + + + kp + {0} kp + {0} kp + + + {0} de luces + {0} de luces @@ -855,6 +935,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} arcsec {0}″ + + ppm + {0} ppm + {0} ppm + + + {0} Glc + {0} Glc + a {0}a @@ -897,6 +986,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mil {0}mil + + {0} de Hg + {0} de Hg + B @@ -912,6 +1005,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}bsh {0}bsh + + {0} F + {0}F + + + cal. IT + {0} cal. IT + {0} cal. IT + + + kp + {0} kp + {0} kp + {0}luz {0}luces diff --git a/make/data/cldr/common/main/es_UY.xml b/make/data/cldr/common/main/es_UY.xml index 75541c40b19..e0261af496f 100644 --- a/make/data/cldr/common/main/es_UY.xml +++ b/make/data/cldr/common/main/es_UY.xml @@ -126,6 +126,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/es_VE.xml b/make/data/cldr/common/main/es_VE.xml index ef44a1f55d9..c80f7c7b09e 100644 --- a/make/data/cldr/common/main/es_VE.xml +++ b/make/data/cldr/common/main/es_VE.xml @@ -19,9 +19,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic euskera griego antiguo sotho septentrional - punyabí siswati - suajili suajili del Congo setswana wolof @@ -169,6 +167,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/et.xml b/make/data/cldr/common/main/et.xml index 714746ef2db..1298eceea4c 100644 --- a/make/data/cldr/common/main/et.xml +++ b/make/data/cldr/common/main/et.xml @@ -302,7 +302,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kaingangi khasi saka - koyra chiini + koiratšiini khovari kikuju kõrmandžki @@ -330,6 +330,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölni kurdi + kurdi + kurmandži kumõki kutenai komi @@ -471,7 +473,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pennsylvania saksa mennoniidisaksa vanapärsia - Pfalzi + pfaltsi foiniikia paali pijini @@ -527,7 +529,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sena seri sölkupi - koyraboro senni + koiraborosenni sango vanaiiri žemaidi @@ -565,6 +567,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sukuma susu sumeri + sunvari rootsi suahiili Kongo suahiili @@ -613,7 +616,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tumbuka tuvalu tvii - taswaqi + tasavaki tahiti tõva tamasikti @@ -691,6 +694,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + @@ -711,6 +716,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -729,6 +735,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -743,6 +750,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -761,6 +769,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -779,7 +788,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + @@ -792,6 +803,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -800,12 +812,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + @@ -826,6 +840,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -846,6 +861,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -855,7 +871,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -962,7 +981,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hiina Colombia Clippertoni saar - Sark + Sark Costa Rica Kuuba Roheneemesaared @@ -1179,7 +1198,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Wallis ja Futuna Samoa pseudo-aktsent - pseudo-Bidi + pseudobidi Kosovo Jeemen Mayotte @@ -1245,35 +1264,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ numbrite järjestus järjestuskaalud vääring + Emoji esitlus 12 või 24 tunni süsteem reavahetuse laad + reavahetus sõnade vahel mõõdustik numbrid + lause poolitamine pärast lühendit ajavöönd lokaadi variant erakasutus budistlik kalender + budistlik Hiina kalender + Hiina kopti kalender + kopti dangi kalender + dangi Etioopia kalender + Etioopia Etioopia amete alemi kalender + Etioopia amete alemi Gregoriuse kalender + Gregoriuse juudi kalender + juudi India rahvuslik kalender hidžra kalender + hidžra hidžra kalender (tabelkalender, ilmalik) + hidžra (tabelkalender, ilmalik) hidžra kalender (Saudi Araabia, vaatluspõhine) hidžra kalender (tabelkalender, astronoomiline ajastu) hidžra kalender (Umm al-Qurá) + hidžra (Umm al-Qurá) ISO-8601 kalender Jaapani kalender + Jaapani Pärsia kalender + Pärsia Hiina Vabariigi kalender + Hiina Vabariigi arvelduse rahavorming + arveldus standardne rahavorming + standardne järjesta sümbolid eira järjestuses sümboleid diakriitikud tavajärjestuses @@ -1283,19 +1321,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ suurtäht järjestuses eespool tõstutundetu järjestus tõstutundlik järjestus - hiina traditsiooniline sortimisjärjestus (Big5) varasem sortimisjärjestus (ühilduvuse jaoks) sõnastiku sortimisjärjestus Unicode’i vaikejärjestus + vaike-Unicode emoji sortimisjärjestus Euroopa järjestusreeglid - hiina lihtsustatud sortimisjärjestus (GB2312) telefoniraamatu sortimisjärjestus foneetiline sortimisjärjestus pinyin’i sortimisjärjestus üldeesmärgiline otsing + otsing otsing korea alguskonsonandi järgi standardne järjestus + standardne kriipsude sortimisjärjestus traditsiooniline sortimisjärjestus võtmete-kriipsude sortimisjärjestus @@ -1312,18 +1351,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ täislaius poollaius Numbriline + vaikeväärtus + Emotikon + tekst 12-tunnine süsteem (0–11) + 12 (0–11) 12-tunnine süsteem (1–12) + 12 (1–12) 24-tunnine süsteem (0–23) + 24 (0–23) 24-tunnine süsteem (1–24) + 24 (1–24) paindlik reavahetuse laad + paindlik harilik reavahetuse laad + harilik jäik reavahetuse laad + jäik + vaheta kõik + jäta kõik + harilik + jäta fraasid transkriptsioon (BGN) transkriptsioon (UNGEGN) meetermõõdustik + meetriline inglise mõõdustik + ÜK USA mõõdustik + USA ahomi numbrid idaaraabia numbrid laiendatud idaaraabia numbrid @@ -1340,12 +1396,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ etioopia numbrid finantsnumbrid täislaiusega numbrid + garai numbrid gruusia numbrid Gūnjāla gondi numbrid Masarami gondi numbrid kreeka numbrid väiketähelised kreeka numbrid gudžarati numbrid + gurungi numbrid gurmukhi numbrid hiina kümnendnumbrid lihtsustatud hiina keele numbrid @@ -1354,6 +1412,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ traditsioonilise hiina keele finantsnumbrid heebrea numbrid phahau-hmongi numbrid + Chervangi numbrid jaava numbrid jaapani numbrid jaapani finantsnumbrid @@ -1361,6 +1420,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kaavi numbrid khmeeri numbrid kannada numbrid + kirat-rai numbrid tai tham hora numbrid tai tham tham numbrid lao numbrid @@ -1379,6 +1439,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kohalikud numbrid nkoo numbrid santali numbrid + bhumidži numbrid oria numbrid osmani numbrid rohingja numbrid @@ -1390,6 +1451,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sinhala lithi numbrid sora numbrid sunda numbrid + sunvari numbrid taakri numbrid uue tai-lõõ numbrid traditsioonilised tamili numbrid @@ -1399,10 +1461,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tiibeti numbrid tirhuta numbrid tase numbrid + tolong-siki numbrid traditsioonilised numbrid vai numbrid hoo numbrid vantšo numbrid + välja lülitatud + sisse lülitatud meetermõõdustik @@ -1534,11 +1599,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M.y G d.MM.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMMM y G - h a h:mm a h:mm:ss a H:mm:ss @@ -1603,9 +1669,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM y G – E, d. MMM E, d. MMM y G – E, d. MMM y - - h–h a - h:mm–h:mm a h:mm–h:mm a @@ -1615,9 +1678,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h–h a v - M–M @@ -1909,11 +1969,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM.y G d.MM.y GGGGG + E, dd.MM.y G MMM y G d. MMM y G E, d. MMMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1921,7 +1982,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ M d.M E, d.M - MMMM + MMM d. MMM E, d. MMM d. MMMM @@ -1980,10 +2041,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM – E, d. MMM y G E, d. MMM y – E, d. MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1994,10 +2051,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - dd.MM–dd.MM dd.MM–dd.MM @@ -2603,21 +2656,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ määramata linn - - Tirana - Jerevan - - Río Gallegos - - - Tucumán - - - Córdoba - Viin @@ -2636,27 +2677,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Eirunepé - - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - Saint John’s @@ -2669,12 +2689,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Lihavõttesaar - - Ürümqi - - - Bogotá - Havanna @@ -2690,9 +2704,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praha - - Büsingen - Berliin @@ -2702,15 +2713,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Alžiir - - Galápagos - Kairo - - El Aaiún - Kanaari saared @@ -2776,9 +2781,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biškek - Enderbury - - Abariringa @@ -2814,27 +2816,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riia - - Chișinău - Macau Maldiivid - - Mazatlán - Bahia Banderas México - - Nouméa - Katmandu @@ -2904,9 +2897,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ar-Riyāḑ - - Mahé - Hartum @@ -2922,12 +2912,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damaskus - - N’Djamena - - - Lomé - Dušanbe @@ -2993,9 +2977,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Lääne-Aafrika aeg - Lääne-Aafrika standardaeg - Lääne-Aafrika suveaeg + Lääne-Aafrika aeg @@ -3390,6 +3372,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyana aeg + + + Hawaii-Aleuudi standardaeg + + Hawaii-Aleuudi aeg @@ -3840,6 +3827,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuuki aeg + + + Türgi aeg + Türgi standardaeg + Türgi suveaeg + + Türkmenistani aeg @@ -3999,9 +3993,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + #,##0.00 #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -4564,7 +4561,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Iisraeli seekel (1980–1985) Iisraeli seekel (1980–1985) - Iisraeli seekelit (1980–1985) + Iisraeli seeklit (1980–1985) Iisraeli uus seekel @@ -5277,6 +5274,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ida-Kariibi dollar Ida-Kariibi dollarit + + Kariibi kulden + Kariibi kulden + Kariibi kuldnat + Rahvusvahelise Valuutafondi arvestusühik @@ -5333,8 +5335,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Jugoslaavia kõva dinaar (1966–1990) - Jugoslaavia kõva dinaar (1966–1990) - Jugoslaavia kõva dinaar (1966–1990) Jugoslaavia uus dinaar (1994–2002) @@ -5374,6 +5374,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwe dollar (1980–2008) Zimbabwe dollarit (1980–2008) + + Zimbabwe kuld + Zimbabwe kuld + Zimbabwe kulda + Zimbabwe dollar (2009) Zimbabwe dollar (2009) @@ -5599,7 +5604,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimool liitri kohta {0} millimooli liitri kohta - + + osa + {0} osa + {0} osa + + osa miljoni kohta {0} osa miljoni kohta {0} osa miljoni kohta @@ -5623,6 +5633,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mool {0} mooli + + glükoosi + {0} glükoosi + {0} glükoosi + liitrid kilomeetri kohta {0} liiter kilomeetri kohta @@ -6121,6 +6136,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimeeter elavhõbedasammast {0} millimeetrit elavhõbedasammast + + elavhõbedasammast + {0} elavhõbedasammast + {0} elavhõbedasammast + naelad ruuttolli kohta {0} nael ruuttolli kohta @@ -6292,6 +6312,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} meetriline tass {0} meetrilist tassi + + vedelikuunts m + {0} vedelikuunts m + {0} vedelikuuntsi m + aakerjalad {0} aakerjalg @@ -6372,15 +6397,80 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} inglise kvart {0} inglise kvarti - + + steradiaan + {0} steradiaan + {0} steradiaani + + + katal + {0} katal + {0} katalit + + + kulon + {0} kulon + {0} kulonit + + + farad + {0} farad + {0} faradit + + + henri + {0} henri + {0} henrit + + + siimens + {0} siimens + {0} siimensit + + + kalorid [IT] + {0} kalor [IT] + {0} kalorit [IT] + + + bekrellid + {0} bekrell + {0} bekrelli + + + siivert + {0} siivert + {0} siivertit + + + greid + {0} grei + {0} greid + + + jõukilogramm + {0} jõukilogramm + {0} jõukilogrammi + + + tesla + {0} tesla + {0} teslat + + + veeber + {0} veeber + {0} veebrit + + + valgus + {0} valgus + {0} valgust + + miljardikosa - {0} miljardikosa - {0} miljardikosa - ööd - {0} öö - {0} ööd {0} öö kohta @@ -6452,7 +6542,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} üksus {0} üksust - + + osa + {0} osa + {0} osa + + osa/miljon @@ -6461,6 +6556,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mool + + Glc + {0} Glc + {0} Glc + l/km {0} l/km @@ -6691,6 +6791,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} hj {0} hj + + {0} Hg + {0} Hg + in Hg {0} in Hg @@ -6751,6 +6855,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ml {0} ml + + {0} fl oz m + {0} fl oz m + aakerjalg @@ -6820,7 +6928,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ingl kvart {0} ingl kvarti - + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + valgus + {0} valgus + {0} valgust + + osakesed/miljard {0} miljardikosa {0} miljardikosa @@ -6844,9 +7010,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} aaker {0} aakrit + + osa + {0} osa + {0} osa + mol + + Glc + {0} l/100km {0} l/100km @@ -6927,6 +7101,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ liiter + + {0} fl oz m + {0} fl oz m + {0} gal Im {0} gal Im @@ -6951,11 +7129,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt Imp. {0} qt Imp. - - ööd - {0} öö - {0} ööd - {0}/öö + + cal-IT + + + valgus + {0} valg. + {0} valg. {0} E diff --git a/make/data/cldr/common/main/eu.xml b/make/data/cldr/common/main/eu.xml index e44c764a817..5230ca91424 100644 --- a/make/data/cldr/common/main/eu.xml +++ b/make/data/cldr/common/main/eu.xml @@ -44,6 +44,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ aimara azerbaijanera baxkirera + balutxera baliera basaa bielorrusiera @@ -230,6 +231,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafiera koloniera kurduera + kurduera + kurmanjia kumykera komiera kornubiera @@ -747,6 +750,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Txina Kolonbia Clipperton uhartea + Sark Costa Rica Kuba Cabo Verde @@ -1096,35 +1100,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zenbakizko ordena Ordenaren sendotasuna Moneta + Emojien aurkezpena Ordu-zikloa (12 vs 24) Lerro-jauziaren estiloa + Hitz barruko lerro-jauziak Neurketa-sistema Zenbakiak + Laburtzapenen ondorengo lerro-jauzia Ordu-zona Eskualdeko ezarpenen aldaera Erabilera pribatua Egutegi budista + Budista Txinatar egutegia + Txinatarra Egutegi koptoa + Koptoa Dangi egutegia + Dangia Egutegi etiopiarra + Etiopiarra Amete Alem egutegi etiopiarra + Amete Alem etiopiarra Egutegi gregoriarra + Gregoriarra Hebrear egutegia + Hebrearra Indiar egutegia Egutegi islamiarra + Islamiarra Egutegi islamiarra (taula-formakoa, garai zibilekoa) + Islamiarra (taula-formakoa, garai zibilekoa) Islamiar egutegia (Saudi Arabia, ikuspegiak) Islamiar egutegia (taula-formakoa, gai astronomikokoa) Egutegi islamiarra (Umm al-Qura) + Islamiarra (Umm al-Qura) ISO-8601 egutegia Japoniar egutegia + Japoniarra Egutegi persiarra + Persiarra Minguo egutegia + Minguoa Kontabilitateko moneta-formatua + Kontabilitatea Moneta-formatu estandarra + Estandarra Ordenatu ikurrak Ordenatu ikurrei ez ikusi eginda Ordenatu azentuak modu normalean @@ -1134,19 +1157,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordenatu maiuskulak lehenik Ordenatu maiuskulak eta minuskulak bereizi gabe Ordenatu maiuskulak eta minuskulak bereizita - Txinera tradizionalaren alfabetoa-Big5 Aurreko hurrenkera, bateragarria izateko Hurrenkera alfabetikoa Unicode hurrenkera lehenetsia + Unicode lehenetsia Emojien hurrenkera Europako ordenatzeko arauak - Txinera sinplifikatuaren alfabetoa -GB2312 Telefonoen zerrenda Ordenatzeko irizpide fonetikoa Pinyin hurrenkera Bilaketa orokorra + Bilaketa Bilatu hangularen lehen kontsonantearen arabera Ordenatzeko irizpide estandarra + Estandarra Tarteen araberako hurrenkera Tradizionala Radical trazuen hurrenkera @@ -1163,18 +1187,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zabalera osoko karaktere-bihurketa Zabalera erdiko karaktere-bihurketa Zenbakizko bihurketa + Lehenetsia + Emojia + Testua 12 orduko sistema (0–11) + 12 (0–11) 12 orduko sistema (1–12) + 12 (1–12) 24 orduko sistema (0–23) + 24 (0–23) 24 orduko sistema (1–24) + 24 (1–24) Lerro-jauziaren estilo malgua + Malgua Lerro-jauziaren estilo arrunta + Arrunta Lerro-jauziaren estilo zorrotza + Zorrotza + Hautsi denak + Mantendu denak + Arrunta + Mantendu esaldietan US BGN transliterazioa UN GEGN transliterazioa Sistema metrikoa + Metrikoa Neurketa-sistema inperiala + Erresuma Batua Neurketa-sistema anglosaxoia + AEB Ahom digituak Digitu arabiar-hindikoak Digitu arabiar-hindiko hedatuak @@ -1260,6 +1301,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vai digituak Warang Citi digituak Wancho digituak + Aktibatuta + Desaktibatuta Sistema metrikoa @@ -1459,7 +1502,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -1494,17 +1537,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h('r')('a')'k' B h:mm B h:mm:s + E B h E B h:mm E B h:mm:ss d, EEEE E h:mm a E h:mm:ss a G. 'aroko' y. 'urtea' + G. 'aroko' y-MM y-MM-dd (GGGGG) + G 'aroko' y-MM-dd, E G. 'aroko' y('e')'ko' MMMM G. 'aroko' y('e')'ko' MMMM d G. 'aroko' y('e')'ko' MMMM d, EEEE - h a h:mm a h:mm:ss a MM/dd @@ -1887,14 +1932,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss E h:mm a E h:mm:ss a + G y/M + G y/M/d, E G y. 'urteko' MMM G y. 'urteko' MMM d('a') G y. 'urteko' MMM d('a'), E - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1949,10 +1996,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G y, MMM d('a'), E – MMM d('a'), E G y, MMM d('a'), E – G y, MMM d('a'), E - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1963,10 +2006,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -2522,11 +2561,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} (udako ordua) {0} aldeko ordu estandarra - - HST - HST - HDT - Honolulu @@ -2540,18 +2574,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Aingira - - Tirana - Erevan - - Tucumán - - - Córdoba - Viena @@ -2567,24 +2592,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Eirunepé - - - Cuiabá - - - Santarém - - - Araguaína - - - São Paulo - - - Maceió - Saint John’s @@ -2600,9 +2607,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Duala - - Ürümqi - Habana @@ -2615,9 +2619,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praga - - Büsingen - Djibuti @@ -2704,9 +2705,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bixkek - - Enderbury - Saint Kitts @@ -2746,9 +2744,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Monako - - Khovd - Ulan Bator @@ -2767,9 +2762,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldivak - - Mazatlán - Mexiko Hiria @@ -2839,9 +2831,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riad - - Mahé - Khartum @@ -2928,9 +2917,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Afrikako mendebaldeko ordua - Afrikako mendebaldeko ordu estandarra - Afrikako mendebaldeko udako ordua + Afrikako mendebaldeko ordua @@ -3366,6 +3353,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyanako ordua + + + Hawaii-Aleutiar uharteetako ordu estandarra + + + HAST + + Hawaii-Aleutiar uharteetako ordua @@ -3978,13 +3973,162 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -4018,6 +4162,167 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ¤¤ + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤;(#,##0.00 ¤) + + + pezeta andorratarra @@ -5396,6 +5701,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dolar ekikaribear dolar ekikaribear + + florin karibetarra + florin karibetarra + florin karibetarra + igorpen-eskubide berezia igorpen-eskubide berezi @@ -5522,6 +5832,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dolar zimbabwetar (1980–2008) dolar zimbabwetar (1980–2008) + + urre zimbabwetarra + urre zimbabwetarra + urre zimbabwetarra + dolar zimbabwetarra (2009) dolar zimbabwetar (2009) @@ -5743,7 +6058,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ elementuak - + + zatiak + {0} zati + {0} zati + + zati milioi bakoitzeko {0} zati milioi bakoitzeko {0} zati milioi bakoitzeko @@ -5761,6 +6081,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ molak + + glukosa-unitateak + {0} glukosa-unitate + {0} glukosa-unitate + litro kilometro bakoitzeko {0} litro kilometro bakoitzeko @@ -6228,6 +6553,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} merkurio-milimetro {0} merkurio-milimetro + + merkurio-unitateak + {0} merkurio-unitate + {0} merkurio-unitate + libra hazbete karratuko {0} libra hazbete karratuko @@ -6381,6 +6711,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ katilu metrikoak + + likido-ontza metrikoak + {0} likido-ontza metriko + {0} likido-ontza metriko + {0} bushel {0} bushel @@ -6426,20 +6761,78 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} laurden inperial {0} laurden inperial - - argia - {0} argi - {0} argi + + estereorradianak + {0} estereorradian + {0} estereorradian - + + katalak + {0} katal + {0} katal + + + coulombak + {0} coulomb + {0} coulomb + + + faradak + {0} farad + {0} farad + + + henryak + {0} henry + {0} henry + + + siemensak + {0} siemens + {0} siemens + + + kaloriak [IT] + {0} kaloria [IT] + {0} kaloria [IT] + + + becquerelak + {0} becquerel + {0} becquerel + + + sievertak + {0} sievert + {0} sievert + + + grayak + {0} gray + {0} gray + + + kilopondak + {0} kilopond + {0} kilopond + + + teslak + {0} tesla + {0} tesla + + + weberrak + {0} weber + {0} weber + + zati mila milioiko {0} zati mila milioiko {0} zati mila milioiko gauak - {0} gau - {0} gau {0} gau bakoitzeko @@ -6497,7 +6890,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elementu {0} elementu - + + zati + {0} zati + {0} zati + + zati/milioi @@ -6515,6 +6913,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mola + + glukosa-unitate + {0} glukosa-unitate + {0} glukosa-unitate + l/km {0} l/km @@ -6727,6 +7130,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W + + merkurio-unitate + {0} merkurio-unitate + {0} merkurio-unitate + mb {0} mb @@ -6811,6 +7219,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} katilukada metriko {0} katilukada metriko + + likido-ontza metriko + {0} likido-ontza metriko + {0} likido-ontza metriko + akre-oin {0} akre-oin @@ -6897,12 +7310,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ pinch-a + + estereorradian + {0} sr + {0} sr + + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + kaloria [IT] + {0} kaloria [IT] + {0} kaloria [IT] + + + becquerel + {0} becquerel + {0} becquerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + kilopond + {0} kilopond + {0} kilopond + + + tesla + {0} tesla + {0} tesla + + + weber + argia {0} argi {0} argi - + zati / mila milioi {0} zati / m. m. {0} zati / m. m. @@ -6937,6 +7413,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/l + + zati + {0} zati + {0} zati + + + glukosa-unitate + {0} Glc + {0} Glc + {0} m/g brit. {0} m/g brit. @@ -7021,6 +7507,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} M☉ {0} M☉ + + merkurio-unitate + {0} Hg unitate + {0} Hg unitate + {0} atm {0} atm @@ -7055,6 +7546,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc {0}mc + + likido-ontza metriko + {0}ac ft {0}ac ft @@ -7091,21 +7585,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dsp-Imp {0}dsp-Imp + + estereorradian + {0} sr + {0} sr + + + katal + {0} kat + {0} kat + + + coulomb + {0} C + {0} C + + + farad + {0} F + {0} F + + + henry + {0} H + {0} H + + + siemens + {0} S + {0} S + + + kaloria [IT] + {0} cal [IT] + {0} cal [IT] + + + becquerel + {0} Bq + {0} Bq + + + sievert + {0} Sv + {0} Sv + + + gray + {0} Gy + {0} Gy + + + kilopond + {0} kgf + {0} kgf + + + tesla + {0} T + {0} T + + + weber + - argia {0} a. {0} a. - + zati / m. m. {0} zati / m. m. {0} zati / m. m. - gau {0} g. {0} g. - {0}/gau diff --git a/make/data/cldr/common/main/ewo.xml b/make/data/cldr/common/main/ewo.xml index 1d3f17dc49e..086685603ed 100644 --- a/make/data/cldr/common/main/ewo.xml +++ b/make/data/cldr/common/main/ewo.xml @@ -575,6 +575,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/fa.xml b/make/data/cldr/common/main/fa.xml index 9fda3578343..db32ab50b4e 100644 --- a/make/data/cldr/common/main/fa.xml +++ b/make/data/cldr/common/main/fa.xml @@ -297,6 +297,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ بافیایی کولش کردی + کردی + کرمانجی کومیکی کوتنی کومیایی @@ -822,6 +824,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ چین کلمبیا جزایر کلیپرتون + سارک کاستاریکا کوبا کیپ‌ورد @@ -1079,35 +1082,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ مرتب‌سازی عددی قدرت مرتب‌سازی واحد پول + نمایش اموجی دور ساعت (۱۲ در مقابل ۲۴) شیوهٔ سطرشکنی + شکست خط داخل کلمات دستگاه اندازه‌گیری اعداد + شکست جمله پس از مخفف منطقهٔ زمانی متغیر محلی استفادهٔ خصوصی تقویم بودایی + بودایی تقویم چینی + چینی تقویم قبطی + قبطی تقویم دانگی + دانگی تقویم اتیوپیایی + اتیوپیایی تقویم اتیوپیایی عامت عالم + عامت عالم اتیوپیایی تقویم میلادی + میلادی تقویم عبری + عبری تقویم ملی هند تقویم هجری قمری + هجری تقویم هجری قمری جدولی مدنی + هجری (جدولی، دوران مدنی) قویم هجری قمری هلالی عربستان سعودی تقویم هجری قمری جدولی نجومی + هجری (جدولی، دوران نجومی) تقویم هجری قمری ام‌القری + هجری (ام‌القری) تقویم ایزو ۸۶۰۱ تقویم ژاپنی + ژاپنی تقویم هجری شمسی + ایرانی تقویم جمهوری چین (تایوان) + جمهوری چین قالب حسابداری واحد پول + حسابداری قالب استاندارد واحد پول + استاندارد مرتب‌سازی نمادها مرتب‌سازی با نادیده گرفتن نمادها مرتب‌سازی آکسان‌ها به صورت معمولی @@ -1117,19 +1140,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ مرتب‌سازی بر اساس حرف بزرگ در ابتدا مرتب‌سازی بدون توجه به کوچک و بزرگی حروف مرتب‌سازی با حساسیت به اندازه حروف - ترتیب چینی سنتی - Big5 ترتیب پیشین، برای سازگاری ترتیب فرهنگ لغت ترتیب پیش‌فرض یونی‌کد + یونی‌کد پیش‌فرض ترتیب ایموجی قوانین ترتیب اروپایی - ترتیب چینی ساده‌شده - GB2312 ترتیب دفتر تلفن مرتب کردن بر اساس آوایی ترتیب پین‌یین جستجوی عمومی + جستجو جستجو با صامت اول هانگول ترتیب استاندارد + استاندارد ترتیب حرکتی ترتیب سنتی ترتیب رادیکالی-حرکتی @@ -1146,18 +1170,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ تمام‌عرض نیم‌عرض سیستم اعداد + پیش‌فرض + اموجی + پیامک سیستم ۱۲ ساعته (۰ تا ۱۱) + ۱۲ ساعته (۰ تا ۱۱) سیستم ۱۲ ساعته (۱ تا ۱۲) + ۱۲ ساعته (۱ تا ۱۲) سیستم ۲۴ ساعته (۰ تا ۲۳) + ۲۴ ساعته (۰ تا ۲۳) سیستم ۲۴ ساعته (۱ تا ۲۴) + ۲۴ ساعته (۱ تا ۲۴) شیوهٔ سطرشکنی سهل‌گیرانه + سهل‌گیرانه شیوهٔ سطرشکنی عادی + عادی شیوهٔ سطرشکنی سخت‌گیرانه + سخت‌گیرانه + شکست همه + حفظ همه + عادی + حفظ در عبارات ترانویسی انجمن نام‌های جغرافیایی ایالات متحده ترانویسی گروه نام‌های جغرافیایی سازمان ملل دستگاه متریک + متریک سیستم اندازه‌گیری انگلیسی + انگلیسی سیستم اندازه‌گیری امریکایی + امریکایی ارقام عربی ارقام فارسی اعداد ارمنی @@ -1209,6 +1250,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ارقام تبتی سیستم اعداد سنتی ارقام وایی + خاموش + روشن متریک @@ -1231,7 +1274,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [ـ\u200C\u200D\u200E\u200F َ ِ ُ ْ ٖ ٰ إ ك ىي] [آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی] [\u200E , ٫ ٬ . % ٪ ‰ ؉ + − 0۰ 1۱ 2۲ 3۳ 4۴ 5۵ 6۶ 7۷ 8۸ 9۹] + [{<LRM>} ٤ ٥ ٦] [\- ‐‑ ، ٫ ٬ ؛ \: ! ؟ . … ‹ › « » ( ) \[ \] * / \\] + [_ — @ / #] + [\- ‐‑ . /] ؟ [,,﹐︐ ، ٫ 、﹑、︑] @@ -1297,20 +1343,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - قبل از حلول مسیح - بعد از حلول مسیح - - - قبل از مسیح - پس از مسیح - - - ق.م. - ب.م. - - @@ -1383,7 +1415,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E H:mm E H:mm:ss y G + y/M G M/d/y GGGGG + E، y/M/d G MMM y G d MMM y G E d MMM y G @@ -1391,6 +1425,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm (Z) H:mm H:mm:ss + سHH v M/d E M/d d LLL @@ -1821,7 +1856,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E H:mm E H:mm:ss y G + y/M G y/M/d GGGGG + E، y/M/d G MMM y G d MMM y G E d MMM y G @@ -1831,6 +1868,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm:ss H:mm:ss v H:mm v + سHH v M/d E M/d d LLL @@ -1982,7 +2020,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E y/M/d تا E y/M/d - LLL تا MMM y + MMM تا MMM y MMM y تا MMM y @@ -1996,7 +2034,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM y تا E d MMM y - LLLL تا MMMM y + MMMM تا MMMM y MMMM y تا MMMM y @@ -2164,6 +2202,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + y/M G + E، y/M/d G HH:mm (Z) mm:ss y/M G @@ -2448,26 +2488,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} یکشنبه قبل - - - {0} یکشنبه بعد - {0} یکشنبه بعد - - - {0} یکشنبه قبل - {0} یکشنبه قبل - - - - - {0} یکشنبه بعد - {0} یکشنبه بعد - - - {0} یکشنبه قبل - {0} یکشنبه قبل - - دوشنبهٔ گذشته این دوشنبه @@ -2481,26 +2501,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} دوشنبه قبل - - - {0} دوشنبه بعد - {0} دوشنبه بعد - - - {0} دوشنبه قبل - {0} دوشنبه قبل - - - - - {0} دوشنبه بعد - {0} دوشنبه بعد - - - {0} دوشنبه قبل - {0} دوشنبه قبل - - سه‌شنبهٔ گذشته این سه‌شنبه @@ -2514,26 +2514,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} سه‌شنبه قبل - - - {0} سه‌شنبه بعد - {0} سه‌شنبه بعد - - - {0} سه‌شنبه قبل - {0} سه‌شنبه قبل - - - - - {0} سه‌شنبه بعد - {0} سه‌شنبه بعد - - - {0} سه‌شنبه قبل - {0} سه‌شنبه قبل - - چهارشنبهٔ گذشته این چهارشنبه @@ -2547,26 +2527,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} چهارشنبه قبل - - - {0} چهارشنبه بعد - {0} چهارشنبه بعد - - - {0} چهارشنبه قبل - {0} چهارشنبه قبل - - - - - {0} چهارشنبه بعد - {0} چهارشنبه بعد - - - {0} چهارشنبه قبل - {0} چهارشنبه قبل - - پنجشنبهٔ گذشته این پنجشنبه @@ -2580,26 +2540,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} پنجشنبه قبل - - - {0} پنجشنبه بعد - {0} پنجشنبه بعد - - - {0} پنجشنبه قبل - {0} پنجشنبه قبل - - - - - {0} پنجشنبه بعد - {0} پنجشنبه بعد - - - {0} پنجشنبه قبل - {0} پنجشنبه قبل - - جمعهٔ گذشته این جمعه @@ -2613,26 +2553,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} جمعه قبل - - - {0} جمعه بعد - {0} جمعه بعد - - - {0} جمعه قبل - {0} جمعه قبل - - - - - {0} جمعه بعد - {0} جمعه بعد - - - {0} جمعه قبل - {0} جمعه قبل - - شنبهٔ گذشته این شنبه @@ -2646,26 +2566,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} شنبه قبل - - - {0} شنبه بعد - {0} شنبه بعد - - - {0} شنبه قبل - {0} شنبه قبل - - - - - {0} شنبه بعد - {0} شنبه بعد - - - {0} شنبه قبل - {0} شنبه قبل - - ق.ظ/ب.ظ @@ -2713,6 +2613,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ‎+HH:mm;‎−HH:mm {0} گرینویچ گرینویچ + گرینویچ+؟ وقت {0} وقت تابستانی {0} وقت عادی {0} @@ -3069,6 +2970,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ایستر + + کویهایکیو + پونتا آرناس @@ -3334,9 +3238,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ پنوم‌پن - اندربری - - کانتون @@ -4006,9 +3907,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - وقت غرب افریقا - وقت عادی غرب افریقا - وقت تابستانی غرب افریقا + وقت غرب افریقا @@ -4377,6 +4276,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ وقت گویان + + + وقت عادی هاوایی‐الوشن + + وقت هاوایی‐الوشن @@ -4827,6 +4731,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ وقت چوئوک + + + وقت ترکیه + وقت عادی ترکیه + وقت تابستانی ترکیه + + وقت ترکمنستان @@ -4998,55 +4909,66 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ‎¤#,##0.00 + ‎¤ #,##0.00 ‎#,##0.00 + + ‎¤ #,##0.00 + ‎¤#,##0.00 + ‎¤ #,##0.00 ‎#,##0.00 + + ‎¤ #,##0.00;‎(¤ #,##0.00) + ‎#,##0.00;‎(#,##0.00) + ‎¤ #,##0.00 - ‎#,##0.00 + ‎¤ #,##0.00 + ‎#,##0.00 ‎¤ #,##0.00;‎(¤ #,##0.00) - #,##0.00;(#,##0.00) + ‎¤ #,##0.00;‎(¤ #,##0.00) + ‎#,##0.00;‎(#,##0.00) - 0 هزار ¤ - 0 هزار ¤ - 00 هزار ¤ - 00 هزار ¤ - 000 هزار ¤ - 000 هزار ¤ - 0 میلیون ¤ - 0 میلیون ¤ - 00 میلیون ¤ - 00 میلیون ¤ - 000 میلیون ¤ - 000 میلیون ¤ - 0 میلیارد ¤ - 0 میلیارد ¤ - 00 میلیارد ¤ - 00 میلیارد ¤ - 000 میلیارد ¤ - 000 میلیارد ¤ - 0 هزارمیلیارد ¤ - 0 هزارمیلیارد ¤ - 00 هزارمیلیارد ¤ - 00 هزارمیلیارد ¤ - 000 هزارمیلیارد ¤ - 000 هزارمیلیارد ¤ + ‎¤ 0 هزار + ‎¤ 0 هزار + ‎¤ 00 هزار + ‎¤ 00 هزار + ‎¤ 000 هزار + ‎¤ 000 هزار + ‎¤ 0 میلیون + ‎¤ 0 میلیون + ‎¤ 00 میلیون + ‎¤ 00 میلیون + ‎¤ 000 میلیون + ‎¤ 000 میلیون + ‎¤ 0 میلیارد + ‎¤ 0 میلیارد + ‎¤ 00 میلیارد + ‎¤ 00 میلیارد + ‎¤ 000 میلیارد + ‎¤ 000 میلیارد + ‎¤ 0 تریلیون + ‎¤ 0 تریلیون + ‎¤ 00 تریلیون + ‎¤ 00 تریلیون + ‎¤ 000 تریلیون + ‎¤ 000 تریلیون @@ -5125,8 +5047,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ لو بلغارستان - لو بلغارستان - لو بلغارستان دینار بحرین @@ -5323,8 +5243,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ شِکِل جدید اسرائیل - شِکِل جدید اسرائیل - شِکِل جدید اسرائیل روپیهٔ هند @@ -5546,8 +5464,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ زلوتی لهستان - زلوتی لهستان - زلوتی لهستان اسکودوی پرتغال @@ -5737,6 +5653,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ دلار شرق کارائیب $EC + + گیلدر کارائیب + گیلدر کارائیب + گیلدر کارائیب + فرانک طلای فرانسه @@ -5783,6 +5704,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ دلار زیمبابوه (۱۹۸۰ تا ۲۰۰۸) + + طلای زیمبابوه + طلای زیمبابوه + طلای زیمبابوه + دلار زیمبابوه (۲۰۰۹) @@ -5845,10 +5771,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} کیلومتر مربع {0} در کیلومتر مربع - - {0} هکتار - {0} هکتار - {0} متر مربع {0} متر مربع @@ -5875,7 +5797,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} میلی‌مول در لیتر {0} میلی‌مول در لیتر - + + پارت + {0} پارت + {0} پارت + + بخش در میلیون {0} بخش در میلیون {0} بخش در میلیون @@ -5892,6 +5819,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ده‌هزارم {0} ده‌هزارم + + گلوکز + {0} گلوکز + {0} گلوکز + لیتر در کیلومتر {0} لیتر در کیلومتر @@ -6088,9 +6020,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ میلی‌گرم - - میکروگرم - {0} جرم زمین {0} جرم زمین @@ -6108,6 +6037,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} میلی‌متر جیوه {0} میلی‌متر جیوه + + جیوه + {0} جیوه + {0} جیوه + {0} پوند در اینچ مربع {0} پوند در اینچ مربع @@ -6197,6 +6131,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} سانتی‌لیتر {0} سانتی‌لیتر + + اونس مایع متریک + {0} اونس مایع متریک + {0} اونس مایع متریک + {0} در گالن امپریال @@ -6231,15 +6170,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} درم {0} درم - - بخش در بیلیون + + استرادیان + {0} استرادیان + {0} استرادیان + + + کاتال + {0} کاتال + {0} کاتال + + + کولن + {0} کولن + {0} کولن + + + فاراد + {0} فاراد + {0} فاراد + + + هنری + {0} هنری + {0} هنری + + + زیمنس + {0} زیمنس + {0} زیمنس + + + کالری [IT] + {0} کالری [IT] + {0} کالری [IT] + + + بکرل + {0} بکرل + {0} بکرل + + + سیورت + {0} سیورت + {0} سیورت + + + گری + {0} گری + {0} گری + + + کیلوگرم-نیرو + {0} کیلوگرم-نیرو + {0} کیلوگرم-نیرو + + + تسلا + {0} تسلا + {0} تسلا + + + وبر + {0} وبر + {0} وبر + + + نور + {0} نوری + {0} نوری + + {0} بخش در بیلیون {0} بخش در بیلیون - شب - {0} شب - {0} شب {0} در شب @@ -6451,7 +6456,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مورد {0} مورد - + + پارت + {0} پارت + {0} پارت + + بخش/میلیون @@ -6470,6 +6480,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مول {0} مول + + گلوکز + {0} گلوکز + {0} گلوکز + لیتر/کیلومتر {0} ل./ک.م. @@ -6825,6 +6840,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} لوکس {0} لوکس + + شمع + {0} شمع + {0} شمع + + + لومن + {0} لومن + {0} لومن + تابندگی خورشید {0} ☉L @@ -6941,6 +6966,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} م‌م جیوه {0} م‌م جیوه + + جیوه + {0} جیوه + {0} جیوه + پوند در اینچ مربع {0}‎ psi @@ -7103,6 +7133,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} پیمانهٔ متریک {0} پیمانهٔ متریک + + {0} fl oz m. + {0} fl oz m. + جریب فوت {0} جریب فوت @@ -7200,7 +7234,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} کوارت انگلیسی {0} کوارت انگلیسی - + + استرادیان + {0} استرادیان + {0} استرادیان + + + کاتال + {0} کاتال + {0} کاتال + + + کولن + {0} کولن + {0} کولن + + + فاراد + {0} فاراد + {0} فاراد + + + هنری + {0} هنری + {0} هنری + + + زیمنس + {0} زیمنس + {0} زیمنس + + + کالری-IT + {0} کالری-IT + {0} کالری-IT + + + بکرل + {0} بکرل + {0} بکرل + + + سیورت + {0} سیورت + {0} سیورت + + + گری + {0} گری + {0} گری + + + کیلوگرم-نیرو + {0} کیلوگرم-نیرو + {0} کیلوگرم-نیرو + + + تسلا + {0} تسلا + {0} تسلا + + + وبر + {0} وبر + {0} وبر + + + نور + {0} نوری + {0} نوری + + بخش در بیلیون @@ -7329,6 +7433,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ m/s² + + {0}rad + {0}rad + {0}° {0}° @@ -7383,17 +7491,40 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}دونوم {0}دونوم + + {0}kt + {0}kt + + + {0}mmol/L + {0}mmol/L + {0}مورد {0}مورد - + + پارت + {0} پارت + {0}پارت + + {0}ppm {0}ppm ٪ + + گلوکز + + + L/۱۰۰km + + + {0}mpg + {0}mpg + {0}m/gUK {0}m/gUK @@ -7513,9 +7644,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}Btu {0}Btu - - {0}ک.وا.س/۱۰۰ ک.م - {0} ک.وا.س/۱۰۰ ک.م + + {0}lbf + {0}lbf + + + {0}N + {0}N GHz @@ -7660,6 +7795,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}R☉ {0}R☉ + + {0}lx + {0}lx + + + شمع + {0}cd + {0}cd + + + لومن + {0}lm + {0}lm + {0}t {0}t @@ -7751,6 +7900,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hp {0}hp + + جیوه + {0}inHg {0}inHg @@ -7771,6 +7923,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hPa {0}hPa + + {0}MPa + {0}MPa + km/hr @@ -7803,6 +7959,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}K {0}K + + {0}lbf⋅ft + {0}lbf⋅ft + + + N⋅m + {0}N⋅m + {0}N⋅m + {0}km³ {0}km³ @@ -7871,10 +8036,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}fl oz Im {0}fl oz Im - - {0} ق.غ.خ - {0} ق.غ.خ - ق.چ.خ {0}ق.چ. @@ -7898,14 +8059,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt-Imp. {0}qt-Imp. - - بخش در بیلیون + + کاتال - - شب - {0} شب - {0} شب - {0}/شب + + کولن + + + هنری + + + کالری-IT + + + گری + + + تسلا + + + وبر + + + نور + {0}نوری + {0}نوری + + + {0}ppb + {0}ppb diff --git a/make/data/cldr/common/main/fa_AF.xml b/make/data/cldr/common/main/fa_AF.xml index 9c1de9f280d..34ec9d9f8e3 100644 --- a/make/data/cldr/common/main/fa_AF.xml +++ b/make/data/cldr/common/main/fa_AF.xml @@ -341,6 +341,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 + + + ¤ #,##0.00;‎(¤ #,##0.00) + #,##0.00;‎(#,##0.00) @@ -348,9 +354,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00;‎(¤ #,##0.00) + ¤ #,##0.00;‎(¤ #,##0.00) + #,##0.00;‎(#,##0.00) diff --git a/make/data/cldr/common/main/ff.xml b/make/data/cldr/common/main/ff.xml index b512e61f302..08465b83c01 100644 --- a/make/data/cldr/common/main/ff.xml +++ b/make/data/cldr/common/main/ff.xml @@ -579,6 +579,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ff_Adlm.xml b/make/data/cldr/common/main/ff_Adlm.xml index 17ac848f28c..d136fea6e2c 100644 --- a/make/data/cldr/common/main/ff_Adlm.xml +++ b/make/data/cldr/common/main/ff_Adlm.xml @@ -1416,11 +1416,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 𞤢𞤣𞤮 𞤁𞤢𞤴𞤢𞤳𞤭𞤤𞤼𞤭𞤴𞤢𞥄𞤲 𞤩𞤢𞥄𞤱𞤮 𞤁𞤢𞤴𞤢𞤳𞤭𞤤𞤼𞤭𞤴𞤢𞥄𞤲 - 𞤀𞤁 𞤇𞤁 @@ -1565,13 +1563,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - - 𞤘𞤋𞤈𞥐 - - - @@ -3267,13 +3258,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 {0} 𞤐𞤶𞤢𞤥𞤲𞤣𞤭 𞤕𞤫𞥅𞤯𞤵 {0} 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤢𞤱𞤪𞤵𞤲𞥋𞤣𞤫 - - - 𞤑𞤖𞤖 - 𞤑𞤖𞤖 - 𞤑𞤕𞤖 - - 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤭𞤤𞥆𞤢𞤲𞤳𞤮𞥅𞤪𞤫 𞤊𞤮𞤲𞤣𞤢𞥄𞤲𞤣𞤫 @@ -3892,9 +3876,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𞤆𞤢𞤲𞤮𞤥-𞤆𞤫𞤲 - 𞤉𞤲𞤣𞤫𞤪𞤦𞤵𞥅𞤪𞤭 - - 𞤑𞤢𞤲𞤼𞤮𞤲 @@ -4568,9 +4549,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢𞥄 - 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤢𞤱𞤪𞤵𞤲𞥋𞤣𞤫 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢𞥄 - 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤕𞤫𞥅𞤯𞤵 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢𞥄 + 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤭𞥅𞤪𞤲𞤢𞥄𞤲𞤺𞤫 𞤀𞤬𞤪𞤭𞤳𞤢𞥄 @@ -4958,6 +4937,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤘𞤢𞤴𞤢𞤲𞤢𞥄 + + + 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤢𞤱𞤪𞤵𞤲𞥋𞤣𞤫 𞤖𞤢𞤱𞤢𞥄𞤴𞤭𞥅-𞤀𞤤𞤮𞤧𞤭𞤴𞤢𞤲 + + 𞤑𞤭𞤶𞤮𞥅𞤪𞤫 𞤖𞤢𞤱𞤢𞥄𞤴𞤭𞥅-𞤀𞤤𞤮𞤧𞤭𞤴𞤢𞤲 @@ -5619,30 +5603,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0𞤓¤ - 0𞤓¤ - 00𞤓¤ - 00𞤓¤ - 000𞤓¤ - 000𞤓¤ - 0𞤁¤ - 0𞤁¤ - 00𞤁¤ - 00𞤁¤ - 000𞤁¤ - 000𞤁¤ - 0𞤁𞤶¤ - 0𞤁𞤶¤ - 00𞤁𞤶¤ - 00𞤁𞤶¤ - 000𞤁𞤶¤ - 000𞤁𞤶¤ - 0𞤚¤ - 0𞤚¤ - 00𞤚¤ - 00𞤚¤ - 000𞤚¤ - 000𞤚¤ + ¤ 0𞤓 + ¤ 0𞤓 + ¤ 00𞤓 + ¤ 00𞤓 + ¤ 000𞤓 + ¤ 000𞤓 + ¤ 0𞤁 + ¤ 0𞤁 + ¤ 00𞤁 + ¤ 00𞤁 + ¤ 000𞤁 + ¤ 000𞤁 + ¤ 0𞤁𞤶 + ¤ 0𞤁𞤶 + ¤ 00𞤁𞤶 + ¤ 00𞤁𞤶 + ¤ 000𞤁𞤶 + ¤ 000𞤁𞤶 + ¤ 0𞤚 + ¤ 0𞤚 + ¤ 00𞤚 + ¤ 00𞤚 + ¤ 000𞤚 + ¤ 000𞤚 {0} {1} @@ -6912,7 +6896,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 𞤨𞤭𞤪𞤰𞤵 {0} 𞤨𞤭𞤪𞤰𞤭 - + 𞤺𞤫𞤩𞤫 𞤳𞤢𞤤𞤢 𞤣𞤵𞤦𞤵𞥅𞤪𞤫 {0} 𞤺𞤫𞤩𞤢𞤤 𞤳𞤢𞤤𞤢 𞤣𞤵𞤦𞤵𞥅𞤪𞤫 {0} 𞤺𞤫𞤩𞤫 𞤳𞤢𞤤𞤢 𞤣𞤵𞤦𞤵𞥅𞤪𞤫 @@ -7920,7 +7904,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 𞤨𞤭𞤪 {0} 𞤨𞤭𞤪 - + 𞤺𞤫𞤩𞤫/𞤣𞤵𞤦𞤵𞥅𞤪𞤫 {0} 𞤺𞤳𞤣 {0} 𞤺𞤳𞤣 @@ -8846,7 +8830,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}𞤨𞤭𞤪 {0}𞤨𞤭𞤪 - + 𞤺𞤳𞤣 {0}𞤺𞤳𞤣 {0}𞤺𞤳𞤣 diff --git a/make/data/cldr/common/main/fi.xml b/make/data/cldr/common/main/fi.xml index 3d8176baf9e..877d26d9054 100644 --- a/make/data/cldr/common/main/fi.xml +++ b/make/data/cldr/common/main/fi.xml @@ -301,6 +301,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tyap makonde kapverdenkreoli + qʼeqchiʼ kenyang norsunluurannikonkoro kongo @@ -336,6 +337,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurdi + kurdi + kurmandži kumykki kutenai komi @@ -396,6 +399,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ makua-meetto meta’ marshall + mócheno maori micmac minangkabau @@ -574,6 +578,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sukuma susu sumeri + sunwar ruotsi swahili kongonswahili @@ -698,6 +703,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -729,6 +735,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -740,6 +747,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -773,6 +781,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -816,6 +825,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -980,7 +990,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiina Kolumbia Clippertoninsaari - Sark + Sark Costa Rica Kuuba Kap Verde @@ -1336,35 +1346,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ numeroiden lajittelu lajittelun taso valuutta + emojin esitys tuntijärjestelmä rivinvaihtotyyli + rivi vaihtuu sanojen sisällä mittajärjestelmä numerot + lause vaihtuu lyhenteen jälkeen aikavyöhyke maavalinnan muunnelma yksityiskäyttö buddhalainen kalenteri + buddhalainen kiinalainen kalenteri + kiinalainen koptilainen kalenteri + koptilainen dangilainen kalenteri + dangilainen etiopialainen kalenteri + etiopialainen etiopialainen amete alem -kalenteri + etiopialainen amete alem gregoriaaninen kalenteri + gregoriaaninen juutalainen kalenteri + juutalainen intialainen kalenteri hidžra-kalenteri + hidžra-kalenteri hidžra-siviilikalenteri (tabulaarinen, perjantaiepookki) + hidžra-kalenteri (taulukkomuoto, perjantaiepookki) hidžra-kalenteri (saudiarabialainen) hidžra-matemaattinen kalenteri (tabulaarinen, torstaiepookki) hidžra-kalenteri, Umm al-Qura + Umm al Qura -kalenteri ISO 8601 -kalenteri japanilainen kalenteri + japanilainen persialainen kalenteri + persialainen Kiinan tasavallan kalenteri + Minguo-kalenteri valuuttojen laskentatoimen esitysmuoto + laskentatoimi valuuttojen vakioesitysmuoto + vakio symbolit huomioiva lajittelu symbolit ohittava lajittelu painomerkkien normaali lajittelu @@ -1374,23 +1403,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ isot kirjaimet edeltävät pieniä isojen ja pienten kirjainten lajittelu yhdessä isojen ja pienten kirjainten lajittelu erikseen - perinteinen kiinalainen järjestys Big5 aiempi lajittelujärjestys yhteensopivuutta varten + yhteensopivuus sanakirjajärjestys + sanakirja Unicoden oletusjärjestys + oletusarvoinen unicode emojien lajittelujärjestys yleiseurooppalainen lajittelujärjestys - yksinkertaistettu kiinalainen järjestys GB2312 puhelinluettelojärjestys + puhelinluettelo äänteellinen järjestys + äänteellinen pinyin-järjestys + pinyin-järjestelmä yleishakujärjestys + haku haku hangul-alkukonsonantin mukaan normaalijärjestys + normaali piirtojärjestys + piirto perinteinen järjestys + perinteinen radikaali- ja piirtojärjestys + radikaali piirto zhuyin-järjestys + zhuyin-järjestelmä lajittelu ilman normalisointia lajittelu Unicode-normalisoituna numero-numerolta lajittelu @@ -1403,18 +1442,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ideogrammin levyinen ideogrammin puolikkaan levyinen numeerinen muunnos + oletusarvoinen + emoji + teksti 12 tunnin järjestelmä (0–11) + 12 (0–11) 12 tunnin järjestelmä (1–12) + 12 (1–12) 24 tunnin järjestelmä (0–23) + 24 (0–23) 24 tunnin järjestelmä (1–24) + 24 (1–24) väljä rivinvaihto + väljä normaali rivinvaihto + normaali tarkka rivinvaihto + tarkka + erota kaikki + säilytä kaikki + normaali + säilytä lauseet BGN-latinaistus UNGEGN-latinaistus metrijärjestelmä + metrinen brittiläinen mittajärjestelmä + brittiläinen yhdysvaltalainen mittajärjestelmä + yhdysvaltalainen ahom-numerot arabialaiset numerot laajennetut arabialaiset numerot @@ -1500,6 +1556,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ vai-numerot varang kshiti -numerot wancholaiset numerot + pois + päällä metrinen @@ -1536,9 +1594,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1748,6 +1803,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1} 'klo' {0} + @@ -1756,6 +1814,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1} 'klo' {0} + @@ -1764,6 +1825,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1}, {0} + @@ -1772,6 +1836,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1} 'klo' {0} + h.mm B @@ -1784,16 +1851,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E HH.mm.ss y G + M.y G d.M.y G + E d.M.y G LLL y G d. MMM y G E d. MMM y G - h a H h.mm a H.mm h.mm.ss a H.mm.ss + HH 'h' v d.M. E d.M. d. MMM @@ -1879,10 +1948,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d. MMMM – E d. MMMM y G E d. MMMM y – E d. MMMM y G - - h a – h a - h–h a - H–H @@ -1904,10 +1969,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H.mm–H.mm v H.mm–H.mm v - - h a – h a v - h–h a v - H–H v @@ -2007,20 +2068,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - tammi - helmi - maalis - huhti - touko - kesä - heinä - elo - syys - loka - marras - joulu - T H @@ -2063,7 +2110,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ la - sunnuntai + sunnuntaina maanantaina tiistaina keskiviikkona @@ -2248,6 +2295,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1} 'klo' {0} + @@ -2256,6 +2306,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1} 'klo' {0} + @@ -2264,6 +2317,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1}, {0} + @@ -2272,6 +2328,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'klo' {0} + + {1}, {0} + h.mm B @@ -2284,13 +2343,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E H.mm.ss y G + M.y G M.d.y G + E d.M.y G LLL y G d.M.y G E d.M.y G d. MMMM y G E d. MMMM y G - h a H h.mm a H.mm @@ -2300,6 +2360,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H.mm.ss v h.mm a v H.mm v + H 'h' v d.M. E d.M. d.M. @@ -2364,7 +2425,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d.–d.M.y G d.M.y. G – d.M.y G - d.M–d.M.y G + d.M.–d.M.y G d.M.y–d.M.y G @@ -2390,10 +2451,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d. MMMM – E d. MMMM y G E d. MMMM y – E d. MMMM y G - - h a – h a - h–h a - H–H @@ -2415,10 +2472,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H.mm–H.mm v H.mm–H.mm v - - h a – h a v - h–h a v - H–H v @@ -3186,18 +3239,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tuntematon - - Tirana - Jerevan - - Tucumán - - - Córdoba - Wien @@ -3214,24 +3258,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Eirunepé - - - Cuiabá - - - Santarém - - - Araguaína - - - São Paulo - - - Maceió - Kookossaaret @@ -3244,12 +3270,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Santiago de Chile - - Ürümqi - - - Bogotá - Havanna @@ -3265,9 +3285,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praha - - Büsingen - Berliini @@ -3283,9 +3300,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kairo - - El Aaiún - Kanariansaaret @@ -3358,7 +3372,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biškek - Enderbury + Abariringa Komorit @@ -3411,15 +3425,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Malediivit - - Mazatlán - - - Ciudad de México - - - Nouméa - Chathamsaaret @@ -3480,9 +3485,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riad - - Mahé - Khartum @@ -3495,15 +3497,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damaskos - - N’Djamena - Kerguelensaaret - - Lomé - Dušanbe @@ -3569,9 +3565,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Länsi-Afrikan aika - Länsi-Afrikan normaaliaika - Länsi-Afrikan kesäaika + Länsi-Afrikan aika @@ -3959,6 +3953,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyanan aika + + + Havaijin-Aleuttien normaaliaika + + Havaijin-Aleuttien aika @@ -4409,6 +4408,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuukin aika + + + Turkin aika + Turkin normaaliaika + Turkin kesäaika + + Turkmenistanin aika @@ -4574,7 +4580,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -6091,6 +6100,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ XCD XCD + + Karibian guldeni + Karibian guldeni + Karibian guldenia + erityisnosto-oikeus (SDR) erityisnosto-oikeus (SDR) @@ -6225,6 +6239,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwen dollari (1980–2008) Zimbabwen dollaria (1980–2008) + + Zimbabwen kulta + Zimbabwen kulta + Zimbabwen kultaa + Zimbabwen dollari (2009) Zimbabwen dollari (2009) @@ -6583,7 +6602,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kohteeseen {0} kohdetta - + + osat + {0} osa + {0} osaa + + miljoonasosat {0} miljoonasosa {0} miljoonasosasta @@ -6647,6 +6671,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mooliin {0} moolia + + glukoosia + {0} glukoosia + {0} glukoosia + litrat / kilometri {0} litra / kilometri @@ -7711,6 +7740,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elohopeamillimetriin {0} elohopeamillimetriä + + elohopeaa + {0} elohopeaa + {0} elohopeaa + paunat / neliötuuma {0} pauna / neliötuuma @@ -8081,6 +8115,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} teekuppiin {0} teekuppia + + nesteunssit + {0} nesteunssi + {0} nesteunssia + eekkerijalat {0} eekkerijalka @@ -8157,7 +8196,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} br. neljännesgallona {0} br. neljännesgallonaa - + + steradiaanit + {0} steradiaani + {0} steradiaania + + + katalit + {0} katal + {0} katalia + + + coulombit + {0} coulombi + {0} coulombia + + + faradit + {0} faradi + {0} faradia + + + henryt + {0} henry + {0} henryä + + + siemensit + {0} siemens + {0} siemensiä + + + kalorit [IT] + {0} kalori [IT] + {0} kaloria [IT] + + + becquerelit + {0} becquerel + {0} becquereliä + + + sievertit + {0} sievertti + {0} sieverttiä + + + grayt + {0} gray + {0} grayta + + + kilopondit + {0} kilopondi + {0} kilopondia + + + teslat + {0} tesla + {0} teslaa + + + weberit + {0} weber + {0} weberiä + + + valon nopeus + {0} valon nopeus + {0} valon nopeus + + miljardisosat {0} miljardisosa {0} miljardisosasta @@ -8171,7 +8280,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} miljardisosaa - yöt {0} yö {0} yöstä {0} yön @@ -8232,6 +8340,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kohde {0} kohde + + osa + {0} osa + {0} osa + {0} % {0} % @@ -8248,6 +8361,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mooli + + gluk + {0} gluk + {0} gluk + l/km {0} l/km @@ -8451,6 +8569,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + {0} Hg + {0} Hg + {0} °C {0} °C @@ -8502,6 +8624,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} tkp {0} tkp + + {0} fl oz m. + {0} fl oz m. + am. gal {0} am. gal @@ -8516,8 +8642,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kp - {0} kp - {0} kp + {0} kuppi + {0} kuppia fl oz @@ -8577,6 +8703,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt br. {0} qt br. + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + kp + {0} kp + {0} kp + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + valon nopeus + {0} valon nopeus + {0} valon nopeus + yöt {0} yö @@ -8664,7 +8849,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kohde {0} kohdetta - + + osa + {0} osa + {0} osa + + {0}ppm {0}ppm @@ -8682,6 +8872,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + gluk + {0} gluk + {0} gluk + {0}l/km {0}l/km @@ -9310,11 +9505,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt br. {0}qt br. + + cal-IT + + + kp + {0} kp + {0} kp + + + valon nopeus + {0}valon nopeus + {0}valon nopeus + + + {0}ppb + {0}ppb + - yöt {0}yö {0}yöt - {0}/yö suunta diff --git a/make/data/cldr/common/main/fil.xml b/make/data/cldr/common/main/fil.xml index ffc6e42ace6..135e318c0f2 100644 --- a/make/data/cldr/common/main/fil.xml +++ b/make/data/cldr/common/main/fil.xml @@ -31,7 +31,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Obolo Angika Arabic - Modernong Karaniwang Arabic + Modern Standard Arabic Mapuche Arapaho Najdi Arabic @@ -45,6 +45,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Azerbaijani Azeri Bashkir + Baluchi Balinese Basaa Belarusian @@ -92,7 +93,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Carolina Algonquian Seselwa Creole French Czech - Latian na Cree + Swampy Cree Church Slavic Chuvash Welsh @@ -101,8 +102,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dargwa Taita German - Austrian German - Swiss High German Dogrib Zarma Dogri @@ -138,7 +137,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Faroese Fon French - Swiss na French Cajun French Hilagang Frisian Friulian @@ -229,12 +227,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Colognian Kurdish + Kurdish + Kurmanji Kumyk Komi Cornish Kwakʼwala Kuvi - Kirghiz + Kyrgyz Latin Ladino Langi @@ -287,7 +287,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Malay Maltese Mundang - Maramihang Wika + Maramihang wika Creek Mirandese Burmese @@ -341,7 +341,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pashto Pushto Portuguese - Portuges ng Brasil European Portuguese Quechua Kʼicheʼ @@ -439,7 +438,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Udmurt Uyghur Uighur - Ukranian + Ukrainian Umbundu Hindi Kilalang Wika Urdu @@ -544,7 +543,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Mundo + mundo Africa Hilagang Amerika Timog Amerika @@ -629,6 +628,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombia Clipperton Island + Sark Costa Rica Cuba Cape Verde @@ -663,7 +663,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ France Gabon United Kingdom - U.K. + UK Grenada Georgia French Guiana @@ -874,35 +874,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numeric na Pag-uuri-uri Lakas ng Pag-uuri-uri Pera + Presentation ng Emoji Siklo ng Oras (12 laban sa 24) - Istilo ng Putol ng Linya + CJK na Line Break + Mga Line Break sa Mga Salita Sistema ng Pagsukat Mga Numero + Sentence Break Pagkatapos ng Abbr. Time Zone Lokal na Variant Pribadong Paggamit Kalendaryo ng Buddhist + Buddhist Kalendaryong Chinese + Chinese Kalendaryong Coptic + Coptic Dangi na Kalendaryo + Dangi Kalendaryo ng Ethiopia + Ethiopic Kalendaryong Ethiopic Amete Alem + Ethiopic Amete Alem Gregorian na Kalendaryo + Gregorian Hebrew na Kalendaryo + Hebrew Pambansang Kalendaryong Indian - Kalendaryong Islam + Kalendaryong Hijiri + Hijri Kalendaryong Hijri (tabular, Civil epoch) + Hijri (tabular, civil epoch) Kalendaryong Islamiko (Saudi Arabia, sighting) Kalendaryong Islamiko (tabular, astronomikal na epoch) Kalendaryong Hijri (Umm al-Qura) - ISO-8601 na Kalendaryo + Hijri (Umm al-Qura) + Kalendaryong Gregorian (Unang Taon) Kalendaryong Japanese + Japanese Kalendaryong Persian + Persian Kalendaryong Minguo + Minguo Format ng Pera sa Accounting + Accounting Karaniwang Format ng Pera + Karaniwan Pag-uri-uriin ang Mga Simbolo Pag-uri-uriin ang Mga Ignoring Symbol Pag-uri-uriin ang Mga Accent nang Normal @@ -912,19 +931,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Uppercase Muna ang Pag-uri-uriin Pag-uri-uriin ang Hindi Case Sensitive Pag-uri-uriin ang Case Sensitive - Pagkakasunod-sunod ng Pag-uuri ng Tradisyunal na Chinese - Big5 Nakaraang Pagkakasunud-sunod ng Pag-uuri, para sa compatibility Pagkakasunud-sunod ng Pag-uuri ng Diksyunaryo Default na Pagkakasunud-sunod ng Ayos ng Unicode + Default na Unicode Pagkakasunud-sunod ng Pag-uuri ng Emoji Mga Tuntunin ng European na Pagkakasunud-sunod - Pagkakasunud-sunod ng Pag-uuri ng Pinasimpleng Chinese - GB2312 Pagkakasunud-sunod ng Pag-uuri ng Phonebook Phonetic na Ayos ng Pag-uuri-uri Pagkakasunud-sunod ng Pag-uuri ng Pinyin Pangkalahatang Paghahanap + Maghanap Maghanap Ayon sa Unang Katinig ng Hangul Karaniwang Pagkakasunud-sunod ng Ayos + Karaniwan Pagkakasunud-sunod ng Pag-uuri ng Stroke Tradisyunal na Pagkakasunud-sunod ng Pag-uuri Pagkakasunud-sunod ng Pag-uuri ng Radical-Stroke @@ -941,18 +961,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hanggang sa Fullwidth Hanggang sa Halfwidth Numeric + Default + Emoji + Text 12 Oras na Sistema (0–11) + 12 (0–11) 12 Oras na Sistema (1–12) + 12 (1–12) 24 na Oras na Sistema (0–23) + 24 (0–23) 24 na Oras na Sistema (1–24) + 24 (1–24) Loose na Istilo ng Line Break + Loose Normal na Istilo ng Line Break + Normal Mahigpit na Istilo ng Line Break + Strict + I-break lahat + Panatilihin lahat + Normal + Panatilihin sa mga parirala US BGN na Transliteration UN GEGN na Transliteration Metrikong Sistema + Metric Sistemang Imperial na Pagsukat + UK Sistema ng Pagsukat sa US + US Ahom na mga Digit Arabic-Indic na Mga Digit Extendend Arabic-Indic na Mga Digit @@ -1009,7 +1046,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mga Native na Digit N’Ko na Mga Digit Mga Digit ng Ol Chiki - Mga Oriya na Digit + Mga Odia na Digit Mga Roman Numeral Roman Lowercase na Mga Numeral Tamil na Mga Numeral @@ -1019,6 +1056,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mga Tibetan na Digit Mga Tradisyunal na Numeral Mga Vai na Digit + Naka-off + Naka-on Metriko @@ -1037,9 +1076,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1082,6 +1118,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'nang' {0} + + {1} 'nang' {0} + @@ -1090,6 +1129,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'nang' {0} + + {1} 'nang' {0} + @@ -1106,11 +1148,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a M/d @@ -1176,10 +1219,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, MMM d – E, MMM d, y G E, MMM d, y – E, MMM d, y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1190,10 +1229,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -1208,9 +1243,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM–MMM - - MMM d – MMM d - E, MMM d – E, MMM d E, MMM d – E, MMM d @@ -1327,15 +1359,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biy Sab - - Lin - Lun - Mar - Miy - Huw - Biy - Sab - Linggo Lunes @@ -1356,15 +1379,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biy Sab - - Lin - Lun - Mar - Miy - Huw - Biy - Sab - @@ -1395,24 +1409,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ng gabi - hatinggabi am - tanghaling-tapat pm - ng umaga - madaling-araw - ng hapon - ng gabi - ng gabi - - - hatinggabi - tanghaling-tapat - ng umaga - madaling-araw - ng hapon - ng gabi - ng gabi @@ -1520,11 +1518,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G M/d/y G + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1594,10 +1593,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, MMM d – E, MMM d, y G E, MMM d, y – E, MMM d, y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1608,10 +1603,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -1626,9 +1617,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM–MMM - - MMM d – MMM d - E, MMM d – E, MMM d E, MMM d – E, MMM d @@ -2207,7 +2195,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Enderbury + Canton Island Kostanay @@ -2261,9 +2249,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Oras sa Kanlurang Africa - Standard na Oras sa Kanlurang Africa - Oras sa Tag-init ng Kanlurang Africa + Oras sa Kanlurang Africa @@ -2620,6 +2606,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oras sa Guyana + + + Standard na Oras sa Hawaii-Aleutian + + Oras sa Hawaii-Aleutian @@ -3179,7 +3170,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4054,6 +4044,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dolyar ng Silangang Caribbean dolyares ng Silangang Caribbean + + Caribbean guilder + Caribbean guilder + Caribbean guilders + CFA Franc ng Kanlurang Africa CFA franc ng Kanlurang Africa @@ -4087,6 +4082,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zambian kwacha Zambian kwachas + + Zimbabwean Gold + Zimbabwean gold + Zimbabwean gold + {0}+ @@ -4305,7 +4305,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0} na item - + + parts + {0} part + {0} parts + + parts per million {0} part per million {0} parts per million @@ -4328,6 +4333,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mole {0} mole + + ng glucose + {0} ng glucose + {0} ng glucose + litro kada kilometro {0} litro kada kilometro @@ -4810,8 +4820,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetro ng asoge {0} na milimetro ng asoge + + ng mercury + {0} ng mercury + {0} ng mercury + - libra kada pulgadang parisukat + pounds-force bawat square inch {0} libra kada pulgadang parisukat {0} na libra kada pulgadang parisukat @@ -5052,15 +5067,72 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} Imp. na kuwart {0} Imp. na kuwart - + + steradians + {0} steradian + {0} steradians + + + katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calories [IT] + {0} calorie [IT] + {0} calories [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + kilograms-force + {0} kilogram-force + {0} kilograms-force + + + teslas + + + {0} weber + {0} webers + + parts per billion {0} part per billion {0} parts per billion - mga gabi - {0} gabi - {0} gabi {0} kada gabi @@ -5126,7 +5198,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ karat - + parts/million @@ -5135,6 +5207,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mole + + Glc + litro/km @@ -5235,6 +5310,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ nanoseg + + amps + milliamps @@ -5390,6 +5468,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ watts + + ng Hg + {0} ng Hg + {0} ng Hg + in Hg @@ -5485,7 +5568,36 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Imp na kuwart - + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + parts/billion @@ -5563,7 +5675,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0}item - + ppm @@ -5572,6 +5684,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mol + + Glc + L/km @@ -5816,6 +5931,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg {0}mmHg + + ng Hg + {0} ng Hg + {0} ng Hg + {0}psi {0}psi @@ -5936,15 +6056,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt Imp. {0}qt-Imp. - + + cal-IT + + {0}ppb {0}ppb - mga gabi {0}gabi {0}gabi - {0}/gabi diff --git a/make/data/cldr/common/main/fo.xml b/make/data/cldr/common/main/fo.xml index 62c754793d9..e54f95f951c 100644 --- a/make/data/cldr/common/main/fo.xml +++ b/make/data/cldr/common/main/fo.xml @@ -983,6 +983,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic etiopiskur kalendari etiopiskur amete alem kalendari gregorianskur kalendari + gregorianskur hebraiskur kalendari islamiskur kalendari islamiskur kalendari (talvuskapaður, fólkaligt tíðarskeið) @@ -998,6 +999,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic röðina fyrir fjöltyngi evrópskum skjölum vanlig leiting vanlig raðskipan + vanlig siðbundin raðskipan zhuyin raðskipan 12 tímar klokkuskipan (0–11) @@ -1123,6 +1125,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1131,6 +1136,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1148,7 +1156,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM.y GGGGG dd.MM.y GGGGG + dd.MM.y GGGGG, E MMM y G d. MMM y G E d. MMM y G @@ -1516,6 +1526,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1524,6 +1537,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1541,7 +1557,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM.y G dd.MM.y G + dd.MM.y G, E MMM y G d. MMM y G E d. MMM y G @@ -2311,9 +2329,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Jamaika - - Enderbury - Kuvait @@ -2405,9 +2420,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Vesturafrika tíð - Vesturafrika vanlig tíð - Vesturafrika summartíð + Vesturafrika tíð @@ -2757,6 +2770,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gujana tíð + + + Hawaii-Aleutian vanlig tíð + + Hawaii-Aleutian tíð @@ -3332,9 +3350,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -3965,6 +3985,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Eystur Karibia dollari Eystur Karibia dollarar + + Karibia gyllin + Karibia gyllin + Karibia gyllin + Vesturafrika CFA frankur Vesturafrika CFA frankur @@ -3995,6 +4020,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sambia kwacha + + Simbabvi gull + {0}+ @@ -4204,7 +4232,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} lutur {0} lutir - + partar fyri hvørja millión {0} partur fyri hvørja millión {0} partar fyri hvørja millión @@ -4857,7 +4885,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ljós {0} ljós - + partar fyri hvørja milliard {0} part fyri hvørja milliard {0} partar fyri hvørja milliard @@ -4958,7 +4986,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} lutur {0} lutir - + partar/millión {0} pt./mill. {0} pt./mill. @@ -5456,7 +5484,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ljós {0} ljós - + partar/milliard {0} part/mia. {0} partar/mia. @@ -5565,7 +5593,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}lutur {0} lutir - + pt./mill. {0}pt./mill {0}pt./mill @@ -6046,7 +6074,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ljós {0}ljós - + partar/mia. {0}part/mia. {0}partar/mia. diff --git a/make/data/cldr/common/main/fr.xml b/make/data/cldr/common/main/fr.xml index 06ad708b52c..075e313db8d 100644 --- a/make/data/cldr/common/main/fr.xml +++ b/make/data/cldr/common/main/fr.xml @@ -332,6 +332,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurde + kurde + kurmandji koumyk kutenai komi @@ -695,6 +697,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -841,6 +844,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -861,6 +865,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -871,6 +876,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -979,6 +985,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chine Colombie Île Clipperton + Sercq Costa Rica Cuba Cap-Vert @@ -1203,7 +1210,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Afrique du Sud Zambie Zimbabwe - région indéterminée + région inconnue Angleterre @@ -1326,35 +1333,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tri numérique priorité du tri devise + Présentation des Emoji système horaire (12 ou 24 heures) style de saut de ligne + Sauts de ligne dans les mots système de mesure nombres + Saut de phrase après une abréviation fuseau horaire variante locale usage privé calendrier bouddhiste + bouddhiste calendrier chinois + chinois calendrier copte + copte calendrier dangi + dangi calendrier éthiopien + éthiopien calendrier éthiopien Amete Alem + éthiopien Amete Alem calendrier grégorien + grégorien calendrier hébraïque + hébraïque calendrier indien calendrier hégirien + hégirien calendrier hégirien (tabulaire, époque civile) + hégirien (tabulaire, époque civile) calendrier musulman (observé, Arabie Saoudite) calendrier hégirien (tabulaire, époque astronomique) + hégirien (tabulaire, époque astronomique) calendrier hégirien (Umm al-Qura) + hégirien (Umm al-Qura) calendrier ISO 8601 calendrier japonais + japonais calendrier persan + persan calendrier républicain chinois + républicain chinois format de devise comptable + comptable format de devise standard + standard Trier les symboles Trier en ignorant les symboles Trier les caractères accentués normalement @@ -1364,23 +1391,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Trier avec les majuscules d’abord Trier sans tenir compte de la casse Trier en tenant compte de la casse - ordre chinois traditionnel - Big5 ancien ordre de tri pour compatibilité + compatibilité ordre du dictionnaire + dictionnaire ordre de tri Unicode par défaut + Unicode par défaut ordre des emoji règles de classement européen - ordre chinois simplifié - GB2312 ordre de l’annuaire + annuaire ordre de tri phonétique + phonétique ordre pinyin + pinyin recherche générique + recherche rechercher par consonne initiale en hangeul ordre de tri standard + standard ordre des traits + traits ordre traditionnel + traditionnel ordre de tri radical-traits + radical-traits ordre zhuyin + zhuyin Trier sans normalisation Trier avec normalisation Unicode Trier les chiffres individuellement @@ -1393,18 +1430,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ en pleine chasse en demi-chasse Numérique + par défaut + Emoji + texte système horaire de 12 heures (0–11) + 12 (0–11) système horaire de 12 heures (1–12) + 12 (1–12) système horaire de 24 heures (0–23) + 24 (0–23) système horaire de 24 heures (1–24) + 24 (1–24) style de saut de ligne permissif + permissif style de saut de ligne normal + normal style de saut de ligne strict + strict + Couper n’importe où + Ne pas couper + Normal + Ne pas couper dans les phrases BGN UNGEGN système métrique + métrique système impérial + impérial système américain + américain chiffres ahoms chiffres arabes chiffres arabes étendus @@ -1440,11 +1494,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chiffres nyiakeng puachue hmong chiffres javanais chiffres japonais - chiffres japonais financiers + chiffres financiers japonais chiffres kayah li chiffres kawis chiffres khmers - chiffres en kannada + chiffres kannadas chiffres kirat rais chiffres lannas horas chiffres lannas thams @@ -1468,7 +1522,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chiffres birmans shans chiffres birmans tai laings chiffres nag mundaris - chiffres natifs + chiffres locaux chiffres n’kos chiffres ol-chikis chiffres ol onals @@ -1498,6 +1552,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chiffres en vaï chiffres warang-citis chiffres wantcho + Désactivé + Activé métrique @@ -1546,10 +1602,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [''’ ՚ ᾽᾿ ʼ ߴ] - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1786,11 +1840,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - avant Dioclétien après Dioclétien - av. D. ap. D. @@ -1841,16 +1893,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - avant l’Incarnation - après l’Incarnation - - - av. Inc. - ap. Inc. - - @@ -1894,6 +1936,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'à' {0} + + {1} 'à' {0} + @@ -1902,6 +1947,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'à' {0} + + {1} 'à' {0} + @@ -1918,13 +1966,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G dd/MM/y GGGGG + E d/M/y G MMM y G d MMM y G E d MMM y G - h a h:mm a h:mm:ss a + HH 'h' v dd/MM E dd/MM d MMM @@ -1944,11 +1994,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -2300,6 +2348,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'à' {0} + + {1} 'à' {0} + @@ -2308,6 +2359,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'à' {0} + + {1} 'à' {0} + @@ -2318,6 +2372,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}, {0} + E @@ -2325,16 +2382,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM/y G dd/MM/y GGGGG + E dd/MM/y GGGGG MMM y G d MMM y G E d MMM y G - h a HH 'h' h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'h' v dd/MM E dd/MM d MMM @@ -2356,11 +2415,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -2403,7 +2460,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM y – E d MMM y G - h a – h a h – h a @@ -2428,7 +2484,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -2657,6 +2712,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + M/y G + E d/M/y G M/y GGGGG d/M/y GGGGG E d/M/y GGGGG @@ -2819,6 +2876,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an + l’an dernier + cette année + l’an prochain dans {0} a dans {0} a @@ -2830,6 +2890,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ a + l’an dernier + cette année + l’an prochain +{0} a +{0} a @@ -3314,11 +3377,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} (heure d’été) {0} (heure standard) - - HT - HST - HDT - Honolulu @@ -3330,7 +3388,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ville inconnue + lieu inconnu Andorre @@ -3341,30 +3399,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kaboul - - Tirana - Erevan - - Showa - - - Dumont-d’Urville - - - Río Gallegos - Ushuaïa - - Tucumán - - - Córdoba - Vienne @@ -3389,39 +3429,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bermudes - - Eirunepé - Manaos - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - Saint-Jean de Terre-Neuve Île de Pâques - - Ürümqi - La Havane @@ -3434,9 +3450,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Famagouste - - Büsingen - Copenhague @@ -3449,9 +3462,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Alger - - Galápagos - Le Caire @@ -3523,15 +3533,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bichkek - - Enderbury - - - Canton - - - Comores - Saint-Christophe @@ -3586,18 +3587,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maurice - - Mazatlán - Bahia de Banderas Mexico - - Nouméa - Katmandou @@ -3670,9 +3665,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riyad - - Mahé - Singapour @@ -3688,12 +3680,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damas - - N’Djamena - - - Lomé - Douchanbé @@ -3792,9 +3778,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - heure d’Afrique de l’Ouest - heure normale d’Afrique de l’Ouest - heure d’été d’Afrique de l’Ouest + heure d’Afrique de l’Ouest @@ -3803,11 +3787,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de l’Alaska heure d’été de l’Alaska - - HAK - HNAK - HEAK - @@ -3829,11 +3808,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale du centre nord-américain heure d’été du centre nord-américain - - HC - HNC - HEC - @@ -3841,11 +3815,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de l’Est nord-américain heure d’été de l’Est nord-américain - - HE - HNE - HEE - @@ -3853,11 +3822,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale des Rocheuses heure d’été des Rocheuses - - HR - HNR - HER - @@ -3865,11 +3829,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale du Pacifique nord-américain heure d’été du Pacifique nord-américain - - HP - HNP - HEP - @@ -3933,11 +3892,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de l’Atlantique heure d’été de l’Atlantique - - HA - HNA - HEA - @@ -4078,11 +4032,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de Cuba heure d’été de Cuba - - HCU - HNCU - HECU - @@ -4124,11 +4073,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale d’Europe de l’Est heure d’été d’Europe de l’Est - - EET - EEST - EEDT - @@ -4141,11 +4085,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale d’Europe de l’Ouest heure d’été d’Europe de l’Ouest - - WET - WEST - WEDT - @@ -4207,11 +4146,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de l’Est du Groenland heure d’été de l’Est du Groenland - - HEG - HNEG - HEEG - @@ -4219,11 +4153,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de l’Ouest du Groenland heure d’été de l’Ouest du Groenland - - HOG - HNOG - HEOG - @@ -4240,17 +4169,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure du Guyana + + + heure normale d’Hawaï - Aléoutiennes + + heure d’Hawaï - Aléoutiennes heure normale d’Hawaï - Aléoutiennes heure d’été d’Hawaï - Aléoutiennes - - HHA - HNHA - HEHA - @@ -4439,11 +4368,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale du Pacifique mexicain heure d’été du Pacifique mexicain - - HPMX - HNPMX - HEPMX - @@ -4494,11 +4418,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure normale de Terre-Neuve heure d’été de Terre-Neuve - - HTN - HNTN - HETN - @@ -4710,6 +4629,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ heure de Chuuk + + + heure de Turquie + heure normale de Turquie + heure avancée de Turquie + + heure du Turkménistan @@ -4885,10 +4811,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -6489,6 +6416,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dollar zimbabwéen dollars zimbabwéens + + or du Zimbabwe + or du Zimbabwe + or du Zimbabwe + dollar zimbabwéen (2009) dollar zimbabwéen (2009) @@ -6754,11 +6686,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0} items - + + parts + {0} parts + {0} parts + + feminine - parts par million - {0} part par million - {0} parts par million + parties par million + {0} partie par million + {0} parties par million masculine @@ -6784,6 +6721,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mole {0} moles + + de glucose + {0} de glucose + {0} de glucose + masculine litres au kilomètre @@ -7405,6 +7347,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimètre de mercure {0} millimètres de mercure + + de mercure + {0} de mercure + {0} de mercure + livres-force par pouce carré {0} livre-force par pouce carré @@ -7609,6 +7556,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} tasse métrique {0} tasses métriques + + onces liquides métriques + {0} once liquide métrique + {0} onces liquides métriques + acres-pieds {0} acre-pied @@ -7715,23 +7667,82 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quart impérial {0} quarts impériaux + + stéradians + {0} stéradian + {0} stéradians + + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calories [IT] + {0} calorie [IT] + {0} calories [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + kilogrammes-force + {0} kilogramme-force + {0} kilogrammes-force + + + teslas + {0} tesla + {0} teslas + + + webers + {0} weber + {0} webers + feminine - lumière - {0} lumière - {0} lumière - + feminine - parts par milliard - {0} part par milliard - {0} parts par milliard + parties par milliard + {0} partie par milliard + {0} parties par milliard feminine - nuits - {0} nuit - {0} nuits {0} par nuit @@ -7837,7 +7848,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} items {0} items - + + {0} parts + {0} parts + + {0} ppm {0} ppm @@ -7857,6 +7872,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} mol + + Glc + l/km {0} l/km @@ -8308,6 +8326,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + de Hg + {0} de Hg + {0} de Hg + lb/po² {0} lb/po² @@ -8540,6 +8563,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt imp. {0} qt imp. + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + lumière {0} lumière @@ -8630,7 +8666,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}item {0}items - + + {0} parts + {0} parts + + {0}ppm {0}ppm @@ -8646,6 +8686,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glc + {0}l/km {0}l/km @@ -9023,6 +9066,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + de Hg + {0} de Hg + {0} de Hg + {0} lb/po² {0} lb/po² @@ -9227,20 +9275,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt imp. {0}qt imp. - - lumière - {0} lumière - {0} lumière + + cal-IT - + {0}ppb {0}ppb - nuits {0}nuit {0}nuits - {0}/nuit {0}E diff --git a/make/data/cldr/common/main/fr_CA.xml b/make/data/cldr/common/main/fr_CA.xml index f873e9d2394..ec19a4185c9 100644 --- a/make/data/cldr/common/main/fr_CA.xml +++ b/make/data/cldr/common/main/fr_CA.xml @@ -13,7 +13,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {0} : {1} + {0} : {1} adygué @@ -48,6 +48,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kalaallisut kashmiri chambala + kurmanji live luba-katanga chinois classique @@ -145,19 +146,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic îles Vierges américaines Vietnam + + Présentation des émojis + - ordre de tri chinois traditionnel - Big5 + par compatibilité ordre de tri du dictionnaire + du dictionnaire ordre multilingue européen - ordre de tri chinois simplifié - GB2312 ordre de tri de l’annuaire + de l’annuaire ordre de tri pinyin Rechercher par consonne initiale en hangeul ordre de tri des traits + des traits ordre de tri traditionnel ordre de tri zhuyin pleine chasse demi-chasse + émoji BGN (commission de toponymie des États-Unis) GENUNG chiffres gujaratis @@ -313,19 +320,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic h 'h' B h 'h' mm B h 'h' mm 'min' ss 's' B + E h 'h' B E h 'h' mm B E h 'h' mm 'min' ss 's' B + E h 'h' a E h 'h' mm a E HH 'h' mm E h 'h' mm 'min' ss 's' a E HH 'h' mm 'min' ss 's' + y-M G y-MM-dd GGGGG + E y-MM-dd G h 'h' a HH 'h' h 'h' mm a HH 'h' mm h 'h' mm 'min' ss 's' a HH 'h' mm 'min' ss 's' + h 'h' a v M-d E M-d MM-d @@ -536,13 +548,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic h 'h' B h 'h' mm B h 'h' mm 'min' ss 's' B + E h 'h' B E h 'h' mm B E h 'h' mm 'min' ss 's' B + E h 'h' a E h 'h' mm a E HH 'h' mm E h 'h' mm 'min' ss 's' a E HH 'h' mm 'min' ss 's' + y-MM G y-MM-dd GGGGG + E y-MM-dd G h 'h' a h 'h' mm a HH 'h' mm @@ -552,6 +568,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH 'h' mm 'min' ss 's' v h 'h' mm a v HH 'h' mm v + h 'h' a v + H 'h' v MM-dd E MM-dd MM-dd @@ -802,6 +820,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + y-MM G + E y-MM-dd G MM-dd E d MMM y-MM GGGGG @@ -1128,13 +1148,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic heure normale d’Afrique du Sud - - - heure d’Afrique de l’Ouest - heure normale d’Afrique de l’Ouest - heure avancée d’Afrique de l’Ouest - - heure de l’Alaska @@ -1266,6 +1279,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic heure normale de l’Atlantique heure avancée de l’Atlantique + + HA + HNA + HAA + @@ -1438,6 +1456,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic heure avancée de l’Ouest du Groenland + + + heure normale d’Hawaï-Aléoutiennes + + heure d’Hawaï-Aléoutiennes @@ -1655,6 +1678,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic heure normale de Saint-Pierre-et-Miquelon heure avancée de Saint-Pierre-et-Miquelon + + HPM + HNPM + HAPM + @@ -1784,56 +1812,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0 k¤ - 0 k ¤ - 0 k¤ - 0 k ¤ - 00 k¤ - 00 k ¤ - 00 k¤ - 00 k ¤ - 000 k¤ - 000 k ¤ - 000 k¤ - 000 k ¤ - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 0 G¤ - 0 G ¤ - 0 G¤ - 0 G ¤ - 00 G¤ - 00 G ¤ - 00 G¤ - 00 G ¤ - 000 G¤ - 000 G ¤ - 000 G¤ - 000 G ¤ - 0 T¤ - 0 T ¤ - 0 T¤ - 0 T ¤ - 00 T¤ - 00 T ¤ - 00 T¤ - 00 T ¤ - 000 T¤ - 000 T ¤ - 000 T¤ - 000 T ¤ + 0 k ¤ + 0 k ¤ + 00 k ¤ + 00 k ¤ + 000 k ¤ + 000 k ¤ + 0 M ¤ + 0 M ¤ + 00 M ¤ + 00 M ¤ + 000 M ¤ + 000 M ¤ + 0 G ¤ + 0 G ¤ + 00 G ¤ + 00 G ¤ + 000 G ¤ + 000 G ¤ + 0 T ¤ + 0 T ¤ + 00 T ¤ + 00 T ¤ + 000 T ¤ + 000 T ¤ + {0} {1} + {0} {1} @@ -2031,6 +2037,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + {0} cube + {0} cube + {0} cubes + {0} cubes + force g @@ -2038,165 +2050,72 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mètre par seconde carrée {0} mètres par seconde carrée - - {0} radian - {0} radians - - - {0} degré - {0} degrés - - - {0} kilomètre carré - {0} kilomètres carrés - - - {0} hectare - {0} hectares - - - {0} mètre carré - {0} mètres carrés - - - {0} centimètre carré - {0} centimètres carrés - - - {0} mille carré - {0} milles carrés - acres - {0} acre - {0} acres + {0} acre + {0} acres verges carrées - {0} verge carrée - {0} verges carrées + {0} verge carrée + {0} verges carrées - - {0} pied carré - {0} pieds carrés + + {0} item + {0} items - - {0} pouce carré - {0} pouces carrés + + {0} part + {0} parts - - parties par million - {0} partie par million - {0} parties par million + + {0} de glucose + {0} de glucose - - {0} pour mille - {0} pour mille + + {0} litre au kilomètre + {0} litres au kilomètre litres aux 100 kilomètres - {0} litre aux 100 kilomètres - {0} litres aux 100 kilomètres + {0} litre aux 100 kilomètres + {0} litres aux 100 kilomètres milles au gallon - {0} mille au gallon - {0} milles au gallon + {0} mille au gallon + {0} milles au gallon milles au gallon impérial - {0} mille au gallon impérial - {0} milles au gallon impérial + {0} mille au gallon impérial + {0} milles au gallon impérial - - {0} téraoctet - {0} téraoctets + + {0} siècle + {0} siècles - - {0} térabit - {0} térabits + + {0} décennie + {0} décennies - - {0} gigaoctet - {0} gigaoctets + + {0} an + {0} ans - - {0} gigabit - {0} gigabits + + {0} trimestre + {0} trimestres - - {0} mégaoctet - {0} mégaoctets - - - {0} mégabit - {0} mégabits - - - {0} kilooctet - {0} kilooctets - - - {0} kilobit - {0} kilobits - - - {0} octet - {0} octets - - - {0} bit - {0} bits - - - {0} mois - {0} mois - - - {0} semaine - {0} semaines - - - {0} jour - {0} jours - - - {0} heure - {0} heures + + {0} minute + {0} minutes {0} seconde {0} secondes {0} à la seconde - - {0} milliseconde - {0} millisecondes - - - {0} microseconde - {0} microsecondes - - - {0} nanoseconde - {0} nanosecondes - - - {0} ampère - {0} ampères - - - {0} milliampère - {0} milliampères - - - {0} ohm - {0} ohms - - - {0} volt - {0} volts - {0} kilocalorie {0} kilocalories @@ -2229,102 +2148,76 @@ CLDR data files are interpreted according to the LDML specification (http://unic therms américains - {0} therm américain - {0} therms américains + {0} therm américain + {0} therms américains - - {0} gigahertz - {0} gigahertz + + {0} kilowatt-heure pour 100 kilomètres + {0} kilowatt-heures pour 100 kilomètres - - {0} mégahertz - {0} mégahertz + + {0} cadratin + {0} cadratins - - {0} kilohertz - {0} kilohertz + + {0} pixel + {0} pixels - - {0} hertz - {0} hertz + + {0} mégapixel + {0} mégapixels + + + {0} pixel par centimètre + {0} pixels par centimètre + + + {0} pixel par pouce + {0} pixels par pouce + + + {0} point par centimètre + {0} points par centimètre + + + {0} point par pouce + {0} points par pouce point + {0} point + {0} points - - {0} kilomètre - {0} kilomètres - - - {0} mètre - {0} mètres - - - {0} décimètre - {0} décimètres - - - {0} centimètre - {0} centimètres - - - {0} millimètre - {0} millimètres - - - {0} micromètre - {0} micromètres - - - {0} nanomètre - {0} nanomètres - - - {0} picomètre - {0} picomètres + + {0} rayon terrestre + {0} rayons terrestres mille - {0} mille - {0} milles + {0} mille + {0} milles feminine verges {0} verge - {0} verges + {0} verges - {0} pied - {0} pieds + {0} pied + {0} pieds - - {0} pouce - {0} pouces + + {0} point typographique + {0} points typographiques - - {0} parsec - {0} parsecs + + {0} candela + {0} candelas - - {0} année-lumière - {0} années-lumière - - - {0} unité astronomique - {0} unités astronomiques - - - {0} mille marin - {0} milles marins - - - {0} lux - {0} lux - - - {0} kilogramme - {0} kilogrammes + + {0} lumen + {0} lumens {0} gramme @@ -2342,10 +2235,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} stone {0} stone - - {0} livre - {0} livres - {0} once {0} onces @@ -2365,41 +2254,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} gigawatt {0} gigawatts - - {0} mégawatt - {0} mégawatts - - - {0} kilowatt - {0} kilowatts - - - {0} watt - {0} watts - - - {0} milliwatt - {0} milliwatts - {0} cheval-vapeur {0} chevaux-vapeur - - {0} pouce de mercure - {0} pouces de mercure + + {0} de mercure + {0} de mercure - - {0} millibar - {0} millibars + + {0} livre-force par pouce carré + {0} livres-force par pouce carré - - {0} atmosphère - {0} atmosphères + + {0} bar + {0} bars - - {0} hectopascal - {0} hectopascals + + {0} pascal + {0} pascals kilomètres à l’heure @@ -2415,59 +2288,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mille à l’heure {0} milles à l’heure + + {0} degré Beaufort + {0} degrés Beaufort + ° {0}° {0}° - - {0} degré Celsius - {0} degrés Celsius - - - {0} degré Fahrenheit - {0} degrés Fahrenheit - - - {0} kilomètre cube - {0} kilomètres cubes - - - {0} mètre cube - {0} mètres cubes - - - {0} centimètre cube - {0} centimètres cubes - - - {0} mille cube - {0} milles cubes + + {0} livre-force-pied + {0} livres-force-pieds verges cubes {0} verge cube - {0} verges cubes + {0} verges cubes - - {0} pied cube - {0} pieds cubes + + {0} décilitre + {0} décilitres - - {0} pouce cube - {0} pouces cubes + + {0} centilitre + {0} centilitres - - {0} mégalitre - {0} mégalitres + + {0} millilitre + {0} millilitres - - {0} hectolitre - {0} hectolitres + + {0} pinte métrique + {0} pintes métriques - - {0} litre - {0} litres + + {0} tasse métrique + {0} tasses métriques + + + {0} once liquide métrique + {0} onces liquides métriques + + + {0} acre-pied + {0} acres-pieds + + + {0} gallon + {0} gallons gallon impérial @@ -2475,30 +2344,58 @@ CLDR data files are interpreted according to the LDML specification (http://unic feminine pintes - {0} pinte - {0} pintes + {0} pinte + {0} pintes chopine - {0} chopine - {0} chopines + {0} chopine + {0} chopines + + + {0} tasse + {0} tasses + + + {0} once liquide + {0} onces liquides + + + {0} cuillère à soupe + {0} cuillères à soupe cuillères à thé - {0} cuillère à thé - {0} cuillères à thé + {0} cuillère à thé + {0} cuillères à thé cuillère à dessert + {0} cuillère à dessert + {0} cuillères à dessert + + + {0} cuillère à dessert impériale + {0} cuillères à dessert impériales goutte + {0} goutte + {0} gouttes + + + {0} drachme + {0} drachmes gobelet doseur + {0} gobelet doseur + {0} gobelets doseurs pincée + {0} pincée + {0} pincées feminine @@ -2506,10 +2403,66 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} pinte impériale {0} pintes impériales - - parties par milliard - {0} partie par milliard - {0} parties par milliard + + {0} stéradian + {0} stéradians + + + {0} katal + {0} katals + + + {0} coulomb + {0} coulombs + + + {0} farad + {0} farads + + + {0} henry + {0} henrys + + + {0} siemens + {0} siemens + + + {0} calorie [IT] + {0} calories [IT] + + + {0} becquerel + {0} becquerels + + + {0} sievert + {0} sieverts + + + {0} gray + {0} grays + + + {0} kilogramme-force + {0} kilogrammes-force + + + {0} tesla + {0} teslas + + + {0} weber + {0} webers + + + {0} partie par milliard + {0} parties par milliard + + + {0} nuit + {0} nuits + {0} par nuit point cardinal @@ -2526,165 +2479,227 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} m/s² {0} m/s² + + {0} tr + {0} tr + - {0} rad - {0} rad + {0} rad + {0} rad - {0} km² - {0} km² + {0} km² + {0} km² - {0} ha - {0} ha + {0} ha + {0} ha - {0} m² - {0} m² + {0} m² + {0} m² - {0} cm² - {0} cm² + {0} cm² + {0} cm² - {0} mi² - {0} mi² + {0} mi² + {0} mi² - {0} ac - {0} ac + {0} ac + {0} ac vg² - {0} vg² - {0} vg² + {0} vg² + {0} vg² {0} pi² - {0} pi² + {0} pi² - {0} po² - {0} po² + {0} po² + {0} po² + + + {0} dounam + {0} dounams carats + {0} ct + {0} ct + + + {0} mg/dl + {0} mg/dl + + + {0} mmol/l + {0} mmol/l - {0} item - {0} items + {0} item + {0} items + + + {0} part + {0} parts + + + {0} ppm + {0} ppm {0} % {0} % - {0} ‰ - {0} ‰ + {0} ‰ + {0} ‰ + + + {0} ‱ + {0} ‱ + + + {0} mol + {0} mol + + + {0} Glc + {0} Glc + + + {0} l/km + {0} l/km + + + {0} l/100 km + {0} l/100 km - {0} mi/gal - {0} mi/gal + {0} mi/gal + {0} mi/gal + + + {0} mi/gal imp. + {0} mi/gal imp. + + + {0} Po + {0} Po - {0} To - {0} To + {0} To + {0} To Tb - {0} Tb - {0} Tb + {0} Tb + {0} Tb - {0} Go - {0} Go + {0} Go + {0} Go Gb - {0} Gb - {0} Gb + {0} Gb + {0} Gb - {0} Mo - {0} Mo + {0} Mo + {0} Mo Mb - {0} Mb - {0} Mb + {0} Mb + {0} Mb - {0} ko - {0} ko + {0} ko + {0} ko kb - {0} kb - {0} kb + {0} kb + {0} kb - {0} octet - {0} octet + {0} o + {0} o - {0} bit - {0} bit + {0} bit + {0} bit - - {0} an - {0} ans + + {0} s. + {0} s. + + + {0} déc. + {0} déc. + + + {0} trim. + {0} trim. - {0} m. - {0} m. + {0} m. + {0} m. - {0} sem. - {0} sem. + {0} sem. + {0} sem. - {0} j - {0} j + {0} j + {0} j - {0} h - {0} h + {0} h + {0} h - {0} min - {0} min + {0} min + {0} min - {0} s - {0} s + {0} s + {0} s - {0} ms - {0} ms + {0} ms + {0} ms - {0} μs - {0} μs + {0} μs + {0} μs - {0} ns - {0} ns + {0} ns + {0} ns - {0} A - {0} A + {0} A + {0} A - {0} mA - {0} mA + {0} mA + {0} mA - {0} Ω - {0} Ω + {0} Ω + {0} Ω - {0} V - {0} V + {0} V + {0} V {0} kcal @@ -2710,103 +2725,167 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} BTU {0} BTU + + {0} therm US + {0} therms US + + + {0} lbf + {0} lbf + + + {0} N + {0} N + + + {0} kWh/100 km + {0} kWh/100 km + - {0} GHz - {0} GHz + {0} GHz + {0} GHz - {0} MHz - {0} MHz + {0} MHz + {0} MHz - {0} kHz - {0} kHz + {0} kHz + {0} kHz - {0} Hz - {0} Hz + {0} Hz + {0} Hz + + + {0} px + {0} px + + + {0} px/cm + {0} px/cm + + + {0} px/po + {0} px/po {0} pt/cm {0} pt/cm + + {0} pt/po + {0} pt/po + + + {0} pt + {0} pt + + + {0} R⊕ + {0} R⊕ + - {0} km - {0} km + {0} km + {0} km - {0} m - {0} m + {0} m + {0} m - {0} dm - {0} dm + {0} dm + {0} dm - {0} cm - {0} cm + {0} cm + {0} cm - {0} mm - {0} mm + {0} mm + {0} mm - {0} μm - {0} μm + {0} μm + {0} μm - {0} nm - {0} nm + {0} nm + {0} nm - {0} pm - {0} pm + {0} pm + {0} pm - {0} mi - {0} mi + {0} mi + {0} mi vg {0} vg - {0} vg + {0} vg {0} pi - {0} pi + {0} pi - {0} po - {0} po + {0} po + {0} po - {0} pc - {0} pc + {0} pc + {0} pc - {0} al - {0} al + {0} al + {0} al {0} ua - {0} ua + {0} ua NM {0} NM - {0} NM + {0} NM + + + {0} smi + {0} smi + + + {0} pt typog. + {0} pts typog. + + + {0} R☉ + {0} R☉ - {0} lx - {0} lx + {0} lx + {0} lx + + + {0} cd + {0} cd + + + {0} lm + {0} lm + + + {0} L☉ + {0} L☉ {0} t {0} t - {0} kg - {0} kg + {0} kg + {0} kg {0} g @@ -2826,8 +2905,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} tc - {0} lb - {0} lb + {0} lb + {0} lb {0} oz @@ -2841,6 +2920,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ct {0} ct + + {0} Da + {0} Da + {0} grain {0} grains @@ -2850,20 +2933,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} GW - {0} MW - {0} MW + {0} MW + {0} MW - {0} kW - {0} kW + {0} kW + {0} kW - {0} W - {0} W + {0} W + {0} W - {0} mW - {0} mW + {0} mW + {0} mW {0} ch @@ -2871,30 +2954,50 @@ CLDR data files are interpreted according to the LDML specification (http://unic mm Hg - {0} mm Hg - {0} mm Hg + {0} mm Hg + {0} mm Hg + + + {0} de Hg + {0} de Hg psi {0} psi - {0} psi + {0} psi po Hg {0} po Hg {0} po Hg + + {0} bar + {0} bars + - {0} mbar - {0} mbar + {0} mbar + {0} mbar + + + {0} atm + {0} atm - {0} hPa - {0} hPa + {0} hPa + {0} hPa + + + {0} kPa + {0} kPa + + + {0} MPa + {0} MPa - {0} km/h - {0} km/h + {0} km/h + {0} km/h {0} m/s @@ -2904,55 +3007,108 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mi/h {0} mi/h + + {0} nd + {0} nd + + Bf {0} Bf {0} Bf - {0} °C - {0} °C + {0} °C + {0} °C - {0} °F - {0} °F + {0} °F + {0} °F - {0} K - {0} K + {0} K + {0} K lb-pi - {0} lb-pi - {0} lb-pi + {0} lb-pi + {0} lb-pi + + + {0} N⋅m + {0} N⋅m - {0} km³ - {0} km³ + {0} km³ + {0} km³ - {0} m³ - {0} m³ + {0} m³ + {0} m³ - {0} cm³ - {0} cm³ + {0} cm³ + {0} cm³ - {0} mi³ - {0} mi³ + {0} mi³ + {0} mi³ vg³ {0} vg³ - {0} vg³ + {0} vg³ {0} pi³ {0} pi³ - {0} po³ - {0} po³ + {0} po³ + {0} po³ + + + {0} Ml + {0} Ml + + + {0} hl + {0} hl + + + {0} l + {0} l + + + {0} dl + {0} dl + + + {0} cl + {0} cl + + + {0} ml + {0} ml + + + {0} mpt + {0} mpt + + + {0} tm + {0} tm + + + {0} fl oz m. + {0} fl oz m. + + + {0} ac pi + {0} ac pi + + + {0} gal + {0} gal gal Imp @@ -2963,68 +3119,140 @@ CLDR data files are interpreted according to the LDML specification (http://unic pte {0} pte - {0} pte + {0} pte chop - {0} chop - {0} chop + {0} chop + {0} chop + + + {0} tasse + {0} tasses oz liq. {0} oz liq. - {0} oz liq. + {0} oz liq. oz liq imp. - {0} oz liq imp. - {0} oz liq imp. + {0} oz liq imp. + {0} oz liq imp. + + + {0} c. à s. + {0} c. à s. c. à t. {0} c. à t. - {0} c. à t. + {0} c. à t. + + + {0} bbl + {0} bbl cuill. à d. - {0} cuill. à d. - {0} cuill. à d. + {0} cuill. à d. + {0} cuill. à d. cuill. à d. imp. - {0} cuill. à d. imp. - {0} cuill. à d. imp. + {0} cuill. à d. imp. + {0} cuill. à d. imp. goutte - {0} goutte - {0} gouttes + {0} goutte + {0} gouttes dram liquide - {0} dram liq - {0} dram liq + {0} dram liq + {0} dram liq gobelet doseur - {0} gobelet doseur - {0} gobelets doseurs + {0} gobelet doseur + {0} gobelets doseurs + + + {0} pincée + {0} pincées pte imp {0} pte imp {0} pte imp - + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + p.p. 10⁹ {0} p.p. 10⁹ - {0} p.p. 10⁹ + {0} p.p. 10⁹ + + + {0} nuit + {0} nuits - {0} E. - {0} N. - {0} S. - {0} O. + {0} E. + {0} N. + {0} S. + {0} O. @@ -3036,6 +3264,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}vg² {0}vg² + + {0}part + {0}parts + + + {0}% + {0}% + + + {0}Glc + {0}Glc + {0}Tb {0}Tb @@ -3053,10 +3293,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}kb - déc {0}déc {0}déc + + {0}T + {0}T + {0}m {0}m @@ -3148,6 +3391,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmHg {0}mmHg + + {0}deHg + {0}deHg + {0}psi {0}psi @@ -3163,12 +3410,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bf - {0} Bf - {0} Bf - - - {0} °C - {0} °C {0}lb-pi @@ -3178,6 +3419,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}vg³ {0}vg³ + + {0}fl oz m + {0}fl oz m + ac pi {0}ac pi @@ -3248,8 +3493,59 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}pte imp {0}pte imp - - p.p. 10⁹ + + {0}sr + {0}sr + + + {0}kat + {0}kat + + + {0}C + {0}C + + + {0}F + {0}F + + + {0}H + {0}H + + + {0}S + {0}S + + + {0}cal-IT + {0}cal-IT + + + {0}Bq + {0}Bq + + + {0}Sv + {0}Sv + + + {0}Gy + {0}Gy + + + {0}kgf + {0}kgf + + + {0}T + {0}T + + + {0}Wb + {0}Wb + + {0}pp10⁹ {0}pp10⁹ diff --git a/make/data/cldr/common/main/frr.xml b/make/data/cldr/common/main/frr.xml index 47fa5256bc5..0bee3a5752d 100644 --- a/make/data/cldr/common/main/frr.xml +++ b/make/data/cldr/common/main/frr.xml @@ -41,6 +41,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Aserbaidschaansk Aseeri Baschkiirisk + Belutschisk Balineesk Basaa Witjrüsk @@ -114,6 +115,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Austraalisk Ingelsk Kanaadsk Ingelsk Britisk Ingelsk + UK Ingelsk Amerikoonsk Ingelsk US Ingelsk Esperanto @@ -221,6 +223,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Kölsch Kurdisk + Kurdisk (Kurmanji) + Kurmanji Kumyk Komi Kornisk @@ -464,6 +468,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -499,6 +504,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -599,12 +605,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Republiik Kongo Sweits Côte d’Ivoire + Elfenbianküst Cook Eilunen Chiile Kameruun Schiina Kolumbien Clipperton Eilun + Sark Costa Rica Kuuba Kapwerden @@ -799,7 +807,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tonga Türkiye Türkei - Trinidad an Tobago + Trinidad an Tobaago Tuwaalu Taiwan Tansania @@ -835,55 +843,104 @@ CLDR data files are interpreted according to the LDML specification (http://unic Münt Formaat Sortiaring Münt + Emoji Presentatsion Stünjen Formaat (12 of 24) - Rä Ambreeg Stiil + Rä Ambreeg String + Rä ambreeg uun wurden Miat Süsteem Taalen + Sats aanj efter ufk. Buddhistisk Kalender + Buddhistisk Schineesk Kalender + Schineesk Koptisk Kalender + Koptisk Dangi Kalender + Dangi Etioopisk Kalender + Etioopisk Etioopisk Amete Alem Kalender + Etioopisk Amete Alem Gregoriaans Kalender + Gregoriaans Hebreewsk Kalender + Hebreewsk Islaamisk Kalender + Islaamisk Islaamisk Bürgerlik Kalender + Islaamisk Bürgerlik Islaamisk Umalkura Kalender + Islaamisk Umalkura ISO-8601 Kalender Japoonsk Kalender + Japoonsk Persisk Kalender + Persisk Minguo Kalender + Minguo Konto Münt Formaat + Konto Standard Münt Formaat + Standard Unicode Sortiaring - Normool Schüken + Normool Unicode + Normool Schük + Schük Standard Sortiaring + Standard + Normool + Emoji + Tekst 12 Stünj Süsteem (0–11) + 12 (0–11) 12 Stünj Süsteem (1–12) + 12 (1–12) 24 Stünj Süsteem (0–23) + 24 (0–23) 24 Stünj Süsteem (1–24) + 24 (1–24) Luas Rä Ambreeg Stiil + Luas Normool Rä Ambreeg Stiil + Normool String Rä Ambreeg Stiil + String + Aal ambreeg + Aal hual + Normool + Hual uun fraasen Meetrisk Süsteem + Meetrisk UK Süsteem + UK US Süsteem + US + Ahom Taalen Araabisk Taalen Ütjwidjet Araabisk Taalen Armeensk Taalen Armeensk Letj Taalen + Balineesk Taalen Bangla Taalen + Brahmi Taalen Chakma Taalen + Cham Taalen + Kyrilisk Taalen Devanagari Taalen + Dives Akuru Taalen Etioopisk Taalen Ütjwidjet Taalen + Garay Taalen Georgisk Taalen + Gunjala Gondi Taalen + Masaram Gondi Taalen Greks Taalen Greks Letj Taalen Gujarati Taalen + Gurung Khema Taalen Gurmukhi Taalen Schineesk Deesimaal Taalen Ianfach Schineesk Taalen @@ -891,13 +948,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ual Schineesk Taalen Ual Schineesk Finans Taalen Hebreewsk Taalen + Pahawh Hmong Taalen + Nyiakeng Puachue Hmong Taalen Jawaans Taalen Japoonsk Taalen Japoonsk Finans Taalen + Kayah Li Taalen + Kawi Taalen Khmer Taalen Kanaada Taalen + Kirat Rai Taalen + Tai Tham Hora Taalen + Tai Tham Tham Taalen Laotisk Taalen Europeesk Taalen + Lepcha Taalen + Limbu Taalen Malayalam Taalen Meetei Mayek Taalen Mjanmaar Taalen @@ -911,6 +977,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Thai Taalen Tibetaans Taalen Vai Taalen + Uf + Uun Meetrisk @@ -949,7 +1017,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd @@ -961,6 +1029,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'am' {0} + + {1} 'am' {0} + @@ -969,6 +1040,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'am' {0} + + {1} 'am' {0} + @@ -981,7 +1055,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E, d + E, h B + E, h a + E, HH:mm + E, HH:mm:ss MMM, d G y MMM, d @@ -1108,8 +1185,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic e - iarmade - eftermade + de iarmade + de eftermade @@ -1185,6 +1262,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'am' {0} + + {1} 'am' {0} + @@ -1193,6 +1273,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'am' {0} + + {1} 'am' {0} + @@ -1206,14 +1289,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic d. + E, h B E, h:mm B E, h:mm:ss B E, d. + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss - G dd/MM/y + G M/y + G d/M/y + G E, d/M/y G MMM y G d. MMM y G E, d. MMM y @@ -1222,22 +1309,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm:ss a h:mm:ss a v h:mm a v - LL - dd/MM - E dd/MM + d/M + E d/M d. MMM E, d. MMM d. MMMM 'weg' W 'faan' MMMM - MM/y - dd/MM/y - E, dd/MM/y + M/y + d/M/y + E, d/M/y MMM y d. MMM y E, d. MMM y MMMM y QQQ y - QQQ y + QQQQ y 'weg' w 'faan' Y @@ -1260,10 +1346,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic G d/M/y – d/M/y - G E, dd/MM/y – E, dd/MM/y - G E, dd/MM/y – G E, dd/MM/y - G E, dd/MM/y – E, dd/MM/y - G E, dd/MM/y – E. dd/MM/y + G E, d/M/y – E, d/M/y + G E, d/M/y – G E, d/M/y + G E, d/M/y – E, d/M/y + G E, d/M/y – E, d/M/y G MMM y – G MMM y @@ -1315,15 +1401,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH – HH v - MM – MM + M – M - dd/MM – dd/MM - dd/MM – dd/MM + d/M – d/M + d/M – d/M - E, dd/MM – E, dd/MM - E, dd/MM – E, dd/MM + E, d/M – E, d/M + E, d/M – E, d/M LLL – LLL @@ -1340,18 +1426,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic y – y - MM/y – MM/y - MM/y – MM/y + M/y – M/y + M/y – M/y - dd/MM/y – dd/MM/y - dd/MM/y – dd/MM/y - dd/MM/y – dd/MM/y + d/M/y – d/M/y + d/M/y – d/M/y + d/M/y – d/M/y - E, dd/MM/y – E, dd/MM/y - E, dd/MM/y – E, dd/MM/y - E, dd/MM/y – E, dd/MM/y + E, d/M/y – E, d/M/y + E, d/M/y – E, d/M/y + E, d/M/y – E, d/M/y MMM – MMM y @@ -1385,10 +1471,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic das juar naist juar - efter {0} juar + uun {0} juaren - föör {0} juar + föör {0} juaren @@ -1420,9 +1506,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwrt. + letst kw. + das kw. + naist kw. + + uun {0} kwn. + + + föör {0} kwn. + kwrt + letst kw. + das kw. + naist kw. + + uun {0} kwn. + + + föör {0} kwn. + muun @@ -1430,7 +1534,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das muun naist muun - efter {0} muuner + uun {0} muuner föör {0} muuner @@ -1448,7 +1552,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das m naist m - efter {0} m + uun {0} m föör {0} m @@ -1541,7 +1645,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Söndai naist Söndai - efter {0} Söndaar + uun {0} Söndaar föör {0} Söndaar @@ -1552,7 +1656,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Sön. naist Sön. - efter {0} Sön. + uun {0} Sön. föör {0} Sön. @@ -1563,7 +1667,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Sö naist Sö - efter {0} Sö + uun {0} Sö föör {0} Sö @@ -1574,7 +1678,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Mundai naist Mundai - efter {0} Mundaar + uun {0} Mundaar föör {0} Mundaar @@ -1585,7 +1689,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Mun. naist Mun. - efter {0} Mun. + uun {0} Mun. föör {0} Mun. @@ -1596,7 +1700,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Mun. naist Mun. - efter {0} Mun. + uun {0} Mun. föör {0} Mun. @@ -1607,7 +1711,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Teisdai naist Teisdai - efter {0} Teisdaar + uun {0} Teisdaar föör {0} Teisdaar @@ -1618,7 +1722,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Tei. naist Tei. - efter {0} Tei. + uun {0} Tei. föör {0} Tei. @@ -1629,7 +1733,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Tei naist Tei - efter {0} Tei + uun {0} Tei föör {0} Tei @@ -1640,7 +1744,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Weedensdai naist Weedensdai - efter {0} Weedensdaar + uun {0} Weedensdaar föör {0} Weedensdaar @@ -1651,7 +1755,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Weed. naist Weed. - efter {0} Weed. + uun {0} Weed. föör {0} Weed. @@ -1662,7 +1766,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Weed naist Weed - efter {0} Weed + uun {0} Weed föör {0} Weed @@ -1673,7 +1777,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Tüürsdai naist Tüürsdai - efter {0} Tüürsdaar + uun {0} Tüürsdaar föör {0} Tüürsdaar @@ -1684,7 +1788,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Tüü. naist Tüü. - efter {0} Tüü. + uun {0} Tüü. föör {0} Tüü. @@ -1695,7 +1799,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Tüü. naist Tüü. - efter {0} Tüü. + uun {0} Tüü. föör {0} Tüü. @@ -1706,7 +1810,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Freidai naist Freidai - efter {0} Freidaar + uun {0} Freidaar föör {0} Freidaar @@ -1717,7 +1821,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Fr. naist Fr. - efter {0} Fr. + uun {0} Fr. föör {0} Fr. @@ -1728,7 +1832,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Fr naist Fr - efter {0} Fr + uun {0} Fr föör {0} Fr @@ -1739,7 +1843,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Saninj naist Saninj - efter {0} Saninjer + uun {0} Saninjer föör {0} Saninjer @@ -1750,7 +1854,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das San. naist San. - efter {0} San. + uun {0} San. föör {0} San. @@ -1761,7 +1865,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic das Sa naist Sa - efter {0} Sa + uun {0} Sa föör {0} Sa @@ -1780,16 +1884,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic stünj das stünj - efter {0} stünj + uun {0} stünjen - föör {0} stünj + föör {0} stünjen s. + das st. - efter {0} st. + uun {0} st. föör {0} st. @@ -1798,17 +1903,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic s - efter {0} st + uun {0} st föör {0} st - minüüt + minüt das minüüt - efter {0} minüüten + uun {0} minüüten föör {0} minüüten @@ -1817,7 +1922,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic min. - efter {0} min. + uun {0} min. föör {0} min. @@ -1826,7 +1931,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic min - efter {0} min + uun {0} min föör {0} min @@ -1836,7 +1941,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sekund - efter {0} sekunden + uun {0} sekunden föör {0} sekunden @@ -1845,7 +1950,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sek. - efter {0} sek. + uun {0} sek. föör {0} sek. @@ -1854,7 +1959,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sek - efter {0} s + uun {0} s föör {0} s @@ -2184,9 +2289,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waast Afrikoo Tidj - Waast Afrikoo Standard Tidj - Waast Afrikoo Somertidj + Waast Afrikoo Tidj @@ -2233,9 +2336,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Apia Tidj - Apia Standard Tidj - Apia Somertidj + Samoa Tidj + Samoa Standard Tidj + Samoa Somertidj @@ -2275,16 +2378,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Sentraal Austraalisk Tidj - Sentraal Austraalisk Standard Tidj - Sentraal Austraalisk Somertidj + Austraalisk Sentraal Tidj + Austraalisk Sentraal Standard Tidj + Austraalisk Sentraal Somertidj - Sentraal Waastaustraalisk Tidj - Sentraal Waastaustraalisk Standard Tidj - Sentraal Waastaustraalisk Somertidj + Austraalisk Madelwaast Tidj + Austraalisk Madelwaast Standard Tidj + Austraalisk Madelwaast Somertidj @@ -2341,7 +2444,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Brunei Darussalam Tidj + Brunei Tidj @@ -2398,7 +2501,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Cook Eilunen Tidj Cook Eilunen Standard Tidj - Cook Eilunen Hualew Somertidj + Cook Eilunen Somertidj @@ -2415,7 +2518,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Dumont-d’Urville Tidj + Dumont d’Urville Tidj @@ -2536,6 +2639,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyaana Tidj + + + Hawaii-Aleuten Standard Tidj + + Hawaii-Aleuten Tidj @@ -2852,7 +2960,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ponape Tidj + Pohnpei Tidj @@ -2879,9 +2987,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Samoa Tidj - Samoa Standard Tidj - Samoa Somertidj + Amrikoons Samoa Tidj + Amerikoons Samoa Standard Tidj + Amerikoons Samoa Somertidj @@ -2921,9 +3029,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Taipee Tidj - Taipee Standard Tidj - Taipee Somertidj + Taiwan Tidj + Taiwan Standard Tidj + Taiwan Somertidj @@ -3063,11 +3171,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤00K - ¤000K - ¤0M - ¤00M - ¤000M + ¤ 00K + ¤ 000K + ¤ 0M + ¤ 00M + ¤ 000M @@ -3212,6 +3320,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tschechisk Krüün Tschechisk Krüünen + + D-Mark + Djibouti Franc Djibouti Francs @@ -3657,6 +3768,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Uast Kariibik Dooler Uast Kariibik Doolers + + Kariibisk Gulden + Kariibisk Gulden + XCG + Waastafrikoonsk CFA Franc Waastafrikoonsk CFA Francs @@ -3680,6 +3796,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sambisk Kwacha Sambisk Kwachas + + Simbabwe Gul + Simbabwe Gul + {0} daar @@ -3689,7 +3809,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - dezi{0} + deesi{0} senti{0} @@ -3862,8 +3982,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} per kwadroottol - karats - {0} karats + karaat + {0} karaat miligram per deziliter @@ -3877,6 +3997,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic items {0} items + + parts + {0} parts + prosent {0} prosent @@ -3889,6 +4013,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic promyriad {0} promyriad + + glukoos + {0} glukoos + litern per kilomeeter {0} litern per kilomeeter @@ -4108,8 +4236,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} per sentimeeter - millimeetern - {0} millimeetern + milimeetern + {0} milimeetern mikromeetern @@ -4120,8 +4248,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} nanomeetern - picomeetern - {0} picomeetern + pikomeetern + {0} pikomeetern {0} miilen @@ -4269,6 +4397,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimeetern kwaksalwer {0} milimeetern kwaksalwer + + kwaksalwer + {0} kwaksalwer + tol kwaksalwer {0} tol kwaksalwer @@ -4318,7 +4450,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Beaufort - graad {0} graad @@ -4330,8 +4461,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} graad Fahrenheit - Kelvin - {0} Kelvin + kelvin + {0} kelvin pound-force-feet @@ -4385,8 +4516,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} per liter - desilitern - {0} desilitern + deesilitern + {0} deesilitern sentilitern @@ -4404,6 +4535,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic fjuarden litern {0} fjuarden litern + + meetrisk fluid ounces + {0} meetrisk fluid ounces + acre-feet {0} acre-feet @@ -4478,6 +4613,58 @@ CLDR data files are interpreted according to the LDML specification (http://unic ingelsk quarts {0} ingelsk quarts + + steradiant + {0} steradiant + + + katal + {0} katal + + + coulomb + {0} coulomb + + + farad + {0} farad + + + henry + {0} henry + + + siemens + {0} siemens + + + kaloriin [IT] + {0} kaloriin [IT] + + + becquerel + {0} becquerel + + + sievert + {0} sievert + + + gray + {0} gray + + + kilopond + {0} kilopond + + + tesla + {0} tesla + + + weber + {0} weber + laacht faard {0} laacht faard @@ -4527,7 +4714,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}/tol² - karats + karaat milimol/liter @@ -4535,6 +4722,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} items + + Glc + litern/km @@ -4589,7 +4779,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kilojoule - kWstünjen + kW-stünj elektroonenvolt @@ -4693,6 +4883,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic PS {0} PS + + tol Hg + {0} tol Hg + {0} Bft @@ -4744,6 +4938,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic pinches {0} pinches + + cal-IT + + + kp + {0} kp + c {0} c @@ -4776,7 +4977,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic acre - karat + karaat milimol/liter @@ -4784,6 +4985,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} items + + Glc + litern/km @@ -4821,7 +5025,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ns - kWstünjen + kWh elektroonenvolt @@ -4830,7 +5034,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic pound-force - newton + N px @@ -4876,6 +5080,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic PS {0} pe-es + + ″ Hg + {0}″ Hg + {0} Bft @@ -4915,6 +5123,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic drops {0} drops + + cal-IT + + + kp + {0} kp + c {0} c diff --git a/make/data/cldr/common/main/fur.xml b/make/data/cldr/common/main/fur.xml index a7d26ec7caa..e6fe0b2227a 100644 --- a/make/data/cldr/common/main/fur.xml +++ b/make/data/cldr/common/main/fur.xml @@ -593,9 +593,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendari islamic civîl calendari gjaponês calendari de Republiche di Cine - ordin cinês tradizionâl - Big5 ordenament predeterminât Unicode - ordin cinês semplificât - GB2312 ordin elenc telefonic ordin pinyin ricercje par fins gjenerâi diff --git a/make/data/cldr/common/main/fy.xml b/make/data/cldr/common/main/fy.xml index 6cf0c53ad5c..bc0e2fd4ce2 100644 --- a/make/data/cldr/common/main/fy.xml +++ b/make/data/cldr/common/main/fy.xml @@ -1133,10 +1133,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Eerst sortearje op haadletters Net haadlettergefoelich sortearje Hoofdlettergevoelig sortearje - Tradisjonele-Sineeske soartear oarder - Big5 Wurdboeksortearfolgorde Standert Unikoade-sortearfolgorde - Ferienfâldigde-Sineeske sortearfolgorde - GB2312 Telefoanboeksortearfolgorde Fonetyske sortearfolgorde Pinyinvolgorde @@ -2958,9 +2956,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - West-Afrikaanske tiid - West-Afrikaanske standerttiid - West-Afrikaanske simmertiid + West-Afrikaanske tiid @@ -3358,6 +3354,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyaanske tiid + + + Hawaii-Aleoetyske standerttiid + + Hawaii-Aleoetyske tiid @@ -3957,9 +3958,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;¤ #,##0.00- + ¤ #,##0.00;¤ #,##0.00- + #,##0.00;#,##0.00- ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/ga.xml b/make/data/cldr/common/main/ga.xml index 5be8c5b76ec..f6ce29435af 100644 --- a/make/data/cldr/common/main/ga.xml +++ b/make/data/cldr/common/main/ga.xml @@ -48,6 +48,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Asarbaiseáinis Asairis Baiscíris + Balúitsis Bailís Baváiris Basáis @@ -98,7 +99,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Criól Fraincise Seselwa Seicis Caisiúibis - Swampy Cree + Craís na gCorcach Slavais na hEaglaise Suvaisis Breatnais @@ -203,7 +204,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Indinéisis Interlingue Íogbóis - Ís Shichuan + Ís Sichuan Iniúipiaicis Ionúitis Iarthar Cheanada Ileacáinis @@ -254,6 +255,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Baifiais Coilsis Coirdis + Coirdis + Curmainsis Cúimicis Coimis Coirnis @@ -359,14 +362,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Óisibis an Iarthar Okanagan Oraimis - Odia + Oirísis Oiséitis Puinseáibis Pangasaíneánais Pampaingis Paipeamaintis Palabhais - pidsean na Nigéire + Pidsean na Nigéire Sean-Pheirsis Páilis Pijin @@ -552,7 +555,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + @@ -756,7 +759,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Congó-Brazzaville Poblacht an Chongó an Eilvéis - An Cósta Eabhair + Côte d’Ivoire an Cósta Eabhair Oileáin Cook an tSile @@ -764,9 +767,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an tSín an Cholóim Oileán Clipperton + an tSairc Cósta Ríce Cúba - Rinn Verde + Poblacht Cabo Verde Cúrasó Oileán na Nollag an Chipir @@ -778,12 +782,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Danmhairg Doiminice an Phoblacht Dhoiminiceach - An Ailgéir + an Ailgéir Ceuta agus Melilla Eacuadór an Eastóin - An Éigipt - An Sahára Thiar + an Éigipt + an Sahára Thiar an Eiritré an Spáinn an Aetóip @@ -798,6 +802,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Fhrainc an Ghabúin an Ríocht Aontaithe + RA Greanáda an tSeoirsia Guáin na Fraince @@ -805,8 +810,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gána Giobráltar an Ghraonlainn - An Ghaimbia - An Ghuine + an Ghaimbia + an Ghuine Guadalúip an Ghuine Mheánchiorclach an Ghréig @@ -822,7 +827,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Chróit Háítí an Ungáir - Na hOileáin Chanáracha + na hOileáin Chanáracha an Indinéis Éire Iosrael @@ -853,12 +858,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint Lucia Lichtinstéin Srí Lanca - An Libéir + an Libéir Leosóta an Liotuáin Lucsamburg an Laitvia - An Libia + an Libia Maracó Monacó an Mholdóiv @@ -874,7 +879,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Macao Na hOileáin Mháirianacha Thuaidh Martinique - An Mháratái + an Mháratáin Montsarat Málta Oileán Mhuirís @@ -885,9 +890,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mósaimbíc an Namaib an Nua-Chaladóin - An Nígir + an Nígir Oileán Norfolk - An Nigéir + an Nigéir Nicearagua an Ísiltír an Iorua @@ -921,7 +926,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Araib Shádach Oileáin Sholaimh na Séiséil - An tSúdáin + an tSúdáin an tSualainn Singeapór San Héilin @@ -930,7 +935,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an tSlóvaic Siarra Leon San Mairíne - An tSeineagáil + an tSeineagáil an tSomáil Suranam an tSúdáin Theas @@ -938,7 +943,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ An tSalvadóir Sint Maarten an tSiria - eSuaitíní + Esuaitíní an tSuasalainn Tristan da Cunha Oileáin na dTurcach agus Caicos @@ -950,7 +955,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tócalá Tíomór Thoir an Tuircméanastáin - An Tuinéis + an Tuinéis Tonga an Tuirc Oileán na Tríonóide agus Tobága @@ -1082,67 +1087,104 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Formáid Airgeadra Ord Sórtála Airgeadra + Léiriú mar Emoji Timthriall Uaire (12 vs 24) - Stíl Briseadh Líne + Déine Briste Líne + Bristeacha Líne laistigh d’Fhocail Córas Tomhais Uimhreacha + Briseadh Frása tar éis Giorrúcháin Féilire Búdaíoch + Búdaíoch Féilire Síneach + Síneach Féilire Coptach + Coptach Féilire Dangi + Dangi Féilire Aetóipice + Aetóipice Féilire Aetóipice Amete Alem + Aetóipice Amete Alem Féilire Ghréagóra + Gréagóra Féilire na nEabhrach + Eabhrach Féilire Náisiúnta na hIndia - Féilire Hijri - Féilire Hijiri (táblach, seanré shibhialta) + Féilire na Moslamach + Moslamach + Féilire na Moslamach (táblach, seanré shibhialta) + Moslamach (táblach, seanré shibhialta) Féilire Ioslamach (an Araib Shádach, dearcadh) Féilire Ioslamach (táblach, seanré réalteolaíoch) - Féilire Hijiri (Umm al-Qura) - Féilire ISO-8601 + Féilire na Moslamach (Umm al-Qura) + Moslamach (Umm al-Qura) + Féilire Ghréagóra (an bhliain ag an tús) Féilire Seapánach + Seapánach Féilire Peirseach + Peirseach Féilire Téavánach + Téavánach Formáid Airgeadra don Chuntasaíocht + Cuntasaíocht Formáid Airgeadra Caighdeánach - Ord sórtála Síneach traidisiúnta - Big5 + Caighdeánach Ord Sórtála Roimhe Seo, ar son na comhoiriúnachta Ord Sórtála Foclóirí Ord Sórtála Réamhshocraithe Unicode + Réamhshocraithe Unicode Ord Sórtála Emoji Rialacha Ordaithe Eorpacha - Ord sórtála Síneach simplithe - GB 2312 Ord sórtála an eolaire teileafóin Ord sórtála pinyin Cuardach Ilfhóinteach + Cuardach Cuardach de réir Consan Tosaigh Hangul Ord Sórtála Caighdeánach + Caighdeánach Ord sórtála stríce Ord sórtála traidisiúnta Ord Sórtála Stríce Radacaí Ord Sórtála Zhuyin + Réamhshocraithe + Emoji + Téacs Córas 12 Uair (0–11) + 12 (0–11) Córas 12 Uair (1–12) + 12 (1–12) Córas 24 Uair (0–23) + 24 (0–23) Córas 24 Uair (1–24) - Stíl Briseadh Líne Scaoilte - Stíl Gnáthbhriseadh Líne - Stíl Briseadh Líne Docht + 24 (1–24) + Stíl Scaoilte Briste Líne + Scaoilte + Gnáthstíl Briste Líne + Gnách + Stíl Dhian Briste Líne + Dian + Bris gach rud + Coinnigh gach rud + Gnách + Coinnigh i bhfrásaí Córas Méadrach + Méadrach Córas Tomhais Reachtúil + RA Córas Tomhais SAM + SAM Digití Ahom Digití Ind-Arabacha Digití Ind-Arabacha Breisithe Uimhreacha Airméanacha - Uimhreacha Cás Íochtair Airméanacha + Uimhreacha Cáis Íochtair Airméanacha Digití Bailíocha Digití Beangálacha Digití Brahmi - Digití Chakma + Digití Seácmacha Digití Cham Uimhreacha Coireallacha Digití Déiveanágracha @@ -1151,19 +1193,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Uimhreacha Seoirseacha Digití Masaram Gondi Uimhreacha Gréagacha - Uimhreacha Cás Íochtair Gréagacha + Uimhreacha Cáis Íochtair Gréagacha Digití Gúisearátacha Digití Gurmúcacha Uimhreacha Deachúlacha Síneacha - Uimhreacha sa tSínis Shimplithe - Uimhreacha Airgeadúla sa tSínis Shimplithe - Uimhreacha sa tSínis Thraidisiúnta - Uimhreacha Airgeadúla sa tSínis Thraidisiúnta + Uimhreacha na Sínise Simplithe + Uimhreacha Airgeadais na Sínise Simplithe + Uimhreacha na Sínise Traidisiúnta + Uimhreacha Airgeadais na Sínise Traidisiúnta Uimhreacha Eabhracha Digití Pahawh Hmong Digití Iávacha Uimhreacha Seapánacha - Uimhreacha Airgeadúla Seapánacha + Uimhreacha Airgeadais Seapánacha Digití Kayah Li Digití Ciméaracha Digití Cannadacha @@ -1191,7 +1233,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Digití Oiríseacha Digití Osmanya Uimhreacha Rómhánacha - Uimhreacha Cás Íochtair Rómhánacha + Uimhreacha Cáis Íochtair Rómhánacha Digití Saurashtra Digití Sharada Digití Khudawadi @@ -1200,14 +1242,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Digití Sundainéise Digití Takri Digití Tai Lue Nua - Uimhreacha Traidisiúnta Tamalacha + Uimhreacha Tamalacha Traidisiúnta Digití Tamalacha Digití Teileagúcha Digití Téalannacha Digití Tibéadacha Digití Tirhuta - Digití Vai + Digití Vadhacha Digití Warang Citi + Múchta + Ar siúl Méadrach @@ -1306,10 +1350,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G + M/d/y G + E, M/d/y G MMM y G d MMM y G E d MMM y G - h a h:mm a h:mm:ss a LL @@ -1332,11 +1378,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1349,12 +1393,38 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MM/y GGGGG – MM/y GGGGG + M/y – M/y G + M/y – M/y G + + + d/M/y – d/M/y G + d/M/y G – d/M/y G + d/M/y – d/M/y G + d/M/y – d/M/y G + + + E d/M/y – E d/M/y G + E d/M/y G – E d/M/y G + E d/M/y – E d/M/y G + E d/M/y – E d/M/y G MMM y G – MMM y G MMM – MMM y G MMM y – MMM y G + + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E d MMM – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G + h a – h a h–h a @@ -1594,7 +1664,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - dd/MM/y + d/M/yy @@ -1658,11 +1728,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G dd/MM/y GGGGG + E, d/M/y G MMM y G d MMM y G E d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1673,11 +1744,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d MMM E d MMM d MMMM - 'seachtain' 'a' W 'i' MMMM - 'seachtain' 'a' W 'i' MMMM - 'seachtain' 'a' W 'i' MMMM - 'seachtain' 'a' W 'i' MMMM - 'seachtain' 'a' W 'i' MMMM + MMMM: 'seachtain' W + MMMM: 'seachtain' W + MMMM: 'seachtain' W + MMMM: 'seachtain' W + MMMM: 'seachtain' W MM/y dd/MM/y E dd/MM/y @@ -1687,27 +1758,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMMM y QQQ y QQQQ y - 'seachtain' 'a' w 'in' Y - 'seachtain' 'a' w 'in' Y - 'seachtain' 'a' w 'in' Y - 'seachtain' 'a' w 'in' Y - 'seachtain' 'a' w 'in' Y + 'seachtain' w 'in' Y + 'seachtain' w 'in' Y + 'seachtain' w 'in' Y + 'seachtain' w 'in' Y + 'seachtain' w 'in' Y - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B d – d + + y G – y G + y – y G + + + M/y G – M/y G + M/y – M/y G + M/y – M/y G + + + d/M/y – d/M/y G + d/M/y G – d/M/y G + d/M/y – d/M/y G + d/M/y – d/M/y G + + + E d/M/y – E d/M/y G + E d/M/y G – E d/M/y G + E d/M/y – E d/M/y G + E d/M/y – E d/M/y G + + + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G + + + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E d MMM – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G + - h a – h a h – h a @@ -1732,7 +1838,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -2536,7 +2641,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Cathair Anaithnid + Láthair Anaithnid Andóra @@ -2553,20 +2658,47 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Eireaván - - Córdoba + + Stáisiún Rothera + + + Tír Palmer + + + Stáisiún Troll + + + Stáisiún Showa + + + Stáisiún Mawson + + + Stáisiún Vostok + + + Stáisiún Casey + + + Stáisiún Dumont-d’Urville + + + Stáisiún McMurdo Vín - Mac Guaire + Oileán Mhic Guaire + + + Oileán an Tiarna Howe Arúba - Baki + Bakı Sairéavó @@ -2592,12 +2724,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Brúiné - - Belém - - - São Paulo - Mionsc @@ -2605,11 +2731,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Bheilís - Oileán Cocos + Oileáin Cocos Zürich + + Oileán na Cásca + Shang-hai @@ -2745,6 +2874,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Calcúta + + Oileánra Chagos + Bagdad @@ -2764,7 +2896,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tóiceo - Enderbury + Oileán Canton Oileáin Chomóra @@ -2814,12 +2946,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Antananairíveo + + Oileáin Kwajalein + Scóipé Rangún + + Ulan Bator + + + Macau + Nuacsat @@ -2835,24 +2976,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oileáin Mhaildíve - - Bahia Banderas - Cathair Mheicsiceo - - Merida - Mapútó + + Oileán Norfolk + Amstardam Osló + + Katmandu + Nárú @@ -2907,6 +3048,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Iacútsc + + Sacailín + Cartúm @@ -2940,9 +3084,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ an Damaisc - - Lomé - Túinis @@ -2958,20 +3099,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oileáin Midway + + Oileán Wake + Nua-Eabhrac an Vatacáin - - San Uinseann - Cathair Ho Chi Minh - Vailís + Wallis agus Futuna Áidin @@ -3005,9 +3146,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Iarthar na hAfraice - Am Caighdeánach Iarthar na hAfraice - Am Samhraidh Iarthar na hAfraice + Am Iarthar na hAfraice @@ -3073,9 +3212,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Apia - Am Caighdeánach Apia - Am Samhraidh Apia + Am Shamó + Am Caighdeánach Shamó + Am Samhraidh Shamó @@ -3257,7 +3396,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Am Oileáin Cook Am Caighdeánach Oileáin Cook - Am Leathshamhraidh Oileáin Cook + Am Samhraidh Oileáin Cook @@ -3378,7 +3517,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Chireabaití + Am Chiribeas @@ -3418,6 +3557,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Am na Guáine + + + Am Caighdeánach Haváí-Ailiúit + + Am Haváí-Ailiúit @@ -3434,9 +3578,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Hovd - Am Caighdeánach Hovd - Am Samhraidh Hovd + Am Khovd + Am Caighdeánach Khovd + Am Samhraidh Khovd @@ -3616,8 +3760,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Am Ulánbátar - Am Caighdeánach Ulánbátar - Am Samhraidh Ulánbátar + Am Caighdeánach Ulan Bator + Am Samhraidh Ulan Bator @@ -3758,7 +3902,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Phohnpei + Am Pohnpei @@ -3799,9 +3943,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Shamó - Am Caighdeánach Shamó - Am Samhraidh Shamó + Am Shamó Mheiriceá + Am Caighdeánach Shamó Mheiriceá + Am Samhraidh Shamó Mheiriceá @@ -3853,7 +3997,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Am Oileáin Tócalá + Am Oileáin Thócaláú @@ -4046,7 +4190,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4057,123 +4200,123 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤0k - ¤ 0K + ¤ 0k ¤0k - ¤0K + ¤ 0k ¤0k - ¤0K + ¤ 0k ¤0k - ¤0K + ¤ 0k ¤0k - ¤ 0K + ¤ 0k ¤00k - ¤ 00K + ¤ 00k ¤00k - ¤00K + ¤ 00k ¤00k - ¤00K + ¤ 00k ¤00k - ¤00K + ¤ 00k ¤00k - ¤ 00K + ¤ 00k ¤000k - ¤ 000K + ¤ 000k ¤000k - ¤000K + ¤ 000k ¤000k - ¤000K + ¤ 000k ¤000k - ¤000K + ¤ 000k ¤000k - ¤ 000K + ¤ 000k ¤0M ¤ 0M ¤0M - ¤0M + ¤ 0M ¤0M - ¤0M + ¤ 0M ¤0M - ¤0M + ¤ 0M ¤0M ¤ 0M ¤00M ¤ 00M ¤00M - ¤00M + ¤ 00M ¤00M - ¤00M + ¤ 00M ¤00M - ¤00M + ¤ 00M ¤00M ¤ 00M ¤000M ¤ 000M ¤000M - ¤000M + ¤ 000M ¤000M - ¤000M + ¤ 000M ¤000M - ¤000M + ¤ 000M ¤000M ¤ 000M ¤0B ¤ 0B ¤0B - ¤0B + ¤ 0B ¤0B - ¤0B + ¤ 0B ¤0B - ¤0B + ¤ 0B ¤0B ¤ 0B ¤00B ¤ 00B ¤00B - ¤00B + ¤ 00B ¤00B - ¤00B + ¤ 00B ¤00B - ¤00B + ¤ 00B ¤00B ¤ 00B ¤000B ¤ 000B ¤000B - ¤000B + ¤ 000B ¤000B - ¤000B + ¤ 000B ¤000B - ¤000B + ¤ 000B ¤000B ¤ 000B ¤0T ¤ 0T ¤0T - ¤0T + ¤ 0T ¤0T - ¤0T + ¤ 0T ¤0T - ¤0T + ¤ 0T ¤0T ¤ 0T ¤00T ¤ 00T ¤00T - ¤00T + ¤ 00T ¤00T - ¤00T + ¤ 00T ¤00T - ¤00T + ¤ 00T ¤00T ¤ 00T ¤000T ¤ 000T ¤000T - ¤000T + ¤ 000T ¤000T - ¤000T + ¤ 000T ¤000T - ¤000T + ¤ 000T ¤000T ¤ 000T @@ -5506,7 +5649,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ pheso na nOileán Filipíneach pheso na nOileán Filipíneach bpeso na nOileán Filipíneach - peso na nOileán Filipíneach + pesos na nOileán Filipíneach Rúipí na Pacastáine @@ -5545,11 +5688,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riyal Chatar - riyal Chatar - riyal Chatar - riyal Chatar - riyal Chatar - riyal Chatar + riyals Chatar + riyals Chatar + riyals Chatar + riyals Chatar + riyals Chatar Leu na Rómáine (1952–2006) @@ -6046,6 +6189,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ndollar na Cairibe Thoir dollar na Cairibe Thoir + + gildear Chairib + ghildear Chairib + ghildear Chairib + ghildear Chairib + ngildear Chairib + gildir Chairib + Cearta Speisialta Tarraingthe @@ -6163,6 +6314,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dollar Siombábach (1980–2008) + + ór na Siombáibe + ór na Siombáibe + ór na Siombáibe + ór na Siombáibe + n-ór na Siombáibe + ór na Siombáibe + Dollar na Siombáibe (2009) @@ -6285,7 +6444,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ méadair sa soicind cearnaithe - imrothlú + imrothluithe {0} imrothlú {0} imrothlú {0} imrothlú @@ -6401,11 +6560,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ carait - {0} charat óir - {0} charat óir + {0} charat + {0} charat {0} charat - {0} gcarat óir - {0} carat óir + {0} gcarat + {0} carat milleagraim sa deicilítear @@ -6423,7 +6582,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milleamól sa lítear {0} milleamól sa lítear - + + míreanna + {0} mhír + {0} mhír + {0} mhír + {0} mír + {0} mír + + + codanna + {0} chuid + {0} chuid + {0} chuid + {0} gcuid + {0} cuid + + codanna sa mhilliún {0} chuid sa mhilliún {0} chuid sa mhilliún @@ -6456,6 +6631,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ móil + + glúcóis + {0} glúcóis + {0} glúcóis + {0} glúcóis + {0} glúcóis + {0} glúcóis + lítir sa chiliméadar {0} lítear sa chiliméadar @@ -6726,9 +6909,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ niútain {0} niútan - {0} N - {0} N - {0} N + {0} niútan + {0} niútan + {0} niútan {0} niútan @@ -6922,12 +7105,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} muirmh. - míle Lochlannach + mílte Lochlannacha {0} mhíle Lochlannach {0} mhíle Lochlannacha {0} mhíle Lochlannacha {0} míle Lochlannacha - {0} míle Lochlannach + {0} míle Lochlannacha {0} ghriangha @@ -6937,6 +7120,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} griangha + lucsaí {0} lucsa {0} lucsa {0} lucsa @@ -6944,7 +7128,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} lucsa - caindéile + caindéilí {0} chaindéile {0} chaindéile {0} chaindéile @@ -6952,7 +7136,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} caindéile - lúman + lúmain {0} lúman {0} lúman {0} lúman @@ -7128,6 +7312,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milliméadar mearcair {0} milliméadar mearcair + + mearcair + {0} mearcair + {0} mearcair + {0} mearcair + {0} mearcair + {0} mearcair + puint san orlach cearnach {0} phunt san orlach cearnach @@ -7228,18 +7420,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ punt-troigh - {0} punt-troigh - {0} lbf⋅ft - {0} lbf⋅ft - {0} lbf⋅ft + {0} phunt-troigh + {0} phunt-troigh + {0} phunt-troigh + {0} bpunt-troigh {0} punt-troigh - méadar niútain + méadair niútain {0} mhéadar niútain {0} mhéadar niútain - {0} N⋅m - {0} N⋅m + {0} mhéadar niútain + {0} méadar niútain {0} méadar niútain @@ -7364,6 +7556,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} gcupán mhéadracha {0} cupán méadrach + + unsaí leachtacha méadracha + acra-troithe {0} acra-troigh @@ -7459,7 +7654,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} spúnóg mhilseoige impiriúla {0} spúnóg mhilseoige impiriúla {0} spúnóg mhilseoige impiriúla - {0} spúnóg mhilseoige impiriúol + {0} spúnóg mhilseoige impiriúla dram leachtach @@ -7469,8 +7664,119 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ndram leachtacha {0} dram leachtach + + stearaidiain + {0} stearaidian + {0} stearaidian + {0} stearaidian + {0} stearaidian + {0} stearaidian + + + catail + {0} chatal + {0} chatal + {0} chatal + {0} gcatal + {0} catal + + + cúlóim + {0} chúlóm + {0} chúlóm + {0} chúlóm + {0} gcúlóm + {0} cúlóm + + + faraid + {0} fharad + {0} fharad + {0} fharad + {0} bhfarad + {0} farad + + + hanraithe + {0} hanraí + {0} hanraí + {0} hanraí + {0} hanraí + {0} hanraí + + + síminí + {0} shímin + {0} shímin + {0} shímin + {0} símin + {0} símin + + + calraí [IT] + {0} chalra [IT] + {0} chalra [IT] + {0} chalra [IT] + {0} gcalra [IT] + {0} calra [IT] + + + beicireilí + {0} bheicireil + {0} bheicireil + {0} bheicireil + {0} mbeicireil + {0} beicireil + + + sívirt + {0} síveart + {0} shíveart + {0} shíveart + {0} síveart + {0} síveart + + + graeanna + {0} ghrae + {0} ghrae + {0} ghrae + {0} ngrae + {0} grae + + + cileagraim fórsa + {0} chileagram fórsa + {0} chileagram fórsa + {0} chileagram fórsa + {0} gcileagram fórsa + {0} cileagram fórsa + + + teislí + {0} teisle + {0} theisle + {0} theisle + {0} dteisle + {0} teisle + + + véibir + {0} véibear + {0} véibear + {0} véibear + {0} véibear + {0} véibear + + + solas + {0} solas + {0} sholas + {0} sholas + {0} solas + {0} solas + - oícheanta {0} oíche amháin {0} oíche {0} oíche @@ -7508,12 +7814,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ céimeanna + {0} chéim + {0} chéim + {0} chéim + {0} gcéim + {0} céim - nóiméid stua + nóim. stua + {0} nóim. stua + {0} nóim. stua + {0} nóim. stua + {0} nóim. stua + {0} nóim. stua soic. stua + {0} soic. stua + {0} shoic. stua + {0} shoic. stua + {0} soic. stua + {0} soic. stua heicteáir @@ -7562,10 +7883,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ndunam {0} dunam + + carait + {0} ct + {0} ct + {0} ct + {0} ct + {0} ct + milleamól/lítear - + + mír. + {0} mhír + {0} mhír + {0} mhír + {0} mír + {0} mír + + + cod. + {0} chuid + {0} chuid + {0} chuid + {0} gcuid + {0} cuid + + codanna/milliún {0}/milliún {0}/milliún @@ -7590,6 +7935,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mól {0} mól + + Glc + {0} Glc + {0} Glc + {0} Glc + {0} Glc + {0} Glc + lítir/km {0} l/km @@ -7651,6 +8004,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} bl {0} bl {0} bl + {0}/bl ctú @@ -7862,11 +8216,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ míle Lochl. - {0} míle Lch - {0} mhíle Lch - {0} mhíle Lch - {0} míle Lch - {0} míle Lch + {0} mhíle Lochl. + {0} mhíle Lochl. + {0} mhíle Lochl. + {0} míle Lochl. + {0} míle Lochl. pointí @@ -7875,7 +8229,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ raonta gréine - lucsa + lucs. + + + caindéilí + + + lúmain lonrachtaí gréine @@ -8195,6 +8555,71 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} gcárt impiriúla {0} cárt impiriúil + + {0} sr + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + + + solas + {0} solas + {0} sholas + {0} sholas + {0} solas + {0} solas + oícheanta {0} oíche @@ -8220,6 +8645,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}G {0}G + + {0}imr + {0}imr + {0}imr + {0}imr + {0}imr + raid {0}raid @@ -8235,15 +8667,42 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ nóim. stua - {0}kt - {0}kt - {0}kt - {0}kt - {0}kt + carat + {0}ct + {0}ct + {0}ct + {0}ct + {0}ct + + + mir. + {0}mhír + {0}mhír + {0}mhír + {0}mír + {0}mír + + + cod. + {0} chuid + {0} chuid + {0} chuid + {0} gcuid + {0} cuid % + + {0}mhól + {0}mhól + {0}mhól + {0}mól + {0}mól + + + Glc + l/km {0}l/km @@ -8343,6 +8802,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ngiot. {0} giot. + + deich. blianta + {0}/bl @@ -8455,6 +8917,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}kWh {0}kWh + + N + {0}N + {0}N + {0}N + {0}N + {0}N + {0}GHz {0}GHz @@ -8588,19 +9058,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} muirmh. - {0} m lch - {0} mh lch - {0} m lch - {0} m lch - {0} m lch + {0}mhíle Lochl. + {0}mhíle Lochl. + {0}mhíle Lochl. + {0}míle Lochl. + {0}míle Lochl. + lucs. {0}lx {0}lx {0}lx {0}lx {0}lx + + {0}cd + {0}cd + {0}cd + {0}cd + {0}cd + + + lúmain + {0}lm + {0}lm + {0}lm + {0}lm + {0}lm + {0}t {0}t @@ -8746,6 +9232,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}K {0}K + + {0}lbf⋅ft + {0}lbf⋅ft + {0}lbf⋅ft + {0}lbf⋅ft + {0}lbf⋅ft + + + {0}N⋅m + {0}N⋅m + {0}N⋅m + {0}N⋅m + {0}N⋅m + {0}km³ {0}km³ @@ -8808,11 +9308,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ cl - {0}ghalIm - {0}ghalIm - {0} ghalIm - {0} ngalIm - {0}galIm + {0}ghal. Im + {0}ghal. Im + {0}ghal. Im + {0}ngal. Im + {0}gal. Im cupán @@ -8824,6 +9324,50 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} unsa l. {0} unsa l. + + {0}spmhil + {0}spmhil + {0}spmhil + {0}spmhil + {0}spmhil + + + {0}spmhil imp + {0}spmhil imp + {0}spmhil imp + {0}spmhil imp + {0}spmhil imp + + + {0}dr l. + {0}dr l. + {0}dr l. + {0}dr l. + {0}dr l. + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + {0} Wb + + + solas + {0}solas + {0}sholas + {0}sholas + {0}solas + {0}solas + {0}oí @@ -8831,7 +9375,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}oí {0}oí {0}oí - {0}/oíche diff --git a/make/data/cldr/common/main/gaa.xml b/make/data/cldr/common/main/gaa.xml index 6e69d56b6a2..88a5c87207d 100644 --- a/make/data/cldr/common/main/gaa.xml +++ b/make/data/cldr/common/main/gaa.xml @@ -851,6 +851,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic otsi lɛ mli gbi + + Hɔgbaa ni eho + Hɔgbaa nɛɛ + Hɔgbaa ni baaba + LEEBI/SHWANE @@ -1155,9 +1160,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Afrika Anaigbɛ Be - Afrika Anaigbɛ Be Yɛ Fɛi Beiaŋ - Afrika Anaigbɛ Be Yɛ Latsa Beiaŋ + Afrika Anaigbɛ Be @@ -1247,6 +1250,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Greenland Anaigbɛ Be Yɛ Latsa Beiaŋ + + + Hawaii-Aleutia Be Yɛ Fɛi Beiaŋ + + Hawaii-Aleutia Be @@ -1304,6 +1312,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) {0} {1} @@ -1931,13 +1941,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic und gaa - {given} {given2} {surname} {credentials} + {title} {given} {given2} {surname} {surname2} {given-informal} {surname} - {title} {surname} + {title} {surname} {given-informal} @@ -2033,7 +2043,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal-monogram-allCaps} - {surname-core}, {given} {given2} {surname-prefix} + {surname-prefix} {surname-core}, {given} {given2} {surname}, {given-informal} diff --git a/make/data/cldr/common/main/gd.xml b/make/data/cldr/common/main/gd.xml index e9b23423ac4..410a9874005 100644 --- a/make/data/cldr/common/main/gd.xml +++ b/make/data/cldr/common/main/gd.xml @@ -295,6 +295,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tyap Makonde Kabuverdianu + Qʼeqchiʼ Kenyang Koro Kongo @@ -328,6 +329,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Gearmailtis Chologne Cùrdais + Cùrdais + Kurmanji Kumyk Kutenai Komi @@ -528,6 +531,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Koyraboro Senni Sango Seann-Ghaeilge + Samogitis Sèirb-Chròthaisis Tachelhit Shan @@ -559,6 +563,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sukuma Susu Cànan Sumer + Sunwar Suainis Kiswahili Kiswahili na Congo @@ -678,6 +683,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -814,6 +820,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -834,6 +841,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -844,6 +852,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -1299,63 +1308,111 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fòrmat an airgeadra Òrdugh an t-seòrsachaidh Airgeadra + Riochdachadh nan Emoji Cearcall an ama (12 no 24 uair) Stoidhle nam brisidhean-loidhe + Brisidhean loidhne am broinn fhaclan Siostam tomhais Àireamhan + Briseadh rosgrainn às dèidh giorr. - Am Mìosachan Budach + Am Mìosachan Bùdach + Bùdach Am Mìosachan Sìneach + Sìneach Am Mìosachan Coptach + Coptach Mìosachan Dangi + Dangi Mìosachan na h-Itioipe + Itiopach Mìosachan Itiopach Amete Alem + Amete Alem Itiopach Am Mìosachan Griogarach + Griogarach Am Mìosachan Eabhrach + Eabhrach Mìosachan Nàiseanta nan Innseachan + Nàiseanta nan Innseachan Am Mìosachan Hijri + Hijri Am Mìosachan Hijri (clàrach, linn sìobhalta) + Hijri (clàrach, linn sìobhalta) Am Mìosachan Hijri (Aràibia nan Sabhd, sealladh) Am Mìosachan Hijri (clàrach, linn reul-eòlach) + Hijri (clàrach, linn reul-eòlach) Am Mìosachan Hijri (Umm al-Qura) + Hijri (Umm al-Qura) Mìosachan ISO-8601 Am Mìosachan Seapanach + Seapanach Am Mìosachan Pearsach + Pearsach Mìosachan Poblachd na Sìne + Poblachd na Sìne Fòrmat airgeadra na cunntasachd + Cunntasachd Fòrmat stannardach an airgeadra - Òrdugh seòrsachaidh na Sìnise Tradaiseanta - Big5 + Stannardach Òrdugh seòrsachaidh roimhe a chum co-chòrdalachd + Co-chòrdalachd Òrdugh seòrsachaidh an fhaclair + Faclair Òrdugh seòrsachaidh Unicode bunaiteach + Unicode bunaiteach Òrdugh seòrsachaidh Emoji Òrdugh seòrsachaidh Eòrpach - Òrdugh seòrsachaidh na Sìnise Simplichte - GB2312 Òrdugh seòrsachaidh nan leabhraichean-fòn + Leabhar-fòn + Tar-litreachadh Òrdugh seòrsachaidh Pinyin + Pinyin Lorg coitcheann + Coitcheann Lorg leis a’ chiad chonnrag Hangul Òrdugh seòrsachaidh stannardach + Stannardach Òrdugh nan stràcan + Stràcan Òrdugh seòrsachaidh tradaiseanta + Tradaiseanta Òrdugh an fhreumha ’s nan stràcan + Freumh is stràcan Òrdugh seòrsachaidh Zhuyin + Zhuyin Làn-Leud Leth-Leud Àireamhach + Bunaiteach + Emoji + Teacsa Cleoc 12 uair a thìde (0–11) + 12 (0–11) Cleoc 12 uair a thìde (1–12) + 12 (1–12) Cleoc 24 uair a thìde (0–23) + 24 (0–23) Cleoc 24 uair a thìde (1–24) + 24 (1–24) Brisidhean-loidhe fuasgailte + Fuasgailte Brisidhean-loidhe àbhaisteach + Àbhaisteach Brisidhean-loidhe teanna + Teann + Bris na h-uile + Cùm na h-uile + Àbhaisteach + Cùm ann an abairt Tar-litreachadh BGN nan Stàitean Aonaichte Tar-litreachadh GEGN nan Dùthchannan Aonaichte Tomhas meatrach + Meatrach Tomhas impireil + RA Tomhas nan Stàitean Aonaichte + SA Àireamhan Ahom Àireamhan Arabach-Innseanach Àireamhan Arabach-Innseanach leudaichte @@ -1443,9 +1500,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àireamhan na Tibeitise Àireamhan Tirhuta Àireamhan Tangsa + Àireamhan Tolong Siki Àireamhan Vai Àireamhan Warang Citi Àireamhan Wancho + Dheth + Air Meatrach @@ -1816,6 +1876,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'aig' {0} + + {0} {1} + @@ -1824,6 +1887,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'aig' {0} + + {0} {1} + @@ -1832,6 +1898,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {0} {1} + @@ -1840,24 +1909,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {0} {1} + hB h:mmB h:mm:ssB + E hB E h:mmB E h:mm:ssB E, d + E ha E h:mma E h:mm:ssa y G + M/y G d/M/y GGGGG + E, d/M/y G LLL y G d'mh' MMM y G E, d'mh' MMM y G ha h:mma h:mm:ssa + ha v + HH'u' v d/M E, d/M dd/MM @@ -1882,11 +1960,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -2220,6 +2296,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'aig' {0} + + {0} {1} + @@ -2228,6 +2307,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'aig' {0} + + {0} {1} + @@ -2236,6 +2318,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {0} {1} + @@ -2244,26 +2329,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {0} {1} + hB h:mmB h:mm:ssB - E h:mmB - E h:mm:ssB + E, hB + E, h:mmB + E, h:mm:ssB E, d - E h:mma - E h:mm:ss a + E, ha + E, h:mma + E, HH:mm + E, h:mm:ss a + E, HH:mm:ss y G + M/y G d/M/y G + E, d/M/y G LLL y G - d'mh' MMM y G - E, d'mh' MMM y G + d MMM y G + E, d MMM y G ha h:mma h:mm:ss a h:mm:ss a v h:mma v + ha v + HH'u' v d/M E, d/M dd/MM @@ -2291,11 +2387,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -3261,11 +3355,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tìde samhraidh: {0} Bun-àm: {0} - - HST - HST - HDT - Honolulu @@ -3285,15 +3374,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tiranë - - Río Gallegos - - - Tucumán - - - Córdoba - Sidni @@ -3321,27 +3401,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Brùnaigh - - Eirunepé - - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - A’ Bheilìs @@ -3363,12 +3422,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Rapa Nui - - Ürümqi - - - Bogotá - Costa Rìcea @@ -3390,12 +3443,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Doiminicea - - Galápagos - - - El Aaiún - Asmarà @@ -3496,7 +3543,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Biškek - Enderbury + Eilean Canton Naomh Crìstean @@ -3531,15 +3578,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Rīga - - Chișinău - Rangun - - Khovd - Macàthu @@ -3555,9 +3596,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Na h-Eileanan Mhaladaibh - - Mazatlán - Cathair Mheagsago @@ -3594,9 +3632,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mosgo - - Mahé - Singeapòr @@ -3615,9 +3650,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kergelenn - - Lomé - Dušanbe @@ -3683,9 +3715,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Àm Afraga an Iar - Bun-àm Afraga an Iar - Tìde Samhraidh Afraga an Iar + Àm Afraga an Iar @@ -4128,6 +4158,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àm Guidheàna + + + Bun-àm nan Eileanan Hawai’i ’s Aleutach + + + HAST + + Àm nan Eileanan Hawai’i ’s Aleutach @@ -4149,9 +4187,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Àm Hovd - Bun-àm Hovd - Tìde samhraidh Hovd + Àm Khovd + Bun-àm Khovd + Tìde samhraidh Khovd @@ -4746,7 +4784,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -6992,6 +7029,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic dolaran Sìombabuthach (1980–2008) dolar Sìombabuthach (1980–2008) + + Òr Sìombabuthach + Òr Sìombabuthach + Òr Sìombabuthach + Òr Sìombabuthach + Òr Sìombabuthach + Dolar Sìombabuthach (2009) dolar Sìombabuthach (2009) @@ -7266,7 +7310,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} nithean {0} nì - + + pàirt + {0} phàirt + {0} phàirt + {0} pàirtean + {0} pàirt + + pàirt sa mhillean {0} phàirt sa mhillean {0} phàirt sa mhillean @@ -7297,6 +7348,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mòlaichean {0} mòl + + de ghlùcos + {0} de ghlùcos + {0} de ghlùcos + {0} de ghlùcos + {0} de ghlùcos + liotair sa chilemeatair {0} liotair sa chilemeatair @@ -7993,6 +8051,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimeatairean de dh’airgead-beò {0} milimeatair de dh’airgead-beò + + de dh’airgead-beò + {0} de dh’airgead-beò + {0} de dh’airgead-beò + {0} de dh’airgead-beò + {0} de dh’airgead-beò + punnd san òirleach cheàrnagach {0} phunnd san òirleach cheàrnagach @@ -8232,6 +8297,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} cupannan meatrach {0} cupa meatrach + + unnsa-dighe meatrach + {0} unnsa-dighe meatrach + {0} unnsa-dighe meatrach + {0} unnsachan-dighe meatrach + {0} unnsa-dighe meatrach + {0} acair-throigh {0} acair-throigh @@ -8272,12 +8344,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} pinntean {0} pinnt + + pinnt ìmpireil + {0} phinnt ìmpireil + {0} phinnt ìmpireil + {0} phinntean ìmpireil + {0} pinnt ìmpireil + {0} chupa {0} chupa {0} cupannan {0} cupa + + cupa ìmpireil + {0} chupa ìmpireil + {0} chupa ìmpireil + {0} cupannan ìmpireil + {0} cupa ìmpireil + unnsa-dighe {0} unnsa-dighe @@ -8357,14 +8443,147 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} càrtan ìmpireil {0} càrt ìmpireil - - solas - {0} sholas - {0} sholas - {0} solasan - {0} solas + + sterèidean + {0} sterèidean + {0} sterèidean + {0} sterèideanan + {0} sterèidean - + + katal + {0} katal + {0} katal + {0} katalaichean + {0} katal + + + coulomb + {0} choulomb + {0} choulomb + {0} coulombaichean + {0} coulomb + + + farad + {0} fharad + {0} fharad + {0} faradaichean + {0} farad + + + henry + {0} henry + {0} henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} shiemens + {0} siemens + {0} siemens + + + caloraidh [IT] + {0} chaloraidh [IT] + {0} chaloraidh [IT] + {0} caloraidhean [IT] + {0} caloraidh [IT] + + + aonad-teasa Breatannach [IT] + {0} aonad-teasa Breatannach [IT] + {0} aonad-teasa Breatannach [IT] + {0} aonadan-teasa Breatannach [IT] + {0} aonad-teasa Breatannach [IT] + + + becquerel + {0} bhecquerel + {0} bhecquerel + {0} becquerelichean + {0} becquerel + + + sievert + {0} sievert + {0} shievert + {0} sievert + {0} sievert + + + gray + {0} ghray + {0} ghray + {0} gray + {0} gray + + + forsa-cileagram + {0} fhorsa-cileagram + {0} fhorsa-cileagram + {0} forsan-cileagram + {0} forsa-cileagram + + + ròd + {0} ròd + {0} ròd + {0} ròidean + {0} ròd + + + sèine + {0} sèine + {0} shèine + {0} sèineachan + {0} sèine + + + tesla + {0} tesla + {0} tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + {0} weber + {0} weber + + + rankine + {0} rankine + {0} rankine + {0} rankine + {0} rankine + + + cola-deug + {0} chola-deug + {0} chola-deug + {0} cola-deug + {0} cola-deug + + + sluga + {0} shluga + {0} shluga + {0} slugaichean + {0} sluga + + + de pheatrail-ionnannachd + {0} de pheatrail-ionnannachd + {0} de pheatrail-ionnannachd + {0} de pheatrail-ionnannachdan + {0} de pheatrail-ionnannachd + + pàirt sa bhillean {0} phàirt sa bhillean {0} phàirt sa bhillean @@ -8372,12 +8591,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} pàirt sa bhillean - oidhche {0} oidhche {0} oidhche {0} oidhcheannan {0} oidhche - {0}/oidhche comhair combaist @@ -8472,6 +8689,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} nith {0} nì + + pàirt + {0} phàirt + {0} phàirt + {0} pàirt. + {0} pàirt + + + pàirt/millean + sa cheud @@ -8488,6 +8715,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mòl {0} mòl + + Glc + {0} Glc + {0} Glc + {0} Glc + {0} Glc + liotair/km @@ -8776,6 +9010,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} gràinne {0} gràinne + + de Hg + {0} de Hg + {0} de Hg + {0} de Hg + {0} de Hg + in Hg @@ -8858,6 +9099,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic c-liotair + + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + acair-throigh @@ -8890,9 +9137,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic pinnt + + pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + cupa + + cupa ìmp. + {0} c ìmp. + {0} c ìmp. + {0} c ìmp. + {0} c ìmp. + fl oz {0} fl oz @@ -8973,6 +9234,131 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} càrt ìmp. {0} càrt ìmp. + + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + {0} kat + + + {0} C + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} BTU-IT + {0} BTU-IT + {0} BTU-IT + {0} BTU-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + {0} kgf + + + rd + {0} rd + {0} rd + {0} rd + {0} rd + + + ch + {0} ch + {0} ch + {0} ch + {0} ch + + + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + + + {0} °R + {0} °R + {0} °R + {0} °R + + + cld + {0} cld + {0} cld + {0} cld + {0} cld + + + {0} slug + {0} shlug + {0} slug + {0} slug + + + peatr-ionn + {0} pheatr-ionn + {0} pheatr-ionn + {0} peatr-ionn + {0} peatr-ionn + solas {0} sholas @@ -8980,7 +9366,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} solasan {0} solas - + pàirt/billean @@ -9119,7 +9505,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}nith {0}nì - + + pàirt + {0}phàirt + {0}phàirt + {0}pàirt. + {0}pàirt + + {0}ppm {0}ppm {0}ppm @@ -9140,6 +9533,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mòl {0}mòl + + Glc + {0}Glc + {0}Glc + {0}Glc + {0}Glc + L/km {0}L/km @@ -9802,6 +10202,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mm Hg {0}mm Hg + + de Hg + {0} de Hg + {0} de Hg + {0} de Hg + {0} de Hg + {0}psi {0}psi @@ -10010,6 +10417,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mc {0}mc + + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + {0} fl oz m. + ac ft {0}ac ft @@ -10049,12 +10462,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}pt {0}pt + + pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + {0} pt ìmp. + {0}c {0}c {0}c {0}c + + cupa ìmp. + {0} c ìmp. + {0} c ìmp. + {0} c ìmp. + {0} c ìmp. + {0}fl oz {0}fl oz @@ -10133,21 +10560,145 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}càrt ì. {0}càrt ì. + + {0}sr + {0}sr + {0}sr + {0}sr + + + {0}kat + {0}kat + {0}kat + {0}kat + + + {0}C + {0}C + {0}C + {0}C + + + {0}F + {0}F + {0}F + {0}F + + + {0}H + {0}H + {0}H + {0}H + + + {0}S + {0}S + {0}S + {0}S + + + cal-IT + {0}cal-IT + {0}cal-IT + {0}cal-IT + {0}cal-IT + + + {0}BTU-IT + {0}BTU-IT + {0}BTU-IT + {0}BTU-IT + + + {0}Bq + {0}Bq + {0}Bq + {0}Bq + + + {0}Sv + {0}Sv + {0}Sv + {0}Sv + + + {0}Gy + {0}Gy + {0}Gy + {0}Gy + + + {0}kgf + {0}kgf + {0}kgf + {0}kgf + + + rd + {0}rd + {0}rd + {0}rd + {0}rd + + + ch + {0}ch + {0}ch + {0}ch + {0}ch + + + {0}T + {0}T + {0}T + {0}T + + + {0}Wb + {0}Wb + {0}Wb + {0}Wb + + + {0}°R + {0}°R + {0}°R + {0}°R + + + cld + {0}cld + {0}cld + {0}cld + {0}cld + + + {0}slug + {0}shlug + {0}slug + {0}slug + + + peatr-ionn + {0}pheatr-ionn + {0}pheatr-ionn + {0}peatr-ionn + {0}peatr-ionn + - solas {0}sholas {0}sholas {0}solas. {0}solas - + + ppb {0}ppb {0}ppb {0}ppb {0}ppb - oidhche {0}oidh. {0}oidh. {0}oidh. @@ -10407,7 +10958,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-initial} {given2-initial} {surname} - {given-informal} {given2-initial} + {given-informal} {given-vocative} {surname-vocative} diff --git a/make/data/cldr/common/main/gl.xml b/make/data/cldr/common/main/gl.xml index 2a172194808..d67fa69ac95 100644 --- a/make/data/cldr/common/main/gl.xml +++ b/make/data/cldr/common/main/gl.xml @@ -46,6 +46,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ acerbaixano azerí baxkir + baluchi balinés basaa belaruso @@ -236,6 +237,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurdo + kurdo + kurdo setentrional kumyk komi córnico @@ -634,6 +637,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombia Illa Clipperton + Sark Costa Rica Cuba Cabo Verde @@ -875,34 +879,53 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ordenación numérica forza de ordenación moeda + representación como emoji ciclo horario (12 ou 24) estilo de quebra de liña + quebra de liña dentro das palabras sistema internacional de unidades números + quebra de liña tras as abreviaturas fuso horario variante rexional uso privado calendario budista + budista calendario chinés + chinés calendario copto + copto calendario dangi + dangi calendario etíope + etíope calendario etíope amete alem + etíope amete alem calendario gregoriano + gregoriano calendario hebreo + hebreo Calendario nacional indio calendario da héxira + héxira calendario da héxira (tabular, época civil) + héxira (tabular, época civil) Calendario islámico (Arabia Saudita, calendario da héxira (Umm al-Qura) + héxira (Umm al-Qura) calendario ISO-8601 calendario xaponés + xaponés calendario persa + persa calendario Minguo + MInguo formato de moeda contable + contable formato de moeda estándar + estándar Clasificar símbolos Clasificar ignorando símbolos Clasificar acentos con normalidade @@ -912,16 +935,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Clasificar primeiro as maiúsculas Clasificar sen distinguir entre maiúsculas e minúsculas Clasificar distinguindo entre maiúsculas e minúsculas - Orde de clasificación chinesa tradicional - Big5 Criterio de ordenación do dicionario criterio de ordenación Unicode predeterminado - orde de clasifcación chinesa simplificada - GB2312 + Unicode predeterminado orde de clasificación da guía telefónica Orde de clasificación fonética Orde de clasificación pinyin busca de carácter xeral + busca Clasificar por consonante inicial hangul criterio de ordenación estándar + estándar Orde de clasificación polo número de trazos Orde de clasificación tradicional Criterio de ordenación radical-trazo @@ -937,18 +961,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ancho completo ancho medio Numérico + predeterminada + emoji + texto sistema de 12 horas (0–11) + 12 (0–11) sistema de 12 horas (1–12) + 12 (1–12) sistema de 24 horas (0–23) + 24 (0–23) sistema de 24 horas (1–24) + 24 (1–24) estilo de quebra de liña flexible + flexible estilo de quebra de liña normal - estilo de quebra de liña estrita + normal + estilo de quebra de liña estrito + estrito + quebrar todo + manter todo + normal + manter en frases transliteración do BGN transliteración do UNGEGN sistema métrico decimal + métrico sistema imperial de unidades + Reino Unido sistema estadounidense de unidades + EUA díxitos indoarábigos díxitos indoarábigos ampliados numeración armenia @@ -993,6 +1034,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ díxitos tibetanos Numeros tradicionais díxitos vai + activado + desactivado métrico decimal @@ -1016,9 +1059,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1078,18 +1118,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, h:mm B E, h:mm:ss B E d + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M/y G dd/MM/y GGGGG + E, d/M/y G MMM 'de' y G d 'de' MMM 'de' y G E, d 'de' MMM 'de' y G - h a h:mm a h:mm:ss a + HH 'h' v dd/MM E, dd/MM dd/MM @@ -1120,12 +1163,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ 'de' y G - - h B – h B - - - h:mm B – h:mm B - y G – y G y–y G @@ -1477,23 +1514,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, h B E, h:mm B E, h:mm:ss B E d + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M/y G d/M/y GGGGG + E, d/M/y G MMM 'de' y G d 'de' MMM 'de' y G E, d 'de' MMM 'de' y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'h' v d/M E, d/M dd/MM @@ -1517,12 +1558,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ w.'ª' 'semana' 'de' Y - - h B – h B - - - h:mm B – h:mm B - y G – y G y–y G @@ -1561,10 +1596,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d 'de' MMM – E, d 'de' MMM 'de' y G E, d 'de' MMM 'de' y – E, d 'de' MMM 'de' y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1575,10 +1606,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -2082,27 +2109,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Anguila - - Tirana - Iereván - - Showa - - - Dumont-d’Urville - - - Río Gallegos - - - Tucumán - - - Córdoba - Viena @@ -2136,33 +2145,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ A Paz - - Eirunepé - Río Branco - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - Baía - - Maceió - Saint John’s @@ -2172,11 +2160,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Illa de Pascua - - Ürümqi - - - Bogotá + + Coihaique A Habana @@ -2299,10 +2284,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Amán - Enderbury - - - Comores + illa Kantón Saint Kitts @@ -2355,9 +2337,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldivas - - Mazatlán - Cidade de México @@ -2433,9 +2412,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riad - - Mahé - Khartún @@ -2463,12 +2439,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damasco - - N’Djamena - - - Lomé - Achkhabad @@ -2529,6 +2499,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hora de Acre + hora estándar de Acre + hora de verán de Acre @@ -2553,9 +2525,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - hora de África Occidental - hora estándar de África Occidental - hora de verán de África Occidental + hora de África Occidental @@ -2930,6 +2900,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hora da Güiana + + + hora estándar de Hawai-illas Aleutianas + + hora de Hawai-illas Aleutianas @@ -3501,6 +3476,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + {0} {1} + @@ -3512,6 +3490,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) @@ -3522,42 +3506,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 0 0 0 - 0 M¤ - 0 M ¤ - 0 M¤ - 0 M ¤ - 00 M¤ - 00 M ¤ - 00 M¤ - 00 M ¤ - 000 M¤ - 000 M ¤ - 000 M¤ - 000 M ¤ - 0000 M¤ - 0000 M ¤ - 0000 M¤ - 0000 M ¤ - 00000 M¤ - 00000 M ¤ - 00000 M¤ - 00000 M ¤ - 000000 M¤ - 000000 M ¤ - 000000 M¤ - 000000 M ¤ - 0 B¤ - 0 B ¤ - 0 B¤ - 0 B ¤ - 00 B¤ - 00 B ¤ - 00 B¤ - 00 B ¤ - 000 B¤ - 000 B ¤ - 000 B¤ - 000 B ¤ + 0 M ¤ + 0 M ¤ + 00 M ¤ + 00 M ¤ + 000 M ¤ + 000 M ¤ + 0000 M ¤ + 0000 M ¤ + 00000 M ¤ + 00000 M ¤ + 000000 M ¤ + 000000 M ¤ + 0 B ¤ + 0 B ¤ + 00 B ¤ + 00 B ¤ + 000 B ¤ + 000 B ¤ {0} ¤¤ @@ -3873,7 +3839,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ pesetas , - . + birr etíope @@ -4542,6 +4508,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dólares do Caribe Oriental XCD + + florín caribeño + florín caribeño + florín caribeño + ƒ + franco CFA (BCEAO) franco CFA (BCEAO) @@ -4581,6 +4553,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kwacha zambiano kwachas zambianos + + ouro de Zimbabwe + ouro de Zimbabwe + ouro de Zimbabwe + {0} día @@ -4794,7 +4771,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} unidade {0} unidades - + + partes + {0} parte + {0} partes + + partes por millón {0} parte por millón {0} partes por millón @@ -4813,6 +4795,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} moles + + de glicosa + {0} de glicosa + {0} de glicosa + litros por quilómetro {0} litro por quilómetro @@ -5316,6 +5303,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milímetro de mercurio {0} milímetros de mercurio + + de mercurio + {0} de mercurio + {0} de mercurio + libras por polgada cadrada {0} libra por polgada cadrada @@ -5491,6 +5483,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cunca métrica {0} cuncas métricas + + onzas líquidas métricas + {0} onza líquida métrica + {0} onzas líquidas métricas + {0} acre-pé {0} acre-pés @@ -5580,20 +5577,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cuarto imperial {0} cuartos imperiais - - luz - {0} luz - {0} luz + + estereorradiáns + {0} estereorradián + {0} estereorradiáns - + + katais + {0} katal + {0} katais + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calorías internacionais + {0} caloría internacional + {0} calorías internacionais + + + becquereis + {0} becquerel + {0} becquereis + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + quilogramos forza + {0} quilogramo forza + {0} quilogramos forza + + + teslas + {0} tesla + {0} teslas + + + wébers + {0} wéber + {0} wébers + + partes por mil millóns {0} parte por mil millóns {0} partes por mil millóns - noites - {0} noite - {0} noites {0} por noite @@ -5653,6 +5707,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ude. {0} udes. + + parte + {0} parte + {0} partes + + + partes/millón + {0} % {0} % @@ -5665,6 +5727,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + {0} Glc + {0} Glc + litros/km {0} l/km @@ -5898,6 +5965,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + {0} Hg + {0} Hg + millas/hora @@ -5962,6 +6033,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mc + + {0} fl oz m. + {0} fl oz m. + acre-pés @@ -6044,12 +6119,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cto. imp. {0} ctos. imp. + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal IT + {0} cal IT + {0} cal IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + luz {0} luz {0} luz - + partes/mil millóns {0} ppmm {0} ppmm @@ -6093,6 +6221,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kt + + parte + {0} parte + {0} partes + + + Glc + {0} Glc + {0} Glc + l/km @@ -6124,9 +6262,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ día - {0} d - {0} d - {0}/d + {0} d. + {0} d. + {0}/d. Ω @@ -6200,6 +6338,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W + + {0} Hg + {0} Hg + mi/h @@ -6222,6 +6364,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ l + + {0} fl oz m. + {0} fl oz m. + ac ft @@ -6240,21 +6386,61 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ cto. imp. - - luz - {0} luz - {0} luz + + {0} sr + {0} sr - + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal IT + {0} cal IT + {0} cal IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + ppmm - {0} ppmm - {0} ppmm - - - noites - {0} noite - {0} noites - {0}/noite diff --git a/make/data/cldr/common/main/gsw.xml b/make/data/cldr/common/main/gsw.xml index fda45bd6c1b..b496e7c6c7d 100644 --- a/make/data/cldr/common/main/gsw.xml +++ b/make/data/cldr/common/main/gsw.xml @@ -913,8 +913,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bürgerlich islaamisch Kaländer Japaanisch Kaländer Kaländer vor Republik Chiina - Tradizionells Chineesisch - Big5 - Veräifachts Chineesisch - GB2312 Telifonbuech-Sortiirregle Pinyin-Sortiirregle Strichfolg @@ -1739,9 +1737,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Weschtafrikanischi Ziit - Weschtafrikanischi Schtandardziit - Weschtafrikanischi Summerziit + Weschtafrikanischi Ziit @@ -1819,7 +1815,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + ' @@ -1891,6 +1887,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/gu.xml b/make/data/cldr/common/main/gu.xml index f3e353e8710..00111a0489d 100644 --- a/make/data/cldr/common/main/gu.xml +++ b/make/data/cldr/common/main/gu.xml @@ -291,6 +291,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બફિયા કોલોગ્નિયન કુર્દિશ + કુર્દિશ + કુરમાનજી કુમીક કુતેનાઇ કોમી @@ -769,7 +771,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ સબ-સહારન આફ્રિકા લેટિન અમેરિકા એસેન્શન આઇલેન્ડ - ઍંડોરા + એન્ડોરા યુનાઇટેડ આરબ અમીરાત અફઘાનિસ્તાન ઍન્ટિગુઆ અને બર્મુડા @@ -783,7 +785,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ઑસ્ટ્રિયા ઑસ્ટ્રેલિયા અરુબા - ઑલેન્ડ આઇલેન્ડ્સ + ઑલૅન્ડ આઇલૅન્ડ્સ અઝરબૈજાન બોસ્નિયા અને હર્ઝેગોવિના બારબાડોસ @@ -802,12 +804,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બ્રાઝિલ બહામાસ ભૂટાન - બૌવેત આઇલેન્ડ + બૌવેત આઇલૅન્ડ બોત્સ્વાના બેલારુસ બેલીઝ કેનેડા - કોકોઝ (કીલીંગ) આઇલેન્ડ્સ + કોકોઝ (કીલીંગ) આઇલૅન્ડ્સ કોંગો - કિંશાસા કોંગો (ડીઆરસી) સેન્ટ્રલ આફ્રિકન રિપબ્લિક @@ -820,13 +822,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ચિલી કૅમરૂન ચીન - કોલમ્બિયા + કોલંબિયા ક્લિપરટન આઇલેન્ડ + સાર્ક કોસ્ટા રિકા ક્યુબા કૅપ વર્ડે ક્યુરાસાઓ - ક્રિસમસ આઇલેન્ડ + ક્રિસમસ આઇલૅન્ડ સાયપ્રસ ચેકીયા ચેક રિપબ્લિક @@ -849,10 +852,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ યુરોઝોન ફિનલેન્ડ ફીજી - ફૉકલેન્ડ આઇલેન્ડ્સ - ફૉકલેન્ડ આઇલેન્ડ્સ (આઇલાસ માલવિનાસ) + ફૉકલૅન્ડ આઇલૅન્ડ્સ + ફૉકલૅન્ડ આઇલૅન્ડ્સ (આઇલાસ માલવિનાસ) માઇક્રોનેશિયા - ફેરો આઇલેન્ડ્સ + ફેરો આઇલૅન્ડ્સ ફ્રાંસ ગેબન યુનાઇટેડ કિંગડમ @@ -876,14 +879,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ગયાના હોંગકોંગ SAR ચીન હોંગકોંગ - હર્ડ અને મેકડોનાલ્ડ આઇલેન્ડ્સ + હર્ડ અને મેકડોનાલ્ડ આઇલૅન્ડ્સ હોન્ડુરસ ક્રોએશિયા હૈતિ હંગેરી કૅનેરી આઇલેન્ડ્સ ઇન્ડોનેશિયા - આયર્લેન્ડ + આયરલૅન્ડ ઇઝરાઇલ આઇલ ઑફ મેન ભારત @@ -892,7 +895,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ચાગસ દ્વિપસમૂહ ઇરાક ઈરાન - આઇસલેન્ડ + આઇસલૅન્ડ ઇટાલી જર્સી જમૈકા @@ -955,7 +958,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ નેપાળ નૌરુ નીયુ - ન્યુઝીલેન્ડ + ન્યુઝીલૅન્ડ ઓટેરોઆ ન્યૂઝીલેન્ડ ઓમાન પનામા @@ -1049,8 +1052,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ અજ્ઞાત પ્રદેશ - ઈંગ્લેન્ડ - સ્કોટલેન્ડ + ઈંગ્લૅન્ડ + સ્કૉટલૅન્ડ વેલ્સ @@ -1069,35 +1072,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ આંકડાકીય સૉર્ટિંગ સૉર્ટિંગ શક્તિ ચલણ + ઇમોજી પ્રસ્તુતિ કલાકનું આવર્તન (12 વિ.24) રેખા વિરામ પ્રકાર + શબ્દોમાં રેખા વિરામ માપદંડ પદ્ધતિ આંકડાઓ + સંક્ષેપ પછી વાક્ય વિરામ સમય ઝોન લોકેલ વેરિએન્ટ ખાનગી-ઉપયોગ બુદ્ધિસ્ટ કેલેન્ડર + બુદ્ધિસ્ટ ચાઇનીઝ કેલેન્ડર + ચાઇનીઝ કોપ્ટિક કેલેન્ડર + કોપ્ટિક ડાંગી કેલેન્ડર + ડાંગી ઇથિઓપિક કેલેન્ડર + ઇથિઓપિક ઇથિઓપિક એમેટ એલેમ કેલેન્ડર + ઇથિઓપિક એમેટ એલેમ ગ્રેગોરિઅન કેલેન્ડર + ગ્રેગોરિઅન હિબ્રુ કેલેન્ડર + હિબ્રુ ભારતીય રાષ્ટ્રીય કેલેન્ડર + ભારતીય રાષ્ટ્રીય હિજરી કેલેન્ડર + હિજરી હિજરી-નાગરિક કેલેન્ડર + હિજરી-નાગરિક કેલેન્ડર ઇસ્લામિક કેલેન્ડર (સાઉદી અરેબિયા, નિરીક્ષણ) ઇસ્લામિક કેલેન્ડર (ટેબ્યુલર, ખગોળશાસ્ત્રીય યુગ) હિજરી કેલેન્ડર (ઉમ અલ-કુરા) + હિજરી (ઉમ અલ-કુરા) ISO-8601 કેલેન્ડર જાપાનીઝ કેલેન્ડર + જાપાનીઝ પર્શિયન કેલેન્ડર + પર્શિયન મિંગુઓ કેલેન્ડર + મિંગુઓ હિસાબી ચલણી બંધારણ + હિસાબ પ્રમાણભૂત ચલણી બંધારણ + પ્રમાણભૂત પ્રતીકોને સૉર્ટ કરો પ્રતીકોને અવગણીને સૉર્ટ કરો ઉચ્ચારોને સામાન્ય રીતે સૉર્ટ કરો @@ -1107,18 +1130,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ પ્રથમ અપરકેસ સૉર્ટ કરો કેસ સંવેદીને સૉર્ટ કરો કેસ સંવેદી સૉર્ટ કરો - પરંપરાગત ચાઇનિઝ સોર્ટ ક્રમબદ્ધ અગાઉનો સોર્ટ ક્રમ, સુસંગતતા માટે શબ્દકોશ અનુક્મ ડિફોલ્ટ યુનિકોડ સૉર્ટ ક્રમ + ડિફોલ્ટ યુનિકોડ યુરોપીયન ક્રમ આપવાના નિયમો - સરળીકૃત ચાઇનીઝ સૉર્ટ ક્રમ - GB2312 ફોનબુક અનુક્મ ધ્વન્યાત્મક સૉર્ટ ક્રમ પિનયિન અનુક્મ સામાન્ય-ઉદ્દેશ શોધ + શોધ હંગુલ પ્રારંભિક વ્યંજન દ્વારા શોધો માનક સૉર્ટ ક્રમ + માનક સ્ટ્રોક અનુક્મ પરંપરાગત અનુક્મ રેડિકલ-સ્ટ્રોક @@ -1134,18 +1158,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ પૂર્ણપહોળાઇ અર્ધપહોળાઈ સંખ્યા + ડિફૉલ્ટ + ઇમોજી + ટેક્સ્ટ 12 કલાકની સિસ્ટમ (0–11) + 12 (0–11) 12 કલાકની સિસ્ટમ (1–12) + 12 (1–12) 24 કલાકની સિસ્ટમ (0–23) + 24 (0–23) 24 કલાકની સિસ્ટમ (1–24) + 24 (1–24) શિથિલ રેખા વિરામ પ્રકાર + શિથિલ સામાન્ય રેખા વિરામ પ્રકાર + સામાન્ય ચુસ્ત રેખા વિરામ પ્રકાર + ચુસ્ત + તમામ વિરામ + તમામ રાખો + સામાન્ય + વાક્યાંશમાં રાખો US BGN UN GEGN દશાંશ પદ્ધતિ + દશાંશ રજવાડું માપદંડ પદ્ધતિ + યુકે અમેરિકન માપદંડ પદ્ધતિ + અમેરિકન અરેબિક-ભારતીય અંકો વિસ્તૃત અરેબિક-ઇન્ડિક અંકો અર્મેનિયન સંખ્યાઓ @@ -1190,6 +1231,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ તિબેટિયન અંકો પરંપરાગત અંકો વાઇ અંકો + બંધ + ચાલુ મેટ્રિક @@ -1206,7 +1249,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [઼ ૐ ં ઁ ઃ અ આ ઇ ઈ ઉ ઊ ઋ ૠ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્] [\u200C\u200D ૰] [અ {અં} {અઃ} આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક {ક્ષ} ખ ગ ઘ ઙ ચ છ જ {જ્ઞ} ઝ ઞ ટ ઠ ડ ઢ ણ ત {ત્ર} થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ] + [\- ‑ , . % ‰ + − 0 1 2 3 4 5 6 7 8 9] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] @@ -1230,12 +1275,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - એરા0 - એરા1 - - @@ -1257,12 +1296,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - એરા0 - એરા1 - - @@ -1293,17 +1326,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - {1} એ {0} વાગ્યે - {1} {0} - - {1} એ {0} વાગ્યે - @@ -1628,17 +1655,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - {1} એ {0} વાગ્યે - {1} {0} - - {1} એ {0} વાગ્યે - @@ -1652,6 +1673,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d + M/y G MMM, G y d MMM, G y E, d MMM, G y @@ -2154,7 +2176,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ક. + ક૰ + + + ક૰ મિનિટ @@ -2169,10 +2194,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - મિ. + મિ૰ + + + મિ૰ - સેકન્ડ + સેકંડ હમણાં {0} સેકંડમાં @@ -2221,7 +2249,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ઍંગ્વિલા - તિરાને + તિરાના યેરેવાન @@ -2547,6 +2575,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ઇસ્ટર + + કોહેક + પુન્ટા એરીનાઝ @@ -2812,10 +2843,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ફ્નોમ પેન્હ - એંડર્બરી - - - કેન્ટન + કેંટન આઇલૅન્ડ કિરિતિમાતી @@ -2872,7 +2900,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ સેંટ લુસિયા - વૅદુઝ + વડુઝ કોલંબો @@ -3491,9 +3519,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - પશ્ચિમ આફ્રિકા સમય - પશ્ચિમ આફ્રિકા માનક સમય - પશ્ચિમ આફ્રિકા ગ્રીષ્મ સમય + પશ્ચિમ આફ્રિકા સમય @@ -3876,6 +3902,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ગયાના સમય + + + હવાઇ-એલ્યુશિઅન માનક સમય + + હવાઈ-એલ્યુશિઅન સમય @@ -4525,8 +4556,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##,##0.00 - ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 ¤#,##,##0.00;(¤#,##,##0.00) @@ -4625,7 +4656,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બોસ્નિયા અને હર્ઝેગોવિના રૂપાંતર યોગ્ય માર્ક - બાર્બાડિયન ડોલર + બાર્બાડિયન ડૉલર + બાર્બાડિયન ડૉલર + બાર્બાડિયન ડૉલર બાંગ્લાદેશી ટાકા @@ -4642,10 +4675,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બુરુન્ડિયન ફ્રેંક - બર્મુડન ડોલર + બર્મુડન ડૉલર + બર્મુડન ડૉલર + બર્મુડન ડૉલર - બ્રુનેઇ ડોલર + બ્રુનેઇ ડૉલર + બ્રુનેઇ ડૉલર + બ્રુનેઇ ડૉલર બોલિવિયન બોલિવિયાનો @@ -4654,7 +4691,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બ્રાઝિલીયન રિઆલ - બહામિયન ડોલર + બહામિયન ડૉલર + બહામિયન ડૉલર + બહામિયન ડૉલર ભુતાનિઝ એંગુલ્ત્રમ @@ -4670,7 +4709,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ બેલારુશિયન રૂબલ (2000–2016) - બેલિઝ ડોલર + બેલિઝ ડૉલર + બેલિઝ ડૉલર + બેલિઝ ડૉલર કેનેડિયન ડૉલર @@ -4733,7 +4774,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ યુરો - ફિજિઅન ડોલર + ફિજિઅન ડૉલર + ફિજિઅન ડૉલર + ફિજિઅન ડૉલર ફૉકલેન્ડ આઇલેંડ્સ પાઉન્ડ @@ -4762,7 +4805,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ગ્વાટેમાલા કુઇટ્ઝલ - ગયાનિઝ ડોલર + ગયાનિઝ ડૉલર + ગયાનિઝ ડૉલર + ગયાનિઝ ડૉલર હોંગ કોંગ ડૉલર @@ -4798,7 +4843,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ આઇસલેન્ડિક ક્રોના - જમૈકિયન ડોલર + જમૈકિયન ડૉલર + જમૈકિયન ડૉલર + જમૈકિયન ડૉલર જોર્ડનિયન દિનાર @@ -4843,7 +4890,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ શ્રી લંકન રૂપી - લિબેરિયન ડોલર + લિબેરિયન ડૉલર + લિબેરિયન ડૉલર + લિબેરિયન ડૉલર લેસોથો લોતી @@ -4967,7 +5016,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ સાઉદી રિયાલ - સોલોમન આઇલેંડ્સ ડોલર + સોલોમન આઇલૅન્ડ્સ ડૉલર + સોલોમન આઇલૅન્ડ્સ ડૉલર + સોલોમન આઇલૅન્ડ્સ ડૉલર સેશેલોઈ રૂપી @@ -4994,7 +5045,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ સોમાલી શિલિંગ - સૂરીનામિઝ ડોલર + સૂરીનામિઝ ડૉલર + સૂરીનામિઝ ડૉલર + સૂરીનામિઝ ડૉલર દક્ષિણ સુદાનિઝ પાઉન્ડ @@ -5031,7 +5084,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ તુર્કિશ લિરા - ત્રિનિદાદ અને ટોબેગો ડોલર + ત્રિનિદાદ અને ટોબેગો ડૉલર + ત્રિનિદાદ અને ટોબેગો ડૉલર + ત્રિનિદાદ અને ટોબેગો ડૉલર ન્યુ તાઇવાન ડૉલર @@ -5047,7 +5102,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ યુગાંડન શિલિંગ - યુઍસ ડોલર + યુઍસ ડૉલર + યુઍસ ડૉલર + યુઍસ ડૉલર ઉરુગ્વેયન પેસો @@ -5076,7 +5133,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ મધ્ય આફ્રિકન [CFA] ફ્રેંક્સ - ઇસ્ટ કેરિબિયન ડોલર + ઇસ્ટ કેરિબિયન ડૉલર + ઇસ્ટ કેરિબિયન ડૉલર + ઇસ્ટ કેરિબિયન ડૉલર + + + કૅરિબિયન ગિલ્ડર + કૅરિબિયન ગિલ્ડર + કૅરિબિયન ગિલ્ડર પશ્ચિમી આફ્રિકન [CFA] ફ્રેંક @@ -5101,6 +5165,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ઝામ્બિયન ક્વાચા + + ઝીંબાબિયન ગોલ્ડ + ઝીંબાબિયન ગોલ્ડ + ઝીંબાબિયન ગોલ્ડ + {0}+ @@ -5306,7 +5375,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} મિલિમોલ પ્રતિ લિટર {0} મિલિમોલ પ્રતિ લિટર - + + ભાગ + {0} ભાગ + {0} ભાગ + + masculine કણ પ્રતિ મિલિયન {0} કણ પ્રતિ મિલિયન @@ -5330,6 +5404,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + + ગ્લૂકોઝ + {0} ગ્લૂકોઝ + {0} ગ્લૂકોઝ + લીટર પ્રતિ કિલોમીટર {0} લીટર પ્રતિ કિલોમીટર @@ -5882,6 +5961,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} મેટ્રિક કપ {0} મેટ્રિક કપ + + મેટ્રિક ફ્લુઇડ ઔંસ + {0} બુશલ {0} બુશલ @@ -5922,21 +6004,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ઇમ્પીરિયલ ક્વૉર્ટ {0} ઇમ્પીરિયલ ક્વૉર્ટ - - લાઇટ - {0} લાઇટ - {0} લાઇટ + + કૅલરિ [IT] - + + ટેસ્લા + + પ્રતિ અબજ ભાગ - {0} પ્રતિ અબજ ભાગ - {0} પ્રતિ અબજ ભાગ - - - રાત - {0} રાત - {0} રાત - {0}/રાત મુખ્ય દિશા @@ -6113,7 +6188,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} વસ્તુ {0} વસ્તુ - + + ભાગ + {0} ભાગ + {0} ભાગ + + કણ/મિલિયન @@ -6130,6 +6210,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} મોલ {0} મોલ + + ગ્લૂકોઝ + {0} ગ્લૂકોઝ + {0} ગ્લૂકોઝ + લીટર/કિમી {0} લીટર/કિમી @@ -6656,12 +6741,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ચપટી {0} ચપટી + + કૅલ [IT] + લાઇટ {0} લાઇટ {0} લાઇટ - + ભાગ/અબજ {0} પ્રતિ અબજ ભાગ {0} પ્રતિ અબજ ભાગ @@ -6777,7 +6865,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/L - + + ભાગ + {0} ભાગ + {0} ભાગ + + ppm @@ -6789,6 +6882,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + ગ્લૂકોઝ + {0} ગ્લૂકોઝ + {0} ગ્લૂકોઝ + {0}લિ/100કિમી {0}લિ/100કિમી @@ -6923,20 +7021,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} dstspn-Imp {0} dstspn-Imp - - લાઇટ - {0} લાઇટ - {0} લાઇટ - - - {0} પ્રતિ અબજ ભાગ - {0} પ્રતિ અબજ ભાગ - - - રાત - {0} રાત - {0} રાત - {0}/રાત + + કૅલ૰ [IT] diff --git a/make/data/cldr/common/main/ha.xml b/make/data/cldr/common/main/ha.xml index f16d12fa8a0..1afd755e2e6 100644 --- a/make/data/cldr/common/main/ha.xml +++ b/make/data/cldr/common/main/ha.xml @@ -16,7 +16,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Achinese Adangme Adyghe - Afirkanci + Afrikaans Aghem Ainu Akan @@ -41,6 +41,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Azerbaijanci Azeri Bashkir + Baluchi Balenesanci Basaa Belarusanci @@ -111,8 +112,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Girkanci Turanci Turanci Ostareliya - Turanci (Biritaniya) - Turanci (Amurka) Esperanto Sifaniyanci Sifaniyancin Latin Amirka @@ -155,7 +154,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Haida na Kudanci Ibrananci Harshen Hindi - Harshen Hindi (Latin) Hiligaynon Hmong Kuroshiyan @@ -219,6 +217,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Colognian Kurdanci + Kurdanci + Kurmanji Kumyk Komi Cornish @@ -295,6 +295,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nias Niuean Holanci + Flemish Kwasio Norwegian Nynorsk Ngiemboon @@ -325,7 +326,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pijin Harshen Polan Maliseet-Passamaquoddy - Ferusawa + Yaren Prussia Pashtanci Harshen Potugis Harshen Potugis na Birazil @@ -375,7 +376,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sabiyan Sranan Tongo Swati - Sesotanci + Kudancin Sotho Straits Salish Harshen Sundanese Sukuma @@ -602,6 +603,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sin Kolambiya Tsibirin Clipperton + Sark Kwasta Rika Kyuba Tsibiran Cape Verde @@ -827,43 +829,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yanayin Kudi Tsarin Rabewa Kudin Kasa + Gabatar da Imoji Zagayen Awowi (12 da 24) Salo na Raba Layi + Layi Zai Karye tsakanin Kalmomi Tsarin Awo Lambobi + Jimlar ta Karye Bayan Gajarcewa. Kalandar Buddist + Mabiyin addinin Buddha Kalandar Sin + Ɗan ƙasar Sin Kalandar Coptic + Coptic Kalandar Dangi + Dangi Kalandar Etiofic + Ethiopic Kalandar Ethiopic Amete Alem + Ethiopic Amete Alem Kalandar Gregoria + Gregori Kalandar Ibrananci + Yaren Hebrew Kalandar Musulunci + Kaladar Musulunci Kalandar Musulunci (tabular, civil epoch) + Kaladar Musulunci (ta ciki teburi, shekarar jamaʼa) Kalandar Musulunci (tabular, astronomical epoch) + Kalandar Musulunci (ta cikin teburi, shekarar taurari) Kalandar Musulunci (Umm al-Qura) + Kalandar Musulunci (Ummu al-Qura Kalandar ISO-8601 Kalandar Jafan + Ta ƙasar Japan Kalandar Farisa + Ta ƙasar Fasha Kalandar kasar Sin + Minguo Tsarin Kudi na Kididdiga + Lissafin kuɗi Tsarin Kudi Nagartacce + Daidaitacce Tsarin Rabewa na Dan-maƙalu na Asali + Tsararren Unicode Bincike na Dalilai-Gamagari + Bincike Daidaitaccen Kasawa + Daidaitacce + Tsararre + Emoji + Rubutu Tsarin Awowi 12 (0–11) + 12 (0–11) Tsarin Awowi 12(1–12) + 12 (1–12) Tsarin Awowi 24(0–23) + 24 (0–23) Tsarin Awowi 24(1–24) + 24 (1–24) Salo na Raba Layi Sakakke + Sakakke Salo na Raba Layi na Kodayaushe + Na kodayaushe Salo na Raba Layi mai Tsauri + Mai tsauri + Raba duka + A bar duka + Na kodayaushe + A bari cikin magana Tsarin Awo na Metric + Awo Tsarin Awo na Imperial + Turai Tsarin Awo na Amurka + Amurka Lambobi na Larabawan a Gabas Fitattun lambobin lissafi na Larabci Lambobin ƙirga na Armenia @@ -904,6 +946,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lambobin yaren Thai Lambobin yaren Tibet Lambobin Vai + Kashe + Kunna Tsarin awo @@ -954,7 +998,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, {1} - {0} 'da' {1} + {1} 'a' {0} + + + {0} 'a' {1} @@ -962,18 +1009,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, {1} - {0} 'da' {1} + {1} 'a' {0} + + + {1} 'a' {0} {0}, {1} + + {1}, {0} + + + {1}, {0} + {0}, {1} + + {1}, {0} + + + {1}, {0} + M/d @@ -1176,6 +1238,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'a' {0} + @@ -1184,6 +1249,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'da' {0} + + {1} 'a' {0} + @@ -1197,6 +1265,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d + M/y G + E, M/d/y G h:mm a h:mm:ss a M/d @@ -1224,9 +1294,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, M/d/y – E, M/d/y G E, M/d/y – E, M/d/y G - - h a – h a - h:mm a – h:mm a @@ -1241,22 +1308,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dd/MM/y – dd/MM/y dd/MM/y – dd/MM/y - - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - y MMM – y MMM - - - y MMM d – y MMM d - - - y MMM d, E – y MMM d, E - - - y MMMM – y MMMM - @@ -1331,18 +1382,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic shekaru {0} da suka gabata - - - shekara {0} da ta gabata - shekaru {0} da suka gabata - - - - - shekara {0} da ta gabata - shekaru {0} da suka gabata - - kwata kwatan karshe @@ -1357,18 +1396,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwata {0} da suka gabata - - - kwata {0} da suka gabata - kwata {0} da suka gabata - - - - - kwata {0} da suka gabata - kwata {0} da suka gabata - - wata watan da ya gabata @@ -1388,16 +1415,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic a cikin watan {0} a cikin watan {0} - - wata {0} da ya gabata - watanni {0} da suka gabata - - - - - wata {0} da ya gabata - watanni {0} da suka gabata - mako @@ -1414,12 +1431,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sati na {0} - - - mako {0} da ya gabata - makonni {0} da suka gabata - - mako {0} da ya gabata @@ -1446,26 +1457,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwanaki {0} da suka gabata - - - a cikin kwanaki {0} - a cikin kwanaki {0} - - - kwana {0} da ya gabata - kwanaki {0} da suka gabata - - - - - a cikin kwanaki {0} - a cikin kwanaki {0} - - - kwana {0} da ya gabata - kwanaki {0} da suka gabata - - Kwanan Shekara @@ -1488,28 +1479,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lahadi {0} da suka gabata - - - cikin Lahadi {0} - cikin Lahadi {0} - - - Lahadi {0} da ta gabata - Lahadi {0} da suka gabata - - Lahadin da ya gabata wannan Lahadin Lahadi mai zuwa - - cikin Lahadi {0} - cikin Lahadi {0} - - - Lahadi {0} da ta gabata - Lahadi {0} da suka gabata - Litinin din da ta gabata @@ -1524,32 +1497,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Litinin {0} da suka gabata - - Litinin din da ta gabata - wannan Litinin din - Litinin mai zuwa - - cikin Litinin {0} - cikin Litinin {0} - - - Litinin {0} da ta gabata - Litinin {0} da suka gabata - - - - Litinin din da ta gabata - wannan Litinin din - Litinin mai zuwa - - cikin Litinin {0} - cikin Litinin {0} - - - Litinin {0} da ta gabata - Litinin {0} da suka gabata - - Talata da ta gabata wannan Talata @@ -1563,26 +1510,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Talata {0} da suka gabata - - - cikin Talata {0} - cikin Talata {0} - - - Talata {0} da ta gabata - Talata {0} da suka gabata - - - - - cikin Talata {0} - cikin Talata {0} - - - Talata {0} da ta gabata - Talata {0} da suka gabata - - Laraba da ta gabata wannan Larabar @@ -1596,26 +1523,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Laraba {0} da suka gabata - - - cikin Laraba {0} - cikin Laraba {0} - - - Laraba {0} da ta gabata - Laraba {0} da suka gabata - - - - - cikin Laraba {0} - cikin Laraba {0} - - - Laraba {0} da ta gabata - Laraba {0} da suka gabata - - Alhamis din da ya Gabata wannan Alhamis din @@ -1629,26 +1536,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Alhamis {0} da suka gabata - - - cikin Alhamis {0} - cikin Alhamis {0} - - - Alhamis {0} da ta gabata - Alhamis {0} da suka gabata - - - - - cikin Alhamis {0} - cikin Alhamis {0} - - - Alhamis {0} da ta gabata - Alhamis {0} da suka gabata - - Jumaʼa da ta gabata wannan Jumaʼar @@ -1662,26 +1549,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Jumaʼa {0} da suka wuce - - - cikin Jumaʼa {0} - cikin Jumaʼa {0} - - - Jumaʼa {0} da ta wuce - Jumaʼa {0} da suka wuce - - - - - cikin Jumaʼa {0} - cikin Jumaʼa {0} - - - Jumaʼa {0} da ta wuce - Jumaʼa {0} da suka wuce - - Asabar din da ya gabata wannan Asabar din @@ -1696,20 +1563,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - cikin Asabar {0} - cikin Asabar {0} - - - Asabar {0} da ta wuce - Asabar {0} da suka wuce - - - - - cikin Asabar {0} - cikin Asabar {0} - Asabar {0} da ta wuce Asabar {0} da suka wuce @@ -1730,26 +1583,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic awanni {0} da suka gabata - - - cikin awa {0} - cikin awanni {0} - - - awa {0} da ta gabata - awanni {0} da suka gabata - - - - - cikin awa {0} - cikin awanni {0} - - - awa {0} da ta gabata - awanni {0} da suka gabata - - minti wannan mintin @@ -1762,26 +1595,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic mintuna {0} da suka gabata - - - cikin minti {0} - cikin mintuna {0} - - - minti {0} da ya gabata - mintuna {0} da suka gabata - - - - - cikin minti {0} - cikin mintuna {0} - - - minti {0} da ya gabata - mintuna {0} da suka gabata - - daƙiƙa yanzu @@ -1794,26 +1607,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dakiku {0} da suka gabata - - - cikin dakika {0} - cikin dakiku {0} - - - dakika {0} da ta gabata - dakiku {0} da suka gabata - - - - - cikin dakika {0} - cikin dakiku {0} - - - dakika {0} da ta gabata - dakiku {0} da suka gabata - - Lokacin yanki @@ -1840,6 +1633,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tsayayyen Lokacin Irish + + Tsibirin Canton + Beulah, Arewacin Dakota @@ -1871,9 +1667,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Lokacin Afirka ta Yamma - Tsayayyen Lokacin Afirka ta Yamma - Lokacin Bazara na Afirka ta Yamma + Lokacin Afirka ta Yamma @@ -2223,6 +2017,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lokacin Guyana + + + Tsayayyen Lokacin Hawaii-Aleutian + + Lokaci na Hawaii-Aleutian @@ -2792,53 +2591,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤ 0D - ¤ 0D + ¤ 0K + ¤ 0K ¤ 00D ¤ 00D - ¤ 000K - ¤ 000K - ¤0B - ¤0B - ¤0B - ¤ 0B - ¤00B - ¤ 00B - ¤00B - ¤ 00B - ¤000B - ¤ 000B - ¤000B - ¤ 000B - ¤0T - ¤ 0T - ¤0T - ¤ 0T - ¤00T - ¤ 00T - ¤00T - ¤ 00T - ¤000T - ¤ 000T - ¤000T - ¤ 000T + ¤ 000D + ¤ 000D + ¤ 0B + ¤ 0B + ¤ 00B + ¤ 00B + ¤ 000B + ¤ 000B + ¤ 0T + ¤ 0T + ¤ 00T + ¤ 00T + ¤ 000T + ¤ 000T - Kuɗin Haɗaɗɗiyar Daular Larabawa + Dirham na Haɗaɗɗiyar Daular Larabawa + Dirham na Haɗaɗɗiyar Daular Larabawa + Dirham na Haɗaɗɗiyar Daular Larabawa Afghani na ƙasar Afghanistan - Kuɗin Albania + Lek na Albania + Lek na Albania + Lekë na Albania - Kuɗin Armenia - kuɗin Armenia - Kuɗin Armenia + Dram na Armeniya + Dram na Armeniya + Dram na Armeniya Antillean Guilder na ƙasar Netherlands @@ -2846,7 +2637,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Antillean Guilder na ƙasar Netherlands - Kuɗin Angola + Kwanza na Angola + Kwanza na Angola + Kwanza na Angola Peso na ƙasar Argentina @@ -2855,7 +2648,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dalar Ostareliya - Dalolin Ostareliya + Dalar Ostareliya Dalolin Ostareliya @@ -2864,9 +2657,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Florin na yankin Aruba - Kuɗin Azerbaijani - kuɗin Azerbaijani - Kuɗin Azerbaijani + Manat na Azebaijan + Manat na Azebaijan + Manat na Azebaijan Kuɗaɗen Bosnia da Herzegovina @@ -2876,24 +2669,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic Taka na ƙasar Bangladesh - taka na ƙasar Bangladesh - Taka na ƙasar Bangladesh - Kuɗin Bulgeria + Lev na Bulgeria + Lev na Bulgeria + Leva na Bulgeria - Kuɗin Baharan + Zinaren Bahrain + Zinaren Bahrain + Zinaren Bahrain - Kuɗin Burundi + Franc na Burundi + Franc na Burundi + Franc na Burundi Dalar ƙasar Bermuda Dalar Brunei - Dalolin Brunei + Dalar Brunei Dalolin Brunei @@ -2911,14 +2708,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ngultrum na ƙasar Bhutan - ngultrum na ƙasar Bhutan - Ngultrum na ƙasar Bhutan - Kuɗin Baswana + Pula na Batsuwana + Pula na Batsuwana + Pula na Batsuwana - Kuɗin Belarus + Ruble na Belarus + Ruble na Belarus + Ruble na Belarus Dalar ƙasar Belize @@ -2927,18 +2726,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dalar Kanada - Kuɗin Kongo + Franc na Kongo + Franc na Kongo + Franc na Kongo - Kuɗin Suwizalan + Franc na Suwizilan + Franc na Suwizalan + Franc na Suwizilan Peso na ƙasar Chile Yuwan na ƙasar Sin (na wajen ƙasa) - yuwan na ƙasar Sin (na wajen ƙasa) - yuwan na ƙasar Sin (na wajen ƙasa) Yuwan na ƙasar Sin @@ -2958,15 +2759,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Peso na ƙasar Kuba - Kuɗin Tsibiran Kap Barde + Escudo na Cape Verde + Escudo na Cape Verd + Escudo na Cape Verde - Kuɗin Czech - kuɗin Czech - Kuɗin Czech + Koruna na Czech + Koruna na Czech + Koruna na Czech - Kuɗin Jibuti + Franc na Djibouti + Franc na Djibouti + Franc na Djibouti Krone na ƙasar Denmark @@ -2979,27 +2784,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic Peso na jamhuriyar Dominica - Kuɗin Aljeriya + Dinarin Aljeriya Dinarin Aljeriya Dinarin Aljeriya - Fam kin Masar + Fam na Masar Fam na Masar Fam na Masar Kuɗin Eritireya + Nafka na Eritrea + Nafka na Eritrea - Kuɗin Habasha + Birr na Habasha + Birr na Habasha + Birr na Habasha Yuro + yuro + yuro Dalar Fiji - Dalolin Fiji + Dalar Fiji Dalolin Fiji @@ -3009,9 +2820,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fam na Ingila - Kuɗin Georgia - kuɗin Georgia - Kuɗin Georgia + Lari na Georgia + Lari na Georgia + Lari na Georgia Cedi @@ -3020,13 +2831,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sidi na Ghana - Kuɗin Gibraltal + Fam na Gibraltar + Fam na Gibraltar + Fam na Gibraltar - Kuɗin Gambiya + Dalasi na Gambiya + Dalasi na Gambiya + Dalasi na Gambiya - Kuɗin Guinea + Franc na Guinea + Franc na Guinea + Franc na Guinea Kuɗin Gini @@ -3041,8 +2858,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dalar Hong Kong - dalar Hong Kong - Dalar Hong Kong Lempira na ƙasar Honduras @@ -3050,7 +2865,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lempira na ƙasar Honduras - Kuɗin Croatia + Kuna na Croatia + Kuna na Croatia + Kunas na Croatia Gourde na ƙasar Haiti @@ -3058,20 +2875,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gourde na ƙasar Haiti - Kuɗin Hungary - kuɗin Hungary - Kuɗin Hungary + Forint na Hungary + Forint na Hungary + Forint na Hungary Rupiah na ƙasar Indonesia - rupiah na ƙasar Indonesia - Rupiah na ƙasar Indonesia - Sabbin Kuɗin Israʼila + Sabon shekel na Israʼila + Sabon shekel na Israʼila + Sabon shekel na Israʼila - Kuɗin Indiya + Rupee na ƙasar Indiya + Rupee na ƙasar Indiya + Rupee na ƙasar Indiya Dinarin Iraqi @@ -3080,7 +2899,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Riyal na ƙasar Iran - Riyal-riyal na ƙasar Iran + Riyal na ƙasar Iran Riyal-riyal na ƙasar Iran @@ -3107,26 +2926,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Som na ƙasar Kyrgystani - som na ƙasar Kyrgystani - Som na ƙasar Kyrgystani Riel na ƙasar Cambodia - riel na ƙasar Cambodia - Riel na ƙasar Cambodia - Kuɗin Kwamoras + Franc na Kwamoras + Franc na Kwamoras + Franc na Kwamoras Won na ƙasar Koriya ta Arewa - won na ƙasar Koriya ta Arewa - won na ƙasar Koriya ta Arewa Won na Koriya ta Kudu - won na Koriya ta Kudu - won na Koriya ta Kudu Dinarin Kuwaiti @@ -3140,82 +2953,84 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tenge na ƙasar Kazkhstan - tenge na ƙasar Kazakhstan - Tenge na ƙasar Kazkhstan - Kuɗin Laos - kuɗin Laos - Kuɗin Laos + Kip na ƙasar Laos + Kip na ƙasar Laos + Kip na ƙasar Laos - Kuɗin Lebanon - kuɗin Lebanon - Kuɗin Lebanon + Fam na Lebanon + Fam na Lebanon + Fam na Lebanon Rupee na ƙasar Sri Lanka - rupee na ƙasar Sri Lanka - Rupee na ƙasar Sri Lanka Dalar Laberiya - Kuɗin Lesoto - Kuɗaɗen Lesoto - Kuɗaɗen Lesoto + Loti na Lesoto + Loti na Lesoto + Loti na Lesoto - Kuɗin Libiya + Dinarin Libya Dinarin Libiya Dinarin Libiya - Kuɗin Maroko + Dirhamin Moroko Dirhamin Maroko Dirhamomin Maroko - Kuɗaɗen Moldova - Kuɗaɗen Moldova - kuɗaɗen Moldova + Leu na Moldova + Leu na Moldova + Lei na Moldova - Kuɗin Madagaskar + Ariary na Malagasy + Ariary na Malagasy + Ariary na Malagasy Dinarin Macedonia - Kuɗin Myanmar - kuɗin Myanmar - Kuɗin Myanmar + Kyat na ƙasar Myanmar + Kyat na ƙasar Myanmar + Kyat na ƙasar Myanmar Tugrik na Mongolia - tugrik na Mongoliya - Tugrik na Mongolia Pataca na ƙasar Macao - pataca na ƙasar Macao - Pataca na ƙasar Macao Kuɗin Moritaniya (1973–2017) - Kuɗin Moritaniya + Ouguiya na Moritaniya + Ouguiya na Moritaniya + Ouguiya na Moritaniya - Kuɗin Moritus + Rupee na Moritus + Rupee na Moritus + Rupee na Moritus - Rufiyaa na ɓasar Maldives + Rufiyaa na ƙasar Maldives + Rufiyaa na ƙasar Maldives + Rufiyaa na ƙasar Maldives - Kuɗin Malawi + Kwacha na Malawi + Kwacha na Malawi + Kwacha na Malawi Peso na ƙasar Mekziko @@ -3223,9 +3038,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic peso na ƙasar Mekziko - Kuɗin Malaysia - kuɗin Malaysia - Kuɗin Malaysia + Ringgit na ƙasar Malaysia + Ringgit na ƙasar Malaysia + Ringgit na ƙasar Malaysia Kuɗin Mozambik @@ -3254,12 +3069,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Rupee na Nepal - rupee na Nepal - Rupee na Nepal Dalar New Zealand - Dalolin New Zealand + Dalar New Zealand Dalolin New Zealand @@ -3272,22 +3085,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sol na ƙasar Peru - Kina na ƙasar Papua Sabon Guinea - kina na ƙasar Papua Sabon Guinea - Kina na ƙasar Papua Sabon Guinea + Kina na ƙasar Papua New Guinea + Kina na ƙasar Papua New Guinea + Kina na ƙasar Papua New Guinea - Kuɗin Philippine + Peso na ƙasar Philippine + Peso na ƙasar Philippine + Peso na ƙasar Philippine Rupee na ƙasar Pakistan - rupee na ƙasar Pakistan - Rupee na ƙasar Pakistan - Kuɗin Polan - kuɗin Polan - kuɗaɗen Polan + Zloty na Polan + zloty na Polan + zloty na Polan Guarani na ƙasar Paraguay @@ -3296,9 +3109,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Riyal ɗin Qatar - Kuɗin Romania - kuɗin Romania - Kuɗin Romania + Leu na Romania + Leu na Romania + Leu na Romania Dinarin Serbia @@ -3309,20 +3122,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ruble na ƙasar Rasha - Kuɗin Ruwanda + Franc na Ruwanda + Franc na Ruwanda + Franc na Ruwanda - Riyal + Riyal ɗin Saudiyya Riyal ɗin Saudiyya - Riyal + Riyal ɗin Saudiyya - Dalar Tsibirai na Solomon - Dalolin Tsibirai na Solomon - Dalolin Tsibirai na Solomon + Dalar Tsibiran Solomon + Dalar Tsibiran Solomon + Dalolin Tsibiran Solomon - Kuɗin Saishal + Rupee na Seychellois + Rupee na Seychellois + Rupee na Seychellois Fam na Sudan @@ -3334,23 +3151,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dalar Singapore - Dalolin Singapore + Dalar Singapore Dalolin Singapore - Fam kin San Helena + Fam na San Helena Fam na San Helena fam na San Helena - Kuɗin Salewo - Kuɗin Saliyo - Kuɗin Saliyo + Leone na Saliyo + Leone na Saliyo + Leone na Saliyo - Kuɗin Salewo (1964—2022) - Kuɗin Saliyo (1964—2022) - Kuɗin Saliyo (1964—2022) + Leone na Saliyo (1964—2022) + Leone na Saliyo (1964—2022) + Leone na Saliyo (1964—2022) Sulen Somaliya @@ -3367,41 +3184,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kuɗin Sawo Tome da Paransip (1977–2017) - Kuɗin Sawo Tome da Paransip + Dobra na Sawo Tome + Dobra na Sawo Tome + Dobra na Sawo Tome - Kuɗin Siriya + Fam ɗin Siriya + Fam ɗin Siriya + Fam ɗin Siriya - Kuɗin Lilangeni + Emalangeni na Swazi + Lilangeni na Swazi + Emalangeni na Swazi Baht na ƙasar Thailand - baht na ƙasar Thailand - Baht na ƙasar Thailand Somoni na ƙasar Tajikistan - somoni na ƙasar Tajikistan - Somoni na ƙasar Tajikistan Manat na ƙasar Turkmenistan - manat na ƙasar Turkmenistan - Manat na ƙasar Turkmenistan - Kuɗin Tunisiya + Dinarin Tunusiya Dinarin Tunusiya Dinarin Tunusiya Paʻanga na ƙasar Tonga - paʻanga na ƙasar Tonga - Paʻanga na ƙasar Tonga - Kuɗin Turkiyya + Lira na Turkiyya + Lira na Turkiyya + Lira na Turkiyya Dalar ƙasar Trinidad da Tobago @@ -3410,19 +3227,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sabuwar Dalar Taiwan - Sabuwar dalar Taiwan - Sabuwar Dalar Taiwan Sulen Tanzaniya - Kudin Ukrainian - kuɗin Ukrain - Kuɗin Ukrain + Hryvnia na Ukrain + Hryvnia na Ukrain + Hryvnia na Ukrain - Sule Yuganda + Sulen Yuganda Sulallan Yuganda Sulallan Yuganda @@ -3437,26 +3252,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Som na ƙasar Uzbekistan - som na ƙasar Uzbekistan - Som na ƙasar Uzbekistan Bolívar na ƙasar Venezuela - Kuɗin Vietnam - kuɗin Vietnam - Kuɗin Vietnam + Dong na ƙasar Vietnam + Dong na ƙasar Vietnam + Dong na ƙasar Vietnam Vatu da ƙasar Vanuatu - vatu na ƙasar Vanuatu - Vatu da ƙasar Vanuatu Tala na ƙasar Samoa - tala na ƙasar Samoa - Tala na ƙasar Samoa Kuɗin Sefa na Afirka Ta Tsakiya @@ -3466,18 +3275,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic dalar Gabashin Karebiyan dalar Gabashin Karebiyan + + Guilder na Caribbean + Guilder na Caribbean + Guilder na Caribbean + Kuɗin Sefa na Afirka Ta Yamma Kuɗin CFP franc - kuɗin CFP franc - Kuɗin CFP franc Kudin da ba a sani ba - (kuɗin sashe da ba a sani ba) - (Kudin da ba a sani ba) + (sashin kuɗi da ba a sani ba) + Kudin da ba a sani ba Riyal ɗin Yemen @@ -3485,17 +3297,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic Riyal ɗin Yemen - Kuɗin Afirka Ta Kudu + Rand na Afirka ta Kudu + Rand na Afirka ta Kudu + Rand na Afirka ta Kudu Kuɗin Zambiya (1968–2012) - Kuɗin Zambiya + Kwacha na Zambiya + Kwacha na Zambiya + Kwacha na Zambiya Dalar zimbabuwe + + Zinaren Zimbabwe + Zinaren Zimbabwe + Zinaren Zimbabwe + {0}+ @@ -3677,7 +3498,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic abu {0} abubuwa {0} - + + sassa + sashe {0} + sassa {0} + + parts per million part per million {0} parts per million {0} @@ -3699,6 +3525,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mole {0} moles {0} + + na guluko + {0} na guluko + {0} na guluko + litoci a kilomita lita a kilomita {0} @@ -3790,12 +3621,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} a shekara - kwatoci + kwata-kwata kwata {0} kwatoci {0} - wat wata {0} watanni {0} {0} a wata @@ -3970,17 +3800,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic ayoyi a inci - {0} aya a inci - {0} ayoyi a inci + aya {0} a inci + ayoyi {0} a inci aya {0} aya {0} - earth radius - earth radius {0} - earth radius {0} + faɗin duniya + faɗin duniya {0} + faɗin duniya {0} kilomitoci @@ -4202,6 +4032,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic millimitar zaiba {0} millimitocin zaiba {0} + + na mercury + {0} na mercury + {0} na mercury + laba-laba a sikwaya inci laba a sikwaya inci {0} @@ -4373,6 +4208,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic metric cup {0} metric cups {0} + + kimar awon ruwa + kimar awon ruwa {0} + kimar awon ruwa {0} + eka-ƙafafu eka-ƙafa {0} @@ -4452,22 +4292,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic Imp. quart {0} Imp. quarts {0} + + steradians + steradian {0} + steradian {0} + + + katals + {0} katal + {0} katals + + + coulomb {0} + coulomb {0} + + + farads + farad {0} + farad {0} + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + kalori-kalori [IT] + kalori [IT] {0} + kalori-kalori [IT] {0} + + + bekerel-bekerel + bekerel {0} + bekerel-bekerel {0} + + + sibat-sibat + sibat {0} + sibat-sibat {0} + + + gre-gre + gre {0} + gre-gre {0} + + + kilograms-force + {0} kilogram-force + {0} kilograms-force + + + tesla + tesla {0} + tesla {0} + + + weber + weber {0} + weber {0} + haske haske {0} haske {0} - + sashi a cikin biliyan sashi {0} a cikin biliyan sashi {0} a cikin biliyan - - darare - dare {0} - darare {0} - dare {0} - wurin fuskanta Gabas {0} @@ -4577,7 +4475,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic abu {0} Abw. {0} - + + sashe + sashe {0} + sashe {0} + + parts/million ppm {0} ppm {0} @@ -4600,6 +4503,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mol {0} mol {0} + + Glk + Glk {0} + Glk {0} + litoci/km L/km {0} @@ -4746,6 +4654,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ns {0} + amps A {0} A {0} @@ -4855,15 +4764,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic ppi {0} + dpcm dpcm {0} dpcm {0} + dpi dpi {0} dpi {0} aya + aya {0} + aya {0} R⊕ {0} @@ -4871,20 +4784,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic km {0} - {0} km + km {0} + km/{0} m m {0} m {0} + m/{0} dm {0} dm {0} - cm {0} - cm {0} + sm + sm {0} + sm {0} + sm/{0} mm {0} @@ -4917,12 +4834,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ƙafafu ƙf {0} ƙff {0} - {0}/ƙf + ƙafa/{0} incina in {0} in {0} + in/{0} fasekoki @@ -5080,6 +4998,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mmHg {0} mmHg {0} + + na Hg + {0} na Hg + {0} na Hg + psi {0} psi {0} @@ -5228,6 +5151,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic mc {0} mc {0} + + kimar awon ruwa {0}. + kimar awon ruwa {0}. + eka ƙf ek ƙf {0} @@ -5314,12 +5241,68 @@ CLDR data files are interpreted according to the LDML specification (http://unic qt Imp. {0} qt Imp. {0} + + sr {0} + sr {0} + + + {0} kat + {0} kat + + + C {0} + C {0} + + + F {0} + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + kal-IT + kal-IT {0} + kal-IT {0} + + + Bk + Bk {0} + Bk {0} + + + Sb + Sb {0} + Sb {0} + + + Gr + Gr {0} + Gr {0} + + + {0} kgf + {0} kgf + + + T {0} + T {0} + + + Wb {0} + Wb {0} + hsk hsk {0} hsk {0} - + sashi/biliyan sashi {0} a cikin biliyan sashi {0} a cikin biliyan @@ -5433,7 +5416,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic abu{0} Abw{0} - + + sashe + sashe {0} + sashe {0} + + ppm ppm{0} ppm{0} @@ -5453,6 +5441,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mol{0} mol{0} + + Glk + Glk {0} + Glk {0} + L/km L/km{0} @@ -5687,10 +5680,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ppi{0} + dpcm dpcm{0} dpcm{0} + dpi dpi{0} dpi{0} @@ -5705,18 +5700,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic km{0} km{0} + km/{0} m{0} m{0} + m/{0} dm{0} dm{0} - cm{0} - cm{0} + sm + sm{0} + sm{0} + sm/{0} mm{0} @@ -5743,12 +5742,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic ydk{0} - ƙf{0} - ƙff{0} + {0}' + {0}' + ƙafa/{0} {0}″ {0}″ + in/{0} fasek @@ -6035,6 +6036,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic mL{0} + pt mpt{0} mpt{0} @@ -6042,6 +6044,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mc{0} mc{0} + + kimar awon ruwa. + kimar awon ruwa {0}. + kimar awon ruwa {0}. + ek ƙf{0} ek ƙf{0} @@ -6057,7 +6064,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Imp gal galIm{0} - galIm{0} + gal-Im{0} {0}/galIm @@ -6128,22 +6135,57 @@ CLDR data files are interpreted according to the LDML specification (http://unic qt-Imp.{0} qt-Imp.{0} - - hsk - hsk {0} - hsk {0} + + sr {0} + sr {0} - + + {0} kat + {0} kat + + + C {0} + C {0} + + + F {0} + {0} F + + + kal-IT + kal-IT{0} + kal-IT {0} + + + Bk + Bk {0} + Bk {0} + + + Sb + Sb {0} + Sb {0} + + + Gr + + + {0} kgf + {0} kgf + + + T {0} + T {0} + + + Wb{0} + Wb{0} + + sashi/biliyan sashi {0} a cikin biliyan sashi {0} a cikin biliyan - - darare - dare {0} - darare {0} - dare {0} - G{0} A{0} @@ -6475,7 +6517,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic van den Wolf Becker Schmidt - Jr + Ƙarami M.D. Ph.D. diff --git a/make/data/cldr/common/main/haw.xml b/make/data/cldr/common/main/haw.xml index 014397e54b8..9981a26ad52 100644 --- a/make/data/cldr/common/main/haw.xml +++ b/make/data/cldr/common/main/haw.xml @@ -326,13 +326,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - HST - HST - HDT - - AKT @@ -340,6 +333,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic AKDT + + + HAT + HAST + HADT + + HAT diff --git a/make/data/cldr/common/main/he.xml b/make/data/cldr/common/main/he.xml index 640cb79740b..a31b5323898 100644 --- a/make/data/cldr/common/main/he.xml +++ b/make/data/cldr/common/main/he.xml @@ -283,6 +283,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ באפיה קולוניאן כורדית + כורדית + כורדית קומיקית קוטנאי קומי @@ -860,6 +862,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ סין קולומביה האי קליפרטון + סרק קוסטה ריקה קובה כף ורדה @@ -1210,35 +1213,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ מיון לפי מספרים עוצמת המיון מטבע + הצגת אמוג׳י מחזור השעות (12 או 24) סגנון מעבר שורה + פיצול שורה בתוך מילים מערכת מדידה מספרים + פיצול משפט אחרי מילה מקוצרת אזור זמן משתנה אזור שימוש פרטי לוח השנה הבודהיסטי + בודהיסטי לוח השנה הסיני + סיני לוח השנה הקופטי + קופטי לוח השנה הקוריאני + קוריאני לוח השנה האתיופי + אתיופי לוח השנה אמטה אלם האתיופי + אמטה אלם האתיופי לוח השנה הגרגוריאני + גרגוריאני לוח השנה העברי + עברי לוח השנה ההודי הלאומי לוח שנה ההיג׳רי + היג׳רי לוח השנה המוסלמי האזרחי + היג׳רי אזרחי לוח השנה המוסלמי (ערב הסעודית) לוח השנה המוסלמי האסטרונומי + מוסלמי אסטרונומי לוח השנה המוסלמי אום אל-קורא + מוסלמי אום אל-קורא לוח שנה ISO-8601 לוח השנה היפני + יפני לוח השנה הפרסי + פרסי לוח השנה הטייוואני + טייוואני תבנית מטבע למטרות חשבונאות + חשבונאות תבנית מטבע רגילה + רגילה מיין סמלים מיין תוך התעלמות מסמלים מיין הטעמות בצורה רגילה @@ -1248,23 +1271,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ מיין תחילה לפי אותיות רישיות מיין באופן שאינו תלוי רישיות מיין באופן תלוי רישיות - מיון סינית מסורתית סדר מיון קודם, עבור תאימות + תאימות סדר מיון במילון + מילון סדר מיון Unicode המוגדר כברירת מחדל + Unicode כברירת מחדל סדר מיון אימוג׳י חוקי סדר אירופיים - סדר מיון סיני פשוט - GB2312 מיון ספר טלפונים + ספר טלפונים סדר מיון פונטי + פונטי מיון פיניין + פיניין חיפוש למטרה כללית + חיפוש חפש לפי העיצור הראשון באותיות הנגול סדר מיון רגיל + רגיל סדר מיון לפי ספירת תווים + ספירת תווים מיון מסורתי + מסורתי סדר מיון לפי ספירת תווים Radical-Stroke + Radical-Stroke סדר מיון של ג׳ואין + ג׳ואין מיין ללא נורמליזציה מיין לפי Unicode מנורמל מיין ספרות בנפרד @@ -1277,18 +1310,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ רוחב מלא חצי רוחב מספרי + ברירת מחדל + אמוג׳י + טקסט מערכת של 12 שעות (‎0–11) + 12 (0–11) מערכת של 12 שעות (‎1–12) + 12 (1–12) מערכת של 24 שעות (0‎–23) + 24 (0–23) מערכת של 24 שעות (1‎–24) + ‎24 (1–24) סגנון מעבר שורה גמיש + גמיש סגנון מעבר שורה רגיל + רגיל סגנון מעבר שורה קשיח + קשיח + לחלק הכול + לשמור הכול + רגיל + לשמור כביטויים תעתיק BGN ארה״ב תעתיק GEGN האו״ם מערכת מטרית + מטרית מערכת מדידה אימפריאלית + בריטית מערכת מדידה אמריקאית + אמריקאית ספרות אהום ספרות הודיות-ערביות ספרות הודיות-ערביות מורחבות @@ -1372,6 +1422,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ספרות ואי ספרות ווראנג סיטי ספרות וונצ׳ו + כבוי + פועל מטרי @@ -1398,9 +1450,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1455,12 +1504,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - עידן 0 - עידן 1 - - @@ -1482,12 +1525,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - עידן 0 - עידן 1 - - @@ -1543,6 +1580,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E ה-d y G + MM-y G d/M/y GGGGG MMM y G d בMMM y G @@ -1778,8 +1816,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ חצות - AM - PM בבוקר בצהריים אחה״צ @@ -1789,8 +1825,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ חצות - AM - PM בבוקר בצהריים אחר הצהריים @@ -1801,8 +1835,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - AM - PM בוקר צהריים אחה״צ @@ -2393,6 +2425,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + MM-y G h a d/M d בMMMM @@ -2474,51 +2507,85 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שנ׳ + + בעוד שנה + בעוד שנתיים ({0}) + בעוד {0} שנים + + + לפני שנה ({0}) + לפני שנתיים ({0}) + לפני {0} שנים + + + + + בעוד שנה ({0}) + בעוד שנתיים ({0}) + בעוד {0} שנים + + + לפני שנה ({0}) + לפני שנתיים ({0}) + לפני {0} שנים + רבעון הרבעון הקודם - רבעון זה + הרבעון הזה הרבעון הבא - ברבעון הבא + בעוד רבעון אחד ({0}) בעוד שני רבעונים בעוד {0} רבעונים - ברבעון הקודם - לפני שני רבעונים + לפני רבעון אחד ({0}) + לפני {0} רבעונים לפני {0} רבעונים רבע׳ - ברבע׳ הבא - בעוד שני רבע׳ + בעוד רבע׳ אחד ({0}) + בעוד {0} רבע׳ בעוד {0} רבע׳ בעוד {0} רבע׳ - ברבע׳ הקודם - לפני שני רבע׳ + לפני רבע׳ אחד ({0}) + לפני {0} רבע׳ לפני {0} רבע׳ לפני {0} רבע׳ + + + בעוד רבע׳ אחד ({0}) + בעוד {0} רבע׳ + בעוד {0} רבע׳ + + + לפני רבע׳ אחד ({0}) + לפני {0} רבע׳ + לפני {0} רבע׳ + + חודש החודש שעבר החודש החודש הבא - בעוד חודש - בעוד חודשיים + בעוד חודש ({0}) + בעוד חודשיים ({0}) בעוד {0} חודשים - לפני חודש - לפני חודשיים + לפני חודש ({0}) + לפני חודשיים ({0}) לפני {0} חודשים @@ -2528,13 +2595,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ בעוד חו׳ - בעוד חודשיים + בעוד חודשיים ({0}) בעוד {0} חו׳ בעוד {0} חו׳ - לפני חו׳ - לפני חודשיים + לפני חו׳ ({0}) + לפני חודשיים ({0}) לפני {0} חו׳ לפני {0} חו׳ @@ -2545,13 +2612,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ השבוע השבוע הבא - בעוד שבוע - בעוד שבועיים + בעוד שבוע ({0}) + בעוד שבועיים ({0}) בעוד {0} שבועות - לפני שבוע - לפני שבועיים + לפני שבוע ({0}) + לפני שבועיים ({0}) לפני {0} שבועות השבוע של {0} @@ -2559,22 +2626,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שב׳ - בעוד שב׳ - בעוד שבועיים + בעוד שב׳ ({0}) + בעוד שבועיים ({0}) בעוד {0} שב׳ בעוד {0} שב׳ - לפני שב׳ - לפני שבועיים + לפני שב׳ ({0}) + לפני שבועיים ({0}) לפני {0} שב׳ לפני {0} שב׳ - לפני שבוע - לפני שבועיים + לפני שב׳ ({0}) + לפני שבועיים ({0}) לפני {0} שב׳ @@ -2589,25 +2656,37 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ מחר מחרתיים - בעוד יום {0} - בעוד יומיים + בעוד יום ({0}) + בעוד יומיים ({0}) בעוד {0} ימים - לפני יום {0} - לפני יומיים + לפני יום אחד ({0}) + לפני יומיים ({0}) לפני {0} ימים - מחר - בעוד יומיים + בעוד יום אחד ({0}) + בעוד יומיים ({0}) בעוד {0} ימים - אתמול - לפני יומיים + לפני יום אחד ({0}) + לפני יומיים ({0}) + לפני {0} ימים + + + + + בעוד יום אחד ({0}) + בעוד יומיים ({0}) + בעוד {0} ימים + + + לפני יום אחד ({0}) + לפני יומיים ({0}) לפני {0} ימים @@ -2642,12 +2721,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום א׳ שעבר יום א׳ יום א׳ הבא + + בעוד יום א׳ אחד ({0}) + בעוד {0} ימי א׳ + בעוד {0} ימי א׳ + בעוד {0} ימי א׳ + + + לפני יום א׳ אחד ({0}) + לפני {0} ימי א׳ + לפני {0} ימי א׳ + לפני {0} ימי א׳ + - בעוד יום ראשון {0} + בעוד יום א׳ אחד ({0}) בעוד {0} ימי א׳ - בעוד {0} ימי ראשון + בעוד {0} ימי א׳ + בעוד {0} ימי א׳ + + + לפני יום א׳ אחד ({0}) + לפני {0} ימי א׳ + לפני {0} ימי א׳ + לפני {0} ימי א׳ @@ -2655,12 +2753,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום שני יום שני הבא - בעוד יום שני {0} + בעוד יום שני אחד ({0}) בעוד {0} ימי שני בעוד {0} ימי שני - לפני יום שני {0} + לפני יום שני אחד ({0}) לפני {0} ימי שני לפני {0} ימי שני @@ -2669,18 +2767,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום ב׳ שעבר יום ב׳ יום ב׳ הבא + + בעוד יום ב׳ אחד ({0}) + בעוד {0} ימי ב׳ + בעוד {0} ימי ב׳ + בעוד {0} ימי ב׳ + + + לפני יום ב׳ אחד ({0}) + לפני {0} ימי ב׳ + לפני {0} ימי ב׳ + לפני {0} ימי ב׳ + + + + + בעוד יום ב׳ אחד ({0}) + בעוד {0} ימי ב׳ + בעוד {0} ימי ב׳ + בעוד {0} ימי ב׳ + + + לפני יום ב׳ אחד ({0}) + לפני {0} ימי ב׳ + לפני {0} ימי ב׳ + לפני {0} ימי ב׳ + יום שלישי שעבר יום שלישי יום שלישי הבא - בעוד יום שלישי {0} + בעוד יום שלישי אחד ({0}) בעוד {0} ימי שלישי בעוד {0} ימי שלישי - לפני יום שלישי {0} + לפני יום שלישי אחד ({0}) לפני {0} ימי שלישי לפני {0} ימי שלישי @@ -2689,18 +2813,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום ג׳ שעבר יום ג׳ יום ג׳ הבא + + בעוד יום ג׳ אחד ({0}) + בעוד {0} ימי ג׳ + בעוד {0} ימי ג׳ + בעוד {0} ימי ג׳ + + + לפני יום ג׳ אחד ({0}) + לפני {0} ימי ג׳ + לפני {0} ימי ג׳ + לפני {0} ימי ג׳ + + + + + בעוד יום ג׳ אחד ({0}) + בעוד {0} ימי ג׳ + בעוד {0} ימי ג׳ + בעוד {0} ימי ג׳ + + + לפני יום ג׳ אחד ({0}) + לפני {0} ימי ג׳ + לפני {0} ימי ג׳ + לפני {0} ימי ג׳ + יום רביעי שעבר יום רביעי יום רביעי הבא - בעוד יום רביעי {0} + בעוד יום רביעי אחד ({0}) בעוד {0} ימי רביעי בעוד {0} ימי רביעי - לפני יום רביעי {0} + לפני יום רביעי אחד ({0}) לפני {0} ימי רביעי לפני {0} ימי רביעי @@ -2709,18 +2859,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום ד׳ שעבר יום ד׳ יום ד׳ הבא + + בעוד יום ד׳ אחד ({0}) + בעוד {0} ימי ד׳ + בעוד {0} ימי ד׳ + בעוד {0} ימי ד׳ + + + לפני יום ד׳ אחד ({0}) + לפני {0} ימי ד׳ + לפני {0} ימי ד׳ + לפני {0} ימי ד׳ + + + + + בעוד יום ד׳ אחד ({0}) + בעוד {0} ימי ד׳ + בעוד {0} ימי ד׳ + בעוד {0} ימי ד׳ + + + לפני יום ד׳ אחד ({0}) + לפני {0} ימי ד׳ + לפני {0} ימי ד׳ + לפני {0} ימי ד׳ + יום חמישי שעבר יום חמישי יום חמישי הבא - בעוד יום חמישי {0} + בעוד יום חמישי אחד ({0}) בעוד {0} ימי חמישי בעוד {0} ימי חמישי - לפני יום חמישי {0} + לפני יום חמישי אחד ({0}) לפני {0} ימי חמישי לפני {0} ימי חמישי @@ -2729,18 +2905,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום ה׳ שעבר יום ה׳ יום ה׳ הבא + + בעוד יום ה׳ אחד ({0}) + בעוד {0} ימי ה׳ + בעוד {0} ימי ה׳ + בעוד {0} ימי ה׳ + + + לפני יום ה׳ אחד ({0}) + לפני {0} ימי ה׳ + לפני {0} ימי ה׳ + לפני {0} ימי ה׳ + + + + + בעוד יום ה׳ אחד ({0}) + בעוד {0} ימי ה׳ + בעוד {0} ימי ה׳ + בעוד {0} ימי ה׳ + + + לפני יום ה׳ אחד ({0}) + לפני {0} ימי ה׳ + לפני {0} ימי ה׳ + לפני {0} ימי ה׳ + יום שישי שעבר יום שישי יום שישי הבא - בעוד יום שישי אחד {0} + בעוד יום שישי אחד ({0}) בעוד {0} ימי שישי בעוד {0} ימי שישי - לפני יום שישי אחד {0} + לפני יום שישי אחד ({0}) לפני {0} ימי שישי לפני {0} ימי שישי @@ -2750,27 +2952,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום ו׳ יום ו׳ הבא - בעוד יום שישי אחד {0} - בעוד {0} ימי שישי - בעוד {0} ימי שישי - - - לפני יום שישי אחד {0} - לפני {0} ימי שישי - לפני {0} ימי שישי - - - - - בעוד יום ו׳ אחד {0} + בעוד יום ו׳ אחד ({0}) בעוד {0} ימי ו׳ בעוד {0} ימי ו׳ בעוד {0} ימי ו׳ - לפני יום ו׳ אחד {0} - לפני {0} ימי שישי - לפני {0} ימי שישי + לפני יום ו׳ אחד ({0}) + לפני {0} ימי ו׳ + לפני {0} ימי ו׳ + לפני {0} ימי ו׳ + + + + + בעוד יום ו׳ אחד ({0}) + בעוד {0} ימי ו׳ + בעוד {0} ימי ו׳ + בעוד {0} ימי ו׳ + + + לפני יום ו׳ אחד ({0}) + לפני {0} ימי ו׳ + לפני {0} ימי ו׳ + לפני {0} ימי ו׳ @@ -2778,12 +2983,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ יום שבת יום שבת הבא - בעוד שבת {0} + בעוד שבת אחת ({0}) בעוד {0} שבתות בעוד {0} שבתות - לפני שבת אחת {0} + לפני שבת אחת ({0}) לפני {0} שבתות לפני {0} שבתות @@ -2792,15 +2997,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שבת שעברה שבת שבת הבאה + + בעוד שבת אחת ({0}) + בעוד {0} שבתות + בעוד {0} שבתות + - לפני שבת אחת {0} + לפני שבת אחת ({0}) לפני {0} שבתות לפני {0} שבתות + + בעוד שבת אחת ({0}) + בעוד {0} שבתות + בעוד {0} שבתות + - לפני שבת אחת {0} + לפני שבת אחת ({0}) לפני {0} שבתות לפני {0} שבתות @@ -2815,44 +3030,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שעה בשעה זו - בעוד שעה - בעוד שעתיים + בעוד שעה ({0}) + בעוד שעתיים ({0}) בעוד {0} שעות - לפני שעה - לפני שעתיים + לפני שעה ({0}) + לפני שעתיים ({0}) לפני {0} שעות - בעוד שעה - בעוד שעתיים + בעוד שעה ({0}) + בעוד שעתיים ({0}) בעוד {0} שע׳ בעוד {0} שע׳ - לפני שעה - לפני שעתיים + לפני שע׳ ({0}) + לפני שעתיים ({0}) לפני {0} שע׳ לפני {0} שע׳ שע׳ + + בעוד שעה ({0}) + בעוד שעתיים ({0}) + בעוד {0} שע׳ + + + לפני שע׳ ({0}) + לפני שעתיים ({0}) + לפני {0} שע׳ + דקה בדקה זו - בעוד דקה - בעוד שתי דקות + בעוד דקה ({0}) + בעוד {0} דקות בעוד {0} דקות - לפני דקה - לפני שתי דקות + לפני דקה ({0}) + לפני {0} דקות לפני {0} דקות @@ -2860,30 +3085,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ דק׳ דקה זו - בעוד דקה - בעוד שתי דק׳ + בעוד דק׳ ({0}) + בעוד {0} דק׳ בעוד {0} דק׳ בעוד {0} דק׳ - לפני דקה + לפני דק׳ ({0}) לפני {0} דק׳ לפני {0} דק׳ לפני {0} דק׳ - - - לפני דקה - לפני שתי דק׳ - לפני {0} דק׳ - - שנייה עכשיו - בעוד שנייה + בעוד שנייה ({0}) בעוד שתי שניות בעוד {0} שניות @@ -2896,18 +3114,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שנ׳ - בעוד שנ׳ - בעוד שתי שנ׳ + בעוד שנ׳ ({0}) + בעוד {0} שנ׳ בעוד {0} שנ׳ בעוד {0} שנ׳ - לפני שנ׳ + לפני שנ׳ ({0}) לפני שתי שנ׳ לפני {0} שנ׳ לפני {0} שנ׳ + + + בעוד שנ׳ ({0}) + בעוד {0} שנ׳ + בעוד {0} שנ׳ + + + לפני שנ׳ ({0}) + לפני שתי שנ׳ + לפני {0} שנ׳ + + אזור זמן @@ -3274,6 +3504,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ אי הפסחא + + קויאיקה + פונטה ארנס @@ -3539,9 +3772,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ פנום פן - אנדרבורי - - קנטון @@ -4211,9 +4441,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - שעון מערב אפריקה - שעון מערב אפריקה (חורף) - שעון מערב אפריקה (קיץ) + שעון מערב אפריקה @@ -4596,6 +4824,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שעון גיאנה + + + שעון האיים האלאוטיים הוואי (חורף) + + שעון האיים האלאוטיים הוואי @@ -5041,6 +5274,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ שעון צ׳וק + + + שעון טורקיה + שעון רגיל טורקיה + שעון קיץ טורקיה + + שעון טורקמניסטן @@ -5223,95 +5463,64 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ‏#,##0.00 ‏¤;‏-#,##0.00 ‏¤ - ‏#,##0.00‏;‏-#,##0.00‏ + ‏#,##0.00 ‏¤;‏-#,##0.00 ‏¤ + ‏#,##0.00 ‏;‏-#,##0.00 ‏ + + + ‏#,##0.00 ‏¤;‏-#,##0.00 ‏¤ + ‏#,##0.00 ‏;‏-#,##0.00 ‏ - ¤0K‏ - ¤ 0K‏ - ¤0K‏ - ¤ 0K‏ - ¤ 0K‏ - ¤0K‏ - ¤ 0K‏ - ¤00K‏ - ¤ 00K‏ - ¤00K‏ - ¤ 00K‏ - ¤ 00K‏ - ¤00K‏ - ¤ 00K‏ - ¤000K‏ - ¤ 000K‏ - ¤000K‏ - ¤ 000K‏ - ¤ 000K‏ - ¤000K‏ - ¤ 000K‏ - ¤0M‏ - ¤ 0M‏ - ¤0M‏ - ¤ 0M‏ - ¤ 0M‏ - ¤0M‏ - ¤ 0M‏ - ¤00M‏ - ¤ 00M‏ - ¤00M‏ - ¤ 00M‏ - ¤ 00M‏ - ¤00M‏ - ¤ 00M‏ - ¤000M‏ - ¤ 000M‏ - ¤000M‏ - ¤ 000M‏ - ¤ 000M‏ - ¤000M‏ - ¤ 000M‏ - ¤0B‏ - ¤ 0B‏ - ¤0B‏ - ¤ 0B‏ - ¤ 0B‏ - ¤0B‏ - ¤ 0B‏ - ¤00B‏ - ¤ 00B‏ - ¤00B‏ - ¤ 00B‏ - ¤ 00B‏ - ¤00B‏ - ¤ 00B‏ - ¤000B‏ - ¤ 000B‏ - ¤000B‏ - ¤ 000B‏ - ¤ 000B‏ - ¤000B‏ - ¤ 000B‏ - ¤0T‏ - ¤ 0T‏ - ¤0T‏ - ¤ 0T‏ - ¤ 0T‏ - ¤0T‏ - ¤ 0T‏ - ¤00T‏ - ¤ 00T‏ - ¤00T‏ - ¤ 00T‏ - ¤ 00T‏ - ¤00T‏ - ¤ 00T‏ - ¤000T‏ - ¤ 000T‏ - ¤000T‏ - ¤ 000T‏ - ¤ 000T‏ - ¤000T‏ - ¤ 000T‏ + ‏0K‏ ‏¤ + ‏0K‏ ‏¤ + ‏0K‏ ‏¤ + ‏0K‏ ‏¤ + ‏00K‏ ‏¤ + ‏00K‏ ‏¤ + ‏00K‏ ‏¤ + ‏00K‏ ‏¤ + ‏000K‏ ‏¤ + ‏000K‏ ‏¤ + ‏000K‏ ‏¤ + ‏000K‏ ‏¤ + ‏0M‏ ‏¤ + ‏0M‏ ‏¤ + ‏0M‏ ‏¤ + ‏0M‏ ‏¤ + ‏00M‏ ‏¤ + ‏00M‏ ‏¤ + ‏00M‏ ‏¤ + ‏00M‏ ‏¤ + ‏000M‏ ‏¤ + ‏000M‏ ‏¤ + ‏000M‏ ‏¤ + ‏000M‏ ‏¤ + ‏0B‏ ‏¤ + ‏0B‏ ‏¤ + ‏0B‏ ‏¤ + ‏0B‏ ‏¤ + ‏00B‏ ‏¤ + ‏00B‏ ‏¤ + ‏00B‏ ‏¤ + ‏00B‏ ‏¤ + ‏000B‏ ‏¤ + ‏000B‏ ‏¤ + ‏000B‏ ‏¤ + ‏000B‏ ‏¤ + ‏0T‏ ‏¤ + ‏0T‏ ‏¤ + ‏0T‏ ‏¤ + ‏0T‏ ‏¤ + ‏00T‏ ‏¤ + ‏00T‏ ‏¤ + ‏00T‏ ‏¤ + ‏00T‏ ‏¤ + ‏000T‏ ‏¤ + ‏000T‏ ‏¤ + ‏000T‏ ‏¤ + ‏000T‏ ‏¤ @@ -5944,7 +6153,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ לירה טורקית חדשה לירה טורקית חדשה לירות טורקיות - לירות טורקיות לירות טורקיות @@ -6012,6 +6220,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ דולר מזרח קריבי + + גילדר של הקריביים + גילדר של הקריביים + גילדר של הקריביים + גילדר של הקריביים + זכויות משיכה מיוחדות @@ -6069,13 +6283,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ דולר זימבבואי + + זהב של זימבבואה + זהב של זימבבואה + זהב של זימבבואה + זהב של זימבבואה + יום יומיים {0} יום {0} ימים - פנה ימינה בפנייה ה-{0} + פנו ימינה בפנייה ה-{0} ה{0} הראשונה היא הקובעת ה{0} הראשון הוא הקובע @@ -6233,12 +6453,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} מייל רבוע {0} למייל רבוע - - {0} אקר - {0} אקר - {0} אקר - {0} אקר - יארד רבוע {0} יארד רבוע @@ -6289,7 +6503,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine פריטים - + + חלקים + {0} חלק + {0} חלקים + {0} חלקים + + masculine חלקים למיליון {0} חלקים למיליון @@ -6329,6 +6549,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} מול {0} מול + + גלוקוז + {0} גלוקוז + {0} גלוקוז + {0} גלוקוז + masculine ליטרים/קילומטר @@ -6543,10 +6769,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - {0} ohm - {0} ohms - {0} ohms - {0} ohms + אוהם + {0} אוהם + {0} אוהם + {0} אוהם + {0} אוהם masculine @@ -6675,13 +6902,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine קו מפריד מסוג em - {0} em - {0} em - {0} ems masculine פיקסלים + px ‏{0} + px ‏{0} + px ‏{0} masculine @@ -6690,6 +6917,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine פיקסלים לסנטימטר + ppcm ‏{0} + ppcm ‏{0} + ppcm ‏{0} + ppcm ‏{0} פיקסלים לאינץ׳ @@ -6700,9 +6931,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ נקודות לסנטימטר + {0} נקודות לסנטימטר + {0} נקודות לסנטימטר + {0} נקודות לסנטימטר + {0} נקודות לסנטימטר + + + נקודות לאינץ׳ + {0} נק׳ לאינץ׳ + dpi ‏{0} + {0} נק׳ לאינץ׳ נקודות קטנות + נקודה קטנה אחת ({0}) + {0} נקודות קטנות + {0} נקודות קטנות + {0} נקודות קטנות רדיוס כדור-הארץ @@ -6836,7 +7081,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - {0} נקודה + נקודה אחת ({0}) {0} נקודות {0} נקודות {0} נקודות @@ -7027,6 +7272,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} מילימטר כספית {0} מילימטר כספית + + כספית + {0} כספית + {0} כספית + {0} כספית + פאונד לאינץ׳ רבוע פאונד {0} לאינץ׳ רבוע @@ -7054,7 +7305,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - אטמוספרות + אטמוספירות {0} אטמוספרה {0} אטמוספרה {0} אטמוספרה @@ -7288,6 +7539,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} כ׳ מידה מטרית {0} כ׳ מידה מטרית + + אונקיית נוזל + {0} אונקיית נוזל + {0} fl oz m. + {0} אונקיית נוזל + אקר-רגל {0} אקר-רגל @@ -7413,14 +7670,61 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} קווארטות אימפריאליות {0} קווארטות אימפריאליות + + סטרדיאן + {0} סטרדיאן + {0} סטרדיאן + {0} סטרדיאן + + + קטאל + {0} קטאל + {0} קטאל + {0} קטאל + + + קולון + + + פאראד + + + הנרי + + + סימנס + + + קלוריה-IT + + + בקרל + {0} בקרל + {0} בקרל + {0} בקרל + + + קילוגרם כוח + {0} קילוגרם כוח + {0} קילוגרם כוח + {0} קילוגרם כוח + + + טסלה + {0} טסלה + {0} טסלה + {0} טסלה + + + ובר + {0} ובר + {0} ובר + {0} ובר + masculine - אור - {0} אור - {0} אור - {0} אור - + masculine חלקים למיליארד {0} חלקים למיליארד @@ -7429,11 +7733,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - לילות - {0} לילה - {0} לילות - {0} לילות - {0}/לילה רוחות השמיים @@ -7546,9 +7845,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ הקטאר - {0} ha - {0} ha - {0} ha מ״ר @@ -7569,7 +7865,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} sq mi {0} sq mi {0} sq mi - {0}/mi² אקר @@ -7579,43 +7874,36 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ yards² - {0} yd² - {0} yd² - {0} yd² {0} sq ft {0} sq ft {0} sq ft - - {0} in² - {0} in² - {0} in² - {0}/in² - דונם {0} דונם {0} דונם {0} דונם - - {0} kt - {0} kt - {0} kt - - - {0} mg/dL - {0} mg/dL - {0} mg/dL - פריט {0} פריט {0} פריטים {0} פריטים + + חלק + {0} חלק + {0} חלקים + {0} חלק + + + גלוקוז + {0} גלוקוז + {0} Glc + {0} Glc + ליטרים/ק״מ {0} ל׳/ק״מ @@ -7637,11 +7925,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ miles/gal Imp. + + PB‏{0} + PB‏{0} + PB‏{0} + PB‏{0} + + + TB‏{0} + {0} TB + {0} TB + + + Tb‏{0} + Tb‏{0} + Tb‏{0} + Tb‏{0} + + + GB‏{0} + {0} GB + {0} GB + Gbit + Gb‏{0} + {0} Gb + {0} Gb + + + MB‏{0} + {0} MB + {0} MB Mbit + Mb‏{0} + {0} Mb + {0} Mb + + + kB‏{0} + {0} kB + {0} kB + + + kb‏{0} + {0} kb + {0} kb בייט @@ -7729,7 +8060,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ amps - ohms + אוהם וולט @@ -7760,42 +8091,50 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ קוט״ש/100 ק״מ {0} קוט״ש/100 ק״מ {0} קוט״ש/100 ק״מ - {0} קוט״ש/100 ק״מ {0} קוט״ש/100 ק״מ - - {0} em - {0} em - {0} em - - {0} px - {0} px - {0} px + px ‏{0} + px ‏{0} + px ‏{0} - {0} MP - {0} MP - {0} MP + MP ‏{0} + MP ‏{0} + MP ‏{0} - {0} ppcm - {0} ppcm - {0} ppcm + ppcm ‏{0} + ppcm ‏{0} + ppcm ‏{0} + ppcm ‏{0} - {0} ppi - {0} ppi - {0} ppi + ppi ‏{0} + ppi ‏{0} + ppi ‏{0} + ppi ‏{0} + + + dpcm + dpcm‏ {0} + dpcm‏ {0} + dpcm‏ {0} + dpcm‏ {0} dpi - {0} ppi - {0} ppi - {0} dpi + ppi ‏{0} + dpi ‏{0} + dpi ‏{0} + dpi ‏{0} נקודה קטנה + נק' קטנה אחת ({0}) + {0} נק' קטנות + {0} נק' קטנות + {0} נק' קטנות ק״מ @@ -7830,16 +8169,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} מ״מ {0} מ״מ - - {0} μm - {0} μm - {0} μm - - - {0} nm - {0} nm - {0} nm - פ״מ {0} פ“מ @@ -7860,34 +8189,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ רגל - {0} ft - {0} ft - {0} ft {0} ‎/ft אינץ׳ - {0} in - {0} in - {0} in {0} ‎/in - - {0} pc - {0} pc - {0} pc - שנות אור {0} שנת אור {0} שנות אור {0} שנות אור - - {0} au - {0} au - {0} au - מ״י מ״י אחד @@ -8010,9 +8323,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} קמ״ק - {0} m³ - {0} m³ - {0} m³ + {0} מ"ק + {0} מ"ק + {0} מ"ק + {0} מ"ק סמ״ק @@ -8021,36 +8335,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} סמ״ק {0}/סמ״ק - - {0} mi³ - {0} mi³ - {0} mi³ - - - {0} yd³ - {0} yd³ - {0} yd³ - feet³ - {0} ft³ - {0} ft³ - {0} ft³ - - - {0} in³ - {0} in³ - {0} in³ - - - {0} ML - {0} ML - {0} ML - - - {0} hL - {0} hL - {0} hL ליטר @@ -8065,32 +8351,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} דצ״ל {0} דצ״ל - - {0} cL - {0} cL - {0} cL - מ״ל {0} מ״ל {0} מ״ל {0} מ״ל - - {0} mpt - {0} mpt - {0} mpt - - - {0} mc - {0} mc - {0} mc - - - {0} ac ft - {0} ac ft - {0} ac ft - גלון {0} גל׳ @@ -8107,15 +8373,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qts - {0} qt - {0} qt - {0} qt פינט - {0} pt - {0} pt - {0} pt כוסות @@ -8129,11 +8389,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} fl oz {0} fl oz - - {0} fl oz Imp. - {0} fl oz Imp. - {0} fl oz Imp. - כפות {0} כפ׳ @@ -8146,11 +8401,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} כפי׳ {0} כפי׳ - - {0} bbl - {0} bbl - {0} bbl - טיפה טיפה @@ -8163,6 +8413,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} פינץ' {0} פינץ' + + קלוריה-IT + + + ק״ג-כוח + {0} ק"ג כוח + {0} ק"ג כוח + {0} ק"ג כוח + אור {0} אור @@ -8203,17 +8462,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} שנ׳ {0} שנ׳ - - {0} קמ״ר - {0} קמ״ר - {0} קמ״ר - {0} פריט {0} פר' {0} פר' {0} פר' + + חלק + {0} חלק + {0} חלקים + {0} חלקים + + + גלוקוז + {0} גלוקוז + {0} Glc + {0} Glc + ל׳/100ק״מ {0}ל׳/100ק״מ @@ -8221,6 +8487,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ל׳/100ק״מ {0}ל׳/100ק״מ + + PB‏{0} + PB‏{0} + PB‏{0} + PB‏{0} + + + TB‏{0} + TB‏{0} + TB‏{0} + TB‏{0} + + + Tb‏{0} + Tb‏{0} + Tb‏{0} + Tb‏{0} + + + GB‏{0} + {0} GB + {0} GB + + + MB‏{0} + {0} MB + {0} MB + + + Mb‏{0} + {0} Mb + {0} Mb + + + kB‏{0} + {0} kB + {0} kB + + + B‏{0} + B‏{0} + B‏{0} + B‏{0} + + + bit‏{0} + {0} ביט + {0} ביט + ש׳ {0} ש′ @@ -8255,6 +8570,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ns + + אוהם + קל׳ @@ -8265,8 +8583,43 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kWh/100km {0} kWh + + px ‏{0} + px ‏{0} + px ‏{0} + px ‏{0} + + + MP ‏{0} + MP ‏{0} + MP ‏{0} + MP ‏{0} + + + ppcm‏{0} + ppcm‏{0} + ppcm‏{0} + ppcm‏{0} + + + ppi ‏{0} + ppi ‏{0} + ppi ‏{0} + ppi ‏{0} + + + dpcm + ‎dpcm‏{0} + ‎dpcm‏{0} + ‎dpcm‏{0} + ‎dpcm‏{0} + נקודה + נק' קטנה אחת ({0}) + {0} נק' קטנות + {0} נק' קטנות + {0} נק' קטנות מטר @@ -8310,6 +8663,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} B {0} B + + {0} מ"ק + {0} מ"ק + {0} מ"ק + {0} מ"ק + {0}/galIm {0}/galIm @@ -8323,6 +8682,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dsp-Imp {0}dsp-Imp + + קל׳-IT + + + ק״ג-כוח + {0} ק"ג כוח + {0} ק"ג כוח + {0} ק"ג כוח + diff --git a/make/data/cldr/common/main/hi.xml b/make/data/cldr/common/main/hi.xml index 649bddacab6..55b7aad3b28 100644 --- a/make/data/cldr/common/main/hi.xml +++ b/make/data/cldr/common/main/hi.xml @@ -229,7 +229,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ इबान इबिबियो इंडोनेशियाई - ईन्टरलिंगुइ + इंटरलिंग ईग्बो सिचुआन यी इनुपियाक् @@ -287,6 +287,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ बफिआ कोलोनियाई कुर्दिश + कुर्दिश + कुर्दिश कुमीक क्यूतनाई कोमी @@ -306,7 +308,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ लिगुरियन लिलोएट लैकोटा - लॉमबर्ड + लोम्बार्ड लिंगाला लाओ मोंगो @@ -537,7 +539,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ तुवीनियन मध्य एटलस तमाज़ित उदमुर्त - उइगर + उईग़ूर युगैरिटिक यूक्रेनियाई उम्बुन्डु @@ -546,7 +548,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ उज़्बेक वाई वेन्दा - वनीशन + वेनीशियन वियतनामी मखुवा वोलापुक @@ -599,7 +601,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + @@ -827,6 +829,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ चीन कोलंबिया क्लिपर्टन द्वीप + सार्क कोस्टारिका क्यूबा केप वर्ड @@ -1081,33 +1084,53 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ संख्यात्मक वर्गीकरण वर्गीकरण सशक्तता मुद्रा + इमोजी का प्रज़ेंटेशन घंटों का चक्र (12 बनाम 24) पंक्ति विच्छेद शैली + शब्दों के बीच पंक्ति विच्छेद मापन प्रणाली संख्याएँ + संक्षेपण के बाद वाक्य विच्छेद समय क्षेत्र स्थानीय प्रकार निजी-उपयोग बौद्ध पंचांग + बौद्ध चीनी पंचांग + चीनी कॉप्टिक कैलेंडर + कॉप्टिक दांगी कैलेंडर + दांगी इथियोपिक कैलेंडर + इथियोपिक इथियोपिक अमेते अलेम कैलेंडर + इथियोपिक अमेते अलेम ग्रेगोरियन कैलेंडर + ग्रेगोरियन हिब्रू पंचांग + हिब्रू भारतीय राष्ट्रीय कैलेंडर + भारतीय राष्ट्रीय हिजरी कैलेंडर + हिजरी हिजरी नागरिक कैलेंडर + हिजरी (टेबुलर, नागरिक शैली) हिजरी कैलेंडर (उम्म अल-क़ुरा) + हिजरी (उम्म अल-क़ुरा) आईएसओ-8601 कैलेंडर जापानी पंचांग + जापानी फ़ारसी कैलेंडर + फ़ारसी चीनी गणतंत्र पंचांग + चीनी गणतंत्र लेखांकन मुद्रा प्रारूप + लेखांकन मानक मुद्रा प्रारूप + मानक प्रतीकों को क्रमित करें प्रतीकों पर ध्यान न देकर क्रमित करें उच्‍चारणों को सामान्‍य रूप से क्रमित करें @@ -1117,22 +1140,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ पहले अपरकेस क्रमित करें केस असंवेदी क्रमित करें केस संवेदी को क्रमित करें - पारम्परिक चीनी वर्गीकरण क्रम संगतता के लिए पिछला वर्गीकरण क्रम + संगतता शब्दकोश वर्गीकरण क्रम + शब्दकोश डिफ़ॉल्ट यूनिकोड वर्गीकरण क्रम + डिफ़ॉल्ट यूनिकोड यूरोपीय क्रमण नियम - सरलीकृत चीनी वर्गीकरण क्रम फ़ोनबुक वर्गीकरण क्रम + फ़ोनबुक ध्वन्यात्मक वर्गीकरण क्रम + ध्वन्यात्मक पिनयिन वर्गीकरण क्रम + पिनयिन सामान्य-उद्देश्य खोज + खोज हांगुल आरंभिक व्‍यंजन द्वारा खोजें मानक वर्गीकरण क्रम + मानक स्ट्रोक वर्गीकरण क्रम + स्ट्रोक पारंपरिक वर्गीकरण क्रम + पारंपरिक रेडिकल-स्ट्रोक वर्गीकरण क्रम - ज़ूयन वर्गीकरण + रेडिकल-स्ट्रोक + ज़ूइन वर्गीकरण क्रम + ज़ूइन बिना सामान्‍यीकरण के क्रमित करें यूनिकोड सामान्‍यीकृत क्रमित करें अंको को अलग-अलग क्रमित करें @@ -1145,18 +1178,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ पूर्ण-चौड़ाई आधी-चौड़ाई सांख्यिक + डिफ़ॉल्ट + इमोजी + टेक्स्ट 12 घंटों की प्रणाली (0–11) + 12 (0–11) 12 घंटों की प्रणाली (1–12) + 12 (1–12) 24 घंटों की प्रणाली (0–23) + 24 (0–23) 24 घंटों की प्रणाली (1–24) + 24 (1–24) ढीली पंक्ति विच्छेद शैली + ढीली सामान्य पंक्ति विच्छेद शैली + सामान्य सख्त पंक्ति विच्छेद शैली + स्ट्रिक्ट + सभी को विच्छेद करें + किसी को विच्छेद न करें + सामान्य + वाक्यांशो के ज़रिए विच्छेद करें BGN लिप्यंतरण UNGEGN लिप्यंतरण मेट्रिक प्रणाली + मेट्रिक इम्पीरियल मापन प्रणाली + यू॰के॰ अमेरिकी मापन प्रणाली + यू॰एस॰ अरबी-भारतीय अंक विस्तृत अरबी-भारतीय अंक आर्मेनियाई संख्याएँ @@ -1201,6 +1251,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ तिब्बती अंक परंपरागत अंक वाई अंक + बंद + चालू मीट्रिक @@ -1222,9 +1274,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1376,7 +1425,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E B h:mm E B h:mm:ss d E + M/y G GGGGG d/M/y + E, M/d/y G G d MMM y G E, d MMM y M @@ -2544,11 +2595,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} डेलाइट समय {0} मानक समय - - एचएसटी - एचएसटी - HST - होनोलुलु @@ -2901,6 +2947,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ईस्टर + + कॉयहेक + पुंटा एरिनास @@ -3166,9 +3215,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ नॉम पेन्ह - एंडरबरी - - कैंटन @@ -3838,9 +3884,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - पश्चिम अफ़्रीका समय - पश्चिम अफ़्रीका मानक समय - पश्चिम अफ़्रीका ग्रीष्मकालीन समय + पश्चिम अफ़्रीका समय @@ -4197,6 +4241,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ गुयाना समय + + + हवाई–आल्यूशन मानक समय + + हवाई–आल्यूशन समय @@ -4799,8 +4848,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##,##0.00 - ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 @@ -4822,7 +4871,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤00 लाख ¤ 00 लाख ¤0 क॰ - ¤0 क॰ + ¤ 0 क॰ ¤0 क॰ ¤ 0 क॰ ¤00 क॰ @@ -5421,6 +5470,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ पूर्वी कैरिबियाई डॉलर + + कैरीबियन गिल्डर + कैरीबियन गिल्डर + कैरीबियन गिल्डर + यूरोपीय मुद्रा इकाई @@ -5447,6 +5501,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ज़ाम्बियन क्वाचा + + ज़िंबाब्वियन गोल्ड + ज़िंबाब्वियन गोल्ड + ज़िंबाब्वियन गोल्ड + {0}+ @@ -5692,11 +5751,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - मिलिग्राम प्रति डेसीलीटर - {0} मिलिग्राम प्रति डेसीलीटर - {0} मिलिग्राम प्रति डेसीलीटर - {0} मिलिग्राम प्रति डेसीलीटर - {0} मिलिग्राम प्रति डेसीलीटर + मिलीग्राम प्रति डेसीलीटर + {0} मिलीग्राम प्रति डेसीलीटर + {0} मिलीग्राम प्रति डेसीलीटर + {0} मिलीग्राम प्रति डेसीलीटर + {0} मिलीग्राम प्रति डेसीलीटर masculine @@ -5709,7 +5768,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - + + भाग + {0} भाग + {0} भागों + + masculine {0} हिस्सा प्रति दस लाख {0} हिस्सा प्रति दस लाख @@ -5741,6 +5805,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + + ग्लूकोज़ + {0} ग्लूकोज़ + {0} ग्लूकोज़ + masculine लीटर प्रति किलोमीटर @@ -6413,15 +6482,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मर्क्यूरी मिलीमीटर {0} मर्क्यूरी मिलीमीटर + + मर्क्यूरी + {0} मर्क्यूरी + {0} मर्क्यूरी + पाउंड प्रति वर्ग इंच {0} पाउंड प्रति वर्ग इंच {0} पाउंड प्रति वर्ग इंच - मर्करी इंच - {0} मर्करी इंच - {0} मर्करी इंच + मर्क्यूरी इंच + {0} मर्क्यूरी इंच + {0} मर्क्यूरी इंच masculine @@ -6636,6 +6710,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + + मेट्रिक फ़्लूड आउंस + {0} मेट्रिक फ़्लूड आउंस + {0} मेट्रिक फ़्लूड आउंस + {0} एकड़ फ़ूट {0} एकड़ फ़ीट @@ -6727,15 +6806,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} क्वार्ट इम्पीरियल {0} क्वार्ट इम्पीरियल + + स्टेरेडियन + {0} स्टेरेडियन + {0} स्टेरेडियन + + + कैटाल + {0} कैटाल + {0} कैटाल + + + कूलाम + {0} कूलाम + {0} कूलाम + + + फैरड + {0} फैरड + {0} फैरड + + + हेनरी + {0} हेनरी + {0} हेनरी + + + सीमेंस + {0} सीमेंस + {0} सीमेंस + + + calories [IT] + {0} calorie [IT] + {0} calories [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + किलोग्राम-फ़ोर्स + {0} किलोग्राम-फ़ोर्स + {0} किलोग्राम-फ़ोर्स + + + टेस्ला + {0} टेस्ला + {0} टेस्ला + + + वेबर + {0} वेबर + {0} वेबर + feminine - लाइट - {0} लाइट - {0} लाइट - {0} लाइट - {0} लाइट - + masculine पार्ट्स प्रति बिलियन {0} पार्ट प्रति बिलियन @@ -6745,11 +6884,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - रातें - {0} रात - {0} रात - {0} रातें - {0} रातें {0} प्रति रात @@ -6958,7 +7092,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} आइटम {0} आइटम - + + भाग + {0} भाग + {0} भाग + + हिस्सा प्रति दस लाख @@ -6972,6 +7111,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मोल {0} मोल + + Glc + लीटर/किमी {0} ली/किमी @@ -7306,6 +7448,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ वॉट + + {0} Hg + {0} Hg + बार {0} बार @@ -7444,6 +7590,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मीट्रिक कप {0} मीट्रिक कप + + मेट्रिक फ़्लूड आउंस + {0} fl oz m. + {0} fl oz m. + एकड़ फ़ीट {0} ए॰फ़ी॰ @@ -7536,12 +7687,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} क. इम्पी. {0} क. इम्पी. + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + लाइट {0} लाइट {0} लाइट - + पार्ट्स/बिलियन @@ -7671,7 +7855,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/वर्ग किमी - हे + हे॰ वर्ग मी @@ -7703,12 +7887,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} व इं {0} व इं - + + भाग + {0} भाग + {0} भाग + + ppm % + + Glc + {0} ली/100 किमी {0} ली/100 किमी @@ -7889,15 +8081,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} वॉ {0} वॉ - - {0} मिवॉ - {0} मिवॉ - {0} एचपी {0} एचपी + + {0} Hg + {0} Hg + + ″ Hg {0}" Hg {0}" Hg @@ -7905,18 +8098,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mb {0}mb - - {0}hPa - {0} hPa - {0} किमी/घं {0} किमी/घं - - {0} मी/से - {0}मी॰/से॰ - {0} मीप्रघं {0} मीप्रघं @@ -7980,6 +8165,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मिली {0} मिली + + मेट्रिक फ़्लूड आउंस + {0} एकड़ फ़ीट {0} एकड़ फ़ीट @@ -8046,16 +8234,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt-Imp. {0} qt-Imp. - - लाइट - {0} लाइट - {0} लाइट + + cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy - रातें {0}रात {0}रातें - {0}/रात diff --git a/make/data/cldr/common/main/hi_Latn.xml b/make/data/cldr/common/main/hi_Latn.xml index a3a8493c029..707b6a6cc65 100644 --- a/make/data/cldr/common/main/hi_Latn.xml +++ b/make/data/cldr/common/main/hi_Latn.xml @@ -20,7 +20,6 @@ annotations. Afreeki Hariyaanvi - Bangla Tibbati Kurdish, Sorani Crimean Turkish @@ -37,10 +36,8 @@ annotations. - - @@ -122,10 +119,13 @@ annotations. 24 Hour System (1–24) Sabhi Words mein Line Breaks allow karein Sabhi Words mein Line Breaks se bachein + Sabhi rakhein Words ke liye normal Line Breaks Phrases mein Line Breaks se bachein + Phrases mein rakhein Bangla Digits Chinese Decimal Numbers + Positional decimal system ke liye digits ke taur par Chinese number ideographs kaa use Simplified Chinese Numbers Simplified Chinese Financial Numbers Traditional Chinese Numbers @@ -195,6 +195,9 @@ annotations. {1}, {0} 'par' + + {1} {0} 'par' + @@ -203,6 +206,9 @@ annotations. {1}, {0} 'par' + + {1} {0} 'par' + @@ -216,6 +222,10 @@ annotations. h:mm.ss B + E, B h + E, h a + h a, v + HH'h', v d/M/y GGGGG @@ -444,7 +454,10 @@ annotations. {1}, {0} - {1}, {0} 'baje' + {1}, {0} 'par' + + + {1}, {0} 'par' @@ -452,7 +465,10 @@ annotations. {1}, {0} - {1}, {0} 'baje' + {1}, {0} 'par' + + + {1}, {0} 'par' @@ -466,11 +482,10 @@ annotations. - G y - G y MMM - G y, d MMM - G y, dd MMM, E - G y, dd MMMM, E + E, B h + E, h a + EEEE, d MMM, y G + h a, v MMMM 'kaa' 'week' W MMMM 'kaa' 'week' W d MMM, y @@ -1176,9 +1191,6 @@ annotations. - - HST - Honolulu @@ -1294,6 +1306,14 @@ annotations. + + + + ¤ #,##,##0.00 + #,##,##0.00 + + + @@ -1361,6 +1381,11 @@ annotations. {0} percent {0} percent + + glucose level + {0} kaa glucose level + {0} kaa glucose level + miles per Imp. gallon {0} mile per Imp. gallon @@ -1419,6 +1444,11 @@ annotations. {0} millimetre mercury {0} millimetres mercury + + mercury level + {0} kaa mercury level + {0} kaa mercury level + {0} inch mercury {0} inches mercury @@ -1491,6 +1521,11 @@ annotations. {0} CD {0} CD + + Hg level + {0} kaa Hg level + {0} kaa Hg level + {0} bar {0} bars @@ -1538,9 +1573,6 @@ annotations. - - μ {0} - karat {0}kt @@ -1578,6 +1610,11 @@ annotations. {0}# {0}# + + Hg level + {0} kaa Hg level + {0} kaa Hg level + {0}bar {0}bars diff --git a/make/data/cldr/common/main/hr.xml b/make/data/cldr/common/main/hr.xml index 35c73535771..b4f4f75021f 100644 --- a/make/data/cldr/common/main/hr.xml +++ b/make/data/cldr/common/main/hr.xml @@ -297,6 +297,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kelnski kurdski + kurdski + kurmanji kumyk kutenai komi @@ -857,6 +859,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kina Kolumbija Otok Clipperton + Sark Kostarika Kuba Zelenortska Republika @@ -887,7 +890,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Falklandski Otoci Falklandski Otoci (Malvini) Mikronezija - Ovčji Otoci + Farski Otoci Francuska Gabon Ujedinjeno Kraljevstvo @@ -1142,33 +1145,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ brojčano ravrstavanje jačina razvrstavanja valuta + Prezentacija emojija format vremena (12 ili 24) stil prijeloma retka + Prijelomi redaka unutar riječi sustav mjernih jedinica brojevi + Prijelom rečenice nakon kratice Vremenska zona Varijanta zemlje/jezika Privatna upotreba budistički kalendar + budistički kineski kalendar + kineski koptski kalendar + koptski dangi kalendar + dangi etiopski kalendar + etiopski etiopski kalendar "Amete Alem" + etiopski "Amete Alem" gregorijanski kalendar + gregorijanski hebrejski kalendar + hebrejski indijski nacionalni kalendar hijri kalendar + hijri hijri kalendar (tabularni, civilna epoha) + hijri (tabularni, civilna epoha) hijri kalendar (Umm al-Qura) + hijri (Umm al-Qura) ISO-8601 kalendar japanski kalendar + japanski perzijski kalendar + perzijski kalendar Republike Kine + minguo računovodstveni format valute + računovodstveno standardni format valute + standardno Poredaj simbole Poredaj zanemarujući simbole Poredaj naglaske normalno @@ -1178,22 +1200,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Poredaj prvo velika slova Poredaj zanemarujući veličinu Poredaj u skladu s veličinom slova - razvrstavanje prema tradicionalnom kineskom - Big5 prethodni redoslijed razvrstavanja, radi kompatibilnosti + kompatibilnost rječničko razvrstavanje + rječnik standardno unicode razvrstavanje + standardni Unicode Europska pravila razvrstavanja - razvrstavanje prema pojednostavljenom kineskom - GB2312 razvrstavanje po abecedi + telefonski imenik fonetsko razvrstavanje + fonetski pinyin razvrstavanje + pinyin općenito pretraživanje + pretraživanje Pretraživanje po početnom suglasniku hangula standardno razvrstavanje + standardno razvrstavanje po redoslijedu poteza za kineski + potez tradicionalno razvrstavanje + tradicionalno razvrstavanje prema korijenu i potezu + korijen i potez zhuyin razvrstavanje + zhuyin Poredaj bez normalizacije Poredaj unikod normalizirano Poredaj znamenke pojedinačno @@ -1206,18 +1238,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ široki uski Numerički + standardno + emoji + tekst 12-satni format (0 – 11) + 12 (0 – 11) 12-satni format (0 – 12) + 12 (1 – 12) 24-satni format (0 – 23) + 24 (0 – 23) 24-satni format (1 – 24) + 24 (0 – 24) slobodni stil prijeloma retka + slobodni normalni stil prijeloma retka + normalni strogi stil prijeloma retka + strogi + prijelom svega + zadrži sve + normalno + zadrži u frazama transliteracija prema BGN-u transliteracija prema UNGEGN-u metrički sustav + metrički imperijalni sustav mjera + UK američki sustav mjera + SAD arapsko-indijske znamenke proširene arapsko-indijske znamenke armenski brojevi @@ -1262,6 +1311,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tibetske znamenke Tradicionalni brojevi vai znamenke + isključeno + uključeno metrički sustav @@ -1306,9 +1357,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1405,6 +1453,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -1413,16 +1464,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + {1} {0} + + {1}, {0} + {1} {0} + + {1}, {0} + d. @@ -1430,13 +1490,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y. G + M. y. G d. M. y. GGGGG + G dd. MM. y., E LLL y. G d. MMM y. G E, d. MMM y. G hh a hh:mm a hh:mm:ss a + HH 'h' v L. dd. MM. E, dd. MM. @@ -1458,11 +1521,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1816,6 +1877,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + @@ -1824,16 +1888,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'u' {0} + + {1} 'u' {0} + {1} {0} + + {1}, {0} + {1} {0} + + {1}, {0} + d. @@ -1841,15 +1914,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y. G + MM. y. G d. M. y. GGGGG + E, dd. MM. y., G LLL y. G d. MMM y. G E, d. MMM y. G - h a hh:mm a hh:mm:ss a h:mm:ss a v h:mm a v + HH 'h' v L. dd. MM. E, dd. MM. @@ -1881,11 +1956,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1931,7 +2004,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, dd. MMM y. – E, dd. MMM y. G - h a – h a h – h 'h' a @@ -1956,7 +2028,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h 'h' a v @@ -2882,9 +2953,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angvila - - Tirana - Erevan @@ -3012,9 +3080,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biškek - - Enderbury - Pjongjang @@ -3069,9 +3134,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bahia Banderas - - Ciudad de México - Merida @@ -3165,9 +3227,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damask - - Lomé - Dušanbe @@ -3227,9 +3286,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - zapadnoafričko vrijeme - zapadnoafričko standardno vrijeme - zapadnoafričko ljetno vrijeme + zapadnoafričko vrijeme @@ -3635,6 +3692,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ gvajansko vrijeme + + + havajsko-aleutsko standardno vrijeme + + havajsko-aleutsko vrijeme @@ -4085,6 +4147,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ vrijeme Chuuka + + + tursko vrijeme + tursko standardno vrijeme + tursko ljetno vrijeme + + turkmenistansko vrijeme @@ -4260,6 +4329,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -5975,6 +6048,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ istočnokaripskih dolara XCD + + karipski gulden + karipski gulden + karipska guldena + karipskih guldena + posebna crtaća prava posebno crtaće pravo @@ -6133,6 +6212,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabveanska dolara (1980.–2008.) zimbabveanskih dolara (1980.–2008.) + + zimbabveansko zlato + zimbabveansko zlato + zimbabveanska zlata + zimbabveanskih zlata + zimbabveanski dolar (2009) zimbabveanski dolar (2009) @@ -6268,8 +6353,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ četvorni {0} četvornog {0} četvornim {0} - četvorni {0} - četvorni {0} + četvorna {0} + četvornu {0} četvorne {0} četvornom {0} četvorni {0} @@ -6280,10 +6365,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ četvorna {0} četvorna {0} četvorna {0} - četvorna {0} - četvorna {0} - četvorna {0} - četvorna {0} + četvorne {0} + četvorne {0} + četvorne {0} + četvorne {0} četvorna {0} četvorna {0} četvorna {0} @@ -6307,8 +6392,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kubni {0} kubnog {0} kubnim {0} - kubni {0} - kubni {0} + kubne {0} + {0} kubnu kubne {0} kubnom {0} kubni {0} @@ -6320,9 +6405,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kubna {0} kubna {0} kubne {0} - kubna {0} - kubna {0} - kubna {0} + kubne {0} + kubne {0} + kubne {0} kubna {0} kubna {0} kubna {0} @@ -6602,7 +6687,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} stavki {0} stavki - + + dijelovi + {0} dio + {0} dijela + {0} dijelova + + inanimate dijelovi na milijun {0} dio na milijun @@ -6682,6 +6773,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mola {0} mola + + glukoze + {0} glukoze + {0} glukoze + {0} glukoze + feminine litre po kilometru @@ -8002,7 +8099,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetar živina stupca {0} milimetar živina stupca {0} milimetar živina stupca - {0} milimetar živina stupca + {0} milimetrom živina stupca {0} milimetra živina stupca {0} milimetra živina stupca {0} milimetra živina stupca @@ -8012,6 +8109,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetara živina stupca {0} milimetara živina stupca + + žive + {0} žive + {0} žive + {0} žive + funte po kvadratnom inču {0} funta po kvadratnom inču @@ -8447,6 +8550,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metričkih šalica {0} metričkih šalica + + tekuće unce + {0} tekuća unca + {0} tekuće unce + {0} tekućih unci + aker-stope {0} aker-stopa @@ -8546,9 +8655,86 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imperijalne četvrtine {0} imperijalne četvrtine + + steradijani + {0} steradijan + {0} steradijana + {0} steradijana + + + katali + {0} katal + {0} katala + {0} katala + + + kuloni + {0} kulon + {0} kulona + {0} kulona + + + faradi + {0} farad + {0} farada + {0} farada + + + henriji + {0} henri + {0} henrija + {0} henrija + + + simensi + {0} S + {0} S + {0} S + + + kalorije [IT] + {0} kalorija [IT] + {0} kalorije [IT] + {0} kalorija [IT] + + + bekereli + {0} bekerel + {0} bekerela + {0} bekerela + + + siverti + {0} sivert + {0} siverta + {0} siverta + + + greji + {0} grej + {0} greja + {0} grejeva + + + kilogram-sila + {0} kilogram-sila + {0} kilogram-sile + {0} kilogram-sila + + + tesle + {0} tesla + {0} tesle + {0} tesla + + + veberi + {0} veber + {0} vebera + {0} vebera + neuter - svjetlo {0} svjetlo {0} svjetlo {0} svjetla @@ -8562,7 +8748,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} svjetala {0} svjetala - + inanimate dijelovi na milijardu {0} dio na milijardu @@ -8593,7 +8779,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} noći {0} noći {0} noći - {0}/noć kardinalni smjer @@ -8661,6 +8846,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} stavke {0} stavki + + dio + {0} dio + {0} dijela + {0} dijelova + {0} % {0} % @@ -8681,6 +8872,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mola {0} mola + + Glc + {0} Glc + {0} Glc + {0} Glc + l/km {0} l/km @@ -8876,6 +9073,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} KS {0} KS + + {0} Hg + {0} Hg + {0} Hg + {0} bar {0} bara @@ -9003,13 +9205,79 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} prstohvata {0} prstohvata + + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + + + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + + + cal [IT] + {0} cal [IT] + {0} cal [IT] + {0} cal [IT] + + + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + svjetlo {0} svjetlo {0} svjetla {0} svjetala - + dijelovi/milijarda @@ -9037,11 +9305,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dunam + + dio + {0} dio + {0} dijela + {0} dijelova + {0} mol {0} mola {0} mola + + Glc + {0} Glc + {0} Glc + {0} Glc + {0}l/100km {0}l/100km @@ -9091,6 +9371,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Da + + {0} Hg + {0} Hg + {0} Hg + {0} mb {0} mb @@ -9125,21 +9410,71 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} jiggera {0} jiggera - - svjetlo - {0} svjetlo - {0} svjetla - {0} svjetala + + {0} sr + {0} sr + {0} sr - - dijelovi/milijarda + + {0} kat + {0} kat + {0} kat - - noć - {0} noć - {0} noći - {0} noći - {0}/noć + + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + + + cal [IT] + {0} cal [IT] + {0} cal [IT] + {0} cal [IT] + + + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb {0}I diff --git a/make/data/cldr/common/main/hsb.xml b/make/data/cldr/common/main/hsb.xml index f3c8138cc6d..af2ffc5ce6c 100644 --- a/make/data/cldr/common/main/hsb.xml +++ b/make/data/cldr/common/main/hsb.xml @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic aymaršćina azerbajdźanšćina baškiršćina + balučišćina balinezišćina basaa běłorušćina @@ -229,6 +230,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafia kelnšćina kurdišćina + kurdišćina + kurmandźišćina kumykšćina komišćina kornišćina @@ -621,6 +624,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic China Kolumbiska Clippertonowa kupa + Sark Kosta Rika Kuba Kap Verde @@ -848,42 +852,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic format měny rjadowanski slěd měna + předstajenje emojija hodźinowy cyklus (12 vs 24) system łamanja linkow + łamanje linki w słowje system měrow ličby + přetorhnjenje sady po skrótšence buddhistiska protyka + buddhistiska chinska protyka + chinska koptiska protyka + koptiska dangi-protyka + dangiska etiopiska protyka + etiopiska etiopiska amete-alem-protyka + etiopiska Amete-Alem gregorianska protyka + gregorianiska židowska protyka + hebrejska islamska protyka + hijri islamska ciwilna protyka + islamska ciwilna islamska umalqura-protyka + islamska Umm al-Qura protyka po iso-8601 japanska protyka + japanska persiska protyka + persiska protyka republiki China + minguo knihiwjedniski format měny + knihiwjednistwo standardny format měny + standard rjadowanski slěd po Unicode + standardne unicode-rjadowanje powšitkowne pytanje + pytaj standardowy rjadowanski slěd + standardne + default + emoji + tekst 12-hodźinowy cyklus (0-11) + 12 (0–11) 12-hodźinowy cyklus (1-12) + 12 (1–12) 24-hodźinowy cyklus (0-23) + 24 (0–23) 24-hodźinowy cyklus (1-24) + 24 (1–24) swobodny stil łamanja linkow + wólny běžny stil łamanja linkow + běžny kruty stil łamanja linkow + kruty + łamaj wšitko + zdźerž wšitko + normalne + w sadach metriski system + metriski britiski system měrow + britiski ameriski system měrow + ameriski arabsko-indiske cyfry rozšěrjene arabsko-indiske cyfry armenske cyfry @@ -924,6 +967,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic thailandske cyfry tibetske cyfry vaiske cyfry + + haj metriski @@ -941,6 +986,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic [áàăâåäãąā æ ç ďđ éèĕêëėęē ğ íìĭîïİī ı ĺľ ňñ òŏôöőøō œ ŕ śş ß ť úùŭûůüűū ýÿ ż ź] [A B C Č Ć D {DŹ} E F G H {CH} I J K Ł L M N O P Q R S Š T U V W X Y Z Ž] [\- ‐‑ – — , ; \: ! ? . … '‘’‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + [\- ‐‑ , . * / † ⚭] @@ -1004,13 +1050,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic h 'hodź'. B + E h 'hodź'. B E, d. + E h 'hodź'. a E h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M/y G d.M.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMM y G @@ -1018,6 +1068,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH 'hodź'. h:mm a h:mm:ss a + h 'hodź'. a v + HH 'hodź'. v d.M. E, d.M. d. MMM @@ -1365,6 +1417,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'w' {0} + + {1} 'w' {0} + @@ -1373,6 +1428,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'w' {0} + + {1} 'w' {0} + @@ -1385,14 +1443,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic + h 'hodź'. B d. + E, h 'hodź'. B E, d. E, h:mm a E, H:mm 'hodź'. E, h:mm:ss a E, HH:mm:ss y G + M/y G d.M.y GGGGG + E, d.M.y G MMM y G d. MMM y G E, d. MMM y G @@ -1404,6 +1466,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic H:mm:ss H:mm:ss v H:mm v + h 'hodź'. a v + H 'hodź'. v d.M. E, d.M. d. MMM @@ -2479,9 +2543,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Biškek - - Enderbury - Komory @@ -2639,9 +2700,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - zapadoafriski čas - zapadoafriski standardny čas - zapadoafriski lětni čas + zapadoafriski čas @@ -3006,6 +3065,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic guyanski čas + + + hawaiisko-aleutski standardny čas + + hawaiisko-aleutski čas @@ -3595,6 +3659,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + druhdy + @@ -3606,6 +3673,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4955,6 +5026,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic wuchodnokaribiske dolary wuchodnokaribiskich dolarow + + karibiski gulden + karibiski gulden + karibiskej guldenaj + karibiske guldeny + karibiskich guldenow + CFA-frank (BCEAO) CFA-frank (BCEAO) @@ -4997,6 +5075,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic sambiske kwachi sambiskich kwachow + + simbabwiske złoto + simbabwiske złoto + simbabwiskej złoće + simbabwiske złota + simbabwiskich złotow + ≈{0} @@ -5278,7 +5363,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kuski {0} kuskow - + + dźěle + {0} dźěl + {0} dźělej + {0} dźěle + {0} dźělow + + milionćiny {0} milionćina {0} milionćinje @@ -5313,6 +5405,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mole {0} molow + + glukozy + {0} glukozy + {0} glukozy + {0} glukozy + {0} glukozy + litry na kilometer {0} liter na kilometer @@ -6029,6 +6128,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimetry žiwoslěbroweho stołpika {0} milimetrow žiwoslěbroweho stołpika + + žiwoslěbroweho stołpa + {0} žiwoslěbroweho stołpa + {0} žiwoslěbroweho stołpa + {0} žiwoslěbroweho stołpa + {0} žiwoslěbroweho stołpa + punty na kwadratny cól {0} punt na kwadratny cól @@ -6276,6 +6382,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metriske šalki {0} metriskich šalkow + + metriske běžite uncy + {0} běžita unca + {0} běžitej uncy + {0} běžite uncy + {0} metriskich běžitych uncow + acre-stopy {0} acre-stopa @@ -6397,6 +6510,97 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} britiske běrtle {0} britiskich běrtlow + + steradiany + {0} steradian + {0} steradianaj + {0} steradiany + {0} steradianow + + + katale + {0} katal + {0} katalej + {0} katale + {0} katalow + + + coulomby + {0} coulomb + {0} coulombaj + {0} coulomby + {0} coulombow + + + farady + {0} farad + {0} faradaj + {0} farady + {0} faradow + + + henryje + {0} henry + {0} henryjej + {0} henryje + {0} henryjow + + + siemensy + {0} siemens + {0} siemensaj + {0} siemensy + {0} siemensow + + + kalorije [IT] + {0} kalorija [IT] + {0} kaloriji [IT] + {0} kalorije [IT] + {0} kalorijow [IT] + + + bequerele + {0} bequerel + {0} bequerelej + {0} bequerele + {0} bequerelow + + + sieverty + {0} sievert + {0} sievertaj + {0} sieverty + {0} sievertow + + + grayje + {0} gray + {0} grayjej + {0} grayje + {0} grayjow + + + kilogramy-forcy + {0} kilogram-force + {0} kilogramaj-forcaj + {0} kilogramy-forcy + {0} kilogramow-forcow + + + tesle + {0} tesla + {0} teslej + {0} tesle + {0} teslow + + + webery + {0} weber + {0} weberaj + {0} webery + {0} weberow + swětłowa spěšnosć {0} swětłowa spěšnosć @@ -6404,7 +6608,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} swětłowe spěšnosće {0} swětłowych spěšnosćow - + miliardćina {0} miliardćina {0} miliardćinje @@ -6493,6 +6697,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kusy {0} kusow + + dźěl + {0} dźěl + {0} dźěl + {0} dźěl + {0} dźěl + {0} % {0} % @@ -6511,6 +6722,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ‱ {0} ‱ + + Glc + {0} Glc + {0} Glc + {0} Glc + {0} Glc + l/km {0} l/km @@ -6678,6 +6896,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} PS {0} PS + + {0} Hg + {0} Hg + {0} Hg + {0} Hg + mph {0} mph @@ -6746,6 +6970,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic mc + + m. fl oz + {0} m. fl oz + {0} m. fl oz + {0} m. fl oz + {0} m. fl oz + gal {0} gal @@ -6839,6 +7070,86 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} šćipki {0} šćipkow + + steradian + {0} sr + {0} sr + {0} sr + {0} sr + + + {0} kat + {0} kat + {0} kat + {0} kat + + + {0} C + {0} C + {0} C + {0} C + + + {0} F + {0} F + {0} F + {0} F + + + {0} H + {0} H + {0} H + {0} H + + + {0} S + {0} S + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + {0} kgf + {0} kgf + + + {0} T + {0} T + {0} T + {0} T + + + {0} Wb + {0} Wb + {0} Wb + {0} Wb + sw. spěšnosć {0} sw. spěšnosć @@ -6846,7 +7157,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} sw. spěšnosće {0} sw. spěšnosćow - + nano {0} nano {0} nano @@ -6981,7 +7292,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} c {0} c - + n {0} n {0} n diff --git a/make/data/cldr/common/main/hu.xml b/make/data/cldr/common/main/hu.xml index 2cfb4d16073..5872fdcad3a 100644 --- a/make/data/cldr/common/main/hu.xml +++ b/make/data/cldr/common/main/hu.xml @@ -297,6 +297,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurd + kurd + kurmandzsi kumük kutenai komi @@ -365,7 +367,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ maláj máltai mundang - többszörös nyelvek + több nyelv krík mirandéz márvári @@ -831,7 +833,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kína Kolumbia Clipperton-sziget - Sark + Sark Costa Rica Kuba Zöld-foki Köztársaság @@ -1132,33 +1134,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numerikus rendezés Rendezés erőssége Pénznem + Emoji megjelenítése Óraformátum (12 – 24) Sortörés stílusa + Szavakon belüli sortörések Mértékegységrendszer Számok + Mondattörés rövidítés után Időzóna Földrajzi helyvariáns Privát használatra Buddhista naptár + Buddhista Kínai naptár + Kínai Kopt naptár + Kopt Dangi naptár + Dangi Etióp naptár + Etióp Etióp amete alem naptár + Etióp amete alem Gergely-naptár + Gergely Héber naptár + Héber Indiai nemzeti naptár Hidzsra naptár + Hidzsra Hidzsra naptár (táblázatos, polgári) + Hidzsra (táblázatos, polgári) Hidzsra naptár (Umm al-Qura) + Hidzsra (Umm al-Qura) ISO-8601 naptár Japán naptár + Japán Perzsa naptár + Perzsa Kínai köztársasági naptár + Kínai köztársasági Könyvelési pénznemformátum + Könyvelési Normál pénznemformátum + Normál Szimbólumok rendezése Rendezés szimbólumok figyelmen kívül hagyásával Ékezetek normál rendezése @@ -1168,23 +1189,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nagybetűs szavak rendezése előre Kis- és nagybetűket meg nem különböztető rendezés Rendezés kisbetű-nagybetű szerint - Hagyományos kínai sorrend - Big5 Előző rendezési sorrend a kompatibilitás érdekében + Kompatibilitás Szótári rendezési sorrend + Szótári Alapértelmezett Unicode rendezési sorrend + Alapértelmezett Unicode Emodzsi rendezési sorrend Európai rendezési szabályok - Egyszerűsített kínai sorrend - GB2312 Telefonkönyv sorrend + Telefonkönyv Fonetikus rendezési sorrend + Fonetikus Pinyin sorrend + Pinyin Általános célú keresés + Keresés Keresés hangul kezdő mássalhangzó szerint Normál rendezési sorrend + Normál Vonássorrend - Hagyományos + Vonás + Hagyományos sorrend + Hagyományos Szótővonás rendezési sorrend + Szótővonás Zujin rendezési sorrend + Zujin Rendezés normalizálás nélkül Unicode szerinti normalizált rendezés Számjegyek egyedi rendezése @@ -1197,18 +1228,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Teljes szélesség Fél szélesség Szám + Alapértelmezett + Emoji + Szöveg 12 órás rendszer (0–11) + 12 (0–11) 12 órás rendszer (0–12) + 12 (1–12) 24 órás rendszer (0–23) + 24 (0–23) 24 órás rendszer (0–24) + 24 (1–24) Tág stílusú sortörés + Tág Normál stílusú sortörés + Normál Szűk stílusú sortörés + Szűk + Az összes törése + Az összes megtartása + Normál + Megtartás a kifejezéseknél BGN UNGEGN Méterrendszer + Méter Angolszász mértékegységrendszer + Angolszász Amerikai mértékegységrendszer + Amerikai Arab-indiai számjegyek Kibővített arab-indiai számjegyek Örmény számok @@ -1253,6 +1301,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tibeti számjegyek Hagyományos számok Vai számjegyek + Ki + Be metrikus @@ -1282,9 +1332,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1412,23 +1459,39 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}, {0} + + + {1}, {0} + {1} {0} + + {1}, {0} + + + {1}, {0} + B h B h:mm B h:mm:ss + E B h E h:mm E h:mm:ss d., E + E a h E h:mm E h:mm:ss G y. - GGGGG y/MM/dd + G y. M. + G y. M. d. + E, M/d/y G G y. MMM G y. MMM d. G y. MMM d., E @@ -1438,6 +1501,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm a h:mm:ss H:mm:ss + a h v M. d. M. d., E MMM d. @@ -1692,6 +1756,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ éjjel hajnal + + éjfél + dél + reggel + de. + délután + este + éjjel + hajnal + éjfél dél @@ -1704,6 +1778,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + reggel + de. + délután + este + éjjel + hajnal + reggel délelőtt @@ -1805,13 +1887,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss d., E + E a h E h:mm a E h:mm:ss a G y. + G y. MM. GGGGG y. MM. dd. + G y. MM. dd., E G y. MMM G y. MMM d. G y. MMM d., E @@ -1823,6 +1909,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm:ss a h:mm:ss v a h:mm v + a h v M. d. M. d., E MMM d. @@ -2368,24 +2455,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dubaj - - Tirana - Jereván Vosztok - - Río Gallegos - - - Tucumán - - - Córdoba - Bécs @@ -2407,27 +2482,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Eirunepé - Río Branco - - Cuiabá - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - Timpu @@ -2449,9 +2506,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sanghaj - - Bogotá - Havanna @@ -2464,9 +2518,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Prága - - Büsingen - Dzsibuti @@ -2583,7 +2634,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biskek - Enderbury + Canton-sziget Kiritimati-sziget @@ -2651,9 +2702,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldív-szigetek - - Mazatlán - Bahia Banderas @@ -2884,9 +2932,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - nyugat-afrikai időzóna - nyugat-afrikai téli idő - nyugat-afrikai nyári idő + nyugat-afrikai időzóna @@ -3170,7 +3216,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - közép-európai időzóna + közép-európai idő közép-európai téli idő közép-európai nyári idő @@ -3292,6 +3338,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ guyanai téli idő + + + hawaii-aleuti téli idő + + hawaii-aleuti időzóna @@ -3742,6 +3793,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ truki idő + + + Törökországi idő + Törökországi zónaidő + Törökországi nyári idő + + türkmenisztáni idő @@ -3898,7 +3956,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4283,8 +4344,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ hondurasi lempira - hondurasi lempira - hondurasi lempira Horvát dínár @@ -4323,8 +4382,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ iráni riál - iráni riál - iráni riál izlandi korona @@ -4431,8 +4488,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ macedón dénár - macedón dénár - macedón dénár macedón dénár (1992–1993) @@ -4529,8 +4584,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ománi riál - ománi riál - ománi riál panamai balboa @@ -4572,8 +4625,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ katari riál - katari riál - katari riál rhodéziai dollár @@ -4588,8 +4639,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ szerb dinár - szerb dinár - szerb dinár orosz rubel @@ -4602,8 +4651,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ szaúdi riál - szaúdi riál - szaúdi riál salamon-szigeteki dollár @@ -4644,8 +4691,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sierra Leone-i leone (1964–2022) - Sierra Leone-i leone (1964–2022) - Sierra Leone-i leone (1964–2022) szomáli shilling @@ -4762,13 +4807,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ uruguayi peso - uruguayi peso - uruguayi peso üzbegisztáni szom - üzbegisztáni szom - üzbegisztáni szom Venezuelai bolivar (1871–2008) @@ -4817,6 +4858,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kelet-karibi dollár XCD + + karibi forint + karibi forint + karibi forint + Special Drawing Rights @@ -4863,8 +4909,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ jemeni riál - jemeni riál - jemeni riál Jugoszláv kemény dínár @@ -4905,6 +4949,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwei dollár (1980–2008) + + zimbabwei arany + zimbabwei arany + zimbabwei arany + Zimbabwei dollár (2009) @@ -5254,7 +5303,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} itemig {0} itemmé - + + rész + {0} rész + {0} rész + + {0} részecske/millió {0} részecske/milliót {0} részecske/millióval @@ -5316,6 +5370,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mólig {0} móllá + + glükóz + {0} glükóz + {0} glükóz + liter per kilométer {0} liter per kilométer @@ -6381,6 +6440,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} higanymilliméterig {0} higanymilliméterré + + higany + {0} higany + {0} higany + font per négyzethüvelyk {0} font per négyzethüvelyk @@ -6518,9 +6582,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} csomó - Beaufort - Beaufort {0} - Beaufort {0} + Beaufort + Beaufort {0} + Beaufort {0} {0} fok @@ -6749,6 +6813,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} bögréig {0} bögrévé + + metrikus folyadékuncia + {0} metrikus folyadékuncia + {0} metrikus folyadékuncia + hold-láb {0} hold-láb @@ -6811,8 +6880,72 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} birodalmi kvart {0} birodalmi kvart + + szteradián + {0} szteradián + {0} szteradián + + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + kalória [IT] + {0} kalória [IT] + {0} kalória [IT] + + + becquerel + {0} becquerel + {0} becquerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + kilogramm-erő + {0} kilogramm-erő + {0} kilogramm-erő + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + - éjszakák {0} éjszaka {0} éjszakát {0} éjszakával @@ -6823,7 +6956,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} éjszakával {0} éjszakáig {0} éjszakává - {0}/éjszaka kardinális irány @@ -6867,7 +6999,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmol/l {0} mmol/l - + + rész + {0} rész + {0} rész + + részecske/millió @@ -6876,6 +7013,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ezrelék + + mól + + + Glc + l/km {0} l/km @@ -7054,6 +7197,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nap-sugár + + kandela + Kt {0} Kt @@ -7209,6 +7355,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} bir. qt {0} bir. qt + + cal-IT + éjszakák {0} éjszaka @@ -7235,7 +7384,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/l - + + rész + {0} rész + {0} rész + + ppm @@ -7244,6 +7398,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + {0} l/100 km {0} l/100 km @@ -7284,8 +7441,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hgin - B{0} - B{0} + B{0} + B{0} fl.dr. @@ -7297,11 +7454,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} csi {0} csi - - éjszakák - {0} éjszaka - {0} éjszaka - {0}/éjszaka + + cal-IT diff --git a/make/data/cldr/common/main/hy.xml b/make/data/cldr/common/main/hy.xml index 08690355a5a..8c6d8cbc0b0 100644 --- a/make/data/cldr/common/main/hy.xml +++ b/make/data/cldr/common/main/hy.xml @@ -54,6 +54,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ այմարա ադրբեջաներեն բաշկիրերեն + բելուջերեն բալիերեն բասաա բելառուսերեն @@ -253,6 +254,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ բաֆիա քյոլներեն քրդերեն + քրդերեն + քուրմանջի կումիկերեն կոմիերեն կոռներեն @@ -697,6 +700,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Չինաստան Կոլումբիա Քլիփերթոն կղզի + Սարկ կղզի Կոստա Ռիկա Կուբա Կաբո Վերդե @@ -936,42 +940,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ արժույթի ձևաչափ տեսակավորման կարգ արժույթ + էմոջիների ներկայացում Ժամանակային համակարգ (12 կամ 24) տողանցման ոճ + Տողերի ընդհատումներ բառամիջում չափման համակարգ թվեր + Նախադասության ընդհատում հապավումից հետո․ բուդդայական օրացույց + բուդդայական չինական օրացույց + չինական ղպտական օրացույց + ղպտական դանգի օրացույց + դանգի եթովպական օրացույց + եթովպական եթովպական Ամետե Ալեմ օրացույց + եթովպական Ամետե Ալեմ գրիգորյան օրացույց + գրիգորյան հրեական օրացույց + հրեական հիջրայի օրացույց + հիջրա հիջրայի քաղաքացիական օրացույց (աղյուսակային) + հիջրա (աղյուսակային, քաղաքացիական) հիջրայի օրացույց (Ում ալ Քուրա) + հիջրա (Ում ալ Քուրա) ISO-8601 օրացույց ճապոնական օրացույց + ճապոնական պարսկական օրացույց - մինգուո օրացույց + պարսկական + Մինգո օրացույց + Մինգո արժույթի հաշվապահական ձևաչափ + հաշվապահական արժույթի ստանդարտ ձևաչափ - Յունիկոդ լռելյայն տեսակավորում + ստանդարտ + Unicode-ի կանխադրված տեսակավորում + Unicode (կանխադրված) որոնում + որոնում տեսակավորման ստանդարտ կարգ + ստանդարտ + կանխադրված + էմոջի + տեքստ 12-ժամյա համակարգ (0-11) + 12 (0–11) 12-ժամյա համակարգ (1-12) + 12 (1–12) 24-ժամյա համակարգ (0-23) + 24 (0–23) 24-ժամյա համակարգ (1-24) + 24 (1–24) փափուկ տողանցում + փափուկ սովորական տողանցում + սովորական կոշտ տողանցում + կոշտ + Ընդհատել բոլորը + Պահել բոլորը + Սովորական + Պահել արտահայտություններում մետրիկ համակարգ + մետրիկ անգլիական համակարգ + ՄԹ ամերիկյան համակարգ + ԱՄՆ արաբա-հնդկական թվանշաններ արաբա-հնդկական թվերի ընդլայնված համակարգ հայկական թվանշաններ @@ -1012,6 +1055,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ թայական թվանշաններ տիբեթական թվանշաններ վայական թվանշաններ + Անջ․ + Միաց․ Մետրական @@ -1090,22 +1135,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h-ին B h:mm-ին B h:mm:ss + E B h E B h:mm-ին E B h:mm:ss d, ccc G y թ․ - dd.MM.y GGGGG + G MM.y + GGGGG dd.MM.y + G dd.MM.y, E G y թ․ MMM G y թ․ MMM d G y թ․ MMM d, E H H:mm H:mm:ss + ժ․ HH v dd.MM dd.MM, E - d MMM - d MMM, E - d MMMM y, G y, G G y թ. MM @@ -1447,6 +1493,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h-ին B h:mm-ին B h:mm:ss + E B h-ին E B h:mm-ին E B h:mm:ss d, ccc @@ -1455,23 +1502,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, h:mm:ss a E, HH:mm:ss G y թ. - dd.MM.y GGGGG + G MM.y + GGGGG dd.MM.y + G dd.MM.y, E G y թ. MMM G y թ․ MMM d G y թ. MMM d, E H H:mm H:mm:ss + ժ․ HH v dd.MM dd.MM, E d MMM - d MMM, E - d MMMM MMMM W-ին շաբաթ MMMM W-րդ շաբաթ MM.y dd.MM.y - d.MM.y թ., E + d.MM.y, E y թ. LLL d MMM, y թ. y թ. MMM d, E @@ -1493,6 +1541,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm – h:mm + G y թ․ – G y թ․ G y–y թթ․ @@ -2363,6 +2412,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Զատկի կղզի + + Կոյայկե + Պունտա Արենաս @@ -2628,9 +2680,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Պնոմպեն - Էնդերբերի կղզի - - Կանտոն @@ -3300,9 +3349,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Արևմտյան Աֆրիկայի ժամանակ - Արևմտյան Աֆրիկայի ստանդարտ ժամանակ - Արևմտյան Աֆրիկայի ամառային ժամանակ + Արևմտյան Աֆրիկայի ժամանակ @@ -3652,6 +3699,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Գայանայի ժամանակ + + + Հավայան-ալեության ստանդարտ ժամանակ + + Հավայան-ալեության ժամանակ @@ -4156,6 +4208,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ armn + 2 ,   @@ -4223,6 +4276,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4327,8 +4384,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ բոտսվանական պուլա - բոտսվանական պուլա - բոտսվանական պուլա բելառուսական ռուբլի @@ -4377,8 +4432,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ չեխական կրոնա - չեխական կրոնա - չեխական կրոնա Ջիբութիի ֆրանկ @@ -4684,8 +4737,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ թաիլանդական բահտ - թաիլանդական բահտ - թաիլանդական բահտ ฿ @@ -4750,6 +4801,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ արևելակարիբյան դոլար + + կարիբյան գուլդեն + կարիբյան գուլդեն + կարիբյան գուլդեն + Արևմտյան Աֆրիկայի ԿՖԱ ֆրանկ @@ -4773,6 +4829,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ զամբիական կվաչա + + Զիմբաբվեի ոսկի + Զիմբաբվեի ոսկի + Զիմբաբվեի ոսկի + {0}+ @@ -4960,7 +5021,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} աստիճանում - րոպե {0} րոպե {0} րոպեից {0} րոպեին @@ -4973,7 +5033,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} րոպեում - վայրկյան {0} վայրկյան {0} վայրկյանից {0} վայրկյանին @@ -5113,7 +5172,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} միույթով {0} միույթում - + + մաս + {0} մաս + {0} մաս + + մաս միլիոնի վրա {0} մաս միլիոնի վրա {0} մասից միլիոնի վրա @@ -5175,6 +5239,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մոլով {0} մոլում + + գլյուկոզ + {0} գլյուկոզ + {0} գլյուկոզ + լիտր կիլոմետրի վրա {0} լիտր կիլոմետրի վրա @@ -5380,7 +5449,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} տասնամյակում - տարի {0} տարի {0} տարուց {0} տարուն @@ -5448,7 +5516,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ օրական {0} - ժամ {0} ժամ {0} ժամից {0} ժամին @@ -5555,7 +5622,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} միլիամպերում - օհմ {0} օհմ {0} օհմից {0} օհմին @@ -5757,7 +5823,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} em-ում - փիքսել {0} փիքսել {0} փիքսելից {0} փիքսելին @@ -5928,7 +5993,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մղոն - յարդ {0} յարդ {0} յարդ @@ -5986,7 +6050,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} սկանդինավյան մղոնում - կտ {0} կտ {0} կտ {0} կտ @@ -6232,17 +6295,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ձիաուժ - միլիմետր՝ սնդիկի սյան - {0} միլիմետր՝ սնդիկի սյան - {0} միլիմետրից՝ սնդիկի սյան - {0} միլիմետրին՝ սնդիկի սյան - {0} միլիմետրով՝ սնդիկի սյան - {0} միլիմետրում՝ սնդիկի սյան - {0} միլիմետր՝ սնդիկի սյան - {0} միլիմետրից՝ սնդիկի սյան - {0} միլիմետրին՝ սնդիկի սյան - {0} միլիմետրով՝ սնդիկի սյան - {0} միլիմետրում՝ սնդիկի սյան + միլիմետր սնդիկի սյուն + {0} միլիմետր սնդիկի սյուն + {0} սնդիկի սյան միլիմետրից + {0} սնդիկի սյան միլիմետրին + {0} սնդիկի սյան միլիմետրով + {0} սնդիկի սյան միլիմետրում + {0} միլիմետր սնդիկի սյուն + {0} սնդիկի սյան միլիմետրից + {0} սնդիկի սյան միլիմետրին + {0} սնդիկի սյան միլիմետրով + {0} սնդիկի սյան միլիմետրում + + + սնդիկի սյուն + {0} սնդիկի սյուն + {0} սնդիկի սյուն ֆունտ քառակուսի դյույմի վրա @@ -6613,13 +6681,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մետրիկ բաժակով {0} մետրիկ բաժակում + + մետրիկ հեղուկ ունկի + {0} մետրիկ հեղուկ ունկի + {0} մետրիկ հեղուկ ունկի + ակրոֆուտ {0} ակրոֆուտ {0} ակրոֆուտ - բուշել {0} բուշել {0} բուշել @@ -6635,11 +6707,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} անգլիական գալոն {0} անգլիական գալոնի վրա - - փինթ - - բաժակ {0} բաժակ {0} բաժակ @@ -6678,11 +6746,80 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} անգլիական աղանդերի գդալ - դրամ {0} դրամ {0} դրամ - + + ստեռադիան + {0} ստեռադիան + {0} ստեռադիան + + + կատալ + {0} կատալ + {0} կատալ + + + կուլոն + {0} կուլոն + {0} կուլոն + + + ֆարադ + {0} ֆարադ + {0} ֆարադ + + + հենրի + {0} հենրի + {0} հենրի + + + սիմենս + {0} սիմենս + {0} սիմենս + + + միջազգային կալորիա + {0} միջազգային կալորիա + {0} միջազգային կալորիա + + + բեքերել + {0} բեքերել + {0} բեքերել + + + զիվերտ + {0} զիվերտ + {0} զիվերտ + + + գրեյ + {0} գրեյ + {0} գրեյ + + + կիլոգրամ-ուժ + {0} կիլոգրամ-ուժ + {0} կիլոգրամ-ուժ + + + տեսլա + {0} տեսլա + {0} տեսլա + + + վեբեր + {0} վեբեր + {0} վեբեր + + + լույսի արագություն + {0} լույսի արագություն + {0} լույսի արագություն + + մաս միլիարդի վրա {0} մաս միլիարդի վրա {0} մասից միլիարդի վրա @@ -6696,7 +6833,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մասում միլիարդի վրա - գիշեր {0} գիշեր {0} գիշերից {0} գիշերին @@ -6917,7 +7053,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} միույթ {0} միույթ - + + մաս + {0} մաս + {0} մաս + + մաս/միլիոն {0} մմվ {0} մմվ @@ -6933,6 +7074,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մոլ {0} մոլ + + գլյուկոզ + {0} գլյուկոզ + {0} գլյուկոզ + լ/կմ {0} լ/կմ @@ -7093,8 +7239,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ օհմ - {0} Ω - {0} Ω Վ @@ -7438,6 +7582,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մմ ս.ս. {0} մմ ս.ս. + + ս․ս․ + {0} ս․ս․ + {0} ս․ս․ + ֆ․/քառ․ դյմ {0} ֆ./քառ․ դյմ @@ -7605,6 +7754,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} մ․ բաժ․ {0} մ․ բաժ․ + + մետրիկ հղ․ ու + {0} մետրիկ հղ․ ու + {0} մետրիկ հղ․ ու + ակր ֆտ {0} ակր ֆտ @@ -7702,7 +7856,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} անգլիական քվարտ {0} անգլիական քվարտ - + + ստեռ + {0} ստեռ + {0} ստեռ + + + կատ + {0} կատ + {0} կատ + + + Կլ + {0} Կլ + {0} Կլ + + + ֆարադ + {0} Ֆ + {0} Ֆ + + + հն + {0} հն + {0} հն + + + Սմ + {0} Սմ + {0} Սմ + + + միջազգային կալորիա + {0} միջազգային կալորիա + {0} միջազգային կալորիա + + + Բք + {0} Բք + {0} Բք + + + Զվ + {0} Զվ + {0} Զվ + + + Գր + {0} Գր + {0} Գր + + + կգ-ուժ + {0} կգ-ուժ + {0} կգ-ուժ + + + Տլ + {0} Տլ + {0} Տլ + + + Վբ + {0} Վբ + {0} Վբ + + + լույսի արագ․ + {0} լույսի արագ․ + {0} լույսի արագ․ + + մաս/միլիարդ {0} մմլրդվ {0} մմլրդվ @@ -7723,7 +7947,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - g-ուժ {0}G {0}G @@ -7738,12 +7961,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ աստ - - րոպե - - - վայրկյան - {0}կմ² {0}կմ² @@ -7769,7 +7986,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ակր - յդ² {0}յդ² {0}յդ² @@ -7793,7 +8009,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}միույթ {0}միույթ - + + մ․ + {0} մ․ + {0} մ․ + + մմվ {0}մմվ {0}մմվ @@ -7808,6 +8029,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}մոլ {0}մոլ + + գլյուկոզ + {0} գլյուկոզ + {0} գլյուկոզ + {0}լ/կմ {0}լ/կմ @@ -7859,6 +8085,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}բիթ {0}բիթ + + տ + ա {0}ա @@ -7900,7 +8129,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}մԱ - օհմ {0} Ω {0}Ω @@ -7955,11 +8183,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ կտ - - կսմվ - {0}կսմվ - {0}կսմվ - յդ {0}յդ @@ -7983,9 +8206,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ֆատոմ - - կտ - {0}լք {0}լք @@ -8011,10 +8231,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}# - ու {0}ու {0}ու - {0}/ու տ․ ու @@ -8034,12 +8252,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}M☉ - {0}կՎ - {0}կՎ + {0}կՎտ + {0}կՎտ - {0}Վ - {0}Վ + {0}Վտ + {0}Վտ {0}մՎտ @@ -8049,8 +8267,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ձ/ու {0}ձ/ու + + մմսս + {0} մմսս + {0} մմսս + + + ս․ս․ + {0}սս + {0}սս + - մատ. ս.ս. {0}" ս.ս. {0}" ս. ս. @@ -8137,8 +8364,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ մետր․ փինթեր + + մետր․ հղ․ ու + {0} մետր․ հղ․ ու + {0} մետր․ հղ․ ու + - բուշել {0}բու {0}բու @@ -8151,7 +8382,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}քվարտ - փինթ {0}փինթ {0}փինթ @@ -8192,13 +8422,70 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}պտղունց {0}պտղունց - + + {0} sr + {0} sr + + + կատ + {0}կատ + {0}կատ + + + Ֆ + {0} Ֆ + {0} Ֆ + + + {0} S + {0} S + + + միջազգային կալորիա + {0} միջազգային կալորիա + {0} միջազգային կալորիա + + + Բք + {0}Բք + {0}Բք + + + Զվ + {0}Զվ + {0}Զվ + + + Գր + {0}Գր + {0}Գր + + + կգ-ուժ + {0}կգ-ուժ + {0}կգ-ուժ + + + Տլ + {0}Տլ + {0}Տլ + + + Վբ + {0}Վբ + {0}Վբ + + + լ․ա․ + {0} լ․ա․ + {0} լ․ա․ + + մմլրդվ {0}մմլրդվ {0}մմլրդվ - գիշեր {0}/գ․ {0}/գ․ {0}/գ․ diff --git a/make/data/cldr/common/main/ia.xml b/make/data/cldr/common/main/ia.xml index c6acc5a59d9..1f7e4296943 100644 --- a/make/data/cldr/common/main/ia.xml +++ b/make/data/cldr/common/main/ia.xml @@ -62,10 +62,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic bambara bengalese tibetano + bakhtiari breton bodo bosniaco akoose + buriato buginese blin catalano @@ -88,6 +90,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kurdo sorani chilcotin corso + copto mitchif cree del sud-est cree del planas @@ -105,8 +108,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dargwa taita germano - germano austriac - alte germano suisse dogrib zarma dogri @@ -122,17 +123,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ekajuk greco anglese - anglese australian - anglese canadian - anglese britannic - anglese (GB) - anglese american + anglese (RU) anglese (SUA) esperanto espaniol - espaniol latinoamerican - espaniol europee - espaniol mexican estoniano basco ewondo @@ -145,8 +139,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic feroese fon francese - francese canadian - francese suisse francese cajun frison septentrional friulano @@ -170,9 +162,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic haida del sud hebreo hindi - hinglish hiligaynon hmong + hmong njua croato alte sorabo creolo haitian @@ -210,6 +202,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic tyap makonde capoverdiano + kekchi kenyang koro kaingang @@ -236,6 +229,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafia coloniese kurdo + kurdo + kurmanji kumyko komi cornico @@ -268,6 +263,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic mizo luyia letton + laz madurese magahi maithili @@ -299,10 +295,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic plure linguas creek mirandese + hmong daw birmano erzya mazanderani nauru + min nan napolitano nama norvegiano bokmål @@ -344,14 +342,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic papiamento palauano pidgin nigerian + pali pijin polonese + pedemontese malecite-passamaquoddy prussiano pashto portugese - portugese de Brasil - portugese de Portugal quechua kʼicheʼ rajasthani @@ -384,6 +382,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sena koyraboro senni sango + samogitiano serbocroato tachelhit shan @@ -410,6 +409,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic salish del strictos sundanese sukuma + sunuwar svedese swahili swahili del Congo @@ -869,6 +869,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendario ethiope calendario ethiope Amete Alem calendario gregorian + gregorian calendario hebraic calendario national indian calendario hegiric @@ -882,18 +883,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic calendario del Republica de China formato de moneta pro contabilitate formato de moneta standard - ordinamento traditional chinese - Big5 ordinamento previe, pro compatibilitate ordinamento de dictionario ordinamento Unicode predefinite ordinamento de emoji regulas europee de ordinamento - ordinamento chinese simplificate - GB2312 ordinamento de annuario telephonic ordinamento pinyin recerca generic recerca per consonante initial hangul ordinamento standard + standard ordinamento de tractos ordinamento traditional ordinamento de tractos radical @@ -1017,6 +1017,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' {0} + + {1} 'a' {0} + @@ -1025,6 +1028,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' {0} + + {1} 'a' {0} + @@ -1041,13 +1047,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM-y GGGGG dd-MM-y GGGGG + E dd-MM-y GGGGG MMM y G d MMM y G E d MMM y G h a h:mm a h:mm:ss a + h v dd-MM E dd-MM d MMM @@ -1338,6 +1347,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' {0} + + {1} 'a' {0} + @@ -1346,6 +1358,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' {0} + + {1} 'a' {0} + @@ -1354,6 +1369,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -1362,13 +1380,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + E d E h:mm a E h:mm:ss a y G + MM-y G dd-MM-y G + E dd-MM-y G MMM y G d MMM y G E d MMM y G @@ -1377,6 +1400,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm:ss a h:mm:ss a v h:mm a v + h v dd-MM E dd-MM d MMM @@ -1994,10 +2018,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Citate incognite - - - Tirana + Loco incognite Bruxelles @@ -2023,18 +2044,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Praga - - Büsingen - Djibuti - - Galápagos - - - Canarias - Feroe @@ -2156,6 +2168,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mayotta + + + hora de Acre + hora normal de Acre + hora estive de Acre + + hora de Afghanistan @@ -2173,14 +2192,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora standard de Africa del Sud + hora normal de Africa del Sud - hora de Africa del West - hora standard de Africa del West - hora estive de Africa del West + hora de Africa del West @@ -2193,7 +2210,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Amazonia - hora standard de Amazonia + hora normal de Amazonia hora estive de Amazonia @@ -2227,36 +2244,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora de Apia - hora standard de Apia - hora estive de Apia + hora de Samoa + hora normal de Samoa + hora estive de Samoa hora arabe - hora standard arabe + hora normal arabe hora estive arabe hora de Argentina - hora standard de Argentina + hora normal de Argentina hora estive de Argentina hora de Argentina occidental - hora standard de Argentina occidental + hora normal de Argentina occidental hora estive de Argentina occidental hora de Armenia - hora standard de Armenia + hora normal de Armenia hora estive de Armenia @@ -2270,35 +2287,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Australia central - hora standard de Australia central + hora normal de Australia central hora estive de Australia central hora de Australia centro-occidental - hora standard de Australia centro-occidental + hora normal de Australia centro-occidental hora estive de Australia centro-occidental hora de Australia oriental - hora standard de Australia oriental + hora normal de Australia oriental hora estive de Australia oriental hora de Australia occidental - hora standard de Australia occidental + hora normal de Australia occidental hora estive de Australia occidental hora de Azerbeidzhan - hora standard de Azerbeidzhan + hora normal de Azerbeidzhan hora estive de Azerbeidzhan @@ -2312,7 +2329,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Bangladesh - hora standard de Bangladesh + hora normal de Bangladesh hora estive de Bangladesh @@ -2329,45 +2346,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Brasilia - hora standard de Brasilia + hora normal de Brasilia hora estive de Brasilia - hora de Brunei Darussalam + hora de Brunei hora de Capo Verde - hora standard de Capo Verde + hora normal de Capo Verde hora estive de Capo Verde - hora standard de Chamorro + hora normal de Chamorro hora de Chatham - hora standard de Chatham + hora normal de Chatham hora estive de Chatham hora de Chile - hora standard de Chile + hora normal de Chile hora estive de Chile hora de China - hora standard de China + hora normal de China hora estive de China @@ -2384,14 +2401,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Colombia - hora standard de Colombia + hora normal de Colombia hora estive de Colombia hora del Insulas Cook - hora standard del Insulas Cook + hora normal del Insulas Cook hora estive del Insulas Cook @@ -2409,18 +2426,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora de Dumont-d’Urville + hora de Dumont d’Urville - hora de Timor del Est + hora de Timor Oriental hora del Insula de Pascha - hora standard del Insula de Pascha + hora normal del Insula de Pascha hora estive del Insula de Pascha @@ -2458,14 +2475,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora del Insulas Falkland - hora standard del Insulas Falkland + hora normal del Insulas Falkland hora estive del Insulas Falkland hora de Fiji - hora standard de Fiji + hora normal de Fiji hora estive de Fiji @@ -2492,7 +2509,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Georgia - hora standard de Georgia + hora normal de Georgia hora estive de Georgia @@ -2506,6 +2523,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora medie de Greenwich + + + hora de Groenlandia + hora normal de Groenlandia + hora estive de Groenlandia + + hora de Groenlandia oriental @@ -2520,9 +2544,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora estive de Groenlandia occidental + + + hora normal de Guam + + - hora standard del Golfo + hora normal del Golfo @@ -2530,6 +2559,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Guyana + + + hora normal de Hawaii-Aleutianas + + hora de Hawaii-Aleutianas @@ -2540,20 +2574,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Hongkong - hora standard de Hongkong + hora normal de Hongkong hora estive de Hongkong - hora de Hovd - hora standard de Hovd - hora estive de Hovd + hora de Khovd + hora normal de Khovd + hora estive de Khovd - hora standard de India + hora normal de India @@ -2584,7 +2618,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Iran - hora standard de Iran + hora normal de Iran hora estive de Iran @@ -2598,14 +2632,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Israel - hora standard de Israel + hora normal de Israel hora estive de Israel hora de Japon - hora standard de Japon + hora normal de Japon hora estive de Japon @@ -2627,7 +2661,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Corea - hora standard de Corea + hora normal de Corea hora estive de Corea @@ -2656,7 +2690,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Lord Howe - hora standard de Lord Howe + hora normal de Lord Howe hora estive de Lord Howe @@ -2690,7 +2724,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Mauritio - hora standard de Mauritio + hora normal de Mauritio hora estive de Mauritio @@ -2709,7 +2743,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Ulan Bator - hora standard de Ulan Bator + hora normal de Ulan Bator hora estive de Ulan Bator @@ -2738,14 +2772,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Nove Caledonia - hora standard de Nove Caledonia + hora normal de Nove Caledonia hora estive de Nove Caledonia hora de Nove Zelanda - hora standard de Nove Zelanda + hora normal de Nove Zelanda hora estive de Nove Zelanda @@ -2764,14 +2798,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora del Insula Norfolk - hora standard del Insula Norfolk + hora normal del Insula Norfolk hora estive del Insula Norfolk hora de Fernando de Noronha - hora standard de Fernando de Noronha + hora normal de Fernando de Noronha hora estive de Fernando de Noronha @@ -2792,7 +2826,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Pakistan - hora standard de Pakistan + hora normal de Pakistan hora estive de Pakistan @@ -2809,21 +2843,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Paraguay - hora standard de Paraguay + hora normal de Paraguay hora estive de Paraguay hora de Peru - hora standard de Peru + hora normal de Peru hora estive de Peru hora del Philippinas - hora standard del Philippinas + hora normal del Philippinas hora estive del Philippinas @@ -2846,12 +2880,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora de Ponape + hora de Pohnpei - hora de Pyongyang + hora de Corea del Nord @@ -2873,9 +2907,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora de Samoa - hora standard de Samoa - hora estive de Samoa + hora de Samoa american + hora normal de Samoa american + hora estive de Samoa american @@ -2885,7 +2919,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora standard de Singapore + hora normal de Singapore @@ -2915,9 +2949,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - hora de Taipei - hora standard de Taipei - hora estive de Taipei + hora de Taiwan + hora normal de Taiwan + hora estive de Taiwan @@ -2933,7 +2967,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Tonga - hora standard de Tonga + hora normal de Tonga hora estive de Tonga @@ -2945,7 +2979,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Turkmenistan - hora standard de Turkmenistan + hora normal de Turkmenistan hora estive de Turkmenistan @@ -2957,21 +2991,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic hora de Uruguay - hora standard de Uruguay + hora normal de Uruguay hora estive de Uruguay hora de Uzbekistan - hora standard de Uzbekistan + hora normal de Uzbekistan hora estive de Uzbekistan hora de Vanuatu - hora standard de Vanuatu + hora normal de Vanuatu hora estive de Vanuatu @@ -3098,6 +3132,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) @@ -3919,6 +3954,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar del Caribes Oriental dollares del Caribes Oriental + + florino caribe + florino caribe + florinos caribe + franco CFA de Africa Occidental franco CFA de Africa Occidental @@ -3945,6 +3985,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwacha zambian + + auro de Zimbwabwe + auro de Zimbwabwe + auros de Zimbwabwe + ⩾{0} @@ -4108,7 +4153,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millimol per litro {0} millimoles per litro - + partes per million {0} parte per million {0} partes per million @@ -5254,11 +5299,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} — compatibilitate {0} — inquadrate {0} — extendite + {0} a sinistra + {0} a dextra {0} — miscellanee {0} — altere scripturas — {0} {0} tractos {0} tractos + subscripto {0} + superscripto {0} activitate scriptura african scriptura american diff --git a/make/data/cldr/common/main/id.xml b/make/data/cldr/common/main/id.xml index 590e7d58569..e72e2951c5b 100644 --- a/make/data/cldr/common/main/id.xml +++ b/make/data/cldr/common/main/id.xml @@ -297,6 +297,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Dialek Kolsch Kurdi + Kurdi + Kurmanji Kumyk Kutenai Komi @@ -892,6 +894,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tiongkok Kolombia Pulau Clipperton + Sark Kosta Rika Kuba Tanjung Verde @@ -1195,35 +1198,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pengurutan Numerik Kekuatan Pengurutan Mata Uang + Tampilan Emoji Siklus Jam (12 vs 24) Gaya Pemisah Baris + Pemisah Baris di antara Kata Sistem Pengukuran Angka + Pemisah Kalimat Setelah Singkatan Zona Waktu Varian Lokal Penggunaan Pribadi Kalender Buddha + Buddha Kalender Tionghoa + Tiongkok Kalender Koptik + Koptik Kalender Dangi + Dangi Kalender Etiopia + Etiopia Kalender Amete Alem Etiopia + Amete Alem Etiopia Kalender Gregorian + Gregorian Kalender Ibrani + Ibrani Kalender Nasional India Kalender Islam + Hijriah Kalender Sipil Islam + Hijri (tabular, epoch sipil) Kalender Islam (Arab Saudi, penglihatan) Kalender Astronomi Islam + Hijriah (tabular, epoch astronomi) Kalender Islam (Umm al-Qura) + Hijriah (tabular, Umm al-Qura) Kalender ISO-8601 Kalender Jepang + Jepang Kalender Persia + Persia Kalender Min-guo + Min-guo Format Mata Uang Akuntansi + Akuntansi Format Mata Uang Standar + Standar Sortir Simbol Sortir Abaikan Simbol Sortir Aksen Secara Normal @@ -1233,23 +1256,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sortir Huruf Besar Dahulu Sortir Tidak Peka Huruf Besar Sortir Peka Huruf Besar - Aturan Pengurutan Tionghoa Tradisional - Big5 Aturan Pengurutan Sebelumnya, untuk kompatibilitas + Kompatibilitas Aturan Pengurutan Kamus + Kamus Aturan Pengurutan Unicode Default + Unicode Default Urutan Sortir Emoji Aturan Pengurutan Eropa - Aturan Pengurutan Tionghoa (Sederhana) - GB2312 Aturan Pengurutan Buku Telepon + Buku Telepon Aturan Pengurutan Fonetik + Fonetik Aturan Pengurutan Pinyin + Pinyin Pencarian Tujuan Umum + Pencarian Pencarian Menurut Konsonan Awal Hangul Aturan Pengurutan Standar + Standar Aturan Pengurutan Guratan + Guratan Aturan Pengurutan Tradisional + Tradisional Aturan Pengurutan Guratan Radikal + Guratan Tradisional Aturan Pengurutan Zhuyin + Zhuyin Sortir Tanpa Normalisasi Sortir Unicode Dinormalisasi Sortir Digit Satu Per Satu @@ -1262,18 +1295,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Lebar penuh Lebar separuh Angka + Bawaan + Emoji + Teks Sistem 12 Jam (0–11) + 12 (0–11) Sistem 12 Jam (1–12) + 12 (1–12) Sistem 24 Jam (0–23) + 24 (0–23) Sistem 24 Jam (1–24) + 24 (1–24) Gaya Pemisah Baris Renggang + Renggang Gaya Pemisah Baris Normal + Normal Gaya Pemisah Baris Rapat + Rapat + Pisah semua + Pertahankan semua + Normal + Pertahankan frasa Transliterasi BGN AS Transliterasi GEGN PBB Sistem Metrik + Metrik Sistem Pengukuran Imperial + UK Sistem Pengukuran AS + AS Angka Ahom Angka Arab Timur Angka Arab Timur Diperluas @@ -1356,6 +1406,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angka Vai Angka Warang Citi Angka Wancho + Nonaktif + Aktif Metrik @@ -1385,11 +1437,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1452,15 +1500,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - h B – h B - d – d - - h a – h a - h.mm – h.mm a h.mm – h.mm a @@ -1477,9 +1519,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH.mm – HH.mm v HH.mm – HH.mm v - - h a – h a v - M – M @@ -1615,6 +1654,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pukul' {0} + + {1} 'pukul' {0} + @@ -1623,6 +1665,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pukul' {0} + + {1} 'pukul' {0} + @@ -1645,15 +1690,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E HH.mm.ss y G - d/M/y GGGGG + M/y G + d/M/y G + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h.mm a HH.mm h.mm.ss a HH.mm.ss + HH'j' v d/M E, d/M d MMM @@ -1988,6 +2035,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pukul' {0} + + {1} 'pukul' {0} + @@ -1996,6 +2046,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pukul' {0} + + {1} 'pukul' {0} + @@ -2004,6 +2057,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -2012,6 +2068,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + h.mm B @@ -2024,11 +2083,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h.mm.ss a E HH.mm.ss y G + M/y G d/M/y GGGGG + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h.mm a HH.mm h.mm.ss a @@ -2103,10 +2163,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM y G E, d MMM y – E, d MMM y G - - h a – h a - h–h a - h.mm a – h.mm a h.mm–h.mm a @@ -2125,10 +2181,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH.mm–HH.mm v HH.mm–HH.mm v - - h a – h a v - h–h a v - M–M @@ -2281,6 +2333,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + M/y G + E, d/M/y G + d – d @@ -2829,7 +2885,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Kota Tidak Dikenal + Lokasi Tidak Dikenal Anguila @@ -2890,7 +2946,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Roma - Enderbury + Pulau Canton Komoro @@ -2964,6 +3020,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiev + + Pulau Wake + Beulah, Dakota Utara @@ -3005,9 +3064,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Waktu Afrika Barat - Waktu Standar Afrika Barat - Waktu Musim Panas Afrika Barat + Waktu Afrika Barat @@ -3435,6 +3492,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Waktu Guyana + + + Waktu Standar Hawaii-Aleutian + + + HAST + + Waktu Hawaii-Aleutian @@ -3909,6 +3974,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Waktu Chuuk + + + Waktu Turki + Waktu Standar Turki + Waktu Musim Panas Turki + + Waktu Turkmenistan @@ -4041,36 +4113,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤0 rb - 0 rb ¤ + ¤ 0 rb ¤00 rb - 00 rb ¤ + ¤ 00 rb ¤000 rb - 000 rb ¤ + ¤ 000 rb ¤0 jt - 0 jt ¤ + ¤ 0 jt ¤00 jt - 00 jt ¤ + ¤ 00 jt ¤000 jt - 000 jt ¤ + ¤ 000 jt ¤0 M - 0 M ¤ + ¤ 0 M ¤00 M - 00 M ¤ + ¤ 00 M ¤000 M - 000 M ¤ + ¤ 000 M ¤0 T - 0 T ¤ + ¤ 0 T ¤00 T - 00 T ¤ + ¤ 00 T ¤000 T - 000 T ¤ + ¤ 000 T @@ -4903,6 +4973,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dolar Karibia Timur + + Guilder Karibia + Guilder Karibia + Hak Khusus Menggambar @@ -4978,6 +5052,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dolar Zimbabwe (1980–2008) + + Emas Zimbabwe + emas Zimbabwe + Dolar Zimbabwe (2009) @@ -5172,7 +5250,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ millimol per liter {0} millimol per liter - + + bagian + {0} bagian + + bagian per juta {0} bagian per juta @@ -5185,6 +5267,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} permyriad + + glukosa + {0} glukosa + liter per kilometer {0} liter per kilometer @@ -5559,6 +5645,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimeter raksa {0} milimeter raksa + + raksa + {0} raksa + pound per inci persegi {0} pound per inci persegi @@ -5693,6 +5783,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ metric cup {0} metric cup + + metric fluid ounce + {0} metric fluid ounce + ekar kaki {0} ekar kaki @@ -5758,17 +5852,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ quart Imp. {0} quart Imp. - - cahaya - {0} cahaya + + steradian + {0} steradian - + + katal + {0} katal + + + coulomb + {0} coulomb + + + farad + {0} farad + + + henry + {0} henry + + + siemen + {0} siemen + + + kalori [IT] + {0} kalori [IT] + + + becquerel + {0} becquerel + + + sievert + {0} sievert + + + gray + {0} gray + + + kilogram gaya + {0} kilogram gaya + + + tesla + {0} tesla + + + weber + {0} weber + + bagian per miliar {0} bagian per miliar - malam - {0} malam {0} per malam @@ -5825,8 +5965,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ millimol/liter - + + bagian + {0} bagian + + bagian/juta + {0} bpj persen @@ -5837,6 +5982,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ permyriad + + Glc + {0} Glc + liter/km @@ -6068,6 +6217,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmHg {0} mmHg + + {0} Hg + in Hg @@ -6139,12 +6291,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp. + + {0} sr + + + {0} kat + + + {0} C + + + {0} F + + + {0} H + + + {0} S + + + kal-IT + {0} kal-IT + + + {0} kgf + + + {0} T + + + {0} Wb + cahaya {0} cahaya - + bagian/miliar + {0} bpm malam @@ -6188,8 +6372,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/L - - ppm + + bagian + {0} bagian + + + bpj + {0}bpj % @@ -6200,6 +6389,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + L/km @@ -6326,6 +6518,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ gr {0} gr + + {0} Hg + ″ Hg {0}″ Hg @@ -6379,14 +6574,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp - - cahaya - {0} cahaya + + {0} sr - - malam - {0} malam - {0}/malam + + kal-IT + {0} kal-IT + + + bpm + {0}bpm {0}T diff --git a/make/data/cldr/common/main/ie.xml b/make/data/cldr/common/main/ie.xml index 2d79e00936f..13ffcd1248d 100644 --- a/make/data/cldr/common/main/ie.xml +++ b/make/data/cldr/common/main/ie.xml @@ -66,13 +66,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic dzongkha grec anglesi - australian anglesi - canadian anglesi - britannic anglesi - anglesi de UR - american anglesi - anglesi de USA - Esperanto + australian anglesi + canadian anglesi + britannic anglesi + anglesi de UR + american anglesi + anglesi de USA + Esperanto hispan hispan del latin America europan hispan @@ -81,26 +81,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic basc persian dari - finn - filipinesi + finn + filipinesi fidjian feroesi francesi - canadian francesi + canadian francesi sviss francesi cadjun-francesi nord-frisian west-frisian - irlandesi + irlandesi scotian gaelic - galician + galician swiss-aleman - hausa + hausa haidan hawaian sud-haidan - hebreic - hindi + hebreic + hindi hindi latinisat hinglish croatian @@ -108,18 +108,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic haitian creol hungarian armenian - Interlingua + Interlingua indonesian Interlingue yi de Sichuan ingush Ido - islandesi + islandesi italian japanesi Lojban - javan - georgian + javan + georgian kazakh korean karelian @@ -208,7 +208,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic maoresi comoran sirian tadjic - thai + thai turcmen Klingon tlingit @@ -235,18 +235,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic standard maroccan tamazight chinesi chinesi, mandarin - chinesi simplificat - chinesi traditional + chinesi simplificat + chinesi traditional zulu sin linguistic contenete - + - + @@ -264,7 +264,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -273,7 +273,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -281,8 +281,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - + + + @@ -290,7 +291,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic munde Africa - septentrional America + septentrional America Sud-America Oceania West-Africa @@ -301,26 +302,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic meridional Africa Americas Nord-America - Caribes - Ost-Asia - Sud-Asia - Sudost-Asia - Sud-Europa - Australasia - Melanesia - region de Micronesia - Polinesia + Caribes + Ost-Asia + Sud-Asia + Sudost-Asia + Sud-Europa + Australasia + Melanesia + region de Micronesia + Polinesia Asia - Central Asia - West-Asia + Central Asia + West-Asia Europa - Ost-Europa - Nord-Europa - West-Europa + Ost-Europa + Nord-Europa + West-Europa Sub-Saharan Africa latin America Insul de Ascension - Andorra + Andorra Unit Arab Emiratus Afghanistan Antigua e Barbuda @@ -334,7 +335,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Austria Australia Aruba - Insules Åland + Insules Åland Azerbaidjan Bosnia e Herzegovina Barbados @@ -355,7 +356,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bhutan Insul Bouvet Botswana - Bielorussia + Bielorussia Belize Canada Insules Cocos (Keeling) @@ -372,6 +373,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic China Columbia Insul Clipperton + Sark Costa-Rica Cuba Cap-Verdi @@ -409,9 +411,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Grenada Georgia Francesi Guiana - Guernsey + Guernsey Ghana - Gibraltar + Gibraltar Greenland Gambia Guinea @@ -434,7 +436,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Indonesia Irland Israel - Insul de Man + Insul de Man India Chagos (BTIO) Britanic Territoria del Indian Ocean @@ -443,7 +445,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Iran Island Italia - Jersey + Jersey Jamaica Jordania Japan @@ -461,17 +463,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Laos Liban St.-Lucia - Liechtenstein + Liechtenstein Sri-Lanka Liberia Lesotho - Lituania + Lituania Luxemburg - Lettonia + Lettonia Libia Marocco Mónaco - Moldova + Moldova Montenegro St.-Martin Madagascar @@ -499,8 +501,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Insul Norfolk Nigeria Nicaragua - Nederland - Norvegia + Nederland + Norvegia Nepal Nauru Niue @@ -522,7 +524,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Palau Paraguay Qatar - periferic Oceania + periferic Oceania Reunion Rumania Serbia @@ -536,7 +538,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Singapur Sant-Helena Slovenia - Svalbard e Jan Mayen + Svalbard e Jan Mayen Slovakia Sierra-Leone San-Marino @@ -575,7 +577,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic US Uruguay Uzbekistan - Cité de Vatican + Cité de Vatican St. Vincent e Grenadines Venezuela Insules Vírginas (UR) @@ -584,8 +586,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Vanuatu Wallis e Futuna Samoa - pseudo-diacritica - pseudo-bidi + pseudo-diacritica + pseudo-bidi Kosovo Yemen Mayotte @@ -666,7 +668,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic x-sistema - calendare + calendare formate de valuta órdine valuta @@ -675,27 +677,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic númeres - buddhist calendare - chinesi calendare - coptic calendare - etiopic calendare + buddhist calendare + buddhist + chinesi calendare + chinesi + coptic calendare + coptic + etiopic calendare gregorian calendare - hebreic calendare - calendare hejra - calendare ISO-8601 + gregorian + hebreic calendare + calendare hejra + gregorian (li annu in avan) japanesi calendare persian calendare formate por contation standard valuta-formate - órdine Big5 órdine de dictionarium órdine predefinit de Unicode órdine paneuropan - órdine GB2312 órdine de numerarium órdine pinyin órdine por sercha standard órdine + standard órdine de strecs órdine de radicales sistema 12-hor (0..11) @@ -1050,10 +1055,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic T4 - 1-m trimestre - 2-m trimestre - 3-m trimestre - 4-m trimestre + 1-m trimestre + 2-m trimestre + 3-m trimestre + 4-m trimestre @@ -1176,13 +1181,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLL y G d MMM y G E d MMM y G - H 'h'. + H 'h'. + HH 'h'. 'de' v d.M E d.M d MMM E d MMM d MMMM - W-'im' 'semane' 'de' MMMM M.y d.M.y E d.M.y @@ -1192,10 +1197,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLLL y QQQ y QQQQ y - w-'im' 'semane' 'de' Y - {0} til {1} + {0} til {1} h – h B @@ -1329,114 +1333,90 @@ CLDR data files are interpreted according to the LDML specification (http://unic ultim annu ho-annu sequent annu - - pos {0} annus - - - ante {0} annus - + + ultim annu ho-annu seq. annu + + a ult. a. ho-a. seq. a. - - pos {0} a - - - ante {0} a - + + trimestre ultim trimestre ho-trimestre sequent trimestre - - pos {0} trimestres - - - ante {0} trimestres - + + trim. - - pos {0} tr - - - ante {0} tr - + + - tr + tr + + mensu - ultim mensu - ho-mensu - sequent mensu - - pos {0} mensus - - - ante {0} mensus - + ultim mensu + ho-mensu + sequent mensu + + - mn. + mn. ultim mensu ho-mensu seq. mensu + + - mn + mn ult. mn. ho-mn. seq. mn. - - pos {0} mn - - - ante {0} mn - + + semane ultim semane ho-semane sequent semane - - pos {0} semanes - - - ante {0} semanes - + + li semane de {0} - sem. + sem. ultim semane ho-semane seq. semane + + - sem + sem ult. sem. ho sem. seq. sem. - - pos {0} sem. - - - ante {0} sem. - + + sem. de {0} @@ -1447,26 +1427,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic die - anteyer + anteyer yer hodie deman - posdeman - - pos {0} dies - - - ante {0} dies - + posdeman + + + + + + d - - pos {0} d - - - ante {0} d - + + die del annu @@ -1475,7 +1451,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic die/annu - die del semane + die del semane die del sem. @@ -1493,211 +1469,127 @@ CLDR data files are interpreted according to the LDML specification (http://unic ultim soledí ho-soledí sequent soledí - - pos {0} soledís - - - ante {0} soledís - + + ult. sol. ho-sol. seq. sol. - - pos {0} sol. - - - ante {0} sol. - + + - - p. {0} so. - - - a. {0} so. - + + ultim lunedí ho-lunedí sequent lunedí - - pos {0} lunedís - - - ante {0} lunedís - + + ult. lun. ho-lun. seq. lun. - - pos {0} lun. - - - ante {0} lun. - + + - - p. {0} lu. - - - a. {0} lu. - + + ultim mardí ho-mardí sequent mardí - - pos {0} mardís - - - ante {0} mardís - + + ult. mar. ho-mar. seq. mar. - - pos {0} mar. - - - ante {0} mar. - + + - - p. {0} ma. - - - a. {0} ma. - + + ultim mercurdí ho-mercurdí sequent mercurdí - - pos {0} mercurdís - - - ante {0} mercurdís - + + ult. mer. ho-mer. seq. mer. - - pos {0} mer. - - - ante {0} mer. - + + - - p. {0} me. - - - a. {0} me. - + + ultim jovedí ho-jovedí sequent jovedí - - pos {0} jovedís - - - ante {0} jovedís - + + ult. jov. ho-jov. seq. jov. - - pos {0} jov. - - - ante {0} jov. - + + - - p. {0} jo. - - - a. {0} jo. - + + ultim venerdí ho-venerdí sequent venerdí - - pos {0} venerdís - - - ante {0} venerdís - + + ult. ven. ho-ven. seq. ven. - - pos {0} ven. - - - ante {0} ven. - + + - - p. {0} ve. - - - a. {0} ve. - + + ultim saturdí ho-saturdí sequent saturdí - - pos {0} saturdís - - - ante {0} saturdís - + + ult. sat. ho-sat. seq. sat. - - pos {0} sat. - - - ante {0} sat. - + + - - p. {0} sa. - - - a. {0} sa. - + + midídie @@ -1705,77 +1597,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic hor ti hor - - pos {0} hores - - - ante {0} hores - + + + + + + h - - pos {0} h - - - ante {0} h - + + minute ti minute - - pos {0} minutes - - - ante {0} minutes - + + min - - pos {0} min - - - ante {0} min - + + m - - pos {0} m - - - ante {0} m - + + seconde nu - - pos {0} secondes - - - ante {0} secondes - + + sec - - pos {0} sec - - - ante {0} sec - + + s - - pos {0} s - - - ante {0} s - + + zone horari @@ -1787,6 +1651,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic TMG{0} TMG + TMG+? témpor de {0} témpor estival de {0} témpor standard de {0} @@ -1796,7 +1661,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ínconosset cité + ínconosset loc Tirana @@ -1956,7 +1821,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Insul de Man + Insul de Man Teheran @@ -2075,6 +1940,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kiev + + Insul Wake + Los-Angeles @@ -2160,9 +2028,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - témpor del Insules Cook - témpor standard del Insules Cook - témpor estival del Insules Cook + témpor del Insules Cook + témpor standard del Insules Cook + témpor demíestival del Insules Cook @@ -2224,6 +2092,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic témpor estival del occidental Greenland + + + témpor standard de Hawai e Aleutes + + témpor de Hawai e Aleutes @@ -2304,710 +2177,516 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - 0 milles - 00 milles - 000 milles - 0 milliones - 00 milliones - 000 milliones - 0 milliardes - 00 milliardes - 000 milliardes - 0 billiones - 00 billiones - 000 billiones - + - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - + ¤ #,##0.00;¤ -#,##0.00 + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - + - {0} {1} UAE dirham - UAE dirhams afghan afghani - afghan afghanis albanian lek - albanian leks armenian dram - armenian drams guilder del Nederlandesi Antilles - guilderes del Nederlandesi Antilles angolan kwanza - angolan kwanzas argentinian peso - argentinian pesos australian dollar - australian dollares aruban florin - aruban florines azerbaidjanesi manat - azerbaidjanesi manates convertibil mark de Bosnia-Herzogovina - convertibil marks de Bosnia-Herzogovina barbadan dollar - barbadan dollares bangladeshan taka - bangladeshan takas bulgarian lev - bulgarian leves bahrainesi dinar - bahrainesi dinares burundian franc - burundian francs bermudan dollar - bermudan dollares brunesi dollar - brunesi dollares bolivian boliviano - bolivian bolivianos brasilian real - brasilian reales bahaman dollar - bahaman dollares bhutanesi ngultrum - bhutanesi ngultrums botswanan pula - botswanan pulas bieloruss ruble - bieloruss rubles belizan dollar - belizan dollares canadan dollar - canadan dollares congolesi franc - congolesi francs sviss franc - sviss francs F.Sv. chilan peso - chilan pesos chinesi yuan (extraterritorial) - chinesi yuanes (extraterritorial) chinesi yuan - chinesi yuanes columbian peso - columbian pesos costa-rican colon - costa-rican colones cuban convertibil peso - cuban convertibil pesos cuban peso - cuban pesos cap-verdesi escudo - cap-verdesi escudos tchec koruna - tchec korunas djibutian franc - djibutian francs danesi krone - danesi krones dominican peso - dominican pesos algerian dinar - algerian dinares egiptian pund - egiptian pundes eritrean nakfa - eritrean nakfas etiopian birr - etiopian birres euro - euros fidjian dollar - fidjian dollares pund de Falkland - pundes de Falkland pund sterling - pundes sterling georgian lari - georgian laris ghanan cedi - ghanan cedis pund de Gibraltar - pundes de Gibraltar gambian dalasi - gambian dalasis guinean franc - guinean francs guatemalan quetzal - guatemalan quetzales guyanesi dollar - guyanesi dollares dollar de Hong-Kong - dollares de Hong-Kong honduresi lempira - honduresi lempiras croatian kuna - croatian kunas haitian gourde - haitian gourdes hungarian forint - hungarian forintes indonesian rupia - indonesian rupias israelesi nov shekel - israelesi nov shekeles indian rupia - indian rupias irakesi dinar - irakesi dinares iranesi real - iranesi reales islandesi krona - islandesi kronas jamaican dollar - jamaican dollares jordanian dinar - jordanian dinares japanesi yen - japanesi yenes kenian shilling - kenian shillings kirgistanesi som - kirgistanesi somes cambodjan riel - cambodjan rieles comoran franc - comoran francs nord-korean won - nord-korean wones sud-korean won - sud-korean wones kuwaitesi dinar - kuwaitesi dinares caymanesi dollar - caymanesi dollares kazakhstanesi tenge - kazakhstanesi tenges laotic kip - laotic kipes libanesi pund - libanesi pundes sri-lankan rupia - sri-lankan rupias liberian dollar - liberian dollares lesothan loti - lesothan lotis libian dinar - libian dinares maroccan dirham - maroccan dirhams moldovan lei malgachic ariary - malgachic ariarys macedonian denar - macedonian denares myanmaran kyat - myanmaran kyates mongolian tugric - mongolian tugrics macan pataca - macan patacas mauritanian uguiya - mauritanian uguiyas maurician rupia - maurician rupias maldivan rufia - maldivan rufias malawian kwacha - malawian kwachas mexican peso - mexican pesos malaysian ringgit - malaysian ringgites mozambican metical - mozambican meticales namibian dollar - namibian dollares nigerian naira - nigerian nairas nicaraguan cordoba - nicaraguan cordobas norvegian krone - norvegian krones nepalesi rupia - nepalesi rupias nov-zelandesi dollar - nov-zelandesi dollares omanesi rial - omanesi riales panamesi balboa - panamesi balboas peruan sol - peruan soles kina de Papua Nov-Guinea - kinas de Papua Nov-Guinea filipinesi peso - filipinesi pesos pakistani rupia - pakistani rupias polonesi zloty - polonesi zlotys paraguayan guarani - paraguayan guaranis qataresi riyal - qataresi riyales rumanian lei serbian dinar - serbian dinares russian ruble - russian rubles Rub. rwandan franc - rwandan francs sauditic riyal - sauditic riyales dollar del Insules Solomon - dollares del Insules Solomon seychellan rupia - seychellan rupias sudanesi pund - sudanesi pundes sved krona - sved kronas singapuran dollar - singapuran dollares pund de Sant-Helena - pundes de Sant-Helena leone de Sierra-Leone - leones de Sierra-Leone leone de Sierra-Leone (1964..2022) - leones de Sierra-Leone (1964..2022) somalian shilling - somalian shillings surinamesi dollar - surinamesi dollares sud-sudanesi pund - sud-sudanesi pundes dobra de São Tomé e Príncipe - dobras de São Tomé e Príncipe sirian pund - sirian pundes swazian lilangeni - swazian lilangenis thai baht - thai bahtes tadjikistanesi somoni - tadjikistanesi somonis turcmen manat - turcmen manates tunisian dinar - tunisian dinares tongan pa’anga - tongan pa’angas turc lira - turc liras dollar de Trinidad e Tobago - dollares de Trinidad e Tobago nov taiwanesi dollar - nov taiwanesi dollares tanzanian shilling - tanzanian shillings ukrainan hrivnia - ukrainan hrivnias ugandesi shilling - ugandesi shillings american dollar - american dollares uruguayan peso - uruguayan pesos uzbec som - uzbec somes venezuelan bolivar - venezuelan bolivares vietnamesi dong - vietnamesi dongs vanuatuan vatu - vanuatuan vatus samoan tala - samoan talas CFA franc - CFA francs argent - troy-uncies de argent aur - troy-uncies de aur ost-caribean dollar - ost-caribean dollares west-african CFA franc - west-african CFA francs palladium - troy-uncies de palladium CFP franc - CFP francs platine - troy-uncies de platine ínconosset valuta - de ínconosset valuta yemenesi real - yemenesi reales sud-african rand - sud-african randes zambian kwacha - zambian kwachas @@ -3015,7 +2694,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}..{1} - {0} dies Li {0}-im edition @@ -3081,89 +2759,64 @@ CLDR data files are interpreted according to the LDML specification (http://unic yotta{0} - - {0} quadrat - - - {0} cubic - + + {0}-{1} metres per seconde quadrat - {0} metres per seconde quadrat - radianes - {0} radianes + radianes - gradus - {0} gradus + gradus arc-minutes - {0} arc-minutes arc-secondes - {0} arc-secondes kilometres quadrat - {0} kilometres quadrat hectares - {0} hectares metre quadrat - {0} metres quadrat centimetre quadrat - {0} centimetres quadrat milies quadrat - {0} milies quadrat - - - {0} acres yardes quadrat - {0} yardes quadrat pedes quadrat - {0} pedes quadrat inches quadrat - {0} inches quadrat carates - {0} carates percent - {0} percent permille - {0} permille litres per kilometre - {0} litres per kilometre petaoctetes - {0} petaoctetes teraoctetes @@ -3191,420 +2844,319 @@ CLDR data files are interpreted according to the LDML specification (http://unic octetes - {0} octetes bits - {0} bits secules - {0} secules decennies - {0} decennies - {0} annus {0} per annu trimestres - {0} trimestres {0} per trimestre - {0} mensus {0} per mensu - {0} semanes {0} per semane - {0} dies {0} per die - {0} hores {0} per hor minutes - {0} minutes {0} per minute secondes - {0} secondes {0} per seconde millisecondes - {0} millisecondes microsecondes - {0} microsecondes nanosecondes - {0} nanosecondes amperes - {0} amperes milliamperes - {0} milliamperes ohms - {0} ohms voltes - {0} voltes kilocalories - {0} kilocalories calories - {0} calories kilojoules - {0} kilojoules joules - {0} joules kilowatt-hores - {0} kilowatt-hores electron-voltes - {0} electron-voltes britanic termal unités - {0} britanic termal unités newtones - {0} newtones gigahertz - {0} gigahertz megahertz - {0} megahertz kilohertz - {0} kilohertz hertz - {0} hertz pixels - {0} pixels megapixels - {0} megapixels pixels per centimetre - {0} pixels per centimetre pixels per inch - {0} pixels per inch radiuses del terra - {0} radiuses del terra kilometres - {0} kilometres {0} per kilometre metres - {0} metres {0} per metre decimetres - {0} decimetres centimetres - {0} centimetres {0} per centimetre millimetres - {0} millimetres micrometres - {0} micrometres nanometres - {0} nanometres picometres - {0} picometres milies - {0} milies yards - {0} yardes pedes - {0} pedes {0} per pede inches - {0} inches {0} per inch parsecs - {0} parsecs luce-annus - {0} luce-annus unité astronomic - {0} unités astronomic marin milies - {0} marin milies punctus - {0} punctus radiuses del sol - {0} radiuses del sol lux - {0} lux candelas - {0} candelas lumenes - {0} lumenes luminositás solari - {0} luminositás solari tonnes - {0} tonnes kilogrammes - {0} kilogrammes {0} per kilogramm grammes - {0} grammes {0} per gramm milligrammes - {0} milligrammes microgrammes - {0} microgrammes american tonnes - {0} american tonnes stones - {0} stones pundes - {0} pundes uncies - {0} uncies gigawattes - {0} gigawattes megawattes - {0} megawattes kilowattes - {0} kilowattes wattes - {0} wattes milliwattes - {0} milliwattes cavall-forties - {0} cavall-forties bares - {0} bares millibares - {0} millibares atmosferes - {0} atmosferes pascales - {0} pascales hectopascales - {0} hectopascales kilopascales - {0} kilopascales megapascales - {0} megapascales kilometres per hor - {0} kilometres per hor metres per seconde - {0} metres per seconde milies per hor - {0} milies per hor nodes - {0} nodes gradus de temperatura - {0} gradus de temperatura gradus Celsius - {0} gradus Celsius gradus Fahrenheit kelvines - {0} kelvines newton-metres - {0} newton-metres kilometres cubic - {0} kilometres cubic metres cubic - {0} metres cubic centimetres cubic - {0} centimetres cubic milies cubic - {0} milies cubic yardes cubic - {0} yardes cubic pedes cubic - {0} pedes cubic inches cubic - {0} inches cubic megalitres - {0} megalitres litres - {0} litres decilitres - {0} decilitres centilitres - {0} centilitres millilitres - {0} millilitres busheles - {0} busheles direction cardinal @@ -3618,61 +3170,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic mc{0} + + {0}{1} - ° + ° acres Po - {0} Po To - {0} To Go - {0} Go Mo - {0} Mo ko - {0} ko oct - {0} oct scl - {0} scl annus - {0} a {0}/a tr - {0} tr {0}/tr mensus - {0} mn {0}/mn semanes - {0} sem {0}/sem @@ -3683,7 +3226,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic mcs - {0} mcs A @@ -3693,29 +3235,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic btu - {0} btu m mcm - {0} mcm la - {0} la ua - {0} ua gramm mcg - {0} mcg milies/hor @@ -3725,7 +3262,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic l - {0} L {0}/L @@ -3736,6 +3272,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + {0}⋅{1} @@ -3744,7 +3282,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic o - {0} o a @@ -3763,7 +3300,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic m - {0} m {0}/m @@ -3836,7 +3372,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} — varie {0} — altri scrituras — {0} - {0}-strec subscrit {0} surscrit {0} activité diff --git a/make/data/cldr/common/main/ig.xml b/make/data/cldr/common/main/ig.xml index 787eb2c8133..dc610707af9 100644 --- a/make/data/cldr/common/main/ig.xml +++ b/make/data/cldr/common/main/ig.xml @@ -23,19 +23,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Akan Aleut Southern Altai - Amariikị + Asụsụ Amariikị Aragonisị Obolo Angika apcc - Arabiikị + Asụsụ Arabiikị Ụdị Arabiikị nke oge a Mapuche Arapaho Najdi Arabikị - Asamisị + Asụsụ Asamisị Asụ - Asturianị + Asụsụ Asturianị Atikamekw Avarịk Awadhi @@ -180,7 +180,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hungarian Hupa Halkomelem - Armenianị + Asụsụ Armenianị Herero Interlingua Iban @@ -237,6 +237,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafịa Colognian Kurdish + Asụsụ Kurdish + Asụsụ Kurmanji Kumik Komi Cornish @@ -992,47 +994,86 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ụsọrọ egọ Ụsọrọ Nhazị Egọ + Ngosiputa Emoji Okịrịkịrị Awa (12 vs 24) Akara akanka nkwụsị + Nkwụsị Ahịrị n’ime Okwu Ụsọrọ Mmeshọ Nọmba + Nkwụsị ahịrịokwu mgbe nkenke gasịrị Kalenda Bụddịst + Onye ụka Buda Kalenda Chinese + China Kalenda Koptic + Koptic Kalenda Dang + Dangi Kalenda Etopịa + Ethiopic Etiopic Amete Alem Kalenda + Ethiopic Amete Alem Kalenda Gregory + Gregorian Kalenda Hebrew + Hebrew Kalenda India Kalenda Hijri + Hijri Kalenda Hijri + Hijri (tabular, civil epoch) Kalenda Hijri (Saudi Arabia, sighting) Kalenda Hijri (tabular, astronomical epoch) Kalenda Hijri (Umm al-Qura) + Hijri (Umm al-Qura) Kalenda ISO-8601 Kalenda Japanese + Japanese Kalenda Persian + Persian Kalenda repụblic nke China + Minguo Ụsọrọ akantụ egọ + Akantụ egọ Ụsọrọ egọ nzụgbe + Ụkpụrụ Default Unicode ụsọrọ nhazị + Unicode Ndabere Nhazị akwụkwọ ebe a na-ede nọmba fon Pinyin ụsọrọ nhazị Ọchụchụ nịle + Ọchụchụ Usoro Nhazi + Ụkpụrụ + Ndabara + emoji + Ederede Ụsọrọ Okịrịkịrị awa iri na abụọ (0–11) + 12 (0–11) Ụsọrọ Okịrịkịrị awa iri na abụọ (0–12) + 12 (1–12) Ụsọrọ Okịrịkịrị (0–23) + 24 (0–23) Ụsọrọ Okịrịkịrị (1–24) + 24 (1–24) Akara akanka nkwụsị esịghị ịke + Esịghị ịke Akara akanka nkwụsị kwesịrị + Kwesịrị Akara akanka nkwụsị sịrị ịke + Sịrị ịke + Kewaa nke niile + Dobe nke niile + Nkịtị + Dobe na nkebiokwu Ụsọrọ Metric + Metrik Ụsọrọ Mmeshọ ịmperịa + UK Ụsọrọ Mmeshọ US + US Ọnụ ọgụgụ Ahom Ọnụ ọgụgụ Arab na Indị Ọnụ ọgụgụ Arab na Indị agbatịrị @@ -1123,6 +1164,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ọnụ ọgụgụ Vai Ọnụ ọgụgụ Warang Citi Ọnụ ọgụgụ Wancho + Mgbanyụ + Mgbanye Metriik @@ -1172,6 +1215,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'na' {0} + + {1} 'na' {0} + @@ -1180,6 +1226,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'na' {0} + + {1} 'na' {0} + @@ -1260,20 +1309,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic N D - - Jenụwarị - Febrụwarị - Maachị - Epreel - Mee - Jun - Julaị - Ọgọọst - Septemba - Ọktoba - Novemba - Disemba - @@ -1313,14 +1348,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ọkara 4 - - - Q1 - Q2 - Q3 - Q4 - - @@ -1328,29 +1355,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic N’ụtụtụ N’abalị - - N’ụtụtụ - N’abalị - N’ụtụtụ N’abali - - - N’ụtụtụ - N’abalị - - - N’ụtụtụ - N’abalị - - - N’ụtụtụ - N’abalị - - @@ -1423,6 +1432,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'na' {0} + + {1} 'na' {0} + @@ -1431,6 +1443,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'na' {0} + + {1} 'na' {0} + @@ -1465,10 +1480,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 'Izu' w 'n' 'ime' Y - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1479,10 +1490,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M – M @@ -1492,46 +1499,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, M/d – E, M/d - MM-dd, E – MM-dd, E MMM – MMM - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - MM/y – MM/y - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - - - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - y MMM – y MMM - - - y MMM d – MMM d - y MMM d – y MMM d - - - y MMM d, E – MMM d, E - y MMM d, E – MMM d, E - y MMM d, E – y MMM d, E - - - y MMMM – y MMMM @@ -1541,12 +1514,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Oge - - Oge - - - Oge - Afọ Afọ gara aga @@ -1559,9 +1526,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic afọ na-abịa - Afọ gara aga - Afọ a - afọ na-abịa Afọ {0} gara aga @@ -1578,38 +1542,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nkejị keanọ {0} gara aga - - - Nkejị keanọ {0} - - - Nkejị keanọ {0} gara aga - - - - - Nkejị keanọ {0} - - - Nkejị keanọ {0} gara aga - - Ọnwa Ọnwa gara aga Ọnwa a Ọnwa na-abịa - - Ọnwa gara aga - Ọnwa a - Ọnwa na-abịa - - - Ọnwa gara aga - Ọnwa a - Ọnwa na-abịa - Izu Izu gara aga @@ -1637,14 +1575,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic n’ụbọchị {0} gara aga - - - n’ụbọchị {0} - - - n’ụbọchị {0} gara aga - - ụbọchị na afọ @@ -1755,12 +1685,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ụbọchị Faraịde gara aga ụbọchị Faraịde a ụọchị Faraịde na abịa - - n’ụbọchị Faraịde {0} - - - n’ụbọchị Faraịde gara aga {0} - ụbọchị Satụde gara aga @@ -1774,9 +1698,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ụbọchị Satụde gara aga ụbọchị Satụde a ụbọchị Satụde na abịa - - Ụbọchị Satụde {0} gara aga - ụbọchị Satụde gara aga @@ -1800,9 +1721,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sekọnd - - sekọnd - Mpaghara oge @@ -1829,9 +1747,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Oge Okpomọkụ Ireland - - Enderbury - Oge Afghanistan @@ -1854,9 +1769,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Oge Mpaghara Ọdịda Anyanwụ Afrịka - Oge Izugbe Mpaghara Ọdịda Anyanwụ Afrịka - Oge Okpomọkụ Mpaghara Ọdịda Anyanwụ Afrịka + Oge Mpaghara Ọdịda Anyanwụ Afrịka @@ -2206,6 +2119,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Oge Guyana + + + Oge Izugbe Hawaii-Aleutian + + Oge Hawaii-Aleutian @@ -2740,7 +2658,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -3279,6 +3196,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ego Dollar obodo East Carribbean + + Ego Guilder Caribbean + Ego Guilder Caribbean + Ego CFA Franc obodo West Africa Ego CFA francs mba ọdịda anyanwụ Afrịka @@ -3302,6 +3223,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ego Kwacha Obodo Zambia Ego kwachas obodo Zambia + + Ego Ọlaọcha Zimbabwe + Ego Ọlaọcha Zimbabwe + {0}+ @@ -3349,6 +3274,59 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kubik + + {0} g-force + + + meters per second squared + {0} meters per second squared + + + square kilomita + {0} square kilomita + {0} per square kilomita + + + {0} hectare + + + square mita + {0} square mita + {0} kwa square mita + + + square centimita + {0} square centimita + {0} kwa square centimita + + + square mile + {0} square mile + {0} kwa square mile + + + {0} acre + + + square yard + {0} square yard + + + square feet + {0} square feet + + + square inches + {0} square inches + {0} kwa square inch + + + akụkụ gasị + {0} akụkụ gasị + + + {0} of glucose + Ọtụtụ nari afọ {0} Ọtụtụ nari afọ @@ -3363,7 +3341,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nkeji Nkeano - {0}/q + {0} nkeji iri anọ Ọtụtụ Ọnwa @@ -3375,12 +3353,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Ọtụtụ Izu {0} kwa Izu - - Ọtụtụ Ubochi - {0} Ọtụtụ Ubochi - - Ọtụtụ awa {0} Ọtụtụ awa @@ -3393,10 +3366,50 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} sekọnd {0} kwa sekọnd + + ampere + {0} ampere + + + milliampere + + + {0} ohm + + + {0} volt + + + kilocalorie + {0} kilocalorie + + + calorie + {0} calorie + Kalori {0} Kalori + + kilojoules + {0} kilojoule + + + {0} joule + + + kilowatt-hour + {0} kilowatt-hour + + + electronvolt + {0} electronvolt + + + kilohertz + {0} kilohertz + {0} pixels @@ -3420,29 +3433,388 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ntụpọ kwa inch - radius uwa + okirikiri ụwa + {0} okirikiri ụwa + + + kilomita + {0} kilomita + {0} kwa kilomita + + + mita + {0} mita + {0} kwa mita + + + decimita + {0} decimita + + + centimita + {0} centimita + {0} kwa centimita + + + millimita + {0} millimita + + + micromita + {0} micromita + + + nanomita + {0} nanomita + + + picomita + {0} picomita + + + mile + {0} mile + + + yard + {0} yard + + + feet + {0} feet + {0} kwa foot + + + inches + {0} inches + {0} kwa inch + + + parsecs + {0} parsecs + + + light years + {0} light years + + + astronomical units + {0} astronomical units + + + nautical miles + {0} nautical miles + + + miles-scandinavian + {0} miles-scandinavian + + + points + {0} points + + + solar radii + {0} solar radii + + + metric tons + {0} metric tons + + + kilograms + {0} kilograms + {0} kwa kilogram + + + {0} gram + {0} kwa gram + + + milligram + {0} milligrams + + + microgram + {0} microgram + + + ton + {0} ton + + + pound + {0} pound + {0} per pound + + + ounce + {0} ounce + {0} kwa ounce + + + troy ounce + {0} troy ounce + + + carat + {0} carat + + + dalton + {0} dalton + + + Earth mass + {0} Earth mass + + + solar mass + {0} solar mass + + + gigawatt + {0} gigawatt + + + megawatt + {0} megawatt + + + kilowatt + {0} kilowatt + + + {0} watt + + + milliwatt + {0} milliwatt + + + horsepower + {0} horsepower + + + nke mekuri + {0} nke mekuri + + + ike-paụnd kwa sukwịa inch + {0} ike-paụnd kwa sukwịa inch + + + inche kwa mekuri + {0} inche kwa mekuri + + + kilometers per hour + {0} kilometers per hour + + + meters per second + {0} meters per second + + + miles per hour + {0} miles per hour + + + knots + {0} knots Beaufort Beaufort {0} + + cubic kilomita + {0} cubic kilomita + + + cubic mita + {0} cubic mita + {0} kwa cubic mita + + + cubic centimita + {0} cubic centimita + {0} kwa cubic centimita + + + cubic mile + {0} cubic mile + + + cubic yard + {0} cubic yard + + + cubic feet + {0} cubic feet + + + cubic inches + {0} cubic inches + + + megaliter + {0} megaliter + + + hectoliter + {0} hectoliter + + + {0} liter + {0} kwa liter + + + deciliter + {0} deciliter + + + centiliter + {0} centiliter + + + milliliter + {0} milliliter + + + metric pints + {0} metric pint + + + metric cup + {0} metric cup + + + metric fluid ounces + {0} metric fluid ounces + + + acre-feet + {0} acre-feet + + + gallon + {0} gallon + {0} kwa gallon + + + Imp. gallons + {0} Imp. gallons + {0} per Imp. gallon + + + quart + {0} quart + + + pint + {0} pint + + + iko + {0} iko + + + fluid ounce + {0} fluid ounces + + + Imp. fluid ounces + {0} Imp. fluid ounces + + + ngaji + {0} ngaji + + + obere ngaji + {0} obere ngaji + + + barel + {0} barel + - ngaji mégharia onu + {0} ngaji mégharia onu + + + Imp. ngaji megharịa ọnụ + {0} Imp. ngaji mégharia onu + + + ntụsà + {0} ntụsà - mmiri dram + dram + {0} dram - - ìhè - {0} ìhè + + Imp. quarts + {0} Imp. quarts - + + steradians + {0} steradians + + + katals + {0} katals + + + kolumb + {0} kolumb + + + farads + {0} farads + + + henrys + {0} henrys + + + siemens + {0} siemens + + + calorie [IT] + {0} calorie [IT] + + + becquerel + {0} becquerel + + + sievert + {0} sievert + + + gray + {0} gray + + + kilograms-force + {0} kilograms-force + + + teslas + {0} teslas + + + webers + {0} webers + + akụkụ kwa ijeri {0} akụkụ kwa ijeri - Ọtụtụ abali - {0} Ọtụtụ abali {0} kwa abali @@ -3453,10 +3825,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + meters/sec² + + + mita² + + + sq mile + + + yards² + + + sq feet + {0} sq ft + + + inches² + ihe {0} ihe + + akụkụ + {0} akụkụ + + + Glc + {0} qtrs @@ -3474,10 +3872,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ọtụtụ awa {0} awa + + milliamp + Kal {0} Kal + + kilojoule + + + kW-hour + + + electronvolt + dpcm {0} dpcm @@ -3490,17 +3900,142 @@ CLDR data files are interpreted according to the LDML specification (http://unic ntụpọ {0} ntụpọ + + okirikiri ụwa + + + m + + + μmita + + + mile + + + yard + + + feet + + + inches + + + parsecs + + + light yrs + + + points + + + solar radii + + + ton + + + pound + + + oz troy + + + carat + + + dalton + + + Earth mass + + + solar mass + + + {0} gr + + + nke Hg + {0} nke Hg + + + km/hour + + + meters/sec + + + miles/hour + {0} mph + + + yards³ + + + feet³ + + + inches³ + + + {0} L + + + gal + {0} gal + + + {0}/galImp + + + qts + + + pint + + + iko + + + fl oz + {0} fl oz + + + barel + ngaji mégharia onu + {0} dsp + + + Imp. ngaji mégharia onu + {0} dsp-Imp. - dobé + ntụsà + {0} ntụsà + + + dram + {0} dram + + + {0} pn + + + Imp. quarts + + + cal-IT ìhè {0} ìhè - + akụkụ/ijeri @@ -3510,25 +4045,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + {0}Gs + + + {0}m/s² + + + mita² + + + yards² + + + sq feet + {0} sq ft + + + inches² + {0}mmol/L {0}ihe - + + akụkụ + {0}akụkụ + + {0}ppm + + Glc + {0}q + + {0}w + Ubochi - {0} Ọtụtụ Ubochi awa - {0} awa μsec @@ -3537,6 +4099,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ns + + {0}A + + + milliamp + + + {0}Ω + + + {0}V + + + {0}kcal + kal {0}kal @@ -3544,6 +4121,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}Kal + + {0}kJ + + + {0}J + + + kW-hour + {0}kWh + + + electronvolt + {0}eV + + + {0}US therm + {0}N @@ -3557,30 +4151,223 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}MP - dpcm {0}dpcm - dpi {0}dpi {0}ntụpọ + + m + + + μmita + + + mile + + + yard + + + feet + {0}′ + + + inches + {0}″ + + + parsec + + + pts + + + {0}t + + + {0}kg + + + {0}g + + + {0}mg + + + {0}μg + + + ton + {0}tn + + + pound + {0}# + + + {0}oz + + + oz troy + {0}oz t + + + carat + {0}CD + + + dalton + {0}Da + + + Earth mass + {0}M⊕ + + + solar mass + {0}M☉ + + + gr + {0}gr + + + {0}GW + + + {0}MW + + + {0}kW + + + {0}W + + + {0}mW + + + {0}hp + + + nke Hg + {0}nke Hg + + + ″ Hg + {0}″ Hg + + + km/hr + {0}km/h + + + meters/sec + {0}m/s + + + mi/hr + {0}mph + + + {0}kn + B{0} + + yards³ + + + feet³ + + + {0} L + + + pt + + + acre ft + + + gal + {0}gal + {0}/gal + + + {0}gal-Im + {0}/galIm + + + qts + {0}qt + + + pint + + + iko + + + fl oz + {0}fl oz + + + {0}fl oz Im + + + {0}tbsp + + + {0}tsp + + + barel + {0}bbl + + + dsp + {0}dsp + + + dsp Imp + {0}dsp-Imp + + + dr + {0}dr + + + fl.dr. + {0}fl.dr. + + + {0}jigger + + + pn + {0}pn + + + Imp. quarts + {0}qt-Imp. + + + cal-IT + - ìhè {0}ìhè - + akụkụ/ijeri - Ọtụtụ abali {0}Ọtụtụ abali - {0}/abali @@ -3593,22 +4380,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, ma ọ bụ {1} {0} ma ọ bụ {1} - - {0}, ma ọ bụ {1} - {0} ma ọ bụ {1} - - - {0}, ma ọ bụ {1} - {0} ma ọ bụ {1} - {0}, {1} {0}, {1} - - {0}, {1} - {0}, {1} - {0} {1} {0} {1} diff --git a/make/data/cldr/common/main/ii.xml b/make/data/cldr/common/main/ii.xml index 268e4a9808e..1c61148df34 100644 --- a/make/data/cldr/common/main/ii.xml +++ b/make/data/cldr/common/main/ii.xml @@ -17,7 +17,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ꀊꇁꀨꉙ - ꀊꇁꀨꉙ(ꋧꃅ) ꄓꇩꉙ ꑱꇩꉙ ꑭꀠꑸꉙ @@ -95,6 +94,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic [A B {BB} C {CH} D {DD} E F G {GG} H {HL} {HM} {HN} {HX} I {IE} J {JJ} K L M {MG} N {NB} {ND} {NG} {NJ} {NR} {NY} {NZ} O P Q R {RR} S {SH} {SS} T {UO} V W X Y Z {ZH} {ZZ}] [\- ‑ , . {\\\-} % ‰ + 0 1 2 3 4 5 6 7 8 9 {ꋍꑍꌕꇖꉬꃘꏃꉆꈬ}] [﹉﹊﹋﹌ __﹍﹎﹏︳︴ \--﹣ ‐‑ – —︱ ― ,,﹐ 、﹑ ;;﹔ \::﹕ !!﹗ ??﹖ ..﹒ ‥︰ … 。 · '‘’ "“”〝〞 ((﹙︵ ))﹚︶ \[[ \]] \{{﹛︷ \}}﹜︸ 〈︿ 〉﹀ 《︽ 》︾ 「﹁ 」﹂ 『﹃ 』﹄ 【︻ 】︼ 〔﹝︹ 〕﹞︺ 〖 〗 ‖ § @@﹫ **﹡ // \\\﹨ \&&﹠ ##﹟ %%﹪ ‰ ′ ″ ‵ 〃 ※] + [\- ‐‑ ・ . · ⸱] diff --git a/make/data/cldr/common/main/is.xml b/make/data/cldr/common/main/is.xml index a1cd0c5ef1c..def029d1654 100644 --- a/make/data/cldr/common/main/is.xml +++ b/make/data/cldr/common/main/is.xml @@ -284,6 +284,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafía kölníska kúrdíska + kúrdíska + kurmanji kúmík kútenaí komíska @@ -780,6 +782,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kína Kólumbía Clipperton-eyja + Sark Kostaríka Kúba Grænhöfðaeyjar @@ -956,6 +959,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sint Maarten Sýrland Esvatíní + Svasíland Tristan da Cunha Turks- og Caicoseyjar Tsjad @@ -1025,33 +1029,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Talnaröðun Röðunarstyrkur Gjaldmiðill + Framsetning emoji Tímakerfi (12 eða 24) Línuskipting + Línuskil innan orða Mælingakerfi Tölur + Hindranir á línuskiptingu Tímabelti Landsstaðalsafbrigði Einkanotkun Búddískt tímatal - Kínversk tímatal + Búddískt + Kínverskt tímatal + Kínverskt Koptískt tímatal - Dangi tímatal + Koptískt + Dangi-tímatal + Dangi Eþíópískt tímatal + Eþíópískt Eþíópískt ‘amete alem’ tímatal + Eþíópískt ‘amete alem’ Gregorískt tímatal + Gregorískt Hebreskt tímatal + Hebreskt indverskt dagatal Íslamskt tímatal + Íslamskt tímatal Íslamskt borgaradagatal + Íslamskt borgaradagatal Íslamskt dagatal (Umm al-Qura) + Íslamskt dagatal (Umm al-Qura) ISO-8601 tímatal Japanskt tímatal + Japanskt Persneskt tímatal - Minguo tímatal + Persneskt + Minguo-tímatal + Minguo Bókhaldsgjaldmiðill + Bókhald Staðlað gjaldmiðilssnið + Staðlað Raða táknum Raða óháð táknum Raða áherslum eðlilega @@ -1061,18 +1084,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Raða hástöfum fyrst Raða óháð hástöfum og lágstöfum Raða stafrétt - hefðbundin kínversk röðun - Big5 Fyrri röðun, til samræmis Orðabókarröð Sjálfgefin Unicode-röðun + Sjálfgefin Unicode Evrópskar reglur um röðun - einfölduð kínversk röðun - GB2312 Símaskráarröðun Hljóðfræðileg röð Pinyin-röðun Almenn leit + Leit Leita eftir upphafssamhljóða í Hangul Stöðluð röðun + Stöðluð Strikaröðun Hefðbundin Röðun eftir grunnstrikum @@ -1088,18 +1112,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Full breidd Hálfbreidd Tölulegur + Staðlað + Emoji + Texti 12 tíma kerfi (0–11) + 12 (0–11) 12 tíma kerfi (1–12) + 12 (1–12) 24 tíma kerfi (0–23) + 24 (0–23) 24 tíma kerfi (1–24) + 24 (1–24) Laus línuskipting + Laus Venjuleg línuskipting + Venjuleg Ströng línuskipting + Ströng + Skipta öllu + Halda öllu + Venjuleg + Halda í setningum US BGN umritun UN GEGN umritun Metrakerfi + Metrakerfi Breskt mælingakerfi + Breskt Bandarískt mælingakerfi + Bandarískt ahom-tölur Arabískar-indverskar tölur Auknar arabískar-indverskar tölur @@ -1145,6 +1186,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tíbeskir tölustafir Hefðbundin tölutákn Vai-tölustafir + Slökkt + Kveikt metrakerfi @@ -1161,13 +1204,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [a á b d ð e é f g h i í j k l m n o ó p r s t u ú v x y ý þ æ ö] [c q w z] [A Á B C D Ð E É F G H I Í J K L M N O Ó P Q R S T U Ú V W X Y Ý Z Þ Æ Ö] - [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ ( ) \[ \] § @ * / \& # † ‡ ′ ″] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1189,16 +1229,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ BD - - - - h B – h B - - - h:mm B – h:mm B - - - @@ -1241,12 +1271,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - Tímabil0 - Tímabil1 - - @@ -1281,6 +1305,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1289,6 +1316,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1305,13 +1335,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM-y G d/M/y GGGGG + E dd-MM-y G MMM y G d. MMM y G E, d. MMM y G - h a h:mm a h:mm:ss a + HH'klst'. v d.M. E, d.M. d. MMM @@ -1372,10 +1404,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM – E, d. MMM y G E, d. MMM y – E, d. MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1386,10 +1414,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M.–M. @@ -1679,6 +1703,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1687,6 +1714,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1705,17 +1735,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, h:mm:ss a E, HH:mm:ss y G - d/M/y GGGGG + M/y G + d/M/y G + E, d/M/y G MMM y G d. MMM y G E, d. MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v v – HH:mm:ss h:mm a v v – HH:mm + HH'klst'. v d.M. E, d.M. d. MMM @@ -1778,10 +1810,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d. MMM – E, d. MMM y G E, d. MMM y – E, d. MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1792,10 +1820,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M.–M. @@ -2637,7 +2661,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tókýó - Enderbury + Kanton-eyja Sankti Kitts @@ -2826,9 +2850,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Vestur-Afríkutími - Staðaltími í Vestur-Afríku - Sumartími í Vestur-Afríku + Vestur-Afríkutími @@ -3185,6 +3207,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gvæjanatími + + + Staðaltími á Havaí og Aleúta + + Tími á Havaí og Aleúta @@ -3766,6 +3793,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -4783,6 +4814,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ austurkarabískur dalur austurkarabískir dalir + + Karíbahafsgyllini + Karíbahafsgyllini + Karíbahafsgyllini + XCG + Sérstök dráttarréttindi @@ -4843,6 +4880,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Simbabveskur dalur + + simbabveskt gold + simbabveskt gold + simbabveskt gold + {0}+ @@ -5204,7 +5246,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} atriðum {0} atriða - + + hlutar + {0} hluti + {0} hlutar + + masculine {0} milljónarhluti {0} milljónarhluta @@ -5259,6 +5306,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mólum {0} móla + + af glúkósa + {0} af glúkósa + {0} af glúkósa + masculine lítrar á kílómetra @@ -6240,6 +6292,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimetrum af kvikasilfri {0} millimetra af kvikasilfri + + af kvikasilfri + {0} af kvikasilfri + {0} af kvikasilfri + pund á fertommu {0} pund á fertommu @@ -6573,6 +6630,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} áströlskum bollum {0} ástralskra bolla + + vökvaúnsur í metrakerfi + {0} vökvaúnsa í metrakerfi + {0} vökvaúnsur í metrakerfi + gallon {0} gallon @@ -6640,7 +6702,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ klípur - + + steradíanar + {0} steradíani + {0} steradíanar + + + katöl + {0} katal + {0} katöl + + + kúlomb + {0} kúlomb + {0} kúlomb + + + faröd + {0} farad + {0} faröd + + + henry + {0} henry + {0} henry + + + símens + {0} símens + {0} símens + + + hitaeiningar [IT] + {0} hitaeining [IT] + {0} hitaeiningar [IT] + + + bekerel + {0} bekerel + {0} bekerel + + + sívert + {0} sívert + {0} sívert + + + grei + {0} grei + {0} grei + + + kílópond + {0} kílópond + {0} kílópond + + + teslur + {0} tesla + {0} teslur + + + veber + {0} veber + {0} veber + + + ljóshraði + {0} ljóshraði + {0} ljóshraðar + + masculine hlutar á milljarð {0} hluti á milljarð @@ -6663,7 +6795,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} nætur {0} nóttum {0} nótta - {0}/nótt höfuðátt @@ -6763,7 +6894,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} atriði {0} atriði - + + hluti + {0} hluti + {0} hlutar + + milljónarhlutar @@ -6782,6 +6918,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mól {0} mól + + Glc + lítrar/km {0} l/km @@ -7063,6 +7202,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} hö {0} hö + + af Hg + {0} af Hg + {0} af Hg + to Hg {0} to Hg @@ -7242,6 +7386,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} lagarmál {0} lagarmál + + kal-IT + {0} kal-IT + {0} kal-IT + + + ljóshraði + {0} ljóshraði + {0} ljóshraðar + næt. {0} nótt @@ -7316,7 +7470,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmól/l {0}mmól/l - + + hluti + {0} hluti + {0} hlutar + + ppm {0}ppm {0}ppm @@ -7329,6 +7488,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + l/100km {0}l/100km @@ -7449,6 +7611,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ oz t + + af Hg + {0} af Hg + {0} af Hg + inHg {0}" Hg @@ -7505,6 +7672,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} l.mál {0} l.mál + + kal-IT + {0} kal-IT + {0} kal-IT + + + ljóshraði + {0} ljóshraði + {0} ljóshraðar + n. {0} n. diff --git a/make/data/cldr/common/main/it.xml b/make/data/cldr/common/main/it.xml index a34f0ada80a..d8c2050ea31 100644 --- a/make/data/cldr/common/main/it.xml +++ b/make/data/cldr/common/main/it.xml @@ -328,6 +328,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia coloniese curdo + curdo + kurmancî kumyk kutenai komi @@ -928,6 +930,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Cina Colombia Isola di Clipperton + Sark Costa Rica Cuba Capo Verde @@ -1218,35 +1221,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordinamento numerico Sicurezza ordinamento Valuta + Presentazione emoji Sistema orario (12 o 24 ore) Tipo di interruzione di riga + Interruzioni di riga all’interno delle parole Sistema di misurazione Numeri + Interruzione frase dopo abbreviaz. Fuso orario Variante lingua Uso privato Calendario buddista + Buddista Calendario cinese + Cinese Calendario copto + Copto Calendario dangi + Dangi Calendario etiope + Etiope Calendario etiope Amete Alem + Etiope Amete Alem Calendario gregoriano + Gregoriano Calendario ebraico + Ebraico calendario nazionale indiano Calendario Hijri + Hijri Calendario Hijri (tabulare, epoca civile) + Hijri (tabulare, epoca civile) Calendario islamico (Arabia Saudita, osservazione) Calendario islamico (tabulare, era astronomica) Calendario Hijri (Umm al-Qura) + Hijri (Umm al-Qura) Calendario ISO-8601 Calendario giapponese + Giapponese Calendario persiano + Persiano Calendario minguo + Minguo Formato valuta contabile + Contabile Formato valuta standard + Standard Ordina simboli Ordina ignorando i simboli Ordina accenti normalmente @@ -1256,21 +1278,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordina prima lettere minuscole Ordina senza distinzione tra maiuscole e minuscole Ordina distinzione tra maiuscole e minuscole - Ordinamento Cinese tradizionale - Big5 Ordinamento precedente, per compatibilità + Compatibilità Ordinamento dizionario + Dizionario Ordinamento Unicode predefinito - Ordinamento Cinese semplificato - GB2312 + Unicode predefinito Ordinamento Elenco telefonico + Elenco telefonico Ordinamento fonetico + Fonetico Ordinamento pinyin + Pinyin Ricerca generica + Ricerca Cerca per consonante hangul iniziale Ordinamento standard + Standard Ordinamento tratti + Tratti Ordinamento tradizionale + Tradizionale Ordinamento tratti radicali + Tratti radicali Ordinamento Zhuyin + Zhuyin Ordina senza normalizzazione Ordina Unicode normalizzato Ordina cifre individualmente @@ -1283,18 +1315,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Larghezza intera Metà larghezza Numerica + Default + Emoji + Testo Sistema orario a 12 ore (0–11) + 12 ore (0–11) Sistema orario a 12 ore (1–12) + 12 ore (1–12) Sistema orario a 24 ore (0–23) + 24 ore (0–23) Sistema orario a 24 ore (1–24) + 24 ore (1–24) Interruzione di riga facoltativa + Facoltativa Interruzione di riga normale + Normale Interruzione di riga forzata + Forzata + Dividi tutte + Conserva tutte + Normale + Conserva in sintagmi BGN UNGEGN Sistema metrico + Metrico Sistema imperiale britannico + Imperiale britannico Sistema consuetudinario statunitense + Consuetudinario statunitense Cifre indo-arabe Cifre indo-arabe estese Numeri armeni @@ -1357,6 +1406,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Cifre tibetane Numeri tradizionali Cifre Vai + Off + On metrico @@ -1395,13 +1446,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [aà b c d eéè f g h iì j k l m n oò p q r s t uù v w x y z] [ªáâåäã æ ç êë íîï ñ ºóôöõø œ ß úûü ÿ] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] - [\- ‑ — , ; \: ! ? . … '’ "“” « » ( ) \[ \] \{ \} @ /] + [\- ‑ — , ; \: ! ? . … '’ "“” « » ( ) \[ \] \{ \} @ * / \& #] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1487,6 +1535,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'alle' 'ore' {0} + + {1} 'alle' 'ore' {0} + @@ -1495,6 +1546,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'alle' 'ore' {0} + + {1} 'alle' 'ore' {0} + @@ -1511,13 +1565,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G d/M/y GGGGG + E d/M/y G MMM y G d MMM y G E d MMM y G hh a hh:mm a hh:mm:ss a + 'h'HH v d/M E d/M d MMM @@ -1537,19 +1594,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B - - G y – G y - - GGGGG y-MM – GGGGG y-MM + MM/y G – MM/y G M/y – M/y GGGGG M/y – M/y GGGGG @@ -1867,6 +1919,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'alle' 'ore' {0} + + {1} 'alle' 'ore' {0} + @@ -1875,6 +1930,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'alle' 'ore' {0} + + {1} 'alle' 'ore' {0} + @@ -1891,15 +1949,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G - dd/MM/y GGGGG + M/y G + dd/MM/y G + E dd/MM/y G MMM y G d MMM y G E d MMM y G - h a + H h:mm a h:mm:ss a h:mm:ss a v h:mm a v + 'h'HH v dd/MM E dd/MM d MMM @@ -1921,11 +1982,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1967,10 +2026,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM – E d MMM y G E d MMM y – E d MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1981,10 +2036,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -2481,12 +2532,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Città sconosciuta - - Tirana - - - Tucumán - Dacca @@ -2499,9 +2544,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Santarém - San Paolo @@ -2511,9 +2553,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pasqua - - Bogotá - L’Avana @@ -2526,9 +2565,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praga - - Büsingen - Berlino @@ -2616,12 +2652,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Giamaica - - Enderbury - - - Canton - Comore @@ -2733,12 +2763,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damasco - - N’Djamena - - - Lomé - Tunisi @@ -2791,9 +2815,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ora dell’Africa occidentale - Ora standard dell’Africa occidentale - Ora legale dell’Africa occidentale + Ora dell’Africa occidentale @@ -3165,6 +3187,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ora della Guyana + + + Ora standard delle Isole Hawaii-Aleutine + + Ora delle isole Hawaii-Aleutine @@ -3723,12 +3750,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 0 - 0 - 0 - 0 - 0 - 0 + 0K + 0K + 00K + 00K + 000K + 000K 0 Mln 0 Mln 00 Mln @@ -3754,17 +3781,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ - 0 - 0 - 0 - 0 - 0 - 0 + 0K ¤ + 0K ¤ + 00K ¤ + 00K ¤ + 000K ¤ + 000K ¤ 0 Mln ¤ 0 Mln ¤ 00 Mln ¤ @@ -4868,6 +4898,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dollaro dei Caraibi orientali dollari dei Caraibi orientali + + fiorino caraibico + fiorino caraibico + fiorini caraibici + Cf + diritti speciali di incasso @@ -4948,6 +4984,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dollaro dello Zimbabwe + + Zimbabwe Gold + Zimbabwe Gold + Zimbabwe Gold + dollaro zimbabwiano (2009) @@ -5199,7 +5240,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elemento {0} elementi - + + parti + {0} parte + {0} parti + + feminine parti per milione {0} parte per milione @@ -5229,6 +5275,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mole {0} moli + + di glucosio + {0} di glucosio + {0} di glucosio + masculine litri per chilometro @@ -5662,7 +5713,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} miglia scandinave - masculine + masculine punti tipografici {0} punto tipografico {0} punti tipografici @@ -5825,6 +5876,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimetro di mercurio {0} millimetri di mercurio + + di mercurio + {0} di mercurio + {0} di mercurio + libbre per pollice quadrato {0} libbra per pollice quadrato @@ -6029,6 +6085,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} tazza metrica {0} tazze metriche + + once liquide metriche + {0} oncia liquida metrica + {0} once liquide metriche + masculine piedi acro @@ -6136,12 +6197,76 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quarto imperiale {0} quarti imperiali - - feminine - {0} alla velocità della luce - {0} alla velocità della luce + + steradianti + {0} steradiante + {0} steradianti - + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + calorie [IT] + {0} caloria [IT] + {0} calorie [IT] + + + becquerel + {0} becquerel + {0} becquerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + chilogrammi-forza + {0} chilogrammo-forza + {0} chilogrammi-forza + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + + + feminine + luce + + feminine parti per miliardo {0} parte per miliardo @@ -6149,9 +6274,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - notti - {0} notte - {0} notti {0} a notte @@ -6209,9 +6331,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elem. {0} elem. + + parte + {0} parte + {0} parti + percento + + Glc + {0} Glc + {0} Glc + mpg {0} mpg @@ -6376,6 +6508,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W + + di Hg + {0} di Hg + {0} di Hg + Bft {0} Bft {0} @@ -6426,6 +6563,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ml {0} ml + + {0} fl oz m. + {0} fl oz m. + staia @@ -6477,9 +6618,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp qt {0} imp qt + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + - {0} luce - {0} luce + luce + {0} luce + {0} luce notti @@ -6569,7 +6764,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}elem. {0}elem. - + + parte + {0}parte + {0}parti + + {0}ppm {0}ppm @@ -6580,6 +6780,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glc + {0}Glc + {0}Glc + {0}L/km {0}L/km @@ -7011,6 +7216,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mm Hg {0}mm Hg + + di Hg + {0} di Hg + {0} di Hg + {0}psi {0}psi @@ -7148,6 +7358,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc {0}mc + + {0}fl oz m. + {0}fl oz m. + {0}ac ft {0}ac ft @@ -7231,20 +7445,68 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}imp qt {0}imp qt - - {0}l - {0}l + + {0}sr + {0}sr - + + {0}kat + {0}kat + + + {0}C + {0}C + + + {0}F + {0}F + + + {0}H + {0}H + + + {0}S + {0}S + + + cal-IT + {0}cal-IT + {0}cal-IT + + + {0}Bq + {0}Bq + + + {0}Sv + {0}Sv + + + {0}Gy + {0}Gy + + + {0}kgf + {0}kgf + + + {0}T + {0}T + + + {0}Wb + {0}Wb + + + luce + {0}l + {0}l + + {0}ppb {0}ppb - - notti - {0} notte - {0} notti - {0}/notte - diff --git a/make/data/cldr/common/main/it_CH.xml b/make/data/cldr/common/main/it_CH.xml index 4185a3c2f4e..2073e3b4820 100644 --- a/make/data/cldr/common/main/it_CH.xml +++ b/make/data/cldr/common/main/it_CH.xml @@ -169,12 +169,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic . - + ' ¤ #,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/ja.xml b/make/data/cldr/common/main/ja.xml index 8c7f32a9a03..01c6f969f77 100644 --- a/make/data/cldr/common/main/ja.xml +++ b/make/data/cldr/common/main/ja.xml @@ -88,7 +88,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ バンジャル語 コム語 シクシカ語 - アニ語 (blo) + アニ語 (ベナン) バンバラ語 ベンガル語 チベット語 @@ -331,6 +331,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ バフィア語 ケルン語 クルド語 + クルド語 + クルマンジー クムク語 クテナイ語 コミ語 @@ -396,7 +398,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ マケドニア語 マラヤーラム語 モンゴル語 - 満州語 + 満洲語 マニプリ語 イヌー=アイムン語 モーホーク語 @@ -938,6 +940,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 中国 コロンビア クリッパートン島 + サーク島 コスタリカ キューバ カーボベルデ @@ -1235,43 +1238,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 暦法 通貨フォーマット 記号を無視した並べ替え - アクセント(逆方向)による並べ替え + 逆順アクセントによる並べ替え 大文字順/小文字順による並べ替え 大文字小文字を区別した並べ替え 並べ替え順序 正規化による並べ替え 数値による並べ替え - 強度による並べ替え + 照合強度 通貨 + 絵文字表示方法 時間制(12 / 24) 禁則処理 + 単語途中の改行 単位系 数値書式 + 略語の後の文分割 タイムゾーン ロケールのバリアント 私用 仏暦 + 仏暦 中国暦 + 中国暦 コプト暦 + コプト暦 ダンギ暦 + ダンギ暦 エチオピア暦 + エチオピア暦 エチオピア創世紀元暦 + エチオピア創世紀元暦 西暦(グレゴリオ暦) + 西暦(グレゴリオ暦) ユダヤ暦 + ユダヤ暦 インド国定暦 イスラム暦 + イスラム暦 イスラム暦(定周期、公民紀元) + イスラム暦(定周期、公民紀元) イスラム暦(サウジアラビア、月観測) イスラム歴(定周期、天文紀元) イスラム暦(ウンム・アルクラー) + イスラム暦(ウンム・アルクラー) ISO-8601 和暦 + 和暦 ペルシア暦 + ペルシア暦 中華民国暦 + 中華民国暦 会計通貨フォーマット + 会計 標準通貨フォーマット + 標準 記号で並べ替え 記号を無視して並べ替え アクセント(順方向)で並べ替え @@ -1281,22 +1303,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 大文字優先で並べ替え 大文字小文字を区別しないで並べ替え 大文字小文字を区別して並べ替え - 繁体字中国語順(Big5) 以前の順序(互換性) + 互換性 辞書順 - ユニコード照合順 + 辞書 + デフォルトUnicode照合順 + デフォルトUnicode ヨーロッパ言語文字の並べ替え規則 - 簡体字中国語順(GB2312) 電話帳順 - 音声順による並べ替え + 電話帳 + 読み順 + 読み ピンイン順 + ピンイン 汎用検索 + 検索 ハングル語頭子音による並べ替え 標準並べ替え順序 + 標準 画数順 - トラディッショナル - 部首順 + 画数 + 伝統的並べ替え順序 + 伝統的 + 部首画数順 + 部首画数 注音順 + 注音 正規化しないで並べ替え Unicode 正規化で並べ替え 数値を独立して並べ替え @@ -1309,18 +1341,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 全角 半角 数字 + デフォルト + 絵文字 + テキスト 12時間制(0〜11) + 12時間制(0〜11) 12時間制(1〜12) + 12時間制(1〜12) 24時間制(0〜23) + 24時間制(0〜23) 24時間制(1〜24) + 24時間制(1〜24) 禁則処理(弱) + 禁則処理(標準) + 標準 禁則処理(強) + + 強制改行 + 改行禁止 + 標準 + 文節単位 BGN UNGEGN メートル法 + メートル ヤード・ポンド法 + 英国 米慣習単位 + 米国 アラビア・インド数字 ペルシア数字 アルメニア数字 @@ -1382,6 +1431,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ チベット数字 従来の記数法 ヴァイ文字の記数法 + オフ + オン メートル法 @@ -1399,12 +1450,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [丑 亥 亨 兌 兎 凧 剃 卯 嘉 嘔 嘘 壬 壺 嬉 寅 巳 庚 庵 弘 彗 悶 愕 戊 戌 拼 揃 斧 昌 杖 桶 梵 楔 湘 焚 燭 爬 牌 牝 牡 狐 狗 狼 猪 獅 癸 瞑 碇 祚 禄 禎 秤 竿 絆 繍 罫 膏 芒 蟄 蟹 蠍 蠣 贛 蹄 辰 酉 鋲 錄 錨 閏 閩 雀 雉 鳳 鼠 龍] [あ か さ た な は ま や ら わ] [‾ __ \-- ‐‑ — ― 〜 ・・ ,, 、、 ;; \:: !! ?? .. ‥ … 。。 '‘’ ""“” (( )) \[[ \]] \{{ \}} 〈 〉 《 》 「「 」」 『 』 【 】 〔 〕 ‖ § ¶ @@ ** // \\\ \&& ## %% ‰ † ‡ ′ ″ 〃 ※] + [゠ ・・ . ==] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、、﹑︑] @@ -1697,6 +1746,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ BK:mm BK:mm:ss d日 + BK時 (E) BK:mm (E) BK:mm:ss (E) d日(E) @@ -1716,6 +1766,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm aK:mm:ss H:mm:ss + aK時 v + H時 v MMM M/d M/d(E) @@ -1919,11 +1971,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}の {0} + {1} {0} + + {1}の {0} + @@ -1940,16 +1998,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ BK:mm BK:mm:ss d日 + BK時 (E) BK:mm (E) BK:mm:ss (E) d日(E) d日(EEEE) + aK時 (E) aK:mm (E) H:mm (E) aK:mm:ss (E) H:mm:ss (E) Gy年 + GGGGGy/M GGGGGy/M/d + GGGGGy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日(E) @@ -1960,6 +2022,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm aK:mm:ss H:mm:ss + aK時 v + H時 v M月 M/d M/d(E) @@ -2298,11 +2362,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}の {0} + {1} {0} + + {1}の {0} + @@ -2319,16 +2389,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ BK:mm BK:mm:ss d日 + BK時 (E) BK:mm (E) BK:mm:ss (E) d日(E) d日EEEE + aK時 (E) aK:mm (E) H:mm (E) aK:mm:ss (E) H:mm:ss (E) Gy年 + Gy/M Gy/M/d + Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日(E) @@ -2343,6 +2417,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm:ss v aK:mm v H:mm v + aK時 v + H時 v M月 M/d M/d(E) @@ -3148,11 +3224,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}の {0} + {1} {0} + + {1}の {0} + @@ -3166,6 +3248,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d日EEEE + GGGGGy/M + GGGGGy/M/d(E) Gy年M月d日EEEE M/dEEEE M月d日EEEE @@ -3980,6 +4064,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ イースター島 + + コジャイケ + プンタアレナス @@ -4245,9 +4332,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ プノンペン - エンダーベリー島 - - カントン島 @@ -4924,9 +5008,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 西アフリカ時間 - 西アフリカ標準時 - 西アフリカ夏時間 + 西アフリカ時間 @@ -4952,30 +5034,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - アメリカ中部時間 - アメリカ中部標準時 - アメリカ中部夏時間 + 米国中部時間 + 米国中部標準時 + 米国中部夏時間 - アメリカ東部時間 - アメリカ東部標準時 - アメリカ東部夏時間 + 米国東部時間 + 米国東部標準時 + 米国東部夏時間 - アメリカ山地時間 - アメリカ山地標準時 - アメリカ山地夏時間 + 米国山岳部時間 + 米国山岳標準時 + 米国山岳夏時間 - アメリカ太平洋時間 - アメリカ太平洋標準時 - アメリカ太平洋夏時間 + 米国太平洋時間 + 米国太平洋標準時 + 米国太平洋夏時間 @@ -4987,9 +5069,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - アピア時間 - アピア標準時 - アピア夏時間 + サモア時間 + サモア標準時 + サモア夏時間 @@ -5109,7 +5191,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ブルネイ・ダルサラーム時間 + ブルネイ時間 @@ -5314,6 +5396,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ガイアナ時間 + + + ハワイ・アリューシャン標準時 + + ハワイ・アリューシャン時間 @@ -5659,12 +5746,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ポナペ時間 + ポンペイ時間 - 平壌時間 + 北朝鮮時間 @@ -5700,9 +5787,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - サモア時間 - サモア標準時 - サモア夏時間 + 米領サモア時間 + 米領サモア標準時 + 米領サモア夏時間 @@ -5742,9 +5829,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 台北時間 - 台北標準時 - 台北夏時間 + 台湾時間 + 台湾標準時 + 台湾夏時間 @@ -5769,6 +5856,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ チューク時間 + + + トルコ時間 + トルコ標準時 + トルコ夏時間 + + トルクメニスタン時間 @@ -5892,8 +5986,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -6579,7 +6671,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ セルビア ディナール - セルビア ディナール ロシア ルーブル @@ -6700,7 +6791,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ウクライナ フリヴニャ - ウクライナ フリヴニャ ウクライナ カルボバネツ @@ -6778,6 +6868,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 東カリブ ドル + + カリブ ギルダー + カリブ ギルダー + Cg + 特別引き出し権 @@ -6857,6 +6952,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ジンバブエ ドル (1980–2008) + + ジンバブエ ゴールド + ジンバブエ ゴールド + ジンバブエ ドル (2009) @@ -7038,6 +7137,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ミリモル毎リットル + + パーツ + {0} パーツ + {0} パーセント @@ -7050,6 +7153,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} モル + + グルコース + {0} グルコース + リットル毎キロメートル {0} リットル毎キロメートル @@ -7354,6 +7461,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} 水銀柱ミリメートル + + 水銀柱 + {0}Hg + {0} 重量ポンド毎平方インチ @@ -7475,6 +7586,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} メトリックカップ + + メトリック液量オンス + {0} メトリック液量オンス + {0} エーカーフィート @@ -7517,14 +7632,57 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} 英クォート - - - {0} 光 + + ステラジアン + {0} ステラジアン - - - {0} 泊 - {0}/泊 + + カタール + {0} カタール + + + クーロン + {0} クーロン + + + ファラド + {0} ファラド + + + ヘンリー + {0} ヘンリー + + + ジーメンス + {0} ジーメンス + + + 国際蒸気表カロリー + {0} 国際蒸気表カロリー + + + ベクレル + {0} ベクレル + + + シーベルト + {0} シーベルト + + + グレイ + {0} グレイ + + + 重量キログラム + {0} 重量キログラム + + + テスラ + {0} テスラ + + + ウェーバ + {0} ウェーバ @@ -7585,6 +7743,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 項目 {0} 項目 + + パーツ + {0} パーツ + パーセント @@ -7597,6 +7759,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ モル + + グルコース + {0} Glc + マイル/ガロン {0} mpg @@ -7872,6 +8038,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 水銀柱ミリメートル + + 水銀柱 + {0}Hg + 重量ポンド毎平方インチ @@ -7946,6 +8116,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ メトリックカップ + + メトリック液量オンス + {0} fl oz m. + エーカーフィート @@ -8014,6 +8188,51 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 英クォート + + ステラジアン + {0} sr + + + カタール + {0} kat + + + {0} C + + + {0} F + + + {0} H + + + {0} S + + + cal-IT + {0} cal-IT + + + {0} Bq + + + {0} Sv + + + {0} Gy + + + 重量キログラム + {0} kgf + + + テスラ + {0} T + + + ウェーバ + {0} Wb + {0} 厘 @@ -8172,7 +8391,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}項目 - + + パーツ + {0}パーツ + + {0}ppm @@ -8188,6 +8411,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mol {0}mol + + グルコース + {0}Glc + {0}L/km @@ -8529,6 +8756,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg + + 水銀柱 + {0}Hg + {0}psi @@ -8638,6 +8869,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc + + メトリック液量オンス + {0} fl oz m. + ac ft {0}ac ft @@ -8707,6 +8942,28 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp {0}qt-Imp. + + {0}sr + + + カタール + {0}kat + + + cal-IT + + + 重量キログラム + {0}kgf + + + テスラ + {0}T + + + ウェーバ + {0}Wb + {0}厘 @@ -8759,20 +9016,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}石 - {0}光 {0}分 - + {0}ppb - {0}泊 - {0}/泊 {0}E diff --git a/make/data/cldr/common/main/jgo.xml b/make/data/cldr/common/main/jgo.xml index 77a32c12d1e..42dc6d82a92 100644 --- a/make/data/cldr/common/main/jgo.xml +++ b/make/data/cldr/common/main/jgo.xml @@ -153,7 +153,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd diff --git a/make/data/cldr/common/main/jv.xml b/make/data/cldr/common/main/jv.xml index 54ef5e3901d..c95407d748b 100644 --- a/make/data/cldr/common/main/jv.xml +++ b/make/data/cldr/common/main/jv.xml @@ -16,7 +16,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Achinese Adangme Adyghe - Afrika + Afrikaans Aghem Ainu Akan @@ -40,6 +40,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Aymara Azerbaijan Bashkir + Baluchi Bali Basaa Belarus @@ -219,6 +220,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Colonia Kurdis + Kurdi + Kurmanji Kumik Komi Kernowek @@ -604,6 +607,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tyongkok Kolombia Pulo Clipperton + Sark Kosta Rika Kuba Pongol Verdé @@ -837,43 +841,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic Format Mata Uang Urutan Pamilahan Mata Uang + Presentasi Emoji Siklus Jam (12 vs 24) Gaya Ganti Baris + Ganti baris sajrone Tembung Sistem Pangukuran Angka + Pedhotan ukara sawise singkatan Tanggalan Buddha + Buddha Tanggalan Cina + Cina Tanggalan Koptik + Koptik Tanggalan Dangi + Dangi Tanggalan Etiopia + Etiopia Tanggalan Etiopia Amete Alem + Etiopia Amete Alem Tanggalan Gregorian + Gregorian Tanggalan Ibrani + Ibrani Tanggalan Hijriah + Hijriah Tanggalan Hijriah (tabel, jaman sipil) + Hijriah (tabel, jaman sipil) Tanggalan Hijriah (tabel, jaman astronomis) - Tanggalan Hijriah (Umm al-Qura) + Hijriah (tabel, jaman astronomis) + Tanggalan Hijriah (Ummul Qura) + Hijriah (Ummul Qura) Tanggalan ISO-8601 Tanggalan Jepang + Jepang Tanggalan Persia + Persia Tanggalan Minguo + Minguo Format Mata Uang Akuntansi + Akuntansi Format Mata Uang Standar + Standar Urutan Pamilahan Unicode Default + Unicode Default Panlusuran Tujuan Umum + Panlusuran Standar Ngurutke Urutan + Standar + Gawan + Emoji + Teks Sistem 12 Jam (0–11) + 12 (0–11) Sistem 12 Jam (1–12) + 12 (1–12) Sistem 24 Jam (0–23) + 24 (0–23) Sistem 24 Jam (1–24) + 24 (1–24) Gaya Ganti Baris Longgar + Longgar Gaya Ganti Baris Normal + Normal Gaya Ganti Baris Strik + Ketat + Ganti baris kabeh + Tetep kabeh + Normal + Pertahanake frasa Sistem Metrik + Metrik Sistem Pangukuran Imperial + Inggris Sistem Pangukuran AS + AS Digit Hindu-Arab Digit Hindu-Arab Diambakake Angka Armenia @@ -914,6 +958,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Digit Thailand Digit Tibet Digit Vai + Mati + Urip Metrik @@ -933,9 +979,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1003,11 +1046,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + MM-y G GGGGG dd-MM-y + E, dd-MM-y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a dd/MM @@ -1301,6 +1345,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ing' {0} + + {1} 'ing' {0} + @@ -1309,6 +1356,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ing' {0} + + {1} 'ing' {0} + @@ -1324,11 +1374,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d E h:mm a E h:mm:ss a - y G - d/M/y GGGGG - MMM y G - d MMM y G - E, d MMM y G h a h:mm a h:mm:ss a @@ -1355,44 +1400,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic d – d - - y G – y G - y – y G - - - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG - - - d/M/y – d/M/y GGGGG - d/M/y GGGGG – d/M/y GGGGG - d/M/y – d/M/y GGGGG - d/M/y – d/M/y GGGGG - - - E, d/M/y – E, d/M/y GGGGG - E, d/M/y GGGGG – E, d/M/y GGGGG - E, d/M/y – E, d/M/y GGGGG - E, d/M/y – E, d/M/y GGGGG - - - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G - - - d – d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G - - - E, d MMM – E, d MMM y G - E, d MMM y G – E, d MMM y G - E, d MMM – E, d MMM y G - E, d MMM y – E, d MMM y G - h a – h a h – h a @@ -1517,7 +1524,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic d E + MM-y G d/M/y GGGGG + E, dd-MM-y G M/y GGGGG @@ -1825,7 +1834,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Kuto Ora Dikenali + Lokasi Ora Dikenali Mendosa @@ -1936,9 +1945,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Roma - - Enderbury - Komoro @@ -2078,9 +2084,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Afrika Kulon - Wektu Standar Afrika Kulon - Wektu Ketigo Afrika Kulon + Wektu Afrika Kulon @@ -2128,8 +2132,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Apia - Wektu Standar Apia - Wektu Ketigo Apia + Wektu Standar Samoa + Wektu Ketiga Samoa @@ -2235,7 +2239,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Brunai Darussalam + Wektu Brunei @@ -2268,7 +2272,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Cina Wektu Standar Cina - Wektu Ketigo Cina + Wektu Ketiga Cina @@ -2292,7 +2296,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Kepuloan Cook Wektu Standar Kepuloan Cook - Wektu Ketigo Kepuloan Cook + Wektu Ketiga Kepuloan Cook @@ -2309,12 +2313,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Dumont-d’Urville + Wektu Dumont d’Urville - Wektu Timor Leste + Wektu Timor-Leste @@ -2430,6 +2434,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Guyana + + + Wektu Standar Hawaii-Aleutian + + Wektu Hawaii-Aleutian @@ -2441,14 +2450,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Hong Kong Wektu Standar Hong Kong - Wektu Ketigo Hong Kong + Wektu Ketiga Hong Kong Wektu Hovd Wektu Standar Hovd - Wektu Ketigo Hovd + Wektu Ketiga Hovd @@ -2506,7 +2515,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Jepang Wektu Standar Jepang - Wektu Ketigo Jepang + Wektu Ketiga Jepang @@ -2528,7 +2537,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Korea Wektu Standar Korea - Wektu Ketigo Korea + Wektu Ketiga Korea @@ -2610,7 +2619,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wektu Ulaanbaatar Wektu Standar Ulaanbaatar - Wektu Ketigo Ulaanbaatar + Wektu Ketiga Ulaanbaatar @@ -2746,12 +2755,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Ponape + Wektu Pohnpei - Wektu Pyongyang + Wektu Korea Lor @@ -2773,9 +2782,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Samoa - Wektu Standar Samoa - Wektu Ketigo Samoa + Wektu Samoa Amerika + Wektu Standar Samoa Amerika + Wektu Ketiga Samoa Amerika @@ -2815,9 +2824,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wektu Taipei - Wektu Standar Taipei - Wektu Ketigo Taipei + Wektu Taiwan + Wektu Standar Taiwan + Wektu Awan Taiwan @@ -2969,33 +2978,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##0.00 + + + ¤ #,##0.00 + + + + + + ¤ #,##0.00 + + + ¤ #,##0.00 + + - ¤0È - ¤ 0È - ¤00È - ¤ 00È - ¤000È - ¤ 000È - ¤0Y - ¤ 0Y - ¤00Y - ¤ 00Y - ¤000Y - ¤ 000Y - ¤0M - ¤ 0M - ¤00M - ¤ 00M - ¤000M - ¤ 000M - ¤0T - ¤ 0T - ¤00T - ¤ 00T - ¤000T - ¤ 000T + ¤ 0È + ¤ 00È + ¤ 000È + ¤ 0Y + ¤ 00Y + ¤ 000Y + ¤ 0M + ¤ 00M + ¤ 000M + ¤ 0T + ¤ 00T + ¤ 000T {0} {1} @@ -3250,7 +3265,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Loti Lesotho - Loti Lesotho Dinar Libya @@ -3333,7 +3347,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Peso Filipina - Peso Filipina Rupee Pakistan @@ -3467,6 +3480,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dolar Karibia Wetan + + Guilder Karibia + Guilder Karibia + CFA Franc Afrika Kulon @@ -3485,6 +3502,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kwacha Sambia + + Emas Zimbabwe + Emas Zimbabwe + ⩾{0} @@ -3598,11 +3619,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic peng loro {0} - pesagi {0} + {0} pesagi peng telu {0} - kubik {0} + {0} kubik {0}-{1} @@ -3668,7 +3689,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimol saben liter {0} milimol saben liter - + bagean saben yuta {0} bagean saben yuta @@ -3681,6 +3702,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} permiriad + + glukosa + {0} glukosa + liter saben kilometer {0} liter saben kilometer @@ -4114,6 +4139,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metrik kup + + {0} fl ons metrik + {0} saben galon @@ -4132,18 +4160,44 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} barel - - jiwit - {0} jiwit + + steradian + {0} steradian - - cahya - {0} cahya + + katal + {0} katal - - wengi - {0} wengi - {0}/wengi + + coulomb + {0} coulomb + + + farad + {0} farad + + + henry + {0} henry + + + siemens + {0} siemens + + + kalori-IT + + + sievert + {0} sievert + + + tesla + {0} tesla + + + weber + {0} weber arah kardinal @@ -4200,7 +4254,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic iji {0} iji - + bagean/yuta {0}bpj @@ -4213,6 +4267,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic permiriad + + Glc + liter/km @@ -4433,7 +4490,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic metrik ton - {0} metrik ton mikrogram @@ -4605,6 +4661,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Imp. seprapat galon {0} Imp. seprapat galon + + cal-IT + cahya {0} cahya @@ -4638,6 +4697,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic % + + Glc + mpg inggris {0}m/gUK @@ -4660,6 +4722,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}panas AS + + N + {0}kWh/km @@ -4669,9 +4734,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}tpi - - {0} cd - {0}t @@ -4687,9 +4749,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mpt - - {0}gallm - {0}sprt @@ -4712,18 +4771,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}by.dr. - jiwit {0}jiwit {0}spt-lmp. - - cahya - {0} cahya - - - wengi + + cal-IT diff --git a/make/data/cldr/common/main/ka.xml b/make/data/cldr/common/main/ka.xml index 7740acd7acb..2bd7c289ed6 100644 --- a/make/data/cldr/common/main/ka.xml +++ b/make/data/cldr/common/main/ka.xml @@ -267,6 +267,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ბაფია კიოლში ქურთული + ქურთული + კურმანჯი ყუმუხური კუტენაი კომი @@ -804,6 +806,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ჩინეთი კოლუმბია კლიპერტონის კუნძული + სარკი კოსტა-რიკა კუბა კაბო-ვერდე @@ -1100,54 +1103,91 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ვალუტის ფორმატი დახარისხების თანმიმდევრობა ვალუტა + სიცილაკების პრეზენტაცია დროის სისტემა (12 ან 24) სტრიქონის წყვეტის სტილი + სტრიქონზე გადასვლა სიტყვებს შორის საზომი სისტემა რიცხვები + წინადადების წყვეტა შემოკლ. შემდეგ ბუდისტური კალენდარი + ბუდისტური ჩინური კალენდარი + ჩინური კოპტური კალენდარი + კოპტური კალენდარი დანგი + დანგი ეთიოპიური კალენდარი + ეთიოპიური ეთიოპიური ამეთე ალემი კალენდარი + ეთიოპიური ამეთე ალემი გრიგორიანული კალენდარი + გრიგორიანული ებრაული კალენდარი + ებრაული ინდოეთის ეროვნული კალენდარი ჰიჯრის კალენდარი + ჰიჯრი ჰიჯრის სამოქალაქო კალენდარი (ტაბულარული) + ჰიჯრი (ტაბულარული, სამოქალაქო) ჰიჯრის კალენდარი (უმ-ალ-ქურა) + ჰიჯრი (უმ-ალ-ქურა) ISO-8601 კალენდარი იაპონური კალენდარი + იაპონური სპარსული კალენდარი + სპარსული ჩინეთის რესპუბლიკის კალენდარი - ვალუტის ბუღალტრული ფორმატი + მინგუო + ვალუტის საბუღალტრო ფორმატი + საბუღალტრო ვალუტის სტანდარტული ფორმატი - ტრადიციული ჩინური + სტანდარტული ლექსიკონით უნიკოდის ნაგულისხმევი დახარისხების თანმიმდევრობა - გამარტივებული ჩინური + უნიკოდის ნაგულისხმევი ტელეფონის წიგნით პინ-ინი რეფორმირებული ზოგადი დანიშნულების ძიება + ძიება ჰანგულის პირველი თანხმოვნით სტანდარტული დახარისხების თანმიმდევრობა + სტანდარტული შტრიხით ტრადიციული ძირითადი შტრიხით ჟუინი + ნაგულისხმევი + სიცილაკი + ტექსტი 12-საათიანი სისტემა (0-11) + 12 (0–11) 12-საათიანი სისტემა (1-12) + 12 (0–11) 24-საათიანი სისტემა (0-23) + 12 (0–23) 24-საათიანი სისტემა (1-24) + 12 (0–23) სტრიქონის რბილი წყვეტის სტილი + თავისუფალი სტრიქონის ჩვეულებრივი წყვეტის სტილი + ნორმალური სტრიქონის ზედმიწევნითი წყვეტის სტილი + მკაცრი + ყველგან გაყოფა + ყველგან შენარჩუნება + ნორმალური + ფრაზებში შენარჩუნება მეტრული სისტემა + მეტრული ბრიტანული საზომი სისტემა + ბრიტანული ამერიკული საზომი სისტემა + ამერიკული არაბულ-ინდური ციფრები გაფართოებული არაბულ-ინდური ციფრები სომხური რიცხვები @@ -1201,6 +1241,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ტაილანდური ციფრები ტიბეტური ციფრები ვაიური ციფრები + გამორთული + ჩართული მეტრული @@ -2471,6 +2513,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ისთერი + + კოიჰაიკე + პუნტა-არენასი @@ -2736,9 +2781,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ პნომპენი - ენდერბური - - კანტონი @@ -3408,9 +3450,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - დასავლეთ აფრიკის დრო - დასავლეთ აფრიკის სტანდარტული დრო - დასავლეთ აფრიკის ზაფხულის დრო + დასავლეთ აფრიკის დრო @@ -3760,6 +3800,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ გაიანის დრო + + + ჰავაისა და ალეუტის სტანდარტული დრო + + ჰავაისა და ალეუტის დრო @@ -3993,9 +4038,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ნორფოლკის კუნძულის დრო - ნორფოლკის კუნძულის სტანდარტული დრო - ნორფოლკის კუნძულის ზაფხულის დრო + ნორფოლკის კუნძულის დრო + ნორფოლკის კუნძულის სტანდარტული დრო + ნორფოლკის კუნძულის ზაფხულის დრო @@ -4333,6 +4378,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -5086,6 +5135,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ აღმოსავლეთ კარიბიული დოლარი + + კარიბის გულდენი + კარიბის გულდენი + კარიბის გულდენი + ევროპული სავალუტო ერთეული @@ -5136,6 +5190,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ზიმბაბვეს დოლარი + + ზიმბაბვეს გოლდი + ზიმბაბვეს გოლდი + ზიმბაბვეს გოლდი + ≈{0} @@ -5327,7 +5386,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ერთეული {0} ერთეული - + + წილი + {0} წილი + {0} წილი + + ნაწილი მილიონზე {0} ნაწილი მილიონზე {0} ნაწილი მილიონზე @@ -5342,6 +5406,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} პრომილე {0} პრომილე + + მოლი + {0} მოლი + {0} მოლი + + + გლუკოზის + გლუკოზის {0} + გლუკოზის {0} + ლიტრი კილომეტრზე {0} ლიტრი კილომეტრზე @@ -5522,6 +5596,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ბრიტანული სითბური ერთეული {0} ბრიტანული სითბური ერთეული + + ნიუტონი + {0} ნიუტონი + {0} ნიუტონი + გიგაჰერცი {0} გიგაჰერცი @@ -5712,8 +5791,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} მიკროგრამი - {0} ტონა - {0} ტ + აშშ მოკლე ტონა + {0} აშშ მოკლე ტონა + {0} აშშ მოკლე ტონა {0} ფუნტი @@ -5778,9 +5858,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ცხენის ძალა - მილიმეტრი ვერცხლისწყლის სვეტისა - {0} მილიმეტრი ვერცხლისწყლის სვეტისა - {0} მილიმეტრი ვერცხლისწყლის სვეტისა + მილიმეტრი ვერცხლისწყლის სვეტი + {0} მილიმეტრი ვერცხლისწყლის სვეტი + {0} მილიმეტრი ვერცხლისწყლის სვეტი + + + ვერცხლისწყალი + {0} ვერცხლისწყალი + {0} ვერცხლისწყალი ფუნტი კვადრატულ დუიმზე @@ -5788,9 +5873,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ფუნტი კვადრატულ დუიმზე - ვერცხლისწყლის დუიმი - {0} ვერცხლისწყლის დუიმი - {0} ვერცხლისწყლის დუიმი + დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი მილიბარი @@ -5942,6 +6027,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} მეტრული ჭიქა {0} მეტრული ჭიქა + + მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია + აკრი-ფუტი {0} აკრი-ფუტი @@ -5993,17 +6083,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ბრიტანული კვარტი {0} ბრიტანული კვარტი - + + სტერადიანი + {0} სტერადიანი + {0} სტერადიანი + + + კატალი + {0} კატალი + {0} კატალი + + + კულონი + {0} კულონი + {0} კულონი + + + ფარადა + {0} ფარადა + {0} ფარადა + + + ჰენრი + {0} ჰენრი + {0} ჰენრი + + + სიმენსი + {0} სიმენსი + {0} სიმენსი + + + კალორია [IT] + {0} კალორია [IT] + {0} კალორია [IT] + + + ბეკერელი + {0} ბეკერელი + {0} ბეკერელი + + + ზივერტი + {0} ზივერტი + {0} ზივერტი + + + გრეი + {0} გრეი + {0} გრეი + + + კილოგრამძალა + {0} კილოგრამძალა + {0} კილოგრამძალა + + + ტესლა + {0} ტესლა + {0} ტესლა + + + ვებერი + {0} ვებერი + {0} ვებერი + + + სინათლის სიჩქარე + {0} სინათლის სიჩქარე + {0}-მაგი სინათლის სიჩქარე + + ნაწილი მილიარდზე {0} ნაწილი მილიარდზე {0} ნაწილი მილიარდზე - - ღამე - {0} ღამე - {0} ღამე - {0}/ღამე - კარდინალური მიმართულება {0} აღმოსავლეთით @@ -6214,9 +6368,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ერთე. {0} ერთე. - + + წ. + {0} წ. + {0} წ. + + ნაწილი/მილიონზე + + მოლ + {0} მოლ + {0} მოლ + + + Glc + {0} Glc + {0} Glc + ლიტრი/კმ {0} ლ/კმ @@ -6252,11 +6421,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ტბიტი {0} ტბიტი + + გიგაბაიტი + {0} გიგაბაიტი + {0} გიგაბაიტი + გბიტი {0} გბიტი {0} გბიტი + + მეგაბაიტი + {0} მეგაბაიტი + {0} მეგაბაიტი + მბიტი {0} მბიტი @@ -6420,6 +6599,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} აშშ თერმი {0} აშშ თერმი + + + {0} ნ + {0} ნ + კვტსთ/100კმ {0} კვტსთ/100კმ @@ -6621,9 +6805,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ☉ სხივიერობა - მტ - {0} მტ - {0} მტ + + {0} ტონა + {0} ტონა კილოგრამი @@ -6648,9 +6832,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} მკგ - ტონა - {0} ტ - {0} ტ + მოკ. ტონა + {0} მოკ. ტონა + {0} მოკ. ტონა სტოუნი @@ -6720,9 +6904,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ცხ. ძ. - მმ ვწყ. სვ. - {0} მმ ვწყ. სვ. - {0} მმ ვწყ. სვ. + მმ.ვწყ. სვ. + {0} მმ.ვწყ. სვ. + {0} მმ.ვწყ. სვ. ფნტ. კვ. დმ. @@ -6730,9 +6914,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ფნტ. კვ. დმ. - ვრც. დმ. - {0} ვრც. დმ. - {0} ვრც. დმ. + დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი ბარი @@ -6789,6 +6973,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} კვძ. {0} კვძ. + + ბოფორტი + ფუნტი-ფუტი {0} ფუნტი-ფუტი @@ -6877,6 +7064,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} მეტრ. ჭიქა {0} მეტრ. ჭიქა + + მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია + აკრ.ფტ. {0} აკრ.ფტ. @@ -6974,7 +7166,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ბრიტ. კვარტი {0} ბრიტ. კვარტი - + + სრ + {0} სრ + {0} სრ + + + კატ + {0} კატ + {0} კატ + + + კულ + {0} კულ + {0} კულ + + + + {0} ფ + {0} ფ + + + + {0} ჰ + {0} ჰ + + + სიმ + {0} სიმ + {0} სიმ + + + კალ-IT + {0} კალ-IT + {0} კალ-IT + + + ბკ + {0} ბკ + {0} ბკ + + + ზვ + {0} ზვ + {0} ზვ + + + გრ + {0} გრ + {0} გრ + + + კგძ + {0} კგძ + {0} კგძ + + + ტლ + {0} ტლ + {0} ტლ + + + ვბ + {0} ვბ + {0} ვბ + + + სინათლის სიჩქ. + {0} სინათლის სიჩქ. + {0}-მაგი სინათლის სიჩქ. + + ნაწილი/მილიარდზე {0} ნ/მ {0} ნ/მ @@ -6994,6 +7256,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + ინერციის ძალა + {0} წთ {0} წთ @@ -7002,10 +7267,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} წმ {0} წმ + + წ. + {0} წ. + {0} წ. + + + მოლ + {0} მოლ + {0} მოლ + + + Glc + {0} Glc + {0} Glc + {0}ლ/100კმ {0}ლ/100კმ + + გბაიტი + {0} გბაიტი + {0} გბაიტი + + + მეგაბაიტი + {0} მეგაბაიტი + {0} მეგაბაიტი + {0}/თ. @@ -7022,6 +7312,29 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}წმ {0}წმ + + მილიამპერი + {0} მილიამპერი + {0} მილიამპერი + + + {0} ომი + {0} ომი + + + კვტ.სთ + {0} კვტ.სთ + {0} კვტ.სთ + + + + {0} ნ + {0} ნ + + + {0} პიქს/დუიმი + {0} პიქს/დუიმი + {0}მ {0}მ @@ -7030,6 +7343,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} დმ {0} დმ + + + {0} ტ + {0} ტ + კგ {0}კგ @@ -7048,29 +7366,150 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}მკგ - {0}ტ - {0}ტ + მ.ტონა + {0}მ.ტონა + {0}მ.ტონა + + + ფნტ + + + კარ {0}ცხ.ძ. {0}ცხ.ძ. + + მმ.ვწყ. სვ. + {0} მმ.ვწყ. სვ. + {0} მმ.ვწყ. სვ. + + + ფუნტი კვადრატულ დუიმზე + {0} ფუნტი კვადრატულ დუიმზე + {0} ფუნტი კვადრატულ დუიმზე + + + დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი + {0} დუიმი ვერცხლისწყალი + {0} მბრ {0} მბრ + + ბოფორტი + + + მილი³ + {0}ლ {0}ლ - - ნ/მ + + მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია + {0} მეტრული თხევადი უნცია - - ღამე - {0} ღამე - {0} ღამე - {0}/ღამე + + ბრიტანული თხევადი უნცია + {0} ბრიტანული თხევადი უნცია + {0} ბრიტანული თხევადი უნცია + + + ს.კ. + {0} ს.კ. + {0} ს.კ. + + + ჩ.კ. + {0} ჩ.კ. + {0} ჩ.კ. + + + {0} ბარელი + {0} ბარელი + + + ბრიტანული თხევადი დრაქმა + {0} ბრიტანული თხევადი დრაქმა + {0} ბრიტანული თხევადი დრაქმა + + + სრ + {0} სრ + {0} სრ + + + კატ + {0} კატ + {0} კატ + + + კულ + {0} კულ + {0} კულ + + + + {0} ფ + {0} ფ + + + + {0} ჰ + {0} ჰ + + + სიმ + {0} სიმ + {0} სიმ + + + კალ-IT + {0} კალ-IT + {0} კალ-IT + + + ბკ + {0} ბკ + {0} ბკ + + + ზვ + {0} ზვ + {0} ზვ + + + გრ + {0} გრ + {0} გრ + + + კგძ + {0} კგძ + {0} კგძ + + + ტლ + {0} ტლ + {0} ტლ + + + ვბ + {0} ვბ + {0} ვბ + + + c + {0} სინათლის სიჩქ. + {0}-მაგი სინათლის სიჩქ. + + + ნ/მ diff --git a/make/data/cldr/common/main/kaa.xml b/make/data/cldr/common/main/kaa.xml index 851615c3139..28914280908 100644 --- a/make/data/cldr/common/main/kaa.xml +++ b/make/data/cldr/common/main/kaa.xml @@ -339,6 +339,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic григориан календарь + григориан кестели ҳижрий календарь кестели ҳижрий календарь (астрономиялық дәўир) ISO-8601 календары @@ -622,9 +623,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ай - өткен ай - усы ай - кейинги ай ай @@ -644,14 +642,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic өткен ҳәп. усы ҳәп. кейинги ҳәп. - {0}-ҳәпте ҳәп өтк. ҳәп. усы ҳәп. кей. ҳәп. - {0}-ҳәпте күн @@ -661,15 +657,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic күн - кеше - бүгин - ертең күн - кеше - бүгин - ертең ҳәпте күни @@ -708,5 +698,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic ўақыт зонасы + + + Белгисиз орын + + + + + сан емес + + + + + {0} ҳәм {1} + {0} ҳәм {1} + + + {0} ямаса {1} + {0} ямаса {1} + + + {0} ямаса {1} + {0} ямаса {1} + + + {0} ямаса {1} + {0} ямаса {1} + + + {0} ҳәм {1} + {0} ҳәм {1} + + diff --git a/make/data/cldr/common/main/kab.xml b/make/data/cldr/common/main/kab.xml index ef10d1d734d..c3a8b4a4446 100644 --- a/make/data/cldr/common/main/kab.xml +++ b/make/data/cldr/common/main/kab.xml @@ -1076,20 +1076,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nun Duǧ - - Y - F - M - Y - M - Y - Y - Ɣ - C - T - W - D - Yennayer Fuṛar @@ -1106,20 +1092,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Yen - Fur - Meɣ - Yeb - May - Yun - Yul - Ɣuc - Cte - Tub - Wam - Duǧ - Y F @@ -1139,51 +1111,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Yan - San - Kraḍ - Kuẓ - Sam - Sḍis - Say + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed - C - R - R - H - M - S - S + C + R + R + H + M + S + S - Cr - Ri - Ra - Hd - Mh - Sm - Sd + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed - Yanass - Sanass - Kraḍass - Kuẓass - Samass - Sḍisass - Sayass + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed - Ace - Ari - Ara - Aha - Amh - Sem - Sed + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed - Y - S - K - K - S + C + R + R + H + M S S - Cr - Ri - Ra - Hd - Md - Sm - Sd + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed - Acer - Arim - Aram - Ahad - Amhad - Sem - Sed + Acer + Arim + Aram + Ahad + Amhad + Sem + Sed @@ -2299,9 +2271,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nayrubi - - Enderbury - Kumuṛ @@ -2615,9 +2584,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Akud n Tefriqt n umalu - Akud amezday n Tefriqt n umalu - Akud n unebdu n Tefriqt n umalu + Akud n Tefriqt n umalu @@ -2967,6 +2934,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Akud n Gwiyan + + + Akud amezday n Haway-Aliwsyan + + Akud n Haway-Aliwsyan @@ -3518,30 +3490,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0K¤ - 0K¤ - 00K¤ - 00K¤ - 000K¤ - 000K¤ + 0G¤ + 0G ¤ + 0G¤ + 0G ¤ + 00G¤ + 00G ¤ + 00G¤ + 00G ¤ + 000G¤ + 000G ¤ + 000G¤ + 000G ¤ 0M¤ + 0M ¤ 0M¤ + 0M ¤ 00M¤ + 00M ¤ 00M¤ + 00M ¤ 000M¤ + 000M ¤ 000M¤ - 0G¤ - 0G¤ - 00G¤ - 00G¤ - 000G¤ - 000G¤ + 000M ¤ + 0L¤ + 0L ¤ + 0L¤ + 0L ¤ + 00L¤ + 00L ¤ + 00L¤ + 00L ¤ + 000L¤ + 000L ¤ + 000L¤ + 000L ¤ 0T¤ + 0T ¤ 0T¤ + 0T ¤ 00T¤ + 00T ¤ 00T¤ + 00T ¤ 000T¤ + 000T ¤ 000T¤ + 000T ¤ {0} {1} diff --git a/make/data/cldr/common/main/kea.xml b/make/data/cldr/common/main/kea.xml index 15661c6e995..cfd3aaf5948 100644 --- a/make/data/cldr/common/main/kea.xml +++ b/make/data/cldr/common/main/kea.xml @@ -151,7 +151,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic lausianu lituanu luba-katanga - luo luyia letãu malgaxi @@ -432,7 +431,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Israel Ilha di Man Índia - Ilhas Británikas di Índiku + Ilhas Británikas di Índiku Iraki Irãu Islándia @@ -609,10 +608,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kalendáriu Gregorianu Kalendáriu ebraiku Kalendáriu nasional indianu - Kalendáriu islámiku - Kalendáriu islámiku (sivil) - Kalendáriu islámiku (astronómiku) - Kalendáriu islámiku (Umm al-Qura) + Kalendáriu islámiku + Kalendáriu islámiku (sivil) + Kalendáriu islámiku (astronómiku) + Kalendáriu islámiku (Umm al-Qura) Kalendáriu ISO-8601 Kalendáriu japones Kalendáriu persa @@ -709,7 +708,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLL y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a dd/MM @@ -1069,7 +1067,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLL y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a (v) @@ -1147,7 +1144,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d MMM y – E, d MMM y G - h a – h a h – h a @@ -1172,7 +1168,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm – HH:mm v - h a – h a v h – h a v @@ -1736,9 +1731,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ora di Áfrika Osidental - Ora Padron di Áfrika Osidental - Ora di Veron di Áfrika Osidental + Ora di Áfrika Osidental @@ -1865,6 +1858,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ora di Veron di Gronelándia Osidental + + + Ora Padron di Avaí i Aleutas + + Ora di Avaí i Aleutas @@ -1943,9 +1941,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -1965,7 +1965,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 000 Bi ¤ - {0} {1} @@ -2356,7 +2355,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimol pur litru {0} milimol pur litru - + parti pur milhãu {0} parti pur milhãu @@ -2503,8 +2502,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kaloria - Kaloria - {0} Kaloria + Kaloria + {0} Kaloria kilojoule @@ -2574,16 +2573,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} piksel pur pulegada - pontu pur sentímeru - {0} pontu pur sentímetru + pontu pur sentímeru + {0} pontu pur sentímetru - pontu pur pulegada - {0} pontu pur pulegada + pontu pur pulegada + {0} pontu pur pulegada - pontu - {0} pontu + pontu + {0} pontu raiu di Tera @@ -3000,7 +2999,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimol/litru {0} mmol/l - + parti/milhãu @@ -3068,8 +3067,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} sig. - Cal - {0} Cal + Cal + {0} Cal J diff --git a/make/data/cldr/common/main/kek.xml b/make/data/cldr/common/main/kek.xml new file mode 100644 index 00000000000..d13302e690d --- /dev/null +++ b/make/data/cldr/common/main/kek.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + Qʼeqchiʼ + + + Ruchichʼochʼ + Molam Rehebʼ Ninqi Tenamit + Ebʼ li Naʼajej Moko Nawbʼilebʼ Ta + + + + [a {aa} {bʼ} c {ch} {ch’} e {ee} h i {ii} j k {k’} l m n o {oo} p q {q’} r s t {t’} {tz} {tz’} u {uu} w x y] + [d f g v z] + [\- ‑ , ; \: ! ? . … ’ “” ( ) \[ \] \{ \} /] + + + + + + + + Xbʼeen Po + Xkabʼ Po + Rox Po + Xkaa Po + Roʼ Po + Xwaq Po + Xwuuq Po + Xwaqxaq Po + Xbʼelee Po + Xlajee Po + Xjunlaj Po + Xkabʼlaj Po + + + + + + + Doʼkutan + LuʼKutan + MarʼKutan + MerʼKutan + JueʼKutan + VierʼKutan + SabʼKutan + + + + + + + Eqʼela + Ewu + + + + + + dd-MM-y + + + + + + diff --git a/make/data/cldr/common/main/kek_GT.xml b/make/data/cldr/common/main/kek_GT.xml new file mode 100644 index 00000000000..4beb614a91a --- /dev/null +++ b/make/data/cldr/common/main/kek_GT.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/kgp.xml b/make/data/cldr/common/main/kgp.xml index 343220d9650..3b00c5f70db 100644 --- a/make/data/cldr/common/main/kgp.xml +++ b/make/data/cldr/common/main/kgp.xml @@ -1089,12 +1089,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vẽnhrá mág to kuprãg Vẽnhrá mág mré ũn kẽsir tỹ ũn’ũn mỹ kuprẽg Vẽnhrá mág mré ũn kẽsir tỹ ũn’ũn kỹ kuprẽg - Sĩnẽj Vỹsa ke to ke pẽ - Big5 Ẽgno tá jẽnẽ já kỹ ta ki já Vẽnhrá Nỹtĩj-fẽ nỹtĩ há Unicode to ke pẽ Orópa tá vẽnhvin han to ke - Sĩnẽj ke to ke (sĩmpri há) - GB2312 Terefonĩ Risita to ke Fonẽtika to ke kuprãg Pin-yin to nỹtĩ @@ -2854,9 +2852,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Fynãg Pẽj - - Ẽnnermuri - Kiritimỹti @@ -3524,9 +3519,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Afrika Rãpur tá óra - Óra Pã Afrika Rãpur tá - Rỹ Kã óra Afrika Rãpur tá + Afrika Rãpur tá óra @@ -3919,6 +3912,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Óra Gijỹnỹ tá + + + Óra Pã Hava’i kar Arevta Goj-vẽso tá + + Óra Hava’i kar Arevta Goj-vẽso tá @@ -6148,7 +6146,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mĩrimol ritru ki {0} mĩrimol ag ritru ki - + milhão ki kupar ‘e {0} kupar milhão ki {0} kupar 'e milhão ki @@ -6917,7 +6915,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mĩrimol/ritru {0} mmol/l - + kupar ‘e/milhão ki diff --git a/make/data/cldr/common/main/kk.xml b/make/data/cldr/common/main/kk.xml index c410b197cc6..8c1d68c5fe7 100644 --- a/make/data/cldr/common/main/kk.xml +++ b/make/data/cldr/common/main/kk.xml @@ -29,7 +29,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ арагон тілі оболо тілі ангика тілі - араб тілі (леватин) + араб тілі (леватин) араб тілі қазіргі стандартты араб тілі мапуче тілі @@ -44,12 +44,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ аймара тілі әзірбайжан тілі башқұрт тілі - балучи тілі + балучи тілі бали тілі баса тілі беларусь тілі бемба тілі - бетауи тілі + бетауи тілі бена тілі болгар тілі хариани тілі @@ -59,20 +59,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бини тілі сиксика тілі ании тілі - тай дам тілі + тай дам тілі бамбара тілі бенгал тілі тибет тілі + бахтияр тілі бретон тілі бодо тілі босния тілі - акусе тілі + акусе тілі + бурят тілі бугис тілі блин тілі каталан тілі - каддо тілі + каддо тілі кайюга тілі - атсам тілі + атсам тілі чакма тілі шешен тілі себуано тілі @@ -84,10 +86,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ чипевайан тілі чероки тілі шайен тілі - чикасау тілі + чикасау тілі сорани тілі чилкотин тілі корсика тілі + копт тілі мичиф тілі оңтүстік-шығыс кри тілі жазықтағы кри тілі @@ -121,6 +124,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ экаджук тілі грек тілі ағылшын тілі + ағылшын тілі (Біріккен Корольдік) эсперанто тілі испан тілі эстон тілі @@ -162,7 +166,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ хинглиш хилигайнон тілі хмонг тілі - хмоң ниуа тілі + хмоң ниуа тілі хорват тілі жоғарғы лужица тілі гаити тілі @@ -191,7 +195,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ мачаме тілі ява тілі грузин тілі - қарақалпақ тілі + қарақалпақ тілі кабил тілі качин тілі каджи тілі @@ -200,7 +204,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тьяп тілі маконде тілі кабувердьяну тілі - кеняң тілі + кекчи тілі + кеняң тілі коро тілі кайнганг тілі кхаси тілі @@ -227,6 +232,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафиа тілі кёльн тілі күрд тілі + күрд тілі + күрд тілі (күрмәнжі) құмық тілі коми тілі корн тілі @@ -243,7 +250,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ лигур тілі лиллуэт тілі лакота тілі - ладин тілі + ладин тілі ломбард тілі лингала тілі лаос тілі @@ -252,7 +259,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ солтүстік люри тілі самия тілі литва тілі - латгалиан тілі + латгалиан тілі луба-катанга тілі луба-лулуа тілі лунда тілі @@ -260,6 +267,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ мизо тілі лухиа тілі латыш тілі + Лаз тілі мадур тілі магахи тілі майтхили тілі @@ -273,7 +281,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ макуа-меетто тілі мета тілі маршалл тілі - мокено тілі + мокено тілі маори тілі микмак тілі минангкабау тілі @@ -336,8 +344,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ папьяменто тілі палау тілі нигериялық пиджин тілі + пали тілі пиджин тілі поляк тілі + пьемонт тілі малесит-пассамакводди тілі пруссия тілі пушту тілі @@ -350,7 +360,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ рапануй тілі раротонган тілі рохинджа - риффиан тілі + риффиан тілі романш тілі рунди тілі румын тілі @@ -376,13 +386,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ сена тілі койраборо сенни тілі санго тілі + самогития тілі серб-хорват тілі ташелхит тілі шан тілі сингал тілі - сидамо тілі + сидамо тілі словак тілі - сарайки тілі + сарайки тілі словен тілі оңтүстік лушуцид тілі самоа тілі @@ -429,7 +440,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ток-писин тілі түрік тілі тароко тілі - торуали тілі + торуали тілі тсонга тілі татар тілі солтүстік тутчоне тілі @@ -751,6 +762,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Қытай Колумбия Клиппертон аралы + Сарк Коста-Рика Куба Кабо-Верде @@ -1097,59 +1109,96 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Валюта форматы Сұрыптау реті Валюта + Эмоджи көрсетілімі Уақыт форматы (12 не 24) Жолды тасымалдау стилі + Сөздердегі жол бөліністері Өлшемдер жүйесі Сандар + Қысқарған сөзден кейінгі сөйлем бөлінісі Будда күнтізбесі + Будда Қытай күнтізбесі + Қытай Копт күнтізбесі + Копт Данги күнтізбесі + Данги Эфиопия күнтізбесі + Эфиопия Эфиопияның Амете-Алем күнтізбесі + Эфиопияның Амете-Алем Грегориандық күнтізбе + Грегориан Көне еврей күнтізбесі + Көне еврей Үндістанның ұлттық күнтізбесі Ислам күнтізбесі + Ислам Ислам күнтізбесі (кестелік, азаматтық дәуір) + Ислам (кестелік, азаматтық дәуір) Ислам күнтізбесі (Сауд Арабиясы, жаңа ай) Ислам күнтізбесі (кестелік, астрономиялық дәуір) Ислам күнтізбесі (Умм аль-Кура) + Ислам (Умм аль-Кура) ISO-8601 күнтізбесі Жапон күнтізбесі + Жапон Парсы күнтізбесі + Парсы Мингуо күнтізбесі + Мингуо Есептік валюта форматы + Есептік Стандартты валюта форматы - Дәстүрлі қытай тілінің сұрыптау реті - Big5 + Стандартты Сәйкестікке арналған алдыңғы сұрыптау реті Сөздік бойынша сұрыптау реті Әдепкі уникод сұрыптау реті + Әдепкі уникод Эмоджи сұрыптау реті Еуропалық реттеу ережелері - Жеңілдетілген қытай тілінің сұрыптау реті - GB2312 Телефон кітапшасының сұрыптау реті Пиньинь сұрыптау реті Қайта қарастырылған сұрыптау реті Жалпы мақсаттағы іздеу + Іздеу Корей тілінің бастапқы дауыссызы бойынша іздеу Стандартты сұрыптау реті + Стандартты Иероглифтер сызықтарын сұрыптау реті Дәстүрлі сұрыптау реті Иероглифтер сызықтарын түбегейлі сұрыптау реті Чжуинь сұрыптау реті + Әдепкі + Эмоджи + Мәтін 12 сағаттық жүйе (0–11) + 12 (0–11) 12 сағаттық жүйе (1–12) + 12 (1–12) 24 сағаттық жүйе (0–23) + 24 (0–23) 24 сағаттық жүйе (1–24) + 24 (1–24) Жолды тасымалдаудың еркін стилі + Еркін Жолды тасымалдаудың қалыпты стилі + Қалыпты Жолды тасымалдаудың қатаң стилі + Қатаң + Бәрін тасымалдау + Бәрін қалдыру + Қалыпты + Фразаларда қалдыру Метрлік жүйе + Метрлік Британиялық өлшемдер жүйесі + Британиялық Америкалық өлшемдер жүйесі + Америкалық Ахом цифрлары Үнді-араб сандары Үнді-араб сандарының кеңейтілген жүйесі @@ -1232,6 +1281,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Вай цифрлары Варанг сити цифрлары Ванчо цифрлары + Өшіру + Қосу Метрлік @@ -1290,36 +1341,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Он екінші ай - - - 1-ай - 2-ай - 3-ай - 4-ай - 5-ай - 6-ай - 7-ай - 8-ай - 9-ай - 10-ай - 11-ай - 12-ай - - - Бірінші ай - Екінші ай - Үшінші ай - Төртінші ай - Бесінші ай - Алтыншы ай - Жетінші ай - Сегізінші ай - Тоғызыншы ай - Оныншы ай - Он бірінші ай - Он екінші ай - - @@ -1414,18 +1435,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss E h:mm a E h:mm:ss a G y 'ж'. + M/y G d/M/y GGGGG + E, d/M/y G G y 'ж'. MMM G y 'ж'. d MMM G y 'ж'. d MMM, E - h a h:mm a h:mm:ss a + h a, v + HH'h', v dd.MM dd.MM, E d MMM @@ -1464,9 +1489,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G y 'ж'. d MMM, E – d MMM, E G y 'ж'. d MMM, E – y 'ж'. d MMM, E - - h–h a - h:mm–h:mm a h:mm–h:mm a @@ -1475,9 +1497,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h–h a v - M–M @@ -1770,20 +1789,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E, B h E, B h:mm E, B h:mm:ss + E, h a E h:mm a E h:mm:ss a G y 'ж'. + MM-GGGGG y dd-MM-GGGGG y + E, MM-dd-G y G y 'ж'. MMM G y 'ж'. d MMM G y 'ж'. d MMM, E - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + h a, v dd.MM dd.MM, E d MMM @@ -1806,11 +1829,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} - {1} - h – h B + B h – B h + B h – h - h:mm – h:mm B - h:mm – h:mm B + B h:mm – B h:mm + B h:mm – h:mm + B h:mm – h:mm G y 'ж'. d–d MMM @@ -1826,7 +1851,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1840,7 +1864,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1988,32 +2011,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Зұлқ. Зұлх. - - Мұхаррам - Сафар - Рабиғул әууәл - Рабиғул ахир - Жұмадәл аууәл - Жұмадәл ахир - Ережеп - Шағбан - Рамазан - Шәууал - Зұлқағда - Зұлхижжа - - - ХЖ - ХЖ - - ХЖ - @@ -2877,6 +2880,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пасха аралы + + Койайке + Пунта-Аренас @@ -3142,9 +3148,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пномпень - Эндербери - - Кантон @@ -3814,9 +3817,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Батыс Африка уақыты - Батыс Африка стандартты уақыты - Батыс Африка жазғы уақыты + Батыс Африка уақыты @@ -4171,6 +4172,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гайана уақыты + + + Гавай және Алеут аралдары стандартты уақыты + + Гавай және Алеут аралдары уақыты @@ -4735,13 +4741,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 + + + #,##0.00 ¤ + #,##0.00 ¤ - #,##0.00;(#,##0.00) + #,##0.00 ¤ + #,##0.00 @@ -4750,8 +4769,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 0 мың ¤ 00 мың ¤ 00 мың ¤ - 000 мың ¤ - 000 мың ¤ + 000 м'.' ¤ + 000 м'.' ¤ 0 млн ¤ 0 млн ¤ 00 млн ¤ @@ -5265,6 +5284,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Шығыс Кариб доллары + + Кариб гульдені + Кариб гульдені + Кариб гульдені + Батыс Африканың КФА франкі @@ -5285,6 +5309,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Замбия квачасы + + Зимбабве алтыны + Зимбабве алтыны + Зимбабве алтыны + {0}+ @@ -5486,10 +5515,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} миллимоль/литр {0} миллимоль/литр - - миллиондық үлес - {0} миллиондық үлес - {0} миллиондық үлес + + бөлік + {0} бөлік + {0} бөлік + + + миллиондағы бөлік + {0} б/млн + {0} б/млн {0} пайыз @@ -5503,6 +5537,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} промириад {0} промириад + + глюкоза + {0} глюкоза + {0} глюкоза + литр/километр {0} литр/километр @@ -5908,6 +5947,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} миллиметр сынап бағанасы {0} миллиметр сынап бағанасы + + сынап бағанасы + {0} сынап бағанасы + {0} с. б. + фунт-күш/шаршы дюйм {0} фунт-күш/шаршы дюйм @@ -6072,6 +6116,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метрлік кесе {0} метрлік кесе + + метрлік сұйық унция + {0} метрлік сұйық унция + {0} метрлік сұйық унция + {0} бушель {0} бушель @@ -6132,21 +6181,73 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} британдық кварта {0} брит. кварта - - жарық - {0} жарық - {0} жарық + + стерадиан + {0} стерадиан + {0} стерадиан - + + катал + {0} катал + {0} катал + + + кулон + {0} кулон + {0} кулон + + + фарад + {0} фарад + {0} фарад + + + генри + {0} генри + {0} генри + + + сименс + {0} сименс + {0} сименс + + + калория [халықаралық] + {0} калория [халықаралық] + {0} калория [халықаралық] + + + беккерель + {0} беккерель + {0} Бк + + + зиверт + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + + + килограмм-күш + {0} кг-күш + {0} кг-күш + + + тесла + {0} тесла + {0} тесла + + + вебер + {0} вебер + {0} вебер + + миллиардтағы бөлік - {0} б/млрд - {0} б/млрд - - - түн - {0} түн - {0} түн - {0}/түн негізгі бағыт @@ -6361,6 +6462,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} элемент {0} элемент + + бөлік + {0} бөлік + {0} бөлік + + + бөлік/миллион + {0} б/млн + {0} б/млн + пайыз @@ -6375,6 +6486,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моль {0} моль + + глюкоза + {0} Глк + {0} Глк + литр/км {0} л/км @@ -6880,6 +6996,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мм с.б. {0} мм с.б. + + с. б. + {0} с. б. + {0} с. б. + дюйм сынап бағанасы {0} дюйм с.б. @@ -7038,6 +7159,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мк {0} мк + + метрлік сұйық унция + {0} метрлік сұйық унция + {0} метрлік сұйық унция + акр-фут {0} aкр-фут @@ -7135,12 +7261,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} брит. кварта {0} брит. кварта + + ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + + + Г + {0} Г + {0} Г + + + Си + {0} Си + {0} Си + + + халықаралық калория + {0} халықаралық калория + {0} халықаралық калория + + + Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + + + кг-күш + {0} кг-күш + {0} кг-күш + + + Тл + {0} Т + {0} Т + + + Вб + {0} Вб + {0} Вб + жарық {0} жарық {0} жарық - + бөлік/миллиард {0} б/млрд {0} б/млрд @@ -7187,12 +7378,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ фут² + + бөлік + {0} бөлік + {0} бөлік + + + б/млн + {0} б/млн + {0} б/млн + % + + глюкоза + {0} Глк + {0} Глк + л/км @@ -7264,6 +7470,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} унция {0} унция + + с. б. + {0} с. б. + {0} с. б. + дюйм с.б. @@ -7288,26 +7499,87 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}° {0}° + + метрлік сұйық унция + {0} метрлік сұйық унция + {0} метрлік сұйық унция + имп. сұй. унц. {0} имп. сұй. унц. {0} имп. сұй. унц. - - жарық - {0} жарық - {0} жарық + + ср + {0} ср + {0} ср - + + кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + + + Г + {0} Г + {0} Г + + + Си + {0} Си + {0} Си + + + халықаралық калория + {0} халықаралық калория + {0} халықаралық калория + + + Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + + + кг-күш + {0} кг-күш + {0} кг-күш + + + Тл + {0} Т + {0} Т + + + Вб + {0} Вб + {0} Вб + + б/млрд - {0} б/млрд - {0} б/млрд - түн {0}түн {0}түн - {0}/түн diff --git a/make/data/cldr/common/main/kk_Arab.xml b/make/data/cldr/common/main/kk_Arab.xml index 198e8443f83..c56abe2de99 100644 --- a/make/data/cldr/common/main/kk_Arab.xml +++ b/make/data/cldr/common/main/kk_Arab.xml @@ -13,1134 +13,1187 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {0}، {1} + {0}، {1} - افار ءتىلى - ابحاز ءتىلى - افريكاانس ءتىلى - اگەم ءتىلى - اكان ءتىلى - امحار ءتىلى - اراگون ءتىلى - وبولو ءتىلى - شامي ءتىلى - اراب ءتىلى - قازىرگى ستاندارتتى اراب ءتىلى - ماپۋچە ءتىلى - اسسام ءتىلى - اسۋ ءتىلى - استرۋيا ءتىلى - ءازىربايجان ءتىلى - باشقۇرت ءتىلى - بالۋچي ءتىلى - باسا ءتىلى - بەلارۋس ءتىلى - بەمبا ءتىلى - بەياۋي ءتىلى - بەنا ءتىلى - بولگار ءتىلى - حارياني ءتىلى - باتىس بالۋچي ءتىلى - بحودجپۋري ءتىلى - اني ءتىلى - تاي دام ءتىلى - بامبارا ءتىلى - بەنگال ءتىلى - تيبەت ءتىلى - برەتون ءتىلى - بودو ءتىلى - بوسنيا ءتىلى - اكوسە ءتىلى - بلين ءتىلى - كاتالان ءتىلى - كاددو ءتىلى - اتسام ءتىلى - چاكما ءتىلى - شەشەن ءتىلى - سەبۋانو ءتىلى - كيگا ءتىلى - چوكتو ءتىلى - چەروكي ءتىلى - چيكاساۋ ءتىلى - سوراني ءتىلى - كورسيكا ءتىلى - چەح ءتىلى - باتپاقتى جەردىڭ كري ءتىلى - شىركەۋلىك سلاۆيان ءتىلى - چۋۆاش ءتىلى - ۆاللي ءتىلى - دات ءتىلى - تايتا ءتىلى - نەمىس ءتىلى - نەمىس ءتىلى (اۋستريا) - نەمىس ءتىلى (شۆەيساريا) - زارما ءتىلى - دوگري ءتىلى - تومەنگى سوربيان ءتىلى - دۋالا ءتىلى - ديۆەحي ءتىلى - ديولا ءتىلى - جوڭكا ءتىلى - ەمبۋ ءتىلى - ەۆە ءتىلى - گرەك ءتىلى - اعىلشىن ءتىلى - اعىلشىن ءتىلى (اۋستراليا) - اعىلشىن ءتىلى (كانادا) - اعىلشىن ءتىلى (ۇلىبريتانيا) - اعىلشىن ءتىلى (امەريكا قۇراما شتاتتارى) - اعىلشىن ءتىلى (امەريكا) - ەسپەرانتو ءتىلى - يسپان ءتىلى - يسپان ءتىلى (لاتىن امەريكا) - يسپان ءتىلى (يسپانيا) - يسپان ءتىلى (مەكسيكا) - ەستون ءتىلى - باسك ءتىلى - ەۆوندو ءتىلى - پارسى ءتىلى - داري ءتىلى - فۋلا ءتىلى - فين ءتىلى - فيليپين ءتىلى - فارەر ءتىلى - فرانسۋز ءتىلى - فرانسۋز ءتىلى (كانادا) - فرانسۋز ءتىلى (شۆەيساريا) - كاجۋن ءتىلى - سولتۇستىك-شىعىس كري ءتىلى - فريۋل ءتىلى - باتىس فريز ءتىلى - يرلاند ءتىلى - گا ءتىلى - شوتلانديالىق گەل ءتىلى - گەەز ءتىلى - گاليسيا ءتىلى - گۋاريني ءتىلى - شۆەيساريالىق نەمىس ءتىلى - گۋجاراتي ءتىلى - گۋسي ءتىلى - مەن ءتىلى - حاۋسا ءتىلى - حاۋاي ءتىلى - يۆريت ءتىلى - حيندي ءتىلى - حيندي ءتىلى (لاتىن جازۋى) - حينگليش - حموڭ نيۋا ءتىلى - حورۆات ءتىلى - جوعارعى سوربيان ءتىلى - ماجار ءتىلى - ارميان ءتىلى - ينتەرلينگۆا ءتىلى - يندونەزيا ءتىلى - ينتەرلينگۆە ءتىلى - يگبو ءتىلى - سىچۋان ي ءتىلى - يدو ءتىلى - يسلاند ءتىلى - يتاليان ءتىلى - ينۋكتيتۋت ءتىلى - جاپون ءتىلى - لاجبان ءتىلى - نگومبا ءتىلى - ماچامە ءتىلى - ياۆا ءتىلى - گرۋزين ءتىلى - قاراقالپاق ءتىلى - كابيل ءتىلى - كاجي ءتىلى - كامبا ءتىلى - تياپ ءتىلى - ماكوندە ءتىلى - كابۋۆەرديانۋ ءتىلى - كەنياڭ ءتىلى - كاينگاڭ ءتىلى - كويرا چيني ءتىلى - كيكۋيۋ ءتىلى - قازاق ءتىلى + افار ءتىلى + ابحاز ءتىلى + افريكاانس ءتىلى + اگەم ءتىلى + اكان ءتىلى + امحار ءتىلى + اراگون ءتىلى + وبولو ءتىلى + شامي ءتىلى + اراب ءتىلى + قازىرگى ستاندارتتى اراب ءتىلى + ماپۋچە ءتىلى + اسسام ءتىلى + اسۋ ءتىلى + استرۋيا ءتىلى + ءازىربايجان ءتىلى + باشقۇرت ءتىلى + بالۋچي ءتىلى + باسا ءتىلى + بەلارۋس ءتىلى + بەمبا ءتىلى + بەياۋي ءتىلى + بەنا ءتىلى + بولگار ءتىلى + حارياني ءتىلى + باتىس بالۋچي ءتىلى + بحودجپۋري ءتىلى + اني ءتىلى + تاي دام ءتىلى + بامبارا ءتىلى + بەنگال ءتىلى + تيبەت ءتىلى + باحتيار ءتىلى + برەتون ءتىلى + بودو ءتىلى + بوسنيا ءتىلى + اكوسە ءتىلى + بۋريات ءتىلى + بلين ءتىلى + كاتالان ءتىلى + كاددو ءتىلى + اتسام ءتىلى + چاكما ءتىلى + شەشەن ءتىلى + سەبۋانو ءتىلى + كيگا ءتىلى + چوكتو ءتىلى + چەروكي ءتىلى + چيكاساۋ ءتىلى + سوراني ءتىلى + كورسيكا ءتىلى + كوپىت ءتىلى + چەح ءتىلى + باتپاقتى جەردىڭ كري ءتىلى + شىركەۋلىك سلاۆيان ءتىلى + چۋۆاش ءتىلى + ۆاللي ءتىلى + دات ءتىلى + تايتا ءتىلى + نەمىس ءتىلى + زارما ءتىلى + دوگري ءتىلى + تومەنگى سوربيان ءتىلى + دۋالا ءتىلى + ديۆەحي ءتىلى + ديولا ءتىلى + جوڭكا ءتىلى + ەمبۋ ءتىلى + ەۆە ءتىلى + گرەك ءتىلى + اعىلشىن ءتىلى + اعىلشىن ءتىلى (امەريكا) + ەسپەرانتو ءتىلى + يسپان ءتىلى + ەستون ءتىلى + باسك ءتىلى + ەۆوندو ءتىلى + پارسى ءتىلى + داري ءتىلى + فۋلا ءتىلى + فين ءتىلى + فيليپين ءتىلى + فارەر ءتىلى + فرانسۋز ءتىلى + كاجۋن ءتىلى + سولتۇستىك-شىعىس كري ءتىلى + فريۋل ءتىلى + باتىس فريز ءتىلى + يرلاند ءتىلى + گا ءتىلى + شوتلانديالىق گەل ءتىلى + گەەز ءتىلى + گاليسيا ءتىلى + گۋاريني ءتىلى + شۆەيساريالىق نەمىس ءتىلى + گۋجاراتي ءتىلى + گۋسي ءتىلى + مەن ءتىلى + حاۋسا ءتىلى + حاۋاي ءتىلى + يۆريت ءتىلى + حيندي ءتىلى + حينگليش + حموڭ نيۋا ءتىلى + حورۆات ءتىلى + جوعارعى سوربيان ءتىلى + گايتيان كىرەول ءتىلى + ماجار ءتىلى + ارميان ءتىلى + ينتەرلينگۆا ءتىلى + يندونەزيا ءتىلى + ينتەرلينگۆە ءتىلى + يگبو ءتىلى + سىچۋان ي ءتىلى + يدو ءتىلى + يسلاند ءتىلى + يتاليان ءتىلى + ينۋكتيتۋت ءتىلى + جاپون ءتىلى + لاجبان ءتىلى + نگومبا ءتىلى + ماچامە ءتىلى + ياۆا ءتىلى + گرۋزين ءتىلى + قاراقالپاق ءتىلى + كابيل ءتىلى + كاجي ءتىلى + كامبا ءتىلى + تياپ ءتىلى + ماكوندە ءتىلى + كابۋۆەرديانۋ ءتىلى + كەكچي ءتىلى + كەنياڭ ءتىلى + كاينگاڭ ءتىلى + كويرا چيني ءتىلى + كيكۋيۋ ءتىلى + قازاق ءتىلى قازاق ءتىلى (توتە) - كاكو ءتىلى - كالاليسۋت ءتىلى - كالەنجين ءتىلى - كحمەر ءتىلى - كاننادا ءتىلى - كورەي ءتىلى - كونكاني ءتىلى - كپەلە ءتىلى - كاشمير ءتىلى - شامبالا ءتىلى - بافيا ءتىلى - كولونيان ءتىلى - كۇرد ءتىلى - كورن ءتىلى - كۋۆي ءتىلى - قىرعىز ءتىلى - لاتىن ءتىلى - لانگي ءتىلى - ليۋكسەمبۋرگ ءتىلى - گاندا ءتىلى - ليگۋر ءتىلى - لاكوتا ءتىلى - لادينو ءتىلى - لومبارد ءتىلى - لينگالا ءتىلى - لاوس ءتىلى - كىرەول ءتىلى - سولتۇستىك فريز ءتىلى - ليتۆا ءتىلى - لاتگاليان ءتىلى - لۋبا-كاتاڭا ءتىلى - لۋو ءتىلى - لۋحيا ءتىلى - لاتىش ءتىلى - مايتحيلي ءتىلى - ماساي ءتىلى - موكشا ءتىلى - مەرۋ ءتىلى - موريسيەن ءتىلى - مالاگاسي ءتىلى - ماكۋا-مەتتو ءتىلى - مەتا ءتىلى - موكەنو ءتىلى - ماوري ءتىلى - ميكماۋ ءتىلى - ماكەدون ءتىلى - مالايالام ءتىلى - موڭعول ءتىلى - مانيپۋري ءتىلى - موحاۋك ءتىلى - ماراتحي ءتىلى - مالاي ءتىلى - مالتا ءتىلى - مۋنداڭ ءتىلى - بىرنەشە ءتىلى - كريك ءتىلى - بيرما ءتىلى - ەرزيا ءتىلى - مازاندەران ءتىلى - ناما ءتىلى - نورۆەگيالىق بۋكمول ءتىلى - سولتۇستىك ندەبەلە ءتىلى - تومەنگى نەمىس ءتىلى - تومەنگى ساكسون ءتىلى - نەپال ءتىلى - نيدەرلاند ءتىلى - فلاماند ءتىلى - كۋاسيو ءتىلى - نورۆەگيالىق نيۋنورسك ءتىلى - نگيەمبۋن ءتىلى - نورۆەگ ءتىلى - نكو ءتىلى - وڭتۇستىك ندەبەلە ءتىلى - سولتۇستىك سوتو ءتىلى - نۋەر ءتىلى - ناۆاحو ءتىلى - نيانجا ءتىلى - نيانكولە ءتىلى - وكسيتان ءتىلى - ورومو ءتىلى - وريا ءتىلى - وسەتين ءتىلى - وسەيج ءتىلى - پەنجاب ءتىلى - پاپيامەنتو ءتىلى - نيگەريالىق پيدجين ءتىلى - پيجين ءتىلى - پولياك ءتىلى - پرۋسسيا ءتىلى - پۋشتۋ ءتىلى - پورتۋگال ءتىلى - برازيليالىق پورتۋگال ءتىلى - ەۋروپالىق پورتۋگال ءتىلى - كەچۋا ءتىلى - كيچە ءتىلى - راجاستاني ءتىلى - روحينجا ءتىلى - ريفيان ءتىلى - رومانش ءتىلى - رۋندي ءتىلى - رۋمىن ءتىلى - مولدوۆان ءتىلى - رومبو ءتىلى - ورىس ءتىلى - كينيارۋاندا ءتىلى - رۋا ءتىلى - سانسكريت ءتىلى - ساحا ءتىلى - سامبۋرۋ ءتىلى - سانتالي ءتىلى - ساڭۋ ءتىلى - ساردين ءتىلى - سيسيليا ءتىلى - سيندحي ءتىلى - وڭتۇستىك كۇرد ءتىلى - سولتۇستىك سامي ءتىلى - سەنا ءتىلى - كويرابورو سەنني ءتىلى - ساڭو ءتىلى - تاشەلحيت ءتىلى - شان ءتىلى - سينگال ءتىلى - سيدامو ءتىلى - سلوۆاك ءتىلى - سارايكي ءتىلى - سلوۆەن ءتىلى - وڭتۇستىك سامي ءتىلى - لۋلە-سامي ءتىلى - يناري سامي ءتىلى - كولتا سامي ءتىلى - شونا ءتىلى - سومالي ءتىلى - البان ءتىلى - سەرب ءتىلى - سۋاتي ءتىلى - ساحو ءتىلى - وڭتۇستىك سوتو ءتىلى - سۋدان ءتىلى - شۆەد ءتىلى - سۋاحيلي ءتىلى - كونگو سۋاحيلي ءتىلى - سيريا ءتىلى - سيلەز ءتىلى - تاميل ءتىلى - تەلۋگۋ ءتىلى - تەسو ءتىلى - تاجىك ءتىلى - تاي ءتىلى - تيگرينيا ءتىلى - تيگرە ءتىلى - تۇرىكمەن ءتىلى - سۋانا ءتىلى - تونگان ءتىلى - توكي-پونا ءتىلى - توك-پيسين ءتىلى - تۇرىك ءتىلى - تاروكو ءتىلى - توۋالي ءتىلى - سونگا ءتىلى - تاتار ءتىلى - تاساۋاك ءتىلى - تۋۆين ءتىلى - ورتالىق اتلاس تامازيگحت ءتىلى - ۇيعىر ءتىلى - ۋكراين ءتىلى - بەلگىسىز ءتىل - ۋردۋ ءتىلى - وزبەك ءتىلى - ۆاي ءتىلى - ۆەندا ءتىلى - ۆەنەسيا ءتىلى - ۆيەتنام ءتىلى - ماكۋا ءتىلى - ۆولاپيۋك ءتىلى - ۆۋنجو ءتىلى - ۋالون ءتىلى - ۋالسەر ءتىلى - ۋولايتا ءتىلى - ۋالبيري ءتىلى - ۆولوف ءتىلى - كحوسا ءتىلى - كاڭري ءتىلى - سوگا ءتىلى - ياڭبەن ءتىلى - يديش ءتىلى - يورۋبا ءتىلى - نەنگاتۋ ءتىلى - گۋاڭدۇڭ ءتىلى - قىتاي ءتىلى (گۋاڭدۇڭ) - جۋاڭ ءتىلى - ماروككولىق ستاندارتتى تامازيگحت ءتىلى - قىتاي ءتىلى - قىتاي ءتىلى (پۋتۋڭحۋا) - جەڭىلدەتىلگەن قىتاي ءتىلى - جەڭىلدەتىلگەن قىتاي ءتىلى (پۋتۋڭحۋا) - ءداستۇرلى قىتاي ءتىلى - ءداستۇرلى قىتاي ءتىلى (پۋتۋڭحۋا) - زۋلۋ ءتىلى - تىلدىك مازمۇنى جوق + كاكو ءتىلى + كالاليسۋت ءتىلى + كالەنجين ءتىلى + كحمەر ءتىلى + كاننادا ءتىلى + كورەي ءتىلى + كونكاني ءتىلى + كپەلە ءتىلى + كاشمير ءتىلى + شامبالا ءتىلى + بافيا ءتىلى + كولونيان ءتىلى + كۇرد ءتىلى + كۇرد ءتىلى + كۇرمانجى + كورن ءتىلى + كۋۆي ءتىلى + قىرعىز ءتىلى + لاتىن ءتىلى + لانگي ءتىلى + ليۋكسەمبۋرگ ءتىلى + گاندا ءتىلى + ليگۋر ءتىلى + لاكوتا ءتىلى + لادينو ءتىلى + لومبارد ءتىلى + لينگالا ءتىلى + لاوس ءتىلى + كىرەول ءتىلى + سولتۇستىك فريز ءتىلى + ليتۆا ءتىلى + لاتگاليان ءتىلى + لۋبا-كاتاڭا ءتىلى + لۋو ءتىلى + لۋحيا ءتىلى + لاتىش ءتىلى + لاز ءتىلى + مايتحيلي ءتىلى + ماساي ءتىلى + موكشا ءتىلى + مەرۋ ءتىلى + موريسيەن ءتىلى + مالاگاسي ءتىلى + ماكۋا-مەتتو ءتىلى + مەتا ءتىلى + موكەنو ءتىلى + ماوري ءتىلى + ميكماۋ ءتىلى + ماكەدون ءتىلى + مالايالام ءتىلى + موڭعول ءتىلى + مانيپۋري ءتىلى + موحاۋك ءتىلى + ماراتحي ءتىلى + مالاي ءتىلى + مالتا ءتىلى + مۋنداڭ ءتىلى + بىرنەشە ءتىلى + كريك ءتىلى + بيرما ءتىلى + ەرزيا ءتىلى + مازاندەران ءتىلى + ناما ءتىلى + نورۆەگيالىق بۋكمول ءتىلى + سولتۇستىك ندەبەلە ءتىلى + تومەنگى نەمىس ءتىلى + تومەنگى ساكسون ءتىلى + نەپال ءتىلى + نيدەرلاند ءتىلى + فلاماند ءتىلى + كۋاسيو ءتىلى + نورۆەگيالىق نيۋنورسك ءتىلى + نگيەمبۋن ءتىلى + نورۆەگ ءتىلى + نكو ءتىلى + وڭتۇستىك ندەبەلە ءتىلى + سولتۇستىك سوتو ءتىلى + نۋەر ءتىلى + ناۆاحو ءتىلى + نيانجا ءتىلى + نيانكولە ءتىلى + وكسيتان ءتىلى + ورومو ءتىلى + وريا ءتىلى + وسەتين ءتىلى + وسەيج ءتىلى + پەنجاب ءتىلى + پاپيامەنتو ءتىلى + نيگەريالىق پيدجين ءتىلى + پالي ءتىلى + پيجين ءتىلى + پولياك ءتىلى + پيەمونت ءتىلى + پرۋسسيا ءتىلى + پۋشتۋ ءتىلى + پورتۋگال ءتىلى + برازيليالىق پورتۋگال ءتىلى + ەۋروپالىق پورتۋگال ءتىلى + كەچۋا ءتىلى + كيچە ءتىلى + راجاستاني ءتىلى + روحينجا ءتىلى + ريفيان ءتىلى + رومانش ءتىلى + رۋندي ءتىلى + رۋمىن ءتىلى + مولدوۆان ءتىلى + رومبو ءتىلى + ورىس ءتىلى + كينيارۋاندا ءتىلى + رۋا ءتىلى + سانسكريت ءتىلى + ساحا ءتىلى + سامبۋرۋ ءتىلى + سانتالي ءتىلى + ساڭۋ ءتىلى + ساردين ءتىلى + سيسيليا ءتىلى + سيندحي ءتىلى + وڭتۇستىك كۇرد ءتىلى + سولتۇستىك سامي ءتىلى + سەنا ءتىلى + كويرابورو سەنني ءتىلى + ساڭو ءتىلى + ساموگيتيان ءتىلى + تاشەلحيت ءتىلى + شان ءتىلى + سينگال ءتىلى + سيدامو ءتىلى + سلوۆاك ءتىلى + سارايكي ءتىلى + سلوۆەن ءتىلى + وڭتۇستىك سامي ءتىلى + لۋلە-سامي ءتىلى + يناري سامي ءتىلى + كولتا سامي ءتىلى + شونا ءتىلى + سومالي ءتىلى + البان ءتىلى + سەرب ءتىلى + سۋاتي ءتىلى + ساحو ءتىلى + وڭتۇستىك سوتو ءتىلى + سۋدان ءتىلى + شۆەد ءتىلى + سۋاحيلي ءتىلى + كونگو سۋاحيلي ءتىلى + سيريا ءتىلى + سيلەز ءتىلى + تاميل ءتىلى + تەلۋگۋ ءتىلى + تەسو ءتىلى + تاجىك ءتىلى + تاي ءتىلى + تيگرينيا ءتىلى + تيگرە ءتىلى + تۇرىكمەن ءتىلى + سۋانا ءتىلى + تونگان ءتىلى + توكي-پونا ءتىلى + توك-پيسين ءتىلى + تۇرىك ءتىلى + تاروكو ءتىلى + توۋالي ءتىلى + سونگا ءتىلى + تاتار ءتىلى + تاساۋاك ءتىلى + تۋۆين ءتىلى + ورتالىق اتلاس تامازيگحت ءتىلى + ۇيعىر ءتىلى + ۋكراين ءتىلى + بەلگىسىز ءتىل + ۋردۋ ءتىلى + وزبەك ءتىلى + ۆاي ءتىلى + ۆەندا ءتىلى + ۆەنەسيا ءتىلى + ۆيەتنام ءتىلى + ماكۋا ءتىلى + ۆولاپيۋك ءتىلى + ۆۋنجو ءتىلى + ۋالون ءتىلى + ۋالسەر ءتىلى + ۋولايتا ءتىلى + ۋالبيري ءتىلى + ۆولوف ءتىلى + كحوسا ءتىلى + كاڭري ءتىلى + سوگا ءتىلى + ياڭبەن ءتىلى + يديش ءتىلى + يورۋبا ءتىلى + نەنگاتۋ ءتىلى + گۋاڭدۇڭ ءتىلى + قىتاي ءتىلى (گۋاڭدۇڭ) + جۋاڭ ءتىلى + ماروككولىق ستاندارتتى تامازيگحت ءتىلى + قىتاي ءتىلى + قىتاي ءتىلى (پۋتۋڭحۋا) + جەڭىلدەتىلگەن قىتاي ءتىلى + جەڭىلدەتىلگەن قىتاي ءتىلى (پۋتۋڭحۋا) + ءداستۇرلى قىتاي ءتىلى + ءداستۇرلى قىتاي ءتىلى (پۋتۋڭحۋا) + زۋلۋ ءتىلى + تىلدىك مازمۇنى جوق - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - الەم - افريكا - سولتۇستىك امەريكا - وڭتۇستىك امەريكا - وكەانيا - باتىس افريكا - ورتالىق امەريكا - شىعىس افريكا - سولتۇستىك افريكا - ورتالىق افريكا - وڭتۇستىك افريكا ايماعى - امەريكا - سولتۇستىك امەريكا (ايماق) - كاريب - شىعىس ازيا - وڭتۇستىك ازيا - وڭتۇستىك-شىعىس ازيا - وڭتۇستىك ەۋروپا - اۋسترالازيا - مەلانەزيا - ميكرونەزيا ايماعى - پولينەزىا - ازيا - ورتالىق ازيا - باتىس ازيا - ەۋروپا - شىعىس ەۋروپا - سولتۇستىك ەۋروپا - باتىس ەۋروپا - سۋبساحارالىق افريكا - لاتىن امەريكا - اسكەنجىن ارالى - اندوررا - بىرىككەن اراب امىرلىكتەرى - اۋعانستان - انتيگۋا جانە باربۋدا - انگيليا - البانيا - ارمەنيا - انگولا - انتاركتيدا - ارگەنتينا - امەريكالىق ساموا - اۋستريا - اۋستراليا - ارۋبا - الاند ارالدارى - ءازىربايجان - بوسنيا جانە گەرتسەگوۆينا - باربادوس - بانگلادەش - بەلگيا - بۋركينا-فاسو - بولگاريا - باحرەين - بۋرۋندي - بەنين - سان-بارتەمەلي - بەرمۋد ارالدارى - برۋنەي - بوليۆيا - بونەير، سينت-ەستاتيۋس جانە سابا - برازيليا - باگام ارالدارى - بۋتان - بۋۆە ارالى - بوتسۆانا - بەلارۋس - بەليز - كانادا - كوكوس (كيليڭ) ارالدارى - كونگو - كونگو دەموكراتيالىق رەسپۋبليكاسى - ورتالىق افريكا رەسپۋبليكاسى - كونگو-براززاۆيل رەسپۋبليكاسى - كونگو رەسپۋبليكاسى - شۆەيساريا - كوت-ديۆۋار - كۋك ارالدارى - چيلي - كامەرۋن - قىتاي - كولۋمبيا - كليپپەرتون ارالى - سارك - كوستا-ريكا - كۋبا - كابو-ۆەردە - كيۋراساو - حريستماس ارالى - كيپر - چەحيا - چەح رەسپۋبليكاسى - گەرمانيا - ديەگو-گارسيا - دجيبۋتي - دانيا - دومينيكا - دومينيكان رەسپۋبليكاسى - الجىر - سەۋتا جانە مەليليا - ەكۆادور - ەستونيا - مىسىر - باتىس ساحارا - ەريترەيا - يسپانيا - ەفيوپيا - ەۋروپالىق وداق - ەۋرو ايماق - فينليانديا - فيجي - فولكلەند ارالدارى - فولكلەند ارالدارى (مالۆين ارالدارى) - ميكرونەزيا - فارەر ارالدارى - فرانسيا - گابون - ۇلىبريتانيا - گرەنادا - گرۋزيا - فرانسۋز گۆياناسى - گەرنسي - گانا - گيبرالتار - گرەنلانديا - گامبيا - گۆەنيا - گۆادەلۋپا - ەكۆاتورلىق گۆينەيا - گرەكيا - وڭتۇستىك گەورگيا جانە وڭتۇستىك ساندۆيچ ارالدارى - گۆاتەمالا - گۋان - گۆەنيا-بيساۋ - گايانا - حوڭكوڭ - حەرد ارالى جانە ماكدونالد ارالدارى - گوندۋراس - حورۆاتيا - گايتي - ماجارستان - كانار ارالدارى - يندونەزيا - يرلانديا - يزرايل - مەن ارالى - ءۇندىستان - ءۇندى مۇحيتىنداعى بريتان ايماعى - چاگوس ارحيپەلاگى - يراك - يران - يسلانديا - يتاليا - جەرسي - يامايكا - يوردانيا - جاپونيا - كەنيا - قىرعىزستان - كامباجا - كيريباتي - كومور ارالدارى - سەنت-كيتس جانە نەۆيس - سولتۇستىك كورەيا - وڭتۇستىك كورەيا - كۋۆەيت - كايمان ارالدارى - قازاق ەلى - لاوس - ليۆان - سەنت-ليۋسيا - ليحتەنشتەين - شري-لانكا - ليبەريا - لەسوتو - ليتۆا - ليۋكسەمبۋرگ - لاتۆيا - ليۆيا - ماروككو - موناكو - مولدوۆا - چەرنوگوريا - سەن-مارتەن - ماداگاسكار - مارشال ارالدارى - سولتۇستىك ماكەدونيا - مالي - ميانما (بيرما) - موڭعوليا - ماكاو - سولتۇستىك ماريانا ارالدارى - مارتينيكا - ماۆريتانيا - مونتسەررات - مالتا - ماۆريكي - مالديۆ ارالدارى - مالاۆي - مەكسيكا - مالايزيا - موزامبيك - ناميبيا - جاڭا كالەدونيا - نيگەر - نورفولك ارالى - نيگەريا - نيكاراگۋا - نيدەرلاند - نورۆەگيا - نەپال - ناۋرۋ - نيۋە - جاڭا زەلانديا - اوتەاروا، جاڭا زەلانديا - ومان - پاناما - پەرۋ - فرانتسۋز پولينەزياسى - پاپۋا — جاڭا گۆينەيا - فيليپين ارالدارى - پاكىستان - پولشا - سەن-پەر جانە ميكەلون - پيتكەرن ارالدارى - پۋەرتو-ريكو - پالەستينا ايماقتارى - پالەستينا - پورتۋگاليا - پالاۋ - پاراگۆاي - كاتار - سىرتقى وكەانيا - رەيۋنيون - رۋمىنيا - سەربيا - حەسەي - رۋاندا - ساۋد ارابياسى - سولومون ارالدارى - سەيشەل ارالدارى - سۋدان - شۆەسيا - سينگاپۋر - اۋليە ەلەنا ارالى - سلوۆەنيا - شپيتسبەرگەن جانە يان-مايەن - سلوۆاكيا - سەررا-لەونە - سان-مارينو - سەنەگال - سومالي - سۋرينام - وڭتۇستىك سۋدان - سان-تومە جانە پرينسيپي - سالۆادور - سينت-مارتەن - سيريا - ەسۆاتيني - سۆازيلەند - تريستان-دا-كۋنيا - تەركس جانە كايكوس ارالدارى - چاد - فرانتسيانىڭ وڭتۇستىك ايماقتارى - توگو - تايلاند - تاجىكستان - توكەلاۋ - تيمور-لەستە - شىعىس تيمور - تۇرىكمەنستان - تۋنيس - تونگا - تۇركيا - ترينيداد جانە توباگو - تۋۆالۋ - تايۋان - تانزانيا - ۋكراينا - ۋگاندا - ا ق ش-تىڭ سىرتقى كىشى ارالدارى - بىرىككەن ۇلتتار ۇيىمى - امەريكا قۇراما شتاتتارى - ا ق ش - ۋرۋگۆاي - وزبەكستان - ۆاتيكان - سەنت-ۆينسەنت جانە گرەنادين ارالدارى - ۆەنەسۋەلا - بريتاندىق ۆيرگين ارالدارى - ا ق ش-تىڭ ۆيرگين ارالدارى - ۆيەتنام - ۆانۋاتۋ - ۋولليس جانە فۋتۋنا - ساموا - جالعان اكسەنت - جالعان Bidi - كوسوۆو - يەمەن - مايوتتا - وڭتۇستىك افريكا - زامبيا - زيمبابۆە - بەلگىسىز ايماق + الەم + افريكا + سولتۇستىك امەريكا + وڭتۇستىك امەريكا + وكەانيا + باتىس افريكا + ورتالىق امەريكا + شىعىس افريكا + سولتۇستىك افريكا + ورتالىق افريكا + وڭتۇستىك افريكا ايماعى + امەريكا + سولتۇستىك امەريكا (ايماق) + كاريب + شىعىس ازيا + وڭتۇستىك ازيا + وڭتۇستىك-شىعىس ازيا + وڭتۇستىك ەۋروپا + اۋسترالازيا + مەلانەزيا + ميكرونەزيا ايماعى + پولينەزىا + ازيا + ورتالىق ازيا + باتىس ازيا + ەۋروپا + شىعىس ەۋروپا + سولتۇستىك ەۋروپا + باتىس ەۋروپا + سۋبساحارالىق افريكا + لاتىن امەريكا + اسكەنجىن ارالى + اندوررا + بىرىككەن اراب امىرلىكتەرى + اۋعانستان + انتيگۋا جانە باربۋدا + انگيليا + البانيا + ارمەنيا + انگولا + انتاركتيدا + ارگەنتينا + امەريكالىق ساموا + اۋستريا + اۋستراليا + ارۋبا + الاند ارالدارى + ءازىربايجان + بوسنيا جانە گەرتسەگوۆينا + باربادوس + بانگلادەش + بەلگيا + بۋركينا-فاسو + بولگاريا + باحرەين + بۋرۋندي + بەنين + سان-بارتەمەلي + بەرمۋد ارالدارى + برۋنەي + بوليۆيا + بونەير، سينت-ەستاتيۋس جانە سابا + برازيليا + باگام ارالدارى + بۋتان + بۋۆە ارالى + بوتسۆانا + بەلارۋس + بەليز + كانادا + كوكوس (كيليڭ) ارالدارى + كونگو + كونگو دەموكراتيالىق رەسپۋبليكاسى + ورتالىق افريكا رەسپۋبليكاسى + كونگو-براززاۆيل رەسپۋبليكاسى + كونگو رەسپۋبليكاسى + شۆەيساريا + كوت-ديۆۋار + كۋك ارالدارى + چيلي + كامەرۋن + قىتاي + كولۋمبيا + كليپپەرتون ارالى + سارك + كوستا-ريكا + كۋبا + كابو-ۆەردە + كيۋراساو + حريستماس ارالى + كيپر + چەحيا + چەح رەسپۋبليكاسى + گەرمانيا + ديەگو-گارسيا + دجيبۋتي + دانيا + دومينيكا + دومينيكان رەسپۋبليكاسى + الجىر + سەۋتا جانە مەليليا + ەكۆادور + ەستونيا + مىسىر + باتىس ساحارا + ەريترەيا + يسپانيا + ەفيوپيا + ەۋروپالىق وداق + ەۋرو ايماق + فينليانديا + فيجي + فولكلەند ارالدارى + فولكلەند ارالدارى (مالۆين ارالدارى) + ميكرونەزيا + فارەر ارالدارى + فرانسيا + گابون + ۇلىبريتانيا + گرەنادا + گرۋزيا + فرانسۋز گۆياناسى + گەرنسي + گانا + گيبرالتار + گرەنلانديا + گامبيا + گۆەنيا + گۆادەلۋپا + ەكۆاتورلىق گۆينەيا + گرەكيا + وڭتۇستىك گەورگيا جانە وڭتۇستىك ساندۆيچ ارالدارى + گۆاتەمالا + گۋان + گۆەنيا-بيساۋ + گايانا + حوڭكوڭ + حەرد ارالى جانە ماكدونالد ارالدارى + گوندۋراس + حورۆاتيا + گايتي + ماجارستان + كانار ارالدارى + يندونەزيا + يرلانديا + يزرايل + مەن ارالى + ءۇندىستان + ءۇندى مۇحيتىنداعى بريتان ايماعى + چاگوس ارحيپەلاگى + يراك + يران + يسلانديا + يتاليا + جەرسي + يامايكا + يوردانيا + جاپونيا + كەنيا + قىرعىزستان + كامباجا + كيريباتي + كومور ارالدارى + سەنت-كيتس جانە نەۆيس + سولتۇستىك كورەيا + وڭتۇستىك كورەيا + كۋۆەيت + كايمان ارالدارى + قازاق ەلى + لاوس + ليۆان + سەنت-ليۋسيا + ليحتەنشتەين + شري-لانكا + ليبەريا + لەسوتو + ليتۆا + ليۋكسەمبۋرگ + لاتۆيا + ليۆيا + ماروككو + موناكو + مولدوۆا + چەرنوگوريا + سەن-مارتەن + ماداگاسكار + مارشال ارالدارى + سولتۇستىك ماكەدونيا + مالي + ميانما (بيرما) + موڭعوليا + ماكاو + سولتۇستىك ماريانا ارالدارى + مارتينيكا + ماۆريتانيا + مونتسەررات + مالتا + ماۆريكي + مالديۆ ارالدارى + مالاۆي + مەكسيكا + مالايزيا + موزامبيك + ناميبيا + جاڭا كالەدونيا + نيگەر + نورفولك ارالى + نيگەريا + نيكاراگۋا + نيدەرلاند + نورۆەگيا + نەپال + ناۋرۋ + نيۋە + جاڭا زەلانديا + اوتەاروا، جاڭا زەلانديا + ومان + پاناما + پەرۋ + فرانتسۋز پولينەزياسى + پاپۋا — جاڭا گۆينەيا + فيليپين ارالدارى + پاكىستان + پولشا + سەن-پەر جانە ميكەلون + پيتكەرن ارالدارى + پۋەرتو-ريكو + پالەستينا ايماقتارى + پالەستينا + پورتۋگاليا + پالاۋ + پاراگۆاي + كاتار + سىرتقى وكەانيا + رەيۋنيون + رۋمىنيا + سەربيا + حەسەي + رۋاندا + ساۋد ارابياسى + سولومون ارالدارى + سەيشەل ارالدارى + سۋدان + شۆەسيا + سينگاپۋر + اۋليە ەلەنا ارالى + سلوۆەنيا + شپيتسبەرگەن جانە يان-مايەن + سلوۆاكيا + سەررا-لەونە + سان-مارينو + سەنەگال + سومالي + سۋرينام + وڭتۇستىك سۋدان + سان-تومە جانە پرينسيپي + سالۆادور + سينت-مارتەن + سيريا + ەسۆاتيني + سۆازيلەند + تريستان-دا-كۋنيا + تەركس جانە كايكوس ارالدارى + چاد + فرانتسيانىڭ وڭتۇستىك ايماقتارى + توگو + تايلاند + تاجىكستان + توكەلاۋ + تيمور-لەستە + شىعىس تيمور + تۇرىكمەنستان + تۋنيس + تونگا + تۇركيا + ترينيداد جانە توباگو + تۋۆالۋ + تايۋان + تانزانيا + ۋكراينا + ۋگاندا + ا ق ش-تىڭ سىرتقى كىشى ارالدارى + بىرىككەن ۇلتتار ۇيىمى + امەريكا قۇراما شتاتتارى + ا ق ش + ۋرۋگۆاي + وزبەكستان + ۆاتيكان + سەنت-ۆينسەنت جانە گرەنادين ارالدارى + ۆەنەسۋەلا + بريتاندىق ۆيرگين ارالدارى + ا ق ش-تىڭ ۆيرگين ارالدارى + ۆيەتنام + ۆانۋاتۋ + ۋولليس جانە فۋتۋنا + ساموا + جالعان اكسەنت + بالعان بيدي + كوسوۆو + يەمەن + مايوتتا + وڭتۇستىك افريكا + زامبيا + زيمبابۆە + بەلگىسىز ايماق - ءداستۇرلى نەمىس جازۋى - ستاندارتتى رەزيا جازۋى - 1996 جىلعا دەيىنگى نەمىس جازۋى - 1606 جىلعا دەيىنگى بەرگى ورتا فرانتسۋز ءتىلى - ەرتە ورتا فرانتسۋز ءتىلى - اكادەميالىق - 1943 جىلعى جازۋدىڭ قالىپتاسۋى - اكۋاپەم - ALA-LC رومانيزاتسياسى، 1997 جىلعى نۇسقا - الۋكۋ ديالەكتىسى - انپەزو - پورتۋگال ءتىلىنىڭ 1990 جىلعى جازۋ كەلىسىمى - اران - شىعىس ارميان - باتىس ارميان - وۆەرن - جالپى تۇركى ءالىپبيى - انيي بالانكا ديالەكتىسى - كابۋۆەرديانۋ بارلاۆەنتو ديالەكت توبى - بەيسيك-ەنگليش - باددا - بسياۆ - بسيزبل - بيسكاي - سان-جورجو/ديلا ديالەكتىسى - بلاسل - بوحوريچا ءالىپبيى - بۋنتلينگ - بورنحولم - سيزاۋپ - 1945 جىلعى برازيليالىق پورتۋگال ءتىلى كونۆەنتسياسى - كورنۋ - كرەيس - داينكو ءالىپبيى - سەرب ءتىلىنىڭ ەكاۆ ايتىلىمى - ەرتە ورتا اعىلشىن ءتىلى - فاسكيا - فودوم - حالىقارالىق فونەتيكالىق ءالىپبي - فونكيرش - فونناپا - ورال فونەتيكالىق ءالىپبي - فونكسامپ - گاللو - گاسكون - گحەرد - گ ر ك ل ا س س - گريتال - گ ر م ي س ت ر - حەپبيورن جۇيەسى - حەگنورسك - ح جۇيەسى - سەرب ءتىلىنىڭ يەكاۆ ايتىلىمى - يتيحاسا - يۆانچوۆ - ياۋەر - يۋتپيڭ - جالپى جازۋ - كوچەۋە - ستاندارتتى جازۋ - لاۋكيكا - ليمۋزەن - لانگەدوك - رەزيا ءتىلىنىڭ ليپوۆاز ديالەكتىسى - لتگ1929 - لتگ2007 - لۋنا1998 - مەتەلكو - مونوتوندى - نديۋكا - ناتيسون ديالەكتىسى - نيۋفاۋند - نيكارد - گنيۆا/نجيۆا ديالەكتىسى - زاماناۋي ۆولاپيۋك - وسەاككو/وسوجانە ديالەكتىسى - اعىلشىن ءتىلىنىڭ وكسفورد سوزدىگىندەگى ەملەسى - پاحاۋح2 - پاحاۋح3 - پاحاۋح4 - پاماكا ديالەكتىسى - پەانو - پەحوەيي - پەتر1708 - پينين رومانيزاسياسى - پوليتوندى - كومپيۋتەر - پروۆانس - پۋتەر - قايتا قارالعان جازۋ - كلاسسيكالىق ۆولاپيۋك - رەزيا - رۋمگر - ساحو - شوتلانديانىڭ ستاندارتتى اعىلشىن ءتىلى - سكاۋس - قاراپايىم - ستولۆيتسا/سولبيكا ديالەكتىسى - كابۋۆەرديانۋدىڭ سوتاۆەنتو ديالەكت توبى - سپانگليش - سۋرميران - سۋرسيلۆ - سۋتسيلۆ - سيننەجيل - تايلو - تاراشكەۆيتسا - توڭيوڭ - تۋنۋمييت - بىرىڭعاي جازۋ - بىرىڭعاي قايتا قارالعان جازۋ - ولستەر - يۋنيفون فونەتيكالىق ءالىپبيى - ۆايديكا - ۆالباديا - ۆالەنسيا - ۆاللادەر - ۆەچدرۋكا - ۆيۆارو-ءالپى - ۋەيد-جايىلس جۇيەسى - X جۇيەسى + ءداستۇرلى نەمىس جازۋى + ستاندارتتى رەزيا جازۋى + 1996 جىلعا دەيىنگى نەمىس جازۋى + 1606 جىلعا دەيىنگى بەرگى ورتا فرانتسۋز ءتىلى + ەرتە ورتا فرانتسۋز ءتىلى + اكادەميالىق + 1943 جىلعى جازۋدىڭ قالىپتاسۋى + اكۋاپەم + ALA-LC رومانيزاتسياسى، 1997 جىلعى نۇسقا + الۋكۋ ديالەكتىسى + انپەزو + پورتۋگال ءتىلىنىڭ 1990 جىلعى جازۋ كەلىسىمى + اران + شىعىس ارميان + باتىس ارميان + وۆەرن + جالپى تۇركى ءالىپبيى + انيي بالانكا ديالەكتىسى + كابۋۆەرديانۋ بارلاۆەنتو ديالەكت توبى + بەيسيك-ەنگليش + باددا + بسياۆ + بسيزبل + بيسكاي + سان-جورجو/ديلا ديالەكتىسى + بلاسل + بوحوريچا ءالىپبيى + بۋنتلينگ + بورنحولم + سيزاۋپ + 1945 جىلعى برازيليالىق پورتۋگال ءتىلى كونۆەنتسياسى + كورنۋ + كرەيس + داينكو ءالىپبيى + سەرب ءتىلىنىڭ ەكاۆ ايتىلىمى + ەرتە ورتا اعىلشىن ءتىلى + فاسكيا + فودوم + حالىقارالىق فونەتيكالىق ءالىپبي + فونكيرش + فونناپا + ورال فونەتيكالىق ءالىپبي + فونكسامپ + گاللو + گاسكون + گحەرد + گ ر ك ل ا س س + گريتال + گ ر م ي س ت ر + حەپبيورن جۇيەسى + حەگنورسك + ح جۇيەسى + سەرب ءتىلىنىڭ يەكاۆ ايتىلىمى + يتيحاسا + يۆانچوۆ + ياۋەر + يۋتپيڭ + جالپى جازۋ + كوچەۋە + ستاندارتتى جازۋ + لاۋكيكا + ليمۋزەن + لانگەدوك + رەزيا ءتىلىنىڭ ليپوۆاز ديالەكتىسى + لتگ1929 + لتگ2007 + لۋنا1998 + مەتەلكو + مونوتوندى + نديۋكا + ناتيسون ديالەكتىسى + نيۋفاۋند + نيكارد + گنيۆا/نجيۆا ديالەكتىسى + زاماناۋي ۆولاپيۋك + وسەاككو/وسوجانە ديالەكتىسى + اعىلشىن ءتىلىنىڭ وكسفورد سوزدىگىندەگى ەملەسى + پاحاۋح2 + پاحاۋح3 + پاحاۋح4 + پاماكا ديالەكتىسى + پەانو + پەحوەيي + پەتر1708 + پينين رومانيزاسياسى + پوليتوندى + كومپيۋتەر + پروۆانس + پۋتەر + قايتا قارالعان جازۋ + كلاسسيكالىق ۆولاپيۋك + رەزيا + رۋمگر + ساحو + شوتلانديانىڭ ستاندارتتى اعىلشىن ءتىلى + سكاۋس + قاراپايىم + ستولۆيتسا/سولبيكا ديالەكتىسى + كابۋۆەرديانۋدىڭ سوتاۆەنتو ديالەكت توبى + سپانگليش + سۋرميران + سۋرسيلۆ + سۋتسيلۆ + سيننەجيل + تايلو + تاراشكەۆيتسا + توڭيوڭ + تۋنۋمييت + بىرىڭعاي جازۋ + بىرىڭعاي قايتا قارالعان جازۋ + ولستەر + يۋنيفون فونەتيكالىق ءالىپبيى + ۆايديكا + ۆالباديا + ۆالەنسيا + ۆاللادەر + ۆەچدرۋكا + ۆيۆارو-ءالپى + ۋەيد-جايىلس جۇيەسى + X جۇيەسى - كۇنتىزبە - اقشا ءپىشىمى - سۇرىپتاۋ رەتى - اقشا - ۋاقىت فورماتى (12 نە 24) - جولدى تاسىمالداۋ ءستيلى - ولشەمدەر جۇيەسى - ساندار + كۇنتىزبە + اقشا ءپىشىمى + سۇرىپتاۋ رەتى + اقشا + ەمودجي كورسەتىلىمى + ۋاقىت فورماتى (12 نە 24) + جولدى تاسىمالداۋ ءستيلى + سوزدەردەگى جول بولىنىستەرى + ولشەمدەر جۇيەسى + ساندار + قىسقارعان سوزدەن كەيىنگى سويلەم ءبولىنىسى - بۋددا كۇنتىزبەسى - قىتاي كۇنتىزبەسى - كوپت كۇنتىزبەسى - دانگي كۇنتىزبەسى - ەفيوپيا كۇنتىزبەسى - ەفيوپيانىڭ امەتە-الەم كۇنتىزبەسى - گرەگورياندىق كۇنتىزبە - كونە ەۆرەي كۇنتىزبەسى - ءۇندىستاننىڭ ۇلتتىق كۇنتىزبەسى - يسلام كۇنتىزبەسى - يسلام كۇنتىزبەسى (كەستەلىك، ازاماتتىق ءداۋىر) - يسلام كۇنتىزبەسى (ساۋد ارابياسى، جاڭا اي) - يسلام كۇنتىزبەسى (كەستەلىك، استرونوميالىق ءداۋىر) - يسلام كۇنتىزبەسى (ۋمم ءال-قۇرا) - ISO-8601 كۇنتىزبەسى - جاپون كۇنتىزبەسى - پارسى كۇنتىزبەسى - مينگۋو كۇنتىزبەسى - ەسەپتىك اقشا ءپىشىمى - ستاندارتتى اقشا ءپىشىمى - ءداستۇرلى قىتاي ءتىلىنىڭ سۇرىپتاۋ رەتى - Big5 - سايكەستىككە ارنالعان الدىڭعى سۇرىپتاۋ رەتى - سوزدىك بويىنشا سۇرىپتاۋ رەتى - ادەپكى ۋنيكود سۇرىپتاۋ رەتى - ەموجي سۇرىپتاۋ رەتى - ەۋروپالىق رەتتەۋ ەرەجەلەرى - جەڭىلدەتىلگەن قىتاي ءتىلىنىڭ سۇرىپتاۋ رەتى - GB2312 - تەلەفون كىتاپشاسىنىڭ سۇرىپتاۋ رەتى - پينين سۇرىپتاۋ رەتى - جالپى ماقساتتاعى ىزدەۋ - كورەي ءتىلىنىڭ باستاپقى داۋىسسىزى بويىنشا ىزدەۋ - ستاندارتتى سۇرىپتاۋ رەتى - يەروگليفتەر سىزىقتارىن سۇرىپتاۋ رەتى - ءداستۇرلى سۇرىپتاۋ رەتى - يەروگليفتەر سىزىقتارىن تۇبەگەيلى سۇرىپتاۋ رەتى - جۋين سۇرىپتاۋ رەتى - 12 ساعاتتىق جۇيە (0–11) - 12 ساعاتتىق جۇيە (0–12) - 24 ساعاتتىق جۇيە (0–23) - 24 ساعاتتىق جۇيە (0–24) - جولدى تاسىمالداۋدىڭ ەركىن ءستيلى - جولدى تاسىمالداۋدىڭ قالىپتى ءستيلى - جولدى تاسىمالداۋدىڭ قاتاڭ ءستيلى - مەترلىك جۇيە - بريتانيالىق ولشەمدەر جۇيەسى - امەريكالىق ولشەمدەر جۇيەسى - احوم تسيفرلارى - ءۇندى-اراب ساندارى - ءۇندى-اراب ساندارىنىڭ كەڭەيتىلگەن جۇيەسى - ارميان ساندارى - كىشى ارىپپەن بەرىلگەن ارميان ساندارى - بالي ساندارى - بەنگال ساندارى - براحمي ساندارى - چاكما ساندارى - چام ساندارى - كيريل ساندارى - دەۆاناگاري ساندارى - دەۆيس اكۋرۋ ساندارى - ەفيوپيا ساندارى - تولىق ەندى ساندار - گاراي ساندارى - گرۋزين ساندارى - گۋنجالا گوندي ساندارى - ماساراما گوندي ساندارى - گرەك ساندارى - كىشى ارىپپەن بەرىلگەن گرەك ساندارى - گۋجاراتي ساندارى - گۋرۋڭ حەما ساندارى - گۋرمۋكحي ساندارى - قىتاي وندىق ساندارى - جەڭىلدەتىلگەن قىتاي ساندارى - قارجى سالاسىنداعى جەڭىلدەتىلگەن قىتاي ساندارى - ءداستۇرلى قىتاي ساندارى - قارجى سالاسىنداعى ءداستۇرلى قىتاي ساندارى - يۆريت ساندارى - پاحاۋ ساندارى - نياكەڭ پۋاچۋە حموڭ ساندارى - ياۆا ساندارى - جاپون ساندارى - قارجى سالاسىنداعى جاپون ساندارى - كاياح لي ساندارى - كاۋي ساندارى - كحمەر ساندارى - كاننادا ساندارى - كيرات راي ساندارى - تاي تحام حورا ساندارى - تاي تحام تحام ساندارى - لاوس ساندارى - باتىس ساندارى - لەپچا ساندارى - ليمبۋ ساندارى - ماتەماتيكالىق قالىڭ قارىپتى ساندار - ماتەماتيكالىق قوس سىزىقتى ساندار - ەنى بەكىتىلگەن ماتەماتيكالىق ساندار - ماتەماتيكالىق قالىڭ قارىپتى سانسەريف ساندار - ماتەماتيكالىق سانسەريف ساندار - مالايالام ساندارى - مودي ساندارى - موڭعول ساندارى - مرو ساندارى - مەيتەي-مايەك ساندارى - ميانمار ساندارى - ميانمار شىعىس پحو كارەن ساندارى - ميانمار پاو ساندارى - ميانمار شان ساندارى - ميانمار تاي لايڭ ساندارى - ناگ مۋنداري ساندارى - نكو ساندارى - ول-چيكي ساندارى - ول-ونال ساندارى - وريا ساندارى - يسمانيا ساندارى - سىزىلعان ساندار - حانيفي ساندارى - ريم ساندارى - كىشى ارىپپەن بەرىلگەن ريم ساندارى - ساۋراشترا ساندارى - شارادا ساندارى - كحۋدابادي ساندارى - سينگالا ليت ساندارى - سورا سومپەڭ ساندارى - سۋندا ساندارى - سۋنۋار ساندارى - تاكري ساندارى - جاڭا لۋ جازۋىنىڭ ساندارى - ءداستۇرلى تاميل ساندارى - تاميل ساندارى - تەلۋگۋ ساندارى - تاي ساندارى - تيبەر ساندارى - تيرحۋتا ساندارى - تاڭسا ساندارى - ۆاي ساندارى - ۋاراڭ سيتي ساندارى - ۋانچو ساندارى + بۋددا كۇنتىزبەسى + بۋددا + قىتاي كۇنتىزبەسى + قىتاي + كوپت كۇنتىزبەسى + كوپت + دانگي كۇنتىزبەسى + دانگي + ەفيوپيا كۇنتىزبەسى + ەفيوپيانىڭ + ەفيوپيانىڭ امەتە-الەم كۇنتىزبەسى + ەفيوپيانىڭ امەتە-الەم + گرەگورياندىق كۇنتىزبە + گرەگوريان + كونە ەۆرەي كۇنتىزبەسى + ەۆرەي + ءۇندىستاننىڭ ۇلتتىق كۇنتىزبەسى + ءۇندىستاننىڭ ۇلتتىق + يسلام كۇنتىزبەسى + يسلام + يسلام كۇنتىزبەسى (كەستەلىك، ازاماتتىق ءداۋىر) + يسلام (كەستەلىك، ازاماتتىق ءداۋىر) + يسلام كۇنتىزبەسى (ساۋد ارابياسى، جاڭا اي) + يسلام كۇنتىزبەسى (كەستەلىك، استرونوميالىق ءداۋىر) + يسلام (كەستەلىك، استرونوميالىق ءداۋىر) + يسلام كۇنتىزبەسى (ۋمم ءال-قۇرا) + يسلام (ۋمم ءال-قۇرا) + ISO-8601 كۇنتىزبەسى + جاپون كۇنتىزبەسى + جاپون + پارسى كۇنتىزبەسى + پارسى + مينگۋو كۇنتىزبەسى + مينگۋو + ەسەپتىك اقشا ءپىشىمى + ەسەپتىك + ستاندارتتى اقشا ءپىشىمى + ستاندارت + سايكەستىككە ارنالعان الدىڭعى سۇرىپتاۋ رەتى + سايكەستىك + سوزدىك بويىنشا سۇرىپتاۋ رەتى + سوزدىك + ادەپكى ۋنيكود سۇرىپتاۋ رەتى + ادەپكى ۋنيكود + ەموجي سۇرىپتاۋ رەتى + ەۋروپالىق رەتتەۋ ەرەجەلەرى + تەلەفون كىتاپشاسىنىڭ سۇرىپتاۋ رەتى + تەلەفون كىتاپشاسى + فونەتيكالىق + پينين سۇرىپتاۋ رەتى + پينين + جالپى ماقساتتاعى ىزدەۋ + ىزدەۋ + كورەي ءتىلىنىڭ باستاپقى داۋىسسىزى بويىنشا ىزدەۋ + ستاندارتتى سۇرىپتاۋ رەتى + ستاندارت + يەروگليفتەر سىزىقتارىن سۇرىپتاۋ رەتى + يەروگليفتەر سىزىقتارى + ءداستۇرلى سۇرىپتاۋ رەتى + ءداستۇرلى + يەروگليفتەر سىزىقتارىن تۇبەگەيلى سۇرىپتاۋ رەتى + يەروگليفتەر سىزىقتارى + جۋين سۇرىپتاۋ رەتى + جۋين + ادەپكى + ەمودجي + ءماتىن + 12 ساعاتتىق جۇيە (0–11) + 12 (0–11) + 12 ساعاتتىق جۇيە (0–12) + 12 (1–12) + 24 ساعاتتىق جۇيە (0–23) + 24 (0–23) + 24 ساعاتتىق جۇيە (0–24) + 24 (1–24) + جولدى تاسىمالداۋدىڭ ەركىن ءستيلى + ەركىن + جولدى تاسىمالداۋدىڭ قالىپتى ءستيلى + قالىپتى + جولدى تاسىمالداۋدىڭ قاتاڭ ءستيلى + قاتاڭ + ءبارىن تاسىمالداۋ + ءبارىن ساقتاۋ + قالىپتى + فرازالاردا ساقتاۋ + مەترلىك جۇيە + مەترلىك + بريتانيالىق ولشەمدەر جۇيەسى + بريتانيالىق + امەريكالىق ولشەمدەر جۇيەسى + امەريكالىق + احوم تسيفرلارى + ءۇندى-اراب ساندارى + ءۇندى-اراب ساندارىنىڭ كەڭەيتىلگەن جۇيەسى + ارميان ساندارى + كىشى ارىپپەن بەرىلگەن ارميان ساندارى + بالي ساندارى + بەنگال ساندارى + براحمي ساندارى + چاكما ساندارى + چام ساندارى + كيريل ساندارى + دەۆاناگاري ساندارى + دەۆيس اكۋرۋ ساندارى + ەفيوپيا ساندارى + تولىق ەندى ساندار + گاراي ساندارى + گرۋزين ساندارى + گۋنجالا گوندي ساندارى + ماساراما گوندي ساندارى + گرەك ساندارى + كىشى ارىپپەن بەرىلگەن گرەك ساندارى + گۋجاراتي ساندارى + گۋرۋڭ حەما ساندارى + گۋرمۋكحي ساندارى + قىتاي وندىق ساندارى + جەڭىلدەتىلگەن قىتاي ساندارى + قارجى سالاسىنداعى جەڭىلدەتىلگەن قىتاي ساندارى + ءداستۇرلى قىتاي ساندارى + قارجى سالاسىنداعى ءداستۇرلى قىتاي ساندارى + يۆريت ساندارى + پاحاۋ ساندارى + نياكەڭ پۋاچۋە حموڭ ساندارى + ياۆا ساندارى + جاپون ساندارى + قارجى سالاسىنداعى جاپون ساندارى + كاياح لي ساندارى + كاۋي ساندارى + كحمەر ساندارى + كاننادا ساندارى + كيرات راي ساندارى + تاي تحام حورا ساندارى + تاي تحام تحام ساندارى + لاوس ساندارى + باتىس ساندارى + لەپچا ساندارى + ليمبۋ ساندارى + ماتەماتيكالىق قالىڭ قارىپتى ساندار + ماتەماتيكالىق قوس سىزىقتى ساندار + ەنى بەكىتىلگەن ماتەماتيكالىق ساندار + ماتەماتيكالىق قالىڭ قارىپتى سانسەريف ساندار + ماتەماتيكالىق سانسەريف ساندار + مالايالام ساندارى + مودي ساندارى + موڭعول ساندارى + مرو ساندارى + مەيتەي-مايەك ساندارى + ميانمار ساندارى + ميانمار شىعىس پحو كارەن ساندارى + ميانمار پاو ساندارى + ميانمار شان ساندارى + ميانمار تاي لايڭ ساندارى + ناگ مۋنداري ساندارى + نكو ساندارى + ول-چيكي ساندارى + ول-ونال ساندارى + وريا ساندارى + يسمانيا ساندارى + سىزىلعان ساندار + حانيفي ساندارى + ريم ساندارى + كىشى ارىپپەن بەرىلگەن ريم ساندارى + ساۋراشترا ساندارى + شارادا ساندارى + كحۋدابادي ساندارى + سينگالا ليت ساندارى + سورا سومپەڭ ساندارى + سۋندا ساندارى + سۋنۋار ساندارى + تاكري ساندارى + جاڭا لۋ جازۋىنىڭ ساندارى + ءداستۇرلى تاميل ساندارى + تاميل ساندارى + تەلۋگۋ ساندارى + تاي ساندارى + تيبەر ساندارى + تيرحۋتا ساندارى + تاڭسا ساندارى + ۆاي ساندارى + ۋاراڭ سيتي ساندارى + ۋانچو ساندارى + ءوشىرۋ + قوسۋ - مەترلىك - اعىلشىن - امەريكالىق + مەترلىك + اعىلشىن + امەريكالىق - ءتىل: {0} - جازۋ: {0} - ايماق: {0} + ءتىل: {0} + جازۋ: {0} + ايماق: {0} @@ -1152,14 +1205,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic [ء ا ە ب پ ت ج چ ح د ر ز س ش ع ف ق ك گ ڭ ل م ن ھ و ۇ ۆ ۋ ى ي] [ء ا ە ب پ ت ج چ ح د ر ز س ش ع ف ق ك گ ڭ ل م ن ھ و ۇ ۆ ۋ ى ي] + [\u200E ٫ ٬ ٪ ؉ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹] [\- ‐‑ – — ، ؛ \: ! ؟ . … '‘’ "“” « » ( ) \[ \] \{ \} § @ * / \& #] ؟ - » - « - - + » + « + + @@ -1167,254 +1221,371 @@ CLDR data files are interpreted according to the LDML specification (http://unic - قاڭ - اقپ - ناۋ - ساۋ - مام - ماۋ - شىل - تام - قىر - قاز - قار - جەل + قاڭ + اقپ + ناۋ + ساۋ + مام + ماۋ + شىل + تام + قىر + قاز + قار + جەل - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان - - - - - قاڭ - اقپ - ناۋ - ساۋ - مام - ماۋ - شىل - تام - قىر - قاز - قار - جەل - - - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان + قاڭتار + اقپان + ناۋرىز + ءساۋىر + مامىر + ماۋسىم + شىلدە + تامىز + قىركۇيەك + قازان + قاراشا + جەلتوقسان + + + + + كوكتەم باسى + جاڭبىر سۋى + جاندىكتەر ويانۋى + كوكتەمگى توقىراۋ + اشىق اسپان + استىق جاڭبىر + جاز باسى + از تولۋ + استىق ەگۋ + جازعى توقىراۋ + وتكىر ىستىق + شىلىڭگىر ىستىق + كۇزدىڭ باسى + قوڭىر سالقىن + اق شىق + كۇزگى توقىراۋ + سۋىق شىق + قىراۋ ءتۇسۋ + قىس باسى + از قار + قالىڭ قار + قىسقى توقىراۋ + از سۋىق + قاتتى سۋىق + + + كوكتەم باسى + جاڭبىر سۋى + جاندىكتەر ويانۋى + كوكتەمگى توقىراۋ + اشىق اسپان + استىق جاڭبىر + جاز باسى + از تولۋ + استىق ەگۋ + جازعى توقىراۋ + وتكىر ىستىق + شىلىڭگىر ىستىق + كۇزدىڭ باسى + قوڭىر سالقىن + اق شىق + كۇزگى توقىراۋ + سۋىق شىق + قىراۋ ءتۇسۋ + قىس باسى + از قار + قالىڭ قار + قىسقى توقىراۋ + از سۋىق + قاتتى سۋىق + + + كوكتەم باسى + جاڭبىر سۋى + جاندىكتەر ويانۋى + كوكتەمگى توقىراۋ + اشىق اسپان + استىق جاڭبىر + جاز باسى + از تولۋ + استىق ەگۋ + جازعى توقىراۋ + وتكىر ىستىق + شىلىڭگىر ىستىق + كۇزدىڭ باسى + قوڭىر سالقىن + اق شىق + كۇزگى توقىراۋ + سۋىق شىق + قىراۋ ءتۇسۋ + قىس باسى + از قار + قالىڭ قار + قىسقى توقىراۋ + از سۋىق + قاتتى سۋىق + + + + + + + تىشقان + سيىر + بارىس + قويان + ۇلۋ + جىلان + جىلقى + قوي + مەشىن + تاۋىق + يت + دوڭىز + + + تىشقان + سيىر + بارىس + قويان + ۇلۋ + جىلان + جىلقى + قوي + مەشىن + تاۋىق + يت + دوڭىز + + + تىشقان + سيىر + بارىس + قويان + ۇلۋ + جىلان + جىلقى + قوي + مەشىن + تاۋىق + يت + دوڭىز + + + + - EEEE، MMMM d، r(U) + EEEE، MMMM d، r(U) - MMMM d، r(U) + MMMM d، r(U) - MMM d، r + MMM d، r - M/d/yy - - - - - - - - - EEEE، MMMM d، y G - - - - - MMMM d، y G - - - - - MMM d، y G - - - - - M/d/y GGGGG + M/d/yy - {1} {0} + {1}، {0} - {1} {0} + {1}، {0} - {1}، {0} - - - {1}، {0} + {1}، {0} - {1}، {0} + {1}، {0} - - {1}، {0} + + + + + + + + EEEE، MMMM d، y G + + + + + MMMM d، y G + + + + + MMM d، y G + + + + + M/d/y GGGGG + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1}، {0} + + + + + {1}، {0} - d E - y G - M/d/y GGGGG - MMM y G - MMM d، y G - E، MMM d، y G - M/d - E، M/d - E، MMM d - y G - y G - M/y GGGGG - M/d/y GGGGG - E، M/d/y GGGGG - MMM y G - MMM d، y G - E، MMM d، y G - MMMM y G - QQQ y G - QQQQ y G + d E + y G + M/d/y GGGGG + G y-MM-dd، E + MMM y G + MMM d، y G + E، MMM d، y G + M/d + E، M/d + E، MMM d + y G + y G + M/y GGGGG + M/d/y GGGGG + E، M/d/y GGGGG + MMM y G + MMM d، y G + E، MMM d، y G + MMMM y G + QQQ y G + QQQQ y G - y G – y G - y – y G + y G – y G + y – y G - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y GGGGG – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y GGGGG – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + M/d/y – M/d/y GGGGG + M/d/y GGGGG – M/d/y GGGGG + M/d/y – M/d/y GGGGG + M/d/y – M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG - E، M/d/y GGGGG – E، M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG + E، M/d/y GGGGG – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G - MMM d – d، y G - MMM d، y G – MMM d، y G - MMM d – MMM d، y G - MMM d، y – MMM d، y G + MMM d – d، y G + MMM d، y G – MMM d، y G + MMM d – MMM d، y G + MMM d، y – MMM d، y G - E، MMM d – E، MMM d، y G - E، MMM d، y G – E، MMM d، y G - E، MMM d – E، MMM d، y G - E، MMM d، y – E، MMM d، y G + E، MMM d – E، MMM d، y G + E، MMM d، y G – E، MMM d، y G + E، MMM d – E، MMM d، y G + E، MMM d، y – E، MMM d، y G - M – M + M – M - M/d – M/d - M/d – M/d + M/d – M/d + M/d – M/d - E، M/d – E، M/d - E، M/d – E، M/d + E، M/d – E، M/d + E، M/d – E، M/d - MMM – MMM + MMM – MMM - MMM d – d + MMM d – d - E، MMM d – E، MMM d - E، MMM d – E، MMM d + E، MMM d – E، MMM d + E، MMM d – E، MMM d - y – y G + y – y G - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + M/d/y – M/d/y GGGGG + M/d/y – M/d/y GGGGG + M/d/y – M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG - E، M/d/y – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG + E، M/d/y – E، M/d/y GGGGG - MMM – MMM y G - MMM y – MMM y G + MMM – MMM y G + MMM y – MMM y G - MMM d – d، y G - MMM d – MMM d، y G - MMM d، y – MMM d، y G + MMM d – d، y G + MMM d – MMM d، y G + MMM d، y – MMM d، y G - E، MMM d – E، MMM d، y G - E، MMM d – E، MMM d، y G - E، MMM d، y – E، MMM d، y G + E، MMM d – E، MMM d، y G + E، MMM d – E، MMM d، y G + E، MMM d، y – E، MMM d، y G - MMMM – MMMM y G - MMMM y – MMMM y G + MMMM – MMMM y G + MMMM y – MMMM y G @@ -1422,428 +1593,312 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان - - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان - - - - - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان - - - قاڭتار - اقپان - ناۋرىز - ءساۋىر - مامىر - ماۋسىم - شىلدە - تامىز - قىركۇيەك - قازان - قاراشا - جەلتوقسان + قاڭتار + اقپان + ناۋرىز + ءساۋىر + مامىر + ماۋسىم + شىلدە + تامىز + قىركۇيەك + قازان + قاراشا + جەلتوقسان - جەك - دۇي - سەي - سار - بەي - جۇم - سەن - - - ج - د - س - س - ب - ج - س + جەك + دۇي + سەي + سار + بەي + جۇم + سەن - جە - دۇ - سە - سا - بە - جۇ - سن + جە + دۇ + سە + سا + بە + جۇ + سن - جەكسەنبى - دۇيسەنبى - سەيسەنبى - سارسەنبى - بەيسەنبى - جۇما - سەنبى + جەكسەنبى + دۇيسەنبى + سەيسەنبى + سارسەنبى + بەيسەنبى + جۇما + سەنبى - - جەك - دۇي - سەي - سار - بەي - جۇم - سەن - - ج - د - س - س - ب - ج - س - - - جە - دۇ - سە - سا - بە - جۇ - سن - - - جەكسەنبى - دۇيسەنبى - سەيسەنبى - سارسەنبى - بەيسەنبى - جۇما - سەنبى + ج + د + س + س + ب + ج + س - 1-توقسان - 2-توقسان - 3-توقسان - 4-توقسان + 1- توقسان + 2- توقسان + 3- توقسان + 4- توقسان - ءبىرىنشى توقسان - ەكىنشى توقسان - ءۇشىنشى توقسان - ءتورتىنشى توقسان + ءبىرىنشى توقسان + ەكىنشى توقسان + ءۇشىنشى توقسان + ءتورتىنشى توقسان - 1-توقسان - 2-توقسان - 3-توقسان - 4-توقسان - - - ءبىرىنشى توقسان - ەكىنشى توقسان - ءۇشىنشى توقسان - ءتورتىنشى توقسان + 1- توقسان + 2- توقسان + 3- توقسان + 4- توقسان - ءتۇن جارىمى - ت د - تۇسكى - ت ك - تاڭعى - تۇستەن كەيىنگى - كەش - تۇنگى + ءتۇن جارىمى + ت د + تۇسكى + ت ك + تاڭعى + تۇستەن كەيىنگى + كەش + تۇنگى - تۇنگى - ت د - تۇسكى - ت ك - تاڭعى - تۇستەن كەيىنگى - كەشكى - تۇنگى + تۇنگى + تۇسكى + تاڭعى + تۇستەن كەيىنگى + كەش + تۇنگى - ءتۇن جارىمى - ت د - تۇسكى - ت ك - تاڭعى - تۇستەن كەيىنگى - كەشى - تۇنگى + ءتۇن جارىمى + ت د + تۇسكى + ت ك + تاڭعى + تۇستەن كەيىنگى + كەشى + تۇنگى - ءتۇن جارىمى - ت د - ءتالتۇس - ت ك - تاڭ - تۇستەن كەيىن - كەش - ءتۇن + تال ءتۇس + تاڭ + تۇستەن كەيىن + كەش + ءتۇن - ءتۇن جارىمى - ت د - تال ءتۇس - ت ك - تاڭ - تۇستەن كەيىن - كەش - ءتۇن + تال ءتۇس - ءتۇن جارىمى - ت د - تال ءتۇس - ت ك - تاڭ - تۇستەن كەيىن - كەش - ءتۇن + ت د + تال ءتۇس + ت ك - ءبىزدىڭ زامانىمىزعا دەيىن - ءبىزدىڭ زامانىمىزعا دەيىن - ءبىزدىڭ زامانىمىز - ءبىزدىڭ زامانىمىز + ءبىزدىڭ زامانىمىزعا دەيىن + ءبىزدىڭ زامانىمىزعا دەيىن + ءبىزدىڭ زامانىمىز + ءبىزدىڭ زامانىمىز - ب ز د - ب ز + ب ز د + ب ز - - ب ز د - ب ز د - ب ز - ب ز - - y d-MMMM، EEEE + y، d- MMMM، EEEE - d-MMMM، y + y، d- MMMM - d-MMM، y + y، d- MMM - dd-MM-y + dd-MM-y - HH:mm:ss zzzz + HH:mm:ss zzzz - HH:mm:ss z + HH:mm:ss z - HH:mm:ss + HH:mm:ss - HH:mm + HH:mm - {1}، {0} + {1}، {0} - {1}, {0} + {1}, {0} - {1}، {0} + {1}، {0} - {1}, {0} + {1}, {0} - {1}, {0} - - - {1}, {0} + {1}, {0} - {1}, {0} - - - {1}, {0} + {1}, {0} - d E - y G - G d-M-y - y MMM G - y d-MMM G - y d-MMM، E G - d-M - d-M، E - d-MMM - d-MMM، E - d-MMMM - اپتاسى-W ايىنىڭ MMMM - اپتاسى-W ايىنىڭ MMMM - M-y - y-d-M - y-d-M، E - y d-MMM - y d-MMM، E - اپتاسى-w جىلدىڭ Y - اپتاسى-w جىلدىڭ Y + d E + G d-M-y + G y-MM-dd، E + G y، d- MMM + G y، d- MMM، E + d-M + d-M، E + d- MMM + d- MMM، E + d- MMMM + MMMM ايىنىڭ W اپتاسى + MMMM ايىنىڭ W اپتاسى + M-y + y-d-M + y-d-M، E + y d- MMM + y d- MMM، E + Y جىلدىڭ w اپتاسى + Y جىلدىڭ w اپتاسى - G y-M – G y-M - G y-M – y-M - G y-M – y-M + G y-M – G y-M + G y-M – y-M + G y-M – y-M - G y-M-d – y-M-d - G y-M-d – G y-M-d - G y-M-d – y-M-d - G y-M-d – y-M-d + G y-M-d – y-M-d + G y-M-d – G y-M-d + G y-M-d – y-M-d + G y-M-d – y-M-d - G y-M-d، E – y-M-d، E - G y-M-d، E – G y-M-d، E - G y-M-d، E – y-M-d، E - G y-M-d، E – y-M-d، E + G y-M-d، E – y-M-d، E + G y-M-d، E – G y-M-d، E + G y-M-d، E – y-M-d، E + G y-M-d، E – y-M-d، E - G y، MMM d–d - G y، MMM d – G y، MMM d - G y، MMM d – MMM d - G y، MMM d – y، MMM d + G y، MMM d–d + G y، MMM d – G y، MMM d + G y، MMM d – MMM d + G y، MMM d – y، MMM d - G y، d MMM، E – d MMM، E - G y، d MMM، E – G y، d MMM، E - G y، d MMM، E – d MMM، E - G y، d MMM، E – y d MMM، E + G y، d MMM، E – d MMM، E + G y، d MMM، E – G y، d MMM، E + G y، d MMM، E – d MMM، E + G y، d MMM، E – y d MMM، E - M – M + M – M - M-d – M-d - M-d – M-d + M-d – M-d + M-d – M-d - M-d، E – M-d، E - M-d، E – M-d، E + M-d، E – M-d، E + M-d، E – M-d، E - MMM–MMM + MMM–MMM - MMM d، E – MMM d، E - MMM d، E – MMM d، E + MMM d، E – MMM d، E + MMM d، E – MMM d، E - y-M – y-M - y-M – y-M + y-M – y-M + y-M – y-M - y-M-d – y-M-d - y-M-d – y-M-d - y-M-d – y-M-d + y-M-d – y-M-d + y-M-d – y-M-d + y-M-d – y-M-d - y-M-d، E – y-M-d، E - y-M-d، E – y-M-d، E - y-M-d، E – y-M-d، E + y-M-d، E – y-M-d، E + y-M-d، E – y-M-d، E + y-M-d، E – y-M-d، E - y، MMM d–d - y، MMM d – MMM d - y، MMM d – y، MMM d + y، MMM d–d + y، MMM d – MMM d + y، MMM d – y، MMM d - y MMM d، E – MMM d، E - y MMM d، E – MMM d، E - y MMM d، E – y MMM d، E + y MMM d، E – MMM d، E + y MMM d، E – MMM d، E + y MMM d، E – y MMM d، E @@ -1851,7060 +1906,4936 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ءداۋىر - - - ءداۋىر - - - ءداۋىر + ءداۋىر - جىل - بىلتىرعى جىل - بيىلعى جىل - كەلەسى جىل + جىل + بىلتىرعى جىل + بيىلعى جىل + كەلەسى جىل - {0} جىلدان كەيىن - {0} جىلدان كەيىن + {0} جىلدان كەيىن + {0} جىلدان كەيىن - {0} جىل بۇرىن - {0} جىل بۇرىن - - - - جىل - بىلتىرعى جىل - بيىلعى جىل - كەلەسى جىل - - {0} جىلدان كەيىن - {0} جىلدان كەيىن - - - {0} جىل بۇرىن - {0} جىل بۇرىن - - - - جىل - بىلتىرعى جىل - بيىلعى جىل - كەلەسى جىل - - {0} جىلدان كەيىن - {0} جىلدان كەيىن - - - {0} جىل بۇرىن - {0} جىل بۇرىن + {0} جىل بۇرىن + {0} جىل بۇرىن - شيرەك - وتكەن توقسان - وسى توقسان - كەلەسى توقسان + شيرەك + وتكەن توقسان + وسى توقسان + كەلەسى توقسان - {0} توقساننان كەيىن - {0} توقساننان كەيىن + {0} توقساننان كەيىن + {0} توقساننان كەيىن - {0} توقسان بۇرىن - {0} توقسان بۇرىن - - - - شيرەك - وتكەن توقسان - وسى توقسان - كەلەسى توقسان - - {0} توقساننان كەيىن - {0} توقساننان كەيىن - - - {0} توقسان بۇرىن - {0} توقسان بۇرىن - - - - شيرەك - وتكەن توقسان - وسى توقسان - كەلەسى توقسان - - {0} توقساننان كەيىن - {0} توقساننان كەيىن - - - {0} توقسان بۇرىن - {0} توقسان بۇرىن + {0} توقسان بۇرىن + {0} توقسان بۇرىن - اي - وتكەن اي - وسى اي - كەلەسى اي + اي + وتكەن اي + وسى اي + كەلەسى اي - {0} ايدان كەيىن - {0} ايدان كەيىن + {0} ايدان كەيىن + {0} ايدان كەيىن - {0} اي بۇرىن - {0} اي بۇرىن - - - - اي - وتكەن اي - وسى اي - كەلەسى اي - - {0} ايدان كەيىن - {0} ايدان كەيىن - - - {0} اي بۇرىن - {0} اي بۇرىن - - - - اي - وتكەن اي - وسى اي - كەلەسى اي - - {0} ايدان كەيىن - {0} ايدان كەيىن - - - {0} اي بۇرىن - {0} اي بۇرىن + {0} اي بۇرىن + {0} اي بۇرىن - اپتا - وتكەن اپتا - وسى اپتا - كەلەسى اپتا + اپتا + وتكەن اپتا + وسى اپتا + كەلەسى اپتا - {0} اپتادان كەيىن - {0} اپتادان كەيىن + {0} اپتادان كەيىن + {0} اپتادان كەيىن - {0} اپتا بۇرىن - {0} اپتا بۇرىن + {0} اپتا بۇرىن + {0} اپتا بۇرىن - {0} اپتاسى - - - اپتا - وتكەن اپتا - وسى اپتا - كەلەسى اپتا - - {0} اپتادان كەيىن - {0} اپتادان كەيىن - - - {0} اپتا بۇرىن - {0} اپتا بۇرىن - - {0} اپتاسى - - - اپتا - وتكەن اپتا - وسى اپتا - كەلەسى اپتا - - {0} اپتادان كەيىن - {0} اپتادان كەيىن - - - {0} اپتا بۇرىن - {0} اپتا بۇرىن - - {0} اپتاسى + {0} اپتاسى - ايداعى اپتا - - - ايداعى اپتا - - - ايداعى اپتا + ايداعى اپتا - كۇن - كەشە - بۇگىن - ەرتەڭ + كۇن + كەشە + بۇگىن + ەرتەڭ - {0} كۇننەن كەيىن - {0} كۇننەن كەيىن + {0} كۇننەن كەيىن + {0} كۇننەن كەيىن - {0} كۇن بۇرىن - {0} كۇن بۇرىن - - - - كۇن - كەشە - بۇگىن - ەرتەڭ - - {0} كۇننەن كەيىن - {0} كۇننەن كەيىن - - - {0} كۇن بۇرىن - {0} كۇن بۇرىن - - - - كۇن - كەشە - بۇگىن - ەرتەڭ - - {0} كۇننەن كەيىن - {0} كۇننەن كەيىن - - - {0} كۇن بۇرىن - {0} كۇن بۇرىن + {0} كۇن بۇرىن + {0} كۇن بۇرىن - جىلداعى كۇن - - - جىلداعى كۇن - - - جىلداعى كۇن + جىلداعى كۇن - اپتا كۇنى - - - اپتا كۇنى - - - اپتا كۇنى + اپتا كۇنى - ايداعى اپتا كۇنى - - - ايداعى اپتا كۇنى - - - ايداعى اپتا كۇنى + ايداعى اپتا كۇنى - وتكەن جەكسەنبى - وسى جەكسەنبى - كەلەسى جەكسەنبى + وتكەن جەكسەنبى + وسى جەكسەنبى + كەلەسى جەكسەنبى - {0} جەكسەنبىدەن كەيىن - {0} جەكسەنبىدەن كەيىن + {0} جەكسەنبىدەن كەيىن + {0} جەكسەنبىدەن كەيىن - {0} جەكسەنبى بۇرىن - {0} جەكسەنبى بۇرىن - - - - وتكەن جەكسەنبى - وسى جەكسەنبى - كەلەسى جەكسەنبى - - {0} جەكسەنبىدەن كەيىن - {0} جەكسەنبىدەن كەيىن - - - {0} جەكسەنبى بۇرىن - {0} جەكسەنبى بۇرىن - - - - وتكەن جەكسەنبى - وسى جەكسەنبى - كەلەسى جەكسەنبى - - {0} جەكسەنبىدەن كەيىن - {0} جەكسەنبىدەن كەيىن - - - {0} جەكسەنبى بۇرىن - {0} جەكسەنبى بۇرىن + {0} جەكسەنبى بۇرىن + {0} جەكسەنبى بۇرىن - وتكەن دۇيسەنبى - وسى دۇيسەنبى - كەلەسى دۇيسەنبى + وتكەن دۇيسەنبى + وسى دۇيسەنبى + كەلەسى دۇيسەنبى - {0} دۇيسەنبىدەن كەيىن - {0} دۇيسەنبىدەن كەيىن + {0} دۇيسەنبىدەن كەيىن + {0} دۇيسەنبىدەن كەيىن - {0} دۇيسەنبى بۇرىن - {0} دۇيسەنبى بۇرىن - - - - وتكەن دۇيسەنبى - وسى دۇيسەنبى - كەلەسى دۇيسەنبى - - {0} دۇيسەنبىدەن كەيىن - {0} دۇيسەنبىدەن كەيىن - - - {0} دۇيسەنبى بۇرىن - {0} دۇيسەنبى بۇرىن - - - - وتكەن دۇيسەنبى - وسى دۇيسەنبى - كەلەسى دۇيسەنبى - - {0} دۇيسەنبىدەن كەيىن - {0} دۇيسەنبىدەن كەيىن - - - {0} دۇيسەنبى بۇرىن - {0} دۇيسەنبى بۇرىن + {0} دۇيسەنبى بۇرىن + {0} دۇيسەنبى بۇرىن - وتكەن سەيسەنبى - وسى سەيسەنبى - كەلەسى سەيسەنبى + وتكەن سەيسەنبى + وسى سەيسەنبى + كەلەسى سەيسەنبى - {0} سەيسەنبىدەن كەيىن - {0} سەيسەنبىدەن كەيىن + {0} سەيسەنبىدەن كەيىن + {0} سەيسەنبىدەن كەيىن - {0} سەيسەنبى بۇرىن - {0} سەيسەنبى بۇرىن - - - - وتكەن سەيسەنبى - وسى سەيسەنبى - كەلەسى سەيسەنبى - - {0} سەيسەنبىدەن كەيىن - {0} سەيسەنبىدەن كەيىن - - - {0} سەيسەنبى بۇرىن - {0} سەيسەنبى بۇرىن - - - - وتكەن سەيسەنبى - وسى سەيسەنبى - كەلەسى سەيسەنبى - - {0} سەيسەنبىدەن كەيىن - {0} سەيسەنبىدەن كەيىن - - - {0} سەيسەنبى بۇرىن - {0} سەيسەنبى بۇرىن + {0} سەيسەنبى بۇرىن + {0} سەيسەنبى بۇرىن - وتكەن سارساەنبى - وسى سارسەنبى - كەلەسى سارسەنبى + وتكەن سارساەنبى + وسى سارسەنبى + كەلەسى سارسەنبى - {0} سارسەنبىدەن كەيىن - {0} سارسەنبىدەن كەيىن + {0} سارسەنبىدەن كەيىن + {0} سارسەنبىدەن كەيىن - {0} سارسەنبى بۇرىن - {0} سارسەنبى بۇرىن - - - - وتكەن سارساەنبى - وسى سارسەنبى - كەلەسى سارسەنبى - - {0} سارسەنبىدەن كەيىن - {0} سارسەنبىدەن كەيىن - - - {0} سارسەنبى بۇرىن - {0} سارسەنبى بۇرىن - - - - وتكەن سارساەنبى - وسى سارسەنبى - كەلەسى سارسەنبى - - {0} سارسەنبىدەن كەيىن - {0} سارسەنبىدەن كەيىن - - - {0} سارسەنبى بۇرىن - {0} سارسەنبى بۇرىن + {0} سارسەنبى بۇرىن + {0} سارسەنبى بۇرىن - وتكەن بەيسەنبى - وسى بەيسەنبى - كەلەسى بەيسەنبى + وتكەن بەيسەنبى + وسى بەيسەنبى + كەلەسى بەيسەنبى - {0} بەيسەنبىدەن كەيىن - {0} بەيسەنبىدەن كەيىن + {0} بەيسەنبىدەن كەيىن + {0} بەيسەنبىدەن كەيىن - {0} بەيسەنبى بۇرىن - {0} بەيسەنبى بۇرىن - - - - وتكەن بەيسەنبى - وسى بەيسەنبى - كەلەسى بەيسەنبى - - {0} بەيسەنبىدەن كەيىن - {0} بەيسەنبىدەن كەيىن - - - {0} بەيسەنبى بۇرىن - {0} بەيسەنبى بۇرىن - - - - وتكەن بەيسەنبى - وسى بەيسەنبى - كەلەسى بەيسەنبى - - {0} بەيسەنبىدەن كەيىن - {0} بەيسەنبىدەن كەيىن - - - {0} بەيسەنبى بۇرىن - {0} بەيسەنبى بۇرىن + {0} بەيسەنبى بۇرىن + {0} بەيسەنبى بۇرىن - وتكەن جۇما - وسى جۇما - كەلەسى جۇما + وتكەن جۇما + وسى جۇما + كەلەسى جۇما - {0} جۇمادان كەيىن - {0} جۇمادان كەيىن + {0} جۇمادان كەيىن + {0} جۇمادان كەيىن - {0} جۇما بۇرىن - {0} جۇما بۇرىن - - - - وتكەن جۇما - وسى جۇما - كەلەسى جۇما - - {0} جۇمادان كەيىن - {0} جۇمادان كەيىن - - - {0} جۇما بۇرىن - {0} جۇما بۇرىن - - - - وتكەن جۇما - وسى جۇما - كەلەسى جۇما - - {0} جۇمادان كەيىن - {0} جۇمادان كەيىن - - - {0} جۇما بۇرىن - {0} جۇما بۇرىن + {0} جۇما بۇرىن + {0} جۇما بۇرىن - وتكەن سەنبى - وسى سەنبى - كەلەسى سەنبى + وتكەن سەنبى + وسى سەنبى + كەلەسى سەنبى - {0} سەنبىدەن كەيىن - {0} سەنبىدەن كەيىن + {0} سەنبىدەن كەيىن + {0} سەنبىدەن كەيىن - {0} سەنبى بۇرىن - {0} سەنبى بۇرىن + {0} سەنبى بۇرىن + {0} سەنبى بۇرىن - - وتكەن سەنبى - وسى سەنبى - كەلەسى سەنبى - - {0} سەنبىدەن كەيىن - {0} سەنبىدەن كەيىن - - - {0} سەنبى بۇرىن - {0} سەنبى بۇرىن - - - - وتكەن سەنبى - وسى سەنبى - كەلەسى سەنبى - - {0} سەنبىدەن كەيىن - {0} سەنبىدەن كەيىن - - - {0} سەنبى بۇرىن - {0} سەنبى بۇرىن - - - - تۇسكە دەيىن/تۇستەن كەيىن - - تۇسكە دەيىن/تۇستەن كەيىن - - - تۇسكە دەيىن/تۇستەن كەيىن + تۇسكە دەيىن/تۇستەن كەيىن - ساعات - وسى ساعات + ساعات + وسى ساعات - {0} ساعاتتان كەيىن - {0} ساعاتتان كەيىن + {0} ساعاتتان كەيىن + {0} ساعاتتان كەيىن - {0} ساعات بۇرىن - {0} ساعات بۇرىن - - - - ساعات - وسى ساعات - - {0} ساعاتتان كەيىن - {0} ساعاتتان كەيىن - - - {0} ساعات بۇرىن - {0} ساعات بۇرىن - - - - ساعات - وسى ساعات - - {0} ساعاتتان كەيىن - {0} ساعاتتان كەيىن - - - {0} ساعات بۇرىن - {0} ساعات بۇرىن + {0} ساعات بۇرىن + {0} ساعات بۇرىن - مينۋت - وسى مينۋت + مينۋت + وسى مينۋت - {0} مينۋتتان كەيىن - {0} مينۋتتان كەيىن + {0} مينۋتتان كەيىن + {0} مينۋتتان كەيىن - {0} مينۋت بۇرىن - {0} مينۋت بۇرىن - - - - مينۋت - وسى مينۋت - - {0} مينۋتتان كەيىن - {0} مينۋتتان كەيىن - - - {0} مينۋت بۇرىن - {0} مينۋت بۇرىن - - - - مينۋت - وسى مينۋت - - {0} مينۋتتان كەيىن - {0} مينۋتتان كەيىن - - - {0} مينۋت بۇرىن - {0} مينۋت بۇرىن + {0} مينۋت بۇرىن + {0} مينۋت بۇرىن - سەكۋند - قازىر + سەكۋند + قازىر - {0} سەكۋندتان كەيىن - {0} سەكۋندتان كەيىن + {0} سەكۋندتان كەيىن + {0} سەكۋندتان كەيىن - {0} سەكۋند بۇرىن - {0} سەكۋند بۇرىن - - - - سەكۋند - قازىر - - {0} سەكۋندتان كەيىن - {0} سەكۋندتان كەيىن - - - {0} سەكۋند بۇرىن - {0} سەكۋند بۇرىن - - - - سەكۋند - قازىر - - {0} سەكۋندتان كەيىن - {0} سەكۋندتان كەيىن - - - {0} سەكۋند بۇرىن - {0} سەكۋند بۇرىن + {0} سەكۋند بۇرىن + {0} سەكۋند بۇرىن - ۋاقىت بەلدەۋى - - - ۋاقىت بەلدەۋى - - - ۋاقىت بەلدەۋى + ۋاقىت بەلدەۋى - {0} ۋاقىتى - {0} جازعى ۋاقىتى - {0} ستاندارتتى ۋاقىتى + {0} ۋاقىتى + {0} جازعى ۋاقىتى + {0} ستاندارتتى ۋاقىتى - دۇنيەجۇزىلىك ۇيلەستىرىلگەن ۋاقىت + دۇنيەجۇزىلىك ۇيلەستىرىلگەن ۋاقىت - بەلگىسىز قالا + بەلگىسىز قالا - اندوررا + اندوررا - دۋباي + دۋباي - كابۋل + كابۋل - انتيگۋا + انتيگۋا - انگيليا + انگيليا - تيرانا + تيرانا - يەرەۆان + يەرەۆان - لۋاندا + لۋاندا - روتەرا + روتەرا - پالمەر + پالمەر - ترول + ترول - سەۆا + سەۆا - موۋسون + موۋسون - دەيۆيس + دەيۆيس - ۆوستوك + ۆوستوك - كەيسي + كەيسي - ديۋمون-ديۋرۆيل + ديۋمون-ديۋرۆيل - ماك-مەردو + ماك-مەردو - ريو-گالەگوس + ريو-گالەگوس - مەندوزا + مەندوزا - سان-حۋان + سان-حۋان - ۋشۋايا + ۋشۋايا - لا-ريوحا + لا-ريوحا - سان-لۋيس + سان-لۋيس - كاتاماركا + كاتاماركا - سالتا + سالتا - جۋجۋي + جۋجۋي - تۋكۋمان + تۋكۋمان - كوردوبا + كوردوبا - بۋەنوس-ايروس + بۋەنوس-ايروس - پاگو-پاگو + پاگو-پاگو - ۆەنا + ۆەنا - پەرت + پەرت - يۋكلا + يۋكلا - دارۆين + دارۆين - ادەلايدا + ادەلايدا - بروكەن-حيل + بروكەن-حيل - مەلبۋرن + مەلبۋرن - حوبارت + حوبارت - ليندەمان + ليندەمان - سيدنەي + سيدنەي - بريسبەن + بريسبەن - ماككۋوري + ماككۋوري - لورد-حاۋ + لورد-حاۋ - ارۋبا + ارۋبا - ماريەحامن + ماريەحامن - باكۋ + باكۋ - ساراەۆو + ساراەۆو - باربادوس + باربادوس - داككا + داككا - بريۋسەل + بريۋسەل - ۋاگادۋگۋ + ۋاگادۋگۋ - سوفيا + سوفيا - باحرەين + باحرەين - بۋجۋمبۋرا + بۋجۋمبۋرا - پورتو-نوۆو + پورتو-نوۆو - سەن-بارتەلەمي + سەن-بارتەلەمي - بەرمۋد ارالدارى + بەرمۋد ارالدارى - برۋنەي + برۋنەي - لا-پاس + لا-پاس - كرالەندەيك + كرالەندەيك - ەيرۋنەپە + ەيرۋنەپە - ريۋ-برانكۋ + ريۋ-برانكۋ - پورتو-ۆەليۋ + پورتو-ۆەليۋ - باو-ۆيستا + باو-ۆيستا - ماناۋس + ماناۋس - كۋيابا + كۋيابا - سانتارەن + سانتارەن - كامپۋ-گراندە + كامپۋ-گراندە - بەلەم + بەلەم - اراگۋاينا + اراگۋاينا - سان-پۋالۋ + سان-پۋالۋ - بايا + بايا - فورتالەزا + فورتالەزا - ماسەيو + ماسەيو - رەسيفي + رەسيفي - نورونيا + نورونيا - ناسساۋ + ناسساۋ - تحيمپحۋ + تحيمپحۋ - گابورونە + گابورونە - مينسك + مينسك - بەليز + بەليز - دوۋسون + دوۋسون - ۋايتحورس + ۋايتحورس - ينۋۆيك + ينۋۆيك - ۆانكۋۆەر + ۆانكۋۆەر - فورت-نەلسون + فورت-نەلسون - دوۋسون-كريك + دوۋسون-كريك - كرەستون + كرەستون - ەدمونتون + ەدمونتون - سۋيات-كاررەنت + سۋيات-كاررەنت - كەمبريج-بەي + كەمبريج-بەي - رەجاينا + رەجاينا - ۆيننيپەگ + ۆيننيپەگ - رەزوليۋت + رەزوليۋت - رانكين-ينلەت + رانكين-ينلەت - اتيكوكان + اتيكوكان - تورونتو + تورونتو - يكالۋيت + يكالۋيت - مونكتون + مونكتون - گاليفاكس + گاليفاكس - گۋس-بەي + گۋس-بەي - گلەيس-بەي + گلەيس-بەي - بلانك-سابلون + بلانك-سابلون - سەنت-جونس + سەنت-جونس - كوكوس ارالدارى + كوكوس ارالدارى - كينشاسا + كينشاسا - لۋبۋمباشي + لۋبۋمباشي - بانگي + بانگي - براززاۆيل + براززاۆيل - سيۋريح + سيۋريح - ابيدجان + ابيدجان - راروتونگا + راروتونگا - پاسحا ارالى + پاسحا ارالى + + + كويايكە - پۋنتا-ارەناس + پۋنتا-ارەناس - سانتياگو + سانتياگو - دۋالا + دۋالا - ءۇرىمشى + ءۇرىمشى - شانحاي + شانحاي - بوگوتا + بوگوتا - كوستا-ريكا + كوستا-ريكا - گاۆانا + گاۆانا - كابو-ۆەردە + كابو-ۆەردە - كيۋراساو + كيۋراساو - كريستماس ارالدارى + كريستماس ارالدارى - نيكوسيا + نيكوسيا - فاماگۋستا + فاماگۋستا - پراگا + پراگا - بيۋزينگەن + بيۋزينگەن - بەرلين + بەرلين - جيبۋتي + جيبۋتي - كوپەنگاگەن + كوپەنگاگەن - دومينيكا + دومينيكا - سانتو-دومينگو + سانتو-دومينگو - الجير + الجير - گالاپاگوس + گالاپاگوس - گۋاياكيل + گۋاياكيل - تاللين + تاللين - كاير + كاير - ەل-ايۋن + ەل-ايۋن - اسمارا + اسمارا - كانار ارالدارى + كانار ارالدارى - سەۋتا + سەۋتا - مادريد + مادريد - ادديس-ابەبا + ادديس-ابەبا - حەلسينكي + حەلسينكي - فيجي + فيجي - ستەنلي + ستەنلي - ترۋك + ترۋك - پوناپە + پوناپە - كۋسايە + كۋسايە - فارەر ارالدارى + فارەر ارالدارى - پاريج + پاريج - ليبرەۆيل + ليبرەۆيل - ۇلىبريتانيا جازعى ۋاقىتى + ۇلىبريتانيا جازعى ۋاقىتى - لوندون + لوندون - گرەنادا + گرەنادا - تبيليسي + تبيليسي - كايەننا + كايەننا - گەرنسي + گەرنسي - اككرا + اككرا - گيبرالتال + گيبرالتال - تۋلە + تۋلە - نۋۋك + نۋۋك - يللوككورتوورميۋت + يللوككورتوورميۋت - دانماركسحاۆن + دانماركسحاۆن - بانجۋل + بانجۋل - كوناكري + كوناكري - گۆادەلۇپا + گۆادەلۇپا - مالابو + مالابو - افينا + افينا - وڭتۇستىك گەورگيا + وڭتۇستىك گەورگيا - گۆاتەمالا + گۆاتەمالا - گۋام + گۋام - بيساۋ + بيساۋ - گايانا + گايانا - حوڭكوڭ + حوڭكوڭ - تەگۋسيگالپا + تەگۋسيگالپا - زاگرەب + زاگرەب - پورت-وف-پرەنس + پورت-وف-پرەنس - بۋداپەشت + بۋداپەشت - جاكارتا + جاكارتا - پونتياناك + پونتياناك - ماكاسار + ماكاسار - جاياپۋرا + جاياپۋرا - يرلانديا ستاندارتتى ۋاقىتى + يرلانديا ستاندارتتى ۋاقىتى - دۋبلين + دۋبلين - يەرۋساليم + يەرۋساليم - مەن ارالى + مەن ارالى - كالكۋتا + كالكۋتا - چاگوس + چاگوس - باگدات + باگدات - تەگەران + تەگەران - رەيكياۆيك + رەيكياۆيك - ريم + ريم - جەرسەي + جەرسەي - يامايكا + يامايكا - اممان + اممان - توكيو + توكيو - نايروبي + نايروبي - بىشكەك + بىشكەك - پنومپەن + پنومپەن - - كانتون + + كانتون - كيريتيماتي + كيريتيماتي - تاراۋا + تاراۋا - كومور ارالدارى + كومور ارالدارى - سەنت-كيتس + سەنت-كيتس - پحەنيان + پحەنيان - سەۋل + سەۋل - كۋۆەيت + كۋۆەيت - كايمان ارالدارى + كايمان ارالدارى - اقتاۋ + اقتاۋ - ورال + ورال - اتىراۋ + اتىراۋ - اقتوبە + اقتوبە - قوستاناي + قوستاناي - قىزىلوردا + قىزىلوردا - الماتى + الماتى - ۆەنتيان + ۆەنتيان - بەيرۋت + بەيرۋت - سەنت-ليۋسيا + سەنت-ليۋسيا - ۆادۋس + ۆادۋس - كولومبو + كولومبو - مونروۆيا + مونروۆيا - ماسەرۋ + ماسەرۋ - ۆينيۋس + ۆينيۋس - ليۋكسەمبۋرگ + ليۋكسەمبۋرگ - ريگا + ريگا - تريپولي + تريپولي - كاسابلانكا + كاسابلانكا - موناكو + موناكو - كيشينەۆ + كيشينەۆ - پودگوريسا + پودگوريسا - ماريگو + ماريگو - انتاناناريۆۋ + انتاناناريۆۋ - كۆاجالەيىن + كۆاجالەيىن - ماجۋرو + ماجۋرو - سكوپيە + سكوپيە - باماكو + باماكو - يانگون + يانگون - حوۆد + حوۆد - ۇلانباتىر + ۇلانباتىر - ماكاو + ماكاو - سايپان + سايپان - مارتينيكا + مارتينيكا - نۋاكشوت + نۋاكشوت - مونتسەررات + مونتسەررات - مالتا + مالتا - ماۆريكي + ماۆريكي - مالديۆ ارالدارى + مالديۆ ارالدارى - بلانتاير + بلانتاير - تيحۋانا + تيحۋانا - ەرموسيلو + ەرموسيلو - سيۋداد-حۋارەس + سيۋداد-حۋارەس - ماساتلان + ماساتلان - چيۋاۋا + چيۋاۋا - بايا-دە-باندەراس + بايا-دە-باندەراس - وحيناگا + وحيناگا - مونتەررەي + مونتەررەي - مەحيكو + مەحيكو - ماتاموروس + ماتاموروس - مەريدا + مەريدا - كانكۋن + كانكۋن - كۋالا-لۋمپۋر + كۋالا-لۋمپۋر - كۋچيڭ + كۋچيڭ - ماپۋتۋ + ماپۋتۋ - ۆيندحۋك + ۆيندحۋك - نۋمەا + نۋمەا - نيامەي + نيامەي - نورفولك + نورفولك - لاگوس + لاگوس - ماناگۋا + ماناگۋا - امستەردام + امستەردام - وسلو + وسلو - كاتماندۋ + كاتماندۋ - ناۋرۋ + ناۋرۋ - نيۋە + نيۋە - چاتەم + چاتەم - وكلەند + وكلەند - ماسكات + ماسكات - پاناما + پاناما - ليما + ليما - تايتي + تايتي - ماركيز ارالدارى + ماركيز ارالدارى - گامبيە + گامبيە - پورت-مورسبي + پورت-مورسبي - بۋگەنۆيل + بۋگەنۆيل - مانيلا + مانيلا - كاراچا + كاراچا - ۆارشاۆا + ۆارشاۆا - ميكەلون + ميكەلون - پيتكەرن + پيتكەرن - پۋەرتو-ريكو + پۋەرتو-ريكو - گازا + گازا - حەۆرون + حەۆرون - ازور ارالدارى + ازور ارالدارى - مادەيرا + مادەيرا - ليسابون + ليسابون - پالاۋ + پالاۋ - اسۋنسيون + اسۋنسيون - كاتار + كاتار - رەيۋنيون + رەيۋنيون - بۋحارەست + بۋحارەست - بەلگراد + بەلگراد - كالينينگراد + كالينينگراد - ماسكەۋ + ماسكەۋ - ۆولگوگراد + ۆولگوگراد - سارىتاۋ + سارىتاۋ - استراحان + استراحان - ۋليانوۆسك + ۋليانوۆسك - كيروۆ + كيروۆ - سامارا + سامارا - ەكاتەرينبۋرگ + ەكاتەرينبۋرگ - ومبى + ومبى - جاڭاسىبىر + جاڭاسىبىر - بارناۋىل + بارناۋىل - تۋمەن + تۋمەن - نوۆوكۋزنەتسك + نوۆوكۋزنەتسك - كراسنويارسك + كراسنويارسك - يركۋتسك + يركۋتسك - چيتا + چيتا - ياكۋتسك + ياكۋتسك - ۆلاديۆاستوك + ۆلاديۆاستوك - حاندىگا + حاندىگا - ساحالين + ساحالين - ۋست-نەرا + ۋست-نەرا - ماگادان + ماگادان - سرەدنەكولىمسك + سرەدنەكولىمسك - كامچاتكا + كامچاتكا - انادىر + انادىر - كيگالي + كيگالي - ەر-رياد + ەر-رياد - گۋادالكانال + گۋادالكانال - ماە + ماە - حارتۋم + حارتۋم - ستوكگولىم + ستوكگولىم - سينگاپۋر + سينگاپۋر - اۋليە ەلەنا ارالى + اۋليە ەلەنا ارالى - ليۋبليانا + ليۋبليانا - لونگير + لونگير - براتيسلاۆا + براتيسلاۆا - فريتاۋن + فريتاۋن - سان-مارينو + سان-مارينو - داكار + داكار - موگاديشۋ + موگاديشۋ - پاراماريبو + پاراماريبو - جۋبا + جۋبا - سان-تومە + سان-تومە - سالۆادور + سالۆادور - لوۋەر-پرينس-كۋوتەر + لوۋەر-پرينس-كۋوتەر - داماسك + داماسك - مبابەنە + مبابەنە - گراند-تەرك + گراند-تەرك - ندجامەنا + ندجامەنا - كەرگەلەن + كەرگەلەن - لومە + لومە - باڭكوك + باڭكوك - دۋشانبە + دۋشانبە - فاكاوفو + فاكاوفو - ديلي + ديلي - اشحابات + اشحابات - تۋنيس + تۋنيس - تونگاتاپۋ + تونگاتاپۋ - ستامبۇل + ستامبۇل - پورت-وف-سپاين + پورت-وف-سپاين - فۋنافۋتي + فۋنافۋتي - تايبەي + تايبەي - دار-ەس-سالام + دار-ەس-سالام - كيەۆ + كيەۆ - سيمفەرول + سيمفەرول - كامپالا + كامپالا - ميدۋەي + ميدۋەي - ۋەيك + ۋەيك - اداك + اداك - نوم + نوم - انكوريج + انكوريج - ياكۋتات + ياكۋتات - سيتكا + سيتكا - جۋنو + جۋنو - مەتلاكاتلا + مەتلاكاتلا - لوس-انجەلەس + لوس-انجەلەس - بويسە + بويسە - فينيكس + فينيكس - دەنۆەر + دەنۆەر - بويلا، سولتۇستىك داكوتا + بويلا، سولتۇستىك داكوتا - نيۋ-سەيلەم، سولتۇستىك داكوتا + نيۋ-سەيلەم، سولتۇستىك داكوتا - سەنتەر، سولتۇستىك داكوتا + سەنتەر، سولتۇستىك داكوتا - چيكاگو + چيكاگو - مەنوميني + مەنوميني - ۆينسەننەس، ينديانا + ۆينسەننەس، ينديانا - پيتەرسبەرگ، ينديانا + پيتەرسبەرگ، ينديانا - تەلل-سيتي، ينديانا + تەلل-سيتي، ينديانا - نوكس، ينديانا + نوكس، ينديانا - ۋيناماك، ينديانا + ۋيناماك، ينديانا - مارەنگو، ينديانا + مارەنگو، ينديانا - يندياناپوليس + يندياناپوليس - لۋيسۆيل + لۋيسۆيل - ۆيۆەي، ينديانا + ۆيۆەي، ينديانا - مونتيسەللو، كەنتۋككي + مونتيسەللو، كەنتۋككي - دەترويد + دەترويد - نيۋ-يورك + نيۋ-يورك - مونتەۆيدەو + مونتەۆيدەو - سامارقاند + سامارقاند - تاشكەنت + تاشكەنت - ۆاتيكان + ۆاتيكان - سەنت-ۆينسەنت + سەنت-ۆينسەنت - كاراكاس + كاراكاس - تورتولا + تورتولا - سەنت-توماس + سەنت-توماس - حوشيمين + حوشيمين - ەفاتە + ەفاتە - ۋولليس + ۋولليس - اپيا + اپيا - ادەن + ادەن - مايوتتا + مايوتتا - يوحاننەسبۋرگ + يوحاننەسبۋرگ - لۋساكا + لۋساكا - حارارە + حارارە - اۋعانستان ۋاقىتى + اۋعانستان ۋاقىتى - ورتالىق افريكا ۋاقىتى + ورتالىق افريكا ۋاقىتى - شىعىس افريكا ۋاقىتى + شىعىس افريكا ۋاقىتى - وڭتۇستىك افريكا ستاندارتتى ۋاقىتى + وڭتۇستىك افريكا ستاندارتتى ۋاقىتى - باتىس افريكا ۋاقىتى - باتىس افريكا ستاندارتتى ۋاقىتى - باتىس افريكا جازعى ۋاقىتى + باتىس افريكا ۋاقىتى - الاسكا ۋاقىتى - الاسكا ستاندارتتى ۋاقىتى - الاسكا جازعى ۋاقىتى + الاسكا ۋاقىتى + الاسكا ستاندارتتى ۋاقىتى + الاسكا جازعى ۋاقىتى - الماتى ۋاقىتى - الماتى ستاندارتتى ۋاقىتى - الماتى جازعى ۋاقىتى + الماتى ۋاقىتى + الماتى ستاندارتتى ۋاقىتى + الماتى جازعى ۋاقىتى - الماتى - الماتى - الماتى قالاسى + الماتى + الماتى + الماتى قالاسى - امازون ۋاقىتى - امازون ستاندارتتى ۋاقىتى - امازون جازعى ۋاقىتى + امازون ۋاقىتى + امازون ستاندارتتى ۋاقىتى + امازون جازعى ۋاقىتى - سولتۇستىك امەريكا ورتالىق ۋاقىتى - سولتۇستىك امەريكا ستاندارتتى ورتالىق ۋاقىتى - ولتۇستىك امەريكا جازعى ورتالىق ۋاقىتى + سولتۇستىك امەريكا ورتالىق ۋاقىتى + سولتۇستىك امەريكا ستاندارتتى ورتالىق ۋاقىتى + ولتۇستىك امەريكا جازعى ورتالىق ۋاقىتى - سولتۇستىك امەريكا شىعىس ۋاقىتى - سولتۇستىك امەريكا ستاندارتتى شىعىس ۋاقىتى - سولتۇستىك امەريكا جازعى شىعىس ۋاقىتى + سولتۇستىك امەريكا شىعىس ۋاقىتى + سولتۇستىك امەريكا ستاندارتتى شىعىس ۋاقىتى + سولتۇستىك امەريكا جازعى شىعىس ۋاقىتى - سولتۇستىك امەريكا تاۋ ۋاقىتى - سولتۇستىك امەريكا ستاندارتتى تاۋ ۋاقىتى - سولتۇستىك امەريكا جازعى تاۋ ۋاقىتى + سولتۇستىك امەريكا تاۋ ۋاقىتى + سولتۇستىك امەريكا ستاندارتتى تاۋ ۋاقىتى + سولتۇستىك امەريكا جازعى تاۋ ۋاقىتى - سولتۇستىك امەريكا تىنىق مۇحيتى ۋاقىتى - سولتۇستىك امەريكا ستاندارتتى تىنىق مۇحيتى ۋاقىتى - سولتۇستىك امەريكا جازعى تىنىق مۇحيتى ۋاقىتى + سولتۇستىك امەريكا تىنىق مۇحيتى ۋاقىتى + سولتۇستىك امەريكا ستاندارتتى تىنىق مۇحيتى ۋاقىتى + سولتۇستىك امەريكا جازعى تىنىق مۇحيتى ۋاقىتى - اپيا ۋاقىتى - اپيا ستاندارتتى ۋاقىتى - اپيا جازعى ۋاقىتى + اپيا ۋاقىتى + اپيا ستاندارتتى ۋاقىتى + اپيا جازعى ۋاقىتى - اقتاۋ ۋاقىتى - اقتاۋ ستاندارتتى ۋاقىتى - اقتاۋ جازعى ۋاقىتى + اقتاۋ ۋاقىتى + اقتاۋ ستاندارتتى ۋاقىتى + اقتاۋ جازعى ۋاقىتى - اقتاۋ - اقتاۋ - اقتاۋ قالاسى + اقتاۋ + اقتاۋ + اقتاۋ قالاسى - اقتوبە ۋاقىتى - اقتوبە ستاندارتتى ۋاقىتى - اقتوبە جازعى ۋاقىتى + اقتوبە ۋاقىتى + اقتوبە ستاندارتتى ۋاقىتى + اقتوبە جازعى ۋاقىتى - اقتوبە - اقتوبە - اقتوبە قالاسى + اقتوبە + اقتوبە + اقتوبە قالاسى - ساۋد ارابياسى ۋاقىتى - ساۋد ارابياسى ستاندارتتى ۋاقىتى - ساۋد ارابياسى جازعى ۋاقىتى + ساۋد ارابياسى ۋاقىتى + ساۋد ارابياسى ستاندارتتى ۋاقىتى + ساۋد ارابياسى جازعى ۋاقىتى - ارگەنتينا ۋاقىتى - ارگەنتينا ستاندارتتى ۋاقىتى - ارگەنتينا جازعى ۋاقىتى + ارگەنتينا ۋاقىتى + ارگەنتينا ستاندارتتى ۋاقىتى + ارگەنتينا جازعى ۋاقىتى - باتىس ارگەنتينا ۋاقىتى - باتىس ارگەنتينا ستاندارتتى ۋاقىتى - باتىس ارگەنتينا جازعى ۋاقىتى + باتىس ارگەنتينا ۋاقىتى + باتىس ارگەنتينا ستاندارتتى ۋاقىتى + باتىس ارگەنتينا جازعى ۋاقىتى - ارمەنيا ۋاقىتى - ارمەنيا ستاندارتتى ۋاقىتى - ارمەنيا جازعى ۋاقىتى + ارمەنيا ۋاقىتى + ارمەنيا ستاندارتتى ۋاقىتى + ارمەنيا جازعى ۋاقىتى - اتلانتيكا ۋاقىتى - اتلانتيكا ستاندارتتى ۋاقىتى - اتلانتيكا جازعى ۋاقىتى + اتلانتيكا ۋاقىتى + اتلانتيكا ستاندارتتى ۋاقىتى + اتلانتيكا جازعى ۋاقىتى - ورتالىق اۋستراليا ۋاقىتى - اۋستراليا ستاندارتتى ورتالىق ۋاقىتى - اۋستراليا جازعى ورتالىق ۋاقىتى + ورتالىق اۋستراليا ۋاقىتى + اۋستراليا ستاندارتتى ورتالىق ۋاقىتى + اۋستراليا جازعى ورتالىق ۋاقىتى - اۋستراليا ورتالىق-باتىس ۋاقىتى - اۋستراليا ستاندارتتى ورتالىق-باتىس ۋاقىتى - اۋستراليا جازعى ورتالىق-باتىس ۋاقىتى + اۋستراليا ورتالىق-باتىس ۋاقىتى + اۋستراليا ستاندارتتى ورتالىق-باتىس ۋاقىتى + اۋستراليا جازعى ورتالىق-باتىس ۋاقىتى - شىعىس اۋستراليا ۋاقىتى - اۋستراليا ستاندارتتى شىعىس ۋاقىتى - اۋستراليا جازعى شىعىس ۋاقىتى + شىعىس اۋستراليا ۋاقىتى + اۋستراليا ستاندارتتى شىعىس ۋاقىتى + اۋستراليا جازعى شىعىس ۋاقىتى - باتىس اۋستراليا ۋاقىتى - اۋستراليا ستاندارتتى باتىس ۋاقىتى - اۋستراليا جازعى باتىس ۋاقىتى + باتىس اۋستراليا ۋاقىتى + اۋستراليا ستاندارتتى باتىس ۋاقىتى + اۋستراليا جازعى باتىس ۋاقىتى - ءازىربايجان ۋاقىتى - ءازىربايجان ستاندارتتى ۋاقىتى - ءازىربايجان جازعى ۋاقىتى + ءازىربايجان ۋاقىتى + ءازىربايجان ستاندارتتى ۋاقىتى + ءازىربايجان جازعى ۋاقىتى - ازور ارالدارى ۋاقىتى - ازور ارالدارى ستاندارتتى ۋاقىتى - ازور ارالدارى جازعى ۋاقىتى + ازور ارالدارى ۋاقىتى + ازور ارالدارى ستاندارتتى ۋاقىتى + ازور ارالدارى جازعى ۋاقىتى - بانگلادەش ۋاقىتى - بانگلادەش ستاندارتتى ۋاقىتى - بانگلادەش جازعى ۋاقىتى + بانگلادەش ۋاقىتى + بانگلادەش ستاندارتتى ۋاقىتى + بانگلادەش جازعى ۋاقىتى - بۋتان ۋاقىتى + بۋتان ۋاقىتى - بوليۆيا ۋاقىتى + بوليۆيا ۋاقىتى - برازيليا ۋاقىتى - برازيليا ستاندارتتى ۋاقىتى - برازيليا جازعى ۋاقىتى + برازيليا ۋاقىتى + برازيليا ستاندارتتى ۋاقىتى + برازيليا جازعى ۋاقىتى - برۋنەي-دارۋسسالام ۋاقىتى + برۋنەي-دارۋسسالام ۋاقىتى - كابو-ۆەردە ۋاقىتى - كابو-ۆەردە ستاندارتتى ۋاقىتى - كابو-ۆەردە جازعى ۋاقىتى + كابو-ۆەردە ۋاقىتى + كابو-ۆەردە ستاندارتتى ۋاقىتى + كابو-ۆەردە جازعى ۋاقىتى - چاموررو ستاندارتتى ۋاقىتى + چاموررو ستاندارتتى ۋاقىتى - چاتەم ۋاقىتى - چاتەم ستاندارتتى ۋاقىتى - چاتەم جازعى ۋاقىتى + چاتەم ۋاقىتى + چاتەم ستاندارتتى ۋاقىتى + چاتەم جازعى ۋاقىتى - چيلي ۋاقىتى - چيلي ستاندارتتى ۋاقىتى - چيلي جازعى ۋاقىتى + چيلي ۋاقىتى + چيلي ستاندارتتى ۋاقىتى + چيلي جازعى ۋاقىتى - قىتاي ۋاقىتى - قىتاي ستاندارتتى ۋاقىتى - قىتاي جازعى ۋاقىتى + قىتاي ۋاقىتى + قىتاي ستاندارتتى ۋاقىتى + قىتاي جازعى ۋاقىتى - كريستماس ارالىنىڭ ۋاقىتى + كريستماس ارالىنىڭ ۋاقىتى - كوكوس ارالدارىنىڭ ۋاقىتى + كوكوس ارالدارىنىڭ ۋاقىتى - كولۋمبيا ۋاقىتى - كولۋمبيا ستاندارتتى ۋاقىتى - كولۋمبيا جازعى ۋاقىتى + كولۋمبيا ۋاقىتى + كولۋمبيا ستاندارتتى ۋاقىتى + كولۋمبيا جازعى ۋاقىتى - كۋك ارالدارىنىڭ ۋاقىتى - كۋك ارالدارىنىڭ ستاندارتتى ۋاقىتى - كۋك ارالدارىنىڭ جازعى ۋاقىتى + كۋك ارالدارىنىڭ ۋاقىتى + كۋك ارالدارىنىڭ ستاندارتتى ۋاقىتى + كۋك ارالدارىنىڭ جازعى ۋاقىتى - كۋبا ۋاقىتى - كۋبا ستاندارتتى ۋاقىتى - كۋبا جازعى ۋاقىتى + كۋبا ۋاقىتى + كۋبا ستاندارتتى ۋاقىتى + كۋبا جازعى ۋاقىتى - دەيۆيس ۋاقىتى + دەيۆيس ۋاقىتى - ديۋمون-ديۋرۆيل ۋاقىتى + ديۋمون-ديۋرۆيل ۋاقىتى - شىعىس تيمور ۋاقىتى + شىعىس تيمور ۋاقىتى - پاسحا ارالى ۋاقىتى - پاسحا ارالى ستاندارتتى ۋاقىتى - پاسحا ارالى جازعى ۋاقىتى + پاسحا ارالى ۋاقىتى + پاسحا ارالى ستاندارتتى ۋاقىتى + پاسحا ارالى جازعى ۋاقىتى - ەكۆادور ۋاقىتى + ەكۆادور ۋاقىتى - ورتالىق ەۋروپا ۋاقىتى - ورتالىق ەۋروپا ستاندارتتى ۋاقىتى - ورتالىق ەۋروپا جازعى ۋاقىتى + ورتالىق ەۋروپا ۋاقىتى + ورتالىق ەۋروپا ستاندارتتى ۋاقىتى + ورتالىق ەۋروپا جازعى ۋاقىتى - شىعىس ەۋروپا ۋاقىتى - شىعىس ەۋروپا ستاندارتتى ۋاقىتى - شىعىس ەۋروپا جازعى ۋاقىتى + شىعىس ەۋروپا ۋاقىتى + شىعىس ەۋروپا ستاندارتتى ۋاقىتى + شىعىس ەۋروپا جازعى ۋاقىتى - قيىر شىعىس ەۋروپا ۋاقىتى + قيىر شىعىس ەۋروپا ۋاقىتى - باتىس ەۋروپا ۋاقىتى - باتىس ەۋروپا ستاندارتتى ۋاقىتى - باتىس ەۋروپا جازعى ۋاقىتى + باتىس ەۋروپا ۋاقىتى + باتىس ەۋروپا ستاندارتتى ۋاقىتى + باتىس ەۋروپا جازعى ۋاقىتى - فولكلەند ارالدارى ۋاقىتى - فولكلەند ارالدارى ستاندارتتى ۋاقىتى - فولكلەند ارالدارى جازعى ۋاقىتى + فولكلەند ارالدارى ۋاقىتى + فولكلەند ارالدارى ستاندارتتى ۋاقىتى + فولكلەند ارالدارى جازعى ۋاقىتى - فيجي ۋاقىتى - فيجي ستاندارتتى ۋاقىتى - فيجي جازعى ۋاقىتى + فيجي ۋاقىتى + فيجي ستاندارتتى ۋاقىتى + فيجي جازعى ۋاقىتى - فرانتسۋز گۆياناسى ۋاقىتى + فرانتسۋز گۆياناسى ۋاقىتى - فرانتسيانىڭ وڭتۇستىك ايماعى جانە انتاركتيكا ۋاقىتى + فرانتسيانىڭ وڭتۇستىك ايماعى جانە انتاركتيكا ۋاقىتى - گالاپاگوس ۋاقىتى + گالاپاگوس ۋاقىتى - گامبە ۋاقىتى + گامبە ۋاقىتى - گرۋزيا ۋاقىتى - گرۋزيا ستاندارتتى ۋاقىتى - گرۋزيا جازعى ۋاقىتى + گرۋزيا ۋاقىتى + گرۋزيا ستاندارتتى ۋاقىتى + گرۋزيا جازعى ۋاقىتى - گيلبەرت ارالدارىنىڭ ۋاقىتى + گيلبەرت ارالدارىنىڭ ۋاقىتى - گرينۆيچ ۋاقىتى + گرينۆيچ ۋاقىتى - شىعىس گرەنلانديا ۋاقىتى - شىعىس گرەنلانديا ستاندارتتى ۋاقىتى - شىعىس گرەنلانديا جازعى ۋاقىتى + شىعىس گرەنلانديا ۋاقىتى + شىعىس گرەنلانديا ستاندارتتى ۋاقىتى + شىعىس گرەنلانديا جازعى ۋاقىتى - باتىس گرەنلانديا ۋاقىتى - باتىس گرەنلانديا ستاندارتتى ۋاقىتى - باتىس گرەنلانديا جازعى ۋاقىتى + باتىس گرەنلانديا ۋاقىتى + باتىس گرەنلانديا ستاندارتتى ۋاقىتى + باتىس گرەنلانديا جازعى ۋاقىتى - پارسى شىعاناعى ستاندارتتى ۋاقىتى + پارسى شىعاناعى ستاندارتتى ۋاقىتى - گايانا ۋاقىتى + گايانا ۋاقىتى + + + + + گاۆاي جانە الەۋت ارالدارى ستاندارتتى ۋاقىتى - گاۆاي جانە الەۋت ارالدارى ۋاقىتى - گاۆاي جانە الەۋت ارالدارى ستاندارتتى ۋاقىتى - گاۆاي جانە الەۋت ارالدارى جازعى ۋاقىتى + گاۆاي جانە الەۋت ارالدارى ۋاقىتى + گاۆاي جانە الەۋت ارالدارى ستاندارتتى ۋاقىتى + گاۆاي جانە الەۋت ارالدارى جازعى ۋاقىتى - حوڭكوڭ ۋاقىتى - حوڭكوڭ ستاندارتتى ۋاقىتى - حوڭكوڭ جازعى ۋاقىتى + حوڭكوڭ ۋاقىتى + حوڭكوڭ ستاندارتتى ۋاقىتى + حوڭكوڭ جازعى ۋاقىتى - حوۆد ۋاقىتى - حوۆد ستاندارتتى ۋاقىتى - حوۆد جازعى ۋاقىتى + حوۆد ۋاقىتى + حوۆد ستاندارتتى ۋاقىتى + حوۆد جازعى ۋاقىتى - ءۇندىستان ستاندارتتى ۋاقىتى + ءۇندىستان ستاندارتتى ۋاقىتى - ءۇندى مۇحيتى ۋاقىتى + ءۇندى مۇحيتى ۋاقىتى - ءۇندى-قىتاي ۋاقىتى + ءۇندى-قىتاي ۋاقىتى - ورتالىق يندونەزيا ۋاقىتى + ورتالىق يندونەزيا ۋاقىتى - شىعىس يندونەزيا ۋاقىتى + شىعىس يندونەزيا ۋاقىتى - باتىس يندونەزيا ۋاقىتى + باتىس يندونەزيا ۋاقىتى - يران ۋاقىتى - يران ستاندارتتى ۋاقىتى - يران جازعى ۋاقىتى + يران ۋاقىتى + يران ستاندارتتى ۋاقىتى + يران جازعى ۋاقىتى - يركۋتسك ۋاقىتى - يركۋتسك ستاندارتتى ۋاقىتى - يركۋتسك جازعى ۋاقىتى + يركۋتسك ۋاقىتى + يركۋتسك ستاندارتتى ۋاقىتى + يركۋتسك جازعى ۋاقىتى - يزرايل ۋاقىتى - يزرايل ستاندارتتى ۋاقىتى - يزرايل جازعى ۋاقىتى + يزرايل ۋاقىتى + يزرايل ستاندارتتى ۋاقىتى + يزرايل جازعى ۋاقىتى - جاپونيا ۋاقىتى - جاپونيا ستاندارتتى ۋاقىتى - جاپونيا جازعى ۋاقىتى + جاپونيا ۋاقىتى + جاپونيا ستاندارتتى ۋاقىتى + جاپونيا جازعى ۋاقىتى - قازاق ەلى ۋاقىتى + قازاق ەلى ۋاقىتى - قازاق ەلى + قازاق ەلى - شىعىس قازاق ەلى ۋاقىتى + شىعىس قازاق ەلى ۋاقىتى - شىعىش قازاق ەلى + شىعىش قازاق ەلى - باتىس قازاق ەلى ۋاقىتى + باتىس قازاق ەلى ۋاقىتى - باتىس قازاق ەلى + باتىس قازاق ەلى - كورەيا ۋاقىتى - كورەيا ستاندارتتى ۋاقىتى - كورەيا جازعى ۋاقىتى + كورەيا ۋاقىتى + كورەيا ستاندارتتى ۋاقىتى + كورەيا جازعى ۋاقىتى - كۋسايە ۋاقىتى + كۋسايە ۋاقىتى - كراسنويارسك ۋاقىتى - كراسنويارسك ستاندارتتى ۋاقىتى - كراسنويارسك جازعى ۋاقىتى + كراسنويارسك ۋاقىتى + كراسنويارسك ستاندارتتى ۋاقىتى + كراسنويارسك جازعى ۋاقىتى - قىرعىزستان ۋاقىتى + قىرعىزستان ۋاقىتى - قىرعىزستان + قىرعىزستان - لاين ارالدارى ۋاقىتى + لاين ارالدارى ۋاقىتى - لورد-حاۋ ۋاقىتى - لورد-حاۋ ستاندارتتى ۋاقىتى - لورد-حاۋ جازعى ۋاقىتى + لورد-حاۋ ۋاقىتى + لورد-حاۋ ستاندارتتى ۋاقىتى + لورد-حاۋ جازعى ۋاقىتى - ماگادان ۋاقىتى - ماگادان ستاندارتتى ۋاقىتى - ماگادان جازعى ۋاقىتى + ماگادان ۋاقىتى + ماگادان ستاندارتتى ۋاقىتى + ماگادان جازعى ۋاقىتى - مالايزيا ۋاقىتى + مالايزيا ۋاقىتى - مالديۆ ارالدارى ۋاقىتى + مالديۆ ارالدارى ۋاقىتى - ماركيز ارالدارى ۋاقىتى + ماركيز ارالدارى ۋاقىتى - مارشال ارالدارى ۋاقىتى + مارشال ارالدارى ۋاقىتى - ماۆريكيي ۋاقىتى - ماۆريكيي ستاندارتتى ۋاقىتى - ماۆريكيي جازعى ۋاقىتى + ماۆريكيي ۋاقىتى + ماۆريكيي ستاندارتتى ۋاقىتى + ماۆريكيي جازعى ۋاقىتى - موۋسون ۋاقىتى + موۋسون ۋاقىتى - مەكسيكا تىنىق مۇحيت ۋاقىتى - مەكسيكا ستاندارتتى تىنىق مۇحيت ۋاقىتى - مەكسيكا جازعى تىنىق مۇحيت ۋاقىتى + مەكسيكا تىنىق مۇحيت ۋاقىتى + مەكسيكا ستاندارتتى تىنىق مۇحيت ۋاقىتى + مەكسيكا جازعى تىنىق مۇحيت ۋاقىتى - ۇلانباتىر ۋاقىتى - ۇلانباتىر ستاندارتتى ۋاقىتى - ۇلانباتىر جازعى ۋاقىتى + ۇلانباتىر ۋاقىتى + ۇلانباتىر ستاندارتتى ۋاقىتى + ۇلانباتىر جازعى ۋاقىتى - ماسكەۋ ۋاقىتى - ماسكەۋ ستاندارتتى ۋاقىتى - ماسكەۋ جازعى ۋاقىتى + ماسكەۋ ۋاقىتى + ماسكەۋ ستاندارتتى ۋاقىتى + ماسكەۋ جازعى ۋاقىتى - ميانما ۋاقىتى + ميانما ۋاقىتى - ناۋرۋ ۋاقىتى + ناۋرۋ ۋاقىتى - نەپال ۋاقىتى + نەپال ۋاقىتى - جاڭا كالەدونيا ۋاقىتى - جاڭا كالەدونيا ستاندارتتى ۋاقىتى - جاڭا كالەدونيا جازعى ۋاقىتى + جاڭا كالەدونيا ۋاقىتى + جاڭا كالەدونيا ستاندارتتى ۋاقىتى + جاڭا كالەدونيا جازعى ۋاقىتى - جاڭا زەلانديا ۋاقىتى - جاڭا زەلانديا ستاندارتتى ۋاقىتى - جاڭا زەلانديا جازعى ۋاقىتى + جاڭا زەلانديا ۋاقىتى + جاڭا زەلانديا ستاندارتتى ۋاقىتى + جاڭا زەلانديا جازعى ۋاقىتى - نيۋفاۋندلەند ۋاقىتى - نيۋفاۋندلەند ستاندارتتى ۋاقىتى - نيۋفاۋندلەند جازعى ۋاقىتى + نيۋفاۋندلەند ۋاقىتى + نيۋفاۋندلەند ستاندارتتى ۋاقىتى + نيۋفاۋندلەند جازعى ۋاقىتى - نيۋە ۋاقىتى + نيۋە ۋاقىتى - نورفولك ارالى ۋاقىتى - نورفولك ارالى ستاندارتتى ۋاقىتى - نورفولك ارالى جازعى ۋاقىتى + نورفولك ارالى ۋاقىتى + نورفولك ارالى ستاندارتتى ۋاقىتى + نورفولك ارالى جازعى ۋاقىتى - فەرناندۋ-دي-نورونيا ۋاقىتى - فەرناندۋ-دي-نورونيا ستاندارتتى ۋاقىتى - فەرناندۋ-دي-نورونيا جازعى ۋاقىتى + فەرناندۋ-دي-نورونيا ۋاقىتى + فەرناندۋ-دي-نورونيا ستاندارتتى ۋاقىتى + فەرناندۋ-دي-نورونيا جازعى ۋاقىتى - جاڭاسىبىر ۋاقىتى - جاڭاسىبىر ستاندارتتى ۋاقىتى - جاڭاسىبىر جازعى ۋاقىتى + جاڭاسىبىر ۋاقىتى + جاڭاسىبىر ستاندارتتى ۋاقىتى + جاڭاسىبىر جازعى ۋاقىتى - ومبى ۋاقىتى - ومبى ستاندارتتى ۋاقىتى - ومبى جازعى ۋاقىتى + ومبى ۋاقىتى + ومبى ستاندارتتى ۋاقىتى + ومبى جازعى ۋاقىتى - پاكىستان ۋاقىتى - پاكىستان ستاندارتتى ۋاقىتى - پاكىستان جازعى ۋاقىتى + پاكىستان ۋاقىتى + پاكىستان ستاندارتتى ۋاقىتى + پاكىستان جازعى ۋاقىتى - پالاۋ ۋاقىتى + پالاۋ ۋاقىتى - پاپۋا – جاڭا گۆينەيا ۋاقىتى + پاپۋا – جاڭا گۆينەيا ۋاقىتى - پاراگۆاي ۋاقىتى - پاراگۆاي ستاندارتتى ۋاقىتى - پاراگۆاي جازعى ۋاقىتى + پاراگۆاي ۋاقىتى + پاراگۆاي ستاندارتتى ۋاقىتى + پاراگۆاي جازعى ۋاقىتى - پەرۋ ۋاقىتى - پەرۋ ستاندارتتى ۋاقىتى - پەرۋ جازعى ۋاقىتى + پەرۋ ۋاقىتى + پەرۋ ستاندارتتى ۋاقىتى + پەرۋ جازعى ۋاقىتى - فيليپين ارالدارى ۋاقىتى - فيليپين ارالدارى ستاندارتتى ۋاقىتى - فيليپين ارالدارى جازعى ۋاقىتى + فيليپين ارالدارى ۋاقىتى + فيليپين ارالدارى ستاندارتتى ۋاقىتى + فيليپين ارالدارى جازعى ۋاقىتى - فەنيكس ارالدارى ۋاقىتى + فەنيكس ارالدارى ۋاقىتى - سەن-پەر جانە ميكەلون ۋاقىتى - سەن-پەر جانە ميكەلون ستاندارتتى ۋاقىتى - سەن-پەر جانە ميكەلون جازعى ۋاقىتى + سەن-پەر جانە ميكەلون ۋاقىتى + سەن-پەر جانە ميكەلون ستاندارتتى ۋاقىتى + سەن-پەر جانە ميكەلون جازعى ۋاقىتى - پيتكەرن ۋاقىتى + پيتكەرن ۋاقىتى - پونپەي ۋاقىتى + پونپەي ۋاقىتى - پحەنيان ۋاقىتى + پحەنيان ۋاقىتى - قىزىلوردا ۋاقىتى - قىزىلوردا ستاندارتتى ۋاقىتى - قىزىلوردا جازعى ۋاقىتى + قىزىلوردا ۋاقىتى + قىزىلوردا ستاندارتتى ۋاقىتى + قىزىلوردا جازعى ۋاقىتى - قىزىلوردا - قىزىلوردا - قىزىلوردا قالاسى + قىزىلوردا + قىزىلوردا + قىزىلوردا قالاسى - رەيۋنون ۋاقىتى + رەيۋنون ۋاقىتى - روتەرا ۋقىتى + روتەرا ۋقىتى - ساحالين ۋاقىتى - ساحالين ستاندارتتى ۋاقىتى - ساحالين جازعى ۋاقىتى + ساحالين ۋاقىتى + ساحالين ستاندارتتى ۋاقىتى + ساحالين جازعى ۋاقىتى - ساموا ۋاقىتى - ساموا ستاندارتتى ۋاقىتى - ساموا جازعى ۋاقىتى + ساموا ۋاقىتى + ساموا ستاندارتتى ۋاقىتى + ساموا جازعى ۋاقىتى - سەيشەل ارالدارى ۋاقىتى + سەيشەل ارالدارى ۋاقىتى - سينگاپۋر ستاندارتتى ۋاقىتى + سينگاپۋر ستاندارتتى ۋاقىتى - سولومون ارالدارى ۋاقىتى + سولومون ارالدارى ۋاقىتى - وڭتۇستىك گەورگيا ۋاقىتى + وڭتۇستىك گەورگيا ۋاقىتى - سۋرينام ۋاقىتى + سۋرينام ۋاقىتى - سەۆا ۋاقىتى + سەۆا ۋاقىتى - تايتي ۋاقىتى + تايتي ۋاقىتى - تايبەي ۋاقىتى - تايبەي ستاندارتتى ۋاقىتى - تايبەي جازعى ۋاقىتى + تايبەي ۋاقىتى + تايبەي ستاندارتتى ۋاقىتى + تايبەي جازعى ۋاقىتى - تاجىكستان ۋاقىتى + تاجىكستان ۋاقىتى - توكەلاۋ ۋاقىتى + توكەلاۋ ۋاقىتى - تونگا ۋاقىتى - تونگا ستاندارتتى ۋاقىتى - تونگا كازعى ۋاقىتى + تونگا ۋاقىتى + تونگا ستاندارتتى ۋاقىتى + تونگا كازعى ۋاقىتى - ترۋك ۋاقىتى + ترۋك ۋاقىتى - تۇرىكمەنستان ۋاقىتى - تۇرىكمەنستان ستاندارتتى ۋاقىتى - تۇرىكمەنستان جازعى ۋاقىتى + تۇرىكمەنستان ۋاقىتى + تۇرىكمەنستان ستاندارتتى ۋاقىتى + تۇرىكمەنستان جازعى ۋاقىتى - تۋۆالۋ ۋاقىتى + تۋۆالۋ ۋاقىتى - ۋرۋگۆاي ۋاقىتى - ۋرۋگۆاي ستاندارتتى ۋاقىتى - ۋرۋگۆاي جازعى ۋاقىتى + ۋرۋگۆاي ۋاقىتى + ۋرۋگۆاي ستاندارتتى ۋاقىتى + ۋرۋگۆاي جازعى ۋاقىتى - وزبەكستان ۋاقىتى - وزبەكستان ستاندارتتى ۋاقىتى - وزبەكستان جازعى ۋاقىتى + وزبەكستان ۋاقىتى + وزبەكستان ستاندارتتى ۋاقىتى + وزبەكستان جازعى ۋاقىتى - ۆانۋاتۋ ۋاقىتى - ۆانۋاتۋ ستاندارتتى ۋاقىتى - ۆانۋاتۋ جازعى ۋاقىتى + ۆانۋاتۋ ۋاقىتى + ۆانۋاتۋ ستاندارتتى ۋاقىتى + ۆانۋاتۋ جازعى ۋاقىتى - ۆەنەسۋەلا ۋاقىتى + ۆەنەسۋەلا ۋاقىتى - ۆلاديۆوستوك ۋاقىتى - ۆلاديۆوستوك ستاندارتتى ۋاقىتى - ۆلاديۆوستوك جازعى ۋاقىتى + ۆلاديۆوستوك ۋاقىتى + ۆلاديۆوستوك ستاندارتتى ۋاقىتى + ۆلاديۆوستوك جازعى ۋاقىتى - ۆولگوگراد ۋاقىتى - ۆولگوگراد ستاندارتتى ۋاقىتى - ۆولگوگراد جازعى ۋاقىتى + ۆولگوگراد ۋاقىتى + ۆولگوگراد ستاندارتتى ۋاقىتى + ۆولگوگراد جازعى ۋاقىتى - ۆوستوك ۋاقىتى + ۆوستوك ۋاقىتى - ۋەيك ارالى ۋاقىتى + ۋەيك ارالى ۋاقىتى - ۋولليس جانە فۋتۋنا ۋاقىتى + ۋولليس جانە فۋتۋنا ۋاقىتى - ياكۋتسك ۋاقىتى - ياكۋتسك ستاندارتتى ۋاقىتى - ياكۋتسك جازعى ۋاقىتى + ياكۋتسك ۋاقىتى + ياكۋتسك ستاندارتتى ۋاقىتى + ياكۋتسك جازعى ۋاقىتى - ەكاتەرينبۋرگ ۋاقىتى - ەكاتەرينبۋرگ ستاندارتتى ۋاقىتى - ەكاتەرينبۋرگ جازعى ۋاقىتى + ەكاتەرينبۋرگ ۋاقىتى + ەكاتەرينبۋرگ ستاندارتتى ۋاقىتى + ەكاتەرينبۋرگ جازعى ۋاقىتى - يۋكون ۋاقىتى + يۋكون ۋاقىتى - سان ەمەس + سان ەمەس - 0 مىڭ - 0 مىڭ - 00 مىڭ - 00 مىڭ - 000 مىڭ - 000 مىڭ - 0 ميلليون - 0 ميلليون - 00 ميلليون - 00 ميلليون - 000 ميلليون - 000 ميلليون - 0 ميلليارد - 0 ميلليارد - 00 ميلليارد - 00 ميلليارد - 000 ميلليارد - 000 ميلليارد - 0 تريلليون - 0 تريلليون - 00 تريلليون - 00 تريلليون - 000 تريلليون - 000 تريلليون + 0 مىڭ + 0 مىڭ + 00 مىڭ + 00 مىڭ + 000 مىڭ + 000 مىڭ + 0 ميلليون + 0 ميلليون + 00 ميلليون + 00 ميلليون + 000 ميلليون + 000 ميلليون + 0 ميلليارد + 0 ميلليارد + 00 ميلليارد + 00 ميلليارد + 000 ميلليارد + 000 ميلليارد + 0 تريلليون + 0 تريلليون + 00 تريلليون + 00 تريلليون + 000 تريلليون + 000 تريلليون - 0 مىڭ - 0 مىڭ - 00 مىڭ - 00 مىڭ - 000 مىڭ - 000 مىڭ - 0 ميلليون - 0 ميلليون - 00 ميلليون - 00 ميلليون - 000 ملن - 000 ملن - 0 ميلليارد - 0 ميلليارد - 00 ملرد - 00 ملرد - 000 ملرد - 000 ملرد - 0 تريلليون - 0 تريلليون - 00 ترلن - 00 ترلن - 000 ترلن - 000 ترلن + 0 مىڭ + 0 مىڭ + 00 مىڭ + 00 مىڭ + 000 مىڭ + 000 مىڭ + 0 ميلليون + 0 ميلليون + 00 ميلليون + 00 ميلليون + 000 ملن + 000 ملن + 0 ميلليارد + 0 ميلليارد + 00 ملرد + 00 ملرد + 000 ملرد + 000 ملرد + 0 تريلليون + 0 تريلليون + 00 ترلن + 00 ترلن + 000 ترلن + 000 ترلن - 0 مىڭ ¤ - 0 مىڭ ¤ - 00 مىڭ ¤ - 00 مىڭ ¤ - 000 مىڭ ¤ - 000 مىڭ ¤ - 0 ميلليون ¤ - 0 ميلليون ¤ - 00 ميلليون ¤ - 00 ميلليون ¤ - 000 ميلليون ¤ - 000 ميلليون ¤ - 0 ميلليارد ¤ - 0 ميلليارد ¤ - 00 ميلليارد ¤ - 00 ميلليارد ¤ - 000 ميلليارد ¤ - 000 ميلليارد ¤ - 0 تريلليون ¤ - 0 تريلليون ¤ - 00 تريلليون ¤ - 00 تريلليون ¤ - 000 تريلليون ¤ - 000 تريلليون ¤ + ¤ 0 مىڭ + ¤ 0 مىڭ + ¤ 00 مىڭ + ¤ 00 مىڭ + ¤ 000 مىڭ + ¤ 000 مىڭ + ¤ 0 ميلليون + ¤ 0 ميلليون + ¤ 00 ميلليون + ¤ 00 ميلليون + ¤ 000 ملن + ¤ 000 ملن + ¤ 0 ميلليارد + ¤ 0 ميلليارد + ¤ 00 ملرد + ¤ 00 ملرد + ¤ 000 ملرد + ¤ 000 ملرد + ¤ 0 تريلليون + ¤ 0 تريلليون + ¤ 00 ترلن + ¤ 00 ترلن + ¤ 000 ترلن + ¤ 000 ترلن - بىرىككەن اراب امىرلىكتەرىنىڭ ديرحامى - ب ا ءا ديرحامى - ب ا ءا ديرحامى + بىرىككەن اراب امىرلىكتەرىنىڭ ديرحامى + ب ا ءا ديرحامى + ب ا ءا ديرحامى - اۋعانستان افگانيى - اۋعانستان افگانيى - اۋعانستان افگانيى + اۋعانستان افگانيى - البانيا لەگى - البانيا لەگى - البانيا لەگى + البانيا لەگى - ارمەنيا درامى - ارمەنيا درامى - ارمەنيا درامى + ارمەنيا درامى - نيدەرلاند انتيل گۋلدەنى - نيدەرلاند انتيل گۋلدەنى - نيدەرلاند انتيل گۋلدەنى + نيدەرلاند انتيل گۋلدەنى - انگولا كۆانزاسى - انگولا كۆانزاسى - انگولا كۆانزاسى + انگولا كۆانزاسى - ارگەنتينا پەسوسى - ارگەنتينا پەسوسى - ارگەنتينا پەسوسى + ارگەنتينا پەسوسى - اۋستراليا دوللارى - اۋستراليا دوللارى - اۋستراليا دوللارى + اۋستراليا دوللارى - ارۋبا فلورينى - ارۋبا فلورينى - ارۋبا فلورينى + ارۋبا فلورينى - ءازىربايجان ماناتى - ءازىربايجان ماناتى - ءازىربايجان ماناتى + ءازىربايجان ماناتى - بوسنيا جانە گەرتسەگوۆينا ايىرباستالمالى ماركاسى - بوسنيا جانە گەرتسەگوۆينا ايىرباستالمالى ماركاسى - بوسنيا جانە گەرتسەگوۆينا ايىرباستالمالى ماركاسى + بوسنيا جانە گەرتسەگوۆينا ايىرباستالمالى ماركاسى - باربادوس دوللارى - باربادوس دوللارى - باربادوس دوللارى + باربادوس دوللارى - بانگلادەش تاكاسى - بانگلادەش تاكاسى - بانگلادەش تاكاسى + بانگلادەش تاكاسى - ڭولگاريا لەۆى - ڭولگاريا لەۆى - ڭولگاريا لەۆى + ڭولگاريا لەۆى - باحرەين دينارى - باحرەين دينارى - باحرەين دينارى + باحرەين دينارى - بۋرۋندي فرانكى - بۋرۋندي فرانكى - بۋرۋندي فرانكى + بۋرۋندي فرانكى - بەرمۋد دوللارى - بەرمۋد دوللارى - بەرمۋد دوللارى + بەرمۋد دوللارى - برۋنەي دوللارى - برۋنەي دوللارى - برۋنەي دوللارى + برۋنەي دوللارى - بوليۆيا بوليۆيانوسى - بوليۆيا بوليۆيانوسى - بوليۆيا بوليۆيانوسى + بوليۆيا بوليۆيانوسى - برازيليا رەالى - برازيليا رەالى - برازيليا رەالى + برازيليا رەالى - باگام دوللارى - باگام دوللارى - باگام دوللارى + باگام دوللارى - بۋتان نگۋلترۋمى - بۋتان نگۋلترۋمى - بۋتان نگۋلترۋمى + بۋتان نگۋلترۋمى - بوتسۆانا پۋلاسى - بوتسۆانا پۋلاسى - بوتسۆانا پۋلاسى + بوتسۆانا پۋلاسى - بەلارۋس رۋبىلى - بەلارۋس رۋبىلى - بەلارۋس رۋبىلى + بەلارۋس رۋبىلى - بەليز دوللارى - بەليز دوللارى - بەليز دوللارى + بەليز دوللارى - كانادا دوللارى - كانادا دوللارى - كانادا دوللارى + كانادا دوللارى - كونگو فرانكى - كونگو فرانكى - كونگو فرانكى + كونگو فرانكى - شۆەيساريا فرانكى - شۆەيساريا فرانكى - شۆەيساريا فرانكى + شۆەيساريا فرانكى - چيلي پەسوسى - چيلي پەسوسى - چيلي پەسوسى + چيلي پەسوسى - قىتاي يۋانى (وفشور) - قىتاي يۋانى (وفشور) - قىتاي يۋانى (وفشور) + قىتاي يۋانى (وفشور) - قىتاي يۋانى - قىتاي يۋانى - قىتاي يۋانى + قىتاي يۋانى - كولۋمبيا پەسوسى - كولۋمبيا پەسوسى - كولۋمبيا پەسوسى + كولۋمبيا پەسوسى - كوستا-ريكا كولونى - كوستا-ريكا كولونى - كوستا-ريكا كولونى + كوستا-ريكا كولونى - كۋبا ايىرباستالمالى پەسوسى - كۋبا ايىرباستالمالى پەسوسى - كۋبا ايىرباستالمالى پەسوسى + كۋبا ايىرباستالمالى پەسوسى - كۋبا پەسوسى - كۋبا پەسوسى - كۋبا پەسوسى + كۋبا پەسوسى - كابو-ۆەردە ەسكۋدوسى - كابو-ۆەردە ەسكۋدوسى - كابو-ۆەردە ەسكۋدوسى + كابو-ۆەردە ەسكۋدوسى - چەح كرونى - چەح كرونى - چەح كرونى + چەح كرونى - جيبۋتي فرانكى - جيبۋتي فرانكى - جيبۋتي فرانكى + جيبۋتي فرانكى - دار كرونى - دار كرونى - دار كرونى + دار كرونى - دومينيكان پەسوسى - دومينيكان پەسوسى - دومينيكان پەسوسى + دومينيكان پەسوسى - الجير دينارى - الجير دينارى - الجير دينارى + الجير دينارى - مىسىر فۋنتى - مىسىر فۋنتى - مىسىر فۋنتى + مىسىر فۋنتى - ەريترەيا ناكفاس - ەريترەيا ناكفاس - ەريترەيا ناكفاس + ەريترەيا ناكفاس - ەفيوپيا بىرى - ەفيوپيا بىرى - ەفيوپيا بىرى + ەفيوپيا بىرى - ەۋرو - ەۋرو - ەۋرو + ەۋرو - فيجي دوللارى - فيجي دوللارى - فيجي دوللارى + فيجي دوللارى - فولكلەند ارالدارىنىڭ فۋنتى - فولكلەند ارالدارىنىڭ فۋنتى - فولكلەند ارالدارىنىڭ فۋنتى + فولكلەند ارالدارىنىڭ فۋنتى - بريتاندىق فۋنت - بريتاندىق فۋنت - بريتاندىق فۋنت + بريتاندىق فۋنت - گرۋزيا لاريى - گرۋزيا لاريى - گرۋزيا لاريى + گرۋزيا لاريى - گانا سەديى - گانا سەديى - گانا سەديى + گانا سەديى - گيبراتال فۋنتى - گيبراتال فۋنتى - گيبراتال فۋنتى + گيبراتال فۋنتى - گامبيا دالاسيى - گامبيا دالاسيى - گامبيا دالاسيى + گامبيا دالاسيى - گۆينەيا فرانكى - گۆينەيا فرانكى - گۆينەيا فرانكى + گۆينەيا فرانكى - گۆاتەمالا كەتسالى - گۆاتەمالا كەتسالى - گۆاتەمالا كەتسالى + گۆاتەمالا كەتسالى - گايانا دوللارى - گايانا دوللارى - گايانا دوللارى + گايانا دوللارى - حوڭكوڭ دوللارى - حوڭكوڭ دوللارى - حوڭكوڭ دوللارى + حوڭكوڭ دوللارى - گوندۋراس ليمپيراسى - گوندۋراس ليمپيراسى - گوندۋراس ليمپيراسى + گوندۋراس ليمپيراسى - حورۆاتيا كۋناسى - حورۆاتيا كۋناسى - حورۆاتيا كۋناسى + حورۆاتيا كۋناسى - گايتي گۋردى - گايتي گۋردى - گايتي گۋردى + گايتي گۋردى - ماجار فورينتى - ماجار فورينتى - ماجار فورينتى + ماجار فورينتى - يندونەزيا رۋپياسى - يندونەزيا رۋپياسى - يندونەزيا رۋپياسى + يندونەزيا رۋپياسى - يزرايل جاڭا شەكەلى - يزرايل جاڭا شەكەلى - يزرايل جاڭا شەكەلى + يزرايل جاڭا شەكەلى - ءۇندىستان رۋپياسى - ءۇندىستان رۋپياسى - ءۇندىستان رۋپياسى + ءۇندىستان رۋپياسى - يراك دينارى - يراك دينارى - يراك دينارى + يراك دينارى - يران ريالى - يران ريالى - يران ريالى + يران ريالى - يسلانديا كروناسى - يسلانديا كروناسى - يسلانديا كروناسى + يسلانديا كروناسى - يامايكا دوللارى - يامايكا دوللارى - يامايكا دوللارى + يامايكا دوللارى - يوردانيا دينارى - يوردانيا دينارى - يوردانيا دينارى + يوردانيا دينارى - جاپون يەناسى - جاپون يەناسى - جاپون يەناسى + جاپون يەناسى - Vote كەنيا شيللينگى - Vote كەنيا شيللينگى - Vote كەنيا شيللينگى + كەنيا شيللينگى + كەنيا شيللينگى + كەنيا شيللينگى - قىرعىس سومى - قىرعىس سومى - قىرعىس سومى + قىرعىس سومى - كامبودجا ريەلى - كامبودجا ريەلى - كامبودجا ريەلى + كامبودجا ريەلى - كومور ارالدارى فرانكى - كومور ارالدارى فرانكى - كومور ارالدارى فرانكى + كومور ارالدارى فرانكى - سولتۇستىك كورەيا ۆونى - سولتۇستىك كورەيا ۆونى - سولتۇستىك كورەيا ۆونى + سولتۇستىك كورەيا ۆونى - وڭتۇستىك كورەيا ۆونى - وڭتۇستىك كورەيا ۆونى - وڭتۇستىك كورەيا ۆونى + وڭتۇستىك كورەيا ۆونى - كۋۆەيت دينارى - كۋۆەيت دينارى - كۋۆەيت دينارى + كۋۆەيت دينارى - كايمان ارالدارى دوللارى - كايمان ارالدارى دوللارى - كايمان ارالدارى دوللارى + كايمان ارالدارى دوللارى - قازاق تەڭگەسى - قازاق تەڭگەسى - قازاق تەڭگەسى - + قازاق تەڭگەسى + - لاوس كيپى - لاوس كيپى - لاوس كيپى + لاوس كيپى - ليۆان فۋنتى - ليۆان فۋنتى - ليۆان فۋنتى + ليۆان فۋنتى - شري-لانكا رۋپياسى - شري-لانكا رۋپياسى - شري-لانكا رۋپياسى + شري-لانكا رۋپياسى - ليبەريا دوللارى - ليبەريا دوللارى - ليبەريا دوللارى + ليبەريا دوللارى - لەسوتو ءلوتيى - لەسوتو ءلوتيى - لەسوتو ءلوتيى + لەسوتو ءلوتيى - ليۆيا دينارى - ليۆيا دينارى - ليۆيا دينارى + ليۆيا دينارى - ماروككو دينارى - ماروككو دينارى - ماروككو دينارى + ماروككو دينارى - مولدوۆا لەيى - مولدوۆا لەيى - مولدوۆا لەيى + مولدوۆا لەيى - مالاگاسي ءارياريى - مالاگاسي ءارياريى - مالاگاسي ءارياريى + مالاگاسي ءارياريى - ماكەدونيا دينارى - ماكەدونيا دينارى - ماكەدونيا دينارى + ماكەدونيا دينارى - ميانما كياتى - ميانما كياتى - ميانما كياتى + ميانما كياتى - موڭعوليا تۋگريكى - موڭعوليا تۋگريكى - موڭعوليا تۋگريكى + موڭعوليا تۋگريكى - ماكاو پاتاكاسى - ماكاو پاتاكاسى - ماكاو پاتاكاسى + ماكاو پاتاكاسى - ماۆريتانيا ۋگياسى - ماۆريتانيا ۋگياسى - ماۆريتانيا ۋگياسى + ماۆريتانيا ۋگياسى - ماۆريكيي رۋپياسى - ماۆريكيي رۋپياسى - ماۆريكيي رۋپياسى + ماۆريكيي رۋپياسى - مالديۆ رۋفياسى - مالديۆ رۋفياسى - مالديۆ رۋفياسى + مالديۆ رۋفياسى - مالاۆي كۆاچاسى - مالاۆي كۆاچاسى - مالاۆي كۆاچاسى + مالاۆي كۆاچاسى - مەكسيكا پەسوسى - مەكسيكا پەسوسى - مەكسيكا پەسوسى + مەكسيكا پەسوسى - مالايزيا رينگگيتى - مالايزيا رينگگيتى - مالايزيا رينگگيتى + مالايزيا رينگگيتى - موزامبيك مەتيكالى - موزامبيك مەتيكالى - موزامبيك مەتيكالى + موزامبيك مەتيكالى - ناميبيا دوللارى - ناميبيا دوللارى - ناميبيا دوللارى + ناميبيا دوللارى - نيگەريا نايراسى - نيگەريا نايراسى - نيگەريا نايراسى + نيگەريا نايراسى - نيكاراگۋا كوردوباسى - نيكاراگۋا كوردوباسى - نيكاراگۋا كوردوباسى + نيكاراگۋا كوردوباسى - نورۆەگيا كرونى - نورۆەگيا كرونى - نورۆەگيا كرونى + نورۆەگيا كرونى - نەپال رۋپياسى - نەپال رۋپياسى - نەپال رۋپياسى + نەپال رۋپياسى - جاڭا زەلانديا دوللارى - جاڭا زەلانديا دوللارى - جاڭا زەلانديا دوللارى + جاڭا زەلانديا دوللارى - ومان ريالى - ومان ريالى - ومان ريالى + ومان ريالى - پاناما بالبواسى - پاناما بالبواسى - پاناما بالبواسى + پاناما بالبواسى - پەرۋ سولى - پەرۋ سولى - پەرۋ سولى + پەرۋ سولى - پاپۋا - جاڭا گۆينەيا كيناسى - پاپۋا - جاڭا گۆينەيا كيناسى - پاپۋا - جاڭا گۆينەيا كيناسى + پاپۋا - جاڭا گۆينەيا كيناسى - فيليپپين پەسوسى - فيليپپين پەسوسى - فيليپپين پەسوسى + فيليپپين پەسوسى - پاكىستان رۋپياسى - پاكىستان رۋپياسى - پاكىستان رۋپياسى + پاكىستان رۋپياسى - پولشا زلوتىسى - پولشا زلوتىسى - پولشا زلوتىسى + پولشا زلوتىسى - پاراگۆاي گۋارانيى - پاراگۆاي گۋارانيى - پاراگۆاي گۋارانيى + پاراگۆاي گۋارانيى - كاتار ريالى - كاتار ريالى - كاتار ريالى + كاتار ريالى - رۋمىنيا لەيى - رۋمىنيا لەيى - رۋمىنيا لەيى + رۋمىنيا لەيى - سەربيا دينارى - سەربيا دينارى - سەربيا دينارى + سەربيا دينارى - رەسەي رۋبىلى - رەسەي رۋبىلى - رەسەي رۋبىلى + رەسەي رۋبىلى - رۋاندا فرانكى - رۋاندا فرانكى - رۋاندا فرانكى + رۋاندا فرانكى - ساۋد ارابياسىنىڭ ريالى - ساۋد ارابياسىنىڭ ريالى - ساۋد ارابياسىنىڭ ريالى + ساۋد ارابياسىنىڭ ريالى - سولومون ارالدارى دوللارى - سولومون ارالدارى دوللارى - سولومون ارالدارى دوللارى + سولومون ارالدارى دوللارى - سەيشەل رۋپياسى - سەيشەل رۋپياسى - سەيشەل رۋپياسى + سەيشەل رۋپياسى - سۋدان فۋنتى - سۋدان فۋنتى - سۋدان فۋنتى + سۋدان فۋنتى - شۆەسيا كرونى - شۆەسيا كرونى - شۆەسيا كرونى + شۆەسيا كرونى - سينگاپۋر دوللارى - سينگاپۋر دوللارى - سينگاپۋر دوللارى + سينگاپۋر دوللارى - اۋليە ەلەنا ارالى فۋنتى - اۋليە ەلەنا ارالى فۋنتى - اۋليە ەلەنا ارالى فۋنتى + اۋليە ەلەنا ارالى فۋنتى - سەررا-لەونە لەونەسى - سەررا-لەونە لەونەسى - سەررا-لەونە لەونەسى + سەررا-لەونە لەونەسى - سەررا-لەونە لەونەسى (1964—2022) - سەررا-لەونە لەونەسى (1964—2022) - سەررا-لەونە لەونەسى (1964—2022) + سەررا-لەونە لەونەسى (1964—2022) - سومالي شيللينگى - سومالي شيللينگى - سومالي شيللينگى + سومالي شيللينگى - سۋرينام دوللارى - سۋرينام دوللارى - سۋرينام دوللارى + سۋرينام دوللارى - وڭتۇستىك سۋدان فۋنتى - وڭتۇستىك سۋدان فۋنتى - وڭتۇستىك سۋدان فۋنتى + وڭتۇستىك سۋدان فۋنتى - سانت-تومە مەن پرينسيپي دوبراسى - سانت-تومە مەن پرينسيپي دوبراسى - سانت-تومە مەن پرينسيپي دوبراسى + سانت-تومە مەن پرينسيپي دوبراسى - سيريا فۋنتى - سيريا فۋنتى - سيريا فۋنتى + سيريا فۋنتى - سۆازيلەند ليلانگەنيى - سۆازيلەند ليلانگەنيى - سۆازيلەند ليلانگەنيى + سۆازيلەند ليلانگەنيى - تاي باتى - تاي باتى - تاي باتى + تاي باتى - تاجىك سومونيى - تاجىك سومونيى - تاجىك سومونيى + تاجىك سومونيى - تۇىكمەن ماناتى - تۇىكمەن ماناتى - تۇىكمەن ماناتى + تۇىكمەن ماناتى - تۋنيس دينارى - تۋنيس دينارى - تۋنيس دينارى + تۋنيس دينارى - تونگا پاانگاسى - تونگا پاانگاسى - تونگا پاانگاسى + تونگا پاانگاسى - تۇرىك ليراسى - تۇرىك ليراسى - تۇرىك ليراسى + تۇرىك ليراسى - ترينيداد جانە توباگو دوللارى - ترينيداد جانە توباگو دوللارى - ترينيداد جانە توباگو دوللارى + ترينيداد جانە توباگو دوللارى - جاڭا تايبەي دوللارى - جاڭا تايبەي دوللارى - جاڭا تايبەي دوللارى + جاڭا تايبەي دوللارى - تانزانيا شيللينگى - تانزانيا شيللينگى - تانزانيا شيللينگى + تانزانيا شيللينگى - ۋكراينا گريۆناسى - ۋكراينا گريۆناسى - ۋكراينا گريۆناسى + ۋكراينا گريۆناسى - ۋگاندا شيللينگى - ۋگاندا شيللينگى - ۋگاندا شيللينگى + ۋگاندا شيللينگى - ا ق ش دوللارى - ا ق ش دوللارى - ا ق ش دوللارى + ا ق ش دوللارى - ۋرۋگۆاي پەسوسى - ۋرۋگۆاي پەسوسى - ۋرۋگۆاي پەسوسى + ۋرۋگۆاي پەسوسى - وزبەك سومى - وزبەك سومى - وزبەك سومى + وزبەك سومى - ۆەنەسۋەلا بوليۆارى - ۆەنەسۋەلا بوليۆارى - ۆەنەسۋەلا بوليۆارى + ۆەنەسۋەلا بوليۆارى - ۆەتنام دونگى - ۆەتنام دونگى - ۆەتنام دونگى + ۆەتنام دونگى - ۆانۋاتۋ ۆاتۋى - ۆانۋاتۋ ۆاتۋى - ۆانۋاتۋ ۆاتۋى + ۆانۋاتۋ ۆاتۋى - ساموا تالاسى - ساموا تالاسى - ساموا تالاسى + ساموا تالاسى - ورتالىق افريكانىڭ فرانكى - ورتالىق افريكانىڭ فرانكى - ورتالىق افريكانىڭ فرانكى + ورتالىق افريكانىڭ فرانكى - شىعىس كاريب دوللارى - شىعىس كاريب دوللارى - شىعىس كاريب دوللارى + شىعىس كاريب دوللارى + + + كاريب گۋلدەرى + كاريب گۋلدەرى + كاريب گۋلدەرى - باتىس افريكانىڭ فرانكى - باتىس افريكانىڭ فرانكى - باتىس افريكانىڭ فرانكى + باتىس افريكانىڭ فرانكى - فرانسۋز پولينەزيا فرانكى - فرانسۋز پولينەزيا فرانكى - فرانسۋز پولينەزيا فرانكى + فرانسۋز پولينەزيا فرانكى - بەلگىسىز اقشا - (بەلگىسىز اقشا بىرلىگى) - (بەلگىسىز اقشا) + بەلگىسىز اقشا + (بەلگىسىز اقشا) + (بەلگىسىز اقشا) - يەمەن ريالى - يەمەن ريالى - يەمەن ريالى + يەمەن ريالى - وڭتۇستىك افريكا ءرەندى - وڭتۇستىك افريكا ءرەندى - وڭتۇستىك افريكا ءرەندى + وڭتۇستىك افريكا ءرەندى - زامبيا كۆاچاسى - زامبيا كۆاچاسى - زامبيا كۆاچاسى + زامبيا كۆاچاسى + + + زيمباب التىنى + زيمباب التىنى + زيمباب التىنى - ناۋرىزعا {0} كۇن قالدي. - ناۋرىز مەيرامىنا {0} كۇن قالدى. - مۇرات {0}- سىنىپقا كوشتى. + {0} كۇن + {0} كۇن + مۇرات {0}- سىنىپقا كوشتى. - دەسي{0} + دەسي{0} - سانتي{0} + سانتي{0} - ميلي{0} + ميلي{0} - ميكرو{0} + ميكرو{0} - نانو{0} + نانو{0} - پيكو{0} + پيكو{0} - فەمتو{0} + فەمتو{0} - اتتو{0} + اتتو{0} - زەپتو{0} + زەپتو{0} - يوكتو{0} + يوكتو{0} - رونتو{0} + رونتو{0} - كۆەكتو{0} + كۆەكتو{0} - دەكا{0} + دەكا{0} - گەكتو{0} + گەكتو{0} - كيلو{0} + كيلو{0} - مەگا{0} + مەگا{0} - گيگا{0} + گيگا{0} - تەرا{0} + تەرا{0} - پەتا{0} + پەتا{0} - ەكسا{0} + ەكسا{0} - زەتا{0} + زەتا{0} - يوتا{0} + يوتا{0} - رونا{0} + رونا{0} - كۋەتا{0} + كۋەتا{0} - كيبي{0} + كيبي{0} - مەبي{0} + مەبي{0} - گيبي{0} + گيبي{0} - تەبي{0} + تەبي{0} - پەبي{0} + پەبي{0} - ەكسبي{0} + ەكسبي{0} - زەبي{0} + زەبي{0} - يوبي{0} + يوبي{0} - شارشى {0} - شارشى {0} + شارشى {0} + شارشى {0} - تەكشە {0} - تەكشە {0} + تەكشە {0} + تەكشە {0} - - تارتىلىس كۇشى - {0} تارتىلىس كۇشى - {0} تارتىلىس كۇشى - - - مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند - - - اينالىم - {0} اينالىم - {0} اينالىم - - - راديان - {0} راديان - {0} راديان - - - گرادۋس - {0} گرادۋس - {0} گرادۋس - - - اركمينۋت - {0} اركمينۋت - {0} اركمينۋت - - - اركسەكۋند - {0} اركسەكۋند - {0} اركسەكۋند - - - شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - - - گەكتار - {0} گەكتار - {0} گەكتار - - - شارشى مەتىر - {0} شارشى مەتىر - {0} شارشى مەتىر - {0}/شارشى مەتىر - - - شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0}/شارشى سانتيمەتىر - - - شارشى ميل - {0} شارشى ميل - {0} شارشى ميل - {0}/شارشى ميل - - - اكر - {0} اكر - {0} اكر - - - شارشى يارد - {0} شارشى يارد - {0} شارشى يارد - - - شارشى فۋت - {0} شارشى فۋت - {0} شارشى فۋت - - - شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم - - - دۋنام - {0} دۋنام - {0} دۋنام - - - كارات - {0} كارات - {0} كارات - - ميليگرام/دەسيليتىر - {0} ميليگرام/دەسيمەتىر - {0} ميليگرام/دەسيمەتىر + {0} ميليگرام/دەسيمەتىر + {0} ميليگرام/دەسيمەتىر - ميليمول/ليتىر - {0} ميليمول/ليتىر - {0} ميليمول/ليتىر + {0} ميليمول/ليتىر + {0} ميليمول/ليتىر - - ەلەمەنت - {0} ەلەمەنت - {0} ەلەمەنت + + بولىك + {0} بولىك + {0} بولىك - - ميلليوندىق ۇلەس - {0} ميلليوندىق ۇلەس - {0} ميلليوندىق ۇلەس + + {0} ميلليوندىق ۇلەس + {0} ميلليوندىق ۇلەس - پايىز - {0} پايىز - {0} پايىز + {0} پايىز + {0} پايىز - پروميللە - {0} پروميللە - {0} پروميللە + {0} پروميللە + {0} پروميللە - پروميرياد - {0} پروميرياد - {0} پروميرياد + {0} پروميرياد + {0} پروميرياد - - مول - {0} مول - {0} مول + + گليۋكوزا + {0} گليۋكوزا + {0} گليۋكوزا - ليتىر/كيلومەتىر - {0} ليتىر/كيلومەتىر - {0} ليتىر/كيلومەتىر + {0} ليتىر/كيلومەتىر + {0} ليتىر/كيلومەتىر - ليتىر/100 كيلومەتىر - {0} ليتىر/100 كيلومەتىر - {0} ليتىر/100 كيلومەتىر - - - ميل/گاللون - {0} ميل/گاللون - {0} ميل/گاللون - - - ميل/يمپ گاللون - {0} ميل/يمپ گاللون - {0} ميل/يمپ گاللون + {0} ليتىر/100 كيلومەتىر + {0} ليتىر/100 كيلومەتىر - پەتابايت - {0} پەتابايت - {0} پەتابايت + {0} پەتابايت + {0} پەتابايت - تەرابايت - {0} تەرابايت - {0} تەرابايت + {0} تەرابايت + {0} تەرابايت - تەرابيت - {0} تەرابيت - {0} تەرابيت + {0} تەرابيت + {0} تەرابيت - گيگابايت - {0} گيگابايت - {0} گيگابايت + {0} گيگابايت + {0} گيگابايت - گيگابيت - {0} گيگابيت - {0} گيگابيت + {0} گيگابيت + {0} گيگابيت - مەگابايت - {0} مەگابايت - {0} مەگابايت + {0} مەگابايت + {0} مەگابايت - مەگابيت - {0} مەگابيت - {0} مەگابيت + {0} مەگابيت + {0} مەگابيت - كيلوبايت - {0} كيلوبايت - {0} كيلوبايت + {0} كيلوبايت + {0} كيلوبايت - كيلوبيت - {0} كيلوبيت - {0} كيلوبيت + {0} كيلوبيت + {0} كيلوبيت - بايت - {0} بايت - {0} بايت + {0} بايت + {0} بايت - بيت - {0} بيت - {0} بيت - - - عاسىر - {0} عاسىر - {0} عاسىر - - - ون جىلدىق - {0} ون جىلدىق - {0} ون جىلدىق - - - جىل - {0} جىل - {0} جىل - جىلىنا {0} - - - توقسان - {0} توقسان - {0} توقسان - {0}/توقسان + {0} بيت + {0} بيت - اي - {0} اي - {0} اي - ايىنا {0} + ايىنا {0} - اپتا - {0} اپتا - {0} اپتا - اپتاسىنا {0} + اپتاسىنا {0} - كۇن - {0} كۇن - {0} كۇن - كۇنىنە {0} + كۇنىنە {0} - ساعات - {0} ساعات - {0} ساعات - ساعاتىنا {0} + ساعاتىنا {0} - مينۋت - {0} مينۋت - {0} مينۋت - مينۋتىنا {0} + مينۋتىنا {0} - سەكۋند - {0} سەكۋند - {0} سەكۋند - سەكۋندىنا {0} - - - ميليسەكۋند - {0} ميليسەكۋند - {0} ميليسەكۋند - - - ميكروسەكۋند - {0} ميكروسەكۋند - {0} ميكروسەكۋند - - - نانوسەكۋند - {0} نانوسەكۋند - {0} نانوسەكۋند - - - امپەر - {0} امپەر - {0} امپەر - - - ميليامپەر - {0} ميليامپەر - {0} ميليامپەر - - - وم - {0} وم - {0} وم - - - ۆولت - {0} ۆولت - {0} ۆولت - - - كيلوكالوريا - {0} كيلوكالوريا - {0} كيلوكالوريا - - - كالوريا - {0} كالوريا - {0} كالوريا - - - كيلوجوۋل - {0} كىلوجوۋل - {0} كىلوجوۋل - - - جوۋل - {0} جوۋل - {0} جوۋل - - - كيلوۆات-ساعات - {0} كيلوۆات-ساعات - {0} كيلوۆات-ساعات - - - ەلەكتونۆولت - {0} ەلەكترونۆولت - {0} ەلەكترونۆولت - - - بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى - - - ا ق ش تەرمى - {0} ا ق ش تەرمى - {0} ا ق ش تەرمى - - - فۋنت-كۇش - {0} فۋنت-كۇش - {0} فۋنت-كۇش + سەكۋندىنا {0} - نيۋتون - {0} نيۋتون - {0} نيۋتون + {0} نيۋتون + {0} نيۋتون - كيلوۆات-ساعات/100 كيلومەتىر - {0} كيلوۆات-ساعات/100 كيلومەتىر - {0} كيلوۆات-ساعات/100 كيلومەتىر - - - گيگاگەرس - {0} گيگاگەرس - {0} گيگاگەرس - - - مەگاگەرس - {0} مەگاگەرس - {0} مەگاگەرس - - - كيلوگەرس - {0} كيلوگەرس - {0} كيلوگەرس - - - گەرس - {0} گەرس - {0} گەرس + {0} كيلوۆات-ساعات/100 كيلومەتىر + {0} كيلوۆات-ساعات/100 كيلومەتىر - باسپالىق em + باسپالىق em - پيكسەل + پيكسەل - مەگاپيكسەل + مەگاپيكسەل - پيكسەل/سانتيمەتىر + پيكسەل/سانتيمەتىر - پيكسەل/ديۋيم - - - جەر راديۋسى - {0} جەر راديۋسى - {0} جەر راديۋسى - - - كيلومەتىر - {0} كيلومەتىر - {0} كيلومەتىر - {0}/كيلومەتىر - - - مەتىر - {0}/مەتىر - {0}/مەتىر - {0}/مەتىر - - - دەسيمەتىر - {0}/دەسيمەتىر - {0}/دەسيمەتىر - - - سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر - - - ميليمەتىر - {0} ميليمەتىر - {0} ميليمەتىر - - - ميكرومەتىر - {0} ميكرومەتىر - {0} ميكرومەتىر - - - نانومەتىر - {0} نانومەتىر - {0} نانومەتىر - - - پيكومەتىر - {0} پيكومەتىر - {0} پيكومەتىر - - - ميل - {0} ميل - {0} ميل - - - يارد - {0} يارد - {0} يارد - - - فۋت - {0}/فۋت - {0}/فۋت - {0}/فۋت - - - ديۋيم - {0} ديۋيم - {0} ديۋيم - {0}/ديۋيم - - - پارسەك - {0} پارسەك - {0} پارسەك - - - جارىق جىلى - {0} جارىق جىلى - {0} جارىق جىلى - - - استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك - - - فۋرلوڭ - {0} فۋرلوڭ - {0} فۋرلوڭ - - - فاتوم - {0} فاتوم - {0} فاتوم - - - تەڭىز ميلى - {0} تەڭىز ميلى - {0} تەڭىز ميلى - - - سكانديناۆيالىق ميل - {0} سكانديناۆيالىق ميلى - {0} سكانديناۆيالىق ميلى - - - پۋنكت - {0} پۋنكت - {0} پۋنكت - - - كۇن راديۋسى - {0} كۇن راديۋسى - {0} كۇن راديۋسى + پيكسەل/ديۋيم - ليۋكس - {0} ليۋكس - {0} ليۋكس + {0} ليۋكس + {0} ليۋكس - كاندەلا - {0} كاندەلا - {0} كاندەلا + {0} كاندەلا + {0} كاندەلا - ليۋمەن - {0} ليۋمەن - {0} ليۋمەن - - - كۇن جارىقتىعى - {0} كۇن جارىقتىعى - {0} كۇن جارىقتىعى + {0} ليۋمەن + {0} ليۋمەن - مەتىرلىك توننا - {0} مەتىرلىك توننا - {0} مەتىرلىك توننا - - - كيلوگرام - {0} كيلوگرام - {0} كيلوگرام - {0}/كيلوگرام + {0} مەتىرلىك توننا + {0} مەتىرلىك توننا - گرام - {0} گرام - {0} گرام - {0}/گرام - - - ميليگرام - {0} ميليگرام - {0} ميليگرام - - - ميكروگرام - {0} ميكروگرام - {0} ميكروگرام - - - توننا - {0} تن - {0} تن - - - ستوۋن - {0} ستوۋن - {0} ستوۋن + {0}/g - فۋنت - {0} فۋنت - {0} فۋنت - {0}/فۋنت + lb - - ۋنسيا - {0} ۋنسيا - {0} ۋنسيا - {0}/ۋنسيا - - - تروي ۋنسياسى - {0} تروۋ ۋنسياسى - {0} تروۋ ۋنسياسى - - - كارات - {0} كارات - {0} كارات - - - دالتون - {0} دالتون - {0} دالتون - - - جەر ماسساسى - {0} جەر ماسساسى - {0} جەر ماسساسى - - - كۇن ماسساسى - {0} كۇن ماسساسى - {0} كۇن ماسساسى - - - گران - {0} گران - {0} گران - - - گيگاۆات - {0} گيگاۆات - {0} گيگاۆات - - - مەگاۆات - {0} مەگاۆات - {0} مەگاۆات - - - كيلوۆات - {0} كيلوۆات - {0} كيلوۆات - - - ۆات - {0} ۆات - {0} ۆات - - - ميليۆات - {0} ميليۆات - {0} ميليۆات - - - ات كۇشى - {0} ات كۇشى - {0} ات كۇشى - - - ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى - - - فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم - - - ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى - - - بار - {0} بار - {0} بار - - - ميليبار - {0} ميليبار - {0} ميليبار - - - اتموسفەرا - {0} اتموسفەرا - {0} اتموسفەرا - - - پاسكال - {0} پاسكال - {0} پاسكال - - - گەكتوپاسكال - {0} گەكتوپاسكال - {0} گەكتوپاسكال - - - كيلوپاسكال - {0} كيلوپاسكال - {0} كيلوپاسكال - - - مەگاپاسكال - {0} مەگاپاسكال - {0} مەگاپاسكال - - - كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات - - - مەتىر/سەكۋند - {0} مەتىر/سەكۋند - {0} مەتىر/سەكۋند - - - ميل/ساعات - {0} ميل/ساعات - {0} ميل/ساعات - - - ءتۇيىن - {0} ءتۇيىن - {0} ءتۇيىن - - - بوفورت - {0} بوفورت - {0} بوفورت + + مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى - تەمپەراتۋرا گرادۋسى - {0} گرادۋس - {0} گرادۋس + تەمپەراتۋرا گرادۋسى + {0} گرادۋس + {0} گرادۋس - سەلسي گرادۋسى - {0} سەلسي گرادۋسى - {0} سەلسي گرادۋسى + {0} سەلسي گرادۋسى + {0} سەلسي گرادۋسى - فارانگەيت گرادۋسى - {0} فارانگەيت گرادۋسى - {0} فارانگەيت گرادۋسى + {0} فارانگەيت گرادۋسى + {0} فارانگەيت گرادۋسى - كەلۆين - {0} كەلۆين - {0} كەلۆين - - - فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت + {0} كەلۆين + {0} كەلۆين - نيۋتون-مەتىر - {0} نيۋتون-مەتىر - {0} نيۋتون-مەتىر + {0} نيۋتون-مەتىر + {0} نيۋتون-مەتىر - - تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر - - - تەكشە مەتىر - {0} تەكشە مەتىر - {0} تەكشە مەتىر - {0}/تەكشە مەتىر - - - تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0}/تەكشە سانتيمەتىر - - - تەكشە ميل - {0} تەكشە ميل - {0} تەكشە ميل - - - تەكشە يارد - {0} تەكشە يارد - {0} تەكشە يارد - - - تەكشە فۋت - {0} تەكشە فۋت - {0} تەكشە فۋت - - - تەكشە ديۋيم - {0} تەكشە ديۋيم - {0} تەكشە ديۋيم - - - مەگاليتر - {0} مەگاليتر - {0} مەگاليتر - - - گەكتوليتىر - {0} گەكتوليرىر - {0} گەكتوليرىر - - - ليتىر - {0} ليتىر - {0} ليتىر - {0}/ليتىر - - - دەسيليتىر - {0} دەسيليتىر - {0} دەسيليتىر - - - سانتيليتىر - {0} سانتيليتىر - {0} سانتيليتىر - - - ميليليتىر - {0} ميليليتىر - {0} ميليليتىر - - - مەتىرلىك پينتا - {0} مەتىرلىك پينتا - {0} مەتىرلىك پينتا - - - مەتىرلىك كەسە - {0} مەتىرلىك كەسە - {0} مەتىرلىك كەسە - - - اكر-فۋت - {0} اكر-فۋت - {0} اكر-فۋت - - - بۋشەل - {0} بۋشەل - {0} بۋشەل - - - گاللون - {0} گاللون - {0} گاللون - {0}/گاللون - - - يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون - - - كۆارتا - {0} كۆارتا - {0} كۆارتا - - - پينتا - {0} پينتا - {0} پينتا - - - كەسە - {0} كەسە - {0} كەسە - - - سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا + + سۇ. ۋن. + {0} سۇ. ۋن. + {0} سۇ. ۋن. - يمپ سۇيىق ۋنسيا - يمپ سۇيىق ۋنسيا - {0} يمپ سۇيىق ۋنسيا + يمپ سۇيىق ۋنسيا + {0} يمپ سۇيىق ۋنسيا - - اس قاسىق - {0} اس قاسىق - {0} اس قاسىق + + ستەراديان + {0} ستەراديان + {0} ستەراديان - - شاي قاسىق - {0} شاي قاسىق - {0} شاي قاسىق + + كاتال + {0} كاتال + {0} كاتال - - باررەل - {0} باررەل - {0} باررەل + + كۋلون + {0} كۋلون + {0} كۋلون - - دەسەرت قاسىعى - {0} دەسەرت قاسىعى - {0} دەسەرت قاسىعى + + فاراد + {0} فاراد + {0} فاراد - - يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى + + حەنري + {0} حەنري + {0} حەنري - - تامشى - {0} تامشى - {0} تامشى + + سيمەنس + {0} سيمەنس + {0} سيمەنس - - دراحما - {0} دراحما - {0} دراحما + + كالو. + {0} كالو. + {0} كالو. - - جيگگەر - {0} جيگگەر - {0} جيگگەر + + بەككەرەل + {0} بەككەرەل + {0} بەككەرەل - - شوكىم - {0} شوكىم - {0} شوكىم + + زيۆەرت + {0} زيۆەرت + {0} زيۆەرت - - يمپ كۆارتا - {0} يمپ كۆارتا - {0} يمپ كۆارتا + + گىرەي + {0} گىرەي + {0} گىرەي - - جارىق - {0} جارىق - {0} جارىق + + كيلوگرام-كۇش + {0} كيلوگرام-كۇش + {0} كيلوگرام-كۇش - - ميللياردتىق ۇلەس - {0} ميىللياردتىق ۇلەس - {0} ميللياردتىق ۇلەس + + ت + {0} تەسلا + {0} تەسلا - - ءتۇن - {0} ءتۇن - {0} ءتۇن - {0}/ءتۇن + + ۋەبەر + {0} ۋەبەر + {0} ۋەبەر + + + {0} ميللياردتىق ۇلەس + {0} ميللياردتىق ۇلەس - نەگىزگى باعىت - {0} شىعىس - {0} سولتۇستىك - {0} وڭتۇستىك - {0} باتىس + نەگىزگى باعىت + {0} شىعىس + {0} سولتۇستىك + {0} وڭتۇستىك + {0} باتىس - د{0} + د{0} - س{0} + س{0} - مل{0} + مل{0} - مك{0} + مك{0} - ن{0} + ن{0} - پ{0} + پ{0} - ف{0} + ف{0} - ا{0} + ا{0} - ز{0} + ز{0} - ي{0} + ي{0} - ر{0} + ر{0} - ك{0} + ك{0} - دا{0} + دا{0} - گ{0} + گ{0} - كل{0} + كل{0} - مگ{0} + مگ{0} - گگ{0} + گگ{0} - ت{0} + ت{0} - پت{0} + پت{0} - ە{0} + ە{0} - زت{0} + زت{0} - يت{0} + يت{0} - رن{0} + رن{0} - كت{0} + كت{0} - كي{0} + كي{0} - مب{0} + مب{0} - گي{0} + گي{0} - تب{0} + تب{0} - پب{0} + پب{0} - ەب{0} + ەب{0} - زب{0} + زب{0} - يب{0} + يب{0} - تارتىلىس كۇشى - {0} تارتىلىس كۇشى - {0} تارتىلىس كۇشى + تارتىلىس كۇشى + {0} تارتىلىس كۇشى + {0} تارتىلىس كۇشى - مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند + مەتىر/شارشى سەكۋند + {0} مەتىر/شارشى سەكۋند + {0} مەتىر/شارشى سەكۋند - اينالىم - {0} اينالىم - {0} اينالىم + اينالىم + {0} اينالىم + {0} اينالىم - راديان - {0} راديان - {0} راديان + راديان + {0} راديان + {0} راديان - گرادۋس - {0} گرادۋس - {0} گرادۋس + گرادۋس + {0} گرادۋس + {0} گرادۋس - اركمينۋت - {0} اركمينۋت - {0} اركمينۋت + اركمينۋت + {0} اركمينۋت + {0} اركمينۋت - اركسەكۋند - {0} اركسەكۋند - {0} اركسەكۋند + اركسەكۋند + {0} اركسەكۋند + {0} اركسەكۋند - شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر + شارشى كيلومەتىر + {0}/شارشى كيلومەتىر + {0}/شارشى كيلومەتىر + {0}/شارشى كيلومەتىر - گەكتار - {0} گەكتار - {0} گەكتار + گەكتار + {0} گەكتار + {0} گەكتار - شارشى مەتىر - {0} شارشى مەتىر - {0} شارشى مەتىر - {0}/شارشى مەتىر + شارشى مەتىر + {0} شارشى مەتىر + {0} شارشى مەتىر + {0}/شارشى مەتىر - شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0}/شارشى سانتيمەتىر + شارشى سانتيمەتىر + {0} شارشى سانتيمەتىر + {0} شارشى سانتيمەتىر + {0}/شارشى سانتيمەتىر - شارشى ميل - {0} شارشى ميل - {0} شارشى ميل - {0}/شارشى ميل + شارشى ميل + {0} شارشى ميل + {0} شارشى ميل + {0}/شارشى ميل - اكر - {0} اكر - {0} اكر + اكر + {0} اكر + {0} اكر - شارشى يارد - {0} شارشى يارد - {0} شارشى يارد + شارشى يارد + {0} شارشى يارد + {0} شارشى يارد - شارشى فۋت - {0} شارشى فۋت - {0} شارشى فۋت + شارشى فۋت + {0} شارشى فۋت + {0} شارشى فۋت - شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم + شارشى ديۋيم + {0} شارشى ديۋيم + {0} شارشى ديۋيم + {0} شارشى ديۋيم - دۋنام - {0} دۋنام - {0} دۋنام + دۋنام + {0} دۋنام + {0} دۋنام - كارات - {0} كارات - {0} كارات + كارات + {0} كارات + {0} كارات - ميليگرام/دەسيليتىر + ميليگرام/دەسيليتىر - ميليمول/ليتىر + ميليمول/ليتىر - ەلەمەنت - {0} ەلەمەنت - {0} ەلەمەنت + ەلەمەنت + {0} ەلەمەنت + {0} ەلەمەنت - - ميلليوندىق ۇلەس + + بولىك + {0} بولىك + {0} بولىك + + + ميلليوندىق ۇلەس + {0} ميلليوندىق ۇلەس + {0} ميلليوندىق ۇلەس - پايىز + پايىز - پروميللە + پروميللە - پروميرياد + پروميرياد - مول - {0} مول - {0} مول + مول + {0} مول + {0} مول + + + گليۋكوزا + {0} گليۋكوزا + {0} گليۋكوزا - ليتىر/كيلومەتىر + ليتىر/كيلومەتىر - ليتىر/100 كيلومەتىر + ليتىر/100 كيلومەتىر - ميل/گاللون - {0} ميل/گاللون - {0} ميل/گاللون + ميل/گاللون + {0} ميل/گاللون + {0} ميل/گاللون - ميل/يمپ گاللون - {0} ميل/يمپ گاللون - {0} ميل/يمپ گاللون + ميل/يمپ گاللون + {0} ميل/يمپ گاللون + {0} ميل/يمپ گاللون - پەتابايت + پەتابايت - تەرابايت + تەرابايت - تەرابيت + تەرابيت - گيگابايت + گيگابايت - گيگابيت + گيگابيت - مەگابايت + مەگابايت - مەگابيت + مەگابيت - كيلوبايت + كيلوبايت - كيلوبيت + كيلوبيت - بايت + بايت - بيت + بيت - عاسىر - {0} عاسىر - {0} عاسىر + عاسىر + {0} عاسىر + {0} عاسىر - ون جىلدىق - {0} ون جىلدىق - {0} ون جىلدىق + ون جىلدىق + {0} ون جىلدىق + {0} ون جىلدىق - جىل - {0} جىل - {0} جىل - جىلىنا {0} + جىل + {0} جىل + {0} جىل + جىلىنا {0} - توقسان - {0} توقسان - {0} توقسان - {0}/توقسان + توقسان + {0} توقسان + {0} توقسان + {0}/توقسان - اي - {0} اي - {0} اي - {0}/اي + اي + {0} اي + {0} اي + {0}/اي - اپتا - {0} اپتا - {0} اپتا - {0}/اپتا + اپتا + {0} اپتا + {0} اپتا + {0}/اپتا - كۇن - {0} كۇن - {0} كۇن - {0}/كۇن + كۇن + {0} كۇن + {0} كۇن + {0}/كۇن - ساعات - {0} ساعات - {0} ساعات - {0}/ساعات + ساعات + {0} ساعات + {0} ساعات + {0}/ساعات - مينۋت - {0} مينۋت - {0} مينۋت - {0}/مينۋت + مينۋت + {0} مينۋت + {0} مينۋت + {0}/مينۋت - سەكۋند - {0} سەكۋند - {0} سەكۋند - {0}/سەكۋند + سەكۋند + {0} سەكۋند + {0} سەكۋند + {0}/سەكۋند - ميليسەكۋند - {0} ميليسەكۋند - {0} ميليسەكۋند + ميليسەكۋند + {0} ميليسەكۋند + {0} ميليسەكۋند - ميكروسەكۋند - {0} ميكروسەكۋند - {0} ميكروسەكۋند + ميكروسەكۋند + {0} ميكروسەكۋند + {0} ميكروسەكۋند - نانوسەكۋند - {0} نانوسەكۋند - {0} نانوسەكۋند + نانوسەكۋند + {0} نانوسەكۋند + {0} نانوسەكۋند - امپەر - {0} امپەر - {0} امپەر + امپەر + {0} امپەر + {0} امپەر - ميليامپەر - {0} ميليامپەر - {0} ميليامپەر + ميليامپەر + {0} ميليامپەر + {0} ميليامپەر - وم - {0} وم - {0} وم + وم + {0} وم + {0} وم - ۆولت - {0} ۆولت - {0} ۆولت + ۆولت + {0} ۆولت + {0} ۆولت - كيلوكالوريا - {0} كيلوكالوريا - {0} كيلوكالوريا + كيلوكالوريا + {0} كيلوكالوريا + {0} كيلوكالوريا - كالوريا - {0} كالوريا - {0} كالوريا + كالوريا + {0} كالوريا + {0} كالوريا - كيلوجوۋل - {0} كىلوجوۋل - {0} كىلوجوۋل + كيلوجوۋل + {0} كىلوجوۋل + {0} كىلوجوۋل - جوۋل - {0} جوۋل - {0} جوۋل + جوۋل + {0} جوۋل + {0} جوۋل - كيلوۆات-ساعات - {0} كيلوۆات-ساعات - {0} كيلوۆات-ساعات + كيلوۆات-ساعات + {0} كيلوۆات-ساعات + {0} كيلوۆات-ساعات - ەلەكتونۆولت - {0} ەلەكترونۆولت - {0} ەلەكترونۆولت + ەلەكتونۆولت + {0} ەلەكترونۆولت + {0} ەلەكترونۆولت - بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى + بريتاندىق جىلۋ بىرلىگى + {0} بريتاندىق جىلۋ بىرلىگى + {0} بريتاندىق جىلۋ بىرلىگى - ا ق ش تەرمى - {0} ا ق ش تەرمى - {0} ا ق ش تەرمى + ا ق ش تەرمى + {0} ا ق ش تەرمى + {0} ا ق ش تەرمى - فۋنت-كۇش - {0} فۋنت-كۇش - {0} فۋنت-كۇش + فۋنت-كۇش + {0} فۋنت-كۇش + {0} فۋنت-كۇش - نيۋتون + نيۋتون - كيلوۆات-ساعات/100 كيلومەتىر + كيلوۆات-ساعات/100 كيلومەتىر - گيگاگەرس - {0} گيگاگەرس - {0} گيگاگەرس + گيگاگەرس + {0} گيگاگەرس + {0} گيگاگەرس - مەگاگەرس - {0} مەگاگەرس - {0} مەگاگەرس + مەگاگەرس + {0} مەگاگەرس + {0} مەگاگەرس - كيلوگەرس - {0} كيلوگەرس - {0} كيلوگەرس + كيلوگەرس + {0} كيلوگەرس + {0} كيلوگەرس - گەرس - {0} گەرس - {0} گەرس + گەرس + {0} گەرس + {0} گەرس - جەر راديۋسى - {0} جەر راديۋسى - {0} جەر راديۋسى + جەر راديۋسى + {0} جەر راديۋسى + {0} جەر راديۋسى - كيلومەتىر - {0} كيلومەتىر - {0} كيلومەتىر - {0}/كيلومەتىر + كيلومەتىر + {0} كيلومەتىر + {0} كيلومەتىر + {0}/كيلومەتىر - مەتىر - {0}/مەتىر - {0}/مەتىر - {0}/مەتىر + مەتىر + {0}/مەتىر + {0}/مەتىر + {0}/مەتىر - دەسيمەتىر - {0}/دەسيمەتىر - {0}/دەسيمەتىر + دەسيمەتىر + {0}/دەسيمەتىر + {0}/دەسيمەتىر - سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر + سانتيمەتىر + {0}/سانتيمەتىر + {0}/سانتيمەتىر + {0}/سانتيمەتىر - ميليمەتىر - {0} ميليمەتىر - {0} ميليمەتىر + ميليمەتىر + {0} ميليمەتىر + {0} ميليمەتىر - ميكرومەتىر - {0} ميكرومەتىر - {0} ميكرومەتىر + ميكرومەتىر + {0} ميكرومەتىر + {0} ميكرومەتىر - نانومەتىر - {0} نانومەتىر - {0} نانومەتىر + نانومەتىر + {0} نانومەتىر + {0} نانومەتىر - پيكومەتىر - {0} پيكومەتىر - {0} پيكومەتىر + پيكومەتىر + {0} پيكومەتىر + {0} پيكومەتىر - ميل - {0} ميل - {0} ميل + ميل + {0} ميل + {0} ميل - يارد - {0} يارد - {0} يارد + يارد + {0} يارد + {0} يارد - فۋت - {0}/فۋت - {0}/فۋت - {0}/فۋت + فۋت + {0}/فۋت + {0}/فۋت + {0}/فۋت - ديۋيم - {0} ديۋيم - {0} ديۋيم - {0}/ديۋيم + ديۋيم + {0} ديۋيم + {0} ديۋيم + {0}/ديۋيم - پارسەك - {0} پارسەك - {0} پارسەك + پارسەك + {0} پارسەك + {0} پارسەك - جارىق جىلى - {0} جارىق جىلى - {0} جارىق جىلى + جارىق جىلى + {0} جارىق جىلى + {0} جارىق جىلى - استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك + استرونوميالىق بىرلىك + {0} استرونوميالىق بىرلىك + {0} استرونوميالىق بىرلىك - فۋرلوڭ - {0} فۋرلوڭ - {0} فۋرلوڭ + فۋرلوڭ + {0} فۋرلوڭ + {0} فۋرلوڭ - فاتوم - {0} فاتوم - {0} فاتوم + فاتوم + {0} فاتوم + {0} فاتوم - تەڭىز ميلى - {0} تەڭىز ميلى - {0} تەڭىز ميلى + تەڭىز ميلى + {0} تەڭىز ميلى + {0} تەڭىز ميلى - سكانديناۆيالىق ميل - {0} سكانديناۆيالىق ميلى - {0} سكانديناۆيالىق ميلى + سكانديناۆيالىق ميل + {0} سكانديناۆيالىق ميلى + {0} سكانديناۆيالىق ميلى - پۋنكت - {0} پۋنكت - {0} پۋنكت + پۋنكت + {0} پۋنكت + {0} پۋنكت - كۇن راديۋسى - {0} كۇن راديۋسى - {0} كۇن راديۋسى + كۇن راديۋسى + {0} كۇن راديۋسى + {0} كۇن راديۋسى - ليۋكس + ليۋكس - كاندەلا + كاندەلا - ليۋمەن + ليۋمەن - كۇن جارىقتىعى - {0} كۇن جارىقتىعى - {0} كۇن جارىقتىعى + كۇن جارىقتىعى + {0} كۇن جارىقتىعى + {0} كۇن جارىقتىعى - مەتىرلىك توننا - {0} توننا - {0} توننا + مەتىرلىك توننا + {0} توننا + {0} توننا - كيلوگرام - {0} كيلوگرام - {0} كيلوگرام - {0}/كيلوگرام + كيلوگرام + {0} كگ + {0} كگ + {0}‎/kg - گرام - {0} گرام - {0} گرام - {0}/گرام + گرام + {0} گرام + {0} گرام - ميليگرام - {0} ميليگرام - {0} ميليگرام + {0} ميليگرام + {0} ميليگرام - ميكروگرام - {0} ميكروگرام - {0} ميكروگرام + ميكروگرام + {0} ميكروگرام + {0} ميكروگرام - توننا - {0} تن - {0} تن + توننا + {0} تن + {0} تن - ستوۋن - {0} ستوۋن - {0} ستوۋن + ستوۋن + {0} ستوۋن + {0} ستوۋن - فۋنت - {0} فۋنت - {0} فۋنت - {0}/فۋنت + {0} فۋنت + {0} فۋنت + {0}/فۋنت - ۋنسيا - {0} ۋنسيا - {0} ۋنسيا - {0}/ۋنسيا + ۋنسيا + {0} ۋنسيا + {0} ۋنسيا + {0}/ۋنسيا - تروي ۋنسياسى - {0} تروۋ ۋنسياسى - {0} تروۋ ۋنسياسى + تروي ۋنسياسى + {0} تروۋ ۋنسياسى + {0} تروۋ ۋنسياسى - كارات - {0} كارات - {0} كارات + كارات + {0} كارات + {0} كارات - دالتون - {0} دالتون - {0} دالتون + دالتون + {0} دالتون + {0} دالتون - جەر ماسساسى - {0} جەر ماسساسى - {0} جەر ماسساسى + جەر ماسساسى + {0} M⊕ + {0} M⊕ - كۇن ماسساسى - {0} كۇن ماسساسى - {0} كۇن ماسساسى + كۇن ماسساسى + {0} M☉ + {0} M☉ - گران - {0} گران - {0} گران + گران + {0} گران + {0} گران - گيگاۆات - {0} گيگاۆات - {0} گيگاۆات + گيگاۆات + {0} گيگاۆات + {0} گيگاۆات - مەگاۆات - {0} مەگاۆات - {0} مەگاۆات + مەگاۆات + {0} مەگاۆات + {0} مەگاۆات - كيلوۆات - {0} كيلوۆات - {0} كيلوۆات + كيلوۆات + {0} كيلوۆات + {0} كيلوۆات - ۆات - {0} ۆات - {0} ۆات + ۆات + {0} ۆات + {0} ۆات - ميليۆات - {0} ميليۆات - {0} ميليۆات + ميليۆات + {0} ميليۆات + {0} ميليۆات - ات كۇشى - {0} ات كۇشى - {0} ات كۇشى + ات كۇشى + {0} ات كۇشى + {0} ات كۇشى - ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى + ميليمەتىر سىناپ باعاناسى + {0} ميليمەتىر سىناپ باعاناسى + {0} ميليمەتىر سىناپ باعاناسى + + + مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى - فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم + فۋنت-كۇش/شارشى ديۋيم + {0} فۋنت-كۇش/شارشى ديۋيم + {0} فۋنت-كۇش/شارشى ديۋيم - ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى + ديۋيم سىناپ باعاناسى + {0} ديۋيم سىناپ باعاناسى + {0} ديۋيم سىناپ باعاناسى - بار - {0} بار - {0} بار + بار + {0} بار + {0} بار - ميليبار - {0} ميليبار - {0} ميليبار + ميليبار + {0} ميليبار + {0} ميليبار - اتموسفەرا - {0} اتموسفەرا - {0} اتموسفەرا + اتموسفەرا + {0} اتموسفەرا + {0} اتموسفەرا - پاسكال - {0} پاسكال - {0} پاسكال + پاسكال + {0} پاسكال + {0} پاسكال - گەكتوپاسكال - {0} گەكتوپاسكال - {0} گەكتوپاسكال + گەكتوپاسكال + {0} گەكتوپاسكال + {0} گەكتوپاسكال - كيلوپاسكال - {0} كيلوپاسكال - {0} كيلوپاسكال + كيلوپاسكال + {0} كيلوپاسكال + {0} كيلوپاسكال - مەگاپاسكال - {0} مەگاپاسكال - {0} مەگاپاسكال + مەگاپاسكال + {0} مەگاپاسكال + {0} مەگاپاسكال - كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات + كيلومەتىر/ساعات + {0} كيلومەتىر/ساعات + {0} كيلومەتىر/ساعات - مەتىر/سەكۋند - {0} مەتىر/سەكۋند - {0} مەتىر/سەكۋند + مەتىر/سەكۋند + {0} مەتىر/سەكۋند + {0} مەتىر/سەكۋند - ميل/ساعات - {0} ميل/ساعات - {0} ميل/ساعات + ميل/ساعات + {0} ميل/ساعات + {0} ميل/ساعات - ءتۇيىن - {0} ءتۇيىن - {0} ءتۇيىن + ءتۇيىن + {0} ءتۇيىن + {0} ءتۇيىن - بوفورت - {0} بوفورت - {0} بوفورت + بوفورت + {0} بوفورت + {0} بوفورت - سەلسي گرادۋسى + سەلسي گرادۋسى - فارانگەيت گرادۋسى + فارانگەيت گرادۋسى - كەلۆين + كەلۆين - فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت + فۋنت-كۇش-فۋت + {0} فۋنت-كۇش-فۋت + {0} فۋنت-كۇش-فۋت - نيۋتون-مەتىر + نيۋتون-مەتىر - تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر + تەكشە كيلومەتىر + {0} تەكشە كيلومەتىر + {0} تەكشە كيلومەتىر - تەكشە مەتىر - {0} تەكشە مەتىر - {0} تەكشە مەتىر - {0}/تەكشە مەتىر + تەكشە مەتىر + {0} تەكشە مەتىر + {0} تەكشە مەتىر + {0}/تەكشە مەتىر - تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0}/تەكشە سانتيمەتىر + تەكشە سانتيمەتىر + {0} تەكشە سانتيمەتىر + {0} تەكشە سانتيمەتىر + {0}/تەكشە سانتيمەتىر - تەكشە ميل - {0} تەكشە ميل - {0} تەكشە ميل + تەكشە ميل + {0} تەكشە ميل + {0} تەكشە ميل - تەكشە يارد - {0} تەكشە يارد - {0} تەكشە يارد + تەكشە يارد + {0} تەكشە يارد + {0} تەكشە يارد - تەكشە فۋت - {0} تەكشە فۋت - {0} تەكشە فۋت + تەكشە فۋت + {0} تەكشە فۋت + {0} تەكشە فۋت - تەكشە ديۋيم - {0} تەكشە ديۋيم - {0} تەكشە ديۋيم + تەكشە ديۋيم + {0} تەكشە ديۋيم + {0} تەكشە ديۋيم - مەگاليتر - {0} مەگاليتر - {0} مەگاليتر + مەگاليتر + {0} مەگاليتر + {0} مەگاليتر - گەكتوليتىر - {0} گەكتوليرىر - {0} گەكتوليرىر + گەكتوليتىر + {0} گەكتوليرىر + {0} گەكتوليرىر - ليتىر - {0} ليتىر - {0} ليتىر - {0}/ليتىر + ليتىر + {0} ليتىر + {0} ليتىر + {0}/ليتىر - دەسيليتىر - {0} دەسيليتىر - {0} دەسيليتىر + دەسيليتىر + {0} دەسيليتىر + {0} دەسيليتىر - سانتيليتىر - {0} سانتيليتىر - {0} سانتيليتىر + سانتيليتىر + {0} سانتيليتىر + {0} سانتيليتىر - ميليليتىر - {0} ميليليتىر - {0} ميليليتىر + ميليليتىر + {0} ميليليتىر + {0} ميليليتىر - مەتىرلىك پينتا - {0} مەتىرلىك پينتا - {0} مەتىرلىك پينتا + مەتىرلىك پينتا + {0} مەتىرلىك پينتا + {0} مەتىرلىك پينتا - مەتىرلىك كەسە - {0} مەتىرلىك كەسە - {0} مەتىرلىك كەسە + مەتىرلىك كەسە + {0} مەتىرلىك كەسە + {0} مەتىرلىك كەسە + + + سۇ. ۋن. + {0} سۇ. ۋن. + {0} سۇ. ۋن. - اكر-فۋت - {0} اكر-فۋت - {0} اكر-فۋت + اكر-فۋت + {0} اكر-فۋت + {0} اكر-فۋت - بۋشەل - {0} بۋشەل - {0} بۋشەل + بۋشەل + {0} بۋشەل + {0} بۋشەل - گاللون - {0} گاللون - {0} گاللون - {0}/گاللون + گاللون + {0} گاللون + {0} گاللون + {0}/گاللون - يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون + يمپ گاللون + {0} يمپ گاللون + {0} يمپ گاللون + {0} يمپ گاللون - كۆارتا - {0} كۆارتا - {0} كۆارتا + كۆارتا + {0} كۆارتا + {0} كۆارتا - پينتا - {0} پينتا - {0} پينتا + پينتا + {0} پينتا + {0} پينتا - كەسە - {0} كەسە - {0} كەسە + كەسە + {0} كەسە + {0} كەسە - سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا + سۇيىق ۋنسيا + {0} سۇيىق ۋنسيا + {0} سۇيىق ۋنسيا - يمپ سۇيىق ۋنسيا - {0} يمپ سۇيىق ۋنسيا - {0} يمپ سۇيىق ۋنسيا + يمپ سۇيىق ۋنسيا + {0} يمپ سۇيىق ۋنسيا + {0} يمپ سۇيىق ۋنسيا - اس قاسىق - {0} اس قاسىق - {0} اس قاسىق + اس قاسىق + {0} اس قاسىق + {0} اس قاسىق - شاي قاسىق - {0} شاي قاسىق - {0} شاي قاسىق + شاي قاسىق + {0} شاي قاسىق + {0} شاي قاسىق - باررەل - {0} باررەل - {0} باررەل + باررەل + {0} باررەل + {0} باررەل - دەسەرت قاسىعى - {0} دەسەرت قاسىعى - {0} دەسەرت قاسىعى + دەسەرت قاسىعى + {0} دەسەرت قاسىعى + {0} دەسەرت قاسىعى - يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى + يمپ دەسەرت قاسىعى + {0} يمپ دەسەرت قاسىعى + {0} يمپ دەسەرت قاسىعى - تامشى - {0} تامشى - {0} تامشى + تامشى + {0} تامشى + {0} تامشى - دراحما - {0} دراحما - {0} دراحما + دراحما + {0} دراحما + {0} دراحما - جيگگەر - {0} جيگگەر - {0} جيگگەر + جيگگەر + {0} جيگگەر + {0} جيگگەر - شوكىم - {0} شوكىم - {0} شوكىم + شوكىم + {0} شوكىم + {0} شوكىم - يمپ كۆارتا - {0} يمپ كۆارتا - {0} يمپ كۆارتا + يمپ كۆارتا + {0} يمپ كۆارتا + {0} يمپ كۆارتا + + + ستەراديان + {0} sr + {0} sr + + + كاتال + {0} كاتال + {0} كاتال + + + كۋلون + {0} كۋلون + {0} كۋلون + + + فاراد + {0} فاراد + {0} فاراد + + + حەنري + {0} حەنري + {0} حەنري + + + سيمەنس + {0} S + {0} S + + + كالو. + {0} كالو. + {0} كالو. + + + بەككەرەل + {0} بك + {0} بك + + + زيۆەرت + {0} زيۆەرت + {0} زيۆەرت + + + گىرەي + {0} گىرەي + {0} گىرەي + + + كيلوگرام-كۇش + {0} كيلوگرام-كۇش + {0} كيلوگرام-كۇش + + + ت + {0} تەسلا + {0} تەسلا + + + ۋەبەر + {0} ۋەبەر + {0} ۋەبەر - جارىق - {0} جارىق - {0} جارىق + جارىق + {0} جارىق + {0} جارىق - - ميللياردتىق ۇلەس + + ميللياردتىق ۇلەس + {0} ميللياردتىق ۇلەس + {0} ميللياردتىق ۇلەس - ءتۇن - {0} ءتۇن - {0} ءتۇن - {0}/ءتۇن + ءتۇن + {0} ءتۇن + {0} ءتۇن + {0}/ءتۇن - باعىت - {0} ش - {0} س - {0} و - {0} ب + باعىت + {0} ش + {0} س + {0} و + {0} ب - - د{0} - - - س{0} - - - مل{0} - - - مك{0} - - - ن{0} - - - پ{0} - - - ف{0} - - - ا{0} - - - ز{0} - - - ي{0} - - - ر{0} - - - ك{0} - - - دا{0} - - - گ{0} - - - كل{0} - - - مگ{0} - - - گگ{0} - - - ت{0} - - - پت{0} - - - ە{0} - - - زت{0} - - - يت{0} - - - رن{0} - - - كت{0} - - - كي{0} - - - مب{0} - - - گي{0} - - - تب{0} - - - پب{0} - - - ەب{0} - - - زب{0} - - - يب{0} - - - تارتىلىس كۇشى - {0} تارتىلىس كۇشى - {0} تارتىلىس كۇشى + + بولىك + {0} بولىك + {0} بولىك - - مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند - {0} مەتىر/شارشى سەكۋند + + {0} ميلليوندىق ۇلەس + {0} ميلليوندىق ۇلەس - - اينالىم - {0} اينالىم - {0} اينالىم - - - راديان - {0} راديان - {0} راديان - - - گرادۋس - - - اركمينۋت - - - اركسەكۋند - - - شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - {0}/شارشى كيلومەتىر - - - گەكتار - {0} گەكتار - {0} گەكتار - - - شارشى مەتىر - {0} شارشى مەتىر - {0} شارشى مەتىر - {0}/شارشى مەتىر - - - شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0} شارشى سانتيمەتىر - {0}/شارشى سانتيمەتىر - - - شارشى ميل - {0} شارشى ميل - {0} شارشى ميل - {0}/شارشى ميل - - - اكر - {0} اكر - {0} اكر - - - شارشى يارد - {0} شارشى يارد - {0} شارشى يارد - - - شارشى فۋت - {0} شارشى فۋت - {0} شارشى فۋت - - - شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم - {0} شارشى ديۋيم - - - دۋنام - {0} دۋنام - {0} دۋنام - - - كارات - {0} كارات - {0} كارات - - - ميليگرام/دەسيليتىر - - - ميليمول/ليتىر - - - ەلەمەنت - {0} ەلەمەنت - {0} ەلەمەنت - - - ميلليوندىق ۇلەس - - - مول - {0} مول - {0} مول - - - ليتىر/كيلومەتىر - - - ليتىر/100 كيلومەتىر - - - ميل/گاللون - {0} ميل/گاللون - {0} ميل/گاللون - - - ميل/يمپ گاللون - {0} ميل/يمپ گاللون - {0} ميل/يمپ گاللون + + گليۋكوزا + {0} گليۋكوزا + {0} گليۋكوزا - B - - - عاسىر - {0} عاسىر - {0} عاسىر - - - ون جىلدىق - {0} ون جىلدىق - {0} ون جىلدىق - - - جىل - {0} جىل - {0} جىل - جىلىنا {0} - - - توقسان - {0} توقسان - {0} توقسان - {0}/توقسان - - - اي - {0} اي - {0} اي - {0}/اي - - - اپتا - {0} اپتا - {0} اپتا - {0}/اپتا - - - كۇن - {0} كۇن - {0} كۇن - {0}/كۇن - - - ساعات - {0} ساعات - {0} ساعات - {0}/ساعات - - - مينۋت - {0} مينۋت - {0} مينۋت - {0}/مينۋت - - - سەكۋند - {0} سەكۋند - {0} سەكۋند - {0}/سەكۋند - - - ميليسەكۋند - {0} ميليسەكۋند - {0} ميليسەكۋند - - - ميكروسەكۋند - {0} ميكروسەكۋند - {0} ميكروسەكۋند - - - نانوسەكۋند - {0} نانوسەكۋند - {0} نانوسەكۋند - - - امپەر - {0} امپەر - {0} امپەر - - - ميليامپەر - {0} ميليامپەر - {0} ميليامپەر - - - وم - {0} وم - {0} وم - - - ۆولت - {0} ۆولت - {0} ۆولت - - - كيلوكالوريا - {0} كيلوكالوريا - {0} كيلوكالوريا - - - كالوريا - {0} كالوريا - {0} كالوريا - - - كيلوجوۋل - {0} كىلوجوۋل - {0} كىلوجوۋل - - - جوۋل - {0} جوۋل - {0} جوۋل - - - كيلوۆات-ساعات - {0} كيلوۆات-ساعات - {0} كيلوۆات-ساعات - - - ەلەكتونۆولت - {0} ەلەكترونۆولت - {0} ەلەكترونۆولت - - - بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى - {0} بريتاندىق جىلۋ بىرلىگى - - - ا ق ش تەرمى - {0} ا ق ش تەرمى - {0} ا ق ش تەرمى - - - فۋنت-كۇش - {0} فۋنت-كۇش - {0} فۋنت-كۇش - - - كيلوۆات-ساعات/100 كيلومەتىر - - - گيگاگەرس - {0} گيگاگەرس - {0} گيگاگەرس - - - مەگاگەرس - {0} مەگاگەرس - {0} مەگاگەرس - - - كيلوگەرس - {0} كيلوگەرس - {0} كيلوگەرس - - - گەرس - {0} گەرس - {0} گەرس - - - جەر راديۋسى - {0} جەر راديۋسى - {0} جەر راديۋسى - - - كيلومەتىر - {0} كيلومەتىر - {0} كيلومەتىر - {0}/كيلومەتىر - - - مەتىر - {0}/مەتىر - {0}/مەتىر - {0}/مەتىر - - - دەسيمەتىر - {0}/دەسيمەتىر - {0}/دەسيمەتىر - - - سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر - {0}/سانتيمەتىر - - - ميليمەتىر - {0} ميليمەتىر - {0} ميليمەتىر - - - ميكرومەتىر - {0} ميكرومەتىر - {0} ميكرومەتىر - - - نانومەتىر - {0} نانومەتىر - {0} نانومەتىر - - - پيكومەتىر - {0} پيكومەتىر - {0} پيكومەتىر - - - ميل - {0} ميل - {0} ميل - - - يارد - {0} يارد - {0} يارد - - - فۋت - {0}/فۋت - {0}/فۋت - {0}/فۋت - - - ديۋيم - {0} ديۋيم - {0} ديۋيم - {0}/ديۋيم - - - پارسەك - {0} پارسەك - {0} پارسەك - - - جارىق جىلى - {0} جارىق جىلى - {0} جارىق جىلى - - - استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك - {0} استرونوميالىق بىرلىك - - - فۋرلوڭ - {0} فۋرلوڭ - {0} فۋرلوڭ - - - فاتوم - {0} فاتوم - {0} فاتوم - - - تەڭىز ميلى - {0} تەڭىز ميلى - {0} تەڭىز ميلى - - - سكانديناۆيالىق ميل - {0} سكانديناۆيالىق ميلى - {0} سكانديناۆيالىق ميلى - - - پۋنكت - {0} پۋنكت - {0} پۋنكت - - - كۇن راديۋسى - {0} كۇن راديۋسى - {0} كۇن راديۋسى - - - ليۋكس - - - كاندەلا - - - ليۋمەن - - - كۇن جارىقتىعى - {0} كۇن جارىقتىعى - {0} كۇن جارىقتىعى - - - مەتىرلىك توننا - {0} توننا - {0} توننا + B - كيلوگرام - {0} كيلوگرام - {0} كيلوگرام - {0}/كيلوگرام + kg + {0}kg + {0}kg + {0}‎/kg - گرام - {0} گرام - {0} گرام - {0}/گرام + {0}g + {0}g + {0}/g - ميليگرام - {0} ميليگرام - {0} ميليگرام + mg + {0}mg + {0}mg - ميكروگرام - {0} ميكروگرام - {0} ميكروگرام + {0}μg + {0}μg - توننا - {0} توننا - {0} توننا - - - ستوۋن - {0} ستوۋن - {0} ستوۋن + {0}tn + {0}tn - فۋنت - {0} فۋنت - {0} فۋنت - {0}/فۋنت + lb + {0}lb + {0}lb - ۋنسيا - {0} ۋنسيا - {0} ۋنسيا - {0}/ۋنسيا + oz + {0}oz + {0}oz + {0}/oz - تروي ۋنسياسى - {0} تروۋ ۋنسياسى - {0} تروۋ ۋنسياسى + oz t + {0}oz t + {0}oz t - كارات - {0} كارات - {0} كارات + {0}CD + {0}CD - دالتون - {0} دالتون - {0} دالتون + Da + {0}Da + {0}Da - جەر ماسساسى - {0} جەر ماسساسى - {0} جەر ماسساسى + M⊕ + {0}M⊕ + {0}M⊕ - كۇن ماسساسى - {0} كۇن ماسساسى - {0} كۇن ماسساسى + M☉ + {0}M☉ + {0}M☉ - گران - {0} گران - {0} گران + gr + {0}gr + {0}gr - - گيگاۆات - {0} گيگاۆات - {0} گيگاۆات + + مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى + {0} مەركۋري ءديۋيمى - - مەگاۆات - {0} مەگاۆات - {0} مەگاۆات + + سۇ. ۋن. + {0} سۇ. ۋن. + {0} سۇ. ۋن. - - كيلوۆات - {0} كيلوۆات - {0} كيلوۆات + + كاتال + {0} كاتال + {0} كاتال - - ۆات - {0} ۆات - {0} ۆات + + كۋلون + {0} كۋلون + {0} كۋلون - - ميليۆات - {0} ميليۆات - {0} ميليۆات + + فاراد + {0} فاراد + {0} فاراد - - ات كۇشى - {0} ات كۇشى - {0} ات كۇشى + + حەنري + {0} حەنري + {0} حەنري - - ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى - {0} ميليمەتىر سىناپ باعاناسى + + كالو. + {0} كالو. + {0} كالو. - - فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم - {0} فۋنت-كۇش/شارشى ديۋيم + + بەككەرەل + {0} بك + {0} بك - - ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى - {0} ديۋيم سىناپ باعاناسى + + زيۆەرت + {0} زيۆەرت + {0} زيۆەرت - - بار - {0} بار - {0} بار + + گىرەي + {0} گىرەي + {0} گىرەي - - ميليبار - {0} ميليبار - {0} ميليبار + + كيلوگرام-كۇش + {0} كيلوگرام-كۇش + {0} كيلوگرام-كۇش - - اتموسفەرا - {0} اتموسفەرا - {0} اتموسفەرا + + ت + {0} ت + {0} ت - - پاسكال - {0} پاسكال - {0} پاسكال + + ۋەبەر + {0} ۋەبەر + {0} ۋەبەر - - گەكتوپاسكال - {0} گەكتوپاسكال - {0} گەكتوپاسكال + + {0} ميللياردتىق ۇلەس + {0} ميللياردتىق ۇلەس - - كيلوپاسكال - {0} كيلوپاسكال - {0} كيلوپاسكال - - - مەگاپاسكال - {0} مەگاپاسكال - {0} مەگاپاسكال - - - كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات - {0} كيلومەتىر/ساعات - - - مەتىر/سەكۋند - {0} مەتىر/سەكۋند - {0} مەتىر/سەكۋند - - - ميل/ساعات - {0} ميل/ساعات - {0} ميل/ساعات - - - ءتۇيىن - {0} ءتۇيىن - {0} ءتۇيىن - - - بوفورت - {0} بوفورت - {0} بوفورت - - - سەلسي گرادۋسى - - - فارانگەيت گرادۋسى - - - كەلۆين - - - فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت - {0} فۋنت-كۇش-فۋت - - - نيۋتون-مەتىر - - - تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر - {0} تەكشە كيلومەتىر - - - تەكشە مەتىر - {0} تەكشە مەتىر - {0} تەكشە مەتىر - {0}/تەكشە مەتىر - - - تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0} تەكشە سانتيمەتىر - {0}/تەكشە سانتيمەتىر - - - تەكشە ميل - {0} تەكشە ميل - {0} تەكشە ميل - - - تەكشە يارد - {0} تەكشە يارد - {0} تەكشە يارد - - - تەكشە فۋت - {0} تەكشە فۋت - {0} تەكشە فۋت - - - تەكشە ديۋيم - {0} تەكشە ديۋيم - {0} تەكشە ديۋيم - - - مەگاليتر - {0} مەگاليتر - {0} مەگاليتر - - - گەكتوليتىر - {0} گەكتوليرىر - {0} گەكتوليرىر - - - ليتىر - {0} ليتىر - {0} ليتىر - {0}/ليتىر - - - دەسيليتىر - {0} دەسيليتىر - {0} دەسيليتىر - - - سانتيليتىر - {0} سانتيليتىر - {0} سانتيليتىر - - - ميليليتىر - {0} ميليليتىر - {0} ميليليتىر - - - مەتىرلىك پينتا - {0} مەتىرلىك پينتا - {0} مەتىرلىك پينتا - - - مەتىرلىك كەسە - {0} مەتىرلىك كەسە - {0} مەتىرلىك كەسە - - - اكر-فۋت - {0} اكر-فۋت - {0} اكر-فۋت - - - بۋشەل - {0} بۋشەل - {0} بۋشەل - - - گاللون - {0} گاللون - {0} گاللون - {0}/گاللون - - - يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون - {0} يمپ گاللون - - - كۆارتا - {0} كۆارتا - {0} كۆارتا - - - پينتا - {0} پينتا - {0} پينتا - - - كەسە - {0} كەسە - {0} كەسە - - - سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا - {0} سۇيىق ۋنسيا - - - يمپ سۇيىق ۋنسيا - {0} يمپ سۇيىق ۋنسيا - {0} يمپ سۇيىق ۋنسيا - - - اس قاسىق - {0} اس قاسىق - {0} اس قاسىق - - - شاي قاسىق - {0} شاي قاسىق - {0} شاي قاسىق - - - باررەل - {0} باررەل - {0} باررەل - - - دەسەرت قاسىعى - {0} دەسەرت قاسىعى - {0} دەسەرت قاسىعى - - - يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى - {0} يمپ دەسەرت قاسىعى - - - تامشى - {0} تامشى - {0} تامشى - - - دراحما - {0} دراحما - {0} دراحما - - - جيگگەر - {0} جيگگەر - {0} جيگگەر - - - شوكىم - {0} شوكىم - {0} شوكىم - - - يمپ كۆارتا - {0} يمپ كۆارتا - {0} يمپ كۆارتا - - - جارىق - {0} جارىق - {0} جارىق - - - ميللياردتىق ۇلەس - - - ءتۇن - {0} ءتۇن - {0} ءتۇن - {0}/ءتۇن - - - باعىت - {0} ش - {0} س - {0} و - {0} ب - - {0}، {1} - {0}، {1} - {0} جانە {1} - {0} جانە {1} + {0}، {1} + {0}، {1} + {0} جانە {1} + {0} جانە {1} - {0}، {1} - {0}، {1} - {0} نە {1} - {0} نە {1} - - - {0}، {1} - {0}، {1} - {0} نە {1} - {0} نە {1} - - - {0}، {1} - {0}، {1} - {0} نە {1} - {0} نە {1} - - - {0}، {1} - {0}، {1} - {0} جانە {1} - {0} جانە {1} - - - {0}، {1} - {0}، {1} - {0} جانە {1} - {0} جانە {1} - - - {0}، {1} - {0}، {1} - {0}، {1} - {0}، {1} + {0}، {1} + {0}، {1} + {0} نە {1} + {0} نە {1} - {0} {1} - {0} {1} - {0} {1} - {0} {1} + {0} {1} + {0} {1} + {0} {1} + {0} {1} - {0}، {1} - {0}، {1} - {0}، {1} - {0}، {1} + {0}، {1} + {0}، {1} - ءيا:ءيا - جوق:جوق + ءيا:ءيا + جوق:جوق - {0} — بارلىعى - {0} — ۇيلەسىمدى - {0} — ەنگىزىلگەن - {0} — كەڭەيتىلگەن - {0} سولعا قاراتىلعان - {0} وڭعا قاراتىلعان - {0} — تاريحي - {0} — ءارتۇرلى - {0} — باسقا - {0} — جازۋلار - {0} سىزىق - {0} سىزىق - {0} — جول استى تاڭبا - {0} — جول ءۇستى تاڭبا - ارەكەت - افريكا جازۋلارى - امەريكا جازۋلارى - جانۋار - جانۋار نە تابيعات - كورسەتكى - دەنە - جالعان ءپىشىن - برايل جازۋى - عيمارات - ءتىزىم ماركەرلەرى/جۇلدىزدار - داۋىسسىز چامو - اقشا تاڭبالارى - سىزىقشا/بايلانىس - سان - دينگبات - سىرلى بەلگى - تومەن باعىتتالعان كورسەتكىلەر - تومەن جانە جوعارى باعىتتالعان كورسەتكىلەر - شىعىس ازيا جازۋلارى - ەموجي - ەۋروپا جازۋلارى - ايەل - تۋ - تۋلار - تاماق پەن سۋسىن - ءپىشىم - ءپىشىم جانە بوس ورىن - تولىق ەندى ءپىشىم نۇسقالارى - گەومەتريالىق ءپىشىن - جارتى ەندى ءپىشىم نۇسقالارى - قىتاي جازۋى - قىتاي جازۋىنىڭ كىلتتەرى - حانچا - قىتاي جازۋى (جەڭىلدەتىلگەن) - قىتاي جازۋى (ءداستۇرلى) - جۇرەك - كونە جازۋلار - قىتاي جازۋىن سيپاتتاۋ تاڭبالارى - جاپون كانا جازۋى - كانبۋن - كانجي - پەرنە - سولعا باعىتتالعان كورسەتكىلەر - سولعا جانە وڭعا باعىتتالعان كورسەتكىلەر - ارىپتىك تاڭبالار - قولدانىسى شەكتەۋلى - ەركەك - ماتەماتيكالىق تاڭبالار - تاياۋ شىعىس جازۋلارى - ءارتۇرلى - قازىرگى زامان جازۋلارى - وزگەرتكىۋ - مۋزىكالىق تاڭبالار - تابيعات - بوس ورىنسىز - ساندار - نىساندار - باسقا - جۇپتاسقان - ادام - فونەتيكالىق ءالىپبي - پىشىندىك جازۋ - ورىن - وسىمدىك - تىنىس بەلگىلەرى - وڭعا باعىتتالعان كورسەتكىلەر - بەلگىلەر/تاڭبالار - كىشى نۇسقالارى - سمايىل - سمايىلدار مەن ادامدار - وڭتۇستىك ازيا جازۋلارى - وڭتۇستىك-شىعىس ازيا جازۋلارى - بوس ورىن - سپورت - تاڭبالار - تەحنيكالىق تاڭبالار - ەكپىن بەلگىلەرى - ساياحات - ساياحات جانە ورىندار - جوعارى باعىتتالعان كورسەتكىلەر - وزگەرمەلى پىشىندەر - داۋىستى چامو - اۋا رايى - باتىس ازيا جازۋلارى - بوس ورىن + {0} — بارلىعى + {0} — ۇيلەسىمدى + {0} — ەنگىزىلگەن + {0} — كەڭەيتىلگەن + {0} سولعا قاراتىلعان + {0} وڭعا قاراتىلعان + {0} — تاريحي + {0} — ءارتۇرلى + {0} — باسقا + {0} — جازۋلار + {0} سىزىق + {0} سىزىق + {0} — جول استى تاڭبا + {0} — جول ءۇستى تاڭبا + ارەكەت + افريكا جازۋلارى + امەريكا جازۋلارى + جانۋار + جانۋار نە تابيعات + كورسەتكى + دەنە + جالعان ءپىشىن + برايل جازۋى + عيمارات + ءتىزىم ماركەرلەرى/جۇلدىزدار + داۋىسسىز چامو + اقشا تاڭبالارى + سىزىقشا/بايلانىس + سان + دينگبات + سىرلى بەلگى + تومەن باعىتتالعان كورسەتكىلەر + تومەن جانە جوعارى باعىتتالعان كورسەتكىلەر + شىعىس ازيا جازۋلارى + ەموجي + ەۋروپا جازۋلارى + ايەل + تۋ + تۋلار + تاماق پەن سۋسىن + ءپىشىم + ءپىشىم جانە بوس ورىن + تولىق ەندى ءپىشىم نۇسقالارى + گەومەتريالىق ءپىشىن + جارتى ەندى ءپىشىم نۇسقالارى + قىتاي جازۋى + قىتاي جازۋىنىڭ كىلتتەرى + حانچا + قىتاي جازۋى (جەڭىلدەتىلگەن) + قىتاي جازۋى (ءداستۇرلى) + جۇرەك + كونە جازۋلار + قىتاي جازۋىن سيپاتتاۋ تاڭبالارى + جاپون كانا جازۋى + كانبۋن + كانجي + پەرنە + سولعا باعىتتالعان كورسەتكىلەر + سولعا جانە وڭعا باعىتتالعان كورسەتكىلەر + ارىپتىك تاڭبالار + قولدانىسى شەكتەۋلى + ەركەك + ماتەماتيكالىق تاڭبالار + تاياۋ شىعىس جازۋلارى + ءارتۇرلى + قازىرگى زامان جازۋلارى + وزگەرتكىۋ + مۋزىكالىق تاڭبالار + تابيعات + بوس ورىنسىز + ساندار + نىساندار + باسقا + جۇپتاسقان + ادام + فونەتيكالىق ءالىپبي + پىشىندىك جازۋ + ورىن + وسىمدىك + تىنىس بەلگىلەرى + وڭعا باعىتتالعان كورسەتكىلەر + بەلگىلەر/تاڭبالار + كىشى نۇسقالارى + سمايىل + سمايىلدار مەن ادامدار + وڭتۇستىك ازيا جازۋلارى + وڭتۇستىك-شىعىس ازيا جازۋلارى + بوس ورىن + سپورت + تاڭبالار + تەحنيكالىق تاڭبالار + ەكپىن بەلگىلەرى + ساياحات + ساياحات جانە ورىندار + جوعارى باعىتتالعان كورسەتكىلەر + وزگەرمەلى پىشىندەر + داۋىستى چامو + اۋا رايى + باتىس ازيا جازۋلارى + بوس ورىن - قيعاش - وپتيكالىق ولشەم - قيعاشتالعان - ەنى - سالماق - قيعاش - جازۋ - ءماتىن - تاقىرىپشا - كورسەتۋ - حابارلاندىۋ - كەرى قيعاشتالعان - تىك - قيعاشتالعان - قاتتى قيعاش - قاتتى تۇرلەنگەن - قوسىمشا تۇرلەنگەن - تۇرلەنگەن - جارتىلاي سىزىلعان - قالىپتى - جارتىلاي كەڭەيتىلگەن - كەڭەيتىلگەن - قوسىمشا كەڭەيتىلگەن - قاتتى كەڭەيتىلگەن - جۇقا - تىم اشىق - جارىق - جاتىلاي جارىق - كىتاپ - تۇراقتى - ورتاشا - جارتىلاي قالىڭ - جۋان - وتە جۋان - قارا - قاپ-قارا - تىك بولشەكتەر - باس ارىپتەر اراسى - تاڭداۋلى ليگاتۋرالار - قيعاش سىزىقتى بولشەكتەر - قاتار ساندار - ەسكى تاڭبالار - تاق ساندار - سالىستىرمالى ساندار - كىشى باس ارىپتەر - كەستەلىك ساندار - جولاقتى ءنول + قيعاش + وپتيكالىق ولشەم + قيعاشتالعان + ەنى + سالماق + قيعاش + جازۋ + ءماتىن + تاقىرىپشا + كورسەتۋ + حابارلاندىۋ + كەرى قيعاشتالعان + تىك + قيعاشتالعان + قاتتى قيعاش + قاتتى تۇرلەنگەن + قوسىمشا تۇرلەنگەن + تۇرلەنگەن + جارتىلاي سىزىلعان + قالىپتى + جارتىلاي كەڭەيتىلگەن + كەڭەيتىلگەن + قوسىمشا كەڭەيتىلگەن + قاتتى كەڭەيتىلگەن + جۇقا + تىم اشىق + جارىق + جاتىلاي جارىق + كىتاپ + تۇراقتى + ورتاشا + جارتىلاي قالىڭ + جۋان + وتە جۋان + قارا + قاپ-قارا + تىك بولشەكتەر + باس ارىپتەر اراسى + تاڭداۋلى ليگاتۋرالار + قيعاش سىزىقتى بولشەكتەر + قاتار ساندار + ەسكى تاڭبالار + تاق ساندار + سالىستىرمالى ساندار + كىشى باس ارىپتەر + كەستەلىك ساندار + جولاقتى ءنول - und kk + und kk - {given} {surname} {generation}، {credentials} + {given} {surname} {generation}، {credentials} - {given-informal} + {given-informal} - {surname} + {surname} - {given-informal} + {given-informal} - {given-monogram-allCaps}{surname-monogram-allCaps} + {given-monogram-allCaps}{surname-monogram-allCaps} - {given-informal-monogram-allCaps} - - - {given} {surname} {generation}، {credentials} + {given-informal-monogram-allCaps} - {given-informal} + {given-informal} - {surname} + {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {given-initial} {surname} + {given-initial} {surname} - {given-informal} + {given-informal} - {surname} + {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname} {given} + {surname} {given} - {surname} {given-informal} + {surname} {given-informal} - {surname} + {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps}{given-monogram-allCaps} + {surname-monogram-allCaps}{given-monogram-allCaps} - {surname-monogram-allCaps}{given-informal-monogram-allCaps} - - - {surname} {given} + {surname-monogram-allCaps}{given-informal-monogram-allCaps} - {surname} {given-informal} + {surname} {given-informal} - {surname} + {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname} {given-initial} + {surname} {given-initial} - {surname} {given-initial} + {surname} {given-initial} - {surname} + {surname} - {given-informal} + {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} - {surname-core}، {given} {given2} {surname-prefix} + {surname-core}، {given} {given2} {surname-prefix} - {surname}، {given-informal} + {surname}، {given-informal} - {surname-core}، {given} {surname-prefix} + {surname-core}، {given} {surname-prefix} - {surname}، {given-informal} + {surname}، {given-informal} - {surname}، {given} + {surname}، {given} - {surname}، {given-informal} + {surname}، {given-informal} - اسەم + اسەم - مۇرات - كارىباي + مۇرات + كارىباي - قالاجان - ∅∅∅ - قايرات + قالاجان + ∅∅∅ + قايرات - مىرزا - ماقسات - ماكە - توقماحامبەتۇلى - ∅∅∅ - بالقىباي - ∅∅∅ - ∅∅∅ - ∅∅∅ + مىرزا + ماقسات + ماكە + توقماحامبەتۇلى + ∅∅∅ + بالقىباي + ∅∅∅ + ∅∅∅ + ∅∅∅ - سينباد + سينباد - كەيت - مۇللەر + كەيت + مۇللەر - سەسيليا - حەمىش - شتوبەر + سەسيليا + حەمىش + شتوبەر - پروءەسسوت - ادا كورنەليا - نەلي - سەزار مارتين - فون - بريۋل - گونسالەس - جۋنيور - ءتىس دارىگەرى + پروءەسسوت + ادا كورنەليا + نەلي + سەزار مارتين + فون + بريۋل + گونسالەس + جۋنيور + ءتىس دارىگەرى diff --git a/make/data/cldr/common/main/kl.xml b/make/data/cldr/common/main/kl.xml index 83f3643a1ef..e5a4b9e1c85 100644 --- a/make/data/cldr/common/main/kl.xml +++ b/make/data/cldr/common/main/kl.xml @@ -376,7 +376,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd @@ -1034,6 +1034,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 @@ -1193,7 +1199,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millimoli per literi {0} millimoli per literi - + {0} millioni ilaa {0} millioni ilaa @@ -1448,7 +1454,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kvadratfod - + millioni ilaa @@ -1657,7 +1663,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmol/L {0}mmol/L - + {0}ppm {0}ppm diff --git a/make/data/cldr/common/main/km.xml b/make/data/cldr/common/main/km.xml index f07aa1d935f..31c141661e4 100644 --- a/make/data/cldr/common/main/km.xml +++ b/make/data/cldr/common/main/km.xml @@ -48,6 +48,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ អាស៊ែបៃហ្សង់ អាហ្ស៊ែរី បាស្គៀ + បាលូឈី បាលី បាសា បេឡារុស @@ -62,7 +63,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ស៊ីកស៊ីកា អានី បាម្បារា - បង់ក្លាដែស + បង់ក្លា ទីបេ ប្រ៊ីស្តុន បូដូ @@ -160,7 +161,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ហ៊ីងលីង ហ៊ីលីហ្គេណុន ម៉ុង - ក្រូអាត + ក្រូអាស៊ី សូប៊ីលើ ហៃទី ហុងគ្រី @@ -222,6 +223,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ បាហ្វៀ កូឡូញ ឃឺដ + ឃឺដ + ឃឺរម៉ាន់ជី គូមីគ កូមី កូនីស @@ -457,7 +460,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ យ៉ីឌីស យរូបា ញីនហ្កាទូ - កន្តាំង + កាតាំង ចិនកាតាំង ហ្សួង តាម៉ាហ្សៃម៉ារ៉ុកស្តង់ដា @@ -657,6 +660,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ចិន កូឡុំប៊ី កោះ​ឃ្លីភឺតុន + សាខ កូស្តារីកា គុយបា កាប់វែរ @@ -887,50 +891,89 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ប្រតិទិន - ទម្រង់រូបិយបណ្ណ + ទម្រង់រូបិយប័ណ្ណ លំដាប់​តម្រៀប - រូបិយបណ្ណ + រូបិយប័ណ្ណ + រូបរាងរូបអារម្មណ៍ វដ្តម៉ោង (12 vs 24) - របៀបចុះបន្ទាត់ + ការចុះបន្ទាត់ភាសា CJK + ការចុះបន្ទាត់ក្នុងពាក្យ ប្រព័ន្ធវាស់វែង លេខ + ការបំបែកប្រយោគបន្ទាប់ពី Abbr ។ ប្រតិទិនពុទ្ធសាសនា + ពុទ្ធសាសនា ប្រតិទិន​ចិន + ចិន ប្រតិទិនកបទិច - ប្រតិទិនកូរ៉េ + កប់ទិក + ប្រតិទិនថានហ្គី + ថានហ្គី ប្រតិទិន​អេត្យូពី + អេត្យូពី ប្រតិទិនអេត្យូពីអាម៉េតេ​អាលែម - ប្រតិទិន​ហ្សកហ្ស៊ី + អេត្យូពីអាម៉េតេ​អាលែម + ប្រតិទិនហ្គ្រីហ្គររៀន + ហ្គ្រីហ្គររៀន ប្រតិទិនហេប្រឺ + ហេប្រឺ ប្រតិទិនអ៊ីស្លាម + ហ៊ីជ្រី ប្រតិទិនអ៊ិស្លាម (តារាង, សម័យស៊ីវិល) + ហ៊ីជ្រី (តាមតារាង, សម័យស៊ីវិល) ប្រតិទិនអ៊ិស្លាម (អ៊ុំអាល់គូរ៉ា) - ប្រតិទិន ISO-8601 + ហ៊ីជ្រី (អ៊ុំអាល់គូរ៉ា) + ប្រតិទិនហ្គ្រីហ្គររៀន (ឆ្នាំនៅពីមុខ) ប្រតិទិន​ជប៉ុន + ជប៉ុន ប្រតិទិនពែក្ស + ពែក្ស ប្រតិទិនមីងគ័រ - ទម្រង់រូបិយបណ្ណគណនី - ទម្រង់រូបិយបណ្ណបទដ្ឋាន + មីងគ័រ + ទម្រង់រូបិយប័ណ្ណគណនេយ្យ + គណនេយ្យ + ទម្រង់រូបិយប័ណ្ណស្តង់ដា + ស្តង់ដា លំដាប់​តម្រៀប​យូនីកូដ​លំនាំដើម - ស្វែងរក​ទូទៅ - លំដាប់​តម្រៀប​ស្តង់ដារ + យូនីកូដ​លំនាំដើម + ការស្វែងរកក្នុងគោលបំណងទូទៅ + ស្វែងរក + លំដាប់​តម្រៀប​ស្តង់ដា + ស្តង់ដា + លំនាំដើម + រូបអារម្មណ៍ + អក្សរ ប្រព័ន្ធ 12 ម៉ោង (0–11) + 12 (0–11) ប្រព័ន្ធ 12 ម៉ោង (1–12) + 12 (1–12) ប្រព័ន្ធ 24 ម៉ោង (0–23) + 24 (0–23) ប្រព័ន្ធ 24 ម៉ោង (1–24) - របៀបចុះបន្ទាត់ខ្លី - របៀបចុះបន្ទាត់ធម្មតា - របៀបចុះបន្ទាត់តឹងរឹង - ប្រព័ន្ធវាស់វែងម៉ាទ្រិក - ប្រព័ន្ធវាស់វែងចក្រព័ទ្ធ - ប្រព័ន្ធវាស់វែងអាមេរិក + 24 (1–24) + បែបបទចុះបន្ទាត់ធូររលុង + ធូររលុង + បែបបទចុះបន្ទាត់ធម្មតា + ធម្មតា + បែបបទចុះបន្ទាត់តឹងរ៉ឹង + តឹងរ៉ឹង + បំបែកទាំងអស់ + រក្សាទាំងអស់ + ធម្មតា + រក្សាក្នុងឃ្លា + ប្រព័ន្ធម៉ែត្រ + ម៉ែត្រ + ប្រព័ន្ធរង្វាស់អង់គ្លេស + ចក្រភពអង់គ្លេស + ប្រព័ន្ធរង្វាស់សហរដ្ឋអាម៉េរិក + សហរដ្ឋអាម៉េរិក លេខ​ឥណ្ឌា-អារ៉ាប់ លេខ​ឥណ្ឌា-អារ៉ាប់​ពង្រីក លេខ​អាមេនី លេខ​តូច​អាមេនី - លេខ​បង់ក្លាដែស + លេខ​បង់ក្លា លេខចាក់ម៉ា លេខ​ឌីវ៉ាណាការី លេខ​អេត្យូពី @@ -966,6 +1009,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ លេខ​ថៃ លេខទីបេ លេខវ៉ៃ + បិទ + បើក រង្វាស់​ប្រវែង @@ -1025,6 +1070,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} នៅ​ម៉ោង {0} + + {1} នៅម៉ោង {0} + @@ -1033,23 +1081,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} នៅ​ម៉ោង {0} + + {1} នៅម៉ោង {0} + {1}, {0} + + {1} {0} + + + {1} {0} + {1}, {0} + + {1} {0} + + + {1} {0} + d E y G + M/y G + E d/M/y G MMM y G d MMM y G E, d MMM y G + ម៉HH v d/M E d/M d MMM @@ -1380,6 +1446,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} នៅ​ម៉ោង {0} + + {1} នៅម៉ោង {0} + @@ -1388,23 +1457,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} នៅ​ម៉ោង {0} + + {1} នៅម៉ោង {0} + {1}, {0} + + {1} នៅម៉ោង {0} + {1}, {0} + + {1} នៅម៉ោង {0} + d E y G + M/y G + E d/M/y G MMM y G d MMM y G E d MMM y G + ម៉HH v d/M E d/M d MMM @@ -2136,6 +2217,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ អ៊ីស្ទ័រ + + កូយអៃកេ + ពុនតា អារ៉េណា @@ -2401,9 +2485,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ភ្នំពេញ - អ៊ីនដឺប៊ូរី - - កាន់តុន @@ -3073,9 +3154,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ម៉ោង​នៅ​អាហ្វ្រិក​ខាង​លិច - ម៉ោង​ស្តង់ដារ​នៅ​អាហ្វ្រិក​ខាង​លិច - ម៉ោងនៅ​អាហ្វ្រិក​​​ខាងលិច​​នារដូវ​ក្ដៅ​ + ម៉ោង​នៅ​អាហ្វ្រិក​ខាង​លិច @@ -3425,6 +3504,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ម៉ោង​នៅ​ហ្គីយ៉ាន + + + ម៉ោង​ស្តង់ដារ​​នៅ​ហាវៃ-អាល់ដ្យូសិន + + ម៉ោង​​នៅ​ហាវៃ-អាល់ដ្យូសិន @@ -3971,7 +4055,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00¤ - #,##0.00 ¤ + #,##0.00 ¤ #,##0.00¤;(#,##0.00¤) @@ -3981,30 +4065,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ¤0 ពាន់ - ¤ 0 ពាន់ - ¤00 ពាន់ - ¤ 00 ពាន់ - ¤000 ពាន់ - ¤ 000 ពាន់ - ¤0 លាន - ¤ 0 លាន - ¤00 លាន - ¤ 00 លាន - ¤000 លាន - ¤ 000 លាន - ¤0 ប៊ីលាន - ¤ 0 ប៊ីលាន - ¤00 ប៊ីលាន - ¤ 00 ប៊ីលាន - ¤000 ប៊ីលាន - ¤ 000 ប៊ីលាន - ¤0 ទ្រីលាន - ¤ 0 ទ្រីលាន - ¤00 ទ្រីលាន - ¤ 00 ទ្រីលាន - ¤000 ទ្រីលាន - ¤ 000 ទ្រីលាន + 0ពាន់¤ + 0ពាន់ ¤ + 00 ពាន់¤ + 00 ពាន់ ¤ + 000 ពាន់¤ + 000 ពាន់ ¤ + 0 លាន¤ + 0 លាន ¤ + 00 លាន¤ + 00 លាន ¤ + 000 លាន¤ + 000 លាន ¤ + 0 ប៊ីលាន¤ + 0 ប៊ីលាន ¤ + 00 ប៊ីលាន¤ + 00 ប៊ីលាន ¤ + 000 ប៊ីលាន¤ + 000 ប៊ីលាន ¤ + 0 ទ្រីលាន¤ + 0 ទ្រីលាន ¤ + 00 ទ្រីលាន¤ + 00 ទ្រីលាន ¤ + 000 ទ្រីលាន¤ + 000 ទ្រីលាន ¤ @@ -4022,7 +4106,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ដ្រាំ​អាមេនី - ហ្គីឌិន​ហុល្លង់​អង់ទីលៀន + ហ្គីលឌ័រអាំងទីលហូឡង់ ក្វាន់ហ្សា​អង់ហ្គោឡា @@ -4367,7 +4451,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ រីយ៉ាលកាតា - រីយ៉ាលកាតា លូ​រូម៉ានី @@ -4495,6 +4578,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ដុល្លារ​ការ៉ាប៊ីន​ខាង​កើត + + ហ្គីលឌ័រការីបៀន + ហ្គីលឌ័រការីបៀន + ហ្វ្រង់ CFA អាហ្វ្រិកខាងលិច @@ -4517,6 +4604,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ក្វាចាហ្សំប៊ី + + ហ្កូលស៊ីមបាវ៉េ + ហ្កូលស៊ីមបាវ៉េ + {0}+ @@ -4663,7 +4754,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ មិល្លីម៉ូលក្នុងមួយលីត្រ {0} មិល្លីម៉ូលក្នុងមួយលីត្រ - + ផ្នែកក្នុងមួយលាន {0} ផ្នែកក្នុងមួយលាន @@ -5128,6 +5219,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ រង្វាស់ពែង {0} រង្វាស់ពែង + + អោនស៍រាវម៉ែត្រ + {0} អោនស៍រាវម៉ែត្រ + {0} អាហ្វីត @@ -5174,17 +5269,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ត្រាម {0} ត្រាម - - ពន្លឺ - {0} ពន្លឺ + + ប៊ែកគ័ររែល + {0} ប៊ែកគ័ររែល - + ផ្នែកក្នុងមួយប៊ីលាន {0} ផ្នែកក្នុងមួយប៊ីលាន - យប់ - {0} យប់ {0} ក្នុងមួយយប់ @@ -5486,7 +5579,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ពន្លឺ {0} ពន្លឺ - + ផ្នែក/ប៊ីលាន @@ -5590,7 +5683,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} វ. - {0} សេះ + {0}hp mmHg @@ -5625,18 +5718,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}L - - ពន្លឺ - {0} ពន្លឺ - - + {0}ppb - - យប់ - {0} យប់ - {0}/យប់ - diff --git a/make/data/cldr/common/main/kn.xml b/make/data/cldr/common/main/kn.xml index 344df888bb8..53ceb0c9116 100644 --- a/make/data/cldr/common/main/kn.xml +++ b/make/data/cldr/common/main/kn.xml @@ -286,6 +286,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಬಫಿಯ ಕಲೊಗ್ನಿಯನ್ ಕುರ್ದಿಷ್ + ಕುರ್ದಿಷ್ + ಕುರ್ಮಂಜಿ ಕುಮೈಕ್ ಕುಟೇನಾಯ್ ಕೋಮಿ @@ -816,6 +818,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಚೀನಾ ಕೊಲಂಬಿಯಾ ಕ್ಲಿಪ್ಪರ್‌ಟಾನ್ ದ್ವೀಪ + ಸಾರ್ಕ್ ಕೊಸ್ಟಾ ರಿಕಾ ಕ್ಯೂಬಾ ಕೇಪ್ ವರ್ಡೆ @@ -1062,34 +1065,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಸಂಖ್ಯೆ ವಿಂಗಡಣೆ ವಿಂಗಡಣೆ ಸಾಮರ್ಥ್ಯ ಕರೆನ್ಸಿ + ಎಮೋಜಿ ಪ್ರೆಸೆಂಟೇಶನ್ ಕಾಲ ಚಕ್ರ (12 ವಿರುದ್ಧ 24) ಲೈನ್ ಬ್ರೇಕ್ ಶೈಲಿ + ಪದಗಳ ಮಧ್ಯ ಲೈನ್ ಬ್ರೇಕ್‌ಗಳು ಮಾಪನ ವ್ಯವಸ್ಥೆ ಸಂಖ್ಯೆಗಳು + ಸಂಕ್ಷಿಪ್ತರೂಪದ ನಂತರ ವಾಕ್ಯ ವಿರಾಮ ಸಮಯ ವಲಯ ಸ್ಥಳೀಯ ಭಿನ್ನತೆ ಖಾಸಗಿ ಬಳಕೆ ಬೌದ್ಧರ ಕ್ಯಾಲೆಂಡರ್ + ಬೌದ್ಧ ಚೈನೀಸ್ ಕ್ಯಾಲೆಂಡರ್ + ಚೈನೀಸ್ ಕೋಪ್ಟಿಕ್ ಕ್ಯಾಲೆಂಡರ್ + ಕೋಪ್ಟಿಕ್ ಡಾಂಗಿ ಕ್ಯಾಲೆಂಡರ್ + ಡಾಂಗಿ ಇಥಿಯೋಪಿಕ್ ಕ್ಯಾಲೆಂಡರ್ + ಇಥಿಯೋಪಿಕ್ ಇಥಿಯೋಪಿಕ್ ಅಮೆಟೆ ಅಲೆಮ್ ಕ್ಯಾಲೆಂಡರ್ + ಇಥಿಯೋಪಿಕ್ ಅಮೆಟೆ ಅಲೆಮ್ ಗ್ರೆಗೋರಿಯನ್ ಕ್ಯಾಲೆಂಡರ್ + ಗ್ರೆಗೋರಿಯನ್ ಹೀಬ್ರೂ ಕ್ಯಾಲೆಂಡರ್ + ಹೀಬ್ರೂ ಭಾರತೀಯ ರಾಷ್ಟ್ರೀಯ ಕ್ಯಾಲೆಂಡರ್ + ಭಾರತೀಯ ರಾಷ್ಟ್ರೀಯ ಇಸ್ಲಾಮಿಕ್ ಕ್ಯಾಲೆಂಡರ್ + ಹಿಜ್ರಿ ಇಸ್ಲಾಮಿಕ್-ಸಿವಿಲ್ ಕ್ಯಾಲೆಂಡರ್ + ಹಿಜ್ರಿ (ಟ್ಯಾಬುಲರ್, ನಾಗರಿಕ ಯುಗ) ಇಸ್ಲಾಮಿಕ್‌ ಕ್ಯಾಲೆಂಡರ್‌ (ಸೌದಿ ಅರೇಬಿಯಾ, ಸೈಟಿಂಗ್‌)bia, sighting) ಇಸ್ಲಾಮಿಕ್ ಕ್ಯಾಲೆಂಡರ್ (ಉಮ್ ಅಲ್-ಖುರಾ) + ಹಿಜ್ರಿ (ಉಮ್ ಅಲ್-ಖುರಾ) ISO-8601 ಕ್ಯಾಲೆಂಡರ್ ಜಪಾನೀಸ್ ಕ್ಯಾಲೆಂಡರ್ + ಜಪಾನೀಸ್ ಪರ್ಷಿಯನ್ ಕ್ಯಾಲೆಂಡರ್ + ಪರ್ಷಿಯನ್ ಮಿಂಗೋ ಕ್ಯಾಲೆಂಡರ್ + ಮಿಂಗೋ ಅಕೌಂಟಿಂಗ್ ಕರೆನ್ಸಿ ಸ್ವರೂಪ + ಅಕೌಂಟಿಂಗ್ ಪ್ರಮಾಣಿತ ಕರೆನ್ಸಿ ಸ್ವರೂಪ + ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಚಿಹ್ನೆಗಳನ್ನು ವಿಂಗಡಿಸಿ ನಿರ್ಲಕ್ಷಿಸಿದ ಚಿಹ್ನೆಗಳನ್ನು ವಿಂಗಡಿಸಿ ಉಚ್ಛಾರಣೆಯನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ವಿಂಗಡಿಸಿ @@ -1099,20 +1122,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಮೊದಲು ಅಪ್ಪರ್‌ಕೇಸ್ ಅನ್ನು ವಿಂಗಡಿಸಿ ಕೇಸ್ ಇನ್‌ಸೆಂಟೀವ್ ಅನ್ನು ವಿಂಗಡಿಸಿ ಕೇಸ್‌ ಸೆನ್ಸಿಟೀವ್‌‌ ವಿಂಗಡಿಸಿ - ಸಾಂಪ್ರದಾಯಿಕ ಚೀನಾದ ಅನುಕ್ರಮ ವಿನ್ಯಾಸ - ದೊಡ್ಡ ಐದು ಹೊಂದಾಣಿಕೆಯ ಸಲುವಾಗಿ ಹಿಂದಿನ ವಿಂಗಡಣಾ ಕ್ರಮ ಡಿಕ್ಷನರಿ ಅನುಕ್ರಮ ವಿನ್ಯಾಸ ಡೀಫಾಲ್ಟ್ ಯೂನಿಕೋಡ್ ವಿಂಗಡಣೆ ಕ್ರಮ + ಡೀಫಾಲ್ಟ್ ಯೂನಿಕೋಡ್ ಯುರೋಪಿನ ಅನುಕ್ರಮ ನಿಯಮಗಳು - ಸರಳೀಕೃತ ಚೈನೀಸ್ ವಿಂಗಡಣೆ ಕ್ರಮ - GB2312 ಫೋನ್‌ಬುಕ್ ವಿಂಗಡಣೆ ಕ್ರಮ ಉಚ್ಛಾರಣಾನುರೂಪವಾಗಿ ವಿಂಗಡಣೆ ಕ್ರಮ ಪಿನ್‌ಯಿನ್ ವಿಂಗಡಣೆ ಕ್ರಮ ಸಾಮಾನ್ಯ- ಉದ್ದೇಶ ಹುಡುಕಾಟ + ಹುಡುಕಾಟ ಹಂಗುಲ್ ಆದ್ಯಕ್ಷರ ವ್ಯಂಜನದ ಮೂಲಕ ಹುಡುಕಿ ಪ್ರಮಾಣೀಕೃತ ವಿಂಗಡಣೆ ಕ್ರಮ + ಪ್ರಮಾಣೀಕೃತ ಸ್ಟ್ರೋಕ್ ವಿಂಗಡಣೆ ಕ್ರಮ ಸಾಂಪ್ರದಾಯಿಕ ವಿಂಗಡಣೆ ಕ್ರಮ + ಸಾಂಪ್ರದಾಯಿಕ ರ್ಯಾಡಿಕಲ್-ಸ್ಟ್ರೋಕ್ ವಿಂಗಡಣೆ ಕ್ರಮ ಸಾಮಾನ್ಯ ಸ್ಥಿತಿಯನ್ನು ಹೊರತುಪಡಿಸಿ ವಿಂಗಡಿಸಿ ಸಾಮಾನ್ಯವಾದ ಯೂನಿಕೋಡ್ ಅನ್ನು ವಿಂಗಡಿಸಿ @@ -1126,18 +1151,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಪೂರ್ಣಅಗಲಕ್ಕೆ ಅರೆಅಗಲಕ್ಕೆ ಸಂಖ್ಯೆ + ಡೀಫಾಲ್ಟ್ + ಎಮೋಜಿ + ಪಠ್ಯ 12 ಗಂಟೆ ವ್ಯವಸ್ಥೆ (0–11) + 12 (0–11) 12 ಗಂಟೆ ವ್ಯವಸ್ಥೆ (1–12) + 12 (1–12) 24 ಗಂಟೆ ವ್ಯವಸ್ಥೆ (0–23) + 24 (0–23) 24 ಗಂಟೆ ವ್ಯವಸ್ಥೆ (1–24) + 24 (1–24) ಲೂಸ್ ಲೈನ್ ಬ್ರೇಕ್ ಶೈಲಿ + ಲೂಸ್ ಸಾಮಾನ್ಯ ಲೈನ್ ಬ್ರೇಕ್ ಶೈಲಿ + ಸಾಮಾನ್ಯ ಕಟ್ಟುನಿಟ್ಟಾದ ಲೈನ್ ಬ್ರೇಕ್ ಶೈಲಿ + ಕಟ್ಟು ನಿಟ್ಟು + ಎಲ್ಲವನ್ನು ಬ್ರೇಕ್ ಮಾಡಿ + ಎಲ್ಲವನ್ನು ಇರಿಸಿಕೊಳ್ಳಿ + ಸಾಮಾನ್ಯ + ಪದಗುಚ್ಛಗಳಲ್ಲಿ ಇರಿಸಿಕೊಳ್ಳಿ ಯುಎಸ್ ಬಿಜಿಎನ್ ಲಿಪ್ಯಂತರಣ ಯುಎಸ್ ಜಿಇಜಿಎನ್ ಲಿಪ್ಯಂತರಣ ಮೆಟ್ರಿಕ್ ಪದ್ಧತಿ + ಮೆಟ್ರಿಕ್ ಇಂಪಿರಿಯಲ್ ಮಾಪನ ವ್ಯವಸ್ಥೆ + ಯುನೈಟೆಡ್ ಕಿಂಗ್‌ಡಮ್ ಅಮೇರಿಕಾದ ಮಾಪನಾ ವ್ಯವಸ್ಥೆ + ಅಮೇರಿಕಾ ಅರೇಬಿಕ್-ಇಂಡಿಕ್ ಅಂಕೆಗಳು ವಿಸ್ತರಿಸಲಾದ ಅರೇಬಿಕ್-ಇಂಡಿಕ್ ಅಂಕೆಗಳು ಆರ್ಮೇನಿಯಾದ ಸಂಖ್ಯೆಗಳು @@ -1182,6 +1224,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಟಿಬೇಟಿಯನ್ ಅಂಕೆಗಳು ಸಾಂಪ್ರದಾಯಿಕ ಸಂಖ್ಯೆಗಳು ವಾಯ್ ಅಂಕೆಗಳು + ಆಫ್ + ಆನ್ ಮೆಟ್ರಿಕ್ @@ -1203,13 +1247,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [₹ {ರೂ}] - - [\--﹣ ‑ ‒ −⁻₋ ➖] - [,,﹐︐ ، ٫ 、﹑、︑] - - - [,,﹐︐ ٫] - @@ -1274,7 +1311,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -1302,6 +1339,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1310,9 +1350,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + d E + E, M/d/y G d/M E, d/M dd-MM @@ -1394,20 +1438,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - ಜನ - ಫೆಬ್ರ - ಮಾರ್ಚ್ - ಏಪ್ರಿ - ಮೇ - ಜೂನ್ - ಜುಲೈ - ಆಗ - ಸೆಪ್ಟೆಂ - ಅಕ್ಟೋ - ನವೆಂ - ಡಿಸೆಂ - ಫೆ @@ -1491,24 +1521,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಸಂಜೆ ರಾತ್ರಿ - - AM - PM - ಮಧ್ಯರಾತ್ರಿ - AM - PM - - - AM - PM - - - AM - PM @@ -1581,6 +1597,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} ರಂದು {0} ಸಮಯಕ್ಕೆ + + {1} {0} ಸಮಯಕ್ಕೆ + @@ -1589,6 +1608,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} ರಂದು {0} ಸಮಯಕ್ಕೆ + + {1} {0} ಸಮಯಕ್ಕೆ + @@ -1605,6 +1627,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} ಗೆ + d E @@ -2013,12 +2038,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಶುಕ್ರವಾರಗಳ ಹಿಂದೆ - - - {0} ಶುಕ್ರವಾರದ ಹಿಂದೆ - {0} ಶುಕ್ರವಾರಗಳ ಹಿಂದೆ - - ಕಳೆದ ಶನಿವಾರ ಈ ಶನಿವಾರ @@ -2035,9 +2054,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ AM/PM - - AM/PM - ಗಂಟೆ ಈ ಗಂಟೆ @@ -2438,6 +2454,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಈಸ್ಟರ್ + + ಕೊಯಯ್ಕಿ + ಪುಂತಾ ಅರೇನಾಸ್ @@ -2703,10 +2722,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ನೋಮ್ ಪೆನ್ - ಎಂಡರ್ಬರಿ - - - ಕ್ಯಾಂಟನ್ + ಕ್ಯಾಂಟನ್ ಐಲ್ಯಾಂಡ್ ಕಿರಿತಿಮತಿ @@ -3382,9 +3398,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾ ಸಮಯ - ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾ ಪ್ರಮಾಣಿತ ಸಮಯ - ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾ ಬೇಸಿಗೆ ಸಮಯ + ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾ ಸಮಯ @@ -3767,6 +3781,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಗಯಾನಾ ಸಮಯ + + + ಹವಾಯಿ-ಅಲ್ಯುಟಿಯನ್ ಪ್ರಮಾಣಿತ ಸಮಯ + + ಹವಾಯಿ-ಅಲ್ಯುಟಿಯನ್ ಸಮಯ @@ -4220,6 +4239,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಚುಕ್ ಸಮಯ + + + ಟರ್ಕಿ ಸಮಯ + ಟರ್ಕಿ ಪ್ರಮಾಣಿತ ಸಮಯ + ಟರ್ಕಿ ಬೇಸಿಗೆ ಸಮಯ + + ತುರ್ಕ್‌ಮೇನಿಸ್ತಾನ್ ಸಮಯ @@ -4374,8 +4400,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5195,6 +5219,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಪೂರ್ವ ಕೆರೀಬಿಯನ್ ಡಾಲರ್ ಪೂರ್ವ ಕೆರೀಬಿಯನ್ ಡಾಲರ್‌ಗಳು + + ಕೆರೆಬಿಯನ್ ಗಿಲ್ಡರ್ + ಕೆರೆಬಿಯನ್ ಗಿಲ್ಡರ್ + ಕೆರೆಬಿಯನ್ ಗಿಲ್ಡರ್‌ಗಳು + ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾದ CFA ಫ್ರಾಂಕ್ ಪಶ್ಚಿಮ ಆಫ್ರಿಕಾದ CFA ಫ್ರಾಂಕ್ @@ -5226,6 +5255,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಜಾಂಬಿಯಾ ಕ್ವಾಚ ಜಾಂಬಿಯಾ ಕ್ವಾಚಗಳು + + ಜಿಂಬಾಬ್ವಿಯನ್ ಗೋಲ್ಡ್ + ಜಿಂಬಾಬ್ವಿಯನ್ ಗೋಲ್ಡ್ + ಜಿಂಬಾಬ್ವಿಯನ್ ಗೋಲ್ಡ್ + {0}+ @@ -5611,7 +5645,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ವಸ್ತುಗಳ {0} ವಸ್ತುಗಳಲ್ಲಿ - + + ಪಾರ್ಟ್ಸ್ + {0} ಪಾರ್ಟ್ + {0} ಪಾರ್ಟ್ಸ್ + + neuter ಪ್ರತಿ ಮಿಲಿಯನ್ ಭಾಗಗಳು {0} ಪ್ರತಿ ಮಿಲಿಯನ್ ಭಾಗವು @@ -5681,6 +5720,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಮೋಲ್‌ಗಳ {0} ಮೋಲ್‌ಗಳಲ್ಲಿ + + {0} ಗ್ಲೂಕೋಸ್ + {0} ಗ್ಲೂಕೋಸ್ + neuter ಲೀಟರ್‌ಗಳು ಪ್ರತಿ ಕಿಲೋಮೀಟರಿಗೆ @@ -5881,6 +5924,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಶತಮಾನಕ್ಕೆ {0} ಶತಮಾನದ {0} ಶತಮಾನದಲ್ಲಿ + {0} ಶತಮಾನ {0}ಶತಮಾನಗಳು {0} ಶತಮಾನಗಳನ್ನು {0} ಶತಮಾನಗಳಿಗೆ @@ -5903,11 +5947,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter - {0} ವರ್ಷವು + {0} ವರ್ಷ {0} ವರ್ಷವನ್ನು {0} ವರ್ಷಕ್ಕೆ {0} ವರ್ಷದ {0} ವರ್ಷದಲ್ಲಿ + {0} ವರ್ಷ {0} ವರ್ಷಗಳು {0} ವರ್ಷಗಳನ್ನು {0} ವರ್ಷಗಳಿಗೆ @@ -5975,7 +6020,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter - {0} ಗಂಟೆಯು + {0} ಗಂಟೆ {0} ಗಂಟೆಯನ್ನು {0} ಗಂಟೆಗೆ {0} ಗಂಟೆಯ @@ -6360,7 +6405,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಡಾಟ್‌ಗಳು - ಭೂಮಿಯ ತ್ರಿಜ್ಯ {0} ಭೂಮಿಯ ತ್ರಿಜ್ಯ {0} ಭೂಮಿಯ ತ್ರಿಜ್ಯ @@ -6714,10 +6758,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಕ್ಯಾರೆಟ್‌ಗಳ {0} ಕ್ಯಾರೆಟ್‌ಗಳಲ್ಲಿ - - {0} ಡಿಎ - {0} ಡಿಎ - ಭೂಮಿಯ ದ್ರವ್ಯರಾಶಿಗಳು {0} ಭೂಮಿಯ ದ್ರವ್ಯರಾಶಿ @@ -6806,15 +6846,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ ಅನ್ನು + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ಗೆ + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ನ + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ನಲ್ಲಿ {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು - {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌ಗಳು + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ಗಳನ್ನು + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ಗಳಿಗೆ + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ಗಳ + {0} ಮರ್ಕ್ಯುರಿ ಮಿಲಿಮೀಟರ್‌‌ಗಳಲ್ಲಿ + + + ಮರ್ಕ್ಯೂರಿ + {0} ಮರ್ಕ್ಯೂರಿ + {0} ಮರ್ಕ್ಯೂರಿ ಪೌಂಡ್ಸ್-ಫೋರ್ಸ್ ಪ್ರತಿ ಚದರ ಇಂಚಿಗೆ @@ -7209,6 +7254,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಮೆಟ್ರಿಕ್‌ ಕಪ್‌ಗಳ {0} ಮೆಟ್ರಿಕ್‌ ಕಪ್‌ಗಳಲ್ಲಿ + + ಮೆಟ್ರಿಕ್ ಫ್ಲೂಯ್ಡ್ ಔನ್ಸ್‌ಗಳು + {0} ಮೆಟ್ರಿಕ್ ಫ್ಲೂಯ್ಡ್ ಔನ್ಸ್ + {0} ಮೆಟ್ರಿಕ್ ಫ್ಲೂಯ್ಡ್ ಔನ್ಸ್‌ಗಳು + ಎಕರೆ-ಅಡಿ {0} ಎಕರೆ-ಅಡಿ @@ -7293,9 +7343,73 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಇಂಪಿರಿಯಲ್ ಕ್ವಾರ್ಟ್ {0} ಇಂಪಿರಿಯಲ್ ಕ್ವಾರ್ಟ್ + + ಸ್ಟೆರಾಡಿಯನ್ಸ್ + {0} ಸ್ಟೆರಾಡಿಯನ್ + {0} ಸ್ಟೆರಾಡಿಯನ್ಸ್ + + + ಕ್ಯಾಟಲ್ಸ್ + {0} ಕ್ಯಾಟಲ್ + {0} ಕ್ಯಾಟಲ್ಸ್ + + + ಕೂಲಂಬ್ಸ್ + {0} ಕೂಲಂಬ್ + {0} ಕೂಲಂಬ್ಸ್ + + + ಫ್ಯಾರಡ್ಸ್ + {0} ಫ್ಯಾರಡ್ + {0} ಫ್ಯಾರಡ್ಸ್ + + + ಹೆನ್ರಿಸ್ + {0} ಹೆನ್ರಿ + {0} ಹೆನ್ರಿಸ್ + + + ಸೀಮೆನ್ಸ್ + {0} ಸೀಮೆನ್ಸ್ + {0} ಸೀಮೆನ್ಸ್ + + + ಕ್ಯಾಲೋರಿಗಳು [IT] + {0} ಕ್ಯಾಲೋರಿ [IT] + {0} ಕ್ಯಾಲೋರಿಗಳು [IT] + + + ಬೆಕೆರೆಲ್ಸ್ + {0} ಬೆಕೆರೆಲ್ + {0} ಬೆಕೆರೆಲ್ಸ್ + + + ಸೀವೆರ್ಟ್ + {0} ಸೀವೆರ್ಟ್ + {0} ಸೀವೆರ್ಟ್ಸ್ + + + ಗ್ರೇಸ್ + {0} ಗ್ರೇ + {0} ಗ್ರೇಸ್ + + + ಕಿಲೋಗ್ರಾಮ್ಸ್-ಫೋರ್ಸ್ + {0} ಕಿಲೋಗ್ರಾಂ-ಫೋರ್ಸ್ + {0} ಕಿಲೋಗ್ರಾಂ-ಫೋರ್ಸ್ + + + ಟೆಸ್ಲಾಸ್ + {0} ಟೆಸ್ಲಾ + {0} ಟೆಸ್ಲಾಸ್ + + + ವೆಬರ್ಸ್ + {0} ವೆಬರ್ + {0} ವೆಬರ್ಸ್ + neuter - ಲೈಟ್ {0} ಲೈಟ್ {0} ಲೈಟ್ ಅನ್ನು {0} ಲೈಟ್‌ಗೆ @@ -7307,7 +7421,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಲೈಟ್‌‌ನ {0} ಲೈಟ್‌ನಲ್ಲಿ - + neuter ಪಾರ್ಟ್ಸ್ ಪರ್ ಬಿಲಿಯನ್ {0} ಪಾರ್ಟ್ಸ್ ಪರ್ ಬಿಲಿಯನ್ @@ -7530,7 +7644,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ವಸ್ತು {0} ವಸ್ತು - + + ಪಾರ್ಟ್ + {0} ಪಾರ್ಟ್ + {0} ಪಾರ್ಟ್ + + ಭಾಗಗಳು/ಮಿಲಿಯನ್ {0} ಭಾಪ್ರಮಿ {0} ಭಾಪ್ರಮಿ @@ -7549,6 +7668,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಮೋಲ್ {0} ಮೋಲ್ + + Glc + {0} Glc + {0} Glc + ಲೀಟರ್‌ಗಳು/ಕಿಮೀ {0} ಲೀ/ಕಿ.ಮೀ @@ -7908,8 +8032,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಸ್ಕ್ಯಾಂ.ಮೈ - {0} smi - {0} smi ಪಾಯಿಂಟ್‌ಗಳು @@ -8317,12 +8439,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ಕ್ವಾ.ಇಂಪ್ {0} ಕ್ವಾ.ಇಂಪ್ + + {0} sr + {0} sr + + + ಕ್ಯಾಟ್ + {0} ಕ್ಯಾಟ್ + {0} ಕ್ಯಾಟ್ + + + {0} H + {0} H + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + ಲೈಟ್ {0} ಲೈಟ್ {0} ಲೈಟ್ - + ಪಾರ್ಟ್ಸ್/ಬಿಲಿಯನ್ @@ -8479,7 +8643,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ವಸ್ತು {0}ವಸ್ತು - + + ಪಾರ್ಟ್ + {0} ಪಾರ್ಟ್ + {0} ಪಾರ್ಟ್ + + ಭಾಪ್ರಮಿ {0}ಭಾಪ್ರಮಿ {0}ಭಾಪ್ರಮಿ @@ -8497,6 +8666,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ಮೋಲ್ {0}ಮೋಲ್ + + Glc + {0} Glc + {0} Glc + ಲೀ/ಕಿಮೀ @@ -9090,16 +9264,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt-Imp. {0}qt-Imp. - - ಲೈಟ್ - {0} ಲೈಟ್ - {0} ಲೈಟ್ + + ಕ್ಯಾಟ್ + {0} ಕ್ಯಾಟ್ + {0} ಕ್ಯಾಟ್ + + + cal-IT ರಾತ್ರಿಗಳು - {0} ರಾತ್ರಿಯು - {0} ರಾತ್ರಿಗಳು - {0}/ರಾತ್ರಿಗೆ {0}ಪೂ @@ -9459,7 +9633,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ಕ್ಯಾಥಿ - ಮಲ್ಲರ್ + ಮುಲ್ಲರ್ ಝಝಿಲಿಯಾ diff --git a/make/data/cldr/common/main/ko.xml b/make/data/cldr/common/main/ko.xml index 893a89500e8..dd0a8ad6869 100644 --- a/make/data/cldr/common/main/ko.xml +++ b/make/data/cldr/common/main/ko.xml @@ -296,6 +296,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 바피아어 콜로그니안어 쿠르드어 + 쿠르드어 + 쿠르만지 쿠믹어 쿠테네어 코미어 @@ -419,7 +421,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 오세트어 오세이지어 오스만 터키어 - 펀잡어 + 펀자브어 판가시난어 팔레비어 팜팡가어 @@ -866,6 +868,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 중국 콜롬비아 클리퍼턴섬 + 사크 코스타리카 쿠바 카보베르데 @@ -948,6 +951,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 세인트키츠 네비스 북한 대한민국 + 한국 쿠웨이트 케이맨 제도 카자흐스탄 @@ -1159,33 +1163,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 숫자 정렬 정렬 강도 통화 + 이모티콘 표시 시간표시법(12시, 24시) 줄바꿈 스타일 + 단어의 줄바꿈 계량법 숫자 + 약어 뒤 문장 구분 시간대 방언 공개 여부 불교력 + 불교 음력 + 콥트력 + 콥트 단기력 + 단기 에티오피아력 + 에티오피아 에티오피아 아메테 알렘력 + 에티오피아 아메테 알렘 양력 + 히브리력 + 히브리 인도력 히즈라력 + 히즈라 히즈라 상용력 + 히즈라 상용 히즈라력(움 알 쿠라) + 히즈라(움 알 쿠라) ISO-8601 달력 일본력 + 일본 페르시안력 + 페르시안 대만력 + 대만 회계 통화 형식 + 회계 표준 통화 형식 + 표준 기호 정렬 기호 무시 정렬 악센트 일반 정렬 @@ -1195,22 +1218,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 대문자 우선 정렬 대/소문자 무시 정렬 대/소문자 구분 정렬 - 중국어 번체 정렬 순서 (Big5) 호환성을 위해 이전 정렬 순서 + 호환성 사전 정렬순 + 사전 기본 유니코드 정렬 순서 + 기본 유니코드 유럽 정렬 규칙 - 중국어 간체 정렬 순서 (GB2312) 전화번호부순 + 전화번호부 소리나는 대로 정렬 순서 + 소리나는 대로 병음순 + 병음 범용 검색 + 검색 한글 자음으로 검색 표준 정렬 순서 + 표준 자획순 + 자획 전통 역법 + 전통 부수순 + 부수 주음순 + 주음 표준화 없이 정렬 유니코드 표준화 정렬 숫자별 정렬 @@ -1223,18 +1256,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 전각 반각 숫자 + 기본 + 이모티콘 + 텍스트 12시간제(0–11) + 12(0–11) 12시간제(1–12) + 12(1–12) 24시간제(0–23) + 24(0–23) 24시간제(1–24) + 24(1–24) 줄바꿈 - 넓게 + 넓게 줄바꿈 - 보통 + 보통 줄바꿈 - 좁게 + 좁게 + 모두 분리 + 모두 유지 + 일반 + 구 단위 유지 미국 지명위원회(BGN) 유엔 지명전문가 그룹(UNGEGN) 미터법 + 미터법 야드파운드법 + 영국식 미국 계량법 + 미국식 아라비아-인도식 숫자 확장형 아라비아-인도식 숫자 아르메니아 숫자 @@ -1292,6 +1342,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 티벳 숫자 전통적인 숫자 바이 숫자 + + 미터법 @@ -1312,9 +1364,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1551,6 +1600,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm B h:mm:ss d일 + E B h시 E B h:mm E B h:mm:ss d일 (E) @@ -1567,6 +1617,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H시 a h:mm a h:mm:ss + a h시 v + H시 v MMM M. d. M. d. (E) @@ -1751,14 +1803,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm B h:mm:ss d일 + E B h시 E B h:mm E B h:mm:ss d일 (E) d일 EEEE + E a h시 E a h:mm E a h:mm:ss G y년 + G y/M GGGGG y/M/d + G y/M/d (E) G y년 M월 G y년 M월 d일 G y년 M월 d일 (E) @@ -1768,6 +1824,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm:ss a h:mm a h:mm:ss + a h시 v + H시 v M월 M. d. M. d. (E) @@ -2041,50 +2099,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 저녁 - - 자정 - 정오 - 아침 - 오전 - 오후 - 저녁 - - - 자정 오전 - 정오 오후 - 아침 - 오전 - 오후 - 저녁 - - - 아침 - 오전 - 오후 - 저녁 - - - - 아침 - 오전 - 오후 - 저녁 - - 오전 오후 - 아침 - 오전 - 오후 - 저녁 - @@ -2180,16 +2203,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm B h:mm:ss d일 + (E) B h시 (E) B h:mm (E) B h:mm:ss d일 (E) d일 EEEE + (E) a h (E) a h:mm (E) HH:mm (E) a h:mm:ss (E) HH:mm:ss G y년 + G y/M GGGGG y/M/d + G y/M/d (E) G y년 MMM G y년 MMM d일 G y년 MMM d일 (E) @@ -2203,6 +2230,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ a h:mm:ss v H시 m분 s초 v a h:mm v + a h시 v + H시 v M월 M. d. M. d. (E) @@ -2328,11 +2357,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM d일~d일 - M월 d일 ~ M월 d일 + MMM d일~MMM d일 - M월 d일 (E) ~ d일 (E) - M월 d일 (E) ~ M월 d일 (E) + MMM d일 (E)~d일 (E) + MMM d일 (E)~MMM d일 (E) LLLL–LLLL @@ -2356,17 +2385,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y년 M월~M월 - y년 M월 ~ y년 M월 + y년 MMM~y년 MMM y년 M월 d일~d일 - y년 M월 d일 ~ M월 d일 - y년 M월 d일 ~ y년 M월 d일 + y년 MMM d일~MMM d일 + y년 MMM d일~y년 MMM d일 - y년 M월 d일 (E) ~ d일 (E) - y년 M월 d일 (E) ~ M월 d일 (E) - y년 M월 d일 (E) ~ y년 M월 d일 (E) + y년 MMM d일 (E)~d일 (E) + y년 MMM d일 (E)~MMM d일 (E) + y년 MMM d일 (E)~y년 MMM d일 (E) y년 M월 d일 EEEE ~ d일 EEEE @@ -2374,8 +2403,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y년 M월 d일 EEEE ~ y년 M월 d일 EEEE - y년 MMMM ~ MMMM - y년 MMMM ~ y년 MMMM + y년 MMMM~MMMM + y년 MMMM~y년 MMMM @@ -3329,6 +3358,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 이스터 섬 + + 코이아이케 + 푼타아레나스 @@ -3594,9 +3626,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 프놈펜 - 엔더베리 - - 칸톤 @@ -4273,9 +4302,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 서아프리카 시간 - 서아프리카 표준시 - 서아프리카 하계 표준시 + 서아프리카 시간 @@ -4392,30 +4419,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 오스트레일리아 중부 시간 - 오스트레일리아 중부 표준시 - 오스트레일리아 중부 하계 표준시 + 호주 중부 시간 + 호주 중부 표준시 + 호주 중부 하계 표준시 - 오스트레일리아 중서부 시간 - 오스트레일리아 중서부 표준시 - 오스트레일리아 중서부 하계 표준시 + 호주 중서부 시간 + 호주 중서부 표준시 + 호주 중서부 하계 표준시 - 오스트레일리아 동부 시간 - 오스트레일리아 동부 표준시 - 오스트레일리아 동부 하계 표준시 + 호주 동부 시간 + 호주 동부 표준시 + 호주 동부 하계 표준시 - 오스트레일리아 서부 시간 - 오스트레일리아 서부 표준시 - 오스트레일리아 서부 하계 표준시 + 호주 서부 시간 + 호주 서부 표준시 + 호주 서부 하계 표준시 @@ -4663,6 +4690,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 가이아나 시간 + + + 하와이 알류샨 표준시 + + 하와이 알류샨 시간 @@ -4766,9 +4798,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 대한민국 시간 - 대한민국 표준시 - 대한민국 하계 표준시 + 한국 시간 + 한국 표준시 + 한국 하계 표준시 @@ -5113,6 +5145,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 추크 시간 + + + 터키 시간 + 터키 표준시 + 터키 일광 절약 시간 + + 투르크메니스탄 시간 @@ -5228,8 +5267,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5528,7 +5565,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 이집트 파운드 - 에리트리아 나크파 + 에리트레아 낙파 스페인 페세타(예금) @@ -5988,7 +6025,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 튀르키예 리라 - 튀르키예 리라 트리니다드 토바고 달러 @@ -6078,6 +6114,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 동카리브 달러 + + 카리브 길더 + 카리브 길더 + 특별인출권 @@ -6148,6 +6188,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 짐바브웨 달러 + + 짐바브웨 골드 + 짐바브웨 골드 + 짐바브웨 달러 (2009) @@ -6354,10 +6398,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 리터당 밀리몰 리터당 {0}밀리몰 + + 분율 + {0}분율 + {0}몰 + + 포도당 + {0}포도당 + 킬로미터당 리터 킬로미터당 {0}리터 @@ -6734,6 +6786,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 수은주밀리미터 {0}수은주밀리미터 + + 수은주 + {0}수은주 + 제곱인치당 파운드 {0}제곱인치당 파운드 @@ -6868,6 +6924,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 미터식 컵 {0}미터식 컵 + + 미터식 액량 온스 + {0}미터식 액량 온스 + 에이커 피트 {0}에이커 피트 @@ -6942,12 +7002,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 영국 쿼트 {0}영국 쿼트 - - {0}ppb + + 스테라디안 + {0}스테라디안 + + + 캐탈 + {0}캐탈 + + + 쿨롬 + {0}쿨롬 + + + 패럿 + {0}패럿 + + + 헨리 + {0}헨리 + + + 지멘스 + {0}지멘스 + + + 칼로리[IT] + {0}칼로리[IT] + + + 베크렐 + {0}베크렐 + + + 시버트 + {0}시버트 + + + 그레이 + {0}그레이 + + + 킬로그램힘 + {0}킬로그램힘 + + + 테슬라 + {0}테슬라 + + + 웨버 + {0}웨버 + + + 광속 + {0}광속 - - {0}박 1박당 {0} @@ -7026,12 +7137,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 항목 {0}개 항목 - + + {0}part + + {0}ppm {0}mol + + Glc + {0}Glc + {0}L/km @@ -7371,6 +7489,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmHg {0}mmHg + + {0}Hg + {0}psi @@ -7466,6 +7587,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc + + {0}fl oz m. + {0}ac ft @@ -7527,7 +7651,50 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt Imp. - + + {0}sr + + + {0}kat + + + {0}C + + + {0}F + + + {0}H + + + {0}S + + + cal-IT + {0}cal-IT + + + {0}Bq + + + {0}Sv + + + {0}Gy + + + {0}kgf + + + {0}T + + + {0}Wb + + + {0}light + + {0}ppb @@ -7540,6 +7707,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + {0}part + + + Glc + {0}Glc + B @@ -7567,23 +7741,64 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}HP + + {0}Hg + {0}mph B{0} + + {0}fl oz m. + dsp Imp {0}dsp-Imp - - {0}ppb + + {0}sr - - - {0}박 - {0}/박 + + {0}kat + + + {0}C + + + {0}F + + + {0}H + + + {0}S + + + cal-IT + {0}cal-IT + + + {0}Bq + + + {0}Sv + + + {0}Gy + + + {0}kgf + + + {0}T + + + {0}Wb + + + {0}light diff --git a/make/data/cldr/common/main/kok.xml b/make/data/cldr/common/main/kok.xml index 061136411d8..a26bb0ab07f 100644 --- a/make/data/cldr/common/main/kok.xml +++ b/make/data/cldr/common/main/kok.xml @@ -27,12 +27,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic आरागोनिस ओबोलो अंगिका - अरेबिक - आधुनिक प्रमाणित अरेबिक + अरबी + आधुनिक प्रमाणित अरबी मापुचे अरापाहो नाझदी अरबी - आसामी + असमिया असु अस्टुरियान अटिकामेक्वु @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic अझरबैजानी अझेरी बष्किर + Baluchi बालिनीज बस्सा बेलारुशियन @@ -55,7 +56,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic सिकसिका अनी बंबारा - बांग्ला + बांगला तिबेटी ब्रेटन बोडो @@ -102,7 +103,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic डोगरीब झर्मा डोग्री - लोवर सोर्बियन + सकयलें सोर्बियन डुआला दिवेही जोला-फोन्यी @@ -160,8 +161,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic हैदा हवायियान दक्षिणी हैदा - हिब्रू + हेब्रेव हिन्दी + हिन्दी (रोमी) हिंग्लीश हिलीगायनॉन मोंग @@ -177,7 +179,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic आयबन ईबिबियो इंडोनेशियन - इन्टरलिंग् + इन्टरलिंग्वे इग्बो सिच्युआन यी इनूपेयाक् @@ -227,13 +229,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic बाफिया कोलोनियन कर्दिश + कर्दिश + कुर्मनजी कुमयक कोमी कोर्निश क्वाकवाला कुवी किर्गिझ - लॅटिन + लातीन लाडिनो लांगी लक्झेम्बर्गीश @@ -296,13 +300,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic नामा नॉर्वेजियन बोकमाल उत्तर डेबेले - लोवर जर्मन + सकयलें जर्मन नेपाळी नेवारी डोंगा नियास नायान - डच + हाॅलँडी फ्लेमिश क्वासीयो नॉर्वेजियन नायनोर्स्क @@ -311,7 +315,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic नोगाय नको दक्षिण डेबेले - उत्तरीय सोथो + उत्तरी सोथो न्युयर नावाजो नांन्जा @@ -464,7 +468,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic चिनी, कॅण्टोनीस झ्हुन्ग प्रमाणीत मॉरोक्कन तमाझीट - चिनी + चीनी चिनी, मंडारीन सोंपी चिनी सोंपी मंडारीन चिनी @@ -472,7 +476,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic पारंपारीक मंडारीन चिनी झुलू झुनी - अणकार सामुग्री ना + भाशीक मजकूर ना झाझा @@ -510,7 +514,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -522,7 +526,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -546,11 +550,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic अस्तंत आफ्रिका मध्य अमेरिका उदेंत आफ्रिका - उत्तरीय आफ्रिका + उत्तरी आफ्रिका मध्य आफ्रिका - दक्षिण आफ्रिका + दक्षिणी आफ्रिका अमेरिकास - उत्तरीय अमेरिका + उत्तरी अमेरिका कॅरिबियन उदेंत आशिया दक्षिण आशिया @@ -565,85 +569,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic अस्तंत आशिया युरोप उदेंत युरोप - उत्तर युरोप + उत्तरी येरोप अस्तंत युरोप उप-सहाराई आफ्रिका लॅटीन अमेरिका - असेंशन आयलँड - अंडोरा - युनाइटेड अरब इमीरात + असँसांव जुंवो + आंडोरा + संयुक्त अरबी अमीरात अफगानिस्तान - एँटिगुआ आनी बारबुडा - अंगुला - अल्बानीया - आर्मीनीया + अँटिगुआ आनी बार्बुडा + अँग्विला + आल्बान्या + अर्मेनिया अंगोला अंटार्क्टिका - अर्जेंटिना - अमेरिकी सामोआ + आर्जेंटीना + अमेरिकेचो सामोआ ऑस्ट्रिया - ऑस्ट्रेलीया + ऑस्ट्रेलिया अरुबा - अलांड जुवे - अजरबैजान - बोस्निया आनी हेर्जेगोविना - बारबाडोस + ओलँड जुंवे + आजरबैजान + बॉस्निया आनी हर्जेगोविना + बार्बाडोस बांगलादेश बेल्जियम - बुर्किना फॅसो - बल्गेरीया - बेहरेन + बुर्कीना फासो + बुल्गारिया + बाहरेन बुरुंडी बेनीन - सॅंट बार्थेल्मी + सांव बार्टोलोमेव बर्मुडा ब्रूनेई - बोलिव्हिया - कॅरिबियन निदरलँड + बोलिविया + कॅरिबियन नॅदरलँड ब्राझील - बहामास + बाहामास भूतान - बोवट आयलँड - बोत्सवाना + बोउवे जुंवो + बोट्स्वाना बेलारूस बेलिझ कॅनडा - कोकोस (कीलिंग) आयलँड - कोंगो - किंशासा - कोंगो (डीआरसी) - मध्य अफ्रीकी लोकसत्तकराज्य + कोकोस (कीलिंग) जुंवे + काँगो - किंशासा + मदलें अफ्रीकी प्रजासत्तो कोंगो - ब्राझाविला - कोंगो (प्रजासत्ताक) - स्विट्ज़रलैंड - कोत द’ईवोआर - आयवोरी कोस्ट - कुक आयलँड्स + काँगो - ब्राज़ाविल + स्वित्झरलँड + कोस्ता दो मारफ़ीम + कुक जुंवे चिली - कॅमेरून + कॅमरून चीन कोलंबिया - क्लिपरटॉन आयलँड + क्लिपर्टन जुंवो + सार्क कोस्ता रिका क्युबा - केप वर्दी - कुरसावो - क्रिसमस आयलँड - सायप्रस + काबो वेर्दे + कुरासाव + ख्रिसमस जुंवो + सिप्रुस चेकिया - चेक लोकसत्ताक जर्मनी - दिगो गार्सिया + डिएगो गार्सिया जिबूती डेनमार्क - डोमिनीका - डोमिनिकन प्रजासत्ताक - अल्जेरिया - सिटा आनी मेलिल्ला - इक्वाडोर + डोमिनिका + डोमिनिकन प्रजासत्तो + अल्जीरिया + सेउता आनि मेलिया + एक्वाडोर एस्टोनिया - ईजिप्त - अस्तंत सहारा - इरिट्रिया + एजिप्त + अस्तंती सहारा + एरिट्रिया स्पेन इथियोपिया युरोपियन युनियन @@ -651,89 +653,87 @@ CLDR data files are interpreted according to the LDML specification (http://unic फिनलँड फिजी फ़ॉकलैंड आइलैंड्स - फ़ॉकलैंड आइलैंड्स (इलास मालविनास) - मायक्रोनेशिया - फैरो आयलँड्स + मायक्रोनिशिया + फेरो जुंवे फ्रान्स - गॅबोन + गाबॉन युनायटेड किंगडम - युके - ग्रेनॅडा + संयुक्त राजवट + ग्रेनाडा जॉर्जिया - फ्रेन्च गयाना - गर्नसी + फ्रांसेझ गियॅना + गॅर्नजी घाना जिब्राल्टर ग्रीनलँड - गॅम्बिया - गुएनिया - ग्वाडेलोप - इक्वेटोरियल गुएनिया + गाम्बिया + गिनी + ग्वाडलूप + भूमध्यरेखी गिनी ग्रीस - दक्षिण जोर्जिया आनी दक्षिण सॅण्डविच आयलँड्स + दक्षिण जॉर्जिया आनी दक्षिण सँडविच जुंवे ग्वाटेमाला गुआम - गुअनिया-बिसाउ - गयाना - हाँग काँग एसएआर चीन - हाँग काँग - हर्ड ऍंड मॅक्डोनाल्ड आयलँड्स - हॉनडुरस - क्रोयेशीया + गिनी-बिसाउ + गियॅना + हाँग काँग + हर्ड आनि मॅक्डोनल्ड जुंवे + हाँडूरास + क्रोएशिया हैती - हंगेरी - कॅनरी आयलैंड्स - इंडोनेशीया + हंगरी + कानारियास जुंवे + इंडोनिशिया आयरलँड - इस्त्राइल - इसले ऑफ मॅन + इज्राएल + मॅनाचो जुंवो भारत - ब्रिटिश हिंद महासागरीय क्षेत्र + ब्रिटनाचो हिंदी महासागर प्रांत + शागस जुंवे इराक इरान - आइसलैंड + आइसलँड इटली जर्सी जमैका जॉर्डन जपान - केनया - किर्गिझस्तान - कंबोडिया - किरिबाती + केनिया + किर्गिस्तान + कॅम्बोडिया + किरिबास कोमोरोस - सेंट किट्स आनी नेविस + सांव क्रिस्टोवांव आनी नेविस उत्तर कोरिया दक्षिण कोरिया कुवेत - कैमेन आइलैंड्स - कझाकस्तान + केमॅन जुंवे + कजाखस्तान लाओस - लेबनान - सँट लुसिया - लिचेंस्टीन + लेबनन + सांता लूसिया + लिश्टेंस्टाइन श्री लंका - लायबेरीया - लिसोथो - लिथुआनिया - लक्सेमबर्ग - लॅटविया - लीबिया + लायबिरिया + लेसोथो + लितुआनिया + लुक्सेमबर्ग + लाटविया + लिबिया मोरोक्को - मोनॅको - माल्डोवा - मॉन्टॅनग्रो + मोनाको + मॉल्डोवा + मोंटेनेग्रो सॅंट मार्टिन - माडागास्कर - मार्शल आयलँड्स + मॅडागास्कर + मार्शल जुंवे उत्तर मॅसिडोनिया माली - म्यानमार (बर्मा) + म्यानमार मंगोलिया - मकाव एसएआर चीन - मकाव - उत्तरी मरिना आयसलैण्ड - मार्टीनिक + मकाव + उत्तरी मारियाना जुंवे + मार्टिनीक मॉरिटानिया मॉन्टसेराट माल्टा @@ -742,107 +742,107 @@ CLDR data files are interpreted according to the LDML specification (http://unic मलावी मेक्सिको मलेशिया - मॉझांबीक - नामीबिया - न्यू कॅलिडोनिया + मोजाम्बिक + नामिबिया + नोवो कॅलेडोनिया नायजर - नॉरफॉक आयलँड - नायजेरिया - निकारगुवा + नॉरफोक जुंवो + नायजिरिया + निकारागुआ नॅदरलँड नॉर्वे नेपाळ - नावरू - नीयू - न्युझीलॅन्ड - आओटेरोआ न्युझीलॅन्ड + नाउरु + निउए + नोवो झीलॅंड + आओतेरोआ ओमान - पनामा + पानामा पेरू - फ्रेन्च पोलिनेसिया - पापुआ न्यु गिनी - फिलीपिन्झ + फ्रांसेझ पॉलिनिशिया + पापुआ नोवो गिनी + फिलिपीन्स पाकिस्तान - पोलंड - सँ. पायरे आनी मिकेलन - पिटकॅरन आयलँड्स - प्युएर्तो रिको - पेलेस्टीनियन प्रांत - पेलेस्टायन - पुर्तगाल - पलाऊ - पैराग्वे - कतार + पोलँड + सांव पेद्रु आनी मिकेलांव + पिटकॅर्न जुंवे + पोर्टो रिको + पालेसटीन + पालेसटीनी प्रांत + पुर्तुगाल + पालाउ + पॅरग्वे + कातार आवटलायींग ओशेनिया - रीयूनियन - रोमानीया + रेयुनियांव + रोमेनिया सर्बिया रूस - रवांडा - सऊदी अरेबिया - सोलोमन आइलँड्स + रुआंडा + साउदी अरब + सोलोमन जुंवे सेशेल्स - सूडान + सुदान स्वीडन - सिंगापूर - सेंट हेलिना + सिंगापुर + सांता हेलेना स्लोवेनिया - स्वालबार्ड आनी जान मेयन + स्वालबार्ड आनी यान मायेन स्लोवाकिया - सिएरा लियॉन - सॅन मारीनो - सिनिगल + सेर्रा लेओं + सान मारीनो + सेनेगाल सोमालिया - सुरीनाम - दक्षिण सुडान - साओ टोम आनी प्रिन्सिप + सुरिनाम + दक्षिण सुदान + सांव टोमे आनी प्रिंसिपे एल साल्वाडोर - सिंट मार्टेन + सांव मोर्टिन (नॅदरलँड) सिरिया - इस्वातिनी - स्वाझिलँड - त्रिस्तान दा कुन्हा - तुर्क्स आनी कॅकोज आयलँड्स + एस्वातीनी + ट्रीस्टांव दा कुन्ह्या + तुर्क आनी कायकोस जुंवे चाड - फ्रेंच दक्षिणी प्रांत + फ्रांसेझ दक्षिणी प्रांत टोगो थायलँड - तजीकिस्तान - टोकलाऊ + ताजीकिस्तान + टोकलाउ तिमोर-लेस्ते - ईस्ट तिमूर + उदेंत तिमोर तुर्कमेनिस्तान - ट्यूनीशिया - टोंगा + टुनिसिया + टाँगा तुर्की - ट्रिनीदाद आनी टोबॅगो - टुवालू - तायवान - तांझानिया + तुर्किया + त्रिनदाड आनी तोबाग + तुवालू + ताइवान + तांजानिया युक्रेन युगांडा - यु. एस. मायनर आवटलायींग आयलँड्‍स - युनायटेड नेशन्स + संयुक्त राज्यांचे पयशिल्ले धाकटे जुंवे + संयुक्त राष्ट्रां युनायटेड स्टेट्स युएस - उरूग्वे - उझ्बेकिस्तान - वॅटिकन सिटी - सेंट विंसेंट ऐंड द ग्रेनेडाइंस - विनेझुएला - ब्रिटिश वर्जिन आयलँड्स - यु. एस. वर्जिन आयलँड्‍स - व्हिएतनाम - वनौतू - वालिस आनी फ्यूचूना + उरुग्वे + उज्बेकिस्तान + वॅटिकन शार + सांव विसेंट आनी ग्रानाडीनस + वेनेजुएला + ब्रिटनाचे विर्जिन जुंवे + संयुक्त राज्यांचे विर्जिन जुंवे + विएतनाम + वानुआतु + वॉलिस आनी फुतुना सामोआ स्युडो-ऍक्सेंट स्युडो-बिडी कोसोवो येमेन - मेयोट - दक्षिण आफ्रीका - झांबिया + मायोट + दक्षिण आफ्रिका + जाम्बिया जिम्बाब्वे अज्ञात प्रांत @@ -851,43 +851,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic चलनाचें स्वरूप वर्गवारी क्रम चलन + इमोजी सादरीकरण वराचें चक्र (12 वि 24) रेग खंड करपाची शैली + शब्दां भितर ओळी मोडप मापन प्रणाली संख्या + वाक्य विराम उपरांत Abbr. बौद्ध दिनदर्शिका + बौध्द धर्म चीनी दिनदर्शिका + चीनी कॉप्टिक दिनदर्शिका + कॉप्टिक डांगी दिनदर्शिका + डांगी इथियोपिक दिनदर्शिका + इथियोपिक इथियोपिक अमिटी आलेम दिनदर्शिका + इथियोपिक ग्रेगोरियन कॅलॅण्डर + ग्रेगोरियन हिब्रू दिनदर्शिका + हिब्रू भारतीय राष्ट्रीय दिनदर्शिका + भारतीय राष्ट्रीय ईस्लामीक दिनदर्शिका + ईस्लामीक ईस्लामीक दिनदर्शिका (कोश्टक, नागरी शक) + ईस्लामीक (कोश्टक, नागरी शक) ईस्लामीक दिनदर्शिका (उम अल-कुरा) + ईस्लामीक (उम अल-कुरा) आयएसओ-8601 दिनदर्शिका जपानी दिनदर्शिका + जपानी पर्शियन दिनदर्शिका + पर्शियन मिंगुआ दिनदर्शिका (अणकाराची कुरू: जाका चिनी दिनदर्शिकेचें प्रजासत्ताक", "रिपब्लिकन दिनदर्शिका") + मिंगुआ लेखा चलन स्वरूप + लेखा चलन प्रमाणित चलन स्वरुप + प्रमाणित डिफॉल्ट युनिकोड वर्गवारी क्रम + डिफॉल्ट युनिकोड सामान्य-उद्देशान केल्लो सोद + सोद प्रमाणित वर्गवारी क्रम + वर्गवारी + डिफॉल्ट + इमोजी + लिखीत 12 वरांची यंत्रणा (0–11) + 12 (0–11) 12 वरांची यंत्रणा (1–12) + 12 (1–12) 24 वरांची यंत्रणा (0–23) + 24 (0–23) 24 वरांची यंत्रणा (1–24) + 24 (1–24) सुटी रेग खंड शैली + सुटी सामान्य रेग खंड शैली + सामान्य सक्तीची रेग खंड शैली + सक्तीची + सगळें मोडून उडोवप + सगळें दवरात + सामान्य + वाक्यांशांत दवरात मॅट्रीक प्रणाली + मॅट्रीक भव्य मापन प्रणाली + UK युएस मापन प्रणाली + US अरेबिक-भारतीय अंक विस्तारीत अरेबीक-भारतीय अंक आर्मेनियन संख्या @@ -928,6 +968,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic थाय अंक तिबेतियन अंक वाई अंक + बंद करचें + चालू मॅट्रिक @@ -1009,37 +1051,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d + E a h:mm + E a h:mm:ss y G + d-M-y GGGGG MMM y G - d MMM y G + d MMM, y G E d, MMM y G + a h + a h:mm + a h:mm:ss d-M E, d-M d MMM - E d, MMM + E, d MMM d MMMM y G y G - M-y GGGG + M-y GGGGG d-M-y GGGGG - E, d/M/y GGGGG + E, d-M-y GGGGG MMM y G - d MMM y G - E, d MMM y G + d MMM, y G + E, d MMM, y G MMMM y G QQQ y G QQQQ y G {0} – {1} + + h – h B + - YG – YG - y–y G + y G – y G + y – y G - M-y GGGG – M-y GGGG - M-y GGGGG – M y - M-y GGGGG – M-y + M/y GGGGG – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG d-M-y GGGGG – d-M-y @@ -1049,14 +1100,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d-M-Y GGGGG – E-d-M-y - E, d-M-y GGGGG – E, d-M-y GGGGG + E, d/M/y GGGGG – E, d/M/y GGGGG E, d-M-y GGGGG – E, d-M-y - E,dd-MM-y GGGGG – E,dd-MM-y + E, d/M/y – E, d/M/y GGGGG MMM y G – MMM y G MMM y G–MMM - MMM y G – MMM y + MMM y – MMM y G d-MMM y G–d @@ -1065,10 +1116,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic d MMM y G – d MMM y - e, d MMM y G – e, d MMM + E, d MMM – E, d MMM, y G E, d MMM y G – E, d MMM y G E, d MMM y G – E, d MMM - E, d MMM y G – E, d MMM y + E, d MMM, y – E, d MMM, y G a h – a h @@ -1102,62 +1153,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH – HH v - - M–M - - d-M – d-M - d-M – d-M + d/M – d/M + d/M – d/M E, d-M – E, d-M E, d-M, E d-M - MMM–MMM + MMM – MMM d–d MMM d MMM – d MMM - E, d MMM – E, d MMM + E, d MMM – E, d MMM E, d MMM – E, d MMM - y–y G + y – y G - M-y – M-y GGGGG - M/y – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG d-M-y – d-M-y GGGGG - d-M-y – d-M-y GGGGG d/M/y – d/M/y GGGGG - E, d/M/y – E, d/M/y GGGGG - E, d/M/y – E, d/M/y GGGGG - E, d/M/y – E, d/M/y GGGGG + E, d/M/y – E, d/M/y GGGGG + E, d/M/y – E, d/M/y GGGGG + E, d/M/y – E, d/M/y GGGGG MMM–MMM y G - MMM y G – MMM y + MMM y – MMM y G d–d MMM, y G - d MMM – d MMM, y G - d, MMM y – d, MMM y G + d MMM – d MMM, y G + d MMM, y – d MMM, y G E, d MMM – E, d MMM, yG E, d, MMM y – E, d, MMM y G - E, d, MMM y – E, d, MMM y G - - - MMMM – MMMM y G - MMMM y – MMMM y G + E, d MMM, y – E, d MMM, y G @@ -1165,6 +1208,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + जाने + फेब्रु + मार्च + एप्री + मे + जून + जुल + ऑग + सप्टें + ऑक्टो + नोव्हें + डिसें + + + जा + फे + मा + + मे + जू + जु + + + + नो + डि + जानेवारी फेब्रुवारी @@ -1192,9 +1263,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic ऑग सप्टें ऑक्टो - नो + नोव्हें डिसे + + जा + फे + मा + + मे + जू + जु + + + + नो + डि + @@ -1209,13 +1294,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic शे - आय + सोम - मंगळ - बुध + मंगळार + बुधवार बिरे - शुक्र - शेन + शुक्रार + शेनवार आयतार @@ -1237,6 +1322,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic शु शे + + + सो + मंगळार + बुधवार + बिरे + शुक्रार + शेनवार + @@ -1254,30 +1348,79 @@ CLDR data files are interpreted according to the LDML specification (http://unic 4थें त्रैमासीक + + + तिम्ह1 + तिम्ह2 + तिम्ह3 + तिम्ह4 + + + + मध्यान + सकाळ + दनपार + सांज + रात + + मध्यान a - p + PM + सकाळ + दनपार + सांज + रात + मध्यानरात सकाळीं सांजे + सकाळीं + दनपारां + सांजे + राती + + + + + मध्यान + सकाळ + दनपार + सांज + रात + + + मध्यान + सकाळ + दनपार + सांज + रात + + + मध्यानरात + सकाळीं + सांजे + सकाळीं + दनपारां + सांजे + राती + क्रिस्ता आदीं क्रिस्तपूर्व शक - क्रिस्तशक इसवी सन क्रिस्तपूर्व BCE क्रि.श. - CE क्रि.आ. @@ -1342,6 +1485,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} वरांचेर + + {1} {0} वरांचेर + @@ -1350,6 +1496,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} वरांचेर + + {1} {0} वरांचेर + @@ -1358,6 +1507,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -1366,44 +1518,106 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + - d-M + B h:mm + B h:mm:ss + E B h:mm + E B h:mm:ss + M/y G + E, d-M-y G + MMM y G + d MMM, y G + E, d MMM, y G + a h:mm + a h:mm:ss + a h:mm:ss v + a h:mm v + a h वाजतां v + d/M d-M, E d MMM E, d MMM d MMMM + MMMM हाचो सप्तक W + MMMM हाचो सप्तक W M-y d-M-y d-M-y, E - MMM, y + MMM y d MMM, y MMMM, y + Y हाचो सप्तक w + Y हाचो सप्तक w - {0} – {1} + + B h – B h + + + B h:mm – B h:mm + + + d – d + + + y G – y G + y – y G + GGGGG M-y – GGGGG M-y - GGGGG M-y – M-y - GGGGG M-y – M-y + M/y – M/y G - GGGGG d-M-y – d-M-y - GGGGG d-M-y – GGGGG d-M-y - GGGGG d-M-y – d-M-y - GGGGG d-M-y – d-M-y + d/M/y – d/M/y G + d/M/y G – d/M/y G + d/M/y – d/M/y G + d/M/y – d/M/y G - GGGGG d-M-y, E – d-M-y, E - GGGGG d-M-y, E – GGGGG d-M-y, E - GGGGG d-M-y, E – d-M-y, E - GGGGG d-M-y, E – d-M-y, E + E, d/M/y – E, d/M/y G + E, d/M/y G – E, d/M/y G + E, d/M/y – E, d/M/y G + E, d/M/y – E, d/M/y G - - M–M + + MMM y G – MMM y G + MMM – MMM y G + MMM y – MMM y G + + + d – d MMM, y G + d MMM, y G – d MMM, y G + d MMM – d MMM, y G + d MMM, y – d MMM, y G + + + E, d MMM – E, d MMM, y G + E, d MMM, y G – E, d MMM, y G + E, d MMM – E, d MMM, y G + E, d MMM, y – E, d MMM, y G + + + a h – a h + a h–h + + + a h:mm – a h:mm + + + HH:mm – HH:mm + + + a h:mm – a h:mm v + + + HH – HH v - d-M –d-M + d/M – d/M d-M –d-M @@ -1411,19 +1625,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic d-M, E – d-M, E - MMM – MMM + MMM – MMM + + + d – d MMM + d MMM – d MMM + + + E, d MMM – E, d MMM + E, d MMM – E, d MMM + + + y – y - M-y – M-y + M/y – M/y M-y – M-y d-M-y – d-M-y - d-M-y – d-M-y + d/M/y – d/M/y d-M-y – d-M-y - d-M-y, E – d-M-y, E + E, d/M/y – E, d/M/y d-M-y, E – d-M-y, E d-M-y, E – d-M-y, E @@ -1438,8 +1663,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d MMM –E, d MMM y - E, d MMM – E, d MMM y - E, d MMM y – E, d MMM y + E, d MMM – E, d MMM, y + E, d MMM, y – E, d MMM, y MMMM – MMMM y @@ -1451,6 +1676,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + चैत्र वैशाख @@ -1466,22 +1705,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic फाल्गुन - - - - - - - - - - - - १० - ११ - १२ - - @@ -1496,42 +1719,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic वर्स - फाटलें वर्स + पोरूं हें वर्स फुडलें वर्स + {0} वर्सान {0} वर्सांनीं + {0} वर्स आदीं {0} वर्सां आदीं + पोरूं + हें वर्स + फुडलें वर्स + + {0} वर्सान + {0} वर्सांनीं + - {0} वर्स आदीं + {0} वर्स आदीं + {0} वर्सां आदीं + + + + पोरूं + हें वर्स + फुडलें वर्स + + {0}वर्सान + {0}वर्सांनीं + + + {0}वर्स आदीं + {0}वर्सां आदीं त्रैमासीक - फाटलो त्रैमासीक - हो त्रैमासीक - फुडलो त्रैमासीक + फाटलें तिम्हयनाळें + हें तिम्हयनाळें + फुडलें तिम्हयनाळें - {0} त्रैमासीकांत + {0} तिम्हयनाळ्यान + {0} तिम्हयनाळ्यांनीं - {0} त्रैमासीकां आदीं + {0} तिम्हयनाळें आदीं + {0} तिम्हयनाळे आदीं फाटलें तिम्ह. हें तिम्ह. फुडलें तिम्ह. + + {0} तिम्हयनाळ्यान + {0} तिम्हयनाळ्यांनीं + + + {0} तिम्ह. आदीं + {0} तिम्ह. आदीं + फाटलें तिम्ह हें तिम्ह फुडलें तिम्ह + + {0}तिम्हयनाळ्यान + {0}तिम्हयनाळ्यांनीं + + + {0}तिम्ह आदीं + {0}तिम्ह आदीं + म्हयनो @@ -1539,29 +1803,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic हो म्हयनो फुडलो म्हयनो + {0} म्हयन्यान {0} म्हयन्यानीं - {0} म्हयन्यां आदीं + {0} म्हयनो आदीं + {0} म्हयने आदीं + + + + फाटलो म्ह. + हो म्ह. + फुडलो म्ह. + + {0} म्हयन्यान + {0} म्हयन्यानीं + + + {0} म्ह. आदीं + {0} म्ह. आदीं + + + + फाटलो म्ह + हो म्ह + फुडलो म्ह + + {0}म्हयन्यान + {0}म्हयन्यानीं + + + {0}म्ह आदीं + {0}म्ह आदीं सप्तक - निमाणो सप्तक + फाटलो सप्तक हो सप्तक फुडलो सप्तक + {0} सप्तकान {0} सप्तकांनीं + {0} सप्तक आदीं {0} सप्तकां आदीं {0} चो सप्तक - - - {0} सप्त. आदीं + + फाटलो सप्तक + हो सप्तक + फुडलो सप्तक + + {0} सप्तकान + {0} सप्तकांनीं + + {0} सप्तक आदीं + {0} सप्तकां आदीं + + + + फाटलो सप्त + हो सप्त + फुडलो सप्त + + {0}सप्तकान + {0}सप्तकांनीं + + + {0}सप्त आदीं + {0}सप्त आदीं + + {0} चो सप्त म्हयन्यातलो सप्तक @@ -1572,12 +1888,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic आयज फाल्यां + {0} दिसान {0} दिसानीं + {0} दीस आदीं {0} दीस आदीं + + + {0} दिसान + {0} दिसानीं + + + + + {0}दिसान + {0}दिसानीं + + + {0}दी आदीं + {0}दी आदीं + + वर्साचो दीस @@ -1585,144 +1919,286 @@ CLDR data files are interpreted according to the LDML specification (http://unic सप्तकाचो दीस - म्हयन्यातलो सप्तकीय दीस + म्हयन्यांत दीसाचो प्रसंग + + + म्हयन्यांत दीसाचो प्रसंग + + + म्हयन्यांत दीसाचो प्रसंग फाटलो आयतार हो आयतार फुडलो आयतार + {0} आयतारान {0} आयतारानीं + {0} आयतार आदीं {0} आयतारां आदीं + + फाटलो आयत + हो आयत + फुडलो आयत + + {0} आयतारान + {0} आयतारानीं + + + {0} आयत. आदीं + {0} आयत आदीं + + + + फाटलो आ + हो आ + फुडलो आ + + {0} आयतारान + {0} आयतारानीं + + + {0} आ आदीं + {0} आ आदीं + + - निमाणो सोमार + फाटलो सोमार हो सोमार फुडलो सोमार + {0} सोमारान {0} सोमारानीं + {0} सोमार आदीं {0} सोमारां आदीं - निमाणो सोम. + फाटलो सोम. हो सोम. फुडलो सोम. + + {0} सोमारान + {0} सोमारानीं + + + {0} सोम. आदीं + {0} सोम. आदीं + - निमाणो सो. - हो सो. - फुडलो सो. + फाटलो सो + हो सो + फुडलो सो + + {0} सोमारान + {0} सोमारानीं + + + {0} सो आदीं + {0} सो आदीं + - निमाणो मंगळार + फाटलो मंगळार हो मंगळार फुडलो मंगळार + {0} मंगळारान {0} मंगळारानीं + {0} मंगळार आदीं {0} मंगळारां आदीं - निमाणो मंगळ. - हो मंगळ. - फुडलो मंगळ. + फाटलो मंग. + हो मंग. + फुडलो मंग. + + {0} मंगळारान + {0} मंगळारानीं + + + {0} मंग. आदीं + {0} मंग. आदीं + - फाटलो मं. - हो मं. - फुडलो मं. + फाटलो मं + हो मं + फुडलो मं + + {0} मंगळारान + {0} मंगळारानीं + + + {0} मं आदीं + {0} मं आदीं + फाटलो बुधवार हो बुधवार फुडलो बुधवार + {0} बुधवारान {0} बुधवारानीं + {0} बुधवार आदीं {0} बुधवारां आदीं - निमाणो बुध. + फाटलो बुध. हो बुध. फुडलो बुध. - - - निमाणो बु. - हो बु. - फुडलो बु. - - - निमाणो गुरुवार - हो गुरुवार - फुडलो गुरुवार - {0} गुरुवारानीं + {0} बुधवारान + {0} बुधवारानीं - {0} गुरुवारां आदीं + {0} बुध. आदीं + {0} बुध. आदीं + + + + फाटलो बु + हो बु + फुडलो बु + + {0} बुधवारान + {0} बुधवारानीं + + + {0} बु आदीं + {0} बु आदीं + + + + फाटलो बिरेस्तार + हो बिरेस्तार + फुडलो बिरेस्तार + + {0} बिरेस्तारान + {0} बिरेस्तारानीं + + + {0} बिरेस्तार आदीं + {0} बिरेस्तारां आदीं - निमाणो गुरु. - हो गुरु. - फुडलो गुरु. - - - निमाणो गु. - हो गु. - फुडलो गु. - - - निमाणो शुक्रार - हो शुक्रार - फुडलो शुक्रार + फाटलो ब्रेस्त. + हो ब्रेस्त. + फुडलो ब्रेस्त. - {0} शुक्रारानीं + {0} बिरेस्तारान + {0} बिरेस्तारानीं - {0} शुक्रारां आदीं + {0} ब्रेस्त. आदीं + {0} ब्रेस्त. आदीं + + + + फाटलो ब्रे + हो ब्रे + फुडलो ब्रे + + {0} बिरेस्तारान + {0} बिरेस्तारानीं + + + {0} ब्रे आदीं + {0} ब्रे आदीं + + + + फाटलो सुक्रार + हो सुक्रार + फुडलो सुक्रार + + {0} सुक्रारान + {0} सुक्रारानीं + + + {0} सुक्रार आदीं + {0} सुक्रारां आदीं - निमाणो शुक्र. - हो शुक्र. - फुडलो शुक्र. + फाटलो सुक्र. + हो सुक्र. + फुडलो सुक्र. + + {0} सुक्रारान + {0} सुक्रारानीं + + + {0} सुक्र. आदीं + {0} सुक्र. आदीं + - निमाणो शु. - हो शु. - फुडलो शु. + फाटलो सुक्र + हो सुक्र + फुडलो सुक्र + + {0} सुक्रारान + {0} सुक्रारानीं + + + {0} सुक्र आदीं + {0} सुक्र आदीं + - निमाणो शेनवार + फाटलो शेनवार हो शेनवार फुडलो शेनवार + {0} शेनवारान {0} शेनवारानीं + {0} शेनवार आदीं {0} शेनवारां आदीं - निमाणो शेन. + फाटलो शेन. हो शेन. फुडलो शेन. + + {0} शेनवारान + {0} शेनवारानीं + + + {0} शेन. आदीं + {0} शेन. आदीं + - निमाणो शे. - हो शे. - फुडलो शेन. + फाटलो शे + हो शे + फुडलो शे + + {0} शेनवारान + {0} शेनवारानीं + + + {0} शे आदीं + {0} शे आदीं + AM/PM @@ -1731,54 +2207,114 @@ CLDR data files are interpreted according to the LDML specification (http://unic वर हें वर + {0} वरान {0} वरांनीं - {0} वरा आदीं + {0} वर आदीं + {0} वरां आदीं + + + + + {0} वरान + {0} वरांनीं + + + {0} वर आदीं + {0} वरां आदीं + + + + + {0}वरान + {0}वरांनीं + + + {0}वर आदीं + {0}वरां आदीं मिनीट - हें मिनीट + हो मिनूट - {0} मिन्टां + {0} मिणटान + {0} मिणटांनी - {0} मिन्टां आदीं + {0} मिनूट आदीं + {0} मिणटां आदीं हो मिन. + + {0} मिणटान + {0} मिण. + + + {0} मिण. आदीं + {0} मिण. आदीं + हो मिन + + {0}मिणटान + {0}मिण + + + {0}मिण आदीं + {0}मिण आदीं + सेकंद आतां - {0} सेकंदानीं + {0} सॅकंडान + {0} सॅकंडानीं - {0} सेकंद आदीं + {0} सॅकंड आदीं + {0} सॅकंड आदीं + + {0} सॅकंडान + {0} सॅकंडानीं + - {0} से. आदीं + {0} सॅक. आदीं + {0} सॅक. आदीं + + + + + {0}सॅकंडान + {0}सॅकंडानीं + + + {0}सॅक आदीं + {0}सॅक आदीं वेळ झोन - झोन + क्षेत्र + + + क्षेत्र {0} वेळ {0} डेलायट वेळ - {0} प्रमाणित वेळ + {0} प्रमाण वेळ समन्वित वैश्विक वेळ @@ -2129,6 +2665,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ईस्टर + + कोयहायक + पुंटा अरेनास @@ -2355,7 +2894,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic इसले ऑफ मॅन - कोलकाता + कोलकाता, बॉम्बाईं, पणजी चागोस @@ -2394,9 +2933,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic फ्नोम पेन्ह - इंडरबरी - - कांटोन @@ -3066,9 +3602,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - अस्तंत आफ्रिका वेळ - अस्तंत आफ्रिका प्रमाणित वेळ - अस्तंत आफ्रिका ग्रीष्म वेळ + अस्तंत आफ्रिका वेळ @@ -3418,6 +3952,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic गुयाना वेळ + + + हवाई-अलेयुशिन प्रमाणीत वेळ + + हवाई-अलेयुशिन वेळ @@ -3929,189 +4468,859 @@ CLDR data files are interpreted according to the LDML specification (http://unic 0/0 + + + #,##,##0.### + + + 0हज 0 हजार + 00हज 00 हजार - 000 हजार - 0 दशलक्ष - 00 दशलक्ष - 000 दशलक्ष + 0लाख + 0 लाख + 00लाख + 00 लाख + 0कोटी + 0 कोटी + 00कोटी + 00 कोटी + 0अब्ज 0 अब्ज + 00अब्ज 00 अब्ज - 000 अब्ज - 0 ट्रिलियन - 00 ट्रिलियन - 000 ट्रिलियन + 0निख + 0 निखर्व + 00निख + 00 निखर्व + 000निख + 000 निखर्व + 0हज'.'निख'.' + 0 हजार निखर्व - 0B - 00B - 000B + 0हज + 0हज + 00हज + 00हज + 0लाख + 0लाख + 00लाख + 00लाख + 0कोटी + 0कोटी + 00कोटी + 00कोटी + 0अब्ज + 0अब्ज + 00अब्ज + 00अब्ज + 0निख + 0निख + 00निख + 00निख + 000निख + 000निख + 0हज'.'निख'.' + 0हज'.'निख'.' + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 + #,##,##0.00 + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + - ¤#,##0.00;(¤#,##0.00) - ¤ #,##0.00;(¤ #,##0.00) - #,##0.00;(#,##0.00) + ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 - ¤0K - ¤ 0K - ¤00K - ¤ 00K - ¤000K - ¤ 000K - ¤0M - ¤ 0M - ¤00M - ¤ 00M - ¤000M - ¤ 000M - ¤0B - ¤ 0B - ¤00B - ¤ 00B - ¤000B - ¤ 000B - ¤0T - ¤ 0T - ¤00T - ¤ 00T - ¤000T - ¤ 000T + ¤0हज + ¤ 0हज + ¤0हज + ¤ 0हज + ¤00हज + ¤ 00हज + ¤00हज + ¤ 00हज + ¤0लाख + ¤ 0लाख + ¤0लाख + ¤ 0लाख + ¤00लाख + ¤ 00लाख + ¤00लाख + ¤ 00लाख + ¤0कोटी + ¤ 0कोटी + ¤0कोटी + ¤ 0कोटी + ¤00कोटी + ¤ 00कोटी + ¤00कोटी + ¤ 00कोटी + ¤0अब्ज + ¤ 0अब्ज + ¤0अब्ज + ¤ 0अब्ज + ¤00अब्ज + ¤ 00अब्ज + ¤00अब्ज + ¤ 00अब्ज + ¤0निख + ¤ 0निख + ¤0निख + ¤ 0निख + ¤00निख + ¤ 00निख + ¤00निख + ¤ 00निख + ¤000निख + ¤ 000निख + ¤000निख + ¤ 000निख + ¤0हज'.'निख'.' + ¤ 0हज'.'निख'.' + ¤0हज'.'निख'.' + ¤ 0हज'.'निख'.' + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr + + + + + + + ¤000LCr + ¤000LCr युनाइटेड अरब इमीरॅट्स दिरहम - युएई दिरहम्स अफगाण अफगाणी - अफगाण अफगाणीस अल्बेनियन लेक - अल्बेनियन लेके अर्मेनियन ड्राम - अर्मेनियन ड्राम्स + अर्मेनियन ड्राम + अर्मेनियन ड्राम नॅदरलँड अँटिलियन गिल्डर - नॅदरलँड अँटिलियन गिल्डर्स अंगोलन क्वॉन्ज - अंगोलन क्वॉन्ज्स + अंगोलन क्वॉन्ज + अंगोलन क्वॉन्ज अर्जेंटिना पेसो + अर्जेंटिना पेसोस अर्जेंटिना पेसोस ऑस्ट्रेलियाई डॉलर - ऑस्ट्रेलियाई डॉलर्स अरुबान फ्लोरिन अज़रबैजानी मनात - अज़रबैजानी मनात्स बोस्निया-हेर्जेगोविना रुपांतरीत मार्क - बोस्निया-हेर्जेगोविना रुपांतरीत मार्क्स बार्बाडियान डॉलर + बार्बाडियान डॉलर्स बार्बाडियान डॉलर्स बांगलादेशी टाका - बांगलादेशी टाकास + बांगलादेशी टाका + बांगलादेशी टाका बल्गेरियन लेव - बल्गेरियन लेवा बहरिनी डिनार - बहरिनी डिनार्स बुरुंडी फ्रँक बरमुदान डॉलर - बरमुदान डॉलर्स ब्रूनेई डॉलर - ब्रूनेई डॉलर्स बोलिव्हियन बोलिवियानो + बोलिव्हियन बोलिवियानोस बोलिव्हियन बोलिवियानोस ब्राझिलियन रियाल + ब्राझिलियन रियाल्स ब्राझिलियन रियाल्स बहामियन डॉलर - बहामियन डॉलर्स भुतानीज नागल्ट्रम - भुतानीज नागल्ट्रम्स + भुतानीज नागल्ट्रम + भुतानीज नागल्ट्रम बोत्सवाना पुला - बोत्सवाना पुलास बैलोरुसियन् रूबल - बैलोरुसियन् रूबल्स р. बेलिझ डॉलर - बेलिझ डॉलर्स कॅनाडियन डॉलर - कॅनाडियन डॉलर्स काँगोलिसी फ्रँक - काँगोलिसी फ्रँक्स + काँगोलिसी फ्रँक + काँगोलिसी फ्रँक स्विस फ्रँक - स्विस फ्रँक्स चिली पेसो - चिली पेसोस चिनी युआन (ऑफशोर) @@ -4121,168 +5330,143 @@ CLDR data files are interpreted according to the LDML specification (http://unic कोलंबियन पेसो - कोलंबियन पेसोस कोस्ता रिका कॉलॉन - कोस्ता रिका कॉलॉन्स क्युबान रुपांतरीत पेसो - क्युबान रुपांतरीत पेसोस क्युबान पेसो - क्युबान पेसोस केप वर्दे एस्कुडो - केप वर्दे एस्कुडो्स चेक कोरुना - चेक कोरुनास जिबूती फ्रँक - जिबूती फ्रँक्स डॅनिश क्रोन + डॅनिश क्रोनर डॅनिश क्रोनर डोमिनिकन पेसो - डोमिनिकन पेसोस अल्जेरियाई डिनार - अल्जेरियाई डिनार्स ईजिप्ती पावंड - ईजिप्ती पावंड्स + ईजिप्ती पावंड + ईजिप्ती पावंड इरिट्रियन नाक्फा - इरिट्रियन नाक्फास इथियोपियाई बिरर - इथियोपियाई बिरर्स युरो + युरोस युरोस फिजी डॉलर - फिजी डॉलर्स फ़ॉकलैंड आइलैंड्स पावंड - फ़ॉकलैंड आइलैंड्स पावंड्स ब्रिटिश पावंड + ब्रिटिश पावंड्स ब्रिटिश पावंड्स जॉर्जियन लारी - जॉर्जियन लारीस घानाई सेडी - घानाई सेडीस जिब्राल्टर पावंड + जिब्राल्टर पावंड्स जिब्राल्टर पावंड्स गॅम्बियन दलासी - गॅम्बियन दलासीस गिनीन फ्रँक - गिनीन फ्रँक्स ग्वाटेमाला कुएट्झल - ग्वाटेमाला कुएट्झल्स गयाना डॉलर - गयाना डॉलर्स हाँग काँग डॉलर - हाँग काँग डॉलर्स होंडुरान लेम्पिरा - होंडुरान लेम्पिरास क्रोयेषियन् कुना - क्रोयेषियन् कुनास हैतीयन गौर्डे - हैतीयन गौर्डेस हंगेरियन फोरिंट - हंगेरियन फोरिंट्स इंडोनेशियन रुपिया इस्त्रायली न्यु शेकेल - इस्त्रायली न्यु शेकेल्स भारतीय रुपया इराकी डिनार - इराकी डिनार्स + इराकी डिनार + इराकी डिनार ईरानी रियाल - ईरानी रियाल्स आईस्लान्डिक क्रोना - आईस्लान्डिक क्रोनुर जमैकन डॉलर - जमैकन डॉलर्स + जमैकन डॉलर + जमैकन डॉलर जॉर्डनियन डिनार - जॉर्डनियन डिनार्स जपानी येन केनयाई शिलिंग - केनयाई शिलिंग्स किरगिझस्तान सोम - किरगिझस्तान सोम्स कंबोडियन रियाल - कंबोडियन रियाल्स कोमोरियन फ्रँक - कोमोरियन फ्रँक्स उत्तर कोरियन वॉन @@ -4292,136 +5476,111 @@ CLDR data files are interpreted according to the LDML specification (http://unic कुवेती डिनार - कुवेती डिनार्स कैमेन आइलैंड्स डॉलर - कैमेन आइलैंड्स डॉलर्स + कैमेन आइलैंड्स डॉलर + कैमेन आइलैंड्स डॉलर कझाकस्तानी टेंग - कझाकस्तानी टेंग्स लाओ किप - लाओ किप्स लिबानेस पावंड - लिबानेस पावंड्स श्री लंका रुपया लायबेरियन डॉलर - लायबेरियन डॉलर्स लिसोथो लोटि - लिसोथो लोटिस लीबियान डिनार - लीबियान डिनार्स मोरक्कन दिरहम - मोरक्कन दिरहम्स मोल्दोवान लियू - मोल्दोवान लेई मलागासी एरियारी - मलागासी एरियारीस मसीडोनियन् डिनर - मसीडोनियन् डिनारी म्यानमार क्यात + म्यानमार क्यात्स म्यानमार क्यात्स मंगोलियन तुगरिक - मंगोलियन तुगरिक्स मकानेसे पटका - मकानेसे पटकास मॉरिटानिया उगिया - मॉरिटानिया उगियास मॉरिशस रुपी - मॉरिशस रुपया मालदिवी रुफिया - मालदिवी रुफियास मलावियन क्वाचा - मलावियन क्वाचास मेक्सिकन पेसो - मेक्सिकन पेसोस मलेशियाई रिंग्गित - मलेशियाई रिंग्गित्स मोझांबिकन मेटिकल - मोझांबिकन मेटिकल्स नामीबिया डॉलर - नामीबिया डॉलर्स नायजेरियन नायरा - नायजेरियन नायरास निकारागुआन कॉर्डोबा + निकारागुआन कॉर्डोबास निकारागुआन कॉर्डोबास नॉर्वेगन क्रोन - नॉर्वेगन क्रोनर नेपाळी रुपया न्युझीलॅन्ड डॉलर - न्युझीलॅन्ड डॉलर्स ओमानी रियाल - ओमानी रियाल्स पानामानियन बाल्बोआ - पानामानियन बाल्बोआस पेरिवियन सोल - पेरुवियन सोल्स पापुआ न्यु गिनी किना फिलिपिनी पेसो - फिलिपिनी पेसोस PHP @@ -4429,99 +5588,86 @@ CLDR data files are interpreted according to the LDML specification (http://unic पोलिष झ्लोटी - पोलिष झ्लोटी्स पराग्वेन गौरानी - पराग्वेन गौरानीस कतारी रियाल - कतारी रियाल्स रोमानियन् लियू - रोमानियन् लेई रॉन लेई सर्बियन डिनार - सर्बियन डिनार्स रुसी रुबल + रुसी रुबल्स रुसी रुबल्स रवांडा फ्रँक - रवांडा फ्रँक्स सौदी रियाल - सौदी रियाल्स सोलोमन आयलँड्स डॉलर - सोलोमन आयलँड डॉलर्स + सोलोमन आयलँड्स डॉलर + सोलोमन आयलँड्स डॉलर सेशेल्लोइस रुपी - सेशेल्लोइस रुपया सुदानी पावंड - सुदानी पावंड्स स्वीदीष क्रोन - स्वीदीष क्रोनोर सिंगापूरी डॉलर - सिंगापूरी डॉलर्स + सिंगापूरी डॉलर + सिंगापूरी डॉलर सेंट हेलिना पावंड - सेंट हेलिना पावंड्स सिएरा लियॉनी लियॉन - सिएरा लियॉनी लियॉन्स सिएरा लियॉनी लियॉन (1964—2022) - सिएरा लियॉनी लियॉन्स (1964—2022) सोमाली शिलिंग - सोमाली शिलिंग्स सुरीनामी डॉलर - सुरीनामी डॉलर्स दक्षिण सुडानी पावंड - दक्षिण सुडानी पावंड्स साओ टोम आनी प्रिन्सिप डोब्रा - साओ टोम आनी प्रिन्सिप डोब्रास सिरियन पावंड - सिरियन पावंड्स + सिरियन पावंड + सिरियन पावंड स्वाजी लिलांगेनी - स्वाजी एमालांगेनी थाई बाट ताजिकिस्तानी सोमोनी + ताजिकिस्तानी सोमोनीस ताजिकिस्तानी सोमोनीस @@ -4529,7 +5675,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ट्यूनीशियन डिनार - ट्यूनीशियन डिनार्स टोंगन पांगा @@ -4539,84 +5684,89 @@ CLDR data files are interpreted according to the LDML specification (http://unic ट्रिनीडाड आनी टोबॅगो डॉलर - ट्रिनीडाड आनी टोबॅगो डॉलर्स न्यू तायवान डॉलर - न्यू तायवान डॉलर्स तंजानिया शिलिंग - तंजानिया शिलिंग्स युक्रेनियन् रिव्निया - युक्रेनियन् रिव्नियास युगांडा शिलिंग - युगांडा शिलिंग्स युएस डॉलर + युएस डॉलर्स युएस डॉलर्स उरुग्वेन पेसो - उरुग्वेन पेसोस उज़्बेकिस्तानी सोम विनेझुएला बोलिव्हर - विनेझुएला बोलिव्हर्स + विनेझुएला बोलिव्हर + विनेझुएला बोलिव्हर वियतनामी डोंग वानूआतू वातू - वानूआतू वातूस समोआई टाला मध्य अफ्रीकी सीएफए फ्रँक - मध्य अफ्रीकी सीएफए फ्रँक्स उदेंत कॅरिबियन डॉलर - उदेंत कॅरिबियन डॉलर्स + + + कॅरिबियन गिल्डर + कॅरिबियन गिल्डर + कॅरिबियन गिल्डर अस्तंत आफ्रिकी सीएफए फ्रँक - अस्तंत आफ्रिकी सीएफए फ्रँक्स सीएफपी फ्रँक - सीएफपी फ्रँक्स अज्ञात चलन + (अज्ञात चलन) (अज्ञात चलन) येमेनी रियाल - येमेनी रियाल्स दक्षिण आफ्रिकन रँड झांबियन क्वाचा - झांबियन क्वाचास + + + झिंबाब्वेचें भांगर + झिंबाब्वेचें भांगर + झिंबाब्वेचें भांगर {0}+ + + {0} वांटो + {0} वांटे + {0}व्या उजव्या वाटेन वच. + @@ -4709,23 +5859,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic चवकोण {0} + चवकोन {0} चौरस {0} घनाकार {0} + घन {0} घन {0} {0}-{1} + {0} G {0} जी-फोर्स परिभ्रमण + {0} rev {0} परिभ्रमणां + {0} रे {0} रेडियन @@ -4733,219 +5888,282 @@ CLDR data files are interpreted according to the LDML specification (http://unic आर्कसेकंद + {0}″ {0} आर्कसेकंद - चौरस किलोमीटर - {0} चौरस किलोमीटर - दर चौरस किलोमीटर {0} + चौकोन किलोमीटर + {0} चौकोन किलोमीटर + {0} चौकोन किलोमीटर + दर चौकोन किलोमीटर {0} + {0} ha {0} हॅक्टर - चौरस मीटर - {0} चौरस मीटर - दर चौरस मिटर {0} + चौकोन मीटर + {0} चौकोन मीटर + {0} चौकोन मीटर + दर चौकोन मिटर {0} - चौरस सेंटिमीटर + {0} सेमी² {0} चौरस सेंटिमीटर दर चौरस सेंटिमीटर {0} - चौरस मायल - {0} चौरस मायल - दर चौरस मायल {0} + चौकोन मील + दर चौकोन मील {0} + {0} ac {0} एकर - चौरस यार्ड - {0} चौरस यार्ड + चौकोन यार्ड + {0} चौकोन यार्ड + {0} चौकोन यार्ड - चौरस फूट + चौकोन फुट + {0} चौकोन फुट {0} चौरस फूट - चौरस इंच - {0} चौरस इंच - दर चौरस इंच {0} + चौकोन इंच + {0} चौकोन इंच + {0} चौकोन इंच + दर चौकोन इंच {0} + {0} डुनाम {0} डुनाम्स + {0} kt {0} कॅरट्स मिलिग्राम/डेसिलिटर + {0} mg/dL {0} मिलिग्राम/डेसिलिटर मिलिमोल्स/लि + {0} mmol/L {0} मिलिमोल्स/लि + {0} वस्त {0} वस्ती - + पार्ट पर मिलियन + {0} ppm {0} पार्ट पर मिलियन टक्को + {0}% {0} टक्को + {0}‰ {0} दरमायल + {0}‱ {0} परमिरियड मोल्स + {0} मोल {0} मोल्स लिटर/किलोमीटर + {0} L/km {0} लिटर/किलोमीटर लिटर/100किलोमीटर + {0} लि/100किमी {0} लिटर/100किलोमीटर मैल दर गॅलोन + {0} mpg {0} मैल दर गॅलोन मैल दर इंपिरियल गॅलोन + {0} mpg Imp. {0} मैल दर इंपिरियल गॅलोन पेटाबायट + {0} PB {0} पेटाबायट + {0} TB {0} टेराबायट टेराबिट्स + {0} Tb {0} टेराबिट्स + {0} GB {0} गिगाबायट गिगाबिट + {0} Gb {0} गिगाबिट मॅगाबायट + {0} MB {0} मॅगाबायट मॅगाबिट + {0} Mb {0} मॅगाबिट + {0} kB {0} किलोबायट किलोबिट + {0} kb {0} किलोबिट - शतकां - {0} शतकां + शेंकडे + {0} शेंकडो + {0} शेंकडे दशकां + {0} दशक {0} दशकां - दर वर्सा {0} + {0} वर्स + {0} वर्सां + दर वर्स {0} - क्वार्टर्स + तिम्हयनाळे + {0} तिम्हयनाळें + {0} तिम्हयनाळे + {0}/तिम्हयनाळें + {0} म्हयनो + {0} म्ह दर म्हयनो {0} + सप्तकां + {0} सप्तक + {0} सप्तकां दर सप्तकाक {0} दर दिसा {0} + {0} वर {0} वरां दर वरा {0} + मिणटां + {0} मिन {0} मिण्टां - दर मिनीट {0} + दर मिनूट {0} - सेकंद + सॅकंड + {0} सॅकंड {0} सेकंदांनी दर सेकंद {0} + मिलीसॅकंड + {0} मिलीसॅकंड {0} मिलिसेकंदांनी मायक्रोसेकंदांनी + {0} मायक्रोसॅकंड {0} मायक्रोसेकंदांनी - {0} नॅनोसेकंदांनी + नॅनोसॅकंड + {0} नॅसॅक + {0} नॅनोसॅकंड एम्पियर + {0} A {0} एम्पियर मिलिएम्पियर + {0} mA {0} मिलिएम्पियर + {0} Ω {0} ओम + {0} V {0} वो किलोकॅलरीज + {0} kcal {0} किलोकॅलरीज कॅलरीज + {0} cal {0} कॅलरीज कॅलरीज + {0} kcal {0} कॅलरीज + {0} kJ {0} किलोज्युल + {0} J {0} ज्युल किलोवॅट-वरां + {0} kWh {0} किलोवॅट-वरां इलॅक्ट्रॉनवॉल्ट्स + {0} eV {0} इलॅक्ट्रॉनवॉल्ट्स ब्रिटिश थर्मल युनिट्स + {0} ब्रिटीश थर्मल युनीट {0} ब्रिटिश थर्मल युनिट्स @@ -4953,172 +6171,221 @@ CLDR data files are interpreted according to the LDML specification (http://unic पावंड ऑफ फोर्स + {0} lbf {0} पावंड ऑफ फोर्स + {0} न्यु {0} न्युटन किलोवॉट-वर/१००किलोमीटर + {0} किवॉवर/१००किमी {0} किलोवॉट-वर/१००किलोमीटर गिगाहर्ट्झ + {0} GHz {0} गिगाहर्ट्झ मॅगाहर्ट्झ + {0} MHz {0} मॅगाहर्ट्झ किलोहर्ट्झ + {0} kHz {0} किलोहर्ट्झ हर्ट्झ + {0} Hz {0} हर्ट्झ टायपोग्रॅफिक एम + {0} em {0} ems + चित्र-तत्वां + {0} px {0} पिक्सेल्स + मॅगा-चित्र-तत्वां + {0} MP {0} मॅगोपिक्सेल्स दर सेंटिमीटराक पिक्सेल - दर सेंटिमीटराक पिक्सेल {0} + {0} ppcm + दर सेंटिमीटराक चित्र-तत्वां {0} दर इंचाक पिक्सेल्स + {0} ppi दर इंचाक पिक्सेल {0} दर सेंटिमीटर ठिपके + {0} ppcm दर सेंटिमीटर ठिपके {0} दर इंचाक ठिपके + {0} ppi दर इंचाक ठिपके {0} + + चित्र-तत्वां + पृथ्वी त्रिज्या + {0} R⊕ {0} पृथ्वी त्रिज्या किलोमीटर + {0} किमी {0} किलोमीटर दर किलोमीटर {0} मीटर + {0} मी {0} मीटर दर मिटर {0} डेसीमीटर + {0} डेमी {0} डेसीमीटर सेंटिमीटर + {0} सेमी {0} सेंटिमीटर दर सेंटिमीटर {0} मिलिमीटर + {0} मिमी {0} मिलिमिटर मायक्रोमीटर + {0} μm {0} मायक्रोमीटर नॅनोमीटर + {0} nm {0} नॅनोमीटर पिकोमीटर + {0} pm {0} पिकोमिटर + {0} mi {0} मायल्स + {0} yd {0} यार्ड दर फूट {0} + {0} in {0} इंच दर इंच {0} पासेक्स + {0} pc {0} पासेक्स + {0} ly {0} प्रकाश वर्सां खगोलशास्त्रीय प्रमाण + {0} au {0} खगोलशास्त्रीय प्रमाण + {0} फर्लोंग {0} फर्लांग + {0} fth {0} फॅदम नॉटिकल मायल्स + {0} nmi {0} नॉटिकल्स मायल्स मायल-स्कँडिनेव्हियन + {0} smi {0} मायल्स-स्कँडिनेव्हियन + {0} pt {0} पॉयंट्स + {0} R☉ {0} सौर त्रिज्या + {0} lx {0} लक्स कॅन्डेला + {0} cd {0} कॅन्डेला ल्युमन + {0} lm {0} ल्युमन + {0} L☉ {0} सौर ल्युमिनोसायटिस मॅट्रिक टन + {0} t {0} मॅट्रिक टन किलोग्राम + {0} किग्रा {0} किलोग्राम {0}/किलोग्राम मिलिग्राम + {0} मिग्रा {0} मिलिग्राम मायक्रोग्राम + {0} μg {0} मायक्रोग्राम + {0} lb {0} पौंड {0} दर पौंड @@ -5127,237 +6394,300 @@ CLDR data files are interpreted according to the LDML specification (http://unic ट्रॉय औंस + {0} oz t {0} ट्रॉय औंस + {0} कॅ {0} कॅरट + {0} Da {0} डाल्टन + {0} M⊕ {0} पृथ्वी वस्तुमान + {0} M☉ {0} सौर वस्तुमान गिगावॉट्स + {0} GW {0} गिगावॉट्स मेगावॅट + {0} MW {0} मेगावॅट किलोवॅट + {0} kW {0} किलोवॅट + {0} W {0} वॅट मिलिवॅट + {0} mW {0} मिलिवॅट हॉर्सपावर + {0} hp {0} हॉर्सपावर मिलिमीटर ऑफ मर्क्युरी + {0} mm Hg {0} मिलिमीटर ऑफ मर्क्युरी - पावंड दर चौरस इंच - {0} पावंड दर चौरस इंच + पावंड दर चौकोन इंच + {0} psi + {0} पावंड दर चौकोन इंच इंचेस ऑफ मर्क्युरी + {0} inHg {0} इंचेस ऑफ मर्क्युरी + {0} पट्टी {0} पट्ट्यो मिलिबार + {0} mbar {0} मिलिबार अटमोसपियर + {0} atm {0} अटमोसपियर पास्कल + {0} Pa {0} पास्कल हेक्टोपास्कल + {0} hPa {0} हेक्टोपास्कल किलोपास्कल + {0} kPa {0} किलोपास्कल मेगापास्कल + {0} MPa {0} किलोपास्कल्स मीटर प्रती सेकंद + {0} kn {0} नॉट अंश तापमान + {0} अंश तापमान {0} अंश तापमान अंश सेल्सियस + {0}°C {0} अंश सेल्सियस + {0}°F {0} अंश फारेनहायट केल्वीन + {0} K {0} केल्वीन + {0} lbf⋅ft {0} पावंड-फूट न्युटन-मीटर + {0} N⋅m {0} न्युटन-मीटर - क्युबीक किलोमीटर - {0} क्युबीक किलोमीटर + घन किलोमीटर + {0} घन किलोमीटर + {0} घन किलोमीटर क्युबीक मीटर - {0} क्युबीक मीटर + {0} घन मीटर + {0} घन मीटर + {0} दर घन मीटर - क्युबीक सेंटीमीटर - {0} क्युबीक सेंटीमीटर - {0} दर क्युबीक सेंटीमीटर + घन सेंटीमीटर + {0} घन सेंटीमीटर + {0} घन सेंटीमीटर + {0} दर घन सेंटिमीटर - क्युबीक मील - {0} क्युबीक मील + घन मील + {0} घन मील + {0} घन मील - क्युबीक यार्ड - {0} क्युबीक यार्ड + घन यार्ड + {0} घन यार्ड + {0} घन यार्ड - क्युबीक फूट - {0} क्युबीक फूट + घन फुट + {0} घन फुट + {0} घन फुट - क्युबीक इंच - {0} क्युबीक इंच + घन इंच + {0} घन इंच + {0} घन इंच मॅगालिटर + {0} ML {0} मॅगालिटर हॅक्टोलीटर + {0} लि {0} लिटर {0}/लिटर डेसिलीटर + {0} dL {0} डेसिलीटर सेंटिलीटर + {0} cL {0} सेंटिलीटर मिलिलिटर + {0} मिलि {0} मिलिलिटर मॅट्रिक पाइंट + {0} mpt {0} मॅट्रिक पाइंट मॅट्रिक कप + {0} mc {0} मॅट्रिक कप एकर-फूट + {0} ac ft {0} एकर-फूट + {0} बुशेल {0} बुशेल्स गॅलोन + {0} गॅ {0} गॅलोन दर गॅलोन {0} इंपिरियल गॅलोन + {0} गॅल इंप. {0} इंप. गॅलोन {0} दर इंप. गॅलोन क्वार्त + {0} क्वा {0} क्वार्त + {0} pt {0} पाइंट फ्लुइड औंस + {0} fl oz US {0} फ्लुइड औंस इंपिरियल फ्लुइड औंस + {0} fl oz Imp. {0} इंप. फ्लुइड औंस व्हडलें कुलेर + {0} tbsp {0} व्हडलें कुलेर कुलेर + {0} कु {0} कुलेर डिझर्ट कुलेर + {0} dstspn {0} डिझर्ट कुलेर इंपिरियल डिझर्ट कुलेर + {0} dstspn Imp {0} इंप. डिझर्ट कुलेर ड्रॅम + {0} ड्रॅम फ्लु {0} ड्रॅम इंपिरियल क्वार्त + {0} qt Imp. {0} इंप. क्वार्त + + पंद्रस + {0} पंद्रस + {0} पंद्रस + प्रकाश + {0} प्रकाश {0} प्रकाश - राती + {0} रात {0} राती दर रात {0} - मुख्य दिका + मुखेळ दिशा {0} उदेंत {0} उत्तर {0} दक्षिण @@ -5382,18 +6712,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic मी/से² + {0} मी/से² {0} मी/से² रेडियन + {0} रे {0} रे अंश + {0} अंश {0} अंश आमि + {0} आर्कमिनीट {0} आर्कमिनीट @@ -5401,6 +6735,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic किमी² + {0} किमी² {0} किमी² {0}/किमी² @@ -5409,16 +6744,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic मीटर² + {0} मी² {0} मी² {0}/मी² सेमी² + {0} सेमी² {0} सेमी² {0}/सेमी² चौ मायल + {0} चौ मा {0} चौ मा @@ -5429,10 +6767,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic चौ फूट + {0} चौ फू {0} चौ फू डुनाम्स + {0} डुनाम {0} डुनाम @@ -5446,9 +6786,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic वस्त + {0} वस्त {0} वस्त - + पार्ट/मिलियन @@ -5459,6 +6800,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic मोल + {0} मोल {0} मोल @@ -5466,10 +6808,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic लि/100किमी + {0} लि/100किमी {0} लि/100किमी मैल/गॅ + {0} mpg {0} mpg @@ -5486,65 +6830,86 @@ CLDR data files are interpreted according to the LDML specification (http://unic बायट + {0} बायट {0} बायट बिट + {0} बिट {0} बिट + {0} श {0} श दशक + {0} दशक {0} दशक वर्सां + {0} वर्स {0} वर्सां - {0}/वर्सां + {0}/वर्स + + + तिम्ह + {0} तिम्ह + {0} तिम्ह + {0}/तिम्ह - म्हयने - {0} म्हयने + म्ह + {0} म्ह + {0} म्ह {0}/म्ह - सप्तक + सप्तकां + {0} सप्तक {0} सप्तक - {0}/स + {0}/सप्तक दीस + {0} दीस {0} दीस - {0}/दी + {0}/दीस वरां + {0} वर {0} वर {0}/वर - मिण्टां + मिण. + {0} मिन {0} मिनीट {0}/मिनीट सेकंदांनी - {0} सेकंद + {0} सॅक + {0} सॅक {0}/से मिलिसेकंदांनी + {0} मिसॅक {0} मिलिसेकंद - μsecs + मायसॅक + {0} मायसॅक + {0} मायसॅक नॅनोसेकंदांनी - {0} नॅसे + {0} नॅसॅक + {0} नॅसॅक एम्प्स @@ -5560,6 +6925,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Cal + {0} kcal {0} Cal @@ -5579,6 +6945,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic युएस थर्म + {0} युएस थर्म्स {0} युएस थर्म्स @@ -5586,51 +6953,61 @@ CLDR data files are interpreted according to the LDML specification (http://unic न्युटन + {0} न्यु {0} न्यु किवॉवर/१००किमी + {0} किवॉवर/१००किमी {0} किवॉवर/१००किमी पिक्सेल्स - मॅगोपिक्सेल्स + मॅगा-चित्र-तत्वां dpcm + {0} ppcm {0} dpcm dpi + {0} ppi {0} dpi ठिपके + {0} px {0} ठिपके किमी + {0} किमी {0} किमी {0}/किमी मी + {0} मी {0} मी {0}/मी डेमी + {0} डेमी {0} डेमी सेमी + {0} सेमी {0} सेमी {0}/सेमी मिमी + {0} मिमी {0} मिमी @@ -5641,6 +7018,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic फूट + {0} फूट {0} फूट @@ -5672,24 +7050,29 @@ CLDR data files are interpreted according to the LDML specification (http://unic किग्रा + {0} किग्रा {0} किग्रा {0}/किग्रा ग्राम + {0} ग्राम {0} ग्राम {0}/ग्रा मिग्रा + {0} मिग्रा {0} मिग्रा टन + {0} टन {0} टन स्टोन + {0} स्टोन {0} स्टोन @@ -5697,6 +7080,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic औंस + {0} औंस {0} औंस {0}/औंस @@ -5705,6 +7089,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic कॅरट + {0} कॅ {0} कॅ @@ -5718,6 +7103,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic कण + {0} कण {0} कण @@ -5728,23 +7114,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic पट्टी + {0} पट्टी {0} पट्टी किमी/व + {0} किमी/व {0} किमी/व मी/से + {0} मी/से {0} मी/से मा/व + {0} मा/व {0} मा/व नॉट + + अंश तापमान + अं. से @@ -5756,15 +7149,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic किमी³ + {0} किमी³ {0} किमी³ मी³ + {0} मी³ {0} मी³ {0}/मी³ सेमी³ + {0} सेमी³ {0} सेमी³ {0}/सेमी³ @@ -5779,11 +7175,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic लिटर + {0} लि {0} लि {0}/लि मिलि + {0} मिलि {0} मिलि @@ -5794,16 +7192,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic गॅ + {0} गॅ {0} गॅ {0}/गॅलो युएस इंप.गॅलोन + {0} गॅल इंप. {0} गॅल इंप. {0}/गॅलोन इंप. क्वा + {0} क्वा {0} क्वा @@ -5811,14 +7212,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic कप + {0} क {0} क कु + {0} कु {0} कु बॅरल + {0} बॅरल {0} बॅरल @@ -5829,38 +7233,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic थेंबो + {0} थेंबो {0} थेंबो ड्रॅम फ्लुइड + {0} ड्रॅम फ्लु {0} ड्रॅम फ्लु जिगर + {0} जिगर {0} जिगर चिमटी + {0} चिमटी {0} चिमटी क्वार्त इंप + + पंद्र + {0} पंद्र + {0} पंद्र + प्रकाश + {0} प्रकाश {0} प्रकाश राती + {0} रात {0} राती {0}/रात - दिका + दिशा {0} उदें {0} उत्त - {0} द - {0} अ + {0} दक्ष + {0} अस @@ -5874,71 +7289,90 @@ CLDR data files are interpreted according to the LDML specification (http://unic पि{0} + {0} G {0}Gs + {0} मी/से² {0}मी/से² + {0} rev {0}rev + {0} रे {0}रे + {0} अंश {0}° + {0} आर्कमिनीट {0}′ + {0} किमी² {0}किमी² + {0} ha {0}ha + {0} मी² {0}मी² + {0} सेमी² {0}सेमी² mi² + {0} चौ मा {0}mi² + {0} ac {0}ac yd² + {0} yd² {0}yd² - ft² + {0} चौ फू {0}ft² + {0} in² {0}in² डुनाम + {0} डुनाम {0}डुनाम + {0} kt {0}kt + {0} mg/dL {0}mg/dL mmol/L + {0} वस्त {0}वस्त - + ppm + {0} ppm {0}ppm @@ -5948,365 +7382,482 @@ CLDR data files are interpreted according to the LDML specification (http://unic + {0} मोल {0}मोल L/km + {0} L/km {0}L/km + {0} लि/100किमी {0}लि/100किमी + {0} mpg {0}mpg + {0} mpg Imp. {0}mpg Imp. + {0} PB {0}PB TB + {0} TB {0}TB + {0} Tb {0}Tb GB + {0} GB {0}GB + {0} Gb {0}Gb + {0} MB {0}MB + {0} Mb {0}Mb kB + {0} kB {0}kB + {0} kb {0}kb B + {0} बायट {0}B + {0} बिट {0}बिट + {0}श {0}श - {0}दशक + दश + {0}दश + {0}दश - वर्सा - {0}व + वर्स + {0}वर्स + {0}वर्स + {0}/वर्स + + + तिम्ह + {0}तिम्ह + {0}तिम्ह + {0}/तिम्ह - म्हयनो + म्ह + {0}म्ह {0}म्ह - - {0}स + सप्त + {0}सप्तक + {0}सप्त + {0}/सप्त + दी + {0}दी {0}दी वर - {0}व + {0}वर + {0}वर मिनीट - {0} मि + {0}मिन + {0}मिण सेकंद - {0}से + {0}सॅक + {0}सॅक मिलिसे + {0} मिसॅक {0}मिसे - {0}μs + मायसॅक + {0}मायसॅक + {0}मायसॅक नॅसे - {0}नॅसे + {0}नॅसॅक + {0}नॅसॅक एम्प + {0} A {0}A mA + {0} mA {0}mA + {0} Ω {0}Ω + {0} V {0}V + {0} kcal {0}kcal + {0} cal {0}cal + {0} kcal {0}Cal kJ + {0} kJ {0}kJ + {0} J {0}J kWh + {0} kWh {0}kWh eV + {0} eV {0}eV + {0} Btu {0}Btu + {0} युएस थर्म्स {0}युएस थर्म्स lbf + {0} lbf {0}lbf न्यु + {0} न्यु {0}न्यु + {0} किवॉवर/१००किमी {0}किवॉवर/१००किमी + {0} GHz {0}GHz + {0} MHz {0}MHz + {0} kHz {0}kHz + {0} Hz {0}Hz + {0} em {0}em px + {0} px {0}px - मॅपि + मॅगा-चित्र-तत्वां + {0} MP {0}MP - - {0}ppcm - + {0} ppi {0}ppi + {0} ppcm {0}dpcm + {0} ppi {0}dpi ठिपको + {0} px {0}ठिपको + {0} R⊕ {0}R⊕ + {0} किमी {0}किमी + {0} मी {0}मी + {0} डेमी {0}डेमी + {0} सेमी {0}सेमी + {0} μm {0}μm + {0} nm {0}nm + {0} pm {0}pm + {0} mi {0}mi + {0} yd {0}yd + {0} फूट {0}फूट + {0} in {0}in + {0} au {0}au + {0} fur {0}fur + {0} smi {0}smi + {0} pt {0}pt + {0} R☉ {0}R☉ + {0} lx {0}lx + {0} cd {0}cd + {0} lm {0}lm L☉ + {0} L☉ {0}L☉ + {0} t {0}t + {0} किग्रा {0}किग्रा + {0} ग्राम {0}ग्रा + {0} मिग्रा {0}मिग्रा + {0} μg {0}μg + {0} टन {0}टन + {0} स्टोन {0}स्टोन lb + {0} lb {0}# + {0} औंस {0}औंस oz t + {0} oz t {0}oz t + {0} कॅ {0}कॅ Da + {0} Da {0}Da M⊕ + {0} M⊕ {0}M⊕ M☉ + {0} M☉ {0}M☉ + {0} कण {0}कण + {0} GW {0}GW MW + {0} MW {0}MW + {0} kW {0}kW + {0} W {0}W + {0} mW {0}mW + {0} hp {0}hp mmHg + {0} mm Hg {0}mmHg + {0} psi {0}psi ″ Hg + {0} inHg {0}″ Hg + {0} पट्टी {0}पट्टी + {0} mbar {0}mb + {0} atm {0}atm + {0} Pa {0}Pa + {0} hPa {0}hPa + {0} kPa {0}kPa + {0} MPa {0}MPa + {0} मी/से {0}मी/से + {0} मा/व {0}मा/व @@ -6314,143 +7865,186 @@ CLDR data files are interpreted according to the LDML specification (http://unic °F + {0}°F {0}° + {0} K {0}K + {0} lbf⋅ft {0}lbf⋅ft + {0} N⋅m {0}N⋅m + {0} किमी³ {0}किमी³ + {0} मी³ {0}मी³ + {0} mi³ {0}mi³ + {0} yd³ {0}yd³ + {0} ft³ {0}ft³ + {0} in³ {0}in³ + {0} ML {0}ML + {0} hL {0}hL + {0} लि {0}लि + {0} dL {0}dL + {0} cL {0}cL + {0} मिलि {0}मिलि pt + {0} mpt {0}mpt + {0} mc {0}mc + {0} ac ft {0}ac ft बुशेल + {0} bu {0}bu + {0} गॅ {0}गॅ {0}/गॅ + {0} गॅल इंप. {0}गॅलइंप. {0}/गॅलइंप. qt + {0} क्वा {0}qt pt + {0} pt {0}pt + {0} क {0}क fl oz + {0} fl oz US {0}fl oz Imp fl oz + {0} fl oz Imp. {0}fl oz Im + {0} tbsp {0}tbsp tsp + {0} कु {0}tsp + {0} बॅरल {0}बॅरल dsp + {0} dstspn {0}dsp dsp Imp + {0} dstspn Imp {0}dsp-Imp + {0} थेंबो {0}थेंबो fl.dr. + {0} ड्रॅम फ्लु {0}fl.dr. + {0} जिगर {0}जिगर + {0} चिमटी {0}चिमटी qt Imp + {0} qt Imp. {0}qt-Imp. + + पंद्र + {0} पंद्र + {0} पंद्र + प्रकाश + {0} प्रकाश {0} प्रकाश - राती + {0}रात {0}राती - {0}/रात + दिशा {0}उदें {0}उत्त - {0}द - {0}अ + {0}दक्ष + {0}अस @@ -6459,6 +8053,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, वा {1} {0} वा {1} + + {0}, or {1} + {0} or {1} + {0}, {1} {0}, {1} @@ -6491,6 +8089,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} — तरेकवार {0} — हेर लिपयो — {0} + {0} आघात {0} आघात सबस्क्रिप्ट {0} सुपरस्क्रिप्ट {0} @@ -6647,51 +8246,174 @@ CLDR data files are interpreted according to the LDML specification (http://unic स्लॅश शून्य - und kok - ko si ta te vi yue zh + und kok kok_Latn + informal + + {title} {given} {given2} {surname} {surname2} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {given-monogram-allCaps}{given2-monogram-allCaps}{surname-monogram-allCaps}{surname2-monogram-allCaps} + + + {given-informal-monogram-allCaps}{surname-monogram-allCaps}{surname2-monogram-allCaps} + + + {given} {given2-initial} {surname} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given-initial} {given2-initial} {surname} + + + {given-informal} {surname-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {surname2} {title} {given} {given2} {generation}, {credentials} + + + {surname} {surname2} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps}{given-informal-monogram-allCaps} + + + {surname} {given} {given2-initial} {generation}, {credentials} + + + {surname} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {given-initial} {given2-initial} + + + {surname} {given-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname-core}, {given} {given2} {surname-prefix} + + + {surname} {surname2}, {given-informal} + + + {surname-core}, {given} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given-initial} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + दिशा - उमेश - भंडारकर + शांति + गांवकर - अतुल - मनोहर - प्रभुकोंकार + मारिया + हेलेना + फर्नॅन्डेज - श्री. - उमेश भंडारकर - साक्षी - अनुसुया कुंकळ्येकार - ∅∅∅ - प्रभु - मावजो - क. + श्री + फ्रांसिस शावियेर + फोर्सु + जुआंव आंतोन + दे + सोजा + ए मेनेजेस + धा. एमपी सिंदबाद - आरवी - कामत + काथा + बाउमान - मनोहर - माधव - नायक + जाजिला + हामिश + स्टोबा प्रो. डॉ. - विक्रम सिंह - विकी - रामचरण दास - शेणवी कुंकळ्येकार - शर्मा - सरदेसाय + आडा कोर्नेलिया + नील + सेजार मार्टिन + वॉन + ब्रूह्ल + गॉन्जालेज डोमिंगो जेआर बी.ए. एल.एल.बी diff --git a/make/data/cldr/common/main/kok_Latn.xml b/make/data/cldr/common/main/kok_Latn.xml index e7566ebdaaa..89ff58c34ef 100644 --- a/make/data/cldr/common/main/kok_Latn.xml +++ b/make/data/cldr/common/main/kok_Latn.xml @@ -13,34 +13,504 @@ CLDR data files are interpreted according to the LDML specification (http://unic + Afrikaans + Akan + Amharic Arbi + Adhunik Promann Orbi + Osomiya + Asturian + Azerbaijani + Azeri + Baluchi + Belarusian + Bulgarian + Haryanvi + Bhojpuri + Anii + Bangla + Breton + Bodo + Bosnian + Catalao + Cebuano + Cherokee + Chek + Swampy Cree + Chuvax + Welx + Denmarkez + Jermon + Jermon (Austria) + Jermon (Switzerland) + Dogri + Sokoilem Sorbian + Ewe Grik Inglix + Inglix (Australia) + Inglix (Canada) + Inglix (Sõyukt Razvott) + Inglix (Amerikechim Sõyukt Rajyam) + Esperanto Ispanhol + Ispanhol (Latin Amerika) + Ispanhol (Meksiko) + Estonian + Bask + Farsi + Fula + Finlandez + Filipino + Faroez Fransez + Fransez (Canada) + Fransez (Switzerland) + Ostonti Frisian + Ayerlandez + Ga + Scottish Gaelic + Galician + Gujarati + Hausa + Hebrev + Hindi + Romi Hindi + Croatian + Voilem Sorbian + Hungarian + Armenian + Interlingua + Indonesian + Interlingue + Igbo + Sichuan Yi + Ayslandez + Italian + Japani + Javanez + Georgian + Kabuverdianu + Kaingang + Kazakh + Khmer Kon’nodd + Korean Konknni + Kaxmiri + Kurdez + Kurdez + Kurmanji + Kuvi + Kyrgyz + Latin + Luxembourgez + Ligurian + Lombard + Lao + Lithuanian + Latvian + Maithili + Maori + Masedonian + Malayalam + Mongolian + Manipuri Moratthi + Malay + Maltez + Sabar bhaso + Burmez + Sokoilem Jermon + Nepali + Hollandi + Hollandi (Beljiom) + Norwegian Nynorsk + Norwegian + N’Ko + Ut’tori Sotho + Occitan + Oromo + Odia + Punjabi + Nigerian Pidgin + Polandez + Prussian + Pashto + Portugez + Portugez (Brazil) + Portugez (Portugal) + Kechua + Rajasthani + Romansh + Romanian + Roxyan + Kinyarwanda + Sanskrit + Yakut + Santali + Sardinian + Sindhi + Sinhala + Slovak + Slovenian + Somali + Albanian + Serbian + Southern Sotho + Sundanez + Sweedez + Swahili + Syriac + Silesian + Tamil + Telugu + Tajik + Thai + Tigrinya + Turkmen + Tswana + Tongan + Turki + Tatar + Uyghur + Ukrainian + Onollkhi bhas + Urdu + Uzbek + Venixan + Vietnamez + Makhuwa + Wolof + Khosa + Kangri + Yoruba + Nheengatu + Cantonez + Chini, Cantonez + Zhuang Chini + Chini, Mandarin + Sompi Chini + Sompi Mandarin Chini + Paromporik Chini + Paromporik Mandarin Chini + Zulu + Bhaxik mozkur na + + + + + + sonvsar + Afrika + Ut’tor Amerika + Dokxinn Amerika + Oxiania + Ostonti Afrika + Modlo America + Udenti Afrika + Ut’tori Amerika + Modlo Afrika + Dokxinni Afrika + Purai Amerika + Ut’tori Amerika + Caribean + Udenti Asia + Dokxinni Asia + Dokxinn-udent Asia + Dokxinni Yerop + Australasia + Melanesia + Micronesia Prant + Polinesia + Asia + Modlo Asia + Ostonti Asia + Yerop + Udenti Yerop + Ut’tori Yerop + Ostonti Yerop + Saharache Dokxinnek Afrika + Latin Amerika + Ascensanv Zunvo + Andorra + Sõyukt Orbi Emirat + Afghanistan + Antigua ani Barbuda + Anguila + Albania + Armenia + Angola + Antarktika + Argentina + Amerikecho Samoa + Austria + Australia + Aruba + Oland Zunve + Azerbaijan + Bosnia ani Herzegovina + Barbados + Bangladex + Beljiom + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + São Bartolomev + Bermudas + Brunei + Bolivia + Caribean Netherlands + Brazil + Bahamas + Bhutan + Bouve Zunvo + Botswana + Belarus + Belize + Canada + Cocos (Keeling) Zunve + Congo - Kinshasa + Modlem Afriki Porjeraj + Congo - Brazzavil + Switzerland + Costa do Marfim + Cook Zunve + Chili + Camaroon Chin + Colombia + Clipperton Zunvo + Sark + Costa Rica + Cuba + Cabo Verde + Curaçao + Christmas Zunvo Siprus + Chekia Jermon + Diego Garcia + Djibuti + Denmark + Dominika + Dominican Porjeraj + Algeria + Ceuta ani Meliya + Equador + Estonia Ejipt + Ostonti Sahara + Eritrea Ispania + Ethiopia + Yeropi Ekvott + Yuro kxetr + Finland + Fiji + Fokland Zunve + Malvinas Zunve + Maicronesia + Fero Zunve Frans + Gabon + Sõyukt Razvott + Grenada + Georgia + Fransez Guiana + Guernzy + Ghana + Gibraltar + Greenland + Gambia + Gini + Guadalup + Bhuinmodlogitacho Gini Gres + Dokxinn Georgia ani Dokxinn Sandwich Zunve + Guatemala + Guam + Gini-Bissau + Guiana + Hong Kong + Heard ani McDonald Zunve + Honduras + Croaxia + Haiti + Hungary + Canarias Zunve + Indonesia + Ayerland + Israel + Menacho Zunvo Bharot + Britanacho Hindi Mahasagor Prant + Xagos Zunve + Irak + Iran + Aysland Italia + Jersy + Jamaica + Jordan + Japan + Kenya + Kyrgyzstan + Cambodia + Kiribas + Comoros + São Cristovão ani Nevis + Ut’tor Korea + Dokxinn Korea + Kuwait + Cayman Zunve + Kazakhstan + Laos + Lebanon + Santa Lucia + Lixtenstain + Sri Lanka + Laibiria + Lesotho + Lithuania + Luksemborg + Latvia Libia + Morokko + Monaco + Moldova + Montenegro + São Martinho (Frans) + Madagascar + Marxal Zunve Ut’tor Masedonia + Mali + Myanmar + Mongolia + Macao + Ut’tori Mariana Zunvo + Martinik + Mauritania + Montserrat + Malta + Maurixos + Maldiv + Malawi + Meksiko + Malayxia + Mozambique + Namibia + Novo Caledonia + Naiger + Norfok Zunvo + Naigeria + Nicaragua + Netherlands + Norway + Nepal + Nauru + Niue + Novo Zeeland + Aoteroa + Oman + Panama + Peru + Fransez Polinesia + Papua Novo Gini + Phillipines + Pakistan + Poland + São Pedro ani Miquelão + Pitcairn Zunve + Porto Rico + Palestin + Palestini Prant + Portugal + Palau + Paraguay + Qatar + Poixilo Oxiania + Reunião + Romenia + Serbia Roxya + Ruanda + Saudi Orob + Solomon Zunve + Seyxels + Sudan + Sweeden + Singapur + Santa Helena + Slovenia + Svalbard ani Yan Mayen + Slovakia + Serra Leõ + San Marino + Senegal + Somalia + Surinam + Dokxinn Sudan + São Tomé ani Príncipe + El Salvador + São Martinho (Netherlands) + Siria + Eswatini + Tristão da Cunha + Turk ani Caicos Zunve + Chad + Fransez Dokxinni Prant + Togo + Thailand + Tajikistan + Tokolau + Timor-Leste + Udent Timor + Turkmenistan + Tunisia + Tonga + Turkiya + Trindade ani Tobag + Tuvalu + Taiwan + Tanzania + Yukrain + Yuganda + Sõyukt Rajyanche Poixile Dhaktte Zunve + Sõyukt Raxttram + Amerikechim Sõyukt Rajyam + Uruguay + Uzbekistan + Vatikan Xar + São Vicent ani Granadinas + Venezuela + Britanache Virgin Zunve + Sõyukt Rajyanche Virgin Zunve + Vietnam + Vanuatu + Wollis ani Futuna + Samoa + Kosovo + Yemen + Mayott + Dokxinn Afrika + Zambia + Zimbabwe + Onollkhi Prant + + Britix + Ameriki + Bhas: {0} Lipi: {0} @@ -48,9 +518,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - [aã b cç d eêẽ f g h iĩ j k l m nñ oôõ p q r s t u v w x y z] - [áàăâåäā æ éèĕëē íìĭîïī óòŏöøō œ úùŭûüū ÿ] - [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [aã b cç d eêẽ f g h iĩ j k l m nñ oôõø p q r s t u v w x y z] + [áàăâåäā æ éèĕëē íìĭîïī óòŏöō œ úùŭûüū ÿ] + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” « » ( ) \[ \] § @ * / \& # † ‡ ′ ″] @@ -85,6 +555,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} 'vaztam' + + {1}, {0} 'vaztam' + @@ -93,33 +566,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} 'vaztam' + + {1}, {0} 'vaztam' + {1}, {0} - - {1}, {0} - {1}, {0} - - {1}, {0} - + B h 'vaztam' + B h:mm + B h:mm:ss + E B h 'vaztam' + E B h:mm 'vaztam' + E B h:mm:ss + E, d + E a h 'vaztam' + E a h:mm  E a h:mm:ss - y G + M-y G d-M-y GGGGG + E, d-M-y G MMM y G d MMM, y G E, d MMM, y G a h + HH'v' a h:mm a h:mm:ss + a h 'vaztam' v + HH'v' v d-M E, d-M d MMM @@ -139,10 +622,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic + B h – B h 'vaztam' h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -288,6 +771,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mar Abr Mai + Jun Jul Ago Set @@ -295,20 +779,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nov Dez - - J - F - M - A - M - J - J - A - S - O - N - D - Janer Febrer @@ -352,15 +822,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Suk Son - - A - S - M - B - B - S - S - Ai Sm @@ -404,30 +865,76 @@ CLDR data files are interpreted according to the LDML specification (http://unic 1lem timhoinallem 2rem timhoinallem 3rem timhoinallem - 4tem timhoinallem + 4them timhoinallem + + + + + 1lem timhoinallem + 2rem timhoinallem + 3rem timhoinallem + 4them timhoinallem + + modhyan + sokall + donpar + sanj + rat + + + md + a + p + sk + dp + sj + rt + + modhyanrat sokallim sanje + sokallim + donparam + sanje + rati + + modhyan + sokall + donpar + sanj + rat + + + md + sk + dp + sj + rt + + modhyanrat sokallim sanje + sokallim + donparam + sanje + rati Krista Adim - KA Anno Domini - AD KA @@ -490,6 +997,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} 'vaztam' + + {1}, {0} 'vaztam' + @@ -498,48 +1008,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} 'vaztam' + + {1}, {0} 'vaztam' + {1}, {0} - - {1}, {0} - {1}, {0} - - {1}, {0} - - B h + B h 'vaztam' B h:mm B h:mm:ss + E B h 'vaztam' E B h:mm E B h:mm:ss + E a h 'vaztam' E a h:mm E a h:mm:ss - y G + M/y G d-M-y G + E, d-M-y G MMM y G d MMM, y G E, d MMM, y G - a h + a h 'vaztam' + HH'v' a h:mm a h:mm:ss a h:mm:ss v a h:mm v + a h 'vaztam' v + HH'v' v d/M dd-MM, E d MMM E, d MMM d MMMM + MMMM -'acho' 'suman' W MMMM -'acho' 'suman' W - M-y + M/y d-M-y E, d-M-y MMM y @@ -548,12 +1062,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMMM y QQQ y QQQQ y + Y -'acho' 'suman' w Y -'acho' 'suman' w - B h – B h - B h – h + B h 'vaztam' – B h 'vaztam' + B h – h 'vaztam' B h:mm – B h:mm @@ -563,10 +1078,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic d – d - - y G – y G - y – y G - M/y G – M/y G M/y – M/y G @@ -602,11 +1113,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, d MMM, y – E, d MMM, y G - a h – a h - a h–h + a h 'vaztam' – a h 'vaztam' + a h–h 'vaztam' - HH – HH + HH–HH'v' a h:mm – a h:mm @@ -627,11 +1138,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm – HH:mm v - a h – a h v - a h–h v + a h 'vaztam' – a h 'vaztam' v + a h–h 'vaztam' v - HH – HH v + HH–HH'v' v M – M @@ -698,45 +1209,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic yug - - yug - - - yug - voros - fattlem voros - hem voros + porum + ondum fuddlem voros + {0} vorsan {0} vorsanim + {0} voros adim {0} vorsam adim - voros - fattlem voros - hem voros + porum + ondum fuddlem voros + {0} vorsan {0} vorsanim + {0} voros adim {0} vorsam adim - voros - fattlem voros - hem voros + porum + ondum fuddlem voros + {0}vorsan {0}vorsanim + {0}voros adim {0}vorsam adim @@ -746,9 +1255,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic hem timhoinallem fuddlem timhoinallem + {0} timhoinallean {0} timhoinalleanim + {0} timhoinallem adim {0} timhoinalle adim @@ -758,9 +1269,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic hem timho. fuddlem timho. + {0} timhoinallean {0} timhoinalleanim + {0} timho. adim {0} timho. adim @@ -770,9 +1283,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic hem timh fuddlem timh + {0}timhoinallean {0}timhoinalleanim + {0}timh adim {0}timh adim @@ -782,9 +1297,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho mhoino fuddlo mhoino + {0} mhoinean {0} mhoineanim + {0} mhoino adim {0} mhoine adim @@ -794,9 +1311,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho mho. fuddlo mho. + {0} mhoinean {0} mhoineanim + {0} mho. adim {0} mho. adim @@ -806,9 +1325,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho mh fuddlo mh + {0}mhoinean {0}mhoineanim + {0}mh adim {0}mh adim @@ -818,25 +1339,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho suman fuddlo suman + {0} sumanan {0} sumananim + {0} suman adim {0} suman adim {0} cho suman - suman - fattlo suman - ho suman - fuddlo suman + {0} sumanan {0} sumananim - - {0} suman adim - - {0} cho suman sum @@ -844,9 +1360,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho sum fuddlo sum + {0}sumanan {0}sumananim + {0}sum adim {0}sum adim {0} cho sum @@ -854,9 +1372,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic mhoineacho suman - - mhoineacho suman - mhoineacho sum. @@ -866,23 +1381,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic aiz faleam + {0} disan {0} disanim + {0} dis adim {0} dis adim - dis - kal - aiz - faleam + {0} disan {0} disanim - - {0} dis adim - d @@ -890,38 +1401,45 @@ CLDR data files are interpreted according to the LDML specification (http://unic aiz fal + {0}disan {0}disanim + {0}d adim {0}d adim vorsacho dis - - vorsacho dis - vorsacho d. sumanacho dis - - sumanacho dis - sumanacho d. + + mhoineant disacho prosong + + + mhoineant disacho prosong + + + mhoineant disacho prosong + fattlo Aitar ho Aitar fuddlo Aitar + {0} Aitaran {0} Aitaranim + {0} Aitar adim {0} Aitaram adim @@ -930,9 +1448,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Ait. fuddlo Ait. + {0} Aitaran {0} Aitaranim + {0} Ait. adim {0} Ait. adim @@ -941,9 +1461,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Ai fuddlo Ai + {0} Aitaran {0} Aitaranim + {0} Ai adim {0} Ai adim @@ -952,9 +1474,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Somar fuddlo Somar + {0} Somaran {0} Somaranim + {0} Somar adim {0} Somaram adim @@ -963,9 +1487,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Som. fuddlo Som. + {0} Somaran {0} Somaranim + {0} Som. adim {0} Som. adim @@ -974,9 +1500,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Sm fuddlo Sm + {0} Somaran {0} Somaranim + {0} Sm adim {0} Sm adim @@ -985,9 +1513,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Mongllar fuddlo Mongllar + {0} Mongllaran {0} Mongllaranim + {0} Mongllar adim {0} Mongllaram adim @@ -996,9 +1526,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Mon. fuddlo Mon. + {0} Mongllaran {0} Mongllaranim + {0} Mon. adim {0} Mon. adim @@ -1007,9 +1539,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Mg fuddlo Mg + {0} Mongllaran {0} Mongllaranim + {0} Mg adim {0} Mg adim @@ -1018,9 +1552,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Budhvar fuddlo Budhvar + {0} Budhvaran {0} Budhvaranim + {0} Budhvar adim {0} Budhvaram adim @@ -1029,9 +1565,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Bud. fuddlo Bud. + {0} Budhvaran {0} Budhvaranim + {0} Bud. adim {0} Bud. adim @@ -1040,9 +1578,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Bu fuddlo Bu + {0} Budhvaran {0} Budhvaranim + {0} Bu adim {0} Bu adim @@ -1051,9 +1591,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Birestar fuddlo Birestar + {0} Birestaran {0} Birestaranim + {0} Birestar adim {0} Birestaram adim @@ -1062,9 +1604,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Bre. fuddlo Bre. + {0} Birestaran {0} Birestaranim + {0} Bre. adim {0} Bre. adim @@ -1073,9 +1617,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Br fuddlo Br + {0} Birestaran {0} Birestaranim + {0} Br adim {0} Br adim @@ -1084,9 +1630,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Sukrar fuddlo Sukrar + {0} Sukraran {0} Sukraranim + {0} Sukrar adim {0} Sukraram adim @@ -1095,9 +1643,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Suk. fuddlo Suk. + {0} Sukraran {0} Sukraranim + {0} Suk. adim {0} Suk. adim @@ -1106,9 +1656,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Su fuddlo Su + {0} Sukraran {0} Sukraranim + {0} Su adim {0} Su adim @@ -1117,9 +1669,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Sonvar fuddlo Sonvar + {0} Sonvaran {0} Sonvaranim + {0} Sonvar adim {0} Sonvaram adim @@ -1128,9 +1682,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Son. fuddlo Son. + {0} Sonvaran {0} Sonvaranim + {0} Son. adim {0} Son. adim @@ -1139,48 +1695,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic ho Sn fuddlo Sn + {0} Sonvaran {0} Sonvaranim + {0} Sn adim {0} Sn adim - - AM/PM - AM/PM - - AM/PM - vor hem vor + {0} voran {0} voranim + {0} vor adim {0} voram adim - vor - hem vor + {0} voran {0} voranim + {0} vor adim {0} voram adim - vor - hem vor + {0}voran {0}voranim + {0}vor adim {0}voram adim @@ -1188,9 +1742,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic minut ho minut + {0} mintan {0} mintanim + {0} minut adim {0} mintam adim @@ -1198,9 +1754,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic min. ho min. + {0} mintan {0} min. + {0} min. adim {0} min. adim @@ -1208,9 +1766,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic min ho min + {0}mintan {0}min + {0}min adim {0}min adim @@ -1218,29 +1778,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic sekond atam + {0} sekondan {0} sekondanim + {0} sekond adim {0} sekond adim sek. - atam + {0} sekondan {0} sekondanim + {0} sek. adim {0} sek. adim sek - atam + {0}sekondan {0}sekondanim + {0}sek adim {0}sek adim @@ -1250,29 +1814,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic kxetr - - kxetr - {0} Vell - {0} Dis-uzvadd vachovp Vell + {0} Dis-uzvadd Vachovp Vell {0} Promann Vell + + + Vixvacho Somonvoyit Vell + + + + Onollkhi Zago + + + Kolkata, Bombaim, Ponnji + - Greenwich Mean Time + Greenwich Promann Vell - - - - #,##,##0.### - - - @@ -1315,7 +1880,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 + #,##,##0.00 @@ -1323,219 +1893,817 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 + #,##,##0.00 ¤0hoz + ¤ 0hoz ¤00hoz + ¤ 00hoz ¤0lak + ¤ 0lak ¤00lak + ¤ 00lak ¤0ko + ¤ 0ko ¤00ko + ¤ 00ko ¤0obz + ¤ 0obz ¤00obz + ¤ 00obz ¤0nikh + ¤ 0nikh ¤00nikh + ¤ 00nikh ¤000nikh + ¤ 000nikh ¤0hoz'.'nikh'.' + ¤ 0hoz'.'nikh'.' + + {0} vantto + {0} vantte + {0}vya uzvya vatten voch. + + + maikro{0} + + + {0} dor {1} + + + choukon {0} + choukon {0} + + + ghon {0} + ghon {0} + + + {0}-{1} + + + onx + {0} onx + {0} onx + + + choukon kilomiter + {0} choukon kilomiter + {0} choukon kilomiter + {0} dor choukon kilomiter + + + choukon miter + {0} choukon miter + {0} choukon miter + {0} dor choukon miter + + + choukon centimiter + {0} choukon centimiter + {0} choukon centimiter + {0} dor choukon centimiter + + + choukon mil + {0} choukon mil + {0} choukon mil + {0} dor choukon mil + + + choukon yard + {0} choukon yard + {0} choukon yard + + + choukon fut + {0} choukon fut + {0} choukon fut + + + choukon inch + {0} choukon inch + {0} choukon inch + {0} dor choukon inch + + + petabayt + {0} petabayt + {0} petabayt + + + terabayt + {0} terabayt + {0} terabayt + + + {0} terabit + + + gigabayt + {0} gigabayt + {0} gigabayt + + + {0} gigabit + + + megabayt + {0} megabayt + {0} megabayt + + + {0} megabit + + + kilobayt + {0} kilobayt + {0} kilobayt + + + {0} kilobit + + + bayt + {0} bayt + {0} bayt + xekdde + {0} xekddo {0} xekdde doskam + {0} dosok {0} doskam - vorsam + {0} voros {0} vorsam dor voros {0} timhoinalle + {0} timhoinallem {0} timhoinalle {0}/timhoinallem mhoine + {0} mhoino {0} mhoine dor mhoino {0} - suman - {0} suman dor sumanak {0} - dis - {0} dis dor disa {0} - voram + {0} vor {0} voram dor vora {0} mintam + {0} minut {0} mintam dor minut {0} sekond + {0} sekond {0} sekond dor sekond {0} milisekond + {0} milisekond {0} milisekond maikrosekond + {0} maikrosekond {0} maikrosekond nanosekond + {0} nanosekond {0} nanosekond + + chitr-totvam + {0} chitr-totv + {0} chitr-totvam + + + mega-chitr-totvam + {0} mega-chitr-totv + {0} mega-chitr-totvam + + + dor centimiterak chitr-totvam + {0} dor centimiterak chitr-totv + {0} dor centimiterak chitr-totvam + + + dor inchak chitr-totvam + {0} dor inchak chitr-totv + {0} dor inchak chitr-totvam + + + kilomiter + {0} kilomiter + {0} kilomiter + {0} dor kilomiter + + + miter + {0} miter + {0} miter + {0} per miter + + + decimiter + {0} decimiter + {0} decimiter + + + centimiter + {0} centimiter + {0} centimiter + {0} dor centimiter + + + millimiter + {0} millimiter + {0} millimiter + + + maikromiter + {0} maikromiter + {0} maikromiter + + + nanomiter + {0} nanomiter + {0} nanomiter + + + picomiter + {0} picomiter + {0} picomiter + + + mil + {0} mil + {0} mil + + + paund dor choukon inch + {0} paund dor choukon inch + {0} paund dor choukon inch + + + onx tapman + {0} onx tapman + {0} onx tapman + + + onx Celsius + {0} onx Celsius + {0} onx Celsius + + + onx Fahrenheit + {0} onx Fahrenheit + {0} onx Fahrenheit + + + ghon kilomiter + {0} ghon kilomiter + {0} ghon kilomiter + + + ghon miter + {0} ghon miter + {0} ghon miter + {0} dor ghon miter + + + ghon centimiter + {0} ghon centimiter + {0} ghon centimiter + {0} dor ghon centimiter + + + ghon mil + {0} ghon mil + {0} ghon mil + + + ghon yard + {0} ghon yard + {0} ghon yard + + + ghon fut + {0} ghon fut + {0} ghon fut + + + ghon inch + {0} ghon inch + {0} ghon inch + + + pondros + {0} pondros + {0} pondros + - rati + {0} rat {0} rati dor rat {0} + + mukhel dixa + {0} udent + {0} ut’tor + {0} dokxin + {0} Ostont + + + onx + {0} onx + {0} onx + + + PBayt + + + TBayt + + + Tbit + + + GBayt + + + Gbit + + + MBayt + + + Mbit + + + kBayt + + + kbit + + + bayt + {0} bayt + {0} bayt + x + {0} x {0} x dos + {0} dos {0} dos vorsam + {0} voros {0} vorsam {0}/voros timho + {0} timho {0} timho {0}/timho mho + {0} mho {0} mho {0}/mho suman + {0} suman {0} suman {0}/suman dis + {0} dis {0} dis {0}/dis voram + {0} vor {0} vor {0}/vor sek + {0} sek {0} sek {0}/sek msek + {0} msek {0} msek μsek + {0} μsek {0} μsek nanosek + {0} nsek {0} nsek + + chitr-totvam + + + mega-chitr-totvam + + + mil + + + onx tapman + + + onx C + + + onx F + + + pondr + {0} pondr + {0} pondr + rati + {0} rat {0} rati {0}/rat + + dixa + {0} UD + {0} UT + {0} DO + {0} OS + + + onx + + + PBayt + + + TBayt + + + GBayt + + + MBayt + + + kBayt + + + B + {0}B + {0}B + + + {0}bit + {0}bit + - x + {0}x {0}x - dos + {0}dos {0}dos - vorsam + {0}voros {0}vorsam - {0}/voros - timho + {0}timho {0}timho - {0}/timho - mho + {0}mho {0}mho - {0}/mho sum + {0}sum {0}sum {0}/sum d + {0}d {0}d + {0}/d vor + {0}vor {0}vor - {0}/vor + {0}min {0}min - sek + {0}sek {0}sek - {0}/sek - msek + {0}msek {0}msek - μsek + {0}μsek {0}μsek nsek + {0}nsek {0}nsek - - rati - {0}rati - {0}/rat + + pondr + {0} pondr + {0} pondr + + {0}rat + {0}rati + + + dixa + {0}UD + {0}UT + {0}DO + {0}OS + + + + {0}, ani {1} + {0} ani {1} + + + {0}, vo {1} + {0} vo {1} + + + {0}, vo {1} + {0} vo {1} + + + {0}, vo {1} + {0} vo {1} + + + {0}, & {1} + {0} & {1} + + + {0} ani {1} + + + {0} {1} + {0} {1} + {0} {1} + {0} {1} + + + + + hoi:h + na:n + + + + und kok kok_Latn + informal + + {title} {given} {given2} {surname} {surname2} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {given-monogram-allCaps}{given2-monogram-allCaps}{surname-monogram-allCaps}{surname2-monogram-allCaps} + + + {given-informal-monogram-allCaps}{surname-monogram-allCaps}{surname2-monogram-allCaps} + + + {given} {given2-initial} {surname} {generation}, {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given-initial} {given2-initial} {surname} + + + {given-informal} {surname-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {surname2} {title} {given} {given2} {generation}, {credentials} + + + {surname} {surname2} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps}{given-informal-monogram-allCaps} + + + {surname} {given} {given2-initial} {generation}, {credentials} + + + {surname} {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname} {given-initial} {given2-initial} + + + {surname} {given-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname-core}, {given} {given2} {surname-prefix} + + + {surname} {surname2}, {given-informal} + + + {surname-core}, {given} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given-initial} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + Prema + + + Shanti + Gaonkar + + + Maria + Helena + Fernandes + + + Mr. + Francisco Xavier + Forsu + Joao Anton + de + Souza + e Menezes + Dk + MP + + + Sinbad + + + Käthe + Müller + + + Zäzilia + Hamish + Stöber + + + Prof. Dr. + Ada Cornelia + Neele + César Martín + von + Brühl + González Domingo + Jr + MD DDS + + diff --git a/make/data/cldr/common/main/ks.xml b/make/data/cldr/common/main/ks.xml index 5592cc9b897..58b33083aa0 100644 --- a/make/data/cldr/common/main/ks.xml +++ b/make/data/cldr/common/main/ks.xml @@ -923,7 +923,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ISO-8601 کیلنڈر جاپٲنؠ کیلنڑَر جموٗریٲتی چیٖنی کیلَنڑَر - رؠوٲتی چیٖنی تِرتیٖب فون بُک تَرتیٖب آسان بَناونہٕ آمُت چیٖنی پیٖنیَن تَرتیٖب معیٲری ترتیٖب آڈر @@ -2175,9 +2174,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic نوم پؠنہہ - - اؠنڑربیری - کِرِتِماتی @@ -2846,9 +2842,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - مغربی افریٖقا ٹایِم - مغربی افریٖقا سٹینڈرڈ ٹایِم - مغربی افریٖقا سَمَر ٹایِم + مغربی افریٖقا ٹایِم @@ -3224,6 +3218,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic گُیَنا ٹایِم + + + حَواے اؠلیوٗٹِیَن سٹینڑاڑ ٹایِم + + حَواے اؠلیوٗٹِیَن ٹایِم @@ -3669,6 +3668,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ٹٔرک ٹایِم + + + تُرکی ٹایِم + تُرکی سٹینڑاڑ ٹایِم + تُرکی سَمَر ٹایِم + + ترکمانستان ٹائم diff --git a/make/data/cldr/common/main/ks_Deva.xml b/make/data/cldr/common/main/ks_Deva.xml index 6cdc96cfc00..26c540fe3cb 100644 --- a/make/data/cldr/common/main/ks_Deva.xml +++ b/make/data/cldr/common/main/ks_Deva.xml @@ -115,7 +115,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd diff --git a/make/data/cldr/common/main/ksf.xml b/make/data/cldr/common/main/ksf.xml index d2f9e02e439..aa7a59dc790 100644 --- a/make/data/cldr/common/main/ksf.xml +++ b/make/data/cldr/common/main/ksf.xml @@ -557,6 +557,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ksh.xml b/make/data/cldr/common/main/ksh.xml index 1e34fe41add..43af5f40d04 100644 --- a/make/data/cldr/common/main/ksh.xml +++ b/make/data/cldr/common/main/ksh.xml @@ -763,10 +763,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic japaanesche Kaländer pärsesche Kaländer rotschineesesche Kaländer - zoteert nohm tradizjonäll schineesesch Big5 zotehrt wi em Wööterbohch standattmähßesch zotehrt nohm Unicode - zoteert nohm eijfacher schineesesch GB2312 zoteert wi em Tollefoonbooch zoteert noh de Pinjin Ömschreff vum Schineesesch Söhke @@ -1629,9 +1627,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wäß-Affrekaanesche Zigg - Jewöhnlijje Wäß-Affrekaanesche Zigg - Wäß-Affrekaanesche Sommerzigg + Wäß-Affrekaanesche Zigg @@ -1801,6 +1797,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ku.xml b/make/data/cldr/common/main/ku.xml index f9e1ec94a62..dc0a5fe47f7 100644 --- a/make/data/cldr/common/main/ku.xml +++ b/make/data/cldr/common/main/ku.xml @@ -27,7 +27,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic aragonî obolo angîkayî - erebîya bakurê şamê + erebîya bakurê Şamê erebî erebîya modern a standard mapuçî @@ -40,7 +40,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic avarî awadhî aymarayî - azerî + azerbaycanî başkîrî belûcî balînî @@ -51,7 +51,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic benayî bulgarî haryanvîyî - belucîya rojavayî + belûcîya rojavayî bojpûrî bîslamayî bînîyî @@ -61,10 +61,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic bambarayî bengalî tîbetî + bextiyarî bretonî bodoyî bosnî akooseyî + buriat bugî blînî katalanî @@ -84,12 +86,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic çeyenî çîkasawî kurdî (soranî) - kurdî (navîn) + kurdî (navendî) çilkotînî korsîkayî + qiptî mîçîfî krîya rojhilat ya başûrî - kriya bejayî + krîya bejayî krîya rojhilat ya bakurî krîya mûsî zimanê karolina algonquianî @@ -98,11 +101,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic slavîya kenîseyî çuvaşî weylsî - danmarkî + danîmarkî dakotayî dargînî tayîtayî almanî + almanîya bilind a swîsreyî dogrîbî zarma dogrîyî @@ -118,8 +122,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ekajukî yûnanî îngilîzî - îngilîzî (Qiralîyeta Yekbûyî) + îngilîzî (brîtanî) îngilîzî (QY) + îngilîzî (amerîkî) esperantoyî spanî spanî (Ewropa) @@ -127,20 +132,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic baskî ewondoyî farisî - derî + darî fulahî fînî - fîlîpînoyî + fîlîpînî fîjî ferî fonî fransizî - fransizî (Kanada) - fransizî (Swîsre) fransizîya kajûnê frîsîya bakur frîyolî - frîsî + frîsîya rojavayî îrlendî gayî gaelîka skotî @@ -167,7 +170,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic xirwatî sorbîya jorîn haîtî - mecarî + macarî hupayî halkomelemî ermenî @@ -194,13 +197,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic gurcî kara-kalpakî kabîlî - cingphoyî + kaçînî jju kambayî kabardî tyap makondeyî kapverdî + qeqçîyî kenyangî koro kayingangî @@ -212,7 +216,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kako kalalîsûtî kalencînî - ximêrî + khmerî kîmbunduyî kannadayî koreyî @@ -227,12 +231,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafyayî rîpwarî kurdî (kurmancî) + kurdî (kurmancî) + kurmancî kumikî komî kornî kwak’walayî kuvî - kirgizî + qirgizî latînî ladînoyî langî @@ -243,9 +249,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic lîgûrî lillooet lakotayî + ladînî lombardî lingalayî - lawsî + lao kreyolîya louisianayê lozî lurîya bakur @@ -259,6 +266,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic mizoyî luhyayî latvîyayî + lazî madurayî magahî maithili @@ -272,6 +280,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic makhuwa-meetto meta’ marşalî + moçenoyî maorî mîkmakî mînangkabawî @@ -289,10 +298,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic pirzimanî krîkî mîrandî + hmongîya dawî burmayî erzayî mazenderanî nawrûyî + çînîya mîn nanî napolîtanî namayî norwecî (bokmål) @@ -333,8 +344,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic papyamentoyî palawî pîdgînîya nîjeryayî + palî pijînî polonî + piedmontîsî malecite-passamaquoddy prûsyayî peştûyî @@ -366,11 +379,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic sicîlî skotî sindhî - kurdîya başûrî + kurdî (xwarîn) samîya bakur sena - sonxayî + sennîya koyraboro sangoyî + samogîtî taşelhîtî şanî kîngalî @@ -381,7 +395,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic lushootseeda başûrî samoayî samîya başûr - samiya lule + samîya lule samîya înarî samîya skoltî şonayî @@ -396,6 +410,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic saanîçî sundanî sukuma + sunwarî swêdî swahîlî swahîlîya kongoyî @@ -434,12 +449,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic tuvanî temazîxtî udmurtî - oygurî + uyxurî ukraynî umbunduyî zimanê nenas urdûyî ozbekî + vaî + venda venîsî vîetnamî makhuwayî @@ -469,58 +486,204 @@ CLDR data files are interpreted according to the LDML specification (http://unic çînî, mandarînî çînîya sadekirî çînîya mandarînî ya sadekirî - çînîya kevneşopî - çînîya mandarînî ya kevneşopî + çînîya edetî + çînîya mandarînî ya edetî zuluyî zunîyî bê naveroka zimanî - zazakî (kirdkî, kirmanckî) + zazakî + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -602,14 +765,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Giravên Kokosê (Keeling) Kongo - Kînşasa Kongo (KDK) - Komara Afrîkaya Navîn + Cimhûrîyeta Afrîkaya Navîn Kongo - Brazzaville - Kongo (Komar) + Kongo (Cimhûrîyet) Swîsre Côte d’Ivoire Perava Ivoryê Giravên Cookê - Şîle + Şîlî Kamerûn Çîn Kolombîya @@ -622,12 +785,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Girava Christmasê Qibris Çekya + Cimhûrîyeta Çekî Almanya Diego Garcia Cîbûtî Danîmarka Domînîka - Komara Domînîkê + Cimhûrîyeta Domînîkê Cezayîr Ceuta û Melîla Ekwador @@ -714,11 +878,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fas Monako Moldova - Montenegro + Qeredax Saint Martin Madagaskar Giravên Marşalê - Makendonyaya Bakur + Makedonyaya Bakur Malî Myanmar (Bûrma) Moxolistan @@ -730,7 +894,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Montserat Malta Mauritius - Maldîva + Maldîv Malawî Meksîka Malezya @@ -742,13 +906,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nîjerya Nîkaragua Holanda - Norwêc + Norwec Nepal Naûrû Niûe Zelandaya Nû Aoteroaya Zelandaya Nû - Oman + Uman Panama Perû Polînezyaya Fransizî @@ -759,9 +923,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saint-Pierre û Miquelon Giravên Pitcairnê Porto Rîko - Herêmên Filîstînî + Herêmên Filistînî Filistîn - Portûgal + Portugal Palau Paragûay Qeter @@ -799,25 +963,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic Herêmên Başûr ên Fransayê Togo Tayland - Tacîkistan + Tacikistan Tokelau Tîmor-Leste Tîmora Rojhilat Tirkmenistan Tûnis Tonga - Tirkîye - Türkiye + Türkiye Trînîdad û Tobago Tûvalû Taywan Tanzanya Ûkrayna Ûganda - Giravên Biçûk ên Derveyî DYAyê + Giravên Biçûk ên Derveyî DAYê Miletên Yekbûyî - Dewletên Yekbûyî yên Amerîkayê - DYA + Dewletên Amerîkayê yên Yekbûyî + DAY Ûrûguay Ozbekistan Vatîkan @@ -840,32 +1003,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic Herêma Nenas - Akademîk + Akademîk - Salname + Teqwîm Rêzkirin diwîz - Salnameya Budîst - Salnameya Çînî - Salnameya Qiptî - Salnameya Dangî - Salnameya Etîyopîk - Salnameya Amete Alem ya Etîyopîk - Salnameya Mîladî - salnameya îbranî - Salnameya Milî ya Hindî - Salnameya Hicrî - Salnameya Hicrî (16ê tîrmeha 622yan) - Salnameya Hicrî (Siudî) - Salnameya Hicrî (15ê tîrmeha 622yan) - Salnameya Hicrî (Um el-Qura) - Salnameya ISO-8601ê - Salnameya Japonî - Salnameya Îranî - Salnameya Komara Çînê + Teqwîma Budîst + Teqwîma Çînî + Teqwîma Qiptî + Teqwîma Dangî + Teqwîma Etîyopîk + Teqwîma Amete Alem ya Etîyopîk + Teqwîma Mîladî + Mîladî + Teqwîma Îbranî + Teqwîma Milî ya Hindî + Teqwîma Hicrî + Hicrî + Teqwîma Hicrî (16ê tîrmeha 622yan) + Hicrî (16ê tîrmeha 622yan) + Teqwîma Hicrî (Siudî) + Teqwîma Hicrî (15ê tîrmeha 622yan) + Teqwîma Hicrî (Um el-Qura) + Teqwîma ISO-8601ê + Teqwîma Japonî + Teqwîma Îranî + Teqwîma Cimhûrîyeta Çînê Awayê Rêzkirina Standard Reqemên hindo-erebî Reqemên Rojavayî @@ -893,7 +1059,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -912,7 +1078,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG d.MM.y + G dd.MM.y @@ -938,25 +1104,412 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E, h:mm'ê' a - E, HH:mm - E, h:mm:ss'ê' a - E, HH:mm:ss - d/M/y GGGGG + G MM.y + G dd.MM.y + G dd.MM.y, E + G d/M/y + G d/M/y, E + + + + + + + + G d'ê' MMMM'a' y'an' EEEE + + + + + G d'ê' MMMM'a' y'an' + + + + + G dd.MM.y + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + G MM.y + G dd.MM.y + G dd.MM.y, E + G d'ê' MMM'a' y'an', E + G MM.y + G dd.MM.y + G d.M.y, E + + + + h:mm – h:mm B + h:mm – h:mm B + + + d – d + + + G y – y + + + G MM.y – G MM.y + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – G dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – G dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM y – G MMM y + G MMM y – MMM y + + + G d – d MMM, y + + + G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an', E + + + h – h a + + + HH – HH's' + + + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + HH:mm – HH:mm + HH:mm – HH:mm + + + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + HH:mm – HH:mm v + + + h – h a v + + + HH – HH's' v + + + M – M + + + dd.MM, E – dd.MM, E + dd.MM, E – dd.MM, E + + + MMM – MMM + + + G y – y + + + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM – MMM y + G MMM y – MMM y + + + G d – d MMM, y + G d MMM – d MMM, y + G d MMM, y – d MMM, y + + + G d MMM, E – d MMM y, E + G d MMM, E – d MMM y, E + G d MMM y, E – d MMM y, E + + + MMMM – MMMM y G + G MMMM y – MMMM y + + + + + + + + + G d'ê' MMMM'a' y'an' EEEE + + + + + G d'ê' MMMM'a' y'an' + + + + + G d'ê' MMM'a' y'an' + + + + + G dd.MM.y + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + G MM.y + G dd.MM.y + G dd.MM.y, E + G d'ê' MMM'a' y'an', E + G MM.y + G dd.MM.y + G d.M.y, E + + + + h:mm – h:mm B + h:mm – h:mm B + + + d – d + + + G y – y + + + G MM.y – G MM.y + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – G dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – G dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM y – G MMM y + G MMM y – MMM y + + + G d – d MMM, y + + + G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an', E + + + h – h a + + + HH – HH's' + + + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + HH:mm – HH:mm + HH:mm – HH:mm + + + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + HH:mm – HH:mm v + + + h – h a v + + + HH – HH's' v + + + M – M + + + dd.MM, E – dd.MM, E + dd.MM, E – dd.MM, E + + + MMM – MMM + + + G y – y + + + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM – MMM y + G MMM y – MMM y + + + G d – d MMM, y + G d MMM – d MMM, y + G d MMM, y – d MMM, y + + + G d MMM, E – d MMM y, E + G d MMM, E – d MMM y, E + G d MMM y, E – d MMM y, E + + + MMMM – MMMM y G + G MMMM y – MMMM y + + + + + + + + + G d'ê' MMMM'a' y'an' EEEE + + + + + G d'ê' MMMM'a' y'an' + + + + + G d'ê' MMM'a' y'an' + + + + + G dd.MM.y + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + h a, E + h:mm a, E + HH:mm, E + h:mm:ss a, E + HH:mm:ss, E + G MM.y + G dd.MM.y + G dd.MM.y, E G MMM'a' y'an' G d'ê' MMM'a' y'an' - G d'ê' MMM'a' y'an' E - h'ê' a - h:mm'ê' a - h:mm:ss'ê' a + G d'ê' MMM'a' y'an', E + HH's' + h:mm a + h:mm:ss a dd/MM dd/MM, E d'ê' MMM'ê' d'ê' MMM'ê', E d'ê' MMMM'ê' - GGGGG M/y - GGGGG dd.MM.y - GGGGG dd.MM.y, E + G MM.y + G dd.MM.y + G d.M.y, E G MMM'a' y'an' G d'ê' MMM'a' y'an' G d'ê' MMM'a' y'an' E @@ -965,53 +1518,92 @@ CLDR data files are interpreted according to the LDML specification (http://unic G y/QQQQ + + h:mm – h:mm B + h:mm – h:mm B + + + d – d + + + G y – y + - GGGGG MM.y – GGGGG MM.y - GGGGG MM.y – MM.y - GGGGG MM.y – MM.y + G MM.y – G MM.y + G MM.y – MM.y + G MM.y – MM.y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – GGGGG dd.MM.y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – G dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – GGGGG dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – G dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E - G MMM'a' y'an' – G MMM'a' y'an' + G MMM y – G MMM y G MMM–MMM y - G MMM'a' y'an' – MMM'a' y'an' + G MMM y – MMM y - G d–d'ê' MMM'a' y'an' + G d – d MMM, y G d'ê' MMM'a' y'an' – G d'ê' MMM'a' y'an' G d'ê' MMM'ê' – d'ê' MMM'ê' y G d'ê' MMM'a' y'an' – d'ê' MMM'a' y'an' G d'ê' MMM'ê' E – d'ê' MMM'ê' E y - G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an' E + G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an', E G d'ê' MMM'ê' E – d'ê' MMM'ê' E y G d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E + + h – h a + + + HH – HH's' + + + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + HH:mm – HH:mm + HH:mm – HH:mm + + + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + HH:mm – HH:mm v + + + h – h a v + + + HH – HH's' v + - M–M + M – M d.M – d.M d.M – d.M - d.M E – d.M E - d.M E – d.M E + dd.MM, E – dd.MM, E + dd.MM, E – dd.MM, E - MMM–MMM + MMM – MMM d – d'ê' MMM'ê' @@ -1021,37 +1613,40 @@ CLDR data files are interpreted according to the LDML specification (http://unic d'ê' MMM'ê', E – d'ê' MMM'ê', E d'ê' MMM'ê', E – d'ê' MMM'ê', E + + G y – y + - GGGGG MM.y – MM.y - GGGGG MM.y – MM.y + G MM.y – MM.y + G MM.y – MM.y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E - G MMM–MMM y - G MMM'a' y'an' – MMMa y'an' + G MMM – MMM y + G MMM y – MMM y - G d–d'ê' MMM'a' y'an' - G d'ê' MMM'ê' – d'ê' MMM'ê' y - G d'ê' MMM'a' y'an' – d'ê' MMM'a' y'an' + G d – d MMM, y + G d MMM – d MMM, y + G d MMM, y – d MMM, y - G d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E - G d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E - G d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E + G d MMM, E – d MMM y, E + G d MMM, E – d MMM y, E + G d MMM y, E – d MMM y, E - G MMMM – MMMM y - G MMMM'a' y'an' – MMMM'a' y'an' + MMMM – MMMM y G + G MMMM y – MMMM y @@ -1156,10 +1751,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ç4 - çaryeka 1em - çaryeka 2yem - çaryeka 3yem - çaryeka 4em + çaryeka 1ê + çaryeka 2an + çaryeka 3an + çaryeka 4an + + + + + çaryeka 1ê + çaryeka 2an + çaryeka 3an + çaryeka 4an @@ -1177,17 +1780,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic - berî zayînê - berî mîladê - piştî zayînê - piştî mîladê + Berî Mîladê + Berî Mîladê + Piştî Mîladê + Piştî Mîladê - BZ - BM - PZ - PM + BM + PM + + BM + PM + @@ -1202,7 +1807,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - d'ê' MMM'a' y'an' + d MMM, y @@ -1255,158 +1860,214 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h'ê' B - h:mm'ê' B - h:mm:ss'ê' B - E, h:mm'ê' B - E, h:mm:ss'ê' B - d E - E, h:mm'ê' a - E, h:mm:ss'ê' a - GGGGG dd.MM.y - G MMM'a' y'an' - G d'ê' MMM'a' y'an' - G d'ê' MMM'a' y'an', E - h'ê' a - h:mm'ê' a - h:mm:ss'ê' a - h:mm:ss'ê' a 'bi' 'dema' v('y')'ê' - HH:mm:ss 'bi' 'dema' v('y')'ê' - h:mm'ê' a 'bi' 'dema' v('y')'ê' - HH:mm 'bi' 'dema' v('y')'ê' + E h:mm a + E h:mm:ss a + G M/y + G d/M/y + G d/M/y, E + G MMM y + G d MMM, y + G d MMM y, E + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v dd.MM - E, dd.MM - d'ê' MMM'ê' - E, d'ê' MMM'ê' + d/M, E + d MMM + d MMM, E d'ê' MMMM'ê' - 'hefteya' W'em' 'ya' MMMM'ê' - 'hefteya' W'em' 'ya' MMMM'ê' + 'hefteya' W'an' 'ya' MMMM'ê' + 'hefteya' W'an' 'ya' MMMM'ê' MM.y dd.MM.y - E, dd.MM.y - MMM'a' y'an' - d'ê' MMM'a' y'an' - E, d'ê' MMM'a' y'an' + dd.MM.y, E + MMM, y + d MMM, y + d MMM y, E MMMM'a' y'an' - QQQ'em' 'ya' y'an' + QQQ, y QQQQ 'ya' y'an' - 'hefteya' w'em' 'ya' Y'an' - 'hefteya' w'em' 'ya' Y'an' + 'hefteya' w'an' 'ya' Y'an' + 'hefteya' w'an' 'ya' Y'an' - - h'ê' B – h'ê' B - h–h'ê' B - - GGGGG MM.y – GGGGG MM.y - GGGGG MM.y – MM.y - GGGGG MM.y – MM.y + M/y G – M/y G + G M/y – M/y + G M/y – M/y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – GGGGG dd.MM.y - GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y – dd.MM.y + G d/M/y – d/M/y + G d/M/y – G d/M/y + G d/M/y – d/M/y + G d/M/y – d/M/y - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – GGGGG dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E + G d/M/y, E – G d/M/y, E + G d/M/y, E – G d/M/y, E + G d/M/y, E – G d/M/y, E + G d/M/y – d/M/y, E - G MMM'a' y'an' – G MMM'a' y'an' + G MMM y – G MMM y G MMM–MMM y - G MMM'a' y'an' – MMM'a' y'an' + G MMM y – MMM y - G d–d'ê' MMM'a' y'an' - G d'ê' MMM'a' y'an' – G d'ê' MMM'a' y'an' - G d'ê' MMM'ê' – d'ê' MMM'ê' y - G d'ê' MMM'a' y'an' – d'ê' MMM'a' y'an' + G d – d MMM, y + G d MMM, y – G d MMM, y + G d MMM – d MMM, y + G d MMM, y – G d MMM, y - G d'ê' MMM'ê' E – d'ê' MMM'ê' E y - G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an' E - G d'ê' MMM'ê' E – d'ê' MMM'ê' E y - G d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E + G d MMM, E – G d MMM y, E + G d MMM y, E – G d MMM y, E + G d MMM – d MMM y, E + G d MMM y, E – d MMM y, E - h'ê' a – h'ê' a - h–h'ê' a + h – h a + + + HH – HH's' - h:mm'ê' a – h:mm'ê' a - h:mm–h:mm'ê' a - h:mm–h:mm'ê' a + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + HH:mm – HH:mm + HH:mm – HH:mm - h:mm'ê' a – h:mm'ê' a v - h:mm'ê'–h:mm'ê' a v - h:mm'ê'–h:mm'ê' a v + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + HH:mm – HH:mm v + HH:mm – HH:mm v - h'ê' a – h'ê' a v - h–h'ê' a v + h – h a v + + + HH – HH'h' v M – M - d.M – d.M - d.M – d.M + d/M – d/M + d/M – d/M - d.M E – d.M E - d.M E – d.M E + d/M, E – d/M, E + d/M, E – d/M, E - MMM–MMM + MMM – MMM - d – d'ê' MMM'ê' - d'ê' MMM'ê' – d'ê' MMM'ê' + d – d MMM + d MMM – d MMM - d'ê' MMM'ê', E – d'ê' MMM'ê', E - d'ê' MMM'ê', E – d'ê' MMM'ê', E + d MMM, E – d MMM, E + d MMM, E – d MMM, E + + + y – y - MM.y – MM.y - MM.y – MM.y + M/y – M/y + M/y – M/y - dd.MM.y – dd.MM.y - dd.MM.y – dd.MM.y - dd.MM.y – dd.MM.y + d/M/y – d/M/y + d/M/y – d/M/y + d/M/y – d/M/y - dd.MM.y E – dd.MM.y E - dd.MM.y E – dd.MM.y E - dd.MM.y E – dd.MM.y E + d/M/y, E – d/M/y, E + d/M/y, E – d/M/y, E + d/M/y, E – d/M/y, E - MMM–MMM y - MMM'a' y'an' – MMM'a' y'an' + MMM – MMM y + MMM y – MMM y - d–d'ê' MMM'a' y'an' - d'ê' MMM'ê' – d'ê' MMM'ê' y - d'ê' MMM'a' y'an' – d'ê' MMM'a' y'an' + d – d MMM, y + d MMM – d MMM, y + d MMM, y – d MMM, y - d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E - d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E - d'ê' MMM'a' y'an' E – d'ê' MMM'a' y'an' E + d MMM, E – d MMM y, E + d MMM, E – d MMM y, E + d MMM y, E – d MMM y, E MMMM – MMMM y - MMMM'a' y'an' – MMMM'a' y'an' + MMMM y – MMMM y + + + + + G d'ê' MMMM'a' y'an' EEEE + + + + + G d'ê' MMMM'a' y'an' + + + + + G d'ê' MMM'a' y'an' + + + + + G dd.MM.y + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + G MM.y + G dd.MM.y + G dd.MM.y, E + G d'ê' MMM'a' y'an', E + + + @@ -1445,19 +2106,149 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hicrî + + + G MM.y + G dd.MM.y + G dd.MM.y, E + G d'ê' MMM'a' y'an', E + G MM.y + G dd.MM.y + G d.M.y, E + + + + h:mm – h:mm B + h:mm – h:mm B + + + d – d + + + G y – y + + + G MM.y – G MM.y + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – G dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – G dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM y – G MMM y + G MMM y – MMM y + + + G d – d MMM, y + + + G d'ê' MMM'a' y'an' E – G d'ê' MMM'a' y'an', E + + + h – h a + + + HH – HH's' + + + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a + + + HH:mm – HH:mm + HH:mm – HH:mm + + + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v + + + HH:mm – HH:mm v + + + h – h a v + + + HH – HH's' v + + + M – M + + + dd.MM, E – dd.MM, E + dd.MM, E – dd.MM, E + + + MMM – MMM + + + G y – y + + + G MM.y – MM.y + G MM.y – MM.y + + + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y + + + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + G dd.MM.y, E – dd.MM.y, E + + + G MMM – MMM y + G MMM y – MMM y + + + G d – d MMM, y + G d MMM – d MMM, y + G d MMM, y – d MMM, y + + + G d MMM, E – d MMM y, E + G d MMM, E – d MMM y, E + G d MMM y, E – d MMM y, E + + + MMMM – MMMM y G + G MMMM y – MMMM y + + + - serdem + çax + + + çax + + + çax sal sala borî îsal - sala bê + sala were - di salekê de + di {0} salê de di {0} salan de @@ -1466,12 +2257,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic + sala borî + îsal + sala were - piştî {0} salan + piştî {0} salê + piştî {0} salan + + + + sala borî + îsal + sala were + + piştî {0} salê piştî {0} salan - berî salekê + berî {0} salê berî {0} salan @@ -1480,46 +2283,118 @@ CLDR data files are interpreted according to the LDML specification (http://unic çaryeka dawî ev çaryek çaryeka were + + piştî {0} çaryekê + piştî {0} çaryekan + + + berî {0} çaryekê + berî {0} çaryekan + çrk. + + piştî {0} çaryekê + piştî {0} çaryekan + + + berî {0} çaryekê + berî {0} çaryekan + + + + + piştî {0} çaryekê + piştî {0} çaryekan + + + berî {0} çaryekê + berî {0} çaryekan + meh meha borî ev meh - meha bê + meha were + + piştî {0} mehê + piştî {0} mehan + + + berî {0} mehê + berî {0} mehan + meha borî ev meh - meha bê + meha were + + piştî {0} mehê + piştî {0} mehan + + + berî {0} mehê + berî {0} mehan + meha borî ev meh - meha bê + meha were + + piştî {0} mehê + piştî {0} mehan + + + berî {0} mehê + berî {0} mehan + hefte hefteya borî ev hefte - hefteya bê + hefteya were + + piştî {0} hefteyê + piştî {0} hefteyan + + + berî {0} hefteyê + berî {0} hefteyan + hefteya {0} hf. hft. borî ev hft. - hft. bê - hefteya {0} + hft. were + + piştî {0} hefteyê + piştî {0} hefteyan + + + berî {0} hefteyê + berî {0} hefteyan + hf hft. borî ev hft. - hft. bê - hefteya {0} + hft. were + + piştî {0} hefteyê + piştî {0} hefteyan + + + berî {0} hefteyê + berî {0} hefteyan + hefteya mehê @@ -1529,6 +2404,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic duh îro sibê + + piştî {0} rojê + piştî {0} rojan + + + berî {0} rojê + berî {0} rojan + + + + + piştî {0} rojê + piştî {0} rojan + + + berî {0} rojê + berî {0} rojan + + + + + piştî {0} rojê + piştî {0} rojan + + + berî {0} rojê + berî {0} rojan + roja salê @@ -1539,32 +2442,335 @@ CLDR data files are interpreted according to the LDML specification (http://unic roja mehê + + yekşema borî + ev yekşem + yekşema were + + piştî {0} yekşemê + piştî {0} yekşeman + + + berî {0} yekşemê + berî {0} yekşeman + + + + yşm. borî + ev yşm. + yşm. were + + piştî {0} yşm. + piştî {0} yşm. + + + berî {0} yşm. + berî {0} yşm. + + + + yşm. borî + ev yşm. + yşm. were + + piştî {0} yşm. + piştî {0} yşm. + + + berî {0} yşm. + berî {0} yşm. + + + + duşema borî + ev duşem + duşema were + + piştî {0} duşemê + piştî {0} duşeman + + + berî {0} duşemê + berî {0} duşeman + + + + dşm. borî + ev dşm. + dşm. were + + piştî {0} dşm. + piştî {0} dşm. + + + berî {0} dşm. + berî {0} dşm. + + + + dşm. borî + ev dşm. + dşm. were + + piştî {0} dşm. + piştî {0} dşm. + + + berî {0} dşm. + berî {0} dşm. + + + + sêşema borî + ev sêşem + sêşema were + + piştî {0} sêşemê + piştî {0} sêşeman + + + berî {0} sêşemê + berî {0} sêşeman + + + + sşm. borî + ev sşm. + sşm. were + + piştî {0} sşm. + piştî {0} sşm. + + + berî {0} sşm. + berî {0} sşm. + + + + sşm. borî + ev sşm. + sşm. were + + piştî {0} sşm. + piştî {0} sşm. + + + berî {0} sşm. + berî {0} sşm. + + + + çarşema borî + ev çarşem + çarşema were + + piştî {0} çarşemê + piştî {0} çarşeman + + + berî {0} çarşemê + berî {0} çarşeman + + + + çşm. borî + ev çşm. + çşm. were + + piştî {0} çşm. + piştî {0} çşm. + + + berî {0} çşm. + berî {0} çşm. + + + + çşm. borî + ev çşm. + çşm. were + + piştî {0} çşm. + piştî {0} çşm. + + + berî {0} çşm. + berî {0} çşm. + + + + pêncşema borî + ev pêncşem + pêncşema were + + piştî {0} pêncşemê + piştî {0} pêncşeman + + + berî {0} pêncşemê + berî {0} pêncşeman + + + + pşm. borî + ev pşm. + pşm. were + + piştî {0} pşm. + piştî {0} pşm. + + + berî {0} pşm. + berî {0} pşm. + + + + pşm. borî + ev pşm. + pşm. were + + piştî {0} pşm. + piştî {0} pşm. + + + berî {0} pşm. + berî {0} pşm. + + + + înîya borî + ev înî + înîya were + + piştî {0} înîyê + piştî {0} înîyan + + + berî {0} înîyê + berî {0} înîyan + + + + înîya borî + ev înî + înîya were + + piştî {0} înîyê + piştî {0} înîyan + + + berî {0} înîyê + berî {0} înîyan + + + + înîya borî + ev înî + înîya were + + piştî {0} înîyê + piştî {0} înîyan + + + berî {0} înîyê + berî {0} înîyan + + + + şemîya borî + ev şemî + şemîya were + + piştî {0} şemîyê + piştî {0} şemîyan + + + berî {0} şemîyê + berî {0} şemîyan + + + + şemîya borî + ev şemî + şemîya were + + piştî {0} şemîyê + piştî {0} şemîyan + + + berî {0} şemîyê + berî {0} şemîyan + + + + şemîya borî + ev şemî + şemîya were + + piştî {0} şemîyê + piştî {0} şemîyan + + + berî {0} şemîyê + berî {0} şemîyan + + BN/PN saet + ev saet + + piştî {0} saetê + piştî {0} saetan + + + berî {0} saetê + berî {0} saetan + sa. + ev saet + + piştî {0} saetê + piştî {0} saetan + + + berî {0} saetê + berî {0} saetan + + + + ev saet + + piştî {0} saetê + piştî {0} saetan + + + berî {0} saetê + berî {0} saetan + deqîqe - vê deqeyê + ev deqîqe - di {0} deqeyê de - di {0} deqeyan de + piştî {0} deqîqeyê + piştî {0} deqîqeyan - berî {0} deqeyê - berî {0} deqeyan + berî {0} deqîqeyê + berî {0} deqîqeyan dq. + ev deqîqe - di {0} dq. de - di {0} dq de + piştî {0} dq. + piştî {0} dq. berî {0} dq. @@ -1572,21 +2778,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic + ev deqîqe - di {0} dq de - di {0}dq de - - - berî {0} dq. - berî {0} d. + piştî {0} dq. + piştî {0} dq. sanîye - vêga + niha + + piştî {0} saniyeyê + piştî {0} saniyeyan + + + berî {0} saniyeyê + berî {0} saniyeyan + sn. + niha + + piştî {0} sn. + piştî {0} sn. + + + berî {0} sn. + berî {0} sn. + + + + niha + + piştî {0} sn. + piştî {0} sn. + + + berî {0} sn. + berî {0} sn. + qada saetê @@ -1598,7 +2829,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta {0}(y)ê Saeta Havînê ya {0}(y)ê - Saeta Standard a {0}(y)ê + Saeta {0}(y)ê ya Standard Saeta Gerdûnî ya Hevdemî @@ -1748,9 +2979,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tiflîs - - Akra - Cebelîtariq @@ -1777,7 +3005,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Saeta Standard a Îrlandayê + Saeta Îrlandayê ya Standard Dûblîn @@ -2027,6 +3255,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bajarê Ho Chi Minhê + + + Saeta Acreyê + Saeta Acreyê ya Standard + Saeta Havînê ya Acreyê + + Saeta Efxanistanê @@ -2049,9 +3284,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Saeta Afrîkaya Rojava - Saeta Standard a Afrîkaya Rojava - Saeta Havînê ya Afrîkaya Rojava + Saeta Afrîkaya Rojava @@ -2060,30 +3293,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Alaskayê Saeta Havînê ya Alaskayê - - SAK - SSAK - SHAK - + + + + Saeta Almatîyê + Saeta Almatîyê ya Standard + Saeta Havînê ya Almatîyê + Saeta Amazonê - Saeta Standard a Amazonê + Saeta Amazonê ya Standard Saeta Havînê ya Amazonê - Saeta Navendî ya Amerîkaya Bakur - Saeta Standard a Navendî ya Amerîkaya Bakur - Saeta Havînê ya Navendî ya Amerîkaya Bakur + Saeta Merkezî ya Amerîkaya Bakur + Saeta Merkezî ya Standard a Amerîkaya Bakur + Saeta Havînê ya Merkezî ya Amerîkaya Bakur - - SN - SSN - SHN - @@ -2091,11 +3321,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Rojhilat ya Amerîkaya Bakur Saeta Havînê ya Rojhilat ya Amerîkaya Bakur - - SR - SSR - SHR - @@ -2103,11 +3328,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Çîyayî ya Amerîkaya Bakur Saeta Havînê ya Çîyayî ya Amerîkaya Bakur - - - SSÇ - SHÇ - @@ -2115,30 +3335,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Pasîfîkê ya Amerîkaya Bakur Saeta Havînê ya Pasîfîkê ya Amerîkaya Bakur - - SP - SSP - SHP - + + + + Saeta Anadyrê + Saeta Anadyrê ya Standard + Saeta Havînê ya Anadyrê + Saeta Apiayê - Saeta Standard a Apiayê + Saeta Apiayê ya Standard Saeta Havînê ya Apiayê + + + Saeta Aqtauyê + Saeta Aqtauyê ya Standard + Saeta Havînê ya Aqtauyê + + + + + Saeta Aqtobeyê + Saeta Aqtobeyê ya Standard + Saeta Havînê ya Aqtobeyê + + Saeta Erebistanê - Saeta Standard a Erebistanê + Saeta Erebistanê ya Standard Saeta Havînê ya Erebistanê Saeta Arjantînê - Saeta Standard a Arjantînê + Saeta Arjantînê ya Standard Saeta Havînê ya Arjantînê @@ -2152,7 +3388,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Ermenistanê - Saeta Standard a Ermenistanê + Saeta Ermenistanê ya Standard Saeta Havînê ya Ermenistanê @@ -2162,11 +3398,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Atlantîkê Saeta Havînê ya Atlantîkê - - SA - SSA - SHA - @@ -2199,21 +3430,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Azerbeycanê - Saeta Standard a Azerbeycanê + Saeta Azerbeycanê ya Standard Saeta Havînê ya Azerbeycanê Saeta Azoran - Saeta Standard a Azoran + Saeta Azoran a Standard Saeta Havînê ya Azoran Saeta Bengladeşê - Saeta Standard a Bengladeşê + Saeta Bengladeşê ya Standard Saeta Havînê ya Bengladeşê @@ -2230,13 +3461,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Brasîlyayê - Saeta Standard a Brasîlyayê + Saeta Brasîlyayê ya Standard Saeta Havînê ya Brasîlyayê - Saeta Brûney Darusselamê + Saeta Brûneyê @@ -2246,9 +3477,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Havînê ya Cape Verdeyê + + + Saeta Caseyê + + - Saeta Standard a Chamorroyê + Saeta Chamorroyê ya Standard @@ -2261,14 +3497,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Şîlîyê - Saeta Standard a Şîlîyê + Saeta Şîlîyê ya Standard Saeta Havînê ya Şîlîyê Saeta Çînê - Saeta Standard a Çînê + Saeta Çînê ya Standard Saeta Havînê ya Çînê @@ -2285,15 +3521,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Kolombîyayê - Saeta Standard a Kolombîyayê + Saeta Kolombîyayê ya Standard Saeta Havînê ya Kolombîyayê Saeta Giravên Cookê - Saeta Standard a Giravên Cookê - Saeta Nîvhavînê ya Giravên Cookê + Saeta Giravên Cookê ya Standard + Saeta Havînê ya Giravên Cookê @@ -2302,11 +3538,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Kubayê Saeta Havînê ya Kubayê - - SK - SSK - SHK - @@ -2364,14 +3595,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Giravên Falklandê - Saeta Standard a Giravên Falklandê + Saeta Giravên Falklandê ya Standard Saeta Havînê ya Giravên Falklandê Saeta Fîjîyê - Saeta Standard a Fîjîyê + Saeta Fîjîyê ya Standard Saeta Havînê ya Fîjîyê @@ -2398,7 +3629,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Gurcistanê - Saeta Standard a Gurcistanê + Saeta Gurcistanê ya Standard Saeta Havînê ya Gurcistanê @@ -2412,17 +3643,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Navînî ya Greenwichê + + + Saeta Grînlendayê + Saeta Grînlendayê ya Standard + Saeta Havînê ya Grînlendayê + + Saeta Grînlanda Rojhilat Saeta Standard a Grînlanda Rojhilat Saeta Havînê ya Grînlanda Rojhilat - - SGR - SSGR - SHGR - @@ -2430,15 +3663,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Grînlanda Rojava Saeta Havînê ya Grînlanda Rojava - - SGRO - SSGRO - SHGRO - + + + + Saeta Guamê ya Standard + - Saeta Standard a Kendavê + Saeta Kendavê ya Standard @@ -2446,35 +3679,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Guyanayê + + + Saeta Standard a Hawaii-Aleutianê + + Saeta Hawaii-Aleutianê Saeta Standard a Hawaii-Aleutianê Saeta Havînê ya Hawaii-Aleutianê - - SHAL - SSHA - SHHA - Saeta Hong Kongê - Saeta Standard a Hong Kongê + Saeta Hong Kongê ya Standard Saeta Havînê ya Hong Kongê Saeta Hovdê - Saeta Standard a Hovdê + Saeta Hovdê ya Standard Saeta Havînê ya Hovdê - Saeta Standard a Hindistanê + Saeta Hindistanê ya Standard @@ -2505,29 +3738,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Îranê - Saeta Standard a Îranê + Saeta Îranê ya Standard Saeta Havînê ya Îranê Saeta Irkutskê - Saeta Standard a Irkutskê + Saeta Irkutskê ya Standard Saeta Havînê ya Irkutskê Saeta Îsraîlê - Saeta Standard a Îsraîlê + Saeta Îsraîlê ya Standard Saeta Havînê ya Îsraîlê Saeta Japonyayê - Saeta Standard a Japonyayê - Saeta Havşnê ya Japonyayê + Saeta Japonyayê ya Standard + Saeta Havînê ya Japonyayê + + + + + Saeta Kamchatkayê + Saeta Kamchatkayê ya Standard + Saeta Havînê ya Kamchatkayê @@ -2548,7 +3788,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Koreyê - Saeta Standard a Koreyê + Saeta Koreyê ya Standard Saeta Havînê ya Koreyê @@ -2560,7 +3800,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Krasnoyarskê - Saeta Standard a Krasnoyarskê + Saeta Krasnoyarskê ya Standard Saeta Havînê ya Krasnoyarskê @@ -2569,6 +3809,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Qirxizistanê + + + Saeta Lankayê + + Saeta Giravên Lîneyê @@ -2581,10 +3826,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Havînê ya Lord Howeyê + + + Saeta Macaoyê + Saeta Macaoyê ya Standard + Saeta Havînê ya Macaoyê + + Saeta Magadanê - Saeta Standard a Magadanê + Saeta Magadanê ya Standard Saeta Havînê ya Magadanê @@ -2611,7 +3863,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Mauritiusê - Saeta Standard a Mauritiusê + Saeta Mauritiusê ya Standard Saeta Havînê ya Mauritiusê @@ -2630,14 +3882,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Ûlanbatarê - Saeta Standard a Ûlanbatarê + Saeta Ûlanbatarê ya Standard Saeta Havînê ya Ûlanbatarê Saeta Moskovayê - Saeta Standard a Moskovayê + Saeta Moskovayê ya Standard Saeta Havînê ya Moskovayê @@ -2676,11 +3928,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Standard a Newfoundlandê Saeta Havînê ya Newfoundlandê - - SNF - SSNF - SHNF - @@ -2697,28 +3944,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Fernando de Noronhayê - Saeta Standard a Fernando de Noronhayê + Saeta Fernando de Noronhayê ya Standard Saeta Havînê ya Fernando de Noronhayê + + + Saeta Giravên Marianaya Bakur + + Saeta Novosibirskê - Saeta Standard a Novosibirskê + Saeta Novosibirskê ya Standard Saeta Havînê ya Novosibirskê Saeta Omskê - Saeta Standard a Omskê + Saeta Omskê ya Standard Saeta Havînê ya Omskê Saeta Pakistanê - Saeta Standard a Pakistanê + Saeta Pakistanê ya Standard Saeta Havînê ya Pakistanê @@ -2735,21 +3987,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Paragûayê - Saeta Standard a Paragûayê + Saeta Paragûayê ya Standard Saeta Havînê ya Paragûayê Saeta Perûyê - Saeta Standard a Perûyê + Saeta Perûyê ya Standard Saeta Havînê ya Perûyê Saeta Fîlîpînê - Saeta Standard a Fîlîpînê + Saeta Fîlîpînê ya Standard Saeta Havînê ya Fîlîpînê @@ -2780,6 +4032,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Pyongyangê + + + Saeta Qizilordayê + Saeta Qizilordayê ya Standard + Saeta Havînê ya Qizilordayê + + Saeta Réunionê @@ -2793,14 +4052,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Saxalînê - Saeta Standard a Saxalînê + Saeta Saxalînê ya Standard Saeta Havînê ya Saxalînê + + + Saeta Samarayê + Saeta Samarayê ya Standard + Saeta Havînê ya Samarayê + + Saeta Samoayê - Saeta Standard a Samoayê + Saeta Samoayê ya Standard Saeta Havînê ya Samoayê @@ -2811,7 +4077,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Saeta Standard a Sîngapûrê + Saeta Sîngapûrê ya Standard @@ -2842,7 +4108,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Taîpeîyê - Saeta Standard a Taîpeîyê + Saeta Taîpeîyê ya Standard Saeta Havînê ya Taîpeîyê @@ -2859,7 +4125,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Tongayê - Saeta Standard a Tongayê + Saeta Tongayê ya Standard Saeta Havînê ya Tongayê @@ -2871,7 +4137,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Tirkmenistanê - Saeta Standard a Tirkmenistanê + Saeta Tirkmenistanê ya Standard Saeta Havînê ya Tirkmenistanê @@ -2883,21 +4149,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Ûrûgûayê - Saeta Standard a Ûrûgûayê + Saeta Ûrûgûayê ya Standard Saeta Havînê ya Ûrûgûayê Saeta Ozbekistanê - Saeta Standard a Ozbekistanê + Saeta Ozbekistanê ya Standard Saeta Havînê ya Ozbekistanê Saeta Vanûatûyê - Saeta Standard a Vanûatûyê + Saeta Vanûatûyê ya Standard Saeta Havînê ya Vanûatûyê @@ -2909,14 +4175,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Vladivostokê - Saeta Standard a Vladivostokê + Saeta Vladivostokê ya Standard Saeta Havînê ya Vladivostokê Saeta Volgogradê - Saeta Standard a Volgogradê + Saeta Volgogradê ya Standard Saeta Havînê ya Volgogradê @@ -2938,14 +4204,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Yakutskê - Saeta Standard a Yakutskê + Saeta Yakutskê ya Standard Saeta Havînê ya Yakutskê Saeta Yekaterinburgê - Saeta Standard a Yekaterinburgê + Saeta Yekaterinburgê ya Standard Saeta Havînê ya Yekaterinburgê @@ -2953,9 +4219,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saeta Yukonê - - SY - @@ -3029,13 +4292,315 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -3068,17 +4633,492 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + + + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + + + + + pezetayê andorrayî + pezetayê andorrayî + pezetayên andorrayî + dîrhemê mîrgehên erebî yên yekbûyî dîrhemê MEYî dîrhemên MEYî + + efxanîyê efxanistanî (1927–2002) + efxanîyê efxanistanî (1927–2002) + efxanîyên efxanistanî (1927–2002) + efxanîyê efxanistanî efxanîyê efxanistanî efxanîyên efxanistanî + + lekê arnawidî (1946–1965) + lekê arnawidî (1946–1965) + lekên arnawidî (1946–1965) + lekê arnawidî lekê arnawidî @@ -3099,11 +5139,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwanzayê angolayî kwanzayên angolayî + + kwanzayê angolayî (1977–1991) + kwanzayê angolayî (1977–1991) + kwanzayên angolayî (1977–1991) + + + kwanzayê nû ya angolayî (1990–2000) + kwanzayê nû ya angolayî (1990–2000) + kwanzayên nû yên angolayî (1990–2000) + + + kwanza reajustadoyê angolayî (1995–1999) + kwanza reajustadoyê angolayî (1995–1999) + kwanza reajustadoyên angolayî (1995–1999) + + + australê arjantînî + australê arjantînî + australên arjantînî + + + peso leyê arjantînî (1970–1983) + peso leyê arjantînî (1970–1983) + peso leyên arjantînî (1970–1983) + + + pesoyê arjantînî (1881–1970) + pesoyê arjantînî (1881–1970) + pesoyên arjantînî (1881–1970) + + + pesoyê arjantînî (1983–1985) + pesoyê arjantînî (1983–1985) + pesoyên arjantînî (1983–1985) + pesoyê arjantînî pesoyê arjantînî pesoyên arjantînî + + şîllîngê awistiryayî + şîllîngê awistiryayî + şîllîngên awistiryayî + dolarê awistralyayî dolarê awistralyayî @@ -3114,14 +5194,29 @@ CLDR data files are interpreted according to the LDML specification (http://unic florînê arubayî florînên arubayî + + manatê azerbeycanî (1993–2006) + manatê azerbeycanî (1993–2006) + manatên azerbeycanî (1993–2006) + manatê azerbeycanî + + dînarê bosna hersekî (1992–1994) + dînarê bosna hersekî (1992–1994) + dînarên bosna hersekî (1992–1994) + markê konvertibl ê bosna hersekî markê konvertibl ê bosna hersekî markên konvertibl ê bosna hersekî + + dînarê nû yê bosna hersekî (1994–1997) + dînarê nû yê bosna hersekî (1994–1997) + dînarên nû yên bosna hersekî (1994–1997) + dolarê barbadosî dolarê barbadosî @@ -3132,11 +5227,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic takayê bengladeşî takayên bengladeşî + + frankê belçîkayî (konvertibl) + frankê belçîkayî (konvertibl) + frankên belçîkayî (konvertibl) + + + frankê belçîkayî + frankê belçîkayî + frankên belçîkayî + + + frankê belçîkayî (fînansî) + frankê belçîkayî (fînansî) + frankên belçîkayî (fînansî) + + + levê bulgarî (hard) + levê bulgarî (hard) + levên bulgarî (hard) + + + levê bulgarî (1952–1962) + levê bulgarî (1952–1962) + levên bulgarî (1952–1962) + levê bulgarî levê bulgarî levên bulgarî + + levê bulgarî (1879–1952) + levê bulgarî (1879–1952) + levên bulgarî (1879–1952) + dînarê behreynê dînarê behreynê @@ -3162,11 +5287,56 @@ CLDR data files are interpreted according to the LDML specification (http://unic bolîvyanoyê bolîvyayî bolîvyanoyên bolîvyayî + + bolîvyanoyê bolîvyayî (1863–1963) + bolîvyanoyê bolîvyayî (1863–1963) + bolîvyanoyên bolîvyayî (1863–1963) + + + pesoyê bolîvyayî + pesoyê bolîvyayî + pesoyên bolîvyayî + + + mvodolê bolîvyayî + mvodolê bolîvyayî + mvodolên bolîvyayî + + + kruzeîroyê nû ya brezîlyayî (1967–1986) + kruzeîroyê nû ya brezîlyayî (1967–1986) + kruzeîroyên nû yên brezîlyayî (1967–1986) + + + kruzadoyê brezîlyayî (1986–1989) + kruzadoyê brezîlyayî (1986–1989) + kruzadoyên brezîlyayî (1986–1989) + + + kruzeîroyê brezîlyayî (1990–1993) + kruzeîroyê brezîlyayî (1990–1993) + kruzeîroyên brezîlyayî (1990–1993) + realê brezîlyayî realê brezîlyayî realên brezîlyayî + + kruzadoyê nû yê brezîlyayî (1989–1990) + kruzadoyê nû yê brezîlyayî (1989–1990) + kruzadoyên nû yên brezîlyayî (1989–1990) + + + kruzeîroyê brezîlyayî (1993–1994) + kruzeîroyê brezîlyayî (1993–1994) + kruzeîroyên brezîlyayî (1993–1994) + + + kruzeîroyê brezîlyayî (1942–1967) + kruzeîroyê brezîlyayî (1942–1967) + kruzeîroyên brezîlyayî (1942–1967) + dolarê bahamayî dolarê bahamayî @@ -3177,15 +5347,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic ngultrumê bûtanî ngultrumên bûtanî + + kyatê burmayî + kyatê burmayî + kyatên burmayî + pulayê botswanayî pulayê botswanayî pulayên botswanayî + + rubleyê belarûsî (1994–1999) + rubleyê belarûsî (1994–1999) + rubleyên belarûsî (1994–1999) + - rûbleyê belarûsî - rûbleyê belarûsî - rûbleyên belarûsî + rubleyê belarûsî + rubleyê belarûsî + rubleyên belarûsî + + + rubleyê belarûsî (2000–2016) + rubleyê belarûsî (2000–2016) + rubleyên belarûsî (2000–2016) dolarê belîzeyî @@ -3202,21 +5387,46 @@ CLDR data files are interpreted according to the LDML specification (http://unic frankê kongoyî frankên kongoyî + + ewroyê WIRê + ewroyê WIRê + ewroyên WIRê + frankê swîsrî frankê swîsrî frankên swîsrî + + frankê WIRê + frankê WIRê + frankên WIRê + + + eskodoyê şîlîyî + eskodoyê şîlîyî + eskodoyên şîlîyî + + + unidades de fomentoyê şîlîyî + unidades de fomentoyê şîlîyî + unidades de fomentoyên şîlîyî + - pesoyê şîlîyê - pesoyê şîlîyê - pesoyên şîlîyê + pesoyê şîlîyî + pesoyê şîlîyî + pesoyên şîlîyî yûanê çînî (offshore) yûanê çînî (offshore) yûanên çînî (offshore) + + dolarê Banka Xelkî ya çînî + dolarê Banka Xelkî ya çînî + dolarên Banka Xelkî ya çînî + yûanê çînî yûanê çînî @@ -3227,11 +5437,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic pesoyê kolombîyayî pesoyên kolombîyayî + + unidad de valor realê kolombîyayî + unidad de valor realê kolombîyayî + unidad de valor realên kolombîyayî + kolonê kosta rîkayî kolonê kosta rîkayî kolonên kosta rîkayî + + poundê maltayî (2002–2006) + poundê maltayî (2002–2006) + poundên maltayî (2002–2006) + + + kronê çekoslovakî (hard) + kronê çekoslovakî (hard) + kronên çekoslovakî (hard) + pesoyên konvertibl ê kubayî pesoyê konvertibl ê kubayî @@ -3247,11 +5472,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic eskudoyê kape verdeyî eskudoyên kape verdeyî + + lîreyê qibrisî + lîreyê qibrisî + lîreyên qibrisî + kronê çekî kronê çekî kronên çekî + + markê almanyaya rojhilatî + markê almanyaya rojhilatî + markên almanyaya rojhilatî + + + markê almanî + markê almanî + markên almanî + frankê cîbûtîyî frankê cîbûtîyî @@ -3272,6 +5512,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic dînarê cezayîrî dînarên cezayîrî + + sukreyê ekwadorî + sukreyê ekwadorî + sukreyên ekwadorî + + + unidad de valor constanteyê ekwadorî (UVC) + unidad de valor constanteyê ekwadorî (UVC) + unidad de valor constanteyên ekwadorî (UVC) + + + krûnê estonî + krûnê estonî + krûnên estonî + lîreyê misirî lîreyê misirî @@ -3282,6 +5537,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic nakfayê erîtreyî nakfayên erîtreyî + + pezetayê spanî (hesabê Ayê) + pezetayê spanî (hesabê Ayê) + pezetayên spanî (hesabê Ayê) + + + pezetayê spanî (hesabê konvertibl) + pezetayê spanî (hesabê konvertibl) + pezetayên spanî (hesabê konvertibl) + + + pezetayê spanî + pezetayê spanî + pezetayên spanî + bîrê etyopyayî bîrê etyopyayî @@ -3290,35 +5560,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic ewro + + markkayê fînî + markkayê fînî + markkayên fînî + dolarê fîjîyî dolarê fîjîyî dolarên fîjîyî - paundê giravên falklandê - paundê giravên falklandê - paundên giravên falklandê + paundê giravên falklandî + paundê giravên falklandî + paundên giravên falklandî + + + markê fransî + markê fransî + markên fransî sterlînê brîtanî sterlînê brîtanî sterlînên brîtanî + + kupon larîtê gurcistanî + kupon larîtê gurcistanî + kupon larîtên gurcistanî + larîyê gurcistanî larîyê gurcistanî larîyên gurcistanî + + cedîyê ganayî (1979–2007) + cedîyê ganayî (1979–2007) + cedîyên ganayî (1979–2007) + cedîyê ganayî cedîyê ganayî cedîyên ganayî - poundê gîbraltarê - poundê gîbraltarê - poundên gîbraltarê + lîreyê cebelîtariqî + lîreyê cebelîtariqî + lîreyên cebelîtariqî dalasîyê gambîyayî @@ -3330,11 +5620,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic frankê gîneyî frankên gîneyî + + sylîyê gîneyî + sylîyê gîneyî + sylîyên gîneyî + + + ekweleyê gîneya ekvatorî + ekweleyê gîneya ekvatorî + ekweleyên gîneya ekvatorî + + + draxmayê yûnanî + draxmayê yûnanî + draxmayên yûnanî + quertzalê guatemalayî quertzalê guatemalayî quertzalên guatemalayî + + eskudoyê gîneya portugalî + eskudoyê gîneya portugalî + eskudoyên gîneya portugalî + + + pezoyê gîne-bissauyî + pezoyê gîne-bissauyî + pezoyên gîne-bissauyî + dolarê guayanayî dolarê guayanayî @@ -3350,10 +5665,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic lempîrayê hondurasî lempîrayên hondurasî + + dînarê xirwatî + dînarê xirwatî + dînarên xirwatî + - kûnayê xirwatî - kûnayê xirwatî - kûnayên xirwatî + kunayê xirwatî + kunayê xirwatî + kunayên xirwatî gûrdeyê haîtîyî @@ -3370,6 +5690,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic rûpîyê endonezî rûpîyên endonezî + + lîreyê îrlandî + lîreyê îrlandî + lîreyên îrlandî + + + lîreyê îsraîlî + lîreyê îsraîlî + lîreyên îsraîlî + + + şekelê îsraîlî (1980–1985) + şekelê îsraîlî (1980–1985) + şekelên îsraîlî (1980–1985) + şekelê nû yê îsraîlî şekelê nû yê îsraîlî @@ -3390,11 +5725,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic rîyalê îranî rîyalên îranî + + kronê îslandayî (1918–1981) + kronê îslandayî (1918–1981) + kronên îslandayî (1918–1981) + kronê îslandayî kronê îslandayî kronên îslandayî + + lîrayê îtalî + lîrayê îtalî + lîrayên îtalî + dolarê jamaîkayî dolarê jamaîkayî @@ -3435,6 +5780,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic wonê koreya bakurî wonên koreya bakurî + + hwanê koreya başûrî (1953–1962) + hwanê koreya başûrî (1953–1962) + hwanên koreya başûrî (1953–1962) + + + wonê koreya başûrî (1945–1953) + wonê koreya başûrî (1945–1953) + wonên koreya başûrî (1945–1953) + wonê koreya başûrî wonê koreya başûrî @@ -3480,6 +5835,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic lotîyê lesothoyî lotîyên lesothoyî + + lîtayê lîtvanyayî + lîtayê lîtvanyayî + lîtayên lîtvanyayî + + + talonasê lîtvanyayî + talonasê lîtvanyayî + talonasên lîtvanyayî + + + frankê konvertibl ya luksembûrgî + frankê konvertibl yê luksembûrgî + frankê konvertibl yê luksembûrgî + + + frankê luksembûrgî + frankê luksembûrgî + frankên luksembûrgî + + + frankê fînansî yê luksembûrgî + frankê fînansî yê luksembûrgî + frankên fînansî yên luksembûrgî + + + latê letonyayî + latê letonyayî + latên letonyayî + + + rubleyê letonyayî + rubleyê letonyayî + rubleyên letonyayî + dînarê lîbyayî dînarê lîbyayî @@ -3490,12 +5880,32 @@ CLDR data files are interpreted according to the LDML specification (http://unic dîrhemê fasî dîrhemên fasî + + franka fasî + franka fasî + frankên fasî + + + frankê monakoyî + frankê monakoyî + frankên monakoyî + + + kuponê moldovayî + kuponê moldovayî + kuponên moldovayî + leyê moldovayî leyê moldovayî leyên moldovayî + arîarîyê madagaskarî + arîarîyê madagaskarî + arîarîyên madagaskarî + + frankê madagaskarî frankê madagaskarî frankên madagaskarî @@ -3505,6 +5915,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic dînarê makedonî dînarên makedonî + + dînarê makedonî (1992–1993) + dînarê makedonî (1992–1993) + dînarên makedonî (1992–1993) + + + franka malîyî + franka malîyî + frankên malîyî + kyatê myanmarî kyatê myanmarî @@ -3520,16 +5940,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic patakayê makaoyî patakaynê makaoyî + + ouguîayê morîtanyayî (1973–2017) + ouguîayê morîtanyayî (1973–2017) + ouguîayên morîtanyayî (1973–2017) + ouguîayê morîtanyayî ouguîayê morîtanyayî ouguîayên morîtanyayî + + lîreyê maltayî + lîreyê maltayî + lîreyên maltayî + + + poundê maltayî + poundê maltayî + poundên maltayî + rûpîyê maûrîtîûsê rûpîyê maûrîtîûsê rûpîyên maûrîtîûsê + + rûpîyê maldîvayî (1947–1981) + rûpîyê maldîvayî (1947–1981) + rûpîyên maldîvayî (1947–1981) + rûfîyaayê maldîvayî rûfîyaayê maldîvayî @@ -3545,15 +5985,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic pesoyê meksîkayî pesoyên meksîkayî + + pesoyê zîvî yê meksîkayî (1861–1992) + pesoyê zîvî yê meksîkayî (1861–1992) + pesoyên zîvî yên meksîkayî (1861–1992) + + + unidad de inversionê meksîkayî (UDI) + unidad de inversionê meksîkayî (UDI) + unidad de inversionên meksîkayî (UDI) + ringgitê malezyayî ringgitê malezyayî ringgitên malezyayî + + eskudoyê mozambîkî + eskudoyê mozambîkî + eskudoyên mozambîkî + + + metîkalê mozambîkî (1980–2006) + metîkalê mozambîkî (1980–2006) + metîkalên mozambîkî (1980–2006) + - meticalê mozambîkî - meticalê mozambîkî - meticalên mozambîkî + metîkalê mozambîkî + metîkalê mozambîkî + metîkalên mozambîkî dolarê namîbyayî @@ -3565,11 +6025,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic naîrayê nîjeryayî naîrayên nîjeryayî + + kordobayê nîkaraguayî (1988–1991) + kordobayê nîkaraguayî (1988–1991) + kordobayên nîkaraguayî (1988–1991) + kordobayê nîkaraguayî kordobayê nîkaraguayî kordobayên nîkaraguayî + + florînê holendî + florînê holendî + florînên holendî + kronê norweçî kronê norweçî @@ -3595,11 +6065,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic balboayê panamayî balboayên panamayî + + întîyê perûyî + întîyê perûyî + întîyên perûyî + solê perûyî solê perûyî solên perûyî + + solê perûyî (1863–1965) + solê perûyî (1863–1965) + solên perûyî (1863–1965) + kînayê gîneya nû ya papûayî kînayê gîneya nû ya papûayî @@ -3620,6 +6100,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic zlotîyê polonyayî zlotîyên polonyayî + + zlotîyê polonyayî (1950–1995) + zlotîyê polonyayî (1950–1995) + zlotîyên polonyayî (1950–1995) + + + eskudoyê portugalî + eskudoyê portugalî + eskudoyên portugalî + gûaranîyê paragûayî gûaranîyê paragûayî @@ -3630,6 +6120,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic rîyalê qeterî rîyalên qeterî + + dolarê rodezyayî + dolarê rodezyayî + dolarên rodezyayî + + + leyê romanyayî (1952–2006) + leyê romanyayî (1952–2006) + leyên romanyayî (1952–2006) + leyê romanyayî leyê romanyayî @@ -3645,6 +6145,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic rubleyê rûsî rubleyên rûsî + + rubleyê belarûsî (1991–1998) + rubleyê belarûsî (1991–1998) + rubleyên belarûsî (1991–1998) + frankê rwandayî frankê rwandayî @@ -3665,11 +6170,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic rûpîyê seyşelerî rûpîyên seyşelerî + + dînarê sûdanî (1992–2007) + dînarê sûdanî (1992–2007) + dînarên sûdanî (1992–2007) + lîreyê sûdanî lîreyê sûdanî lîreyên sûdanî + + lîreyê sûdanî (1957–1998) + lîreyê sûdanî (1957–1998) + lîreyên sûdanî (1957–1998) + kronê swêdî kronê swêdî @@ -3685,6 +6200,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic lîreyê saînt helenayî lîreyên saînt helenayî + + tolarê slovenî + tolarê slovenî + tolarên slovenî + + + korunayê slovakî + korunayê slovakî + korunayên slovakî + leoneyê sîera leoneyî leoneyê sîera leoneyî @@ -3705,16 +6230,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic dolarê surînamî dolarên surînamî + + guldenê surînamî + guldenê surînamî + guldenên surînamî + lîreyê sûdana başûrî lîreyê sûdana başûrî lîreyên sûdana başûrî + + dobrayê sao tome û principeyî (1977–2017) + dobrayê sao tome û principeyî (1977–2017) + dobrayên sao tome û principeyî (1977–2017) + dobrayê sao tome û principeyî dobrayê sao tome û principeyî dobrayên sao tome û principeyî + + rubleyê sovyetî + rubleyê sovyetî + rubleyên sovyetî + + + kolonê el salvadorî + kolonê el salvadorî + kolonên el salvadorî + lîreyê sûrî lîreyê sûrî @@ -3730,11 +6275,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic bahtê taylandî bahtên taylandî + + rubleyê tacikistanî + rubleyê tacikistanî + rubleyên tacikistanî + somonê tacikistanî somonê tacikistanî somonên tacikistanî + + manatê tirkmenî (1993–2009) + manatê tirkmenî (1993–2009) + manatên tirkmenî (1993–2009) + manatê tirkmenî manatê tirkmenî @@ -3750,6 +6305,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic paʻangayê tonganî paʻangayên tonganî + + ekudoyê tîmorî + ekudoyê tîmorî + ekudoyên tîmorî + + + lîreyê tirkî (1922–2005) + lîreyê tirkî (1922–2005) + lîreyên tirkî (1922–2005) + lîreyê tirkî lîreyê tirkî @@ -3776,6 +6341,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic grîvnayê ûkraynî grîvnayên ûkraynî + + karbovanetzê ûkraynî + karbovanetzê ûkraynî + karbovanetzên ûkraynî + + + şîlîngê ûgandayî (1966–1987) + şîlîngê ûgandayî (1966–1987) + şîlîngên ûgandayî (1966–1987) + şîlîngê ûgandayî şîlîngê ûgandayî @@ -3787,16 +6362,56 @@ CLDR data files are interpreted according to the LDML specification (http://unic dolarên amerîkî $ + + dolarê amerîkî (roja din) + dolarê amerîkî (roja din) + dolarên amerîkî (roja din) + + + dolarê amerîkî (eynî roj) + dolarê amerîkî (eynî roj) + dolarên amerîkî (eynî roj) + + + peso en unidades indexadasê ûrûguayî + peso en unidades indexadasê ûrûguayî + peso en unidades indexadasên ûrûguayî + + + pesoyê ûrûgûayî (1975–1993) + pesoyê ûrûgûayî (1975–1993) + pesoyên ûrûgûayî (1975–1993) + pesoyê ûrûgûayî pesoyê ûrûgûayî pesoyên ûrûgûayî + + yekeya îndeksa heqdestê nomînal yê ûrûguayî + yekeya îndeksa heqdestê nomînal yê ûrûguayî + yekeyên îndeksa heqdestê nomînal yên ûrûguayî + somê ozbekî somê ozbekî somên ozbekî + + bolîvarê venezuelayî (1871–2008) + bolîvarê venezuelayî (1871–2008) + bolîvarên venezuelayî (1871–2008) + + + bolivar soberano (VED) + bolivar soberano (VED) + bolivar soberano (VED) + + + bolîvarê venezuelayî (2008–2018) + bolîvarê venezuelayî (2008–2018) + bolîvarên venezuelayî (2008–2018) + bolîvarê venezuelayî bolîvarê venezuelayî @@ -3807,6 +6422,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic dongê vîetnamî dongên vîetnamî + + dongê vîetnamî (1978–1985) + dongê vîetnamî (1978–1985) + dongên vîetnamî (1978–1985) + vatûyê vanûatûyî vatûyê vanûatûyî @@ -3822,41 +6442,191 @@ CLDR data files are interpreted according to the LDML specification (http://unic frenkê CFA yê afrîkaya navîn frenkên CFA yê afrîkaya navîn + + Zîv + Zîv + Zîv + + + Zêr + Zêr + Zêr + + + Yekeya Yekgirtî ya Ewropî + Yekeya Yekgirtî ya Ewropî + Yekeya Yekgirtî ya Ewropî + + + Yekeya Pereyê ya Ewropî + Yekeya Pereyê ya Ewropî + Yekeya Pereyê ya Ewropî + + + Yekeya Hesabê ya Ewropî (XBC) + Yekeya Hesabê ya Ewropî (XBC) + Yekeya Hesabê ya Ewropî (XBC) + + + Yekeya Hesabê ya Ewropî (XBD) + Yekeya Hesabê ya Ewropî (XBD) + Yekeya Hesabê ya Ewropî (XBD) + dolarê karayîba rojhilatî dolarê karayîba rojhilatî dolarên karayîba rojhilatî + + guldenê karayîbî + guldenê karayîbî + guldenên karayîbî + + + Heqê Kişandinê yê Xisûsî + Heqê Kişandinê yê Xisûsî + Heqê Kişandinê yê Xisûsî + + + Yekeya Pereyê ya Ewropayê + Yekeya Pereyê ya Ewropayê + Yekeya Pereyê ya Ewropayê + + + Franka Fransî ya Zêrê + Franka fransî ya zêrê + Franka fransî ya zêrê + + + Franka Fransî ya UICê + Franka Fransî ya UICê + Franka Fransî ya UICê + frankê CFA yê afrîkaya başûrî frankê CFA yê afrîkaya başûrî frankên CFA yê afrîkaya başûrî + + Paladyûm + Paladyûm + Paladyûm + frankê CFPî frankê CFPî frankên CFPî + + Platîn + Platîn + Platîn + + + Fonên RINETê + yekeya Fonên RINETê + yekeyên Fonên RINETê + + + Sucre + Sucre + Sucre + + + Yekeya Pereyê ya Testê + yekeya Pereyê ya Testê + Yekeyên pereyê yên testê + + + Yekeya Hesabê ya ADByê + yekeya hesabê ya ADByê + yekeyên hesabê yên ADByê + (yekeya pereyî ya nenas) yekeya pereyî ya nenas (yekeyên pereyî yên nenas) + + dînarê yemenî + dînarê yemenî + dînarên yemenî + rîyalê yemenî rîyalê yemenî rîyalên yemenî + + hard dînarê yûgoslavî (1966–1990) + hard dînarê yûgoslavî (1966–1990) + hard dînarên yûgoslavî (1966–1990) + + + dînarê nû ya yûgoslavî (1994–2002) + dînarê nû ya yûgoslavî (1994–2002) + dînarên nû ya yûgoslavî (1994–2002) + + + dînarê konvertibl ya yûgoslavî (1990–1992) + dînarê konvertibl ya yûgoslavî (1990–1992) + dînarên konvertibl ya yûgoslavî (1990–1992) + + + dînarê reformkirî ya yûgoslavî (1992–1993) + dînarê reformkirî ya yûgoslavî (1992–1993) + dînarên reformkirî yên yûgoslavî (1992–1993) + + + randê afrîkaya başûrî (fînansî) + randê afrîkaya başûrî (fînansî) + randên afrîkaya başûrî (fînansî) + randê afrîkaya başûrî randê afrîkaya başûrî randên afrîkaya başûrî + + kwaçayê zambîyayî (1968–2012) + kwaçayê zambîyayî (1968–2012) + kwaçayên zambîyayî (1968–2012) + kwaçayê zambîyayî kwaçayê zambîyayî kwaçayên zambîyayî + + zaîreyê nû ya zaîreyî (1993–1998) + zaîreyê nû ya zaîreyî (1993–1998) + zaîreyên nû yên zaîreyî (1993–1998) + + + zaîreyê zaîreyî (1971–1993) + zaîreyê zaîreyî (1971–1993) + zaîreyên zaîreyî (1971–1993) + + + dolarê zîmbabweyî (1980–2008) + dolarê zîmbabweyî (1980–2008) + dolarên zîmbabweyî (1980–2008) + + + zêrê zîmbabweyî + zêrê zîmbabweyî + zêrên zîmbabweyî + + + dolarê zîmbabweyî (2009–2024) + dolarê zîmbabweyî (2009–2024) + dolarên zîmbabweyî (2009–2024) + + + dolarê zîmbabweyî (2008) + dolarê zîmbabweyî (2008) + dolarên zîmbabweyî (2008) + ⩾{0} @@ -3898,11 +6668,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kîlometre kare {0} serê kîlometre kareyê - - hektar - - metre kare {0} metre kare {0} metre kare {0} serê metre kareyê @@ -3914,37 +6680,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} serê santîmetre kareyê - mîl kare {0} mîl kare {0} mîl kare {0} serê mîl kareyê - akre {0} akre {0} akre - yarda kare {0} yarda kare {0} yarda kare - fît kare {0} fît kare {0} fît kare - înç kare {0} înç kare {0} înç kare {0} serê înç kareyê - - donim - {0} donim - {0} donim - {0} qerat {0} qerat @@ -3954,22 +6710,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ji sedî {0} ji sedî {0} - - ss - {0} ss - {0} ss - - - dehsal - {0} dehsal - {0} dehsal - - - çaryek - {0} çaryek - {0} çaryek - {0}/çaryek - {0} meh {0} meh @@ -3997,10 +6737,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic sanîye {0} sanîye {0} saniye - {0}/sn - nîvçapa dinyayê {0} nîvçapa dinyayê {0} nîvçapa dinyayê @@ -4046,27 +6784,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} pîkometre - mîl {0} mîl {0} mîl - - yarda - - fît {0} fît {0} fît {0} serê fîtê - înç {0} înç {0} înç {0} serê înçê - parsek {0} parsek {0} parsek @@ -4081,12 +6812,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} yekeya astronomîk - furlong {0} furlong {0} furlong - fathom {0} fathom {0} fathom @@ -4096,12 +6825,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mîla behrê - punto {0} punto {0} punto - nîvçapa rojê {0} nîvçapa rojê {0} nîvçapa rojê @@ -4110,17 +6837,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic kîlometreya serê saetê - {0} km/st - {0} km/st - - - lître - - - şev - {0} şev - {0} şev - {0}/şev hêlên sereke @@ -4310,64 +7026,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic rad - - dq. kevanî - - - sn. kevanî - - - hektar - - - metre kare - - - mîl kare - - - akre - - - yarda kare - - - fît kare - - - înç kare - - - donim - {0} donim - {0} donim - l/100km {0}l/100km {0}l/100km - - ss - {0} ss - {0} ss - - - dehsal - {0} dehsal - {0} dehsal - sl {0}sl {0}sl - - çaryek - {0} çaryek - {0} çaryek - {0}/çaryek - {0}m {0}m @@ -4389,16 +7057,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}d - sn {0}sn {0}sn - {0}/sn - - - nîvçapa dinyayê - m {0}m {0}m @@ -4427,54 +7089,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}pm - mîl {0}mi {0}mi - - yarda - - fît {0}′ {0}′ - înç {0}″ {0}″ - - parsek - - - sala rnh - {0} sala rnh - {0} sala rnh - - - furlong - - - fathom - - - nîvçapa rojê - - - km/st - {0} km/st - {0} km/st - - - lître - - - şev - {0} şev - {0} şev - {0}/şev - {0}Rh {0}Bk diff --git a/make/data/cldr/common/main/ku_Arab.xml b/make/data/cldr/common/main/ku_Arab.xml new file mode 100644 index 00000000000..980252cf799 --- /dev/null +++ b/make/data/cldr/common/main/ku_Arab.xml @@ -0,0 +1,27 @@ + + + + + + + + - + @@ -772,6 +775,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombia Pulau Clipperton + Sark Costa Rica Cuba Cape Verde @@ -1117,35 +1121,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pengisihan Berangka Kekuatan Pengisihan Mata wang + Paparan Emoji Kitaran Jam (12 berbanding 24) Gaya Pemisah Baris + Penggalan Baris dalam Perkataan Sistem Ukuran Nombor + Penggalan Ayat Selepas Singkatan Zon Waktu Varian Tempat Penggunaan Peribadi Kalendar Buddha + Buddha Kalendar Cina + Cina Kalendar Qibti + Qibti Kalendar Dangi + Dangi Kalendar Ethiopia + Ethiopia Kalendar Amete Alem Ethiopia + Ethiopia Amete Alem Kalendar Gregory + Gregory Kalendar Ibrani + Ibrani Kalendar Kebangsaan India - Kalendar Islam - Kalendar Sivil Islam + Kalendar Hijrah + Hijrah + Kalendar Hijrah (jadual, zaman sivil) + Hijrah (jadual, zaman sivil) Kalendar Islam (Arab Saudi, cerapan) - Kalendar Islam (jadual, zaman astronomi) + Kalendar Hijrah (jadual, zaman astronomi) + Hijrah (jadual, zaman astronomi) Kalendar Islam (Umm Al-Quran) - Kalendar ISO-8601 + Hijrah (Umm al-Quran) + Kalendar Gregorian (Tahun Pertama) Kalendar Jepun + Jepun Kalendar Parsi + Parsi Kalendar Minguo + Minguo Format Mata Wang Perakaunan + Perakaunan Format Mata Wang Standard + Standard Isih Simbol Isih Mengabaikan Simbol Isih Aksen Secara Biasa @@ -1155,23 +1179,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Isih Huruf Besar Dahulu Isih Tidak Sensitif Atur Isih Sensitif Atur - Aturan Isih Cina Tradisional - Big5 Tertib Isihan Sebelumnya + Keserasian Aturan Isih Kamus + Kamus Tertib Isih Unikod Lalai + Unikod Lalai Aturan Isih Emoji Peraturan Isihan Eropah - Aturan Isih Bahasa Cina Ringkas - GB2312 Aturan Isih Buku Telefon + Buku Telefon Urutan Isih Fonetik + Fonetik Aturan Isih Pinyin + Pinyin Carian Tujuan Umum + Carian Cari Mengikut Konsonan Awal Hangul Tertib Isih Standard + Standard Aturan Isih Coretan + Coretan Aturan Isih Tradisional + Tradisional Aturan Isih Coretan Radikal + Coretan Radikal Aturan Isih Zhuyin + Zhuyin Isih Tanpa Penormalan Isih Unikod Ternormal Isih Digit Secara Berasingan @@ -1184,18 +1218,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ke Kelebaran Penuh Ke Kelebaran Separa Bernombor + Lalai + Emoji + Teks Sistem 12 Jam (0–11) + 12 (0–11) Sistem 12 Jam (1–12) + 12 (1–12) Sistem 24 Jam (0–23) + 24 (0–23) Sistem 24 Jam (1–24) + 24 (1–24) Gaya Pemisah Baris Bebas + Bebas Gaya Pemisah Baris Biasa + Biasa Gaya Pemisah Baris Ketat + Ketat + Pecahkan semua + Simpan semua + Normal + Simpan dalam frasa Transliterasi BGN AS Transliterasi UN GEGN Sistem Metrik + Metrik Sistem Ukuran Imperial + UK Sistem Ukuran AS + AS Digit Ahom Digit Indi-Arab Digit Indi Arab Lanjutan @@ -1277,6 +1328,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Digit Vai Digit Warang Citi Digit Wancho + Matikan + Hidupkan Metrik @@ -1295,9 +1348,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1308,18 +1358,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - - - h B – h B - - - h:mm B – h:mm B - - - - @@ -1440,6 +1478,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pada' {0} + + {1} 'pada' {0} + @@ -1448,6 +1489,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pada' {0} + + {1} 'pada' {0} + @@ -1470,11 +1514,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G - M/d/y GGGGG + M/y G + d/M/y GGGGG + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a d/M @@ -1533,10 +1578,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM, y G E, d MMM, y – E, d MMM, y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1547,10 +1588,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -1817,6 +1854,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pada' {0} + + {1} 'pada' {0} + @@ -1825,6 +1865,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'pada' {0} + + {1} 'pada' {0} + @@ -1841,10 +1884,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1906,10 +1950,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E,d MMM – E, d MMM y G E, d MMM y – E, d MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1920,10 +1960,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -2073,25 +2109,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + M/y G d/M/y GGGGG + E, d/M/y G M/y GGGGG d/M/y GGGGG E, d/M/y GGGGG - - - - - h B – h B - - - h:mm B – h:mm B - - - - @@ -2210,13 +2236,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Minggu dalam Bulan + minggu dalam bulan - Minggu dlm bulan + minggu dlm bln - Minggu dalam Bulan + mgu dlm bln hari @@ -2243,13 +2269,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ esok - Hari dalam Tahun + hari dalam tahun - Hari dlm Thn - - - Hari dlm Thn + hari dlm thn Hari dalam Minggu @@ -2260,9 +2283,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hari dlm bln - - Hari dlm bln - Ahad lalu Ahad ini @@ -2540,7 +2560,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Baitulmuqaddis - Enderbury + Pulau Canton Kostanay @@ -2595,9 +2615,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Waktu Afrika Barat - Waktu Piawai Afrika Barat - Waktu Musim Panas Afrika Barat + Waktu Afrika Barat @@ -2978,6 +2996,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Waktu Guyana + + + Waktu Piawai Hawaii-Aleutian + + Waktu Hawaii-Aleutian @@ -3553,8 +3576,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -3874,7 +3895,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Denar Macedonia - Kyat Myanma + Kyat Myanmar + Kyat Myanmar Tugrik Mongolia @@ -4091,6 +4113,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dolar Caribbean Timur + + Guilder Caribbean + Guilder Caribbean + Franc CFA BCEAO @@ -4116,6 +4142,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dolar Zimbabwe (1980–2008) + + Emas Zimbabwe + Emas Zimbabwe + Dolar Zimbabwe (2009) @@ -4304,7 +4334,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimol setiap liter {0} milimol setiap liter - + + bahagian + {0} bahagian + + bahagian setiap juta {0} bahagian setiap juta @@ -4318,6 +4352,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ permyriad {0} permyriad + + glukosa + {0} glukosa + liter sekilometer {0} liter sekilometer @@ -4692,6 +4730,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimeter raksa {0} milimeter raksa + + merkuri + {0} merkuri + paun seinci persegi {0} paun seinci persegi @@ -4741,6 +4783,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} knot + Beaufort Beaufort {0} @@ -4824,6 +4867,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} cawan metrik + + auns cecair metrik + {0} auns cecair metrik + ekar-kaki {0} ekar-kaki @@ -4871,17 +4918,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kuart Imp. {0} kuart Imp. - - cahaya - {0} cahaya + + steradian + {0} steradian - - bahagian per bilion - {0} bahagian per bilion + + katal + {0} katal + + + coulomb + {0} coulomb + + + farad + {0} farad + + + henry + {0} henry + + + siemens + {0} siemens + + + kalori [IT] + {0} kalori [IT] + + + becquerel + {0} becquerel + + + sievert + {0} sievert + + + gray + {0} gray + + + kilogram-daya + {0} kilograms-force + + + tesla + {0} tesla + + + weber + {0} weber + + + bahagian setiap bilion + {0} bahagian setiap bilion - malam - {0} malam {0} setiap malam @@ -4940,12 +5033,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ karat + + bahagian + {0} bahagian + peratus per seribu + + Glc + liter/km @@ -5211,11 +5311,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ cubit {0} cubit + + kal-IT + {0} kal-IT + cahaya {0} cahaya - + bahagian/bilion @@ -5256,12 +5360,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ in² + + bahagian + {0} bahagian + % {0}mol + + Glc + mpg UK {0}m/gUK @@ -5489,14 +5600,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dr.fl. - - cahaya - {0} cahaya + + kal-IT + {0} kal-IT - - malam - {0} malam - {0}/malam + + ppb diff --git a/make/data/cldr/common/main/ms_Arab.xml b/make/data/cldr/common/main/ms_Arab.xml index ce88331ca6f..58c26c002e5 100644 --- a/make/data/cldr/common/main/ms_Arab.xml +++ b/make/data/cldr/common/main/ms_Arab.xml @@ -760,6 +760,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) {0} {1} diff --git a/make/data/cldr/common/main/mt.xml b/make/data/cldr/common/main/mt.xml index df9ca3a1f79..a1b0ebcb2de 100644 --- a/make/data/cldr/common/main/mt.xml +++ b/make/data/cldr/common/main/mt.xml @@ -861,9 +861,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kalendarju Islamiku-Ċivili Kalendarju ISO-8601 Kalendarju Ġappuniż - Ordni Ċiniż Tradizzjonali (Big5) Ordni tad-Dizzjunarju - Ordni Ċiniż Sempliċi (GB2312) Ordni Telefonika Ordni tal-Pinjin Ordni Standard @@ -1766,9 +1764,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic il-Ġamajka - - Enderbury - il-Belt tal-Kuwajt diff --git a/make/data/cldr/common/main/mww.xml b/make/data/cldr/common/main/mww.xml new file mode 100644 index 00000000000..5da9f871a93 --- /dev/null +++ b/make/data/cldr/common/main/mww.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + 𞄤𞄣 + 𞄜𞄤 + 𞄥𞄴𞄅𞄇𞄉𞄦𞄱𞄊 + 𞄕𞄤𞄰𞄎𞄦𞄴 + 𞄋𞄄 + + + + + + 𞄒𞄫𞄱𞄔𞄩𞄴 + + + + [𞄱 𞄶 𞄲 𞄳 𞄰 𞄴 𞄵 𞅏 𞄼 𞄽 𞄀 𞄁 𞄂 𞄃 𞄄 𞄅 𞄆 𞄇 𞄈 𞄉 𞄊 𞄋 𞄌 𞄍 𞄎 𞄏 𞄐 𞄑 𞄒 𞄓 𞄔 𞄕 𞄖 𞄗 𞄘 𞄙 𞄚 𞄛 𞄜 𞄝 𞄞 𞄟 𞄠 𞄡 𞄢 𞄣 𞄤 𞄥 𞄦 𞄧 𞄨 𞄩 𞄪 𞄫 𞄬 𞅎] + + [𞄀 𞄁 𞄂 𞄃 𞄄 𞄅 𞄆 𞄇 𞄈 𞄉 𞄊 𞄋 𞄌 𞄍 𞄎 𞄏 𞄐 𞄑 𞄒 𞄓 𞄔 𞄕 𞄖 𞄗 𞄘 𞄙 𞄚 𞄛 𞄜 𞄝 𞄞 𞄟 𞄠 𞄡 𞄢 𞄣 𞄤 𞄥 𞄦 𞄧 𞄨 𞄩 𞄪 𞄫 𞄬] + [\- ‑ , . % + 𞅀 𞅁 𞅂 𞅃 𞅄 𞅅 𞅆 𞅇 𞅈 𞅉] + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + + + + + + + + 𞄆𞄬 + 𞄛𞄨𞄱𞄄𞄤𞄲𞄨 + 𞄒𞄫𞄰𞄒𞄪𞄱 + 𞄤𞄨𞄱 + 𞄀𞄪𞄴 + 𞄛𞄤𞄱𞄞𞄤𞄦 + 𞄔𞄩𞄴𞄆𞄨𞄰 + 𞄕𞄩𞄲𞄔𞄄𞄰𞄤 + 𞄛𞄤𞄱𞄒𞄤𞄰 + 𞄪𞄱𞄀𞄤𞄴 + 𞄚𞄦𞄲𞄤𞄚𞄄𞄰𞄫 + 𞄒𞄩𞄱𞄔𞄬𞄴 + + + + + + + 𞄎𞄤𞄲 + 𞄈𞄦 + 𞄆𞄨𞄰 + 𞄗𞄄𞄤𞄰𞄦 + 𞄙𞄤𞄱𞄨 + 𞄑𞄤𞄱𞄨 + 𞄊𞄧𞄳 + + + + + + + 𞅁 + 𞅂 + 𞅃 + 𞅄 + + + + + + 𞄜𞄆𞄪 + + + + + + + 𞄛𞄩 + + + + + hmnp + latn + + + 𞅎 + + + + diff --git a/make/data/cldr/common/main/mww_Hmnp.xml b/make/data/cldr/common/main/mww_Hmnp.xml new file mode 100644 index 00000000000..639b8ee8760 --- /dev/null +++ b/make/data/cldr/common/main/mww_Hmnp.xml @@ -0,0 +1,14 @@ + + + + + + + + - + @@ -653,6 +655,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ တရုတ် ကိုလံဘီယာ ကလစ်ပါတန်ကျွန်း + ဆာ့က် ကို့စ်တာရီကာ ကျူးဘား ကိတ်ဗာဒီ @@ -898,44 +901,83 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ငွေရေတွက်ပုံစနစ် အစဉ်လိုက်စီရန် ငွေကြေး + အီမိုဂျီဖော်ပြချက် နာရီစက်ဝန်း (၁၂ နှင့် ၂၄) စာပိုဒ်ခွဲပုံစံ + စာပုဒ်ခြား တိုင်းတာရေးစနစ် ကိန်းဂဏန်း + စာလုံးခြား ဗုဒ္ဓ ပြက္ခဒိန် + ဗုဒ္ဓ တရုတ် ပြက္ခဒိန် + တရုတ် ကို့ပ်တစ် ပြက္ခဒိန် + ကို့ပ်တစ် ဒန်းဂိ ပြက္ခဒိန် + ဒန်းဂိ အီသီယိုးပီးယား ပြက္ခဒိန် + အီသီယိုးပီးယား အီသီယိုပစ်ခ် အာမဲတဲ အာလင်မ် ပြက္ခဒိန် + အီသီယိုပစ်ခ် အာမဲတဲ အာလင်မ် နိုင်ငံတကာသုံး ပြက္ခဒိန် + နိုင်ငံတကာသုံး ဟီဘရူး ပြက္ခဒိန် + ဟီဘရူး အိန္ဒြိယ အမျိုးသား ပြက္ခဒိန် အစ္စလာမ် ပြက္ခဒိန် + အစ္စလာမ် အစ္စလာမ်မစ် ပြက္ခဒိန် + အစ္စလာမ် အယ်လ်ကူရာ အစ္စလာမ်မစ် ပြက္ခဒိန် + အစ္စလာမ် ISO-8601 ပြက္ခဒိန် ဂျပန် ပြက္ခဒိန် + ဂျပန် ပါရှား ပြက္ခဒိန် + ပါရှား မင်ဂုအို ပြက္ခဒိန် + မင်ဂုအို စာရင်းကိုင်သုံး ငွေရေတွက်ပုံစနစ် + စာရင်းကိုင် ပုံမှန် ငွေရေတွက်ပုံစနစ် + ပုံမှန် အစဉ်လိုက်စီထားသော ယူနီကုတ် + ပုံသေယူနီကုတ် ဖုန်းစာအုပ် အစီအစဉ် ယေဘုယျရှာခြင်း + ရှာဖွေမှု ပုံမှန်စီထားသော + ပုံမှန် + ပုံသေ | မူသေ | မူရင်း | ပင်တိုင် + အီမိုဂျီ + စာသား ၁၂ နာရီ စနစ် (၀–၁၁) + ၁၂ (၀−၁၁) ၁၂ နာရီစနစ် (၁–၁၂) + ၁၂ (၁−၁၂) ၂၄ နာရီ စနစ် (၀–၂၃) + ၂၄ (၀−၂၃) ၂၄ နာရီ စနစ်(၁–၂၄) + ၂၄ (၁−၂၄) ကန့်သတ်မထားသော စာပိုဒ်ခွဲပုံစံ + ကန့်သတ်မထား ပုံမှန်စာပိုဒ်ခွဲပုံစံ + ပုံမှန် ကန့်သတ်ထားသော စာပိုဒ်ခွဲပုံစံ + ကန့်သတ်ထား + အားလုံးခွဲရန် + အားလုံးတွဲထားရန် + ပုံမှန် + စကားစုအလိုက် တွဲထားရန် မက်ထရစ်စနစ် + မက်ထရစ် ဗြိတိသျှတိုင်းတာစနစ် + ဗြိတိန် အမေရိကန်တိုင်းတာစနစ် + အမေရိကန် အာရပ် ဂဏန်းခြေ တိုးချဲ့အာရပ် ဂဏန်းခြေ အာမေးနီးယား ဂဏန်းခြေ @@ -977,6 +1019,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ထိုင်း ဂဏန်းခြေ တိဘက် ဂဏန်းခြေ ဗိုင်း ဂဏန်းခြေ + ပိတ် + ဖွင့် မက်ထရစ်စနစ် @@ -998,9 +1042,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1062,22 +1103,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss d E + E a h E a h:mm E a h:mm:ss GGGGG y/M/d + G y-MM-dd၊ E G d MMM y + G y MMM d၊ E a h a h:mm a h:mm:ss + v a h + v HH'h' d/M + MM-dd၊ E MMM d E MMMM d Eနေ့ G M/y GGGGG dd/MM/Y G d MMM y + G y MMM d၊ E {0} – {1} @@ -1097,6 +1146,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ GGGGG y/M – GGGGG y/M + + G y MMM d၊ E – MMM d၊ E + G y MMM d၊ E – G y MMM d၊ E + G y MMM d၊ E – MMM d၊ E + G y MMM d၊ E – y MMM d၊ E + M – M @@ -1234,15 +1289,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - နွေ - လာ - ဂါ - ဟူး - တေး - ကြာ - နေ - @@ -1261,12 +1307,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - Q1 - Q2 - Q3 - Q4 - ဒု @@ -1374,13 +1414,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss d ရက် E + E a h E a h:mm E a h:mm:ss G y/M/d - G y/ MMM d/ E + G y-MM-dd၊ E + G y MMM d၊ E a h a h:mm a h:mm:ss @@ -1388,6 +1431,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ v HH:mm:ss v a h:mm v HH:mm + v a h + v HH d/M d/M E MMM d E @@ -2088,6 +2133,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ အီစတာ + + ကွိုင်းဟိုင်ခ် + ပွန်တာ အရီနာစ် @@ -2353,9 +2401,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဖနွမ်ပင် - အန်ဒါဘူရီ - - ကန်တွန် @@ -3025,9 +3070,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - အနောက်အာဖရိက အချိန် - အနောက်အာဖရိက စံတော်ချိန် - အနောက်အာဖရိက နွေရာသီ အချိန် + အနောက်အာဖရိက အချိန် @@ -3377,6 +3420,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဂိုင်ယာနာ အချိန် + + + ဟာဝိုင်ယီ အယ်လူးရှန်း စံတော်ချိန် + + ဟာဝိုင်ယီ အယ်လူးရှန်း အချိန် @@ -3801,6 +3849,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ချုခ် အချိန် + + + တူရကီ အချိန် + တူရကီ စံတော်ချိန် + တူရကီ နွေရာသီ အချိန် + + တာ့ခ်မင်နစ္စတန် အချိန် @@ -3938,29 +3993,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ ¤ #,##0.00 + ¤ #,##0.00 - ¤ 0 ထောင် - ¤ 0 သောင်း - ¤ 0 သိန်း - ¤ 0 သန်း - ¤ 0 ကုဋေ - ¤ 00 ကုဋေ - ¤ 000 ကုဋေ - ¤ 0000 ကုဋေ - ¤ ကုဋေ 0 သောင်း - ¤ ကုဋေ 0 သိန်း - ¤ ကုဋေ 0 သန်း - ¤ 0 ကောဋိ + 0 ထောင် ¤ + 0 သောင်း ¤ + 0 သိန်း ¤ + 0 သန်း ¤ + 0 ကုဋေ ¤ + 00 ကုဋေ ¤ + 000 ဋေ ¤ + ဋေ 0 ထ ¤ + ဋေ 0 သ ¤ + ဋေ 0 သိန်း ¤ + ဋေ 0 သန်း ¤ + 0 ကောဋိ ¤ {1} {0} + + + + #,##0.00 ¤ + + + ¤ #,##0.00 + + + အာရပ်စော်ဘွားများ ပြည်ထောင်စု ဒါဟမ်း @@ -4397,7 +4464,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဆီယာရာလီယွန်း လီအိုနီ (၁၉၆၄—၂၀၂၂) - ဆီယာရာလီယွန်း လီအိုနီ (၁၉၆၄—၂၀၂၂) ဆိုမာလီ သျှီလင် @@ -4507,6 +4573,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ အရှေ့ကာရစ်ဘီယံ ဒေါ်လာ + + ကာရစ်ဘီယံ ဂင်းဒါး + ကာရစ်ဘီယံ ဂင်းဒါး + အထူးထုတ်ယူခွင့် @@ -4539,6 +4609,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဇင်ဘာဘွေ ဒေါ်လာ + + ဇင်ဘာဘွေ ရွှေ + ဇင်ဘာဘွေ ရွှေ + {0} နှင့်အထက် @@ -4723,7 +4797,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ တစ်လီတာရှိ မီလီမိုးလ် တစ်လီတာရှိ {0} မီလီမိုးလ် - + + ပတ် + {0} ပတ် + + တစ်သန်းပုံ {0} ပုံ @@ -4737,6 +4815,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ပါမီရိတ် + + မိုး + + + ဂလူးကို့စ် + {0} ဂလူးကို့စ် + တစ်ကီလိုမီတာရှိ လီတာ တစ်ကီလိုမီတာရှိ {0} လီတာ @@ -5066,6 +5151,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ပြဒါးမီလီမီတာ {0} ပြဒါးမီလီမီတာ + + ပြဒါး + {0} ပြဒါး + တစ်စတုရန်းလက်မလျှင် {0} ပေါင် @@ -5177,6 +5266,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ မထ္ထရစ် ခွက် {0} မထ္ထရစ် ခွက် + + မက်ထရစ် အရည် အောင်စ + {0} မက်ထရစ် အရည် အောင်စ + {0} ဧက-ပေ @@ -5214,19 +5307,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဗြိတိသျှသုံး အချိုပွဲဇွန်း {0} ဇွန်း - - အလင်း - {0} အလင်း + + စတယ်ရေဒီယန် + {0} စတယ်ရေဒီယန် - - သန်းတစ်ထောင်ပုံ တစ်ပုံ + + ကတ်တဲလ် + {0} ကတ်တဲလ် + + + ဖာရက်ဒ် + {0} ဖာရက်ဒ် + + + ဟင်နရီ + {0} ဟင်နရီ + + + စီးမန် + {0} စီးမန် + + + ကယ်လိုရီ [IT] + {0} ကယ်လိုရီ [IT] + + + ဂရေးစ် + {0} ဂရေးစ် + + + ကီလိုဂရမ်စွမ်းအင် + {0} ကီလိုဂရမ်စွမ်းအင် + + + တက်စလာ + {0} တက်စလာ + + သန်းတစ်ထောင်ပုံ {0} ပုံ - - - {0} ည - {0}/ည - အရပ် လေးမျက်နှာ {0} အရှေ့ @@ -5285,12 +5404,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ကာရက် - + + ပတ် + {0} ပတ် + + တစ်သန်းပုံ တစ်ပုံ ပါမီရိတ် + + ဂလူးကို့စ် + {0} ဂလူးကို့စ် + လီတာ/ကီလိုမီတာ @@ -5692,11 +5819,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ဗြိတိသျှသုံး ကွတ် ဗြိတိသျှသုံး {0} ကွတ် + + ကယ်လိုရီ-IT + {0} ကယ်လိုရီ-IT + အလင်း {0} အလင်း - + သန်းတစ်ထောင်ပုံ တစ်ပုံ @@ -5716,8 +5847,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}° - - cm² + + ပတ် + {0} ပတ် + + + Glc L/km @@ -5841,18 +5976,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ စက် + + ကယ်လိုရီ-IT + {0} ကယ်လိုရီ-IT + - အလင်း {0}အလင်း - + {0}ppb - - - {0} ည - {0}/ည - {0}E {0}N diff --git a/make/data/cldr/common/main/nds.xml b/make/data/cldr/common/main/nds.xml index b4f1e03f66c..e2db2de5bd2 100644 --- a/make/data/cldr/common/main/nds.xml +++ b/make/data/cldr/common/main/nds.xml @@ -918,8 +918,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ISO-8601-Klenner Japaansch Klenner Klenner vun de Republik China - Traditschonell Chineesch Sorteerregeln - Big5 - Vereenfacht Chineesch Sorteerregeln - GB2312 Telefonbook-Sorteerregeln Pinyin-Sorteerregeln Standard-Sorteerreeg @@ -1577,9 +1575,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Westafrikaansch Tiet - Westafrikaansch Standardtiet - Westafrikaansch Summertiet + Westafrikaansch Tiet @@ -1756,6 +1752,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ {0} {1} diff --git a/make/data/cldr/common/main/ne.xml b/make/data/cldr/common/main/ne.xml index 0ef08650f30..a8951965542 100644 --- a/make/data/cldr/common/main/ne.xml +++ b/make/data/cldr/common/main/ne.xml @@ -325,6 +325,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ बाफिया कोलोग्नियाली कुर्दी + कुर्दिस + कुर्मान्जी कुमिक कुतेनाइ कोमी @@ -847,6 +849,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ चीन कोलोम्बिया क्लिप्पेर्टन टापु + सार्क कोष्टारिका क्युबा केप भर्डे @@ -1085,49 +1088,87 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ मुद्राको ढाँचा क्रमबद्ध सुची मुद्रा + इमोजी प्रेजन्टेसन समय चक्र (12 तथा 24) पङ्क्ति विच्छेदको शैली + शब्दबीचका लाइन ब्रेकहरू मापन प्रणाली अङ्कहरू + संक्षिप्त शब्दपछि आउने वाक्यान्त बुद्धिष्ट पात्रो + बौद्ध चिनियाँ पात्रो + चिनियाँ कोप्टिक पात्र + कोप्टिक डाङ्गी पात्रो + डाँगी इथिओपिक पात्रो + इथियोपियाली इथियिपियाली आमेट आलेम पात्र + इथियोपिक अमेटे अलेम ग्रेगोरियन पात्रो + ग्रिगोरियन हिब्रु पात्रो + ह्रिब्रू भारतीय राष्ट्रिय पात्रो + भारतीय राष्ट्रिय हिजरी पात्रो + हिज्री हिजरी पात्रो (टेबुलर, नागरिक युग) + हिज्री (टेबुलर, सिभिल एपोच) इस्लामी पात्रो + हिज्री (अन अल क्वारा) ISO-8601 पात्रो जापानी पात्रो + जापानी फारसी पात्रो + पर्सियाली चिनियाँ गणतन्त्रको पात्रो + मिन्ग्वो लेखासम्बन्धी मुद्राको ढाँचा + लेखापालन मानक मुद्राको ढाँचा - परम्परागत चिनिँया क्रमबद्धता पद्दति - बिग फाइभ + मानक पूर्वनिर्धारित युनिकोडको क्रमबद्धता सूची - सरलिकृत चिनियाँ क्रमबद्धता पद्दति-गीबीटुथ्रीवानटु + डिफल्ट युनिकोड टेलिफोन पुस्तिका क्रमबद्धतापद्दति पिनयिन क्रमबद्धता पद्दति सामान्य उद्देशीय खोजी + खोज मानक क्रमबद्धता + मानक स्ट्रोक क्रमबद्धता पद्दति परम्परागत क्रमबद्धता पद्दति + डिफल्ट + इमोजी + टेक्स्ट १२ घण्टे प्रणाली (०–११) + १२ (0–11) १२ (0–११) १२ घन्टाको प्रणाली (१–१२) + १२(१–१२) १२ (1–१२) २४ घन्टाको प्रणाली (०–२३) + २४ (०–२३) २४ (०–२३) २४ घन्टाको प्रणाली (१–२४) + २४ (१–२४) २४ (१–२४) पङ्क्ति विच्छेदको खुला शैली + खुला पङ्क्ति विच्छेदको सामान्य शैली + सामान्य पङ्क्ति विच्छेदको कडा शैली + कडा + सबै ब्रेक गर्नुहोस् + सबै राख्नुहोस् + सामान्य + वाक्यांशमा राख्नुहोस् मेट्रिक प्रणाली + मेट्रिक इम्पेरियल मापन प्रणाली + बेलायती संयुक्त राज्य मापन प्रणाली + अमेरिकी अरबी भारतीय अङ्कहरू विस्तृत अरबी भारतीय अङ्कहरू आर्मेनियाली अङ्कहरू @@ -1168,6 +1209,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ थाई अङ्कहरू तिब्बती अङ्कहरू भाई अङ्क + अफ + अन मेट्रिक @@ -1186,6 +1229,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [अ आ इ ई उ ऊ ऋ ए ऐ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह] [\- ‑ , . % ‰ + 0० 1१ 2२ 3३ 4४ 5५ 6६ 7७ 8८ 9९] [\- ‑ — , ; ! ? । '‘’ "“” ( ) \[ \] \{ \}] + [.] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1214,7 +1258,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -1223,11 +1267,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} बजे {0} + {1}, {0} + + {1} बजे {0} + + + {1} बजे {0} + @@ -1382,7 +1435,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ईसा पूर्व - इस्वीपूर्व सन् ईसा काल @@ -1440,6 +1492,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}: {0} + + {1} मा {0} + @@ -1448,6 +1503,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}: {0} + + {1} मा {0} + @@ -1461,7 +1519,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E + M/y G M/d/y G + E, M/d/y G MMMM को W हप्ता MMMM को W हप्ता Y को w हप्ता @@ -2162,6 +2222,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ इस्टर + + कोहाक्व + पुन्टा अरिनाज @@ -2427,9 +2490,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ फेनोम फेन - एन्डरबरी - - कान्टोन @@ -3099,9 +3159,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - पश्चिम अफ्रिकी समय - पश्चिम अफ्रिकी मानक समय - पश्चिम अफ्रिकी ग्रीष्मकालीन समय + पश्चिम अफ्रिकी समय @@ -3451,6 +3509,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ गुयाना समय + + + हवाई-एलुटियन मानक समय + + हवाई-एलुटियन समय @@ -4026,11 +4089,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + ¤ #,##,##0.00 + + + ¤ #,##,##0.00 + + + ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 @@ -4601,6 +4678,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ पूर्वी क्यारिबियन डलर + + क्यारिबियन गिल्डर + क्यारिबियन गिल्डर + क्यारिबियन गिल्ड + सीएफ्‌ए फ्रान्क बीसीइएओ सीएफ्‌ए फ्रान्क बीसीइएओ @@ -4628,6 +4710,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ जाम्बियाली क्वाचा + + जिम्बाबेली सुन + जिम्बाबेली सुन + जिम्बाबेली सुन + {0}+ @@ -4720,7 +4807,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ पेबि{0} - एक्‍सबि{0} + एक्सबी{0} जेबि{0} @@ -4785,17 +4872,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ वर्ग फिट - {0}कराट - {0}कराट + क्यारेट + {0} क्यारेट + {0} क्यारेट मिलिग्राम पति डेेसिलिटर {0} mg/dL {0} मिलिग्राम पति डेेसिलिटर + + मिलिमोल प्रति लिटर + {0} mmol/L + {0} मिलिमोल प्रति लिटर + वस्तुहरू + + भाग + {0} भाग + {0} भाग + + + भाग प्रति दस लाख + {0} भाग प्रति दस लाख + {0} भाग प्रति दस लाख + {0} प्रतिशत {0} प्रतिशत @@ -4808,6 +4911,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} पर्माइराइड {0} पर्माइराइड + + ग्लुकोजको + ग्लुकोजको {0} + ग्लुकोजको {0} + लिटर प्रति किलोमिटर {0}लिटर प्रति किलोमिटर @@ -4822,10 +4930,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}माइल प्रति ग्यालोन {0}माइल प्रति ग्यालोन + + {0} माइल प्रति इम्पिरियल ग्यालोन + {0} माइल प्रति इम्पिरियल ग्यालोन + - पिटाबाइटहरू {0} पिटाबाइट - {0} पिटाबाइटहरू + {0} पिटाबाइट टेराबाइट @@ -4880,7 +4991,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} प्रति वर्ष - qtr + क्वाटर {0} क्वाटर {0} क्वाटर @@ -4984,6 +5095,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ टाइपोग्रापिक एम + {0} em + {0} ems {0} पिक्सेल @@ -5013,10 +5126,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} डट प्रति इन्च {0} डट प्रति इन्च - - {0}बिन्‍दु - {0}बिन्‍दु - पृथ्वीको त्रिज्या {0} पृथ्वीको त्रिज्या @@ -5031,7 +5140,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मिटर {0} मिटर - {0}प्रति मिटर डेसिमिटर @@ -5068,9 +5176,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} माइल - फुट {0} फुट - {0} फुट + {0}फिट {0} प्रति फुट @@ -5105,8 +5212,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}नउटिकल माइल - {0} miles-scandinavian - {0} miles-scandinavian + माइल-स्क्यान्डिनेभियन + {0} माइल-स्क्यान्डिनेभियन + {0} माइल-स्क्यान्डिनेभियन + + + पोइन्ट + {0} पोइन्ट + {0} पोइन्ट {0} सौर्य रेडियस @@ -5188,6 +5301,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मिलिमिटर पारो {0} मिलिमिटर पारो + + मर्करीको + मर्करीको {0} + मर्करीको {0} + पाउन्ड प्रति वर्ग इन्च {0} पाउन्ड प्रति वर्ग इन्च @@ -5232,6 +5350,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ब्यूफोर्ट {0} ब्यूफोर्ट {0} + + डिग्री तापक्रम + {0} डिग्री तापक्रम + {0} डिग्री तापक्रम + {0} डिग्री सेल्सियस् {0} डिग्री सेल्सियस् @@ -5303,6 +5426,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}मेट्रिक कप {0}मेट्रिक कप्स + + मेट्रिक फ्ल्युड आउन्स + {0} मेट्रिक फ्ल्युड आउन्स + {0} मेट्रिक फ्ल्युड आउन्स + वर्ग गज-फिट {0}वर्ग गज-फिट @@ -5331,8 +5459,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Imp. fluid ounces - {0} Imp. fluid ounce - {0} Imp. fluid ounces + {0} इम्पिरियल फल्युइड आउन्स + {0} इम्पिरियल फल्युइड आउन्स टेबल चम्चा @@ -5350,9 +5478,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} डेजर्ट चम्चा - Imp. डेजर्ट चम्चा - {0} Imp. डेजर्ट चम्चा - {0} Imp. डेजर्ट चम्चा + इम्पिरियल डेजर्ट चम्चा + {0} इम्पिरियल डेजर्ट चम्चा + {0} इम्पिरियल डेजर्ट चम्चा ड्राम @@ -5364,20 +5492,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} इम्पिरियल चौथाइ {0} इम्पिरियल चौथाइ - - प्रकाश - प्रकाश - {0} प्रकाश + + स्टाराडियन + {0} स्टाराडियन + {0} स्टाराडियन - + + काटल्स + {0} काटल + {0} काटल + + + कुलम्ब + {0} कुलम्ब + {0} कुलम्ब + + + फराड + {0} फराड + {0} फराड + + + हेनरी + {0} हेनरी + {0} हेनरी + + + साइमेन्स + {0} साइमेन्स + {0} साइमेन्स + + + क्यारोली [IT] + {0} क्यालोरी [IT] + {0} क्यालोरी [IT] + + + बेक्वेरल + {0} बेक्वेरल + {0} बेक्वेरल + + + सिभर्ट्स + {0} सिभर्ट्स + {0} सिभर्ट्स + + + खैरो + {0} खैरो + {0} खैरा + + + किलोग्राम फोर्स + {0} किलोग्राम फोर्स + {0} किलोग्राम फोर्स + + + टेस्ला + {0} टेस्ला + {0} टेस्ला + + + वेबर्स + {0} Wb + {0} Wb + + अंश प्रति बरब {0} अंश प्रति अरब {0} अंश प्रति अरब - रात - {0} रात - {0} रात {0} प्रति रात @@ -5526,20 +5711,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} डुनाम - कराट + क्यारेट + + + मिलिमोल/लिटर वस्तु {0} वस्तु {0} वस्तु + + भाग + {0} भाग + {0} भाग + + + भाग/दस लाख + प्रतिशत प्रति मिल {0}प्रति मिल - {0}प्रतिशत १ + {0}‰ पर्माइराइड @@ -5549,6 +5745,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} मोल {0} मोल + + Glc + {0} Glc + {0} Glc + लिटर/किलोमिटर @@ -5562,9 +5763,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mpg {0} mpg + + माइल/इम्पिरियल ग्यालोन + पिटाबाइट - {0} पिटा + {0} PB {0} पिटा @@ -5728,7 +5932,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ मि.मि. - मि.मि. + {0}मि.मि. {0}मि.मि. @@ -5772,6 +5976,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ फ्यादम + + पोइन्ट + सौर्य रेडिआई @@ -5861,6 +6068,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} हर्सपावर {0} हर्सपावर + + मर्करीको + मर्करीको {0} + मर्करीको {0} + इन्च पारो {0} इन्च पारो @@ -5912,6 +6124,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ब्यूफोर्ट + + डिग्री तापक्रम + डिग्री सेल्सियस् {0}°से @@ -5974,6 +6189,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc {0} mc + + {0} fl oz m. + {0} fl oz m. + वर्ग गज फिट {0}वर्ग गज फिट @@ -6007,6 +6226,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ब्यारल {0} ब्यारल + + इम्पिरियल डेजर्ट चम्चा + {0} इम्पिरियल डेजर्ट चम्चा + {0} इम्पिरियल डेजर्ट चम्चा + थोपा {0} थोपा @@ -6014,8 +6238,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ड्राम तरल पदार्थ - {0} ड्राम तरल - {0} ड्राम fl + {0} ड्राम + {0} ड्राम जिगर @@ -6027,12 +6251,66 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} चुटकी {0} चुटकी + + {0} sr + {0} sr + + + काट + {0} काट + {0} काट + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + क्याल-IT + {0} क्याल-IT + {0} क्याल-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + प्रकाश {0} प्रकाश {0} प्रकाश - + अंश/अरब @@ -6125,22 +6403,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ वाइआइ{0} - - {0} g - {0} g - {0}rad {0}rad - - {0}′ - {0}′ - - - {0}″ - {0}″ - {0} ब.कि.मि. {0} ब.कि.मि. @@ -6149,10 +6415,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ब.मि. {0} ब.मि. - - {0} बर्ग माईल - {0} बर्ग माईल - {0} एकर {0} एकर @@ -6161,11 +6423,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ब.फु. {0} ब.फु. + + क्यारेट + {0}mmol/L {0}mmol/L - + + भाग + {0} भाग + {0} भाग + + + भाग/दस लाख {0}ppm {0}ppm @@ -6173,14 +6444,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}‰ {0}‰ + + Glc + {0}L/km {0}L/km - - {0}L/100km - {0}L/100km - {0}mpg {0}mpg @@ -6340,16 +6610,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}nm {0}nm - - {0} pm - {0} pm - - - {0} माईल - {0} माईल - - {0}′ + {0}फिट {0}′ @@ -6403,7 +6665,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}L☉ - {0} L☉ + {0}L☉ किलो @@ -6412,10 +6674,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} पाउण्ड {0} पाउण्ड - - {0} आऊन्स - {0} आऊन्स - {0}M⊕ {0}M⊕ @@ -6440,6 +6698,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg {0}mmHg + + मर्करीको + मर्करीको {0} + मर्करीको {0} + {0}psi {0}psi @@ -6464,18 +6727,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} km/h {0} km/h - - {0} mi/h - {0} mi/h - B{0} B{0} °से - {0}° - {0}° {0}K @@ -6487,11 +6744,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} km³ - {0} km³ - - - {0} घन माईल - {0} घन माईल + {0}घन कि.मि. {0}ML @@ -6517,6 +6770,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mc {0}mc + + {0} fl oz m. + {0} fl oz m. + {0}bu {0}bu @@ -6525,6 +6782,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}dsp {0}dsp + + इम्पिरियल डेजर्ट चम्चा + {0}इम्पिरियल डेजर्ट चम्चा + {0} इम्पिरियल डेजर्ट चम्चा + {0}fl.dr. {0}fl.dr. @@ -6533,26 +6795,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt-Imp. {0}qt-Imp. - - प्रकाश - {0}प्रकाश - {0}प्रकाशा + + काट + {0} काट + {0} काट - + + क्याल-IT + + {0}ppb {0}ppb - रात {0}रात {0}रात - {0}/रात - {0},{1} + {0}, {1} {0} र {1} {0} र {1} @@ -6565,15 +6828,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}, {1} - {0},{1} + {0}, {1} {0} {1} - {0}{1} + {0} {1} {0} {1} - {0},{1} + {0}, {1} {0} {1} diff --git a/make/data/cldr/common/main/nl.xml b/make/data/cldr/common/main/nl.xml index 1de3fa015a9..457195e687b 100644 --- a/make/data/cldr/common/main/nl.xml +++ b/make/data/cldr/common/main/nl.xml @@ -37,7 +37,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oudengels Obolo Angika - Levantijns-Arabisch + Levantijns-Arabisch Arabisch modern standaard Arabisch Aramees @@ -87,6 +87,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kom Siksika Anii + Tai Dam Bambara Bengaals Tibetaans @@ -122,6 +123,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chipewyan Cherokee Cheyenne + Chickasaw Soranî Koerdisch, Soranî Koerdisch, Soranî @@ -240,6 +242,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hiligaynon Hettitisch Hmong + Hmong Njua Hiri Motu Kroatisch Oppersorbisch @@ -287,6 +290,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tyap Makonde Kaapverdisch Creools + Qʼeqchiʼ Kenyang Koro Kongo @@ -321,6 +325,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Kölsch Koerdisch + Koerdisch + Kurmanci Koemuks Kutenai Komi @@ -412,7 +418,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Noors - Bokmål Noord-Ndebele Nedersaksisch - Nederduits + Nederduits Nepalees Newari Ndonga @@ -592,6 +598,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Turks Turoyo Taroko + Torwali Tsonga Tsakonisch Tsimshian @@ -663,8 +670,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - + + @@ -672,11 +679,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - + + - + + @@ -687,33 +695,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + - + - - + + - + - - + + + - - + + - + + @@ -723,29 +733,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + - + - + - + - - + + - + + @@ -756,44 +767,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - + + - - + + - + - - - + + + - + - + - - - - + + + + - + + - + - - - + + + @@ -809,19 +821,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + - - - + + + + - - - - + + + + + @@ -834,6 +848,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + @@ -842,19 +857,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + - - + + - + @@ -949,7 +967,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colombia Clipperton - Sark + Sark Costa Rica Cuba Kaapverdië @@ -1305,35 +1323,56 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numeriek sorteren Sorteervoorrang valuta + Emoji-presentatie uursysteem (12 of 24) stijl regelafbreking + Regelafbreking binnen woorden maatsysteem cijfers + Zinsafbreking na afk. Tijdzone Landvariant Privégebruik Boeddhistische kalender + Boeddhistisch Chinese kalender + Chinees Koptische kalender + Koptisch Dangi-kalender + Dangi Ethiopische kalender + Ethiopisch Ethiopische Amete Alem-kalender + Ethiopische Amete Alem Gregoriaanse kalender + Gregoriaans Hebreeuwse kalender + Hebreeuws Indiase nationale kalender + Indiaas nationaal Islamitische kalender + Islamitisch Islamitische kalender (cyclisch) + Islamitisch (cyclisch) Islamitische kalender (Saudi–Arabië) Islamitische kalender (epoche) + Hijri (tabulair, astronomische epoche) Islamitische kalender (Umm al-Qura) + Islamitisch (Umm al-Qura) ISO-8601-kalender Japanse kalender + Japans Perzische kalender + Perzisch Kalender van de Chinese Republiek + van de Chinese Republiek financiële valutanotatie + financieel standaard valutanotatie + standaard Symbolen sorteren Sorteren zonder symbolen Normaal sorteren op accenten @@ -1343,23 +1382,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Eerst sorteren op hoofdletters Niet hoofdlettergevoelig sorteren Hoofdlettergevoelig sorteren - Traditioneel-Chinese sorteervolgorde - Big5 vorige sorteervolgorde, voor compatibiliteit + Compatibiliteit Woordenboeksorteervolgorde + Woordenboek standaard Unicode-sorteervolgorde + standaard Unicode emojisorteervolgorde Europese sorteerregels - Vereenvoudigd-Chinese sorteervolgorde - GB2312 Telefoonboeksorteervolgorde + Telefoonboek Fonetische sorteervolgorde + Fonetisch Pinyinsorteervolgorde + Pinyin algemeen zoeken + zoeken Zoeken op eerste Hangul-medeklinker standaard sorteervolgorde + standaard Streeksorteervolgorde + streek Traditionele sorteervolgorde + traditioneel Sorteervolgorde radicalen/strepen + radicalen/strepen Zhuyinvolgorde + Zhuyin Zonder normalisatie sorteren Unicode genormaliseerd sorteren Cijfers afzonderlijk sorteren @@ -1372,18 +1421,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Volledige breedte Halve breedte Numeriek + standaard + emoji + tekst 12-uursysteem (0-11) + 12 (0–11) 12-uursysteem (1-12) + 12 (1–12) 24-uursysteem (0-23) + 24 (0–23) 24-uursysteem (1-24) + 24 (1–24) losse stijl regelafbreking + los normale stijl regelafbreking + normaal strikte stijl regelafbreking + strikt + breek alles af + behoud alles + normaal + behoud in zinnen BGN UNGEGN metriek stelsel + metriek Brits imperiaal stelsel + VK Amerikaans imperiaal stelsel + VS Ahom cijfers Arabisch-Indische cijfers uitgebreide Arabisch-Indische cijfers @@ -1469,6 +1535,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Vai cijfers Warang Citi cijfers Wancho cijfers + uit + aan metriek @@ -1569,14 +1637,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -1742,10 +1802,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ U - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1756,54 +1812,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - - - MM-dd – MM-dd - MM-dd – MM-dd - - - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E - - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - - - y-MM – y-MM - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - - - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - U MMM – U MMM - - - U MMM d – MMM d - U MMM d – U MMM d - - - U MMM d, E – MMM d, E - U MMM d, E – MMM d, E - U MMM d, E – U MMM d, E - - - U MMMM – U MMMM - @@ -1870,14 +1878,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -1956,14 +1956,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQ r (U) QQQQ r (U) - - - h B – h B - - - h:mm B – h:mm B - - @@ -1986,16 +1978,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - tijdperk 0 - tijdperk 1 - - - era 0 - era 1 - - @@ -2039,26 +2021,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - - - - - tijdperk 0 - - - era 0 - - - @@ -2091,6 +2055,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -2099,6 +2066,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -2116,7 +2086,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d y G + M/y G d/M/y GGGGG + E d/M/y G MMM y G d MMM y G E d MMM y G @@ -2448,6 +2420,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -2456,6 +2431,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'om' {0} + + {1} 'om' {0} + @@ -2470,7 +2448,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d y G + M/y G d/M/y GGGGG + E d/M/y G MMM y G d MMM y G E d MMM y G @@ -2661,14 +2641,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d MMM y - - - h B – h B - - - h:mm B – h:mm B - - @@ -2733,14 +2705,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -2824,14 +2788,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -2929,14 +2885,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -2983,14 +2931,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -3043,14 +2983,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} - - - h B – h B - - - h:mm B – h:mm B - - @@ -3558,11 +3490,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zomertijd in {0} standaardtijd in {0} - - HST - HST - HDT - Honolulu @@ -3573,21 +3500,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ onbekende stad - - Tirana - Jerevan - - Río Gallegos - - - Tucumán - - - Córdoba - Wenen @@ -3603,18 +3518,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Cuiabá - - - Belém - - - São Paulo - - - Maceió - Saint John’s @@ -3705,7 +3608,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bisjkek - Enderbury + Kanton Saint Kitts @@ -3740,18 +3643,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldiven - - Mazatlán - Mexico-Stad Cancun - - Nouméa - Marquesaseilanden @@ -3803,9 +3700,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riyad - - Mahé - Khartoem @@ -3818,9 +3712,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Beneden Prinsen Kwartier - - Lomé - Doesjanbe @@ -3886,9 +3777,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - West-Afrikaanse tijd - West-Afrikaanse standaardtijd - West-Afrikaanse zomertijd + West-Afrikaanse tijd @@ -4295,6 +4184,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ GMT + + + Groenlandse tijd + Groenlandse standaardtijd + Groenlandse zomertijd + + Oost-Groenlandse tijd @@ -4324,6 +4220,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyaanse tijd + + + Hawaii-Aleoetische standaardtijd + + + HAST + + Hawaii-Aleoetische tijd @@ -4331,9 +4235,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hawaii-Aleoetische zomertijd - HAT - HAST - HADT + HAT + HAST + HADT @@ -4779,6 +4683,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuukse tijd + + + Turkse tijd + Turkse standaardtijd + Turkse zomertijd + + Turkmeense tijd @@ -4931,14 +4842,247 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + ¤ #,##0.00;¤ -#,##0.00 - #,##0.00 + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) @@ -4965,6 +5109,259 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;¤ -#,##0.00 + #,##0.00 + + + ¤ #,##0.00;(¤ #,##0.00) + + + Andorrese peseta @@ -5927,6 +6324,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabwaanse dollar + + Zimbabwe Gold + Zimbabwe Gold + Zimbabwe Gold + ZiG + Zimbabwaanse dollar (2009) @@ -6178,11 +6581,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ neuter onderdelen - {0} ond. + {0} onderdeel {0} onderdelen - + + deel + {0} deel + {0} delen + + common + parts per million + {0} part per million + {0} parts per million neuter @@ -6203,6 +6614,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ common + + {0} glucose + {0} glucose + common liter per kilometer @@ -6793,6 +7208,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimeter-kwikdruk {0} millimeter-kwikdruk + + kwik + {0} kwik + {0} kwik + inch-kwikdruk {0} inch-kwikdruk @@ -6985,6 +7405,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrische cup {0} metrische cup + + metrische fluid ounces + {0} metrische fluid ounce + {0} metrische fluid ounces + acre-feet {0} acre-foot @@ -7089,20 +7514,82 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. quart {0} imp. quarts + + ste­ra­diaal + {0} ste­ra­diaal + {0} ste­ra­dialen + + + katal + {0} katal + {0} katals + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry's + + + siemens + {0} siemens + {0} siemens + + + calorieën [IT] + {0} calorie [IT] + {0} calorieën [IT] + + + becquerel + {0} becquerel + {0} becquerels + + + sievert + {0} sievert + {0} sieverts + + + gray + {0} gray + {0} gray + + + kilogramkracht + {0} kilogramkracht + {0} kilogramkracht + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + neuter - licht - {0} licht - {0} licht - + common + parts per billion + {0} part per billion + {0} parts per billion common - nachten - {0} nacht - {0} nachten {0} per nacht @@ -7173,12 +7660,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ond. {0} ond. + + deel + {0} deel + {0} delen + + + parts/million + procent promille + + Glc + l/km {0} l/km @@ -7448,11 +7946,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. qt {0} imp. qt + + cal-IT + licht {0} licht {0} licht + + parts/billion + nachten {0} nacht @@ -7487,9 +7991,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/in² + + deel + {0} deel + {0} delen + % + + Glc + {0} m/gUK {0} m/gUK @@ -7606,17 +8118,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} sn {0} sn + + cal-IT + - licht {0}licht {0}licht - - nachten - {0} nacht - {0} nachten - {0}/nacht - diff --git a/make/data/cldr/common/main/nmg.xml b/make/data/cldr/common/main/nmg.xml index b3caea650a8..48985090177 100644 --- a/make/data/cldr/common/main/nmg.xml +++ b/make/data/cldr/common/main/nmg.xml @@ -555,6 +555,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/nn.xml b/make/data/cldr/common/main/nn.xml index 781763020eb..2fc5a6814df 100644 --- a/make/data/cldr/common/main/nn.xml +++ b/make/data/cldr/common/main/nn.xml @@ -79,7 +79,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sørleg tutchone tivi tokelau - tswana tonga (Nyasa) nordleg tutchone tuvalu @@ -205,14 +204,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic normalisert sortering numerisk sortering sorteringsstyrke + emojivising lineskiftstil + lineskift innanfor ord tal valutaformat for rekneskapsføring - tradisjonell kinesisk sortering + rekneskapsføring standard Unicode-sorteringsrekkjefølgje - forenkla kinesisk sortering pinyin-sortering standard sorteringsrekkjefølgje full breidd @@ -222,8 +222,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 24-timarssystem (0–23) 24-timarssystem (1–24) laus lineskiftstil + laus normal lineskiftstil streng lineskiftstil + behald alle + behald i fraser arabisk-indiske siffer utvida arabisk-indiske siffer armenske tal @@ -270,15 +273,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - - - E d.–E d. MMM y G - - - - @@ -392,7 +386,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 'kl'. HH:mm:ss zzzz + HH:mm:ss zzzz 'kl'. HH.mm.ss zzzz @@ -550,15 +544,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic v. - - om {0} v. - om {0} v. - - - for {0} v. sidan - for {0} v. sidan - - veka med {0} veke i månaden @@ -935,9 +920,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ukjend by - - Cuiaba - Kokosøyane @@ -972,9 +954,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yangôn - - Khovd - Maldivane @@ -992,13 +971,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic austafrikansk tid - - - vestafrikansk tid - vestafrikansk standardtid - vestafrikansk sommartid - - alaskisk tid @@ -1922,8 +1894,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic gammalt sudansk pund gamle sudanske pund + + sierraleonsk leone + sierraleonske leonar + sierraleonsk leone (1964—2022) + sierraleonsk leone (1964–2022) + sierraleonske leonar (1964–2022) sovjetiske rublar @@ -2142,7 +2120,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} element {0} elements - + + delar + {0} del + {0} delar + + delar per million {0} del per million {0} del per millions @@ -2363,7 +2346,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic feminine - jordmassar {0} jordmasse {0} jordmassar @@ -2421,6 +2403,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metriske koppar {0} metriske koppars + + metriske væskeunsar + {0} metrisk væskeunse + {0} metriske væskeunsar + {0} bushel {0} bushels @@ -2469,6 +2456,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic feminine + + steradianar + {0} steradian + {0} steradianar + + + kaloriar [IT] + {0} kalori [IT] + {0} kaloriar [IT] + + + delar per milliard + {0} del per milliard + {0} del per milliards + {0} delar per milliard + {0} delar per milliards + feminine @@ -2694,7 +2698,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} b. quart {0} b. quart - + delar/milliard diff --git a/make/data/cldr/common/main/no.xml b/make/data/cldr/common/main/no.xml index 6f4c4cd9c0e..b1112090dd3 100644 --- a/make/data/cldr/common/main/no.xml +++ b/make/data/cldr/common/main/no.xml @@ -121,6 +121,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ chipewiansk cherokesisk cheyenne + chickasaw sentralkurdisk kurdisk (sentral) kurdisk (sorani) @@ -320,6 +321,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kølnsk kurdisk + kurdisk + kurmanji kumykisk kutenai komi @@ -927,7 +930,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kina Colombia Clippertonøya - Sark + Sark Costa Rica Cuba Kapp Verde @@ -1237,35 +1240,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Numerisk sortering Sorteringsstyrke valuta + emojivisning timesyklus (12 eller 24) linjeskiftstil + linjeskift innenfor ord målesystem tall + Ny setning etter fork. tidssone språkvariant privat bruk buddhistisk kalender + buddhistisk kinesisk kalender + kinesisk koptisk kalender + koptisk dangisk kalender + dangisk etiopisk kalender + etiopisk etiopisk amete-alem-kalender + etiopisk amete-alem gregoriansk kalender + gregoriansk hebraisk kalender + hebraisk indisk nasjonalkalender hijrikalender + hijri hijrikalender (tabell, sivil) + hijri (tabell, sivil) islamsk kalender (Saudi-Arabia, observasjon) islamsk kalender (tabell, astronomisk) hijrikalender (Umm al-Qura) + hijri (Umm al-Qura) ISO 8601-kalender japansk kalender + japansk persisk kalender + persisk minguo-kalender + minguo valutaformat for regnskapsføring + regnskapsføring standard valutaformat + standard sortér symboler Ignorer symboler under sortering sortér aksenttegn normalt @@ -1275,23 +1297,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sortér store bokstaver først Sortér uavhengig av store og små bokstaver. Sortér med skille mellom små og store bokstaver - tradisjonell kinesisk sortering - Big 5 forrige sorteringsrekkefølge (for kompatibilitet) + kompatibilitet ordlistesortering + ordliste standard Unicode-sorteringsrekkefølge + standard Unicode emoji-sorteringsrekkefølge sorteringsrekkefølge for flerspråklige europeiske dokumenter - forenklet kinesisk sortering - GB2312 telefonkatalogsortering + telefonkatalog fonetisk sortering + fonetisk pinyinsortering + pinyin generelt søk + søk Søk etter første konsonant i hangul standard sorteringsrekkefølge + standard streksortering + strek tradisjonell sortering + tradisjonell radikal-strek-sortering + radikal-strek zhuyin-sortering + zhuyin Sortér uten normalisering Sortér Unicode normalisert Sortér sifre individuelt @@ -1304,18 +1336,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ full bredde halv bredde Numerisk + standard + emoji + tekst 12-timers system (0–11) + 12 (0–11) 12-timers system (1–12) + 12 (1–12) 24-timers system (0–23) + 24 (0–23) 24-timers system (1–24) + 24 (1–24) løs linjeskiftstil + løs normal linjeskiftstil + normal streng linjeskiftstil + streng + bryt alle + behold alle + normal + behold i fraser USBGN-translitterasjon UNGEGN-translitterasjon metrisk system + metrisk britisk målesystem + britisk amerikansk målesystem + amerikansk arabisk-indiske sifre utvidede arabisk-indiske sifre armenske tall @@ -1381,6 +1430,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tangsa-sifre Tradisjonelle tall vai-sifre + av + metrisk @@ -1540,7 +1591,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a - h–h a h:mm a–h:mm a @@ -1554,7 +1604,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a v - h–h a v MM.–MM. @@ -1630,20 +1679,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 0. tidsalder - 1. tidsalder - - - 0. t.a. - 1. t.a. - - - TA0 - TA1 - - @@ -1675,20 +1710,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 0. tidsalder - 1. tidsalder - - - 0. t.a. - 1. t.a. - - - TA0 - TA1 - - @@ -1700,19 +1721,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - - 0. tidsalder - - - 0. t.a. - - - TA0 - - - @@ -1745,6 +1753,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1753,6 +1764,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -1770,13 +1784,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G - dd.MM.y GGGGG + M.y G + dd.MM.y G + E d.M.y G MMM y G d. MMM y G E d. MMM y G - h a + H h:mm a h:mm:ss a + HH't' v L. d.M. E d.M @@ -1848,7 +1865,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1862,7 +1878,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M.–M. @@ -2176,6 +2191,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -2184,6 +2202,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'kl'. {0} + + {1} 'kl'. {0} + @@ -2203,15 +2224,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm:ss a E 'kl'. HH:mm:ss y G - dd.MM.y GGGGG + M.y G + d.M.y G + E d.M.y G MMM y G d. MMM y G E d. MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH v L. d.M. E d.M. @@ -2285,7 +2308,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a - h–h a + + + HH–HH 't' h:mm a–h:mm a @@ -2299,7 +2324,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a v - h–h a v M.–M. @@ -3195,11 +3219,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sommertid – {0} normaltid – {0} - - HST - HST - HDT - Honolulu @@ -3210,18 +3229,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ukjent by - - Tirana - Jerevan - - Tucumán - - - Córdoba - Wien @@ -3231,24 +3241,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saint-Barthélemy - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - Thimpu @@ -3261,12 +3253,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Påskeøya - - Ürümqi - - - Bogotá - Kapp Verde @@ -3279,9 +3265,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praha - - Büsingen - København @@ -3294,9 +3277,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kairo - - El Aaiún - Kanariøyene @@ -3350,9 +3330,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bisjkek - Enderbury - - Kantonøya @@ -3376,9 +3353,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Luxemburg - - Chișinău - Ulan Bator @@ -3391,9 +3365,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mexico by - - Nouméa - Norfolkøya @@ -3439,15 +3410,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kamtsjatka - - Mahé - Damaskus - - Lomé - Dusjanbe @@ -3504,9 +3469,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - vestafrikansk tid - vestafrikansk normaltid - vestafrikansk sommertid + vestafrikansk tid @@ -3942,6 +3905,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ guyansk tid + + + normaltid for Hawaii og Aleutene + + + HAST + + tidssone for Hawaii og Aleutene @@ -4587,9 +4558,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4597,9 +4572,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4607,9 +4586,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4617,9 +4600,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4627,9 +4614,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4637,9 +4628,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4647,9 +4642,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4657,9 +4656,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4667,9 +4670,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4677,9 +4684,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4687,9 +4698,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4697,9 +4712,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4707,9 +4726,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4717,9 +4740,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4727,9 +4754,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4737,9 +4768,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4747,9 +4782,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4757,9 +4796,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4767,39 +4810,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤;-#,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + #,##0.00 ¤ #,##0.00;(¤ #,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) - ¤ 0k - ¤ 0k - ¤ 00k - ¤ 00k - ¤ 000k - ¤ 000k - ¤ 0 mill'.' - ¤ 0 mill'.' - ¤ 00 mill'.' - ¤ 00 mill'.' - ¤ 000 mill'.' - ¤ 000 mill'.' - ¤ 0 mrd'.' - ¤ 0 mrd'.' - ¤ 00 mrd'.' - ¤ 00 mrd'.' - ¤ 000 mrd'.' - ¤ 000 mrd'.' - ¤ 0 bill'.' - ¤ 0 bill'.' - ¤ 00 bill'.' - ¤ 00 bill'.' - ¤ 000 bill'.' - ¤ 000 bill'.' + 0k ¤ + 0k ¤ + 00k ¤ + 00k ¤ + 000k ¤ + 000k ¤ + 0 mill'.' ¤ + 0 mill'.' ¤ + 00 mill'.' ¤ + 00 mill'.' ¤ + 000 mill'.' ¤ + 000 mill'.' ¤ + 0 mrd'.' ¤ + 0 mrd'.' ¤ + 00 mrd'.' ¤ + 00 mrd'.' ¤ + 000 mrd'.' ¤ + 000 mrd'.' ¤ + 0 bill'.' ¤ + 0 bill'.' ¤ + 00 bill'.' ¤ + 00 bill'.' ¤ + 000 bill'.' ¤ + 000 bill'.' ¤ @@ -4807,9 +4852,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4817,9 +4866,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4827,9 +4880,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4837,9 +4894,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4847,9 +4908,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4857,9 +4922,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4867,9 +4936,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4877,9 +4950,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4887,9 +4964,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4897,9 +4978,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4907,9 +4992,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4917,9 +5006,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4927,9 +5020,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4937,9 +5034,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4947,9 +5048,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4957,9 +5062,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4967,9 +5076,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4977,9 +5090,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4987,9 +5104,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -4997,9 +5118,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -5007,9 +5132,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -5017,9 +5146,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -6406,6 +6539,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ østkaribiske dollar XCD + + karibiske gylden + karibisk gylden + karibiske gylden + spesielle trekkrettigheter spesiell trekkrettighet @@ -6532,6 +6670,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabwisk dollar (1980–2008) zimbabwiske dollar (1980–2008) + + zimbabwiske gull + zimbabwisk gull + zimbabwiske gull + zimbabwisk dollar (2009) zimbabwisk dollar (2009) @@ -6957,7 +7100,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0} items - + + deler + {0} del + {0} deler + + masculine deler per million {0} del per million @@ -6993,6 +7141,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} mols + + glukose + {0} glukose + {0} glukose + masculine liter per kilometer @@ -7691,6 +7844,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} millimeter kvikksølv {0} millimeter kvikksølvs + + kvikksølv + {0} kvikksølv + {0} kvikksølv + pund per kvadrattomme {0} pund per kvadrattomme @@ -7944,6 +8102,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metriske kopper {0} metriske koppers + + metriske væskeunser + {0} metrisk væskeunse + {0} metriske væskeunser + {0} acre-fot {0} acre-fot @@ -8037,7 +8200,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - {0} klyper + {0} klype {0} klyper @@ -8046,15 +8209,79 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} britisk quart {0} britiske quart + + steradianer + {0} steradian + {0} steradianer + + + katal + {0} katal + {0} katal + + + coulomb + {0} coulomb + {0} coulomb + + + farad + {0} farad + {0} farad + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + kalorier [IT] + {0} kalori [IT] + {0} kalorier [IT] + + + becquerel + {0} becquerel + {0} becquerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + kilopond + {0} kilopond + {0} kilopond + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + neuter - lys {0} lys {0} lys' {0} lys {0} lys' - + masculine deler per milliard {0} del per milliard @@ -8064,7 +8291,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - netter {0} natt {0} natts {0} netter @@ -8136,6 +8362,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmol/l {0} mmol/l + + del + {0} del + {0} del + prosent {0} % @@ -8151,6 +8382,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glk + {0} Glk + {0} Glk + liter/km {0} l/km @@ -8547,7 +8783,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ klype - {0} klyper + {0} klype {0} klyper @@ -8555,14 +8791,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. quart {0} imp. quart + + cal-IT + + + kp + {0} kp + {0} kp + lys {0} lys {0} lys - - deler/milliard - netter {0} natt @@ -8643,7 +8884,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmol/l {0}mmol/l - + + del + {0} del + {0} del + + {0}ppm {0}ppm @@ -8666,6 +8912,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mol {0}mol + + Glk + {0} Glk + {0} Glk + l/km {0}l/km @@ -9096,21 +9347,23 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt. Imp. {0} qt. Imp. + + cal-IT + + + kp + {0} kp + {0} kp + - lys {0}lys {0}lys - + + ppb {0}ppb {0}ppb - - netter - {0} natt - {0} netter - {0}/natt - {0}Ø {0}N diff --git a/make/data/cldr/common/main/nqo.xml b/make/data/cldr/common/main/nqo.xml index 035bcb49c1b..6fb67d952cb 100644 --- a/make/data/cldr/common/main/nqo.xml +++ b/make/data/cldr/common/main/nqo.xml @@ -1710,7 +1710,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ߔߑߣߐ߲߫ ߔߍ߲߫ - + ߞߊ߲ߕߐ߲߫ @@ -2380,9 +2380,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ߝߘߊ߬ߝߌ߲߬ߠߊ߫ ߕߟߋ߬ߓߋ ߕߎ߬ߡߊ߬ߙߋ߲ - ߝߘߊ߬ߝߌ߲߬ߠߊ߫ ߕߟߋ߬ߓߋ ߕߎ߬ߡߊ߬ߙߋ߲ ߢߊߓߘߍ - ߝߘߊ߬ߝߌ߲߬ߠߊ߫ ߕߟߋ߬ߓߋ ߕߟߋ߬ߡߊ߬ ߕߎߡߊߙߋ߲ + ߝߘߊ߬ߝߌ߲߬ߠߊ߫ ߕߟߋ߬ߓߋ ߕߎ߬ߡߊ߬ߙߋ߲ @@ -2732,6 +2730,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ߜ߭ߎߦߣߊ߫ ߕߎ߬ߡߊ߬ߘߊ + + + ߤߥߊߦ - ߊߟߋߦߎߕߌߦߊ߲߫ ߕߎ߬ߡߘߊ߬ ߛߎߡߊ߲ߘߊ߲ߕߊ + + ߤߥߊߦ - ߊߟߋߦߎߕߌߦߊ߲߫ ߕߎ߬ߡߊ߬ߘߊ diff --git a/make/data/cldr/common/main/nso.xml b/make/data/cldr/common/main/nso.xml index 83e2ad877e0..39fb2b0f8a7 100644 --- a/make/data/cldr/common/main/nso.xml +++ b/make/data/cldr/common/main/nso.xml @@ -35,30 +35,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic [c q v z] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] - - - - - - - Phere - Dibo - Hlak - Mora + Jan + Feb + Mat + Apo Mei - June - Mose - Agosetose - Lewe - Dipha - Diba - Manth + Jun + Jul + Ago + Sep + Okt + Nof + Dis Janeware @@ -127,6 +121,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + Kotara 1 + Kotara 2 + Kotara 3 + Kotara 4 + 1st Kotara 2nd Kotara @@ -227,6 +227,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm a v 'beke' W 'ya' MMM 'beke' 'ya' 'bo' W 'ya' MMM + dd-MM-y + d MMM y 'beke' 'ya' 'bo' w 'ya' Y 'beke' 'ya' 'bo' w 'ya' Y @@ -297,6 +299,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + ngwaga wa go feta + ngwaga wo + ngwaga wo o tlago + + + kgwedi ye e fetilego + kgwedi ye + kgwedi ye e tlago + + + beke ye e fetilego + beke ye + beke ye e tlago + + + maabane + lehono + gosasa + + + LaMorena le fetilego + LaMorena le + LaMorena le latelago + + @@ -306,9 +335,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - -   - diff --git a/make/data/cldr/common/main/oc.xml b/make/data/cldr/common/main/oc.xml index 869bf9b9931..70f3943ab2a 100644 --- a/make/data/cldr/common/main/oc.xml +++ b/make/data/cldr/common/main/oc.xml @@ -576,7 +576,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd @@ -1231,9 +1231,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ora d’Africa occidentala - ora estandarda d’Africa occidentala - ora d’estiu d’Africa occidentala + ora d’Africa occidentala @@ -1583,6 +1581,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ora de la Guayana + + + ora estandarda de Hawai-Aleutianes + + ora de Hawai-Aleutianes @@ -2226,168 +2229,252 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} @@ -2396,210 +2483,316 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ #,##0.00¤;(#,##0.00¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) 0K¤ + 0K ¤ 00K¤ + 00K ¤ 000K¤ + 000K ¤ 0M¤ + 0M ¤ 00M¤ + 00M ¤ 000M¤ + 000M ¤ 0G¤ + 0G ¤ 00G¤ + 00G ¤ 000G¤ + 000G ¤ 0T¤ + 0T ¤ 00T¤ + 00T ¤ 000T¤ + 000T ¤ {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} + + #,##0.00 ¤ + - #,##0.00 + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) {0} {1} @@ -3500,7 +3693,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimòls per litres {0} milimòls per litres - + partidas per milions {0} partidas per milions diff --git a/make/data/cldr/common/main/oc_ES.xml b/make/data/cldr/common/main/oc_ES.xml index df686405e32..e0377e605c0 100644 --- a/make/data/cldr/common/main/oc_ES.xml +++ b/make/data/cldr/common/main/oc_ES.xml @@ -27,7 +27,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic espanhòu latinoamerican espanhòu d’Espanha espanhòu de Mexic - finés francés canadienc francés suís hindi (latin) @@ -41,7 +40,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic tailandés lengua desconeishuda chinés mandarin - shinés simplificat chinés tradicionau chinés mandarin tradicionau @@ -50,7 +48,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - @@ -68,7 +65,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nòrt America Asia orientau Asia meridionau - Sudèst aisatic + Sudèst asiatic Euròpa meridionau Australasia Region de Micronesia @@ -241,7 +238,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic … {0} [''’ ՚ ᾽᾿ ʼ ߴ] - [££ ₤] [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -475,6 +471,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + G + H + M + A + M + J + J + A + S + O + N + D + gèr hereuèr @@ -645,9 +655,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic h B h:mm B - h:mm:ss B E h:mm B - E h:mm:ss B E d E h:mm a E, H:mm @@ -877,9 +885,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ciutat desconeishuda - - Tirana - Ereván @@ -965,7 +970,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Santiago de Chile - Ürümqi + Urumqui Bogotá @@ -979,9 +984,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Cabo Verde - - Curaçao - Nadau @@ -1062,9 +1064,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tokio - - Comores - Sant Cristòbal @@ -1086,6 +1085,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kyzylorda + + Vientian + Santa Lucía @@ -1095,6 +1097,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Trípoli + + Chisinau + Skopie @@ -1140,6 +1145,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Catar + + Reunion + Bucarest @@ -1173,9 +1181,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Riad - - Mahé - Jartum @@ -1206,9 +1211,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Yamena - - Lomé - Dusambé @@ -1230,6 +1232,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Simferòpol + + Isla Wake + Beulah, Dakota deth Nòrd @@ -1260,6 +1265,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ciutat Ho Chi Minh + + Wallis e Furtuna + ora d’Africa central @@ -1272,9 +1280,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ora d’Africa occidentau - ora esdandard d’Africa occidentau - ora d’estiu d’Africa occidentau + ora d’Africa occidentau @@ -1558,6 +1564,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ora de Guyana + + + ora estandard de Hawai-Aleutianes + + ora de Hawai-Aleutianes @@ -1632,6 +1643,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ora d’estiu de Japon + + + ora de Kazajistan + + ora de Kazajistan orientau @@ -2103,6 +2119,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2110,6 +2128,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2117,6 +2137,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2124,6 +2146,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2131,6 +2155,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2138,6 +2164,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2145,6 +2173,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2152,6 +2182,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2159,6 +2191,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2166,6 +2200,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2173,6 +2209,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2180,6 +2218,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2187,6 +2227,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2194,6 +2236,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2201,6 +2245,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2208,6 +2254,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2215,6 +2263,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2222,6 +2272,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2229,6 +2281,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2236,6 +2290,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2243,6 +2299,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2250,6 +2308,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2257,6 +2317,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2264,6 +2326,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2271,6 +2335,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2278,6 +2344,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2285,6 +2353,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2292,6 +2362,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2299,6 +2371,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2306,6 +2380,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2313,6 +2389,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2320,6 +2398,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2327,6 +2407,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2334,6 +2416,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2341,6 +2425,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2348,6 +2434,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2355,6 +2443,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2362,6 +2452,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2369,6 +2461,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2376,6 +2470,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2383,6 +2479,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2390,6 +2488,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2397,6 +2497,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2404,6 +2506,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 @@ -2411,6 +2515,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00¤ + #,##0.00 ¤ + #,##0.00 diff --git a/make/data/cldr/common/main/oka.xml b/make/data/cldr/common/main/oka.xml new file mode 100644 index 00000000000..a0cc05ef8e2 --- /dev/null +++ b/make/data/cldr/common/main/oka.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + n̓səl̓xcin̓ + + + + [aá {aˤ}{áˤ} c{c̓}č ə ɣ h ií ɪ{ɪ́} k{k̓} {kʷ}{k̓ʷ} l{l̓} ɬ {ƛ̓} m{m̓} n{n̓} p{p̓} q{q̓} {qʷ}{q̓ʷ} r s t{t̓} uú w{w̓} x{x̌} {xʷ}{x̌ʷ} y{y̓} ʔ ʕ{ʕ̓} {ʕʷ}{ʕ̓ʷ}] + [b d e f g j o v z] + [\- ‑ , ; \: ! ? . '‘’ "“” ( ) \[ \] @ * / \& #] + + diff --git a/make/data/cldr/common/main/oka_CA.xml b/make/data/cldr/common/main/oka_CA.xml new file mode 100644 index 00000000000..3035f46d11e --- /dev/null +++ b/make/data/cldr/common/main/oka_CA.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/oka_US.xml b/make/data/cldr/common/main/oka_US.xml new file mode 100644 index 00000000000..5c3c4b73808 --- /dev/null +++ b/make/data/cldr/common/main/oka_US.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/om.xml b/make/data/cldr/common/main/om.xml index 6416d60b7c5..fe0c3d5b9ad 100644 --- a/make/data/cldr/common/main/om.xml +++ b/make/data/cldr/common/main/om.xml @@ -537,21 +537,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic H Q - - Fulbaana - Guraandhala - Sadaasa - Mudde - Amajji - Waxabajjii - Bitootessa - Eebila - Caamsaa - Onkoloolessa - Adoolessa - Hagayya - Qaam’ee - @@ -602,17 +587,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} - - {1}, {0} - {1}, {0} - - {1}, {0} - y G @@ -752,20 +731,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sadaasa Mud - - A - G - B - E - C - W - A - H - F - O - S - M - Amajjii Guraandhala @@ -782,20 +747,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Ama - Gur - Bitootessa - Elb - Cam - Wax - Ado - Hag - Ful - Onk - Sadaasa - Mud - A G @@ -810,20 +761,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic S M - - Amajjii - Guraandhala - Bitootessa - Eebila - Caamsaa - Waxabajjii - Adoolessa - Hagayya - Fulbaana - Onkoloolessa - Sadaasa - Mudde - @@ -837,24 +774,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Jim San - - D - W - K - R - K - J - S - - - Dil - Wix - Kib - Rob - Kam - Jim - San - Dilbata Wiixata @@ -866,15 +785,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Dil - Wix - Kib - Rob - Kam - Jim - San - D W @@ -884,24 +794,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic J S - - Dil - Wix - Kib - Rob - Kam - Jim - San - - - Dilbata - Wiixata - Kibxata - Roobii - Kamisa - Jimaata - Sanbata - @@ -919,20 +811,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kurmaana 4ffaa - - - K1 - K2 - K3 - K4 - - - Kurmaana 1ffaa - Kurmaana 2ffaa - Kurmaana 3ffaa - Kurmaana 4ffaa - - @@ -957,9 +835,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dh - BWD B - BW @@ -1034,17 +910,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} - - {1}, {0} - {1}, {0} - - {1}, {0} - E h:mm a @@ -1052,7 +922,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1116,7 +985,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h a – h a  - h–h a h:mm a – h:mm a @@ -1128,10 +996,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M – M @@ -1143,11 +1007,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, M/d – E, M/d E, M/d – E, M/d - - MMM d – MMM d - - MMM d, E – MMM d, E E, MMM d – E, MMM d @@ -1190,12 +1050,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic bara - - bara - - - bara - waggaa waggaa darbe @@ -1226,9 +1080,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic wg - wg. darbe - wg. kana - wg. dhufu w {0} keessatti w {0} keessatti @@ -1310,9 +1161,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ji - ji. darbe - ji. kana - ji. dhufu ji {0} keessatti ji {0} keessatti @@ -1350,13 +1198,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic tr. {0} darbe tr. {0} darbe - torban {0} tr - tr. darbe - tr. kana - tr. dhufu w {0} keessatti w {0} keessatti @@ -1365,7 +1209,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic w {0} darbe w {0} darbe - torban {0} torbrr ji’aa @@ -1390,25 +1233,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic guyyoota {0} darban - - guyyaa - kaleessa - har’a - boru - - guyyaa {0} keessatti - guyyoota {0} keessatti - - - guyyaa {0} darbe - guyyoota {0} darban - - - guyyaa - kaleessa - har’a - boru g {0} keessatti g {0} keessatti @@ -1424,27 +1249,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic guyyaa kan wg. - - guyyaa kan wg. - guyyaa kan torbee guyyaa kan tr. - - guyyaa kan tr. - guyyaatorbee kan ji’aa gytr. kan ji. - - gytr. kan ji. - Dilbata darbe Dilbata kana @@ -1718,15 +1534,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic sa {0} dura - - WD/WB - WD/WB - - WD/WB - sa’aatii sa’aatii kana @@ -1741,7 +1551,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sa. - sa’aatii kana sa. {0} keessatti sa. {0} keessatti @@ -1753,7 +1562,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sa - sa’aatii kana h {0} keessatti h {0} keessatti @@ -1788,7 +1596,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dq - daqiiqaa kana d {0} keessatti d {0} keessatti @@ -1812,7 +1619,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sek. - amma sek. {0} keessatti sek. {0} keessatti @@ -1824,7 +1630,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic sek - amma s {0} keessatti s {0} keessatti @@ -1840,9 +1645,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic zoonii - - zoonii - Sa’aatii {0} @@ -1885,9 +1687,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Sa’aatii Afrikaa Dhihaa - Sa’aatii Istaandaardii Afrikaa Dhihaa - Sa’aatii Bonaa Afrikaa Dhihaa + Sa’aatii Afrikaa Dhihaa @@ -2272,6 +2072,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sa’aatii Guyaanaa + + + Sa’aatii Istaandaardii Haawayi-Alewutiyan + + + HAS + + Sa’aatii Haawayi-Alewutiyan diff --git a/make/data/cldr/common/main/or.xml b/make/data/cldr/common/main/or.xml index 77f1ebb89a2..cabc4fdf545 100644 --- a/make/data/cldr/common/main/or.xml +++ b/make/data/cldr/common/main/or.xml @@ -279,6 +279,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ବାଫଲା କୋଲୋବନିୟ କୁର୍ଦ୍ଦିଶ୍ + କୁର୍ଦ୍ଦିଶ୍‌ + କୁର୍‌ମାଞ୍ଜି କୁମୀକ୍ କୁତେନାଉ କୋମି @@ -801,6 +803,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଚୀନ୍‌ କଲମ୍ବିଆ କ୍ଲିପରଟନ୍‌ ଦ୍ୱୀପ + ସର୍କ୍‌ କୋଷ୍ଟା ରିକା କ‍୍ୟୁବା କେପ୍ ଭର୍ଦେ @@ -1045,43 +1048,83 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ମୁଦ୍ରା ଫର୍ମାଟ୍‌ ସର୍ଟ୍‌ କ୍ରମ ମୁଦ୍ରା + ଦର୍ଶାଯାଇଥିବା ଇମୋଜି ଘଣ୍ଟା ଚକ୍ର (12 ବନାମ 24) ଲାଇନ୍‌ ବ୍ରେକ୍‌ ଷ୍ଟାଇଲ୍‌ + ଶବ୍ଦଗୁଡ଼ିକ ଥିବା ଲାଇନ ବ୍ରେକ ମାପ ପଦ୍ଧତି ସଂଖ୍ୟା + Abbr ପରେ ଥିବା ବାକ୍ୟ ବୌଦ୍ଧ କ୍ୟାଲେଣ୍ଡର୍‌ + ବୌଦ୍ଧ ଚାଇନିଜ୍‌ କ୍ୟାଲେଣ୍ଡର୍‌ + ଚାଇନିଜ୍‌ କପ୍ଟିକ୍ କ୍ୟାଲେଣ୍ଡର୍‌ + କପ୍ଟିକ୍‌ ଦାଙ୍ଗି କ୍ୟାଲେଣ୍ଡର୍‌ + ଦାଙ୍ଗି ଇଥିଓପିକ୍‌ କ୍ୟାଲେଣ୍ଡର୍‌ + ଇଥିଓପିକ୍‌ ଏଥିଓପିକ୍-ଆମେଟ୍-ଆଲେମ୍ + ଇଥିଓପିକ୍ ଆମେଟେ ଆଲେମ୍ ଗ୍ରେଗୋରିୟ କ୍ୟାଲେଣ୍ଡର୍ + ଗ୍ରେଗୋରିଆନ୍‌ ହିବୃ କ୍ୟାଲେଣ୍ଡର୍‌ + ହିବୃ ଭାରତୀୟ ରାଷ୍ଟ୍ରୀୟ କ୍ୟାଲେଣ୍ଡର୍‌ + ଭାରତୀୟ ଜାତୀୟ ହିଜ୍ରି କ୍ୟାଲେଣ୍ଡର + ହିଜ୍ରି ହିଜ୍ରି କ୍ୟାଲେଣ୍ଡର (ଟାବୁଲାର୍, ନାଗରିକ ଯୁଗ) + ହିଜ୍ରି (ଟାବୁଲାର୍, ସିଭିଲ୍‌ ଆରମ୍ଭ କାଳ) ହିଜ୍ରି କ୍ୟାଲେଣ୍ଡର (ଉମ୍ ଅଲ୍-କୁରା) + ହିଜ୍ରି (ଉମ୍ ଅଲ୍-କୁରା) ISO-8601 କ୍ୟାଲେଣ୍ଡର୍‌ ଜାପାନିଜ୍‌ କ୍ୟାଲେଣ୍ଡର୍‌ + ଜାପାନିଜ୍‌ ପର୍ସିଆନ୍‌ କ୍ୟାଲେଣ୍ଡର୍‌ + ପର୍ସିଆନ୍‌ ମିଙ୍ଗୋଓ କ୍ୟାଲେଣ୍ଡର୍‌ - ଏକାଉଣ୍ଟିଂ ମୁଦ୍ରା ଫର୍ମାଟ୍‌ - ମାନାଙ୍କ ମୁଦ୍ରା ଫର୍ମାଟ୍‌ + ମିଙ୍ଗ୍‌ୱୋ + ଆକାଉଣ୍ଟିଂ ମୁଦ୍ରା ଫର୍ମାଟ୍‌ + ଆକାଉଣ୍ଟିଂ + ମାନକ ମୁଦ୍ରା ଫର୍ମାଟ୍‌ + ମାନକ ଡିଫଲ୍ଟ ୟୁନିକୋଡ୍‌ ସର୍ଟ୍‌ କ୍ରମ + ଡିଫଲ୍ଟ୍‌ ୟୁନିକୋଡ୍‌ ସାଧାରଣ ଉଦ୍ଦେଶ୍ୟ-ବିଶିଷ୍ଟ ସନ୍ଧାନ + ସର୍ଚ୍ଚ୍‌ ଷ୍ଟାଣ୍ଡାର୍ଡ୍‌ ସର୍ଟ୍‌ କ୍ରମ + ଷ୍ଟାଣ୍ଡାର୍ଡ୍‌ + ଡିଫଲ୍ଟ୍‌ + ଇମୋଜି + ଟେକ୍ସ୍‌ଟ୍‌ 12 ଘଣ୍ଟିଆ ପଦ୍ଧତି (0–11) + 12 (0–11) 12 ଘଣ୍ଟିଆ ପଦ୍ଧତି (1–12) + 12 (1–12) 24 ଘଣ୍ଟିଆ ପଦ୍ଧତି (0–23) + 24 (0–23) 24 ଘଣ୍ଟିଆ ପଦ୍ଧତି (1–24) + 24 (1–24) କୋହଳ ଲାଇନ୍‌ ବ୍ରେକ୍‌ ଷ୍ଟାଇଲ୍‌ + କୋହଳ ସାଧାରଣ ଲାଇନ୍‌ ବ୍ରେକ୍‌ ଷ୍ଟାଇଲ୍‌ + ସାଧାରଣ କଠୋର ଧାଡ଼ି ବିରତି ଶୈଳୀ + କଠୋର + ସବୁ ବ୍ରେକ୍ କରନ୍ତୁ + ସବୁ ରଖନ୍ତୁ + ସାଧାରଣ + ବାକ‍୍ୟାଂଶରେ ରଖନ୍ତୁ ମେଟ୍ରିକ୍‌ ପଦ୍ଧତି + ମେଟ୍ରିକ୍‌ ଇମ୍ପେରିଆଲ୍‌ ମାପ ପଦ୍ଧତି + UK ୟୁଏସ୍‌ ମାପ ପଦ୍ଧତି + US ଆରବିକ୍‌-ଇଣ୍ଡିକ୍‌ ଅଙ୍କଗୁଡ଼ିକ ପରିବର୍ଦ୍ଧିତ ଆରବିକ୍‌-ଇଣ୍ଡିକ୍‌ ଅଙ୍କଗୁଡ଼ିକ ଆର୍ମେନିୟ ସଂଖ୍ୟାଗୁଡ଼ିକ @@ -1123,6 +1166,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଥାଇ ଅଙ୍କଗୁଡ଼ିକ ତିବତୀ ଅଙ୍କଗୁଡ଼ିକ ଭାଇ ଅଙ୍କଗୁଡ଼ିକ + ଅଫ୍‌ + ଅନ୍‌ ମେଟ୍ରିକ୍‌ @@ -1138,11 +1183,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [଼ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଏ ଐ ଓ ଔ ଁ ଂ ଃ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ{ଡ଼} ଢ{ଢ଼} ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯୟ ର ଲ ଳ ଵ ୱ ଶ ଷ ସ ହ {କ୍ଷ} ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍] [\u200C\u200D] - [ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ {କ୍ଷ}] + [ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯୟ ର ଲ ଳ ୱ ଶ ଷ ସ ହ {କ୍ଷ}] [\- ‑ , . % ‰ + 0୦ 1୧ 2୨ 3୩ 4୪ 5୫ 6୬ 7୭ 8୮ 9୯] - [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯] + [\- ‐‑ – — , ; \: ! ? . … । '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [॥] - [££ ₤] [₹ {ଟ.} {ଟଙ୍କା} {Rp} {Rs}₨] @@ -1206,6 +1252,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E y G + G dd-MM-y, E MMM y G MMM d, y G E, MMM d, y G @@ -1395,8 +1442,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Q1 Q2 - 3ୟ ତ୍ରୟମାସ - 4ର୍ଥ ତ୍ରୟମାସ + Q3 + Q4 1ମ ତ୍ରୟମାସ @@ -1415,21 +1462,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - ପୂ - - - - - ପୂର୍ବାହ୍ନ - ଅପରାହ୍ନ - AM PM + + AM + PM + @@ -1526,6 +1567,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E y G M/d/y G + G dd-MM-y, E MMM y G MMM d, y G E, MMM d, y G @@ -1641,50 +1683,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - ଚୈତ୍ର - ବୈଶାଖ - ଜ୍ୟେଷ୍ଠ - ଆଷାଢ଼ - ଶ୍ରାବଣ - ଭାଦ୍ରବ - ଆଶ୍ଵିନ - କାର୍ତ୍ତିକ - ମାର୍ଗଶିର - ପୌଷ - ମାଘ - ଫାଲଗୁନ - - - ଚୈତ୍ର - ବୈଶାଖ - ଜ୍ୟେଷ୍ଠ - ଆଷାଢ଼ - ଶ୍ରାବଣ - ଭାଦ୍ରବ - ଆଶ୍ଵିନ - କାର୍ତ୍ତିକ - ମାର୍ଗଶିର - ପୌଷ - ମାଘ - ଫାଲଗୁନ - - - - - ଚୈତ୍ର - ବୈଶାଖ - ଜ୍ୟେଷ୍ଠ - ଆଷାଢ଼ - ଶ୍ରାବଣ - ଭାଦ୍ରବ - ଆଶ୍ଵିନ - କାର୍ତ୍ତିକ - ମାର୍ଗଶିର - ପୌଷ - ମାଘ - ଫାଲଗୁନ - ଚୈତ୍ର ବୈଶାଖ @@ -1856,9 +1854,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ମାସର ସାପ୍ତାହିକ ଦି. - - ମାସର ସାପ୍ତାହିକ ଦି. - ଗତ ରବିବାର ଏହି ରବିବାର @@ -2065,15 +2060,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଶନି. ପୂର୍ବେ - - AM/PM - AM/PM - - AM/PM - ଘଣ୍ଟା ଏହି ଘଣ୍ଟା @@ -2509,6 +2498,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଇଷ୍ଟର୍‌ + + କୋୟାଇକେ + ପୁଣ୍ଟା ଏରିନାସ୍‌ @@ -2774,9 +2766,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଫନୋମ୍‌ ପେନହ - ଏଣ୍ଡେରବୁରି - - କ୍ୟାଣ୍ଟନ @@ -3453,9 +3442,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ପଶ୍ଚିମ ଆଫ୍ରିକା ସମୟ - ପଶ୍ଚିମ ଆଫ୍ରିକା ମାନାଙ୍କ ସମୟ - ପଶ୍ଚିମ ଆଫ୍ରିକା ଖରାଦିନ ସମୟ + ପଶ୍ଚିମ ଆଫ୍ରିକା ସମୟ @@ -3836,6 +3823,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଗୁଏନା ସମୟ + + + ହୱାଇ-ଆଲେଉଟିୟ ମାନାଙ୍କ ସମୟ + + ହୱାଇ-ଆଲେଉଟିୟ ସମୟ @@ -4448,7 +4440,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4495,17 +4486,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤000ବି ¤ 000ବି ¤0ଟ୍ରି - ¤ 0T + ¤ 0ଟ୍ରି ¤0ଟ୍ରି - ¤ 0T + ¤ 0ଟ୍ରି ¤00ଟ୍ରି - ¤ 00T + ¤ 00ଟ୍ରି ¤00ଟ୍ରି - ¤ 00T + ¤ 00ଟ୍ରି ¤000ଟ୍ରି - ¤ 000T + ¤ 000ଟ୍ରି ¤000ଟ୍ରି - ¤ 000T + ¤ 000ଟ୍ରି @@ -4991,6 +4982,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ପୂର୍ବ କାରିବୀୟ ଡଲାର୍ + + କ‍୍ୟାରବିଅନ୍‌ ଗିଲ୍ଡର୍‌ + କ‍୍ୟାରବିଅନ୍‌ ଗିଲ୍ଡର୍‌ + କ‍୍ୟାରବିଅନ୍‌ ଗିଲ୍ଡର୍‌ + ପଶ୍ଚିମ ଆଫ୍ରିକିୟ CFA ଫ୍ରାଙ୍କ୍ ପଶ୍ଚିମ ଆଫ୍ରିକୀୟ CFA ଫ୍ରାଙ୍କ୍ @@ -5013,6 +5009,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଜାମ୍ବୀୟ କ୍ୱାଚା + + ଜିମ୍ବାୱିଅନ୍‌ ଗୋଲ୍ଡ୍‌ + ଜିମ୍ବାୱିଅନ୍‌ ଗୋଲ୍ଡ୍‌ + ଜିମ୍ବାୱିଅନ୍‌ ଗୋଲ୍ଡ୍‌ + {0}+ @@ -5208,7 +5209,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଆଇଟମ୍ {0} ଆଇଟମ୍‌ଗୁଡିକ - + + ଅଂଶ + {0} ଅଂଶ + {0} ଅଂଶ + + ଅଂଶ ପ୍ରତି ନିୟୁତ {0} ଅଂଶ ପ୍ରତି ନିୟୁତ {0} ଅଂଶ ପ୍ରତି ନିୟୁତ @@ -5230,6 +5236,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ମୋଲ {0} ମୋଲସ + + ଗ୍ଲୁକୋଜ୍‌ + {0} ଗ୍ଲୁକୋଜ୍‌ + {0} ଗ୍ଲୁକୋଜ୍‌ + ଲିଟର୍ ପ୍ରତି କିଲୋମିଟର୍ {0} ଲିଟର୍ ପ୍ରତି କିଲୋମିଟର୍ @@ -5298,10 +5309,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଶତାବ୍ଦୀ {0} ଶତାବ୍ଦୀ - - {0} ଦଶନ୍ଧି - {0} ଦଶନ୍ଧି - {0} ପ୍ରତି ବର୍ଷ @@ -5567,7 +5574,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ପଏଣ୍ଟ୍ - ସୋଲାର ବ୍ୟାସାର୍ଦ୍ଧ {0} ସୋଲାର ବ୍ୟାସାର୍ଦ୍ଧ {0} ସୋଲାର ବ୍ୟାସାର୍ଦ୍ଧ @@ -5677,6 +5683,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ପାରାର {0} ମିଲିମିଟର୍ ପାରାର {0} ମିଲିମିଟର୍ + + ପାରଦ + {0} ପାରଦ + {0} ପାରଦ + ପାଉଣ୍ଡ୍ ପ୍ରତି ବର୍ଗ ଇଞ୍ଚ ପ୍ରତି ବର୍ଗ ଇଞ୍ଚ {0} ପାଉଣ୍ଡ୍ @@ -5829,6 +5840,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ମେଟ୍ରିକ୍ କପ୍ {0} ମେଟ୍ରିକ୍ କପ୍ + + ମେଟ୍ରିକ୍‌ ଫ୍ଲୁଇଡ୍‌ ଆଉନ୍ସ୍‌ + {0} ମେଟ୍ରିକ୍‌ ଫ୍ଲୁଇଡ୍‌ ଆଉନ୍ସ୍‌ + {0} ମେଟ୍ରିକ୍‌ ଫ୍ଲୁଇଡ୍‌ ଆଉନ୍ସ୍‌ + ଏକର-ଫିଟ୍ {0} ଏକର-ଫୁଟ @@ -5869,20 +5885,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଡିଜଟ୍ ସ୍ପୁନ୍ {0} ଡିଜଟ୍ ସ୍ପୁନ୍ - - ଆଲୋକ - {0} ଆଲୋକ - {0} ଆଲୋକ + + ଷ୍ଟେରାଡିଆନ୍ + {0} ଷ୍ଟେରାଡିଆନ୍‌ + {0} ଷ୍ଟେରାଡିଆନ୍‌ - + + କେଟଲ୍‌ + {0} କେଟଲ୍‌ + {0} କେଟଲ୍‌ + + + କୂଲମ୍‌ + {0} କୂଲମ୍‌ + {0} କୂଲମ୍‌ + + + ଫାରାଡ୍‌ + {0} ଫାରାଡ୍‌ + {0} ଫାରାଡ୍‌ + + + ହେନେରି + {0} ହେନେରି + {0} ହେନେରି + + + ସିମେନ୍ସ୍‌ + {0} ସିମେନ୍ସ୍‌ + {0} ସିମେନ୍ସ୍‌ + + + କ‍୍ୟାଲୋରି [IT] + {0} କ‍୍ୟାଲୋରି [IT] + {0} କ‍୍ୟାଲୋରି [IT] + + + ବେକରେଲ୍‌ + {0} ବେକରେଲ୍‌ + {0} ବେକରେଲ୍‌ + + + ସିଭର୍ଟ୍‌ + {0} ସିଭର୍ଟ୍‌ + {0} ସିଭର୍ଟ୍‌ + + + ଗ୍ରେ + {0} ଗ୍ରେ + {0} ଗ୍ରେ + + + କିଲୋଗ୍ରାମ୍‌-ବଳ + {0} କିଲୋଗ୍ରାମ୍‌-ବଳ + {0} କିଲୋଗ୍ରାମ୍‌-ବଳ + + + ଟେସ୍‌ଲା + {0} ଟେସ୍‌ଲା + {0} ଟେସ୍‌ଲା + + + ୱେବର୍‌ + {0} ୱେବର୍‌ + {0} ୱେବର୍‌ + + ବିଲିୟନ ପ୍ରତି ଅଂଶଗୁଡିକ {0} ପାର୍ଟ୍ସ ପ୍ରତି ବିଲିୟନ୍ {0} ପାର୍ଟ୍ସ ପ୍ରତି ବିଲିୟନ୍ - ରାତି - {0} ରାତି - {0} ରାତି {0} ପ୍ରତି ରାତି @@ -6058,7 +6131,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଆଇଟମ୍ {0} ଆଇଟମ୍ - + + ଅଂଶ + {0} ଅଂଶ + {0} ଅଂଶ + + ଅଂଶ/ନିୟୁତ {0} ପିପିଏମ୍ {0} ପିପିଏମ୍ @@ -6077,6 +6155,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ମୋଲ {0} ମୋଲ + + Glc + {0} Glc + {0} Glc + ଲିଟର୍/କିମି {0} ଲି/କିମି @@ -6346,8 +6429,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଆୟୁ - {0} au - {0} au ଫର୍ଲଙ୍ଗସ୍ @@ -6360,8 +6441,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ନୌମି - {0} nmi - {0} nmi ସମି @@ -6555,8 +6634,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ୟାର୍ଡ୍³ - {0} yd³ - {0} yd³ ଫିଟ୍³ @@ -6601,8 +6678,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ମେପା - {0} mpt - {0} mpt {0} ମେକ @@ -6655,8 +6730,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଛୋଟ ଚାମଚ - {0} tsp - {0} tsp ବାରେଲ @@ -6665,12 +6738,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} dsp-Imp. {0} dsp-Imp. + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + cal-IT + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + ଆଲୋକ {0} ଆଲୋକ {0} ଆଲୋକ - + ପାର୍ଟ୍ସ/ବିଲିୟନ୍ @@ -6818,7 +6914,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ଆଇଟମ୍ {0}ଆଇଟମ୍ - + + ଅଂଶ + {0} ଅଂଶ + {0} ଅଂଶ + + ପିପିଏମ୍ {0}ପିପିଏମ୍ {0}ପିପିଏମ୍ @@ -6836,6 +6937,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ମୋଲ {0}ମୋଲ + + Glc + ଲି/100କିମି {0}ଲି/100 କିମି @@ -6855,8 +6959,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ଦଶନ୍ଧି - {0} ଦଶନ୍ଧି - {0} ଦଶନ୍ଧି yr @@ -7160,7 +7262,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mpt - mcup {0}mc {0}mc @@ -7223,21 +7324,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ଚିମୁଟ {0} ଚିମୁଟ - - ଆଲୋକ - {0} ଆଲୋକ - {0} ଆଲୋକ + + {0} sr + {0} sr - + + {0} kat + {0} kat + + + cal-IT + + {0}ppb {0}ppb - - ରାତି - {0} ରାତି - {0} ରାତି - {0}/ରାତି - {0}ଉ diff --git a/make/data/cldr/common/main/pa.xml b/make/data/cldr/common/main/pa.xml index 2da4fdb061a..3ae5f04c949 100644 --- a/make/data/cldr/common/main/pa.xml +++ b/make/data/cldr/common/main/pa.xml @@ -47,6 +47,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਅਜ਼ਰਬਾਈਜਾਨੀ ਅਜ਼ੇਰੀ ਬਸ਼ਕੀਰ + ਬਲੋਚੀ ਬਾਲੀਨੀਜ਼ ਬਾਸਾ ਬੇਲਾਰੂਸੀ @@ -59,7 +60,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਬਿਸਲਾਮਾ ਬਿਨੀ ਸਿਕਸਿਕਾ - ਅਨੀ + ਅਨੀ ਬੰਬਾਰਾ ਬੰਗਾਲੀ ਤਿੱਬਤੀ @@ -236,6 +237,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਬਫ਼ੀਆ ਕਲੋਨੀਅਨ ਕੁਰਦਿਸ਼ + ਕੁਰਦਿਸ਼ + ਕੁਰਮਾਂਜੀ ਕੁਮੀਕ ਕੋਮੀ ਕੋਰਨਿਸ਼ @@ -637,6 +640,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਚੀਨ ਕੋਲੰਬੀਆ ਕਲਿੱਪਰਟਨ ਟਾਪੂ + ਸਾਰਕ ਕੋਸਟਾ ਰੀਕਾ ਕਿਊਬਾ ਕੇਪ ਵਰਡੇ @@ -703,14 +707,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਆਇਲ ਆਫ ਮੈਨ ਭਾਰਤ ਬਰਤਾਨਵੀ ਹਿੰਦ ਮਹਾਂਸਾਗਰ ਖਿੱਤਾ - ਚਗੋਸ ਟਾਪੂ + ਚਗੋਸ ਟਾਪੂ ਇਰਾਕ ਈਰਾਨ ਆਈਸਲੈਂਡ ਇਟਲੀ ਜਰਸੀ ਜਮਾਇਕਾ - ਜਾਰਡਨ + ਜੌਰਡਨ ਜਪਾਨ ਕੀਨੀਆ ਕਿਰਗਿਜ਼ਸਤਾਨ @@ -718,13 +722,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਕਿਰਬਾਤੀ ਕੋਮੋਰੋਸ ਸੇਂਟ ਕਿਟਸ ਐਂਡ ਨੇਵਿਸ - ਉੱਤਰ ਕੋਰੀਆ - ਦੱਖਣ ਕੋਰੀਆ + ਉੱਤਰੀ ਕੋਰੀਆ + ਦੱਖਣੀ ਕੋਰੀਆ ਕੁਵੈਤ ਕੇਮੈਨ ਟਾਪੂ ਕਜ਼ਾਖਸਤਾਨ ਲਾਓਸ - ਲੈਬਨਾਨ + ਲਿਬਨਾਨ ਸੇਂਟ ਲੂਸੀਆ ਲਿਚੇਂਸਟਾਇਨ ਸ੍ਰੀ ਲੰਕਾ @@ -782,7 +786,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਸੇਂਟ ਪੀਅਰੇ ਐਂਡ ਮਿਕੇਲਨ ਪਿਟਕੇਰਨ ਟਾਪੂ ਪਿਊਰਟੋ ਰਿਕੋ - ਫਿਲੀਸਤੀਨੀ ਇਲਾਕਾ + ਫਿਲਸਤੀਨੀ ਖਿੱਤੇ ਫਿਲੀਸਤੀਨ ਪੁਰਤਗਾਲ ਪਲਾਉ @@ -839,7 +843,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਯੂ.ਐੱਸ. ਦੂਰ-ਦੁਰਾਡੇ ਟਾਪੂ ਸੰਯੁਕਤ ਰਾਸ਼ਟਰ ਯੂ.ਐੱਨ. - ਸੰਯੁਕਤ ਰਾਜ + ਸੰਯੁਕਤ ਰਾਜ (ਅਮਰੀਕਾ) ਯੂ.ਐੱਸ. ਉਰੂਗਵੇ ਉਜ਼ਬੇਕਿਸਤਾਨ @@ -872,48 +876,89 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਮੁਦਰਾ ਬਣਤਰ ਲੜੀਬੱਧ ਕ੍ਰਮ ਮੁਦਰਾ + ਇਮੋਜੀ ਪੇਸ਼ਕਾਰੀ ਘੰਟੇ ਦਾ ਚੱਕਰ (12 ਬਨਾਮ 24) ਰੇਖਾ ਵਿੱਥ ਸ਼ੈਲੀ + ਸ਼ਬਦਾਂ ਵਿਚਕਾਰ ਲਾਈਨ ਵਿੱਥ ਮਾਪ ਪ੍ਰਣਾਲੀ ਸੰਖਿਆਵਾਂ + ਸੰਖੇਪ ਸ਼ਬਦ ਤੋਂ ਬਾਅਦ ਵਾਕ ਵਿੱਥ ਬੋਧੀ ਕੈਲੰਡਰ + ਬੋਧੀ ਚੀਨੀ ਕੈਲੰਡਰ + ਚੀਨੀ ਕੋਪਟਿਕ ਕੈਲੰਡਰ + ਕੋਪਟਿਕ ਡਾਂਗੀ ਕੈਲੰਡਰ + ਡਾਂਗੀ ਇਥੀਓਪਿਕ ਕੈਲੰਡਰ + ਇਥੀਓਪਿਕ ਇਥੀਓਪਿਕ-ਅਮੀਟ-ਆਲਮ + ਇਥੀਓਪਿਕ ਅਮੀਟ ਆਲਮ ਗਰੇਗੋਰੀਅਨ ਕੈਲੰਡਰ + ਗਰੇਗੋਰੀਅਨ ਹਿਬਰੂ ਕੈਲੰਡਰ + ਹਿਬਰੂ ਭਾਰਤੀ ਕੌਮੀ ਕੈਲੰਡਰ + ਭਾਰਤੀ ਕੌਮੀ ਇਸਲਾਮੀ ਕੈਲੰਡਰ + ਇਸਲਾਮੀ ਇਸਲਾਮੀ ਕੈਲੰਡਰ (ਸਾਰਨੀਬੱਧ, ਸਮਾਜਿਕ ਯੁੱਗ) + ਇਸਲਾਮੀ (ਸਾਰਨੀਬੱਧ, ਸਮਾਜਿਕ ਯੁੱਗ) ਇਸਲਾਮੀ ਕੈਲੰਡਰ (ਸਾਊਦੀ ਅਰਬ, ਚੰਨ ਦਿਖਣਾ) - ਇਸਲਾਮੀ ਕੈਲੰਡਰ (ਟੇਬਲਰ, ਖਗੋਲੀ ਯੁੱਗ) + ਇਸਲਾਮੀ ਕੈਲੰਡਰ (ਸਾਰਨੀਬੱਧ, ਖਗੋਲੀ ਯੁੱਗ) + ਇਸਲਾਮੀ (ਸਾਰਨੀਬੱਧ, ਖਗੋਲੀ ਯੁੱਗ) ਇਸਲਾਮੀ ਕੈਲੰਡਰ (ਅਮ ਅਲ-ਕੁਰਾ) + ਇਸਲਾਮੀ (ਉਮ ਅਲ-ਕੁਰਾ) (ISO-8601) ਕੈਲੰਡਰ ਜਪਾਨੀ ਕੈਲੰਡਰ + ਜਪਾਨੀ ਫ਼ਾਰਸੀ ਕੈਲੰਡਰ + ਫ਼ਾਰਸੀ ਮਿੰਗੂਓ ਕੈਲੰਡਰ + ਮਿੰਗੂਓ ਲੇਖਾ ਮੁਦਰਾ ਬਣਤਰ + ਲੇਖਾ ਮਿਆਰੀ ਮੁਦਰਾ ਬਣਤਰ + ਮਿਆਰੀ ਪਿਛਲਾ ਤਰਤੀਬ ਵਾਰ ਕ੍ਰਮ, ਅਨੁਰੂਪਤਾ ਲਈ ਸ਼ਬਦ-ਕੋਸ਼ ਲੜੀਬੱਧ ਕ੍ਰਮ ਮੂਲ ਯੂਨੀਕੋਡ ਲੜੀਬੱਧ ਕ੍ਰਮ + ਡਿਫ਼ੌਲਟ ਯੂਨੀਕੋਡ ਆਮ-ਮੰਤਵ ਖੋਜ + ਖੋਜੋ ਸਧਾਰਨ ਲੜੀਬੱਧ ਕ੍ਰਮ + ਮਿਆਰੀ ਰਵਾਇਤੀ ਲੜੀਬੱਧ ਕ੍ਰਮ + ਡਿਫ਼ੌਲਟ + ਇਮੋਜੀ + ਟੈਕਸਟ 12 ਘੰਟੇ ਦੀ ਪ੍ਰਣਾਲੀ (0–11) + 12 (0–11) 12 ਘੰਟੇ ਦੀ ਪ੍ਰਣਾਲੀ (1–12) + 12 (1–12) 24 ਘੰਟੇ ਦੀ ਪ੍ਰਣਾਲੀ (0–23) + 24 (0–23) 24 ਘੰਟੇ ਦੀ ਪ੍ਰਣਾਲੀ (1–24) + 24 (1–24) ਖੁੱਲ੍ਹੀ ਰੇਖਾ ਵਿੱਥ ਸ਼ੈਲੀ + ਖੁੱਲ੍ਹੀ ਸਧਾਰਨ ਰੇਖਾ ਵਿੱਥ ਸ਼ੈਲੀ + ਸਧਾਰਨ ਪੱਕੀ ਰੇਖਾ ਵਿੱਥ ਸ਼ੈਲੀ + ਪੱਕੀ + ਸਭ ‘ਚ ਵਿੱਥ ਰੱਖੋ + ਸਭ ਰੱਖੋ + ਸਧਾਰਨ + ਵਾਕੰਸ਼ਾਂ ‘ਚ ਰੱਖੋ ਮੀਟਰਿਕ ਪ੍ਰਣਾਲੀ + ਮੀਟਰਿਕ ਇੰਪੀਰੀਅਲ ਮਾਪ ਪ੍ਰਣਾਲੀ + UK ਅਮਰੀਕੀ ਮਾਪ ਪ੍ਰਣਾਲੀ + US ਅਰਬੀ-ਭਾਰਤੀ ਅੰਕ ਵਿਸਤਾਰਿਤ ਅਰਬੀ-ਭਾਰਤੀ ਅੰਕ ਆਰਮੀਨੀਅਨ ਸੰਖਿਆਵਾਂ @@ -956,6 +1001,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਥਾਈ ਅੰਕ ਤਿੱਬਤੀ ਅੰਕ ਵਾਈ ਅੰਕ + ਬੰਦ + ਚਾਲੂ ਮੀਟਰਿਕ @@ -969,17 +1016,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - [ੱ ੰ ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ{ਸ਼} ਹ ਕ ਖ{ਖ਼} ਗ{ਗ਼} ਘ ਙ ਚ ਛ ਜ{ਜ਼} ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ{ਫ਼} ਬ ਭ ਮ ਯ ਰ ਲ ਵ ੜ ੍ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ] - [\u200C\u200Dਃ ਂ {ਲ਼}] - [ੳ ਅ ੲ ਸ ਹ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਵ ੜ] + [ੱ {ੰਂ} ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ{ਸ਼} ਹ ਕ ਖ{ਖ਼} ਗ{ਗ਼} ਘ ਙ ਚ ਛ ਜ{ਜ਼} ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ{ਫ਼} ਬ ਭ ਮ ਯ ਰ ਲ{ਲ਼} ਵ ੜ ੍ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ] + [\u200C\u200Dਃ] + [ੳ ਅ ੲ ਸ{ਸ਼} ਹ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਵ ੜ] [\- ‑ , . % ‰ + 0੦ 1੧ 2੨ 3੩ 4੪ 5੫ 6੬ 7੭ 8੮ 9੯] [\- ‐‑ – — , ; \: ! ? . '‘’ "“” ( ) \[ \] / \& ′ ″] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1048,12 +1092,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - ਕਾਲ0 - ਕਾਲ1 - - @@ -1075,12 +1113,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - ਕਾਲ0 - ਕਾਲ1 - - @@ -1111,11 +1143,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}, {0} + {1} {0} + + {1}, {0} + @@ -1128,6 +1166,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + B h + B h:mm + B h:mm:ss + E B h + E B h:mm + E B h:mm:ss E, d d/M/GGGGG y MMM y G @@ -1272,7 +1316,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਬੁੱਧ ਵੀਰ ਸ਼ੁੱਕਰ - ਸ਼ਨਿੱਚਰ + ਸ਼ਨੀ ਐਤ @@ -1281,7 +1325,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਬੁੱਧ ਵੀਰ ਸ਼ੁੱਕ - ਸ਼ਨਿੱ + ਸ਼ਨੀ ਐਤਵਾਰ @@ -1290,10 +1334,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਬੁੱਧਵਾਰ ਵੀਰਵਾਰ ਸ਼ੁੱਕਰਵਾਰ - ਸ਼ਨਿੱਚਰਵਾਰ + ਸ਼ਨੀਵਾਰ + + ਐਤ + ਸੋਮ + ਮੰਗਲ + ਬੁੱਧ + ਵੀਰ + ਸ਼ੁੱਕਰ + ਸ਼ਨੀ + ਸੋ @@ -1303,6 +1356,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਸ਼ੁੱ ਸ਼ + + ਐਤ + ਸੋਮ + ਮੰਗ + ਬੁੱਧ + ਵੀਰ + ਸ਼ੁੱਕ + ਸ਼ਨੀ + + + ਐਤਵਾਰ + ਸੋਮਵਾਰ + ਮੰਗਲਵਾਰ + ਬੁੱਧਵਾਰ + ਵੀਰਵਾਰ + ਸ਼ੁੱਕਰਵਾਰ + ਸ਼ਨੀਵਾਰ + @@ -1325,20 +1396,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਅੱਧੀ ਰਾਤ - ਪੂ.ਦੁ. - ਬਾ.ਦੁ. ਸਵੇਰੇ ਦੁਪਹਿਰੇ ਸ਼ਾਮੀਂ ਰਾਤੀਂ - ਸ. - ਸ਼. + AM + PM + + + AM + PM + + AM + PM + + + AM + PM + + AM + PM ਸਵੇਰੇ ਦੁਪਹਿਰੇ ਸ਼ਾਮ @@ -1417,11 +1500,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}, {0} + {1} {0} + + {1}, {0} + @@ -1434,7 +1523,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + B h + B h:mm + B h:mm:ss + E B h + E B h:mm + E B h:mm:ss + G M/y d/M/GGGGG y + E, d/M/y G MMM, G y d MMM, G y E d MMM, G y @@ -1630,6 +1727,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + M/y G + E, d/M/y G d MMM, y G @@ -1890,34 +1989,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਅਗਲਾ ਸ਼ੁੱ - ਪਿਛਲਾ ਸ਼ਨਿੱਚਰਵਾਰ - ਇਹ ਸ਼ਨਿੱਚਰਵਾਰ - ਅਗਲਾ ਸ਼ਨਿੱਚਰਵਾਰ + ਪਿਛਲੇ ਸ਼ਨੀਵਾਰ + ਇਹ ਸ਼ਨੀਵਾਰ + ਅਗਲੇ ਸ਼ਨੀਵਾਰ - {0} ਸ਼ਨਿੱਚਰਵਾਰ ਵਿੱਚ - {0} ਸ਼ਨਿੱਚਰਵਾਰਾਂ ਵਿੱਚ + {0} ਸ਼ਨੀਵਾਰ ਬਾਅਦ + {0} ਸ਼ਨੀਵਾਰਾਂ ਬਾਅਦ - {0} ਸ਼ਨਿੱਚਰਵਾਰ ਪਹਿਲਾਂ - {0} ਸ਼ਨਿੱਚਰਵਾਰ ਪਹਿਲਾਂ + {0} ਸ਼ਨੀਵਾਰ ਪਹਿਲਾਂ + {0} ਸ਼ਨੀਵਾਰ ਪਹਿਲਾਂ - ਪਿਛਲਾ ਸ਼ਨਿੱਚਰ - ਇਹ ਸ਼ਨਿੱਚਰ - ਅਗਲਾ ਸ਼ਨਿੱਚਰ + ਪਿਛਲੇ ਸ਼ਨੀ + ਇਹ ਸ਼ਨੀ + ਅਗਲੇ ਸ਼ਨੀ - {0} ਸ਼ਨਿੱਚਰਵਾਰਾਂ ਵਿੱਚ - {0} ਸ਼ਨਿੱਚਰਵਾਰਾਂ ਵਿੱਚ + {0} ਸ਼ਨੀਵਾਰ ਬਾਅਦ + {0} ਸ਼ਨੀਵਾਰਾਂ ਬਾਅਦ + + + {0} ਸ਼ਨੀਵਾਰ ਪਹਿਲਾਂ + {0} ਸ਼ਨੀਵਾਰ ਪਹਿਲਾਂ - ਪਿਛਲਾ ਸ਼ਨਿੱ - ਇਹ ਸ਼ਨਿੱ - ਅਗਲਾ ਸ਼ਨਿੱ + ਪਿਛਲੇ ਸ਼ਨੀ + ਇਹ ਸ਼ਨੀ + ਅਗਲੇ ਸ਼ਨੀ + + {0} ਸ਼ਨੀ ਬਾਅਦ + {0} ਸ਼ਨੀ ਬਾਅਦ + + + {0} ਸ਼ਨੀ ਪਹਿਲਾਂ + {0} ਸ਼ਨੀ ਪਹਿਲਾਂ + + + + AM/PM - ਪੂ.ਦੁ./ਬਾ.ਦੁ. + AM/PM + + + AM/PM ਘੰਟਾ @@ -2319,6 +2436,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਈਸਟਰ + + ਕੋਹੇਕੇ + ਪੰਟਾ ਅਰੇਨਸ @@ -2584,9 +2704,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਫਨੋਮ ਪੇਨਹ - ਏਂਡਰਬਰੀ - - ਕੈਂਟੋਨ @@ -3241,12 +3358,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ਕੇਂਦਰੀ ਅਫਰੀਕਾ ਵੇਲਾ + ਕੇਂਦਰੀ ਅਫ਼ਰੀਕਾ ਵੇਲਾ - ਪੂਰਬੀ ਅਫਰੀਕਾ ਵੇਲਾ + ਪੂਰਬੀ ਅਫ਼ਰੀਕਾ ਵੇਲਾ @@ -3256,9 +3373,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ਪੱਛਮੀ ਅਫਰੀਕਾ ਵੇਲਾ - ਪੱਛਮੀ ਅਫਰੀਕਾ ਮਿਆਰੀ ਵੇਲਾ - ਪੱਛਮੀ ਅਫਰੀਕਾ ਗਰਮੀਆਂ ਦਾ ਵੇਲਾ + ਪੱਛਮੀ ਅਫਰੀਕਾ ਵੇਲਾ @@ -3639,6 +3754,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਗੁਯਾਨਾ ਵੇਲਾ + + + ਹਵਾਈ-ਅਲੇਯੂਸ਼ਿਅਨ ਮਿਆਰੀ ਵੇਲਾ + + ਹਵਾਈ-ਅਲੇਯੂਸ਼ਿਅਨ ਵੇਲਾ @@ -4247,6 +4367,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + never + + + never + @@ -4264,9 +4390,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ¤#,##,##0.00 + ¤#,##,##0.00 + ¤ #,##,##0.00 #,##,##0.00 + + ¤ #,##,##0.00 + @@ -4274,45 +4404,84 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ #,##,##0.00 + + ¤ #,##0.00 + + + + + + + ¤ #,##,##0.00 + + + ¤ #,##0.00 + ¤#,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 ¤ #,##0.00 + ¤ #,##0.00 #,##0.00 - ¤ 0 ਹਜ਼ਾਰ - ¤ 0 ਹਜ਼ਾਰ - ¤ 00 ਹਜ਼ਾਰ - ¤ 00 ਹਜ਼ਾਰ - ¤ 0 ਲੱਖ - ¤ 0 ਲੱਖ - ¤ 00 ਲੱਖ - ¤ 00 ਲੱਖ - ¤ 0 ਕਰੋੜ - ¤ 0 ਕਰੋੜ - ¤ 00 ਕਰੋੜ - ¤ 00 ਕਰੋੜ - ¤ 0 ਅਰਬ - ¤ 0 ਅਰਬ - ¤ 00 ਅਰਬ - ¤ 00 ਅਰਬ - ¤ 0 ਖਰਬ - ¤ 0 ਖਰਬ - ¤ 00 ਖਰਬ - ¤ 00 ਖਰਬ - ¤ 0 ਨੀਲ - ¤ 0 ਨੀਲ - ¤ 00 ਨੀਲ - ¤ 00 ਨੀਲ + ¤0 ਹਜ਼ਾਰ + ¤ 0 ਹਜ਼ਾਰ + ¤0 ਹਜ਼ਾਰ + ¤ 0 ਹਜ਼ਾਰ + ¤00 ਹਜ਼ਾਰ + ¤ 00 ਹਜ਼ਾਰ + ¤00 ਹਜ਼ਾਰ + ¤ 00 ਹਜ਼ਾਰ + ¤0 ਲੱਖ + ¤ 0 ਲੱਖ + ¤0 ਲੱਖ + ¤ 0 ਲੱਖ + ¤00 ਲੱਖ + ¤ 00 ਲੱਖ + ¤00 ਲੱਖ + ¤ 00 ਲੱਖ + ¤0 ਕਰੋੜ + ¤ 0 ਕਰੋੜ + ¤0 ਕਰੋੜ + ¤ 0 ਕਰੋੜ + ¤00 ਕਰੋੜ + ¤ 00 ਕਰੋੜ + ¤00 ਕਰੋੜ + ¤ 00 ਕਰੋੜ + ¤0 ਅਰਬ + ¤ 0 ਅਰਬ + ¤0 ਅਰਬ + ¤ 0 ਅਰਬ + ¤00 ਅਰਬ + ¤ 00 ਅਰਬ + ¤00 ਅਰਬ + ¤ 00 ਅਰਬ + ¤0 ਖਰਬ + ¤ 0 ਖਰਬ + ¤0 ਖਰਬ + ¤ 0 ਖਰਬ + ¤00 ਖਰਬ + ¤ 00 ਖਰਬ + ¤00 ਖਰਬ + ¤ 00 ਖਰਬ + ¤0 ਨੀਲ + ¤ 0 ਨੀਲ + ¤0 ਨੀਲ + ¤ 0 ਨੀਲ + ¤00 ਨੀਲ + ¤ 00 ਨੀਲ + ¤00 ਨੀਲ + ¤ 00 ਨੀਲ {0} ¤¤ @@ -4881,6 +5050,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਪੂਰਬੀ ਕੈਰੇਬੀਅਨ ਡਾਲਰ + + ਕੈਰੇਬੀਅਨ ਗਿਲਡਰ + ਕੈਰੇਬੀਅਨ ਗਿਲਡਰ + ਕੈਰੇਬੀਅਨ ਗਿਲਡਰ + ਯੂਰਪੀ ਮੁਦਰਾ ਇਕਾਈ ਯੂਰਪੀਅਨ ਮੁਦਰਾ ਇਕਾਈ @@ -4907,6 +5081,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਜ਼ਾਮਬੀਆਈ ਕਵਾਚਾ + + ਜ਼ਿੰਬਾਬਵੀ ਗੋਲਡ + ਜ਼ਿੰਬਾਬਵੀ ਗੋਲਡ + ਜ਼ਿੰਬਾਬਵੀ ਗੋਲਡ + {0}+ @@ -4914,7 +5093,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਘੰਟਾ {0} ਘੰਟੇ - ਸਜੇ ਪਾਸੇ {0} ਮੋੜ ਲਵੋ + ਸੱਜੇ ਪਾਸੇ {0}ਵਾਂ ਮੋੜ ਲਓ ਅਧਿਆਪਕ ਨੇ {0} ਪੜ੍ਹਾਇਆ ਅਧਿਆਪਕ ਨੇ {0} ਤੱਕ ਪੜ੍ਹਾਇਆ ਇਹ ਕਿੰਨੀ {0} ਦਾ ਹੈ @@ -5038,14 +5217,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਮੀਟਰ ਪ੍ਰਤੀ ਵਰਗ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਵਰਗ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਵਰਗ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਵਰਗ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਵਰਗ ਸਕਿੰਟ + ਮੀਟਰ ਪ੍ਰਤਿ ਵਰਗ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਵਰਗ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਵਰਗ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਵਰਗ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਵਰਗ ਸਕਿੰਟ feminine + ਚੱਕਰ + {0} ਚੱਕਰ + {0} ਚੱਕਰ + {0} ਚੱਕਰ + {0} ਚੱਕਰ masculine @@ -5074,7 +5258,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਵਰਗ ਕਿਲੋਮੀਟਰ {0} ਵਰਗ ਕਿਲੋਮੀਟਰ {0} ਵਰਗ ਕਿਲੋਮੀਟਰ - {0} ਪ੍ਰਤੀ ਵਰਗ ਕਿਲੋਮੀਟਰ + {0} ਪ੍ਰਤਿ ਵਰਗ ਕਿਲੋਮੀਟਰ masculine @@ -5090,7 +5274,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਵਰਗ ਮੀਟਰ {0} ਵਰਗ ਮੀਟਰ {0} ਵਰਗ ਮੀਟਰ - {0} ਪ੍ਰਤੀ ਵਰਗ ਮੀਟਰ + {0} ਪ੍ਰਤਿ ਵਰਗ ਮੀਟਰ masculine @@ -5099,12 +5283,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਵਰਗ ਸੈਂਟੀਮੀਟਰ {0} ਵਰਗ ਸੈਂਟੀਮੀਟਰ {0} ਵਰਗ ਸੈਂਟੀਮੀਟਰ - {0} ਪ੍ਰਤੀ ਵਰਗ ਸੈਂਟੀਮੀਟਰ + {0} ਪ੍ਰਤਿ ਵਰਗ ਸੈਂਟੀਮੀਟਰ {0} ਵਰਗ ਮੀਲ {0} ਵਰਗ ਮੀਲ - {0} ਪ੍ਰਤੀ ਵਰਗ ਮੀਲ + {0} ਪ੍ਰਤਿ ਵਰਗ ਮੀਲ ਵਰਗ ਗਜ਼ @@ -5120,45 +5304,51 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਵਰਗ ਇੰਚ {0} ਵਰਗ ਇੰਚ {0} ਵਰਗ ਇੰਚ - {0} ਪ੍ਰਤੀ ਵਰਗ ਇੰਚ + {0} ਪ੍ਰਤਿ ਵਰਗ ਇੰਚ masculine masculine - ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤੀ ਡੈਸੀਲਿਟਰ - {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤੀ ਡੈਸੀਲਿਟਰ - {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤੀ ਡੈਸੀਲਿਟਰ - {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤੀ ਡੈਸੀਲਿਟਰ - {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤੀ ਡੈਸੀਲਿਟਰ + ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤਿ ਡੈਸੀਲਿਟਰ + {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤਿ ਡੈਸੀਲਿਟਰ + {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤਿ ਡੈਸੀਲਿਟਰ + {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤਿ ਡੈਸੀਲਿਟਰ + {0} ਮਿਲੀਗ੍ਰਾਮ ਪ੍ਰਤਿ ਡੈਸੀਲਿਟਰ masculine - ਮਿਲੀਮੋਲ ਪ੍ਰਤੀ ਲਿਟਰ - {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤੀ ਲਿਟਰ - {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤੀ ਲਿਟਰ - {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤੀ ਲਿਟਰ - {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤੀ ਲਿਟਰ + ਮਿਲੀਮੋਲ ਪ੍ਰਤਿ ਲਿਟਰ + {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤਿ ਲਿਟਰ + {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤਿ ਲਿਟਰ + {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤਿ ਲਿਟਰ + {0} ਮਿਲੀਮੋਲ ਪ੍ਰਤਿ ਲਿਟਰ feminine ਆਈਟਮਾਂ - + + ਹਿੱਸਾ + {0} ਹਿੱਸਾ + {0} ਹਿੱਸੇ + + masculine - ਹਿੱਸੇ ਪ੍ਰਤੀ ਮਿਲੀਅਨ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਮਿਲੀਅਨ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਮਿਲੀਅਨ - {0} ਹਿੱਸੇ ਪ੍ਰਤੀ ਮਿਲੀਅਨ - {0} ਹਿੱਸੇ ਪ੍ਰਤੀ ਮਿਲੀਅਨ + ਹਿੱਸੇ ਪ੍ਰਤਿ ਮਿਲੀਅਨ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਮਿਲੀਅਨ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਮਿਲੀਅਨ + {0} ਹਿੱਸੇ ਪ੍ਰਤਿ ਮਿਲੀਅਨ + {0} ਹਿੱਸੇ ਪ੍ਰਤਿ ਮਿਲੀਅਨ masculine - {0} ਪ੍ਰਤੀਸ਼ਤ - {0} ਪ੍ਰਤੀਸ਼ਤ - {0} ਪ੍ਰਤੀਸ਼ਤ - {0} ਪ੍ਰਤੀਸ਼ਤ + ਪ੍ਰਤਿਸ਼ਤ + {0} ਪ੍ਰਤਿਸ਼ਤ + {0} ਪ੍ਰਤਿਸ਼ਤ + {0} ਪ੍ਰਤਿਸ਼ਤ + {0} ਪ੍ਰਤਿਸ਼ਤ masculine @@ -5170,28 +5360,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine {0} ਪ੍ਰਤੀ ਦਸ ਹਜ਼ਾਰ - {0} ਪ੍ਰਤੀ ਦਸ ਹਜ਼ਾਰ - {0} ਪ੍ਰਤੀ ਦਸ ਹਜ਼ਾਰ - {0} ਪ੍ਰਤੀ ਦਸ ਹਜ਼ਾਰ + {0} ਪ੍ਰਤਿ ਦਸ ਹਜ਼ਾਰ + {0} ਪ੍ਰਤਿ ਦਸ ਹਜ਼ਾਰ + {0} ਪ੍ਰਤਿ ਦਸ ਹਜ਼ਾਰ masculine + + ਗੁਲੂਕੋਜ਼ + {0} ਗੁਲੂਕੋਜ਼ + {0} ਗੁਲੂਕੋਜ਼ + masculine - ਲਿਟਰ ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ + ਲਿਟਰ ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ masculine - ਲਿਟਰ ਪ੍ਰਤੀ 100 ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ 100 ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ 100 ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ 100 ਕਿਲੋਮੀਟਰ - {0} ਲਿਟਰ ਪ੍ਰਤੀ 100 ਕਿਲੋਮੀਟਰ + ਲਿਟਰ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਲਿਟਰ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ ਮੀਲ ਪ੍ਰਤੀ ਗੈਲਨ @@ -5295,7 +5490,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਸਾਲ {0} ਸਾਲ {0} ਸਾਲਾਂ - {0} ਪ੍ਰਤੀ ਸਾਲ + {0} ਪ੍ਰਤਿ ਸਾਲ feminine @@ -5307,7 +5502,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮਹੀਨੇ {0} ਮਹੀਨੇ {0} ਮਹੀਨਿਆਂ - {0} ਪ੍ਰਤੀ ਮਹੀਨਾ + {0} ਪ੍ਰਤਿ ਮਹੀਨਾ masculine @@ -5315,11 +5510,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਹਫ਼ਤੇ {0} ਹਫ਼ਤੇ {0} ਹਫ਼ਤਿਆਂ - {0} ਪ੍ਰਤੀ ਹਫ਼ਤਾ + {0} ਪ੍ਰਤਿ ਹਫ਼ਤਾ masculine - {0} ਪ੍ਰਤੀ ਦਿਨ + {0} ਪ੍ਰਤਿ ਦਿਨ masculine @@ -5327,7 +5522,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਘੰਟੇ {0} ਘੰਟੇ {0} ਘੰਟਿਆਂ - {0} ਪ੍ਰਤੀ ਘੰਟਾ + {0} ਪ੍ਰਤਿ ਘੰਟਾ masculine @@ -5335,7 +5530,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮਿੰਟ {0} ਮਿੰਟ {0} ਮਿੰਟਾਂ - {0} ਪ੍ਰਤੀ ਮਿੰਟ + {0} ਪ੍ਰਤਿ ਮਿੰਟ masculine @@ -5343,7 +5538,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਸਕਿੰਟ {0} ਸਕਿੰਟ {0} ਸਕਿੰਟਾਂ - {0} ਪ੍ਰਤੀ ਸਕਿੰਟ + {0} ਪ੍ਰਤਿ ਸਕਿੰਟ masculine @@ -5423,7 +5618,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine ਕਿਲੋਵਾਟ-ਘੰਟੇ {0} ਕਿਲੋਵਾਟ ਘੰਟਾ - {0} ਕਿਲੋਵਾਟ ਘੰਟਾ + {0} ਕਿਲੋਵਾਟ ਘੰਟੇ {0} ਕਿਲੋਵਾਟ ਘੰਟੇ {0} ਕਿਲੋਵਾਟ ਘੰਟੇ @@ -5453,11 +5648,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਕਿੱਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤੀ 100 ਕਿੱਲੋਮੀਟਰ - {0} ਕਿੱਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤੀ 100 ਕਿੱਲੋਮੀਟਰ - {0} ਕਿੱਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤੀ 100 ਕਿੱਲੋਮੀਟਰ - {0} ਕਿੱਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤੀ 100 ਕਿੱਲੋਮੀਟਰ - {0} ਕਿੱਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤੀ 100 ਕਿੱਲੋਮੀਟਰ + ਕਿਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਕਿਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਕਿਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਕਿਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ + {0} ਕਿਲੋਵਾਟ-ਘੰਟਾ ਪ੍ਰਤਿ 100 ਕਿਲੋਮੀਟਰ masculine @@ -5517,16 +5712,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਪਿਕਸਲ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ + ਪਿਕਸਲ ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ - ਪਿਕਸਲ ਪ੍ਰਤੀ ਇੰਚ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਇੰਚ - {0} ਪਿਕਸਲ ਪ੍ਰਤੀ ਇੰਚ + ਪਿਕਸਲ ਪ੍ਰਤਿ ਇੰਚ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਇੰਚ + {0} ਪਿਕਸਲ ਪ੍ਰਤਿ ਇੰਚ ਡਾਟਸ ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ @@ -5550,7 +5745,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਕਿਲੋਮੀਟਰ {0} ਕਿਲੋਮੀਟਰ {0} ਕਿਲੋਮੀਟਰ - {0} ਪ੍ਰਤੀ ਕਿਲੋਮੀਟਰ + {0} ਪ੍ਰਤਿ ਕਿਲੋਮੀਟਰ masculine @@ -5558,7 +5753,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮੀਟਰ {0} ਮੀਟਰ {0} ਮੀਟਰਾਂ - {0} ਪ੍ਰਤੀ ਮੀਟਰ + {0} ਪ੍ਰਤਿ ਮੀਟਰ masculine @@ -5575,7 +5770,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਸੈਂਟੀਮੀਟਰ {0} ਸੈਂਟੀਮੀਟਰ {0} ਸੈਂਟੀਮੀਟਰ - {0} ਪ੍ਰਤੀ ਸੈਂਟੀਮੀਟਰ + {0} ਪ੍ਰਤਿ ਸੈਂਟੀਮੀਟਰ masculine @@ -5605,10 +5800,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਪਿਕੋਮੀਟਰ - {0} ਪ੍ਰਤੀ ਫੁੱਟ + {0} ਪ੍ਰਤਿ ਫੁੱਟ - {0} ਪ੍ਰਤੀ ਇੰਚ + {0} ਪ੍ਰਤਿ ਇੰਚ + + + ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ {0} ਪ੍ਰਕਾਸ਼ ਸਾਲ @@ -5774,6 +5974,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮਿਲੀਮੀਟਰ ਪਾਰਾ {0} ਮਿਲੀਮੀਟਰ ਪਾਰਾ + + ਪਾਰਾ + {0} ਪਾਰਾ + {0} ਪਾਰਾ + ਪੌਂਡ ਪ੍ਰਤੀ ਵਰਗ ਇੰਚ {0} ਪੌਂਡ ਪ੍ਰਤੀ ਵਰਗ ਇੰਚ @@ -5795,11 +6000,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਪੈਸਕਲ - {0} ਪੈਸਕਲ - {0} ਪੈਸਕਲ - {0} ਪੈਸਕਲ - {0} ਪੈਸਕਲ + ਪਾਸਕਲ + {0} ਪਾਸਕਲ + {0} ਪਾਸਕਲ + {0} ਪਾਸਕਲ + {0} ਪਾਸਕਲ masculine @@ -5811,11 +6016,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਕਿੱਲੋਪਾਸਕਲ - {0} ਕਿੱਲੋਪਾਸਕਲ - {0} ਕਿੱਲੋਪਾਸਕਲ - {0} ਕਿੱਲੋਪਾਸਕਲ - {0} ਕਿੱਲੋਪਾਸਕਲ + ਕਿਲੋਪਾਸਕਲ + {0} ਕਿਲੋਪਾਸਕਲ + {0} ਕਿਲੋਪਾਸਕਲ + {0} ਕਿਲੋਪਾਸਕਲ + {0} ਕਿਲੋਪਾਸਕਲ masculine @@ -5827,19 +6032,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ - {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ - {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ - {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ - {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ + ਕਿਲੋਮੀਟਰ ਪ੍ਰਤਿ ਘੰਟਾ + {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤਿ ਘੰਟਾ + {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤਿ ਘੰਟੇ + {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤਿ ਘੰਟਾ + {0} ਕਿਲੋਮੀਟਰ ਪ੍ਰਤਿ ਘੰਟੇ masculine - ਮੀਟਰ ਪ੍ਰਤੀ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਸਕਿੰਟ - {0} ਮੀਟਰ ਪ੍ਰਤੀ ਸਕਿੰਟ + ਮੀਟਰ ਪ੍ਰਤਿ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਸਕਿੰਟ + {0} ਮੀਟਰ ਪ੍ਰਤਿ ਸਕਿੰਟ ਮੀਲ ਪ੍ਰਤੀ ਘੰਟਾ @@ -5912,7 +6117,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਘਣ ਮੀਟਰ {0} ਘਣ ਮੀਟਰ {0} ਘਣ ਮੀਟਰ - {0} ਪ੍ਰਤੀ ਘਣ ਮੀਟਰ + {0} ਪ੍ਰਤਿ ਘਣ ਮੀਟਰ masculine @@ -5921,7 +6126,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਘਣ ਸੈਂਟੀਮੀਟਰ {0} ਘਣ ਸੈਂਟੀਮੀਟਰ {0} ਘਣ ਸੈਂਟੀਮੀਟਰ - {0} ਪ੍ਰਤੀ ਘਣ ਸੈਂਟੀਮੀਟਰ + {0} ਪ੍ਰਤਿ ਘਣ ਸੈਂਟੀਮੀਟਰ ਘਣ ਮੀਲ @@ -5965,7 +6170,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਲਿਟਰ {0} ਲਿਟਰ {0} ਲਿਟਰ - {0} ਪ੍ਰਤੀ ਲਿਟਰ + {0} ਪ੍ਰਤਿ ਲਿਟਰ masculine @@ -6007,6 +6212,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮੀਟਰਿਕ ਕੱਪ {0} ਮੀਟਰਿਕ ਕੱਪ + + ਮੀਟਰਿਕ ਤਰਲ ਔਂਸ + {0} ਮੀਟਰਿਕ ਤਰਲ ਔਂਸ + {0} ਮੀਟਰਿਕ ਤਰਲ ਔਂਸ + {0} ਪ੍ਰਤੀ ਗੈਲਨ @@ -6038,30 +6248,85 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਇੰਪੀਰੀਅਲ ਚੁਥਾਈ ਗੈਲਨ {0} ਇੰਪੀਰੀਅਲ ਚੁਥਾਈ ਗੈਲਨ + + ਸਟਰੇਡੀਅਨ + {0} ਸਟਰੇਡੀਅਨ + {0} ਸਟਰੇਡੀਅਨ + + + ਕੇਟਲ + {0} ਕੇਟਲ + {0} ਕੇਟਲ + + + ਕੂਲਮ + {0} ਕੂਲਮ + {0} ਕੂਲਮ + + + ਫ਼ੈਰਡ + {0} ਫ਼ੈਰਡ + {0} ਫ਼ੈਰਡ + + + ਹੈਨਰੀ + {0} ਹੈਨਰੀ + {0} ਹੈਨਰੀ + + + ਸੀਮਨਜ਼ + {0} ਸੀਮਨਜ਼ + {0} ਸੀਮਨਜ਼ + + + ਕੈਲੋਰੀਆਂ [IT] + {0} ਕੈਲੋਰੀ [IT] + {0} ਕੈਲੋਰੀਆਂ [IT] + + + ਬੈਕਰਲ + {0} ਬੈਕਰਲ + {0} ਬੈਕਰਲ + + + ਸੀਵਰਟ + {0} ਸੀਵਰਟ + {0} ਸੀਵਰਟ + + + ਗ੍ਰੇਅ + {0} ਗ੍ਰੇਅ + {0} ਗ੍ਰੇਅ + + + ਕਿਲੋਗ੍ਰਾਮ-ਫ਼ੋਰਸ + {0} ਕਿਲੋਗ੍ਰਾਮ-ਫ਼ੋਰਸ + {0} ਕਿਲੋਗ੍ਰਾਮ-ਫ਼ੋਰਸ + + + ਟੈਸਲਾ + {0} ਟੈਸਲਾ + {0} ਟੈਸਲਾ + + + ਵੈਬਰਸ + {0} ਵੈਬਰ + {0} ਵੈਬਰਸ + masculine - ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ - + masculine - ਹਿੱਸਾ ਪ੍ਰਤੀ ਅਰਬ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਅਰਬ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਅਰਬ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਅਰਬ - {0} ਹਿੱਸਾ ਪ੍ਰਤੀ ਅਰਬ + ਹਿੱਸਾ ਪ੍ਰਤਿ ਅਰਬ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਅਰਬ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਅਰਬ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਅਰਬ + {0} ਹਿੱਸਾ ਪ੍ਰਤਿ ਅਰਬ feminine - ਰਾਤਾਂ - {0} ਰਾਤ - {0} ਰਾਤ - {0} ਰਾਤਾਂ - {0} ਰਾਤਾਂ - {0} ਪ੍ਰਤੀ ਰਾਤ + {0} ਪ੍ਰਤਿ ਰਾਤ ਮੁੱਖ ਦਿਸ਼ਾ @@ -6177,9 +6442,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮੀ/ਸ² - ਪਰਿਕਰਮਾ - {0} ਪਰਿਕਰਮਾ - {0} ਪਰਿਕਰਮਾ + ਚੱਕਰ + {0} ਚੱਕਰ + {0} ਚੱਕਰ ਰੇਡੀਅਨ @@ -6216,7 +6481,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ਮੀਟਰ² {0} ਮੀ² {0} ਮੀ² - {0} ਪ੍ਰਤੀ ਮੀ² + {0} ਪ੍ਰਤਿ ਮੀ² ਸੈਮੀ² @@ -6276,11 +6541,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਆਈਟਮ {0} ਆਈਟਮਾਂ - + + ਹਿੱਸਾ + {0} ਹਿੱਸਾ + {0} ਹਿੱਸੇ + + ਹਿੱਸੇ/ਮਿਲੀਅਨ - ਪ੍ਰਤੀਸ਼ਤ + ਪ੍ਰਤਿਸ਼ਤ ਪਰਮਾਈਲ @@ -6293,6 +6563,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮੋਲ {0} ਮੋਲ + + Glc + {0} Glc + {0} Glc + ਲਿਟਰ/ਕਿ.ਮੀ. {0} ਲਿ./ਕਿ.ਮੀ. @@ -6561,9 +6836,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/ਇੰਚ - ਪਾਸੈੱਕ - {0} ਪਾਸੈੱਕ - {0} ਪਾਸੈੱਕ + ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ ਪ੍ਰਕਾਸ਼ ਸਾਲ @@ -6708,6 +6983,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮਿ.ਮੀ. ਪਾਰਾ {0} ਮਿ.ਮੀ. ਪਾਰਾ + + ਪਾਰਾ + {0} ਪਾਰਾ + {0} ਪਾਰਾ + ਪੌਂ.ਵ.ਇੰਚ {0} ਪੌਂ.ਵ.ਇੰਚ @@ -6852,6 +7132,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮੀ ਕੱਪ {0} ਮੀ ਕੱਪ + + {0} fl oz m. + {0} fl oz m. + ਏਕੜ ਫੁੱਟ {0} ਏਕੜ ਫੁੱਟ @@ -6949,12 +7233,53 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਇੰਪ. ਚੁ. ਗੈ. {0} ਇੰਪ. ਚੁ. ਗੈ. + + {0} sr + {0} sr + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + ਪ੍ਰਕਾਸ਼ {0} ਪ੍ਰਕਾਸ਼ {0} ਪ੍ਰਕਾਸ਼ - + ਹਿੱਸਾ/ਅਰਬ @@ -6980,6 +7305,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ਮੀ/ਸ² {0}ਮੀ/ਸ² + + ਚੱਕਰ + {0} ਚੱਕਰ + {0} ਚੱਕਰ + ਡਿ. {0}° @@ -6993,6 +7323,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}″ {0}″ + + {0} ਪ੍ਰਤਿ ਮੀ² + {0}ਸੈਮੀ² {0}ਸੈਮੀ² @@ -7021,9 +7354,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ਆਈਟਮ {0}ਆਈਟਮ + + ਹਿੱਸਾ + {0} ਹਿੱਸਾ + {0} ਹਿੱਸੇ + + + ppm + + + Glc + {0}ਲਿ./ਕਿ.ਮੀ. {0}ਲਿ./ਕਿ.ਮੀ. @@ -7157,6 +7501,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}" {0}" + + ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ + {0} ਪਾਰਸੈਕ + R☉ @@ -7179,6 +7528,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hp {0} hp + + ਪਾਰਾ + {0} ਪਾਰਾ + {0} ਪਾਰਾ + {0}" ਪਾਰਾ {0}" ਪਾਰਾ @@ -7188,18 +7542,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਮਿ.ਬਾ. {0} ਮਿ.ਬਾ. - - {0} ਕਿ.ਮੀ./ਘੰ. - {0} ਕਿ.ਮੀ./ਘੰ. - {0}ਮੀ/ਸ {0}ਮੀ/ਸ - - {0} ਮੀਲ/ਘੰ. - {0} ਮੀਲ/ਘੰ. - °C @@ -7281,16 +7627,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ਇ.ਚੁ.ਗੈ. {0} ਇ.ਚੁ.ਗੈ. - - ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ - {0} ਪ੍ਰਕਾਸ਼ + + cal-IT - - ਰਾਤਾਂ - {0} ਰਾਤ - {0} ਰਾਤਾਂ - {0}/ਰਾਤ + + ppb diff --git a/make/data/cldr/common/main/pap.xml b/make/data/cldr/common/main/pap.xml index d537758ef24..5f0986b0cb9 100644 --- a/make/data/cldr/common/main/pap.xml +++ b/make/data/cldr/common/main/pap.xml @@ -293,29 +293,47 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1}, {0} + + + {1}, {0} + + + {1}, {0} - {1} {0} + {1}, {0} + + + {1}, {0} + + + {1}, {0} - {1} {0} + {1}, {0} {1}, {0} + + {1}, {0} + - {1} {0} + {1}, {0} {1}, {0} + + {1}, {0} + E, d @@ -519,21 +537,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic di promé kuartal di dos kuartal di tres kuartal - di kuanter kuartal + di kuater kuartal - - 1 kuartal - 2 kuartal - 3 kuartal - 4 kuartal - di promé kuartal di dos kuartal di tres kuartal - di kuanter kuartal + di kuater kuartal @@ -739,40 +751,371 @@ CLDR data files are interpreted according to the LDML specification (http://unic aña pasá e aña akí otro aña + + aki {0} aña + aki {0} aña + + + {0} aña pasá + {0} aña pasá + + + + kuartal + lastu kuartal + e kuartal akí + siguiente kuartal + + aki {0} kuartal + aki {0} kuartal + + + {0} kuartal pasá + {0} kuartal pasá + + + + kuartal + lastu kuartal + e kuartal akí + siguiente kuartal + + aki {0} kuartal + aki {0} kuartal + + + {0} kuartal pasá + {0} kuartal pasá + + + + kuartal luna luna pasá e luna akí otro luna + + aki {0} luna + aki {0} luna + + + {0} luna pasá + {0} luna pasá + + + + + aki {0} luna + aki {0} luna + + + {0} luna pasá + {0} luna pasá + + + + + aki {0} luna + aki {0} luna + + + {0} luna pasá + {0} luna pasá + siman siman pasá e siman akí otro siman + + aki {0} siman + aki {0} siman + + + {0} siman pasá + {0} siman pasá + e siman di {0} + + + aki {0} siman + aki {0} siman + + + {0} siman pasá + {0} siman pasá + + + + + aki {0} siman + aki {0} siman + + + {0} siman pasá + {0} siman pasá + + + + siman di luna + + + siman di luna + + + siman di luna + dia ayera awe mañan + + aki {0} dia + aki {0} dia + + + {0} dia pasá + {0} dia pasá + + + + + aki {0} dia + aki {0} dia + + + {0} dia pasá + {0} dia pasá + + + + + aki {0} dia + aki {0} dia + + + {0} dia pasá + {0} dia pasá + + + + dia di aña + + + dia di aña + + + dia di aña dia di siman + + dia den siman di luna + + + dia den siman di luna + + + dia den siman di luna + + + djadumingu pasá + djadumingu akí + siguiente djadumingu + + aki {0} djadumingu + aki {0} djadumingu + + + {0} djadumingu pasá + {0} djadumingu pasá + + + + djaluna pasá + djaluna akí + siguiente djaluna + + aki {0} djaluna + aki {0} djaluna + + + {0} djaluna pasá + {0} djaluna pasá + + + + djamars pasá + djamars akí + siguiente djamars + + aki {0} djamars + aki {0} djamars + + + {0} djamars pasá + {0} djamars pasá + + + + djarason pasá + djarason akí + siguiente djarason + + aki {0} djarason + aki {0} djarason + + + {0} djarason pasá + {0} djarason pasá + + + + djaweps pasá + djaweps akí + siguiente djaweps + + aki {0} djaweps + aki {0} djaweps + + + {0} djaweps pasá + {0} djaweps pasá + + + + djabièrnè pasá + djabièrnè akí + siguiente djabièrnè + + aki {0} djabièrnè + aki {0} djabièrnè + + + {0} djabièrnè pasá + {0} djabièrnè pasá + + + + djasabra pasá + djasabra akí + siguiente djasabra + + aki {0} djasabra + aki {0} djasabra + + + {0} djasabra pasá + {0} djasabra pasá + + periodo di dia ora + orario + + aki {0} ora + aki {0} ora + + + {0} ora pasá + {0} ora pasá + + + + ora + + aki {0} ora + aki {0} ora + + + {0} ora pasá + {0} ora pasá + + + + ora + + aki {0} ora + aki {0} ora + + + {0} ora pasá + {0} ora pasá + minüt + minüt + + aki {0} minüt + aki {0} minüt + + + {0} minüt pasá + {0} minüt pasá + + + + + aki {0}min. + aki {0}min. + + + {0}min pasá + {0}min pasá + + + + + aki {0}min. + aki {0}min. + + + {0}min. pasá + {0}min. pasá + sekònde + awoki + + aki {0} sekònde + aki {0} sekònde + + + {0} sekònde pasá + {0} sekònde pasá + + + + awoki + + aki {0}sek. + aki {0}sek. + + + {0}sek. pasá + {0}sek. pasá + + + + + aki {0}s + aki {0}s + + + {0}s pasá + {0}s pasá + zona di ora @@ -932,36 +1275,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤0mil - ¤0mil - ¤00mil - ¤00mil - ¤000mil - ¤000mil - ¤0mion - ¤0mion - ¤00mion - ¤00mion - ¤000mion - ¤000mion - ¤0bion - ¤0bion - ¤00bion - ¤00bion - ¤000bion - ¤000bion - ¤0trion - ¤0trion - ¤00trion - ¤00trion - ¤000trion - ¤000trion + ¤ 0mil + ¤ 0mil + ¤ 00mil + ¤ 00mil + ¤ 000mil + ¤ 000mil + ¤ 0mion + ¤ 0mion + ¤ 00mion + ¤ 00mion + ¤ 000mion + ¤ 000mion + ¤ 0bion + ¤ 0bion + ¤ 00bion + ¤ 00bion + ¤ 000bion + ¤ 000bion + ¤ 0trion + ¤ 0trion + ¤ 00trion + ¤ 00trion + ¤ 000trion + ¤ 000trion - Florin + Florin Karibense + Florin Karibense + Florin Karibense + XCG Florin di Aruba @@ -978,10 +1324,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dòler merikano + + Florin Karibense + {0} dia - {0} dianan + {0} dia di {0} @@ -993,12 +1342,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}-{1} - - {0} ost - {0} nort - {0} suit - {0} wèst - @@ -1009,14 +1352,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} wèst - - - {0} ost - {0} nort - {0} suit - {0} wèst - - @@ -1028,17 +1363,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} òf {1} - {0}, i {1} {0} & {1} - - {0}, i {1} - {0} i {1} - - - {0} i {1} - + + + si + no + + {0} — tur {0} — históriko diff --git a/make/data/cldr/common/main/pcm.xml b/make/data/cldr/common/main/pcm.xml index 165db2e975e..525131759e8 100644 --- a/make/data/cldr/common/main/pcm.xml +++ b/make/data/cldr/common/main/pcm.xml @@ -40,6 +40,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Azẹrbaijáni Lángwej Azẹ́rí Bashkír + Báluchí Balinẹẹ́s Básaa Lángwej Bẹlarúsiá Lángwej @@ -224,6 +225,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafiá Lángwej Kọlónián Lángwej Kọ́dísh Lángwej + Kọ́dísh Lángwej + Kọ́manjí Lángwej Kumyík Lángwej Komi Lángwej Kọ́nish Lángwej @@ -608,6 +611,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Chaína Kolómbia Klipatọ́n Aíland + Sák Kósta Ríka Kiúbá Kép Vẹ́d @@ -835,42 +839,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic Haú To Arénj Mọní Arénj Tins Wẹl Mọní + Imọ́ji presentáshọn Awá Saíkul (12 vs 24) Laín Brẹk Staíl + Laín Brẹks wídin wọds Sístẹm fọ Mẹ́zhọ́mẹnt Nọ́mba-dẹm + Sẹntẹns Brẹk Aftá Abbr Búdíst Kalẹ́nda + Búdíst Chaíníz Kalẹ́nda + Chaíníz Kọ́ptík Kalẹ́nda + Kọ́ptík Dangi Kalẹ́nda + Dangi Ẹtiópiá Kalẹ́nda + Ẹtiópiá Ẹtiópiá Amẹtẹ́ Álẹ́m Kalénda + Ẹtiópiá Amẹtẹ́ Álẹ́m Grẹ́górí Kalẹ́nda + Grẹ́górían Híbrú Kalẹ́nda + Híbrú Íslám Kalẹ́nda + Íslám Íslám Kalẹ́nda (Tébúlá Taip an Sívúl Taip) + Íslám (Tébúlá Taip an Sívúl Taip) Íslám Kalẹ́nda (Úmm al-Kúrá) + Íslám (Úmm al-Kúrá) ISO-8601 Kalẹ́nda Japán Kalẹ́nda + Japánis Pẹ́shia Kalẹ́nda + Pẹ́shia Ripọ́blík ọf Chaíná Kalẹ́nda + Ripọ́blík ọf Chaíná Akáunt To Ték Arénj Mọní + Akáunting Nọ́mál Wè To Arénj Mọní + Nọ́mál Yúníkód Mén Wè To Arénj Tins Wẹl + Yúníkód Mén Jẹ́nárál Sachin + Sach Nọ́mál Wè To Arénj Tins Wẹl + Nọ́mál Wè + Mén + Imọ́ji + Tẹxt 12 Áwa Sístẹm (0–11) + 12 (0–11) 12 Áwa Sístẹm (1–12) + 12 (1–12) 24 Áwa Sístẹm (0–23) + 24 (0–23) 24 Áwa Sístẹm (1–24) + 24 (1–24) Lúz Laín Brẹk Staíl + Lúz Nọ́mál Laín Brẹk Staíl + Nọ́mál Fíksd Laín Brẹk Staíl + Fíksd + Brẹk all + Kíp all + Nọ́mál + Kíp in frẹzis Mẹ́trík Sístẹm + Mẹ́trík Impẹ́riál Sístẹm fọ Mẹ́zhọ́mẹnt + UK US Sístẹm fọ Mẹ́zhọ́mẹnt + US Arábík Nọ́mba-dẹm Ẹstrá Arábík Nọ́mba-dẹm Armẹ́niá Nọ́mba-dẹm @@ -911,6 +954,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Taí Nọ́mba-dẹm Tíbẹt Nọ́mba-dẹm Vaí Nọ́mba-dẹm + Off + On Mẹ́trik @@ -989,7 +1034,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a - h a h:mm a h:mm:ss a M/d @@ -998,93 +1042,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic y G y G - - - h B – h B - - - h:mm B – h:mm B - - - G y – G y - - - GGGGG y-MM – GGGGG y-MM - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM - - - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – GGGGG y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - - - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – GGGGG y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - - - G y MMM – G y MMM - G y MMM – y MMM - - - G y MMM d – G y MMM d - G y MMM d – MMM d - G y MMM d – y MMM d - - - G y MMM d, E – MMM d, E - G y MMM d, E – G y MMM d, E - G y MMM d, E – MMM d, E - G y MMM d, E – y MMM d, E - - - MM-dd – MM-dd - MM-dd – MM-dd - - - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E - - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - - - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM - - - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - - - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - - - G y MMM – y MMM - - - G y MMM d – MMM d - G y MMM d – y MMM d - - - G y MMM d, E – MMM d, E - G y MMM d, E – MMM d, E - G y MMM d, E – y MMM d, E - - - G y MMMM – y MMMM - - @@ -1277,6 +1234,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'fọ' {0} + + {1} 'fọ' {0} + @@ -1285,22 +1245,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'fọ' {0} + + {1} 'fọ' {0} + - {1} {0} + {1}, {0} + + + {1}, {0} - {1} {0} + {1}, {0} + + + {1}, {0} d E E h:mm a E h:mm:ss a - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1325,50 +1293,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic 'Wiik' w 'fọ' Y - - h B – h B - - - h:mm B – h:mm B - Gy – Gy - - GGGGG y-MM – GGGGG y-MM - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM - - - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – GGGGG y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - - GGGGG y-MM-dd, E – y-MM-dd, E GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - - - G y MMM – G y MMM - G y MMM – y MMM - - - G y MMM d – G y MMM d - G y MMM d – MMM d - G y MMM d – y MMM d - G y MMM d, E – MMM d, E G y MMM d, E – G y MMM - G y MMM d, E – MMM d, E - G y MMM d, E – y MMM d, E - - - h a – h a - h–h a h:mm a – h:mm a @@ -1380,10 +1312,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - dd/MM – dd/MM dd/MM – dd/MM @@ -2266,9 +2194,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fnọ́m Pẹn - - Ẹ́ndábẹ́ri - Kritímáti @@ -2915,9 +2840,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Wẹ́st Áfríká Taim - Wẹ́st Áfríká Fíksd Taim - Wẹ́st Áfríká Họ́t Sízin Taim + Wẹ́st Áfríká Taim @@ -3267,6 +3190,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gayána Taim + + + Hawaií-Elúshián Fíksd Taim + + Hawaií-Elúshián Taim @@ -3812,7 +3740,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 @@ -4519,6 +4446,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Íst Karíbián Dọla + + Karíbíen Gílda + Karíbíen Gílda + Karíbíen Gílda + Wẹ́st Afríká Sẹ́fa Frank Wẹ́st Afríká Sẹ́fa frank @@ -4549,6 +4481,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Zámbiá kwácha Zámbiá kwáchas + + Zimbábwẹn Gọ́ld + Zimbábwẹn Gọ́ld + Zimbábwẹn Gọ́ld + {0}+ @@ -4749,7 +4686,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Mílimol Fọ Ẹ́vrí Líta {0} Mílimol Fọ Ẹ́vrí Líta - + + párts + + Pat-dẹm Fọ Ích Míliọn {0} Pat Fọ Ích Míliọn {0} Pat Fọ Ích Míliọn @@ -4771,6 +4711,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Mol {0} Mol + + ọf glúcọs + {0} of glúcọs + {0} of glúcọs + Líta-dẹm Fọ Ẹ́vrí Kilómíta {0} Líta Fọ Ẹ́vrí Kilómíta @@ -5520,22 +5465,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Impẹ́riál Kwọt {0} Impẹ́riál Kwọt - - laít - {0} laít - {0} laít + + katáls - + + tẹslás + + + Webers + {0} Wb + {0} webers + + pat fọ ích bíliọn {0} pat fọ ích bíliọn {0} pat fọ ích bíliọn - - nait - {0} nait - {0} nait - {0}/nait - Kádínál Pọint {0} Ist @@ -5679,7 +5624,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mílimol/Líta - + + párt + + Pat/Míliọn {0} pfim {0} pfim @@ -5693,6 +5641,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Fọ Ích Tẹ́n Taúzan + + glúcọs + Lítas/km @@ -5982,7 +5933,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sólá Luminósítis - T + M. Tọn-dẹm + {0} M. Tọn + {0} M. Tọn Grams @@ -6220,7 +6173,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} laít {0} laít - + pat/bíliọn {0} pfib {0} pfib @@ -6263,7 +6216,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kárá {0} kárá - + + párt + + Pfim @@ -6275,6 +6231,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + glúcọs + L/km @@ -6430,20 +6389,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}dzp-Imp - laít {0}laít {0}laít - + pfib {0}pfib {0}pfib - nait {0}nait {0}nait - {0}/nait {0}E @@ -6497,6 +6453,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} — Fít ích ọ́da {0} — Sọráund {0} — Strẹch + {0} Fẹsin left + {0} Fẹsin ráít {0} — Impọ́tant {0} — Dífrẹ́n Dífrẹ́n Tins {0} — Ọ́da diff --git a/make/data/cldr/common/main/pi.xml b/make/data/cldr/common/main/pi.xml new file mode 100644 index 00000000000..0a43e2dae6b --- /dev/null +++ b/make/data/cldr/common/main/pi.xml @@ -0,0 +1,16 @@ + + + + + + + + + + [aā b c dḍ e f g h iī j k lḷ mṁṃ nñṅṇ ŋ o p q r sśṣ tṭ uū v w x y z] + + diff --git a/make/data/cldr/common/main/pi_Latn.xml b/make/data/cldr/common/main/pi_Latn.xml new file mode 100644 index 00000000000..8858f03f456 --- /dev/null +++ b/make/data/cldr/common/main/pi_Latn.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + Italia + + + metrico + britànico + + + Lingua: {0} + Scritura: {0} + Region: {0} + + + + [aà b c {cc} {ch} d eéèë {eu} f g {gg} {gh} iì j l m n {n\-} oò p q r s {s\-c} {ss} t uù v z] + [h] + [\- ‑ — , ; \: ! ? . … '’ "“” « » ( ) \[ \] \{ \} @ /] + + + « + » + + + + + + + + + + gené + fërvé + mars + avril + magg + giugn + lugn + agost + stèmber + utuber + novèmber + dzèmber + + + + + + + dumìnica + lun-es + màrtes + merco + giòbia + vënner + saba + + + + + + h:mm a + h:mm:ss a + h:mm:ss a v + dd/MM/y + d MMM y + + + + + + Ora {0} + Ora legal: {0} + Ora stàndar: {0} + + + Ora dë Greenwich + + + + + + + , + . + + + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + diff --git a/make/data/cldr/common/main/pms_IT.xml b/make/data/cldr/common/main/pms_IT.xml new file mode 100644 index 00000000000..21a082b9cd4 --- /dev/null +++ b/make/data/cldr/common/main/pms_IT.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/prg.xml b/make/data/cldr/common/main/prg.xml index 13e1c01ac0d..cebddbf9f73 100644 --- a/make/data/cldr/common/main/prg.xml +++ b/make/data/cldr/common/main/prg.xml @@ -686,6 +686,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ {0} {1} diff --git a/make/data/cldr/common/main/ps.xml b/make/data/cldr/common/main/ps.xml index 55a7f06f86d..660449526f5 100644 --- a/make/data/cldr/common/main/ps.xml +++ b/make/data/cldr/common/main/ps.xml @@ -225,6 +225,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic بفیا کولوګنيايي کردي + کردش + کرمانجي کومک کومی کورنيشي @@ -619,6 +621,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic چین کولمبیا د کلپرټون ټاپو + سارک کوستاریکا کیوبا کیپ ورد @@ -850,43 +853,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic اسعارو بڼه ترتيب اسعارو + ایموجي پریزنټیشن د ساعت چکر (۱۲ پرتله ۲۴) د ماتې کرښې ډول + د کلمو دننه د کرښې وقفې د ناپ نظام شمېرې + جملې وقفه د ابر څخه وروسته بودايي جنتري + بودايي د چين جنتري + چینایی کاپټیک کیلنډر + قبطي ډانګي جنتري + دانګي ایتوپيک جنتري + ایتوپیایي د ایتوپیک امیټ ایلم تقویم + د ایتوپیا امیټ عالم ګريګورين جنتري + ګریګورین جورجویان جنتري + ګریګوریان اسلامي جنتري + هجري اسلامي جنتري (جدولي، مدني عصر) + هجري (جدول، مدني دوره) اسلامي جنتري (جدولي، ستورپوهنيز عصر) + هجري (جدول، ستورپوهنه) اسلامي کلیزه (ام القری) + هجري (ام القراء) ISO-8601 جنتري جاپاني جنتري + جاپاني فارسي جنتري + فارسي منگوو جنتري + منګوو محاسبه اسعارو بڼه + محاسبه معياري اسعارو بڼه + معیاري ډيفالټ يونيکوډ ترتيب + ډیفالټ یونیکوډ د عمومي موخي لټون + لټون د معیاري لټي ترتیب + معیاري + ډیفالټ + ایموجي + متن د ۱۲ ساعتو نظام (۰ـ۱۱) + ۱۲ (۰–۱۱) د ۱۲ ساعتو نظام (۱ ـ ۱۲) + ۱۲ (۱–۱۲) د ۲۴ ساعتو نظام (۰ـ۲۳) + ۲۴ (۰–۲۳) د ساعتو نظام (۱ـ۲۴) + ۲۴ (۱–۲۴) د غړندې ماتې کرښې ډول - د عادي ماتې کرښې ډول - د سختې ماتې کرښې ډول + خلاص + د عادي کرښې ماتولو طرز + عادي + د سختې کرښې ماتولو طرز + سخت + ټول مات کړئ + ټول وساتئ + عادي + په جملو کې وساتئ ميټرک نظام + میټریک امپيريل د ناپ نظام + انګلستان د متحده آيالاتو د ناپ نظام + امریکا عربي - انډیک عددونه غځېدلې عربي ۔ اينډيک عدد آرمينيايي اعداد @@ -927,6 +970,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic تايي اعداد تبتي اعداد وای اعداد + بند + چالان مېټرک @@ -953,9 +998,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -966,12 +1008,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEEE د G y د MMMM d + G y MMMM d, EEEE - د G y د MMMM d + G y MMMM d @@ -1109,6 +1151,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic نومبر دسمبر + + ج + ف + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + جنوري فېبروري @@ -1233,11 +1289,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + {1} په {0} + + + {1} په {0} + {1} {0} + + {1} په {0} + + + {1} په {0} + @@ -1301,7 +1369,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic صفر ربيع ربيع II - جماد + جماد I جماد ۲ رجب شعبان @@ -1311,11 +1379,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic ذي الحج + محرم + صفر + ربیع اول + ربيع II + جمادي اول + جماعه II + رجب + شعبان + رمضان + شوال + ذي القعده + ذي الحج + + + + محرم صفر ربيع ربيع II - جماعه + جماد I + جماد ۲ + رجب + شعبان + رمضان + شوال + دالقاعده + ذي الحج + + + محرم + صفر + ربیع اول + ربيع II + جمادي اول جماعه II رجب شعبان @@ -1326,9 +1424,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + G y MMMM d, EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + GGGGG y/M/d + + + + M/y G M/d/y GGGGG + E, M/d/y G + GGGGG y-MM + GGGGG y-MM-dd + GGGGG y-MM-dd, E @@ -1373,12 +1498,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic دور - - دور - - - دور - کال پروسږکال @@ -1740,7 +1859,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - د {0} په وخت + {0} وخت {0} رڼا ورځ وخت {0} معیاری وخت @@ -2096,6 +2215,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ایسټر + + کوهيک + پنټا آریناس @@ -2361,7 +2483,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic پنوم پن - انډربري + کانټون کيريټماټي @@ -3030,9 +3152,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - لوېديځ افريقا وخت - لویدیځ افریقایي معیاري وخت - د افریقا افریقا لویدیځ وخت + لوېديځ افريقا وخت @@ -3382,6 +3502,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic د ګوانانا وخت + + + هوایی الیوتین معیاری وخت + + هوایی الیوتین وخت @@ -3921,42 +4046,48 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) + + + ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) - 0K ¤ - 0K ¤ - 00K ¤ - 00K ¤ - 000K ¤ - 000K ¤ - 0M ¤ - 0M ¤ - 00M ¤ - 00M ¤ - 000M ¤ - 000M ¤ - 0G ¤ - 0G ¤ - 00G ¤ - ¤ 00B - ¤00B - ¤00B - ¤000B - ¤ 000B - ¤000B - ¤ 000B - 0T ¤ - 0T ¤ - 00T ¤ - 00T ¤ - 000T ¤ - 000T ¤ + ¤ 0K + ¤ 0K + ¤ 00K + ¤ 00K + ¤ 000K + ¤ 000K + ¤ 0M + ¤ 0M + ¤ 00M + ¤ 00M + ¤ 000M + ¤ 000M + ¤ 0B + ¤ 0B + ¤ 00B + ¤ 00B + ¤ 000G + ¤ 000B + ¤ 0T + ¤ 0T + ¤ 00T + ¤ 00T + ¤ 000T + ¤ 000T {0} ¤¤ @@ -4039,8 +4170,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic برونډي فرانک - برونډي فرانک - برونډي فرانکس برمودا ډالر @@ -4642,7 +4771,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic امريکايي ډالر امريکايي ډالر امريکايي ډالرې - $ + $ يوراګوي پسو @@ -4678,6 +4807,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ختيځ کربين ډالر ختيځ کربين ډالرې + + د کارابین ګیلډر + د کارابین ګیلډر + د کارابین ګیلډران + ختيځ افريقايي CFA فرانک ختيځ افريقايي CFA فرانک @@ -4706,6 +4840,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic زيمبي کواچا زيمبي کواچاز + + د زمبابوې سره زر + د زمبابوې سره زر + د زمبابوې سره زر + {0}+ @@ -4929,7 +5068,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic توکي - + + برخې + {0} برخه + {0} برخې + + پارټتس في مليون {0} پارټ في مليون {0} پارټس في مليون @@ -4951,6 +5095,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} مول {0} مولز + + د ګلوکوز + د ګلوکوز {0} + د ګلوکوز {0} + ليټرز في کيلو متر {0} ليټر في کيلو متر @@ -5142,6 +5291,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic متحده ایالاتو ترمامونه + {0} US تهرم + {0} US تهرم د قوې پاونډز @@ -5304,6 +5455,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic لکس + + کینډیلا + {0} کینډیلا + {0} کینډیلا + + + لومن + {0} لومن + {0} لومن + {0} لمريز ځلښت {0} لمريز ځلښتونه @@ -5371,6 +5532,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} لمريز حجم {0} لمريز حجم + + دانې + {0} دانې + {0} دانې + ګيګا واټس {0} ګيګا واټ @@ -5405,7 +5571,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} د پارې ملي متر {0} د پارې ملي مترز + + د پارې + د پارې {0} + د پارې {0} + + پونډ - په هر مربع انچ کې ځواک {0} پاونډ في مربع انچ {0} پاونډز في مربع انچ @@ -5414,6 +5586,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} د پارې انچ {0} د پارې انچې + + بارونه + {0} بار + {0} بارونه + ملي بارز {0} ملي بار @@ -5568,6 +5745,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} میټریک کپ {0} میټریک کپ + + میټریک مایع اونس + {0} میټریک مایع اونس + {0} میټریک مایع اونس + {0} اکړ فټ {0} اکړ فټ @@ -5636,11 +5818,77 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Imp. quart {0} Imp. quart - - شپي - {0}/شپه - {0}/شپه - {0}/شپه + + سټراډیان + {0} سټراډیان + {0} سټراډیانز + + + کاتالز + {0} کاتال + {0} کاتالز + + + کولمبونه + + + فارادونه + {0} فاراد + {0} فاراد + + + هینري + {0} هینري + {0} هینري + + + سیمنز + {0} سیمنز + {0} سیمنز + + + کالوري [IT] + {0} کالوري [IT] + {0} cal-IT + + + بیکریلز + {0} بیکریل + {0} بیکریلونه + + + {0} سیورټ + {0} سیورټونه + + + خړ + {0} خړ + {0} خړ رنګونه + + + کیلوګرامه ځواک + {0} کیلوګرامه ځواک + {0} kgf + + + ټیسلا + {0} ټیسلا + {0} ټیسلاز + + + ویبرز + {0} ویبر + {0} ویبرز + + + رڼا + {0} رڼا + {0} رڼا + + + برخې په ملیارد + {0} برخې په ملیارد + {0} برخې په ملیارد کارډنل اړخ @@ -5677,7 +5925,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic meters² - sq miles + مربع ميل {0} sq mi {0} sq mi @@ -5688,12 +5936,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic yards² - sq feet - {0} sq ft - {0} sq ft + مربع فټ + {0} مربع فټ + {0} مربع فټ - inches² + مربع انچ دونمز @@ -5711,7 +5959,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} توکی {0} توکی - + + برخه + {0} برخه + {0} برخه + + پارټس/مليون @@ -5728,6 +5981,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} مول {0} مول + + Glc + + + میلونه/ګیلن + ميلز/ګيلن ايمپيريل @@ -5805,7 +6064,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic amps - milliamps + ملي ايمپيرز اوهمز @@ -5830,6 +6089,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic US تهرم + {0} US تهرم + {0} US therm پاونډ قوه @@ -5869,7 +6130,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic پارسيکس - light yrs + نوري کاله فرلانګونه @@ -5880,6 +6141,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic لمريزې وړانګې + + کینډیلا + + + لومن + لمريز ځلښتونه @@ -5907,6 +6174,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic لمريز حجم + + دانې + {0} gr + {0} gr + واټس @@ -5915,6 +6187,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mmHg {0} mmHg + + د Hg + {0} د Hg + {0} د Hg + + + بار + {0} بار + {0} بار + km/hour {0} kph @@ -5988,6 +6270,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ډرام مایع + {0} ډرام + {0} ډرام جګر @@ -5999,8 +6283,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} چنه {0} چنه - - p/b + + کات + {0} کات + {0} کات + + + cal-IT + + + رڼا + {0} رڼا + {0} رڼا + + + برخې/ملیارد شپي @@ -6017,8 +6314,61 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + مربع ميل + + + ft² + {0}ft² + {0}ft² + + + مربع انچ + + + برخه + {0} برخه + {0} برخه + + + Glc + + + mpg + {0}mpg + {0}mpg + mpg UK + {0}m/gUK + {0}m/gUK + + + PB + + + TB + + + Tb + + + GB + + + Gb + + + MB + + + Mb + + + kB + + + kb کال @@ -6054,6 +6404,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic μsec + + ملي ايمپيرز + + + {0}US تهرم + {0}US تهرم + + + lbf + {0}lbf + {0} lbf + {0} kWh/100km {0}kWh/100km @@ -6080,7 +6442,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}″ {0}″ + + نوري کاله + + + لومن + + L☉ {0} L☉ {0}L☉ @@ -6093,6 +6462,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}g {0}g + + دانې + {0}gr + {0}gr + + + د Hg + {0} د Hg + {0} د Hg + + + بار + {0}بار + {0} بار + km/hr {0}kph @@ -6139,14 +6523,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}dsp-Imp {0}dsp-Imp - - p/b + + {0}fl.dr. + {0}fl.dr. - - شپي - {0}/شپه - {0}/شپه - {0}/شپه + + کات + {0} کات + {0} کات + + + cal-IT + + + رڼا + {0}رڼا + {0}رڼا + + + ppb {0}خ diff --git a/make/data/cldr/common/main/ps_PK.xml b/make/data/cldr/common/main/ps_PK.xml index 4eac726eaa2..c8e19898c73 100644 --- a/make/data/cldr/common/main/ps_PK.xml +++ b/make/data/cldr/common/main/ps_PK.xml @@ -167,6 +167,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic د فرانسے سویل او انټارټيک وخت + + + هوایی الیوتین رڼا ورځے وخت + + هوایی الیوتین رڼا ورځے وخت diff --git a/make/data/cldr/common/main/pt.xml b/make/data/cldr/common/main/pt.xml index 43027cd50d0..abafafc69a6 100644 --- a/make/data/cldr/common/main/pt.xml +++ b/make/data/cldr/common/main/pt.xml @@ -205,7 +205,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ havaiano haida do sul hebraico - híndi + hindi + hindi (latim) hinglish hiligaynon hitita @@ -283,6 +284,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch curdo + curdo + curmânji kumyk kutenai komi @@ -817,6 +820,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Colômbia Ilha de Clipperton + Sark Costa Rica Cuba Cabo Verde @@ -1101,33 +1105,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Classificação numérica Prioridade da classificação Moeda + Tipo de emoji Ciclo de horário (12 vs. 24) Estilo de quebra de linha + Quebras de linha em palavras Sistema de medição Números + Espaço após abreviação Fuso horário Variante de localidade Uso privado Calendário Budista + Budista Calendário Chinês + Chinês Calendário Copta + Copta Calendário Dangi + Dangi Calendário Etíope - Calendário Amete Alem da Etiópia + Etíope + Calendário Amete Alem Etíope + Amete Alem Etíope Calendário Gregoriano + Gregoriano Calendário Hebraico + Hebraico Calendário Nacional Indiano Calendário Hegírico + Hegírico Calendário Hegírico (tabular, época civil) + Hegírico (tabular, época civil) Calendário Hegírico (Umm al‑Qura) + Hegírico (Umm al‑Qura) Calendário ISO-8601 Calendário Japonês + Japonês Calendário Persa + Persa Calendário da República da China + Minguo Formato de moeda para contabilidade + Contabilidade Formato de moeda padrão + Padrão Classificar símbolos Classificar ignorando símbolos Classificar acentos normalmente @@ -1137,22 +1160,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Classificar por maiúsculas Classificação sem diferenciação de maiúsculas e minúsculas Classificação com diferenciação de maiúsculas e minúsculas - Ordem do Chinês Tradicional - Big5 Ordem anterior, para compatibilidade + Compatibilidade Ordem do dicionário + Dicionário Ordem padrão do Unicode + Padrão do Unicode Regras europeias de ordenação - Ordem do Chinês Simplificado - GB2312 Ordem de lista telefônica + Lista telefônica Ordem de classificação fonética + Fonética Ordem Pin-yin + Pinyin Pesquisa de uso geral + Pesquisa Pesquisar por consonante inicial hangul Ordem padrão + Padrão Ordem dos traços + Traços Ordem tradicional + Tradicional Ordem por Radical-Traços + Radical-Traços Ordem Zhuyin + Zhuyin Classificar sem normalização Classificar Unicode normalizado Classificar dígitos individualmente @@ -1165,18 +1198,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Largura inteira Meia largura Numérico + Padrão + Emoji + Texto Sistema de 12 horas (0–11) + 12 (0–11) Sistema de 12 horas (1–12) + 12 (1–12) Sistema de 24 horas (0–23) + 24 (0–23) Sistema de 24 horas (1–24) + 24 (1–24) Quebra de linha com estilo solto + Solto Quebra de linha com estilo normal + Normal Quebra de linha com estilo estrito + Estrito + Quebrar tudo + Manter tudo + Normal + Manter em frases Transliteração BGN EUA Transliteração UN GEGN Sistema métrico + Métrico Sistema de medição imperial + Reino Unido Sistema de medição americano + EUA Algarismos indo-arábicos Algarismos indo-arábicos estendidos Algarismos armênios @@ -1221,6 +1271,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Algarismos tibetanos Numerais tradicionais Algarismos vai + Desativado + Ativado métrico @@ -1265,9 +1317,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1394,6 +1443,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'às' {0} + + {1} 'às' {0} + @@ -1402,6 +1454,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'às' {0} + + {1} 'às' {0} + @@ -1410,6 +1465,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1418,19 +1476,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + + E, h B E, d + E, h a E h:mm a E h:mm:ss a y G + M/y G dd/MM/y GGGGG + E, M/d/y G MMM 'de' y G d 'de' MMM 'de' y G E, d 'de' MMM 'de' y G - h a h:mm a h:mm:ss a + h a, v + HH'h', v d/M E, dd/MM d 'de' MMM @@ -1721,6 +1787,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'às' {0} + + {1} 'às' {0} + @@ -1729,6 +1798,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'às' {0} + + {1} 'às' {0} + @@ -1737,6 +1809,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1745,23 +1820,31 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + + E, h B E, d + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + MM/y G dd/MM/y GGGGG + E, MM/dd/y G MMM 'de' y G d 'de' MMM 'de' y G E, d 'de' MMM 'de' y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + h a, v + HH'h', v dd/MM E, dd/MM dd/MM @@ -1788,11 +1871,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1838,7 +1919,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d 'de' MMM 'de' y – E, d 'de' MMM 'de' y G - h a – h a h – h a @@ -1863,7 +1943,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -2372,15 +2451,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Anguila - - Tirana - Tucumã - - Córdoba - Viena @@ -2405,30 +2478,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bermudas - - Eirunepé - - - Cuiabá - - - Santarém - - - Belém - - - Araguaína - - - São Paulo - - - Maceió - - - Fernando de Noronha - Saint John’s @@ -2438,12 +2487,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ilha de Páscoa + + Coihaique + Xangai - - Bogotá - Cabo Verde @@ -2453,9 +2502,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praga - - Büsingen - Berlim @@ -2468,15 +2514,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Argel - - Galápagos - Guaiaquil - - El Aaiún - Canárias @@ -2567,14 +2607,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nairóbi - Enderbury + Ilha de Canton Taraua - - Comores - São Cristóvão @@ -2629,9 +2666,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Cidade do México - - Nouméa - Manágua @@ -2704,9 +2738,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Riade - - Mahé - Cartum @@ -2728,12 +2759,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damasco - - N’Djamena - - - Lomé - Duchambe @@ -2825,9 +2850,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Horário da África Ocidental - Horário Padrão da África Ocidental - Horário de Verão da África Ocidental + Horário da África Ocidental @@ -3220,6 +3243,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Horário da Guiana + + + Horário Padrão do Havaí e Ilhas Aleutas + + Horário do Havaí e Ilhas Aleutas @@ -3670,6 +3698,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Horário de Chuuk + + + Horário da Turquia + Horário Padrão da Turquia + Horário de Verão da Turquia + + Horário do Turcomenistão @@ -5226,6 +5261,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dólar do Caribe Oriental Dólares do Caribe Oriental + + Florim do Caribe + Florim do Caribe + Florins do Caribe + Direitos Especiais de Giro Direitos de desenho especiais @@ -5344,6 +5384,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dólar do Zimbábue Dólares do Zimbábue + + Ouro zimbabueano + Ouro zimbabueano + Ouros zimbabueanos + Dólar do Zimbábue (2009) Dólar do Zimbábue (2009) @@ -5598,7 +5643,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine itens - + + partes + {0} parte + {0} partes + + feminine partes por milhão {0} parte por milhão @@ -5625,6 +5675,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} mols + + de glicose + {0} de glicose + {0} de glicose + masculine litros por quilômetro @@ -6206,6 +6261,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milímetro de mercúrio {0} milímetros de mercúrio + + de mercúrio + {0} de mercúrio + {0} de mercúrio + libras por polegada quadrada {0} libra por polegada quadrada @@ -6405,6 +6465,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} xícara métrica {0} xícaras métricas + + {0} onça fluida métrica + {0} onças fluidas métricas + {0} bushel {0} bushels @@ -6501,13 +6565,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quarto imperial {0} quartos imperiais + + esterradianos + {0} esterradiano + {0} esterradianos + + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calorias [IT] + {0} caloria [IT] + {0} calorias [IT] + + + becqueréis + {0} becquerel + {0} becqueréis + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + quilogramas-força + {0} quilograma-força + {0} quilogramas-força + + + teslas + {0} tesla + {0} teslas + + + webers + {0} weber + {0} webers + feminine - luz - {0} luz - {0} luzes - + feminine partes por bilhão {0} parte por bilhão @@ -6515,9 +6641,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - noites - {0} noite - {0} noites {0} por noite @@ -6601,7 +6724,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} item {0} itens - + + parte + {0} parte + {0} parte + + partes/milhão @@ -6613,6 +6741,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ponto base + + Glc + litros/km {0} l/km @@ -6881,6 +7012,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + de Hg + {0} de Hg + {0} de Hg + {0} bar {0} bars @@ -7043,12 +7179,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} impqt {0} impqt + + cal-IT + luz {0} luz {0} luzes - + partes/bilhão @@ -7112,7 +7251,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol/l - + + parte + {0} parte + {0} parte + + ppm @@ -7124,6 +7268,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + l/km @@ -7296,6 +7443,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ watt + + de Hg + {0} de Hg + {0} de Hg + {0} mb {0} mb @@ -7347,16 +7499,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} fl. oz. {0} fl. oz. - - luz - {0} luz - {0} luzes + + cal-IT - - noites - {0} noite - {0} noites - {0}/noite + + ppb {0}L diff --git a/make/data/cldr/common/main/pt_PT.xml b/make/data/cldr/common/main/pt_PT.xml index 81f0ef80a2c..b23a9da416b 100644 --- a/make/data/cldr/common/main/pt_PT.xml +++ b/make/data/cldr/common/main/pt_PT.xml @@ -64,7 +64,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ grego clássico alemão suíço haúça - hindi arménio inuktitut canadiano ocidental cabardiano @@ -262,14 +261,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Calendário dangi Calendário etíope Calendário etíope Amete Alem + Etíope Amete Alem Calendário gregoriano Calendário hebraico Calendário nacional indiano Calendário hegírico Calendário hegírico (civil) + Hegírico (civil) Calendário hegírico (Umm al-Qura) Calendário japonês Calendário persa + República da China Formato monetário contabilístico Formato monetário padrão Ordenar símbolos @@ -281,14 +283,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordenar por maiúsculas Ordenar insensível a maiúsculas/minúsculas Ordenar sensível a maiúsculas/minúsculas - Ordem do chinês tradicional - Big5 + Unicode padrão Regras de ordenação europeias - Ordem do chinês simplificado - GB2312 Ordem da lista telefónica + Lista telefónica Ordem de pinyin Ordenação padrão Ordem por traços Ordem por radical e traços + Radical e traços Ordem de zhuyin Ordenar sem normalização Ordenar Unicode normalizado @@ -301,11 +304,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordenar acentos/tipo de letra/largura Largura completa Estilo flexível de quebra de linha + Flexível Estilo padrão de quebra de linha + Padrão Estilo estrito de quebra de linha + Desfazer tudo + Padrão + Manter nas frases Transliteração BGN Transliteração UNGEGN Sistema de medida imperial + RU Sistema de medida americano Algarismos indo-arábicos expandidos Numeração arménia @@ -470,6 +479,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, d/M/y G MM/y G d/MM/y G E, d/MM/y G @@ -687,6 +697,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + dd/MM/y G + E, dd/MM/y G d/MM E, d/MM ccc, d 'de' MMMM @@ -1208,12 +1220,45 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora Coordenada Universal + + Localização desconhecida + Erevan + + Estação Rothera + + + Terra de Palmer + + + Estação Troll + + + Estação Showa + + + Estação Mawson + + + Estação Vostok + + + Estação Casey + + + Estação Dumont-d’Urville + + + Estação McMurdo + Tucumán + + Ilha Macquarie + Ilha de Lord Howe @@ -1226,9 +1271,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Porto-Novo - - Araguaina - Baía @@ -1250,9 +1292,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ilha do Natal - - Busingen - Jibuti @@ -1262,6 +1301,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Domínica + + Ilhas Galápagos + Talim @@ -1293,6 +1335,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora de verão da Irlanda + + Arquipélago de Chagos + Bagdade @@ -1305,6 +1350,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nairobi + + Ilha Canton + Tarawa @@ -1329,6 +1377,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Mónaco + + Atol de Kwajalein + Bamaco @@ -1350,6 +1401,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Niamei + + Ilha Norfolk + Amesterdão @@ -1357,7 +1411,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Catmandu - Chatham + Ilhas Chatham + + + Ilhas Marquesas Carachi @@ -1371,9 +1428,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Moscovo - - Mahe - São Marinho @@ -1386,6 +1440,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ndjamena + + Ilhas Kerguelen + Banguecoque @@ -1401,6 +1458,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Campala + + Atol de Midway + + + Ilha Wake + Nova Iorque @@ -1453,9 +1516,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora da África Ocidental - Hora padrão da África Ocidental - Hora de verão da África Ocidental + Hora da África Ocidental @@ -1521,9 +1582,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de Apia - Hora padrão de Apia - Hora de verão de Apia + Hora de Samoa + Hora padrão de Samoa + Hora de verão de Samoa @@ -1653,7 +1714,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora do Brunei Darussalam + Hora do Brunei @@ -1868,6 +1929,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora da Guiana + + + Hora padrão do Havai e Aleutas + + Hora do Havai e Aleutas @@ -1884,7 +1950,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de Hovd + Hora de Khovd Hora padrão de Hovd Hora de verão de Hovd @@ -2208,12 +2274,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de Ponape + Hora de Pohnpei - Hora de Pyongyang + Hora da Coreia do Norte @@ -2249,9 +2315,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de Samoa - Hora padrão de Samoa - Hora de verão de Samoa + Hora de Samoa Americana + Hora padrão de Samoa Americana + Hora de verão de Samoa Americana @@ -2291,9 +2357,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Hora de Taipé - Hora padrão de Taipé - Hora de verão de Taipé + Hora de Taiwan + Hora padrão de Taiwan + Hora de verão de Taiwan @@ -2318,6 +2384,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hora de Chuuk + + + Hora da Turquia + Hora Padrão da Turquia + Hora de Verão da Turquia + + Hora do Turquemenistão @@ -2461,10 +2534,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -2488,12 +2562,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 00 mM ¤ 000 mM ¤ 000 mM ¤ - 0 B ¤ - 0 B ¤ - 00 B ¤ - 00 B ¤ - 000 B ¤ - 000 B ¤ + 0 Bi ¤ + 0 Bi ¤ + 00 Bi ¤ + 00 Bi ¤ + 000 Bi ¤ + 000 Bi ¤ @@ -3329,6 +3403,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dólar das Caraíbas Orientais dólares das Caraíbas Orientais + + florim caribenho + florim caribenho + florins caribenhos + direito especial de saque direitos especiais de saque @@ -3383,6 +3462,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dólar do Zimbabwe + + ouro zimbabuense + ouro zimbabuense + ouros zimbabuenses + {0} - {1} @@ -3616,6 +3700,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} chávena métrica {0} chávenas métricas + + onças fluidas métricas + acre-pés {0} acre-pé @@ -3632,7 +3719,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} dracma {0} dracmas - + partes por mil milhões {0} parte por mil milhões {0} partes por mil milhões @@ -3744,8 +3831,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ metros - {0} milha - {0} milhas + {0} mi + {0} mi polegadas @@ -3867,7 +3954,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quarto imp. {0} quartos imp. - + partes/mil milhões {0} ppmm {0} ppmm @@ -3975,10 +4062,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dram fl - + ppmm - {0} ppmm - {0} ppmm diff --git a/make/data/cldr/common/main/qu.xml b/make/data/cldr/common/main/qu.xml index e6fda4e4aca..e0c664f1a7e 100644 --- a/make/data/cldr/common/main/qu.xml +++ b/make/data/cldr/common/main/qu.xml @@ -41,6 +41,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Azerbaiyano Simi Azerí Simi Baskir Simi + Baluchi Simi Balines Simi Basaa Simi Bielorruso Simi @@ -48,10 +49,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bena Simi Bulgaro Simi Haryanvi - Bhojpuri + Bhojpuri Simi Bislama Bini Siksiká Simi + Anii Simi Bambara Simi Bangla Simi Tibetano Simi @@ -164,6 +166,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Iban Simi Ibibio Simi Indonesio Simi + Interlingue Simi Igbo Simi Yi Simi Inuktitut Simi (Canadá occidental) @@ -212,10 +215,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Simi Kölsch Simi Kurdo Simi + Kurdo Simi + Kurmanji Simi Kumyk Simi Komi Simi Córnico Simi Kwakʼwala Simi + Kuvi Simi Kirghiz Simi Latín Simi Ladino Simi @@ -224,8 +230,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Lezghian Simi Luganda Simi Limburgues Simi + Liguria Simi Lillooet Simi Lakota Simi + Lombardo Simi Lingala Simi Lao Simi Luisiana Criollo @@ -267,7 +275,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Malayo Simi Maltes Simi Mundang Simi - Idiomas M´últiples Simi + Achka simikuna Muscogee Simi Mirandés Simi Birmano Simi @@ -375,6 +383,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Suajili Simi (Congo (RDC)) Comorian Simi Siriaco Simi + Silesiano Tamil Simi Tutchone Meridional Telugu Simi @@ -414,7 +423,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Uzbeko Simi Vai Simi Venda Simi + Veneciamanta Vietnamita Simi + Makhuwa Simi Volapük Simi Vunjo Simi Valona Simi @@ -425,6 +436,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Wu Chino Kalmyk Simi Isixhosa Simi + Kangri Simi Soga Simi Yangben Simi Yemba Simi @@ -433,6 +445,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nheengatu Simi Cantonés Simi Chino Cantonés Simi + Zhuang Bereber Marroquí Estándar Simi Chino Simi Chino Mandarín Simi @@ -589,6 +602,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic China Colombia Isla Clipperton + Sark Costa Rica Cuba Cabo Verde @@ -814,42 +828,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic Imayna Qullqi kaynin Ñiqinchana qullqi + Emoji nisqamanta rikuchiy Ciclo de Horas (12 vs 24) Siqi paway kaynin + Simikuna ukhupi Chiru Pakikuna Tupuy Kamay Yupaykuna + Oración Pakikuy Abbr. Budista Intiwatana + Buddhist Chino Intiwatana + Chinese Copto Intiwatana + Copto Dangi Intiwatana + Dangi Etiope Intiwatana + Ethiopic Etíope Amete Alem Intiwatana + Ethiopic Amete Alem Gregoriano Intiwatana + Gregorian Hebreo Intiwatana + Hebreo Hijri Intiwatana + Hijri Hijri Intiwatana (tabular, epoca civil) + Hijri (tabular, epoca civil) Hijri Intiwatana (Umm al-Qura) + Hijri (Umm al-Qura) ISO-8601 Intiwatana Japones Intiwatana + Japones Persa Intiwatana + Persa Minguo Intiwatana + Minguo Yupana Qullqi imayna kaynin + Accounting Estandar nisqa qullqi imayna kaynin + Standard Ñawpaqchasqa Unicode Nisqa Ñiqinchana + Ñawpaqchasqa Unicode Llapanpaq maskana + maskana Estandar nisqa Ñiqinchana + Estandar + Default + Emoji + Text 12 hora kaynin (0–11) + 12 (0–11) 12 hora kaynin (1–12) + 12 (1–12) 24 hora kaynin (0–23) + 24 (0–23) 24 hora kaynin (1–24) + 24 (1–24) Siqi paway chinkachiy kaynin + Loose Siqi paway Normal kaynin + Normal Siqi paway Chiqa kaynin + Strict + Tukuyta pakiy + Tukuy imata waqaychay + Normal + Frases nisqapi waqaychay Metrico Kamay + Metrico Metrico Ingles Kamay + UK Metrico Americano Kamay + US Arabe Sananpakuna Arabe Mirachisqa Sananpakuna Armenio Sananpakuna @@ -890,6 +943,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Thai Sananpakuna Tibetano Sananpakuna Vai Yupaykuna + Off + On Simi: {0} @@ -899,8 +954,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic [a {ch} {chʼ} h i k {kʼ} l {ll} m nñ p {pʼ} q {qʼ} s t {tʼ} u w y] - [áàăâåäãā æ b cç d eéèĕêëē f g íìĭîïī j oóòŏôöøō œ r úùŭûüū v x ÿ z] - [A {Ch} H I K L {Ll} M NÑ P Q S T U W Y] + [áàăâåäãā æ b cç {chh} d eéèĕêëē f g íìĭîïī j oóòŏôöøō œ {ph} {qh} r úùŭûüū v x ÿ z] + [A {CH} H I K L {Ll} M NÑ P Q R S T U W Y] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] @@ -1970,9 +2025,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tokio - - Enderbury - San Cristobal @@ -2136,9 +2188,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Hora de Africa Occidental - Hora Estandar de Africa Occidental - Hora Estandar de Verano de Africa Occidental + Hora de Africa Occidental @@ -2488,6 +2538,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hora de Guyana + + + Hora Estandar de Hawai-Aleutiano + + Hora de Hawai-Aleutiano @@ -3004,7 +3059,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - #,##0.00;(#,##0.00) + #,##0.00 @@ -3604,6 +3659,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dólar del Caribe Oriental Dólar del caribe oriental + + Caribe guilderkuna + Caribe guilderkuna + Franco CFA de África Occidental Franco CFA de áfrica occidental @@ -3627,6 +3686,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kwacha Zambiano Kwacha zambiano + + Zimbabuemanta quri + Zimbabuemanta quri + {0}qi yupayta hapiy. @@ -3775,7 +3838,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic imakuna {0} imakuna - + partes por millon {0} partes por millon @@ -4139,7 +4202,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ima {0} ima - + partes/millon diff --git a/make/data/cldr/common/main/rif.xml b/make/data/cldr/common/main/rif.xml index 4c254f9e790..5b7abd373cc 100644 --- a/make/data/cldr/common/main/rif.xml +++ b/make/data/cldr/common/main/rif.xml @@ -14,10 +14,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic taɛrabt taɛrabt tamaynut + asamis tabanɣaliyt + ttcik talimant taglinzit - taglinzit (UK) taseppanyut tafransist tahindawiyt @@ -29,7 +30,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic taflamant tapulandiyt tapurtuɣaliyt - tapurtuɣaliyt (brazil) tapurtuɣaliyt (uruppa) Tarifit tarusiyt @@ -46,8 +46,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - + + @@ -133,13 +133,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic rripublik n terfriqt n lwesṭ kungu sswis - kudivwar + kudibwar tigzirin n kuk tcili kamirun tcina kulumbya tigzirin n klipirṭun + sark kustarika kuba qabu yazegza @@ -206,7 +207,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic timmura n uglanzi di lebḥer ahindawi lɛiraq iran - ayeslanda + yeslanda atayal jirsi jamayka @@ -252,7 +253,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic munsirat malṭa muricyus - lmaldiv + lmaldib malawi miksiku malizya @@ -299,8 +300,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic sswid sanɣafura santḥilina - sluvinya - svalbard d janmayen + slubinya + sbalbard d janmayen sluvakya siraliyyun sanmarinu @@ -314,7 +315,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic surya iswatini tristan dakuna - ṭṭurks d tegzirin n kaykus + tigzirin n ṭurks d kaykus tcad timmura tifransisin nwadday ṭṭugu @@ -329,10 +330,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ṭurekya ṭṭurk trinidad d ṭubagu - ṭuvalu + ṭubalu ṭṭaywan ṭanzanya - ukrayina + ukranya uɣanda tigzirin timirikanin i yegʷjen tamunt n tmura @@ -340,18 +341,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic US urugway uzbakistan - lvatikan + lbatikan sanvinsit d grinadin - vanzwilla + banzwilla tigzirin tiɛezriyyin tiglanziyyin tigzirin tiɛezriyyin timarikanin - vitnam - vanwatu + bitnam + banwatu walis d futuna samwa awal amsaqar bidi tamsaqart - kusuvu + kusubu lyaman mayuṭ tafriqt n wadday @@ -361,11 +362,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic taklindart tagrikant + agrikan taklindart tameslemt + ameslem taklindart tameslemt (leḥsab) + ameslem (leḥsab) taklindart tameslemt (ayur) + ameslem (ayur) kalandar n ISO-8601 asettef sṭandar + sṭandar nnumrawat irumiyyen @@ -418,6 +424,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ɣer' {0} + + {1} 'ɣer' {0} + @@ -426,6 +435,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ɣer' {0} + + {1} 'ɣer' {0} + @@ -441,10 +453,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic dd E dd y G + MM/y G dd/MM/y GGGGG + E dd/MM/y G MMM y G dd MMM y G E dd MMM y G + LL dd/MM E dd/MM dd MMM @@ -587,12 +602,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic yebril mayyu yunyu - yulyuz - ɣucct - cutenber + yulyu + ɣuccet + cutembir kṭuber - nuwember - dujember + nuwembir + dujembir @@ -610,6 +625,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic n d + + yennayer + febrayer + mars + yebril + mayyu + yunyu + yulyu + ɣuccet + cutembir + kṭuber + nuwembir + dujembir + @@ -744,6 +773,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ɣer' {0} + + {1} 'ɣer' {0} + @@ -752,6 +784,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ɣer' {0} + + {1} 'ɣer' {0} + @@ -767,7 +802,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic dd E dd y G + MM/y G dd/MM/y G + E dd/MM/y G MMM y G dd MMM y G E dd MMM y G @@ -830,7 +867,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E dd MMM y – E dd MMM y G - h a – h a h – h a @@ -855,7 +891,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm – HH:mm v - h a – h a v h – h a v @@ -1091,12 +1126,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud agraɣlan amezday + + wer yettemwassen + andura dubay + + kabul + antigwa @@ -1112,6 +1153,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic lwanda + + stasyun n rutira + + + palmer + + + stasyun n ṭrul + + + stasyun n suwa + + + stasyun n mawsun + + + deybis + + + stasyun n bustuk + + + stasyun n kasi + + + dimun durbil + + + stasyun n makmurdu + riyugayyigus @@ -1148,9 +1219,48 @@ CLDR data files are interpreted according to the LDML specification (http://unic bwinusayris + + pagupagu + byinna + + pert + + + yukla + + + darwin + + + adelayd + + + brukenhil + + + milben + + + hubart + + + lindman + + + sidni + + + brizban + + + tayzirt n makkari + + + lurdhaw + aruba @@ -1166,6 +1276,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic barbadus + + dhaka + bruksil @@ -1190,6 +1303,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic birmuda + + brunay + lappaz @@ -1247,6 +1363,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic nassaw + + timpfu + gaburun @@ -1263,7 +1382,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic waythurs - inuvik + inubik fankufer @@ -1325,6 +1444,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic sanjuns + + tiyzirin n kukus + kincasa @@ -1343,9 +1465,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic abidjan + + raruṭunga + ister + + kuyhayki + puntarinas @@ -1355,6 +1483,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic diwala + + urumutci + + + canhay + buguṭa @@ -1362,7 +1496,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kustarika - havana + habana qabubirdi @@ -1370,6 +1504,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic kuracaw + + tayzirt n kristmas + nikuzya @@ -1433,9 +1570,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic hilsinki + + fiji + sṭanli + + tcuk + + + punpi + + + kursay + faraw @@ -1502,12 +1651,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic gwatimala + + gwam + bisaw guyana + + hungkung + tigicigalpa @@ -1520,6 +1675,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic budabist + + jakarṭa + + + puntyanak + + + makasar + + + jayapura + akud anaway ayirlandi @@ -1532,14 +1699,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic tagzirt n man + + kulkaṭa + ttcagus baɣdad + + ṭahran + - reykjavik + reykjabik ruma @@ -1553,21 +1726,69 @@ CLDR data files are interpreted according to the LDML specification (http://unic ɛamman + + ṭukyu + nayrubi + + bickik + + + knumpayn + + + tagzirt n kanṭun + + + kiritimati + + + ṭarawa + kumuru sankits + + pyungyang + + + syul + kuwit sayman + + aqṭaw + + + ural + + + aṭraw + + + aqtubi + + + qusṭanay + + + qazalurda + + + almaṭi + + + bintyan + bayrut @@ -1575,7 +1796,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic sanlucya - vaduts + faduts + + + kulumbu munrubya @@ -1613,12 +1837,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic antananaribu + + kwajilen + + + majuru + skupya bamaku + + yangun + + + xubd + + + ulanbaṭar + + + makkaw + + + saypan + martinik @@ -1629,11 +1874,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic muntsirat - malta + malṭa muriṭanya + + lmaldib + blanṭayr @@ -1673,15 +1921,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic kankun + + kwalalampur + + + kutcin + maputu binhuwk + + numya + nyamiy + + tayzirt n nurfuk + lagus @@ -1694,6 +1954,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic uslu + + katmandu + + + nawru + + + nyu + + + tcatem + + + ukland + masqaṭ @@ -1703,12 +1978,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic lima + + tahiti + + + markwisas + + + gambyi + + + mursbay + + + bugenbil + + + manila + + + kratci + warsaw mikilon + + pitkirn + ppurturiku @@ -1727,6 +2026,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic licbuna + + palaw + asuntyun @@ -1770,7 +2072,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic yekaterinburg - omsek + umsek nubusibiresk @@ -1826,6 +2128,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic riyad + + gwadelkanal + mahi @@ -1835,6 +2140,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic sṭukhulm + + singappur + santhilina @@ -1892,15 +2200,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic lumi + + bangkuk + + + ducanba + + + fakawfu + + + dili + + + ɛicqabad + tunes + + ṭungaṭapu + sṭanbul ppurtufspin + + funafuti + + + ṭaypay + daressalam @@ -1913,6 +2245,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic kampala + + midway + + + tagzirt n wayk + adak @@ -1944,7 +2282,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic finiks - dinver + dinbir bulah, nurtdakuṭa @@ -1962,7 +2300,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic minumini - vinsanz, indyana + binsanz, indyana pitersburg, indyana @@ -1983,10 +2321,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic indyanapulis - lwisvil + lwisbil - vivi, indyana + bibi, indyana muntitcilu, kinṭaki @@ -2000,11 +2338,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic muntibidyu + + samarqand + + + tacqand + lbatikan - sanvinsint + sanbinsint karakas @@ -2015,6 +2359,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic sanṭumas + + hutcimin + + + ifaṭi + + + wilis d futuna + + + apya + ɛadan @@ -2030,6 +2386,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic harari + + + akud n afɣanistan + + akud n tefriqt n lwesṭ @@ -2047,9 +2408,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - akud n tefriqt n lɣerb - akud anaway n tefriqt n lɣerb - akud n uzil n tefriqt n lɣerb + akud n tefriqt n lɣerb @@ -2094,6 +2453,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n pasifik + + + akud n samwa + akud anaway n samwa + akud n uzil n samwa + + akud n waɛrab @@ -2129,6 +2495,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n atlantik + + + akud suntral n wustralya + akud suntral anaway n wustralya + akud suntral n uzil n wustralya + + + + + akud suntral n lɣerb n wustralya + akud suntral anaway n lɣerb n wustralya + akud suntral n uzil n lɣerb n wustralya + + + + + akud n ccerq n wustralya + akud anaway n ccerq n wustralya + akud n uzil n ccerq n wustralya + + + + + akud n lɣerb n wustralya + akud anaway n lɣerb n wustralya + akud n uzil n lɣerb n wustralya + + akud n azrabidjan @@ -2143,9 +2537,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n azures + + + akud n bangladic + akud anaway n bangladic + akud n uzil n bangladic + + + + + akud n butan + + - akud n bulivya + akud n bulibya @@ -2155,6 +2561,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n brazilya + + + akud n brunay + + akud n qabubirdi @@ -2162,6 +2573,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n qabubirdi + + + akud anaway n tcamuru + + + + + akud n tcatem + akud anaway n tcatem + akud n uzil n tcatem + + akud n cili @@ -2176,6 +2599,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n tcina + + + akud n tayzirt n kristmas + + + + + akud n tiyzirin n kukus + + akud n kulumbya @@ -2183,6 +2616,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n kulumbya + + + akud n tigzirin n kuk + akud anaway n tigzirin n kuk + akud n uzil n tigzirin n kuk + + akud n kuba @@ -2190,6 +2630,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n kuba + + + akud n deybis + + + + + akud n dimun durbil + + + + + akud n ṭimur licti + + akud n isterayland @@ -2235,6 +2690,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n falkland + + + akud n fiji + akud anaway n fiji + akud n uzil n fiji + + akud n ɣana tafransist @@ -2250,6 +2712,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n galappagus + + + akud n gambyi + + akud n jyurjya @@ -2257,6 +2724,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n jyurjya + + + akud n tigzirin n gilbert + + GMT @@ -2286,6 +2758,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n guyana + + + akud anaway n haway-alucyan + + akud n haway-alucyan @@ -2302,9 +2779,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic - akud n hubd - akud anaway n hubd - akud n uzil n hubd + akud n xubd + akud anaway n xubd + akud n uzil n xubd + + + + + akud anawy n lhend @@ -2312,6 +2794,40 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n lebḥer ahindi + + + akud n indutcina + + + + + akud n yindunisya n lwesṭ + + + + + akud n ccerq n yindunisya + + + + + akud n lɣerb n yindunisya + + + + + akud n iran + akud anaway n iran + akud n uzil n iran + + + + + akud n irkutsek + akud anaway n irkutsek + akud n uzil n irkutsek + + akud n yisrayil @@ -2319,6 +2835,91 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n yisrayil + + + akud n jjapun + akud anaway n jjapun + akud n uzil n jjapun + + + + + akud n kazaxistan + + + + + akud n ccerq n kazaxistan + + + + + akud n lɣerb n kazaxistan + + + + + akud n kurya + akud anaway n kurya + akud n uzil n kurya + + + + + akud n kursay + + + + + akud n krasnuyarsek + akud anaway n krasnuyarsek + akud n uzil n krasnuyarsek + + + + + akud n krigistan + + + + + akud n tigzirin n layn + + + + + akud n lurdhaw + akud anaway n lurdhaw + akud n uzil n lurdhaw + + + + + akud n magadan + akud anaway n magadan + akud n uzil n magadan + + + + + akud n malizya + + + + + akud n lmaldib + + + + + akud n markwisas + + + + + akud n tigzirin n marcal + + akud n mawritus @@ -2326,6 +2927,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n mawritus + + + akud n mawson + + akud n pasifik amiksikan @@ -2333,6 +2939,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n pasifik amiksikan + + + akud n ulanbaṭar + akud anaway n ulanbaṭar + akud n uzil n ulanbaṭar + + + + + akud n musku + akud anaway n musku + akud n uzil n musku + + + + + akud n myanmar + + + + + akud n nawru + + + + + akud n nnipal + + + + + akud n nyewkalidunya + akud anaway n nyewkalidunya + akud n uzil n nyewkalidunya + + + + + akud n nyuziland + akud anaway n nyuziland + akud n uzil n nyuziland + + akud n nyuw fawemd land @@ -2340,6 +2989,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n nyuw fawemd land + + + akud n nyu + + + + + akud n tayzirt n nurfuk + akud anaway n tayzirt n nurfuk + akud n uzil n tayzirt n nurfuk + + akud n firnardu dinurunha @@ -2347,6 +3008,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n firnardu dinurunha + + + akud n nubusibirsek + akud anaway n nubusibirsek + akud n uzil n nubusibirsek + + + + + akud n umsek + akud anaway n umsek + akud n uzil n umsek + + + + + akud n pakistan + akud anaway n pakistan + akud n uzil n pakistan + + + + + akud n palaw + + + + + akud n papwa ɣinya tamaynut + + akud n pparagway @@ -2361,6 +3053,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n ppiru + + + akud n filippin + akud anaway n filippin + akud n uzil n filippin + + + + + akud n tigzirin n finiks + + akud n sant-pyiɣ d mikilun @@ -2368,16 +3072,60 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n sant-pyiɣ d mikilun + + + akud n pitkirn + + + + + akud n punpi + + + + + akud n kurya n sennej + + akud n riyunyun + + + akud n rutira + + + + + akud n saxalin + akud anaway n saxalin + akud n uzil n saxalin + + + + + akud n samwa tamarikant + akud anaway n samwa tamarikant + akud n uzil n samwa tamarikant + + akud n saycal + + + akud anaway n singappur + + + + + akud n tigzirin n sulumun + + akud n jyurjya n wadday @@ -2388,6 +3136,57 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n surinam + + + akud n syuwa + + + + + akud n tahiti + + + + + akud n ṭṭaywan + akud anaway n ṭṭaywan + akud n uzil n ṭṭaywan + + + + + akud n tajikistan + + + + + akud n tuwkulaw + + + + + akud n ṭunga + akud anaway n ṭunga + akud n uzil n ṭunga + + + + + akud n tcuk + + + + + akud n ṭurkmanistan + akud anaway n ṭurkmanistan + akud n uzil n ṭurkmanistan + + + + + akud n ṭubalu + + akud n urugway @@ -2395,11 +3194,68 @@ CLDR data files are interpreted according to the LDML specification (http://unic akud n uzil n urugway + + + akud n uẓbakistan + akud n anaway n uẓbakistan + akud n uzil n uẓbakistan + + + + + akud n banwatu + akud anaway n banwatu + akud n uzil n banwatu + + akud n vinzwila + + + akud n bladibustuk + akud anaway n bladibustuk + akud n uzil n bladibustuk + + + + + akud n bulgugrad + akud anaway n bulgugrad + akud n uzil n bulgugrad + + + + + akud n bustuk + + + + + akud n tagzirt n wayk + + + + + akud n walis d futuna + + + + + akud n yakutsek + akud anaway n yakutsek + akud n uzil n yakutsek + + + + + akud n yakatirinburg + akud anaway n yakatirinburg + akud n uzil n yakatirinburg + + akud n yukun @@ -2441,14 +3297,126 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ + + + + + 0K ¤ + 00K ¤ + 000K ¤ + 0M ¤ + 00M ¤ + 000M ¤ + 0G ¤ + 00G ¤ + 000G ¤ + 0T ¤ + 00T ¤ + 000T ¤ + + dderhem n limarat + dderhem n limarat + + + afɣani + afɣani + + + lik n walbanya + lik n walbanya + + + ddram n arminya + ddram n arminya + + + xulden n wantil + xulden n wantil + + + kwanza n angula + kwanza n angula + + + pisus n arxantina + pisus n arxantina + + + ddular n wustralya + ddular n wustralya + + + flurin n aruba + flurin n aruba + + + manat n azrabijan + manat n azrabijan + + + mark n busniya + mark n busniya + + + ddular n barbadyan + ddular n barbadyan + + + ṭaka n bangladic + ṭaka n bangladic + + + liva n belgarya + liva n belgarya + + + ddinar n lbeḥrin + ddinar n lbeḥrin + + + frank n burundi + frank n burundi + Bermudan Dollar ddular n birmudan + + ddular n brunay + ddular n brunay + + + bulibyanu + bulibyanu + + + riyal n brazil + riyal n brazil + + + ddular n bahamas + ddular n bahamas + + + ngultrum n buṭan + ngultrum n buṭan + + + pula n buteswana + pula n buteswana + + + rrubel n bilarus + rrubel n bilarus + Belize Dollar ddular n biliz @@ -2457,66 +3425,542 @@ CLDR data files are interpreted according to the LDML specification (http://unic Canadian Dollar ddular n kanada + + frank n kungu + frank n kungu + + + frank + frank + + + pisus n tcili + pisus n tcili + + + ywan n cina + ywan n cina + + + ywan n tcina + ywan n tcina + + + pisus n kulumbya + pisus n kulumbya + Costa Rican Colón kulun n kustarika + + pisus n kuba + pisus n kuba + + + pisus n kuba + pisus n kuba + + + iskudu n qabu yazegza + iskudu n qabu yazegza + + + kruna n ttcik + kruna n ttcik + + + frank n djibuti + frank n djibuti + Danish Krone kruna n ddanmark + + pisus n dduminik + pisus n dduminik + Algerian Dinar ddinar n ddzayer + + ljunih n masr + ljunih n masr + + + nafka n iritirya + nafka n iritirya + + + bir n yityupya + bir n yityupya + Euro uru + + ddular n fiji + ddular n fiji + + + ljunih n falkland + ljunih n falkland + British Pound - ppaʷndd + jinuh + + + lari n gyurgya + lari n gyurgya + + + sidiy n ɣana + sidiy n ɣana + + + ljunih n jabalṭariq + ljunih n jabalṭariq + + + dalasi n ɣambya + dalasi n ɣambya + + + frank n ɣinya + frank n ɣinya Guatemalan Quetzal kwitzal n gwatimala + + ddular n guyana + ddular n guyana + + + ddular n hungkung + ddular n hungkung + Honduran Lempira lempiras n hondura + + kuna n kerwatya + kuna n kerwatya + + + ɣurda n hayṭi + ɣurda n hayṭi + + + furint n hungatya + furint n hungatya + + + rrupya n yindunisya + rrupya n yindunisya + + + cikel + cikel + + + rrupya n lhend + Indian rupees + + + ddinar n lɛiraq + ddinar n lɛiraq + + + rryal n iran + Iranian rials + + + kruna n yeslanda + kruna n yeslanda + + + ddular n jamayka + ddular n jamayka + + + ddinar n lurdun + ddinar n lurdun + + + lyan n jjapun + lyan n jjapun + + + cilin n kinya + cilin n kinya + + + sum n kirgistan + sum n kirgistan + + + rryal n kambudya + rryal n kambudya + + + frank n qumrus + frank n qumrus + + + wun n kurya n sennej + wun n kurya n sennej + + + wun n kurya n wadday + wun n kurya n wadday + + + ddinar n lkuwit + ddinar n lkuwit + + + ddular n sayman + ddular n sayman + + + tinga n kazaxistan + tinga n kazaxistan + + + kip n lawes + kip n lawes + + + ljunih n lubnan + ljunih n lubnan + + + rrupya n Sri Lanka + Sri Lankan rupees + + + ddular n libirya + ddular n libirya + + + lluti n lisutu + lluti n lisutu + Libyan Dinar ddinar n libya - Moroccan Dirham - derhem + dderhem ameɣrabi + dderhem + + + liyu n muldub + liyu n muldub + + + aryari n madaɣacqar + aryari n madaɣacqar + + + ddinar n maqdunya + ddinar n maqdunya + + + kyat n myanmar + kyat n myanmar + + + tugrug n mangulya + tugrug n mangulya + + + patakaw n makkaw + patakaw n makkaw + + + uqiya n muritanya + uqiya n muritanya + + + rrupya n muriṭanya + rrupya n muriṭanya + + + rrufiya n maldib + Maldivian rufiyaas + + + kwaca n malawi + kwaca n malawi Mexican Peso pisus n miksiku + + ringit n malizya + ringit n malizya + + + metqal n muzembiq + metqal n muzembiq + + + ddular n nambya + ddular n nambya + + + nira n nijirya + nira n nijirya + + + kurduba n nikaragwa + kurduba n nikaragwa + Norwegian Krone kruna n nnarwij + + rrupya n nnipal + rrupya n nnipal + + + ddular nyuziland + ddular n yuziland + + + rriyal n ɛumman + rriyal n ɛumman + + + balbaw n panama + balbaw n panama + + + ssul n piru + ssul n piru + + + kina n papwa + kina n papwa + + + pisus n filippin + pisus n filippin + + + rrupya n pakistan + rrupya n pakistan + + + zluṭi n pulanda + zluṭi n pulanda + + + gwarani n paragway + gwarani n paragway + + + rriyal n qatar + rriyal n qatar + + + liyu n rumanya + liyu n rumanya + + + ddinar n sirbya + ddinar n sirbya + + + rrubel + rrubel + + + frank n ruwanda + frank n ruwanda + + + rriyal n ssaɛud + rriyal n ssaɛud + + + ddular n sulumun + ddular n sulumun + + + rrupya n sicel + rrupya n sicel + + + ljunih n ssudan + ljunih n ssudan + Swedish Krona kruna n sswid + + ddular n sanɣafura + ddular n sanɣafura + + + ljunih n hilina + ljunih n hilina + + + lyun n siraliyyun + lyun n siraliyyun + + + lyun n siraliyyun + lyun n siraliyyun + + + cilin n ssumal + cilin n ssumal + + + ddular n surinam + ddular n surinam + + + ljunih n ssudan n wadday + ljunih n ssudan n wadday + + + dubra n sawtumi + dubra n sawtumi + + + ljunih n surya + ljunih n surya + + + lilangini + lilangini + + + baṭ n ṭṭayland + baṭ n ṭṭayland + + + sumuni n tajikistan + sumuni n tajikistan + + + manat n ṭurkmanistan + manat n ṭurkmanistan + Tunisian Dinar ddinar n tunes + + panga n ṭunga + panga + + + llira + llira + + + ddular n trinindad + ddular n trinindad + + + ddular n ttaywan + ddular n ttaywan + + + cilin n tanzanya + cilin n tanzanya + + + hribnya n wekranya + hribnya n wekranya + + + cilin n uɣanda + cilin n uɣanda + US Dollar ddular + + pisus n urugway + pisus n urugway + + + sum n uzbakistan + sum n uzbakistan + + + bulibyar + bulibyar + + + ddung n bitnam + ddung n bitnam + + + batu n banwatu + batu n banwatu + + + tala n samwa + tala n samwa + + + frank n wafriqa + frank n wafriqa + + + ddular n karibyan + ddular n karibyan + + + xulden n karibyan + xulden n karibyan + + + frank n wafriqa + frank n wafriqa + + + frank n kalidunya + frank n kalidunya + ttmenyat ttmneyat + + rriyal n lyaman + rriyal n lyaman + + + rrand n tafriqt n wadday + rrand n tafriqt n wadday + + + kwaca n zambya + kwaca n zambya + + + uru n zimbabwi + uru n zimbabwi + {0} n wussan diff --git a/make/data/cldr/common/main/rm.xml b/make/data/cldr/common/main/rm.xml index e5e3aeaa8c5..13ac0b64f23 100644 --- a/make/data/cldr/common/main/rm.xml +++ b/make/data/cldr/common/main/rm.xml @@ -19,62 +19,65 @@ CLDR data files are interpreted according to the LDML specification (http://unic andangme adygai avestic - afrikaans + afrikaans afrihili aghem ainu - akan + akan accadic aleutic altaic dal sid - amaric + amaric aragonais englais vegl angika - arab - arab modern standardisà + arab + arab standardisà modern arameic araucanic arapaho arawak - assami + assami asu - asturian + asturian avaric awadhi aymara - aserbeidschanic + lingua aserbaidschana + azeri baschkir - belutschi + belutschi balinais basaa - bieloruss + lingua bielorussa bedscha bemba bena - bulgar - bhojpuri + bulgar + haryanvi + bhojpuri bislama bikol bini siksika + anii bambara - bengal + lingua bengala tibetan - breton + breton braj bodo - bosniac + bosniac buriat bugi blin - catalan + catalan caddo caribic atsam chakma tschetschen - cebuano + cebuano chiga chamorro chibcha @@ -84,7 +87,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic patuà chinook choctaw chipewyan - cherokee + cherokee cheyenne curd central curd, central @@ -93,12 +96,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic coptic cree tirc crimean - tschec + tschec kaschubic + swampy cree slav da baselgia - tschuvasch - kimric - danais + tschuvasch + valisic + danais dakota dargwa taita @@ -110,8 +114,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic dogrib dinka zarma - dogri - bass sorb + dogri + bass sorb duala ollandais mesaun maledivic @@ -119,55 +123,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic diula dzongkha embu - ewe + ewe efik egipzian vegl ekajuk - grec + grec elamitic - englais - englais australian - englais canadais - englais britannic + englais + englais australian + englais canadais + englais britannic englais GB englais american englais USA englais mesaun - esperanto - spagnol - spagnol latinamerican + esperanto + spagnol + spagnol latinamerican spagnol europeic spagnol mexican - eston - basc + eston + basc ewondo - persian + persian dari fang fanti - fulah - finlandais - filippino + fulah + finlandais + filippino fidschian feroais fon - franzos - franzos canadais - franzos svizzer + franzos + franzos canadais + franzos svizzer franzos mesaun franzos vegl fris dal nord fris da l’ost friulan - fris - irlandais - ga + fris occidental + irlandais + ga gayo gbaya - gaelic scot + gaelic scot geez gilbertais - galician + galizian tudestg mesaun guarani vegl tudestg da scrittira @@ -177,47 +181,48 @@ CLDR data files are interpreted according to the LDML specification (http://unic grebo grec vegl tudestg svizzer - gujarati + gujarati gusii manx gwichʼin - haussa + hausa haida hawaian - ebraic - hindi + ebraic + hindi + hinglish hiligaynon ettitic hmong hiri motu - croat - aut sorb + croat + aut sorb creol haitian - ungarais + ungarais hupa - armen + armen herero - interlingua + interlingua iban - indonais - interlingue - igbo - sichuan yi + indonais + interlingue + igbo + sichuan yi inupiak ilocano ingush ido - islandais - talian + islandais + talian inuktitut - giapunais + giapunais lojban ngomba machame giudaic-persian giudaic-arab - javanais - georgian + javanais + georgian karakalpak kabyle kachin @@ -227,55 +232,61 @@ CLDR data files are interpreted according to the LDML specification (http://unic kabardic tyap makonde - cabverdian + creol dal Cap Verd koro kongo + kaingang khasi khotanais koyra chiini kikuyu kuanyama - casac + kasac kako grönlandais kalenjin - cambodschan + khmer kimbundu - kannada - corean - konkani + kannada + corean + konkani kosraean kpelle kanuri karachay-balkar carelian kurukh - kashmiri + kashmiri shambala bafia colognais - curd + curd + curd + curd settentriunal kumuk kutenai komi cornic - kirghis + kuvi + kirghis latin ladino langi lahnda lamba - luxemburgais + luxemburgais lezghian ganda limburgais + ligur lakota + lumbard lingala - laot + laot lomongo lozi luri dal nord - lituan + lituan luba-katanga luba-lulua luiseno @@ -283,10 +294,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic luo lushai luyia - letton + letton madurais magahi - maithili + maithili makassar mandingo masai @@ -300,25 +311,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic makhuwa-meetto meta’ marschallais - maori + māori micmac minangkabau - macedon - malayalam - mongolic + macedon + malayalam + mongol manchu - manipuri + meitei mohawk mossi - marathi - malaic - maltais + marathi + malaic + maltais mundang - pluriling + pluriling creek mirandais marwari - birman + birman erzya mazanderani nauru @@ -326,23 +337,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic nama norvegais bokmål ndebele dal nord - bass tudestg - nepalais + bass tudestg + nepalais newari ndonga nias niue - ollandais - flam + neerlandais + flam kwasio - norvegiais nynorsk + norvegiais nynorsk ngienboon - norvegiais + norvegiais nogai nordic vegl - n’ko + n’ko ndebele dal sid - sotho dal nord + sotho dal nord nuer navajo newari classic @@ -351,14 +362,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic nyankole nyoro nzima - occitan + occitan ojibwa - oromo - oriya + oromo + oriya ossetic osage tirc ottoman - punjabi + punjabi pangasinan pahlavi pampanga @@ -368,40 +379,40 @@ CLDR data files are interpreted according to the LDML specification (http://unic persian vegl fenizian pali - polac + polac ponapean prussian provenzal vegl - paschto - portugais - portugais brasilian + paschto + portugais + portugais brasilian portugais europeic - quechua - rajasthani + quechua + rajasthani rapanui rarotonga - rumantsch + rumantsch rundi - rumen + rumen moldav rombo romani - russ + russ aromunic - kinyarwanda + kinyarwanda rwa - sanscrit + sanscrit sandawe - jakut + jakut arameic samaritan samburu sasak - santali + santali sangu - sard + sard sicilian scot - sindhi + sindhi sami dal nord sena selkup @@ -411,10 +422,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic serbo-croat tachelit shan - singalais + singalais sidamo - slovac - sloven + slovac + sloven samoan sami dal sid sami lule @@ -422,48 +433,49 @@ CLDR data files are interpreted according to the LDML specification (http://unic sami skolt shona soninke - somali + somali sogdian - albanais - serb + albanais + serb sranan tongo serer swazi - sotho dal sid - sundanais + sotho dal sid + sundanais sukuma susu sumeric - svedais - suahili + svedais + suaheli suahili dal Congo siric classic - siric - tamil - telugu + sirian + silesian + tamil + telugu temne teso tereno tetum - tadjik + tadschic tailandais - tigrinya + tigrinya tigre tiv - turkmen + turkmen tokelau tagalog klingonic tlingit tamasheq - tswana - tonga + tswana + tonga lingua tsonga tok pisin tirc tsonga tsimshian - tatar + tatar tumbuka tuvalu twi @@ -472,16 +484,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic tuvinian tamazight udmurt - uiguric + uiguric ugaritic - ucranais + ucranais mbundu lingua nunenconuschenta - urdu - usbec + urdu + usbec vai venda - vietnamais + venetic + vietnamais + makhuwa volapuk votic vunjo @@ -490,18 +504,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic walamo waray washo - wolof + wolof kalmuk - xhosa + xhosa + kangri soga yao yapais yangben jiddic - yoruba + yoruba + nheengatu cantonais chinais, cantonais - zhuang + zhuang zapotec simbols da Bliss zenaga @@ -512,41 +528,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic chinais mandarin simplifitgà chinais tradiziunal chinais mandarin tradiziunal - zulu + zulu zuni - nagins cuntegns linguistics + nagin cuntegn linguistic zaza - + - - + + - + - + - + - + - - + + - + - + - + @@ -554,41 +570,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + - + - - - + + + - - + + - - + + - + - + - + - - - + + + - + @@ -603,20 +619,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - + + - - + + - + - + - + @@ -630,6 +646,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -641,14 +658,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + - + - + @@ -656,338 +673,343 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + - + - + - - - + + + - + - + - - - + + + - + mund - Africa - America dal Nord - America dal Sid - Oceania - Africa dal Vest - America Centrala - Africa da l’Ost - Africa dal Nord - Africa Centrala - Africa Meridiunala - americas - Amercia dal Nord - Caribica - Asia da l’Ost - Asia dal Sid - Asia dal Sidost - Europa dal Sid - Australia e Nova Zelanda - Melanesia - Regiun Micronesica - Polinesia - Asia - Asia Centrala - Asia dal Vest - Europa - Europa Orientala - Europa dal Nord - Europa dal Vest + Africa + America dal Nord + America dal Sid + Oceania + Africa dal Vest + America Centrala + Africa da l’Ost + Africa dal Nord + Africa Centrala + Africa Meridiunala + America + America dal nord + Caribica + Asia da l’Ost + Asia dal Sid + Asia dal Sidost + Europa dal Sid + Australasia + Melanesia + Regiun Micronesica + Polinesia + Asia + Asia Centrala + Asia dal Vest + Europa + Europa Orientala + Europa dal Nord + Europa dal Vest Africa Subsaharica - America Latina - Insla d’Ascensiun - Andorra - Emirats Arabs Unids - Afghanistan - Antigua e Barbuda - Anguilla - Albania - Armenia - Angola - Antarctica - Argentinia - Samoa Americana - Austria - Australia - Aruba - Inslas Aland - Aserbaidschan - Bosnia ed Erzegovina - Barbados - Bangladesch - Belgia - Burkina Faso - Bulgaria - Bahrain - Burundi - Benin - Son Barthélemy - Bermudas - Brunei - Bolivia - Antillas Ollandaisas + America latina + Insla da l’Ascensiun + Andorra + Emirats Arabs Unids + Afganistan + Antigua e Barbuda + Anguilla + Albania + Armenia + Angola + Antarctica + Argentina + Samoa Americana + Austria + Australia + Aruba + Inslas Aland + Aserbaidschan + Bosnia ed Erzegovina + Barbados + Bangladesch + Belgia + Burkina Faso + Bulgaria + Bahrain + Burundi + Benin + Son Barthélemy + Bermudas + Brunei + Bolivia + Pajais Bass caribics Brasilia - Bahamas - Bhutan - Insla Bouvet - Botswana - Bielorussia - Belize - Canada - Inslas Cocos - Congo - Kinshasa - Congo (DRC) - Republica Centralafricana - Congo - Congo (republica) - Svizra - Costa d’Ivur - Inslas Cook - Chile - Camerun + Bahamas + Butan + Insla da Bouvet + Botsuana + Belarus + Belize + Canada + Inslas Cocos + Congo-Kinshasa + Republica Democratica dal Congo + Republica Centralafricana + Congo-Brazzaville + Republica dal Congo + Svizra + Costa d’Ivur + Côte d’Ivoire + Inslas Cook + Chile + Camerun China - Columbia - Insla da Clipperton - Costa Rica - Cuba - Cap Verd + Columbia + Insla Clipperton + Sark + Costa Rica + Cuba + Cap Verd Curaçao Insla da Nadal - Cipra + Cipra Tschechia Republica Tscheca - Germania + Germania Diego Garcia - Dschibuti - Danemarc - Dominica - Republica Dominicana - Algeria + Dschibuti + Danemarc + Dominica + Republica Dominicana + Algeria Ceuta e Melilla - Ecuador - Estonia - Egipta - Sahara Occidentala - Eritrea - Spagna - Etiopia - Uniun Europeica + Ecuador + Estonia + Egipta + Sahara Occidentala + Eritrea + Spagna + Etiopia + Uniun europeica zona da l’euro - Finlanda - Fidschi - Inslas dal Falkland - Inslas Falkland - Micronesia - Inslas Feroe - Frantscha - Gabun - Reginavel Unì + Finlanda + Fidschi + Inslas Falkland + Inslas Falkland (Inslas Malvinas) + Micronesia + Inslas Feroe + Frantscha + Gabun + Reginavel Unì GB - Grenada - Georgia - Guyana Franzosa - Guernsey - Ghana - Gibraltar - Grönlanda - Gambia - Guinea - Guadeloupe - Guinea Equatoriala - Grezia - Georgia dal Sid e las Inslas Sandwich dal Sid - Guatemala - Guam - Guinea-Bissau - Guyana - Regiun d’administraziun speziala da Hongkong, China - Hong Kong - Inslas da Heard e da McDonald - Honduras - Croazia - Haiti - Ungaria + Grenada + Georgia + Guyana Franzosa + Guernsey + Ghana + Gibraltar + Grönlanda + Gambia + Guinea + Guadalupa + Guinea Equatoriala + Grezia + Georgia dal Sid e las Inslas Sandwich dal Sid + Guatemala + Guam + Guinea-Bissau + Guyana + Regiun d’administraziun speziala Hongkong, China + Hongkong + Inslas da Heard e McDonald + Honduras + Croazia + Haiti + Ungaria Inslas Canarias - Indonesia - Irlanda - Israel - Insla da Man + Indonesia + Irlanda + Israel + Insla da Man India - Territori Britannic en l’Ocean Indic - Irac - Iran - Islanda - Italia - Jersey - Giamaica - Jordania - Giapun - Kenia - Kirgisistan - Cambodscha - Kiribati - Comoras - Saint Kitts e Nevis - Corea dal Nord - Corea dal Sid - Kuwait - Inslas Cayman - Kasachstan - Laos - Libanon - Saint Lucia - Liechtenstein - Sri Lanka - Liberia - Lesotho - Lituania - Luxemburg - Lettonia - Libia - Maroc - Monaco - Moldavia - Montenegro - Saint Martin - Madagascar - Inslas da Marshall + Territori Britannic da l’Ocean Indic + Archipel da Chagos + Irac + Iran + Islanda + Italia + Jersey + Giamaica + Jordania + Giapun + Kenia + Kirghistan + Cambodscha + Kiribati + Comoras + Son Cristof e Nevis + Corea dal Nord + Corea dal Sid + Kuwait + Inslas Cayman + Kasachstan + Laos + Libanon + Sontga Lucia + Liechtenstein + Sri Lanka + Liberia + Lesotho + Lituania + Luxemburg + Lettonia + Libia + Maroc + Monaco + Moldavia + Montenegro + Saint Martin + Madagascar + Inslas da Marshall Macedonia dal Nord - Mali + Mali Myanmar (Burma) - Mongolia - Regiun d’administraziun speziala Macao, China + Mongolia + Regiun d’administraziun speziala Macao, China Macao - Inslas Mariannas dal Nord - Martinique - Mauretania - Montserrat - Malta - Mauritius - Maldivas - Malawi - Mexico - Malaisia - Mosambic - Namibia - Nova Caledonia - Niger - Insla Norfolk - Nigeria - Nicaragua - Pajais Bass - Norvegia - Nepal - Nauru - Niue - Nova Zelanda - Oman + Inslas Mariannas dal Nord + Martinica + Mauretania + Montserrat + Malta + Mauritius + Maledivas + Malawi + Mexico + Malaisia + Mosambic + Namibia + Nova Caledonia + Niger + Insla Norfolk + Nigeria + Nicaragua + Pajais Bass + Norvegia + Nepal + Nauru + Niue + Nova Zelanda + Aotearoa (Nova Zelanda) + Oman Panama - Peru - Polinesia Franzosa - Papua Nova Guinea - Filippinas - Pakistan - Pologna - Saint Pierre e Miquelon - Pitcairn - Puerto Rico - Territori Palestinais + Peru + Polinesia Franzosa + Papua Nova Guinea + Filippinas + Pakistan + Pologna + Saint Pierre e Miquelon + Pitcairn + Puerto Rico + Territori Palestinais Palestina - Portugal - Palau - Paraguai - Katar - Oceania Periferica - Réunion - Rumenia - Serbia + Portugal + Palau + Paraguai + Qatar + Oceania Periferica + Réunion + Rumenia + Serbia Russia - Ruanda - Arabia Saudita - Inslas Salomonas - Seychellas - Sudan - Svezia - Singapur - Sontg’Elena - Slovenia - Svalbard e Jan Mayen - Slovachia - Sierra Leone - San Marino - Senegal - Somalia - Surinam + Ruanda + Arabia Saudita + Inslas da Salomon + Seychellas + Sudan + Svezia + Singapur + Sontg’Elena + Slovenia + Svalbard e Jan Mayen + Slovachia + Sierra Leone + Son Marin + Senegal + Somalia + Surinam Sudan dal Sid - São Tomé & Príncipe - El Salvador + São Tomé e Príncipe + El Salvador Sint Maarten - Siria + Siria Eswatini - Swaziland + Swasiland Tristan da Cunha - Inslas Turks e Caicos - Tschad - Territoris Franzos Meridiunals - Togo - Tailanda - Tadschikistan - Tokelau - Timor da l’Ost - Turkmenistan - Tunesia - Tonga - Tirchia - Trinidad e Tobago - Tuvalu - Taiwan - Tansania - Ucraina - Uganda + Inslas Turks e Caicos + Tschad + Territoris Franzos Meridiunals + Togo + Tailanda + Tadschikistan + Tokelau + Timor da l’Ost + Timor-Leste + Turkmenistan + Tunesia + Tonga + Tirchia + Trinidad e Tobago + Tuvalu + Taiwan + Tansania + Ucraina + Uganda Inslas Pitschnas Perifericas dals Stadis Unids da l’America - Naziuns Unidas - Stadis Unids da l’America - US - Uruguay - Usbekistan - Citad dal Vatican - Saint Vincent e las Grenadinas - Venezuela + Naziuns unidas + Stadis Unids da l’America + USA + Uruguai + Usbekistan + Citad dal Vatican + Son Vincenz e las Grenadinas + Venezuela Inslas Virginas Britannicas Inslas Virginas Americanas - Vietnam - Vanuatu - Wallis & Futuna - Samoa - accents pseudo - pseudo-bidirecziunal + Vietnam + Vanuatu + Wallis e Futuna + Samoa + pseudo-accents + pseudo-bidi Cosovo - Jemen - Mayotte - Africa dal Sid - Sambia - Simbabwe + Jemen + Mayotte + Africa dal Sid + Sambia + Simbabwe regiun nunenconuschenta @@ -1020,63 +1042,138 @@ CLDR data files are interpreted according to the LDML specification (http://unic valencian - chalender + chalender format da valuta - zavrada + zavrada valuta - ciclus da las uras + visualisaziun dals emojis + ciclus da las uras (12 u 24h) stil da sigl da lingia + sigls da lingia entaifer pleds sistem da mesira - dumbers + dumbers + Interrupziun da la frasa suenter ina abreviaziun - chalender budistic - chalender chinais - chalender coptic + chalender budistic + budistic + chalender chinais + chinais + chalender coptic + coptic chalender dangi + dangi chalender etiopic - chalender gregorian - chalender ebraic + etiopic + chalender etiopic amete alem + etiopic amete alem + chalender gregorian + gregorian + chalender ebraic + ebraic chalender naziunal indic - chalender islamic - chalender islamic civil + chalender hijri + hijri + chalender hijri (tabellar, epoca civila) + hijri (tabellar, epoca civila) chalender islamic (Arabia Saudita) - chalender islamic (Umm al-Qura) - chalender tenor ISO 8601 - chalender giapunais + chalender hijri (Umm al-Qura) + hijri (Umm al-Qura) + chalender gregorian (cun l’onn al cumenzament) + chalender giapunais + giapunais chalender persian - chalender da la Republica Chinaisa + persian + chalender minguo + minguo format da valuta per la contabilitad + contabilitad format da valuta da standard - chinaisa tradiziunala - Big5 + standard zavrada unicode standard - chinaisa simplifitgada - GB2312 + standard unicode cudesch da telefon Pinyin tschertga generala + tschertga zavrada da standard + standard urden dals stritgs reglas tradiziunalas + predefinì + emoji + text sistem da 12 uras (0–11) + 12 (0–11) sistem da 12 uras (1–12) + 12 (1–12) sistem da 24 uras (0–23) + 24 (0–23) sistem da 24 uras (1–24) + 24 (1–24) stil da sigl da lingia liber + liber stil da sigl da lingia normal + normal stil da sigl da lingia strict + strict + divider tut + preservar tut + normal + preservar en frasas sistem metric - sistem da mesira imperial - sistem da mesira US + metric + sistem imperial britannic + imperial britannic + sistem da mesira USA + USA cifras indic-arabas - dumbers armens - cifras bengalas - dumbers georgians + cifras indic-arabas extendidas + dumbers armens + dumbers armens en minusclas + cifras bengalas + cifras chakma + cifras devanagari + cifras etiopicas + cifras da ladezza cumplaina + dumbers georgians + dumbers grecs + dumbers grecs en minusclas + cifras gujarati + cifras gurmukhi + dumbers chinais decimals + dumbers en chinais simplifitgà + dumbers finanziars en chinais simplifitgà + dumbers en chinais tradiziunal + dumbers finanziars en chinais tradiziunal + dumbers ebraics + cifras javanaisas + dumbers giapunais + dumbers finanziars giapunais + cifras khmer + cifras kannada + cifras laotas cifras occidentalas + cifras malayalam + cifras meetei mayek + cifras dal Myanmar + cifras ol chiki + cifras oriya + dumbers romans + dumbers romans en minusclas + dumbers tamil tradiziunal + cifras tamilas + cifras telugu + cifras en thai + cifras tibetanas + cifras vai + Deactivà + Activà metric - englais - american + britannic + USA Lingua: {0} @@ -1091,10 +1188,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic [. ’ % ‰ + − 0 1 2 3 4 5 6 7 8 9] - « - » - - + « + » + + @@ -1102,23 +1199,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEEE, 'ils' d MMMM y G + EEEE, 'ils' d MMMM y G - d MMMM y G + d MMMM y G - dd-MM-y G + d MMM y G GyMMdd - dd-MM-y GGGGG + dd-MM-y GGGGG @@ -1130,6 +1227,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'las' {0} + + {1} 'a' 'las' {0} + @@ -1138,6 +1238,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'las' {0} + + {1} 'a' 'las' {0} + @@ -1150,43 +1253,93 @@ CLDR data files are interpreted according to the LDML specification (http://unic - E d. - E h:mm a - E h:mm:ss a - y G - LLL y G - dd-MM-y GGGGG - E, dd-MM-y GGGGG - d MMMM y G - E, d MMMM y G - h a + E d + E h:mm a + E h:mm:ss a + y G + MM-y G + dd-MM-y G + E, dd-MM-y G + LLL y G + dd-MM-y G + E, dd-MM-y G + d MMMM y G + E, d MMMM y G h:mm a h:mm:ss a h:mm:ss a v HH:mm:ss v h:mm a v HH:mm v - dd-MM - E, dd-MM - dd-MM - E, dd-MM - d MMMM - E, d MMMM - y G - MM-y GGGGG - E, dd-MM-y GGGGG - LLL y G - dd-MM-y GGGGG - E, dd-MM-y GGGGG - LLLL y G - d MMMM y G - E, d MMMM y G - QQQ y G - QQQQ y G + dd-MM + E, dd-MM + d MMM + E, d MMM + d MMMM + E, d MMMM + y G + MM-y GGGGG + E, dd-MM-y GGGGG + LLL y G + dd-MM-y GGGGG + E, dd-MM-y GGGGG + LLLL y G + d MMMM y G + E, d MMMM y G + QQQ y G + QQQQ y G + y G + MM-y G + dd-MM-y G + E, dd-MM-y G + MMM y G + d MMM y G + E, d MMM y G + MMMM y G + QQQ y G + QQQQ y G - d.–d. + d – d + + + y G – y G + y–y G + + + MM-y G – MM-y G + MM-y – MM-y G + MM-y – MM-y G + + + dd – dd-MM-y G + dd-MM-y G – dd-MM-y G + dd – dd-MM-y G + dd-MM-y – dd-MM-y G + + + E dd-MM-y – E dd-MM-y G + E dd-MM-y G – E dd-MM-y G + E dd-MM-y – E dd-MM-y G + E dd-MM-y – E dd-MM-y G + + + MMM y G – MMM y G + MMM–MMM y G + MMM y – MMM y G + + + d–d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E d – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G h a – h a @@ -1207,76 +1360,79 @@ CLDR data files are interpreted according to the LDML specification (http://unic h–h a v - LL–LL + LL–LL - dd-MM – dd-MM - dd-MM – dd-MM + dd – dd-MM + dd-MM – dd-MM - E, dd-MM – E, dd-MM - E, dd-MM – E, dd-MM + E dd-MM – E dd-MM + E dd-MM – E dd-MM + + + MMM–MMM - dd-MM – dd-MM - dd-MM – dd-MM + d–d MMM + d MMM – d MMM - E, dd-MM – E, dd-MM - E, dd-MM – E, dd-MM + E d – E d MMM + E d MMM – E d MMM - d.–d MMMM - d MMMM – d MMMM + d – d MMMM + d MMMM – d MMMM - E, d. – E, d MMMM - E, d MMMM – E, d MMMM + E d. – E d MMMM + E d MMMM – E d MMMM - y–y G + y–y G - LL-y – LL-y GGGGG - LL-y – LL-y GGGGG + MM-y – MM-y G + MM-y – MM-y G - dd-MM-y – dd-MM-y GGGGG - dd-MM-y – dd-MM-y GGGGG - dd-MM-y – dd-MM-y GGGGG + d-M-y – d-M-y G + d-M-y – d-M-y G + d-M-y – d-M-y G - E, dd-MM-y – E, dd-MM-y GGGGG - E, dd-MM-y – E, dd-MM-y GGGGG - E, dd-MM-y – E, dd-MM-y GGGGG + E d-M-y – E d-M-y G + E d-M-y – E d-M-y G + E d-M-y – E d-M-y G - LLL–LLL y G - LLL y – LLL y G + MMM – MMM y G + MMM y – MMM y G - dd-MM-y – dd-MM-y GGGGG - dd-MM-y – dd-MM-y GGGGG - dd-MM-y – dd-MM-y GGGGG + d–d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, dd-MM-y – E, dd-MM-y GGGGG - E, dd-MM-y – E, dd-MM-y GGGGG - E, dd-MM-y – E, dd-MM-y GGGGG + E d – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G - LLLL–LLLL y G - LLLL y – LLLL y G + LLLL–LLLL y G + LLLL y – LLLL y G - d.–d MMMM y G - d MMMM – d MMMM y G - d MMMM y – d MMMM y G + d – d MMMM y G + d MMMM – d MMMM y G + d MMMM y – d MMMM y G - E, d. – E, d MMMM y G - E, d MMMM – E, d MMMM y G - E, d MMMM y – E, d MMMM y G + E d – E d MMMM y + E d MMMM – E d MMMM y + E d MMMM y – E d MMMM y @@ -1393,16 +1549,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + a + p + + + avant Cristus + avant l’èra cuminaivla suenter Cristus + da l’èra cuminaivla - av. Cr. - BCE - s. Cr. - CE + a.Cr. + a.e.c. + s.C. + e.c. @@ -1454,66 +1620,125 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1}, {0} + + + {1} 'a' 'las' {0} + + + {1} 'a' 'las' {0} - {1} {0} + {1}, {0} + + + {1} 'a' 'las' {0} + + + {1} 'a' 'las' {0} - {1} {0} + {1}, {0} + + + {1}, {0} + + + {1}, {0} - {1} {0} + {1}, {0} + + + {1}, {0} + + + {1}, {0} - E d. + E d E h:mm a E h:mm:ss a y G - dd-MM-y GGGGG + MM-y G + dd-MM-y G + E, dd-MM-y G LLL y G - dd-MM-y GGGGG - E, dd-MM-y GGGGG + dd-MM-y G + E, d MMM y G d MMMM y G E, d MMMM y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v dd-MM E, dd-MM - dd-MM - E, dd-MM + d MMM + E, d MMM d MMMM E, d MMMM - W. 'emna' MMMM - W. 'emna' MMMM + 'emna' W 'dal' 'mais' LLLL + 'emna' W 'dal' 'mais' LLLL LL-y - dd-MM-y - E, dd-MM-y - LLL y - dd-MM-y - E, dd-MM-y + d-M-y + E, d-M-y + MMM y + d MMM y + E, d MMM y LLLL y d MMMM y E, d MMMM y QQQ y QQQQ y - w. 'dal' Y - w. 'emna' 'dal' Y + 'emna' w 'dal' Y + 'emna' w 'dal' Y - - h a – h a - h–h a + + y G – y G + y–y G + + + MM-y G – MM-y G + MM-y – MM-y G + MM-y – MM-y G + + + dd – dd-MM-y G + dd-MM-y G – dd-MM-y G + dd-MM – dd-MM-y G + dd-MM-y – dd-MM-y G + + + E dd-MM-y – E dd-MM-y G + E dd-MM-y G – E dd-MM-y G + E dd-MM – E dd-MM-y G + E dd-MM-y – E dd-MM-y G + + + MMM y G – MMM y G + MMM–MMM y G + MMM y – MMM y G + + + d–d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G + + + E d – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G h:mm a – h:mm a @@ -1525,78 +1750,74 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - LL–LL - dd-MM – dd-MM + dd – dd-MM dd-MM – dd-MM - E, dd-MM – E, dd-MM - E, dd-MM – E, dd-MM + E dd-MM – E dd-MM + E dd-MM – E dd-MM - dd-MM – dd-MM - dd-MM – dd-MM + d–d MMM + d MMM – d MMM - E, dd-MM – E, dd-MM - E, dd-MM – E, dd-MM + E d – E d MMM + E d MMM – E d MMM - d.–d MMMM + d – d MMMM d MMMM – d MMMM - E, d. – E, d MMMM - E, d MMMM – E, d MMMM + E d. – E d MMMM + E d MMMM – E d MMMM - LL-y – LL-y - LL-y – LL-y + MM-y – MM-y + MM-y – MM-y - dd-MM-y – dd-MM-y - dd-MM-y – dd-MM-y - dd-MM-y – dd-MM-y + d-M-y – d-M-y + d-M-y – d-M-y + d-M-y – d-M-y - E, dd-MM-y – E, dd-MM-y - E, dd-MM-y – E, dd-MM-y - E, dd-MM-y – E, dd-MM-y + E d-M-y – E d-M-y + E d-M-y – E d-M-y + E d-M-y – E d-M-y - LLL–LLL y - LLL y – LLL y + MMM – MMM y + MMM y – MMM y - dd-MM-y – dd-MM-y - dd-MM-y – dd-MM-y - dd-MM-y – dd-MM-y + d–d MMM y + d MMM – d MMM y + d MMM y – d MMM y - E, dd-MM-y – E, dd-MM-y - E, dd-MM-y – E, dd-MM-y - E, dd-MM-y – E, dd-MM-y + E d – E d MMM y + E d MMM – E d MMM y + E d MMM y – E d MMM y LLLL–LLLL y LLLL y – LLLL y - d.–d MMMM y + d – d MMMM y d MMMM – d MMMM y d MMMM y – d MMMM y - E, d. – E, d MMMM y - E, d MMMM – E, d MMMM y - E, d MMMM y – E, d MMMM y + E d – E d MMMM y + E d MMMM – E d MMMM y + E d MMMM y – E d MMMM y @@ -1604,25 +1825,181 @@ CLDR data files are interpreted according to the LDML specification (http://unic - epoca + èra + + + èra + + + èra - onn + onn l’onn passà quest onn l’onn proxim + + en {0} onn + en {0} onns + + + avant {0} onn + avant {0} onns + + + + + en {0} onn + en {0} onns + + + avant {0} onn + avant {0} onns + + + + o. + l’onn passà + quest onn + l’onn prox. + + en {0}o + en {0}o + + + avant {0}o + avant {0}o + quartal + l’ultim quartal + quest quartal + il proxim quartal + + en {0} quartal + en {0} quartals + + + avant {0} quartal + avant {0} quartals + - qrtl + quart. + + en {0} qrtl. + en {0} qrtls. + + + avant {0} qrtl. + avant {0} qrtls. + + + + Q + + en {0}q + en {0}q + + + avant {0}q + avant {0}q + - mais + mais + l’ultim mais + quest mais + il proxim mais + + en {0} mais + en {0} mais + + + avant {0} mais + avant {0} mais + + + + ultim mais + quest mais + proxim mais + + en {0} mais + en {0} mais + + + avant {0} mais + avant {0} mais + + + + m. + ultim mais + quest mais + proxim mais + + en {0}mais + en {0}mais + + + avant {0}mais + avant {0}mais + - emna + emna + l’ultima emna + quest’emna + proxim’emna + + en {0} emna + en {0} emnas + + + avant {0} emna + avant {0} emnas + + l’emna dals {0} + + + ultim’emna + quest’emna + proxim’emna + + en {0} emna + en {0} emnas + + + avant {0} emna + avant {0} emnas + + l’emna dals {0} + + + e. + ultim’emna + quest’emna + proxim’emna + + en {0}e + en {0}e + + + avant {0}e + avant {0}e + + l’emna dals {0} + + + emna dal mais + + + emna dal mais + + + emna mais di @@ -1631,540 +2008,1705 @@ CLDR data files are interpreted according to the LDML specification (http://unic oz damaun puschmaun + + en {0} di + en {0} dis + + + avant {0} di + avant {0} dis + + + + + en {0} di + en {0} dis + + + avant {0} di + avant {0} dis + d + + en {0}d + en {0}d + + + avant {0}d + avant {0}d + + + + di da l’onn + + + di da l’onn + + + di da l’onn di da l’emna - + + di dal mais + + + di dal mais + + + di dal mais + + + l’ultima dumengia + questa dumengia + proxima dumengia - +{0} dumengia - en {0} du + en {0} dumengia + en {0} dumengias + + + avant {0} dumengia + avant {0} dumengias + + ultima dum. + questa dum. + proxima dum. + + en {0} dum. + en {0} dum. + + + avant {0} dum. + avant {0} dum. + + + + ultima du + questa du + prox. du + + en {0} du + en {0} dum. + + + avant {0} du + avant {0} du + + + + l’ultim glindesdi + quest glindesdi + proxim glindesdi + + en {0} glindesdi + en {0} glindesdis + + + avant {0} glindesdi + avant {0} glindesdis + + + + ultim glind. + quest glind. + proxim glind. + + en {0} glind. + en {0} glind. + + + avant {0} glind. + avant {0} glind. + + + + ultim gli + quest gli + prox. gli + + en {0} gli + en {0} gli + + + avant {0} gli + avant {0} gli + + + + l’ultim mardi + quest mardi + proxim mardi + + en {0} mardi + en {0} mardis + + + avant {0} mardi + avant {0} mardis + + + + ultim mardi + quest mardi + proxim mar + + en {0} mardi + en {0} mardis + + + avant {0} mardi + avant {0} mardis + + + + ultim ma + quest ma + prox. ma + + en {0} ma + en {0} ma + + + avant {0} ma + avant {0} ma + + + + l’ultima mesemna + questa mesemna + proxima mesemna + + en {0} mesemna + en {0} mesemnas + + + avant {0} mesemna + avant {0} mesemnas + + + + ultima mesem. + questa mesem. + proxima mesem. + + en {0} mesem. + en {0} mesem. + + + avant {0} mesem. + avant {0} mesem. + + + + ultima me + questa me + prox. me + + en {0} me + en {0} me + + + avant {0} me + avant {0} me + + + + l’ultima gievgia + questa gievgia + proxima gievgia + + en {0} gievgia + en {0} gievgias + + + avant {0} gievgia + avant {0} gievgias + + + + ultima giev. + questa giev. + proxima giev. + + en {0} giev. + en {0} giev. + + + avant {0} giev. + avant {0} giev. + + + + ultima gie + questa gie + prox. gie + + en {0} gie + en {0} gie + + + avant {0} gie + avant {0} gie + + + + l’ultim venderdi + quest venderdi + proxim venderdi + + en {0} venderdi + en {0} venderdis + + + avant {0} venderdi + avant {0} venderdis + + + + ultim vend. + quest vend. + proxim vend. + + en {0} vend. + en {0} vend. + + + avant {0} vend. + avant {0} vend. + + + + ultim ve + quest ve + prox. ve + + en {0} ve + en {0} ve + + + avant {0} ve + avant {0} ve + + + + l’ultima sonda + questa sonda + proxima sonda + + en {0} sonda + en {0} sondas + + + avant {0} sonda + avant {0} sondas + + + + ultima sonda + questa sonda + proxima sonda + + en {0} sonda + en {0} sondas + + + avant {0} sonda + avant {0} sondas + + + + ultima so + questa so + prox. so + + en {0} so + en {0} so + + + avant {0} so + avant {0} so + + + + AM/PM + - mesadad dal di + AM/PM + + + AM/PM ura + quest’ura + + en {0} ura + en {0} uras + + + avant {0} ura + avant {0} uras + + + + h + + en {0} h + en {0} h + + + avant {0} h + avant {0} h + + + + h + + en {0}h + en {0}h + + + avant {0}h + avant {0}h + minuta + questa minuta + + en {0} minuta + en {0} minutas + + + avant {0} minuta + avant {0} minutas + min + + en {0} min + en {0} min + + + avant {0} min + avant {0} min + + + + + en {0} min + en {0} min + + + avant {0} min + avant {0} min + secunda + ussa + + en {0} secunda + en {0} secundas + + + avant {0} secunda + avant {0} secundas + s + + en {0} s + en {0} s + + + avant {0} s + avant {0} s + + + + + en {0} s + en {0} s + + + avant {0} s + avant {0} s + zona d’urari + + zona + - temp: {0} - temp da stad: {0} - temp normal: {0} + {0} (temp local) + {0} (temp da stad) + {0} (temp normal) - Temp universal coordinà + temp universal coordinà - citad nunenconuschenta - - - The Valley - - - Tirana + lieu nunenconuschent - Jerevan - - - Showa - - - Mac Murdo - - - San Juan, Argentinia - - - Ushuaïa - - - San Salvador de Jujuy - - - Tucumán - - - Córdoba - - - Oranjestad + Jerevan - Bruxelles + Brüssel + + + Son Barthélemy - Bermudas - - - Bandar Seri Begawan - - - Eirunepé - - - Cuiabá - - - Belém - - - Araguaína - - - São Paulo - - - Fernando de Noronha - - - Belmopan - - - Saint John’s + Bermudas - West Island + Inslas Cocos Turitg - Insla da Pasca + Insla da Pasca - - Ürümqi + + Schanghai + + + Havanna - Cap Verd - - - Curaçao + Cap Verd - Flying Fish Cove + Insla da Nadal + + + Prag - Dschibuti + Dschibuti - Algier - - - Galápagos - - - El Aaiún + Algier - Inslas Canarias + Inslas Canarias - Addis Abeba + Addis Abeba - Fidschi - - - Port Stanley - - - Weno - - - Palikir - - - Tofol + Fidschi - Inslas Feroe + Inslas Feroe - temp da stad britannic + temp da stad da la Gronda Britannia Londra - - Saint Peter Port - - - Godthåb + + Tiflis - Basse-Terre + Guadalupa Athen - Georgia dal Sid - - - Hagåtña + Georgia dal Sid - Hongkong + Hongkong - - Macassar + + + temp da stad da l’Irlanda + - Douglas + Insla da Man + + + Calcutta - Bagdad + Bagdad - Teheran + Teheran + + + Reykjavík Roma - - Saint Helier - - Giamaica + Giamaica - Tokio + Tokio - Bischkek - - - South Tarawa + Bischkek - Comoras + Comoras - Saint Kitts + Saint Kitts - - Seul + + Pjöngjang - Inslas Cayman + Inslas Cayman - - Aqtöbe + + Qostanai + + + Qysylorda - Santa Lucia + Sontga Lucia - Luxemburg + Luxemburg - - Brades + + Tripolis + + + Martinica - Maldivas - - - Mazatlán + Maledivas - Citad da Mexico - - - Nouméa + Citad dal Mexico - Kingston - - - Yaren - - - Alofi + Insla Norfolk - Mascate - - - Rikitea + Mascat - Karatschi + Karatschi - Varsovia + Varsovia - Saint Pierre + Saint Pierre - Azoras + Azoras - Lissabon - - - Melekok - - - Asunción - - - Réunion + Lissabon Bucarest + + Belgrad + - Moscau + Moscau + + + Astrachan - Jekaterinburg - - - Nowosibirsk + Jekaterinburg - Krasnojarsk + Krasnojarsk + + + Tschita - Jakutsk + Jakutsk + + + Chandyga - Sachalin + Sachalin - Kamtschatka + Kamtschatka - Riyad - - - Honiara + Riad - Khartum + Khartum - Singapur + Singapur - Sontg’elena + Sontg’elena - Mogadischu - - - São Tomé - - - Salvador - - - Cockburn Town - - - Lomé + Mogadischu - Duschanbe + Duschanbe - Aşgabat - - - Nukuʻalofa + Aşgabat - Daressalam + Daressalam - - Alasca + + Kiev + + + Beulah, Dakota dal Nord - North Dakota (New Salem) + New Salem, Dakota dal Nord - North Dakota (Central) - - - Vincennes - - - Petersburg - - - Tell City - - - Knox - - - Winamac - - - Marengo - - - Vevay - - - Monticello + Center, Dakota dal Nord - Samarcanda + Samarcanda - Taschkent + Taschkent - Saint Vincent - - - Road Town + Son Vincenz - Saint Thomas + Saint Thomas Citad da Ho Chi Minh - - Matāʻutu - + + + temp da l’Afganistan + + + + + temp da l’Africa Centrala + + + + + temp da l’Africa Orientala + + + + + temp normal da l’Africa Meridiunala + + + + + temp da l’Africa Occidentala + + + + + temp da l’Alasca + temp normal da l’Alasca + temp da stad da l’Alasca + + + + + temp da l’Amazonas + temp normal da l’Amazonas + temp da stad da l’Amazonas + + - Temp central - Temp da standard central - Temp da stad central + temp dal center USA + temp normal dal center USA + temp da stad dal center USA - Temp oriental - Temp da standard oriental - Temp da stad oriental + temp da l’ost USA + temp normal da l’ost USA + temp da stad da l’ost USA - Temp da muntogna - Temp da standard da muntogna - Temp da stad da muntogna + temp dals Rocky Mountains + temp normal dals Rocky Mountains + temp da stad dals Rocky Mountains - Temp pacific - Temp da standard pacific - Temp da stad pacific + temp dal Pacific USA + temp normal dal Pacific USA + temp da stad dal Pacific USA + + + + + temp da la Samoa + temp normal da la Samoa + temp da stad da la Samoa + + + + + temp arab + temp normal arab + temp da stad arab + + + + + temp da l’Argentina + temp normal da l’Argentina + temp da stad da l’Argentina + + + + + temp da l’Argentina occidentala + temp normal da l’Argentina occidentala + temp da stad da l’Argentina occidentala + + + + + temp da l’Armenia + temp normal da l’Armenia + temp da stad da l’Armenia - Temp atlantic - Temp da standard atlantic - Temp da stad atlantic + temp da l’Atlantic USA + temp normal da l’Atlantic USA + temp da stad da l’Atlantic USA + + + + + temp dal center da l’Australia + temp normal dal center da l’Australia + temp da stad dal center da l’Australia + + + + + temp dal center-vest da l’Australia + temp normal dal center-vest da l’Australia + temp da stad dal center-vest da l’Australia + + + + + temp da l’ost da l’Australia + temp normal da l’ost da l’Australia + temp da stad da l’ost da l’Australia + + + + + temp dal vest da l’Australia + temp normal dal vest da l’Australia + temp da stad dal vest da l’Australia + + + + + temp da l’Aserbaidschan + temp normal da l’Aserbaidschan + temp da stad da l’Aserbaidschan + + + + + temp da las Azoras + temp normal da las Azoras + temp da stad da las Azoras + + + + + temp dal Bangladesch + temp normal dal Bangladesch + temp da stad dal Bangladesch + + + + + temp dal Butan + + + + + temp da la Bolivia + + + + + temp da la Brasilia + temp normal da la Brasilia + temp da stad da la Brasilia + + + + + temp dal Brunei + + + + + temp dal Cap Verd + temp normal dal Cap Verd + temp da stad dal Cap Verd + + + + + temp dals Chamorro + + + + + temp da las Inslas Chatham + temp normal da las Inslas Chatham + temp da stad da las Inslas Chatham + + + + + temp dal Chile + temp normal dal Chile + temp da stad dal Chile + + + + + temp da la China + temp normal da la China + temp da stad da la China + + + + + temp da l’Insla da Nadal + + + + + temp da las Inslas Cocos + + + + + temp da la Columbia + temp normal da la Columbia + temp da stad da la Columbia + + + + + temp da las Inslas Cook + temp normal da las Inslas Cook + temp da stad da las Inslas Cook + + + + + temp da la Cuba + temp normal da la Cuba + temp da stad da la Cuba + + + + + temp da Davis + + + + + temp da Dumont d’Urville + + + + + temp dal Timor da l’Ost + + + + + temp da l’Insla da Pasca + temp normal da l’Insla da Pasca + temp da stad da l’Insla da Pasca + + + + + temp da l’Ecuador - Temp da l’Europa Centrala - Temp da standard da l’Europa Centrala - Temp da stad da l’Europa Centrala + temp da l’Europa Centrala + temp normal da l’Europa Centrala + temp da stad da l’Europa Centrala - Temp da l’Europa Orientala - Temp da standard da l’Europa Orientala - Temp da stad da l’Europa Orientala + temp da l’Europa Orientala + temp normal da l’Europa Orientala + temp da stad da l’Europa Orientala + + + + + temp da l’extrem orient da l’Europa - Temp da l’Europa dal Vest - Temp da standard da l’Europa dal Vest - Temp da stad da l’Europa dal Vest + temp da l’Europa dal Vest + temp normal da l’Europa dal Vest + temp da stad da l’Europa dal Vest + + + + + temp da las Inslas Falkland + temp normal da las Inslas Falkland + temp da stad da las Inslas Falkland + + + + + temp dal Fidschi + temp normal dal Fidschi + temp da stad dal Fidschi + + + + + temp da la Guyana Franzosa + + + + + temp dals Territoris Franzos Meridiunals ed Antarctics + + + + + temp da las Inslas Galápagos + + + + + temp da las Inslas Gambier + + + + + temp da la Georgia + temp normal da la Georgia + temp da stad da la Georgia + + + + + temp da las Inslas Gilbert - Temp Greenwich + temp dal meridian da Greenwich + + + + + temp da la Grönlanda orientala + temp normal da la Grönlanda orientala + temp da stad da la Grönlanda orientala + + + + + temp da la Grönlanda occidentala + temp normal da la Grönlanda occidentala + temp da stad da la Grönlanda occidentala + + + + + temp normal dal Golf + + + + + temp da la Guyana + + + + + temp normal dal Hawai e las Aleutinas + + + + + temp dal Hawai e las Aleutinas + temp normal dal Hawai e las Aleutinas + temp da stad dal Hawai e da las Aleutinas + + + + + temp dal Hongkong + temp normal dal Hongkong + temp da stad dal Hongkong + + + + + temp da Hovd + temp normal da Hovd + temp da stad da Hovd + + + + + temp normal da l’India + + + + + temp da l’Ocean Indic + + + + + temp da l’Indochina + + + + + temp dal center da l’Indonesia + + + + + temp da l’ost da l’Indonesia + + + + + temp dal vest da l’Indonesia + + + + + temp da l’Iran + temp normal da l’Iran + temp da stad da l’Iran + + + + + temp dad Irkutsk + temp normal dad Irkutsk + temp da stad dad Irkutsk + + + + + temp da l’Israel + temp normal da l’Israel + temp da stad da l’Israel + + + + + temp dal Giapun + temp normal dal Giapun + temp da stad dal Giapun + + + + + temp dal Kasachstan + + + + + temp dal Kasachstan oriental + + + + + temp dal Kasachstan occidental + + + + + temp da la Corea + temp normal da la Corea + temp da stad da la Corea + + + + + temp da Kosrae + + + + + temp da Krasnojarsk + temp normal da Krasnojarsk + temp da stad da Krasnojarsk + + + + + temp dal Kirghistan + + + + + temp da las Inslas da la Lingia + + + + + temp da Lord Howe + temp normal da Lord Howe + temp da stad da Lord Howe + + + + + temp da Magadan + temp normal da Magadan + temp da stad da Magadan + + + + + temp da la Malaisia + + + + + temp da las Maledivas + + + + + temp da las Inslas Marquesas + + + + + temp da las Inslas da Marshall + + + + + temp dal Mauritius + temp normal dal Mauritius + temp da stad dal Mauritius + + + + + temp da Mawson + + + + + temp mexican dal Pacific + temp normal mexican dal Pacific + temp da stad mexican dal Pacific + + + + + temp dad Ulaanbaatar + temp normal dad Ulaanbaatar + temp da stad dad Ulaanbaatar + + + + + temp da Moscau + temp normal da Moscau + temp da stad da Moscau + + + + + temp dal Myanmar + + + + + temp da Nauru + + + + + temp dal Nepal + + + + + temp da la Nova Caledonia + temp normal da la Nova Caledonia + temp da stad da la Nova Caledonia + + + + + temp da la Nova Zelanda + temp normal da la Nova Zelanda + temp da stad da la Nova Zelanda + + + + + temp da la Terranova + temp normal da la Terranova + temp da stad da la Terranova + + + + + temp da Niue + + + + + temp da l’Insla Norfolk + temp normal da l’Insla Norfolk + temp da stad da l’Insla Norfolk + + + + + temp da Fernando de Noronha + temp normal da Fernando de Noronha + temp da stad da Fernando de Noronha + + + + + temp da Novosibirsk + temp normal da Novosibirsk + temp da stad da Novosibirsk + + + + + temp dad Omsk + temp normal dad Omsk + temp da stad dad Omsk + + + + + temp dal Pakistan + temp normal dal Pakistan + temp da stad dal Pakistan + + + + + temp da Palau + + + + + temp da la Papua Nova Guinea + + + + + temp dal Paraguai + temp normal dal Paraguai + temp da stad dal Paraguai + + + + + temp dal Peru + temp normal dal Peru + temp da stad dal Peru + + + + + temp da las Filippinas + temp normal da las Filippinas + temp da stad da las Filippinas + + + + + temp da las Inslas Fenix + + + + + temp da Saint Pierre e Miquelon + temp normal da Saint Pierre e Miquelon + temp da stad da Saint Pierre e Miquelon + + + + + temp da las Inslas Pitcairn + + + + + temp da Pohnpei + + + + + temp da la Corea dal Nord + + + + + temp da la Réunion + + + + + temp da Rothera + + + + + temp da Sachalin + temp normal da Sachalin + temp da stad da Sachalin + + + + + temp da la Samoa Americana + temp normal da la Samoa Americana + temp da stad da la Samoa Americana + + + + + temp da las Seychellas + + + + + temp normal dal Singapur + + + + + temp da las Inslas da Salomon + + + + + temp da la Georgia dal Sid + + + + + temp dal Surinam + + + + + temp da Shōwa + + + + + temp da Tahiti + + + + + temp dal Taiwan + temp normal dal Taiwan + temp da stad dal Taiwan + + + + + temp dal Tadschikistan + + + + + temp da Tokelau + + + + + temp da Tonga + temp normal da Tonga + temp da stad da Tonga + + + + + temp da Chuuk + + + + + temp dal Turkmenistan + temp normal dal Turkmenistan + temp da stad dal Turkmenistan + + + + + temp da las Inslas da Tuvalu + + + + + temp da l’Uruguai + temp normal da l’Uruguai + temp da stad da l’Uruguai + + + + + temp da l’Usbekistan + temp normal da l’Usbekistan + temp da stad da l’Usbekistan + + + + + temp dal Vanuatu + temp normal dal Vanuatu + temp da stad dal Vanuatu + + + + + temp da la Venezuela + + + + + temp da Vladivostok + temp normal da Vladivostok + temp da stad da Vladivostok + + + + + temp da Volgograd + temp normal da Volgograd + temp da stad da Volgograd + + + + + temp da Vostok + + + + + temp da l’Insla Wake + + + + + temp da Wallis e Futuna + + + + + temp da Jakutsk + temp normal da Jakutsk + temp da stad da Jakutsk + + + + + temp da Jekaterinburg + temp normal da Jekaterinburg + temp da stad da Jekaterinburg + + + + + temp dal Yukon - - + , + + · - - - - #,##0 % - - - + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 milliun + 0 milliuns + 00 milliuns + 00 milliuns + 000 milliuns + 000 milliuns + 0 milliarda + 0 milliardas + 00 milliardas + 00 milliardas + 000 milliardas + 000 milliardas + 0 billiun + 0 billiuns + 00 billiuns + 00 billiuns + 000 billiuns + 000 billiuns + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 miu'.' + 0 miu'.' + 00 miu'.' + 00 miu'.' + 000 miu'.' + 000 miu'.' + 0 mia'.' + 0 mia'.' + 00 mia'.' + 00 mia'.' + 000 mia'.' + 000 mia'.' + 0 biu'.' + 0 biu'.' + 00 biu'.' + 00 biu'.' + 000T biu'.' + 000 biu'.' + + + - #,##0.00 ¤ + ¤#,##0.00 + + + ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) + #,##0.00;(#,##0.00) - 0K ¤ - 0K ¤ - 00K ¤ - 00K ¤ - 000K ¤ - 000K ¤ - 0M ¤ - 0M ¤ - 00M ¤ - 00M ¤ - 000M ¤ - 000M ¤ - 0G ¤ - 0G ¤ - 00G ¤ - 00G ¤ - 000G ¤ - 000G ¤ - 0T ¤ - 0T ¤ - 00T ¤ - 00T ¤ - 000T ¤ - 000T ¤ + 0 + 0 + 0 + 0 + 0 + 0 + ¤0 miu'.' + ¤ 0 miu'.' + ¤0 miu'.' + ¤ 0 miu'.' + ¤00 miu'.' + ¤ 00 miu'.' + ¤00 miu'.' + ¤ 00 miu'.' + ¤000 miu'.' + ¤ 000 miu'.' + ¤000 miu'.' + ¤ 000 miu'.' + ¤0 mia'.' + ¤ 0 mia'.' + ¤0 mia'.' + ¤ 0 mia'.' + ¤00 mia'.' + ¤ 00 mia'.' + ¤00 mia'.' + ¤ 00 mia'.' + ¤000 mia'.' + ¤ 000 mia'.' + ¤000 mia'.' + ¤ 000 mia'.' + ¤0 biu'.' + ¤ 0 biu'.' + ¤0 biu'.' + ¤ 0 biu'.' + ¤00 biu'.' + ¤ 00 biu'.' + ¤00 biu'.' + ¤ 00 biu'.' + ¤000T biu'.' + ¤ 000T biu'.' + ¤000 biu'.' + ¤ 000 biu'.' - {0} {1} - {0} {1} @@ -2198,9 +3740,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic leks albanais - dram armen - dram armen - drams armens + dram da l’Armenia + dram da l’Armenia + drams da l’Armenia flurin da las Antillas Ollandaisas @@ -2241,7 +3783,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic peso argentin - pesos argentins + peso argentin pesos argentins @@ -2256,7 +3798,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic flurin da l’Aruba - flurins da l’Aruba + flurin da l’Aruba flurins da l’Aruba @@ -2277,7 +3819,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic marc convertibel da la Bosnia-Erzegovina marc convertibel da la Bosnia-Erzegovina - marcs convertibel da la Bosnia-Erzegovina + marcs convertibels da la Bosnia-Erzegovina nov dinar da la Bosnia-Erzegovina (1994–1997) @@ -2286,13 +3828,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da Barbados - dollars da Barbados + dollar da Barbados dollars da Barbados - taka bangladais - taka bangladais - takas bangladais + taka dal Bangladesch + taka dal Bangladesch + takas dal Bangladesch franc beltg (convertibel) @@ -2341,7 +3883,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da las Bermudas - dollars da las Bermudas + dollar da las Bermudas dollars da las Bermudas @@ -2388,13 +3930,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da las Bahamas - dollars da las Bahamas + dollar da las Bahamas dollars da las Bahamas - ngultrum butanais - ngultrum butanais - ngultrums butanais + ngultrum dal Butan + ngultrum dal Butan + ngultrums dal Butan kyat burmais @@ -2402,9 +3944,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic kyats burmais - pula da la Botswana - pula da la Botswana - pulas da la Botswana + pula da la Botsuana + pula da la Botsuana + pulas da la Botsuana rubel bieloruss (1994–1999) @@ -2423,7 +3965,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar dal Belize - dollars dal Belize + dollar dal Belize dollars dal Belize @@ -2459,7 +4001,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic peso chilen - pesos chilens + peso chilen pesos chilens @@ -2479,16 +4021,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic peso columbian - pesos columbians + peso columbian pesos columbians unidad de valor real - colon da la Costa Rica - colons da la Costa Rica - colons da la Costa Rica + colón da la Costa Rica + colón da la Costa Rica + colóns da la Costa Rica dinar serb (2002–2006) @@ -2507,7 +4049,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic peso cuban - pesos cubans + peso cuban pesos cubans @@ -2521,9 +4063,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivras cipriotas - cruna tscheca - cruna tcheca - crunas tschecas + curuna tscheca + curuna tscheca + curunas tschecas marc da la Germania da l’Ost @@ -2541,13 +4083,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic francs dal Dschibuti - cruna danaisa - cruna danaisa - crunas danaisas + curuna danaisa + curuna danaisa + curunas danaisas peso dominican - pesos dominicans + peso dominican pesos dominicans @@ -2570,9 +4112,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivras egipzianas - nakfa eritreic - nakfa eritreic - nakfas eritreics + nakfa da l’Eritrea + nakfa da l’Eritrea + nakfas da l’Eritrea peseta spagnola (conto A) @@ -2609,7 +4151,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivra dal Falkland - glivras dal Falkland + glivra dal Falkland glivras dal Falkland @@ -2618,9 +4160,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic francs franzos - glivra britannica - glivra britannica - glivras britannicas + glivra sterlina + glivra sterlina + glivras sterlinas kupon larit georgian @@ -2648,9 +4190,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivras da Gibraltar - dalasi gambic - dalasi gambic - dalasis gambics + dalasi da la Gambia + dalasi da la Gambia + dalasis da la Gambia franc da la Guinea @@ -2674,7 +4216,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic quetzal da la Guatemala - quetzals da la Guatemala + quetzal da la Guatemala quetzals da la Guatemala @@ -2689,7 +4231,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da la Guyana - dollars da la Guyana + dollar da la Guyana dollars da la Guyana @@ -2698,9 +4240,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollars da Hongkong - lempira hondurian - lempira hondurian - lempiras hondurians + lempira honduriana + lempira honduriana + lempiras hondurianas dinar croat @@ -2714,7 +4256,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic gourde haitian - gourdes haitians + gourde haitian gourdes haitians @@ -2723,7 +4265,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic forints ungarais - rupia indonaisa + rupia indonaisa rupia indonaisa rupias indonaisas @@ -2741,9 +4283,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic schekels israelians (1980–1985) - nov schekel israelian - nov schekel israelian - novs schekels israelians + nov shekel israelian + nov shekel israelian + novs shekels israelians rupia indica @@ -2764,9 +4306,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic veglia cruna islandaisa - cruna islandaisa - cruna islandaisa - crunas islandaisas + curuna islandaisa + curuna islandaisa + curunas islandaisas lira taliana @@ -2794,9 +4336,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic schillings kenians - som kirgis - som kirgis - soms kirgis + som kirghis + som kirghis + soms kirghis riel cambodschan @@ -2804,9 +4346,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic riels cambodschans - franc comorian - franc comorian - francs comorians + franc da las Comoras + franc da las Comoras + francs da las Comoras won da la Corea dal Nord @@ -2969,9 +4511,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic tugriks mongolics - pataca dal Macao - pataca dal Macao - patacas dal Macao + pataca da Macao + pataca da Macao + patacas da Macao ouguiya da la Mauretania (1973–2017) @@ -3045,9 +4587,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic meticals dal Mosambic - dollar namibian - dollar namibian - dollars namibians + dollar da la Namibia + dollar da la Namibia + dollars da la Namibia naira nigeriana @@ -3068,9 +4610,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic flurins ollandais - cruna norvegiaisa - cruna norvegiaisa - crunas norvegiaisas + curuna norvegiaisa + curuna norvegiaisa + curunas norvegiaisas rupia nepalaisa @@ -3089,7 +4631,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic balboa dal Panama - balboas dal Panama + balboa dal Panama balboas dal Panama @@ -3097,7 +4639,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic sol peruan - soles peruans + sol peruan soles peruans @@ -3119,9 +4661,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic rupias pakistanas - zloty polac - zloty polac - zlotys polacs + zloti polac + zloti polac + zlotis polacs zloty polac (1950–1995) @@ -3133,13 +4675,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic guarani paraguaian - guaranis paraguaians + guarani paraguaian guaranis paraguaians - rial da Katar - rial da Katar - rials da Katar + riyal dal Qatar + riyal dal Qatar + riyals dal Qatar dollar rodesian @@ -3205,14 +4747,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivras sudanaisas (1957–1998) - cruna svedaisa - cruna svedaisa - crunas svedaisas + curuna svedaisa + curuna svedaisa + curunas svedaisas - dollar dal Singapur - dollar dal Singapur - dollars dal Singapur + dollar da Singapur + dollar da Singapur + dollars da Singapur glivra da Sontg’Elena @@ -3235,9 +4777,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic leones da la Sierra Leone - leone da la Sierra Leone (1964—2022) - leone da la Sierra Leone (1964—2022) - leones da la Sierra Leone (1964—2022) + leone da la Sierra Leone (1964–2022) + leone da la Sierra Leone (1964–2022) + leones da la Sierra Leone (1964–2022) schilling somalian @@ -3245,9 +4787,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic schillings somalians - dollar surinam - dollars surinams - dollars surinams + dollar dal Surinam + dollar dal Surinam + dollars dal Surinam flurin surinam @@ -3263,7 +4805,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dobras da São Tomé e Príncipe (1977–2017) - dobra da São Tomé e Principe + dobra da São Tomé e Príncipe dobra da São Tomé e Príncipe dobras da São Tomé e Príncipe @@ -3281,9 +4823,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic glivras sirianas - lilangeni dal Swaziland - lilangeni dal Swaziland - emalangenis dal Swaziland + lilangeni dal Swasiland + lilangeni dal Swasiland + lilangenis dal Swasiland baht tailandais @@ -3316,9 +4858,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic dinars tunesians - paʻanga da Tonga - paʻanga da Tonga - pa’angas da Tonga + paʻanga dal Tonga + paʻanga dal Tonga + pa’angas dal Tonga escudo dal Timor @@ -3337,7 +4879,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da Trinidad e Tobago - dollars da Trinidad e Tobago + dollar da Trinidad e Tobago dollars da Trinidad e Tobago @@ -3346,9 +4888,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic novs dollars taiwanais - schilling tansanian - schilling tansanian - schillings tansanians + schilling da la Tansania + schilling da la Tansania + schillings da la Tansania hryvnia ucranaisa @@ -3389,9 +4931,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic nov peso da l’Uruguay (1975–1993) - peso da l’Uruguay - peso da l’Uruguai - pesos da l’Uruguai + peso uruguaian + peso uruguaian + pesos uruguaians som usbec @@ -3405,9 +4947,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic bolivar venezuelan (2008–2018) - bolívar venezuelan - bolívar venezuelan - bolívars venezuelans + bolívar venezolan + bolívar venezolan + bolívars venezolans dong vietnamais @@ -3462,6 +5004,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar da la Caribica Orientala dollars da la Caribica Orientala + + flurin caribic + flurin caribic + flurins caribics + dretgs da prelevaziun spezials dretg da prelevaziun spezial @@ -3515,7 +5062,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic valuta nunenconuschenta - (unitad nunenconuschenta da la valuta) + (valuta nunenconuschenta) (valuta nunenconuschenta) @@ -3564,7 +5111,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwachas da la Sambia (1968–2012) - kwacha da la sambia + kwacha da la Sambia kwacha da la Sambia kwachas da la Sambia @@ -3583,6 +5130,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollar dal Simbabwe (1980–2008) dollars dal Simbabwe (1980–2008) + + aur dal Simbabwe + aur dal Simbabwe + aur dal Simbabwe + dollar dal Simbabwe (2009) dollar dal Simbabwe (2009) @@ -3594,9 +5146,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic dollars dal Simbabwe (2008) - - ≈{0} - {0} di {0} dis @@ -3605,9 +5154,281 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + deci{0} + + + centi{0} + + + milli{0} + + + micro{0} + + + nano{0} + + + pico{0} + + + femto{0} + + + atto{0} + + + zepto{0} + + + yocto{0} + + + ronto{0} + + + quecto{0} + + + deca{0} + + + hecto{0} + + + kilo{0} + + + mega{0} + + + giga{0} + + + tera{0} + + + peta{0} + + + exa{0} + + + zetta{0} + + + yotta{0} + + + ronna{0} + + + quetta{0} + + + kibi{0} + + + mebi{0} + + + gibi{0} + + + tebi{0} + + + pebi{0} + + + exbi{0} + + + zebi{0} + + + yobi{0} + {0} per {1} + + {0} quadrat + {0} quadrat + + + {0} cubic + {0} cubic + + + {0}-{1} + + + forzas g + {0} forza g + {0} forzas g + + + meters per secunda quadrat + {0} meters per secunda quadrat + {0} meter per secunda quadrat + + + rotaziuns + {0} rotaziun + {0} rotaziuns + + + radians + {0} radian + {0} radians + + + grads + {0} grad + {0} grads + + + minutas d’artg + {0} minuta d'artg + {0} minutas d'artg + + + secundas d’artg + {0} secunda d’artg + {0} secundas d’artg + + + kilometers quadrats + {0} kilometer quadrat + {0} kilometers quadrats + {0} per kilometer quadrat + + + hectaras + {0} hectara + {0} hectaras + + + meters quadrat + {0} meter quadrat + {0} meters quadrats + {0} per meter quadrat + + + centimeters quadrats + {0} centimeter quadrat + {0} centimeters quadrats + {0} per centimeter quadrat + + + miglias quadrats + {0} miglia quadrat + {0} miglias quadrats + {0} per miglia quadrat + + + acras + {0} acra + {0} acras + + + yards quadrats + {0} yard quadrat + {0} yards quadrats + + + pes quadrats + {0} pe quadrat + {0} pes quadrats + + + poleschs quadrats + {0} polesch quadrat + {0} poleschs quadrats + {0} per polesch quadrat + + + dunams + {0} dunam + {0} dunams + + + carats + {0} carat + {0} carats + + + milligrams per deciliter + {0} milligram per deciliter + {0} milligrams per deciliter + + + millimols per liter + {0} millimol per liter + {0} millimols per liter + + + elements + {0} element + {0} elements + + + parts + {0} part + {0} parts + + + parts per milliun + {0} part per milliun + {0} parts per milliun + + + pertschient + {0} pertschient + {0} pertschient + + + promil + {0} promil + {0} promil + + + per diesch milli + {0} per diesch milli + {0} per diesch milli + + + mols + {0} mol + {0} mols + + + da glucosa + {0} da glucosa + {0} da glucosa + + + liters per kilometer + {0} liter per kilometer + {0} liters per kilometer + + + liters per 100 kilometers + {0} liter per 100 kilometers + {0} liters per 100 kilometers + + + miglias per gallun + {0} miglia per gallun + {0} miglias per gallun + + + miglias per gallun imperial + {0} miglia per gallun imperial + {0} miglias per gallun imperial + petabytes {0} petabyte @@ -3663,6 +5484,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} bit {0} bits + + tschientaners + {0} tschientaner + {0} tschientaners + + + decennis + {0} decenni + {0} decennis + + + {0} per onn + + + quartals + {0} quartal + {0} quartals + {0}/quartal + + + {0} per mais + + + {0} per emna + + + {0} per di + + + {0} per ura + {0} minuta {0} minutas @@ -3678,53 +5530,698 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millisecunda {0} millisecundas + + microsecundas + {0} microsecunda + {0} microsecundas + + + nanosecundas + {0} nanosecunda + {0} nanosecundas + + + ampers + {0} ampere + {0} amperes + + + milliamperes + {0} milliampere + {0} milliamperes + + + ohms + {0} ohm + {0} ohms + + + volts + {0} volt + {0} volts + + + kilocalorias + {0} kilocaloria + {0} kilocalorias + + + calorias + {0} caloria + {0} calorias + + + kilojoules + {0} kilojoule + {0} kilojoules + + + joules + {0} joule + {0} joules + + + uras kilowatt + {0} ura kilowatt + {0} uras kilowatt + + + electronvolts + {0} electronvolt + {0} electronvolts + + + therm US + {0} therm US + {0} therm US + + + glivra-forza + {0} glivra-forza + {0} glivra-forza + + + Newtons + {0} Newton + {0} Newtons + + + kilowatt-uras per 100 kilometers + {0} kilowatt-ura per 100 kilometers + {0} kilowatt-uras per 100 kilometers + + + gigahertz + {0} gigahertz + {0} gigahertz + + + megahertz + {0} megahertz + {0} megahertz + + + kilohertz + {0} kilohertz + {0} kilohertz + + + hertz + {0} hertz + {0} hertz + + + em tipografic + {0} pixel {0} pixels + + megapixels + {0} megapixel + {0} megapixels + + + pixels per centimeter + {0} pixel per centimeter + {0} pixels per centimeter + + + pixels per polesch + {0} pixel per polesch + {0} pixels per polesch + + + radius da la terra + {0} radius da la terra + {0} radius da la terra + kilometers {0} kilometer {0} kilometers + {0} per kilometer {0} meter {0} meters + {0} per meter + + + decimeters + {0} decimeter + {0} decimeters centimeters {0} centimeter {0} centimeters + {0} per centimeter millimeters {0} millimeter {0} millimeters + + micrometers + {0} micrometer + {0} micrometers + + + nanometers + {0} nanometer + {0} nanometers + + + picometers + {0} picometer + {0} picometers + + + miglia + {0} miglia + {0} miglias + + + yards + {0} yard + {0} yards + + + pes + {0} pe + {0} pes + {0} per pe + + + poleschs + {0} polesch + {0} poleschs + {0} per polesch + + + parsecs + {0} parsec + {0} parsecs + + + onns da glisch + {0} onn da glisch + {0} onns da glisch + + + unitads astronomicas + {0} unitad astronomica + {0} unitads astronomicas + + + miglias marinas + {0} miglia marina + {0} miglias marinas + + + miglia scandinava + {0} miglia scandinava + {0} miglias scandinavas + + + puncts tipografics + {0} punct + {0} puncts + + + radius solars + {0} radius solar + {0} radius solars + + + lux + {0} lux + {0} lux + + + candela + {0} candela + {0} candela + + + lumen + {0} lumen + {0} lumen + + + luminusitads solaras + {0} luminusitad solara + {0} luminusitads solaras + + + tonnas + {0} tonna + {0} tonnas + kilograms - {0} kilogram - {0} kilograms + {0} kilogram + {0} kilograms + {0} per kilogram - {0} gram - {0} grams + {0} gram + {0} grams + {0} per gram + + + milligrams + {0} milligram + {0} milligrams + + + micrograms + {0} microgram + {0} micrograms + + + tonnas curtas + + + glivras + {0} glivra + {0} glivras + {0} per glivra + + + unzas + {0} unza + {0} unzas + {0} per unza + + + unzas finas + {0} unza fina + {0} unzas finas + + + carats + {0} carat + {0} carats + + + daltons + {0} dalton + {0} daltons + + + massas da terra + {0} massa da terra + {0} massas da terra + + + massas solaras + {0} massa solara + {0} massas solaras + + + grauns + {0} graun + {0} grauns + + + gigawatts + {0} gigawatt + {0} gigawatts + + + megawatts + {0} megawatt + {0} megawatts + + + kilowatts + {0} kilowatt + {0} kilowatts + + + watts + {0} watt + {0} watts + + + milliwatts + {0} milliwatt + {0} milliwatts + + + forzas-chaval + {0} forza-chaval + {0} forzas-chaval + + + millimeters colonna d’argient viv + {0} millimeter colonna d’argient viv + {0} millimeters colonna d’argient viv + + + d’argient viv + {0} d’argient viv + {0} d’argient viv + + + glivras per polesch quadrat + {0} glivra per polesch quadrat + {0} glivras per polesch quadrat + + + poleschs colonna d’argient viv + {0} polesch colonna d’argient viv + {0} poleschs colonna d’argient viv + + + millibar + {0} millibar + {0} millibar + + + atmosferas + {0} atmosfera + {0} atmosferas + + + pascal + {0} pascal + {0} pascal + + + hectopascal + {0} hectopascal + {0} hectopascal + + + kilopascal + {0} kilopascal + {0} kilopascal + + + megapascal + {0} megapascal + {0} megapascal kilometers per ura {0} kilometer per ura {0} kilometers per ura + + meters per secunda + {0} meter per secunda + {0} meters per secunda + + + miglias per ura + {0} miglia per ura + {0} miglias per ura + + + nufs + {0} nuf + {0} nufs + + + beaufort + beaufort {0} + beaufort {0} + + + grads + {0} grad + {0} grads + grads celsius {0} grad celsius {0} grads celsius + + grads fahrenheit + {0} grad fahrenheit + {0} grads fahrenheit + + + kelvin + {0} kelvin + {0} kelvin + + + Newton meters + {0} Newton meter + {0} Newton meters + + + kilometers cubics + {0} kilometer cubic + {0} kilometers cubics + + + meters cubics + {0} meter cubic + {0} meters cubics + {0} per meter cubic + + + centimeters cubics + {0} centimeter cubic + {0} centimeters cubics + {0} per centimeter cubic + + + miglias cubicas + {0} miglia cubica + {0} miglias cubicas + + + yards cubics + {0} yard cubic + {0} yards cubics + + + pes cubics + {0} pe cubic + {0} pes cubics + + + poleschs cubics + {0} polesch cubic + {0} poleschs cubics + + + megaliters + {0} megaliter + {0} megaliters + + + hectoliters + {0} hectoliter + {0} hectoliters + {0} liter {0} liters {0} per liter + + deciliters + {0} deciliter + {0} deciliters + + + centiliters + {0} centiliter + {0} centiliters + + + milliliters + {0} milliliter + {0} milliliters + + + pintas metricas + {0} pinta metrica + {0} pintas metricas + + + cups metrics + {0} cup metric + {0} cups metrics + + + acre-feet + {0} acre-foot + {0} acre-feet + + + galluns + {0} gallun + {0} galluns + {0} per gallun + + + galluns imperials + {0} gallun imperial + {0} galluns imperials + {0} per gal imp + + + quarts + {0} quart + {0} quarts + + + pintas + {0} pinta + {0} pintas + + + cups + {0} cup + {0} cups + + + unzas liquidas + {0} unza liquida + {0} unzas liquidas + + + unzas liquidas imperialas + {0} unza liquida imperiala + {0} unzas liquidas imperialas + + + tschaduns gronds + {0} tschadun grond + {0} tschaduns gronds + + + tschaduns pitschens + {0} tschadun pitschen + {0} tschaduns pitschens + + + barrels + {0} barrel + {0} barrels + + + tschaduns da dessert + {0} tschadun da dessert + {0} tschaduns da dessert + + + tschaduns da dessert imperials + {0} tschadun da dessert imperial + {0} tschaduns da dessert imperials + + + guts + {0} gut + {0} guts + + + drams + {0} dram + {0} drams + + + jiggers + {0} jiggers + {0} jiggers + + + presas + {0} presa + {0} presas + + + quarts imperials + {0} quart imperial + {0} quarts imperials + + + steradians + {0} steradian + {0} steradians + + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + calorias [IT] + {0} caloria [IT] + {0} calorias [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + teslas + {0} tesla + {0} teslas + + + Webers + {0} Weber + {0} Webers + + + glisch + {0} glisch + {0} glisch + + + parts per milliarda + {0} part per milliarda + {0} parts per milliarda + + + notgs + {0} notg + {0} notgs + {0} per notg + {0} ost {0} nord @@ -3733,86 +6230,401 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - PByte + + forzas g - - TByte + + rot + {0} rot + {0} rot - - Tbit + + radians - - GByte + + grads - - Gbit + + arcmins + {0} arcmin + {0} arcmins - - MByte + + arcsecs + {0} arcsec + {0} arcsecs - - Mbit + + ha - - kByte + + acras - - kbit + + dunams + + + carats + + + elem. + {0} elem. + {0} elem. + + + {0} part + {0} part + + + parts/milliun + + + pertschient + + + promil + + + per diesch milli + + + Glc + {0} Glc + {0} Glc + + + l/km + {0} l/km + {0} l/km + + + l/100 km + {0} l/100 km + {0} l/100 km + + + miglias/gallun + {0} mpg + {0} mpg + + + miglias/gal imp. + + + B + + + tsch. + {0} tsch. + {0} tsch. + + + dec. + {0} dec. + {0} dec. onns {0} onn {0} onns + {0}/o. + + + quart. + {0} quart. + {0} quart. + {0}/quart. mais {0} mais {0} mais + {0}/mais emnas {0} emna {0} emnas + {0}/emna dis {0} di {0} dis + {0}/di uras - {0} ura - {0} uras + {0} h + {0} h + {0}/ura minutas - {0} min. - {0} mins. + {0} min + {0} min secundas - {0} sec. - {0} secs. + {0} sec + {0} sec + + + volts + + + joules + + + electronvolt + + + therm US + {0} therm US + {0} therm US + + + Newton pixels + + megapixels + + + pixels per polesch + - meters + m + + + miglia + + + yards + + + pes + + + poleschs + + + parsecs + + + onns da glisch + + + puncts + + + lux + + + candela + + + lumen + + + luminusitads solaras grams - - km/ura + + daltons + + + massas solaras + + + grauns + {0} gr + {0} gr + + + W + + + PS + {0} PS + {0} PS + + + mmHg + {0} mmHg + {0} mmHg + + + da Hg + {0} da Hg + {0} da Hg - {0} °C - {0} °C + {0}°C + {0}°C + + + Ml + {0} Ml + {0} Ml + + + hl + {0} hl + {0} hl - liters + l + + + dl + {0} dl + {0} dl + + + cl + {0} cl + {0} cl + + + ml + {0} ml + {0} ml + + + acre ft + + + gal + {0} gal + {0} gal + {0}/gal + + + gal imp + {0} gal imp + {0} gal imp + {0}/gal imp + + + cups + + + fl oz + {0} fl oz + {0} fl oz + + + tg + {0} tg + {0} tg + + + tp + {0} tp + {0} tp + + + td + {0} td + {0} td + + + Imp. dessert spoons + {0} dsp-Imp. + {0} dsp-Imp. + + + guts + {0} gt + {0} gt + + + drams + {0} dram + {0} drams + + + jiggers + {0} jiggers + {0} jiggers + + + presas + {0} pr + {0} pr + + + qt imp + {0} qt imp + {0} qt imp + + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + glisch + {0} glisch + {0} glisch + + + parts/milliarda + + + notgs + {0} notg + {0} notgs + {0}/notg direcziun @@ -3823,50 +6635,350 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + G + {0}G + {0}Gs + + + {0}m/s² + {0}m/s² + + + rot + {0}rot + {0}rot + + + {0}rad + {0}rad + + + ° + + + {0}km² + {0}km² + + + ha + {0}ha + {0}ha + + + {0}m² + {0}m² + + + {0}cm² + {0}cm² + + + {0}mi² + {0}mi² + + + ac + {0}ac + {0}ac + + + {0}yd² + {0}yd² + + + {0}ft² + {0}ft² + + + {0}in² + {0}in² + + + {0}dunam + {0}dunam + + + {0}kt + {0}kt + + + {0}mg/dL + {0}mg/dL + + + {0}mmol/L + {0}mmol/L + + + elem. + {0}elem. + {0}elem. + + + parts/milliun + {0}ppm + {0}ppm + + + pertschient + + + promil + + + {0}mol + {0}mol + + + Glc + + + l/km + {0}l/km + {0}l/km + + + l/100km + {0}l/100km + {0}l/100km + + + mpg + {0}mpg + {0}mpg + + + mpg UK + {0}m/gUK + {0}m/gUK + + + PB + {0}PB + {0}PB + + + TB + {0}TB + {0}TB + + + Tb + {0}Tb + {0}Tb + + + GB + {0}GB + {0}GB + + + Gb + {0}Gb + {0}Gb + + + MB + {0}MB + {0}MB + + + Mb + {0}Mb + {0}Mb + + + kB + {0}kB + {0}kB + + + kb + {0}kb + {0}kb + + + B + {0}B + {0}B + + + {0}bit + {0}bit + + + tsch. + {0}tsch. + {0}tsch. + + + dec. + {0}dec. + {0}dec. + - onn - {0} onns - {0} onns + o. + {0}o. + {0}o. + {0}/o. + + + Q + {0}Q + {0}Q + {0}/Q + + + m. + {0}m. + {0}m. + {0}/m. - emna - {0} emnas - {0} emnas + e. + {0}e. + {0}e. + {0}/e. - di - {0} dis - {0} dis + d + {0}d + {0}d - ura - {0} uras - {0} uras + h + {0}h + {0}h min - {0} mins. - {0} mins. + {0}m + {0}m sec - {0} secs. - {0} secs. + {0}s + {0}s {0}ms {0}ms + + {0}μs + {0}μs + + + {0}ns + {0}ns + + + {0}A + {0}A + + + {0}mA + {0}mA + + + {0}Ω + {0}Ω + + + {0}V + {0}V + + + {0}kcal + {0}kcal + + + {0}cal + {0}cal + + + {0}kJ + {0}kJ + + + J + {0}J + {0}J + + + {0}kWh + {0}kWh + + + {0}eV + {0}eV + + + therm US + {0}therm US + {0}therm US + + + {0}lbf + {0}lbf + + + {0}N + {0}N + {0}kWh/100km {0}kWh/100km + + {0}GHz + {0}GHz + + + {0}MHz + {0}MHz + + + {0}kHz + {0}kHz + + + {0}Hz + {0}Hz + + + {0}em + {0}em + + + px + {0}px + {0}px + + + {0}MP + {0}MP + + + {0}ppcm + {0}ppcm + + + pixels per polesch + {0}ppi + {0}ppi + + + {0}R⊕ + {0}R⊕ + {0}km {0}km - meter + m {0}m {0}m @@ -3878,33 +6990,412 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mm {0}mm + + {0}μm + {0}μm + + + {0}nm + {0}nm + + + {0}pm + {0}pm + + + {0}mi + {0}mi + + + {0}yd + {0}yd + + + {0}ft + {0}ft + + + {0}in + {0}in + + + {0}pc + {0}pc + + + {0}ly + {0}ly + + + {0}au + {0}au + + + {0}nmi + {0}nmi + + + {0}smi + {0}smi + + + {0}pt + {0}pt + + + {0}R☉ + {0}R☉ + + + lux + {0}lx + {0}lx + + + {0}cd + {0}cd + + + lumen + {0}lm + {0}lm + + + {0}L☉ + {0}L☉ + + + {0}t + {0}t + + + {0}kg + {0}kg + - gram + g + {0}g + {0}g + + + {0}mg + {0}mg + + + {0}μg + {0}μg + + + {0}lb + {0}lb + + + {0}oz + {0}oz + + + {0}oz t + {0}oz t + + + {0}CD + {0}CD + + + {0}Da + {0}Da + + + {0}M⊕ + {0}M⊕ + + + {0}M☉ + {0}M☉ + + + gr + {0}gr + {0}gr + + + {0}GW + {0}GW + + + {0}MW + {0}MW + + + {0}kW + {0}kW + + + W + {0}W + {0}W + + + {0}mW + {0}mW + + + PS + {0}PS + {0}PS + + + mmHg + {0}mmHg + {0}mmHg + + + da Hg + {0} da Hg + {0} da Hg + + + {0}psi + {0}psi + + + ″ Hg + {0}″ Hg + {0}″ Hg + + + {0}bar + {0}bar + + + {0}atm + {0}atm + + + {0}Pa + {0}Pa + + + {0}hPa + {0}hPa + + + {0}kPa + {0}kPa + + + {0}MPa + {0}MPa km/h + {0}km/h + {0}km/h + + + {0}m/s + {0}m/s + + + mi/hr + {0}mi/h + {0}mi/h + + + {0}kn + {0}kn + + + B{0} + B{0} {0}°C {0}°C + + {0}K + {0}K + + + {0}N⋅m + {0}N⋅m + + + {0}km³ + {0}km³ + + + {0}m³ + {0}m³ + + + {0}cm³ + {0}cm³ + + + {0}mi³ + {0}mi³ + + + {0}yd³ + {0}yd³ + + + {0}ft³ + {0}ft³ + + + {0}in³ + {0}in³ + + + Ml + {0}Ml + {0}Ml + + + hl + {0}hl + {0}hl + - liter + l + {0}l + {0}l + + + dl + {0}dl + {0}dl + + + cl + {0}cl + {0}cl + + + ml + {0}ml + {0}ml + + + {0}mpt + {0}mpt + + + {0}mc + {0}mc + + + acre ft + {0}ac ft + {0}ac ft + + + gal + {0}gal + {0}gal + {0}/gal - {0} gal imp - {0} gal imp + gal imp + {0}gal imp + {0}gal imp + {0}/gal imp + + + {0}qt + {0}qt + + + {0}pt + {0}pt + + + {0}c + {0}c + + + fl oz + {0}fl oz + {0}fl oz - {0} fl oz imp - {0} fl oz imp + Imp fl oz + {0}fl oz Im + {0}fl oz Im + + + tg + {0}tg + {0}tg + + + tp + {0}tp + {0}tp + + + {0}bbl + {0}bbl + + + td + {0}td + {0}td + dsp Imp {0}dsp-Imp {0}dsp-Imp + + gt + {0}gt + {0}gt + + + fl.dr. + {0}fl.dr. + {0}fl.dr. + + + {0}jigger + {0}jigger + + + pr + {0}pr + {0}pr + + + qt imp + {0}qt imp + {0}qt imp + + + cal-IT + + + glisch + {0}glisch + {0}glisch + + + parts/milliarda + {0}ppb + {0}ppb + + + notgs + {0}notg + {0}notgs + {0}/notg + {0}O + {0}N {0}S {0}V @@ -3919,12 +7410,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} u {1} {0} u {1} + + {0}, {1} + {0}, {1} + {0} {1} {0} {1} {0} {1} {0} {1} + + {0}, {1} + {0}, {1} + @@ -3932,7 +7431,313 @@ CLDR data files are interpreted according to the LDML specification (http://unic na:n + + {0} – tut + {0} – cumpatibilitad + {0} – incorporà + {0} – expandì + {0} a sanestra + {0} a dretga + {0} – istoric + {0} – varia + {0} – auter + sistems da scrittira – {0} + {0} stritg + {0} stritgs + sbassà {0} + elevà {0} + activitads + sistems da scrittira africans + sistems da scrittira americans + animals u natira + frizzas + corp + segns cun rom + Braille + edifizi + simbols d’enumeraziun u stailas + jamo consonantic + simbols da valuta + lingetta u stritg d’uniun + cifras + simbols da divinaziun + frizzas vers engiu + frizzas vers ensi ed engiu + sistems da scrittira da l’Asia da l’Ost + sistems da scrittira europeics + feminin + bandiera + bandieras + da mangiar e da baiver + format & spazi + variantas en plaina largezza + furmas geometricas + variantas en mesa largezza + caracters han + radicals han + hanzi (simplifitgà) + hanzi (tradiziunal) + cor + sistems da scrittira istorics + caracters da descripziun ideografica + kana giapunais + tasta + frizzas a sanestra + frizzas a sanestra ed a dretga + simbols sco letras + diever limità + masculin + simbols matematics + sistems da scrittira dal Proxim Orient + varia + sistems da scrittira moderns + modificatur + simbols musicals + natira + senza spazi + cifras + objects + auter + en pèrs + persuna + alfabet fonetic + pictograms + lieu + planta + interpuncziun + frizzas a dretga + segn u simbol + variantas pitschnas + smiley u persuna + sistems da scrittira da l’Asia dal Sid + sistems da scrittira da l’Asia dal Sidost + spazi + simbols + simbols tecnics + accents d’intunaziun + viadi + viadi u lieu + frizzas ensi + variantas + jamo vocalic + aura + scripts da l’Asia dal Vest + spazi vid + cursiv + dimensiun optica + inclinaziun + largezza + grossezza + cursiv + legenda + titel + visur + placat + cursiv invers + vertical + inclinà + extrainclinà + ultracondensà + extracondensà + condensà + semicondensà + semiexpandì + expandì + extraexpandì + ultraexpandì + fin + extralev + lev + semilev + cudesch + mesaun + semigrass + grass + extragrass + nair + extranair + fracziuns verticalas + spazi tranter maiusclas + ligaturas opziunalas + fracziuns diagonalas + cifras maiusclas + cifras medievalas + dumbers ordinals + cifras proporziunalas + maiusclettas + cifras tabellaras + nulla cun stritg diagonal + + und rm + informal + + {title} {given} {given2} {surname} {generation} {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {given-informal-monogram-allCaps}{surname-monogram-allCaps} + + + {given} {given2-initial} {surname} {generation} {credentials} + + + {given-informal} {surname} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given-initial} {given2-initial} {surname} + + + {given-informal} {surname-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname}, {title} {given} {given2} {generation} {credentials} + + + {surname}, {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps}{given-informal-monogram-allCaps} + + + {surname}, {given} {given2-initial} {generation} {credentials} + + + {surname}, {given-informal} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname}, {given-initial} {given2-initial} + + + {surname}, {given-initial} + + + {title} {surname} + + + {given-informal} + + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {surname-core}, {given} {given2} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + {surname-core}, {given-initial} {given2-initial} {surname-prefix} + + + {surname}, {given-informal} + + + Ursina + + + Aita + Caduff + + + Gian Carlo + Ramun + Foffa + + + dr. + Margaritta Marionna + Rita + Maria + de + Planta + ∅∅∅ + jr. + CF + + + Rüdiger + + + Käthe + Müller + + + Zäzilia + Hamish + Stöber + + + Prof. Dr. + Ada Cornelia + Neele + César Martín + von + Brühl + González Domingo + Jr + MD DDS + + diff --git a/make/data/cldr/common/main/ro.xml b/make/data/cldr/common/main/ro.xml index 5add9d07498..44de014592e 100644 --- a/make/data/cldr/common/main/ro.xml +++ b/make/data/cldr/common/main/ro.xml @@ -151,7 +151,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ greacă elamită engleză - engleză (S.U.A) + engleză (UK) engleză medie esperanto spaniolă @@ -284,6 +284,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölsch kurdă + kurdă + kurmangi kumyk kutenai komi @@ -865,6 +867,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ China Columbia Insula Clipperton + Sark Costa Rica Cuba Capul Verde @@ -1057,7 +1060,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tunisia Tonga Turcia - Türkiye + TR-variant Trinidad și Tobago Tuvalu Taiwan @@ -1219,35 +1222,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sortare numerică puterea sortării monedă + Prezentare emojiuri ciclu orar (12 sau 24) - stil de întrerupere a liniei + stil de întrerupere a rândului (chineză, japoneză, coreeană) + întrerupere a rândului în interiorul cuvântului sistem de unități de măsură numere + întrerupere propoziție după abr. fus orar variantă locală utilizare privată calendar budist + budist calendar chinezesc + chinezesc calendar copt + copt calendar dangi + dangi calendar etiopian + etiopian calendar etiopian amete alem + etiopian amete alem calendar gregorian + gregorian calendar ebraic + ebraic calendar național indian calendarul hegirei + al hegirei calendarul hegirei (tabular, civil) + al hegirei (tabular, civil) calendar islamic (Arabia Saudită, lunar) calendar islamic (tabular, epocă astronomică) calendarul hegirei (Umm al-Qura) + al hegirei (Umm al-Qura) calendar ISO-8601 calendar japonez + japonez calendar persan + persan calendarul Republicii Chineze + al Republicii Chineze Format monedă contabilitate + contabilitate Format monedă standard + standard Ordonați simbolurile Ordonați ignorând simbolurile Ordonați accentele în mod normal @@ -1257,23 +1279,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ordonați mai întâi majusculele Ordonați neținând seama de diferența dintre majuscule/minuscule Ordonați ținând seama de diferența dintre majuscule/minuscule - ordine de sortare a chinezei tradiționale - Big5 ordine de sortare anterioară, pentru compatibilitate + compatibilitate ordine de sortare a dicționarului + dicționar ordine de sortare Unicode implicită + Unicode implicită ordine de sortare a emojiurilor regulile europene de sortare - ordine de sortare a chinezei simplificate - GB2312 ordine de sortare după cartea de telefon + carte de telefon ordine de sortare fonetică + fonetică ordine de sortare pinyin + pinyin căutare cu scop general + căutare Căutați în funcție de consoana inițială hangul ordine de sortare standard + standard ordine de sortare după trasare + trasare ordine de sortare tradițională + tradițională ordine de sortare după radical și trasare + radical și trasare ordine de sortare zhuyin + zhuyin Ordonați fără normalizare Ordonați caracterele unicode normalizat Ordonați cifrele individual @@ -1286,18 +1318,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Cu lățime întreagă Cu jumătate de lățime Numeric + implicită + emojiuri + text sistem cu 12 ore (0–11) + 12 (0–11) sistem cu 12 ore (1–12) + 12 (1–12) sistem cu 24 de ore (0–23) + 24 (0–23) sistem cu 24 de ore (1–24) + 24 (1–24) stil liber de întrerupere a liniei - stil normal de întrerupere a liniei - stil strict de întrerupere a liniei + liber + stil de normal întrerupere a rândului + normal + stil strict de întrerupere a rândului + strict + întrerupere oriunde + fără întrerupere + normal + fără întrerupere în expresii transliterare BGN SUA transliterare GEGN ONU sistemul metric + metric sistemul imperial de unități de măsură + britanic sistemul american de unități de măsură + american cifre ahom cifre indo-arabe cifre indo-arabe extinse @@ -1383,6 +1432,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ cifre vai cifre warang citi cifre wancho + dezactivată + activată metric @@ -1412,9 +1463,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1508,11 +1556,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - înainte de Anno Martyrum după Anno Martyrum - î.A.M. A.M. @@ -1537,16 +1583,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - înainte de Întrupare - după Întrupare - - - î.Într. - d.Într. - - @@ -1580,6 +1616,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'la' {0} + + {1} 'la' {0} + @@ -1588,6 +1627,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'la' {0} + + {1} 'la' {0} + @@ -1604,11 +1646,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM.y G dd.MM.y G + E, dd.MM.y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a dd.MM @@ -1955,6 +1998,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'la' {0} + + {1} 'la' {0} + @@ -1963,11 +2009,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'la' {0} + + {1} 'la' {0} + {1}, {0} + + {1} 'la' {0} + @@ -1979,15 +2031,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM.y G dd.MM.y G + E, dd.MM.y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + 'h' HH v dd.MM E, dd.MM dd.MM @@ -2051,10 +2105,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM y G E, d MMM y – E, d MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -2065,10 +2115,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - M–M @@ -2313,18 +2359,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ acum {0} de luni - - - peste {0} lună - peste {0} luni - peste {0} luni - - - acum {0} lună - acum {0} luni - acum {0} luni - - +{0} lună @@ -2746,8 +2780,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ sâ. -{0} săpt. + + a.m./p.m. + - a.m/p.m. + a.m./p.m. + + + a.m./p.m. oră @@ -2890,15 +2930,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Oraș necunoscut - - Tirana - Erevan - - Showa - Viena @@ -2920,6 +2954,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Capul Verde + + Insula Christmas + Praga @@ -2983,7 +3020,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bișkek - Enderbury + Insula Canton Comore @@ -2991,6 +3028,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Phenian + + Seul + Kuweit @@ -3018,9 +3058,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Luxemburg - - Chișinău - Podgorița @@ -3120,9 +3157,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damasc - - N’Djamena - Dușanbe @@ -3132,6 +3166,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiev + + Insula Wake + Beulah, Dakota de Nord @@ -3176,9 +3213,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ora Africii Occidentale - Ora standard a Africii Occidentale - Ora de vară a Africii Occidentale + Ora Africii Occidentale @@ -3239,9 +3274,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ora din Apia - Ora standard din Apia - Ora de vară din Apia + Ora din Samoa + Ora standard din Samoa + Ora de vară din Samoa @@ -3544,7 +3579,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ora de Greenwhich + Ora de Greenwich GMT @@ -3574,6 +3609,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ora din Guyana + + + Ora standard din Hawaii-Aleutine + + Ora din Hawaii-Aleutine @@ -4174,24 +4214,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) - 0 mie ¤ - 0 mii ¤ - 0 mii ¤ - 00 mii ¤ - 00 mii ¤ - 00 mii ¤ - 000 mii ¤ - 000 mii ¤ - 000 mii ¤ + 0 K ¤ + 0 K ¤ + 0 K ¤ + 00 K ¤ + 00 K ¤ + 00 K ¤ + 000 K ¤ + 000 K ¤ + 000 K ¤ 0 mil'.' ¤ 0 mil'.' ¤ 0 mil'.' ¤ @@ -5521,6 +5562,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dolari est-caraibi XCD + + gulden caraib + gulden caraib + guldeni caraibi + guldeni caraibi + drepturi speciale de tragere @@ -5626,6 +5673,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dolari Zimbabwe (1980–2008) dolari Zimbabwe (1980–2008) + + Zimbabwe Gold + Zimbabwe Gold + Zimbabwe Gold + Zimbabwe Gold + dolar Zimbabwe (2009) @@ -5797,10 +5850,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine {0} forță g unei forțe g - {0} forță g - {0} forță g - {0} forță g - {0} forță g + {0} forțe g + {0} forțe g + {0} de forțe g + {0} de forțe g masculine @@ -5979,7 +6032,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} de itemi {0} de itemi - + + părți + {0} parte + {0} părți + {0} de părți + + feminine părți pe milion {0} parte pe milion @@ -6028,6 +6087,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} de moli {0} de moli + + de glucoză + {0} de glucoză + {0} de glucoză + {0} de glucoză + masculine litri pe kilometru @@ -6935,6 +7000,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} de milimetri coloană de mercur {0} de milimetri coloană de mercur + + de mercur + {0} de mercur + {0} de mercur + {0} de mercur + livre pe inch pătrat {0} livră pe inch pătrat @@ -7050,9 +7121,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} de noduri - Beaufort {0} - Beaufort {0} - Beaufort {0} + {0} grad Beaufort + {0} grade Beaufort + {0} de grade Beaufort neuter @@ -7241,6 +7312,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} de căni metrice {0} de căni metrice + + uncii lichide metrice + uncie lichidă metrică + {0} uncii lichide metrice + {0} de uncii lichide metrice + acru-picioare {0} acru-picior @@ -7346,17 +7423,88 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} quarte imperiale {0} de quarte imperiale + + steradieni + {0} steradian + {0} steradieni + {0} de steradieni + + + katali + {0} katal + {0} katali + {0} de katali + + + coulombi + {0} coulomb + {0} coulombi + {0} de coulombi + + + farazi + {0} farad + {0} farazi + {0} de farazi + + + henry + {0} henry + {0} henry + {0} de henry + + + siemenși + {0} siemens + {0} siemenși + {0} de siemenși + + + calorii [IT] + {0} calorie [IT] + {0} calorii [IT] + {0} de calorii [IT] + + + becquereli + {0} becquerel + {0} becquereli + {0} de becquereli + + + sievert + {0} sievert + {0} sieverți + {0} de sieverți + + + gray + {0} gray + {0} gray + {0} de gray + + + kilograme-forță + {0} kilogram-forță + {0} kilograme-forță + {0} de kilograme-forță + + + tesla + {0} tesla + {0} tesla + {0} de tesla + + + weberi + {0} weber + {0} weberi + {0} de weberi + feminine - lumină - {0} lumină - {0} lumină - {0} lumină - {0} lumină - {0} lumină - {0} lumină - + feminine părți pe miliard {0} parte pe miliard @@ -7375,14 +7523,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} nopți {0} de nopți {0} de nopți - {0}/noapte punct cardinal - {0} E - {0} N - {0} S - {0} V + {0} est + {0} nord + {0} sud + {0} vest @@ -7449,11 +7596,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} itemi {0} de itemi + + parte + {0} parte + {0} părți + {0} de părți + {0} mol {0} moli {0} moli + + Glc + l/km {0} l/km @@ -7673,6 +7829,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} CP {0} CP + + de Hg + {0} de Hg + {0} de Hg + {0} de Hg + in Hg {0} in Hg @@ -7789,13 +7951,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt imp. {0} qt imp. + + cal-IT + lumină {0} lumină {0} lumină {0} lumină - + părți/miliard @@ -7807,7 +7972,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ direcție - {0}V + {0} E + {0} N + {0} S + {0} V @@ -7847,6 +8015,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} itemi {0} itemi + + parte + {0} parte + {0} părți + {0} părți + {0} ‰ {0} ‰ @@ -7857,6 +8031,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + mi/gal {0} mi/gal @@ -7922,6 +8099,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ g + + de Hg + {0} de Hg + {0} de Hg + {0} de Hg + {0}″ Hg {0}″ Hg @@ -7983,21 +8166,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt im {0} qt im - - lumină - {0} lumină - {0} lumină - {0} lumină - - - părți/miliard - - - nopți - {0} noapte - {0} nopți - {0} de nopți - {0}/noapte + + cal-IT diff --git a/make/data/cldr/common/main/root.xml b/make/data/cldr/common/main/root.xml index 4aee72f9dec..cb483de4be8 100644 --- a/make/data/cldr/common/main/root.xml +++ b/make/data/cldr/common/main/root.xml @@ -42,8 +42,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [] [] - [\- ‑ , . % ‰ + 0 1 2 3 4 5 6 7 8 9] - [\- ‑ , ; \: ! ? . ( ) \[ \] \{ \}] + [\- ‑ , . % ‰ + − 0 1 2 3 4 5 6 7 8 9] + [] + [\- ‐‑ , ; \: ! ? . ( ) \[ \] \{ \}] + [] + [\- ‐‑ , . /] {0}… …{0} {0}…{1} @@ -393,6 +396,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -401,6 +407,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -409,6 +418,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -417,6 +429,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + h B @@ -424,6 +439,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d, E @@ -440,6 +456,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm h:mm:ss a HH:mm:ss + h a v + HH'h' v L MM-dd MM-dd, E @@ -648,8 +666,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ERA0 - ERA1 + AM @@ -757,8 +774,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ERA0 - ERA1 + AA + AM @@ -792,7 +809,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ERA0 + AA @@ -897,7 +914,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd GGGGGyMMdd @@ -913,6 +930,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -921,6 +941,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -929,6 +952,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -937,6 +963,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + h B @@ -944,15 +973,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d, E + E h a E h:mm a E HH:mm E h:mm:ss a E HH:mm:ss G y - GGGGG y-MM-dd + G y-MM + G y-MM-dd + G y-MM-dd, E G y MMM G y MMM d G y MMM d, E @@ -962,6 +995,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm h:mm:ss a HH:mm:ss + h a v + HH'h' v L MM-dd MM-dd, E @@ -972,9 +1007,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mm:ss G y G y - GGGGG y-MM - GGGGG y-MM-dd - GGGGG y-MM-dd, E + G y-MM + G y-MM-dd + G y-MM-dd, E G y MMM G y MMM d G y MMM d, E @@ -1014,21 +1049,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G y–y - GGGGG y-MM – GGGGG y-MM - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM + G y-MM – G y-MM + G y-MM – y-MM + G y-MM – y-MM - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – GGGGG y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – G y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – GGGGG y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – G y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E G y MMM – G y MMM @@ -1105,18 +1140,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G y–y - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM + G y-MM – y-MM + G y-MM – y-MM - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E G y MMM–MMM @@ -1355,6 +1390,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -1363,6 +1401,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -1371,6 +1412,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -1379,6 +1423,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + h B @@ -1386,15 +1433,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm:ss B d ccc + E h B E h:mm B E h:mm:ss B d, E + E h a E h:mm a E HH:mm E h:mm:ss a E HH:mm:ss G y - GGGGG y-MM-dd + G y-MM + G y-MM-dd + G y-MM-dd, E G y MMM G y MMM d G y MMM d, E @@ -1408,6 +1459,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm:ss v h:mm a v HH:mm v + h a v + HH'h' v L MM-dd MM-dd, E @@ -1461,21 +1514,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G y–y - GGGGG y-MM – GGGGG y-MM - GGGGG y-MM – y-MM - GGGGG y-MM – y-MM + G y-MM – G y-MM + G y-MM – y-MM + G y-MM – y-MM - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – GGGGG y-MM-dd - GGGGG y-MM-dd – y-MM-dd - GGGGG y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – G y-MM-dd + G y-MM-dd – y-MM-dd + G y-MM-dd – y-MM-dd - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – GGGGG y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E - GGGGG y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – G y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E + G y-MM-dd, E – y-MM-dd, E G y MMM – G y MMM @@ -1728,7 +1781,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Saka + Śaka @@ -1817,6 +1870,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ AH + BH @@ -2070,7 +2124,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MM-dd, E LLL MMM d - MMM d + MMM d, E MMMM d MMMM 'week' W mm:ss @@ -2844,8 +2898,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Before R.O.C. - R.O.C. + BROC + ROC @@ -3189,6 +3243,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ +HH:mm;-HH:mm GMT{0} GMT + GMT+? {0} {0} (+1) {0} (+0) @@ -3198,12 +3253,48 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ UTC + + Tirana + + + Showa + Dumont-d’Urville + + Río Gallegos + + + Tucumán + + + Córdoba + St. Barthélemy + + Eirunepé + + + Cuiabá + + + Santarém + + + Belém + + + Araguaína + + + São Paulo + + + Maceió + Fernando de Noronha @@ -3213,12 +3304,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ St. John’s + + Ürümqi + + + Bogotá + Curaçao + + Büsingen + + + Galápagos + + + El Aaiún + Asmara + + Canarias + Chuuk @@ -3237,39 +3346,66 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kolkata + + Canton + + + Comores + St. Kitts St. Lucia + + Chișinău + Yangon + + Khovd + Macao Ciudad Juárez + + Mazatlán + Bahía de Banderas + + Ciudad de México + Mérida Cancún + + Nouméa + Kathmandu + + Saint-Pierre + Asunción Réunion + + Mahé + St. Helena @@ -3279,6 +3415,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Lower Prince’s Quarter + + N’Djamena + + + Lomé + Kyiv @@ -3324,6 +3466,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ho Chi Minh + + Wallis & Futuna + @@ -3332,9 +3477,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ latn 1 - - - @@ -3593,6 +3735,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -3602,9 +3747,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - @@ -3850,6 +3992,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -3859,9 +4004,240 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {0}⁄{1} + {0} {1} + {0}⁠{1} + sometimes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4088,6 +4464,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -4097,9 +4476,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - @@ -4330,6 +4706,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -4339,9 +4718,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - @@ -4614,6 +4990,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -4878,6 +5257,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ RF + + + $ @@ -5187,6 +5569,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + @@ -5405,7 +5790,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ item {0} item - + + part + {0} part + + ppm {0} ppm @@ -5425,6 +5814,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mol {0} mol + + glucose + {0} Glc + L/km {0} L/km @@ -5866,6 +6259,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mm Hg {0} mm Hg + + Hg + {0} Hg + psi {0} psi @@ -6009,6 +6406,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mcup {0} mc + + fl oz m. + {0} fl oz m. + ac ft {0} ac ft @@ -6035,10 +6436,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ pt {0} pt + + pint Imp. + {0} pt Imp. + cup {0} c + + cup Imp. + {0} cup Imp. + US fl oz {0} fl oz US @@ -6087,11 +6496,163 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp {0} qt Imp. + + sr + {0} sr + + + kat + {0} kat + + + C + {0} C + + + F + {0} F + + + H + {0} H + + + S + {0} S + + + calorie-IT + {0} cal-IT + + + BTU-IT + {0} BTU-IT + + + Bq + {0} Bq + + + Sv + {0} Sv + + + Gy + {0} Gy + + + kgf + {0} kgf + + + rod + {0} rod + + + chain + {0} chain + + + T + {0} T + + + Wb + {0} Wb + + + °R + {0} °R + + + fortnight + {0} fw + + + slug + {0} slug + + + gas E + {0} gas E + + + rin [JP] + {0} rin [JP] + + + sun [JP] + {0} sun [JP] + + + shaku [JP] + {0} shaku [JP] + + + shaku [cloth, JP] + {0} shaku [cloth, JP] + + + ken [JP] + {0} ken [JP] + + + jo [JP] + {0} jo [JP] + + + ri [JP] + {0} ri [JP] + + + bu [JP] + {0} bu [JP] + + + se [JP] + {0} se [JP] + + + cho [JP] + {0} cho [JP] + + + kosaji [JP] + {0} kosaji [JP] + + + osaji [JP] + {0} osaji [JP] + + + cup [JP] + {0} cup [JP] + + + shaku [vol, JP] + {0} shaku [vol, JP] + + + sai [JP] + {0} sai [JP] + + + to [JP] + {0} to [JP] + + + koku [JP] + {0} koku [JP] + light {0} light - + + fun [JP] + {0} fun [JP] + + ppb {0} ppb diff --git a/make/data/cldr/common/main/ru.xml b/make/data/cldr/common/main/ru.xml index f01b65479ab..15c63dc621f 100644 --- a/make/data/cldr/common/main/ru.xml +++ b/make/data/cldr/common/main/ru.xml @@ -293,6 +293,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафия кёльнский курдский + курдский + курманджи кумыкский кутенаи коми @@ -854,6 +856,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Китай Колумбия о-в Клиппертон + Сарк Коста-Рика Куба Кабо-Верде @@ -1131,35 +1134,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ числовая сортировка эффективность сортировки валюта + представление эмодзи формат времени (12- или 24-часовой) стиль перевода строки + стиль переноса слов система мер цифры + разрыв предложения после сокращения часовой пояс вариант региональных настроек частное буддийский календарь + буддийский китайский календарь + китайский коптский календарь + коптский календарь данги + данги эфиопский календарь + эфиопский эфиопский календарь амете-алем + эфиопский (амете-алем) григорианский календарь + григорианский еврейский календарь + еврейский Национальный календарь Индии календарь хиджры + хиджра гражданский календарь хиджры (табличный) + хиджра (табличный, гражданский) исламский календарь (Саудовская Аравия) исламский календарь (табличный, астрономическая эпоха) календарь хиджры (Умм аль-Кура) - календарь ISO-8601 + хиджра (Умм аль-Кура) + григорианский (сначала год) японский календарь + японский персидский календарь + персидский календарь Миньго + Миньго финансовый формат + финансовый стандартный формат + стандартный Сортировка символов Сортировка без учета символов Сортировка по акцентам в обычном порядке @@ -1169,23 +1191,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Приоритетная сортировка слов в верхнем регистре Сортировка вне зависимости от регистра Сортировка с учетом регистра - традиционный китайский - Big5 совместимый порядок сортировки + совместимый словарный порядок сортировки + словарный cтандартная сортировка Unicode + стандартный (Unicode) эмодзи европейские правила сортировки - упрощенный китайский - GB2312 порядок телефонной книги + телефонная книга фонетический порядок сортировки + фонетический пиньинь + пиньинь поиск + поиск Поиск по первой согласной хангыль стандартная сортировка + стандартный по чертам + по чертам традиционный порядок + традиционный сортировка по ключам, затем по чертам + по ключам, затем по чертам чжуинь + чжуинь Сортировка без нормализации Сортировка нормализованных символов Unicode Отдельная сортировка числовых значений @@ -1198,18 +1230,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ полноширинные символы полуширинные символы Числовая + по умолчанию + эмодзи + текстовые символы 12-часовой формат времени (0–11) + 12-часовой (0–11) 12-часовой формат времени (1–12) + 12-часовой (1–12) 24-часовой формат времени (0–23) + 24-часовой (0–23) 24-часовой формат времени (1–24) + 24-часовой (1–24) мягкий перевод строки + мягкий обычный перевод строки + обычный жесткий перевод строки + жесткий + переносить все + сохранять все + обычный стиль + сохранять во фразах система транслитерации BGN система транслитерации ООН метрическая система + метрическая британская система мер + британская американская система мер + американская арабско-индийские цифры расширенная система арабско-индийских цифр армянские цифры @@ -1271,6 +1320,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тибетские цифры Традиционная система нумерации цифры ваи + выключено + включено Метрическая @@ -1338,13 +1389,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [{а́} {е́} {и́} {о́} {у́} {ы́} {э́} {ю́} {я́}] [А Б В Г Д ЕЁ Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я] [  \- ‑ , % ‰ + 0 1 2 3 4 5 6 7 8 9] + [. / A B C D E F I L M V X] [\- ‐‑ – — , ; \: ! ? . … '‘‚ "“„ « » ( ) \[ \] \{ \} § @ * / \& #] + [· + < = > ~ №] + [\- ‑ . '’ ( )] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1485,11 +1536,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - до Диоклетиана от Диоклетиана - до Диокл. от Диокл. @@ -1514,16 +1563,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - до воплощения Христа - от воплощения Христа - - - до Христа - от Христа - - @@ -1557,6 +1596,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -1565,6 +1607,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -1577,21 +1622,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, h B ccc, h:mm B ccc, h:mm:ss B E, d + E, h a ccc, h:mm a ccc HH:mm ccc, h:mm:ss a ccc HH:mm:ss y 'г'. G + MM.y G dd.MM.y G + E, dd.MM.y G LLL y 'г'. G d MMM y 'г'. G E, d MMM y 'г'. G - h a + H h:mm a h:mm:ss a + h a, v + HH 'ч'. v dd.MM E, dd.MM d MMM @@ -1610,48 +1661,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ QQQQ y 'г'. G - {0} – {1} + {0} — {1} + + h B — h B + - h:mm – h:mm B - h:mm – h:mm B + h:mm B — h:mm B + h:mm — h:mm B + h:mm — h:mm B - y 'г'. G – y 'г'. G + y 'г'. G — y 'г'. G y–y 'гг'. G - MM.y G – MM.y G - MM.y – MM.y G - MM.y – MM.y G + MM.y G — MM.y G + MM.y — MM.y G + MM.y — MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y G – dd.MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G + dd.MM.y — dd.MM.y G + dd.MM.y G — dd.MM.y G + dd.MM.y — dd.MM.y G + dd.MM.y — dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y G – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G + ccc, dd.MM.y G — ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G - LLL y 'г'. G – LLL y 'г'. G - LLL – LLL y 'г'. G - LLL y – LLL y 'гг'. G + LLL y 'г'. G — LLL y 'г'. G + LLL — LLL y 'г'. G + LLL y — LLL y 'гг'. G d–d MMM y 'г'. G - d MMM y 'г'. G – d MMM y 'г'. G - d MMM – d MMM y 'г'. G - d MMM y – d MMM y 'гг'. G + d MMM y 'г'. G — d MMM y 'г'. G + d MMM — d MMM y 'г'. G + d MMM y — d MMM y 'гг'. G - ccc, d MMM – ccc, d MMM y 'г'. G - ccc, d MMM y 'г'. G – ccc, d MMM y 'г'. G - ccc, d MMM – ccc, d MMM y 'г'. G - ccc, d MMM y – ccc, d MMM y 'гг'. G + ccc, d MMM — ccc, d MMM y 'г'. G + ccc, d MMM y 'г'. G — ccc, d MMM y 'г'. G + ccc, d MMM — ccc, d MMM y 'г'. G + ccc, d MMM y — ccc, d MMM y 'гг'. G h a – h a @@ -1689,61 +1744,61 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ M–M - dd.MM – dd.MM - dd.MM – dd.MM + dd.MM — dd.MM + dd.MM — dd.MM - E, dd.MM – E, dd.MM - E, dd.MM – E, dd.MM + E, dd.MM — E, dd.MM + E, dd.MM — E, dd.MM - LLL – LLL + LLL — LLL d–d MMM - d MMM – d MMM + d MMM — d MMM - ccc, d MMM – ccc, d MMM - ccc, d MMM – ccc, d MMM + ccc, d MMM — ccc, d MMM + ccc, d MMM — ccc, d MMM - LLLL – LLLL + LLLL — LLLL y–y 'гг'. G - MM.y – MM.y G - MM.y – MM.y G + MM.y — MM.y G + MM.y — MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G - dd.MM.y – dd.MM.y G + dd.MM.y — dd.MM.y G + dd.MM.y — dd.MM.y G + dd.MM.y — dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G - ccc, dd.MM.y – ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G + ccc, dd.MM.y — ccc, dd.MM.y G - LLL – LLL y 'г'. G - LLL y 'г'. – LLL y 'г'. G + LLL — LLL y 'г'. G + LLL y 'г'. — LLL y 'г'. G d–d MMM y 'г'. G - d MMM – d MMM y 'г'. G - d MMM y 'г'. – d MMM y 'г'. G + d MMM — d MMM y 'г'. G + d MMM y 'г'. — d MMM y 'г'. G - ccc, d MMM – ccc, d MMM y 'г'. G - ccc, d MMM – ccc, d MMM y 'г'. G - ccc, d MMM y 'г'. – ccc, d MMM y 'г'. G + ccc, d MMM — ccc, d MMM y 'г'. G + ccc, d MMM — ccc, d MMM y 'г'. G + ccc, d MMM y 'г'. — ccc, d MMM y 'г'. G - LLLL – LLLL y 'г'. G - LLLL y 'г'. – LLLL y 'г'. G + LLLL — LLLL y 'г'. G + LLLL y 'г'. — LLLL y 'г'. G @@ -1987,6 +2042,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -1995,6 +2053,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'в' {0} + + {1} 'в' {0} + @@ -2007,21 +2068,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, h B ccc, h:mm B ccc, h:mm:ss B ccc, d + E, h a E h:mm a E h:mm:ss a y 'г'. G + MM.y GGGGG dd.MM.y GGGGG + E, dd.MM.y GGGGG LLL y 'г'. G d MMM y 'г'. G E, d MMM y 'г'. G - h a + H h:mm a h:mm:ss a h:mm:ss a v h:mm a v + h a, v + HH 'ч'. v dd.MM E, dd.MM dd.MM @@ -2034,7 +2101,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W-'я' 'неделя' MMMM MM.y dd.MM.y - ccc, dd.MM.y 'г'. + ccc, dd.MM.y MM.y LLL y 'г'. d MMM y 'г'. @@ -2089,7 +2156,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a + + + HH–HH 'ч' h:mm a – h:mm a @@ -2103,7 +2172,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v + + + HH–HH 'ч'. v M–M @@ -3682,6 +3753,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ о-в Пасхи + + Койайке + Пунта-Аренас @@ -3947,10 +4021,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пномпень - о-в Эндербери - - - Кантон + о-в Кантон Киритимати @@ -4626,9 +4697,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Западная Африка - Западная Африка, стандартное время - Западная Африка, летнее время + Западная Африка @@ -5016,6 +5085,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гайана + + + Гавайско-алеутское стандартное время + + Гавайско-алеутское время @@ -5466,6 +5540,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Трук + + + Турецкое время + Турецкое стандартное время + Турецкое летнее время + + Туркменистан @@ -5643,6 +5724,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + {0} {1} + @@ -5654,7 +5738,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -7116,6 +7203,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ восточно-карибских долларов восточно-карибского доллара + + карибский гульден + карибский гульден + карибских гульдена + карибских гульденов + карибского гульдена + Cg + СДР (специальные права заимствования) @@ -7214,6 +7309,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Доллар Зимбабве + + зимбабвийский золотой + зимбабвийский золотой + зимбабвийских золотых + зимбабвийских золотых + зимбабвийского золотого + Доллар Зимбабве (2009) @@ -8023,7 +8125,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} объекта {0} объекта - + + части + {0} часть + {0} части + {0} частей + {0} части + + feminine миллионные доли {0} миллионная доля @@ -8166,6 +8275,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моля {0} моля + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + masculine литры на километр @@ -10789,6 +10905,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} миллиметра ртутного столба {0} миллиметра ртутного столба + + ртутного столба + {0} ртутного столба + {0} ртутного столба + {0} ртутного столба + {0} ртутного столба + фунты на квадратный дюйм {0} фунт на квадратный дюйм @@ -11665,6 +11788,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метрической чашки {0} метрической чашки + + метрические жидкие унции + {0} метрическая жидкая унция + {0} метрические жидкие унции + {0} метрических жидких унций + {0} метрической жидкой унции + акрофуты {0} акрофут @@ -12167,7 +12297,105 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} имп. кварты {0} имп. кварты - + + стерадианы + {0} стерадиан + {0} стерадиана + {0} стерадиан + {0} стерадиана + + + каталы + {0} катал + {0} катала + {0} катал + {0} катала + + + кулоны + {0} кулон + {0} кулона + {0} кулон + {0} кулона + + + фарады + {0} фарад + {0} фарада + {0} фарад + {0} фарада + + + генри + {0} генри + {0} генри + {0} генри + {0} генри + + + сименсы + {0} сименс + {0} сименса + {0} сименс + {0} сименса + + + международные калории + {0} международная калория + {0} международные калории + {0} международных калорий + {0} международной калории + + + беккерели + {0} беккерель + {0} беккереля + {0} беккерелей + {0} беккереля + + + зиверты + {0} зиверт + {0} зиверта + {0} зиверт + {0} зиверта + + + греи + {0} грей + {0} грея + {0} греев + {0} грея + + + килограмм-силы + {0} килограмм-сила + {0} килограмм-силы + {0} килограмм-сил + {0} килограмм-силы + + + теслы + {0} тесла + {0} теслы + {0} тесл + {0} теслы + + + веберы + {0} вебер + {0} вебера + {0} веберов + {0} вебера + + + скорости света + {0} скорость света + {0} скорости света + {0} скоростей света + {0} скорости света + + feminine миллиардные доли {0} миллиардная доля @@ -12468,6 +12696,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} объектов {0} объекта + + ч. + {0} ч. + {0} ч. + {0} ч. + {0} ч. + {0} % {0} % @@ -12493,6 +12728,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моль {0} моль + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + л/км {0} л/км @@ -13196,6 +13438,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мм рт. ст. {0} мм рт. ст. + + рт. ст. + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + ф. на дюйм² {0} ф/дюйм² @@ -13428,6 +13677,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} м. чаш. {0} м. чаш. + + м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + акрофут. {0} акрофут @@ -13563,6 +13819,104 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} имп. кварт. {0} имп. кварт. + + ср + {0} ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + {0} См + + + калм + {0} калм + {0} калм + {0} калм + {0} калм + + + Бк + {0} Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + {0} Гр + + + кгс + {0} кгс + {0} кгс + {0} кгс + {0} кгс + + + Тл + {0} Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + {0} Вб + + + ск. света + {0} ск. света + {0} ск. света + {0} ск. света + {0} ск. света + ноч. {0} ноч. @@ -13580,12 +13934,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + ч. + {0} ч. + {0} ч. + {0} ч. + {0} ч. + {0}% {0}% {0}% {0}% + + глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + {0} глюкозы + ми/имп. гал {0} ми/имп. гал @@ -13664,19 +14032,123 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} стн {0} стн + + рт. ст. + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + {0}°F {0} °F {0}°F {0}°F - - ноч. - {0} ноч. - {0} ноч. - {0} ноч. - {0} ноч. - {0}/ноч. + + м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + {0} м. жидк. унц. + + + ср + {0} ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + {0} См + + + калм + {0} калм + {0} калм + {0} калм + {0} калм + + + Бк + {0} Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + {0} Гр + + + кгс + {0} кгс + {0} кгс + {0} кгс + {0} кгс + + + Тл + {0} Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + {0} Вб + + + c + {0} c + {0} c + {0} c + {0} c напр. diff --git a/make/data/cldr/common/main/rw.xml b/make/data/cldr/common/main/rw.xml index 0c25e15c411..eabe4bf1c2f 100644 --- a/make/data/cldr/common/main/rw.xml +++ b/make/data/cldr/common/main/rw.xml @@ -167,18 +167,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - mut. - gas. - wer. - mat. - gic. - kam. - nya. - kan. - nze. - ukw. - ugu. - uku. + Mut. + Gas. + Wer. + Mat. + Gic. + Kam. + Nya. + Kan. + Nze. + Ukw. + Ugu. + Uku. Mutarama @@ -199,13 +199,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic - cyu. - mbe. - kab. - gtu. - kan. - gnu. - gnd. + Cyu. + Mbe. + Kab. + Gtu. + Kan. + Gnu. + Gnd. Ku cyumweru @@ -236,17 +236,75 @@ CLDR data files are interpreted according to the LDML specification (http://unic + E, d E h:mm a E h:mm:ss a + y G + MM-y G + dd-MM-y G + E, dd-MM-y G + MMM y G + d MMM y G + E, d MMM y G h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + dd-MM + E, dd-MM + d MMM + E, d MMM + d MMMM + MM-y dd-MM-y + E, dd-MM-y + MMM y d MMMM y + E, d MMM y + MMMM y + QQQ y + QQQQ y + + y G–y G + y–y G + + + MM-y G– MM-y G + MM-y– MM-y G + MM-y– MM-y G + + + dd-MM-y– dd-MM-y G + dd-MM-y G – dd-MM-y G + dd-MM-y – dd-MM-y G + dd-MM-y – dd-MM-y G + + + E, dd-MM-y – E, dd-MM-y G + E, dd-MM-y G–E, dd-MM-y G + E, dd-MM-y – E, dd-MM-y G + E, dd-MM-y – E, dd-MM-y G + + + MMM y G – MMM y G + MMM–MMM y G + MMM y – MMM y G + + + d–d MMM y G + d-MMM-y G–d-MMM-y G + d MMM–d MMM y G + d-MMM-y–d-MMM-y G + + + E, d MMM–d MMM y G + E, d MMM y G–E, d MMM y G + E, d MMM y–E, d MMM G + E, d MMM y –E, d MMM y G + h a – h a h–h a @@ -266,53 +324,84 @@ CLDR data files are interpreted according to the LDML specification (http://unic h–h a v - MM-dd – MM-dd - MM-dd – MM-dd + dd-MM – dd-MM + dd-MM – dd-MM - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E + E, dd-MM – E, dd-MM + E, dd-MM – E, dd-MM - MMM d – MMM d + d–d MMM + d MMM – d MMM - MMM d, E – MMM d, E - MMM d, E – MMM d, E + E, d MMM – E, d MMM + E, d MMM – E, d MMM - y-MM – y-MM - y-MM – y-MM + MM-y –MM-y + MM-y – MM-y - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd + dd-MM-y – dd-MM-y  + dd-MM-y – dd-MM-y + dd-MM-y – dd-MM-y - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E + E, dd–dd-MM–y – E, dd-dd-MM–y  + E, dd-MM-y –E, dd-MM-y + E, dd-MM-y –E, dd-MM-y - y MMM – y MMM + MMM–MMM y + MMM y – MMM y - y MMM d – MMM d - y MMM d – y MMM d + d–d MMM y + d MMM – d MMM y + d MMM y – d MMM y - y MMM d, E – MMM d, E - y MMM d, E – MMM d, E - y MMM d, E – y MMM d, E + E, d MMM – E, d MMM y + E, d MMM – E, d MMM y + E, d MMM y – E, d MMM y - y MMMM – y MMMM + MMMM – MMMM y + MMMM y – MMMM y + + + umwaka ushize + uyu mwaka + umwaka utaha + + + ukwezi gushize + uku kwezi + ukwezi gutaha + + + icyumweru gishize + iki cyumweru + icyumweru gitaha + + + ejo + uyu munsi + ejo + + + Ku Cyumweru hashize + kuri iki Cyumweru + Ku Cyumweru hazaza + + diff --git a/make/data/cldr/common/main/sa.xml b/make/data/cldr/common/main/sa.xml index 0d58bdfcbcd..9ed2f24a255 100644 --- a/make/data/cldr/common/main/sa.xml +++ b/make/data/cldr/common/main/sa.xml @@ -596,6 +596,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##0.00 + #,##0.00 + + + @@ -605,6 +613,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/sah.xml b/make/data/cldr/common/main/sah.xml index 29ed04a5da4..a13d7ef0938 100644 --- a/make/data/cldr/common/main/sah.xml +++ b/make/data/cldr/common/main/sah.xml @@ -1031,6 +1031,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/sat.xml b/make/data/cldr/common/main/sat.xml index 8ed99a516cc..e750b13b01c 100644 --- a/make/data/cldr/common/main/sat.xml +++ b/make/data/cldr/common/main/sat.xml @@ -986,13 +986,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᱢᱤᱱᱜᱩᱣᱚ ᱢᱟᱦᱮᱛᱟ ᱯᱩᱭᱥᱟᱹ ᱠᱷᱟᱛᱟ ᱯᱷᱚᱨᱢᱟᱴ ᱢᱩᱞ ᱯᱩᱭᱥᱟᱹ ᱯᱷᱚᱨᱢᱟᱴ - ᱫᱤᱥᱤ ᱪᱟᱭᱱᱤᱡᱽ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱢᱟᱲᱟᱝ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱥᱟᱵᱟᱫ ᱜᱟᱫᱮᱞ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱢᱩᱞ ᱭᱩᱱᱤᱠᱳᱰ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱤᱢᱚᱡᱤ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱭᱩᱨᱚᱯᱤᱭᱟᱹᱱ ᱛᱷᱟᱨ ᱟᱸᱫᱮ - ᱥᱚᱦᱚᱡᱽ ᱪᱟᱭᱱᱤᱡᱽ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱯᱷᱚᱱᱯᱚᱛᱚᱵ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱯᱤᱱᱭᱟᱱ ᱛᱷᱟᱨ ᱟᱸᱫᱮ ᱫᱩᱦᱲᱟᱹ ᱛᱮᱭᱟᱨ ᱛᱷᱟᱨ ᱟᱸᱫᱮ @@ -1856,6 +1854,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ᱯᱟᱪᱮ ᱜᱽᱨᱤᱱᱞᱮᱱᱰ ᱥᱤᱛᱩᱝ ᱚᱠᱛᱚ + + + ᱦᱟᱣᱟᱭᱤᱼᱟᱞᱮᱣᱴᱤᱭᱟᱱ ᱢᱟᱱᱚᱠ ᱚᱠᱛᱚ + + ᱦᱟᱣᱟᱭᱤᱼᱟᱞᱮᱣᱴᱤᱭᱟᱱ ᱚᱠᱛᱚ diff --git a/make/data/cldr/common/main/sc.xml b/make/data/cldr/common/main/sc.xml index ec57770a997..e5f27dfa21d 100644 --- a/make/data/cldr/common/main/sc.xml +++ b/make/data/cldr/common/main/sc.xml @@ -12,6 +12,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + afar abcasu acehnesu adangme @@ -42,28 +43,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic azerbaigianu azeru baschiru + baluci balinesu basaa bielorussu bemba + betawi bena bùlgaru haryanvi + baluci otzidentale bhojpuri bislama bini pees nieddos anii + tai dam bambara bengalesu tibetanu + bakhtiari brètone bodo bosnìacu + akoose + buriat buginesu blin catalanu + caddo cayuga + atsam chakma cecenu cebuanu @@ -75,11 +85,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic chipewyan cherokee cheyenne + chickasaw curdu tzentrale curdu, tzentrale curdu, sorani chilcotin corsicanu + coptu michif cree sud-orientale cree de sas campuras @@ -159,12 +171,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic haida hawaianu haida meridionale - ebreu + ebràicu hindi hindi (caràteres latinos) hinglish ilongu hmong + hmong njua croatu sòrabu artu crèolu haitianu @@ -193,6 +206,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic machame giavanesu georgianu + kara-kalpak cabilu kachin jju @@ -201,6 +215,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic tyap makonde cabubirdianu + qʼeqchiʼ + kenyang koro kaingang khasi @@ -226,6 +242,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafia coloniesu curdu + curdu + curmangi cumucu komi còrnicu @@ -242,6 +260,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic lìgure lillooet lakota + ladinu lombardu lingala laotianu @@ -250,12 +269,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic luri setentrionale sàmia lituanu + latgalianu luba-katanga tshiluba lunda mizo luyia lètone + laz maduresu magahi maithili @@ -269,6 +290,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic makhuwa-meetto meta’ marshallesu + mòchenu maori micmac minangkabau @@ -286,10 +308,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic limbas mùltiplas muscogee mirandesu + hmong daw burmesu erzya mazandarani nauru + min nan napoletanu nama norvegesu bokmål @@ -324,14 +348,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic oromo odia ossèticu + osage punjabi pangasinan pampanga papiamentu palauanu pidgin nigerianu + pali pijin polacu + piemontesu malecite-passamaquoddy prussianu pashto @@ -339,6 +366,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic portoghesu brasilianu portoghesu europeu quechua + k’iche’ rajasthani rapanui rarotonganu @@ -364,17 +392,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic sitzilianu scots sindhi + curdu meridionale sami setentrionale sena koyraboro senni sango + samogitianu tashelhit shan singalesu + sidamo islovacu + saraiki islovenu lushootseed meridionale samoanu + sami meridionale + sami de Lule sami de sos inari sami skolt shona @@ -384,10 +418,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic serbu sranan tongo swati + saho sotho meridionale salish de sas astrinturas sundanesu sukuma + sunwar isvedesu swahili swahili de su Congo @@ -415,6 +451,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic tok pisin turcu taroko + torwali tsonga tàtaru tutchone setentrionale @@ -441,6 +478,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic walser wolaita waray + warlpiri wolof wu calmucu @@ -727,7 +765,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Congo (Repùblica) Isvìtzera Costa de Avòriu - Côte d’Ivoire Ìsulas Cook Tzile Camerùn @@ -885,7 +922,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Portogallu Palau Paraguày - Catar + Catàr Otzeània perifèrica Riunione Romania @@ -1076,58 +1113,106 @@ CLDR data files are interpreted according to the LDML specification (http://unic formadu de valuta ordinamentu valuta + presentatzione emoji sistema oràriu (12 o 24 oras) casta de truncadura de lìnia + truncaduras de lìnia a intro de sas paràulas sistema de medida nùmeros + truncadura de fràsia a pustis de incurtz. calendàriu buddhista + buddhista calendàriu tzinesu + tzinesu calendàriu coptu + coptu calendàriu dangi + dangi calendàriu etìope + etìope calendàriu etìope Amete Alem + etìope Amete Alem calendàriu gregorianu + gregorianu calendàriu ebràicu + ebràicu calendàriu natzionale indianu + natzionale indianu calendàriu egirianu + egirianu calendàriu egirianu (tabulare, època tzivile) + egirianu (tabulare, època tzivile) calendàriu islàmicu (Aràbia Saudita, osservatzione) calendàriu islàmicu (tabulare, època astronòmica) + islàmicu (tabulare, època astronòmica) calendàriu egirianu (Umm al-Qura) + egirianu (Umm al-Qura) calendàriu ISO-8601 calendàriu giaponesu + giaponesu calendàriu persianu + persianu calendàriu minguo + minguo formadu de valuta contàbile + contàbile formadu de valuta istandard - ordinamentu de su tzinesu traditzionale - Big5 - ordinamentu antepostu, pro cumpatibilitade + istandard + ordinamentu antepostu, pro cumpatibilidade + cumpatibilidade ordinamentu de su ditzionàriu + ditzionàriu ordinamentu Unicode predefinidu + Unicode predefinidu ordinamentu de sas emoji règulas de ordinamentu europeas - ordinamentu de su tzinesu semplificadu - GB2312 ordinamentu de s’elencu telefònicu + elencu telefònicu + fonèticu ordinamentu pinyin + pinyin chirca genèrica + chirca chirca pro consonante hangul initziale ordinamentu istandard + istandard òrdine de sos tratos + tratos ordinamentu traditzionale + traditzionale ordinamentu in base a sos radicales + in base a sos radicales ordinamentu zhuyin + zhuyin + predefinida + emoji + testu sistema oràriu a 12 oras (0–11) + 12 (0–11) sistema oràriu a 12 oras (1–12) + 12 (1–12) sistema oràriu a 24 oras (0–23) + 24 (0–23) sistema oràriu a 24 oras (1–24) + 24 (1–24) truncadura de lìnia facoltativa + facoltativa truncadura de lìnia normale + normale truncadura de lìnia fortzada + fortzada + trunca totu + mantene totu + normale + mantene in sas fràsias sistema mètricu + mètricu sistema imperiale britànnicu + imperiale britànnicu sistema consuetudinàriu americanu + consuetudinàriu americanu tzifras ahom tzifras indo-àrabas tzifras indo-àrabas estèndidas @@ -1143,12 +1228,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic tzifras dhives akuru nùmeros etìopes tzifras a largària intrea + tzifras garay nùmeros georgianos tzifras gondi gunjala tzifras gondi masaram nùmeros grecos nùmeros grecos minùscolos tzifras gujarati + tzifras gurung khema tzifras gurmukhi nùmeros detzimales tzinesos nùmeros in tzinesu semplificadu @@ -1165,6 +1252,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic tzifras kawi tzifras khmer tzifras kannada + tzifras kirat rai tzifras tai tham hora tzifras tai tham tham tzifras laotianas @@ -1182,13 +1270,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic tzifras mro tzifras meitei mayek tzifras birmanas + tzifras birmanas de su pwo karen orientale + tzifras birmanas pao tzifras shan birmanas tzifras tai lang birmanas tzifras nag mundari tzifras n’ko tzifras ol chiki + tzifras ol onal tzifras odia tzifras osmanya + tzifras deliniadas tzifras rohingya hanifi nùmeros romanos nùmeros romanos minùscolos @@ -1198,6 +1290,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic tzifras lith singalesas tzifras sora sompeng tzifras sundanesas + tzifras sunuwar tzifras takri tzifras tai lue noas nùmeros tamil traditzionales @@ -1207,9 +1300,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic tzifras tibetanas tzifras tirhuta tzifras tangsa + tzifras tolong siki tzifras vai tzifras warang citi tzifras wancho + alluta + istudada mètricu @@ -1248,34 +1344,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic EB + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v @@ -1403,6 +1545,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -1411,6 +1556,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -1431,6 +1579,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMMM 'de' 'su' r (U) d 'de' MMMM 'de' 'su' r (U) E d 'de' MMMM 'de' 'su' r (U) + HH'o' v d/M E d/M d MMM @@ -1532,74 +1681,139 @@ CLDR data files are interpreted according to the LDML specification (http://unic - in antis de Diocletzianu annu de sos màrtires - a.D. a.M. + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v + + + + EEEE dd 'de' MMMM 'de' 'su' r (U) + + + + + dd 'de' MMMM 'de' 'su' r (U) + + + + + dd MMM r + + + + + dd-MM-r + + + - - - h B – h B - - - h:mm B – h:mm B - - - h a – h a - h–h a - - - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a - - - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v - - + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + @@ -1637,16 +1851,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - in antis de s’Incarnatzione - a pustis de s’Incarnatzione - - - a.Inc. - p.Inc. - - @@ -1721,6 +1925,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -1729,6 +1936,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -1743,13 +1953,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d y G + MM/y G dd/MM/y GGGGG + E dd/MM/y G MMM y G d MMM y G E d MMM y G hh a + HH'o' hh:mm a hh:mm:ss a + HH'o' v d/M E d/M d MMM @@ -1768,6 +1982,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic QQQQ 'de' 'su' y G + + y G – y G + y – y G + M/y GGGGG – M/y GGGGG M/y – M/y GGGGG @@ -1802,6 +2020,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d MMM – E d MMM y G E d MMM y – E d MMM y G + + HH–HH'o' + + + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a + + + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v + + + hh a – hh a v + hh–hh a v + M–M @@ -2034,6 +2269,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -2042,6 +2280,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'sas' {0} + + {1} 'a' 'sas' {0} + @@ -2056,7 +2297,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d y G + MM/y G dd/MM/y GGGGG + E dd/MM/y G MMM y G d 'de' MMM 'de' 'su' y G E d 'de' MMM 'de' 'su' y G @@ -2065,8 +2308,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic d 'de' MMM E d 'de' MMM d 'de' MMMM - 'chida' W 'de' MMMM - 'chida' W 'de' MMMM + W'a' 'chida' 'de' MMMM + W'a' 'chida' 'de' MMMM MM/Y dd/MM/y E dd/MM/y @@ -2076,8 +2319,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMMM 'de' 'su' y QQQ y QQQQ 'de' 'su' y - 'chida' w 'de' 'su' Y - 'chida' w 'de' 'su' Y + w'a' 'chida' 'de' 'su' Y + w'a' 'chida' 'de' 'su' Y @@ -2220,34 +2463,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic a.m. + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v @@ -2289,35 +2578,84 @@ CLDR data files are interpreted according to the LDML specification (http://unic era Saka + + S + + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v @@ -2357,76 +2695,167 @@ CLDR data files are interpreted according to the LDML specification (http://unic - era de s’Egira + era de s’ègira + in antis de s’ègira e.E. + a.E. E + A + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v - - - h a – h a v - h–h a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v @@ -2472,34 +2901,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic a.p. + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v @@ -2515,34 +2990,80 @@ CLDR data files are interpreted according to the LDML specification (http://unic R.d.T + + + + EEEE d 'de' MMMM 'de' 'su' y G + + + + + d 'de' MMMM 'de' 'su' y G + + + + + dd MMM y G + + + + + dd/MM/y GGGGG + + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + {1} 'a' 'sas' {0} + + + + + {1}, {0} + + + + + {1}, {0} + + + + MM/y G + E dd/MM/y G + - - h B – h B - - - h:mm B – h:mm B - - G y – G y + y G – y G + y – y G - - h a – h a - h–h a + + HH–HH'o' - h:mm a – h:mm a - h:mm–h:mm a - h:mm–h:mm a + hh:mm a – hh:mm a + hh:mm–hh:mm a + hh:mm–hh:mm a - h:mm a – h:mm a v - h:mm–h:mm a v - h:mm–h:mm a v + hh:mm a – hh:mm a v + hh:mm–hh:mm a v + hh:mm–hh:mm a v - h a – h a v - h–h a v + hh a – hh a v + hh–hh a v @@ -2640,6 +3161,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ch. de su mese + + ch. de mese + die eris @@ -2950,13 +3474,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ora {0} Ora legale: {0} Ora istandard: {0} - - - OIH - OIH - OLH - - Tempus coordinadu universale @@ -2968,12 +3485,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tzitade disconnota - - Tirana - - - Tucumán - Daca @@ -2995,6 +3506,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Zurigu + + Ìsula de Pasca + S’Avana @@ -3007,21 +3521,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic Praga - - Büsingen - Berlinu Algeri + + Ìsulas Galàpagos + Su Càiru Ìsulas Canàrias + + Madrìd + Addis Abeba @@ -3079,11 +3596,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Roma - - Enderbury - - - Canton + + Tòkyo Santu Cristolu @@ -3106,6 +3620,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Monròvia + + Vìlnius + Lussemburgu @@ -3145,6 +3662,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Azorras + + Madèira + Lisbona @@ -3178,6 +3698,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sant’Elene + + Lubiana + Santu Marinu @@ -3196,6 +3719,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Portu de Ispagna + + Kiev + Beulah, Dakota de su Nord @@ -3223,6 +3749,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Tzitade de Ho Chi Minh + + Wallis e Futuna + Maiota @@ -3255,9 +3784,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ora de s’Àfrica otzidentale - Ora istandard de s’Àfrica otzidentale - Ora legale de s’Àfrica otzidentale + Ora de s’Àfrica otzidentale @@ -3541,6 +4068,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ora istandard de Cuba Ora legale de Cuba + + OC + OIC + OLC + @@ -3649,6 +4181,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic OMG + + + Ora de sa Groenlàndia + Ora istandard de sa Groenlàndia + Ora legale de sa Groenlàndia + + Ora de sa Groenlàndia orientale @@ -3678,6 +4217,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ora de sa Guyana + + + Ora istandard de sas ìsulas Hawaii-Aleutinas + + Ora de sas ìsulas Hawaii-Aleutinas @@ -4283,6 +4827,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00;(#,##0.00) @@ -4962,8 +5512,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic lira italiana - lira italiana - liras italianas + francu italianu + francos italianos dòllaru giamaicanu @@ -5700,6 +6250,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic dòllaru de sos Caràibes orientales dòllaros de sos Caràibes orientales + + fiorinu caraìbicu + fiorinu caraìbicu + fiorinos caraìbicos + diritos ispetziales de prelievu diritu ispetziale de prelievu @@ -6063,7 +6618,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} elementu {0} elementos - + partes pro millione {0} parte pro millione {0} partes pro millione @@ -6864,7 +7419,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} a sa velotzidade de sa lughe {0} a sa velotzidade de sa lughe - + partes pro milliardu {0} parte pro milliardu {0} partes pro milliardu @@ -7212,7 +7767,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} lughe {0} lughe - + partes/milliardu @@ -7306,7 +7861,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}elem. {0}elem. - + {0}ppm {0}ppm @@ -7946,7 +8501,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}l {0}l - + {0}ppb {0}ppb diff --git a/make/data/cldr/common/main/scn.xml b/make/data/cldr/common/main/scn.xml index 309d98394ea..37e92021b99 100644 --- a/make/data/cldr/common/main/scn.xml +++ b/make/data/cldr/common/main/scn.xml @@ -12,697 +12,707 @@ CLDR data files are interpreted according to the LDML specification (http://unic - afar - abkhasu - afrikaans - aghem - akan - amàricu - aragunisi - àrabbu livantinu di tramuntana - àrabbu - àrabbu nadaru mudernu - mapuche - assamisi - asu - asturianu - azzeru - bashkir - baluchi - basaa - belurrussu - bemba - betawi - bena - bùrgaru - haryanvi - bhojipuri - anii - bambara - bangladisi - brètuni - bodu - busnìacu - akoose - blin - catalanu - caddu - atsam - chakma - cicenu - cebbuanu - chiga - choctaw - cherokee - chickasaw - curdu cintrali - curdu Sorani - corsu - cecu - swampy cree - slavu dâ cresia - ciuvasciu - gallisi - danisi - tidiscu - tidiscu austrìacu - tidiscu autu sbìzziru - dogri - sorbu suttanu - duala - divehi - jola-fonyi - dzongkha - embu - ewe - grecu - ngrisi - ngrisi australianu - ngrisi canadisi - ngrisi britànnicu - ngrisi miricanu - spirantu - spagnolu - spagnolu dâ mèrica latina - spagnolu eurupeu - spagnolu missicanu - èstuni - bascu - ewondo - pirsianu - fula - fillannisi - filippinu - faruisi - francisi - francisi canadisi - francisi sbìzziru - francisi Cajun - friulanu - frìsuni uccidintali - irlannisi - ga - gaèlicu scuzzisi - geez - galizzianu - guarani - tidiscu sbìzziru - gujarati - gusii - mannisi - hausa - hawaiianu - ebbràicu - innianu - innianu (latinu) - innianu ngrisi - hmong njua - cruatu - surbu supranu - unghirisi - armenu - ntirlingua - innunisianu - ntirlingui - igbo - idu - islannisi - talianu - inuktitut - giappunisi - lojban - ngomba - machame - giavanisi - giurgianu - kara-kalpak - kabyle - jiu - kamba - makonde - capuvirdianu - kenyang - kaingang - koyra chiini - kikuyu - kazaku - kako - kalaallisut - kalenjin - khmer - kannada - curianu - konkani - kpelle - kashmiri - bafia - culunisi - curdu - còrnicu - kuvi - kirghizu - latinu - langi - lussimmurghisi - ganda - lìguri - lakota - ild - lummardu - lingala - lau - criolu dâ Louisiana - lituanu - latgallisi - luba-katanga - luyia - lèttuni - maithili - masai - moksha - meru - murisianu - margasciu - makhuwa-meetto - metaʼ - muchenu - māori - mi'kmaw - macèduni - malayalam - mòngulu - manipuri - mohawk - marathi - malisi - mautisi - mundang - assai lingui - muscogee - burmisi - erzya - mazanderani - nama - nurviggisi Bokmål - tidiscu suttanu - sàssuni suttanu - nipalisi - ulannisi - ciammingu - kwasio - nurviggisi Nynorsk - ngiemboon - nurviggisi - n’ko - navajo - uccitanu - odia - punjabi - pidgin niggirianu - pulaccu - prussianu - pashto - purtughisi - purtughisi brasilianu - purtughisi eurupeu - quechua - kʼicheʼ - rajasthani - rumanciu - rumenu - murdavu - russu - kinyarwanda - sàscritu - yakut - santali - sardu - sicilianu - sindhi - koyraboro senni - sinhala - sluvaccu - sluvenu - lule sami - inari sami - sòmalu - arbanisi - serbu - sunnanisi - svidisi - swahili - sirìacu - silisianu - tamil - telugu - tajik - tailannisi - tigrinya - turkmenu - tunganu - turcu - tàtaru - tamazight di l’Atlanti Cintrali - uyghur - ucrainu - lingua scanusciuta - urdu - uzbeku - vènitu - vietnamisi - makhuwa - volapük - wolof - xhosa - kangri - yoruba - nheengatu - cantunisi - cinisi cantunisi - zhuang - cinisi - cinisi, mannarinu - cinisi simprificatu - cinisi mannarinu simprificatu - cinisi tradizziunali - cinisi mannarinu tradizziunali - zulu - nuḍḍu cuntinutu linguìsticu + afar + abkhasu + afrikaans + aghem + akan + amàricu + aragunisi + àrabbu livantinu di tramuntana + àrabbu + àrabbu nadaru mudernu + mapuche + assamisi + asu + asturianu + azzeru + bashkir + baluchi + basaa + belurrussu + bemba + betawi + bena + bùrgaru + haryanvi + bhojipuri + anii + bambara + bangladisi + brètuni + bodu + busnìacu + akoose + blin + catalanu + caddu + atsam + chakma + cicenu + cebbuanu + chiga + choctaw + cherokee + chickasaw + curdu cintrali + curdu Sorani + corsu + cecu + swampy cree + slavu dâ cresia + ciuvasciu + gallisi + danisi + tidiscu + tidiscu austrìacu + tidiscu autu sbìzziru + dogri + sòrabbu suttanu + duala + divehi + jola-fonyi + dzongkha + embu + ewe + grecu + ngrisi + ngrisi australianu + ngrisi canadisi + ngrisi britànnicu + ngrisi dû RJ + ngrisi miricanu + ngrisi dî SJ + spirantu + spagnolu + spagnolu dâ mèrica latina + spagnolu eurupeu + spagnolu missicanu + èstuni + bascu + ewondo + pirsianu + fula + fillannisi + filippinu + faruisi + francisi + francisi canadisi + francisi sbìzziru + francisi Cajun + friulanu + frìsuni uccidintali + irlannisi + ga + gaèlicu scuzzisi + geez + galizzianu + guarani + tidiscu sbìzziru + gujarati + gusii + mannisi + hausa + hawaiianu + ebbràicu + innianu + innianu ngrisi + hmong njua + cruatu + sòrabbu supranu + criolu d’Haiti + unghirisi + armenu + ntirlingua + innunisianu + ntirlingui + igbo + idu + islannisi + italianu + inuktitut + giappunisi + lojban + ngomba + machame + giavanisi + giurgianu + kara-kalpak + kabyle + jiu + kamba + makonde + capuvirdianu + kenyang + kaingang + koyra chiini + kikuyu + kazzaku + kako + kalaallisut + kalenjin + khmer + kannada + curianu + konkani + kpelle + kashmiri + bafia + culunisi + curdu + curdu + kurmanji + còrnicu + kuvi + kirghizzu + latinu + langi + lussimmurghisi + ganda + lìguri + lakota + ild + lummardu + lingala + lau + criolu dâ Louisiana + lituanu + latgallisi + luba-katanga + luyia + lèttuni + maithili + masai + moksha + meru + murisianu + margasciu + makhuwa-meetto + metaʼ + muchenu + māori + mi'kmaw + macèduni + malayalam + mòngulu + manipuri + mohawk + marathi + malisi + mautisi + mundang + assai lingui + muscogee + burmisi + erzya + mazanderani + nama + nurviggisi Bokmål + tidiscu suttanu + sàssuni suttanu + nipalisi + ulannisi + ciammingu + kwasio + nurbiggisi Nynorsk + ngiemboon + nurbiggisi + n’ko + sothu di tramuntana + navajo + uccitanu + orìa + punjabi + pidgin niggirianu + pulaccu + prussianu + pashto + purtughisi + purtughisi brasilianu + purtughisi eurupeu + quechua + kʼicheʼ + rajasthani + rumanciu + rumenu + murdavu + russu + kinyarwanda + sàscritu + yakut + santali + sardu + sicilianu + sindhi + koyraboro senni + singalisi + sluvaccu + sluvenu + lule sami + inari sami + sòmalu + arbanisi + serbu + sunnanisi + svidisi + swahili + sirìacu + silisianu + tamil + telugu + tajik + tailannisi + tigrinya + turkmenu + tunganu + turcu + tàtaru + tamazight di l’Atlanti Cintrali + uyghur + ucrainu + lingua scanusciuta + urdu + uzbeku + vènitu + vietnamisi + makhuwa + volapük + wolof + xhosa + kangri + yoruba + nheengatu + cantunisi + cinisi cantunisi + zhuang + cinisi + cinisi, mannarinu + cinisi simprificatu + cinisi mannarinu simprificatu + cinisi tradizziunali + cinisi mannarinu tradizziunali + zulu + nuḍḍu cuntinutu linguìsticu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - Munnu - Àfrica - Mèrica di tramuntana cuntinintali - Mèrica di sciroccu - Uciània - Àfrica punintina - Mèrica cintrali - Àfrica livantina - Àfrica di tramuntana - Àfrica di menzu - Àfrica di sciroccu - Mèrichi - Mèrica di tramuntana - Caràibbi - Asia livantina - Asia di sciroccu - Asia di sciroccu-livantina - Europa di sciroccu - Australasia - Milanesia - Riggiuni dâ Micrunesia - Pulinesia - Asia - Asia cintrali - Asia punintina - Europa - Europa livantina - Europa di tramuntana - Europa punintina - Àfrica sutta-sahariana - Mèrica latina - Ìsula d’Ascinziuni - Annorra - Emirati Àrabbi Junciuti - Afghànistan - Antigua e Barbuda - Anguilla - Arbanìa - Armenia - Angola - Antàrtidi - Argintina - Samoa Miricani - Austria - Australia - Aruba - Ìsuli Åland - Azerbaijan - Bosnia e Herzegòvina - Barbados - Bàngladesh - Bergiu - Burkina Fasu - Burgarìa - Bahrain - Burundi - Benin - St. Barthélemy - Birmuda - Brunei - Bulivia - Caràibbi ulannisi - Brasili - Bahamas - Bhutan - Ìsula Bouvet - Botswana - Belurussia - Bilisi - Cànada - Ìsuli Cocos (Keeling) - Congu - Kinshasa - Congu (RDC) - Ripùbblica Centrafricana - Congu - Brazzaville - Congu (Ripùbblica) - Sbìzzira - Custa d’Avoriu - Ìsuli Cook - Cili - Càmerun - Cina - Culommia - Ìsula di Clipperton - Custa Rica - Cubba - Capu Virdi - Curaçao - Ìsula di Natali - Cipru - Cechia - Ripùbblica Ceca - Girmania - Diego Garcia - Gibbuti - Danimarca - Dumìnica - Ripùbblica Duminicana - Algirìa - Ceuta e Miliḍḍa - Ècuador - Estonia - Eggittu - Sahara punintinu - Eritrea - Spagna - Etiopia - Uniuni Eurupea - Zuna Euru - Fillannia - Figi - Ìsuli Falkland - Ìsuli Falkland (Ìsuli Marvini) - Micrunisia - Ìsuli Faroe - Franza - Gabon - Regnu Junciutu - RJ - Grenada - Giorgia - Guiana Francisi - Guernsey - Ghana - Gibbirterra - Gruillannia - Gammia - Guinìa - Guadalupa - Guinìa Equaturiali - Grecia - Giorgia di sciroccu e Ìsuli Sandwich australi - Guatimala - Guam - Guinìa-Bissau - Guiana - Hong Kong RAS dâ Cina - Hong Kong - Ìsuli Heard e McDonald - Hunnuras - Cruazzia - Haiti - Ungarìa - Ìsuli Canari - Innunesia - Irlanna - Isdraeli - Ìsula di Man - Innia - Tirritoriu Ucianicu di l’Innia Britànnica - Arcipèlagu Chagos - Iraq - Iran - Islanna - Italia - Jersey - Giamàica - Giurdania - Giappuni - Kenya - Kyrgyzistan - Camboggia - Kiribati - Còmoros - S. Kitts e Nevis - Curìa di Tramuntana - Curìa di Sciroccu - Kuwait - Ìsuli Cayman - Kazzàkistan - Laos - Lìbbanu - Santa Lucìa - Liechtenstein - Sri Lanka - Libberia - Lisothu - Lituania - Lussimmurgu - Littonia - Libbia - Maroccu - Mònacu - Murdova - Muntinegru - San Martinu - Madagascàr - Ìsuli Marshall - Macidonia di tramuntana - Mali - Myanmar (Burma) - Mungolia - Macau RAS dâ Cina - Macau - Ìsuli Marianna di Tramuntana - Martinica - Mauritania - Munzirratu - Mauta - Mauritius - Mardivi - Malawi - Mèssicu - Malesia - Muzzammicu - Namibbia - Nova Calidonia - Niger - Ìsula Norfolk - Niggeria - Nicaragua - Paisi Vasci - Nurveggia - Nepal - Nauru - Niue - Nova Zilannia - Aotearoa Nova Zilannia - Oman - Pànama - Pirù - Pulinisia Francisi - Papua Nova Guinìa - Filippini - Pàkistan - Pulonia - S. Pierre e Miquelon - Ìsuli Pitcairn - Portu Ricu - Tirritori Palistinesi - Palistina - Purtugallu - Palau - Paraguay - Qatar - Uciània di fora - Réunion - Rumanìa - Serbia - Russia - Ruanna - Arabbia Saudita - Ìsuli Salumuni - Seychelles - Sudan - Sbezzia - Singapuri - Sant’Èlina - Sluvenia - Svalbard e Jan Mayen - Sluvacchia - Sierra Liuni - San Marinu - Sènigal - Sumalia - Surinami - Sudan di sciroccu - São Tomé e Príncipe - El Salvador - Sint Maarten - Siria - Eswatini - Swazilannia - Tristan da Cunha - Ìsuli Turks e Càicos - Chad - Tirritori Francisi di Sciroccu - Togu - Tailannia - Tajìkistan - Tukilau - Timor-Leste - Timor di Livanti - Turkmènistan - Tunisìa - Tonga - Turchìa - Trinidad e Tobago - Tuvalu - Taiwan - Tanzania - Ucraina - Uganna - Ìsuli Miricani di Fora - Nazziuna Junciuti - Stati Junciuti - SJM - Uruguay - Uzbèkistan - Città dû Vaticanu - S. Vincent e Grenadine - Vinizzuela - Ìsuli Vìrgini Britànnichi - Ìsuli Vìrgini Miricani - Vietnam - Vanuatu - Wallis e Futuna - Samoa - Accenti fausi - Bidirizziunali fausu - Kòssuvu - Yemen - Mayotte - Africa di sciroccu - Zammia - Zimbabwe - Riggiuni scanusciuta + Munnu + Àfrica + Mèrica di tramuntana cuntinintali + Mèrica di sciroccu + Uciània + Àfrica punintina + Mèrica cintrali + Àfrica livantina + Àfrica di tramuntana + Àfrica di menzu + Àfrica di sciroccu + Mèrichi + Mèrica di tramuntana + Caràibbi + Asia livantina + Asia di sciroccu + Asia di sciroccu-livantina + Europa di sciroccu + Australasia + Milanesia + Riggiuni dâ Micrunesia + Pulinesia + Asia + Asia cintrali + Asia punintina + Europa + Europa livantina + Europa di tramuntana + Europa punintina + Àfrica sutta-sahariana + Mèrica latina + Ìsula d’Ascinziuni + Annorra + Emirati Àrabbi Junciuti + Afghànistan + Antigua e Barbuda + Anguilla + Arbanìa + Armenia + Angola + Antàrtidi + Argintina + Samoa Miricani + Austria + Australia + Aruba + Ìsuli Åland + Azerbaijan + Bosnia e Herzegòvina + Barbados + Bàngladesh + Bergiu + Burkina Fasu + Burgarìa + Bahrain + Burunni + Benin + St. Barthélemy + Birmuda + Brunei + Bulivia + Caràibbi ulannisi + Brasili + Bahamas + Bhutan + Ìsula Bouvet + Botswana + Bilurussia + Bilisi + Cànada + Ìsuli Cocos (Keeling) + Congu - Kinshasa + Congu (RDC) + Ripùbblica Centrafricana + Congu - Brazzaville + Congu (Ripùbblica) + Sbìzzira + Custa d’Avoriu + Ìsuli Cook + Cili + Càmerun + Cina + Culommia + Ìsula di Clipperton + Sark + Custa Rica + Cubba + Capu Virdi + Curaçao + Ìsula di Natali + Cipru + Cechia + Ripùbblica Ceca + Girmania + Diego Garcia + Gibbuti + Danimarca + Dumìnica + Ripùbblica Duminicana + Algirìa + Ceuta e Miliḍḍa + Ècuador + Estonia + Eggittu + Sahara punintinu + Eritrea + Spagna + Etiopia + Unioni Eurupea + Zuna Euru + Fillannia + Figi + Ìsuli Falkland + Ìsuli Falkland (Ìsuli Marvini) + Micrunisia + Ìsuli Faroe + Franza + Gabòn + Regnu Junciutu + RJ + Grenada + Giorgia + Guiana Francisi + Guernsey + Ghana + Gibbirterra + Gruillannia + Gammia + Guinìa + Guadalupa + Guinìa Equaturiali + Grecia + Giorgia di sciroccu e Ìsuli Sandwich australi + Guatimala + Guam + Guinìa-Bissau + Guiana + Hong Kong RAS dâ Cina + Hong Kong + Ìsuli Heard e McDonald + Hunnuras + Cruazzia + Haiti + Ungarìa + Ìsuli Canari + Innunesia + Irlanna + Isdraeli + Ìsula di Man + Innia + Tirritoriu Uciànicu di l’Innia Britànnica + Arcipèlagu Chagos + Iraq + Iran + Islanna + Italia + Jersey + Giamàica + Giurdania + Giappuni + Kenya + Kirghìzzistan + Camboggia + Kiribati + Còmoros + S. Kitts e Nevis + Curìa di Tramuntana + Curìa di Sciroccu + Kuwait + Ìsuli Cayman + Kazzàkistan + Laos + Lìbbanu + Santa Lucìa + Liechtenstein + Sri Lanka + Libberia + Lisothu + Lituania + Lussimmurgu + Littonia + Libbia + Maroccu + Mònacu + Murdova + Muntinegru + San Martinu + Madagascàr + Ìsuli Marshall + Macidonia di tramuntana + Mali + Myanmar (Birmania) + Mungolia + Macau RAS dâ Cina + Macau + Ìsuli Marianna di Tramuntana + Martinica + Mauritania + Munzirratu + Mauta + Maurizzius + Mardivi + Malawi + Mèssicu + Malesia + Muzzammicu + Namibbia + Nova Calidonia + Niger + Ìsula Norfolk + Niggeria + Nicaragua + Pajisi Basci + Nurbeggia + Nepal + Nauru + Niue + Nova Zilannia + Aotearoa Nova Zilannia + Oman + Pànama + Pirù + Pulinisia Francisi + Papua Nova Guinìa + Filippini + Pàkistan + Pulonia + S. Pierre e Miquelon + Ìsuli Pitcairn + Portu Ricu + Tirritori Palistinesi + Palistina + Purtugallu + Palau + Paraguay + Qatar + Uciània di fora + Riunion + Rumanìa + Serbia + Russia + Ruanna + Arabbia Saudita + Ìsuli Salumuni + Seychelles + Sudan + Sbezzia + Singapuri + Sant’Èlina + Sluvenia + Svalbard e Jan Mayen + Sluvacchia + Sierra Liuni + San Marinu + Sènigal + Sumalia + Surinami + Sudan di sciroccu + São Tomé e Príncipe + El Salvador + Sint Maarten + Siria + Eswatini + Swazzilannia + Tristan da Cunha + Ìsuli Turks e Càicos + Chad + Tirritori Francisi di Sciroccu + Togu + Tailannia + Tajìkistan + Tukilau + Timor-Leste + Timor di Livanti + Turkmènistan + Tunisìa + Tonga + Turchìa + Trinidad e Tobago + Tuvalu + Taiwan + Tanzania + Ucraina + Uganna + Ìsuli Miricani di Fora + Nazzioni Junciuti + Stati Junciuti + SJ + Uruguay + Uzbèkistan + Città dû Vaticanu + S. Vincent e Grenadine + Vinizzuela + Ìsuli Vìrgini Britànnichi + Ìsuli Vìrgini Miricani + Vietnam + Vanuatu + Wallis e Futuna + Samoa + Accenti fausi + Bidirizziunali fausu + Kòssuvu + Yemen + Mayotte + Àfrica di sciroccu + Zammia + Zimbabwe + Riggiuni scanusciuta - Calannariu - Sistema di misura - Nùmmari + Calannariu + Sistema di misura + Nùmmari - Calannariu buddista - Calannariu cinisi - Calannariu coptu - Calannariu dangi - Calannariu etìupi - Calannariu etìupi Amete-Alem - Calannariu grigurianu - Calannariu ebbràicu - Calannariu slàmicu - Calannariu slàmicu civili - Calannariu slàmicu Umm Al-Qura - Calannariu ISO-8601 - Calannariu giappunisi - Calannariu pirsianu - Calannariu minguo - Arringu Pridifinitu - Sistema mètricu - Sistema mpiriali - Sistema miricanu - Nùmmari di Punenti + Calannariu buddista + Calannariu cinisi + Calannariu coptu + Calannariu dangi + Calannariu etìupi + Calannariu etìupi Amete-Alem + Calannariu grigurianu + Grigurianu + Calannariu ebbràicu + Calannariu slàmicu + Calannariu slàmicu civili + Calannariu slàmicu Umm Al-Qura + Calannariu grigurianu (prima l’annu) + Calannariu giappunisi + Calannariu pirsianu + Calannariu minguo + Arringu pridifinutu + Pridifinutu + Sistema mètricu + Sistema mpiriali + Sistema miricanu + Nùmmari di Punenti - mètricu - ngrisi - miricanu + mètricu + ngrisi + miricanu - Lingua: {0} - Scrittura: {0} - Riggiuni: {0} + Lingua: {0} + Scrittura: {0} + Riggiuni: {0} [aàâ b c dḍ eèê f g h iìî j l m n oòô p q r s t uùû v z] [ç đ éë ə ḥ k š w x y] [A B C D E F G H I J L M N O P Q R S T U V Z] - [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [\- ‑ , . % ‰ + − 0 1 2 3 4 5 6 7 8 9 ª ᵘ] + [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] @@ -710,172 +720,180 @@ CLDR data files are interpreted according to the LDML specification (http://unic - EEEE d MMMM y G + EEEE d MMMM y G - d MMMM y G + d MMMM y G - d MMM y G + d MMM y G - dd/MM/y GGGGG + dd/MM/y GGGGG - {1} {0} + {1} {0} - {1} 'a' 'l''''uri' {0} + {1} 'a' 'l'’'uri' {0} + + + {1} 'a' 'l'’'uri' {0} - {1} {0} + {1} {0} - {1} 'a' 'l''''uri' {0} + {1} 'a' 'l'’'uri' {0} + + + {1} 'a' 'l'’'uri' {0} - {1} {0} + {1} {0} - {1} {0} + {1} {0} - E d - E hh:mm a - E hh:mm:ss a - y G - d/M/y GGGGG - MMM y G - d MMM y G - E d MMM y G - hh:mm a - hh:mm:ss a - d/M - E d/M - d MMM - E d MMM - d MMMM - y G - y G - M/y GGGGG - d/M/y GGGGG - E d/M/y GGGGG - MMMM y G - d MMM y G - E d MMM y G - MMMM y G - QQQ/y G - QQQQ 'dû' y G + E d + E hh:mm a + E hh:mm:ss a + y G + MM/y G + d/M/y GGGGG + E MM/dd/y G + MMM y G + d MMM y G + E d MMM y G + hh:mm a + hh:mm:ss a + d/M + E d/M + d MMM + E d MMM + d MMMM + y G + y G + M/y GGGGG + d/M/y GGGGG + E d/M/y GGGGG + MMMM y G + d MMM y G + E d MMM y G + MMMM y G + QQQ/y G + QQQQ 'dû' y G - y G – y G - y–y G + y G – y G + y–y G - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y GGGGG – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG - d/M/y – d/M/y GGGGG - d/M/y GGGGG – d/M/y GGGGG - d/M/y – d/M/y GGGGG - d/M/y – d/M/y GGGGG + d/M/y – d/M/y GGGGG + d/M/y GGGGG – d/M/y GGGGG + d/M/y – d/M/y GGGGG + d/M/y – d/M/y GGGGG - E d/M/y – E d/M/y GGGGG - E dd/MM/y GGGGG – E dd/MM/y GGGGG - E d/M/y – E d/M/y GGGGG - E d/M/y – E d/M/y GGGGG + E d/M/y – E d/M/y GGGGG + E dd/MM/y GGGGG – E dd/MM/y GGGGG + E d/M/y – E d/M/y GGGGG + E d/M/y – E d/M/y GGGGG - MMM y G – MMM y G - MMM–MMM y G - MMM y – MMM y G + MMM y G – MMM y G + MMM–MMM y G + MMM y – MMM y G - d–d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d–d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E d MMM – E d MMM y G - E d MMM y G – E d MMM y G - E d MMM – E d MMM y G - E d MMM y – E d MMM y G + E d MMM – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G - M – M + M – M - d/M – d/M - d/M – d/M + d/M – d/M + d/M – d/M - E d/M – E d/M - E d/M – E d/M + E d/M – E d/M + E d/M – E d/M - d–d MMM - d MMM – d MMM + d–d MMM + d MMM – d MMM - E d MMM – E d MMM - E d MMM – E d MMM + E d MMM – E d MMM + E d MMM – E d MMM - y–y G + y–y G - M/y – M/y GGGGG - M/y – M/y GGGGG + M/y – M/y GGGGG + M/y – M/y GGGGG - d/M/y – d/M/y GGGGG - d/M/y – d/M/y GGGGG - d/M/y – d/M/y GGGGG + d/M/y – d/M/y GGGGG + d/M/y – d/M/y GGGGG + d/M/y – d/M/y GGGGG - E d/M/y – E d/M/y GGGGG - E d/M/y – E d/M/y GGGGG - E d/M/y – E d/M/y GGGGG + E d/M/y – E d/M/y GGGGG + E d/M/y – E d/M/y GGGGG + E d/M/y – E d/M/y GGGGG - MMM–MMM y G - MMM y – MMM y G + MMM–MMM y G + MMM y – MMM y G - d–d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d–d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E d MMM – E d MMM y G - E d MMM – E d MMM y G - E d MMM y – E d MMM y G + E d MMM – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G - MMMM–MMMM y G - MMMM y – MMMM y G + MMMM–MMMM y G + MMMM y – MMMM y G @@ -884,391 +902,352 @@ CLDR data files are interpreted according to the LDML specification (http://unic - jin - fri - mar - apr - maj - giu - gnt - agu - sit - utt - nuv - dic + jin + fri + mar + apr + maj + giu + gnt + agu + sit + utt + nuv + dic - jinnaru - frivaru - marzu - aprili - maju - giugnu - giugnettu - agustu - sittèmmiru - uttùviru - nuvèmmiru - dicèmmiru + jinnaru + frivaru + marzu + aprili + maju + giugnu + giugnettu + agustu + sittèmmiru + uttùviru + nuvèmmiru + dicèmmiru - J - F - M - A - M - G - G - A - S - U - N - D - - - jinnaru - frivaru - marzu - aprili - maju - giugnu - giugnettu - agustu - sittèmmiru - uttùviru - nuvèmmiru - dicèmmiru + J + F + M + A + M + G + G + A + S + U + N + D - dum - lun - mar - mer - jov - ven - sab - - - d - l - m - m - j - v - s + dum + lun + mar + mer + jov + ven + sab - du - lu - ma - me - jo - ve - sa + du + lu + ma + me + jo + ve + sa - dumìnica - lunnidìa - martidìa - mercuridìa - jovidìa - venniridìa - sàbbatu + dumìnica + lunnidìa + martidìa + mercuridìa + jovidìa + venniridìa + sàbbatu - - dum - lun - mar - mer - jov - ven - sab - - d - l - m - m - j - v - s - - - du - lu - ma - me - jo - ve - sa - - - dumìnica - lunnidìa - martidìa - mercuridìa - jovidìa - venniridìa - sàbbatu + d + l + m + m + j + v + s - 1T - 2T - 3T - 4T + 1T + 2T + 3T + 4T - 1ᵘ trimestri - 2ᵘ trimestri - 3ᵘ trimestri - 4ᵘ trimestri - - - - - 1T - 2T - 3T - 4T - - - 1ᵘ trimestri - 2ᵘ trimestri - 3ᵘ trimestri - 4ᵘ trimestri + 1ᵘ trimestri + 2ᵘ trimestri + 3ᵘ trimestri + 4ᵘ trimestri - prima di Cristu - prima di l’èbbica cumuni - doppu di Cristu - èbbica cumuni + prima di Cristu + prima di l’èbbica cumuni + doppu di Cristu + èbbica cumuni - p.C. - p.E.C. - d.C. - E.C. + p.C. + p.E.C. + d.C. + E.C. - pC - pEC - dC - EC + pC + pEC + dC + EC - EEEE d MMMM y + EEEE d MMMM y - d MMMM y + d MMMM y - d MMM y + d MMM y - d/M/yy + d/M/yy - HH:mm:ss zzzz + HH:mm:ss zzzz - HH:mm:ss z + HH:mm:ss z - HH:mm:ss + HH:mm:ss - HH:mm + HH:mm - {1} {0} + {1} {0} + + + {1} 'a' 'l'’'uri' {0} + + + {1} 'a' 'l'’'uri' {0} - {1} {0} + {1} {0} + + + {1} 'a' 'l'’'uri' {0} + + + {1} 'a' 'l'’'uri' {0} - {1} {0} + {1} {0} + + + {1} 'a' 'l'’'uri' {0} + + + {1} 'a' 'l'’'uri' {0} - {1} {0} + {1} {0} + + + {1} 'ê' {0} + + + {1} 'ê' {0} - E d - E h:mm a - E h:mm:ss a - y G - d/M/y G - MMM y G - d MMM y G - E d MMM y G - h:mm a - h:mm:ss a - h:mm:ss a v - h:mm a v - d/M - E d/M - d MMM - E d MMM - d MMMM - 'simana' W 'di' MMMM - 'simana' W 'di' MMMM - M/y - d/M/y - E d/M/y - MMM y - d MMM y - E d MMM y - MMMM y - QQQ y - QQQQ 'dû' y - 'simana' w 'dû' Y - 'simana' w 'dû' Y + E d + E h:mm a + E h:mm:ss a + y G + MM/y G + d/M/y G + E dd/MM/y G + MMM y G + d MMM y G + E d MMM y G + h:mm a + h:mm:ss a + h:mm:ss a v + h:mm a v + d/M + E d/M + d MMM + E d MMM + d MMMM + 'simana' W 'di' MMMM + 'simana' W 'di' MMMM + M/y + d/M/y + E d/M/y + MMM y + d MMM y + E d MMM y + MMMM y + QQQ y + QQQQ 'dû' y + 'simana' w 'dû' Y + 'simana' w 'dû' Y - h:mm B – h:mm B - h:mm – h:mm B - h:mm – h:mm B + h:mm – h:mm B + h:mm – h:mm B - y G – y G - y – y G + y G – y G + y – y G - M/y G – M/y G - M/y – M/y G - M/y – M/y G + M/y G – M/y G + M/y – M/y G + M/y – M/y G - d/M/y – d/M/y G - d/M/y G – d/M/y G - d/M/y – d/M/y G - d/M/y – d/M/y G + d/M/y – d/M/y G + d/M/y G – d/M/y G + d/M/y – d/M/y G + d/M/y – d/M/y G - E d/M/y – E d/M/y G - E d/M/y G – E d/M/y G - E d/M/y – E d/M/y G - E d/M/y – E d/M/y G + E d/M/y – E d/M/y G + E d/M/y G – E d/M/y G + E d/M/y – E d/M/y G + E d/M/y – E d/M/y G - MMM y – MMM y G - MMM–MMM y G - MMM y – MMM y G + MMM y – MMM y G + MMM–MMM y G + MMM y – MMM y G - d–d MMM y G - d MMM y G – d MMM y G - d MMM – d MMM y G - d MMM y – d MMM y G + d–d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E d MMM – E d MMM y G - E d MMM y G – E d MMM y G - E d MMM – E d MMM y G - E d MMM y – E d MMM y G + E d MMM – E d MMM y G + E d MMM y G – E d MMM y G + E d MMM – E d MMM y G + E d MMM y – E d MMM y G - h:mm a – h:mm a - h:mm – h:mm a - h:mm – h:mm a + h:mm a – h:mm a + h:mm – h:mm a + h:mm – h:mm a - h:mm a – h:mm a v - h:mm – h:mm a v - h:mm – h:mm a v + h:mm a – h:mm a v + h:mm – h:mm a v + h:mm – h:mm a v - M/d – M/d - M/d – M/d + M/d – M/d + M/d – M/d - E M/d – E M/d - E M/d – E M/d + E M/d – E M/d + E M/d – E M/d - d–d MMM - d MMM – d MMM + d–d MMM + d MMM – d MMM - E d MMM – E d MMM - E d MMM – E d MMM + E d MMM – E d MMM + E d MMM – E d MMM - M/y – M/y - M/y – M/y + M/y – M/y + M/y – M/y - d/M/y – d/M/y - d/M/y – d/M/y - d/M/y – d/M/y + d/M/y – d/M/y + d/M/y – d/M/y + d/M/y – d/M/y - E d/M/y – E d/M/y - E d/M/y – E d/M/y - E d/M/y – E d/M/y + E d/M/y – E d/M/y + E d/M/y – E d/M/y + E d/M/y – E d/M/y - MMM–MMM y - MMM y – MMM y + MMM–MMM y + MMM y – MMM y - d–d MMM y - d MMM – d MMM y - d MMM y – d MMM y + d–d MMM y + d MMM – d MMM y + d MMM y – d MMM y - E d MMM – E d MMM y - E d MMM – E d MMM y - E d MMM y – E d MMM y + E d MMM – E d MMM y + E d MMM – E d MMM y + E d MMM y – E d MMM y - MMMM–MMMM y - MMMM y – MMMM y + MMMM–MMMM y + MMMM y – MMMM y @@ -1276,2385 +1255,2361 @@ CLDR data files are interpreted according to the LDML specification (http://unic - èbbica + èbbica - èbb. + èbb. - èbb + èbb - annu - l’annu passatu - st’annu - l’annu pròssimu + annu + l’annu passatu + st’annu + l’annu vinturu - ntra n’annu - ntra {0} anni + ntra n’annu + ntra {0} anni - n’annu nnarrè - {0} anni nnarrè + n’annu nnarrè + {0} anni nnarrè - a. - l’a. passatu - st’a. - l’a. pròssimu - - ntra n’annu - ntra {0} anni - + a. + l’a. passatu + st’a. + l’a. vinturu - l’a. passatu - st’.a - u pròssimu annu - - ntra n’annu - ntra {0} anni - + l’a. passatu + st’.a + l’a. vinturu - trimestri - l’ùrtimu trimestri - stu trimestri - u pròssimu trimestri + trimestri + l’ùrtimu trimestri + stu trimestri + u pròssimu trimestri - ntra un trimestri - ntra {0} trimestri + ntra un trimestri + ntra {0} trimestri - un trimestri nnarrè - {0} trimestri nnarrè + un trimestri nnarrè + {0} trimestri nnarrè - tri. + tri. - ntra un tri. - ntra {0} tri. + ntra un tri. + ntra {0} tri. - un tri. nnarrè - {0} tri. nnarrè + un tri. nnarrè + {0} tri. nnarrè - tri + tri - ntra un t. - ntra {0} t. + ntra un t. + ntra {0} t. - un t. nnarrè - {0} t. nnarrè + un t. nnarrè + {0} t. nnarrè - misi - u misi passatu - stu misi - u pròssimu misi + misi + u misi passatu + stu misi + u misi vinturu - ntra un misi - ntra {0} misi + ntra un misi + ntra {0} misi - un misi nnarrè - {0} misi nnarrè + un misi nnarrè + {0} misi nnarrè - m. - u m. passatu - stu m. - u pròssimu m. + m. + u m. passatu + stu m. + u m. vinturu - ntra un m. - ntra {0} m. + ntra un m. + ntra {0} m. - un m. nnarrè - {0} m. nnarrè + un m. nnarrè + {0} m. nnarrè - u m. passatu - stu m. - u pròssimu m. - - ntra un m. - ntra {0} m. - - - un m. nnarrè - {0} m. nnarrè - + u m. passatu + stu m. + u m. vinturu - simana - a simana passata - sta simana - a pròssima simana + simana + a simana passata + sta simana + a pròssima simana - ntra na simana - ntra {0} simani + ntra na simana + ntra {0} simani - na simana nnarrè - {0} simani nnarrè + na simana nnarrè + {0} simani nnarrè - a simana di {0} + a simana di {0} - smn. - a smn. passata - sta smn. - a pròssima smn. - a smn. di {0} - - - a smn. passata - sta smn. - a pròssima smn. - a smn. di {0} + smn. + a smn. passata + sta smn. + a pròssima smn. + a smn. di {0} - simana dû misi + simana dû misi - smn. dû m. + smn. dû m. - jornu - ajeri - oji - dumani + jornu + ajeri + oji + dumani - ntra un jornu - ntra {0} jorna + ntra un jornu + ntra {0} jorna - un jornu nnarrè - {0} jorna nnarrè + un jornu nnarrè + {0} jorna nnarrè - j. - ajeri - oji - dumani + j. - jornu di l’annu + jornu di l’annu - j. di l’a. + j. di l’a. - jornu dâ simana + jornu dâ simana - j. dâ smn. + j. dâ smn. - l’ùrtima dumìnica - sta dumìnica - a pròssima dumìnica + l’ùrtima dumìnica + sta dumìnica + a pròssima dumìnica - ntra na dumìnica - ntra {0} dumìnichi + ntra na dumìnica + ntra {0} dumìnichi - na dumìnica nnarrè - {0} dumìnichi nnarrè + na dumìnica nnarrè + {0} dumìnichi nnarrè - l’ùrtima dum. - sta dum. - a pròssima dum. + l’ùrtima dum. + sta dum. + a pròssima dum. - ntra na dum. - ntra {0} dum. + ntra na dum. + ntra {0} dum. - na dum. nnarrè - {0} dum. nnarrè - - - - l’ùrtima dum. - sta dum. - a pròssima dum. - - ntra na dum. - ntra {0} dum. - - - na dum. nnarrè - {0} dum. nnarrè + na dum. nnarrè + {0} dum. nnarrè - l’ùrtimu lùnnidi - stu lùnnidi - u pròssimu lùnnidi + l’ùrtimu lùnnidi + stu lùnnidi + u pròssimu lùnnidi - ntra un lùnnidi - ntra {0} lùnnidi + ntra un lùnnidi + ntra {0} lùnnidi - un lùnnidi nnarrè - {0} lùnnidi nnarrè + un lùnnidi nnarrè + {0} lùnnidi nnarrè + + AM/PM + - ura + ura - u. + u. - minutu + minutu - min. + min. - sicunnu - ora + sicunnu + ora - sic. + sic. - fusu urariu + fusu urariu - fusu + fusu - {0} (ura ligali) - {0} (ura sulari) + {0} (ura ligali) + {0} (ura sulari) - Ura Curdinata Univirsali + Ura Curdinata Univirsali - Scanusciutu + Scanusciutu - - Tirana + + Dubbai + + + Basi Rothera + + + Terra di Palmer + + + Basi Troll + + + Basi Showa + + + Basi Mawson + + + Basi Vostok + + + Basi Casey + + + Basi Dumont d’Urville + + + Basi McMurdo - Còrduba + Còrduba - Adilaidi + Adilaidi - Sarajevu + Sarajevu - Brusseli + Bruselli - Birmuda + Birmuda - Campu Ranni + Campu Granni - San Paulu + San Paulu - Bilisi + Bilisi - Riggina + Riggina - Torontu + Turontu - Zurigu + Zurigu + + + Ìsula di Pasca - Custa Rica + Custa Rica - Capu Virdi + Capu Virdi - Natali + Natali - Nicusìa + Nicusìa - Praga + Praga - Birlinu + Birlinu - Gibbuti + Gibbuti - Dumìnica + Dumìnica - Santu Dumingu + Santu Dumingu - Algeri + Algeri - Galàpagos + Galàpagos - Cairu + Cairu - Canari + Canari - Cèuta + Cèuta - Hèlsinki + Hèlsinki - Figi + Figi - Pariggi + Pariggi - Ura ligali Britànnica + Ura ligali Britànnica - Lònnira + Lònnira - Gibbirterra + Gibbirterra - Guadalupa + Guadalupa - Ateni + Ateni - Giorgia di sciroccu + Giorgia di sciroccu - Guatimala + Guatimala - Guiana + Guiana - Zagabbria + Zagabbria - Giacarta + Giacarta - Ura sulari Irlannisi + Ura sulari Irlannisi - Dubblinu + Dubblinu - Girusalemmi + Girusalemmi - Ìsula di Man + Ìsula di Man - Kurkata + Kurkata - Roma + Roma - Giamaica + Giamaica - Ammàn + Ammàn - Nairobbi + Nairobbi - Siul + Siul - Santa Lucìa + Santa Lucìa - Culummu + Culummu - Lussimburgu + Lussimmurgu - Trìpuli + Trìpuli - Casabblanca + Casabblanca - Mònacu + Mònacu - Macau + Macau - Martinica + Martinica - Munzirratu + Munzirratu - Mauta + Mauta - Mardivi + Mardivi - Muntirrei + Muntirrei - Cità dû Mèssicu + Cità dû Mèssicu - Mascati + Mascati - Pànama + Pànama - Marchesi + Ìsuli Marchesi - Varsavia + Varsavia + + + Ìsuli Pitcairn - Portu Ricu + Portu Ricu - Gazza + Gazza - Azzorri + Azzorri - Lisbona + Lisbona - Belgradu + Belgradu - Mosca + Mosca - Vòlgugrad + Vòlgugrad - Yekatirimmurgu + Yekatirimmurgu - Vladìvustok + Vladìvustok - Stuccorma + Stuccorma - Singapuri + Singapuri - Sant’Èlina + Sant’Èlina - San Marinu + San Marinu - Mugadisciu + Mugadisciu - Damascu + Damascu - Tùnisi + Tùnisi - Ìstanbul + Ìstanbul - Portu di Spagna + Portu di Spagna - Kiev + Kiev + + + Atollu Midway + + + Ìsula Wake - Beulah, Dakota di Tramuntana + Beulah, Dakota di Tramuntana - New Salem, Dakota di Tramuntana + New Salem, Dakota di Tramuntana - Centru, Dakota di Tramuntana + Centru, Dakota di Tramuntana - Ditroit + Ditroit - Nova Jorca + Nova Jorca - Samarcanna + Samarcanna - Vaticanu + Vaticanu + + + Wallis e Futuna - Ura di l’Afghànistan + Ura di l’Afghànistan - Ura di l’Àfrica Cintrali + Ura di l’Àfrica Cintrali - Ura di l’Àfrica di Livanti + Ura di l’Àfrica di Livanti - Ura Nurmali di l’Àfrica di Sciroccu + Ura Nurmali di l’Àfrica di Sciroccu - Ura di l’Àfrica di Punenti - Ura sulari di l’Àfrica di Punenti - Ura ligali di l’Àfrica di Punenti + Ura di l’Àfrica di Punenti - Ura di l’Alaska - Ura sulari di l’Alaska - Ura ligali di l’Alaska + Ura di l’Alaska + Ura sulari di l’Alaska + Ura ligali di l’Alaska - AKT - AKST - AKDT + AKT + AKST + AKDT - Ura di l’Amazzonia - Ura sulari di l’Amazzonia - Ura ligali di l’Amazzonia + Ura di l’Amazzonia + Ura sulari di l’Amazzonia + Ura ligali di l’Amazzonia - Ura cintrali - Ura sulari cintrali - Ura ligali cintrali + Ura cintrali + Ura sulari cintrali + Ura ligali cintrali - CT - CST - CDT + CT + CST + CDT - Ura livantina - Ura sulari livantina - Ura ligali livantina + Ura livantina + Ura sulari livantina + Ura ligali livantina - ET - EST - EDT + ET + EST + EDT - Ura dî muntagni - Ura sulari dî muntagni - Ura ligali dî muntagni + Ura dî muntagni + Ura sulari dî muntagni + Ura ligali dî muntagni - MT - MST - MDT + MT + MST + MDT - Ura dû Pacìficu - Ura sulari dû Pacìficu - Ura ligali dû Pacìficu + Ura dû Pacìficu + Ura sulari dû Pacìficu + Ura ligali dû Pacìficu - PT - PST - PDT + PT + PST + PDT - Ura di Apia - Ura sulari di Apia - Ura ligali di Apia + Ura di Samoa + Ura sulari di Samoa + Ura ligali di Samoa - Ura Àrabba - Ura sulari Àrabba - Ura ligali Àrabba + Ura Àrabba + Ura sulari Àrabba + Ura ligali Àrabba - Ura di l’Argintina - Ura sulari di l’Argintina - Ura ligali di l’Argintina + Ura di l’Argintina + Ura sulari di l’Argintina + Ura ligali di l’Argintina - Ura di l’Argintina di punenti - Ura sulari di l’Argintina di punenti - Ura ligali di l’Argintina di punenti + Ura di l’Argintina di punenti + Ura sulari di l’Argintina di punenti + Ura ligali di l’Argintina di punenti - Ura di l’Armenia - Ura sulari di l’Armenia - Ura ligali di l’Armenia + Ura di l’Armenia + Ura sulari di l’Armenia + Ura ligali di l’Armenia - Ura di l’Atlànticu - Ura sulari di l’Atlànticu - Ura ligali di l’Atlànticu + Ura di l’Atlànticu + Ura sulari di l’Atlànticu + Ura ligali di l’Atlànticu - AT - AST - ADT + AT + AST + ADT - Ura di l’Australia cintrali - Ura sulari di l’Australia cintrali - Ura ligali di l’Australia cintrali + Ura di l’Australia cintrali + Ura sulari di l’Australia cintrali + Ura ligali di l’Australia cintrali - Ura di l’Australia cintrali di punenti - Ura sulari di l’Australia cintrali di punenti - Ura ligali di l’Australia cintrali di punenti + Ura di l’Australia cintrali di punenti + Ura sulari di l’Australia cintrali di punenti + Ura ligali di l’Australia cintrali di punenti - Ura di l’Australia di livanti - Ura sulari di l’Australia di livanti - Ura ligali di l’Australia di livanti + Ura di l’Australia di livanti + Ura sulari di l’Australia di livanti + Ura ligali di l’Australia di livanti - Ura di l’Australia di punenti - Ura sulari di l’Australia di punenti - Ura ligali di l’Australia di punenti + Ura di l’Australia di punenti + Ura sulari di l’Australia di punenti + Ura ligali di l’Australia di punenti - Ura di l’Azerbaijan - Ura sulari di l’Azerbaijan - Ura ligali di l’Azerbaijan + Ura di l’Azerbaijan + Ura sulari di l’Azerbaijan + Ura ligali di l’Azerbaijan - Ura di l’Azzorri - Ura sulari di l’Azzorri - Ura ligali di l’Azzorri + Ura di l’Azzorri + Ura sulari di l’Azzorri + Ura ligali di l’Azzorri - Ura dû Bàngladesh - Ura sulari dû Bàngladesh - Ura ligali dû Bàngladesh + Ura dû Bàngladesh + Ura sulari dû Bàngladesh + Ura ligali dû Bàngladesh - Ura dû Bhutan + Ura dû Bhutan - Ura dâ Bulivia + Ura dâ Bulivia - Ura di Brasilia - Ura sulari di Brasilia - Ura ligali di Brasilia + Ura di Brasilia + Ura sulari di Brasilia + Ura ligali di Brasilia - Ura dû Brunei + Ura dû Brunei - Ura di Capu Virdi - Ura sulari di Capu Virdi - Ura ligali di Capu Virdi + Ura di Capu Virdi + Ura sulari di Capu Virdi + Ura ligali di Capu Virdi - Ura di Chamorro + Ura di Chamorro - Ura di Chatham - Ura sulari di Chatham - Ura ligali di Chatham + Ura di Chatham + Ura sulari di Chatham + Ura ligali di Chatham - Ura dû Cili - Ura sulari dû Cili - Ura ligali dû Cili + Ura dû Cili + Ura sulari dû Cili + Ura ligali dû Cili - Ura dâ Cina - Ura sulari dâ Cina - Ura ligali dâ Cina + Ura dâ Cina + Ura sulari dâ Cina + Ura ligali dâ Cina - Ura di l’Ìsula di Natali + Ura di l’Ìsula di Natali - Ura di l’Ìsuli Cocos + Ura di l’Ìsuli Cocos - Ura dâ Culummia - Ura sulari dâ Culummia - Ura ligali dâ Culummia + Ura dâ Culommia + Ura sulari dâ Culommia + Ura ligali dâ Culommia - Ura di l’Ìsuli Cook - Ura sulari di l’Ìsuli Cook - Ura ligali di l’Ìsuli Cook + Ura di l’Ìsuli Cook + Ura sulari di l’Ìsuli Cook + Ura ligali di l’Ìsuli Cook - Ura di Cubba - Ura sulari di Cubba - Ura ligali di Cubba + Ura di Cubba + Ura sulari di Cubba + Ura ligali di Cubba - CuT - CuST - CuDT + CuT + CuST + CuDT - Ura di Davis + Ura di Davis - Ura di Dumont-d’Urville + Ura di Dumont d’Urville - Ura di Timor di Livanti + Ura di Timor di Livanti - Ura di l’Ìsula di Pasca - Ura sulari di l’Ìsula di Pasca - Ura ligali di l’Ìsula di Pasca + Ura di l’Ìsula di Pasca + Ura sulari di l’Ìsula di Pasca + Ura ligali di l’Ìsula di Pasca - Ura di l’Ècuador + Ura di l’Ècuador - Ura Cintrali Eurupea - Ura sulari Cintrali Eurupea - Ura ligali Cintrali Eurupea + Ura Cintrali Eurupea + Ura sulari Cintrali Eurupea + Ura ligali Cintrali Eurupea - Ura di l’Europa di Livanti - Ura sulari di l’Europa di Livanti - Ura ligali di l’Europa di Livanti + Ura di l’Europa di Livanti + Ura sulari di l’Europa di Livanti + Ura ligali di l’Europa di Livanti - Ura di l’Europa cchiù a Livanti + Ura di l’Europa cchiù a Livanti - Ura di l’Europa di Punenti - Ura sulari di l’Europa di Punenti - Ura ligali di l’Europa di Punenti + Ura di l’Europa di Punenti + Ura sulari di l’Europa di Punenti + Ura ligali di l’Europa di Punenti - Ura di l’Ìsuli Falkland - Ura sulari di l’Ìsuli Falkland - Ura ligali di l’Ìsuli Falkland + Ura di l’Ìsuli Falkland + Ura sulari di l’Ìsuli Falkland + Ura ligali di l’Ìsuli Falkland - Ura dî Figi - Ura sulari dî Figi - Ura ligali dî Figi + Ura dî Figi + Ura sulari dî Figi + Ura ligali dî Figi - Ura dâ Guiana Francisi + Ura dâ Guiana Francisi - Ura Francisi di Sciroccu e di l’Antàrtidi + Ura Francisi di Sciroccu e di l’Antàrtidi - Ura dî Galàpagos + Ura dî Galàpagos - Ura di Gambier + Ura di Gambier - Ura dâ Giorgia - Ura sulari dâ Giorgia - Ura ligali dâ Giorgia + Ura dâ Giorgia + Ura sulari dâ Giorgia + Ura ligali dâ Giorgia - Ura di l’Ìsuli Gilbert + Ura di l’Ìsuli Gilbert - Ura Minzana di Greenwich + Ura Minzana di Greenwich - Ura dâ Gruillannia - Ura sulari dâ Gruillannia - Ura ligali dâ Gruillannia + Ura dâ Gruillannia + Ura sulari dâ Gruillannia + Ura ligali dâ Gruillannia - Ura dâ Gruillannia livantina - Ura sulari dâ Gruillannia livantina - Ura livantina dâ Gruillannia livantina + Ura dâ Gruillannia livantina + Ura sulari dâ Gruillannia livantina + Ura livantina dâ Gruillannia livantina - Ura dâ Gruillannia punintina - Ura sulari dâ Gruillannia punintina - Ura ligali dâ Gruillannia punintina + Ura dâ Gruillannia punintina + Ura sulari dâ Gruillannia punintina + Ura ligali dâ Gruillannia punintina - Ura Nurmali dû Gurfu + Ura Nurmali dû Gurfu - Ura dâ Guiana + Ura dâ Guiana + + + Ura sulari di l’Hawaai + + + HAST + + - Ura di l’Hawaai - Ura sulari di l’Hawaai - Ura ligali di l’Hawaai + Ura di l’Hawaai + Ura sulari di l’Hawaai + Ura ligali di l’Hawaai - HAT - HAST - HADT + HAT + HAST + HADT - Ura di Hong Kong - Ura sulari di Hong Kong - Ura ligali di Hong Kong + Ura di Hong Kong + Ura sulari di Hong Kong + Ura ligali di Hong Kong - Ura di Hovd - Ura sulari di Hovd - Ura ligali di Hovd + Ura di Khovd + Ura sulari di Khovd + Ura ligali di Khovd - Ura sulari di l’Ìnnia + Ura sulari di l’Ìnnia - Ura di l’Ucianu Innianu + Ura di l’Ucianu Innianu - Ura di l’Innucina + Ura di l’Innucina - Ura di l’Innunesia cintrali + Ura di l’Innunesia cintrali - Ura di l’Innunesia di livanti + Ura di l’Innunesia di livanti - Ura di l’Innunesia di punenti + Ura di l’Innunesia di punenti - Ura di l’Iran - Ura sulari di l’Iran - Ura ligali di l’Iran + Ura di l’Iran + Ura sulari di l’Iran + Ura ligali di l’Iran - Ura di Irtkutsk - Ura sulari di Irtkutsk - Ura ligali di Irtkutsk + Ura di Irtkutsk + Ura sulari di Irtkutsk + Ura ligali di Irtkutsk - Ura di Isdraeli - Ura sulari di Isdraeli - Ura ligali di Isdraeli + Ura di Isdraeli + Ura sulari di Isdraeli + Ura ligali di Isdraeli - Ura dû Giappuni - Ura sulari dû Giappuni - Ura ligali dû Giappuni + Ura dû Giappuni + Ura sulari dû Giappuni + Ura ligali dû Giappuni - Ura dû Kazzàkistan + Ura dû Kazzàkistan - Ura dû Kazzàkistan di Livanti + Ura dû Kazzàkistan di Livanti - Ura dû Kazzàkistan di Punenti + Ura dû Kazzàkistan di Punenti - Ura dâ Curìa - Ura sulari dâ Curìa - Ura ligali dâ Curìa + Ura dâ Curìa + Ura sulari dâ Curìa + Ura ligali dâ Curìa - Ura di Kosrae + Ura di Kosrae - Ura di Krasnoyarsk - Ura sulari di Krasnoyarsk - Ura ligali di Krasnoyarsk + Ura di Krasnoyarsk + Ura sulari di Krasnoyarsk + Ura ligali di Krasnoyarsk - Ura dû Kirghìzzistan + Ura dû Kirghìzzistan - Ura di l’Ìsuli Line + Ura di l’Ìsuli Line - Ura di Lord Howe - Ura sulari di Lord Howe - Ura ligali di Lord Howe + Ura di Lord Howe + Ura sulari di Lord Howe + Ura ligali di Lord Howe - Ura di Magdan - Ura sulari di Magdan - Ura ligali di Magdan + Ura di Magdan + Ura sulari di Magdan + Ura ligali di Magdan - Ura dâ Malisia + Ura dâ Malisia - Ura dî Mardivi + Ura dî Mardivi - Ura dî Marchesi + Ura dî Marchesi - Ura di l’Ìsuli Marshall + Ura di l’Ìsuli Marshall - Ura di Mauritius - Ura sulari di Mauritius - Ura ligali di Mauritius + Ura di Mauritius + Ura sulari di Mauritius + Ura ligali di Mauritius - Ura di Mawson + Ura di Mawson - Ura dû Mèssicu Pacìficu - Ura sulari dû Mèssicu Pacìficu - Ura ligali dû Mèssicu Pacìficu + Ura dû Mèssicu Pacìficu + Ura sulari dû Mèssicu Pacìficu + Ura ligali dû Mèssicu Pacìficu - Ura di Ulaanbaatar - Ura sulari di Ulaanbaatar - Ura ligali di Ulaanbaatar + Ura di Ulaanbaatar + Ura sulari di Ulaanbaatar + Ura ligali di Ulaanbaatar - Ura di Mosca - Ura sulari di Mosca - Ura ligali di Mosca + Ura di Mosca + Ura sulari di Mosca + Ura ligali di Mosca - Ura di Myanmar + Ura di Myanmar - Ura di Nauru + Ura di Nauru - Ura dû Nepal + Ura dû Nepal - Ura dâ Nova Calidonia - Ura sulari dâ Nova Calidonia - Ura ligali dâ Nova Calidonia + Ura dâ Nova Calidonia + Ura sulari dâ Nova Calidonia + Ura ligali dâ Nova Calidonia - Ura dâ Nova Zilannia - Ura sulari dâ Nova Zilannia - Ura ligali dâ Nova Zilannia + Ura dâ Nova Zilannia + Ura sulari dâ Nova Zilannia + Ura ligali dâ Nova Zilannia - Ura di Tirranova - Ura sulari di Tirranova - Ura ligali di Tirranova + Ura di Tirranova + Ura sulari di Tirranova + Ura ligali di Tirranova - Ura di Niue + Ura di Niue - Ura di l’Ìsula Norfolk - Ura sulari di l’Ìsula Norfolk - Ura ligali di l’Ìsula Norfolk + Ura di l’Ìsula Norfolk + Ura sulari di l’Ìsula Norfolk + Ura ligali di l’Ìsula Norfolk - Ura di Fernando di Noronha - Ura sulari di Fernando di Noronha - Ura ligali di Fernando di Noronha + Ura di Fernando di Noronha + Ura sulari di Fernando di Noronha + Ura ligali di Fernando di Noronha - Ura di Novosibirsk - Ura sulari di Novosibirsk - Ura ligali di Novosibirsk + Ura di Novosibirsk + Ura sulari di Novosibirsk + Ura ligali di Novosibirsk - Ura di Omsk - Ura sulari di Omsk - Ura ligali di Omsk + Ura di Omsk + Ura sulari di Omsk + Ura ligali di Omsk - Ura dû Pàkistan - Ura sulari dû Pàkistan - Ura ligali dû Pàkistan + Ura dû Pàkistan + Ura sulari dû Pàkistan + Ura ligali dû Pàkistan - Ura di Palau + Ura di Palau - Ura dâ Papua Nova Guinìa + Ura dâ Papua Nova Guinìa - Ura dû Paraguay - Ura sulari dû Paraguay - Ura ligali dû Paraguay + Ura dû Paraguay + Ura sulari dû Paraguay + Ura ligali dû Paraguay - Ura dû Pirù - Ura sulari dû Pirù - Ura ligali dû Pirù + Ura dû Pirù + Ura sulari dû Pirù + Ura ligali dû Pirù - Ura dî Filippini - Ura sulari dî Filippini - Ura ligali dî Filippini + Ura dî Filippini + Ura sulari dî Filippini + Ura ligali dî Filippini - Ura di l’Ìsuli Phoenix + Ura di l’Ìsuli Phoenix - Ura di S. Pierre e Miquelon - Ura sulari di S. Pierre e Miquelon - Ura ligali di S. Pierre e Miquelon + Ura di S. Pierre e Miquelon + Ura sulari di S. Pierre e Miquelon + Ura ligali di S. Pierre e Miquelon - Ura di Pitcairn + Ura di Pitcairn - Ura di Ponape + Ura di Pohnpei - Ura di Pyongyang + Ura dâ Curia di Tramuntana - Ura di Réunion + Ura di Réunion - Ura di Rothera + Ura di Rothera - Ura di Sakhalin - Ura sulari di Sakhalin - Ura ligali di Sakhalin + Ura di Sakhalin + Ura sulari di Sakhalin + Ura ligali di Sakhalin - Ura dî Samoa - Ura sulari dî Samoa - Ura ligali dî Samoa + Ura dî Samoa miricani + Ura sulari dî Samoa miricani + Ura ligali dî Samoa miricani - Ura dî Seychelles + Ura dî Seychelles - Ura di Singapuri + Ura di Singapuri - Ura di l’Ìsuli Salumuni + Ura di l’Ìsuli Salumuni - Ura dâ Giorgia di sciroccu + Ura dâ Giorgia di sciroccu - Ura dû Surinami + Ura dû Surinami - Ura di Syowa + Ura di Syowa - Ura di Tahiti + Ura di Tahiti - Ura di Taipei - Ura sulari di Taipei - Ura ligali di Taipei + Ura di Taiwan + Ura sulari di Taiwan + Ura ligali di Taiwan - Ura dû Taggìkistan + Ura dû Taggìkistan - Ura di Tukilau + Ura di Tukilau - Ura di Tonga - Ura sulari di Tonga - Ura ligali di Tonga + Ura di Tonga + Ura sulari di Tonga + Ura ligali di Tonga - Ura di Chuuk + Ura di Chuuk - Ura dû Turkmènistan - Ura sulari dû Turkmènistan - Ura ligali dû Turkmènistan + Ura dû Turkmènistan + Ura sulari dû Turkmènistan + Ura ligali dû Turkmènistan - Ura di Tuvalu + Ura di Tuvalu - Ura di l’Uruguay - Ura sulari di l’Uruguay - Ura ligali di l’Uruguay + Ura di l’Uruguay + Ura sulari di l’Uruguay + Ura ligali di l’Uruguay - Ura di l’Uzbèkistan - Ura sulari di l’Uzbèkistan - Ura ligali di l’Uzbèkistan + Ura di l’Uzbèkistan + Ura sulari di l’Uzbèkistan + Ura ligali di l’Uzbèkistan - Ura di Vanuatu - Ura sulari di Vanuatu - Ura ligali di Vanuatu + Ura di Vanuatu + Ura sulari di Vanuatu + Ura ligali di Vanuatu - Ura dû Vinizzuela + Ura dû Vinizzuela - Ura di Vladìvustok - Ura sulari di Vladìvustok - Ura ligali di Vladìvustok + Ura di Vladìvustok + Ura sulari di Vladìvustok + Ura ligali di Vladìvustok - Ura di Vòlgugrad - Ura sulari di Vòlgugrad - Ura ligali di Vòlgugrad + Ura di Vòlgugrad + Ura sulari di Vòlgugrad + Ura ligali di Vòlgugrad - Ura di Vostok + Ura di Vostok - Ura di l’Ìsula Wake + Ura di l’Ìsula Wake - Ura di Wallis e Futuna + Ura di Wallis e Futuna - Ura di Yakutsk - Ura sulari di Yakutsk - Ura ligali di Yakutsk + Ura di Yakutsk + Ura sulari di Yakutsk + Ura ligali di Yakutsk - Ura di Yekatirimmurgu - Ura sulari di Yekatirimmurgu - Ura ligali di Yekatirimmurgu + Ura di Yekatirimmurgu + Ura sulari di Yekatirimmurgu + Ura ligali di Yekatirimmurgu - Ura dû Yukon + Ura dû Yukon - , - . + , + . - 0 migghiaru - 0 mila - 00 mila - 00 mila - 000 mila - 000 mila - 0 miliuni - 0 miliuna - 00 miliuna - 00 miliuna - 000 miliuna - 000 miliuna - 0 miliardu - 0 miliardi - 00 miliardi - 00 miliardi - 000 miliardi - 000 miliardi - 0 biliuni - 0 biliuna - 00 biliuna - 00 biliuna - 000 biliuna - 000 biliuna + 0 migghiaru + 0 mila + 00 mila + 00 mila + 000 mila + 000 mila + 0 miliuni + 0 miliuna + 00 miliuna + 00 miliuna + 000 miliuna + 000 miliuna + 0 miliardu + 0 miliardi + 00 miliardi + 00 miliardi + 000 miliardi + 000 miliardi + 0 biliuni + 0 biliuna + 00 biliuna + 00 biliuna + 000 biliuna + 000 biliuna - Dirham di l’Emirati Àrabbi Junciuti - dirham EAJ - dirham EAJ + Dirham di l’Emirati Àrabbi Junciuti + dirham EAJ + dirham EAJ - Afghani afghanu - afghani afghanu - afghani afghani + Afghani afghanu + afghani afghanu + afghani afghani - Lek arbanisi - lek arbanisi - lek arbanisi + Lek arbanisi + lek arbanisi + lek arbanisi - Dram armenu - dram armenu - dram armeni + Dram armenu + dram armenu + dram armeni - Ciurinu di l’Antiḍḍi Ulannisi - ciurinu di l’Antiḍḍi Ulannisi - ciurini di l’Antiḍḍi Ulannisi + Ciurinu di l’Antiḍḍi Ulannisi + ciurinu di l’Antiḍḍi Ulannisi + ciurini di l’Antiḍḍi Ulannisi - Kwanza angulisi - kwanza angulisi - kwanza angulisi + Kwanza angulisi + kwanza angulisi + kwanza angulisi - Pesu argintinu - pesu argintinu - pesi argintini + Pesu argintinu + pesu argintinu + pesi argintini - Dòllaru australianu - dòllaru australianu - dòllari australiani + Dòllaru australianu + dòllaru australianu + dòllari australiani - Ciurinu d’Arubba - ciurinu d’Arubba - ciurini d’Arubba + Ciurinu d’Arubba + ciurinu d’Arubba + ciurini d’Arubba - Manat azzeru - manat azzeru - manat azzeri + Manat azzeru + manat azzeru + manat azzeri - Marcu cummirtìbbili dâ Bosnia-Herzegòvina - marcu cummirtìbbili dâ Bosnia-Herzegòvina - marchi cummirtìbbili dâ Bosnia-Herzegòvina + Marcu cummirtìbbili dâ Bosnia-Herzegòvina + marcu cummirtìbbili dâ Bosnia-Herzegòvina + marchi cummirtìbbili dâ Bosnia-Herzegòvina - Dòllaru dî Barbados - dòllaru dî Barbados - dòllari dî Barbados + Dòllaru dî Barbados + dòllaru dî Barbados + dòllari dî Barbados - Taka dû Bàngladesh - taka dû Bàngladesh - taka dû Bàngladesh + Taka dû Bàngladesh + taka dû Bàngladesh + taka dû Bàngladesh - Lev bùrgaru - lev bùrgaru - lev bùrgari + Lev bùrgaru + lev bùrgaru + lev bùrgari - Dìnaru dû Bahrain - dìnaru dû Bahrain - dìnari dû Bahrain + Dìnaru dû Bahrain + dìnaru dû Bahrain + dìnari dû Bahrain - Francu dû Burundi - francu dû Burundi - franchi dû Burundi + Francu dû Burundi + francu dû Burundi + franchi dû Burundi - Dòllaru dî Birmuda - dòllaru dî Birmuda - dòllari dî Birmuda + Dòllaru dî Birmuda + dòllaru dî Birmuda + dòllari dî Birmuda - Dòllaru dû Brunei - dòllaru dû Brunei - dòllari dû Brunei + Dòllaru dû Brunei + dòllaru dû Brunei + dòllari dû Brunei - Bulivianu - bulivianu - buliviani + Bulivianu + bulivianu + buliviani - Riali brasilianu - riali brasilianu - riali brasiliani + Riali brasilianu + riali brasilianu + riali brasiliani - Dòllaru dî Bahamas - dòllaru dî Bahamas - dòllari dî Bahamas + Dòllaru dî Bahamas + dòllaru dî Bahamas + dòllari dî Bahamas - Ngultrum butanisi - ngultrum butanisi - ngultrum butanisi + Ngultrum butanisi + ngultrum butanisi + ngultrum butanisi - Pula dû Botswana - pula dû Botswana - pula dû Botswana + Pula dû Botswana + pula dû Botswana + pula dû Botswana - Rubblu belurrussu - rubblu belurrussu - rubbli belurrussi + Rubblu belurrussu + rubblu belurrussu + rubbli belurrussi - Dòllaru dû Bilisi - dòllaru dû Bilisi - dòllari dû Bilisi + Dòllaru dû Bilisi + dòllaru dû Bilisi + dòllari dû Bilisi - Dòllaru canadisi - dòllaru canadisi - dòllari canadisi + Dòllaru canadisi + dòllaru canadisi + dòllari canadisi - Francu cungulisi - francu cungulisi - franchi cungulisi + Francu cungulisi + francu cungulisi + franchi cungulisi - Francu sbìzziru - francu sbìzziru - franchi sbìzziri + Francu sbìzziru + francu sbìzziru + franchi sbìzziri - Pesu cilenu - pesu cilenu - pesi cileni + Pesu cilenu + pesu cilenu + pesi cileni - Yuan cinisi (di fora) - yuan cinisi (di fora) - yuan cinisi (di fora) + Yuan cinisi (di fora) + yuan cinisi (di fora) + yuan cinisi (di fora) - Yuan cinisi - yuan cinisi - yuan cinisi + Yuan cinisi + yuan cinisi + yuan cinisi - Pesu culummianu - pesu culummianu - pesi culummiani + Pesu culummianu + pesu culummianu + pesi culummiani - Culón dâ Custa Rica - culón dâ Custa Rica - culoni dâ Custa Rica + Culón dâ Custa Rica + culón dâ Custa Rica + culoni dâ Custa Rica - Pesu cubbanu cummirtìbbili - pesu cubbanu cummirtìbbili - pesi cubbani cummirtìbbili + Pesu cubbanu cummirtìbbili + pesu cubbanu cummirtìbbili + pesi cubbani cummirtìbbili - Pesu cubbanu - pesu cubbanu - pesi cubbani + Pesu cubbanu + pesu cubbanu + pesi cubbani - Scudu capuvirdisi - scudu capuvirdisi - scudi capuvirdisi + Scudu di Capu Virdi + scudu di Capu Virdi + scudi di Capu Virdi - Curuna ceca - curuna ceca - curuni cechi + Curuna ceca + curuna ceca + curuni cechi - Francu di Gibbuti - francu di Gibbuti - franchi di Gibbuti + Francu di Gibbuti + francu di Gibbuti + franchi di Gibbuti - Curuna danisi - curuna danisi - curuni danisi + Curuna danisi + curuna danisi + curuni danisi - Pesu duminicanu - pesu duminicanu - pesi duminicani + Pesu duminicanu + pesu duminicanu + pesi duminicani - Dìnaru argirinu - dìnaru argirinu - dìnari argirini + Dìnaru argirinu + dìnaru argirinu + dìnari argirini - Stirlina eggizziana - stirlina eggizziana - stirlini eggizziani + Stirlina eggizziana + stirlina eggizziana + stirlini eggizziani - Nafka eritreu - nafka eritreu - nafka eritrei + Nafka eritreu + nafka eritreu + nafka eritrei - Birr etiupi - birr etiupi - birr etiupi + Birr etiupi + birr etiupi + birr etiupi - Euru - euru - euru + Euru + euru + euru - Dòllaru dî Figi - dòllaru dî Figi - dòllari dî Figi + Dòllaru dî Figi + dòllaru dî Figi + dòllari dî Figi - Stirlina di l’Ìsuli Falkland - stirlina di l’Ìsuli Falkland - stirlini di l’Ìsuli Falkland + Stirlina di l’Ìsuli Falkland + stirlina di l’Ìsuli Falkland + stirlini di l’Ìsuli Falkland - Stirlina Britànnica - stirlina Britànnica - stirlini Britànnica + Stirlina Britànnica + stirlina Britànnica + stirlini Britànnichi - Lari giurgianu - lari giurgianu - lari giurgiani + Lari giurgianu + lari giurgianu + lari giurgiani - Cedi ganisi - cedi ganisi - cedi ganisi + Cedi ganisi + cedi ganisi + cedi ganisi - Stirlina di Gibbirterra - stirlina di Gibbirterra - stirlini di Gibbirterra + Stirlina di Gibbirterra + stirlina di Gibbirterra + stirlini di Gibbirterra - Dalasi dû Gammia - dalasi dû Gammia - dalasi dû Gammia + Dalasi dû Gammia + dalasi dû Gammia + dalasi dû Gammia - Francu dâ Guinìa - francu dâ Guinìa - franchi dâ Guinìa + Francu dâ Guinìa + francu dâ Guinìa + franchi dâ Guinìa - Quetzal dâ Guatimala - quetzal dâ Guatimala - quetzal dâ Guatimala + Quetzal dû Guatimala + quetzal dû Guatimala + quetzal dû Guatimala - Dòllaru dâ Guiana - dòllaru dâ Guiana - dòllari dâ Guiana + Dòllaru dâ Guiana + dòllaru dâ Guiana + dòllari dâ Guiana - Dòllaru di Hong Kong - dòllaru di Hong Kong - dòllari di Hong Kong + Dòllaru di Hong Kong + dòllaru di Hong Kong + dòllari di Hong Kong - Limpira di l’Hunnuras - limpira di l’Hunnuras - limpira di l’Hunnuras + Limpira di l’Hunnuras + limpira di l’Hunnuras + limpira di l’Hunnuras - Kuna cruata - kuna cruata - kuni cruati + Kuna cruata + kuna cruata + kuni cruati - Gordu d’Haiti - gordu d’Haiti - gordi d’Haiti + Gordu d’Haiti + gordu d’Haiti + gordi d’Haiti - Ciurinu unghirisi - ciurinu unghirisi - ciurini unghirisi + Ciurinu unghirisi + ciurinu unghirisi + ciurini unghirisi - Rupìa innunisiana - rupìa innunisiana - rupìi innunisiani + Rupìa innunisiana + rupìa innunisiana + rupìi innunisiani - Novu siclu isdraelianu - novu siclu isdraelianu - novi sicli isdraeliani + Novu siclu isdraelianu + novu siclu isdraelianu + novi sicli isdraeliani - Rupìa inniana - rupìa inniana - rupìi inniani + Rupìa inniana + rupìa inniana + rupìi inniani - Dìnaru irachenu - dìnaru irachenu - dìnari iracheni + Dìnaru irachenu + dìnaru irachenu + dìnari iracheni - Riali iranianu - riali iranianu - riali iraniani + Riali iranianu + riali iranianu + riali iraniani - Curuna islannisi - curuna islannisi - curuni islannisi + Curuna islannisi + curuna islannisi + curuni islannisi - Dòllaru giamaicanu - dòllaru giamaicanu - dòllari giamaicanu + Dòllaru giamaicanu + dòllaru giamaicanu + dòllari giamaicanu - Dìnaru giurdanu - dìnaru giurdanu - dìnari giurdani + Dìnaru giurdanu + dìnaru giurdanu + dìnari giurdani - Yen giappunisi - yen giappunisi - yen giappunisi + Yen giappunisi + yen giappunisi + yen giappunisi - Scillinu dû Kenya - scillinu dû Kenya - scillini dû Kenya + Scillinu dû Kenya + scillinu dû Kenya + scillini dû Kenya - Som dû Kyrgyzistan - som dû Kyrgyzistan - som dû Kyrgyzistan + Som dû Kirghìzzistan + som dû Kirghìzzistan + som dû Kirghìzzistan - Riel cambuggianu - riel cambuggianu - riel cambuggianI + Riel cambuggianu + riel cambuggianu + riel cambuggianI - Francu dî Cumori - francu dî Cumori - franchi dî Cumori + Francu dî Cumori + francu dî Cumori + franchi dî Cumori - Won dâ Curìa di Tramuntana - won dâ Curìa di Tramuntana - won dâ Curìa di Tramuntana + Won dâ Curìa di Tramuntana + won dâ Curìa di Tramuntana + won dâ Curìa di Tramuntana - Won dâ Curìa di Sciroccu - won dâ Curìa di Sciroccu - won dâ Curìa di Sciroccu + Won dâ Curìa di Sciroccu + won dâ Curìa di Sciroccu + won dâ Curìa di Sciroccu - Dìnaru dû Kuwait - dìnaru dû Kuwait - dìnari dû Kuwait + Dìnaru dû Kuwait + dìnaru dû Kuwait + dìnari dû Kuwait - Dòllaru di l’Ìsuli Cayman - dòllaru di l’Ìsuli Cayman - dòllari di l’Ìsuli Cayman + Dòllaru di l’Ìsuli Cayman + dòllaru di l’Ìsuli Cayman + dòllari di l’Ìsuli Cayman - Tenge dû Kazzàkistan - tenge dû Kazzàkistan - tenge dû Kazzàkistan + Tenge dû Kazzàkistan + tenge dû Kazzàkistan + tenge dû Kazzàkistan - Kip lauisi - kip lauisi - kip lauisi + Kip lauisi + kip lauisi + kip lauisi - Stirlina libbanisi - stirlina libbanisi - stirlini libbanisi + Stirlina libbanisi + stirlina libbanisi + stirlini libbanisi - Rupìa dû Sri Lanka - rupìa dû Sri Lanka - rupìi dû Sri Lanka + Rupìa dû Sri Lanka + rupìa dû Sri Lanka + rupìi dû Sri Lanka - Dòllaru dâ Libberia - dòllaru dâ Libberia - dòllari dâ Libberia + Dòllaru dâ Libberia + dòllaru dâ Libberia + dòllari dâ Libberia - Loti dû Lisothu - loti dû Lisothu - loti dû Lisothu + Loti dû Lisothu + loti dû Lisothu + loti dû Lisothu - Dìnaru lìbbicu - dìnaru lìbbicu - dìnari lìbbichi + Dìnaru lìbbicu + dìnaru lìbbicu + dìnari lìbbichi - Dirham marucchinu - dirham marucchinu - dirham marucchini + Dirham marucchinu + dirham marucchinu + dirham marucchini - Leu murdavu - leu murdavu - lei murdavi + Leu murdavu + leu murdavu + lei murdavi - Ariary margasciu - ariary margasciu - ariary margasci + Ariary margasciu + ariary margasciu + ariary margasci - Dìnaru macèduni - dìnaru macèduni - dìnari macèduni + Dìnaru macèduni + dìnaru macèduni + dìnari macèduni - Kyat dû Myanmar - kyat dû Myanmar - kyat dû Myanmar + Kyat dû Myanmar + kyat dû Myanmar + kyat dû Myanmar - Tugrik mòngulu - tugrik mòngulu - tugrik mònguli + Tugrik mòngulu + tugrik mòngulu + tugrik mònguli - Pataca di Macau - pataca di Macau - patachi di Macau + Patacca di Macau + patacca di Macau + patacchi di Macau - Ouguiya mauritanu - ouguiya mauritanu - ouguiya mauritani + Ouguiya mauritanu + ouguiya mauritanu + ouguiya mauritani - Rupìa di Mauritius - rupìa di Mauritius - rupìi di Mauritius + Rupìa di Mauritius + rupìa di Mauritius + rupìi di Mauritius - Rufiyaa dî Mardivi - rufiyaa dî Mardivi - rufiyaa dî Mardivi + Rufiyaa dî Mardivi + rufiyaa dî Mardivi + rufiyaa dî Mardivi - Kwacha dû Malawi - kwacha dû Malawi - kwacha dû Malawi + Kwacha dû Malawi + kwacha dû Malawi + kwacha dû Malawi - Pesu missicanu - pesu missicanu - pesi missicani + Pesu missicanu + pesu missicanu + pesi missicani - Ringgit malisi - ringgit malisi - ringgit malisi + Ringgit malisi + ringgit malisi + ringgit malisi - Mètical dû Muzzammicu - mètical dû Muzzammicu - mètical dû Muzzammicu + Mètical dû Muzzammicu + mètical dû Muzzammicu + mètical dû Muzzammicu - Dòllaru dâ Namibbia - dòllaru dâ Namibbia - dòllari dâ Namibbia + Dòllaru dâ Namibbia + dòllaru dâ Namibbia + dòllari dâ Namibbia - Naira niggirianu - naira niggirianu - naira niggiriani + Naira niggirianu + naira niggirianu + naira niggiriani - Còrdubba dâ Nicaragua - còrdubba dâ Nicaragua - còrdubba dâ Nicaragua + Còrdubba dû Nicaragua + còrdubba dû Nicaragua + còrdubba dû Nicaragua - Curuna nurviggisi - curuna nurviggisi - curuni nurviggisi + Curuna nurviggisi + curuna nurviggisi + curuni nurviggisi - Rupìa nipalisi - rupìa nipalisi - rupìi nipalisi + Rupìa nipalisi + rupìa nipalisi + rupìi nipalisi - Dòllaru dâ Nova Zilannia - dòllaru dâ Nova Zilannia - dòllari dâ Nova Zilannia + Dòllaru dâ Nova Zilannia + dòllaru dâ Nova Zilannia + dòllari dâ Nova Zilannia - Riali di l’Oman - riali di l’Oman - riali di l’Oman + Riali di l’Oman + riali di l’Oman + riali di l’Oman - Barboa di Pànama - barboa di Pànama - barboa di Pànama + Barboa di Pànama + barboa di Pànama + barboa di Pànama - Suli piruvianu - suli piruvianu - suli piruvianu + Suli piruvianu + suli piruvianu + suli piruvianu - Kina dâ Papua Nova Guinìa - kina dâ Papua Nova Guinìa - kina dâ Papua Nova Guinìa + Kina dâ Papua Nova Guinìa + kina dâ Papua Nova Guinìa + kina dâ Papua Nova Guinìa - Pesu filippinu - pesu filippinu - pesi filippini + Pesu filippinu + pesu filippinu + pesi filippini - Rupìa pakistana - rupìa pakistana - rupìi pakistani + Rupìa pakistana + rupìa pakistana + rupìi pakistani - Zloty pulaccu - zloty pulaccu - zloty pulacchi + Zloty pulaccu + zloty pulaccu + zloty pulacchi - Guaranì dû Paraguay - guaranì dû Paraguay - guaranì dû Paraguay + Guaranì dû Paraguay + guaranì dû Paraguay + guaranì dû Paraguay - Riali dû Qatar - riali dû Qatar - riali dû Qatar + Riali dû Qatar + riali dû Qatar + riali dû Qatar - Leu rumenu - leu rumenu - lei rumeni + Leu rumenu + leu rumenu + lei rumeni - Dìnaru serbu - dìnaru serbu - dìnari serbi + Dìnaru serbu + dìnaru serbu + dìnari serbi - Rubblu russu - rubblu russu - rubbli russi + Rubblu russu + rubblu russu + rubbli russi - Francu dû Ruanna - francu dû Ruanna - franchi dû Ruanna + Francu dû Ruanna + francu dû Ruanna + franchi dû Ruanna - Riali di l’Arabbia Saudita - riali di l’Arabbia Saudita - riali di l’Arabbia Saudita + Riali di l’Arabbia Saudita + riali di l’Arabbia Saudita + riali di l’Arabbia Saudita - Dòllaru di l’Ìsuli Salumuni - dòllaru di l’Ìsuli Salumuni - dòllari di l’Ìsuli Salumuni + Dòllaru di l’Ìsuli Salumuni + dòllaru di l’Ìsuli Salumuni + dòllari di l’Ìsuli Salumuni - Rupìa dî Seychelles - rupìa dî Seychelles - rupìi dî Seychelles + Rupìa dî Seychelles + rupìa dî Seychelles + rupìi dî Seychelles - Stirlina sudanisi - stirlina sudanisi - stirlini sudanisi + Stirlina sudanisi + stirlina sudanisi + stirlini sudanisi - Curuna svidisi - curuna svidisi - curuni svidisi + Curuna sbidisi + curuna sbidisi + curuni sbidisi - Dòllaru di Singapuri - dòllaru di Singapuri - dòllari di Singapuri + Dòllaru di Singapuri + dòllaru di Singapuri + dòllari di Singapuri - Stirlina di Sant’Èlina - stirlina di Sant’Èlina - stirlini di Sant’Èlina + Stirlina di Sant’Èlina + stirlina di Sant’Èlina + stirlini di Sant’Èlina - Liuni dâ Sierra Liuni - liuni dâ Sierra Liuni - liuna dâ Sierra Liuni + Liuni dâ Sierra Liuni + liuni dâ Sierra Liuni + liuna dâ Sierra Liuni - Liuni dâ Sierra Liuni (1964—2022) - liuni dâ Sierra Liuni (1964—2022) - liuna dâ Sierra Liuni (1964—2022) + Liuni dâ Sierra Liuni (1964—2022) + liuni dâ Sierra Liuni (1964—2022) + liuna dâ Sierra Liuni (1964—2022) - Scillinu sòmalu - scillinu sòmalu - scillini sòmali + Scillinu sòmalu + scillinu sòmalu + scillini sòmali - Dòllaru dû Surinami - dòllaru dû Surinami - dòllari dû Surinami + Dòllaru dû Surinami + dòllaru dû Surinami + dòllari dû Surinami - Stirlina dû Sudan di sciroccu - stirlina dû Sudan di sciroccu - stirlini dû Sudan di sciroccu + Stirlina dû Sudan di sciroccu + stirlina dû Sudan di sciroccu + stirlini dû Sudan di sciroccu - Dobra di São Tomé & Príncipe - dobra di São Tomé & Príncipe - dobra di São Tomé & Príncipe + Dobra di São Tomé & Príncipe + dobra di São Tomé & Príncipe + dobra di São Tomé & Príncipe - Stirlina siriana - stirlina siriana - stirlini siriani + Stirlina siriana + stirlina siriana + stirlini siriani - Lilangeni di Eswatini - lilangeni di Eswatini - lilangeni di Eswatini + Lilangeni di Eswatini + lilangeni di Eswatini + lilangeni di Eswatini - Baht tailannisi - baht tailannisi - baht tailannisi + Baht tailannisi + baht tailannisi + baht tailannisi - Somoni dû Tajìkistan - somoni dû Tajìkistan - somoni dû Tajìkistan + Somoni dû Tajìkistan + somoni dû Tajìkistan + somoni dû Tajìkistan - Manat turkmenu - manat turkmenu - manat turkmeni + Manat turkmenu + manat turkmenu + manat turkmeni - Dìnaru tunisinu - dìnaru tunisinu - dìnari tunisini + Dìnaru tunisinu + dìnaru tunisinu + dìnari tunisini - Tongan Paʻanga - Tongan paʻanga - Tongan paʻanga + Tongan Paʻanga + Tongan paʻanga + Tongan paʻanga - Lira turca - lira turca - liri turchi + Lira turca + lira turca + liri turchi - Dòllaru di Trinidad e Tobago - dòllaru di Trinidad e Tobago - dòllari di Trinidad e Tobago + Dòllaru di Trinidad e Tobago + dòllaru di Trinidad e Tobago + dòllari di Trinidad e Tobago - Novu dòllaru taiwanisi - novu dòllaru taiwanisi - novi dòllari taiwanisi + Novu dòllaru taiwanisi + novu dòllaru taiwanisi + novi dòllari taiwanisi - Scillinu dâ Tanzania - scillinu dâ Tanzania - scillini dâ Tanzania + Scillinu dâ Tanzania + scillinu dâ Tanzania + scillini dâ Tanzania - Grivnia ucràina - grivnia ucràina - grivni ucràini + Grivnia ucràina + grivnia ucràina + grivni ucràini - Scillinu di l’Uganna - scillinu di l’Uganna - scillini di l’Uganna + Scillinu di l’Uganna + scillinu di l’Uganna + scillini di l’Uganna - Dòllaru miricanu - dòllaru miricanu - dòllari miricani + Dòllaru miricanu + dòllaru miricanu + dòllari miricani - Pesu di l’Uruguay - pesu di l’Uruguay - pesi di l’Uruguay + Pesu di l’Uruguay + pesu di l’Uruguay + pesi di l’Uruguay - Som di l’Uzbèkistan - som di l’Uzbèkistan - som di l’Uzbèkistan + Som di l’Uzbèkistan + som di l’Uzbèkistan + som di l’Uzbèkistan - Bulivar dû Vinizzuela - bulivar dû Vinizzuela - bulivar dû Vinizzuela + Bulivar dû Vinizzuela + bulivar dû Vinizzuela + bulivar dû Vinizzuela - Dong vietnamisi - dong vietnamisi - dong vietnamisi + Dong vietnamisi + dong vietnamisi + dong vietnamisi - Vatu di Vanuatu - vatu di Vanuatu - vatu di Vanuatu + Vatu di Vanuatu + vatu di Vanuatu + vatu di Vanuatu - Tala samuanu - Tala samuanu - Tala samuani + Tala samuanu + Tala samuanu + Tala samuani - Francu CFA di l’Àfrica cintrali - francu CFA di l’Àfrica cintrali - franchi CFA di l’Àfrica cintrali + Francu CFA di l’Àfrica cintrali + francu CFA di l’Àfrica cintrali + franchi CFA di l’Àfrica cintrali - Dòllaru dî Caraibbi di livanti - dòllaru dî Caraibbi di livanti - dòllari dî Caraibbi di livanti + Dòllaru dî Caraibbi di livanti + dòllaru dî Caraibbi di livanti + dòllari dî Caraibbi di livanti + + + ciurinu caraìbbicu - Francu CFA di l’Àfrica di punenti - francu CFA di l’Àfrica di punenti - franchi CFA di l’Àfrica di punenti + Francu CFA di l’Àfrica di punenti + francu CFA di l’Àfrica di punenti + franchi CFA di l’Àfrica di punenti - Francu CFP - francu CFP - franchi CFP + Francu CFP + francu CFP + franchi CFP - Munita Scanusciuta - (munita scanusciuta) - (munita scanusciuta) + Munita Scanusciuta + (munita scanusciuta) + (munita scanusciuta) - Riali dû Yemen - riali dû Yemen - riali dû Yemen + Riali dû Yemen + riali dû Yemen + riali dû Yemen - Rand di l’Àfrica di Sciroccu - rand di l’Àfrica di Sciroccu - rand di l’Àfrica di Sciroccu + Rand di l’Àfrica di Sciroccu + rand di l’Àfrica di Sciroccu + rand di l’Àfrica di Sciroccu - Kwacha dâ Zammia - kwacha dâ Zammia - kwacha dâ Zammia + Kwacha dâ Zammia + kwacha dâ Zammia + kwacha dâ Zammia + + + oru dû Zimbabwe {0} jornu {0} di jorna {0} jorna + Pigghia a {0}ª a manu dritta. - - - dirizzioni - {0}L - {0}T - {0}P - - - dirizzioni - {0}L - {0}T - {0}P - - - - - dirizzioni - {0}L - {0}T - {0}P + dirizzioni + {0}L + {0}T + {0}P - hh:mm + hh:mm - hh:mm:ss + hh:mm:ss - mm:ss + mm:ss - {0} e {1} - {0} e {1} + {0} e {1} + {0} e {1} - {0} o {1} - {0} o {1} - - - {0} o {1} - {0} o {1} - - - {0} o {1} - {0} o {1} - - - {0} e {1} - {0} e {1} - - - {0} e {1} - {0} e {1} - - - {0} e {1} - {0} e {1} - - - {0} e {1} - {0} e {1} - - - {0} e {1} - {0} e {1} + {0} o {1} + {0} o {1} - se:s + se:s diff --git a/make/data/cldr/common/main/sd.xml b/make/data/cldr/common/main/sd.xml index 19b23be9f41..d3ddcdae45e 100644 --- a/make/data/cldr/common/main/sd.xml +++ b/make/data/cldr/common/main/sd.xml @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic آزربائيجاني ازري ڪينيڊا + بلوچي بالينيس باسا بيلاروسي @@ -222,6 +223,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic بافيا ڪلونئين ڪردي + ڪردي + ڪرمانجي ڪومڪ ڪومي ڪورنش @@ -569,10 +572,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic اندورا متحده عرب امارات افغانستان - انٽيگا ۽ باربد + اينٽيگا ۽ باربوڊا انگويلا البانيا - ارمینیا + آرمينيا انگولا انٽارڪٽيڪا ارجنٽينا @@ -582,7 +585,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic عروبا الند ٻيٽ آذربائيجان - بوسنيا ۽ هرزوگووينا + بوسنيا ۽ هرزيگووينا باربڊوس بنگلاديش بيلجيم @@ -601,7 +604,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ڀوٽان بووٽ ٻيٽ بوٽسوانا - بیلارس + بيلاروس بيليز ڪينيڊا ڪوڪوس ٻيٽ @@ -619,6 +622,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic چين ڪولمبيا ڪلپرٽن ٻيٽ + سارڪ ڪوسٽا ريڪا ڪيوبا ڪيپ وردي @@ -671,7 +675,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic گوام گني بسائو گيانا - هانگ ڪانگ SAR + هانگ ڪانگ SAR چين هانگ ڪانگ هرڊ ۽ مڪڊونلڊ ٻيٽ هنڊورس @@ -759,7 +763,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic فلپائن پاڪستان پولينڊ - سینٽ پیئر و میڪوئیلون + سينٽ پيئر ۽ ميڪيلون پٽڪئرن ٻيٽ پيوئرٽو ريڪو فلسطيني علائقا @@ -782,15 +786,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic سنگاپور سينٽ ھيلينا سلوینیا - سوالبارڊ ۽ جان ماین + سوالبارڊ ۽ يان ماین سلوواڪيا سيرا ليون - سین مرینو + سان مرینو سينيگال سوماليا سورينام ڏکڻ سوڊان - سائو ٽوم ۽ پرنسپیي + سائو ٽومي ۽ پرنسپیي ال سلواڊور سنٽ مارٽن شام @@ -810,7 +814,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic تيونيسيا ٽونگا ترڪييي - ٽريني ڊيڊ ۽ ٽوباگو ٻيٽ + ٽرينيڊاڊ ۽ ٽوباگو توالو تائیوان تنزانيا @@ -854,44 +858,85 @@ CLDR data files are interpreted according to the LDML specification (http://unic سڪي جو فارميٽ ترتيب ڇانٽي سڪو + ايموجي پيشڪاري ڪلاڪ سائيڪل لائن ٽوڙڻ انداز + لفظن وچ ۾ لڪير ٽوڙ ماپڻ جو نظام انگ + تخفيف کانپوءِ جملو ٽوڙ ٻڌ ڌرم جو ڪئلينڊر + ٻوڌي چيني ڪئلينڊر + چيني ڪاپٽڪ ڪئلينڊر + ڪاپٽڪ دانگي ڪئلينڊر + دانگي ايٿوپيائي ڪئلينڊر + ايٿيوپيائي ايٿوپڪ اميٽي عليم ڪئلينڊر + ايٿيوپيائي اميٽي اليم جارجيائي ڪئلينڊر + جارجيائي عبراني ڪئلينڊر + عبراني هندوستاني قومي ڪئلينڊر + هندستاني قومي هجري ڪئلينڊر + هجري هجري ڪئلينڊر (ٽيبل وارو، شهري دور) + هجري (ٽيبليائي، شهري دور) هجري ڪئلينڊر (ٽيبلر، فلڪياتي دور) + هجري (ٽيبليائي، فلڪياتي دور) هجري ڪئلينڊر (اُم القرا) + هجري (اُم القری) ISO-8601 ڪئلينڊر جاپاني ڪئلينڊر + جاپاني فارسي ڪئلينڊر + فارسي منگوو ڪئلينڊر + منگوو اڪائونٽنگ سڪو فارميٽ + اڪائونٽنگ معياري سڪو فارميٽ + معياري ڊفالٽ يوني ڪوڊ ترتيب ڇانٽي + ڊفالٽ يونيڪوڊ عام مقصد جي ڳولا + ڳولا معياري ترتيب ڇانٽي + معياري + ڊفالٽ + ايموجي + متن 12 ڪلاڪ جو سسٽم (0–11) + 12 (0–11) 12 ڪلاڪ جو سسٽم (1–12) + 12 (1–12) 24 ڪلاڪ جو سسٽم (0–23) + 24 (0–23) 24 ڪلاڪ جو سسٽم (1–24) + 24 (1–24) لوز لائن ٽوڙ انداز + ڍرو عام لائن ٽوڙ انداز + عام سخت لائن ٽوڙ انداز + سخت + سڀ ٽوڙ + سڀ رک + عام + محاورن وچ ۾ رک ميٽرڪ نظام + ميٽرڪ امپيريل ماپڻ جو نظام + برطانيا آمريڪا جو ماپڻ جو نظام + آمريڪا عربي-هندي عدد وڌايل عربي-هندي عدد ارمينيائي انگ @@ -932,6 +977,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ٿائي عدد تبتي عدد وائي انگ اکر + بند + چالو ميٽرڪ @@ -953,7 +1000,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic [ء آ ا ب ٻ پ ڀ ت ث ٺ ٽ ٿ ج {جھ} ڃ ڄ چ ڇ ح خ د ذ ڊ ڌ ڍ ڏ ر ز ڙ س ش ص ض ط ظ ع غ ف ڦ ق ک ڪ گ {گھ} ڱ ڳ ل م ن ڻ ه ھ و ي] [َ ُ ِ ئ] [ا ب ٻ پ ڀ ت ث ٺ ٽ ٿ ج {جھ} ڃ ڄ چ ڇ ح خ د ذ ڊ ڌ ڍ ڏ ر ز ڙ س ش ص ض ط ظ ع غ ف ڦ ق ک ڪ گ {گھ} ڱ ڳ ل م ن ڻ ه ھ و ي] - [⹁ ⁏ \: ! ۔ ‘ ( ) \[ \] \{ \} /] + [\- ‑ ، ؛ \: ! ؟ … ‘’ "” ( ) \[ \] ٭ /] @@ -1011,6 +1058,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + آچر + سو + اڱ + اربع + خم + جم + ڇن + آچر سومر @@ -1025,21 +1081,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic آچر سو - اڱارو + اڱ اربع خم - جمعو - ڇنڇر + جم + ڇن - Q1 - Q2 - Q3 - Q5 + پهرين ٽماهي + ٻين ٽماهي + ٽين ٽماهي + چوٿين ٽماهي پهرين ٽي ماهي @@ -1050,22 +1106,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Q1 - Q2 - Q3 - Q4 + پهرين ٽماهي + ٻين ٽماهي + ٽين ٽماهي + چوٿين ٽماهي - صبح، منجهند - شام، منجهند + صبح + شام - صبح، منجهند - منجهند، شام + صبح + شام صبح، منجهند @@ -1074,8 +1130,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic - صبح، منجهند - منجهند، شام + صبح + شام + + + صبح + شام صبح، منجهند @@ -1091,10 +1151,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic عام دور - BC - BCE - CD - CE + ق م + ع @@ -1167,7 +1225,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic + E B h + MM-y G M/d/y G + E, dd-MM-y G ھفتو W جو MMMM ھفتو W جو MMMM ھفتو w جو Y @@ -1293,7 +1354,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic پويون سال پويون سال - {0} سالن ۾ + {0} سال ۾ {0} سالن ۾ @@ -1305,11 +1366,23 @@ CLDR data files are interpreted according to the LDML specification (http://unic پوئين سال هن سال اڳين سال + + {0} سال ۾ + {0} سالن ۾ + پوئين سال هن سال اڳيئن سال + + {0}سال ۾ + {0}سالن ۾ + + + {0}سال پهرين + {0}سال پهرين + ٽي ماهي @@ -1317,21 +1390,27 @@ CLDR data files are interpreted according to the LDML specification (http://unic هن ٽي ماهي اڳين ٽي ماهي - {0} ٽي ماهي ۾ - {0} ٽي ماهي ۾ + {0} ٽماهي ۾ + {0} ٽماهين ۾ {0} ٽي ماهي پهرين {0} ٽي ماهي پهرين + + + {0} ٽماهي ۾ + {0} ٽماهين ۾ + + مهينو پوئين مهيني هن مهيني اڳين مهيني - {0} مهينن ۾ + {0} مهيني ۾ {0} مهينن ۾ @@ -1345,14 +1424,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic هن هفتي اڳين هفتي - {0} هفتن ۾ + {0} هفتي ۾ {0} هفتن ۾ - {0} هفتا پهرين + {0} هفتو پهرين {0} هفتا پهرين - {0} جي هفتي + {0} واري هفتي + + + + {0} هفتي ۾ + {0} هفتن ۾ + + + + + {0}هفتي ۾ + {0}هفتن ۾ + مهيني جي هفتي @@ -1393,12 +1484,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} آچر پهرين + + + {0} آچر ۾ + {0} آچرن ۾ + + + + + {0} آچر ۾ + {0} آچرن ۾ + + پوئين سومر هن سومر اڳين سومر - {0} سومرن ۾ + {0} سومر ۾ {0} سومرن ۾ @@ -1406,6 +1509,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} سومر پهرين + + + {0} سومر ۾ + {0} سومرن ۾ + + پوئين اڱاري هن اڱاري @@ -1419,17 +1528,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} اڱارا پهرين + + + {0} اڱاري ۾ + {0} اڱارن ۾ + + پوئين اربع هن اربع اڳين اربع - {0} اربعن ۾ - {0} اربعن ۾ + {0} اربع ۾ + {0} اربعائن ۾ - {0} اربعا پهرين - {0} اربعا پهرين + {0} اربع پهرين + {0} اربعائون پهرين + + + + + {0} اربع ۾ + {0} اربعائن ۾ + + + {0} اربع پهرين + {0} اربعائون پهرين + + + + + {0} اربع ۾ + {0} اربعائن ۾ @@ -1445,6 +1576,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} خميس پهرين + + + {0} خميس ۾ + {0} خميسن ۾ + + پوئين جمعي هن جمعي @@ -1507,11 +1644,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} منٽن ۾ + + + {0} منٽ ۾ + {0} منٽن ۾ + + سيڪنڊ هاڻي - {0} سيڪنڊن ۾ + {0} سيڪنڊ ۾ {0} سيڪنڊن ۾ @@ -1519,11 +1662,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} سيڪنڊ پهرين + + + {0} سيڪنڊ ۾ + {0} سيڪنڊن ۾ + + + + + {0} سيڪنڊ ۾ + {0} سيڪنڊن ۾ + + ٽائيم زون + GMT+؟ {0} وقت {0} ڏينهن جو وقت {0} معياري وقت @@ -1635,7 +1791,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic پاگو پاگو - وينا + ويئينا پرٿ @@ -1883,6 +2039,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ايسٽر + + ڪوئيئيڪي + پنٽا اريناس @@ -2148,10 +2307,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic فنام پينه - اينڊربري - - - ڪانٽن + ڪانٽن ٻيٽ ڪريٽمٽي @@ -2820,9 +2976,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - اولهه آفريقا جو وقت - اولهه آفريقا جو معياري وقت - اولهه آفريقا جي اونهاري جو وقت + اولهه آفريقا جو وقت @@ -3172,6 +3326,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic گيانائي وقت + + + هوائي اليوٽين جو معياري وقت + + هوائي اليوٽين جو وقت @@ -3745,63 +3904,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##0.00;(¤ #,##0.00) + + + + + + + ¤ #,##0.00;(¤ #,##0.00) + + + ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) - ¤0هزار - ¤ 0هزار - ¤0هزار - ¤ 0هزار - ¤00هزار - ¤ 00هزار - ¤00هزار - ¤ 00هزار - ¤000لک - ¤ 000لک - ¤000لک - ¤ 000لک - ¤00لک - ¤ 00لک - ¤00لک - ¤ 00لک - ¤0ڪروڙ - ¤ 0ڪروڙ - ¤0ڪروڙ - ¤ 0ڪروڙ - ¤00ڪروڙ - ¤ 00ڪروڙ - ¤00ڪروڙ - ¤ 00ڪروڙ - ¤0ارب - ¤ 0ارب - ¤0ارب - ¤ 0ارب - ¤00ارب - ¤ 00ارب - ¤00ارب - ¤ 00ارب - ¤0کرب - ¤ 0کرب - ¤0کرب - ¤ 0کرب - ¤0ٽرلين - ¤ 0ٽرلين - ¤0ٽرلين - ¤ 0ٽرلين - ¤00ٽرلين - ¤ 00ٽرلين - ¤00ٽرلين - ¤ 00ٽرلين - ¤000ٽرلين - ¤ 000ٽرلين - ¤000ٽرلين - ¤ 000ٽرلين + ¤ 0 هزار + ¤ 0 هزار + ¤ 00 هزار + ¤ 00 هزار + ¤ 000 هزار + ¤ 000 هزار + ¤ 0 ملين + ¤ 0 ملين + ¤ 00 ملين + ¤ 00 ملين + ¤ 000 ملين + ¤ 000 ملين + ¤ 0 بلين + ¤ 0 بلين + ¤ 00 بلين + ¤ 00 بلين + ¤ 000 بلين + ¤ 000 بلين + ¤ 0 ٽرلين + ¤ 0 ٽرلين + ¤ 00 ٽرلين + ¤ 00 ٽرلين + ¤ 000 ٽرلين + ¤ 000 ٽرلين @@ -4203,8 +4353,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic سیرا لیونيائي لیون (1964—2022) - سیرا لیونيائي لیون (1964—2022) - سیرا لیونيائي لیون (1964—2022) سومالي شلنگ @@ -4222,9 +4370,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic سائو ٽوم ۽ پرنسپي دوبرا - سيريائي پائونڊ + شامي پائونڊ شامي پائونڊ - سيريائي پائونڊ + شامي پائونڊ سوازي للانگيني @@ -4296,6 +4444,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic اوڀر ڪيريبين ڊالر + + ڪريبيئن گلڊر + ڪريبيئن گلڊر + ڪريبيئن گلڊر + اولهه آفريڪا فرينڪ @@ -4314,6 +4467,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic زمبائي ڪواچا + + زمبابوي سون + زمبابوي سون + زمبابوي سون + {0} ڪتاب @@ -4453,7 +4611,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} مليگرام في ڊيسيليٽر {0} ملي گرامز في ڊيسي ليٽر - + + حصا + {0} حصو + {0} حصا + + حصا في ملين {0} حصو في ملين {0} حصا في ملين @@ -4467,6 +4630,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} مول {0} مولز + + گلوڪوز جو + گلوڪوز جو {0} + گلوڪوز جو {0} + {0} ليٽرز في ڪلو ميٽر {0} ليٽرز في ڪلو ميٽر @@ -4542,18 +4710,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ٽه ماهيون - {0} ٽه ماهيون - {0} ٽه ماهيون - {0}/ٽه ماهي - {0} مهينو - {0} مهينا {0} في مهينو - {0} هفتو - {0} هفتا {0} في هفتو @@ -4752,6 +4913,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic مرڪري جو {0} ملي ميٽر مرڪري جو {0} ملي ميٽر + + مرڪيوري جو + مرڪيوري جو {0} + مرڪيوري جو {0} + پائونڊز في اسڪوائر انچ {0} پائونڊ في اسڪوائر انچ @@ -4840,20 +5006,77 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} بيريلز {0} بيريلز - - نوري - {0} نوري - {0} نوري + + اسٽيراڊيئن + {0} اسٽيراڊيئن + {0} اسٽيراڊيئن - + + ڪيٽال + {0} ڪيٽال + {0} ڪيٽال + + + ڪولمبس + {0} ڪولمب + {0} ڪولمبس + + + فيراڊ + {0} فيراڊ + {0} فيراڊ + + + هينري + {0} هينري + {0} هينري + + + سيمنز + {0} سيمنز + {0} سيمنز + + + ڪيلوريز [IT] + {0} ڪيلوريز [IT] + {0} ڪيلوريز [IT] + + + بيڪرل + {0} بيڪرل + {0} بيڪرل + + + سيورٽس + {0} سيورٽ + {0} سيورٽ + + + گري + {0} گري + {0} گري + + + ڪلوگرام فورس + {0} ڪلوگرام فورس + {0} ڪلوگرام فورس + + + ٽيسلا + {0} ٽيسلا + {0} ٽيسلا + + + ويبر + {0} ويبر + {0} ويبر + + حصا في ارب {0} حصو في ارب {0} حصا في ارب - راتيون - {0} رات - {0} راتيون {0} في رات @@ -4967,12 +5190,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} آئٽم {0} آئٽم + + حصو + {0} حصو + {0} حصو + پيرمائيرڊ مول + + Glc + {0} Glc + {0} Glc + ليٽرز في ڪلو ميٽر @@ -5371,6 +5604,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mmHg {0} mm Hg + + Hg جو + Hg جو {0} + Hg جو {0} + بار {0} بار @@ -5524,12 +5762,57 @@ CLDR data files are interpreted according to the LDML specification (http://unic بيريل + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Sv + {0} Sv + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + نوري {0} نوري {0} نوري - + حصا/ارب {0} ح ف ا {0} ح ف ا @@ -5569,7 +5852,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}m² - ص {0}ص {0}ص @@ -5580,29 +5862,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}س {0}س - {0}/س {0}ٽه ماهي {0}ٽه ماهي - {0}/ٽه ماهي مهينو {0}مهينو {0}مهينا - {0}/مهينو هفتو {0}هفتو {0}هفتا - {0}/هفتو {0}ڏينهن {0}ڏينهن - {0}/ڏينهن {0}سيڪنڊ @@ -5698,21 +5975,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} km/h {0} km/h + + cal-IT + - نوري {0}نوري {0}نوري - + ح ف ا {0}ح ف ا {0}ح ف ا - راتيون {0}رات {0}راتيون - {0}/رات @@ -5728,15 +6005,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} يا {1} - {0}، {1} {0}, {1} {0}، {1} - - {0}، {1} - - {0}، {1} {0}, {1} {0}، {1} diff --git a/make/data/cldr/common/main/sd_Deva.xml b/make/data/cldr/common/main/sd_Deva.xml index 9b331766891..280a8c48036 100644 --- a/make/data/cldr/common/main/sd_Deva.xml +++ b/make/data/cldr/common/main/sd_Deva.xml @@ -247,11 +247,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic आर्त सू मंग - बु॒ध + ॿुध विस जुम छंछ + + + सू + मं + ॿु + वि + जु + छं + आर्तवार सूमर @@ -434,15 +443,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic साल + पोएं साल + हिन साल + ईंदड़ साल टिमाही महिनो + पोएं महिने + हिन महिने + ईंदड़ महिने हफ्तो + पोएं हफ़्ते + हिन हफ़्ते + ईंदड़ हफ़्ते दीं॒हुं @@ -453,6 +471,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic हफ्ते जो दीं॒हुं + + पोएं आर्तवार + हिन आर्तवार + ईंदड़ आर्तवार + दीं॒हुं/ रातु @@ -518,6 +541,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic अटलांटिक दीं॒ह जो वक्त + + + वक़्तु + एज़ोर्स मइयारी वक़्तु + एज़ोर्स ऊनहारे जो वक़्तु + + मरकज़ी यूरोपी वक्त diff --git a/make/data/cldr/common/main/se.xml b/make/data/cldr/common/main/se.xml index bdc806c27e5..cfeb48cffa3 100644 --- a/make/data/cldr/common/main/se.xml +++ b/make/data/cldr/common/main/se.xml @@ -934,6 +934,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/se_FI.xml b/make/data/cldr/common/main/se_FI.xml index aae2f5a8890..778b687cae4 100644 --- a/make/data/cldr/common/main/se_FI.xml +++ b/make/data/cldr/common/main/se_FI.xml @@ -1190,9 +1190,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Oarje-Afrihká áigi - Oarje-Afrihká dálveáigi - Oarje-Afrihká geasseáigi + Oarje-Afrihká áigi @@ -1542,6 +1540,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyana áigi + + + Hawaii-aleuhtalaš dálveáigi + + Hawaii-aleuhtalaš áigi diff --git a/make/data/cldr/common/main/sg.xml b/make/data/cldr/common/main/sg.xml index 629d51fe367..e4d68482ec4 100644 --- a/make/data/cldr/common/main/sg.xml +++ b/make/data/cldr/common/main/sg.xml @@ -577,6 +577,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00;¤-#,##0.00 + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 + + + ¤ #,##0.00;¤-#,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/sgs.xml b/make/data/cldr/common/main/sgs.xml new file mode 100644 index 00000000000..b19983727eb --- /dev/null +++ b/make/data/cldr/common/main/sgs.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + Kalba: {0} + Skripts: {0} + Regijuons: {0} + + + + [a ā b c č d e ē ė {ė̄} f g h i ī j k l m n o ō p r s š t u ū v z ž] + [{ch} {dz} {dž}] + [A Ā B C Č D E Ē Ė {Ė̄} F G H I Ī J K L M N O Ō P R S Š T U Ū V Z Ž] + [, % ‰ + − 0 1 2 3 4 5 6 7 8 9] + [\- ‐‑ – — , ; \: ! ? . … “„ ( ) \[ \] \{ \}] + + + + + + + + + + tēp:t + nē:n + + + diff --git a/make/data/cldr/common/main/sgs_LT.xml b/make/data/cldr/common/main/sgs_LT.xml new file mode 100644 index 00000000000..c01f0c14bdb --- /dev/null +++ b/make/data/cldr/common/main/sgs_LT.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/make/data/cldr/common/main/shn.xml b/make/data/cldr/common/main/shn.xml index 75b20be6149..324f3b29bb7 100644 --- a/make/data/cldr/common/main/shn.xml +++ b/make/data/cldr/common/main/shn.xml @@ -11,22 +11,11108 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + {0}၊ {1} + - တႆး + ဢႃးၾႃႇ + ဢပ်ႇၶႃးၸီႇယႅၼ်ႇ + ဢၾရိၵၢၼ်း + ဢၵ်ႉႁဵမ် + ဢႃးၵၼ်ႇ + ဢမ်ႇႁႄးရိၵ်ႉ + ဢရၵၼိတ်ႉ + ဢူဝ်ႇပူဝ်ႇလူဝ်ႇ + လႄႇဝၼ်ႇတိၼ်း ဢႃႇရၢပ်ႉ + ဢႃႇရၢပ်ႈ + လၵ်းၸဵင် ဢႃႇရၢပ်ႈ ပၢၼ်မႂ်ႇ + မပူးၶျီႇ + ဢႃႇသမ်ႇ + ဢသူး + ဢတိူဝ်ႇရီႇယႅၼ်ႇ + ဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + ပၢတ်ႇသျ်ၵေးသ် + ပလူးၶျီႇ + ပႃးသႃႇ + ပႄႇလႃႇရုတ်ႈ + ပႅမ်ႇပႃႇ + ပႅတ်ႉထဝီႇ + ပႅၼ်းၼႃႈ + ပူႇၵႃႇရီႇယႃႇ + ႁႃႇယၼ်ႇဝီႇ + ပလူးၶျီႇ ပွတ်းတူၵ်း + ပူဝ်ႉၵျ်ပူႇရီႇ + ဢႃးၼီႈ + တႆးလမ် + ပႅမ်ပႃရႃႇ + ပင်းၵလႃႇ + ထိပႅတ်ႉ + ပၵ်းထီႇဢႃးရီႇ + ပရႅတ်ႉတၼ်ႇ + ပူဝ်တူဝ် + ပေႃးသၼီးယႃး + ဢၵ်ႉၶူးသ် + ပိူဝ်းယႅတ်ႇ + ပလိၼ်ႇ + ၶႅတ်ႇတလၼ်ႇ + ၶႅတ်ႇတူဝ်း + ဢႅတ်ႉသမ်ႇ + ၶျၵ်ႉမႃး + ၶျႅတ်ႉၶျႅၼ်ႇ + သိုပ်ႇပႂႃးၼူဝ်ႇ + ၶျီၵႃႇ + ၶျွၵ်ႉတေႃႇ + ၶျေရၵီႇ + ၶျိၵ်ႉၵသေႃး + ၶိူဝ်းတိတ်ႉသျ် ပွတ်းၵၢင် + ၶိူဝ်းတိတ်ႉသျ်၊ သူဝ်ႇရၼ်းၼီႇ + ၵေႃသီၵၼ်ႇ + ၶွပ်းထိၵ်ႇ + ၶျႅၵ်ႈ + သွမ်ႇပီႇၶရိ + ၶျၢတ်ႉသလႃးဝိၵ်ႉ + ၶျူးဝၢတ်ႇ + ဝႄးလ်သျ် + တေးၼိတ်ႉသျ် + တၢႆးတႃႇ + ၵျႃႇမၼ်ႇ + ၵျႃႇမၼ်ႇ (ဢေႃးသထရီးယႃး) + ၵျႃႇမၼ်ႇ (သဝိတ်ႈၸႃႇလႅၼ်ႇ) + ၸႃမႃႇ + တွၵ်ႉၵရိပ်ႉ + လူဝ်းဝႃးသေႃႇပီႇယႅၼ်ႇ + တူးဝႃးလႃႇ + တီႇဝႄးႁီႇ + ၵျူဝ်လႃ-ၾူင်းၼီႇ + ၸွင်းၵႃႇ + ဢႅမ်းပူး + ယူး + ၵရိတ်ႈ + ဢိင်းၵလဵတ်ႈ + ဢိင်းၵလဵတ်ႈ (ဢေႃႉသထရေးလီးယႃး) + ဢိင်းၵလဵတ်ႈ (ၶႅၼ်ႇၼေႇတႃႇ) + ဢိင်းၵလဵတ်ႈ (မိူင်းႁူမ်ႈတုမ်ႁေႃၶမ်း ပရိတ်ႈတဵၼ်ႇ) + ဢိင်းၵလဵတ်ႈ (ယူႇၶေႇ) + ဢိင်းၵလဵတ်ႈ (မိူင်းႁူမ်ႈတုမ် ဢမႄႇရိၵ) + ဢိင်းၵလဵတ်ႈ (ယူႇဢႅတ်ႉသ်) + ဢႅတ်ႉသ်ပရႅၼ်တူဝ်ႇ + သပဵၼ်ႇ + သပဵၼ်ႇ လတိၼ်ႇ ဢမႄႇရိၵၢၼ်ႇ + သပဵၼ် (ယူးရူပ်ႉ) + သပဵၼ်ႇ (မႅၵ်ႇသီႇၵူဝ်ႇ) + ဢႄႇသတူဝ်းၼီးယႃး + ပႃႉသ် + ဢဝၢၼ်တူဝ်ႇ + ပႃႇသျႃး + ပႃႇသျႃး (ဢႃႇၾၵၢၼ်ႇၼီႇသတၢၼ်ႇ) + ၾူလႃႇ + ၾိၼ်ႇလႅၼ်ႇ + ၾီလိပ်ႈပိၼ်း + ၾႄးရူဝ်းဢီးသ် + ၾရၢင်ႇသဵတ်ႈ + ၾရၢင်ႇသဵတ်ႈ (ၶႅၼ်ႇၼေႇတႃႇ) + ၾရၢင်ႇသဵတ်ႈ (သဝိတ်ႈၸႃႇလႅၼ်ႇ) + ၾရၢင်ႇသဵတ်ႈ ၶေးၵျုၼ်ႇ + ၾရီႇသီႇယႅၼ်ႇ ပွတ်းႁွင်ႇ + ၾရီႇယူးလီယႅၼ်ႇ + ၾရီႇသီႇယႅၼ်ႇ ပွတ်းတူၵ်း + ဢၢႆးရိတ်ႉသျ် + ၵႃႉ + ၵေးလိၵ်ႉ သၵွတ်ႉတိသျ် + ၵျီႉသ် + ၵလီးသီယႅၼ်ႇ + ၵႂႃႇရႃၼီး + ၵျႃႇမၼ်ႇသဝိတ်ႉ + ၵူးၵျရႃႇတီႇ + ၵတ်ႉသီး + မႅၼ်ႉ + ႁၢဝ်းသႃႇ + ႁဝၢႆႇယၼ်ႇ + ႁီးပရူး + ႁိၼ်ႇတီႇ + ႁိၼ်ႇတီႇ (လတိၼ်ႇ) + ႁိင်းၵလဵတ်ႈ + မင်းၼိဝ်းဝႃႇ + ၶရူဝ်ႇဢေးသျႃး + သေႃးပီးယႅၼ်း ပွတ်းၼိူဝ် + ႁေးသျုၼ်း ၶရီးဢူဝ်ႇ + ႁၢင်ႇၵေႇရီႇ + ဢႃႇမေးၼီးယႃး + ဢိၼ်ထႃလိၼ်းၵႂႃႇ + ဢိၼ်ႇတူဝ်ႇၼီးသျႃး + ဢိၼ်ႇထႃႇလိၼ်းၵူၺ်ႇ + ဢိၵ်ႉပူဝ်း + သိသျွၼ်ယီႈ + ဢီးတူဝ်ႇ + ဢၢႆးသလႅၼ်ႇ + ဢီႇတႃႇလီႇ + ဢီၼွၵ်းတီတုတ်ႈ + ၵျႃႇပၢၼ်ႇ + လူဝ်ၸပႅၼ်ႇ + ဢၢမ်းၵူမ်ႈပႃႇ + မၶျၢမ်း + ၵျႃးဝၼိတ်ႉ + ၵျေႃႇၵျႃႇ + ၶရႃး-ၶႄႇလ်ၽၵ်ႉ + ၶပၢႆယႂ်ႇ + ၵျူး + ၶမ်းပႃႇ + တႃယႅပ်ႉ + မၢၵ်ႈၶွၼ်းတေႇ + ၶပ်ႉပူဝႃႇတီႇယႃႇၼူဝ်ႇ + ၶႅၵ်ႉၶျီႇ + ၶႅၼ်ယင်ႇ + ၶဵင်းၵင်ႇ + ၶူဝ်းရၶျိၼ်းၼၢႆး + ၶူႇၶူးယူႇ + ၵႃးၸႅၵ်ႇ + ၵႃးၵူဝ်ႇ + ၵလႃႈလီးသုတ်ႇ + ၵႄလႅၼ်ႈၵျိၼ်ႇ + ၶမဵၼ် + ၶၼႃးတႃႇ + ၵၢဝ်းလီ + ၶွၼ်းၶႃၼီး + ၽႄႈလႄႈ + ၶႅသ်ႉမီးရီႇ + သျမ်ပလႃႇ + ပဵပ်ႉၾီးယႃး + ၵူဝ်ႇလူဝ်ၼီယႅၼ်ႇ + ၶိူဝ်းတိတ်ႉသျ် + ၶိူဝ်းတိတ်ႉသျ် + ၵူႇရမၼ်ႇၵျီႇ + ၶူဝ်းၼိတ်ႉသျ် + ၵူႇဝီႇ + ၶေးလ်ၵဵတ်ႇ + လတိၼ်ႇ + လႅင်းၵျီႇ + လၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + ၵႅၼ်တႃႇ + လီႇၵူးရီႇယႅၼ်ႇ + လၶူဝ်တႃႇ + လႃႇတိၼ်ႇ + လွမ်းပၢတ်ႉ + လိင်ႇၵႄလ်လႃႇ + လၢဝ်း + လူႇဝီႇသီႇယႃးၼႃးၶရီးဢူဝ်ႇ + လူႇရီႇ ပွတ်းႁွင်ႇ + လီႉတူႇဝေးၼီးယႃး + လတ်ႉၵေႇလီႇယႅၼ်ႇ + လူႇပႃႇ-ၵႃႇတၢၼ်ႇၵႃႇ + လူဝ် + လူးယီယႃး + လၢတ်ႈဝီႇယႃႇ + လၢတ်ႉၸ် + မၢႆႇတီႇလီႇ + မၸၢႆႇ + မူၵ်ႉသျႃႇ + မေရူႇ + မူဝ်ရိသျႅၼ်ႇ + မလၵႅတ်ႉသီႇ + မၵ်ႉၶႂႃး-မီထူဝ်ႇ + မႅတ်ႉထႃႇ + မေႃႇၶျီႇၼူဝ်ႇ + မၢဝ်းရီႇ + မီးၵမႃႇ + မႄႇၶေႇတူဝ်းၼီးယႃး + မလေႇယႃလမ်ႇ + မူင်ႇၵူဝ်းလီးယႃး + မၼိပူႇရ် + မူဝ်ႉႁၢၵ်ႇ + မရႃႉတီႇ + မလေး + မႄးလ်ထီး + မုၼ်းတင်ႈ + ၽႃႇသႃႇလၢႆလၢႆဢၼ် + မတ်ႉသ်ၶူဝ်းၵီႇ + မင်းတေႃႇ + မၢၼ်ႈ + ဢႄရၸီးယႃး + မႃၸၼ်တႃရၼ်ၼီႇ + ၶႄႇမိၼ်းၼၢၼ် + ၼႃးမႃႈ + ၼေႃႇဝူၺ်း ပွၵ်ႉၶ်မေႃႇ + ဢိၼ်တပႄႇလႃႇ ပွတ်းႁွင်ႇ + ၵျႃႇမၼ်ႇပွတ်းတႂ်ႈ + ၵျႃႇမၼ်ႇပွတ်းတႂ်ႈ (ၼႄႇတႃႇလႅၼ်ႇ) + ၼေႇပႃႇလီႇ + တၢတ်ႉၶျ် + တၢတ်ႉၶျ် (ပႄႇၵျီႇယမ်ႇ) + ၶႂႃႇသျိဝ်း + ၼေႃႇဝူၺ်း ၼၢႆးၼေႃႉၸ်ၶ် + ဢႅၼ်ၵျႅၼ်းပုၼ်း + ၼေႃႇဝူၺ်း + ဢင်းၶူဝ်း + ဢိၼ်တပႄႇလႃႇ ပွတ်းၸၢၼ်း + သူဝ်​ထူဝ်ႇ ပွတ်းႁွင်ႇ + ၼူဝ်းဝႃႇ + ၼႃးဝႁူဝ်ႇ + ၺႅၼ်ၵျႃႇ + ၺၢၼ်ၶေႃးလႄႇ + ဢွၵ်ႉသီထႅၼ်ႈ + ဢူဝ်ႇၵႃႇၼႃႇၵၼ်ႇ + ဢူဝ်ရူဝ်မူဝ် + ဢူဝ်ႇတီးယႃး + ဢေႃႈသႅတ်ႉထိၵ်ႉ + ဢူဝ်းသဵတ်ႉ + ပုၼ်ႇၵျႃႇပီႇ + ပႃပီယႃမႅၼ်းတူဝ်ႇ + ၼၢႆႇၵျီးရီးယႅၼ်းၽိတ်ႉၵျိၼ်ႇ + ပႃႇလိ + ၽိၵျိၼ်ႇ + ပူဝ်ႇလႅၼ်ႇ + ၽိတ်ႉမွၼ်းထိတ်ႉသ် + ၽရတ်ႉသီႇယႅၼ်ႇ + ၽတ်ႉသ်ျတူဝ်ႇ + ပေႃးတူႉၵၢဝ်ႇ + ပေႃးတူႉၵၢဝ်ႇ ပရႃႇၸီး + ပေႃးတူႉၵၢဝ်ႇ ယူးရူပ်ႉ + ၶႅတ်ႉၶျူႇဝႃႇ + ၶေးသ်ျ + ရၵျသထႃးၼီႇ + ရူဝ်ႇႁိၼ်ႇၵျႃႇ + ရပ်ႉၾီႇယႅၼ်ႇ + ရူဝ်မႅၼ်ႇသ်ျ + ရုၼ်းတီႇ + ရူဝ်ႇမေးၼီးယႃး + ရူဝ်ႇမေးၼီးယႃး (မေႃႇတူဝ်းဝႃး) + ရွမ်ႇပူဝ်ႇ + ရတ်ႈသျႃး + ၶိၼ်ၺႃဝၼ်းတႃႇ + ရဝႃ + သၼ်းသၶရိတ်ႉ + ယႃႇၵုတ်ႉ + သႅမ်ပူးရူး + သၼ်ႇတႃႇလီႇ + သၼ်ၵူး + သႃတီးၼီးယႅၼ်း + သီႇသီးလီးယႅၼ်း + သိၼ်းတီႇ + ၶိူဝ်းတိတ်ႉသ်ျ ပွတ်းၸၢၼ်း + သႃးမီး ပွတ်းႁွင်ႇ + သႄၼႃႇ + ၶူဝ်ရႃပူဝ်ႇရူဝ်ႇသႅၼ်ၼီႇ + သၼ်ၵူဝ်ႇ + သမူဝ်ႇၵျိတ်ႉသျၼ်ႇ + တႃႉၶျႄႇလ်ႁိတ်ႉ + တႆး + သိၼ်ႁႃးလႃႇ + သီတႃးမူဝ်း + သလူဝ်ႇဝၵ်ႉ + သရၢႆးၵီႇ + သလူဝ်ႇဝီးၼီးယႃး + သႃးမီး ပွတ်းၸၢၼ်း + လူးသႅမ်းမီး + ဢိၼ်းၼရီႇသႃးမီး + သၵွတ်ႉသႃးမီး + သျူဝ်းၼႃႇ + သူဝ်ႇမႃႇလီႇ + ဢႃႇပႃးၼီးယႃး + သႃးပီးယႃး + သဝႃတီ + သႁူဝ်ႇ + သူဝ်ထူဝ်ႇ ပွတ်းၸၢၼ်း + သုၼ်းတၼိတ်ႉသ် + သုၼ်ႇဝႃႇ + သုၺ်းတိတ်ႉသျ် + သုၺ်ႇႁီးလီႇ + သုၺ်ႇႁီးလီႇ (ၶွင်ႇၵူဝ်ႇ - ၶိၼ်သျႃးသႃႇ) + သီးရီးဢႅၵ်ႉ + သၢႆလီးသီႇယႅၼ်ႇ ပွတ်းတႂ်ႈ + တမီးလ် + ထႄးလူႇၵူႇ + ထႄးသူဝ်ႇ + တႃၵျိၵ်ႉ + ထႆး + ထီႇၵရိၼ်းၺႃႇ + ထီးၵရီႇ + ထၢၵ်ႉမႅၼ်ႇ + သဝႃးၼႃႇ + ထွင်းၵၼ်ႇ + ထူဝ်ႇၶီႇၽူဝ်းၼႃႇ + ထွၵ်ႉၽိသိၼ်ႇ + တိူဝ်ႇၵီႇ + တႃႇရူဝ်ႇၵူဝ်ႇ + ထေႃးဝႃႇလီႇ + သွင်းၵႃႇ + ထထႃး + ထႅတ်ႉသဝၢၵ်ႉ + ထူးဝႃႇ + ဢတ်ႉလႅတ်ႉ ထမၸိတ်ႉ ပွတ်းၵၢင် + ဝီႇၵႃႇ + ယူႇၶရဵၼ်း + ဢမ်ႇႁူႉၸၵ်း ၽႃႇသႃႇ + ဢူးတူႇ + ဢူးၸပၵ်ႉ + ဝၢႆး + ဝႅၼ်းတႃႇ + ဝႅၼ်ႇၼီးသျၼ်ႇ + ဝႅတ်ႉၼမ်း + မၵ်ႉၶႂႃး + ဝေႃးလၽုၵ်း + ဝၼ်ၵျူဝ် + ဝေႃးလုၼ်း + ဝေႃးသႃႇ + ဝူဝ်လေတႃႇ + ဝေႃးပီႇရီႇ + ဝေႃးလွပ်ႇ + ႁူဝ်းသႃႇ + ၵင်ႇၵရီႇ + သူဝ်းၵႃႇ + ယၢင်းပႅၼ် + ယိတ်ႉတိတ်ႉသျ် + ယေႃးရူႇပႃႇ + ၼိၼ်းၵႃတူႇ + ၶႅၼ်းထူၼ်းၼိတ်ႉသ် + ၸႂၢင်ႈ + လၵ်းၸဵင် မူဝ်ရူဝ်ၵၼ်ႇ ထမၸိတ်ႉ + ၶႄႇ + ၶႄႇ (ပၢၼ်မႂ်ႇ) + ၶႄႇမၼ်းတရိၼ်း ပၢၼ်မႂ်ႇ + ၶႄႇ (ပၢၼ်ၵဝ်ႇ) + ၸူးလူး + ဢမ်ႇမီးၶေႃႈၼမ်းၽႃႇသႃႇ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - မျၢၼ်ႇမႃႇ (မိူင်းမၢၼ်ႈ) - မိူင်းထႆး + ၵမ်ႇၽႃႇ + ဢႃႇၾရိၵ + ဢမႄႇရိၵႁွင်ႇ + ဢမႄႇရိၵၸၢၼ်း + ဢူဝ်းသီးၼီးယႃး + ဢႃႇၾရိၵ ပွတ်းတူၵ်း + ဢမႄႇရိၵ ပွတ်းၵၢင် + ဢႃႇၾရိၵ ပွတ်းဢွၵ်ႇ + ဢႃႇၾရိၵ ပွတ်းႁွင်ႇ + ဢႃႇၾရိၵ တွၼ်ႈၵၢင် + ဢႃႇၾရိၵ ပွတ်းၸၢၼ်း + ဢမႄႇရိၵ + ဢမႄႇရိၵ ပွတ်းႁွင်ႇ + ၶႃႇရိပ်ႈပီႇယၼ်ႇ + ဢေးသျႃး ပွတ်းဢွၵ်ႇ + ဢေးသျႃး ပွတ်းၸၢၼ်း + ဢေးသျႃး ၸဵင်ႇၸၢၼ်းဝၼ်းဢွၵ်ႇ + ယူးရူပ်ႉ ပွတ်းၸၢၼ်း + ဢေႃႉသထရႃႇလေးသျႃး + မႄႇလၼ်ႇၼီးသျႃး + ၼႃႈလိၼ် မၢႆႇၶရူဝ်ႇၼေးသျၼ်း + ပေႃႇလီႇၼေးသျႃး + ဢေးသျႃး + ဢေးသျႃး ပွတ်းၵၢင် + ဢေးသျႃး ပွတ်းတူၵ်း + ယူးရူပ်ႉ + ယူးရူပ်ႉ ပွတ်းဢွၵ်ႇ + ယူးရူပ်ႉ ပွတ်းႁွင်ႇ + ယူးရူပ်ႉ ပွတ်းတူၵ်း + ဢႃႇၾရိၵ သႃႇႁႃႇရၽႄ + လတိၼ်ႇ ဢမႄႇရိၵ + ၵုၼ်ဢေႇသႅၼ်းသျိၼ်ႇ + ဢႅၼ်ႇတူဝ်ႇရႃႇ + မိူင်းႁူမ်ႈတုမ် ၸဝ်ႈၾႃႉ ဢႃႇရၢပ်ႈ + ဢႃႇၾၵၢၼ်ႇၼီႇသတၢၼ်ႇ + ဢႅၼ်ႇထီႇၵႂႃႇ လႄႈ ပႃႇပူးတႃႇ + ဢႅၼ်ႇၵုၺ်ႇလႃႇ + ဢႃႇပႃးၼီးယႃး + ဢႃႇမေးၼီးယႃး + ဢႅၼ်ႇၵူဝ်ႇလႃႇ + ဢႅၼ်ႇတၢၵ်ႈတီးၵႃႈ + ဢႃႇၵျႅၼ်ႇတီးၼႃး + သႃႇမူဝ်းဝႃႇ ၶွ​င် ဢမႄႇရိၵၢၼ်ႇ + ဢေႃးသထရီးယႃး + ဢေႃႉသထရေးလီးယႃး + ဢႃႇရူးပႃး + မူႇၵုၼ် ဢေႃးလႅၼ်ႇ + ဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + ပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး + ပႃးပေႇတူတ်ႈ + ပင်းၵလႃးတဵတ်ႈ + ပႄႇၵျီႇယမ်ႇ + ပူႇၵီႇၼႃးၾႃးသူဝ်ႇ + ပူႇၵႃႇရီႇယႃႇ + ပႃႇရဵၼ်း + ပူႇရုၼ်းတီႇ + ပႄႇၼိၼ်း + သဵင်ႉပႃႇထႄးလႄႇမီႇ + ပႃႇမိဝ်းတႃး + ပရူႇၼၢႆး + ပူဝ်ႇလီးပီးယႃး + ၼႄႇတႃႇလႅၼ်ႇ တီႈ ၶႃႇရိပ်ႈပီႇယၼ်ႇ + ပရႃႇၸီး + ပႃႇႁႃးမႃး + ၽူႇတၢၼ်ႇ + မူႇၵုၼ် ပူးဝႅတ်ႉ + ပွတ်ႉသဝႃႇၼႃႇ + ပႄႇလႃႇရုတ်ႈ + ပႄႇလိတ်ႈ + ၶႅၼ်ႇၼေႇတႃႇ + မူႇၵုၼ် ၶူဝ်းၵတ်ႉ (ၶီးလိင်း) + ၶွင်ႇၵူဝ်ႇ - ၶိၼ်သျႃးသႃႇ + ၶွင်ႇၵူဝ်ႇ (DRC) + မိူင်းႁူမ်ႈပွင်လူၺ်ႈၵူၼ်းလၢႆ ဢႃႇၾရိၵ ပွတ်းၵၢင် + ၶွင်ႇၵူဝ်ႇ - ပရႃၸဝီးလ် + ၶွင်ႇၵူဝ်ႇ (မိူင်းႁူမ်ႈပွင်လူၺ်ႈၵူၼ်းလၢႆ) + သဝိတ်ႈၸႃႇလႅၼ်ႇ + ဢၢႆႇဝူဝ်ႇရီႇၶူတ်ႈ + မူႇၵုၼ် ၶုၵ်ႈ + ၶျီႇလီႇ + ၶႅမ်းမႃးရုၼ်း + ၶႄႇ + ၵူဝ်ႇလမ်ႇပီႇယႃႇ + ၵုၼ်ၶလိပ်ႉပႃႇတၼ်ႇ + သၢၵ်ႉၶ် + ၵေႃးသတႃႇရိၵႃႇ + ၵူးပႃး + ၶဵပ်ႉဝႄႇတီႇ + ၵူးရႃႇသၢဝ်ႇ + ၵုၼ်ၶရိတ်ႉသမၢတ်ႉ + သၢႆႉပရႅတ်ႈ + ၶျႅၵ်ႈ + မိူင်းၸွမ်ပွင်ၸိုင်ႈ ၶျႅၵ်ႈ + ၵျႃႇမၼီႇ + တီႇယေးၵူဝ်း ၵရႃႇသီးယႃး + ၵျီႇပူးတီႇ + တႅၼ်းမၢၵ်ႈ + တူဝ်ႇမီႇၼိၵ + တူဝ်ႇမီႇၼီႇၵၼ်ႇ + ဢႄးၵျီးရီးယႃး + သူးတ လႄႈ မႄႇလီႇလႃႇ + ဢေႇၵႂႃႇတေႃႇ + ဢႄႇသတူဝ်းၼီးယႃး + ဢီးၵျိပ်ႈ + သႃႇႁႃႇရႃႇ ပွတ်းတူၵ်း + ဢႄႇရီႇထရီးယႃး + သပဵၼ်ႇ + ဢီႇတီႇယူဝ်းပီးယႃး + ၸုမ်းၽွမ်ႉႁူမ်ႈ ယူးရူပ်ႉ + ၸူၼ်ႇယူးရူပ်ႉ + ၾိၼ်ႇလႅၼ်ႇ + ၾီႇၵျီႇ + မူႇၵုၼ် ၾွၵ်ႉလႅၼ်ႇ + မူႇၵုၼ် ၾွၵ်ႉလႅၼ်ႇ (ဢၢႆးသလတ်ႉသ် မႄႇလ်ဝီးၼတ်ႉသ်) + ၼႃႈလိၼ် မၢႆႇၶရူဝ်ႇၼေးသျၼ်း + မူႇၵုၼ် ၾႄးရူဝ်း + ၾရၢင်ႇသဵတ်ႈ + ၵႄးပုၼ်ႇ + မိူင်းႁူမ်ႈတုမ်ႁေႃၶမ်း ပရိတ်ႈတဵၼ်ႇ + ယူႇၶေႇ + ၵရႄႇၼႃႇတႃႇ + ၵျေႃႇၵျႃႇ + ၵုၺ်ႇယႃႇၼႃႇ ၶွင် ၾရၢင်ႇသဵတ်ႈ + ၵႂၢၼ်းသီ + ၵႃႇၼႃႇ + ၵျီႇပရေႃးတႃး + ၵရိၼ်းလႅၼ်း + ၵမ်ႇပီးယႃး + ၵီးၼီး + ၵႂႃးတီႇလုပ်ႈ + ဢီႇၵူၺ်ႇတေႃႇရီႇယႃႇ ၵီးၼီး + ၵရိတ်ႈ + ၵျေႃႇၵျႃႇ ပွတ်းၸၢၼ်း လႄႈ မူႇၵုၼ် သၢၼ်းဝိတ်ႉ ပွတ်းၸၢတ်း + ၵႂႃႇတမႃႇလႃႇ + ၵႂၢမ်ႇ + ၵီးၼီး-ပိတ်ႈသၢဝ်ႇ + ၵၢႆႇယႃးၼႃႇ + ႁွင်းၵွင်း ၼႃႈလိၵ်ႈဢုပ်ႉပိူင်ႇၶိုၵ်ႉတွၼ်း ၶႄႇ + ႁွင်းၵွင်း + မူႇၵုၼ် ႁိူတ်ႉ လႄႈ မူႇၵုၼ် မႅၵ်ႇတေႃႇၼႄႇ + ႁွၼ်ႇတူးရႅတ်ႈ + ၶရူဝ်ႇဢေးသျႃး + ႁေးတီႇ + ႁၢင်ႇၵေႇရီႇ + မူႇၵုၼ် ၶႅၼ်ႇၼရီႇ + ဢိၼ်ႇတူဝ်ႇၼီးသျႃး + ဢၢႆႇယႃႇလႅၼ်ႇ + ဢိတ်ႇသရေး + ၵုၼ်မႅၼ်း + ဢိၼ်းတီးယႃး + ၼႃႈလိၼ် သမုၵ်ႉတရႃႇဢိၼ်းတီးယႃး ၶွင် ဢိင်းၵလဵတ်ႈ + မူႇၵုၼ်ၶျႃးၵူဝ်ႉသ် + ဢီႇရၢၵ်ႈ + ဢီႇရၢၼ်း + ဢၢႆးသလႅၼ်ႇ + ဢီႇတႃႇလီႇ + ၵျႃႇသီႇ + ၵျႃႇမေႇၵႃႇ + ၵျေႃႇတၼ်ႇ + ၵျႃႇပၢၼ်ႇ + ၶႅၼ်ႇၺႃႇ + ၵႃႇၵိတ်ႈသတၼ်ႇ + ၵမ်ႇပေႃးတီးယႃး + ၵိရိပတီႇ + ၶူဝ်ႇမူဝ်ႇရူတ်ႈ + သဵင်ႉၶိတ်ႈ လႄႈ ၼႄးဝိတ်ႈ + ၵၢဝ်းလီႁွင်ႇ + ၵၢဝ်းလီၸၢၼ်း + ၶူႇဝဵတ်ႈ + မူႇၵုၼ် ၶေးမႅၼ်း + ၵႃႇၸၢၵ်ႈသတၼ်ႇ + လၢဝ်း + လႄႇပႃႇၼွၼ်ႇ + သဵင်ႉလူႉသျႃႇ + လိၵ်ႈတိၼ်ႇသတၢႆႇ + သီႇရိလင်းၵႃ + လၢႆႇပေးရီးယႃး + လႄႇသူဝ်းတူဝ်ႇ + လီႉတူႇဝေးၼီးယႃး + လၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + လၢတ်ႈဝီႇယႃႇ + လိပ်ႉပျႃး + မေႃႇရူဝ်ႇၵူဝ်ႇ + မူဝ်ႇၼႃႉၶူဝ်ႇ + မေႃႇတူဝ်းဝႃး + မွၼ်ႇတေႇၼေးၵရူဝ်ႇ + သဵင်ႉမႃႇတိၼ် + မၢတ်ႈတႃႇၵၢတ်ႈသၵႃႇ + မူႇၵုၼ် မႃးသျႄႇ + မႄႇၶေႇတူဝ်းၼီးယႃးႁွင်ႇ + မႃႇလီႇ + မျၢၼ်ႇမႃႇ (မိူင်းမၢၼ်ႈ) + မူင်ႇၵူဝ်းလီးယႃး + မႃႇၵၢဝ်ႈ ၼႃႈလိၼ်ဢုပ်ႉပိူင်ႇၶိုၵ်ႉတွၼ်း ၶႄႇ + မႃႇၵၢဝ်ႈ + မူႇၵုၼ် မေႇရီႇယႃႇၼႃႇ ပွတ်းႁွင်ႇ + မႃးတိၼ်ႇၼိၵ်ႈ + မေႃႇရီႇတေးၼီးယႃး + မွၼ်းသိူဝ်းရၢတ်ႈ + မေႃးတႃႇ + မေႃးရီႇသႃႇ + မေႃႇတိပ်ႈ + မႃႇလႃႇဝီႇ + မႅၵ်ႇသီႇၵူဝ်ႇ + မလေးသျႃး + မူဝ်ႇၸမ်းပိၵ်ႈ + ၼႃႇမီးပီးယႃး + ၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + ၼၢႆးၵျႃး + ၵုၼ်ၼေႃႇၾုၵ်ႉ + ၼၢႆႇၵျီးရီးယႃး + ၼီႇၵႃႇရႃႇၵႂႃႇ + ၼႄႇတႃႇလႅၼ်ႇ + ၼေႃႇဝူၺ်း + ၼေႇပေႃး + ၼၢဝ်ရူး + ၼီးဝႄႇ + ၼိဝ်းၸီႇလႅၼ်ႇ + ဢဝ်တႄးရူဝ်း ၼိဝ်းၸီႇလႅၼ်ႇ + ဢူဝ်ႇမၢၼ်ႇ + ပႃႈၼႃးမႃး + ပေႇရူႉ + ပေႃႇလီႇၼေးသျႃး ၶွင် ၾရၢင်ႇသဵတ်ႈ + ပႃးပႂႃႇၼိဝ်းၵီးၼီး + ၾီလိပ်ႈပိၼ်း + ပႃႇၵိတ်ႈသတၼ်ႇ + ပူဝ်ႇလႅၼ်ႇ + သဵင်ႉပီးယႃး လႄႈ မိၵ်ႈၵွႆႇလွၼ်ႇ + မူႇၵုၼ် ၽိတ်ႉၶႅၼ်ႇ + ပေႃႇတူဝ်ႇရီးၵူဝ်း + ၼႃႈလိၼ် ပႃႇလႅတ်ႇသတိၼ်းၼီးယႅၼ်း + ပႃးလဵတ်ႈသတၢႆး + ပေႃးတူႉၵၢဝ်ႇ + ပႃႇလၢဝ်း + ပႃႇရႃႇၵူၺ်း + ၶႃႇတႃႇ + ဢွၵ်ႉလၢႆးယိၼ်း ဢူဝ်းသီးၼီးယႃး + ရေႇၼီႇယၼ်ႇ + ရူဝ်ႇမေးၼီးယႃး + သႃးပီးယႃး + ရတ်ႈသျႃး + ရဝၢၼ်းတႃႇ + သေႃႇတီႇဢႃႇရေးပီးယႃး + မူႇၵုၼ် သေႃႇလေႃႇမၼ်ႇ + သေးသျႄႇ + သူႇတၼ်ႇ + သုၺ်ႇတိၼ်ႇ + သိင်ႇၵႃႇပူဝ်ႇ + သဵင်ႉႁႄးလႄးၼႃႇ + သလူဝ်ႇဝေးၼီးယႃး + သဝႃးလ်ပၢတ်ႇ လႄႈ ၸၼ်မၢႆးယႅၼ်ႇ + သလူဝ်ႇဝႃးၵီးယႃး + သီႇဢႄႇရႃႇလီႇယူၼ်ႇ + သၼ်းမႃႇရီႇၼေႃႇ + သီႇၼီႇၵႃႇ + သူဝ်ႇမႃႇလီႇယႃး + သျူးရီးၼႃႇမႄႇ + သူႇတၼ်ႇၸၢၼ်း + သူၼ်ႇတူဝ်ႇမေး လႄႈ ပရိၼ်ႇသီႇပေႇ + ဢႄႇသႃႇဝႃႇတေႃႇ + သိၼ်ႉမႃႇတိၼ်ႇ + သီးရီးယႃး + ဢႅတ်ႇသ်ဝႃႇတီးၼီႇ + သႂႃႇၸီႇလႅၼ်ႇ + ထရီႇသၼ်ႇ တႃႇ ၶုၼ်းၺႃႇ + မူႇၵုၼ် ထၢၵ်ႈ လႄႈ ၶေးၶတ်ႉ + ၶျၢတ်ႈ + ၼႃႈလိၼ် ၾရၢင်ႇသဵတ်ႈ ပွတ်းၸၢၼ်း + ထူဝ်းၵူဝ်ႇ + မိူင်းထႆး + တႃႇၵျီႇၵီႇသတၼ်ႇ + ထူဝ်းၵေႇလၢဝ်ႇ + တီႇမေႃး-လႅတ်ႉသ်တႄး + တီႇမေႃးပွတ်းဢွၵ်ႇ + တၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + တူႇၼီးသျႃး + ထွင်းၵႃႇ + တိူဝ်ႇၵီႇ + ထရီႇၼီႇတၢတ်ႈ လႄႈ ထူဝ်ႇပေးၵူဝ်ႇ + ထူးဝႃႇလူႇ + ထၢႆႇဝၢၼ်း + ထၼ်ႇၸၼ်းၼီးယႃး + ယူႇၶရဵၼ်း + ယူႇၵၼ်ႇတႃႇ + မူႇၵုၼ်ဢွၼ်ႇ ဢၼ်မီးၽၢႆႇၼွၵ်ႈ ယူႇဢႅတ်ႉသ် + ၸၢတ်ႈၸိုင်ႈလုမ်ႈၾႃႉ + မိူင်းႁူမ်ႈတုမ် ဢမႄႇရိၵ + ယူႇဢႅတ်ႉသ် + ဢုရုၵူၺ်း + ဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + ဝႃႇတီႇၵၼ်ႇသီးတီး + သဵင်ႉဝိၼ်းသႅၼ်ႉ လႄႈ ၵရႄးၼႃးတိၼ်း + ဝႄႇၼေႇၸွႆးလႃး + မူႇၵုၼ် ဝႃႇၵျိၼ်ႇ ၶွင် ဢိင်းၵလဵတ်ႈ + မူႇၵုၼ် ဝႃႇၵျိၼ်ႇ ၶွင် ယူႇဢႅတ်ႉသ် + ဝႅတ်ႉၼမ်း + ဝႅၼ်ႇၼူးဝႃႇထူႇ + ဝႃးလိတ်ႈ လႄႈ ၾူႇတူးၼႃး + သႃႇမူဝ်းဝႃႇ + သူႇတူဝ်ႇ-ဢႅၵ်ႉသႅၼ်ႉ + သူႇတူဝ်ႇ-ပီးတီႇ + ၵူဝ်ႇသူဝ်ႇဝူဝ်ႇ + ယႄႇမႅၼ်ႇ + မႃႇယူတ်ႈ + ဢႃႇၾရိၵၸၢၼ်း + ၸမ်းပီးယႃး + ၸိမ်ႇပႃႇပူၺ်ႇ + ၼႃႈလိၼ် ဢမ်ႇႁူႉၸၵ်း + + လၢႆးတႅမ်ႈလိၵ်ႈၾိင်ႈထုင်းၵျႃႇမၼ်ႇ + လိၵ်ႈလၢႆး ရီႇသျႅၼ်ႇ ဢၼ်မီးပိူင်တၢႆ + လိၵ်ႈၵျႃႇမၼ်ႇ မိူဝ်ႈပီ 1996 + ဝၢႆးလင် ၾရၢင်ႇသဵတ်ႈ ပွတ်းၵၢင် တေႃႇထိုင် 1606 + ၾရၢင်ႇသဵတ်ႈပၢၼ်မႂ်ႇမိူဝ်ႈၸဝ်ႉ + ပၢႆးပၺ်ႇၺႃႇ + ပိူင်ၽွတ်ႇၶွတ်ႈ လွင်ႈတႅမ်ႈလိၵ်ႈ မိူဝ်ႈပီ 1943 + ALA-LC လွင်ႈႁဵတ်းႁႂ်ႈပဵၼ် ရူဝ်ႇမႅၼ်ႇ မိူဝ်ႈပီ 1997 + ၵႂၢမ်းလၢတ်ႈဢႃႇလူႇၵူႇ + လိၵ်ႈႁူမ်ႈမၢႆ ၽႃႇသႃႇၵႂၢမ်းလၢတ်ႈ ပေႃးတူႉၵၢဝ်ႇ မိူဝ်ႈပီ 1990 + တူဝ်မႄႈလိၵ်ႈလတိၼ်ႇ တိူဝ်ႇၵီႇၽွမ်ႉႁူမ်ႈ + ၵႂၢမ်းလၢတ်ႈ ပႃႇလၼ်ၵႃ ဢၼီႇ + ၸုမ်းၵႂၢမ်းလၢတ်ႈ ပႃႇလႃႇဝႅၼ်ႇတူဝ်ႇ ၶွင် ၵႃႇပူဝ်ႇဝႃႇတီႇဢႃႇၼူႇ + ၵႂၢမ်းလၢတ်ႈ ၵျူဝ်းၵျီဢူဝ်/ပီႇလႃႇ + တူဝ်မႄႈလိၵ်ႈ ပူဝ်ႁူဝ်ရိၵ်ႉ + ပူၼ်းတလိၼ်ႇ + ပၢင်ၵုမ်လူင် ၵၢၼ်တႅမ်ႈလိၵ်ႈ ၽႃႇသႃႇပေႃးတူႉၵၢဝ်ႇ-ပရႃႇၸီး မိူဝ်ႈပီ 1945 + တူဝ်မႄႈလိၵ်ႈ တၢၼ်ၵူဝ် + သႃးပီးယႅၼ်း ဢၼ်မီးသဵင်ဢွၵ်ႇ ဢီႇၵႃႇဝီႇယႅၼ်ႇ + ဢိင်းၵလဵတ်ႈပၢၼ်မႂ်ႇမိူဝ်ႈၸဝ်ႉ + ပၢႆးသဵင် IPA + ပၢႆးသဵင် UPA + ႁႅပ်ႉပၢၼ်ႇ ႁဵတ်းႁႂ်ႈပဵၼ် ရူဝ်ႇမႅၼ်ႇ + သႃးပီးယႅၼ်း ဢၼ်မီးသဵင်ဢွၵ်ႇ ဢီႇၸႅၵ်ႉဝီႇယႅၼ်ႇ + လၢႆးတႅမ်ႈလိၵ်ႈ ဢၼ်ၸႂ်ႉတိုဝ်းၼမ် + လၵ်းၸဵင် လၢႆးတႅမ်ႈလိၵ်ႈ + ၵႂၢမ်းလၢတ်ႈ လီႇပူဝ်ႇဝႃႇၸ် ၶွင် ရီႇသျႅၼ်ႇ + တူဝ်မႄႈလိၵ်ႈ မႅတ်ႉတႄႇလ်ၵူဝ်ႇ + သဵင်လဵဝ် + ၵႂၢမ်းလၢတ်ႈ ဢိၼ်ႇတူးၵ + ၵႂၢမ်းလၢတ်ႈ ၼႃတီသွၼ် + ၵႂၢမ်းလၢတ်ႈ ၼိဝႃႇ/ၵျိဝႃႇ + ဝူဝ်ႇလႃႇပူၵ်ႉ ၵၢပ်ႈပၢၼ်မႂ်ႇ + ၵႂၢမ်းလၢတ်ႈ ဢူဝ်ႇသီးယႃးၵူဝ်ႇ/ဢူဝ်ႇသူဝ်ႇၸႅၼ်ႇ + လွင်ႈတႅမ်ႈလိၵ်ႈ ပပ်ႉပိုတ်ႇတႅတ်ႈ ဢိင်းၵလဵတ်ႈ ဢွၵ်ႉသ်ၾူတ်ႉ + ၵႂၢမ်းလၢတ်ႈပႃႇမၵ + ပိၼ်းယိၼ်း ရူဝ်ႇမႅၼ်ႇ + ပူဝ်ႇလီတွၼ်းၼိၵ်ႉ + ၶွမ်ႇပိဝ်ႇတႃႇ + လၢႆးတႅမ်ႈလိၵ်ႈဢၼ်ၶိုၼ်းမႄးထတ်းဝႆႉ + ၶလၢတ်ႉသိၵ်ႉ ဝူဝ်ႇလႃႇပူၵ်ႉ + ရီႇသျႅၼ်ႇ + သႃႇႁူဝ်ႇ + ၽႃႇသႃႇဢိင်းၵလဵတ်ႈ ပိူင်သၵွတ်ႉ + သၵၢဝ်ႉ + ၵႂၢမ်းလၢတ်ႈ သတူဝ်းလ်ဝီႇၸႃႇ/သူဝ်ႇလ်ပီႇၵႃႇ + ၸုမ်းၵႂၢမ်းလၢတ်ႈ သူဝ်ႇတႃႇဝႅၼ်ႇတူဝ်ႇ ၶွင် ၵႃႇပူႇဝႃႇတီႇဢႃၼူႇ + လိၵ်ႈလၢႆး တႃရႃသၵီးဝီႇၵႃႇ + လၢႆးတႅမ်ႈလိၵ်ႈၽွမ်ႉႁူမ်ႈ + လၢႆးတႅမ်ႈလိၵ်ႈ ဢၼ်ၽွမ်ႉႁူမ်ႈၶိုၼ်းမႄးထတ်းဝႆႉ + တူဝ်လိၵ်ႈယူႇၼီႇၾူၼ်းပၢႆးသဵင် + ဝႃလႅၼ်သီႇယႅၼ်ႇ + ဝဵတ်ႉ-ၵိဝ်းသ် ရူဝ်ႇမႅၼ်ႇ + + + ပၵ်းယဵမ်ႈဝၼ်း + ပိူင်ၽၢင်ငိုၼ်းတွင်း + ၸႅၵ်ႇၶပ်ႉ + ငိုၼ်းတွင်း + လွင်ႈၼႄဢီႇမူဝ်းၵျိ + တူင်ႇဝူင်းယၢမ်းမူင်း (12 လႄႈ 24) + လွင်ႈၶဵင်ႈၶႅင် ၼႂ်းၵၢၼ်တတ်းထႅဝ်လိၵ်ႈ + လွင်ႈတတ်းထႅဝ်ၼႂ်းၶေႃႈၵႂၢမ်း + ပိူင်ၵၢၼ်တႅၵ်ႈ + တူဝ်ၼပ်ႉ + တတ်းတူၼ်ႈထႅဝ်လိၵ်ႈဝၢႆးၵႂၢမ်းယေႃႈ + + + ပၵ်းယဵမ်ႈဝၼ်း ၸၢဝ်းပုတ်ႉထ + ၸၢဝ်းပုတ်ႉထ + ပၵ်းယဵမ်ႈဝၼ်းၶႄႇ + ၶႄႇ + ပၵ်းယဵမ်ႈဝၼ်း ၶွပ်ႉတိၵ်ႉ + ၶွပ်ႉတိၵ်ႉ + ပၵ်းယဵမ်ႈဝၼ်း တႅင်းၵီႇ + တႅင်းၵီႇ + ပၵ်းယဵမ်ႈဝၼ်း ဢီႇတီႇယူဝ်းပီးယႃး + ၸၢဝ်းဢီႇတီႇယူဝ်းပီးယႃး + ပၵ်းယဵမ်ႈဝၼ်း ဢမိတ်ႉဢလႅမ်း ဢီႇတီႇယူဝ်းပီးယႃး + ဢမိတ်ႉဢလႅမ်း ဢီႇတီႇယူဝ်းပီးယႃး + ပၵ်းယဵမ်ႈဝၼ်း ၵရႅၵ်ႉၵူဝ်ႇရီႇယၼ်ႇ + ၵရႅၵ်ႉၵူဝ်ႇရီႇယၼ်ႇ + ပပ်ႉယဵမ်ႈဝၼ်း ႁီးပရူး + ႁီးပရူး + ပၵ်းယဵမ်ႈဝၼ်းၸိူဝ်ႉၸၢတ်ႈဢိၼ်းတီးယႃး + ၸိူဝ်ႉၸၢတ်ႈဢိၼ်းတီးယႃး + ပၵ်းယဵမ်ႈဝၼ်းႁိၸရိ + ႁိၸရိ + ပပ်ႉယဵမ်ႈဝၼ်းႁိၸရိ (လွၵ်းသဵၼ်ႈ၊ ပၢၼ်ၵူၼ်းမိူင်း) + ႁိၸရိ (လွၵ်းသဵၼ်ႈ၊ ပၢၼ်ၵူၼ်းမိူင်း) + ပၵ်းယဵမ်ႈဝၼ်းႁိၸရိ (သေႃႇတီႇဢႃႇရေးပီးယႃး၊ လွင်ႈႁၼ်) + ပၵ်းယဵမ်ႈဝၼ်းႁိၸရိ (လွၵ်းသဵၼ်ႈ၊ ပၢၼ်ပၢႆးလႅင်လၢဝ်) + ႁိၸရိ (လွၵ်းသဵၼ်ႈ၊ ပၢၼ်ပၢႆးလႅင်လၢဝ်) + ပၵ်းယဵမ်ႈဝၼ်းႁိၸရိ (ဢုမ်ဢႄလ်ၵူးရႃႇ) + ႁိၸရိ (ဢုမ်ဢႄလ်ၵူးရႃႇ) + ပၵ်းယဵမ်ႈဝၼ်း ၵရႅၵ်ႉၵူဝ်ႇရီႇယၼ်ႇ (ပီဢွၼ်တၢင်းသုတ်း) + ပၵ်းယဵမ်ႈဝၼ်းၵျႃႇပၢၼ်ႇ + ၸၢဝ်းၵျႃႇပၢၼ်ႇ + ပၵ်းယဵမ်ႈဝၼ်းပႃႇသျႃး + ပႃႇသျႃး + ပၵ်းယဵမ်ႈဝၼ်းမိင်းၵူႈ + မိင်းၵူႈ + ပိူင်ငိုၼ်း ၵၢၼ်ၼပ်ႉသွၼ်ႇ + ၵၢၼ်ၼပ်ႉသွၼ်ႇ + လၵ်းၸဵင် ပိူင်ၽၢင်ငိုၼ်းတွင်း + လၵ်းၸဵင် + ၸႅၵ်ႇၶပ်ႉ ဢၼ်ပူၼ်ႉမႃး တႃႇႁႂ်ႈမၼ်း ၵိုင်ႇငၢမ်ႇၵၼ် + လွင်ႈငမ်ႇမႅၼ်ႈ + ၸႅၵ်ႇၶပ်ႉ ပပ်ႉပိုတ်ႇတႅတ်ႈ + ပပ်ႉပိုတ်ႇတႅတ်ႈ + လၵ်းၸဵင် ၸႅၵ်ႇၶပ်ႉ ယူႇၼီႇၶူတ်ႉ + လၵ်းၸဵင် ယူႇၼီႇၶူတ်ႉ + ၸႅၵ်ႇၶပ်ႉ ဢီႇမူဝ်းၵျိ + ပိူင်ၶပ်ႉၸႅၼ်ႇမိူင်းယူးရူပ်ႉ + ၸႅၵ်ႇၶပ်ႉပပ်ႉၽူၼ်း + ပပ်ႉၽူၼ်း + ပၢႆးသဵင် + ၸႅၵ်ႇၶပ်ႉ ပိၼ်းယိၼ်း + ပိၼ်းယိၼ်း + ၵၢၼ်ၶူၼ်ႉႁႃ ဢၼ်ၸႂ်ႉတိုဝ်း ၵူႈလွင်ႈလွင်ႈ + ၶူၼ်ႉႁႃ + ၶူၼ်ႉႁႃၸွမ်း တူဝ်မႄႈလိၵ်ႈတႄႇ ႁင်းၵူးလ် + ၸႅၵ်ႇၶပ်ႉလၵ်းၸဵင် + လၵ်းၸဵင် + ၸႅၵ်ႇၶပ်ႉ ႁွႆးမိုဝ်းၸၼ် + ႁွႆးမိုဝ်းၸၼ် + ၸႅၵ်ႇၶပ်ႉၽိင်ႈထုင်း + ၽိင်ႈထုင်း + ၸႅၵ်ႇၶပ်ႉ ႁွႆးမိုဝ်း-ငဝ်ႈပိုၼ်ႉ + ႁွႆးမိုဝ်း-ငဝ်ႈပိုၼ်ႉ + ၸႅၵ်ႇၶပ်ႉ ၸူးယိၼ်း + ၸူးယိၼ်း + ငဝ်ႈပိုင်း + ဢီႇမူဝ်းၵျိ + လိၵ်ႈ + ပိူင်ယၢမ်းမူင်း 12 (0–11) + 12 (0–11) + ပိူင်ယၢမ်းမူင်း 12 (1–12) + 12 (1–12) + ပိူင်ယၢမ်းမူင်း 24 (0–23) + 24 (0–23) + ပိူင်ယၢမ်းမူင်း 24 (1–24) + 24 (1–24) + လၢႆးတတ်းထႅဝ်လိၵ်ႈ ဝႆႉလူမ် + ဝႆႉလူမ် + လၢႆးတတ်းထႅဝ်လိၵ်ႈ ပၵတိ + ပၵတိ + လၢႆးတတ်းထႅဝ်လိၵ်ႈ ၶဵင်ႈၶႅင် + ၶဵင်ႈၶႅင် + တတ်းမူတ်း + ဝႆႉမူတ်း + ပၵတိ + သိမ်းဝႆႉၼႂ်း ပွင်ႈလိၵ်ႈ + ပိူင်မႅတ်ႉထရိတ်ႉ + မႅတ်ႉထရိတ်ႉ + ပိူင်ၵၢၼ်တႅၵ်ႈ ဢိမ်ႇၽီးရီးယႄးလ် + ယူႇၶေႇ + ပိူင်ၵၢၼ်တႅၵ်ႈ ယူႇဢႅတ်ႉသ် + ယူႇဢႅတ်ႉသ် + တူဝ်ၼပ်ႉ ဢႃႇႁူမ်ႇ + တူဝ်ၼပ်ႉ ဢႃရပိၵ်ႉ-ဢိၼ်တိၵ်ႉ + တူဝ်ၼပ်ႉ ဢႃရပိၵ်ႉ-ဢိၼ်တိၵ်ႉ ဢၼ်ၶႂၢၵ်ႈဝႆႉ + တူဝ်ၼပ်ႉ ဢႃႇမေးၼီးယႃး + တူဝ်ၼပ်ႉတူဝ်ဢွၼ်ႇ ဢႃႇမေးၼီးယႃး + တူဝ်ၼပ်ႉ ပႃႇလီႇ + တူဝ်ၼပ်ႉ ပင်းၵလႃး + တူဝ်ၼပ်ႉ ပရႃမီႇ + တူဝ်ၼပ်ႉ ၶျႅၵ်ႉမႃး + တူဝ်ၼပ်ႉ ၶျႅမ် + တူဝ်ၼပ်ႉ သရီးရိၵ်ႉ + တူဝ်ၼပ်ႉ တႄဝၼႃးၵရီႇ + တူဝ်ၼပ်ႉ တၢႆႉၾ်ဢၵ်ႉၶူးလူႇ + တူဝ်ၼပ်ႉ ဢီႇတီႇယူဝ်းပီးယႃး + တူဝ်ၼပ်ႉ တၢင်းၵႂၢင်ႈတဵမ်ထူၼ်ႈ + တူဝ်ၼပ်ႉ ၵႃႇရေး + တူဝ်ၼပ်ႉ ၵျေႃႇၵျႃႇ + တူဝ်ၼပ်ႉ ၵုၼ်ၵျႃလႃၵွၼ်းတီႇ + တူဝ်ၼပ်ႉ မသႃရမ်ႇၵွၼ်းတီႇ + တူဝ်ၼပ်ႉ ၵရိတ်ႈ + တူဝ်ၼပ်ႉတူဝ်ဢွၼ်ႇ ၵရိတ်ႈ + တူဝ်ၼပ်ႉ ၵူးၵျရႃႇတီႇ + တူဝ်ၼပ်ႉ ၵူႇရုင်ႇၶေႇမ + တူဝ်ၼပ်ႉ ၵူရမုၵ်ႉၶီႇ + တူဝ်ၼပ်ႉ ၸုတ်ႉၶႄႇ + တူဝ်ၼပ်ႉ ၶႄႇမႂ်ႇ + တူဝ်ၼပ်ႉ ၵၢၼ်ငိုၼ်းတွင်း ၶႄႇမႂ်ႇ + တူဝ်ၼပ်ႉ ၶႄႇၵဝ်ႇ + တူဝ်ၼပ်ႉ ၵၢၼ်ငိုၼ်းတွင်း ၶႄႇၵဝ်ႇ + တူဝ်ၼပ်ႉ ႁီးပရူး + တူဝ်ၼပ်ႉ ပႃႁႃမူင်း + တူဝ်ၼပ်ႉ ၺႃႇၵဵင်းပႂႃႈၶျူႈမူင်း + တူဝ်ၼပ်ႉ ၵျႃႇဝႃး + တူဝ်ၼပ်ႉ ၵျႃႇပၢၼ်ႇ + တူဝ်ၼပ်ႉ ၵၢၼ်ငိုၼ်းတွင်း ၵျႃႇပၢၼ်ႇ + တူဝ်ၼပ်ႉ ၵယႃးလီ + တူဝ်ၼပ်ႉ ၶႃးဝီ + တူဝ်ၼပ်ႉ ၶမဵၼ် + တူဝ်ၼပ်ႉ ၶၼ်ၼႃးတႃႇ + တူဝ်ၼပ်ႉ ၵီႇရတ်ႉရၢႆး + တူဝ်ၼပ်ႉ တႆးထမ်း ႁူဝ်ႇရႃႇ + တူဝ်ၼပ်ႉ တႆးထမ်း + တူဝ်ၼပ်ႉ လၢဝ်း + တူဝ်ၼပ်ႉမိူင်းဝၼ်းတူၵ်း + တူဝ်ၼပ်ႉ လိပ်ႉၶျႃႇ + တူဝ်ၼပ်ႉ လိမ်ပူး + တူဝ်ၼပ်ႉ ပၢႆးၼပ်ႉ ဢၼ်ၼႃ + တူဝ်ၼပ်ႉ ပၢႆးၼပ်ႉ ဢၼ်ပႃးသွင်ႁွႆး + တူဝ်ၼပ်ႉ ပၢႆးၼပ်ႉ မူဝ်ႇၼူဝ်ႇသပေႉသ် + တူဝ်ၼပ်ႉ ပၢႆးၼပ်ႉ သႅၼ်းသႄႇရိပ်ႉ ဢၼ်ၼႃ + တူဝ်ၼပ်ႉ ပၢႆးၼပ်ႉ သႅၼ်းသႄႇရိပ်ႉ + တူဝ်ၼပ်ႉ မလေးယႃးလမ်ႇ + တူဝ်ၼပ်ႉ မူဝ်ႇတီႇ + တူဝ်ၼပ်ႉ မူင်ႇၵူဝ်းလီးယႃး + တူဝ်ၼပ်ႉ မရူဝ်ႇ + တူဝ်ၼပ်ႉ မီး​တီးမယဵၵ်ႇၶ် + တူဝ်ၼပ်ႉမၢၼ်ႈ + တူဝ်ၼပ်ႉ ယၢင်းပူဝ်း မျၢၼ်ႇမႃႇ ပွတ်းဢွၵ်ႇ + တူဝ်ၼပ်ႉ ပဢူဝ်း + တူဝ်ၼပ်ႉတႆး + တူဝ်ၼပ်ႉ တႆးလႅင် + တူဝ်ၼပ်ႉ ၼၢၵ်ႉမုၼ်ႇတရီႇ + တူဝ်ၼပ်ႉ ဢိၼ်းၶူဝ်း + တူဝ်ၼပ်ႉ ဢူဝ်းၶျိၶီ + တူဝ်ၼပ်ႉ ဢူဝ်ႇလ်ဢူဝ်ႇၼႃႇလ် + တူဝ်ၼပ်ႉ ဢူဝ်းတီးယႃႇ + တူဝ်ၼပ်ႉ ဢေႃသမႅၼ်းၺႃႇ + တူဝ်ၼပ်ႉ ဢၢဝ်ႉလၢႆး + တူဝ်ၼပ်ႉ ရူဝ်ႇႁိၼ်ႇၵျႃႇ ႁၼ်ၼီၾီး + တူဝ်ၼပ်ႉ ရူဝ်ႇမႅၼ်ႇ + တူဝ်ၼပ်ႉ တူဝ်ဢွၼ်ႇရူဝ်ႇမႅၼ်ႇ + တူဝ်ၼပ်ႉ သေႃရတ်ႉသ်ျထရႃႇ + တူဝ်ၼပ်ႉ သျႃရႃးတႃႇ + တူဝ်ၼပ်ႉ ၶူးတဝႃႇတီႇ + တူဝ်ၼပ်ႉ သိၼ်ႇႁႃႇလႃႇလိတ်ႉ + တူဝ်ၼပ်ႉ သူဝ်ႇရႃႇသူမ်ႈပႅင်း + တူဝ်ၼပ်ႉ သုၼ်တၼိတ်ႉ + တူဝ်ၼပ်ႉ သုၼုဝႃႇ + တူဝ်ၼပ်ႉ တၵ်ႉၵရီႇ + တူဝ်ၼပ်ႉ တႆးလိုဝ်ႉ + တူဝ်ၼပ်ႉ တမီးလ်ၵဝ်ႇ + တူဝ်ၼပ်ႉ တမီးလ် + တူဝ်ၼပ်ႉ ထႄးလူႇၵူႇ + တူဝ်ၼပ်ႉ ထႆး + တူဝ်ၼပ်ႉ တိပႅတ်ႉ + တူဝ်ၼပ်ႉ တီႇႁူးတႃႇ + တူဝ်ၼပ်ႉ ထႅင်းသႃႇ + တူဝ်ၼပ်ႉ တူဝ်ႇလူင်သီႇၵီႇ + တူဝ်ၼပ်ႉ ဝၢႆး + တူဝ်ၼပ်ႉ ဝႃႇရၢင်းသီႇတီႇ + တူဝ်ၼပ်ႉ ဝၼ်ႉၶျၢဝ် + ဢိုတ်း + ပိုတ်ႇ + + + မႅတ်ႉထရိတ်ႉ + ယူႇၶေႇ + ယူႇဢႅတ်ႉသ် + + + ၽႃႇသႃႇ: {0} + သၶရိပ်ႉ: {0} + တူင်ႇ: {0} + - [\u200Bး ႞ ႟ ၵ ၶ ၷ င ၸ ၺ ꧣ တ ထ ၻ ၼ ပ ၽ ၾ ၿ ꧤ မ ယ ျ ရ ြ လ ဝ ွ ႂ ႀ သ ႁ ဢ ႃ ိ ီ ု ူ ေ ႄ ꧥ ် ႇ ႈ ႉ ႊ] - [ꩡ ꩦ ꩧ ꩨ ꩩ ꩮ] - [ၵ ၶ ၷ ꧠ င ၸ ꩡ ꧡ ꧢ ၺ ꩦ ꩧ ꩨ ꩩ တ ထ ၻ ၼ ပ ၽ ၾ ၿ ꧤ မ ယ ရ လ ဝ ႀ သ ႁ ꩮ ဢ] - [႐ ႑ ႒ ႓ ႔ ႕ ႖ ႗ ႘ ႙] - [၊ ။ ‘’ “”] + [ံး ႞ ႟ ၵ ၶ ၷ ꧠ င ၸ ꩡ ၺ ꩦ ꩧ ꩨ ꩩ ꧣ တ ထ ၻ ꩪ ၼ ပ ၽ ၾ ၿ ꧤ မ ယ ျ ရ ြ လ ဝ ွ ႂ ႀ သ ႁ ꩮ ဢ ႃ ိ ီ ု ူ ေ ႄ ဵ ႅ ႆ ၢ ꧥ ် ႇ ႈ ႉ ႊ] + [၀႐ ၁႑ ၂႒ ၃႓ ၄႔ ၅႕ ၆႖ ၇႗ ၈႘ ၉႙ ၚ ၐ ၑ ၥ ၒ ၓ ၔ ၕ ဨ ဳ ၖ ၗ ၘ ၙ ဴ] + [႞ ႟ ၵ ၶ ၷ ꧠ င ၸ ꩡ ၺ ꧣ တ ထ ၻ ꩪ ၼ ပ ၽ ၾ ၿ မ ယ ရ လ ဝ ႀ သ ႁ ꩮ ဢ] + [\- ‑ , . % ‰ + 0၀႐ 1၁႑ 2၂႒ 3၃႓ 4၄႔ 5၅႕ 6၆႖ 7၇႗ 8၈႘ 9၉႙] + [\- ‐‑ – — … ၊ ။ ‘’ “” ( ) \[ \] \{ \} @ * / #] + + + + + + ပီသႃႇသၼႃႇ + + + ပ.သ. + + + ပ.သ. + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + GGGGG y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + GGGGG y-MM-dd + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM + GGGGG y-MM-dd + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM – GGGGG y-MM + GGGGG y-MM – y-MM + GGGGG y-MM – y-MM + + + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – GGGGG y-MM-dd + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM – y-MM + GGGGG y-MM – y-MM + + + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + + + + + r(U) MMMM d - EEEE + + + + + r(U) MMMM d + + + + + r MMM d + + + + + r-MM-dd + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + r MMM d - E + r(U) MMMM d - E + MM-dd - E + MMM d - E + r-MM-dd - E + r MMM d - E + r(U) MMMM d - E + + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + + + U MMM d၊ E – MMM d - E + U MMM d၊ E – MMM d - E + U MMM d၊ E – U MMM d - E + + + + + + + + + ထွၵ်ႉ + ပႃႇပႃႇ + ႁတ်ႉထေႃး + ၵိၶ် + တူဝ်ႇပႃႇ + ဢႅမ်းသႄးရ် + ပရမ်ႇႁတ်ႉ + ပႃႇရႃႇမူဝ်ႇတႃႇ + ပႃႇသၢၼ်ႇ + ပဝ်းၼႃး + ဢႅပ်ႉပႅပ်ႉ + မႅတ်ႉသရႃႇ + ၼႃႇသီႇ + + + ထွၵ်ႉ + ပႃႇပႃႇ + ႁတ်ႉထေႃး + ၵိၶ် + တူဝ်ႇပႃႇ + ဢႅမ်းသႄးရ် + ပရမ်ႇႁတ်ႉ + ပႃႇရႃႇမူဝ်ႇတႃႇ + ပႃႇသၢၼ်ႇ + ပဝ်းၼႃး + ဢႅပ်ႉပႅပ်ႉ + မႅတ်ႉသရႃႇ + ၼႃႇသီႇ + + + + + ထွၵ်ႉ + ပႃႇပႃႇ + ႁတ်ႉထေႃး + ၵိၶ် + တူဝ်ႇပႃႇ + ဢႅမ်းသႄးရ် + ပရမ်ႇႁတ်ႉ + ပႃႇရႃႇမူဝ်ႇတႃႇ + ပႃႇသၢၼ်ႇ + ပဝ်းၼႃး + ဢႅပ်ႉပႅပ်ႉ + မႅတ်ႉသရႃႇ + ၼႃႇသီႇ + + + ထွၵ်ႉ + ပႃႇပႃႇ + ႁတ်ႉထေႃး + ၵိၶ် + တူဝ်ႇပႃႇ + ဢႅမ်းသႄးရ် + ပရမ်ႇႁတ်ႉ + ပႃႇရႃႇမူဝ်ႇတႃႇ + ပႃႇသၢၼ်ႇ + ပဝ်းၼႃး + ဢႅပ်ႉပႅပ်ႉ + မႅတ်ႉသရႃႇ + ၼႃႇသီႇ + + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + GGGGG y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + GGGGG y-MM-dd + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM + GGGGG y-MM-dd + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM – GGGGG y-MM + GGGGG y-MM – y-MM + GGGGG y-MM – y-MM + + + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – GGGGG y-MM-dd + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + HH–HH + + + HH–HHမ v + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM – y-MM + GGGGG y-MM – y-MM + + + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + GGGGG y-MM-dd – y-MM-dd + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + လိူၼ်ထူၼ်ႈၼိုင်ႈ + လိူၼ်ထူၼ်ႈသွင် + လိူၼ်ထူၼ်ႈသၢမ် + လိူၼ်ထူၼ်ႈသီႇ + လိူၼ်ထူၼ်ႈႁႃႈ + လိူၼ်ထူၼ်ႈႁူၵ်း + လိူၼ်ထူၼ်ႈၸဵတ်း + လိူၼ်ထူၼ်ႈပႅတ်ႇ + လိူၼ်ထူၼ်ႈၵဝ်ႈ + လိူၼ်ထူၼ်ႈသိပ်း + လိူၼ်ထူၼ်ႈသိပ်းဢဵတ်း + လိူၼ်ထူၼ်ႈသိပ်းသွင် + + + + + + + r(U) MMMM d - EEEE + + + + + r(U) MMMM d + + + + + r MMM d + + + + + r-MM-dd + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + r MMM d - E + r(U) MMMM d - E + MM-dd - E + MMM d - E + r-MM-dd - E + r MMM d - E + r(U) MMMM d - E + + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + + + U MMM d၊ E – MMM d - E + U MMM d၊ E – MMM d - E + U MMM d၊ E – U MMM d - E + + + + + + + + + မႅတ်ႉသ်ရႅမ်ႇ + တႅၵ်ႉၵမ်ႇ + ႁႄႇတႃႇ + တႃးသတ်ႉသ် + တႄးလ် + ယေႇၵတိတ်ႉ + မႅၵ်ႇၵႃႇပိတ်ႉ + မိယႃႇၸီႇယႃႇ + ၵႅၼ်ႇပၢတ်ႉ + သိၼ်း + ႁႅမ်းလႄး + ၼႁၢတ်ႉသ် + ပႃႇၵူႇမႅၼ်ႇ + + + မႅတ်ႉသ်ရႅမ်ႇ + တႅၵ်ႉၵမ်ႇ + ႁႄႇတႃႇ + တႃးသတ်ႉသ် + တႄးလ် + ယေႇၵတိတ်ႉ + မႅၵ်ႇၵႃႇပိတ်ႉ + မိယႃႇၸီႇယႃႇ + ၵႅၼ်ႇပၢတ်ႉ + သိၼ်း + ႁႅမ်းလႄး + ၼႁၢတ်ႉသ် + ပႃႇၵူႇမႅၼ်ႇ + + + + + မႅတ်ႉသ်ရႅမ်ႇ + တႅၵ်ႉၵမ်ႇ + ႁႄႇတႃႇ + တႃးသတ်ႉသ် + တႄးလ် + ယေႇၵတိတ်ႉ + မႅၵ်ႇၵႃႇပိတ်ႉ + မိယႃႇၸီႇယႃႇ + ၵႅၼ်ႇပၢတ်ႉ + သိၼ်း + ႁႅမ်းလႄး + ၼႁၢတ်ႉသ် + ပႃႇၵူႇမႅၼ်ႇ + + + မႅတ်ႉသ်ရႅမ်ႇ + တႅၵ်ႉၵမ်ႇ + ႁႄႇတႃႇ + တႃးသတ်ႉသ် + တႄးလ် + ယေႇၵတိတ်ႉ + မႅၵ်ႇၵႃႇပိတ်ႉ + မိယႃႇၸီႇယႃႇ + ၵႅၼ်ႇပၢတ်ႉ + သိၼ်း + ႁႅမ်းလႄး + ၼႁၢတ်ႉသ် + ပႃႇၵူႇမႅၼ်ႇ + + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + ၸၼ်ႇ + ၾႅပ်ႇ + မၢတ်ႉၶ်ျ + ဢေႇ + မေႇ + ၸုၼ်ႇ + ၸူႇ + ဢေႃး + သႅပ်ႇ + ဢွၵ်ႇ + ၼူဝ်ႇ + တီႇ + + + ၸ. + ၾ. + မ. + ဢ. + မ. + ၸ. + ၸ. + ဢ. + သ. + ဢ. + ၼ. + တ. + + + ၸၼ်ႇဝႃႇရီႇ + ၾႅပ်ႇဝႃႇရီႇ + မၢတ်ႉၶ်ျ + ဢေႇပရႄႇ + မေႇ + ၸုၼ်ႇ + ၸူႇလၢႆႇ + ဢေႃးၵၢတ်ႉ + သႅပ်ႇထႅမ်ႇပႃႇ + ဢွၵ်ႇထူဝ်ႇပႃႇ + ၼူဝ်ႇဝႅမ်ႇပႃႇ + တီႇသႅမ်ႇပႃႇ + + + + + ၸၼ်ႇ + ၾႅပ်ႇ + မၢတ်ႉၶ်ျ + ဢေႇ + မေႇ + ၸုၼ်ႇ + ၸူႇ + ဢေႃး + သႅပ်ႇ + ဢွၵ်ႇ + ၼူဝ်ႇ + တီႇ + + + ၸ. + ၾ. + မ. + ဢ. + မ. + ၸ. + ၸ. + ဢ. + သ. + ဢ. + ၼ. + တ. + + + ၸၼ်ႇဝႃႇရီႇ + ၾႅပ်ႇဝႃႇရီႇ + မၢတ်ႉၶ်ျ + ဢေႇပရႄႇ + မေႇ + ၸုၼ်ႇ + ၸူႇလၢႆႇ + ဢေႃးၵၢတ်ႉ + သႅပ်ႇထႅမ်ႇပႃႇ + ဢွၵ်ႇထူဝ်ႇပႃႇ + ၼူဝ်ႇဝႅမ်ႇပႃႇ + တီႇသႅမ်ႇပႃႇ + + + + + + + တိတ်ႉ + ၸၼ် + ၵၢၼ်း + ပုတ်ႉ + ၽတ်း + သုၵ်း + သဝ် + + + တိ. + ၸ. + ၵ. + ပု. + ၽ. + သု. + သ. + + + တိတ်ႉ + ၸၼ် + ၵၢၼ်း + ပုတ်ႉ + ၽတ်း + သုၵ်း + သဝ် + + + ဝၼ်းဢႃးတိတ်ႉ + ဝၼ်းၸၼ် + ဝၼ်းဢင်းၵၢၼ်း + ဝၼ်းပုတ်ႉ + ဝၼ်းၽတ်း + ဝၼ်းသုၵ်း + ဝၼ်းသဝ် + + + + + တိတ်ႉ + ၸၼ် + ၵၢၼ်း + ပုတ်ႉ + ၽတ်း + သုၵ်း + သဝ် + + + တိ. + ၸ. + ၵ. + ပု. + ၽ. + သု. + သ. + + + တိတ်ႉ + ၸၼ် + ၵၢၼ်း + ပုတ်ႉ + ၽတ်း + သုၵ်း + သဝ် + + + တိတ်ႉ + ၸၼ် + ၵၢၼ်း + ပုတ်ႉ + ၽတ်း + သုၵ်း + သဝ် + + + + + + + သၢမ်လိူၼ်ႁွပ်ႈ 1 + သၢမ်လိူၼ်ႁွပ်ႈ 2 + သၢမ်လိူၼ်ႁွပ်ႈ 3 + သၢမ်လိူၼ်ႁွပ်ႈ 4 + + + သၢမ်လိူၼ်ႁွပ်ႈ 1 + သၢမ်လိူၼ်ႁွပ်ႈ 2 + သၢမ်လိူၼ်ႁွပ်ႈ 3 + သၢမ်လိူၼ်ႁွပ်ႈ 4 + + + + + ႁွပ်ႈ1 + ႁွပ်ႈ2 + ႁွပ်ႈ3 + ႁွပ်ႈ4 + + + သၢမ်လိူၼ်ႁွပ်ႈ 1 + သၢမ်လိူၼ်ႁွပ်ႈ 2 + သၢမ်လိူၼ်ႁွပ်ႈ 3 + သၢမ်လိူၼ်ႁွပ်ႈ 4 + + + + + + + တၸ. + တလ. + + + ၸ. + လ. + + + တွၼ်ႈၸဝ်ႉ + တွၼ်ႈလႃႈ + + + + + တၸ. + တလ. + + + တၸ. + တလ. + + + တွၼ်ႈၸဝ်ႉ + တွၼ်ႈလႃႈ + + + + + + ဢွၼ်ၼႃႈၸဝ်ႈၶရိတ်ႉ + ဢွၼ်ၼႃႈပၢၼ်ၵၢင်လၢႆ + ပီၶရိတ်ႉ + ပၢၼ်ၵၢင်လၢႆ + + + ပီႇၸီႇ + ပီႇၸီႇဢီး + ဢေႇတီႇ + ၸီႇဢီး + + + ပီႇၸီႇ + ပီႇၸီႇဢီး + ဢေႇတီႇ + ၸီႇဢီး + + + + + + y MMMM d - EEEE + + + + + y MMMM d + + + + + y MMM d + + + + + y-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + ဝူင်ႈထူၼ်ႈ W ၶွင်လိူၼ် MMMM + y-MM-dd - E + y MMM d - E + ဝူင်ႈထူၼ်ႈ w ၶွင်ပီ Y + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + y-MM-dd - E – y-MM-dd - E + + + y MMM d - E – MMM d - E + y MMM d - E – MMM d - E + y MMM d - E – y MMM d - E + + + + + + + + + တိသျရိ + ႁေႇသျဝၼ်ႇ + ၶိတ်ႉသလႅပ်ႉ + တႄႇဝႅတ်ႉ + သျေႇဝတ်ႉ + ဢႃႇတႃႇ I + ဢႃႇတႃႇ + ဢႃႇတႃႇ II + ၼီႇသၢၼ်း + ဢီႇယႃႇ + သီႇဝၼ်ႇ + တမ်ႇမုတ်ႉၸ် + ဢၢပ်ႉၾ် + ဢႄႇလူးလ် + + + တိသျရိ + ႁေႇသျဝၼ်ႇ + ၶိတ်ႉသလႅပ်ႉ + တႄႇဝႅတ်ႉ + သျေႇဝတ်ႉ + ဢႃႇတႃႇ I + ဢႃႇတႃႇ + ဢႃႇတႃႇ II + ၼီႇသၢၼ်း + ဢီႇယႃႇ + သီႇဝၼ်ႇ + တမ်ႇမုတ်ႉၸ် + ဢၢပ်ႉၾ် + ဢႄႇလူးလ် + + + + + တိသျရိ + ႁေႇသျဝၼ်ႇ + ၶိတ်ႉသလႅပ်ႉ + တႄႇဝႅတ်ႉ + သျေႇဝတ်ႉ + ဢႃႇတႃႇ I + ဢႃႇတႃႇ + ဢႃႇတႃႇ II + ၼီႇသၢၼ်း + ဢီႇယႃႇ + သီႇဝၼ်ႇ + တမ်ႇမုတ်ႉၸ် + ဢၢပ်ႉၾ် + ဢႄႇလူးလ် + + + တိသျရိ + ႁေႇသျဝၼ်ႇ + ၶိတ်ႉသလႅပ်ႉ + တႄႇဝႅတ်ႉ + သျေႇဝတ်ႉ + ဢႃႇတႃႇ I + ဢႃႇတႃႇ + ဢႃႇတႃႇ II + ၼီႇသၢၼ်း + ဢီႇယႃႇ + သီႇဝၼ်ႇ + တမ်ႇမုတ်ႉၸ် + ဢၢပ်ႉၾ် + ဢႄႇလူးလ် + + + + + + တ.ၸ. + + + တ.ၸ. + + + တ.ၸ. + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + ၵျၢႆးတရႃႇ + ဝၢႆးသႃၶႃႇ + ၵျႅတ်ႉသ်ထႃႇ + ဢသႃထႃ + သရဝၼ + ၽႃႇတရႃႇ + ဢသဝိၼႃႇ + ၵႃတိၵႃႇ + ဢၵရႃႇႁႃယႃၼႃႇ + ​ပေႃးသႃႇ + မႃႇၵႃႇ + ၽႃလ်ၵူၼႃႇ + + + ၵျၢႆးတရႃႇ + ဝၢႆးသႃၶႃႇ + ၵျႅတ်ႉသ်ထႃႇ + ဢသႃထႃ + သရဝၼ + ၽႃႇတရႃႇ + ဢသဝိၼႃႇ + ၵႃတိၵႃႇ + ဢၵရႃႇႁႃယႃၼႃႇ + ​ပေႃးသႃႇ + မႃႇၵႃႇ + ၽႃလ်ၵူၼႃႇ + + + + + ၵျၢႆးတရႃႇ + ဝၢႆးသႃၶႃႇ + ၵျႅတ်ႉသ်ထႃႇ + ဢသႃထႃ + သရဝၼ + ၽႃႇတရႃႇ + ဢသဝိၼႃႇ + ၵႃတိၵႃႇ + ဢၵရႃႇႁႃယႃၼႃႇ + ​ပေႃးသႃႇ + မႃႇၵႃႇ + ၽႃလ်ၵူၼႃႇ + + + ၵျၢႆးတရႃႇ + ဝၢႆးသႃၶႃႇ + ၵျႅတ်ႉသ်ထႃႇ + ဢသႃထႃ + သရဝၼ + ၽႃႇတရႃႇ + ဢသဝိၼႃႇ + ၵႃတိၵႃႇ + ဢၵရႃႇႁႃယႃၼႃႇ + ​ပေႃးသႃႇ + မႃႇၵႃႇ + ၽႃလ်ၵူၼႃႇ + + + + + + သၵ်ႉၵႃႇ + + + သၵ်ႉၵႃႇ + + + သၵ်ႉၵႃႇ + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + မူႇ. + သႃႇ. + ရႃႇ. I + ရႃႇ. II + ၵျူႇ. I + ၵျူႇ. II + ရႃႇၸ်. + သျႃး. + ရႃ. + သျေႃး. + ၻူဝ်ႇလ်.ၵ. + ၻူဝ်ႇလ်.ႁ. + + + မူႇႁႃႇရမ်ႇ + သႃႇၾႃႇ + ရႃႇပီႇ I + ရႃႇပီႇ II + ၵျူႇမႃႇတႃႇ I + ၵျူႇမႃႇတႃႇ II + ရႃႇၸၢပ်ႉ + သျႃးပၢၼ်ႇ + ရႃႇမႃႇတၢၼ်ႇ + သျေႃးဝႃႇလ် + ၻူဝ်ႇလ်-ၵိတ + ၻူဝ်ႇလ်ႁိတ်ႉၸႃႇ + + + + + မူႇ. + သႃႇ. + ရႃႇ. I + ရႃႇ. II + ၵျူႇ. I + ၵျူႇ. II + ရႃႇၸ်. + သျႃး. + ရႃ. + သျေႃး. + ၻူဝ်ႇလ်.ၵ. + ၻူဝ်ႇလ်.ႁ. + + + မူႇႁႃႇရမ်ႇ + သႃႇၾႃႇ + ရႃႇပီႇ I + ရႃႇပီႇ II + ၵျူႇမႃႇတႃႇ I + ၵျူႇမႃႇတႃႇ II + ရႃႇၸၢပ်ႉ + သျႃးပၢၼ်ႇ + ရႃႇမႃႇတၢၼ်ႇ + သျေႃးဝႃႇလ် + ၻူဝ်ႇလ်-ၵိတ + ၻူဝ်ႇလ်ႁိတ်ႉၸႃႇ + + + + + + ပီႁေးၵျိရႃႇ + ဢွၼ်ၼႃႈ ႁေးၵျိရႃႇ + + + ပ.ႁ. + ဢ.ႁ. + + + ပ.ႁ. + ဢ.ႁ. + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + တႆးၵႃႇ (645–650) + ႁၵုၶျိ (650–671) + ႁၵုႁူဝ်ႇ (672–686) + သူးၶျူဝ်ႇ (686–701) + တႆးႁူဝ်ႇ (701–704) + ၵေးယိုင်ႇ (704–708) + ဝႃးတူဝ်ႇ (708–715) + ရေးၵီႇ (715–717) + ယူဝ်းရူဝ်ႇ (717–724) + ၸိၼ်ႈၵီႇ (724–729) + တႅၼ်းပျူဝ်ႇ (729–749) + တႅၼ်းပျူဝ်ႇ-ၵၼ်းပူဝ်ႇ (749–749) + တႅၼ်းပျူဝ်ႇ-သျူဝ်းႁူဝ်ႇ (749–757) + တႅၼ်းပျူဝ်ႇ-ႁူဝ်ႇၸီႇ (757–765) + တႅၼ်းပျူဝ်ႇ-ၸိၼ်းၵူဝ်ႇ (765–767) + ၸိၼ်းၵူဝ်ႇ-ၵေးယိုင်ႇ (767–770) + ႁူဝ်ၵီႇ (770–780) + တႅၼ်းဢူဝ်ႇ (781–782) + ဢႅၼ်ရိယႃၵု (782–806) + တႆးတူဝ်ႇ (806–810) + ၶူဝ်းၼိၼ်ႇ (810–824) + တႅၼ်းၶျူဝ်ႇ (824–834) + ၸူဝ်းဝႃႇ (834–848) + ၵႃးသျူဝ်ႇ (848–851) + ၼိၼ်းၸူႇ (851–854) + သၢႆးၵူဝ်ႇ (854–857) + တႅၼ်းဢၼ်ႇ (857–859) + ၸူဝ်းၵၼ်ႇ (859–877) + ၵၼ်းၵျူဝ်ႇ (877–885) + ၼိၼ်းၼႃႇ (885–889) + ၵၼ်းပျူဝ်ႇ (889–898) + သျူဝ်းတႆႇ (898–901) + ဢႅၼ်းၵီႇ (901–923) + ဢႅၼ်းၶျူဝ်ႇ (923–931) + ၸူဝ်းႁေႇ (931–938) + တႅၼ်းၵျူဝ်ႇ (938–947) + တႅၼ်းရိယႃၵု (947–957) + တႅၼ်းတူဝ်ၵု (957–961) + ဢူဝ်းဝႃႇ (961–964) + ၵူဝ်းႁူဝ်ႇ (964–968) + ဢၼ်းၼႃႇ (968–970) + တႅၼ်းရိယႃၵု (970–973) + တႅၼ်းဢႅၼ်ႇ (973–976) + ၸူဝ်းၵႅၼ်ႇ (976–978) + တႅၼ်းၵႅၼ်ႇ (978–983) + ဢီးၵၼ်ႇ (983–985) + ၶၢၼ်းၼႃႉ (985–987) + ဢီးဢႅၼ်ႇ (987–989) + ဢီးသူဝ်ႇ (989–990) + သျူဝ်းရိယႃၵု (990–995) + ၶျူဝ်းတူဝ်ၵု (995–999) + ၶျူဝ်းႁူဝ်ႇ (999–1004) + ၶၢၼ်းၵူဝ်ႇ (1004–1012) + ၶျူဝ်းဝႃႇ (1012–1017) + ၶၢၼ်းၼိၼ်ႇ (1017–1021) + ၸီးဢၼ်ႇ (1021–1024) + မၼ်းၸူႇ (1024–1028) + ၶျူဝ်းၵႅၼ်ႇ (1028–1037) + ၶျူဝ်းရိယႃၵု (1037–1040) + ၶျူဝ်းၵျူႇ (1040–1044) + ၶၢၼ်းတူဝ်ၵု (1044–1046) + ဢီးသျူဝ်ႇ (1046–1053) + တႅၼ်းၵီႇ (1053–1058) + ၶူဝ်းႁေႇ (1058–1065) + ၸီးရိယႃၵု (1065–1069) + ဢႅၼ်းၵျူႇ (1069–1074) + ၸူဝ်းႁူဝ်ႇ (1074–1077) + သျူဝ်းရိယႃၵု (1077–1081) + ဢီးႁူဝ်ႇ (1081–1084) + ဢူဝ်းတူဝ်ၵု (1084–1087) + ၶၢၼ်းၸီႇ (1087–1094) + ၵႃးႁူဝ်ႇ (1094–1096) + ဢီးၶျူဝ်ႇ (1096–1097) + ၸူဝ်းတူဝ်ၵု (1097–1099) + ၵူဝ်းဝႃႇ (1099–1104) + ၶျူဝ်းၸီႇ (1104–1106) + ၵႃးသျူဝ်ႇ (1106–1108) + တႅၼ်းၼိၼ်ႇ (1108–1110) + တႅၼ်းဢီႇ (1110–1113) + ဢီးၵျူႇ (1113–1118) + ၵႅၼ်းဢီႇ (1118–1120) + ႁူဝ်းဢၼ်ႇ (1120–1124) + တႅၼ်းၸီႇ (1124–1126) + တႆးၸီႇ (1126–1131) + တႅၼ်းသျူဝ်ႇ (1131–1132) + ၶျူဝ်းသျူဝ်ႇ (1132–1135) + ႁူဝ်းဢႅၼ်ႇ (1135–1141) + ဢီးၸီႇ (1141–1142) + ၵူဝ်းၸီႇ (1142–1144) + တႅၼ်းယူဝ်ႇ (1144–1145) + ၵျူးဢၼ်ႇ (1145–1151) + ၼိၼ်းပေႇ (1151–1154) + ၵျူးၸူႇ (1154–1156) + ႁူဝ်းၵႅၼ်ႇ (1156–1159) + ႁေးၸီႇ (1159–1160) + ဢီးရိယႃၵု (1160–1161) + ဢူဝ်းႁူဝ်ႇ (1161–1163) + ၶျူဝ်းၵၼ်ႇ (1163–1165) + ဢီးမၼ်ႇ (1165–1166) + ၼိၼ်းဢၼ်ႇ (1166–1169) + ၵႃးဢူဝ်ႇ (1169–1171) + သျူဝ်းဢၼ်ႇ (1171–1175) + ဢၼ်းၵႅၼ်ႇ (1175–1177) + ၸီးသျူဝ်ႇ (1177–1181) + ယူဝ်းဝႃႇ (1181–1182) + ၸူးဢီႇ (1182–1184) + ၵႅၼ်းရိယႃၵု (1184–1185) + ပုၼ်းၸီႇ (1185–1190) + ၵႅၼ်းၵျူႇ (1190–1199) + သျူဝ်းၸီႇ (1199–1201) + ၵႅၼ်းၼိၼ်ႇ (1201–1204) + ၵႅၼ်းၵျူႇ (1204–1206) + ၵႅၼ်းဢီႇ (1206–1207) + ၸူဝ်းၵႅၼ်ႇ (1207–1211) + ၵႅၼ်းရိယႃၵု (1211–1213) + ၵႅၼ်းပူဝ်ႇ (1213–1219) + ၸူဝ်းၵျူႇ (1219–1222) + ၸူဝ်းဢူဝ်ႇ (1222–1224) + ၵႅၼ်းၼိၼ်ႇ (1224–1225) + ၵႃးရူဝ်ၵု (1225–1227) + ဢၼ်းတေႇ (1227–1229) + ၶၢၼ်းၵီႇ (1229–1232) + ၸူဝ်းဢီႇ (1232–1233) + တႅၼ်းပုၵု (1233–1234) + ပုၼ်းရိယႃၵု (1234–1235) + ၵႃးတေႇ (1235–1238) + ယႃးၵုၼိၼ်း (1238–1239) + ဢၼ်းဢူဝ်ႇ (1239–1240) + ၼိၼ်းၸီႇ (1240–1243) + ၵၼ်းၵႅၼ်ႇ (1243–1247) + ႁူဝ်းၸီႇ (1247–1249) + ၵႅၼ်းၶျူဝ်ႇ (1249–1256) + ၵူဝ်းၵႅၼ်ႇ (1256–1257) + သျူဝ်းၵႃႇ (1257–1259) + သျူဝ်းၵႅၼ်ႇ (1259–1260) + ပုၼ်းဢူဝ်ႇ (1260–1261) + ၵူဝ်းၶျူဝ်ႇ (1261–1264) + ပုၼ်းဢီႇ (1264–1275) + ၶၢၼ်းၸီႇ (1275–1278) + ၶူဝ်းဢၼ်ႇ (1278–1288) + သျူဝ်းဢူဝ်ႇ (1288–1293) + ဢီးၼိၼ်ႇ (1293–1299) + သျူဝ်းဢၼ်ႇ (1299–1302) + ၵႅၼ်းၵႅၼ်ႇ (1302–1303) + ၵႃးၵႅၼ်ႇ (1303–1306) + တူဝ်းၵုၸိ (1306–1308) + ဢၼ်းၵျူဝ်ႇ (1308–1311) + ဢူဝ်းၶျူဝ်ႇ (1311–1312) + သျူဝ်းဝႃႇ (1312–1317) + ပုၼ်းပူဝ်ႇ (1317–1319) + ၵႅၼ်းဢူဝ်ႇ (1319–1321) + ၵႅၼ်းၵူဝ်ႇ (1321–1324) + သျူဝ်းၶျူႇ (1324–1326) + ၵႃးရိယႃၵု (1326–1329) + ၵႅၼ်းတူဝ်ၵု (1329–1331) + ၵႅၼ်းၵူဝ်ႇ (1331–1334) + ၵႅၼ်းမူႇ (1334–1336) + ဢၼ်းၵႅၼ်ႇ (1336–1340) + ၵူဝ်းၵူဝ်ၵု (1340–1346) + သျူဝ်းႁေႇ (1346–1370) + ၵႅၼ်းတူဝ်ၵု (1370–1372) + ပုၼ်းၶျူႇ (1372–1375) + တႅၼ်းၸူႇ (1375–1379) + ၵူဝ်းရိယႃၵု (1379–1381) + ၵူဝ်းဝႃႇ (1381–1384) + ၵႅၼ်းၶျူႇ (1384–1392) + သျီးတူဝ်ၵု (1384–1387) + ၵႃးၵေႇ (1387–1389) + ၵူဝ်းဢူဝ်ႇ (1389–1390) + မေးတူဝ်ၵု (1390–1394) + ဢူဝ်းဢီႇ (1394–1428) + သျူဝ်းၶျူဝ်ႇ (1428–1429) + ဢီးၶျူဝ်ႇ (1429–1441) + ၵႃးၵိသု (1441–1444) + ပုၼ်းဢၼ်ႇ (1444–1449) + ႁူဝ်းတူဝ်ႇၵု (1449–1452) + ၵျူဝ်းတူဝ်ၵု (1452–1455) + ၵူဝ်းသျူဝ်ႇ (1455–1457) + ၶျူဝ်းရူဝ်ၵု (1457–1460) + ၵၼ်းသျူဝ်ႇ (1460–1466) + ပုၼ်းသျူဝ်ႇ (1466–1467) + ဢူဝ်းၼိၼ်ႇ (1467–1469) + ပုၼ်းမေႇ (1469–1487) + ၶျူဝ်းၵျူဝ်ႇ (1487–1489) + ဢၼ်းတူဝ်ၵု (1489–1492) + မေးဢူဝ်ႇ (1492–1501) + ပုၼ်းၵီႇ (1501–1504) + ဢီးသျူဝ်ႇ (1504–1521) + တႆးဢီႇ (1521–1528) + ၵျူဝ်းရူဝ်ၵု (1528–1532) + တႅၼ်းပုၼ်ႇ (1532–1555) + ၵူဝ်းၸီႇ (1555–1558) + ဢီးရူဝ်ၵု (1558–1570) + ၵႅၼ်းၵီႇ (1570–1573) + တႅၼ်းသျူဝ်ႇ (1573–1592) + ပုၼ်းရူဝ်ၵု (1592–1596) + ၵေးၶျူဝ်ႇ (1596–1615) + ၵႅၼ်းၼႃႇ (1615–1624) + ၶၢၼ်းဢီႇ (1624–1644) + သျူဝ်းႁူဝ်ႇ (1644–1648) + ၵေးဢၼ်ႇ (1648–1652) + ၸူဝ်းဢူဝ်ႇ (1652–1655) + မေးရေၵိ (1655–1658) + မၼ်းၸီႇ (1658–1661) + ၶၢၼ်းပုၼ်ႇ (1661–1673) + ဢၼ်းပူဝ်ႇ (1673–1681) + တႅၼ်းၼႃႇ (1681–1684) + ၸူဝ်းၵျူဝ်ႇ (1684–1688) + ၵႅၼ်းရူဝ်ၵု (1688–1704) + ႁူဝ်းဢီႇ (1704–1711) + သျူဝ်းတူဝ်ၵု (1711–1716) + ၵျူဝ်းႁူဝ်ႇ (1716–1736) + ၵႅၼ်းပုၼ်ႇ (1736–1741) + ၶၢၼ်းပူဝ်ႇ (1741–1744) + ဢၼ်းၵျူဝ်ႇ (1744–1748) + ၶၢၼ်းဢႅၼ်ႇ (1748–1751) + ႁူဝ်းရေၵိ (1751–1764) + မေးဝႃႇ (1764–1772) + ဢၼ်းဢီႇ (1772–1781) + တႅၼ်းမေႇ (1781–1789) + ၶၢၼ်းသေႇ (1789–1801) + ၵျူဝ်းဝႃႇ (1801–1804) + ပုၼ်းၵႃႇ (1804–1818) + ပုၼ်းသေႇ (1818–1830) + တၼ်းပူဝ်ႇ (1830–1844) + ၵူဝ်းၵႃႇ (1844–1848) + ၵႃးဢီႇ (1848–1854) + ဢၼ်းသေႇ (1854–1860) + မၼ်းဢႅၼ်ႇ (1860–1861) + ပုၼ်းၵျူႇ (1861–1864) + ၵႅၼ်းၸီႇ (1864–1865) + ၵေးဢူဝ်ႇ (1865–1868) + မေးၸီႇ + တႆးသျူဝ်ႇ + သျူဝ်းဝႃႇ + ႁေးသႄႇ + ရေးဝႃႇ + + + တႆးၵႃႇ (645–650) + ႁၵုၶျိ (650–671) + ႁၵုႁူဝ်ႇ (672–686) + သူးၶျူဝ်ႇ (686–701) + တႆးႁူဝ်ႇ (701–704) + ၵေးယိုင်ႇ (704–708) + ဝႃးတူဝ်ႇ (708–715) + ရေးၵီႇ (715–717) + ယူဝ်းရူဝ်ႇ (717–724) + ၸိၼ်ႈၵီႇ (724–729) + တႅၼ်းပျူဝ်ႇ (729–749) + တႅၼ်းပျူဝ်ႇ-ၵၼ်းပူဝ်ႇ (749–749) + တႅၼ်းပျူဝ်ႇ-သျူဝ်းႁူဝ်ႇ (749–757) + တႅၼ်းပျူဝ်ႇ-ႁူဝ်ႇၸီႇ (757–765) + တႅၼ်းပျူဝ်ႇ-ၸိၼ်းၵူဝ်ႇ (765–767) + ၸိၼ်းၵူဝ်ႇ-ၵေးယိုင်ႇ (767–770) + ႁူဝ်ၵီႇ (770–780) + တႅၼ်းဢူဝ်ႇ (781–782) + ဢႅၼ်ရိယႃၵု (782–806) + တႆးတူဝ်ႇ (806–810) + ၶူဝ်းၼိၼ်ႇ (810–824) + တႅၼ်းၶျူဝ်ႇ (824–834) + ၸူဝ်းဝႃႇ (834–848) + ၵႃးသျူဝ်ႇ (848–851) + ၼိၼ်းၸူႇ (851–854) + သၢႆးၵူဝ်ႇ (854–857) + တႅၼ်းဢၼ်ႇ (857–859) + ၸူဝ်းၵၼ်ႇ (859–877) + ၵၼ်းၵျူဝ်ႇ (877–885) + ၼိၼ်းၼႃႇ (885–889) + ၵၼ်းပျူဝ်ႇ (889–898) + သျူဝ်းတႆႇ (898–901) + ဢႅၼ်းၵီႇ (901–923) + ဢႅၼ်းၶျူဝ်ႇ (923–931) + ၸူဝ်းႁေႇ (931–938) + တႅၼ်းၵျူဝ်ႇ (938–947) + တႅၼ်းရိယႃၵု (947–957) + တႅၼ်းတူဝ်ၵု (957–961) + ဢူဝ်းဝႃႇ (961–964) + ၵူဝ်းႁူဝ်ႇ (964–968) + ဢၼ်းၼႃႇ (968–970) + တႅၼ်းရိယႃၵု (970–973) + တႅၼ်းဢႅၼ်ႇ (973–976) + ၸူဝ်းၵႅၼ်ႇ (976–978) + တႅၼ်းၵႅၼ်ႇ (978–983) + ဢီးၵၼ်ႇ (983–985) + ၶၢၼ်းၼႃႉ (985–987) + ဢီးဢႅၼ်ႇ (987–989) + ဢီးသူဝ်ႇ (989–990) + သျူဝ်းရိယႃၵု (990–995) + ၶျူဝ်းတူဝ်ၵု (995–999) + ၶျူဝ်းႁူဝ်ႇ (999–1004) + ၶၢၼ်းၵူဝ်ႇ (1004–1012) + ၶျူဝ်းဝႃႇ (1012–1017) + ၶၢၼ်းၼိၼ်ႇ (1017–1021) + ၸီးဢၼ်ႇ (1021–1024) + မၼ်းၸူႇ (1024–1028) + ၶျူဝ်းၵႅၼ်ႇ (1028–1037) + ၶျူဝ်းရိယႃၵု (1037–1040) + ၶျူဝ်းၵျူႇ (1040–1044) + ၶၢၼ်းတူဝ်ၵု (1044–1046) + ဢီးသျူဝ်ႇ (1046–1053) + တႅၼ်းၵီႇ (1053–1058) + ၶူဝ်းႁေႇ (1058–1065) + ၸီးရိယႃၵု (1065–1069) + ဢႅၼ်းၵျူႇ (1069–1074) + ၸူဝ်းႁူဝ်ႇ (1074–1077) + သျူဝ်းရိယႃၵု (1077–1081) + ဢီးႁူဝ်ႇ (1081–1084) + ဢူဝ်းတူဝ်ၵု (1084–1087) + ၶၢၼ်းၸီႇ (1087–1094) + ၵႃးႁူဝ်ႇ (1094–1096) + ဢီးၶျူဝ်ႇ (1096–1097) + ၸူဝ်းတူဝ်ၵု (1097–1099) + ၵူဝ်းဝႃႇ (1099–1104) + ၶျူဝ်းၸီႇ (1104–1106) + ၵႃးသျူဝ်ႇ (1106–1108) + တႅၼ်းၼိၼ်ႇ (1108–1110) + တႅၼ်းဢီႇ (1110–1113) + ဢီးၵျူႇ (1113–1118) + ၵႅၼ်းဢီႇ (1118–1120) + ႁူဝ်းဢၼ်ႇ (1120–1124) + တႅၼ်းၸီႇ (1124–1126) + တႆးၸီႇ (1126–1131) + တႅၼ်းသျူဝ်ႇ (1131–1132) + ၶျူဝ်းသျူဝ်ႇ (1132–1135) + ႁူဝ်းဢႅၼ်ႇ (1135–1141) + ဢီးၸီႇ (1141–1142) + ၵူဝ်းၸီႇ (1142–1144) + တႅၼ်းယူဝ်ႇ (1144–1145) + ၵျူးဢၼ်ႇ (1145–1151) + ၼိၼ်းပေႇ (1151–1154) + ၵျူးၸူႇ (1154–1156) + ႁူဝ်းၵႅၼ်ႇ (1156–1159) + ႁေးၸီႇ (1159–1160) + ဢီးရိယႃၵု (1160–1161) + ဢူဝ်းႁူဝ်ႇ (1161–1163) + ၶျူဝ်းၵၼ်ႇ (1163–1165) + ဢီးမၼ်ႇ (1165–1166) + ၼိၼ်းဢၼ်ႇ (1166–1169) + ၵႃးဢူဝ်ႇ (1169–1171) + သျူဝ်းဢၼ်ႇ (1171–1175) + ဢၼ်းၵႅၼ်ႇ (1175–1177) + ၸီးသျူဝ်ႇ (1177–1181) + ယူဝ်းဝႃႇ (1181–1182) + ၸူးဢီႇ (1182–1184) + ၵႅၼ်းရိယႃၵု (1184–1185) + ပုၼ်းၸီႇ (1185–1190) + ၵႅၼ်းၵျူႇ (1190–1199) + သျူဝ်းၸီႇ (1199–1201) + ၵႅၼ်းၼိၼ်ႇ (1201–1204) + ၵႅၼ်းၵျူႇ (1204–1206) + ၵႅၼ်းဢီႇ (1206–1207) + ၸူဝ်းၵႅၼ်ႇ (1207–1211) + ၵႅၼ်းရိယႃၵု (1211–1213) + ၵႅၼ်းပူဝ်ႇ (1213–1219) + ၸူဝ်းၵျူႇ (1219–1222) + ၸူဝ်းဢူဝ်ႇ (1222–1224) + ၵႅၼ်းၼိၼ်ႇ (1224–1225) + ၵႃးရူဝ်ၵု (1225–1227) + ဢၼ်းတေႇ (1227–1229) + ၶၢၼ်းၵီႇ (1229–1232) + ၸူဝ်းဢီႇ (1232–1233) + တႅၼ်းပုၵု (1233–1234) + ပုၼ်းရိယႃၵု (1234–1235) + ၵႃးတေႇ (1235–1238) + ယႃးၵုၼိၼ်း (1238–1239) + ဢၼ်းဢူဝ်ႇ (1239–1240) + ၼိၼ်းၸီႇ (1240–1243) + ၵၼ်းၵႅၼ်ႇ (1243–1247) + ႁူဝ်းၸီႇ (1247–1249) + ၵႅၼ်းၶျူဝ်ႇ (1249–1256) + ၵူဝ်းၵႅၼ်ႇ (1256–1257) + သျူဝ်းၵႃႇ (1257–1259) + သျူဝ်းၵႅၼ်ႇ (1259–1260) + ပုၼ်းဢူဝ်ႇ (1260–1261) + ၵူဝ်းၶျူဝ်ႇ (1261–1264) + ပုၼ်းဢီႇ (1264–1275) + ၶၢၼ်းၸီႇ (1275–1278) + ၶူဝ်းဢၼ်ႇ (1278–1288) + သျူဝ်းဢူဝ်ႇ (1288–1293) + ဢီးၼိၼ်ႇ (1293–1299) + သျူဝ်းဢၼ်ႇ (1299–1302) + ၵႅၼ်းၵႅၼ်ႇ (1302–1303) + ၵႃးၵႅၼ်ႇ (1303–1306) + တူဝ်းၵုၸိ (1306–1308) + ဢၼ်းၵျူဝ်ႇ (1308–1311) + ဢူဝ်းၶျူဝ်ႇ (1311–1312) + သျူဝ်းဝႃႇ (1312–1317) + ပုၼ်းပူဝ်ႇ (1317–1319) + ၵႅၼ်းဢူဝ်ႇ (1319–1321) + ၵႅၼ်းၵူဝ်ႇ (1321–1324) + သျူဝ်းၶျူႇ (1324–1326) + ၵႃးရိယႃၵု (1326–1329) + ၵႅၼ်းတူဝ်ၵု (1329–1331) + ၵႅၼ်းၵူဝ်ႇ (1331–1334) + ၵႅၼ်းမူႇ (1334–1336) + ဢၼ်းၵႅၼ်ႇ (1336–1340) + ၵူဝ်းၵူဝ်ၵု (1340–1346) + သျူဝ်းႁေႇ (1346–1370) + ၵႅၼ်းတူဝ်ၵု (1370–1372) + ပုၼ်းၶျူႇ (1372–1375) + တႅၼ်းၸူႇ (1375–1379) + ၵူဝ်းရိယႃၵု (1379–1381) + ၵူဝ်းဝႃႇ (1381–1384) + ၵႅၼ်းၶျူႇ (1384–1392) + သျီးတူဝ်ၵု (1384–1387) + ၵႃးၵေႇ (1387–1389) + ၵူဝ်းဢူဝ်ႇ (1389–1390) + မေးတူဝ်ၵု (1390–1394) + ဢူဝ်းဢီႇ (1394–1428) + သျူဝ်းၶျူဝ်ႇ (1428–1429) + ဢီးၶျူဝ်ႇ (1429–1441) + ၵႃးၵိသု (1441–1444) + ပုၼ်းဢၼ်ႇ (1444–1449) + ႁူဝ်းတူဝ်ႇၵု (1449–1452) + ၵျူဝ်းတူဝ်ၵု (1452–1455) + ၵူဝ်းသျူဝ်ႇ (1455–1457) + ၶျူဝ်းရူဝ်ၵု (1457–1460) + ၵၼ်းသျူဝ်ႇ (1460–1466) + ပုၼ်းသျူဝ်ႇ (1466–1467) + ဢူဝ်းၼိၼ်ႇ (1467–1469) + ပုၼ်းမေႇ (1469–1487) + ၶျူဝ်းၵျူဝ်ႇ (1487–1489) + ဢၼ်းတူဝ်ၵု (1489–1492) + မေးဢူဝ်ႇ (1492–1501) + ပုၼ်းၵီႇ (1501–1504) + ဢီးသျူဝ်ႇ (1504–1521) + တႆးဢီႇ (1521–1528) + ၵျူဝ်းရူဝ်ၵု (1528–1532) + တႅၼ်းပုၼ်ႇ (1532–1555) + ၵူဝ်းၸီႇ (1555–1558) + ဢီးရူဝ်ၵု (1558–1570) + ၵႅၼ်းၵီႇ (1570–1573) + တႅၼ်းသျူဝ်ႇ (1573–1592) + ပုၼ်းရူဝ်ၵု (1592–1596) + ၵေးၶျူဝ်ႇ (1596–1615) + ၵႅၼ်းၼႃႇ (1615–1624) + ၶၢၼ်းဢီႇ (1624–1644) + သျူဝ်းႁူဝ်ႇ (1644–1648) + ၵေးဢၼ်ႇ (1648–1652) + ၸူဝ်းဢူဝ်ႇ (1652–1655) + မေးရေၵိ (1655–1658) + မၼ်းၸီႇ (1658–1661) + ၶၢၼ်းပုၼ်ႇ (1661–1673) + ဢၼ်းပူဝ်ႇ (1673–1681) + တႅၼ်းၼႃႇ (1681–1684) + ၸူဝ်းၵျူဝ်ႇ (1684–1688) + ၵႅၼ်းရူဝ်ၵု (1688–1704) + ႁူဝ်းဢီႇ (1704–1711) + သျူဝ်းတူဝ်ၵု (1711–1716) + ၵျူဝ်းႁူဝ်ႇ (1716–1736) + ၵႅၼ်းပုၼ်ႇ (1736–1741) + ၶၢၼ်းပူဝ်ႇ (1741–1744) + ဢၼ်းၵျူဝ်ႇ (1744–1748) + ၶၢၼ်းဢႅၼ်ႇ (1748–1751) + ႁူဝ်းရေၵိ (1751–1764) + မေးဝႃႇ (1764–1772) + ဢၼ်းဢီႇ (1772–1781) + တႅၼ်းမေႇ (1781–1789) + ၶၢၼ်းသေႇ (1789–1801) + ၵျူဝ်းဝႃႇ (1801–1804) + ပုၼ်းၵႃႇ (1804–1818) + ပုၼ်းသေႇ (1818–1830) + တၼ်းပူဝ်ႇ (1830–1844) + ၵူဝ်းၵႃႇ (1844–1848) + ၵႃးဢီႇ (1848–1854) + ဢၼ်းသေႇ (1854–1860) + မၼ်းဢႅၼ်ႇ (1860–1861) + ပုၼ်းၵျူႇ (1861–1864) + ၵႅၼ်းၸီႇ (1864–1865) + ၵေးဢူဝ်ႇ (1865–1868) + မေးၸီႇ + တႆးသျူဝ်ႇ + သျူဝ်းဝႃႇ + ႁေးသီႇ + ရေးဝႃႇ + + + တႆးၵႃႇ + ႁၵုၶျိ + ႁႃးၵုႁူဝ် + သူးၶျူဝ်ႇ + တႆးႁူဝ်ႇ + ၵေးယိုင်ႇ + ဝႃးတူဝ်ႇ + ရေးၵီႇ + ယူဝ်းရူဝ်ႇ + ၸိၼ်းၵီႇ + တႅၼ်းပျူဝ်ႇ + တႅၼ်းပျူဝ်ႇ-ၵမ်းပူဝ်ႇ + တႅၼ်းပျူဝ်ႇ-သျူဝ်းႁူဝ်ႇ + တႅၼ်းပျူဝ်ႇ-ႁူဝ်းၸီႇ + တႅၼ်းပျူဝ်ႇ-ၸိၼ်းၵူဝ်ႇ + ၸိၼ်းၵူဝ်ႇ-ၵေးယိုင်ႇ + ႁူဝ်ၵီႇ + တႅၼ်းဢူဝ်ႇ + ဢႅၼ်ရိယႃၵု + တၢႆတူဝ်ႇ + ၶူဝ်းၼိၼ်ႇ + တႅၼ်းၶျူဝ်ႇ + ၸူဝ်းဝႃႇ + ၵႃသျူဝ်ႇ + ၼိၼ်းၸူႇ + သၢႆၵူဝ်ႇ + တႅၼ်းဢၼ်ႇ + ၸူဝ်းၵၼ် + ၵၼ်းၵျူဝ်ႇ + ၼိၼ်းၼႃႇ + ၵၼ်းပျူဝ်ႇ + သျူဝ်းတႆႇ + ဢႅၼ်းၵီႇ + ဢႅၼ်းၶျူဝ်ႇ + ၸူဝ်းႁေႇ + တႅၼ်းၵျူဝ်ႇ + တႅၼ်ရိယႃၵု + တႅၼ်းတူဝ်ၵု + ဢူဝ်းဝႃႇ + ၵူဝ်းႁူဝ်ႇ + ဢၼ်းၼႃႇ + တႅၼ်းရူဝ်ၵု + တႅၼ်းဢႅၼ်ႇ + ၸူဝ်းၵႅၼ်ႇ + တႅၼ်းၵႅၼ်ႇ + ဢီးၵၼ်ႇ + ၵၼ်းၼႃႉ + ဢီးဢႅၼ်ႇ + ဢီးသူဝ်ႇ + သျူဝ်ရိယႃၵု + ၶျူဝ်းတူဝ်ၵု + ၶျူဝ်းႁူဝ်ႇ + ၵၼ်းၵူဝ်ႇ + ၶျူဝ်းဝႃႇ + ၵၼ်းၼိၼ်ႇ + ၸီးဢၼ်ႇ + မၼ်းၸူႇ + ၶျူဝ်းၵႅၼ်ႇ + ၶျူဝ်ရိယႃၵု + ၶျူဝ်းၵျူႇ + ၵၼ်းတူဝ်ၵု + ဢီးသျူဝ်ႇ (1046–1053) + တႅၼ်းၵီႇ + ၵူဝ်းႁေႇ + ၸီရိယႃၵု + ဢႅၼ်းၵျူႇ + ၸူဝ်းႁူဝ်ႇ + ၸူဝ်ရိယႃၵု + ဢီးႁူဝ်ႇ + ဢူဝ်းတူဝ်ၵု + ၵၼ်းၸီႇ + ၵႃႁူဝ်ႇ + ဢီးၶျူဝ်ႇ + ၸူဝ်းတူဝ်ၵု + ၵူဝ်းဝႃႇ + ၶျူဝ်းၸီႇ + ၵႃၸူဝ်ႇ + တႅၼ်းၼိၼ်ႇ + တႅၼ်းဢီႇ + ဢီးၵျူႇ + ၵႅၼ်းဢီႇ + ႁူဝ်းဢၼ်ႇ + တႅၼ်းၸီႇ + တႆးၸီႇ + တႅၼ်းသျူဝ်ႇ + ၶျူဝ်းသျူဝ်ႇ + ႁူဝ်းဢႅၼ်ႇ + ဢီးၸီႇ + ၵူဝ်းၸီႇ + တႅၼ်းယူဝ်ႇ + ၵျူးဢၼ်ႇ + ၼိၼ်းပေႇ + ၵျူးၸူႇ + ႁူင်းၵႅၼ်ႇ + ႁေးၸီႇ + ဢိရယႃၵု + ဢူဝ်းႁူဝ်ႇ + ၶျူဝ်းၵၼ်ႇ + ဢီးမၼ်ႇ + ၼိၼ်းဢၼ်ႇ + ၵႃဢူဝ်ႇ + ၸူဝ်းဢၼ်ႇ + ဢၼ်းၵႅၼ်ႇ + ၸီးသျူဝ်ႇ + ယူဝ်းဝႃႇ + ၵျူးဢီႇ + ၵႅၼ်ရိယႃၵု + ပုၼ်းၸီႇ + ၵႅၼ်းၵျူႇ + သျူဝ်းၸီႇ + ၵႅၼ်းၼိၼ်ႇ + ၵႅၼ်းၵျူႇ + ၵႅၼ်းဢီႇ + ၸူဝ်းၵႅၼ်ႇ + ၵႅၼ်ရိယႃၵု + ၵႅမ်းပူဝ်ႇ + ၸူဝ်းၵျူႇ + ၸူဝ်းဢူဝ်ႇ + ၵႅၼ်းၼိၼ်ႇ + ၵႃးရူဝ်ၵု + ဢၼ်းတေႇ + ၵၢၼ်းၵီႇ + ၸူဝ်းဢီႇ + တႅၼ်းပုၵု + ပုၼ်ရိယႃၵု + ၵႃးတေႇ + ယႃႉၵုၼိၼ်း + ဢႅၼ်းဢူဝ်ႇ + ၼိၼ်းၸီႇ + ၵၼ်းၵႅၼ်ႇ + ႁူဝ်းၸီႇ + ၵႅၼ်းၶျူဝ်ႇ + ၵူဝ်းၵႅၼ်ႇ + သျူဝ်းၵႃႇ + သျူဝ်းၵႅၼ်ႇ + ပုၼ်းဢူဝ်ႇ + ၵူဝ်းၶျူဝ်ႇ + ပုၼ်းဢီႇ + ၵႅၼ်းၸီႇ + ၵူဝ်းဢၼ်ႇ + သျူဝ်းဢူဝ်ႇ + ဢီးၼိၼ်ႇ + သျူဝ်းဢၼ်ႇ + ၵႅၼ်းၵႅၼ်ႇ + ၵႃးၵႅၼ်ႇ + တူဝ်ၵုၸိ + ဢႅၼ်းၵျူဝ်ႇ + ဢူဝ်းၶျူဝ်ႇ + သျူဝ်းဝႃႇ + ပုၼ်းပူဝ်ႇ + ၵႅၼ်းဢူဝ်ႇ + ၵႅၼ်းၵူဝ်ႇ + သျူဝ်းၶျူႇ + ၵႃရိယႃၵု + ၵႅၼ်တူဝ်ၵု + ၵႅၼ်းၵူဝ်ႇ + ၵႅၼ်းမူႇ + ဢႅၼ်းၵႅၼ်ႇ + ၵူဝ်းၵူဝ်ၵု + သျူဝ်းႁေႇ + ၵႅၼ်တူဝ်ၵု + ပုၼ်းၶျူႇ + တႅၼ်းၸူႇ + ၵူဝ်ရိယႃၵု + ၵူဝ်းဝႃႇ + ၵႅၼ်းၶျူႇ + သျိတူဝ်ၵု + ၵႃးၵေႇ + ၵူဝ်းဢူဝ်ႇ + မေတူဝ်ၵု + ဢူဝ်းဢီႇ + သျူဝ်းၶျူဝ်ႇ + ဢီးၵျူဝ်ႇ + ၵႃးၵိသု + ပုၼ်းဢၼ်ႇ + ႁူဝ်တူဝ်ၵု + ၵျူဝ်တူဝ်ၵု + ၵူဝ်းသျူဝ်ႇ + ၶျူဝ်းရူဝ်ၵု + ၵၼ်းသျူဝ်ႇ + ပုၼ်းသျူဝ်ႇ + ဢူဝ်းၼိၼ်ႇ + ပုၼ်းမေႇ + ၶျူဝ်းၵျူဝ်ႇ + ဢၼ်းတူဝ်ၵု + မေးဢူဝ်ႇ + ပုၼ်းၵီႇ + ဢီးၶျူဝ်ႇ + တႆးဢီႇ + ၵျူဝ်းရူဝ်ၵု + တႅၼ်းပုၼ်ႇ + ၵူဝ်းၸီႇ + ဢီးရူဝ်ၵု + ၵႅၼ်းၵီႇ + တႅၼ်းသျူဝ်ႇ + ပုၼ်းရူဝ်ၵု + ၵေးၶျူဝ်ႇ + ၵႅၼ်းၼႃႉ + ၵၼ်းဢီႇ + သျူဝ်းႁူဝ်ႇ + ၵေးဢၼ်ႇ + ၸူဝ်းဢူဝ်ႇ + မေးရႄၵိ + မၼ်းၸီႇ + ၵၼ်းပုၼ်ႇ + ဢႅၼ်းပူဝ်ႇ + တႅၼ်းၼႃႉ + ၸူဝ်းၵျူဝ်ႇ + ၵႅၼ်းရူဝ်ၵု + ႁူဝ်းဢီႇ + သျူဝ်းတူဝ်ၵု + ၵျူဝ်းႁူဝ်ႇ + ၵႅၼ်းပုၼ်ႇ + ၵၼ်းပူဝ်ႇ + ဢႅၼ်းၵျူဝ်ႇ + ၵၼ်းဢႅၼ်ႇ + ႁူဝ်းရႄၵိ + မေးဝႃႇ + ဢၼ်းဢီႇ + တႅၼ်းမေႇ + ၵၼ်းသေႇ + ၵျူဝ်းဝႃႇ + ပုၼ်းၵႃႇ + ပုၼ်းသေႇ + တႅၼ်းပူဝ်ႇ + ၵူဝ်းၵႃႇ + ၵႃးဢီႇ + ဢၼ်းသေႇ + မၼ်းဢႅၼ်ႇ + ပုၼ်းၵျူႇ + ၵႅၼ်းၸီႇ + ၵေးဢူဝ်ႇ + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + + ၾႃႇဝႃႇတိၼ်ႇ + ဢေႃးတီႇပႄႇႁႅတ်ႉ + ၶူဝ်ႇရၢတ်ႉ + တီးရ် + မေႃႇတတ်ႉ + သျႃးရိဝႃႇ + မႄးႁႃႇ + ဢပၢၼ်ႇ + ဢႃႇၸႃႇ + တေႇ + ပႃႇမၢၼ်ႇ + ဢႅတ်ႉၾႅၼ်ႇ + + + ၾႃႇဝႃႇတိၼ်ႇ + ဢေႃးတီႇပႄႇႁႅတ်ႉ + ၶူဝ်ႇရၢတ်ႉ + တီးရ် + မေႃႇတတ်ႉ + သျႃးရိဝႃႇ + မႄးႁႃႇ + ဢပၢၼ်ႇ + ဢႃႇၸႃႇ + တေႇ + ပႃႇမၢၼ်ႇ + ဢႅတ်ႉၾႅၼ်ႇ + + + + + ၾႃႇဝႃႇတိၼ်ႇ + ဢေႃးတီႇပႄႇႁႅတ်ႉ + ၶူဝ်ႇရၢတ်ႉ + တီးရ် + မေႃႇတတ်ႉ + သျႃးရိဝႃႇ + မႄးႁႃႇ + ဢပၢၼ်ႇ + ဢႃႇၸႃႇ + တေႇ + ပႃႇမၢၼ်ႇ + ဢႅတ်ႉၾႅၼ်ႇ + + + ၾႃႇဝႃႇတိၼ်ႇ + ဢေႃးတီႇပႄႇႁႅတ်ႉ + ၶူဝ်ႇရၢတ်ႉ + တီးရ် + မေႃႇတတ်ႉ + သျႃးရိဝႃႇ + မႄးႁႃႇ + ဢပၢၼ်ႇ + ဢႃႇၸႃႇ + တေႇ + ပႃႇမၢၼ်ႇ + ဢႅတ်ႉၾႅၼ်ႇ + + + + + + ပီပႃႇသျႃး + + + ပီပႃႇသျႃး + + + ပီပႃႇသျႃး + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + ပီဢွၼ်တၢင်းထၢႆႇဝၢၼ်း + ထၢႆႇဝၢၼ်း + + + ပဢတ. ထၢႆႇဝၢၼ်း + ထၢႆႇဝၢၼ်း + + + ပဢတ. ထၢႆႇဝၢၼ်း + ထၢႆႇဝၢၼ်း + + + + + + G y MMMM d - EEEE + + + + + G y MMMM d + + + + + G y MMM d + + + + + G y-MM-dd + + + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + {1} ၶၢဝ်းယၢမ်း {0} + + + + + {1} {0} + + + + + {1} {0} + + + + d - E + G y-MM-dd - E + G y MMM d - E + MM-dd - E + MMM d - E + GGGGG y-MM-dd - E + G y MMM d - E + + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – GGGGG y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – G y MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + MM-dd - E – MM-dd - E + MM-dd - E – MM-dd - E + + + MMM d - E – MMM d - E + MMM d - E – MMM d - E + + + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + GGGGG y-MM-dd - E – y-MM-dd - E + + + G y MMM d - E – MMM d - E + G y MMM d - E – MMM d - E + G y MMM d - E – y MMM d - E + + + + + + + + ပၢၼ် + + + ပၢၼ် + + + ပၢၼ် + + + ပီ + ပီၵၢႆ + ပီၼႆႉ + ပီၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ပီ + + + {0} ပီ ပူၼ်ႉမႃး + + + + ပီ + ပီၵၢႆ + ပီၼႆႉ + ပီၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ပီ + + + {0} ပီ ပူၼ်ႉမႃး + + + + ပီ + ပီၵၢႆ + ပီၼႆႉ + ပီၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ပီ + + + {0} ပီ ပူၼ်ႉမႃး + + + + သၢမ်လိူၼ်ႁွပ်ႈ + သၢမ်လိူၼ်ႁွပ်ႈ လိုၼ်းသုတ်း + သၢမ်လိူၼ်ႁွမ်ႈၼႆႉ + သၢမ်လိူၼ်ႁွပ်ႈၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} သၢမ်လိူၼ်ႁွပ်ႈ + + + {0} သၢမ်လိူၼ်ႁွပ်ႈ ပူၼ်ႉမႃး + + + + သၢမ်လိူၼ်ႁွပ်ႈ + သလႁ. လိုၼ်းသုတ်း + သလႁ. ၼႆႉ + သလႁ. ၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} သလႁ. + + + {0} သလႁ. ပူၼ်ႉမႃး + + + + သၢမ်လိူၼ်ႁွပ်ႈ + သလႁ. လိုၼ်းသုတ်း + သၢမ်လိူၼ်ႁွပ်ႈၼႆႉ + သလႁ. ၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} သလႁ. + + + {0} သလႁ. ပူၼ်ႉမႃး + + + + လိူၼ် + လိူၼ်ပူၼ်ႉမႃး + လိူၼ်ၼႆႉ + လိူၼ်ၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} လိူၼ် + + + {0} လိူၼ်ပူၼ်ႉမႃး + + + + လိူၼ် + လိူၼ်ပူၼ်ႉမႃး + လိူၼ်ၼႆႉ + လိူၼ်ၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} လိူၼ် + + + {0} လိူၼ်ပူၼ်ႉမႃး + + + + လိူၼ် + လိူၼ်ပူၼ်ႉမႃး + လိူၼ်ၼႆႉ + လိူၼ်ၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} လိူၼ် + + + {0} လိူၼ်ပူၼ်ႉမႃး + + + + ဝူင်ႈ + ဝူင်ႈပူၼ်ႉမႃး + ဝူင်ႈၼႆႉ + ဝူင်ႈၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝူင်ႈ + + + {0} ဝူင်ႈပူၼ်ႉမႃး + + ဝူင်ႈ {0} + + + ဝူင်ႈ + ဝူင်ႈပူၼ်ႉမႃး + ဝူင်ႈၼႆႉ + ဝူင်ႈၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝူင်ႈ + + + {0} ဝူင်ႈပူၼ်မႃး + + ဝူင်ႈ {0} + + + ဝူင်ႈ + ဝူင်ႈပူၼ်ႉမႃး + ဝူင်ႈၼႆႉ + ဝူင်ႈၼႃႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝူင်ႈ + + + {0} ဝူင်ႈပူၼ်မႃး + + ဝူင်ႈ {0} + + + ဝူင်ႈၶွင်လိူၼ် + + + ဝူင်ႈၶွင်လိူၼ် + + + ဝူင်ႈၶွင်လိူၼ် + + + ဝၼ်း + မိူဝ်ႈဝႃး + မိူဝ်ႈၼႆႉ + မိူဝ်ႈၽုၵ်ႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်း + + + {0} ဝၼ်းပူၼ်ႉမႃး + + + + ဝၼ်း + မိူဝ်ႈဝႃး + မိူဝ်ႈၼႆႉ + မိူဝ်ႈၽုၵ်ႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်း + + + {0} ဝၼ်းပူၼ်ႉမႃး + + + + ဝၼ်း + မိူဝ်ႈဝႃး + မိူဝ်ႈၼႆႉ + မိူဝ်ႈၽုၵ်ႈ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်း + + + {0} ဝၼ်းပူၼ်ႉမႃး + + + + ဝၼ်းၶွင်ပီ + + + ဝၼ်းၶွင်ပီ + + + ဝၼ်းၶွင်ပီ + + + ဝၼ်းၶွင်ဝူင်ႈ + + + ဝၼ်းၶွင်ဝူင်ႈ + + + ဝၼ်းၶွင်ဝူင်ႈ + + + ဝၼ်းၼႂ်းဝူင်ႈၶွင်လိူၼ် + + + ဝၼ်းၼႂ်းဝူင်ႈၶွင်လိူၼ် + + + ဝၼ်းၼႂ်းဝူင်ႈၶွင်လိူၼ် + + + ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + ဝၼ်းဢႃးတိတ်ႉၼႆႉ + ဝၼ်းဢႃးတိတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢႃးတိတ်ႉ + + + {0} ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + ဝၼ်းဢႃးတိတ်ႉၼႆႉ + ဝၼ်းဢႃးတိတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢႃးတိတ်ႉ + + + {0} ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + ဝၼ်းဢႃးတိတ်ႉၼႆႉ + ဝၼ်းဢႃးတိတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢႃးတိတ်ႉ + + + {0} ဝၼ်းဢႃးတိတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းၸၼ်ပူၼ်ႉမႃး + ဝၼ်းၸၼ်ၼႆႉ + ဝၼ်းၸၼ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၸၼ် + + + {0} ဝၼ်းၸၼ်ပူၼ်ႉမႃး + + + + ဝၼ်းၸၼ်ပူၼ်ႉမႃး + ဝၼ်းၸၼ်ၼႆႉ + ဝၼ်းၸၼ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၸၼ် + + + {0} ဝၼ်းၸၼ်ပူၼ်ႉမႃး + + + + ဝၼ်းၸၼ်ပူၼ်ႉမႃး + ဝၼ်းၸၼ်ၼႆႉ + ဝၼ်းၸၼ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၸၼ် + + + {0} ဝၼ်းၸၼ်ပူၼ်ႉမႃး + + + + ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + ဝၼ်းဢင်းၵၢၼ်းၼႆႉ + ဝၼ်းဢင်းၵၢၼ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢင်းၵၢၼ်း + + + {0} ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + + + + ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + ဝၼ်းဢင်းၵၢၼ်းၼႆႉ + ဝၼ်းဢင်းၵၢၼ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢင်းၵၢၼ်း + + + {0} ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + + + + ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + ဝၼ်းဢင်းၵၢၼ်းၼႆႉ + ဝၼ်းဢင်းၵၢၼ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းဢင်းၵၢၼ်း + + + {0} ဝၼ်းဢင်းၵၢၼ်းပူၼ်ႉမႃး + + + + ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + ဝၼ်းပုတ်ႉၼႆႉ + ဝၼ်းပုတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းပုတ်ႉ + + + {0} ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + ဝၼ်းပုတ်ႉၼႆႉ + ဝၼ်းပုတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းပုတ်ႉ + + + {0} ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + ဝၼ်းပုတ်ႉၼႆႉ + ဝၼ်းပုတ်ႉတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းပုတ်ႉ + + + {0} ဝၼ်းပုတ်ႉပူၼ်ႉမႃး + + + + ဝၼ်းၽတ်းပူၼ်ႉမႃး + ဝၼ်းၽတ်းၼႆႉ + ဝၼ်းၽတ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၽတ်း + + + {0} ဝၼ်းၽတ်းပူၼ်ႉမႃး + + + + ဝၼ်းၽတ်းပူၼ်ႉမႃး + ဝၼ်းၽတ်းၼႆႉ + ဝၼ်းၽတ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၽတ်း + + + {0} ဝၼ်းၽတ်းပူၼ်ႉမႃး + + + + ဝၼ်းၽတ်းပူၼ်ႉမႃး + ဝၼ်းၽတ်းၼႆႉ + ဝၼ်းၽတ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းၽတ်း + + + {0} ဝၼ်းၽတ်းပူၼ်ႉမႃး + + + + ဝၼ်းသုၵ်းပူၼ်ႉမႃး + ဝၼ်းသုၵ်းၼႆႉ + ဝၼ်းသုၵ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသုၵ်း + + + {0} ဝၼ်းသုၵ်းပူၼ်ႉမႃး + + + + ဝၼ်းသုၵ်းပူၼ်ႉမႃး + ဝၼ်းသုၵ်းၼႆႉ + ဝၼ်းသုၵ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသုၵ်း + + + {0} ဝၼ်းသုၵ်းပူၼ်ႉမႃး + + + + ဝၼ်းသုၵ်းပူၼ်ႉမႃး + ဝၼ်းသုၵ်းၼႆႉ + ဝၼ်းသုၵ်းတေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသုၵ်း + + + {0} ဝၼ်းသုၵ်းပူၼ်ႉမႃး + + + + ဝၼ်းသဝ်ပူၼ်ႉမႃး + ဝၼ်းသဝ်ၼႆႉ + ဝၼ်းသဝ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသဝ် + + + {0} ဝၼ်းသဝ်ပူၼ်ႉမႃး + + + + ဝၼ်းသဝ်ပူၼ်ႉမႃး + ဝၼ်းသဝ်ၼႆႉ + ဝၼ်းသဝ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသဝ် + + + {0} ဝၼ်းသဝ်ပူၼ်ႉမႃး + + + + ဝၼ်းသဝ်ပူၼ်ႉမႃး + ဝၼ်းသဝ်ၼႆႉ + ဝၼ်းသဝ်တေမႃး + + ၼႂ်းၶၢဝ်းတၢင်း {0} ဝၼ်းသဝ် + + + {0} ဝၼ်းသဝ်ပူၼ်ႉမႃး + + + + ၶၢဝ်းယၢမ်းဝၼ်း + + + ၶၢဝ်းယၢမ်းဝၼ်း + + + ၶၢဝ်းယၢမ်းဝၼ်း + + + မူင်း + ၸူဝ်ႈမူင်းၼႆႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸူဝ်ႈမူင်း + + + {0} ၸူဝ်ႈမူင်းပူၼ်ႉမႃး + + + + မူင်း + ၸူဝ်ႈမူင်းၼႆႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸူဝ်ႈမူင်း + + + {0} ၸူဝ်ႈမူင်းပူၼ်ႉမႃး + + + + မူင်း + ၸူဝ်ႈမူင်းၼႆႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸူဝ်ႈမူင်း + + + {0} ၸူဝ်ႈမူင်းပူၼ်ႉမႃး + + + + မိၼိတ်ႉ + မိၼိတ်ႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} မိၼိတ်ႉ + + + {0} မိၼိတ်ႉပူၼ်ႉမႃး + + + + မိၼိတ်ႉ + မိၼိတ်ႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} မိၼိတ်ႉ + + + {0} မိၼိတ်ႉပူၼ်ႉမႃး + + + + မိၼိတ်ႉ + မိၼိတ်ႉ + + ၼႂ်းၶၢဝ်းတၢင်း {0} မိၼိတ်ႉ + + + {0} မိၼိတ်ႉပူၼ်ႉမႃး + + + + သႅၵ်ႉၵၢၼ်ႉ + ယၢမ်းလဵဝ် + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸႅၵ်ႉၵၢၼ်ႉ + + + {0} ၸႅၵ်ၵၢၼ်ႉပူၼ်ႉမႃး + + + + သႅၵ်ႉၵၢၼ်ႉ + ယၢမ်းလဵဝ် + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸႅၵ်ႉၵၢၼ်ႉ + + + {0} ၸႅၵ်ၵၢၼ်ႉပူၼ်ႉမႃး + + + + သႅၵ်ႉၵၢၼ်ႉ + ယၢမ်းလဵဝ် + + ၼႂ်းၶၢဝ်းတၢင်း {0} ၸႅၵ်ႉၵၢၼ်ႉ + + + {0} ၸႅၵ်ၵၢၼ်ႉပူၼ်ႉမႃး + + + + ၸူၼ်ႇၶၢဝ်းယၢမ်း + + + ၸူၼ်ႇ + + + ၸူၼ်ႇ + + + + ၶၢဝ်းယၢမ်း {0} + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း {0} + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း {0} + + + ၶၢဝ်းယၢမ်းလုမ်ႈၾႃႉ + + + + ဢမ်ႇႁူႉ ဢွင်ႈတီႈ + + + ဢႅၼ်ႇတူဝ်ႇရႃႇ + + + တူႇပၢႆး + + + ၵႃႇပူး + + + ဢႅၼ်ႇထီႇၵႂႃႇ + + + ဢႅၼ်ႇၵုၺ်ႇလႃႇ + + + တီႇရႃႇၼႃႇ + + + ယႄႇရႄႇဝၼ်ႇ + + + လူႇဢၼ်ႇတႃႇ + + + တႃႈ ရူဝ်ႇထႄႇရႃႇ + + + ပၢမ်းမႃႇ + + + တႃႈ ထရူဝ်း + + + တႃႈ သျူဝ်းဝႃႇ + + + တႃႈ မေႃသၼ်ႇ + + + တေးဝိတ်ႉ + + + တႃႈ ဝေႃႉသ်တွၵ်ႉ + + + တႃႈ ၶေႇသီႇ + + + တႃႈ တူႇမွၼ်ႉ တဝီႇလ် + + + တႃႈ မႅၵ်ႉမူႇတူဝ်ႇ + + + ရီႇယူဝ်ၵႃလႄႇၵူဝ်ႇ + + + မႅၼ်ႇတူဝ်ႇၸႃႇ + + + သႅၼ်းႁွၼ်ႇ + + + ဢူသဝၢႆးဢႃႇ + + + လႃႇရီႇယူဝ်ႇႁႃႇ + + + သႅၼ်းလူးဝိတ်ႉ + + + ၶႃႇတႃႇမႃႇၵႃႇ + + + သႃႇလ်တႃႇ + + + ႁူႁုၺ်း + + + တူႇၵူဝ်ႇမၢၼ်ႈ + + + ၶူဝ်ႇတူဝ်ႇပႃႇ + + + ပူၺ်းၼူဝ်ႇဢၢႆးရႅတ်ႉ + + + ပႃးၵူဝ်းပႃးၵူဝ်း + + + ဝီႇယႅၼ်ႇၼႃႇ + + + ၽိူတ်ႉ + + + ဢိဝ်းၵလႃး + + + တႃႇဝိၼ်ႇ + + + ဢတႄလဵတ်ႉ + + + ပရူၵ်ႉၵႅၼ်းႁေးလ် + + + မႄးလ်ပူၼ်း + + + ႁူဝ်ပၢတ်ႉ + + + လိၼ်ႇတီႇမႅၼ်ႇ + + + သိတ်ႇတၼီႇ + + + ပရိတ်ႉသပႅၼ်ႇ + + + မႅၵ်ႉၶႂႃရီႇ + + + ၵုၼ်လွတ်ႉႁၢဝ်း + + + ဢႃႇရူးပႃး + + + မႃႇရီႇႁၢမ်ႇ + + + ပႃၵူႇ + + + သႃႇရႃႇယေႇဝူဝ်ႇ + + + ပႃးပေႇတူတ်ႈ + + + ၻႃႇၵႃႇ + + + ပရတ်ႈသႄးလ် + + + ဢူဝ်ႇၵႃႇတူဝ်ႇၵူဝ်ႇ + + + သူဝ်ႇၾီႇယႃႇ + + + ပႃႇႁဵၼ်း + + + ပူၸုမ်ပူရႃႇ + + + ပူဝ်ႇတူဝ်ႇ-ၼူဝ်ႇဝူဝ်ႇ + + + သဵင်ႉပၢတ်ႉထႄးလႄးမီႇ + + + ပႃႇမိဝ်းတႃး + + + ပရူႇၼၢႆး + + + လႃႉပႃႇ + + + ၶရႃးလႅၼ်းတႅၵ်ႉ + + + ဢီရူၼႄပႄႇ + + + ရီႇယူဝ်ႇပရၼ်ႇၵူဝ်ႇ + + + ပွတ်ႈတူဝ်းဝႄႇႁူဝ်ႇ + + + ပူဝ်ႇဢႃႇဝီႇသတႃႇ + + + မၼၢဝ်းသ် + + + ၶူယႃးပႃႇ + + + သၼ်ႇတႃႇရႅမ်ႇ + + + ၶႅမ်ႇပူဝ်ႇၵရႅၼ်ႇတီႇ + + + ပႄႇလႅမ်း + + + ဢႃႇရႃႇၵႂႃႇဢီႇၼႃႇ + + + သၢဝ်ပၢဝ်းလူဝ်ႇ + + + ပႁီးယႃႇ + + + ၾူတ်ႉတလႄၸႃႇ + + + မႃးသေးဢူဝ်ႇ + + + ရႅတ်ႉသီႇၾီႇ + + + ၾႃႇၼႅၼ်ႇတူဝ်ႇ တႄႇၼူဝ်ႇရွၼ်ႇႁႃႇ + + + ၼၢတ်ႉသ်သေႃ + + + ထိမ်းၽူး + + + ၵႃႇပူဝ်ႇရူဝ်ႇၼႄႇ + + + မိၼ်ႉသ်ၶ် + + + ပႄႇလိတ်ႈ + + + တေႃးသၼ်ႇ + + + ဝၢႆႉႁွတ်ႉ + + + ဢီႇၼူးဝိၵ်ႉ + + + ဝႅၼ်ႇၵူဝ်ႇဝႃႇ + + + ၾူတ်ႉၼႄႇလ်သၼ်ႇ + + + တေႃးသၼ်ႇၶရိၵ်ႉ + + + ၶရႅတ်ႉသတၼ်ႇ + + + ဢႅတ်ႉမွၼ်ႇတွၼ်ႇ + + + သဝိတ်ႉၶႃးရႅၼ်ႉ + + + ၶႅမ်းပရိတ်ႉပေး + + + ရီႇၵျိၼ်ႇၼႃႇ + + + ဝိၼ်းၼီႇပႅၵ်ႉ + + + ရႅတ်ႉသူဝ်ႇလုတ်ႉ + + + ရၼ်ၵိၼ်းဢိၼ်းလႅတ်ႉ + + + ဢႃႇတီႇၵူဝ်ႇၵၼ်ႇ + + + တူဝ်ႇရွၼ်ႇတူဝ်ႇ + + + ဢီႇၶႃးလူးဝိတ်ႉ + + + မွၼ်ႉတွၼ်ႇ + + + ႁႄႇလီႇၾႅၵ်ႉ + + + ၵုတ်ႉသ်ပေး + + + ၵလဵတ်ႉသ်ပေး + + + ပလၼ်ႇ-သႅပ်ႉပလုၼ်ႇ + + + သဵင်ႉၵျွၼ်ႇ + + + မူႇၵုၼ် ၵူဝ်ႇၵူဝ်းသ် + + + ၶိၼ်သျႃးသႃႇ + + + လူႇပုမ်ႇပႃႇသျီႇ + + + ပင်ၵီႈ + + + ပရႃၸဝီးလ် + + + ၸူႇရိတ်ႉ + + + ဢႃႇပီႇၸၢၼ်ႇ + + + ရႃရူဝ်ထွင်းၵႃႇ + + + ၵုၼ်ဢီႇသတႃႇ + + + ၵူဝ်ႇႁႆၵေး + + + ပုၼ်းတႃႉဢရႅၼ်ႇၼတ်ႉသ် + + + သႅၼ်ႇတီႇယႃႇၵူဝ်ႇ + + + တူဝ်ႇဢႃႇလႃႇ + + + ဢူႇရုမ်ၶီႇ + + + သျၢင်ႉႁၢႆး + + + ပူဝ်ႇၵူဝ်ႇတႃႇ + + + ၵေႃးသတႃႇရိၵႃႇ + + + ႁႃႇဝႃးၼႃး + + + ၶဵပ်ႉဝႄႇတီႇ + + + ၵူးရႃႇသၢဝ်ႇ + + + မူႇၵုၼ် ၶရိတ်ႉသမၢတ်ႉ + + + ၼိၵူဝ်ႇသျႃး + + + ၾႃႇမႃႇၵူးသတႃႇ + + + ပရၢၵ်ႉ + + + ပူႇသိင်ႇၵႅၼ်ႇ + + + ပႃႇလိၼ်ႇ + + + ၵျီႇပူးတီႇ + + + ၵူဝ်ႇပႅၼ်ႇႁေႇၵႅၼ်ႇ + + + တူဝ်ႇမီႇၼိၵ + + + သႅၼ်ႇတူဝ်ႇ တူဝ်ႇမိၼ်ႇၵူဝ်ႇ + + + ဢႄးလ်ၸီႇယႃႇ + + + ၵုၼ်ၵႃလႃပၵူဝ်ႉ + + + ၵူဝ်ႇယႃႇၶိဝ်း + + + တႃႇလိၼ်ႇ + + + ၶၢႆႇရူဝ်ႇ + + + ဢႄးလ်ဢၢႆႈယုၼ်း + + + ဢတ်ႉသ်မႃႇရႃႇ + + + ၶႅၼ်ႇၼႃႇရီႇ + + + သူးတ + + + မတ်ႉတရိတ်ႉ + + + ဢႅတ်ႉတိတ်ႉသ်ဢႃႇပႃႇပႃႇ + + + ႁႄႇလ်သိင်းၵီႇ + + + ၾီႇၵျီႇ + + + သတႅၼ်းလီႇ + + + ၶျူၵ်ႉ + + + ပူၼ်းပေႇ + + + ၵွတ်ႉသ်ရေး + + + ၾႃႇရူဝ်ႇ + + + ၽႄးရိတ်ႉသ် + + + လီပရႄႇဝီးလ် + + + + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢိင်းၵလဵတ်ႈ + + လၼ်ႇတၼ်ႇ + + + ၵရႄႇၼႃႇတႃႇ + + + တပီႇလီႇသီႇ + + + ၶႃယႅၼ်ႈ + + + ၵႂၢၼ်းသီ + + + ဢၵ်ႉၵရႃႇ + + + ၵျီႇပရေႃးတႃး + + + ထူႇလႄႇ + + + ၼုၵ်ႉ + + + ဢိတ်ႉတူဝ်ၵူဝ်တူဝ်မိတ်ႉ + + + တႅၼ်းမၢၵ်ႈသျၼ်ႇ + + + ပၼ်ႇၸူႇလ် + + + ၶူဝ်ႇၼႃႇၵရီႇ + + + ၵႂႃးတီႇလုပ်ႈ + + + မႃႇလႃႇပူဝ်ႇ + + + ဢေႇတိၼ်ႇ + + + ၵျေႃႇၵျႃႇ ပွတ်းၸၢၼ်း + + + ၵႂႃႇတမႃႇလႃႇ + + + ၵႂၢမ်ႇ + + + ပိတ်ႈသၢဝ်ႇ + + + ၵၢႆႇယႃးၼႃႇ + + + ႁွင်းၵွင်း + + + တေႇၵူႇသီႇၵႃႇပႃႇ + + + ၸႃႇၵရႅပ်ႉ + + + ၽူတ်ႉဢူဝ်ပရိၼ်ႉၸ် + + + ပူႇတႃႇပႅတ်ႉ + + + ၵျႃႇၵႃႇတႃႇ + + + ပွၼ်းတီႇယႃႇၼၵ်ႉ + + + မႃႇၵႃႇသႃႇ + + + ၵျႃႉယပူႇရ + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢၢႆးရိတ်ႉ + + တၢပ်ႇလိၼ်ႇ + + + ယေႇရုသလႅမ်ႇ + + + ၵုၼ်မႅၼ်း + + + ၵူဝ်ႇၵႃႇတႃႇ + + + ၵုၼ်ၶျႃးၵူဝ်ႉသ် + + + ပႅၵ်ႉတႅၵ်ႉ + + + တႁႃႇရၢၼ်ႇ + + + ရီႇၵျႃႇဝိၵ်ႉ + + + ရူမ်း + + + ၵျႃႇသီႇ + + + ၵျႃႇမေႇၵႃႇ + + + ဢမ်မၢၼ်ႈ + + + တူဝ်ႇၵျူဝ်ႇ + + + ၼၢႆႇရူဝ်ႇပီႇ + + + ပိတ်ႉသၵႅၵ်ႉ + + + ၽၼူမ်းပဵၼ် + + + ၵုၼ်ၶႅၼ်းတွၼ်ႇ + + + ၶိရိတ်ႉတိမႃႇတီႇ + + + တႃႇရႃႇဝႃႇ + + + ၶူဝ်ႇမူဝ်ႇရူတ်ႈ + + + သဵင်ႉၶိတ်ႈ + + + ၽျွင်းယၢင်း + + + သူဝ်းလ် + + + ၶူႇဝဵတ်ႈ + + + ၶေးမႅၼ်း + + + ဢႅၵ်ႉတၢဝ်ႉ + + + ဢေႃႇရႄႇလ် + + + ဢႃႇတီးရၢဝ်း + + + ဢႅၵ်ႉတူဝ်ႇပီႇ + + + ၶူတ်ႉသတၼ်ႇၼေႇ + + + ၶုၺ်ႇၸီးလူဝ်ႇတႃႇ + + + ဢႄးလ်မႃႇတီႇ + + + ဝဵင်းၸၼ် + + + ပႄႇရုတ်ႉ + + + သဵင်ႉလူႉသျႃႇ + + + ဝႃႇတူႇၸ် + + + ၵူဝ်ႇလမ်ႇပူဝ်ႇ + + + မွၼ်ႇရူဝ်ႇဝီႇယႃႇ + + + မႃႇသႄႇရူႇ + + + ဝီးလ်ၼီးယႅတ်ႉသ် + + + လၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + + + ရီႇၵႃႇ + + + ထရီႇပူဝ်ႇလီႇ + + + ၶႃႇသႃႇပလၼ်ႇၵႃႇ + + + မူဝ်ႇၼႃႉၶူဝ်ႇ + + + ၶိသိၼေႃႇ + + + ပူဝ်ႇၵူဝ်ႇရီႇၵႃႇ + + + မႃႇရိၵူတ်ႉ + + + ဢႅၼ်ႇတၼႃႇၼႃႇရီႇဝူဝ်ႇ + + + ၶႂႃးၵျလၢႆး + + + မၵျူးရူဝ်ႇ + + + သၵူပ်ႉပီႇယႃႇ + + + ပႃႇမႃႇၵူဝ်ႇ + + + တႃႈၵုင်ႈ + + + ၶူဝ်ဝေတေး + + + ဢူလၼ်ပႃတႃ + + + မႃႇၵၢဝ်ႈ + + + သၢႆပၼ်ႇ + + + မႃးတိၼ်ႇၼိၵ်ႈ + + + ၼူဝ်ႇဢႅၵ်ႉၸွတ်ႉ + + + မွၼ်ႇသႄးရႅတ်ႉ + + + မေႃးတႃႇ + + + မေႃးရီႇသႃႇ + + + မေႃႇတိပ်ႈ + + + ပလႅၼ်ႇတၢႆႇ + + + တီႇႁူဝ်ႇၼႃႇ + + + ဢႄ​ရမူဝ်သီးလူဝ်ႇ + + + သီႇယူဝ်ႇတတ်ႉ ၸူဝ်ႇရႅတ်ႉ + + + မႃႇၸတ်ႇလၼ်း + + + ၶျီႇဝႃႇဝႃႇ + + + ပႃႇႁီးယႃး တႄႇ ပၼ်ႇတႄႇရႅတ်ႉ + + + ဢူဝ်ႇၸီႇၼႃႇၵႃႇ + + + မွၼ်ႇတႄႇရီႇ + + + ဝဵင်းလူင်မႅၵ်ႇသီႇၵူဝ်ႇ + + + မႃႇတႃႇမေႃးရူဝ်ႉသ် + + + မႄႇရီႇတႃႇ + + + ၵႅၼ်ႇၵူၼ်ႇ + + + ၵႂႃႇလႃႇလုမ်းပူႈ + + + ၵူႇၶျိင်း + + + မႃႇပူႇတူဝ်ႇ + + + ဝိၼ်းႁွၵ်ႉ + + + ၼူမေးယႃႇ + + + ၼီးယႃးမေႇ + + + ၵုၼ်ၼေႃႇၾုၵ်ႉ + + + လႃႇၵွတ်ႉသ် + + + မၼႃးၵႂႃႇ + + + ဢႅမ်ႇသတႃႇတမ်ႇ + + + ဢွတ်ႉသလူဝ်ႇ + + + ၵၢတ်ႈမၢၼ်ႈတူႇ + + + ၼၢဝ်ရူး + + + ၼီးဝႄႇ + + + မူႇၵုၼ် ၶျႅတ်ႉထမ်ႇ + + + ဢွၵ်ႉလႅၼ်ႇ + + + မတ်ႉသၵႅတ်ႉ + + + ပႃႈၼႃးမႃး + + + လိမႃႇ + + + တႁီႇတီႇ + + + မႃၶေးသႅတ်ႉသ် + + + ၵမ်ႇပီႇယႃႇ + + + ပွတ်ႉမွတ်ႉသ်ပီႇ + + + ပူးၵိၼ်ဝႄႇလ် + + + မၼီႇလႃႇ + + + ၵႃႇရႃႇၶျီႇ + + + ဝေႃးသေႃး + + + သဵင်ႉပီႇယႃႇ + + + ၽိတ်ႉၶႅၼ်ႇ + + + ပေႃႇတူဝ်ႇရီးၵူဝ်း + + + ၵႃႇၸႃႇ + + + ႁႄႇပရွၼ်ႇ + + + ဢႃႇၸူဝ်ႇရႅတ်ႉ + + + မႃႇတီႇရႃႇ + + + လိတ်ႉသ်ပွၼ်ႇ + + + ပႃႇလၢဝ်း + + + ဢႃးသုၼ်းသီႇဢွၼ်ႇ + + + ၶႃႇတႃႇ + + + ရေႇၼီႇယၼ်ႇ + + + ပူႇၶႃႇရႅတ်ႉ + + + ပႄႇလ်ၵရဵတ်ႉ + + + ၵလိၼ်းဢိၼ်းၵရတ်ႉ + + + မွတ်ႉသ်ၵူဝ်ႇ + + + ဝူဝ်ႇၵူဝ်ႇၵရၢတ်ႉ + + + သႃႇရႃႇတၢပ်ႈ + + + ဢႅတ်ႉသထရႃႇၶၢၼ်ႇ + + + ဢူလီယႃၼူဝ်ႇသ်ၶ် + + + ၶီးႁွပ်ႇၾ် + + + သႃႇမႃႇရႃႇ + + + ယေႇၵႃႇတႄႇရိၼ်ႇပၢၵ်ႉ + + + ဢူမ်းသ်ၶ် + + + ၼူဝ်ႇဝူဝ်ႇသီႇပၢတ်ႉသ်ၶ် + + + ပႃႇၼေႃး + + + တွမ်းသ်ၶ် + + + ၼူဝ်ဝူဝ်ၵုတ်ႉၸ်ၼႅတ်ႉသ်ၶ် + + + ၶရတ်ႉၼူဝ်ႇယႃႇသ်ၶ် + + + ဢိရၶုတ်ႉသ်ၶ် + + + ၶျိတ်ႉတႃႇ + + + ယၵုတ်ႉသ်ၶ် + + + ဝလႃႇတီႇဝူဝ်ႇသတွၵ်ႉ + + + ၶၼ်ႇတီႇၵႃႇ + + + သႃႇၶႃႇလိၼ်ႇ + + + ယူးဢိတ်ႉသ်ၼႄႇရႃႇ + + + မႃႇၵႃႇတၢၼ်ႇ + + + သရႅတ်ႉၼႄၵူဝ်ႇလိမ်ႇသ်ၶ် + + + ၵမ်းၶျၢတ်ႉၵႃႇ + + + ဢႃႇၼႃႇတီႇယႃႇ + + + ၵိၵႃႇလီႇ + + + ရီႇယၢတ်ႉ + + + ၵႂႃးတႄႇလ်ၶႅၼ်ႇၼႄးလ် + + + မႁေႇ + + + ၶႃးတုမ်း + + + သတွၵ်ႉႁွမ်း + + + သိင်ႇၵႃႇပူဝ်ႇ + + + သဵင်ႉႁႄးလႄးၼႃႇ + + + လူႇပလီႇယႃႇၼႃႇ + + + လွင်းယီးယႃးပဵၼ်း + + + ပရႃႇတိတ်ႉသလႃႇဝႃႇ + + + ၾရီးတၢဝ်း + + + သၼ်းမႃႇရီႇၼေႃႇ + + + တၢၵ်ႇၵႃႇ + + + မူဝ်ၵႃတီးသျူး + + + ပႃႇရႃႇမႃႇရီႇပူဝ်ႇ + + + ယူးပႃး + + + သူၼ်ႇတူဝ်ႇမေး + + + ဢႄႇသႃႇဝႃႇတေႃႇ + + + လူဝ်းဝႃးပရိၼ်ႉသ်ၶႂႃႇတႃး + + + တမ်ႇမတ်ႉသၵတ်ႉ + + + ပႃပႃၼႄႇ + + + ၵရႅၼ်းထိူၵ်ႉ + + + ဢႅၼ်ႇၸႃႇမႅၼ်ႇၼႃႇ + + + မူႇၵုၼ်ၶိူဝ်ႇၵူႇလႅၼ်ႇ + + + ​လူဝ်ႇမႄႇ + + + ၵုင်းထဵပ်ႈ + + + တူႇသျႅၼ်ႇပႄႇ + + + ၾႃးၵဝ်ႇၾူဝ်ႇ + + + တီႇလီႇ + + + ဢႅတ်ႉသ်ၵႃႇပတ်ႉ + + + တူးၼိတ်ႉသ် + + + ထွင်းၵႃႇတႃႇပူႇ + + + ဢိတ်ႉသတၼ်ႇပူး + + + တႃႈႁိူဝ်းသပဵၼ်ႇ + + + ၾူၼႃၾူးတီႇ + + + ထၢႆးပႄႉ + + + တႃႇဢႅတ်ႉသႃႇလမ်ႇ + + + ၶိပ်ႉၾ် + + + သိမ်ႇၾႃႇရူဝ်ႇပူဝ်ႇ + + + ၵမ်ႇပႃႇလႃႇ + + + မိတ်ႉဝေး + + + ဝဵၵ်ႉ + + + ဢတၵ်ႉ + + + ၼူမ်း + + + ဢႅၼ်ႇၶျူဝ်ႇရဵတ်ႉ + + + ယႃႇၵုတတ်ႉ + + + သိတ်ႉၵႃႇ + + + ၸူႇၼူဝ်ႇ + + + မႅတ်ႉလၶႅတ်ႉလႃႇ + + + လွတ်ႉသ်ဢႅၼ်းၵျႄးလႄႉသ် + + + ပွႆးသီႇ + + + ၽီးၼိၵ်ႉ + + + တႅၼ်ႇဝႃႇ + + + ပႄႇယူဝ်ႇလႃႇ၊ တႃႇၵူဝ်ႇတႃႇႁွင်ႇ + + + ၼိဝ်းသႄႇလမ်ႇ၊ တႃႇၵူဝ်ႇတႃႇႁွင်ႇ + + + ပွတ်းၵၢင်၊ တႃႇၵူဝ်ႇတႃႇႁွင်ႇ + + + ၶျီႇၵႃႇၵူဝ်ႇ + + + မႄၼွမ်းမၼီႇ + + + ဝိၼ်းသႅၼ်ႉ၊ ဢိၼ်းတီးယႃးၼႃး + + + ပီႇတႃႇသ်ပၢၵ်ႉ၊ ဢိၼ်းတီးယႃးၼႃး + + + တႄးလ်သီးတီး၊ ဢိၼ်းတီးယႃးၼႃး + + + ၼွၵ်ႉသ်၊ ဢိၼ်းတီးယႃးၼႃး + + + ဝီႇၼႃႇမႅၵ်ႉ၊ ဢိၼ်းတီးယႃးၼႃး + + + မရႅၼ်းၵူဝ်ႇ၊ ဢိၼ်းတီးယႃးၼႃး + + + ဢိၼ်းတီးယႃးၼႃးပူဝ်ႇလိတ်ႉသ် + + + လူးဝိတ်ႉဝီးလ် + + + ဝီးဝီႇ၊ ဢိၼ်းတီးယႃးၼႃး + + + မွၼ်ႇတီႇသႄႇလူဝ်ႇ၊ ၶႅၼ်ႇတၢၵ်ႇၵီႇ + + + တီးတရွႆႉ + + + ၼိဝ်းယွၵ်ႉ + + + မွၼ်ႇတီႇဝီးတႄးဢူဝ်ႇ + + + သႃႇမႃႇၶႅၼ်ႇ + + + တၢတ်ႉသၵႅၼ်ႇ + + + ဝႃႇတီႇၵၼ်ႇ + + + သဵင်ႉဝိၼ်ႇသႅၼ်ႇ + + + ၶႃႇရႃႇၵႅတ်ႉသ် + + + တူဝ်ႇတူဝ်ႇလႃႇ + + + သဵင်ႉထေႃးမတ်ႉသ် + + + ႁူဝ်ၶျီမိၼ်း + + + ဢီႇၾႃးတႄႇ + + + ဝႃးလိတ်ႈ လႄႈ ၾူႇတူးၼႃး + + + ဢႃပီယႃႇ + + + ဢေႇတႅၼ်ႇ + + + မႃႇယူတ်ႈ + + + ၵျူဝ်ႇႁၼ်ႇၼႅတ်ႉသ်ပၢၵ်ႉ + + + လူႇသႃႇၵႃႇ + + + ႁႃႇရႃႇရႄႇ + + + + ၶၢဝ်းယၢမ်း ဢေႇၵႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢေႇၵႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢေႇၵႃႇ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၾၵၢၼ်ႇၼီႇသတၢၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၾရိၵ ပွတ်းၵၢင် + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၾရိၵ ပွတ်းဢွၵ်ႇ + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၾရိၵၸၢၼ်း + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၾရိၵ ပွတ်းတူၵ်း + + + + + ၶၢဝ်းယၢမ်း ဢလႅတ်ႉသၵႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢလႅတ်ႉသၵႃႇ + ၶၢဝ်းယၢမ်းၵၢင်ဝၼ်း ဢလႅတ်ႉသၵႃႇ + + + + + ၶၢဝ်းယၢမ်း ဢႄးလ်မႃႇတီႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႄးလ်မႃႇတီႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႄးလ်မႃႇတီႇ + + + + + ၶၢဝ်းယၢမ်း ဢမၸွၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢမၸွၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢမၸွၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ပွတ်းၵၢင် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပွတ်းၵၢင် + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပွတ်းၵၢင် + + + + + ၶၢဝ်းယၢမ်း ပွတ်းဢွၵ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပွတ်းဢွၵ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပွတ်းဢွၵ်ႇ + + + + + ၶၢဝ်းယၢမ်း သၼ်လွႆ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သၼ်လွႆ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း သၼ်လွႆ + + + + + ၶၢဝ်းယၢမ်း ပၸိၾိၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပၸိၾိၵ်ႉ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပၸိၾိၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၼႃႇတီႇယႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၼႃႇတီႇယႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႃႇၼႃႇတီႇယႃႇ + + + + + ၶၢဝ်းယၢမ်း သႃႇမူဝ်းဝႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သႃႇမူဝ်းဝႃႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း သႃႇမူဝ်းဝႃႇ + + + + + ၶၢဝ်းယၢမ်း ဢႅၵ်ႉတၢဝ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႅၵ်ႉတၢဝ်ႉ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႅၵ်ႉတၢဝ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဢႅၵ်ႉတူဝ်ႇပီႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႅၵ်ႉတူဝ်ႇပီႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႅၵ်ႉတူဝ်ႇပီႇ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇရၢပ်ႈ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇရၢပ်ႈ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢႃႇရၢပ်ႈ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး ပွတ်းတူၵ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး ပွတ်းတူၵ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢႃႇၵျႅၼ်ႇတီးၼႃး ပွတ်းတူၵ်း + + + + + ၶၢဝ်းယၢမ်း ဢႃႇမေးၼီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇမေးၼီးယႃး + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႃႇမေးၼီးယႃး + + + + + ၶၢဝ်းယၢမ်း ဢႅတ်ႉလႅၼ်းတိၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႅတ်ႉလႅၼ်းတိၵ်ႉ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢႅတ်ႉလႅၼ်းတိၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဢေႃႉသထရေးလီးယႃး ပွတ်းၵၢင် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢေႃႉသထရေးလီးယႃး + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢေႃႉသထရေးလီးယႃး + + + + + ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း တွၼ်ႈၵၢင် ဢေႃႉသထရေးလီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း တွၼ်ႈၵၢင် ဢေႃႉသထရေးလီးယႃး + ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း တွၼ်ႈၵၢင် ၶၢဝ်းမႆႈ ဢေႃႉသထရေးလီးယႃး + + + + + ၶၢဝ်းယၢမ်း ပွတ်းဢွၵ်ႇ ဢေႃႉသထရေးလီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပွတ်းဢွၵ်ႇ ဢေႃႉသထရေးလီးယႃး + ၶၢဝ်းယၢမ်း ပွတ်းဢွၵ်ႇ ၵၢင်ဝၼ်း ဢေႃႉသထရေးလီးယႃး + + + + + ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း ဢေႃႉသထရေးလီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း ဢေႃႉသထရေးလီးယႃး + ၶၢဝ်းယၢမ်း ပွတ်းတူၵ်း ၵၢင်ဝၼ်း ဢေႃႉသထရေးလီးယႃး + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ဢႃႇၸူဝ်ႇရႅတ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢႃႇၸူဝ်ႇရႅတ်ႉ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢႃႇၸူဝ်ႇရႅတ်ႉ + + + + + ၶၢဝ်းယၢမ်း ပင်းၵလႃးတဵတ်ႈ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပင်းၵလႃးတဵတ်ႈ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ပင်းၵလႃးတဵတ်ႈ + + + + + ၶၢဝ်းယၢမ်း ၽူႇတၢၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ပူဝ်ႇလီးပီးယႃး + + + + + ၶၢဝ်းယၢမ်း ပရႃႇၸီးလီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပရႃႇၸီးလီးယႃး + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပရႃႇၸီးလီးယႃး + + + + + ၶၢဝ်းယၢမ်း ပရူႇၼၢႆး + + + + + ၶၢဝ်းယၢမ်း ၶဵပ်ႉဝႄႇတီႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶဵပ်ႉဝႄႇတီႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၶဵပ်ႉဝႄႇတီႇ + + + + + ၶၢဝ်းယၢမ်း ၶေႇသီႇ + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶျမ်ႇမူဝ်ႇရူဝ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၶျႅတ်ႉထမ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶျႅတ်ႉထမ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၶျႅတ်ႉထမ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၶျီႇလီႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶျီႇလီႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၶျီႇလီႇ + + + + + ၶၢဝ်းယၢမ်း ၶႄႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶႄႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၶႄႇ + + + + + ၶၢဝ်းယၢမ်း ၵုၼ်ၶရိတ်ႉသမၢတ်ႉ + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်ၵူဝ်ႇၵူဝ်းသ် + + + + + ၶၢဝ်းယၢမ်း ၵူဝ်ႇလမ်ႇပီႇယႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵူဝ်ႇလမ်ႇပီႇယႃႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵူဝ်ႇလမ်ႇပီႇယႃႇ + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်ၶုၵ်ႈ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မူႇၵုၼ်ၶုၵ်ႈ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ မူႇၵုၼ်ၶုၵ်ႈ + + + + + ၶၢဝ်းယၢမ်း ၵူးပႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵူးပႃး + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵူးပႃး + + + + + ၶၢဝ်းယၢမ်း တေးဝိတ်ႉ + + + + + ၶၢဝ်းယၢမ်း တူႇမွၼ်ႉ တဝီႇလ် + + + + + ၶၢဝ်းယၢမ်း တီႇမေႃးလႅတ်ႉသ်တႄး + + + + + ၶၢဝ်းယၢမ်း ၵုၼ်ဢီႇသတႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵုၼ်ဢီႇသတႃႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵုၼ်ဢီႇသတႃႇ + + + + + ၶၢဝ်းယၢမ်း ဢေႇၵႂႃႇတေႃႇ + + + + + ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းၵၢင် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းၵၢင် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ယူးရူပ်ႉ ပွတ်းၵၢင် + + + + + ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းဢွၵ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းဢွၵ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ယူးရူပ်ႉ ပွတ်းဢွၵ်ႇ + + + + + ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းဢွၵ်ႇ ဢၼ်ၵႆတိူဝ်း + + + + + ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းတူၵ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ယူးရူပ်ႉ ပွတ်းတူၵ်း + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ယူးရူပ်ႉ ပွတ်းတူၵ်း + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ် ၾွၵ်ႉလႅၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မူႇၵုၼ် ၾွၵ်ႉလႅၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း မူႇၵုၼ် ၾွၵ်ႉလႅၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၾီႇၵျီႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၾီႇၵျီႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၾီႇၵျီႇ + + + + + ၶၢဝ်းယၢမ်း ၵုၺ်ႇယႃႇၼႃႇ ၶွင် ၾရၢင်ႇသဵတ်ႈ + + + + + ၶၢဝ်းယၢမ်း ၾရၢင်ႇသဵတ်ႈ ပွတ်းၸၢၼ်း လႄႈ ဢႅၼ်ႇတၢၵ်ႈတီးၵႃႈ + + + + + ၶၢဝ်းယၢမ်း ၵႃႇလႃႇပၵူဝ်ႉသ် + + + + + ၶၢဝ်းယၢမ်း ၵမ်ႇပီႇယႃႇ + + + + + ၶၢဝ်းယၢမ်း ၵျေႃႇၵျႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵျေႃႇၵျႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၵျေႃႇၵျႃႇ + + + + + ၶၢဝ်းယၢမ်း ၵိလ်ပႅတ်ႉ + + + + + ၶၢဝ်းယၢမ်း ၽတ်ႉၽဵင်ႇ ၵရိၼ်းဝိတ်ႉ + + + + + ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၵရိၼ်းလႅၼ်း + + + + + ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း ပွတ်းဢွၵ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း ပွတ်းဢွၵ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵရိၼ်းလႅၼ်း ပွတ်းဢွၵ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း ပွတ်းတူၵ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵရိၼ်းလႅၼ်း ပွတ်းတူၵ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵရိၼ်းလႅၼ်း ပွတ်းတူၵ်း + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵႂၢမ်ႇ + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢၢဝ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵၢႆႇယႃးၼႃႇ + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ႁႃႇဝၢႆးဢီး-ဢလူးသျၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ႁႃႇဝၢႆးဢီး-ဢလူးသျၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ႁႃႇဝၢႆးဢီး-ဢလူးသျၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ႁႃႇဝၢႆးဢီး-ဢလူးသျၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ႁွင်းၵွင်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ႁွင်းၵွင်း + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ႁွင်းၵွင်း + + + + + ၶၢဝ်းယၢမ်း ၶူဝ်ဝေတေး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶူဝ်ဝေတေး + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၶူဝ်ဝေတေး + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢိၼ်းတီးယႃး + + + + + ၶၢဝ်းယၢမ်း သမုၵ်ႉတရႃႇဢိၼ်းတီးယႃး + + + + + ၶၢဝ်းယၢမ်း ဢိၼ်ႇတူဝ်ႇၶႄႇ + + + + + ၶၢဝ်းယၢမ်း ဢိၼ်ႇတူဝ်ႇၼီးသျႃး ပွတ်းၵၢင် + + + + + ၶၢဝ်းယၢမ်း ဢိၼ်ႇတူဝ်ႇၼီးသျႃး ပွတ်းဢွၵ်ႇ + + + + + ၶၢဝ်းယၢမ်း ဢိၼ်ႇတူဝ်ႇၼီးသျႃး ပွတ်းတူၵ်း + + + + + ၶၢဝ်းယၢမ်း ဢီႇရၢၼ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢီႇရၢၼ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢီႇရၢၼ်း + + + + + ၶၢဝ်းယၢမ်း ဢိရၶုတ်ႉသ်ၶ် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢိရၶုတ်ႉသ်ၶ် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢိရၶုတ်ႉသ်ၶ် + + + + + ၶၢဝ်းယၢမ်း ဢိတ်ႇသရေး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢိတ်ႇသရေး + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢိတ်ႇသရေး + + + + + ၶၢဝ်းယၢမ်း ၵျႃႇပၢၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵျႃႇပၢၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵျႃႇပၢၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵမ်ႇၶျတ်ႉၵႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵမ်ႇၶျတ်ႉၵႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၵမ်ႇၶျတ်ႉၵႃႇ + + + + + ၶၢဝ်းယၢမ်း ၵႃႇၸၢၵ်ႈသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵႃႇၸၢၵ်ႈသတၼ်ႇ ပွတ်းဢွၵ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵႃႇၸၢၵ်ႈသတၼ်ႇ ပွတ်းတူၵ်း + + + + + ၶၢဝ်းယၢမ်း ၵၢဝ်းလီ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵၢဝ်းလီ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵၢဝ်းလီ + + + + + ၶၢဝ်းယၢမ်း ၵွတ်ႉသ်ရေး + + + + + ၶၢဝ်းယၢမ်း ၶရတ်ႉၼူဝ်ႇယႃႇသ်ၶ် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶရတ်ႉၼူဝ်ႇယႃႇသ်ၶ် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၶရတ်ႉၼူဝ်ႇယႃႇသ်ၶ် + + + + + ၶၢဝ်းယၢမ်း ၵႃႇၵိတ်ႈသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း လင်းၵႃ + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်လၢႆး + + + + + ၶၢဝ်းယၢမ်း လွတ်ႉႁၢဝ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း လွတ်ႉႁၢဝ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း လွတ်ႉႁၢဝ်း + + + + + ၶၢဝ်းယၢမ်း မႃႇၵၢဝ်ႈ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မႃႇၵၢဝ်ႈ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ မႃႇၵၢဝ်ႈ + + + + + ၶၢဝ်းယၢမ်း မႃႇၵႃႇတၢၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မႃႇၵႃႇတၢၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ မႃႇၵႃႇတၢၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း မလေးသျႃး + + + + + ၶၢဝ်းယၢမ်း မေႃႇတိပ်ႈ + + + + + ၶၢဝ်းယၢမ်း မႃၶေးသႅတ်ႉသ် + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်မႃးသျႄႇ + + + + + ၶၢဝ်းယၢမ်း မေႃးရီႇသႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မေႃးရီႇသႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ မေႃးရီႇသႃႇ + + + + + ၶၢဝ်းယၢမ်း မေႃသၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း မႅၵ်ႇသီႇၵူဝ်ႇ ပၸိၾိၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မႅၵ်ႇသီႇၵူဝ်ႇ ပၸိၾိၵ်ႉ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း မႅၵ်ႇသီႇၵူဝ်ႇ ပၸိၾိၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဢူလၼ်ပႃတႃ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢူလၼ်ပႃတႃ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢူလၼ်ပႃတႃ + + + + + ၶၢဝ်းယၢမ်း မွတ်ႉသ်ၵူဝ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း မွတ်ႉသ်ၵူဝ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ မွတ်ႉသ်ၵူဝ်ႇ + + + + + ၶၢဝ်းယၢမ်း မျၢၼ်ႇမႃႇ + + + MMT + + + + + ၶၢဝ်းယၢမ်း ၼၢဝ်ရူး + + + + + ၶၢဝ်းယၢမ်း ၼေႇပေႃး + + + + + ၶၢဝ်းယၢမ်း ၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + + + + + ၶၢဝ်းယၢမ်း ၼိဝ်းၸီႇလႅၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၼိဝ်းၸီႇလႅၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၼိဝ်းၸီႇလႅၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၼိဝ်းၾွမ်ႇလႅၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၼိဝ်းၾွမ်ႇလႅၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၼိဝ်းၾွမ်ႇလႅၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၼီးဝႄႇ + + + + + ၶၢဝ်းယၢမ်း ၵုၼ်ၼေႃႇၾုၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၵုၼ်ၼေႃႇၾုၵ်ႉ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၵုၼ်ၼေႃႇၾုၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ၾႃႇၼႅၼ်ႇတူဝ်ႇ တႄႇ တီႇၼူဝ်ႇရွၼ်ႇႁႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၾႃႇၼႅၼ်ႇတူဝ်ႇ တႄႇ တီႇၼူဝ်ႇရွၼ်ႇႁႃႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ၾႃႇၼႅၼ်ႇတူဝ်ႇ တႄႇ တီႇၼူဝ်ႇရွၼ်ႇႁႃႇ + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်မႃႇရီႇယႃႇၼႃႇ ပွတ်းႁွင်ႇ + + + + + ၶၢဝ်းယၢမ်း ၼူဝ်ႇဝူဝ်ႇသီႇပၢတ်ႉသ်ၶ် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၼူဝ်ႇဝူဝ်ႇသီႇပၢတ်ႉသ်ၶ် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၼူဝ်ႇဝူဝ်ႇသီႇပၢတ်ႉသ်ၶ် + + + + + ၶၢဝ်းယၢမ်း ဢူမ်းသ်ၶ် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢူမ်းသ်ၶ် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢူမ်းသ်ၶ် + + + + + ၶၢဝ်းယၢမ်း ပႃႇၵိတ်ႈသတၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပႃႇၵိတ်ႈသတၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ပႃႇၵိတ်ႈသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ပႃႇလၢဝ်း + + + + + ၶၢဝ်းယၢမ်း ပႃးပႂႃႇၼိဝ်းၵီးၼီး + + + + + ၶၢဝ်းယၢမ်း ပႃႇရႃႇၵူၺ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပႃႇရႃႇၵူၺ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပႃႇရႃႇၵူၺ်း + + + + + ၶၢဝ်းယၢမ်း ပေႇရူႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ပေႇရူႉ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ပေႇရူႉ + + + + + ၶၢဝ်းယၢမ်း ၾီလိပ်ႈပိၼ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၾီလိပ်ႈပိၼ်း + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၾီလိပ်ႈပိၼ်း + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်ၽီးၼိၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း သဵင်ႉပီးယႃး လႄႈ မိၵ်ႈၵွႆႇလွၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သဵင်ႉပီးယႃး လႄႈ မိၵ်ႈၵွႆႇလွၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း သဵင်ႉပီးယႃး လႄႈ မိၵ်ႈၵွႆႇလွၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၽိတ်ႉၶႅၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ပူၼ်းပေႇ + + + + + ၶၢဝ်းယၢမ်း ၵၢဝ်းလီႁွင်ႇ + + + + + ၶၢဝ်းယၢမ်း ၶုၺ်ႇၸီးလူဝ်ႇတႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ၶုၺ်ႇၸီးလူဝ်ႇတႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ၶုၺ်ႇၸီးလူဝ်ႇတႃႇ + + + + + ၶၢဝ်းယၢမ်း ရေႇၼီႇယၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ရူဝ်ႇထႄႇရႃႇ + + + + + ၶၢဝ်းယၢမ်း သႃႇၶႃႇလိၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သႃႇၶႃႇလိၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ သႃႇၶႃႇလိၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း သႃႇမႃႇရႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သႃႇမႃႇရႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ သႃႇမႃႇရႃႇ + + + + + ၶၢဝ်းယၢမ်း သႃႇမူဝ်းဝႃႇ ၶွ​င် ဢမႄႇရိၵၢၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သႃႇမူဝ်းဝႃႇ ၶွ​င် ဢမႄႇရိၵၢၼ်ႇ + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း သႃႇမူဝ်းဝႃႇ ၶွ​င် ဢမႄႇရိၵၢၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း သေးသျႄႇ + + + + + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း သိင်ႇၵႃႇပူဝ်ႇ + + + + + ၶၢဝ်းယၢမ်း မူႇၵုၼ်သေႃႇလေႃႇမၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ၵျေႃႇၵျႃႇ ပွတ်းၸၢၼ်း + + + + + ၶၢဝ်းယၢမ်း သျူးရီးၼႃႇမႄႇ + + + + + ၶၢဝ်းယၢမ်း သၢႆးဢူဝ်ႇဝႃႇ + + + + + ၶၢဝ်းယၢမ်း တႁီႇတီႇ + + + + + ၶၢဝ်းယၢမ်း ထၢႆႇဝၢၼ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ထၢႆႇဝၢၼ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ထၢႆႇဝၢၼ်း + + + + + ၶၢဝ်းယၢမ်း တႃႇၵျီႇၵီႇသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ထူဝ်းၵေႇလၢဝ်ႇ + + + + + ၶၢဝ်းယၢမ်း ထွင်းၵႃႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ထွင်းၵႃႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ထွင်းၵႃႇ + + + + + ၶၢဝ်းယၢမ်း ၶျူၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း တၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း တၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ တၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ထူးဝႃႇလူႇ + + + + + ၶၢဝ်းယၢမ်း ဢုရုၵူၺ်း + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢုရုၵူၺ်း + ၶၢဝ်းယၢမ်း ၵၢင်ဝၼ်း ဢုရုၵူၺ်း + + + + + ၶၢဝ်းယၢမ်း ဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + + + + + ၶၢဝ်းယၢမ်း ဝႅၼ်ႇၼူးဝႃႇထူႇ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဝႅၼ်ႇၼူးဝႃႇထူႇ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဝႅၼ်ႇၼူးဝႃႇထူႇ + + + + + ၶၢဝ်းယၢမ်း ဝႄႇၼေႇၸွႆးလႃး + + + + + ၶၢဝ်းယၢမ်း ဝလႃႇတီႇဝူဝ်ႇသတွၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဝလႃႇတီႇဝူဝ်ႇသတွၵ်ႉ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဝလႃႇတီႇဝူဝ်ႇသတွၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဝူဝ်ႇၵူဝ်ႇၵရၢတ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ဝူဝ်ႇၵူဝ်ႇၵရၢတ်ႉ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ဝူဝ်ႇၵူဝ်ႇၵရၢတ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဝေႃႉသ်တွၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ၵုၼ်ဝဵၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ဝႃးလိတ်ႈ လႄႈ ၾူႇတူးၼႃး + + + + + ၶၢဝ်းယၢမ်း ယၵုတ်ႉသ်ၶ် + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ယၵုတ်ႉသ်ၶ် + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ယၵုတ်ႉသ်ၶ် + + + + + ၶၢဝ်းယၢမ်း ယေႇၵႃႇတႄႇရိၼ်ႇပၢၵ်ႉ + လၵ်းၸဵင် ၶၢဝ်းယၢမ်း ယေႇၵႃႇတႄႇရိၼ်ႇပၢၵ်ႉ + ၶၢဝ်းယၢမ်း ၶၢဝ်းမႆႈ ယေႇၵႃႇတႄႇရိၼ်ႇပၢၵ်ႉ + + + + + ၶၢဝ်းယၢမ်း ယူးၵွၼ်ႇ + + + + + + + + + 0 ႁဵင် + 0 မိုၼ်ႇ + 0 သႅၼ် + 0 လၢၼ်ႉ + 00 လၢၼ်ႉ + 000 လၢၼ်ႉ + 0 ႁဵင်လၢၼ်ႉ + 0 မိုၼ်ႇလၢၼ်ႉ + 0 သႅၼ်လၢၼ်ႉ + 0 လၢၼ်ႉလၢၼ်ႉ + 00 လၢၼ်ႉလၢၼ်ႉ + 000 လၢၼ်ႉလၢၼ်ႉ + + + + + + ပေႇသႄႇတႃႇဢႅၼ်ႇတူဝ်ႇရႃႇ + ပေႇသႄႇတႃႇဢႅၼ်ႇတူဝ်ႇရႃႇ + + + တီႇရမ်ႇမိူင်းႁူမ်ႈတုမ် ၸဝ်ႈၾႃႉ ဢႃႇရၢပ်ႈ + တီႇရမ်ႇမိူင်းႁူမ်ႈတုမ် ၸဝ်ႈၾႃႉ ဢႃႇရၢပ်ႈ + + + ဢႃႇၾၵၢၼ်ႇၼီႇဢႃႇၾၵၢၼ်ႇ (1927–2002) + ဢႃႇၾၵၢၼ်ႇၼီႇဢႃႇၾၵၢၼ်ႇ (1927–2002) + + + ဢႃႇၾၵၢၼ်ႇၼီႇဢႃႇၾၵၢၼ်ႇ + ဢႃႇၾၵၢၼ်ႇၼီႇဢႃႇၾၵၢၼ်ႇ + + + လႅၵ်ႈဢႃႇပႃးၼီးယႃး (1946–1965) + လႅၵ်ႈဢႃႇပႃးၼီးယႃး (1946–1965) + + + လႅၵ်ႈဢႃႇပႃးၼီးယႃး + လႅၵ်ႈဢႃႇပႃးၼီးယႃး + + + တရၢမ်ႇဢႃႇမေးၼီးယႃး + တရၢမ်ႇဢႃႇမေးၼီးယႃး + + + ၵဵဝ်းတႃႇၼႄႇတႃႇလႅၼ်ႇ ဢၼ်ထေးလ်လိသ် + ၵဵဝ်းတႃႇၼႄႇတႃႇလႅၼ်ႇ ဢၼ်ထေးလ်လိသ် + + + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ + + + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ (1977–1991) + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ (1977–1991) + + + ၶႂၼ်ႇၸႃႇမႂ်ႇဢႅၼ်ႇၵူဝ်ႇလႃႇ (1990–2000) + ၶႂၼ်ႇၸႃႇမႂ်ႇဢႅၼ်ႇၵူဝ်ႇလႃႇ (1990–2000) + + + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ ဢၼ်ၶိုၼ်းမူၼ်ႉမႄးဝႆႉ (1995–1999) + ၶႂၼ်ႇၸႃႇဢႅၼ်ႇၵူဝ်ႇလႃႇ ဢၼ်ၶိုၼ်းမူၼ်ႉမႄးဝႆႉ (1995–1999) + + + ဢေႃႉသထရႄႇလ်ဢႃႇၵျႅၼ်ႇတီးၼႃး + ဢေႃႉသထရႄႇလ်ဢႃႇၵျႅၼ်ႇတီးၼႃး + + + ပေႇသူဝ်ႇလေးဢႃႇၵျႅၼ်ႇတီးၼႃး (1970–1983) + ပေႇသူဝ်ႇလေးဢႃႇၵျႅၼ်ႇတီးၼႃး (1970–1983) + + + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး (1881–1970) + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး (1881–1970) + + + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး (1983–1985) + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး (1983–1985) + + + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး + ပေႇသူဝ်ႇဢႃႇၵျႅၼ်ႇတီးၼႃး + + + သျီႇလင်ႇဢေႃးသထရီးယႃး + သျီႇလင်ႇဢေႃးသထရီးယႃး + + + တေႃႇလႃႇဢေႃႉသထရေးလီးယႃး + တေႃႇလႃႇဢေႃႉသထရေးလီးယႃး + + + ၽလေႃးရိၼ်ႇဢႃႇရူးပႃး + ၽလေႃးရိၼ်ႇဢႃႇရူးပႃး + + + မၼတ်ႉဢႃႇၸႃႇပၢႆႇၸၼ်ႇ (1993–2006) + မၼတ်ႉဢႃႇၸႃႇပၢႆႇၸၼ်ႇ (1993–2006) + + + မၼတ်ႉဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + မၼတ်ႉဢႃႇၸႃႇပၢႆႇၸၼ်ႇ + + + တီႇၼႃႇပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး (1992–1994) + တီႇၼႃႇပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး (1992–1994) + + + မၢၵ်ႉၶ်ပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး ဢၼ်လႅၵ်ႈလႆႈ + မၢၵ်ႉၶ်ပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး ဢၼ်လႅၵ်ႈလႆႈ + + + တီႇၼႃႇမႂ်ႇပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး (1994–1997) + တီႇၼႃႇမႂ်ႇပေႃးသၼီးယႃး လႄႈ ႁႃႇၸီႇၵူဝ်းဝီးၼႃး (1994–1997) + + + တေႃႇလႃႇပႃးပေႇတူတ်ႈ + တေႃႇလႃႇပႃးပေႇတူတ်ႈ + + + တႃႇၵႃႇပင်းၵလႃးတဵတ်ႈ + တႃႇၵႃႇပင်းၵလႃးတဵတ်ႈ + + + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ (ဢၼ်လႅၵ်ႈလႆႈ) + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ (ဢၼ်လႅၵ်ႈလႆႈ) + + + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ + + + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ (ၵၢၼ်ငိုၼ်းတွင်း) + ၾရၼ်ႉပႄႇၵျီႇယမ်ႇ (ၵၢၼ်ငိုၼ်းတွင်း) + + + လႅပ်ႉၾ်ၶႅင်ပူႇၵႃႇရီႇယႃႇ + လႅပ်ႉၾ်ၶႅင်ပူႇၵႃႇရီႇယႃႇ + + + လႅပ်ႉၾ်သူဝ်ႇသျႄႇလိတ်ႉပူႇၵႃႇရီႇယႃႇ + လႅပ်ႉၾ်သူဝ်ႇသျႄႇလိတ်ႉပူႇၵႃႇရီႇယႃႇ + + + လႅပ်ႉၾ်ပူႇၵႃႇရီႇယႃႇ + လႅပ်ႉၾ်ပူႇၵႃႇရီႇယႃႇ + + + လႅပ်ႉၾ်ပူႇၵႃႇရီႇယႃႇ (1879–1952) + လႅပ်ႉၾ်ပူႇၵႃႇရီႇယႃႇ (1879–1952) + + + တီႇၼႃႇပႃႇရဵၼ်း + တီႇၼႃႇပႃႇရဵၼ်း + + + ၾရၼ်ႉပူႇရုၼ်းတီႇ + ၾရၼ်ႉပူႇရုၼ်းတီႇ + + + တေႃႇလႃႇပႃႇမိဝ်းတႃး + တေႃႇလႃႇပႃႇမိဝ်းတႃး + + + တေႃႇလႃႇပရူႇၼၢႆး + တေႃႇလႃႇပရူႇၼၢႆး + + + ပူဝ်ႇလီႇဝီႇယႃႇၼူဝ်ႇပူဝ်ႇလီးပီးယႃး + ပူဝ်ႇလီႇဝီႇယႃႇၼူဝ်ႇပူဝ်ႇလီးပီးယႃး + + + ပူဝ်ႇလီႇဝီႇယႃႇၼူဝ်ႇပူဝ်ႇလီးပီးယႃး (1863–1963) + ပူဝ်ႇလီႇဝီႇယႃႇၼူဝ်ႇပူဝ်ႇလီးပီးယႃး (1863–1963) + + + ပေႇသူဝ်ႇပူဝ်ႇလီးပီးယႃး + ပေႇသူဝ်ႇပူဝ်ႇလီးပီးယႃး + + + ဢႅမ်ႇဝီႇတေႃးပူဝ်ႇလီးပီးယႃး + ဢႅမ်ႇဝီႇတေႃးပူဝ်ႇလီးပီးယႃး + + + ၶရူႇၸႄရူဝ်ႇမႂ်ႇပရႃႇၸီး (1967–1986) + ၶရူႇၸႄရူဝ်ႇမႂ်ႇပရႃႇၸီး (1967–1986) + + + ၶရူႇၸႃတူဝ်ႇပရႃႇၸီး (1986–1989) + ၶရူႇၸႃတူဝ်ႇပရႃႇၸီး (1986–1989) + + + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1990–1993) + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1990–1993) + + + ရီးဢႄႇလ်ပရႃႇၸီး + ရီးဢႄႇလ်ပရႃႇၸီး + + + ၶရူႇၸႃတူဝ်ႇမႂ်ႇပရႃႇၸီး (1989–1990) + ၶရူႇၸႃတူဝ်ႇမႂ်ႇပရႃႇၸီး (1989–1990) + + + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1993–1994) + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1993–1994) + + + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1942–1967) + ၶရူႇၸႄရူဝ်ႇပရႃႇၸီး (1942–1967) + + + တေႃႇလႃႇပႃႇႁႃးမႃး + တေႃႇလႃႇပႃႇႁႃးမႃး + + + ဢိၼ်ၵူးလ်ထရမ်ႇၽူႇတၢၼ်ႇ + ဢိၼ်ၵူးလ်ထရမ်ႇၽူႇတၢၼ်ႇ + + + ၵျၢပ်ႈမၢၼ်ႈ + ၵျၢပ်ႈမၢၼ်ႈ + + + ပူႇလႃႇပွတ်ႉသဝႃႇၼႃႇ + ပူႇလႃႇပွတ်ႉသဝႃႇၼႃႇ + + + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ (1994–1999) + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ (1994–1999) + + + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ + + + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ (2000–2016) + ရူႇပႄႇပႄႇလႃႇရုတ်ႈ (2000–2016) + + + တေႃႇလႃႇပႄႇလိတ်ႈ + တေႃႇလႃႇပႄႇလိတ်ႈ + + + တေႃႇလႃႇၶႅၼ်ႇၼေႇတႃႇ + တေႃႇလႃႇၶႅၼ်ႇၼေႇတႃႇ + + + ၾရၼ်ႉၶွင်ႇၵူဝ်ႇ + ၾရၼ်ႉၶွင်ႇၵူဝ်ႇ + + + ယူႇရူဝ်ႇ WIR + ယူႇရူဝ်ႇ WIR + + + ၾရၼ်ႉသဝိတ်ႈၸႃႇလႅၼ်ႇ + ၾရၼ်ႉသဝိတ်ႈၸႃႇလႅၼ်ႇ + + + ၾရၼ်ႉ WIR + ၾရၼ်ႉ WIR + + + ဢႅတ်ႉသၵူႇတူဝ်ႇၶျီႇလီႇ + ဢႅတ်ႉသၵူႇတူဝ်ႇၶျီႇလီႇ + + + ယူႇၼီႉၶွင်ဢၶွင်ႉၶျီႇလီႇ + ယူႇၼီႉၶွင်ဢၶွင်ႉၶျီႇလီႇ + + + ပေႇသူဝ်ႇၶျီႇလီႇ + ပေႇသူဝ်ႇၶျီႇလီႇ + + + ယွၼ်ႇၶႄႇ (ၼွၵ်ႈၽၢင်ႇပၢင်ႇလၢႆႇ) + ယွၼ်ႇၶႄႇ (ၼွၵ်ႈၽၢင်ႇပၢင်ႇလၢႆႇ) + + + တေႃႇလႃႇယေးငိုၼ်းၵူၼ်းမိူင်းၶႄႇ + တေႃႇလႃႇယေးငိုၼ်းၵူၼ်းမိူင်းၶႄႇ + + + ယွၼ်ႇၶႄႇ + ယွၼ်ႇၶႄႇ + + + ပေႇသူဝ်ႇၵူဝ်ႇလမ်ႇပီႇယႃႇ + ပေႇသူဝ်ႇၵူဝ်ႇလမ်ႇပီႇယႃႇ + + + ယူႇၼိတ်ႉၵႃႈၶၼ်တႄႉတႄႉၵူဝ်ႇလမ်ႇပီႇယႃႇ + ယူႇၼိတ်ႉၵႃႈၶၼ်တႄႉတႄႉၵူဝ်ႇလမ်ႇပီႇယႃႇ + + + ၵူဝ်ႇလူၼ်ႇၵေႃးသတႃႇရိၵႃႇ + ၵူဝ်ႇလူၼ်ႇၵေႃးသတႃႇရိၵႃႇ + + + တီႇၼႃႇသႃးပီးယႃး (2002–2006) + တီႇၼႃႇသႃးပီးယႃး (2002–2006) + + + ၵူဝ်ႇရူႇၼႃႇၶႅင်ၶျႅၵ်ႈ + ၵူဝ်ႇရူႇၼႃႇၶႅင်ၶျႅၵ်ႈ + + + ပေႇသူဝ်ႇၵူးပႃး ဢၼ်လႅၵ်ႈလႆႈ + ပေႇသူဝ်ႇၵူးပႃး ဢၼ်လႅၵ်ႈလႆႈ + + + ပေႇသူဝ်ႇၵူးပႃး + ပေႇသူဝ်ႇၵူးပႃး + + + ဢိသ်ၵူႇတူဝ်ႇၶဵပ်ႉဝႄႇတီႇ + ဢိသ်ၵူႇတူဝ်ႇၶဵပ်ႉဝႄႇတီႇ + + + ပွၼ်းသၢႆႉပရႅတ်ႈ + ပွၼ်းသၢႆႉပရႅတ်ႈ + + + ၵူဝ်ႇရူႇၼႃႇၶျႅၵ်ႈ + ၵူဝ်ႇရူႇၼႃႇၶျႅၵ်ႈ + + + မၢၵ်ႉၶ်ၵျႃႇမၼ်ႇပွတ်းဢွၵ်ႇ + မၢၵ်ႉၶ်ၵျႃႇမၼ်ႇပွတ်းဢွၵ်ႇ + + + မၢၵ်ႉၶ်ၵျႃႇမၼ်ႇ + မၢၵ်ႉၶ်ၵျႃႇမၼ်ႇ + + + ၾရၼ်ႉၵျီႇပူးတီႇ + ၾရၼ်ႉၵျီႇပူးတီႇ + + + ၶရူၼ်းတႅၼ်းမၢၵ်ႈ + ၶရူၼ်းတႅၼ်းမၢၵ်ႈ + + + ပေႇသူဝ်ႇတူဝ်ႇမီႇၼီႇၵၼ်ႇ + ပေႇသူဝ်ႇတူဝ်ႇမီႇၼီႇၵၼ်ႇ + + + တီႇၼႃႇဢႄးၵျီးရီးယႃး + တီႇၼႃႇဢႄးၵျီးရီးယႃး + + + သုၶရေႇဢေႇၵႂႃႇတေႃႇ + သုၶရေႇဢေႇၵႂႃႇတေႃႇ + + + ယူးၼိတ်ႉၵႃႈၶၼ်ဢေႇၵႂႃႇတေႃႇ ဢၼ်ဢမ်ႇလႅၵ်ႈလၢႆႈ + ယူးၼိတ်ႉၵႃႈၶၼ်ဢေႇၵႂႃႇတေႃႇ ဢၼ်ဢမ်ႇလႅၵ်ႈလၢႆႈ + + + ၶရူၼ်းဢႄႇသတူဝ်းၼီးယႃး + ၶရူၼ်းဢႄႇသတူဝ်းၼီးယႃး + + + ပွၼ်းဢီးၵျိပ်ႈ + ပွၼ်းဢီးၵျိပ်ႈ + + + ၼၢၵ်ႉၾႃႉဢႄႇရီႇထရီးယႃး + ၼၢၵ်ႉၾႃႉဢႄႇရီႇထရီးယႃး + + + ပေႇသႄႇတႃႇသပဵၼ်ႇ (ဢၶွင်ႉ) + ပေႇသႄႇတႃႇသပဵၼ်ႇ (ဢၶွင်ႉ) + + + ပေႇသႄႇတႃႇသပဵၼ်ႇ (ဢၶွင်ႉဢၼ်လႅၵ်ႈလႆႈ) + ပေႇသႄႇတႃႇသပဵၼ်ႇ (ဢၶွင်ႉဢၼ်လႅၵ်ႈလႆႈ) + + + ပေႇသႄႇတႃႇသပဵၼ်ႇ + ပေႇသႄႇတႃႇသပဵၼ်ႇ + + + ပႄးရ်ဢီႇတီႇယူဝ်းပီးယႃး + ပႄးရ်ဢီႇတီႇယူဝ်းပီးယႃး + + + ယူႇရူဝ်ႇ + ယူႇရူဝ်ႇ + + + မႃႇၶႃႇၾိၼ်ႇလႅၼ်ႇ + မႃႇၶႃႇၾိၼ်ႇလႅၼ်ႇ + + + တေႃႇလႃႇၾီႇၵျီႇ + တေႃႇလႃႇၾီႇၵျီႇ + + + ပွၼ်းမူႇၵုၼ်ၾွၵ်ႉလႅၼ်ႇ + ပွၼ်းမူႇၵုၼ်ၾွၵ်ႉလႅၼ်ႇ + + + ၾရၼ်ႉၾရၢင်ႇသဵတ်ႈ + ၾရၼ်ႉၾရၢင်ႇသဵတ်ႈ + + + ပွၼ်းဢိင်းၵလဵတ်ႈ + ပွၼ်းဢိင်းၵလဵတ်ႈ + + + ၵူႇပုၼ်ႇလႃႇရိတ်ႉၵျေႃႇၵျႃႇ + ၵူႇပုၼ်ႇလႃႇရိတ်ႉၵျေႃႇၵျႃႇ + + + လႃႇရီႇၵျေႃႇၵျႃႇ + လႃႇရီႇၵျေႃႇၵျႃႇ + + + သေႇတီႇၵႃႇၼႃႇ (1979–2007) + သေႇတီႇၵႃႇၼႃႇ (1979–2007) + + + သေႇတီႇၵႃႇၼႃႇ + သေႇတီႇၵႃႇၼႃႇ + + + ပွၼ်း ၵျီႇပရေႃးတႃး + ပွၼ်း ၵျီႇပရေႃးတႃး + + + တႃႇလႃႇသီႇၵမ်ႇပီးယႃး + တႃႇလႃႇသီႇၵမ်ႇပီးယႃး + + + ၾရၼ်ႉၵီးၼီး + ၾရၼ်ႉၵီးၼီး + + + သီႇလီႇၵီးၼီး + သီႇလီႇၵီးၼီး + + + ဢႅၵ်ႉဝႄႇလႄႇဢီႇၵူၺ်ႇတေႃႇရီႇယႃႇၵီးၼီး + ဢႅၵ်ႉဝႄႇလႄႇဢီႇၵူၺ်ႇတေႃႇရီႇယႃႇၵီးၼီး + + + တရၢၵ်ႉမႃႇၵရိတ်ႈ + တရၢၵ်ႉမႃႇၵရိတ်ႈ + + + ၶႅတ်ႉၸႄးလ်ၵႂႃႇတမႃႇလႃႇ + ၶႅတ်ႉၸႄးလ်ၵႂႃႇတမႃႇလႃႇ + + + ဢႅတ်ႉၵူႇတူဝ်ႇၵီးၼီးပေႃးတူႉၵၢဝ်ႇ + ဢႅတ်ႉၵူႇတူဝ်ႇၵီးၼီးပေႃးတူႉၵၢဝ်ႇ + + + ပေႇသူဝ်ႇၵီးၼီး-ပိတ်ႈသၢဝ်ႇ + ပေႇသူဝ်ႇၵီးၼီး-ပိတ်ႈသၢဝ်ႇ + + + တေႃႇလႃႇၵၢႆႇယႃးၼႃႇ + တေႃႇလႃႇၵၢႆႇယႃးၼႃႇ + + + တေႃႇလႃႇႁွင်းၵွင်း + တေႃႇလႃႇႁွင်းၵွင်း + + + လႅမ်းပီႇရႃႇႁွၼ်ႇတူးရႅတ်ႈ + လႅမ်းပီႇရႃႇႁွၼ်ႇတူးရႅတ်ႈ + + + တီႇၼႃႇၶရူဝ်ႇဢေးသျႃး + တီႇၼႃႇၶရူဝ်ႇဢေးသျႃး + + + ၵူႇၼႃႇၶရူဝ်ႇဢေးသျႃး + ၵူႇၼႃႇၶရူဝ်ႇဢေးသျႃး + + + ၵုတ်ႉထ်ႁေးတီႇ + ၵုတ်ႉထ်ႁေးတီႇ + + + ၾူဝ်ႇရိၼ်ႇႁၢင်ႇၵေႇရီႇ + ၾူဝ်ႇရိၼ်ႇႁၢင်ႇၵေႇရီႇ + + + ရူႇပီးယႃးဢိၼ်ႇတူဝ်ႇၼီးသျႃး + ရူႇပီးယႃးဢိၼ်ႇတူဝ်ႇၼီးသျႃး + + + ပွၼ်းဢၢႆႇယႃႇလႅၼ်ႇ + ပွၼ်းဢၢႆႇယႃႇလႅၼ်ႇ + + + ပွၼ်းဢိတ်ႇသရေး + ပွၼ်းဢိတ်ႇသရေး + + + သျႅၵ်ႈၵႄႇလ်ဢိတ်ႇသရေး (1980–1985) + သျႅၵ်ႈၵႄႇလ်ဢိတ်ႇသရေး (1980–1985) + + + သျႅၵ်ႈၵႄႇလ်မႂ်ႇဢိတ်ႇသရေး + သျႅၵ်ႈၵႄႇလ်မႂ်ႇဢိတ်ႇသရေး + + + ရူႇပီးဢိၼ်းတီးယႃး + ရူႇပီးဢိၼ်းတီးယႃး + + + တီႇၼႃႇဢီႇရၢၵ်ႈ + တီႇၼႃႇဢီႇရၢၵ်ႈ + + + ရီဢႄလ်ဢီႇရၢၼ်း + ရီဢႄလ်ဢီႇရၢၼ်း + + + ၶရူဝ်ႇၼႃႇဢၢႆးသလႅၼ်ႇ (1918–1981) + ၶရူဝ်ႇၼႃႇဢၢႆးသလႅၼ်ႇ (1918–1981) + + + ၶရူဝ်ႇၼႃႇဢၢႆးသလႅၼ်ႇ + ၶရူဝ်ႇၼႃႇဢၢႆးသလႅၼ်ႇ + + + လီႇရႃႇဢီႇတႃႇလီႇ + လီႇရႃႇဢီႇတႃႇလီႇ + + + တေႃႇလႃႇၵျႃႇမေႇၵႃႇ + တေႃႇလႃႇၵျႃႇမေႇၵႃႇ + + + တီႇၼႃႇၵျေႃႇတၼ်ႇ + တီႇၼႃႇၵျေႃႇတၼ်ႇ + + + ယႅၼ်းၵျႃႇပၢၼ်ႇ + ယႅၼ်းၵျႃႇပၢၼ်ႇ + + + သျီႇလိင်ႇၶႅၼ်ႇၺႃႇ + သျီႇလိင်ႇၶႅၼ်ႇၺႃႇ + + + သွမ်ႇၵႃႇၵိတ်ႈသတၼ်ႇ + သွမ်ႇၵႃႇၵိတ်ႈသတၼ်ႇ + + + ရိဢႄလ်ၵမ်ႇပေႃးတီးယႃး + ရိဢႄလ်ၵမ်ႇပေႃးတီးယႃး + + + ၽရၼ်ႉၶူဝ်ႇမူဝ်ႇရူတ်ႈ + ၽရၼ်ႉၶူဝ်ႇမူဝ်ႇရူတ်ႈ + + + ဝွၼ်ႇၵၢဝ်းလီႁွင်ႇ + ဝွၼ်ႇၵၢဝ်းလီႁွင်ႇ + + + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း (1953–1962) + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း (1953–1962) + + + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း (1945–1953) + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း (1945–1953) + + + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း + ဝွၼ်ႇၵၢဝ်းလီၸၢၼ်း + + + တီႇၼႃႇၶူႇဝဵတ်ႈ + တီႇၼႃႇၶူႇဝဵတ်ႈ + + + တေႃႇလႃႇမူႇၵုၼ်ၶေးမႅၼ်း + တေႃႇလႃႇမူႇၵုၼ်ၶေးမႅၼ်း + + + ထႅင်ၵႄႇၵႃႇၸၢၵ်ႈသတၼ်ႇ + ထႅင်ၵႄႇၵႃႇၸၢၵ်ႈသတၼ်ႇ + + + ၵိပ်ႇလၢဝ်း + ၵိပ်ႇလၢဝ်း + + + ပွၼ်းလႄႇပႃႇၼွၼ်ႇ + ပွၼ်းလႄႇပႃႇၼွၼ်ႇ + + + ရူႇပီးသီႇရိလင်းၵႃ + ရူႇပီးသီႇရိလင်းၵႃ + + + တေႃႇလႃႇလၢႆႇပေးရီးယႃး + တေႃႇလႃႇလၢႆႇပေးရီးယႃး + + + လူဝ်ႇတီႇလႄႇသူဝ်းတူဝ်ႇ + လူဝ်ႇတီႇလႄႇသူဝ်းတူဝ်ႇ + + + လိတတ်ႉသ်လီႉတူႇဝေးၼီးယႃး + လိတတ်ႉသ်လီႉတူႇဝေးၼီးယႃး + + + တႄႇလူဝ်ႇၼတ်ႉလီႉတူႇဝေးၼီးယႃး + တႄႇလူဝ်ႇၼတ်ႉလီႉတူႇဝေးၼီးယႃး + + + ၾရၼ်ႉလၢၵ်ႈၸိမ်ႇပၢၵ်ႈ ဢၼ်လႅၵ်ႈလႆႈ + ၾရၼ်ႉလၢၵ်ႈၸိမ်ႇပၢၵ်ႈ ဢၼ်လႅၵ်ႈလႆႈ + + + ၾရၼ်ႉလၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + ၾရၼ်ႉလၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + + + ၾရၼ်ႉၵၢၼ်ငိုၼ်းတွင်း လၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + ၾရၼ်ႉၵၢၼ်ငိုၼ်းတွင်း လၢၵ်ႈၸိမ်ႇပၢၵ်ႈ + + + လတ်ႉသ်လၢတ်ႈဝီႇယႃႇ + လတ်ႉသ်လၢတ်ႈဝီႇယႃႇ + + + ရူႇပႄႇလၢတ်ႉဝီႇယႃႇ + ရူႇပႄႇလၢတ်ႉဝီႇယႃႇ + + + တီႇၼႃႇလိပ်ႉပျႃး + တီႇၼႃႇလိပ်ႉပျႃး + + + တီႇရမ်ႇမေႃႇရူဝ်ႇၵူဝ်ႇ + တီႇရမ်ႇမေႃႇရူဝ်ႇၵူဝ်ႇ + + + ၾရၼ်ႉမေႃႇရူဝ်ႇၵူဝ်ႇ + ၾရၼ်ႉမေႃႇရူဝ်ႇၵူဝ်ႇ + + + ၾရၼ်ႉမူဝ်ႇၼႃႉၶူဝ်ႇ + ၾရၼ်ႉမူဝ်ႇၼႃႉၶူဝ်ႇ + + + ၶူႇပွၼ်ႇမေႃႇတူဝ်းဝႃး + ၶူႇပွၼ်ႇမေႃႇတူဝ်းဝႃး + + + လဵဝ်းမေႃႇတူဝ်းဝႃး + လဵဝ်းမေႃႇတူဝ်းဝႃး + + + ဢႃႇရီႇယႃႇရီႇမၢတ်ႈတႃႇၵၢတ်ႈသၵႃႇ + ဢႃႇရီႇယႃႇရီႇမၢတ်ႈတႃႇၵၢတ်ႈသၵႃႇ + + + ၾရၼ်ႉမၢတ်ႈတႃႇၵၢတ်ႈသၵႃႇ + ၾရၼ်ႉမၢတ်ႈတႃႇၵၢတ်ႈသၵႃႇ + + + တႅၼ်ႇၼႃႇမႄႇၶေႇတူဝ်းၼီးယႃးႁွင်ႇ + တႅၼ်ႇၼႃႇမႄႇၶေႇတူဝ်းၼီးယႃးႁွင်ႇ + + + တႅၼ်ႇၼႃႇမႄႇၶေႇတူဝ်းၼီးယႃးႁွင်ႇ (1992–1993) + တႅၼ်ႇၼႃႇမႄႇၶေႇတူဝ်းၼီးယႃးႁွင်ႇ (1992–1993) + + + ၾရၼ်ႉမႃႇလီႇ + ၾရၼ်ႉမႃႇလီႇ + + + ၵျၢပ်ႈမျၢၼ်ႇမႃႇ + ၵျၢပ်ႈမျၢၼ်ႇမႃႇ + + + တူႉၵရိၵ်ႉမူင်ႇၵူဝ်းလီးယႃး + တူႉၵရိၵ်ႉမူင်ႇၵူဝ်းလီးယႃး + + + ပႃႇတႃႇၵႃႇမႃႇၵၢဝ်ႈ + ပႃႇတႃႇၵႃႇမႃႇၵၢဝ်ႈ + + + ဢူးၵီႇယႃႇမေႃႇရီႇတေးၼီးယႃး (1973–2017) + ဢူးၵီႇယႃႇမေႃႇရီႇတေးၼီးယႃး (1973–2017) + + + ဢူးၵီႇယႃႇမေႃႇရီႇတေးၼီးယႃး + ဢူးၵီႇယႃႇမေႃႇရီႇတေးၼီးယႃး + + + လီႇရႃႇမေႃးတႃႇ + လီႇရႃႇမေႃးတႃႇ + + + ပွၼ်းမေႃးတႃႇ + ပွၼ်းမေႃးတႃႇ + + + ရူႇပီးမေႃးရီႇသႃႇ + ရူႇပီးမေႃးရီႇသႃႇ + + + ရူႇၾီႇယႃႇမေႃႇတိပ်ႈ (1947–1981) + ရူႇၾီႇယႃႇမေႃႇတိပ်ႈ (1947–1981) + + + ရူႇၾီႇယႃႇမေႃႇတိပ်ႈ + ရူႇၾီႇယႃႇမေႃႇတိပ်ႈ + + + ၶႂႃႇၶျႃႇမႃႇလႃႇဝီႇ + ၶႂႃႇၶျႃႇမႃႇလႃႇဝီႇ + + + ပေႇသူဝ်ႇမႅၵ်ႇသီႇၵူဝ်ႇ + ပေႇသူဝ်ႇမႅၵ်ႇသီႇၵူဝ်ႇ + + + ပေႇသူဝ်ႇငိုၼ်းမႅၵ်ႇသီႇၵူဝ်ႇ (1861–1992) + ပေႇသူဝ်ႇငိုၼ်းမႅၵ်ႇသီႇၵူဝ်ႇ (1861–1992) + + + ယူႇၼိတ်ႉလူင်းတိုၼ်းမႅၵ်ႇသီႇၵူဝ်ႇ + ယူႇၼိတ်ႉလူင်းတိုၼ်းမႅၵ်ႇသီႇၵူဝ်ႇ + + + ရိင်းၵိတ်ႉမလေးသျႃး + ရိင်းၵိတ်ႉမလေးသျႃး + + + ဢႅတ်ႉသၵူတူဝ်ႇမူဝ်ႇၸမ်းပိၵ်ႈ + ဢႅတ်ႉသၵူတူဝ်ႇမူဝ်ႇၸမ်းပိၵ်ႈ + + + မႅတ်ႉတိၵ်ႉၵႄႇလ်မူဝ်ႇၸမ်းပိၵ်ႈ (1980–2006) + မႅတ်ႉတိၵ်ႉၵႄႇလ်မူဝ်ႇၸမ်းပိၵ်ႈ (1980–2006) + + + မႅတ်ႉတိၵ်ႉၵႄႇလ်မူဝ်ႇၸမ်းပိၵ်ႈ + မႅတ်ႉတိၵ်ႉၵႄႇလ်မူဝ်ႇၸမ်းပိၵ်ႈ + + + တေႃႇလႃႇၼႃႇမီးပီးယႃး + တေႃႇလႃႇၼႃႇမီးပီးယႃး + + + ၼေးရႃႇၼၢႆႇၵျီးရီးယႃး + ၼေးရႃႇၼၢႆႇၵျီးရီးယႃး + + + ၵေႃႇတူဝ်ႇပႃႇၼီႇၵႃႇရႃႇၵႂႃႇ (1988–1991) + ၵေႃႇတူဝ်ႇပႃႇၼီႇၵႃႇရႃႇၵႂႃႇ (1988–1991) + + + ၵေႃႇတူဝ်ႇပႃႇၼီႇၵႃႇရႃႇၵႂႃႇ + ၵေႃႇတူဝ်ႇပႃႇၼီႇၵႃႇရႃႇၵႂႃႇ + + + ၵိလ်တႃႇတၢတ်ႉၶျ် + ၵိလ်တႃႇတၢတ်ႉၶျ် + + + ၶရူၼ်းၼေႃႇဝူၺ်း + ၶရူၼ်းၼေႃႇဝူၺ်း + + + ရူႇပီးၼေႇပေႃး + ရူႇပီးၼေႇပေႃး + + + တေႃႇလႃႇၼိဝ်းၸီႇလႅၼ်ႇ + တေႃႇလႃႇၼိဝ်းၸီႇလႅၼ်ႇ + + + ရီဢႄလ်ဢူဝ်ႇမၢၼ်ႇ + ရီဢႄလ်ဢူဝ်ႇမၢၼ်ႇ + + + ပႄးလ်ပူဝ်ႇဢႃႇပႃႈၼႃးမႃး + ပႄးလ်ပူဝ်ႇဢႃႇပႃႈၼႃးမႃး + + + ဢိၼ်ႇတီႇပေႇရူႉ + ဢိၼ်ႇတီႇပေႇရူႉ + + + သူဝ်းလ်ပေႇရူႉ + သူဝ်းလ်ပေႇရူႉ + + + သူဝ်းလ်ပေႇရူႉ (1863–1965) + သူဝ်းလ်ပေႇရူႉ (1863–1965) + + + ၶိၼႃႇပႃးပႂႃႇၼိဝ်းၵီးၼီး + ၶိၼႃႇပႃးပႂႃႇၼိဝ်းၵီးၼီး + + + ပေႇသူဝ်ႇၾီလိပ်ႈပိၼ်း + ပေႇသူဝ်ႇၾီလိပ်ႈပိၼ်း + + + ရူႇပီးပႃႇၵိတ်ႈသတၼ်ႇ + ရူႇပီးပႃႇၵိတ်ႈသတၼ်ႇ + + + ၸလူဝ်ႇတီႇပူဝ်ႇလႅၼ်ႇ + ၸလူဝ်ႇတီႇပူဝ်ႇလႅၼ်ႇ + + + ၸလူဝ်ႇတီႇပူဝ်ႇလႅၼ်ႇ (1950–1995) + ၸလူဝ်ႇတီႇပူဝ်ႇလႅၼ်ႇ (1950–1995) + + + ဢိသ်ၵူႇတူဝ်ႇ တိူဝ်ႇၵီႇ + ဢိသ်ၵူႇတူဝ်ႇ တိူဝ်ႇၵီႇ + + + ၵႂႃႇရႃႇၼီပႃႇရႃႇၵူၺ်း + ၵႂႃႇရႃႇၼီပႃႇရႃႇၵူၺ်း + + + ရီယႄႇလ်ၶႃႇတႃႇ + ရီယႄႇလ်ၶႃႇတႃႇ + + + တေႃႇလႃႇရူဝ်ႇတႄႇသီႇယႅၼ်ႇ + တေႃႇလႃႇရူဝ်ႇတႄႇသီႇယႅၼ်ႇ + + + လဵဝ်းရူဝ်ႇမေးၼီးယႃး (1952–2006) + လဵဝ်းရူဝ်ႇမေးၼီးယႃး (1952–2006) + + + လဵဝ်းရူဝ်ႇမေးၼီးယႃး + လဵဝ်းရူဝ်ႇမေးၼီးယႃး + + + တီႇၼႃႇ သႃးပီးယႃး + တီႇၼႃႇ သႃးပီးယႃး + + + ရူႇပႄႇရတ်ႈသျႃး + ရူႇပႄႇရတ်ႈသျႃး + + + ရူႇပႄႇရတ်ႈသျႃး (1991–1998) + ရူႇပႄႇရတ်ႈသျႃး (1991–1998) + + + ၾရၼ်ႉရဝၢၼ်းတႃႇ + ၾရၼ်ႉရဝၢၼ်းတႃႇ + + + ရီယႄႇလ်သေႃႇတီႇ + ရီယႄႇလ်သေႃႇတီႇ + + + တေႃႇလႃႇမူႇၵုၼ်သေႃႇလေႃႇမၼ်ႇ + တေႃႇလႃႇမူႇၵုၼ်သေႃႇလေႃႇမၼ်ႇ + + + ရူႇပီးသေးသျႄႇ + ရူႇပီးသေးသျႄႇ + + + တီႇၼႃႇသူႇတၼ်ႇ (1992–2007) + တီႇၼႃႇသူႇတၼ်ႇ (1992–2007) + + + ပွၼ်းသူႇတၼ်ႇ + ပွၼ်းသူႇတၼ်ႇ + + + ပွၼ်းသူႇတၼ်ႇ (1957–1998) + ပွၼ်းသူႇတၼ်ႇ (1957–1998) + + + ၶရူဝ်ႇၼႃႇသုၺ်ႇတိၼ်ႇ + ၶရူဝ်ႇၼႃႇသုၺ်ႇတိၼ်ႇ + + + တေႃႇလႃႇသိင်ႇၵႃႇပူဝ်ႇ + တေႃႇလႃႇသိင်ႇၵႃႇပူဝ်ႇ + + + ပွၼ်းသဵင်ႉႁႄးလႄးၼႃႇ + ပွၼ်းသဵင်ႉႁႄးလႄးၼႃႇ + + + တူဝ်ႇလႃႇ သလူဝ်ႇဝေးၼီးယႃး + တူဝ်ႇလႃႇ သလူဝ်ႇဝေးၼီးယႃး + + + ၶူဝ်ႇရူႇၼႃႇသလူဝ်ႇဝႃးၵီးယႃး + ၶူဝ်ႇရူႇၼႃႇသလူဝ်ႇဝႃးၵီးယႃး + + + လီႇယူၼ်ႇသီႇဢႄႇရႃႇလီႇယူၼ်ႇ + လီႇယူၼ်ႇသီႇဢႄႇရႃႇလီႇယူၼ်ႇ + + + လီႇယူၼ်ႇသီႇဢႄႇရႃႇလီႇယူၼ်ႇ (1964–2022) + လီႇယူၼ်ႇသီႇဢႄႇရႃႇလီႇယူၼ်ႇ (1964–2022) + + + သျီႇလိင်ႇသူဝ်ႇမႃးလီးယႃး + သျီႇလိင်ႇသူဝ်ႇမႃးလီးယႃး + + + တေႃႇလႃသျူးရီးၼႃႇမႄႇ + တေႃႇလႃသျူးရီးၼႃႇမႄႇ + + + ၵိလ်တႃႇသျူးရီးၼႃႇမႄႇ + ၵိလ်တႃႇသျူးရီးၼႃႇမႄႇ + + + ပွၼ်းသူႇတၼ်ႇၸၢၼ်း + ပွၼ်းသူႇတၼ်ႇၸၢၼ်း + + + တူဝ်ပရႃႇ သူၼ်ႇတူဝ်ႇမေး လႄႈ ပရိၼ်ႇသီႇပေႇ (1997–2017) + တူဝ်ပရႃႇ သူၼ်ႇတူဝ်ႇမေး လႄႈ ပရိၼ်ႇသီႇပေႇ (1997–2017) + + + တူဝ်ႇပရႃႇသူၼ်ႇတူဝ်ႇမေး လႄႈ ပရိၼ်ႇသီႇပေႇ + တူဝ်ႇပရႃႇသူၼ်ႇတူဝ်ႇမေး လႄႈ ပရိၼ်ႇသီႇပေႇ + + + ရူႇပႄႇသူဝ်ႇဝီႇယႅတ်ႉ + ရူႇပႄႇသူဝ်ႇဝီႇယႅတ်ႉ + + + ၵူဝ်ႇလူၼ်ႇဢႄႇသႃႇဝႃႇတေႃႇ + ၵူဝ်ႇလူၼ်ႇဢႄႇသႃႇဝႃႇတေႃႇ + + + ပွၼ်းသီးရီးယႃး + ပွၼ်းသီးရီးယႃး + + + လီႇလႅၼ်ႇၵျႅၼ်ႇၼီႇဢႅတ်ႇသ်ဝႃႇတီးၼီႇ + လီႇလႅၼ်ႇၵျႅၼ်ႇၼီႇဢႅတ်ႇသ်ဝႃႇတီးၼီႇ + + + ဝၢတ်ႇထႆး + ဝၢတ်ႇထႆး + + + ရူႇပႄႇတႃႇၵျီႇၵီႇသတၼ်ႇ + ရူႇပႄႇတႃႇၵျီႇၵီႇသတၼ်ႇ + + + သူဝ်ႇမူဝ်ႇၼီႇတႃႇၵျီႇၵီႇသတၼ်ႇ + သူဝ်ႇမူဝ်ႇၼီႇတႃႇၵျီႇၵီႇသတၼ်ႇ + + + မၼတ်ႉတၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ (1993–2009) + မၼတ်ႉတၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ (1993–2009) + + + မၼတ်ႉတၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + မၼတ်ႉတၢၵ်ႈမႅၼ်ႇၼီႇသတၼ်ႇ + + + တီႇၼႃႇတူႇၼီးသျႃး + တီႇၼႃႇတူႇၼီးသျႃး + + + ပႃဢင်ၵႃႉထွင်းၵႃႇ + ပႃဢင်ၵႃႉထွင်းၵႃႇ + + + ဢႅတ်ႉၵူႇတူဝ်ႇတီႇမေႃး + ဢႅတ်ႉၵူႇတူဝ်ႇတီႇမေႃး + + + လီႇရႃႇတိူဝ်ႇၵီႇ (1922–2005) + လီႇရႃႇတိူဝ်ႇၵီႇ (1922–2005) + + + လီႇရႃႇတိူဝ်ႇၵီႇ + လီႇရႃႇတိူဝ်ႇၵီႇ + + + တေႃႇလႃႇထရီႇၼီႇတၢတ်ႈ လႄႈ ထူဝ်ႇပေးၵူဝ်ႇ + တေႃႇလႃႇထရီႇၼီႇတၢတ်ႈ လႄႈ ထူဝ်ႇပေးၵူဝ်ႇ + + + တေႃႇလႃႇထၢႆႇဝၢၼ်းမႂ်ႇ + တေႃႇလႃႇထၢႆႇဝၢၼ်းမႂ်ႇ + + + သျီႇလိင်ႇထၼ်ႇၸၼ်းၼီးယႃး + သျီႇလိင်ႇထၼ်ႇၸၼ်းၼီးယႃး + + + ႁရီႇဝၼီႇယႃႇယူႇၶရဵၼ်း + ႁရီႇဝၼီႇယႃႇယူႇၶရဵၼ်း + + + ၶႃႇပူဝ်ႇဝႅၼ်ႇၼႅတ်ႉယူႇၶရဵၼ်း + ၶႃႇပူဝ်ႇဝႅၼ်ႇၼႅတ်ႉယူႇၶရဵၼ်း + + + သျီႇလိင်ႇယူႇၵၼ်ႇတႃႇ (2966–1987) + သျီႇလိင်ႇယူႇၵၼ်ႇတႃႇ (2966–1987) + + + သျီႇလိင်ႇယူႇၵၼ်ႇတႃႇ + သျီႇလိင်ႇယူႇၵၼ်ႇတႃႇ + + + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ + + + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ (ထႅင်ႈဝၼ်းၼိုင်ႈ) + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ (ထႅင်ႈဝၼ်းၼိုင်ႈ) + + + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ (ဝၼ်းလဵဝ်ၵၼ်) + တေႃႇလႃႇဢမႄႇရိၵၢၼ်ႇ (ဝၼ်းလဵဝ်ၵၼ်) + + + ပေႇသူဝ်ဢုရုၵူၺ်း(ယူႇၼိတ်ႉဢၼ်ၼႄဝႆႉ) + ပေႇသူဝ်ဢုရုၵူၺ်း(ယူႇၼိတ်ႉဢၼ်ၼႄဝႆႉ) + + + ပေႇသူဝ်ႇဢုရုၵူၺ်း (1975–1993) + ပေႇသူဝ်ႇဢုရုၵူၺ်း (1975–1993) + + + ပေႇသူဝ်ဢုရုၵူၺ်း + ပေႇသူဝ်ဢုရုၵူၺ်း + + + ယူႇၼိတ်ႉဢၼ်ၼႄဝႆႉ ငိုၼ်းလိူၼ်ဢုရုၵူၺ်း + ယူႇၼိတ်ႉဢၼ်ၼႄဝႆႉ ငိုၼ်းလိူၼ်ဢုရုၵူၺ်း + + + သွမ်ႇဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + သွမ်ႇဢူႇၸပႄႉၵိတ်ႇသတၼ်ႇ + + + ပူဝ်ႇလီႇဝႃႇဝႄႇၼေႇၸွႆးလႃး (1871–2008) + ပူဝ်ႇလီႇဝႃႇဝႄႇၼေႇၸွႆးလႃး (1871–2008) + + + ပူဝ်ႇလီႇဝႃႇသူဝ်ႇပႃႇရႃႇၼူဝ်ႇ + ပူဝ်ႇလီႇဝႃႇသူဝ်ႇပႃႇရႃႇၼူဝ်ႇ + + + Venezuelan Bolívar (2008–2018) + Venezuelan Bolívar (2008–2018) + + + ပူဝ်ႇလီႇဝႃႇဝႄႇၼေႇၸွႆးလႃး + ပူဝ်ႇလီႇဝႃႇဝႄႇၼေႇၸွႆးလႃး + + + တွင်ႇဝႅတ်ႉၼမ်း + တွင်ႇဝႅတ်ႉၼမ်း + + + တွင်ႇဝႅတ်ႉၼမ်း (1978–1985) + တွင်ႇဝႅတ်ႉၼမ်း (1978–1985) + + + ဝႃႇထူႇဝႅၼ်ႇၼူးဝႃႇထူႇ + ဝႃႇထူႇဝႅၼ်ႇၼူးဝႃႇထူႇ + + + တႃလႃႉသႃႇမူဝ်းဝႃႇ + တႃလႃႉသႃႇမူဝ်းဝႃႇ + + + ၾရၼ်ႉၸီႇဢႅပ်ႉဢေႇ ဢႃႇၾရိၵ ပွတ်းၵၢင် + ၾရၼ်ႉၸီႇဢႅပ်ႉဢေႇ ဢႃႇၾရိၵ ပွတ်းၵၢင် + + + ငိုၼ်း + ငိုၼ်း + + + ၶမ်း + ၶမ်း + + + ယူႇၼိတ်ႉၶွမ်းပူဝ်းသိတ်ႉယူးရူပ်ႉ + ယူႇၼိတ်ႉၶွမ်းပူဝ်းသိတ်ႉယူးရူပ်ႉ + + + ယူႇၼိတ်ႉၵၢၼ်ငိုၼ်းတွင်းယူးရူပ်ႉ + ယူႇၼိတ်ႉၵၢၼ်ငိုၼ်းတွင်းယူးရူပ်ႉ + + + ယူႇၼိတ်ႉဢၶွင်ႉယူးရူပ်ႉ (XBC) + ယူႇၼိတ်ႉဢၶွင်ႉယူးရူပ်ႉ (XBC) + + + ယူႇၼိတ်ႉဢၶွင်ႉယူးရူပ်ႉ (XBD) + ယူႇၼိတ်ႉဢၶွင်ႉယူးရူပ်ႉ (XBD) + + + တေႃႇလႃႇၶႃႇရိပ်ႈပီႇယၼ်ႇပွတ်းဢွၵ်ႇ + တေႃႇလႃႇၶႃႇရိပ်ႈပီႇယၼ်ႇပွတ်းဢွၵ်ႇ + + + ၵဵဝ်းတႃႇၶႃႇရိပ်ႈပီႇယၼ်ႇ + ၵဵဝ်းတႃႇၶႃႇရိပ်ႈပီႇယၼ်ႇ + + + သုၼ်ႇထွၼ်ငိုၼ်းၶိုၵ်ႉတွၼ်း + သုၼ်ႇထွၼ်ငိုၼ်းၶိုၵ်ႉတွၼ်း + + + ယူႇၼိတ်ႉၵၢၼ်ငိုၼ်းတွင်းယူးရူပ်ႉ + ယူႇၼိတ်ႉၵၢၼ်ငိုၼ်းတွင်းယူးရူပ်ႉ + + + ၾရၼ်ႉၶမ်းၾရၢင်ႇသဵတ်ႈ + ၾရၼ်ႉၶမ်းၾရၢင်ႇသဵတ်ႈ + + + ၾရၼ်ႉ-UIC ၾရၢင်ႇသဵတ်ႈ + ၾရၼ်ႉ-UIC ၾရၢင်ႇသဵတ်ႈ + + + ၾရၼ်ႉ ၸီႇဢႅပ်ႉဢေႇ ဢႃႇၾရိၵ ပွတ်းတူၵ်း + ၾရၼ်ႉ ၸီႇဢႅပ်ႉဢေႇ ဢႃႇၾရိၵ ပွတ်းတူၵ်း + + + ပႄႇလတ်ႇတီႇယမ်ႇ + ပႄႇလတ်ႇတီႇယမ်ႇ + + + ၾရၼ်ႉၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + ၾရၼ်ႉၼိဝ်းၶႄႇလီႇတူဝ်းၼီးယႃး + + + ပလတ်ႇတီႇၼမ်ႇ + ပလတ်ႇတီႇၼမ်ႇ + + + ငိုၼ်းၵွင်ၵၢင် RINET + ငိုၼ်းၵွင်ၵၢင် RINET + + + သုၶရေႇ + သုၶရေႇ + + + မၢႆငိုၼ်းတွင်းဢၼ်တိုၵ်ႉၸၢမ်းယူႇ + မၢႆငိုၼ်းတွင်းဢၼ်တိုၵ်ႉၸၢမ်းယူႇ + + + ယူႇၼိတ်ႉဢၶွင်ႉ ADB + ယူႇၼိတ်ႉဢၶွင်ႉ ADB + + + ငိုၼ်းဢၼ်ဢမ်ႇႁူႉၸိုဝ်ႈ + ငိုၼ်းဢၼ်ဢမ်ႇႁူႉၸိုဝ်ႈ + + + တီႇၼႃႇယႄႇမႅၼ်ႇ + တီႇၼႃႇယႄႇမႅၼ်ႇ + + + ရီဢႄလ်ယႄႇမႅၼ်ႇ + ရီဢႄလ်ယႄႇမႅၼ်ႇ + + + တီႇၼႃႇၶႅင် ယူႇၵူဝ်ႇသလႃးဝီးယႃး(1966–1990) + တီႇၼႃႇၶႅင် ယူႇၵူဝ်ႇသလႃးဝီးယႃး(1966–1990) + + + တီႇၼႃႇမႂ်ႇ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1994–2002) + တီႇၼႃႇမႂ်ႇ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1994–2002) + + + တီႇၼႃႇဢၼ်လႅၵ်ႈလႆႈ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1990–1992) + တီႇၼႃႇဢၼ်လႅၵ်ႈလႆႈ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1990–1992) + + + တီႇၼႃႇဢၼ်ၶိုၼ်းမႄးဝႆႉ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1992–1993) + တီႇၼႃႇဢၼ်ၶိုၼ်းမႄးဝႆႉ ယူႇၵူဝ်ႇသလႃးဝီးယႃး (1992–1993) + + + ရၼ်းဢႃႇၾရိၵၸၢၼ်း (ၵၢၼ်ငိုၼ်းတွင်း) + ရၼ်းဢႃႇၾရိၵၸၢၼ်း (ၵၢၼ်ငိုၼ်းတွင်း) + + + ရၼ်းဢႃႇၾရိၵၸၢၼ်း + ရၼ်းဢႃႇၾရိၵၸၢၼ်း + + + ၶႂႃႇၶျႃႇၸမ်းပီးယႃး (1968–2012) + ၶႂႃႇၶျႃႇၸမ်းပီးယႃး (1968–2012) + + + ၶႂႃႇၶျႃႇၸမ်းပီးယႃး + ၶႂႃႇၶျႃႇၸမ်းပီးယႃး + + + ၸၢႆႇရႄႇမႂ်ႇၸၢႆႇရႄႇယႅၼ်ႇ (1993–1998) + ၸၢႆႇရႄႇမႂ်ႇၸၢႆႇရႄႇယႅၼ်ႇ (1993–1998) + + + ၸၢႆႇရႄႇၸၢႆႇရႄႇယႅၼ်ႇ (1971–1993) + ၸၢႆႇရႄႇၸၢႆႇရႄႇယႅၼ်ႇ (1971–1993) + + + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (1980–2008) + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (1980–2008) + + + ၶမ်းၸိမ်ႇပႃႇပူၺ်ႇ + ၶမ်းၸိမ်ႇပႃႇပူၺ်ႇ + + + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (2009–2024) + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (2009–2024) + + + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (2008) + တေႃႇလႃႇၸိမ်ႇပႃႇပူၺ်ႇ (2008) + + + + {0} ဝၼ်း + ငွၵ်းၶႂႃ တီႈငွၵ်း ထိ {0} + + + + + + တႅတ်ႇသီႇ{0} + + + သႅၼ်ႇတီႇ{0} + + + မီႇလီႇ{0} + + + မၢႆႇၶရူဝ်ႇ{0} + + + ၼႃႇၼူဝ်ႇ{0} + + + ပီႇၵူဝ်ႇ{0} + + + ၾႅမ်ႇတူဝ်ႇ{0} + + + ဢႅတ်ႇတူဝ်ႇ{0} + + + ၸႅပ်ႇတူဝ်ႇ{0} + + + ယွၵ်ႇတူဝ်ႇ{0} + + + ရွၼ်ႇတူဝ်ႇ{0} + + + ၶွတ်ႉတူဝ်ႇ{0} + + + တႅၵ်ႇၵႃႇ{0} + + + ႁႅၵ်ႇတူဝ်ႇ{0} + + + ၵီႇလူဝ်ႇ{0} + + + မႅၵ်ႇၵႃႇ{0} + + + ၵိၵ်ႇၵႃႇ{0} + + + ထႄႇရႃႇ{0} + + + ပီႇတႃႇ{0} + + + ဢႅၵ်ႇၸႃႇ{0} + + + ၸႅတ်ႇတႃႇ{0} + + + ယူတ်ႇတႃႇ{0} + + + ရွၼ်ႇၼႃႇ{0} + + + ၶွတ်ႉတႃႇ{0} + + + ၵီႇပီႇ{0} + + + မႄႇပီႇ{0} + + + ၵိပ်ႉပီႇ{0} + + + ထႄႇပီ{0} + + + ပႄႇပီႇ{0} + + + ဢႅၵ်ႉသ်ပီႇ{0} + + + ၸႅပ်ႉပီႇ{0} + + + ယွပ်ႉပီႇ{0} + + + {0} တေႃႇ {1} + + + သီႇၸဵင်ႇၽဵင်ႇ{0} + + + ၶိဝ်းပိၵ်ႉ{0} + + + ႁႅင်း G + {0} ႁႅင်း G + + + မီႇတႃႇတေႃႇသႅၵ်ႉၵၢၼ်ႉသွင်ပုၼ်ႈ + {0} မီႇတႃႇတေႃႇသႅၵ်ႉၵၢၼ်ႉသွင်ပုၼ်ႈ + + + ႁွပ်ႈ + {0} ႁွပ်ႈ + + + ရေႇတီႇယၼ်ႇ + {0} ရေႇတီႇယၼ်ႇ + + + တီႇၵရီႇ + {0} တီႇၵရီႇ + + + ဢၢၵ်ႉမိၼိတ်ႉ + {0} ဢၢၵ်ႉမိၼိတ်ႉ + + + ဢၢၵ်ႉသႅၵ်ႉၵၢၼ်ႉ + {0} ဢၢၵ်ႉသႅၵ်ႉၵၢၼ်ႉ + + + သီႇၸဵင်ႇၽဵင်ႇၵီႇလူဝ်ႇမီႇတႃႇ + {0} သီႇၸဵင်ႇၽဵင်ႇၵီႇလူဝ်ႇမီႇတႃႇ + {0} တေႃႇ သီႇၸဵင်ႇၽဵင်ႇၵီႇလူဝ်ႇမီႇတႃႇ + + + ႁႅၵ်ႇတႃႇ + {0} ႁႅၵ်ႇတႃႇ + + + သီႇၸဵင်ႇၽဵင်ႇမီႇတႃႇ + {0} သီႇၸဵင်ႇၽဵင်ႇမီႇတႃႇ + {0} တေႃႇ သီႇၸဵင်ႇၽဵင်ႇမီႇတႃႇ + + + သီႇၸဵင်ႇၽဵင်ႇသႅၼ်ႇတီႇမီႇတႃႇ + {0} သီႇၸဵင်ႇၽဵင်ႇသႅၼ်ႇတီႇမီႇတႃႇ + {0} တေႃႇ သီႇၸဵင်ႇၽဵင်ႇသႅၼ်ႇတီႇမီႇတႃႇ + + + သီႇၸဵင်ႇၽဵင်ႇလၵ်း + {0} သီႇၸဵင်ႇၽဵင်ႇလၵ်း + {0} တေႃႇ သီႇၸဵင်ႇၽဵင်ႇလၵ်း + + + ဢေႇၵ + {0} ဢေႇၵ + + + သီႇၸဵင်ႇၽဵင်ႇဝၢႆႈ + {0} သီႇၸဵင်ႇၽဵင်ႇဝၢႆႈ + + + သီႇၸဵင်ႇၽဵင်ႇထတ်း + {0} သီႇၸဵင်ႇၽဵင်ႇထတ်း + + + သီႇၸဵင်ႇၽဵင်ႇၼိဝ်ႉ + {0} သီႇၸဵင်ႇၽဵင်ႇၼိဝ်ႉ + {0} တေႃႇ သီႇၸဵင်ႇၽဵင်ႇၼိဝ်ႉ + + + တူးၼမ်ႇ + {0} တူးၼမ်ႇ + + + ၵရၢတ်ႉ + {0} ၵရၢတ်ႉ + + + မီႇလီႇၵရမ်ႇ တေႃႇ တႅတ်ႇသီႇလီႇတႃႇ + {0} မီႇလီႇၵရမ်ႇ တေႃႇ တႅတ်ႇသီႇလီႇတႃႇ + + + မီႇလီႇမူဝ်း တေႃႇ လီႇတႃႇ + {0} မီႇလီႇမူဝ်း တေႃႇ လီႇတႃႇ + + + ဢၼ် + {0} ဢၼ် + + + တွၼ်ႈ + {0} တွၼ်ႈ + + + တွၼ်ႈတေႃႇလၢၼ်ႉတွၼ်ႈ + {0} တွၼ်ႈတေႃႇလၢၼ်ႉတွၼ်ႈ + + + ဝၢၵ်ႈ + {0} ဝၢၵ်ႈ + + + ပႃႇမီးလ် + {0} ပႃႇမီးလ် + + + ပႃႇမီးရိယႅတ်ႉ + {0} ပႃႇမီးရိယႅတ်ႉ + + + မူဝ်း + {0} မူဝ်း + + + ၵလူးၵူတ်ႉ + {0} ၵလူးၵူတ်ႉ + + + လီႇတႃႇ တေႃႇ ၵီႇလူဝ်ႇမီႇတႃႇ + {0} လီႇတႃႇ တေႃႇ ၵီႇလူဝ်ႇမီႇတႃႇ + + + လီႇတႃႇ တေႃႇ 100 ၵီႇလူဝ်ႇမီႇတႃႇ + {0} လီႇတႃႇ တေႃႇ 100 ၵီႇလူဝ်ႇမီႇတႃႇ + + + လၵ်းတေႃႇၵႃႇလၢၼ်ႇ + {0} လၵ်းတေႃႇၵႃႇလၢၼ်ႇ + + + လၵ်းတေႃႇၵႃႇလၢၼ်ႇဢိင်းၵလဵတ်ႈ + {0} လၵ်းတေႃႇၵႃႇလၢၼ်ႇဢိင်းၵလဵတ်ႈ + + + ပီႇတႃႇပၢႆႉ + {0} ပီႇတႃႇပၢႆႉ + + + ထႄႇရႃႇပၢႆႉ + {0} ထႄႇရႃႇပၢႆႉ + + + ထႄႇရႃႇပိတ်ႉ + {0} ထႄႇရႃႇပိတ်ႉ + + + ၵိၵ်ႇၵႃႇပၢႆႉ + {0} ၵိၵ်ႇၵႃႇပၢႆႉ + + + ၵိၵ်ႇၵႃႇပိတ်ႉ + {0} ၵိၵ်ႇၵႃႇပိတ်ႉ + + + မႅၵ်ႇၵႃႇပၢႆႉ + {0} မႅၵ်ႇၵႃႇပၢႆႉ + + + မႅၵ်ႇၵႃႇပိတ်ႉ + {0} မႅၵ်ႇၵႃႇပိတ်ႉ + + + ၵီႇလူဝ်ႇပၢႆႉ + {0} ၵီႇလူဝ်ႇပၢႆႉ + + + ၵီႇလူဝ်ႇပိတ်ႉ + {0} ၵီႇလူဝ်ႇပိတ်ႉ + + + ပၢႆႉ + {0} ပၢႆႉ + + + ပိတ်ႉ + {0} ပိတ်ႉ + + + ႁူဝ်ပၢၵ်ႇပီ + {0} ႁူဝ်ပၢၵ်ႇပီ + + + ႁူဝ်သိပ်းပီ + {0} ႁူဝ်သိပ်းပီ + + + ပီ + {0} ပီ + {0} တေႃႇပီ + + + သၢမ်လိူၼ်ႁွပ်ႈ + {0} သၢမ်လိူၼ်ႁွပ်ႈ + {0}/သၢမ်လိူၼ်ႁွပ်ႈ + + + လိူၼ် + {0} လိူၼ် + {0} တေႃႇလိူၼ် + + + ဝူင်ႈ + {0} ဝူင်ႈ + {0} တေႃႇဝူင်ႈ + + + ဝၼ်း + {0} ဝၼ်း + {0} တေႃႇဝၼ်း + + + မူင်း + {0} မူင်း + {0} တေႃႇမူင်း + + + မိၼိတ်ႉ + {0} မိၼိတ်ႉ + {0} တေႃႇမိၼိတ်ႉ + + + ၸႅၵ်ႉၵၢၼ်ႉ + {0} ၸႅၵ်ႉၵၢၼ်ႉ + {0}/ၸႅၵ်ႉ + + + မီႇလီႇၸႅၵ်ႉၵၢၼ်ႉ + {0} မီႇလီႇၸႅၵ်ႉၵၢၼ်ႉ + + + မၢႆႇၶရူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + {0} မၢႆႇၶရူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + + + ၼႃႇၼူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + {0} ၼႃႇၼူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + + + ဢႅမ်ႇပီႇယႃႇ + {0} ဢႅမ်ႇပီႇယႃႇ + + + မီႇလီႇဢႅမ်ႇပီႇယႃႇ + {0} မီႇလီႇဢႅမ်ႇပီႇယႃႇ + + + ဢူမ်း + {0} ဢူမ်း + + + ဝူဝ်ႉ + {0} ဝူဝ်ႉ + + + ၵီႇလူဝ်ႇၵႄႇလူဝ်ႇရီႇ + {0} ၵီႇလူဝ်ႇၵႄႇလူဝ်ႇရီႇ + + + ၵႄႇလူဝ်ႇရီႇ + {0} ၵႄႇလူဝ်ႇရီႇ + + + ၵီႇလူဝ်ႇၵျူဝ်း + {0} ၵီႇလူဝ်ႇၵျူဝ်း + + + ၵျူဝ်း + {0} ၵျူဝ်း + + + ၵီႇလူဝ်ႇဝတ်ႉ-ၸူဝ်ႈမူင်း + {0} ၵီႇလူဝ်ႇဝတ်ႉ-ၸူဝ်ႈမူင်း + + + ဢီႇလႅတ်ႇထရွၼ်ႇဝူဝ်ႉ + {0} ဢီႇလႅတ်ႇထရွၼ်ႇဝူဝ်ႉ + + + ယူႇၼိတ်ႉတၢင်းမႆးဢိင်းၵလဵတ်ႈ + {0} ယူႇၼိတ်ႉတၢင်းမႆးဢိင်းၵလဵတ်ႈ + + + ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + {0} ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + + + ႁႅင်းပွၼ်း + {0} ႁႅင်းပွၼ်း + + + ၼိဝ်ႇတၼ်ႇ + {0} ၼိဝ်ႇတၼ်ႇ + + + ၵီႇလူဝ်ႇဝတ်ႉ-ၸူဝ်ႈမူင်း တေႃႇ 100 ၵီႇလူဝ်ႇမီႇတႃႇ + {0} ၵီႇလူဝ်ႇဝတ်ႉ-ၸူဝ်ႈမူင်း တေႃႇ 100 ၵီႇလူဝ်ႇမီႇတႃႇ + + + ၵိၵ်ႇၵႃႇႁႅတ်ႉ + {0} ၵိၵ်ႇၵႃႇႁႅတ်ႉ + + + မႅၵ်ႇၵႃႇႁႅတ်ႉ + {0} မႅၵ်ႇၵႃႇႁႅတ်ႉ + + + ၵီႇလူဝ်ႇႁႅတ်ႉ + {0} ၵီႇလူဝ်ႇႁႅတ်ႉ + + + ႁႅတ်ႉ + {0} ႁႅတ်ႉ + + + ၵၢၼ်ပေႃႉလိၵ်ႈ ems + + + ၽိၵ်ႇသႄႇလ် + {0} ၽိၵ်ႇသႄႇလ် + + + မႅၵ်ႇၵႃႇၽိၵ်ႇသႄႇလ် + {0} မႅၵ်ႇၵႃႇၽိၵ်ႇသႄႇလ် + + + ၽိၵ်ႇသႄႇလ် တေႃႇ သႅၼ်ႇတီႇမီႇတႃႇ + {0} ၽိၵ်ႇသႄႇလ် တေႃႇ သႅၼ်ႇတီႇမီႇတႃႇ + + + ၽိၵ်ႇသႄႇလ် တေႃႇ ၼိဝ်ႉ + {0} ၽိၵ်ႇသႄႇလ် တေႃႇ ၼိဝ်ႉ + + + ထႅဝ်ၽိတ်ႇလုမ်ႈၾႃႉ + {0} ထႅဝ်ၽိတ်ႇလုမ်ႈၾႃႉ + + + ၵီႇလူဝ်ႇမီႇတႃႇ + {0} ၵီႇလူဝ်ႇမီႇတႃႇ + {0} တေႃႇၵီႇလူဝ်ႇမီႇတႃႇ + + + မီႇတႃႇ + {0} မီႇတႃႇ + {0} တေႃႇမီႇတႃႇ + + + တႅတ်ႇသီႇမီႇတႃႇ + {0} တႅတ်ႇသီႇမီႇတႃႇ + + + သႅၼ်ႇတီႇမီႇတႃႇ + {0} သႅၼ်ႇတီႇမီႇတႃႇ + {0} တေႃႇသႅၼ်ႇတီႇမီႇတႃႇ + + + မီႇလီႇမီႇတႃႇ + {0} မီႇလီႇမီႇတႃႇ + + + မၢႆႇၶရူဝ်ႇမီႇတႃႇ + {0} မၢႆႇၶရူဝ်ႇမီႇတႃႇ + + + ၼႃႇၼူဝ်ႇမီႇတႃႇ + {0} ၼႃႇၼူဝ်ႇမီႇတႃႇ + + + ပီႇၵူဝ်ႇမီႇတႃႇ + {0} ပီႇၵူဝ်ႇမီႇတႃႇ + + + လၵ်း + {0} လၵ်း + + + ဝၢႆႈ + {0} ဝၢႆႈ + + + ထတ်း + {0} ထတ်း + {0} တေႃႇထတ်း + + + ၼိဝ်ႉ + {0} ၼိဝ်ႉ + {0} တေႃႇၼိဝ်ႉ + + + ပႃႇသႅၵ်ႉ + {0} ပႃႇသႅၵ်ႉ + + + ပီလႅင်း + {0} ပီလႅင်း + + + ယူႇၼိတ်ႉ ပၢႆးလႅင်လၢဝ် + {0} ယူႇၼိတ်ႉ ပၢႆးလႅင်လၢဝ် + + + ၾႃႇလူင်ႇ + {0} ၾႃႇလူင်ႇ + + + ၾႃႇထွမ်ႇ + {0} ၾႃႇထွမ်ႇ + + + လၵ်းၼမ်ႉ + {0} လၵ်းၼမ်ႉ + + + လၵ်းသၵႅၼ်ႇတီႇၼေႇဝီႇယႅၼ်ႇ + {0} လၵ်းသၵႅၼ်ႇတီႇၼေႇဝီႇယႅၼ်ႇ + + + ၸုတ်း + {0} ၸုတ်း + + + ထႅဝ်ၽိတ်ႇလႅတ်ႇ + {0} ထႅဝ်ၽိတ်ႇလႅတ်ႇ + + + လၵ်ႉသ် + {0} လၵ်ႉသ် + + + ၶႅၼ်ႇတႄႇလႃႇ + {0} ၶႅၼ်ႇတႄႇလႃႇ + + + လူႇမႅၼ်ႇ + {0} လူႇမႅၼ်ႇ + + + လွင်ႈႁိူဝ်ႈလႅင်းလႅတ်ႇ + {0} လွင်ႈႁိူဝ်ႈလႅင်းလႅတ်ႇ + + + မႅတ်ႉထရိတ်ႉတၢၼ်ႇ + {0} မႅတ်ႉထရိတ်ႉ တၢၼ်ႇ + + + ၵီႇလူဝ်ႇၵရမ်ႇ + {0} ၵီႇလူဝ်ႇၵရမ်ႇ + {0} တေႃႇၵီႇလူဝ်ႇၵရမ်ႇ + + + ၵရမ်ႇ + {0} ၵရမ်ႇ + {0} တေႃႇၵရမ်ႇ + + + မီႇလီႇၵရမ်ႇ + {0} မီႇလီႇၵရမ်ႇ + + + မၢႆႇၶရူဝ်ႇၵရမ်ႇ + {0} မၢႆႇၶရူဝ်ႇၵရမ်ႇ + + + တၢၼ်ႇ + {0} တၢၼ်ႇ + + + သတူၼ်း + {0} သတူၼ်း + + + ပွၼ်း + {0} ပွၼ်း + {0} တေႃႇပွၼ်း + + + ဢွၼ်း + {0} ဢွၼ်း + {0} တေႃႇဢွၼ်း + + + ထရွႆႉဢွၼ်း + {0} ထရွႆႉဢွၼ်း + + + ၵရၢတ်ႈ + {0} ၵရၢတ်ႈ + + + တႄႇလ်တၢၼ်ႇ + {0} တႄႇလ်တၢၼ်ႇ + + + ၼႅၼ်ႈၼႃလုမ်ႈၾႃႉ + + + ၼႅၼ်ႈၼႃလႅတ်ႇ + {0} ၼႅၼ်ႈၼႃလႅတ်ႇ + + + မဵတ်ႉၽၼ်း + {0} မဵတ်ႉၽၼ်း + + + ၵိၵ်ႇၵႃႇဝတ်ႉ + {0} ၵိၵ်ႇၵႃႇဝတ်ႉ + + + မႅၵ်ႇၵႃႇဝတ်ႉ + {0} မႅၵ်ႇၵႃႇဝတ်ႉ + + + ၵီႇလူဝ်ႇဝတ်ႉ + {0} ၵီႇလူဝ်ႇဝတ်ႉ + + + ဝတ်ႉ + {0} ဝတ်ႉ + + + မီႇလီႇဝတ်ႉ + {0} မီႇလီႇဝတ်ႉ + + + ႁႅင်းမႃႉ + {0} ႁႅင်းမႃႉ + + + မီႇလီႇမီႇတႃႇမႃႇၵျူႇရီႇ + {0} မီႇလီႇမီႇတႃႇမႃႇၵျူႇရီႇ + + + မႃႇၵျူႇရီႇ + {0} မႃႇၵျူႇရီႇ + + + ပွၼ်းတေႃႇၼိဝ်ႉသွင်ပုၼ်ႈ + {0} ပွၼ်းတေႃႇၼိဝ်ႉသွင်ပုၼ်ႈ + + + ၼိဝ်ႉမႃႇၵျူႇရီႇ + {0} ၼိဝ်ႉမႃႇၵျူႇရီႇ + + + ပႃးရ် + {0} ပႃးရ် + + + မီႇလီႇပႃးရ် + {0} မီႇလီႇပႃးရ် + + + ႁႅင်းၼႅၼ်ႈလူမ်း + {0} ႁႅင်းၼႅၼ်ႈလူမ်း + + + ပၢတ်ႉသၵႄးလ် + {0} ပၢတ်ႉသၵႄးလ် + + + ႁႅၵ်ႇတူဝ်ႇပၢတ်ႉသၵႄးလ် + {0} ႁႅၵ်ႇတူဝ်ႇပၢတ်ႉသၵႄးလ်' + + + ၵီႇလူဝ်ႇပၢတ်ႉသၵႄးလ် + {0} ၵီႇလူဝ်ႇပၢတ်ႉသၵႄးလ် + + + မႅၵ်ႇၵႃႇပၢတ်ႉသၵႄးလ် + {0} မႅၵ်ႇၵႃႇပၢတ်ႉသၵႄးလ် + + + ၵီႇလူဝ်ႇမီႇတႃႇတေႃႇၸူဝ်ႈမူင်း + {0} ၵီႇလူဝ်ႇမီႇတႃႇတေႃႇၸူဝ်ႈမူင်း + + + မီႇတႃႇတေႃႇၸႅၵ်ႉၵၢၼ်ႉ + {0} မီႇတႃႇတေႃႇၸႅၵ်ႉၵၢၼ်ႉ + + + လၵ်းတေႃႇၸူဝ်ႈမူင်း + {0} လၵ်းတေႃႇၸူဝ်ႈမူင်း + + + ၼွတ်ႉ + {0} ၼွတ်ႉ + + + ပူဝ်ၾူတ်ႉ + ပူဝ်ၾူတ်ႉ {0} + + + တီႇၵရီႇသႄးသီးယႅတ်ႉ + {0} တီႇၵရီႇသႄးသီးယႅတ်ႉ + + + တီႇၵရီႇၾႃႇရႅၼ်ႇႁၢႆႉ + {0} တီႇၵရီႇၾႃႇရႅၼ်ႇႁၢႆႉ + + + ၶႄႇလ်ဝိၼ်ႇ + {0} ၶႄႇလ်ဝိၼ်ႇ + + + ႁႅင်းပွၼ်း-ထတ်း + {0} ႁႅင်းပွၼ်း-ထတ်း + + + ၼိဝ်ႇတၼ်ႇမီႇတႃႇ + {0} ၼိဝ်ႇတၼ်ႇမီႇတႃႇ + + + ၶိဝ်းပိၵ်ႉၵီႇလူဝ်ႇမီႇတႃႇ + {0} ၶိဝ်းပိၵ်ႉၵီႇလူဝ်ႇမီႇတႃႇ + + + ၶိဝ်းပိၵ်ႉမီႇတႃႇ + {0} ၶိဝ်းပိၵ်ႉမီႇတႃႇ + {0} တေႃႇ ၶိဝ်းပိၵ်ႉမီႇတႃႇ + + + ၶိဝ်းပိၵ်ႉသႅၼ်ႇတီႇမီႇတႃႇ + {0} ၶိဝ်းပိၵ်ႉသႅၼ်ႇတီႇမီႇတႃႇ + {0} တေႃႇ ၶိဝ်းပိၵ်ႉသႅၼ်ႇတီႇမီႇတႃႇ + + + လၵ်းၶိဝ်းပိၵ်ႉ + {0} လၵ်းၶိဝ်းပိၵ်ႉ + + + ဝၢႆႈၶိဝ်းပိၵ်ႉ + {0} ဝၢႆႈၶိဝ်းပိၵ်ႉ + + + ထတ်းၶိဝ်းပိၵ်ႉ + {0} ထတ်းၶိဝ်းပိၵ်ႉ + + + ၼိဝ်ႉၶိဝ်းပိၵ်ႉ + {0} ၼိဝ်ႉၶိဝ်းပိၵ်ႉ + + + မႅၵ်ႇၵႃႇလီႇတႃႇ + {0} မႅၵ်ႇၵႃႇလီႇတႃႇ + + + ႁႅၵ်ႇတူဝ်ႇလီႇတႃႇ + {0} ႁႅၵ်ႇတတူဝ်လီႇတႃႇ + + + လီႇတႃႇ + {0} လီႇတႃႇ + {0} တေႃႇလီႇတႃႇ + + + တႅတ်ႇသီႇလီႇတႃႇ + {0} တႅတ်ႇသီႇလီႇတႃႇ + + + သႅၼ်ႇတီႇလီႇတႃႇ + {0} သႅၼ်ႇတီႇလီႇတႃႇ + + + မီႇလီႇလီႇတႃႇ + {0} မီႇလီႇလီႇတႃႇ + + + ပၢႆးမႅတ်ႉထရိတ်ႉ + {0} ပၢႆးမႅတ်ႉထရိတ်ႉ + + + ၵွၵ်းမႅတ်ႉထရိတ်ႉ + {0} ၵွၵ်းမႅတ်ႉထရိတ်ႉ + + + ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + + + ထတ်းဢေႇၵ + {0} ထတ်းဢေႇၵ + + + ၶႂၢႆး + {0} ၶႂၢႆး + + + ၵႃႇလၢၼ်ႇ + {0} ၵႃႇလၢၼ်ႇ + {0} တေႃႇၵႃႇလၢၼ်ႇ + + + ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0} ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0} တေႃႇ ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + + + ၶွတ်ႉ + {0} ၶွတ်ႉ + + + ပၢႆး + {0} ပၢႆး + + + ပၢႆး ဢိင်းၵလဵတ်ႈ + {0}ပၢႆး ဢိင်းၵလဵတ်ႈ + + + ၵွၵ်း + {0} ၵွၵ်း + + + ၵွၵ်း ဢိင်းၵလဵတ်ႈ + {0} ၵွၵ်း ဢိင်းၵလဵတ်ႈ + + + ဢွၼ်းၼမ်ႉယၢင်ႇ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇ + + + ဢွၼ်းၼမ်ႉယၢင်ႇ ဢိင်းၵလဵတ်ႈ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇ ဢိင်းၵလဵတ်ႈ + + + ၸေႃႉၵိၼ်ၶဝ်ႈ + {0} ၸေႃႉၵိၼ်ၶဝ်ႈ + + + ၸေႃႉၼမ်ႉၼဵင်ႈ + {0} ၸေႃႉၼမ်ႉၼဵင်ႈ + + + ပႃႇရႄႇလ် + {0} ပႃႇရႄႇလ် + + + ၸေႃႉႁၢတ်ႈ + {0} ၸေႃႉႁၢတ်ႈ + + + ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + {0} ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + + + ယွတ်ႇ + {0} ယွတ်ႇ + + + တရမ်ႇ + {0} တရမ်ႇ + + + ၸိၵ်ႇၵႃႇ + {0} ၸိၵ်ႇၵႃႇ + + + ယွပ်း + {0} ယွပ်း + + + ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + {0} ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + + + သတီးရေႇတီႇယၼ်ႇ + {0} သတီးရေႇတီႇယၼ်ႇ + + + ၶႃႇတႄႇလ် + {0} ၶႃႇတႄႇလ် + + + ၶူဝ်ႇလွမ်ႇ + {0} ၶူဝ်ႇလွမ်ႇ + + + ၾႃႇရတ်ႉ + {0} ၾႃႇရတ်ႉ + + + ႁႅၼ်ႇရီႇ + {0} ႁႅၼ်ႇရီႇ + + + သီႇမႅၼ်း + {0} သီႇမႅၼ်း + + + ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + {0} ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + + + ယူႇၼိတ်ႉတၢင်းမႆးဢိင်းၵလဵတ်ႈ [ဢၢႆႇထီႇ] + {0} ယူႇၼိတ်ႉတၢင်းမႆးဢိင်းၵလဵတ်ႈ [ဢၢႆႇထီႇ] + + + ပႅၵ်ႉၶႄႇရႄႇလ် + {0} ပႅၵ်ႉၶႄႇရႄႇလ် + + + သီႇဝႅတ်ႉ + {0} သီႇဝႅတ်ႉ + + + ၵရေး + {0} ၵရေး + + + ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + {0} ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + + + ရွတ်ႉ + {0} ရွတ်ႉ + + + ၶျဵၼ်း + {0} ၶျဵၼ်း + + + တႅတ်ႉသလႃႇ + {0} တႅတ်ႉသလႃႇ + + + ဝႅပ်ႉပႃႇ + {0} ဝႅပ်ႉပႃႇ + + + ရႅၼ်ႇၵိၼ်ႇ + {0} ရႅၼ်ႇၵိၼ်ႇ + + + ၽၢၵ်ႇလိူၼ် + {0} ၽၢၵ်ႇလိူၼ် + + + သလၢၵ်ႉ + {0} သလၢၵ်ႉ + + + ဢၼ်မိူၼ်ၵၼ်တင်း ၵႅတ်ႉသ် + {0} ဢၼ်မိူၼ်ၵၼ်တင်း ၵႅတ်ႉသ် + + + ရိၼ်း [ၵပ.] + {0} ရိၼ်း [ၵပ.] + + + သုၼ်း [ၵပ.] + {0} သုၼ်း [ၵပ.] + + + သျၵ်ၵု [ၵပ.] + {0} သျၵ်ၵု [ၵပ.] + + + သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + {0} သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + + + ၵႅၼ်း [ၵပ.] + {0} ၵႅၼ်း [ၵပ.] + + + ၸူဝ်း [ၵပ.] + {0} ၸူဝ်း [ၵပ.] + + + ရီ [ၵပ.] + {0} ရီ [ၵပ.] + + + ပု [ၵပ.] + {0} ပု [ၵပ.] + + + သႄ [ၵပ.] + {0} သႄ [ၵပ.] + + + ၶျူဝ် [ၵပ.] + {0} ၶျူဝ် [ၵပ.] + + + ၵူဝ်ၸႃးၵျိ [ၵပ.] + {0} ၵူဝ်ၸႃးၵျိ [ၵပ.] + + + ဢူဝ်ၸႃးၵျိ [ၵပ.] + {0} ဢူဝ်ၸႃးၵျိ [ၵပ.] + + + ၵွပ်း [ၵပ.] + {0} ၵွပ်း [ၵပ.] + + + သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + {0} သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + + + သၢႆႉ [ၵပ.] + {0} သၢႆႉ [ၵပ.] + + + တူဝ်ႇ [ၵပ.] + {0} တူဝ်ႇ [ၵပ.] + + + ၵွၵ်ၵု [ၵပ.] + {0} ၵွၵ်ၵု [ၵပ.] + + + လႅင်း + {0} လႅင်း + + + ၾုၼ်ႉ [ၵပ.] + {0} ၾုၼ်ႉ [ၵပ.] + + + တွၼ်ႈတေႃႇႁဵင်လၢၼ်ႉ + {0} တွၼ်ႈတေႃႇႁဵင်လၢၼ်ႉ + + + ၶိုၼ်း + {0} ၶိုၼ်း + {0}/ၶိုၼ်း + + + သီႇမုင်ႈၼႃႈ + {0} တၢင်းဢွၵ်ႇ + {0} တၢင်းႁွင်ႇ + {0} တၢင်းၸၢၼ်း + {0} တၢင်းတူၵ်း + + + + + တႅတ်ႇသီႇ{0} + + + သႅၼ်ႇတီႇ{0} + + + မီႇလီႇ{0} + + + မၢႆႇၶရူဝ်ႇ{0} + + + ၼႃႇၼူဝ်ႇ{0} + + + ပီႇၵူဝ်ႇ{0} + + + ၾႅမ်ႇတူဝ်ႇ{0} + + + ဢႅတ်ႇတူဝ်ႇ{0} + + + ၸႅပ်ႇတူဝ်ႇ{0} + + + ယွၵ်ႇတူဝ်ႇ{0} + + + ရွၼ်ႇတူဝ်ႇ{0} + + + ၶွတ်ႉတူဝ်ႇ{0} + + + တႅၵ်ႇၵႃႇ{0} + + + ႁႅၵ်ႇတူဝ်ႇ{0} + + + ၵီႇလူဝ်ႇ{0} + + + မႅၵ်ႇၵႃႇ{0} + + + ၵိၵ်ႇၵႃႇ{0} + + + ထႄႇရႃႇ{0} + + + ပီႇတႃႇ{0} + + + ဢႅၵ်ႇၸႃႇ{0} + + + ၸႅတ်ႇတႃႇ{0} + + + ယူတ်ႇတႃႇ{0} + + + ရွၼ်ႇၼႃႇ{0} + + + ၶွတ်ႉတႃႇ{0} + + + ၵီႇပီႇ{0} + + + မႄႇပီႇ{0} + + + ၵိပ်ႉပီႇ{0} + + + ထႄႇပီ{0} + + + ပႄႇပီႇ{0} + + + ဢႅၵ်ႉသ်ပီႇ{0} + + + ၸႅပ်ႉပီႇ{0} + + + ယွပ်ႉပီႇ{0} + + + ႁႅင်း G + {0} ႁႅင်း G + + + မီႇတႃႇ/သႅၵ်ႉၵၢၼ်ႉ² + {0} မ./သႅၵ်ႉ.² + + + ႁွပ်ႈ + {0} ႁွပ်ႈ + + + ရေႇတီႇယၼ်ႇ + {0} ရေႇ + + + တီႇၵရီႇ + + + ဢၢၵ်ႉမိၼိတ်ႉ + + + ဢၢၵ်ႉသႅၵ်ႉၵၢၼ်ႉ + + + ၵမ.² + {0} ၵမ.² + {0}/ၵမ.² + + + ႁႅၵ်ႇတႃႇ + {0} ႁႅၵ်ႇတႃႇ + + + မ.² + {0} မ.² + {0}/မ.² + + + သမ.² + {0} သမ.² + {0}/သမ.² + + + လ.² + {0} လ.² + {0}/လ.² + + + ဢေႇၵ + {0} ဢေႇၵ + + + ဝ.² + {0} ဝ.² + + + ထ.² + {0} ထ.² + + + ၼ.² + {0} ၼ.² + {0}/ၼ.² + + + တူးၼမ်ႇ + {0} တူးၼမ်ႇ + + + ၵရၢတ်ႉ + {0} ၵရၢတ်ႉ + + + မၵ./တလ. + {0} မၵ./တလ. + + + မလမ./လ + {0} မလမ./လ + + + ဢၼ် + {0} ဢၼ် + + + တွၼ်ႈ + {0} တွၼ်ႈ + + + ဝၢၵ်ႈ + + + ပႃႇမီးလ် + + + ပႃႇမီးရိယႅတ်ႉ + + + မူဝ်း + {0} မူဝ်း + + + ၵလူးၵူတ်ႉ + {0} ၵလူးၵူတ်ႉ + + + လီႇတႃႇ/ၵမ. + {0} လ./ၵမ. + + + လ./100 ၵမ. + {0} လ./100 ၵမ. + + + လၵ်း/ၵႃႇလၢၼ်ႇ + {0} လၵ်း/ၵႃႇလၢၼ်ႇ + + + လၵ်း/ၵႃႇလၢၼ်ႇဢိင်ႈၵလဵတ်ႈ + {0} လၵ်းတေႃႇၵႃႇလၢၼ်ႇဢိင်းၵလဵတ်ႈ + + + ပၢႆႉ + {0} ပၢႆႉ + + + ပိတ်ႉ + {0} ပိတ်ႉ + + + ႁူဝ်ပၢၵ်ႇပီ + {0} ႁူဝ်ပၢၵ်ႇပီ + + + ႁူဝ်သိပ်းပီ + {0} ႁူဝ်သိပ်းပီ + + + ပီ + {0} ပီ + {0}/ပီ + + + သၢမ်လိူၼ်ႁွပ်ႈ + {0} သၢမ်လိူၼ်ႁွပ်ႈ + {0}/သၢမ်လိူၼ်ႁွပ်ႈ + + + လိူၼ် + {0} လိူၼ် + {0}/လိူၼ် + + + ဝူင်ႈ + {0} ဝူင်ႈ + {0}/ဝူင်ႈ + + + ဝၼ်း + {0} ဝၼ်း + {0}/ဝၼ်း + + + မူင်း + {0} မူင်း + {0}/မူင်း + + + မိၼိတ်ႉ + {0} မိၼိတ်ႉ + {0}/မိၼိတ်ႉ + + + ၸႅၵ်ႉၵၢၼ်ႉ + {0} ၸႅၵ်ႉ + {0}/ၸႅၵ်ႉ + + + မီႇလီႇၸႅၵ်ႉၵၢၼ်ႉ + {0} မီႇလီႇၸႅၵ်ႉ + + + မၢႆႇၶရူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + {0} မၢႆႇၸႅၵ်ႉ + + + ၼႃႇၼူဝ်ႇၸႅၵ်ႉၵၢၼ်ႉ + {0} ၼႃႇၸႅၵ်ႉ + + + ဢႅမ်ႇပီႇယႃႇ + + + မီႇလီႇဢႅမ်ႇပီႇယႃႇ + + + ဢူမ်း + + + ဝူဝ်ႉ + + + ၵီႇလူဝ်ႇၵႄႇလူဝ်ႇရီႇ + {0} ၵီႇလူဝ်ႇၵႄႇလူဝ်ႇရီႇ + + + ၵႄႇလူဝ်ႇရီႇ + {0} ၵႄႇလူဝ်ႇရီႇ + + + ၵီႇလူဝ်ႇၵျူဝ်း + {0} ၵီႇလူဝ်ႇၵျူဝ်း + + + ၵျူဝ်း + {0} ၵျူဝ်း + + + ၵဝ.မူင်း + {0} ၵဝ.မူင်း + + + ဢီႇလႅတ်ႇထရွၼ်ႇဝူဝ်ႉ + + + ပီႇထီႇယူႇ + {0} ပီႇထီႇယူႇ + + + ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + {0} ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + + + ႁႅင်းပွၼ်း + + + ၼိဝ်ႇတၼ်ႇ + + + ၵီႇလူဝ်ႇဝတ်ႉမူင်း/100ၵမ. + {0} ၵီႇလူဝ်ႇဝတ်ႉမူင်း/100ၵမ. + + + ၵမ. + {0} ၵမ. + {0}/ၵမ. + + + မီႇတႃႇ + {0} မ. + {0}/မ. + + + တမ. + {0} တမ. + + + သမ. + {0} သမ. + {0}/သမ. + + + မမ. + {0} မမ. + + + မၢႆႇၶရူဝ်ႇမီႇတႃႇ + + + ၼမ. + {0} ၼမ. + + + ပမ. + {0} ပမ. + + + လၵ်း + {0} လၵ်း + + + ဝၢႆႈ + {0} ဝၢႆႈ + + + ထတ်း + {0} ထတ်း + {0}/ထတ်း + + + ၼိဝ်ႉ + {0} ၼိဝ်ႉ + {0}/ၼိဝ်ႉ + + + ပႃႇသႅၵ်ႉ + {0} ပႃႇသႅၵ်ႉ + + + ပီလႅင်း + {0} ပီလႅင်း + + + ယူႇၼိတ်ႉ ပၢႆးလႅင်လၢဝ် + {0} ယူႇၼိတ်ႉ ပၢႆးလႅင်လၢဝ် + + + ၾႃႇလူင်ႇ + {0} ၾႃႇလူင်ႇ + + + ၾႃႇထွမ်ႇ + {0} ၾႃႇထွမ်ႇ + + + လၵ်းၼမ်ႉ + {0} လၵ်းၼမ်ႉ + + + လၵ်းသၵႅၼ်ႇတီႇၼေႇဝီႇယႅၼ်ႇ + + + ၸုတ်း + {0} ၸုတ်း + + + ထႅဝ်ၽိတ်ႇလႅတ်ႇ + + + လၵ်ႉသ် + + + ၶႅၼ်ႇတႄႇလႃႇ + + + လူႇမႅၼ်ႇ + + + လွင်ႈႁိူဝ်ႈလႅင်းလႅတ်ႇ + + + တ. + {0} တ. + + + ၵၵ. + {0} ၵၵ. + {0}/ၵၵ. + + + ၵရမ်ႇ + {0} ၵ. + {0}/ၵ. + + + မၵ. + {0} မၵ. + + + μၵ. + {0} μၵ. + + + တၢၼ်ႇ + {0} တၢၼ်ႇ + + + သတူၼ်း + {0} သတ. + + + ပွၼ်း + {0} ပွၼ်း + {0}/ပွၼ်း + + + ဢွၼ်း + {0} ဢွၼ်း + {0} တေႃႇဢွၼ်း + + + ထရွႆႉဢွၼ်း + {0} ဢထရ. + + + ၵရၢတ်ႈ + {0} ၵရၢတ်ႈ + + + တႄႇလ်တၢၼ်ႇ + + + ၼႅၼ်ႈၼႃလုမ်ႈၾႃႉ + + + ၼႅၼ်ႈၼႃလႅတ်ႇ + + + မဵတ်ႉၽၼ်း + {0} မဵတ်ႉၽၼ်း + + + ၵိၵ်ႇၵႃႇဝတ်ႉ + {0} ၵိၵ်ႇၵႃႇဝတ်ႉ + + + မႅၵ်ႇၵႃႇဝတ်ႉ + {0} မႅၵ်ႇၵႃႇဝတ်ႉ + + + ၵီႇလူဝ်ႇဝတ်ႉ + {0} ၵီႇလူဝ်ႇဝတ်ႉ + + + ဝတ်ႉ + {0} ဝတ်ႉ + + + မီႇလီႇဝတ်ႉ + {0} မီႇလီႇဝတ်ႉ + + + ႁႅင်းမႃႉ + {0} ႁႅင်းမႃႉ + + + မမ. မႃႇၵျူႇရီႇ + {0} မမ. မႃႇၵျူႇရီႇ + + + မႃႇၵျူႇရီႇ + {0} မႃႇၵျူႇရီႇ + + + ၼိဝ်ႉမႃႇၵျူႇရီႇ + {0} ၼိဝ်ႉမႃႇၵျူႇရီႇ + + + ပႃးရ် + {0} ပႃးရ် + + + မီႇလီႇပႃးရ် + {0} မီႇလီႇပႃးရ် + + + ႁႅင်းၼႅၼ်ႈလူမ်း + {0} ႁႅင်းၼႅၼ်ႈလူမ်း + + + ပၢတ်ႉသၵႄးလ် + + + ၵမ./ၸူဝ်ႈမူင်း + {0} ၵမ./မူင်း + + + မီႇတႃႇ/ၸႅၵ်ႉ + {0} မ./ၸႅၵ်ႉ + + + လၵ်း/မူင်း + {0} လ./မူင်း + + + ၼွတ်ႉ + {0} ၼွတ်ႉ + + + ပူဝ်ၾူတ်ႉ + ပူဝ်ၾူတ်ႉ {0} + + + တီႇၵရီႇသႄးသီးယႅတ်ႉ + + + တီႇၵရီႇၾႃႇရႅၼ်ႇႁၢႆႉ + + + ၵမ.³ + {0} ၵမ.³ + + + မ.³ + {0} မ.³ + {0}/မ.³ + + + သမ.³ + {0} သမ.³ + {0}/သမ.³ + + + လ.³ + {0} လ.³ + + + ဝ.³ + {0} ဝ.³ + + + ထ.³ + {0} ထ.³ + + + ၼ.³ + {0} ၼ.³ + + + မႅၵ်ႇၵႃႇလီႇတႃႇ + {0} မႅၵ်ႇၵႃႇလီႇတႃႇ + + + ႁလ. + {0} ႁလ. + + + လီႇတႃႇ + {0} လ. + {0}/လ. + + + တလ. + {0} တလ. + + + သလ. + {0} သလ. + + + မလ. + {0} မလ. + + + ပၢႆးမႅတ်ႉထရိတ်ႉ + {0} ပၢႆးမႅတ်ႉထရိတ်ႉ + + + ၵွၵ်းမႅတ်ႉထရိတ်ႉ + {0} ၵွၵ်းမႅတ်ႉထရိတ်ႉ + + + ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + + + ထတ်းဢေႇၵ + {0} ထတ်းဢေႇၵ + + + ၶႂၢႆး + {0} ၶႂၢႆး + + + ၵႃႇလၢၼ်ႇ + {0} ၵႃႇလၢၼ်ႇ + {0}/ၵႃႇလၢၼ်ႇ + + + ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0} ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0}/ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + + + ၶွတ်ႉ + {0} ၶွတ်ႉ + + + ပၢႆး + {0} ပၢႆး + + + ပၢႆး ဢိင်းၵလဵတ်ႈ + {0} ပၢႆး ဢိင်းၵလဵတ်ႈ + + + ၵွၵ်း + {0} ၵွၵ်း + + + ၵွၵ်း ဢိင်းၵလဵတ်ႈ + {0} ၵွၵ်း ဢိင်းၵလဵတ်ႈ + + + ဢွၼ်းၼမ်ႉယၢင်ႇ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇ + + + ၸေႃႉၵိၼ်ၶဝ်ႈ + {0} ၸေႃႉၵိၼ်ၶဝ်ႈ + + + ၸေႃႉၼမ်ႉၼဵင်ႈ + {0} ၸေႃႉၼမ်ႉၼဵင်ႈ + + + ပႃႇရႄႇလ် + {0} ပႃႇရႄႇလ် + + + ၸေႃႉႁၢတ်ႈ + {0} ၸေႃႉႁၢတ်ႈ + + + ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + {0} ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + + + ယွတ်ႇ + {0} ယွတ်ႇ + + + တရမ်ႇ + {0} တရမ်ႇ + + + ၸိၵ်ႇၵႃႇ + {0} ၸိၵ်ႇၵႃႇ + + + ယွပ်း + {0} ယွပ်း + + + ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + {0} ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + + + ၶႃႇတႄႇလ် + + + ၶူဝ်ႇလွမ်ႇ + + + ၾႃႇရတ်ႉ + + + ႁႅၼ်ႇရီႇ + + + သီႇမႅၼ်း + + + ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + {0} ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + + + ပီႇထီႇယူႇ-ဢၢႆႇထီႇ + {0} ပီႇထီႇယူႇ-ဢၢႆႇထီႇ + + + ပႅၵ်ႉၶႄႇရႄႇလ် + {0} Bq + + + သီႇဝႅတ်ႉ + + + ၵရေး + {0} ၵရေး + + + ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + {0} ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + + + ရွတ်ႉ + {0} ရွတ်ႉ + + + ၶျဵၼ်း + {0} ၶျဵၼ်း + + + တႅတ်ႉသလႃႇ + + + ဝႅပ်ႉပႃႇ + + + ၽၢၵ်ႇလိူၼ် + {0} ၽၢၵ်ႇလိူၼ် + + + သလၢၵ်ႉ + {0} သလၢၵ်ႉ + + + ဢၼ်မိူၼ်ၵၼ်တင်း ၵႅတ်ႉသ် + {0} gas-equiv + + + ရိၼ်း [ၵပ.] + {0} ရိၼ်း [ၵပ.] + + + သုၼ်း [ၵပ.] + {0} သုၼ်း [ၵပ.] + + + သျၵ်ၵု [ၵပ.] + {0} သျၵ်ၵု [ၵပ.] + + + သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + {0} သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + + + ၵႅၼ်း [ၵပ.] + {0} ၵႅၼ်း [ၵပ.] + + + ၸူဝ်း [ၵပ.] + {0} ၸူဝ်း [ၵပ.] + + + ရီ [ၵပ.] + {0} ရီ [ၵပ.] + + + ပု [ၵပ.] + {0} ပု [ၵပ.] + + + သႄ [ၵပ.] + {0} သႄ [ၵပ.] + + + ၶျူဝ် [ၵပ.] + {0} ၶျူဝ် [ၵပ.] + + + ၵူဝ်ၸႃးၵျိ [ၵပ.] + {0} ၵူဝ်ၸႃးၵျိ [ၵပ.] + + + ဢူဝ်ၸႃးၵျိ [ၵပ.] + {0} ဢူဝ်ၸႃးၵျိ [ၵပ.] + + + ၵွပ်း [ၵပ.] + {0} ၵွပ်း [ၵပ.] + + + သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + {0} သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + + + သၢႆႉ [ၵပ.] + {0} သၢႆႉ [ၵပ.] + + + တူဝ်ႇ [ၵပ.] + {0} တူဝ်ႇ [ၵပ.] + + + ၵွၵ်ၵု [ၵပ.] + {0} ၵွၵ်ၵု [ၵပ.] + + + လႅင်း + {0} လႅင်း + + + ၾုၼ်ႉ [ၵပ.] + {0} ၾုၼ်ႉ [ၵပ.] + + + တွၼ်ႈ/ႁဵင်လၢၼ်ႉ + {0} တတႁလ. + + + ၶိုၼ်း + {0} ၶိုၼ်း + {0}/ၶိုၼ်း + + + မုင်ႈၼႃႈ + {0} ဢ + {0} ႁ + {0} ၸ + {0} တ + + + + + တႅတ်ႇသီႇ{0} + + + သႅၼ်ႇတီႇ{0} + + + မီႇလီႇ{0} + + + မၢႆႇၶရူဝ်ႇ{0} + + + ၼႃႇၼူဝ်ႇ{0} + + + ပီႇၵူဝ်ႇ{0} + + + ၾႅမ်ႇတူဝ်ႇ{0} + + + ဢႅတ်ႇတူဝ်ႇ{0} + + + ၸႅပ်ႇတူဝ်ႇ{0} + + + ယွၵ်ႇတူဝ်ႇ{0} + + + ရွၼ်ႇတူဝ်ႇ{0} + + + ၶွတ်ႉတူဝ်ႇ{0} + + + တႅၵ်ႇၵႃႇ{0} + + + ႁႅၵ်ႇတူဝ်ႇ{0} + + + ၵီႇလူဝ်ႇ{0} + + + မႅၵ်ႇၵႃႇ{0} + + + ၵိၵ်ႇၵႃႇ{0} + + + ထႄႇရႃႇ{0} + + + ပီႇတႃႇ{0} + + + ဢႅၵ်ႇၸႃႇ{0} + + + ၸႅတ်ႇတႃႇ{0} + + + ယူတ်ႇတႃႇ{0} + + + ရွၼ်ႇၼႃႇ{0} + + + ၶွတ်ႉတႃႇ{0} + + + ၵီႇပီႇ{0} + + + မႄႇပီႇ{0} + + + ၵိပ်ႉပီႇ{0} + + + ထႄႇပီ{0} + + + ပႄႇပီႇ{0} + + + ဢႅၵ်ႉသ်ပီႇ{0} + + + ၸႅပ်ႉပီႇ{0} + + + ယွပ်ႉပီႇ{0} + + + ႁႅင်း G + {0} ႁႅင်း G + + + မ./သႅၵ်ႉ.² + {0} မ./သႅၵ်ႉ.² + + + ႁွပ်ႈ + {0}ႁွပ်ႈ + + + ရေႇတီႇယၼ်ႇ + {0}ရေႇ + + + တီႇၵရီႇ + + + ဢၢၵ်ႉမိၼိတ်ႉ + + + ဢၢၵ်ႉသႅၵ်ႉၵၢၼ်ႉ + + + ၵမ.² + {0}ၵမ.² + {0}/ၵမ.² + + + ႁႅၵ်ႇတႃႇ + {0}ႁႅၵ်ႇတႃႇ + + + မ.² + {0}မ.² + {0}/မ.² + + + သမ.² + {0}သမ.² + {0}/သမ.² + + + လ.² + {0}လ.² + {0}/လ.² + + + ဢေႇၵ + {0}ဢေႇၵ + + + ဝ.² + {0}ဝ.² + + + ထ.² + {0}ထ.² + + + ၼ.² + {0}ၼ.² + {0}/ၼ.² + + + တူးၼမ်ႇ + {0}တူးၼမ်ႇ + + + ၵရၢတ်ႉ + {0}ၵရၢတ်ႉ + + + မၵ./တလ. + {0}မၵ./တလ. + + + မလမ./လ + {0}မလမ./လ + + + ဢၼ် + {0}ဢၼ် + + + တွၼ်ႈ + {0}တွၼ်ႈ + + + ဝၢၵ်ႈ + + + ပႃႇမီးလ် + + + ပႃႇမီးရိယႅတ်ႉ + + + မူဝ်း + {0}မူဝ်း + + + ၵလူးၵူတ်ႉ + {0} ၵလူးၵူတ်ႉ + + + လ./ၵမ. + {0}လ./ၵမ. + + + လ./100ၵမ. + {0} လ./100ၵမ. + + + mpg + {0}mpg + + + လၵ်း/ၵႃႇလၢၼ်ႇဢိင်ႈၵလဵတ်ႈ + {0} လၵ်းတေႃႇၵႃႇလၢၼ်ႇဢိင်းၵလဵတ်ႈ + + + {0}TB + + + {0}GB + + + {0}Gb + + + {0}MB + + + {0}Mb + + + {0}kB + + + {0}kb + + + ပၢႆႉ + {0}ပၢႆႉ + + + ပိတ်ႉ + {0}ပိတ်ႉ + + + ႁူဝ်ပၢၵ်ႇပီ + {0} ႁူဝ်ပၢၵ်ႇပီ + + + ႁူဝ်သိပ်းပီ + {0} ႁူဝ်သိပ်းပီ + + + ပီ + {0}ပီ + {0}/ပီ + + + သၢမ်လိူၼ်ႁွပ်ႈ + {0}သၢမ်လိူၼ်ႁွပ်ႈ + {0}/သၢမ်လိူၼ်ႁွပ်ႈ + + + လိူၼ် + {0}လိူၼ် + {0}/လိူၼ် + + + ဝူင်ႈ + {0}ဝူင်ႈ + {0}/ဝူင်ႈ + + + ဝၼ်း + {0}ဝၼ်း + {0}/ဝၼ်း + + + မူင်း + {0}မူင်း + {0}/မူင်း + + + မိၼိတ်ႉ + {0}မိၼိတ်ႉ + {0}/မိၼိတ်ႉ + + + ၸႅၵ်ႉ + {0}ၸႅၵ်ႉ + {0}/ၸႅၵ်ႉၵၢၼ်ႉ + + + မီႇလီႇၸႅၵ်ႉ + {0}မီႇလီႇၸႅၵ်ႉ + + + မၢႆႇၶရူဝ်ႇၸႅၵ်ႉ + {0}မၢႆႇၸႅၵ်ႉ + + + ၼႃႇၼူဝ်ႇၸႅၵ်ႉ + {0}ၼႃႇၸႅၵ်ႉ + + + ဢႅမ်ႇပီႇယႃႇ + {0}A + + + မီႇလီႇဢႅမ်ႇပီႇယႃႇ + {0}mA + + + ဢူမ်း + {0}Ω + + + ဝူဝ်ႉ + {0}V + + + ၵီႇလူဝ်ႇၵႄႇလူဝ်ႇရီႇ + {0}kcal + + + ၵႄႇလူဝ်ႇရီႇ + {0}ၵႄႇလူဝ်ႇရီႇ + + + ၵီႇလူဝ်ႇၵျူဝ်း + {0}ၵီႇလူဝ်ႇၵျူဝ်း + + + ၵျူဝ်း + {0}ၵျူဝ်း + + + ၵဝ.မူင်း + {0}ၵဝ.မူင်း + + + {0}eV + + + ပီႇထီႇယူႇ + {0} ပီႇထီႇယူႇ + + + ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + {0}ႁႅင်းမႆးယူႇဢႅတ်ႉသ် + + + ၼိဝ်ႇတၼ်ႇ + + + ၵီႇလူဝ်ႇဝတ်ႉမူင်း/100ၵမ. + {0} ၵီႇလူဝ်ႇဝတ်ႉမူင်း/100ၵမ. + + + {0}GHz + + + {0}MHz + + + {0}kHz + + + {0}Hz + + + ၵမ. + {0} ၵမ. + {0}/ၵမ. + + + မီႇတႃႇ + {0}မ. + {0}/မ + + + တမ. + {0}တမ. + + + သမ. + {0}သမ. + {0}/သမ. + + + မမ. + {0}မမ. + + + မၢႆႇၶရူဝ်ႇမီႇတႃႇ + + + ၼမ. + {0}ၼမ. + + + ပမ. + {0}ပမ. + + + လၵ်း + {0}လၵ်း + + + ဝၢႆႈ + {0}ဝၢႆႈ + + + ထတ်း + {0}′ + {0}/ထတ်း + + + ၼိဝ်ႉ + {0}″ + {0}/ၼိဝ်ႉ + + + ပႃႇသႅၵ်ႉ + {0}ပႃႇသႅၵ်ႉ + + + ပီလႅင်း + {0}ပီလႅင်း + + + ယူႇၼိတ်ႉ ပၢႆးလႅင်လၢဝ် + {0}au + + + ၾႃႇလူင်ႇ + {0}ၾႃႇလူင်ႇ + + + ၾႃႇထွမ်ႇ + {0}ၾႃႇထွမ်ႇ + + + လၵ်းၼမ်ႉ + {0}လၵ်းၼမ်ႉ + + + ၸုတ်း + {0}ၸုတ်း + + + ထႅဝ်ၽိတ်ႇလႅတ်ႇ + + + လၵ်ႉသ် + + + ၶႅၼ်ႇတႄႇလႃႇ + + + လူႇမႅၼ်ႇ + + + လွင်ႈႁိူဝ်ႈလႅင်းလႅတ်ႇ + + + တ. + {0} တ. + + + ၵၵ. + {0} ၵၵ. + {0}/ၵၵ. + + + ၵရမ်ႇ + {0}ၵ. + {0}/ၵ. + + + မၵ. + {0}မၵ. + + + μၵ. + {0}μၵ. + + + တၢၼ်ႇ + {0} တၢၼ်ႇ + + + သတူၼ်း + {0}သတ. + + + ပွၼ်း + {0}ပွၼ်း + {0}/ပွၼ်း + + + ဢွၼ်း + {0}ဢွၼ်း + {0}/ဢွၼ်း + + + ဢထရ. + {0}ဢထရ. + + + ၵရၢတ်ႈ + {0}ၵရၢတ်ႈ + + + {0}Da + + + မဵတ်ႉၽၼ်း + {0}မဵတ်ႉၽၼ်း + + + ၵိၵ်ႇၵႃႇဝတ်ႉ + {0}GW + + + မႅၵ်ႇၵႃႇဝတ်ႉ + {0}MW + + + ၵီႇလူဝ်ႇဝတ်ႉ + {0}kW + + + ဝတ်ႉ + {0}ဝတ်ႉ + + + မီႇလီႇဝတ်ႉ + {0}mW + + + ႁႅင်းမႃႉ + {0}ႁႅင်းမႃႉ + + + မမ. မႃႇၵျူႇရီႇ + {0}မမ. မႃႇၵျူႇရီႇ + + + မႃႇၵျူႇရီႇ + {0} မႃႇၵျူႇရီႇ + + + ၼိဝ်ႉမႃႇၵျူႇရီႇ + {0}ၼိဝ်ႉမႃႇၵျူႇရီႇ + + + ပႃးရ် + {0}ပႃးရ် + + + မီႇလီႇပႃးရ် + {0}မီႇလီႇပႃးရ် + + + ႁႅင်းၼႅၼ်ႈလူမ်း + {0}ႁႅင်းၼႅၼ်ႈလူမ်း + + + ပၢတ်ႉသၵႄးလ် + {0}Pa + + + {0}hPa + + + {0}kPa + + + {0}MPa + + + ၵမ./မူင်း + {0} ၵမ./မူင်း + + + မ./ၸႅၵ်ႉ + {0} မ./ၸႅၵ်ႉ + + + လ./မူင်း + {0} လ./မူင်း + + + ၼွတ်ႉ + {0} ၼွတ်ႉ + + + ပူဝ်ၾူတ်ႉ + ပူဝ်ၾူတ်ႉ {0} + + + တီႇၵရီႇသႄးသီးယႅတ်ႉ + + + တီႇၵရီႇၾႃႇရႅၼ်ႇႁၢႆႉ + {0}° + + + {0}K + + + ၵမ.³ + {0}ၵမ.³ + + + မ.³ + {0}မ.³ + {0}/မ.³ + + + သမ.³ + {0}သမ.³ + {0}/သမ.³ + + + လ.³ + {0}လ.³ + + + ဝ.³ + {0}ဝ.³ + + + ထ.³ + {0}ထ.³ + + + ၼ.³ + {0}ၼ.³ + + + မႅၵ်ႇၵႃႇလီႇတႃႇ + {0}မႅၵ်ႇၵႃႇလီႇတႃႇ + + + ႁလ. + {0} ႁလ. + + + လီႇတႃႇ + {0}လ. + {0}/လ. + + + တလ. + {0}တလ. + + + သလ. + {0}သလ. + + + မလ. + {0}မလ. + + + ပၢႆးမႅတ်ႉထရိတ်ႉ + {0}ပၢႆးမႅတ်ႉထရိတ်ႉ + + + ၵွၵ်းမႅတ်ႉထရိတ်ႉ + {0}ၵွၵ်းမႅတ်ႉထရိတ်ႉ + + + ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + {0} ဢွၼ်းၼမ်ႉယၢင်ႇမႅတ်ႉထရိတ်ႉ + + + ထတ်းဢေႇၵ + {0}ထတ်းဢေႇၵ + + + ၶႂၢႆး + {0}ၶႂၢႆး + + + ၵႃႇလၢၼ်ႇ + {0}ၵႃႇလၢၼ်ႇ + {0}/ၵႃႇလၢၼ်ႇ + + + ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0}ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + {0}/ၵႃႇလၢၼ်ႇ ဢိင်းၵလဵတ်ႈ + + + ၶွတ်ႉ + {0}ၶွတ်ႉ + + + ပၢႆး + {0}ပၢႆး + + + ပၢႆး ဢိင်းၵလဵတ်ႈ + {0}ပၢႆး ဢိင်းၵလဵတ်ႈ + + + ၵွၵ်း + {0}ၵွၵ်း + + + ၵွၵ်း ဢိင်းၵလဵတ်ႈ + {0}ၵွၵ်း ဢိင်းၵလဵတ်ႈ + + + ဢွၼ်းၼမ်ႉယၢင်ႇ + {0}ဢွၼ်းၼမ်ႉယၢင်ႇ + + + ၸေႃႉၵိၼ်ၶဝ်ႈ + {0}ၸေႃႉၵိၼ်ၶဝ်ႈ + + + ၸေႃႉၼမ်ႉၼဵင်ႈ + {0}ၸေႃႉၼမ်ႉၼဵင်ႈ + + + ပႃႇရႄႇလ် + {0}ပႃႇရႄႇလ် + + + ၸေႃႉႁၢတ်ႈ + {0}ၸေႃႉႁၢတ်ႈ + + + ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + {0} ၸေႃႉႁၢတ်ႈ ဢိင်းၵလဵတ်ႈ + + + ယွတ်ႇ + {0}ယွတ်ႇ + + + တရမ်ႇ + {0}တရမ်ႇ + + + ၸိၵ်ႇၵႃႇ + {0}ၸိၵ်ႇၵႃႇ + + + ယွပ်း + {0}ယွပ်း + + + ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + {0}ၶွတ်ႉ ဢိင်းၵလဵတ်ႈ + + + ၶႃႇတႄႇလ် + + + ၶူဝ်ႇလွမ်ႇ + + + ၾႃႇရတ်ႉ + + + ႁႅၼ်ႇရီႇ + + + သီႇမႅၼ်း + + + ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + {0}ၵႄႇလူဝ်ႇရီႇ [ဢၢႆႇထီႇ] + + + ပီႇထီႇယူႇ-ဢၢႆႇထီႇ + {0}ပီႇထီႇယူႇ-ဢၢႆႇထီႇ + + + ပႅၵ်ႉၶႄႇရႄႇလ် + {0} Bq + + + သီႇဝႅတ်ႉ + + + ၵရေး + {0} ၵရေး + + + ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + {0}ၵီႇလူဝ်ႇၵရမ်ႇႁႅင်း + + + ရွတ်ႉ + {0}ရွတ်ႉ + + + ၶျဵၼ်း + {0}ၶျဵၼ်း + + + တႅတ်ႉသလႃႇ + + + ဝႅပ်ႉပႃႇ + + + ၽၢၵ်ႇလိူၼ် + {0} ၽၢၵ်ႇလိူၼ် + + + သလၢၵ်ႉ + {0}သလၢၵ်ႉ + + + ဢၼ်မိူၼ်ၵၼ်တင်း ၵႅတ်ႉသ် + {0}gas-equiv + + + ရိၼ်း [ၵပ.] + {0}ရိၼ်း [ၵပ.] + + + သုၼ်း [ၵပ.] + {0}သုၼ်း [ၵပ.] + + + သျၵ်ၵု [ၵပ.] + {0}သျၵ်ၵု [ၵပ.] + + + သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + {0}သျၵ်ၵု [ၶူဝ်း၊ ၵပ.] + + + ၵႅၼ်း [ၵပ.] + {0}ၵႅၼ်း [ၵပ.] + + + ၸူဝ်း [ၵပ.] + {0}ၸူဝ်း [ၵပ.] + + + ရီ [ၵပ.] + {0}ရီ [ၵပ.] + + + ပု [ၵပ.] + {0}ပု [ၵပ.] + + + သႄ [ၵပ.] + {0}သႄ [ၵပ.] + + + ၶျူဝ် [ၵပ.] + {0}ၶျူဝ် [ၵပ.] + + + ၵူဝ်ၸႃးၵျိ [ၵပ.] + {0}ၵူဝ်ၸႃးၵျိ [ၵပ.] + + + ဢူဝ်ၸႃးၵျိ [ၵပ.] + {0} ဢူဝ်ၸႃးၵျိ [ၵပ.] + + + ၵွပ်း [ၵပ.] + {0} ၵွပ်း [ၵပ.] + + + သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + {0} သျၵ်ၵု [ၼႅၼ်ႈၼႃ၊ ၵပ.] + + + သၢႆႉ [ၵပ.] + {0} သၢႆႉ [ၵပ.] + + + တူဝ်ႇ [ၵပ.] + {0} တူဝ်ႇ [ၵပ.] + + + ၵွၵ်ၵု [ၵပ.] + {0} ၵွၵ်ၵု [ၵပ.] + + + လႅင်း + {0} လႅင်း + + + ၾုၼ်ႉ [ၵပ.] + {0}ၾုၼ်ႉ [ၵပ.] + + + တတႁလ. + {0}တတႁလ. + + + ၶိုၼ်း + {0} ၶိုၼ်း + {0}/ၶိုၼ်း + + + မုင်ႈၼႃႈ + {0}ဢ + {0}ႁ + {0}ၸ + {0}တ + + + + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + {0}၊ {1} + {0}၊ {1} + {0}၊ ႁိုဝ် {1} + {0} ႁိုဝ် {1} + + + {0}၊ {1} + {0}၊ {1} + {0}၊ ႁိုဝ် {1} + {0} ႁိုဝ် {1} + + + {0}၊ {1} + {0}၊ {1} + {0}၊ ႁိုဝ် {1} + {0} ႁိုဝ် {1} + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + {0}၊ {1} + {0}၊ {1} + {0} လႄႈ {1} + {0} လႄႈ {1} + + + + {0} - တင်းမူတ်း + {0} - လွင်ႈငမ်ႇမႅၼ်ႈ + {0} - လွမ်ႉႁွပ်ႈ + {0} - မႄႇၶႂၢၵ်ႈ + {0} မုင်ႈသၢႆႉ + {0} မုင်ႈၶႂႃ + {0} — ၵိုၵ်းပိုၼ်း + {0} — တိတေႃႉ + {0} — တၢင်ႇၸိူဝ်း + သၶရိပ်ႉ — {0} + {0} ႁွႆးမင်ႈ + တူဝ်ႁွႆႈ {0} + တူဝ်တၢင်ႇ {0} + လွင်ႈတူင်ႉၼိုင် + သၶရိပ်ႉဢႃႇၾရိၵၢၼ်ႇ + သၶရိပ်ႉဢမႄႇရိၵၢၼ်ႇ + သတ်း + သတ်း ႁိုဝ် သၽႃႇဝ + ပိုၼ်ၵၢင်ႇ + တူဝ်ၶိင်း + ၸၼ်ႁၢင်ႈတိူၵ်ႈ + လိၵ်ႈတႃမွတ်ႇ + ႁူင်းၵေႃႇသၢင်ႈ + ပူးလႅတ်ႉ ႁိုဝ် လၢဝ် + တူဝ်မႄႈလိၵ်ႈၵၢဝ်းလီ + တူဝ်မၢႆငိုၼ်း + ၶိတ်ႇၵၢင် ႁိုဝ် တူဝ်ၵွင်ႉသၢၼ် + တူဝ်ၼပ်ႉ + တိင်းပႅတ်ႉ + တူဝ်မၢႆၵႃႇလႃး + ပိုၼ်ၸီႉလူင်း + ပိုၼ်ၸီႉၶိုၼ်ႈၸီႉလူင်း + သၶရိပ်ႉ ၸၢဝ်းဢေးသျႃးပွတ်းဢွၵ်ႇ + ဢီႇမူဝ်းၵျိ + သၶရိပ်ႉယူးရူပ်ႉ + ယိင်း + ၸွမ်ပိဝ် + ၸွမ်ပိဝ် + တၢင်းၵိၼ်တၢင်းယႅမ်ႉ + ပိူင်တမ်း + ပိူင်တမ်း လႄႈ လွၵ်းပဝ်ႇ + ပိူင်ပႅၵ်ႇတူဝ်တဵမ် + ၽၢင်ႁၢင်ႈၵျေႃႇမႅတ်ႇထရီႇ + ပိူင်ပႅၵ်ႇၶိုင်ႈတူဝ် + တူဝ်မႄႈလိၵ်ႈႁၢၼ်ႉ + ငိူၼ်ႈငဝ်ႈႁၢၼ်ႉ + ႁၢၼ်ႉၸႃႉ + ႁၢၼ်ႉၸိုဝ်ႉ (ပၢၼ်မႂ်ႇ) + ႁၢၼ်ႉၸိုဝ်ႉ (ပၢၼ်ၵဝ်ႇ) + ႁူဝ်ၸႂ် + သၶရိပ်ႉၵိုၵ်းပိုၼ်း + ဢၵ်ႉၶရႃႇၸိူဝ်းပဵၼ်တူဝ်တႅၼ်း ပၢႆးဝူၼ်ႉ + ၶႃႉၼႃႉၵျႃႇပၢၼ်ႇ + ၶၢၼ်းပုၼ် + ၶၢၼ်းၵျိ + ၼဵၼ်ၼဵၵ်း + ပိုၼ်ဝၢႆႇသၢႆႉ + ပိုၼ်ဝၢႆႇသၢႆႉဝၢႆႇၶႂႃ + တူဝ်မၢႆမိူၼ်တူဝ်လိၵ်ႈ + ၸႂ်ႉတိုဝ်းဢၼ်မၵ်းၶၼ်ႈ + ၸၢႆး + တူဝ်မၢႆပၢႆးၼပ်ႉ + တူဝ်လိၵ်ႈပွတ်းဢွၵ်ႇတွၼ်ႈၵၢင် + တိတေႃႉ + သၶရိပ်ႉပၢၼ်မႂ်ႇ + တူဝ်ၵမ်ႉ + တူဝ်မၢႆၽဵင်း + သၽႃႇဝ + ဢမ်ႇၶႅၼ်ႈပဝ်ႇ + မၢႆၼပ်ႉ + ၶူဝ်းၶွင် + တၢင်ႇၸိူဝ်း + ဢၼ်ၵွင်ႉၵၼ်ဝႆႉ + ၵူၼ်း + ဢၵ်ႉၶရႃႇ ပၢႆးသဵင် + ၵရပ်ႉၼႄႁၢင်ႈ + ဢွင်ႈတီႈ + တူၼ်ႈမႆႉ + တူဝ်တႅပ်းၶေႃႈၵႂၢမ်း + ပိုၼ်ဝၢႆႇၶႂႃ + တီႈမၢႆတွင်း ႁိုဝ် တူဝ်မၢႆ + ပိူင်ပႅၵ်ႇဢွၼ်ႇ + ႁၢင်ႈၼႃႈယုမ်ႉ + ႁၢင်ႈၼႃႈယုမ်ႉ ႁိုဝ် ၵူၼ်း + သၶရိပ်ႉ ၸၢဝ်းဢေးသျႃးပွတ်းၸၢၼ်း + သၶရိပ်ႉ ၸၢဝ်းဢေးသျႃးၸဵင်ႇၸၢၼ်းဝၼ်းဢွၵ်ႇ + ၶႅၼ်ႈပဝ်ႇ + ၵၢၼ်လဵၼ်ႈႁႅင်း + တူဝ်မၢႆ + တူဝ်မၢႆ ပၢႆးထႅၵ်ႉၼိၵ်ႉ + မၢႆတူၼ်းသဵင် + ဢွၵ်ႇတၢင်း + ဢွၵ်ႇတၢင်း ႁိုဝ် ဢွင်ႈတီႈ + ပိုၼ်ဝၢႆႇၼိူဝ် + ပိူင်ပႅၵ်ႇ + မႄႈၵပ်းငဝ်ႈၸမူဝ်ႇ + သၢႆငၢႆၾႃႉၽူၼ် + သၶရိပ်ႉ ၸၢဝ်းဢေးသျႃးပွတ်းတူၵ်း + လွၵ်းပဝ်ႇ + + + ၵိူင်း + သႅၼ်းတူဝ်လိၵ်ႈ ႁႂ်းႁၼ်လီ + ၸိူၼ်း + တၢင်းၵႂၢင်ႈ + တၢင်းၼႃ + လဵၼ်ႈႁၢင် + ၶေႃႈသပ်းလႅင်းၶႅပ်းႁၢင်ႈ + လိၵ်ႈ + လွင်ႈသႂ်ႇႁူဝ်ၶေႃႈ + ၵၢၼ်ၼႄ + ႁၢင်ႈပူဝ်ႇသ်တႃႇ + ၸိူၼ်းလင် + တင်ႈသိုဝ်ႈ + ၸိူၼ်းဝႆႉ + တိူဝ်းၸိူၼ်း + ဢၼ်သတ်ႉဝႆႉႁႅင်း + ဢၼ်တိူဝ်းသတ်ႉဝႆႉႁႅင်း + သတ်ႉဝႆႉ + သတ်ႉဝႆႉၶိုင်ႈၼိုင်ႈ + ပၵတိ + ယၢၼ်ဝႆႉၶိုင်ႈၼိုင်ႈ + ယၢၼ်ဝႆႉ + တိူဝ်းယၢၼ်ဝႆႉ + ယၢၼ်ဝႆႉႁႅင်း + မၢင် + တိူဝ်းသဝ်ႈ + သဝ်ႈ + သဝ်ႈၶိုင်ႈၼိုင်ႈ + ပပ်ႉ + ပိူင်ၵဝ်ႇ + ပၢၼ်ၵၢင် + ၼႃၶိုင်ႈၼိုင်ႈ + ၼႃ + ၼႃႁႅင်း + လမ် + လမ်ႁႅင်း + ၵၢၼ်လေႃးထွၼ်ထႅဝ်တင်ႈ + လွင်ႈႁၢင်ႇ တူဝ်လိၵ်ႈယႂ်ႇ + တၢင်းတိူၵ်ႈ ၵၢၼ်သွၼ်ႉ + လေႃးထွၼ်ၽႃႇၸဵင်ႇ + တူဝ်ၼပ်ႉ ဢၼ်မီးၼိူဝ်ထႅဝ် + ႁၢင်ႈတူဝ်လိၵ်ႈမိူဝ်ႈၵွၼ်ႇ + တူဝ်ၶပ်ႉမၢႆ + တူဝ်ၼပ်ႉပုၼ်ႈတေႃႇ + တူဝ်လိၵ်ႈလူင် သႅၼ်းလဵၵ်ႉ + တူဝ်ၼပ်ႉဢၼ်ပဵၼ်လွၵ်းသဵၼ်ႈ + သုၼ်ထႅဝ်ၵိူင်း + + + und shn + + ၸႅၼ်ႇတေႇယႃႇ + + + ဢၢႆႇရိၼ်း + ဢႅတ်ႉလႃႇ + + + မေႇရီႇသူး + ႁေးမိသျ် + ဝတ်ႉသၼ်ႇ + + + မိတ်ႇသတႃႇ + ပႃႇထရမ်ႇ ဝီလ်ပႃႇၾူတ်ႉ + ပႃတီႇ + ႁႅၼ်ႇၼရီႇ ရေႃးပၢတ်ႉ + ∅∅∅ + ဝုတ်ႉသ်တႃႇ + ∅∅∅ + ၵျူႇၼီႇယႃႇ + မေႃယႃ + + + သိၼ်းပၢတ်ႉ + + + ၶေးတႃႇ + မူးလႃႇ + + + ၸၸီးလီႇယႃႇ + ႁေးမိသျ် + သတူႇပႃႇ + + + ၶူးမေႃယႃ + ဢေႇတႃႇ ၶူဝ်ႇၼီႇလီႇယႃႇ + ၼီးဢႄႇလ် + သီႇသႃႇ မႃႇတိၼ်ႇ + ဝွၼ်း + ပရူဝ်ႇလ် + ၵွၼ်ႇၸႃႇလႅတ်ႉ တူဝ်ႇမိၼ်ႇၵူဝ် + ၵျူႇၼီႇယႃႇ + မေႃယႃ + + diff --git a/make/data/cldr/common/main/si.xml b/make/data/cldr/common/main/si.xml index 6c2531cf14c..0c89e58b884 100644 --- a/make/data/cldr/common/main/si.xml +++ b/make/data/cldr/common/main/si.xml @@ -45,6 +45,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ අසර්බයිජාන් අසීරී බාෂ්කිර් + බලුචි බැලිනීස් බසා බෙලරුසියානු @@ -235,6 +236,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ බාෆියා කොලොග්නියන් කුර්දි + කුර්දි + කුර්මන්ජි කුමික් කොමි කෝනීසියානු @@ -631,6 +634,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ චීනය කොළොම්බියාව ක්ලීපර්ටන් දූපත + සාර්ක් කොස්ටරිකාව කියුබාව කේප් වර්ඩ් @@ -861,47 +865,87 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ වේල්සය - දින දර්ශනය + දින දසුන මුදල් ආකෘති පෙළගැස්ම විනිමය - පැය චක්‍රය + ඉමොජි ඉදිරිපත් කිරීම + පැය චක්‍රය (12 එදිරිව 24) පේළි කඩන විලාසය + වචන තුළ රේඛා බිඳීම් මිනුම් ක්‍රමය ඉලක්කම් + කෙටි යෙදු. පසු වාක්‍ය බිඳීම - බොදු දින දර්ශනය - චීන දින දර්ශනය - කොප්ටික් දින දර්ශනය - ඩැන්ගී දින දර්ශනය - ඉතියෝපියානු දින දර්ශනය - ඉතියෝපික් ඇමේට් ඇලම් දින දර්ශනය - ග්‍රෙගරියානු දින දර්ශනය - හීබෲ දින දර්ශනය - හිජ්රි දින දර්ශනය - හිජ්රි දින දර්ශනය (වගුව, සිවිල් වීර කාව්‍යය) - හිජ්රි දින දර්ශනය (උම් අල් කුරා) - අඑස්ඔ-8601 දින දර්ශනය - ජපන් දින දර්ශනය - පර්සියානු දින දර්ශනය - මින්ගා දින දර්ශනය + බෞද්ධ දින දසුන + බෞද්ධ + චීන දින දසුන + චීන + කොප්ටික් දින දසුන + කොප්ටික් + ඩැන්ගී දින දසුන + ඩැන්ගී + ඉතියෝපියානු දින දසුන + ඉතියෝපියානු + ඉතියෝපියානු ඇමෙට් ඇලෙම් දින දසුන + ඉතියෝපියානු ඇමෙට් ඇලෙම් + ග්‍රෙගරියානු දින දසුන + ග්‍රෙගරියානු + හීබෲ දින දසුන + හීබෲ + හිජ්රි දින දසුන + හිජ්රි + හිජ්රි දින දසුන (වගුව, සිවිල් වීර කාව්‍යය) + හිජ්රි දින දසුන (වගුව, සිවිල් වීර කාව්‍යය) + හිජ්රි දින දසුන (උම් අල් කුරා) + හිජ්රි (උම් අල් කුරා) + අයිඑස්ඕ-8601 දින දසුන + ජපන් දින දසුන + ජපන් + පර්සියානු දින දසුන + පර්සියානු + මින්ගා දින දසුන + මින්ගා ගිණුම්කරණ මුදල් ආකෘති + ගිණුම්කරණය සම්මත මුදල් ආකෘති - ශබ්දකෝෂ පෙළගැස්ම - යුනිකේත පෙරනිමි පෙළගැස්ම + සම්මත + අකාරාදිය පෙළගැස්ම + අකාරාදිය + පෙරනිමි යුනිකේත පෙළගැස්ම + පෙරනිමි යුනිකේත සාමාන්‍ය සෙවීම + සෙවීම සම්මත පෙළගැස්ම - පැය 12 ක්‍රමය - පැය 12 ක්‍රමය + සම්මත + පෙරනිමිය + ඉමොජි + පෙළ + පැය 12 ක්‍රමය (0–11) + 12 (0–11) + පැය 12 ක්‍රමය (1–12) + 12 (1–12) පැය 24 ක්‍රමය - පැය 24 ක්‍රමය + 24 (0–23) + පැය 24 ක්‍රමය (1–24) + 24 (1–24) ලිහිල් කඩන විලාසය + ලිහිල් සාමාන්‍ය පේළි කඩන විලාසය + සාමාන්‍ය තද පේළි කඩන විලාසය + දැඩි + සියල්ල බිඳ දමන්න + සියල්ල තබා ගන්න + සාමාන්‍ය + වාක්‍ය ඛණ්ඩ තුළ තබා ගන්න මෙට්‍රික් ක්‍රමය + මෙට්‍රික් රාජකීය මිනුම් ක්‍රමය + එරා එජ මිනුම් ක්‍රමය + එජ ඉන්දු අරාබි ඉලක්කම් වැඩි කළ ඉන්දු අරාබි ඉලක්කම් ඇමරිකානු සංඛ්‍යාංකන @@ -942,6 +986,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ තායි ඉලක්කම් ටිබෙට ඉලක්කම් වායි ඉලක්කම් + ක්‍රියාවිරහිතයි + ක්‍රියාත්මකයි මෙට්රික් @@ -987,7 +1033,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -1028,12 +1074,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h E B h:mm E B h:mm:ss d E + E a h a h a h.mm a h.mm.ss + v a h M-d M-d, E MMM d E @@ -1116,62 +1165,90 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ජන - පෙබ - මාර්තු - අප්‍රේල් - මැයි - ජූනි - ජූලි - අගෝ - සැප් - ඔක් - නොවැ - දෙසැ + දුරුතු + නවම් + මැදින් + බක් + වෙසක් + පොසොන් + ඇසළ + නිකිණි + බිනර + වප් + ඉල් + උඳුවප් + + + දු + + මැ + + වෙ + පො + + නි + බි + + + - ජනවාරි - පෙබරවාරි - මාර්තු - අප්‍රේල් - මැයි - ජූනි - ජූලි - අගෝස්තු - සැප්තැම්බර් - ඔක්තෝබර් - නොවැම්බර් - දෙසැම්බර් + දුරුතු + නවම් + මැදින් + බක් + වෙසක් + පොසොන් + ඇසළ + නිකිණි + බිනර + වප් + ඉල් + උඳුවප් - ජන - පෙබ - මාර් - අප්‍රේල් - මැයි - ජූනි - ජූලි - අගෝ - සැප් - ඔක් - නොවැ - දෙසැ + දුරුතු + නවම් + මැදින් + බක් + වෙසක් + පොසොන් + ඇසළ + නිකිණි + බිනර + වප් + ඉල් + උඳුවප් - - පෙ - මා - - මැ - ජූ - ජූ - - සැ - - නෙ - දෙ + දු + + මැ + + වෙ + පො + + නි + බි + + + + + + දුරුතු + නවම් + මැදින් + බක් + වෙසක් + පොසොන් + ඇසළ + නිකිණි + බිනර + වප් + ඉල් + උඳුවප් @@ -1327,6 +1404,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} දින {0} + + {1} දින {0} + @@ -1335,6 +1415,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} දින {0} + + {1} දින {0} + @@ -1343,6 +1426,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1351,9 +1437,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + + B h + B h:mm + B h:mm:ss + E B h + E B h:mm + E B h:mm:ss d E + E a h E a h.mm E HH.mm E a h.mm.ss @@ -1363,10 +1459,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH.mm a h.mm.ss HH.mm.ss - h.mm.ss a v - HH.mm.ss v - h.mm a v - HH.mm v + v a h:mm:ss + v HH.mm.ss + v a h.mm + v HH.mm + v a h + v HH'h' M-d M-d, E MMM d E @@ -1758,7 +1856,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - මිනිත්තුව + විනාඩිය මෙම මිනිත්තුව මිනිත්තු {0}කින් @@ -1770,7 +1868,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - මිනි. + විනා. + + + විනා. තත්පරය @@ -1798,6 +1899,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ +HH.mm;-HH.mm ග්‍රිමවේ{0} ග්‍රිමවේ + ග්‍රිමවේ+? {0} වේලාව {0} දිවාආලෝක වේලාව {0} සම්මත වේලාව @@ -2154,6 +2256,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ඊස්ටර් + + කොයිහයික් + පුන්ටා ඇරිනාස් @@ -2419,9 +2524,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ නොම් පෙන් - එන්ඩර්බරි - - කැන්ටන් @@ -3091,9 +3193,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - බටහිර අප්‍රිකානු වේලාව - බටහිර අප්‍රිකානු සම්මත වේලාව - බටහිර අප්‍රිකානු ග්‍රීෂ්ම කාලය + බටහිර අප්‍රිකානු වේලාව @@ -3443,6 +3543,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ගයනා වේලාව + + + හවායි-අලෙයුතියාන් සම්මත වේලාව + + හවායි-අලෙයුතියාන් වේලාව @@ -4021,7 +4126,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4573,6 +4677,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ නැගෙනහිර කැරිබියානු ඩොලර් + + කැරිබියානු ගිල්ඩර් + කැරිබියානු ගිල්ඩර් + කැරිබියානු ගිල්ඩර්ස් + සිෆ්එ ෆ්රෑන්ක් බිසීඊඑඔ සිෆ්එ @@ -4597,6 +4706,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ සැම්බියානු ක්වාචා + + සිම්බාබ්වේ රත්තරන් + සිම්බාබ්වේ රත්තරන් + සිම්බාබ්වේ රත්තරන් + {0}+ @@ -4604,7 +4718,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} පොතක් ඇත. එය කියවීමි. පොත් {0}ක් ඇත. ඒවා කියවීමි. - {0} වන හැරවුම දකුණට + {0} වෙනි දකුණට යන්න. @@ -4774,7 +4888,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ අයිතම - + + කොටස + කොටස {0} + කොටස {0} + + මිලියනයට කොටස් මිලියනයට කොටස් {0} මිලියනයට කොටස් {0} @@ -4792,6 +4911,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} පර්මැරියඩ් {0} පර්මැරියඩ් + + ග්ලූකෝස් + ග්ලූකෝස් {0} + ග්ලූකෝස් {0} + කිලෝ මීටරයට ලීටරය කිලෝ මීටරයට ලීටරය {0} @@ -5238,6 +5362,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ රසදිය මිලිමීටර {0} රසදිය මිලිමීටර {0} + + රසදිය + රසදිය {0} + රසදිය {0} + වර්ග අඟලකට රාත්තල් වර්ග අඟලකට රාත්තල් {0} @@ -5399,6 +5528,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ මෙට්‍රික් කෝප්ප {0} මෙට්‍රික් කෝප්ප {0} + + මෙට්‍රික් තරල අවුන්ස + මෙට්‍රික් තරල අවුන්ස {0} + මෙට්‍රික් තරල අවුන්ස {0} + අක්කර-අඩි {0} අක්කර-අඩි {0} @@ -5480,21 +5614,83 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ඉම්පීරියල් නැළිය ඉම්පීරියල් නැළි {0} + + ස්ටරේඩියන + ස්ටරේඩියන {0} + ස්ටරේඩියන {0} + + + කැටල් + කැටල් {0} + කැටල් {0} + + + කූලෝම්බ් + කූලෝම්බ් {0} + කූලෝම්බ් {0} + + + ෆැරඩ + ෆැරඩ {0} + ෆැරඩ {0} + + + හෙන්රි + හෙන්රි {0} + හෙන්රි {0} + + + සීමන් + සීමන් {0} + සීමන් {0} + + + කැලරි [IT] + කැලරි [IT] {0} + කැලරි [IT] {0} + + + බෙකරල් + බෙකරල් {0} + බෙකරල් {0} + + + සීවර්ට් + සීවර්ට් {0} + සීවර්ට් {0} + + + අළු + අළු {0} + අළු {0} + + + කිලෝග්‍රෑම්-බලය + කිලෝග්‍රෑම්-බලය {0} + කිලෝග්‍රෑම්-බලය {0} + + + ටෙස්ලා + ටෙස්ලා {0} + ටෙස්ලා {0} + + + වේබර + වේබරය {0} + වේබරය {0} + - ආලෝකය {0} ආලෝකය ආලෝකය {0} - + බිලියනයකට කොටස් බිලියනයකට කොටස් {0} බිලියනයකට කොටස් {0} - රාත්‍රිය {0} රාත්‍රිය රාත්‍රිය {0} - {0}/රාත්‍රිය කාර්ඩිනල් දිශාව @@ -5702,7 +5898,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} අයිතමයක් අයිතම {0}ක් - + + කොටස + කොටස {0} + කොටස {0} + + කොටස්/මිලියනය {0} මිලිකො {0} මිලිකො @@ -5718,6 +5919,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} මවුල {0} මවුල + + ග්ලූකෝ + ග්ලූකෝ {0} + ග්ලූකෝ {0} + ලීටරය/කිමී ලී/කිමී {0} @@ -6229,6 +6435,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ර මිමී {0} ර මිමී {0} + + + ර {0} + ර {0} + වඅරා වඅරා {0} @@ -6402,6 +6613,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ මෙකෝ {0} මෙකෝ {0} + + මෙට්‍රි තර අවු. + මෙට්‍රි තර අවු. {0} + මෙට්‍රි තර අවු. {0} + අක්කර-අඩි අක්-අඩි {0} @@ -6499,12 +6715,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ඉම්පීරියල් නැළි {0} ඉම්පීරියල් නැළි {0} + + ස්ට + ස්ට {0} + ස්ට {0} + + + කැට + කැට {0} + කැට {0} + + + කූ + කූ {0} + කූ {0} + + + ෆැ + ෆැ {0} + ෆැ {0} + + + හෙ + හෙ {0} + හෙ {0} + + + සී + සී {0} + සී {0} + + + කැල [IT] + කැල [IT] {0} + කැල [IT] {0} + + + බෙක + බෙක {0} + බෙක {0} + + + සීව + සීව {0} + සීව {0} + + + අළු + අළු {0} + අළු {0} + + + කිග්‍රෑබ + කිග්‍රෑබ {0} + කිග්‍රෑබ {0} + + + ටෙ + ටෙ {0} + ටෙ {0} + + + වේබ + වේබ {0} + වේබ {0} + ආලෝකය ආලෝකය {0} ආලෝකය {0} - + කොටස්/බිලියනය බිකො {0} බිකො {0} @@ -6608,7 +6889,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}වඅඟ² {0}/වඅඟ² - + + කොටස + කොටස {0} + කොටස {0} + + මිලිකො @@ -6617,6 +6903,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + ග්ලූ + ග්ලූ {0} + ග්ලූ {0} + ලී/කිමී100 {0} ලී/කිමී100 {0} @@ -6744,6 +7035,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ඇ {0} ඇ {0} + + + ර {0} + ර {0} + " ර ර {0}" @@ -6753,10 +7049,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ මි.බා. {0} මි.බා. {0} - - {0} hPa - {0} hPa - මී/තත් @@ -6785,24 +7077,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ අල්³ + + මෙ ත අ. + මෙ ත අ. {0} + මෙ ත අ. {0} + ඉම්පී. අතුරුපස හැඳි - - ආලෝකය - ආලෝකය {0} - ආලෝකය {0} + + ස්ට + ස්ට {0} + ස්ට {0} - + + කැට + කැට {0} + කැට {0} + + + කූ + කූ {0} + කූ {0} + + + ෆැ + ෆැ {0} + ෆැ {0} + + + හෙ + හෙ {0} + හෙ {0} + + + සී + සී {0} + සී {0} + + + කැ [IT] + කැ [IT] {0} + කැ [IT] {0} + + + බෙක + බෙක {0} + බෙක {0} + + + සීව + සීව {0} + සීව {0} + + + අළු + අළු {0} + අළු {0} + + + කිග්‍රෑබ + කිග්‍රෑබ {0} + කිග්‍රෑබ {0} + + + ටෙ + ටෙ {0} + ටෙ {0} + + + වේබ + වේබ {0} + වේබ {0} + + බිකො - බිකො {0} - බිකො {0} - - - රාත්‍රිය - රාත්‍රිය {0} - රාත්‍රිය {0} - {0}/රාත්‍රිය diff --git a/make/data/cldr/common/main/sk.xml b/make/data/cldr/common/main/sk.xml index 735603fd65d..45331d5c8ae 100644 --- a/make/data/cldr/common/main/sk.xml +++ b/make/data/cldr/common/main/sk.xml @@ -288,6 +288,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kolínčina kurdčina + kurdčina + kurmandži kumyčtina kutenajčina komijčina @@ -749,6 +751,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Čína Kolumbia Clipperton + Sark Kostarika Kuba Kapverdy @@ -995,33 +998,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ číselné radenie sila radenia mena + prezentácia emodži hodinový cyklus (12 vs 24) štýl koncov riadka + zlom riadka v slovách merná sústava čísla + veta po skrat. časové pásmo variant miestneho nastavenia súkromné použitie - buddhistický kalendár + budhistický kalendár + budhistický čínsky kalendár + čínsky koptský kalendár + koptský kórejský kalendár + kórejský etiópsky kalendár + etiópsky etiópsky kalendár Amete Alem + etiópsky Amete Alem gregoriánsky kalendár + gregoriánsky židovský kalendár + židovský Indický národný kalendár kalendár podľa hidžry + podľa hidžry kalendár podľa hidžry (občiansky) + podľa hidžry (občiansky) kalendár podľa hidžry (Umm al-Qura) + podľa hidžry (Umm al-Qura) kalendár ISO 8601 japonský kalendár + japonský perzský kalendár + perzský čínsky republikánsky kalendár + čínsky republikánsky účtovný formát meny + účtovný štandardný formát meny + štandardný Radiť symboly Pri radení ignorovať symboly Normálne radenie akcentov @@ -1031,22 +1053,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Najprv radiť veľké písmená Pri radení nerozlišovať veľké a malé písmená Pri radení rozlišovať veľké a malé písmená - tradičné čínske zoradenie – Big5 predchádzajúce zoradenie, kompatibilita + kompatibilita slovníkové zoradenie + slovníkové predvolené zoradenie unicode + predvolené, unicode európske zoradenie - zjednodušené čínske zoradenie – GB2312 lexikografické zoradenie + lexikografické fonetické zoradenie + fonetické zoradenie pchin-jin + pchin-jin všeobecné vyhľadávanie + vyhľadávanie Hľadať podľa počiatočnej spoluhlásky písma Hangul štandardné zoradenie + štandardné zoradenie podľa ťahov + podľa ťahov tradičné poradie zoradenia + tradičné zoradenie podľa znakov radikál + podľa znakov radikál zoradenie zhuyin + zhuyin Radiť bez normalizácie Radenie podľa normalizovaného kódovania Unicode Radiť číslice jednotlivo @@ -1059,18 +1091,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ celá šírka polovičná šírka Číslice + predvolené + emodži + text 12-hodinový cyklus (0 – 11) + 12 (0 – 11) 12-hodinový cyklus (1 – 12) + 12 (1 – 12) 24-hodinový cyklus (0 – 23) + 24 (0 – 23) 24-hodinový cyklus (1 – 24) + 24 (1 – 24) voľný štýl koncov riadka + voľný bežný štýl koncov riadka + bežný presný štýl koncov riadka + presný + zalomiť všetko + ponechať všetko + bežné + ponechať vo frázach americká transliterácia BGN medzinárodná transliterácia GEGN metrická sústava + metrická britská merná sústava + britská americká merná sústava + americká arabsko-indické číslice rozšírené arabsko-indické číslice arménske číslice @@ -1115,6 +1164,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tibetské číslice Tradičné číslovky vaiské číslice + vypnuté + zapnuté metrický @@ -1154,9 +1205,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1281,12 +1329,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d. M. y G E d. M. y G d. M. y G - h a H h:mm a H:mm h:mm:ss a H:mm:ss + h a, v + HH 'h', v M. d. M. E d. M. @@ -1724,7 +1773,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d. M. y G E d. M. y G d. M. y G - h a H h:mm a H:mm @@ -1811,7 +1859,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d. M. y – E d. M. y G - h a – h a h – h a @@ -1836,7 +1883,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm – H:mm v - h a – h a v h – h a v @@ -2636,11 +2682,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ časové pásmo {0} - - HST - HST - HDT - Honolulu @@ -2657,18 +2698,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kábul - - Tirana - Jerevan Šówa - - Córdoba - Viedeň @@ -2690,24 +2725,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Brunej - - Eirunepé - - - Cuiabá - - - Santarém - - - Belém - - - São Paulo - - - Maceió - Kokosové ostrovy @@ -2723,9 +2740,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Šanghaj - - Bogotá - Kostarika @@ -2741,9 +2755,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Praha - - Büsingen - Berlín @@ -2854,9 +2865,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Phnom Pénh - - Enderbury - Komory @@ -2932,9 +2940,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Maldivy - - Mazatlán - Bahia Banderas @@ -2944,9 +2949,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kučing - - Nouméa - Káthmandu @@ -3019,9 +3021,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Rijád - - Mahé - Chartúm @@ -3052,15 +3051,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Damask - - N’Djamena - Kergueleny - - Lomé - Dušanbe @@ -3126,9 +3119,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - západoafrický čas - západoafrický štandardný čas - západoafrický letný čas + západoafrický čas @@ -3521,6 +3512,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ guyanský čas + + + havajsko-aleutský štandardný čas + + havajsko-aleutský čas @@ -4158,10 +4154,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -6163,6 +6160,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ východokaribského dolára východokaribských dolárov + + karibský gulden + karibský gulden + karibské guldeny + karibského guldena + karibských guldenov + Cg + SDR @@ -6338,6 +6343,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabwianskeho dolára (1980 – 2008) zimbabwianskych dolárov (1980 – 2008) + + zimbabwiansky zlatý + zimbabwiansky zlatý + zimbabwianske zlaté + zimbabwianskeho zlatého + zimbabwianskych zlatých + zimbabwiansky dolár (2009) zimbabwiansky dolár (2009) @@ -7087,7 +7099,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} položkami {0} položkách - + + častice + {0} častica + {0} častice + {0} častice + {0} častíc + + feminine milióntiny {0} milióntina @@ -7227,6 +7246,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} molmi {0} moloch + + glukózy + inanimate litre na kilometer @@ -9426,6 +9448,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetrami ortuťového stĺpca {0} milimetroch ortuťového stĺpca + + ortute + libry sily na štvorcový palec {0} libra sily na štvorcový palec @@ -10178,6 +10203,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrickými hrnčekmi {0} metrických hrnčekoch + + metrické tekuté unce + {0} metrická tekutá unca + {0} metrické tekuté unce + {0} metrickej tekutej unce + {0} metrických tekutých uncí + akrové stopy {0} akrová stopa @@ -10299,7 +10331,70 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} britského kvartu {0} britských kvartov - + + steradiány + {0} steradián + {0} steradiány + {0} steradiánu + {0} steradiánov + + + kataly + {0} katal + {0} kataly + {0} katalu + {0} katalov + + + coulomby + {0} coulomb + {0} coulomby + {0} coulombu + {0} coulombov + + + farady + {0} farad + {0} farady + {0} faradu + {0} faradov + + + henry + {0} henry + {0} henry + {0} henry + {0} henry + + + siemensy + {0} siemens + {0} siemensy + {0} siemensu + {0} siemensov + + + kalória [IT] + {0} kalória [IT] + {0} kalórie [IT] + {0} kalórie [IT] + {0} kalórií [IT] + + + kilopondy + {0} kilopond + {0} kilopondy + {0} kilopondu + {0} kilopondov + + + webery + {0} weber + {0} webery + {0} weberu + {0} weberov + + feminine častice na miliardu {0} častica na miliardu @@ -10329,7 +10424,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - noci {0} noc {0} noc noci @@ -10354,7 +10448,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} nocí {0} nocami {0} nociach - {0}/noc @@ -10429,6 +10522,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -10711,6 +10807,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mc + + fl oz m + {0} fl oz m + {0} fl oz m + {0} fl oz m + {0} fl oz m + gal {0} gal @@ -10778,6 +10881,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt Imp {0} qt Imp + + cal-IT + + + kp + {0} kp + {0} kp + {0} kp + {0} kp + noci {0} noc @@ -10808,6 +10921,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ac + + Glc + l/100 km @@ -10838,13 +10954,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} d. {0}/d. - - kWh/100 km - {0} kWh/100 km - {0} kWh/100 km - {0} kWh/100 km - {0} kWh/100 km - bod @@ -10866,13 +10975,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mb {0} mb - - noci - {0} noc - {0} noci - {0} noci - {0} nocí - {0}/noc + + fl oz m + {0} fl oz m + {0} fl oz m + {0} fl oz m + {0} fl oz m + + + cal-IT + + + kp + {0} kp + {0} kp + {0} kp + {0} kp diff --git a/make/data/cldr/common/main/sl.xml b/make/data/cldr/common/main/sl.xml index 9dfffbeee15..29a34200ee1 100644 --- a/make/data/cldr/common/main/sl.xml +++ b/make/data/cldr/common/main/sl.xml @@ -282,6 +282,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafia kölnsko narečje kurdščina + kurdščina + kurmanščina kumiščina kutenajščina komijščina @@ -759,7 +761,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Avstrija Avstralija Aruba - Ålandski otoki + Alandski otoki Azerbajdžan Bosna in Hercegovina Barbados @@ -770,7 +772,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bahrajn Burundi Benin - Saint Barthélemy + Sveti Bartolomej Bermudi Brunej Bolivija @@ -798,6 +800,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kitajska Kolumbija Otok Clipperton + Sark Kostarika Kuba Zelenortski otoki @@ -842,12 +845,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Grenlandija Gambija Gvineja - Guadeloupe + Gvadelup Ekvatorialna Gvineja Grčija Južna Georgia in Južni Sandwichevi otoki Gvatemala - Guam + Gvam Gvineja Bissau Gvajana Posebno upravno območje Ljudske republike Kitajske Hongkong @@ -878,15 +881,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kambodža Kiribati Komori - Saint Kitts in Nevis + Sveti Krištof in Nevis Severna Koreja Južna Koreja Kuvajt - Kajmanski otoki + Kajmanji otoki Kazahstan Laos Libanon - Saint Lucia + Sveta Lucija Lihtenštajn Šrilanka Liberija @@ -899,21 +902,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Monako Moldavija Črna gora - Saint Martin + Francoski Sveti Martin Madagaskar Marshallovi otoki Severna Makedonija Mali Mjanmar (Burma) Mongolija - Posebno upravno območje Ljudske republike Kitajske Macao - Macao + Posebno upravno območje Kitajske Makav + Makav Severni Marianski otoki Martinik Mavretanija Montserrat Malta - Mauritius + Mavricij Maldivi Malavi Mehika @@ -940,13 +943,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Filipini Pakistan Poljska - Saint Pierre in Miquelon + Sveta Peter in Mihael Pitcairn Portoriko Palestinsko ozemlje Palestina Portugalska - Palau + Palav Paragvaj Katar Ostala oceanija @@ -971,9 +974,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Somalija Surinam Južni Sudan - Sao Tome in Principe + Sveti Tomaž in Princ Salvador - Sint Maarten + Nizozemski Sveti Martin Sirija Esvatini Svazi @@ -984,7 +987,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Togo Tajska Tadžikistan - Tokelau + Tokelav Timor-Leste Vzhodni Timor Turkmenistan @@ -1006,7 +1009,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Urugvaj Uzbekistan Vatikan - Saint Vincent in Grenadine + Sveti Vincencij in Grenadine Venezuela Britanski Deviški otoki Ameriški Deviški otoki @@ -1076,35 +1079,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Številsko razvrščanje Moč razvrščanja valuta + Prikaz emodžija urni prikaz (12 ali 24) Slog preloma vrstic + Prelomi vrstic znotraj besed merski sistem številke + Konec stavka po okrajšavi Časovni pas Različica območnih nastavitev Zasebna-uporaba budistični koledar + budistični kitajski koledar + kitajski koptski koledar + koptski stari korejski koledar + stari korejski etiopski koledar + etiopski etiopsko ametsko alemski koledar + etiopsko ametsko alemski gregorijanski koledar + gregorijanski hebrejski koledar + hebrejski indijanski koledar islamski koledar + islamski islamski civilni koledar + islamski civilni islamski koledar ( Saudova Arabija, opazovalni) islamski koledar (tabelarni, astronomska epoha) islamski koledar Umm al-Qura + islamski (Umm al-Qura) koledar ISO-8601 japonski koledar + japonski perzijski koledar + perzijski koledar Minguo + Minguo oblika zapisa valute v računovodstvu + računovodska standardna oblika zapisa valute + standardna Razvrščanje simbolov Razvrščanje s prezrtjem simbolov Navadno razvrščanje naglasov @@ -1114,23 +1136,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Razvrščanje velikih črk najprej Razvrščanje ne glede na velike/male črke Razvrščanje ob upoštevanju velikih/malih črk - razvrščanje po sistemu tradicionalne kitajščine - Big5 prej uporabljeno razvrščanje za združljivost + združljivostno slovarsko razvrščanje - Privzeto razvrščanje Unicode + slovarsko + privzeto razvrščanje Unicode + privzeto Unicode razvrščanje čustvenčkov evropska pravila razvrščanja - razvrščanje po sistemu poenostavljene kitajščine - GB2312 razvrščanje po sistemu telefonskega imenika + po sistemu telefonskega imenika fonetično razvrščanje + fonetično razvrščanje po sistemu pinjin + po sistemu pinjin Splošno iskanje + splošno Iskanje po začetnem soglasniku hangul - Standardno razvrščanje + standardno razvrščanje + standardno razvrščanje po zaporedju pisanja pismenk + po zaporedju pisanja pismenk razvrščanje po tradicionalnem sistemu + po tradicionalnem sistemu razvrščanje po radikalih in potezah + po radikalih in potezah razvrščanje po pismenkah zhuyin + po pismenkah zhuyin Razvrščanje brez normaliziranja Normalizirano razvrščanje Unicode Ločeno razvrščanje številk @@ -1143,18 +1175,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Polna širina Polovična širina Številsko + privzeto + emodži + besedilo 12-urni sistem (0–11) + 12 (0–11) 12-urni sistem (1–12) + 12 (1–12) 24-urni sistem (0–23) + 24 (0–23) 24-urni sistem (1–24) + 24 (1–24) Prosti slog preloma vrstic + Prosti slog Običajni slog preloma vrstic + Običajni slog Strogi slog preloma vrstic + Strogi slog + prelomi vse + obdrži vse + običajno + obdrži v frazah BGN UNGEGN metrični sistem + metrični imperialni merski sistem + ZK merski sistem Združenih držav + ZDA števke ahom arabskoindijske števke razširjene arabskoindijske števke @@ -1232,6 +1281,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tradicionalne številke števke vai Warang Citi števke + Izklopljeno + Vklopljeno metrični @@ -1250,11 +1301,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [A B C Č Ć D Đ E F G H I J K L M N O P Q R S Š T U V W X Y Z Ž] [, . % ‰ + − 0 1 2 3 4 5 6 7 8 9] [\- ‑ – , ; \: ! ? . … ' "„‟ « » ( ) \[ \] \{ \} @ *] + [{<>\\|/#\&}] [\: ∶] - [££ ₤] [₹ {Rs}₨] @@ -1321,6 +1372,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'ob' {0} + + {1} 'ob' {0} + @@ -1329,6 +1383,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'ob' {0} + + {1} 'ob' {0} + @@ -1337,6 +1394,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1345,11 +1405,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + + E, h B E, h:mm B E, h:mm:ss B E, d. + E, h a E, h:mm a E, HH:mm E, h:mm:ss a @@ -1357,10 +1422,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y G M/y G d. M. y GGGGG + E, d. M. y G MMM y G d. MMM y G E, d. MMM y G - h a h:mm a h:mm:ss a d. M. @@ -1654,7 +1719,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ jut. dop. pop. - zveč. + več. noč @@ -1715,7 +1780,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - d. M. yy + d. M. y yyMMd @@ -1750,6 +1815,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'ob' {0} + + {1} 'ob' {0} + @@ -1758,6 +1826,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'ob' {0} + + {1} 'ob' {0} + @@ -1771,7 +1842,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d. + E, h B E, d. + E, h a E, h:mm a E, HH:mm E, h:mm:ss a @@ -1779,11 +1852,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y G MMM y G d. M. y GGGGG + E, d. M. y G MMM y G d. MMM y G E, d. MMM y G - h a - HH'h' h:mm a h:mm:ss a h:mm:ss a v @@ -1832,16 +1904,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MM. y–MM. y GGGGG - d. MM. y–d. MM. y GGGGG - d. MM. y GGGGG–d. MM. y GGGGG - d. MM. y–d. MM. y GGGGG - d. MM. y–d. MM. y GGGGG + d.–d. M. y GGGGG + d. M. y GGGGG–d. M. y GGGGG + d. M. y–d. M. y GGGGG + d. M. y–d. M. y GGGGG - E, d. MM. y–E, d. MM. y GGGGG - E, d. MM. y GGGGG–E, d. MM. y GGGGG - E, d. MM. y–E, d. MM. y GGGGG - E, d. MM. y–E, d. MM. y GGGGG + E, d. M. y–E, d. M. y GGGGG + E, d. M. y GGGGG–E, d. M. y GGGGG + E, d. M. y–E, d. M. y GGGGG + E, d. M. y–E, d. M. y GGGGG MMM y G–MMM y G @@ -1862,7 +1934,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a–h a - h–h a H–H @@ -1885,10 +1956,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm–H:mm v H:mm–H:mm v - - h a – h a v - h–h a v - H–H v @@ -1919,7 +1986,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ M. y–M. y - d. M. y–d. M. y + d.–d. M. y d. M.–d. M. y d. M. y–d. M. y @@ -1938,7 +2005,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d. MMM y–d. MMM y - E, d. MMM–E, d. MMM y + E, d.–E, d. MMM y E, d. MMM–E, d. MMM y E, d. MMM y–E, d. MMM y @@ -2546,9 +2613,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ +HH.mm;-HH.mm GMT {0} - {0} čas - {0} poletni čas - {0} standardni čas + GMT +? + {0} (lokalni čas) + {0} (poletni čas) + {0} (standardni čas) Honolulu @@ -2569,9 +2637,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angvila - - Tirana - Erevan @@ -2742,7 +2807,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Biškek - Enderbury + Kanton Komori @@ -2970,9 +3035,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Zahodnoafriški čas - Zahodnoafriški standardni čas - Zahodnoafriški poletni čas + Zahodnoafriški čas @@ -3329,6 +3392,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gvajanski čas + + + Havajski aleutski standardni čas + + Havajski aleutski čas @@ -3755,6 +3823,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Čas: Otok Chuuk + + + Turški čas + Turški standardni čas + Turški poletni čas + + Turkmenistanski čas @@ -3868,11 +3943,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 000 tisoč 0 milijon 0 milijona - 0 milijone + 0 milijoni 0 milijonov 00 milijon 00 milijona - 00 milijoni + 00 milijona 00 milijonov 000 milijon 000 milijona @@ -3944,9 +4019,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -5373,8 +5450,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ venezuelskih bolivarjev - vientnamski dong - vientnamski dong + vietnamski dong + vietnamski dong vietnamska donga vietnamski dongi vietnamskih dongov @@ -5426,6 +5503,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ vzhodnokaribskih dolarjev XCD + + karibski gulden + karibski gulden + karibska guldna + karibski guldni + karibskih guldnov + posebne pravice črpanja @@ -5516,6 +5600,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ zimbabvejski dolar + + zimbabvejsko zlato + zimbabvejsko zlato + zimbabvejska zlata + zimbabvejska zlata + zimbabvejsko zlato + zimbabvejski dolar (2009) @@ -5652,7 +5743,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kvadratni {0} kvadratne {0} kvadratno {0} - kvadratnem {0} + kvadratni {0} kvadratni {0} kvadratni {0} kvadratnemu {0} @@ -5689,7 +5780,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kvadratnih {0} kvadratnimi {0} kvadratnih {0} - kvadratne {0} + kvadratni {0} kvadratne {0} kvadratnim {0} kvadratnih {0} @@ -6246,7 +6337,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elementi {0} elementih - + + deli + {0} del + {0} dela + {0} deli + {0} delov + + masculine delci na milijon {0} delec na milijon @@ -6384,6 +6482,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} moli {0} molih + + glukoze + {0} glukoze + {0} glukoze + {0} glukoze + {0} glukoze + masculine litri na kilometer @@ -7576,8 +7681,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine - {0} emov - {0} emov + {0} em + {0} em {0} emu {0} ema {0} emom @@ -8033,7 +8138,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - točke {0} točka {0} točko {0} točki @@ -8559,6 +8663,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetri živega srebra {0} milimetrih živega srebra + + živega srebra + {0} živega srebra + {0} živega srebra + {0} živega srebra + {0} živega srebra + funti na kvadratni palec {0} funt na kvadratni palec @@ -9258,7 +9369,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine metrične pinte {0} metrična pinta - {0} metrična pinta + {0} metrično pinto {0} metrični pinti {0} metrične pinte {0} metrično pinto @@ -9310,6 +9421,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metričnimi skodelicami {0} metričnih skodelicah + + metrične tekočinske unče + {0} metrična tekočinska unča + {0} metrični tekočinski unči + {0} metrične tekočinske unče + {0} metričnih tekočinskih unč + aker-čevelj {0} aker-čevelj @@ -9409,9 +9527,99 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. kvarti {0} imp. kvartov + + steradiani + {0} steradian + {0} steradiana + {0} steradiani + {0} steradianov + + + katali + {0} katal + {0} katala + {0} katali + {0} katalov + + + kuloni + {0} kulon + {0} kulona + {0} kuloni + {0} kulonov + + + faradi + {0} farad + {0} farada + {0} faradi + {0} faradov + + + henri + {0} henri + {0} henrija + {0} henriji + {0} henrijev + + + simens + {0} simens + {0} simensa + {0} simensi + {0} simensov + + + mednarodne kalorije + {0} mednarodna kalorija + {0} mednarodni kaloriji + {0} mednarodne kalorije + {0} mednarodnih kalorij + + + bekereli + {0} bekerel + {0} bekerela + {0} bekereli + {0} bekerelov + + + sivert + {0} sivert + {0} siverta + {0} siverti + {0} sivertov + + + grej + {0} grej + {0} greja + {0} greji + {0} grejev + + + kilopondi + {0} kilopond + {0} kiloponda + {0} kilopondi + {0} kilopondov + + + tesla + {0} tesla + {0} tesli + {0} tesle + {0} tesel + + + veber + {0} veber + {0} vebra + {0} vebri + {0} vebrov + feminine - svetloba {0} svetloba {0} svetlobo {0} svetlobi @@ -9437,7 +9645,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} svetlobami {0} svetlobah - + masculine delci na milijardo {0} delec na milijardo @@ -9467,7 +9675,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - noči {0} noč {0} noč {0} noči @@ -9560,6 +9767,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} elementi {0} elementov + + del + {0} del + {0} dela + {0} deli + {0} delov + odstotek {0} % @@ -9580,6 +9794,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ‱ {0} ‱ + + Glc + l/km {0} l/km @@ -9686,7 +9903,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ J - {0} emov + {0} em {0} ema {0} emi {0} emov @@ -9839,6 +10056,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} m. skod. {0} m. skod. + + m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + bušel @@ -9938,6 +10162,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. qt {0} imp. qt + + cal-IT + + + kp + {0} kp + {0} kp + {0} kp + {0} kp + svetloba {0} svetloba @@ -9965,9 +10199,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dunum + + del + {0} del + {0} dela + {0} deli + {0} delov + % + + Glc + {0} bajt {0} bajta @@ -10010,7 +10254,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} s - {0} emov + {0} em {0} ema {0} emi {0} emov @@ -10039,6 +10283,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} m. sk. {0} m. sk. + + m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + {0} m. fl. oz. + des. žl. {0} des. žl. @@ -10053,20 +10304,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. des. žl. {0} imp. des. žl. - - svetloba - {0} svetloba - {0} svetlobi - {0} svetlobe - {0} svetlob + + cal-IT + + + kp + {0} kp + {0} kp + {0} kp + {0} kp - noči {0} n {0} n {0} n {0} n - {0}/noč diff --git a/make/data/cldr/common/main/smn.xml b/make/data/cldr/common/main/smn.xml index 4127fb6e100..39c4c67aa5d 100644 --- a/make/data/cldr/common/main/smn.xml +++ b/make/data/cldr/common/main/smn.xml @@ -1245,6 +1245,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ {0} {1} diff --git a/make/data/cldr/common/main/so.xml b/make/data/cldr/common/main/so.xml index 487a3476f90..dd8d382e5f8 100644 --- a/make/data/cldr/common/main/so.xml +++ b/make/data/cldr/common/main/so.xml @@ -40,6 +40,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic U dhashay Aymar Asarbayjan Bashkir + Baluchi U dhashay Baline Basaa Beleruusiyaan @@ -223,6 +224,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bafia Kologniyaan Kurdishka + Kurdish + Kurmanji Kumyk Komi Kornish @@ -723,6 +726,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Shiinaha Koloombiya Jasiiradda Kilibarton + Sark Costa Rica Kuuba Jasiiradda Kayb Faarde @@ -1003,58 +1007,96 @@ CLDR data files are interpreted according to the LDML specification (http://unic Habka Lacagta Kala Soocidda Dalabka Lacagta + Soo bandhiga Imoji Wareegga Saacadda (12 ilaa 24) Habka Jebinta Xariiqda + Bar Dhamaadyada Khadadka ee gudaha Erayada Nidaamka Cabbiraadda Tirooyinka + Bar Dhamaadka Jumlada Kadib Xarfo Soo Gaabinta Habeentiriska Buudhist + Qof Buddhi ah Habeetiriska Shiinaha + Shinees Habeentiriska Koptiga + Coptic Habeetiriska Dangi + Dangi Habeentiriska Itoobiya + Ethiopic Taariikhda Itoobiya ee Amete Alem + Ethiopic Amete Alem Habeetiriska Geregoriyaan + Gregorian Habeentiriska yuhuudda + Hebrew Habeentiris Qarameedka Hindiya Habeentiriska islaamka + Taariikhda Islaamiga Taariikhda Islaamiga (shax ahaan, waayo madaniyeed) + Taariikhda Islaamiga (shax ahaan, taariikh madaniyeed jaan go’an) Habeentiriska Islaamka (Sacuudiga, aragtida) Taariikhda Islaamiga (shax ahaan, waayo xiddigeed) + Taariikh Islaamiyeed (shax ahaan, waayo xiddigeed) Taariikhda Islaamiga(Umm al-Qura) + Taariikhda Islaamiga (Umm al-Qura) Habeentiriska ISO-8601 Habeentiriska jabbaanka + Jabaniis Habeentiriska Baarshiyaanka + U dhashay Faariis Habeentiriska Minguwo + Minguo Habka Xisaabinta Lacagta + Xisaabaadka Habka Heerka Lacagta - Isku hagaajinta Shiineeskii Hore - Big5 + Heerka Iswaafajinta Isku hajintii hore Isku hagaajinta Qaamuuska Lambar Sireedka Caalamiga ee Kala Soocidda Dalabka + Lambar Sireedka Caalamiga ee Asaliga ah Isku hagaajinta Emojiga Xeerarka Dalabka Yurub - Isku hagaajinta Farta shiineeska Isku hagaajinta foonbuuga Isku hagaajinta Pinyin Raadinta Guud + Raadi Raadinta Shibanaha Hangul Amarka Kala Soocidda Caadiga ah + Caadiga Isku hagaajinta Farta Isku hagaajin Fareedkii Hore Isku hagaajinta Farta Radical-Stroke Isku hagaajinta Farta Zhuyin + Asaliga + Imoji + Qoraal 12 Saac ee Nidaamka Saacadda (0–12) + 12 (0–11) 12 Saac ee Nidaamka Saacadda (1–12) + 12 (1–12) 24 Saac ee Nidaamka Saacadda (0–23) + 24 (0–23) 24 Saac ee Nidaamka Saacadda (1–24) + 24 (1–24) Habka Jabinta Xariiqda Dabacsan + Dabacsan Habka Jabinta Xariiqda Caadiga ah + Caadi ah Habka Jabinta Xariiqda Adag + Adag + Jebi dhamaan + Heyso dhamaan + Caadi ah + Weedho ahaan ku heyso Nidaamka Metric + Cabbir Nidaamka Cabbirka Imperial-ka + UK Nidaamka Cabbirka ee US + Mareykanka Godadka Ahom Gdadka Carabi-Hindiya Tirooyinka Dheeraadka ah ee Godadka Carabi-Hindiya @@ -1134,6 +1176,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Godadka Vai Godadka Warang Citi Godadka Wancho + Dami + Daar Metrik @@ -1422,11 +1466,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + {1} 'ee' {0} + {1} {0} + + {1} 'ee' {0} + @@ -1446,7 +1496,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -1727,16 +1779,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic d - - - GH - GD - - - GH - GD - - @@ -1816,6 +1858,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ee' {0} + + {1} 'ee' {0} + @@ -1824,6 +1869,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ee' {0} + + {1} 'ee' {0} + @@ -1832,6 +1880,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ee' {0} + + {1}, {0} + @@ -1840,10 +1891,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + y G + M/y G M/d/y GGGGG + E, M/d/y G MMM y G MMM d, y G E, MMM d, y G @@ -2146,6 +2202,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + M/y G + E, M/d/y G + h B – h B @@ -2247,7 +2307,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Snd Sannadkii la soo dhaafay Sannadkan Sannadka xiga @@ -2371,13 +2430,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic maalinta sannadka - mlnta sndka + maalinta sndka + + + maalinta sndka maalinta toddobaadka - mlnta tdbdka + maalinta tdbdka + + + maalinta tdbdka maalinta-toddobaadka bisha @@ -2960,9 +3025,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Douaala - - Shanghaay - Kosta Riika @@ -3107,9 +3169,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyaana - - Hoong Koong - Tegusigalba @@ -3180,9 +3239,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Benom Ben - Enderburi - - Kantoon @@ -3194,12 +3250,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic St. Kitis - - Boyongyang - - - Soul - Kuweyt @@ -3284,12 +3334,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bamaako - - Hofud - - - Makow - Seyban @@ -3590,9 +3634,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Boort of Isbayn - - Teybey - Daresalaam @@ -3763,9 +3804,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Galbeedka Afrika - Waqtiga Caadiga Ah ee Galbeedka Afrika - Waqtiga Xagaaga ee Galbeedka Afrika + Waqtiga Galbeedka Afrika @@ -3826,9 +3865,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Abiya - Waqtiga Caadiga Ah ee Abiya - Waqtiga Dharaarta ee Abiya + Wakhtiga Samoa + Waqtiga Caadiga Ah ee Samoa + Waqtiga Dharaarta ee Samoa @@ -3948,7 +3987,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Buruney Daarusalaam + Wakhtiga Brunei @@ -3960,7 +3999,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Jamoro + Wakhtiga Caadiga ah ee Chamorro @@ -4003,9 +4042,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Kuuk Aylaanis - Waqtiga Caadiga Ah ee Kuuk Aylaanis - Waqtiga Nus Xagaaga ah ee Kuuk Aylaanis + Wakhtiga Jasiiradaha Cook + Waqtiga Caadiga Ah ee Jasiiradaha Cook + Waqtiga Caadiga Ah ee Jasiiradaha Cook @@ -4017,7 +4056,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Dafis + Wakhtiga Davis @@ -4027,7 +4066,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Iist Timoor + Wakhtiga Timor-Leste @@ -4143,6 +4182,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Waqtiga Guyaana + + + Waqtiga Caadiga Ah ee Hawaay-Alutiyaan + + + HAST + + Waqtiga Hawaay-Alutiyaan @@ -4181,7 +4228,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Indoshiina + Wakhtiga Indochina @@ -4471,7 +4518,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Bonabe + Wakhtiga Pohnpei @@ -4512,9 +4559,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Samoa - Waqtiga Caadiga Ah ee Samoa - Waqtiga Dharaarta ee Samoa + Wakhtiga American Samoa + Waqtiga Caadiga Ah ee American Samoa + Waqtiga Dharaarta ee American Samoa @@ -4554,8 +4601,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waqtiga Teybey - Waqtiga Caadiga Ah ee Teybey + Waqtiga Taiwan + Waqtiga Caadiga Ah ee Taiwan Waqtiga Dharaarta ee Teybey @@ -4874,7 +4921,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5792,6 +5838,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic doolarka Iist Kaaribyan doolarada Iist Kaaribyan + + Caribbean guilder + Galdarada karabiyaan + Galdarayaasha karabiyaan + Faranka CFA Galbeedka Afrika faranka CFA Galbeedka Afrika @@ -5820,6 +5871,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kawaja Sambiya Kawajada Sambiya + + Dahabka Zimbabwe + Dahabka Zimbabwe + Dahabka Zimbabwe + {0} maalin @@ -6027,7 +6083,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} shay {0} shayo - + + qeybo + {0} qeyb + {0} qeybo + + qeyb milyankiiba {0} qeyb milyankiiba {0} qeyb milyankiiba @@ -6044,6 +6105,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} bermiraad {0} bermiraad + + ee kulukoos + {0} ee kulukoos + {0} ee kulukoos + litar kiilomitirkiiba litar kiilomitirkiiba @@ -6370,12 +6436,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} unuga xidigiska - furlongs {0} furlong {0} furlongs - fathoms {0} fathom {0} fathoms @@ -6402,12 +6466,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} laks - candela {0} candela {0} candela - lumen {0} lumen {0} lumen @@ -6447,7 +6509,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} tan - dhagaxo {0} dhagax {0} dhagaxo @@ -6521,6 +6582,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimitir maarkuri {0} milimitir maarkuri + + ee merkuriga + {0} ee merkuri + {0} ee merkuri + rodol halkii inji ee Isku weer ah {0} rodol halkii inji ee Isku weer ah @@ -6682,6 +6748,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic metrik koob {0} merik koob + + wiqaayadaha cabbirka dareeraha + {0} wiqaayada cabbirka dareeraha + {0} mwiqaayadaha cabbirka dareeraha + akre-fiit {0} akre-fiit @@ -6745,20 +6816,77 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} dram {0} dram - - nal - {0} nal - {0} nal + + steradians + {0} steradian + {0} steradians - + + katals + {0} katal + {0} katals + + + coulombs + {0} coulomb + {0} coulombs + + + farads + {0} farad + {0} farads + + + henrys + {0} henry + {0} henrys + + + siemens + {0} siemens + {0} siemens + + + kalooriyo [IT] + {0} kaloori [IT] + {0} kalooriyo [IT] + + + becquerels + {0} becquerel + {0} becquerels + + + sieverts + {0} sievert + {0} sieverts + + + grays + {0} gray + {0} grays + + + kilograms-force + {0} kilogram-force + {0} kilograms-force + + + teslas + {0} tesla + {0} teslas + + + webers + {0} weber + {0} webers + + qeybaha bilyankiiba {0} qeybaha bilyankiiba {0} qeybaha bilyankiiba - habeeno - {0} habeen - {0} habeeno {0} halkii habeen @@ -6844,7 +6972,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} shay {0} shay - + + qeyb + {0} qeyb + {0} qeyb + + qeyb/milyankiiba @@ -6861,6 +6994,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mool {0} mool + + Glc + litar/km @@ -7178,6 +7314,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mmHg {0} mmHg + + ee Hg + {0} ee Hg + {0} ee Hg + ha {0} ha @@ -7321,12 +7462,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic dareere dram + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Wb + {0} Wb + nal {0} nal {0} nal - + qeybaha/bilyan {0} qb {0} qb @@ -7357,7 +7521,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}shay {0}shay - + + qeyb + {0} qeyb + {0} qeyb + + ppm {0}ppm {0}ppm# @@ -7365,6 +7534,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic % + + Glc + L/100km {0}L/100km @@ -7470,7 +7642,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}cd - lumen {0}lm {0}lm @@ -7496,6 +7667,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmHg {0}mmHg + + ee Hg + {0} ee Hg + {0} ee Hg + {0}psi {0}psi @@ -7562,21 +7738,37 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}qt-Imp. {0}qt-Imp. + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + cal-IT + + + {0} Bq + {0} Bq + + + {0} Wb + {0} Wb + - nal {0}nal {0}nal - + qb {0}qb {0}qb - habeeno {0}habeen {0}habeeno - {0}/habeen {0}B diff --git a/make/data/cldr/common/main/sq.xml b/make/data/cldr/common/main/sq.xml index b812532db36..2696ea472bc 100644 --- a/make/data/cldr/common/main/sq.xml +++ b/make/data/cldr/common/main/sq.xml @@ -44,6 +44,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ azerbajxhanisht azerisht bashkirisht + balukisht balinezisht basaisht bjellorusisht @@ -230,6 +231,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafianisht këlnisht kurdisht + kurdisht + kurmanjisht kumikisht komisht kornisht @@ -243,7 +246,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ lezgianisht gandaisht limburgisht - ligurianisht + ligurisht lilluetisht lakotisht lombardisht @@ -545,7 +548,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - + @@ -747,6 +750,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kinë Kolumbi Ishulli Klipërton + Sark Kosta-Rikë Kubë Kepi i Gjelbër @@ -981,58 +985,96 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Formati valutor Radhitja Valuta + Prezantimi i emoji-ve Cikli orar (12 - 24) Stili i gjerësisë së rreshtave + Ndarja e rreshtit brenda fjalëve Sistemi i njësive matëse Numrat/shifrat + Ndërprerja e fjalisë pas shkurtimit kalendar budist + budist kalendar kinez + kinez kalendar koptik + koptik kalendar dangi + dangi kalendari etiopik + etiopik kalendar etiopik amete-alem + etiopik amete-alem kalendar gregorian + gregorian kalendar hebraik + hebraik Kalendari Kombëtar Indian kalendar islam + islam kalendar islam (tabelor, epoka civile) + islam (tabelor, epoka civile) kalendar islamik (Arabi Saudite, shikim) kalendar islam (tabelor, epoka astronomike) + islam (tabelor, epoka astronomike) kalendar islam (um al-qura) + islam (um al-qura) kalendar ISO-8601 kalendar japonez + japonez kalendar persian + persian kalendar minguo + minguo format valutor llogaritës + llogaritës format valutor standard - Radhitje e kinezishtes tradicionale - Big5 + standard Radhitja e mëparshme, për pajtueshmëri Radhitje fjalori radhitje unikode e parazgjedhur + unikode e parazgjedhur Radhitje Emoji Rregulla evropiane radhitjeje - Radhitje e kinezishtes së thjeshtësuar - GB2312 Radhitje libri telefonik Radhitje pinini kërkim i përgjithshëm + kërkim kërkim sipas bashkëtingëllores fillestare hangul radhitje standarde + standarde radhitje me vijëzim radhitje tradicionale radhitje me vijëzim radikal radhitje zhujin + e parazgjedhur + emoji + mesazh me tekst sistem 12-orësh (0 - 11) + 12-orësh (0 - 11) sistem 12-orësh (1 - 12) + 12-orësh (0 - 12) sistem 24-orësh (0 - 23) + 24-orësh (0 - 23) sistem 24-orësh (1 - 24) + 24-orësh (0 - 24) stil i gjerësisë së rreshtave - i larguar + i larguar stil i gjerësisë së rreshtave - normal + normal stil i gjerësisë së rreshtave - i ngushtuar + i ngushtuar + ndarje kudo + jo ndarje + ndarje normale + jo ndarje e frazave sistem metrik + metrik sistem imperial (britanik) i njësive matëse + britanik sistem amerikan i njësive matëse + amerikan shifra ahom shifra indo-arabe shifra indo-arabe të zgjatura @@ -1115,6 +1157,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ shifra vai shifra varang citi shifra vanço + joaktive + aktive metrik @@ -1123,7 +1167,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gjuha: {0} - Skripti: {0} + Shkrimi: {0} Rajoni: {0} @@ -1133,13 +1177,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [A B C Ç D {DH} E Ë F G {GJ} H I J K L {LL} M N {NJ} O P Q R {RR} S {SH} T {TH} U V X {XH} Y Z {ZH}] [  \- ‑ , % ‰ + 0 1 2 3 4 5 6 7 8 9] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” « » ( ) \[ \] § @ * / \& # ′ ″ ~] + [\- ‑ , \: . ' “” « » /] - - « - » - - - @@ -1176,6 +1215,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'në' {0} + + {1}, 'ora' {0} + @@ -1184,6 +1226,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'në' {0} + + {1}, 'ora' {0} + @@ -1196,21 +1241,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, h B E, h:mm B E, h:mm:ss B E, d + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M.y G d.M.y GGGGG + E, d.M.y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a + h a, v + HH, v d.M E, d.M dd.MM @@ -1232,11 +1282,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1282,7 +1330,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM y – E, d MMM y G - h a – h a h – h a @@ -1296,7 +1343,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm – h:mm a v - h a – h a v h – h a v @@ -1596,23 +1642,28 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E, h B E, d + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss y G + M.y G d.M.y GGGG + E, d.M.y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a, v HH:mm:ss, v h:mm a, v HH:mm, v + h a, v + HH, v d.M E, d.M d.M @@ -1639,11 +1690,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -1689,7 +1738,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM y – E, d MMM y G - h a – h a h – h a @@ -1872,6 +1920,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + M.y G + E, d.M.y G M.y G d.M.y G E, d.M.y G @@ -1917,6 +1967,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} tremujorë më parë + + tmj. + muaj muajin e kaluar @@ -2389,6 +2442,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pashkë + + Koihaiku + Punta-Arenas @@ -2599,7 +2655,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pnom-Pen - Enderbur + Ishulli i Kantonit Kiritimat @@ -3035,9 +3091,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Ora e Afrikës Perëndimore - Ora standarde e Afrikës Perëndimore - Ora verore e Afrikës Perëndimore + Ora e Afrikës Perëndimore @@ -3425,6 +3479,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ora e Guajanës + + + Ora standarde e Ishujve Hauai-Aleutian + + Ora e Ishujve Hauai-Aleutian @@ -4032,9 +4091,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -4956,6 +5017,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dollarë të Karaibeve Lindore XCD + + gilder karaibian + gilder karaibian + gilderë karaibianë + ANG + Franga e Bregut të Fildishtë frangë e Bregut të Fildishtë @@ -4983,11 +5050,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ZAR - Kuaça e Zambikut - kuaçë zambiku - kuaça zambiku + Kuaça e Zambisë + kuaçë zambie + kuaça zambie ZMW + + Ari i Zimbabves + ar i Zimbabves + arë të Zimbabves + ≈{0} @@ -5215,7 +5287,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimol për litër {0} milimolë për litër - + + pjesë + {0} pjesë + {0} pjesë + + pjesë për milion {0} pjesë për milion {0} pjesë për milion @@ -5240,6 +5317,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mol {0} molë + + glukoze + litra për kilometër {0} litër për kilometër @@ -5716,6 +5796,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetër mërkuri {0} milimetra mërkuri + + mërkuri + paund për inç në katror {0} paund për inç në katror @@ -5889,6 +5972,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} kupë metrike {0} kupa metrike + + onsë të lëngshëm metrikë + {0} fl oz m. + {0} onsë të lëngshëm metrikë + këmbë-akër {0} këmbë-akër @@ -5981,17 +6069,81 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} çerek imperial {0} çerekë imperialë - + + steradianë + {0} steradian + {0} steradianë + + + katalë + {0} katal + {0} katalë + + + coulomb + {0} coulomb + {0} coulomb + + + faradë + {0} farad + {0} faradë + + + henry + {0} henry + {0} henry + + + siemens + {0} siemens + {0} siemens + + + kalori [IT] + {0} kalori [IT] + {0} kalori [IT] + + + bekuerelë + {0} bekuerel + {0} bekuerelë + + + sievertë + {0} sievert + {0} sievertë + + + grej + {0} grej + {0} grej + + + kilogram-forcë + {0} kilogram-forcë + {0} kilogram-forcë + + + tesla + {0} tesla + {0} tesla + + + veberë + {0} veber + {0} veberë + + + dritë + {0} dritë + {0} dritë + + pjesë për miliard {0} pjesë për miliard {0} pjesë për miliard - - net - {0} natë - {0} net - {0}/natë - drejtimi kardinal {0} Lindje @@ -6038,6 +6190,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} njësi {0} njësi + + pjesë + {0} pjesë + {0} pjesë + + + pjesë/milion + + + Glc + mi/gal {0} mi/gal @@ -6253,6 +6416,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} pisk {0} pinch + + cal-IT + + + dritë + {0} dritë + {0} dritë + + + pjesë/miliard + net {0} natë @@ -6283,10 +6457,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ akër + + pjesë + {0} pjesë + {0} pjesë + + + pjesë/milion + {0} mol {0} molë + + Glc + mpg {0} mpg @@ -6409,11 +6594,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} pisk {0} piska - - net - {0} natë - {0} net - {0}/natë + + cal-IT + + + dritë + {0} dritë + {0} dritë + + + pjesë/miliard diff --git a/make/data/cldr/common/main/sr.xml b/make/data/cldr/common/main/sr.xml index 19e590d21fa..7586e6ca2db 100644 --- a/make/data/cldr/common/main/sr.xml +++ b/make/data/cldr/common/main/sr.xml @@ -154,7 +154,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ средњеенглески есперанто шпански - шпански (Европа) + латиноамерички шпански + европски шпански + мексички шпански естонски баскијски евондо @@ -169,6 +171,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ фарски фон француски + канадски француски + швајцарски француски кајунски француски средњефранцуски старофранцуски @@ -281,6 +285,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафија келнски курдски + курдски + курманџи кумички кутенај коми @@ -417,7 +423,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ паштунски пашто португалски - португалски (Португал) + бразилски португалски + европски португалски кечуа киче раџастански @@ -808,6 +815,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Кина Колумбија Острво Клипертон + Сарк Костарика Куба Зеленортска Острва @@ -1081,34 +1089,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ нумеричко сортирање сортирање према јачини валута + презентација емоџија приказивање времена (12- или 24-часовно) стил прелома реда + преломи редова унутар речи систем мерних јединица бројеви + Прелом реченице после скраћенице Временска зона Варијанта локалитета Приватна употреба будистички календар + будистички кинески календар + кинески коптски календар + коптски данги календар + данги етиопски календар + етиопски етиопски амет алем календар + етиопски амет алем грегоријански календар + грегоријански хебрејски календар + хебрејски Индијски национални календар исламски календар + исламски исламски цивилни календар + исламски цивилни исламски астрономски календар + исламски астрономски исламски календар (Umm al-Qura) + исламски (Umm al-Qura) ISO-8601 календар јапански календар + јапански персијски календар + персијски календар Републике Кине + мингуо рачуноводствени формат валуте + рачуноводство стандардни формат валуте + стандардно Сортирај симболе Сортирање уз игнорисање симбола Сортирај акценте нормално @@ -1118,22 +1146,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Сортирај прво велика слова Сортирај без обзира на велика и мала слова Сортирај мала и велика слова - традиционално кинеско сортирање претходни редослед сортирања, због компатибилности + компатибилност редослед сортирања у речнику + речник подразумевани Unicode редослед сортирања + подразумевани Unicode европска правила редоследа - поједностављено кинеско сортирање сортирање као телефонски именик + телефонски именик фонетски редослед сортирања + фонетски пинјин сортирање + пинјин претрага опште намене + претрага Претрага према хангул почетном сугласнику стандардни редослед сортирања + стандардни сортирање по броју потеза + потези традиционално сортирање + традиционално редослед сортирања радикалних потеза + радикални потези жујин + жујин Сортирај без нормализације Сортирај Unicode нормализовано Сортирај цифре појединачно @@ -1146,18 +1184,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ пуна ширина пола ширине Нумеричка + подразумевано + емоџи + текст 12-часовни систем (0-11) + 12 (0–11) 12-часовни систем (1-12) + 12 (1–12) 24-часовни систем (0-23) + 24 (0–23) 24-часовни систем (1-24) + 24 (1–24) размакнути стил прелома реда + размакнути нормални стил прелома реда + нормални строги стил прелома реда + строги + прелом свега + задржи све + нормално + задржи у фразама БГН (BGN) УНГЕГН (BGN) - метрички + метрички систем + метрички империјални - амерички + УК + амерички систем + САД арапско-индијске цифре продужене арапско-индијске цифре јерменски бројеви @@ -1202,6 +1257,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тибетанске цифре Традиционални бројеви ваи цифре + Укључено + Искључено метрички @@ -1222,9 +1279,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1339,13 +1393,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E hh:mm a E hh:mm:ss a y. G + M. y. G d.M.y. GGGGG + G dd. MM. y, E MMM y. G d. MMM y. G E, d. MMM y. G - h a hh:mm a hh:mm:ss a + HH 'č'. v d.M. E, d.M. MM-dd @@ -1372,7 +1428,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} – {1} h a – h a - h–h a h:mm a – h:mm a @@ -1573,22 +1628,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ увече ноћу - - поноћ - подне - ујутру - по подне - увече - ноћу - - - поноћ - подне - ујутру - по подне - увече - ноћу - @@ -1697,11 +1736,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y. G d. MMM y. G E, d. MMM y. G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'h' v d. M. E, d. M. dd.MM. @@ -1733,7 +1772,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} – {1} h a – h a - h–h a h:mm a – h:mm a @@ -1747,7 +1785,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1907,6 +1944,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ АХ + + + M. y. G + G dd. MM. y, E + + @@ -3038,6 +3081,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ускршње острво + + Којајке + Пунта Аренас @@ -3303,9 +3349,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пном Пен - Ендербери - - Кантон @@ -3982,9 +4025,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Западно-афричко време - Западно-афричко стандардно време - Западно-афричко летње време + Западно-афричко време @@ -4385,6 +4426,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Гвајана време + + + Хавајско-алеутско стандардно време + + Хавајско-алеутско време @@ -4835,6 +4881,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Чуук време + + + Турска време + Турска стандардно време + Турска летње рачунање времена + + Туркменистан време @@ -5002,9 +5055,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -6703,6 +6758,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ источнокарипскa доларa источнокарипскиx доларa + + карипски гулден + карипски гулден + карипски гулден + карипски гулден + Посебна цртаћа права посебно цртаће право @@ -6847,6 +6908,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ зимбабвејска долара (1980–2008) зимбабвејских долара (1980–2008) + + зимбабвеанско злато + зимбабвеанско злато + зимбабвеанско злато + зимбабвеанско злато + Зимбабвеански долар (2009) зимбабвејски долар (2009) @@ -7318,7 +7385,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ставки {0} ставки - + + делови + {0} део + {0} дела + {0} делова + + feminine честица на милион {0} честица на милион @@ -7383,6 +7456,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мола {0} мола + + глукозе + {0} глукозе + {0} глукозе + {0} глукозе + inanimate литри по километру @@ -8353,7 +8432,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - типографске тачке {0} типографска тачка {0} типографску тачку {0} типографске тачке @@ -8674,6 +8752,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} милиметара живиног стуба {0} милиметара живиног стуба + + живе + {0} живе + {0} живе + {0} живе + фунте по квадратном инчу {0} фунта по квадратном инчу @@ -8843,7 +8927,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Бофор Бофор {0} - Б {0} + B {0} Бофор {0} @@ -9108,6 +9192,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метричких шоља {0} метричких шоља + + течне унце + {0} течна унца + {0} течне унце + {0} течних унци + акер стопе {0} акер стопа @@ -9204,9 +9294,83 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} империјске четвртине {0} империјских четвртина + + стерадианси + + + катали + {0} катал + {0} катала + {0} катала + + + кулони + {0} кулон + {0} кулона + {0} кулона + + + фаради + {0} фарад + {0} фарада + {0} фарада + + + хенрији + {0} хенри + {0} хенрија + {0} хенрија + + + сименси + {0} сименс + {0} сименса + {0} сименса + + + калорије [IT] + {0} калорија [IT] + {0} калорије [IT] + {0} калорија [IT] + + + бекерели + {0} бекерел + {0} бекерела + {0} бекерела + + + сиверти + {0} сиверт + {0} сиверта + {0} сиверта + + + греји + {0} греј + {0} греја + {0} грејева + + + килопонд + {0} килопонд + {0} килопонда + {0} килопонда + + + тесле + {0} тесла + {0} тесле + {0} тесла + + + вебери + {0} вебер + {0} вебера + {0} вебера + neuter - светло {0} светло {0} светло {0} светла @@ -9220,7 +9384,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} светала {0} светала - + inanimate делови на милијарду {0} део на милијарду @@ -9238,7 +9402,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - ноћ {0} ноћ {0} ноћ {0} ноћи @@ -9251,14 +9414,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ноћи {0} ноћи {0} ноћи - {0}/ноћ страна света - {0} E - {0} N - {0} S - {0} W @@ -9301,12 +9459,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ставке {0} ставки + + део + {0} део + {0} дела + {0} делова + проценат промил + + Glc + L/100 km {0} L/100 km @@ -9511,9 +9678,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bf - Б {0} - Б {0} - Б {0} + B {0} + B {0} + B {0} степени Фаренхајта @@ -9585,13 +9752,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} прстохвата {0} прстохвата + + cal [IT] + светло {0} светло {0} светла {0} светала - + делови/милијарда @@ -9610,9 +9780,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + део + {0} део + {0} дела + {0} делова + % + + Glc + L/100km {0} L/100km @@ -9712,6 +9891,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} кс {0} кс + + B {0} + B {0} + B {0} + l @@ -9743,18 +9927,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} qt Imp {0} qt Imp - - светло - {0} светло - {0} светла - {0} светала - - - ноћ - {0} ноћ - {0} ноћи - {0} ноћи - {0}/ноћ + + cal [IT] {0}E diff --git a/make/data/cldr/common/main/sr_Cyrl_BA.xml b/make/data/cldr/common/main/sr_Cyrl_BA.xml index d112a24c27f..c84ba99659a 100644 --- a/make/data/cldr/common/main/sr_Cyrl_BA.xml +++ b/make/data/cldr/common/main/sr_Cyrl_BA.xml @@ -602,9 +602,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Западно-афричко вријеме - Западно-афричко стандардно вријеме - Западно-афричко љетње вријеме + Западно-афричко вријеме @@ -949,6 +947,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гвајана вријеме + + + Хавајско-алеутско стандардно вријеме + + Хавајско-алеутско вријеме @@ -1595,7 +1598,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} свјетала {0} свјетала - + дијелови на милијарду {0} дио на милијарду {0} дио на милијарду @@ -1627,18 +1630,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} грана {0} гранова - - B {0} - B {0} - Б {0} - свјетло {0} свјетло {0} свјетла {0} свјетала - + дијелови/милијарда @@ -1670,9 +1668,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bft - B {0} - B {0} - B {0} {0}/gal Imp @@ -1702,7 +1697,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} свјетла {0} свјетала - + дијелови/милијарда diff --git a/make/data/cldr/common/main/sr_Cyrl_ME.xml b/make/data/cldr/common/main/sr_Cyrl_ME.xml index 058e55d769d..3d1a4984a81 100644 --- a/make/data/cldr/common/main/sr_Cyrl_ME.xml +++ b/make/data/cldr/common/main/sr_Cyrl_ME.xml @@ -129,11 +129,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic - MMMM: W. 'недеља' - MMMM: W. 'недеља' + W. 'сједмица' 'у' MMMM + W. 'сједмица' 'у' MMMM W. 'сједмица' 'у' MMMM - w. 'недеља' 'у' Y. - w. 'недеља' 'у' Y. + w. 'сједмица' 'у' Y. + w. 'сједмица' 'у' Y. w. 'сједмица' 'у' Y. diff --git a/make/data/cldr/common/main/sr_Latn.xml b/make/data/cldr/common/main/sr_Latn.xml index edbc0fa8ae9..54655b62fdd 100644 --- a/make/data/cldr/common/main/sr_Latn.xml +++ b/make/data/cldr/common/main/sr_Latn.xml @@ -153,7 +153,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic srednjeengleski esperanto španski - španski (Evropa) + latinoamerički španski + evropski španski + meksički španski estonski baskijski evondo @@ -168,6 +170,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic farski fon francuski + kanadski francuski + švajcarski francuski kajunski francuski srednjefrancuski starofrancuski @@ -280,6 +284,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafija kelnski kurdski + kurdski + kurmandži kumički kutenaj komi @@ -416,7 +422,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic paštunski pašto portugalski - portugalski (Portugal) + brazilski portugalski + evropski portugalski kečua kiče radžastanski @@ -807,6 +814,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kina Kolumbija Ostrvo Kliperton + Sark Kostarika Kuba Zelenortska Ostrva @@ -1080,34 +1088,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic numeričko sortiranje sortiranje prema jačini valuta + prezentacija emodžija prikazivanje vremena (12- ili 24-časovno) stil preloma reda + prelomi redova unutar reči sistem mernih jedinica brojevi + Prelom rečenice posle skraćenice Vremenska zona Varijanta lokaliteta Privatna upotreba budistički kalendar + budistički kineski kalendar + kineski koptski kalendar + koptski dangi kalendar + dangi etiopski kalendar + etiopski etiopski amet alem kalendar + etiopski amet alem gregorijanski kalendar + gregorijanski hebrejski kalendar + hebrejski Indijski nacionalni kalendar islamski kalendar + islamski islamski civilni kalendar + islamski civilni islamski astronomski kalendar + islamski astronomski islamski kalendar (Umm al-Qura) + islamski (Umm al-Qura) ISO-8601 kalendar japanski kalendar + japanski persijski kalendar + persijski kalendar Republike Kine + minguo računovodstveni format valute + računovodstvo standardni format valute + standardno Sortiraj simbole Sortiranje uz ignorisanje simbola Sortiraj akcente normalno @@ -1117,22 +1145,32 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sortiraj prvo velika slova Sortiraj bez obzira na velika i mala slova Sortiraj mala i velika slova - tradicionalno kinesko sortiranje prethodni redosled sortiranja, zbog kompatibilnosti + kompatibilnost redosled sortiranja u rečniku + rečnik podrazumevani Unicode redosled sortiranja + podrazumevani Unicode evropska pravila redosleda - pojednostavljeno kinesko sortiranje sortiranje kao telefonski imenik + telefonski imenik fonetski redosled sortiranja + fonetski pinjin sortiranje + pinjin pretraga opšte namene + pretraga Pretraga prema hangul početnom suglasniku standardni redosled sortiranja + standardni sortiranje po broju poteza + potezi tradicionalno sortiranje + tradicionalno redosled sortiranja radikalnih poteza + radikalni potezi žujin + žujin Sortiraj bez normalizacije Sortiraj Unicode normalizovano Sortiraj cifre pojedinačno @@ -1145,18 +1183,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic puna širina pola širine Numerička + podrazumevano + emodži + tekst 12-časovni sistem (0-11) + 12 (0–11) 12-časovni sistem (1-12) + 12 (1–12) 24-časovni sistem (0-23) + 24 (0–23) 24-časovni sistem (1-24) + 24 (1–24) razmaknuti stil preloma reda + razmaknuti normalni stil preloma reda + normalni strogi stil preloma reda + strogi + prelom svega + zadrži sve + normalno + zadrži u frazama BGN (BGN) UNGEGN (BGN) - metrički + metrički sistem + metrički imperijalni - američki + UK + američki sistem + SAD arapsko-indijske cifre produžene arapsko-indijske cifre jermenski brojevi @@ -1201,6 +1256,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic tibetanske cifre Tradicionalni brojevi vai cifre + Uključeno + Isključeno metrički @@ -1222,9 +1279,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1339,13 +1393,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic E hh:mm a E hh:mm:ss a y. G + M. y. G d.M.y. GGGGG + G dd. MM. y, E MMM y. G d. MMM y. G E, d. MMM y. G - h a hh:mm a hh:mm:ss a + HH 'č'. v d.M. E, d.M. MM-dd @@ -1372,7 +1428,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} – {1} h a – h a - h–h a h:mm a – h:mm a @@ -1573,22 +1628,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic uveče noću - - ponoć - podne - ujutru - po podne - uveče - noću - - - ponoć - podne - ujutru - po podne - uveče - noću - @@ -1697,11 +1736,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y. G d. MMM y. G E, d. MMM y. G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'h' v d. M. E, d. M. dd.MM. @@ -1733,7 +1772,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} – {1} h a – h a - h–h a h:mm a – h:mm a @@ -1747,7 +1785,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h a – h a v - h–h a v M–M @@ -1907,6 +1944,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic AH + + + M. y. G + G dd. MM. y, E + + @@ -3038,6 +3081,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Uskršnje ostrvo + + Kojajke + Punta Arenas @@ -3303,9 +3349,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pnom Pen - Enderberi - - Kanton @@ -3982,9 +4025,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Zapadno-afričko vreme - Zapadno-afričko standardno vreme - Zapadno-afričko letnje vreme + Zapadno-afričko vreme @@ -4385,6 +4426,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gvajana vreme + + + Havajsko-aleutsko standardno vreme + + Havajsko-aleutsko vreme @@ -4835,6 +4881,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Čuuk vreme + + + Turska vreme + Turska standardno vreme + Turska letnje računanje vremena + + Turkmenistan vreme @@ -5002,9 +5055,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) @@ -6703,6 +6758,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic istočnokaripska dolara istočnokaripskix dolara + + karipski gulden + karipski gulden + karipski gulden + karipski gulden + Posebna crtaća prava posebno crtaće pravo @@ -6847,6 +6908,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic zimbabvejska dolara (1980–2008) zimbabvejskih dolara (1980–2008) + + zimbabveansko zlato + zimbabveansko zlato + zimbabveansko zlato + zimbabveansko zlato + Zimbabveanski dolar (2009) zimbabvejski dolar (2009) @@ -7216,7 +7283,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} stavki {0} stavki - + + delovi + {0} deo + {0} dela + {0} delova + + feminine čestica na milion {0} čestica na milion @@ -7272,6 +7345,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mola {0} mola + + glukoze + {0} glukoze + {0} glukoze + {0} glukoze + inanimate litri po kilometru @@ -7806,15 +7885,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic inanimate kilovat-sati na 100 kilometara {0} kilovat-sat na 100 kilometara - {0} kilovat-sat na 100 kilometara {0} kilovat-sata na 100 kilometara {0} kilovat-satom na 100 kilometara {0} kilovat-sata na 100 kilometara - {0} kilovat-sata na 100 kilometara {0} kilovat-sata na 100 kilometara {0} kilovat-sata na 100 kilometara {0} kilovat-sati na 100 kilometara - {0} kilovat-sati na 100 kilometara {0} kilovat-sati na 100 kilometara {0} kilovat-sati na 100 kilometara @@ -8110,7 +8186,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic feminine - tipografske tačke {0} tipografska tačka {0} tipografsku tačku {0} tipografske tačke @@ -8398,6 +8473,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} milimetara živinog stuba {0} milimetara živinog stuba + + žive + {0} žive + {0} žive + {0} žive + funte po kvadratnom inču {0} funta po kvadratnom inču @@ -8772,6 +8853,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metričkih šolja {0} metričkih šolja + + tečne unce + {0} tečna unca + {0} tečne unce + {0} tečnih unci + aker stope {0} aker stopa @@ -8868,61 +8955,114 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} imperijske četvrtine {0} imperijskih četvrtina + + steradiansi + + + katali + {0} katal + {0} katala + {0} katala + + + kuloni + {0} kulon + {0} kulona + {0} kulona + + + faradi + {0} farad + {0} farada + {0} farada + + + henriji + {0} henri + {0} henrija + {0} henrija + + + simensi + {0} simens + {0} simensa + {0} simensa + + + kalorije [IT] + {0} kalorija [IT] + {0} kalorije [IT] + {0} kalorija [IT] + + + bekereli + {0} bekerel + {0} bekerela + {0} bekerela + + + siverti + {0} sivert + {0} siverta + {0} siverta + + + greji + {0} grej + {0} greja + {0} grejeva + + + kilopond + {0} kilopond + {0} kiloponda + {0} kiloponda + + + tesle + {0} tesla + {0} tesle + {0} tesla + + + veberi + {0} veber + {0} vebera + {0} vebera + neuter - svetlo - {0} svetlo - {0} svetlo {0} svetla {0} svetlom - {0} svetla - {0} svetla {0} svetla {0} svetla - {0} svetala - {0} svetala {0} svetala {0} svetala - + inanimate delovi na milijardu {0} deo na milijardu - {0} deo na milijardu {0} dela na milijardu {0} delom na milijardu {0} dela na milijardu - {0} dela na milijardu {0} dela na milijardu {0} dela na milijardu {0} delova na milijardu - {0} delova na milijardu {0} delova na milijardu {0} delova na milijardu feminine - noć - {0} noć - {0} noć {0} noći {0} noći - {0} noći - {0} noći {0} noći {0} noći - {0} noći - {0} noći {0} noći {0} noći - {0}/noć strana sveta - {0} E - {0} N - {0} S - {0} W @@ -8965,12 +9105,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} stavke {0} stavki + + deo + {0} deo + {0} dela + {0} delova + procenat promil + + Glc + L/100 km {0} L/100 km @@ -9249,13 +9398,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} prstohvata {0} prstohvata + + cal [IT] + svetlo {0} svetlo {0} svetla {0} svetala - + delovi/milijarda @@ -9274,9 +9426,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + deo + {0} deo + {0} dela + {0} delova + % + + Glc + L/100km {0} L/100km @@ -9376,6 +9537,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ks {0} ks + + B {0} + B {0} + B {0} + l @@ -9407,18 +9573,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} qt Imp {0} qt Imp - - svetlo - {0} svetlo - {0} svetla - {0} svetala - - - noć - {0} noć - {0} noći - {0} noći - {0}/noć + + cal [IT] {0}E diff --git a/make/data/cldr/common/main/sr_Latn_BA.xml b/make/data/cldr/common/main/sr_Latn_BA.xml index 80475ab0366..9605eb3aaba 100644 --- a/make/data/cldr/common/main/sr_Latn_BA.xml +++ b/make/data/cldr/common/main/sr_Latn_BA.xml @@ -602,9 +602,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Zapadno-afričko vrijeme - Zapadno-afričko standardno vrijeme - Zapadno-afričko ljetnje vrijeme + Zapadno-afričko vrijeme @@ -949,6 +947,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gvajana vrijeme + + + Havajsko-aleutsko standardno vrijeme + + Havajsko-aleutsko vrijeme @@ -1595,7 +1598,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} svjetala {0} svjetala - + dijelovi na milijardu {0} dio na milijardu {0} dio na milijardu @@ -1627,18 +1630,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} grana {0} granova - - B {0} - B {0} - B {0} - svjetlo {0} svjetlo {0} svjetla {0} svjetala - + dijelovi/milijarda @@ -1670,9 +1668,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bft - B {0} - B {0} - B {0} {0}/gal Imp @@ -1702,7 +1697,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} svjetla {0} svjetala - + dijelovi/milijarda diff --git a/make/data/cldr/common/main/sr_Latn_ME.xml b/make/data/cldr/common/main/sr_Latn_ME.xml index 7ee454af022..b70f80cd6b1 100644 --- a/make/data/cldr/common/main/sr_Latn_ME.xml +++ b/make/data/cldr/common/main/sr_Latn_ME.xml @@ -129,11 +129,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic - MMMM: W. 'nedelja' - MMMM: W. 'nedelja' + W. 'sjedmica' 'u' MMMM + W. 'sjedmica' 'u' MMMM W. 'sjedmica' 'u' MMMM - w. 'nedelja' 'u' Y. - w. 'nedelja' 'u' Y. + w. 'sjedmica' 'u' Y. + w. 'sjedmica' 'u' Y. w. 'sjedmica' 'u' Y. diff --git a/make/data/cldr/common/main/st.xml b/make/data/cldr/common/main/st.xml index 108fdb84ffe..acf154963ee 100644 --- a/make/data/cldr/common/main/st.xml +++ b/make/data/cldr/common/main/st.xml @@ -23,7 +23,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Se-bosnia Se-catalia Se-czech - Se-welsh + Sewelsh Se-dutch Se-jeremane Se-greek @@ -137,7 +137,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Phe Kol - Ube + Hlb Mme Mot Jan diff --git a/make/data/cldr/common/main/su.xml b/make/data/cldr/common/main/su.xml index f59f6ad3b9c..c1048b99a3e 100644 --- a/make/data/cldr/common/main/su.xml +++ b/make/data/cldr/common/main/su.xml @@ -346,7 +346,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y G d MMM y G E, d MMM y G - h a h.mm a HH.mm h.mm.ss a @@ -384,9 +383,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic taun ieu taun payun - - tn. - triwulan diff --git a/make/data/cldr/common/main/suz.xml b/make/data/cldr/common/main/suz.xml new file mode 100644 index 00000000000..dff7c0d267d --- /dev/null +++ b/make/data/cldr/common/main/suz.xml @@ -0,0 +1,19 @@ + + + + + + + + + + [अ आ इ उ ए ओ {क्} {ख्} {ग्} {च्} {छ्} {ज्} {ट्} {ठ्} {ड्} {त्} {थ्} {द्} {न्} {प्} {फ्} ब {ब्} {म्} {य्} {र्} {ल्} {व्} {श्} {स्} {ह्} ्] + [] + [० १ २ ३ ४ ५ ६ ७ ८ ९] + [, \: ! ? । “”] + + diff --git a/make/data/cldr/common/main/suz_Deva.xml b/make/data/cldr/common/main/suz_Deva.xml new file mode 100644 index 00000000000..97ecbfca916 --- /dev/null +++ b/make/data/cldr/common/main/suz_Deva.xml @@ -0,0 +1,14 @@ + + + + + + + + + tidszon - kinesiska i big5-sorteringsordning - kinesiska i gb2312-sorteringsordning kinesiska i pinyin-sorteringsordning kinesiska i strecksorteringsordning + + {0}… + …{0} + {0}…{1} + - + - Q1 - Q2 - Q3 - Q4 + K1 + K2 + K3 + K4 + + + + EEEE d MMMM y + + + + + d MMMM y + + + + + d MMM y + + + + + d.M.y + + + + + + + HH.mm.ss zzzz + + + + + H.mm.ss z + + + + + H.mm.ss + + + + + H.mm + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + h.mm B h.mm.ss B @@ -48,6 +115,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic E HH.mm E h.mm.ss a E HH.mm.ss + M.y G + d.M.y G + E d.M.y G + H h.mm a HH.mm h.mm.ss a @@ -61,10 +132,85 @@ CLDR data files are interpreted according to the LDML specification (http://unic d.M dd.MM mm.ss + L.y + d.M.y + E d.M.y + M.y + + + h.mm B–h.mm B + h.mm–h.mm B + h.mm–h.mm B + + + d.M.y–d.M.y GGGGG + d.M.y GGGGG–d.M.y GGGGG + d.M.y–d.M.y GGGGG + d.M.y–d.M.y GGGGG + + + E d.M.y–E d.M.y GGGGG + E d.M.y GGGGG–E d.M.y GGGGG + E d.M.y–E d.M.y GGGGG + E d.M.y–E d.M.y GGGGG + + + h.mm a–h.mm a + h.mm–h.mm a + h.mm–h.mm a + + + H.mm–H.mm + HH.mm–HH.mm + + + h.mm a–h.mm a v + h.mm–h.mm a v + h.mm–h.mm a v + + + HH.mm–HH.mm v + HH.mm–HH.mm v + + + d–d.M + d.M–d.M + + + E d.M–E d.M + E d.M–E d.M + + + MMM–MMM y + MMMM y–MMMM y + + + d–d.M.y + d.M–d.M.y + d.M.y–d.M.y + + + E d.M.y–E d.M.y + E d.M.y–E d.M.y + E d.M.y–E d.M.y + + + + + förra året + i år + nästa år + + + förra året + i år + nästa år + + diff --git a/make/data/cldr/common/main/sw.xml b/make/data/cldr/common/main/sw.xml index 26779a6c82c..11473266ce7 100644 --- a/make/data/cldr/common/main/sw.xml +++ b/make/data/cldr/common/main/sw.xml @@ -49,6 +49,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiazerbaijani Kiazeri Kibashkiri + Kibaluchi Kibali Kibasaa Kibamun @@ -59,14 +60,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kibena Kibafut Kibulgaria - Kiharyanvi + Kiharyanvi Kibalochi cha Magharibi Kibhojpuri Kibislama Kibini Kikom Kisiksika - Kianii + Kianii Kibambara Kibengali Kitibeti @@ -128,9 +129,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiekajuk Kigiriki Kiingereza - Kiingereza (Canada) Kiingereza (Uingereza) - Kiingereza (UK) Kiesperanto Kihispania Kihispania (Amerika ya Latini) @@ -147,7 +146,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kifaroe Kifon Kifaransa - Kifaransa (Canada) Kifaransa cha Kajuni Kifaransa cha Kale Kifrisia cha Kaskazini @@ -244,11 +242,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kibafia Kicologne Kikurdi + Kikurdi + Kikurmanji Kumyk Kikomi Kikorni Kikwakʼwala - Kikuvi + Kikuvi Kikyrgyz Kilatini Kiladino @@ -258,10 +258,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kilezighian Kiganda Limburgish - Kiliguria + Kiliguria Kilillooet Kilakota - Kilongobardi + Kilongobardi Kilingala Kilaosi Kimongo @@ -368,7 +368,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kireno (Ulaya) Kikechua Kʼicheʼ - Kirajasthani + Kirajasthani Kirapanui Kirarotonga Kirohingya @@ -428,7 +428,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiswahili Shikomor Lugha ya Syriac - Kisilesia + Kisilesia Kitamili Kitutchone cha Kusini Kitelugu @@ -469,9 +469,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kiuzbeki Kivai Kivenda - Kivenisi + Kivenisi Kivietinamu - Kimakhuwa + Kimakhuwa Kivolapuk Kivunjo Kiwaloon @@ -483,7 +483,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kichina cha Wu Kikalmyk Kixhosa - Kikangri + Kikangri Kisoga Kiyao Kiyangben @@ -493,7 +493,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Kinheengatu Kikantoni Kichina, Kikantoni - Kizhuang + Kizhuang Kiberber Sanifu cha Moroko Kichina Kichina sanifu @@ -534,7 +534,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - @@ -640,7 +639,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Belize Kanada Visiwa vya Cocos (Keeling) - Jamhuri ya Kidemokrasia ya Kongo + Kongo - Kinshasa Kongo (DRC) Jamhuri ya Afrika ya Kati Kongo - Brazzaville @@ -654,6 +653,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Uchina Kolombia Kisiwa cha Clipperton + Sark Kostarika Kuba Cape Verde @@ -718,7 +718,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Israeli Kisiwa cha Man India - Eneo la Uingereza katika Bahari Hindi + Eneo la Uingereza katika Bahari Hindi Iraki Iran Aisilandi @@ -854,7 +854,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Visiwa Vidogo vya Nje vya Marekani Umoja wa Mataifa Marekani - US Uruguay Uzibekistani Mji wa Vatican @@ -893,33 +892,52 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Upangaji kwa Nambari Nguvu ya Upangaji Sarafu + Uwasilishaji wa Emoji Kipindi cha saa (12 au 24) Mtindo wa Kukata Mstari + Nafasi kati ya mistari kwa maneno Mfumo wa Vipimo Nambari + Nafasi ya Sentensi Baada ya Ufupisho Saa za Eneo Lahaja za Lugha Matumizi ya Kibinafsi Kalenda ya Kibuddha + Kibudha Kalenda ya Kichina + Uchina Kalenda ya Koptiki + Kikhufti Kalenda ya Dangi + Dangi Kalenda ya Kiethiopia + Kiethiopia Kalenda ya Kiethiopia ya Amete Alem + Amete Alem ya Ethiopia Kalenda ya Kigregori + Kigregori Kalenda ya Kiebrania + Kiebrania Kalenda ya Taifa ya India - Kalenda ya Hijra - Kalenda ya Hijra (inayoanza usiku wa manane) - Kalenda ya Hijra (Umm ul-Qura) + Kalenda ya Hijra + Hijra + Kalenda ya Hijra (inayoanza usiku wa manane) + Hijra (inayotegemea hesabu) + Kalenda ya Hijra (Umm ul-Qura) + Hijra (Umm al-Qura) Kalenda ya ISO-8601 Kalenda ya Kijapani + Kijapani Kalenda ya Kiajemi + Kiajemi Kalenda ya Jamhuri ya Uchina + Kiminguo Mpangilio wa Kihasibu wa Sarafu + Uhasibu Mpangilio wa Kawaida wa Sarafu + Kawaida Panga Alama Panga Alama za Kupuuza Panga Viinitoni kwa Kawaida @@ -929,16 +947,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Panga Herufi kubwa Kwanza Panga Isiyoathiriwa na Herufi Panga kwa Inayoathiriwa na Herufi - Mpangilio wa Kichina cha Jadi - Big5 Mpangilio wa Kamusi Mpangilio Chaguo-Msingi wa Unicode - Mpangilio wa Kichina Rahisi - GB2312 + Chaguomsingi ya Unicode Mpangilio wa Orodha za Nambari za Simu Utaratibu wa Kupanga Fonetiki Mpangilio wa Kipinyin Utafutaji wa Kijumla + Utafutaji Tafuta kwa Konsonanti Halisi ya Hangul Mpangilio wa Kawaida + Kawaida Mpangilio wa Mikwaju Mpangilio wa Kawaida Mpangilio wa Mikwaju ya Shina @@ -954,18 +973,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Upana kamili Nusu upana Ya Nambari + Chaguomsingi + Emoji + Maandiko Kipindi cha saa 12 (0–11) + 12 (0–11) Kipindi cha saa 12 (1–12) + 12 (1–12) Kipindi cha saa 24 (0–23) + 24 (0–23) Kipindi cha saa 24 (1–24) + 24 (1–24) Mtindo Pana wa Kukata Mstari + Usio kaza Mtindo wa Kawaida wa Kukata Mstari + Kawaida Mtindo Finyu wa Kukata Mstari + Usio legevu + Katisha yote + Dumisha yote + Kawaida + Weka katika vifungu Mtindo wa kunukuu wa US BGN Mtindo wa kunukuu wa UN GEGN Mfumo wa Metriki + Metriki Mfumo wa Vipimo wa Uingereza + Uingereza Mfumo wa Vipimo wa Marekani + Marekani Nambari za Kiarabu/Kihindi Nambari za Kiarabu/Kihindi Zilizopanuliwa Nambari za Kiarmenia @@ -1013,6 +1049,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Nambari za Kitibeti Tarakimu za Jadi Nambari za Kivai + Imezimwa + Imewashwa Mfumo wa Mita @@ -1030,9 +1068,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [c q x] [A B {CH} D E F G H I J K L M N O P R S T U V W Y Z] [\- ‑ , ; \: ! ? . ' " ( ) \[ \] \{ \}] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1074,6 +1109,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'saa' {0} + @@ -1082,6 +1120,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1} 'saa' {0} + @@ -1090,6 +1131,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}, {0} + + {1}, {0} + @@ -1104,11 +1148,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + M/y G d/M/y GGGGG + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a d-M @@ -1487,11 +1532,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + G MM-y d/M/y GGGGG + E, d/M/y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1559,7 +1605,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM y – E, d MMM y G - h a – h a h – h a @@ -1584,7 +1629,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -1916,9 +1960,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saa za Majira ya Joto za Ayalandi - - Enderbury - Kostanay @@ -1968,9 +2009,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Saa za Afrika Magharibi - Saa za Wastani za Afrika Magharibi - Saa za Majira ya joto za Afrika Magharibi + Saa za Afrika Magharibi @@ -2327,6 +2366,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Saa za Guyana + + + Saa za Wastani za Hawaii-Aleutian + + Saa za Hawaii-Aleutian @@ -2903,30 +2947,30 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ¤ elfu0 - ¤ elfu0 - ¤ elfu00;¤elfu -00 - ¤ elfu00;¤elfu -00 - ¤ laki000;¤laki -000 - ¤ laki000;¤laki -000 - ¤ 0M;¤-0M + ¤ elfu 0;¤ elfu -0 + ¤ elfu 0;¤ elfu -0 + ¤ elfu 00;¤ elfu -00 + ¤ elfu 00;¤ elfu -00 + ¤ elfu 000;¤ elfu -000 + ¤ elfu 000;¤ elfu -000 + ¤ 0M;¤ -0M ¤ 0M - ¤ 00M;¤M-00M - ¤ 00M;¤-00M - ¤ 000M;¤Milioni-000 + ¤ 00M;¤ -00M + ¤ 00M + ¤ 000M;¤ -000M ¤ 000M - ¤ 0B;¤-0B - ¤ 0B;¤-0B - ¤ 00B;¤-00B - ¤ 00B;¤-00B - ¤ 000B;¤-000B - ¤ 000B;¤-000B - ¤ 0T;¤-0T + ¤ 0B;¤ -0B + ¤ 0B;¤ -0B + ¤ 00B;¤ -00B + ¤ 00B;¤ -00B + ¤ 000B;¤ -000B + ¤ 000B;¤ -000B + ¤ 0T;¤ -0T ¤ 0T - ¤ 00T;¤-00T + ¤ 00T;¤ -00T ¤ 00T - ¤ 000T;¤-000T - ¤ 000T;¤-000T + ¤ 000T;¤ -000T + ¤ 000T {0} {1} @@ -3745,6 +3789,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dola ya Karibi Mashariki dola za Karibi Mashariki + + Guilder ya Karibe + Guilder ya Karibe + Guilder ya Karibe + Faranga ya Afrika Magharibi CFA faranga ya Afrika Magharibi CFA @@ -3781,6 +3830,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Dola ya Zimbabwe + + Dhahabu ya Zimbabwe + Dhahabu ya Zimbabwe + Dhahabu ya Zimbabwe + {0}+ @@ -3863,7 +3917,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimoli {0} kwa kila lita milimoli {0} kwa kila lita - + + vipande + kipande {0} + vipande {0} + + sehemu {0} kwa kila milioni sehemu {0} kwa kila milioni @@ -3875,6 +3934,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ permyriadi {0} permyriadi {0} + + ya glukosi + {0} ya glukosi + {0} ya glukosi + lita {0} kwa kilomita 100 lita {0} kwa kilomita 100 @@ -4072,6 +4136,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimita {0} ya zebaki milimita {0} za zebaki + + ya zebaki + {0} ya zebaki + {0} ya zebaki + pauni {0} kwa kila inchi mraba pauni {0} kwa kila inchi mraba @@ -4228,20 +4297,77 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kwati {0} ya Uingereza kwati {0} za Uingereza - - mwanga - mwanga {0} - mianga {0} + + steradian + steradian {0} + steradian {0} - + + katal + katal {0} + katal {0} + + + coulomb + coulomb {0} + coulomb {0} + + + farad + farad {0} + farad {0} + + + henry + henry {0} + henry {0} + + + siemens + siemens {0} + siemens {0} + + + calorie [IT] + calorie [IT] {0} + calorie [IT] {0} + + + bekereli + bekereli {0} + bekereli {0} + + + sievert + sievert {0} + sievert {0} + + + grei + grei {0} + grei {0} + + + kilogramu za kani + kilogramu za kani {0} + kilogramu za kani {0} + + + tesla + tesla {0} + tesla {0} + + + weber + weber {0} + weber {0} + + sehemu kwa kila bilioni sehemu {0} kwa kila bilioni sehemu {0} kwa kila bilioni - usiku - usiku {0} - usiku {0} {0} kila usiku @@ -4433,7 +4559,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kipengee {0} vipengee {0} - + + kipande + kipande {0} + kipande {0} + + sehemu kwa kila milioni ppm {0} ppm {0} @@ -4456,6 +4587,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ moli {0} moli {0} + + Glc + Glc {0} + Glc {0} + lita kwa kila kilomita lita {0} kwa kilomita @@ -4971,6 +5107,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmHg {0} mmHg {0} + + {0} ya Hg + {0} za Hg + pauni kwa kila inchi mraba psi {0} @@ -5213,12 +5353,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ qt Imp. {0} qt Imp. {0} + + sr {0} + sr {0} + + + kat {0} + kat {0} + + + C {0} + C {0} + + + F {0} + F {0} + + + H {0} + H {0} + + + S {0} + S {0} + + + cal-IT + cal-IT {0} + cal-IT {0} + + + Bq {0} + Bq {0} + + + Sv {0} + Sv {0} + + + Gy {0} + Gy {0} + + + kgf {0} + kgf {0} + + + T {0} + T {0} + + + Wb {0} + Wb {0} + mwanga mwanga {0} mianga {0} - + sehemu kwa bilioni @@ -5268,9 +5461,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmol {0}/L mmol {0}/L - + + kipande + kipande {0} + kipande {0} + + ppm + + Glc + Glc {0} + Glc {0} + L/100km {0} L/100km {0} @@ -5343,6 +5546,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Wati {0} Wati {0} + + Hg {0} + {0} za Hg + {0} inHg {0} inHg @@ -5358,20 +5565,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ °C - - mwanga - mwanga {0} - mianga {0} + + sr {0} + sr {0} - + + kat {0} + kat {0} + + + C {0} + C {0} + + + F {0} + F {0} + + + H {0} + H {0} + + + S {0} + S {0} + + + cal-IT + cal-IT {0} + cal-IT {0} + + + Bq {0} + Bq {0} + + + Sv {0} + Sv {0} + + + Gy {0} + Gy {0} + + + kgf {0} + kgf {0} + + + T{0} + T{0} + + + Wb{0} + Wb{0} + + sehemu kwa kila bilioni - - usiku - usiku {0} - usiku {0} - {0}/usiku - diff --git a/make/data/cldr/common/main/sw_KE.xml b/make/data/cldr/common/main/sw_KE.xml index 5ab87eb56a6..54b133ee29f 100644 --- a/make/data/cldr/common/main/sw_KE.xml +++ b/make/data/cldr/common/main/sw_KE.xml @@ -42,7 +42,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kiingereza cha Australia Kiingereza cha Kanada Kiingereza cha Uingereza - Kiingereza cha Uingereza Kiingereza cha Marekani Kiingereza cha Marekani) Kihispania cha Amerika Kusini @@ -221,7 +220,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bhutani Belarusi Visiwa vya Kokos (Keeling) - Kongo - Kinshasa Kepuvede Kurakao Keuta na Melilla @@ -505,13 +503,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Saa za Afghanistani - - - Saa za Afrika Magharibi - Saa za Wastani za Afrika Magharibi - Saa za Majira ya Joto za Afrika Magharibi - - Saa za Amazon @@ -989,29 +980,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic - #,##0.00;(#,##0.00) + #,##0.00 - ¤ M0;¤-M0 + ¤ elfu 0 + ¤ elfu 0 + ¤ elfu 0 + ¤ elfu 0 + ¤ elfu 00 + ¤ elfu 00 + ¤ elfu 00 + ¤ elfu 00 + ¤ elfu 000 + ¤ elfu 000 + ¤ elfu 000 + ¤ elfu 000 + ¤ M0 + ¤ M0 ¤ M0 - ¤ M00;¤M-M00 - ¤ M00;¤-M00 - ¤ M000;¤M-000 + ¤ M00 + ¤ M00 + ¤ M00 + ¤ M00 + ¤ M000 + ¤ M000 ¤ M000 - ¤ B0;¤-B0 - ¤ B0;¤-B0 - ¤ B00;¤-B00 - ¤ B00;¤-B00 - ¤ B000;¤-B000 - ¤ B000;¤-B000 - ¤ T0;¤-T0 + ¤ B0 + ¤ B0 + ¤ B0 + ¤ B0 + ¤ B00 + ¤ B00 + ¤ B00 + ¤ B00 + ¤ B000 + ¤ B000 + ¤ B000 + ¤ B000 + ¤ T0 + ¤ T0 ¤ T0 - ¤ T00;¤-T00 + ¤ T00 + ¤ T00 ¤ T00 - ¤ T000;¤-T000 - ¤ T000;¤-T000 + ¤ T000 + ¤ T000 + ¤ T000 + ¤ T000 diff --git a/make/data/cldr/common/main/syr.xml b/make/data/cldr/common/main/syr.xml index de89e87770a..e91005bc79f 100644 --- a/make/data/cldr/common/main/syr.xml +++ b/make/data/cldr/common/main/syr.xml @@ -34,7 +34,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܦܪܣܝܬ ܦܘܠܐܗܝܬ ܦܝܢܠܢܕܝܬ - ܦܝܠܝܦܝܢܝܬ + ܦܝܠܝܦܝܢܝܬ ܦܘܢܝܬ ܦܪܢܣܝܬ ܓܐܝܬ @@ -42,12 +42,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܓܘܓܐܪܝܬ ܥܒܪܐܝܬ ܗܢܕܝܐ + ܗܢܕܝܐ (ܪܗܘܡܝܐ) ܐܪܡܢܝܬ - ܐܢܕܘܢܝܬ + ܐܢܕܘܢܝܬ ܐܝܛܠܝܬ - ܝܦܢܝܐ + ܝܦܢܝܐ ܓܘܪܓܝܐܝܬ - ܟܘܪܐܝܬ + ܟܘܪܝܐܝܬ ܩܘܪܕܝܬ ܠܬܝܢܝܬ ܓܢܕܝܬ @@ -68,18 +69,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܣܘܝܕܐܝܬ ܣܘܐܗܝܠܐܝܬ ܣܘܪܝܝܐ - ܬܝܠܢܕܐܝܬ + ܬܝܠܢܕܐܝܬ ܬܘܪܟܝܬ ܐܘܟܪܐܝܢܐܝܬ ܠܫܢܐ ܠܐ ܝܕܝܥܐ ܐܘܪܕܘܝܬ ܒܝܬܢܐܡܐܝܬ ܝܕܝܬܝܬ - ܨܝܢܝܬ - ܨܝܢܝܬ (ܡܐܢܕܘܪܝܐ) - ܨܝܢܝܬ (ܦܫܝܛܐ) - ܨܝܢܝܬ (ܡܐܢܕܘܪܝܐ ܦܫܝܛܐ) - ܨܝܢܐܝܬ + ܨܝܢܐܝܬ + ܨܝܢܐܝܬ ܦܫܝܛܐ + ܨܝܢܐܝܬ ܝܘܒܠܝܐ @@ -87,58 +86,60 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + - - + + + + - + - - + + - - + + - ܬܐܒܝܠ + ܥܠܡܐ ܐܦܪܝܩܐ ܐܡܪܝܟܐ ܓܪܒܝܝܬܐ ܐܡܪܝܟܐ ܬܝܡܢܝܬܐ ܐܘܩܝܢܘܣܝܐ - ܐܦܪܝܩܐ ܡܥܪܒܝܬܐ + ܡܥܪܒ ܐܦܪܝܩܐ ܐܡܪܝܟܐ ܡܨܥܝܬܐ - ܐܦܪܝܩܐ ܡܕܢܚܝܬܐ - ܐܦܪܝܩܐ ܓܪܒܝܝܬܐ - ܐܦܪܝܩܐ ܡܨܥܝܬܐ - ܐܦܪܝܩܐ ܬܝܡܢܝܬܐ + ܡܕܢܚ ܐܦܪܝܩܐ + ܓܪܒܐ ܐܦܪܝܩܐ + ܡܨܥܬ ܐܦܪܝܩܐ + ܬܝܡܢ ܐܦܪܝܩܐ ܐܡܪ̈ܝܟܐ - ܓܪܒܝܐ ܐܡܪܝܟܐ - ܟܐܪܝܒܝܢ - ܐܣܝܐ ܡܕܢܚܝܬܐ - ܐܣܝܐ ܬܝܡܢܝܬܐ + ܓܪܒܐ ܐܡܪܝܟܐ + ܟܐܪܝܒܐ + ܡܕܢܚ ܐܣܝܐ + ܬܝܡܢ ܐܣܝܐ ܬܝܡܢ ܡܕܢܚ ܐܣܝܐ - ܐܘܪܘܦܐ ܬܝܡܢܝܬܐ + ܬܝܡܢ ܐܘܪܘܦܐ ܐܘܣܛܪܐܠܐܣܝܐ ܡܝܠܐܢܝܣܝܐ ܡܝܟܪܘܢܝܙܝܐ ܦܘܠܢܝܣܝܐ ܐܣܝܐ - ܐܣܝܐ ܡܨܥܝܬܐ - ܐܣܝܐ ܡܥܪܒܝܬܐ + ܡܨܥܬ ܐܣܝܐ + ܡܥܪܒ ܐܣܝܐ ܐܘܪܘܦܐ - ܐܘܪܘܦܐ ܡܕܢܚܝܬܐ - ܐܘܪܘܦܐ ܓܪܒܝܝܬܐ - ܐܘܪܘܦܐ ܡܥܪܒ݂ܝܬܐ - ܐܦܪܝܩܐ ܨܚܪܐ ܬܝܡܢܝܬܐ + ܡܕܢܚ ܐܘܪܘܦܐ + ܓܪܒܐ ܐܘܪܘܦܐ + ܡܥܪܒ ܐܘܪܘܦܐ + ܐܦܪܝܩܐ ܬܝܡܢ ܨܚܪܐ ܐܡܪܝܟܐ ܠܬܝܢܝܬܐ - ܓܙܪܬܐ ܕܐܣܝܢܫܘܢ + ܓܙܪܬܐ ܕܣܘܠܩܐ ܐܢܕܘܪܐ - ܐܡܝܪ̈ܘܬܐ ܡܚܝܕ̈ܬܐ ܥܪ̈ܒܝܐ + ܐܡܝܪ̈ܘܬܐ ܥܪ̈ܒܝܬܐ ܡܚܝ̈ܕܬܐ ܐܦܓܐܢܣܬܐܢ ܐܢܬܝܓܘܐ ܘܒܐܪܒܘܕܐ ܐܢܓܘܝܠܐ @@ -147,11 +148,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܐܢܓܘܠܐ ܐܢܬܪܬܝܟܐ ܐܪܓܢܬܝܢܐ - ܣܡܘܐ ܐܡܝܖ̈ܟܝܐ + ܣܡܘܐ ܐܡܪܝܟܝܬܐ ܐܘܣܛܪܝܐ ܐܘܣܬܪܠܝܐ ܐܪܘܒܐ - ܓܙܝܖ̈ܐ ܕܐܠܐܢܕ + ܓܙܪ̈ܬܐ ܕܐܠܐܢܕ ܐܙܪܒܝܓܐܢ ܒܘܣܢܐ ܘܗܪܬܣܓܘܒܝܢܐ ܒܪܒܐܕܘܣ @@ -162,11 +163,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܒܚܪܝܢ ܒܘܪܘܢܕܝ ܒܢܝܢ - ܡܪܬܝ ܒܪ ܬܘܠܡܝ - ܒܪܡܘܕܐ + ܡܪܝ ܒܪ ܬܘܠܡܝ + ܒܝܪܡܘܕܐ ܒܪܘܢܐܝ ܒܘܠܝܒܝܐ - ܟܐܪܝܒܝܢ ܕܢܝܬܝܪܠܐܢܕܣ + ܟܐܪܝܒܐ ܕܢܝܬܝܪܠܐܢܕܣ ܒܪܐܙܝܠ ܒܗܐܡܣ ܒܘܬܐܢ @@ -175,7 +176,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܒܠܐܪܘܣ ܒܠܝܙ ܟܢܕܐ - ܓܙܝܖ̈ܐ ܕܟܘܟܘܣ + ܓܙܪ̈ܬܐ ܕܟܘܟܘܣ ܟܘܢܓܘ - ܟܝܢܫܐܣܐ ܩܘܛܢܝܘܬܐ ܕܝܡܘܩܪܛܝܬܐ ܕܟܘܢܓܘ ܩܘܛܢܝܘܬܐ ܕܐܦܪܝܩܐ ܡܨܥܝܬܐ @@ -184,14 +185,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܣܘܝܣܪܐ ܩܘܛ ܕܝܒܘܐܪ ܣܘܦܐ ܕܓܪܡܦܝܠܐ - ܓܙܪܬܐ ܟܘܟ + ܓܙܪ̈ܬܐ ܟܘܟ ܬܫܝܠܝ ܟܐܡܪܘܢ ܨܝܢ ܟܘܠܘܡܒܝܐ - ܓܙܪܬܐ ܕܟܠܝܦܝܪܬܘܢ - ܟܘܣܬܐ ܪܝܩܐ - ܟܘܒܐ + ܓܙܪܬܐ ܕܟܠܝܦܝܪܬܘܢ + ܣܐܪܟ + ܟܘܣܬܐ ܪܝܟܐ + ܩܘܒܐ ܟܐܦ ܒܝܪܕܝ (ܪܝܫܐ ܝܘܪܩܐ) ܟܘܪܐܟܘ ܓܙܪܬܐ ܕܟܪܝܣܬܡܣ @@ -199,7 +201,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܬܫܝܟܝܐ ܬܫܝܟ ܐܠܡܢܝܐ - ܕܐܝܓܘ ܓܪܣܝܐ + ܕܝܐܓܘ ܓܐܪܣܝܐ ܓܝܒܘܛܝ ܕܐܢܡܐܪܩ ܕܘܡܝܢܝܩܐ @@ -217,10 +219,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܩܠܝܡܐ ܕܐܘܪܘ ܦܝܢܠܢܕ ܦܝܓܝ - ܓܙܪܬܐ ܕܦܠܟܠܢܕ - ܓܙܪܬܐ ܕܡܠܒܢܐܣ - ܐܬܪܘܬܐ ܦܕܪܠܝܐ ܕܡܝܩܪܘܢܝܣܝܐ - ܓܙܝܖ̈ܐ ܕܦܪܘ + ܓܙܪ̈ܬܐ ܕܦܠܟܠܢܕ + ܓܙܪ̈ܬܐ ܕܡܠܒܢܐܣ + ܐܬܪ̈ܘܬܐ ܦܕܪܠܝܐ ܕܡܝܩܪܘܢܝܣܝܐ + ܓܙܪ̈ܬܐ ܕܦܪܘ ܦܪܢܣܐ ܓܒܘܢ ܡܠܟܘܬܐ ܡܚܝܕܬܐ @@ -236,42 +238,43 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܓܘܐܕܘܠܘܦܐܝ ܓܝܢܝܐ ܫܘܝܬܐ ܝܘܢ - ܓܙܝܖ̈ܐ ܕܓܘܪܓܝܐ ܘܣܐܢܕܘܝܟ ܬܝܡܢܝ̈ܐ + ܓܙܪ̈ܬܐ ܕܓܘܪܓܝܐ ܘܣܐܢܕܘܝܟ ܬܝܡܢܝ̈ܐ ܓܘܐܬܝܡܐܠܐ ܓܘܐܡ ܓܝܢܝܐ ܒܝܣܐܘ ܓܘܝܐܢܐ ܗܘܢܓ ܟܘܢܓ - ܓܙܝܪ̈ܐ ܕܗܪܕ ܘܡܟܕܘܢܠܕ + ܓܙܪ̈ܬܐ ܕܗܪܕ ܘܡܟܕܘܢܠܕ ܗܘܢܕܘܪܣ ܩܪܘܐܛܝܐ ܗܐܝܬܝ ܡܓܪ - ܓܙܝܖ̈ܐ ܕܟܐܢܪܝ + ܓܙܝܪ̈ܐ ܕܟܐܢܪܝ ܐܝܢܕܘܢܝܣܝܐ ܐܝܪܠܢܕ ܐܝܣܪܐܝܠ ܓܙܪܬܐ ܕܡܐܢ ܗܢܕܘ - ܩܠܝܡܐ ܕܒܪܝܛܢܝܐ ܓܘ ܐܘܩܝܢܘܣ ܗܢܕܘܝܐ + ܐܬܪܐ ܕܐܘܩܝܢܘܣ ܗܢܕܘܝܐ ܕܒܪܝܛܢܝܐ + ܓܙܪ̈ܬܐ ܕܟܐܓܘܣ ܥܝܪܩ ܐܝܪܐܢ ܐܝܣܠܢܕ ܐܝܛܠܝܐ ܓܝܪܙܝ ܓܡܝܟܐ - ܐܘܪܕܘܢ + ܝܘܪܕܢܢ ܝܦܢ - ܩܝܢܝܐ + ܟܝܢܝܐ ܩܝܪܓܝܙܣܬܐܢ ܟܡܒܘܕܝܐ ܟܝܪܝܒܬܝ ܓܙܪܬܐ ܕܩܡܪ ܣܐܢܬ ܟܝܬܣ ܘܢܝܒܝܣ - ܟܘܪܝܐ ܕܓܪܒܝܐ - ܟܘܪܝܐ ܕܬܝܡܢܝܐ + ܟܘܪܝܐ ܓܪܒܝܝܬܐ + ܟܘܪܝܐ ܬܝܡܢܝܬܐ ܟܘܝܬ - ܓܙܝܖ̈ܐ ܕܟܐܝܡܐܢ + ܓܙܪ̈ܬܐ ܕܟܐܝܡܐܢ ܟܙܩܣܬܐܢ ܠܐܘܣ ܠܒܢܢ @@ -290,13 +293,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡܘܢܛܝܢܝܓܪܘ ܣܐܢܬ ܡܐܪܬܝܢ ܡܕܓܣܩܪ - ܓܙܪܬܐ ܡܐܪܫܐܠ + ܓܙܪ̈ܬܐ ܡܐܪܫܐܠ ܓܪܒܝ ܡܩܕܘܢܝܐ ܡܐܠܝ ܡܝܐܢܡܐܪ (ܒܘܪܡܐ) - ܡܘܢܓܘܠܝܐ - ܡܐܟܐܘ - ܓܙܝܖ̈ܐ ܕܡܪܝܢܐ ܓܪܒܝܐ + ܡܘܓܠܝܐ + ܐܬܪܐ ܡܕܒܪܢܝܐ ܦܪܝܫܐ ܕܡܐܟܐܘ + ܓܙܪ̈ܬܐ ܕܡܪܝܢܐ ܓܪ̈ܒܝܝܬܐ ܡܐܪܬܝܢܝܩ ܡܘܪܝܛܢܝܐ ܡܘܢܣܝܪܐܬ @@ -308,30 +311,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡܠܝܙܝܐ ܡܘܙܡܒܝܩ ܢܡܝܒܝܐ - ܢܝܘ ܟܠܝܕܘܢܝܐ + ܢܝܘ ܟܠܝܕܘܢܝܐ ܢܝܓܪ - ܓܙܪܬܐ ܕܢܘܪܦܠܟ + ܓܙܪܬܐ ܕܢܘܪܦܘܠܟ ܢܝܓܝܪܝܐ ܢܝܟܪܐܓܘܐ ܗܘܠܢܕܐ ܢܘܪܒܝܓ ܢܝܦܐܠ ܢܐܘܪܘ - ܢܘܥ + ܢܝܘܐܝ ܢܝܘ ܙܝܠܢܕ - ܐܬܝܐܐܪܐܘ ܢܝܘ ܙܝܠܢܕ + ܐܘܬܝܐܪܘܐ ܢܝܘ ܙܝܠܢܕ ܥܘܡܐܢ ܦܢܡܐ ܦܝܪܘ - ܦܘܠܝܢܝܣܝܐ ܦܪܢܣܝܐ + ܦܘܠܝܢܝܣܝܐ ܦܪܢܣܝܬܐ ܦܐܦܘܐ ܓܝܢܝܐ ܚܕܬܐ ܦܝܠܝܦܝܢܝܐ ܦܐܟܣܬܐܢ ܦܘܠܢܕ - ܣܐܢܬ ܦܝܥܪ ܘܡܩܘܠܘܢ - ܓܙܝܪ̈ܐ ܕܦܝܬܟܐܝܪܢ + ܡܪܝ ܦܛܪܘܣ ܘܡܝܩܝܠܘܢ + ܓܙܝܪ̈ܬܐ ܕܦܝܬܟܐܪܢ ܦܘܐܪܛܘ ܪܝܩܘ - ܐܬܖ̈ܘܬܐ ܕܦܠܣܛܝܢ + ܐܬܪ̈ܘܬܐ ܕܦܠܣܛܝܢ ܦܠܣܛܝܢ ܦܘܪܛܘܓܠ ܦܠܐܘ @@ -365,16 +368,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܣܘܪܝܐ ܐܣܘܐܛܝܢܝ ܣܘܐܙܝܠܢܕ - ܬܪܝܣܬܢ ܕܟܘܢܗܐ - ܓܙܝܖ̈ܐ ܕܬܘܪܟܣ ܘܟܐܝܟܘܣ + ܬܪܝܣܬܢ ܕܟܘܢܗܐ + ܓܙܝܪ̈ܐ ܕܬܘܪܟܣ ܘܟܐܝܟܘܣ ܬܫܐܕ - ܩܠܝܡ̈ܐ ܕܦܪܢܣܐ ܬܝܡܢܝܬܐ + ܐܬܪ̈ܘܬܐ ܬܝܡܢܝ̈ܬܐ ܕܦܪܢܣܐ ܬܘܓܘ ܬܐܝܠܢܕ ܬܐܓܝܟܣܬܐܢ - ܬܘܟܝܠܐܘ - ܬܝܡܘܪ-ܠܣܬܝ - ܬܝܡܘܪ ܡܕܢܚܐ + ܬܘܟܝܠܐܘ + ܡܕܢܚ ܬܝܡܘܪ ܬܘܪܟܡܢܣܬܐܢ ܬܘܢܣ ܬܘܢܓܐ @@ -385,7 +387,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܛܢܙܢܝܐ ܐܘܩܪܐܝܢܐ ܐܘܓܢܕܐ - ܓܙܝܪ̈ܐ ܪ̈ܚܝܩܐ ܕܐܘܚܕ̈ܢܐ ܡܚܝܕ̈ܐ + ܓܙܪ̈ܬܐ ܒܪ̈ܝܬܐ ܕܐܘܚܕ̈ܢܐ ܡܚܝܕ̈ܐ ܐܡ̈ܘܬܐ ܡܚܝ̈ܕܬܐ ܐܘܚܕ̈ܢܐ ܡܚܝܕ̈ܐ ܐܘܪܘܓܘܐܝ @@ -393,11 +395,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡܕܝܢܬܐ ܕܘܛܝܩܢ ܣܐܢܬ ܒܝܢܣܝܢܬ ܘܓܪܝܢܐܕܝܢܐܣ ܒܢܙܘܝܠܐ - ܓܙܖ̈ܝܐ ܒܬܘ̈ܠܐ ܕܒܪܝܛܢܝܐ - ܓܙܖ̈ܝܐ ܒܬܘ̈ܠܐ ܕܐܡܝܪܟܐ + ܓܙܪ̈ܬܐ ܕܒܬܘ̈ܠܐ ܕܒܪܝܛܢܝܐ + ܓܙܪ̈ܬܐ ܕܒܬܘ̈ܠܐ ܕܐܡܪܝܟܐ ܒܝܬܢܐܡ ܒܐܢܘܐܛܘ - ܘܝܠܝܣ ܘܦܘܬܘܢܐ + ܘܐܠܝܣ ܘܦܘܬܘܢܐ ܣܡܘܐ ܩܘܣܘܒܘ ܝܡܢ @@ -405,7 +407,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܬܝܡܢ ܐܦܪܝܩܐ ܙܐܡܒܝܐ ܙܝܡܒܐܒܘܝ - ܩܠܝܡܐ ܠܐ ܝܕܝܥܐ + ܐܬܪܐ ܠܐ ܝܕܝܥܐ ܣܘܪܓܕܐ @@ -423,10 +425,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܣܘܪܓܕܐ ܕܢܓܝ ܣܘܪܓܕܐ ܟܘܫܝܐ ܣܘܪܓܕܐ ܓܪܝܓܘܪܝܐ + ܓܪܝܓܘܪܝܐ ܣܘܪܓܕܐ ܝܗܘܕܝܐ ܣܘܪܓܕܐ ܐܘܡܬܢܝܐ ܗܢܕܘܝܐ - ܣܘܪܓܕܐ ܡܫܠܡܢܝܐ - ܣܘܪܓܕܐ ܡܫܠܡܢܝܐ ܡܕܝܢܝܐ + ܣܘܪܓܕܐ ܡܫܠܡܢܐ + ܣܘܪܓܕܐ ܡܫܠܡܢܐ + ܣܘܪܓܕܐ ܡܫܠܡܢܐ ܡܕܝܢܝܐ + ܣܘܪܓܕܐ ܡܫܠܡܢܐ ܡܕܝܢܝܐ ܣܘܪܓܕܐ ISO-8601 ܣܘܪܓܕܐ ܝܦܢܝܐ ܣܘܪܓܕܐ ܦܪܣܝܐ @@ -451,14 +456,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡܢܝ̈ܢܐ ܕܝܘܢܝ̈ܐ ܡܢܝ̈ܢܐ ܕܝܗܘܕܝ̈ܐ ܡܢܝ̈ܢܐ ܕܝܦܢܝ̈ܐ - ܡܢܝ̈ܢܐ ܡܥܪܒܝܐ + ܡܢܝ̈ܢܐ ܡܥܪ̈ܒܝܐ ܡܢܝ̈ܢܐ ܕܡܘܢܓܘܠܢܝ̈ܐ ܡܢܝ̈ܢܐ ܪܗܘܡܝܐ ܛܟܣܐ ܡܝܬܪܝܐ ܛܟܣܐ ܒܪܝܛܢܝܐ - ܛܟܣܐ ܐܡܝܪܟܐ + ܛܟܣܐ ܐܡܪܝܟܝܐ ܠܫܢܐ:‌ {0} @@ -474,9 +479,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic [݀ ݃ ݄ ݇ ݈ ݉ ݊ ݁ ݅ ݂ ݆ ܑ ܰ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ܼ ܽ ܾ ܿ ܃ ܄ ܅ ܆ ܇ ܈ ܉ ܁ ܂ ܀ ܊ ܋ ܌ ܍ ܐ ܒ ܓܔ ܖ ܕ ܗ ܘ ܙ ܚ ܛܜ ܝ ܞ ܟ ܠ ܡ ܢ ܣܤ ܥ ܦܧ ܨ ܩ ܪ ܫ ܬ] [܏\u200C\u200D ܭ ܮ ܯ ݍ ݎ ݏ] - [ܐ ܒ ܓ ܖ ܕ ܗ ܘ ܙ ܚ ܛ ܝ ܟ ܠ ܡ ܢ ܣ ܥ ܦ ܨ ܩ ܪ ܫ ܬ] - [\u061C\u200E \- ‑ , ٫ ٬ . % ٪ ‰ ؉ + 0٠ 1١ 2٢ 3٣ 4٤ 5٥ 6٦ 7٧ 8٨ 9٩] - [\- ‐‑ – — ، ؛ \: ܃ ܄ ܅ ܆ ܇ ܈ ! ؟ ܉ . … ܁ ܂ ܀ '‘’ "“” « » ( ) \[ \] ܊ ܋ ܌ ܍] + [ܐ ܒ ܓ ܖ ܕ ܗ ܘ ܙ ܚ ܛ ܝ ܟ ܠ ܡ ܢ ܣ ܥ ܦ ܨ ܩ ܪ ܫ ܬ] + [\u061C\u200E \- ‑ , ٫ ٬ . % ٪ ‰ ؉ + 0٠ 1١ 2٢ 3٣ 4٤ 5٥ 6٦ 7٧ 8٨ 9٩] + [\- ‐‑ – — ، ؛ \: ܃ ܄ ܅ ܆ ܇ ܈ ! ؟ ܉ . … ܁ ܂ ܀ '‘’ "“” « » ( ) \[ \] ܊ ܋ ܌ ܍] ؟ [\: ∶] @@ -748,8 +753,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܐ ܢ ܐ - ܬ - ܚ + ܚ + ܬ ܐ ܐ ܬ @@ -793,6 +798,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + ܏ܪ ܐ + ܏ܪ ܒ + ܏ܪ ܓ + ܏ܪ ܕ + ܪܘܒܥܐ ܩܕܡܝܐ ܪܘܒܥܐ ܬܪܝܢܐ @@ -800,6 +811,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܪܘܒܥܐ ܪܒܝܥܝܐ + + + ܏ܪ ܐ + ܏ܪ ܒ + ܏ܪ ܓ + ܏ܪ ܕ + + @@ -912,6 +931,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y G d ܒMMM y G EEEE، d ܒMMM y G + v HH܏ܫܥ dd/MM EEEE، dd/MM d ܒMMM @@ -1027,6 +1047,42 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + + ܡܘܚܪܡ + ܨܦܪ + ܪܒܝܥ ܩܕܡܝܐ + ܪܒܝܥ ܬܪܝܢܐ + ܓܘܡܕܐ ܩܕܡܝܐ + ܓܘܡܕܐ ܬܪܝܢܐ + ܪܓܒ + ܫܥܒܐܢ + ܪܡܨܐܢ + ܫܘܐܠ + ܕܘܠܩܥܕܗ + ܕܘܠܚܓܗ + + + + + ܡܘܚܪܡ + ܨܦܪ + ܪܒܝܥ ܩܕܡܝܐ + ܪܒܝܥ ܬܪܝܢܐ + ܓܘܡܕܐ ܩܕܡܝܐ + ܓܘܡܕܐ ܬܪܝܢܐ + ܪܓܒ + ܫܥܒܐܢ + ܪܡܨܐܢ + ܫܘܐܠ + ܕܘܠܩܥܕܗ + ܕܘܠܚܓܗ + + + + @@ -1036,7 +1092,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܫܢܬܐ ܐܫܬܩܕܝ ܗܕܐ ܫܢܬܐ - ܫܢܬܐ ܐܚܪܬܐ + ܫܢܬܐ ܕܐܬܝܐ ܒܚܕܐ ܫܢܬܐ ܒ{0} ܫܢܝ̈ܐ @@ -1046,6 +1102,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܫܢܝ̈ܐ + + ܏ܫܢ + ܏ܫܬܩܕ + ܗܕ ܏ܫܢ + ܏ܫܢ ܕܐܬܝܐ + + + ܏ܫܢ + ܏ܫܬܩܕ + ܗܕ ܏ܫܢ + ܏ܫܢ ܕܐܬܝܐ + ܪܘܒܥܐ ܕܫܢܬܐ ܪܘܒܥܐ ܕܥܒܪ @@ -1060,9 +1128,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܪ̈ܘܒܥܐ + + ܪܒܘܥ ܏ܫܢ + + + ܪܒܘܥ ܏ܫܢ + ܝܪܚܐ - ܝܪܚܐ ܕܕܥܒܪ + ܝܪܚܐ ܐܚܪܝܐ ܗܢܐ ܝܪܚܐ ܝܪܚܐ ܕܐܬܐ @@ -1075,15 +1149,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic + ܏ܝܪܚ + ܏ܝܪܚ ܏ܐܚܪ + ܗܢ ܏ܝܪܚ + ܏ܝܪܚ ܕܐܬܐ ܡ̣ܢ ܩܕܡ ܚܕ ܝܪܚܐ ܡ̣ܢ ܩܕܡ {0} ܝܖ̈ܚܐ + + ܏ܝܪܚ + ܏ܝܪܚ ܏ܐܚܪ + ܗܢ ܏ܝܪܚ + ܏ܝܪܚ ܕܐܬܐ + ܫܒܘܥܐ - ܫܒܘܥܐ ܕܕܥܒܪ - ܗܕܐ ܫܒܘܥܐ + ܫܒܘܥܐ ܐܚܪܝܐ + ܗܢܐ ܫܒܘܥܐ ܫܒܘܥܐ ܕܐܬܐ ܒܚܕ ܫܒܘܥܐ @@ -1096,19 +1180,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܫܒܘܥܐ ܕ{0} - ܫܒܐ + ܏ܫܒܘ + ܏ܫܒܘ ܏ܐܚܪ + ܗܢ ܏ܫܒܘ + ܏ܫܒܘ ܕܐܬܐ + ܏ܫܒܘ ܕ{0} + + + ܏ܫܒܘ + ܏ܫܒܘ ܏ܐܚܪ + ܗܢ ܏ܫܒܘ + ܏ܫܒܘ ܕܐܬܐ + ܏ܫܒܘ {0} ܫܒܘܥܐ ܕܝܪܚܐ - ܫܒܐ ܕܝܪܚܐ + ܫܒܘܥ ܝܪܚܐ + + + ܫܒܘܥ ܝܪܚܐ ܝܘܡܐ ܐܬܡܠܝ ܐܕܝܘܡ - ܝܘܡܐ ܕܐܬܐ + ܩܘܕܡܐ ܒܚܕ ܝܘܡܐ ܒ{0} ܝܘܡܢ̈ܐ @@ -1118,9 +1216,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܝܘܡܢ̈ܐ + + ܏ܝܘܡ + ܏ܬܡܠ + ܐܕܝܘܡ + ܏ܩܘܕܡ + + + ܏ܝܘܡ + ܏ܬܡܠ + ܐܕܝܘܡ + ܏ܩܘܕܡ + ܝܘܡܐ ܕܫܢܬܐ + + ܝܘܡ ܫܢܬܐ + ܝܘܡܐ ܕܫܒܘܥܐ @@ -1134,11 +1247,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܝܘܡܐ ܦܘܠܚܢܐ ܕܫܒܐ - ܚܕܒܫܒܐ ܕܕܥܒܪ - ܗܕܐ ܚܕܒܫܒܐ + ܚܕܒܫܒܐ ܐܚܪܝܐ + ܗܢܐ ܚܕܒܫܒܐ ܚܕܒܫܒܐ ܕܐܬܐ - ܒܚܕ ܚܕܒܫܒܐ + ܒ{0} ܚܕܒܫܒ̈ܐ ܒ{0} ܚܕܒܫܒ̈ܐ @@ -1242,6 +1355,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܫܥ̈ܐ + + ܏ܫܥ + + + ܏ܫܥ + ܩܛܝܢܬܐ ܗܢܐ ܩܛܝܢܬܐ @@ -1254,6 +1373,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܩܛܝ̈ܢܐ + + ܏ܩܛܝܢ + + + ܏ܩܛܝܢ + ܪܦܦܐ ܗܫܐ @@ -1266,27 +1391,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܡ̣ܢ ܩܕܡ {0} ܖ̈ܦܦܐ + + ܏ܪܦ + + + ܏ܪܦ + ܦܢܝܬܐ ܕܙܒܢܐ - ܥܕܢܐ {0} - ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ {0} - ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ {0} + ܥܕܢܐ ܕ{0} + ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕ{0} + ܥܕܢ {0} ܡܫܘܚܬܢܝܬܐ - ܥܕܢܘܬܐ ܬܒܠܝܬܐ ܡܛܟܘܣܬܐ + ܥܕܢܐ ܬܒܠܝܬܐ ܡܛܘܟܣܬܐ - ܡܕܝܢܬܐ ܠܐ ܝܕܥܝܬܐ + ܐܬܪܐ ܠܐ ܝܕܝܥܐ ܐܢܕܘܪܐ - ܕܘܒܐܝ + ܕܘܒܝ ܟܐܒܘܠ @@ -1451,10 +1582,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܦܘܪܬܘ-ܢܘܒܘ - ܡܪ ܒܪ ܬܘܠܡܝ + ܡܪܝ ܒܪ ܬܘܠܡܝ - ܒܝܪܡܝܘܕܐ + ܒܝܪܡܘܕܐ ܒܪܘܢܐܝ @@ -1595,7 +1726,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܒܠܐܢܟ-ܣܐܒܠܘܢ - ܡܪ ܝܘܚܢܢ + ܡܪܝ ܝܘܚܢܢ ܟܘܟܘܣ @@ -1613,7 +1744,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܒܪܐܙܐܒܝܠ - ܙܝܘܪܚ + ܙܝܘܪܟ ܐܒܕܓܢ @@ -1624,6 +1755,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܦܨܚܐ + + ܟܘܝܐܝܟܐ + ܦܘܢܬܐ ܥܪܝܢܣ @@ -1697,7 +1831,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܬܐܠܝܢ - ܩܐܗܖ̈ܗ + ܩܐܗܪܗ ܐܠ ܥܝܘܢ @@ -1746,7 +1880,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܒܪܝܛܢܝܐ + ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܒܪܝܛܢܝܐ ܠܘܢܕܘܢ @@ -1865,7 +1999,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܪܐܝܟܒܝܟ - ܪܘܡܝ + ܪܗܘܡܐ ܓܝܪܙܝ @@ -1888,7 +2022,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܦܢܘܡ ܦܢ - + ܟܐܢܬܘܢ @@ -2276,7 +2410,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܟܝܓܐܠܝ - ܪܝܐܕ + ܪܝܐܨ ܓܘܐܕܐܠܟܐܢܐܠ @@ -2498,7 +2632,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܘܐܬܝܩܐܢ - ܡܪ ܒܢܣܢܬ + ܡܪܝ ܒܢܣܢܬ ܟܐܪܐܟܣ @@ -2507,7 +2641,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܬܘܪܬܘܠܐ - ܡܪ ܬܐܘܡܐ + ܡܪܝ ܬܐܘܡܐ ܡܕܝܢܬܐ ܕܗܘ ܟܝ ܡܝܢ @@ -2565,9 +2699,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܕܡܥܪܒ ܐܦܪܝܩܐ - ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܡܥܪܒ ܐܦܪܝܩܐ - ܥܕܢܐ ܩܝܬܝܬܐ ܕܡܥܪܒ ܐܦܪܝܩܐ + ܥܕܢܐ ܕܡܥܪܒ ܐܦܪܝܩܐ @@ -2649,9 +2781,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܕܐܪܒܝܐ - ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܐܪܒܝܐ - ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܐܪܒܝܐ + ܥܕܢܐ ܕܐܪܒܝܐ + ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܐܪܒܝܐ + ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܐܪܒܝܐ @@ -2798,7 +2930,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܕܓܙܝܖ̈ܐ ܕܟܘܟܘܣ + ܥܕܢܐ ܕܓܙܝܪ̈ܐ ܕܟܘܟܘܣ @@ -2817,9 +2949,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܕܟܘܒܐ - ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܟܘܒܐ - ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܟܘܒܐ + ܥܕܢܐ ܕܩܘܒܐ + ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܩܘܒܐ + ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܩܘܒܐ @@ -2955,6 +3087,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܥܕܢܐ ܕܓܘܝܐܢܐ + + + ܥܕܢܐ ܡܫܘܚܬܢܝܬܐ ܕܗܐܘܐܝܝ ܐܠܘܫܝܢ + + ܥܕܢܐ ܕܗܐܘܐܝܝ ܐܠܘܫܝܢ @@ -3041,6 +3178,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܥܕܢܐ ܕܒܗܪ ܝܘܡܐ ܕܦܝܬܪܘܦܒܠܒܣܟܝ-ܟܐܡܟܬܣܟܝ + + + ܥܕܢܐ ܕܟܙܩܣܬܐܢ + + ܥܕܢܐ ܕܡܕܢܚ ܟܙܩܣܬܐܢ @@ -3060,7 +3202,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܥܕܢܐ ܟܘܣܪܐܝ + ܥܕܢܐ ܟܘܣܪܐܝ @@ -3490,21 +3632,314 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ܠܝܬ ܡܢܝܢܐ + ܠܝܬ ܡܢܝܢܐ {0} {1} {0} {1} + + ܕܪܗܡ ܕܐܪܡܢܝܐ + ܕܪܗܡ ܕܐܪܡܢܝܐ + ܕܪ̈ܗܡܐ ܕܐܪܡܢܝܐ + + + ܦܠܘܪܝܢ ܐܢܬܝܠܝܣܝܐ ܕܗܘܠܢܕܐ + ܦܠܘܪܝܢ ܐܢܬܝܠܝܣܝܐ ܕܗܘܠܢܕܐ + ܦܠܘܪ̈ܝܢܐ ܐܢܬܝܠܝܣܝܐ ܕܗܘܠܢܕܐ + + + ܦܝܣܘ ܕܐܪܓܢܬܝܢܐ + ܦܝܣܘ ܕܐܪܓܢܬܝܢܐ + ܦܝ̈ܣܘܣ ܕܐܪܓܢܬܝܢܐ + + + ܕܘܠܪ ܕܐܘܣܬܪܠܝܐ + ܕܘܠܪ ܕܐܘܣܬܪܠܝܐ + ܕܘܠܪ̈ܐ ܕܐܘܣܬܪܠܝܐ + + + ܦܠܘܪܝܢ ܕܐܪܘܒܐ + ܦܠܘܪܝܢ ܕܐܪܘܒܐ + ܦܠܘܪ̈ܝܢܐ ܕܐܪܘܒܐ + + + ܕܘܠܪ ܕܒܪܒܐܕܘܣ + ܕܘܠܪ ܕܒܪܒܐܕܘܣ + ܕܘܠܪ̈ܐ ܕܒܪܒܐܕܘܣ + + + ܕܝܢܪܐ ܕܒܚܪܝܢ + ܕܝܢܪܐ ܕܒܚܪܝܢ + ܕܝܢܪ̈ܐ ܕܒܚܪܝܢ + + + ܕܘܠܪ ܕܒܝܪܡܘܕܐ + ܕܘܠܪ ܕܒܝܪܡܘܕܐ + ܕܘܠܪ̈ܐ ܕܒܝܪܡܘܕܐ + + + ܕܘܠܪ ܕܒܪܘܢܐܝ + ܕܘܠܪ ܕܒܪܘܢܐܝ + ܕܘܠܪ̈ܐ ܕܒܪܘܢܐܝ + + + ܕܘܠܪ ܕܒܗܐܡܣ + ܕܘܠܪ ܕܒܗܐܡܣ + ܕܘܠܪ̈ܐ ܕܒܗܐܡܣ + + + ܕܘܠܪ ܕܒܠܝܙ + ܕܘܠܪ ܕܒܠܝܙ + ܕܘܠܪ̈ܐ ܕܒܠܝܙ + + + ܕܘܠܪ ܕܟܢܕܐ + ܕܘܠܪ ܕܟܢܕܐ + ܕܘܠܪ̈ܐ ܕܟܢܕܐ + + + ܝܘܐܢ ܕܨܝܢ + ܝܘܐܢ ܕܨܝܢ + ܝܘܐܢ̈ܐ ܕܨܝܢ + + + ܦܝܣܘ ܕܟܘܠܘܡܒܝܐ + ܦܝܣܘ ܕܟܘܠܘܡܒܝܐ + ܦܝ̈ܣܘܣ ܕܟܘܠܘܡܒܝܐ + + + ܟܘܠܘܢ ܕܟܘܣܬܐ ܪܝܟܐ + ܟܘܠܘܢ ܕܟܘܣܬܐ ܪܝܟܐ + ܟܘܠܘܢ̈ܐ ܕܟܘܣܬܐ ܪܝܟܐ + + + ܦܝܣܘ ܡܬܥܪܦܢܝܬܐ ܕܩܘܒܐ + ܦܝܣܘ ܡܬܥܪܦܢܝܬܐ ܕܩܘܒܐ + ܦܝ̈ܣܘܣ ܡܬܥܪ̈ܦܢܝܬܐ ܕܩܘܒܐ + + + ܦܝܣܘ ܕܩܘܒܐ + ܦܝܣܘ ܕܩܘܒܐ + ܦܝ̈ܣܘܣ ܕܩܘܒܐ + + + ܦܝܣܘ ܕܕܘܡܝܢܝܟܐܢ + ܦܝܣܘ ܕܕܘܡܝܢܝܟܐܢ + ܦܝ̈ܣܘܣ ܕܕܘܡܝܢܝܟܐܢ + + + ܕܝܢܪܐ ܕܓܙܐܪ + ܕܝܢܪܐ ܕܓܙܐܪ + ܕܝܢܪ̈ܐ ܕܓܙܐܪ + + + ܠܝܛܪܐ ܕܡܨܪܝܢ + ܠܝܛܪܐ ܕܡܨܪܝܢ + ܠܝܛܪ̈ܐ ܕܡܨܪܝܢ + + + ܐܘܪܘ + ܐܘܪܘ + ܐܘܪ̈ܘܣ + + + ܕܘܠܪ ܕܦܝܓܝ + ܕܘܠܪ ܕܦܝܓܝ + ܕܘܠܪ̈ܐ ܕܦܝܓܝ + + + ܠܝܛܪܐ ܕܓܙܪ̈ܬܐ ܕܦܠܟܠܢܕ + ܠܝܛܪܐ ܕܓܙܪ̈ܬܐ ܕܦܠܟܠܢܕ + ܠܝܛܪ̈ܐ ܕܓܙܪ̈ܬܐ ܕܦܠܟܠܢܕ + + + ܠܝܛܪܐ ܕܓܒܪܠܛܪ + ܠܝܛܪܐ ܕܓܒܪܠܛܪ + ܠܝܛܪ̈ܐ ܕܓܒܪܠܛܪ + + + ܟܝܬܙܠ ܕܓܘܐܬܝܡܐܠܐ + ܟܝܬܙܠ ܕܓܘܐܬܝܡܐܠܐ + ܟܝܬܙ̈ܠܐ ܕܓܘܐܬܝܡܐܠܐ + + + ܕܘܠܪ ܕܓܘܝܐܢܐ + ܕܘܠܪ ܕܓܘܝܐܢܐ + ܕܘܠܪ̈ܐ ܕܓܘܝܐܢܐ + + + ܕܘܠܪ ܕܗܘܢܓ ܟܘܢܓ + ܕܘܠܪ ܕܗܘܢܓ ܟܘܢܓ + ܕܘܠܪ̈ܐ ܕܗܘܢܓ ܟܘܢܓ + + + ܠܝܡܦܝܪܐ ܕܗܘܢܕܘܪܣ + ܠܝܡܦܝܪܐ ܕܗܘܢܕܘܪܣ + ܠܝܡܦܝܪ̈ܐ ܕܗܘܢܕܘܪܣ + + + ܓܘܪܕ ܕܗܐܝܬܝ + ܓܘܪܕ ܕܗܐܝܬܝ + ܓܘܪ̈ܕܐ ܕܗܐܝܬܝ + + + ܬܩܠܐ ܚܕܬܐ ܕܐܝܣܪܐܝܠ + ܬܩܠܐ ܚܕܬܐ ܕܐܝܣܪܐܝܠ + ܬܩ̈ܠܐ ܚܕ̈ܬܐ ܕܐܝܣܪܐܝܠ + + + ܕܝܢܪܐ ܕܥܝܪܐܩ + ܕܝܢܪܐ ܕܥܝܪܐܩ + ܕܝܢܪ̈ܐ ܕܥܝܪܐܩ + + + ܕܘܠܪ ܕܓܡܝܟܐ + ܕܘܠܪ ܕܓܡܝܟܐ + ܕܘܠܪ̈ܐ ܕܓܡܝܟܐ + + + ܕܝܢܪܐ ܕܝܘܪܕܢܢ + ܕܝܢܪܐ ܕܝܘܪܕܢܢ + ܕܝܢܪ̈ܐ ܕܝܘܪܕܢܢ + + + ܘܘܢ ܕܟܘܪܝܐ ܓܪܒܝܝܬܐ + ܘܘܢ ܕܟܘܪܝܐ ܓܪܒܝܝܬܐ + ܘܘܢ̈ܐ ܕܟܘܪܝܐ ܓܪܒܝܝܬܐ + + + ܘܘܢ ܕܟܘܪܝܐ ܬܝܡܢܝܬܐ + ܘܘܢ ܕܟܘܪܝܐ ܬܝܡܢܝܬܐ + ܘܘܢ̈ܐ ܕܟܘܪܝܐ ܬܝܡܢܝܬܐ + + + ܕܝܢܪܐ ܕܟܘܝܬ + ܕܝܢܪܐ ܕܟܘܝܬ + ܕܝܢܪ̈ܐ ܕܟܘܝܬ + + + ܕܘܠܪ ܕܓܙܪ̈ܬܐ ܕܟܐܝܡܐܢ + ܕܘܠܪ ܕܓܙܪ̈ܬܐ ܕܟܐܝܡܐܢ + ܕܘܠܪ̈ܐ ܕܓܙܪ̈ܬܐ ܕܟܐܝܡܐܢ + + + ܠܝܛܪܐ ܕܠܒܢܢ + ܠܝܛܪܐ ܕܠܒܢܢ + ܠܝܛܪ̈ܐ ܕܠܒܢܢ + + + ܕܝܢܪܐ ܕܠܘܒܐ + ܕܝܢܪܐ ܕܠܘܒܐ + ܕܝܢܪ̈ܐ ܕܠܘܒܐ + + + ܕܪܗܡ ܕܡܓܪܒ + ܕܪܗܡ ܕܡܓܪܒ + ܕܪ̈ܗܡܐ ܕܡܓܪܒ + + + ܕܝܢܪܐ ܕܡܩܕܘܢܝܐ + ܕܝܢܪܐ ܕܡܩܕܘܢܝܐ + ܕܝܢܪ̈ܐ ܕܡܩܕܘܢܝܐ + + + ܦܝܣܘ ܕܡܟܣܝܟܘ + ܦܝܣܘ ܕܡܟܣܝܟܘ + ܦܝ̈ܣܘܣ ܕܡܟܣܝܟܘ + + + ܩܘܪܕܘܒܝ ܕܢܝܟܐܪܐܓܘܐ + ܩܘܪܕܘܒܝ ܕܢܝܟܐܪܐܓܘܐ + ܩܘܪ̈ܕܘܒܐ ܕܢܝܟܐܪܐܓܘܐ + + + ܒܐܠܒܘܐ ܕܦܐܢܡܐ + ܒܐܠܒܘܐ ܕܦܐܢܡܐ + ܒܐܠܒܘ̈ܐ ܕܦܐܢܡܐ + + + ܦܝܣܘ ܕܦܝܠܝܦܝܐ + ܦܝܣܘ ܕܦܝܠܝܦܝܐ + ܦܝ̈ܣܘܣ ܕܦܝܠܝܦܝܐ + + + ܕܝܢܪܐ ܕܣܪܒܝܐ + ܕܝܢܪܐ ܕܣܪܒܝܐ + ܕܝܢܪ̈ܐ ܕܣܪܒܝܐ + + + ܕܘܠܪ ܕܓܙܪ̈ܬܐ ܕܫܠܝܡܘܢ + ܕܘܠܪ ܕܓܙܪ̈ܬܐ ܕܫܠܝܡܘܢ + ܕܘܠܪ̈ܐ ܕܓܙܪ̈ܬܐ ܕܫܠܝܡܘܢ + + + ܠܝܛܪܐ ܕܣܘܕܐܢ + ܠܝܛܪܐ ܕܣܘܕܐܢ + ܠܝܛܪ̈ܐ ܕܣܘܕܐܢ + + + ܕܘܠܪ ܕܣܝܢܓܐܦܘܪ + ܕܘܠܪ̈ܐ ܕܣܝܢܓܐܦܘܪ + ܕܘܠܪ̈ܐ ܕܣܝܢܓܐܦܘܪ + - ل.س.‏ + ܠܝܛܪܐ ܕܣܘܪܝܐ + ܠܝܛܪܐ ܕܣܘܪܝܐ + ܠܝܛܪ̈ܐ ܕܣܘܪܝܐ + ل.س.‏ + + + ܕܝܢܪܐ ܕܬܘܢܣ + ܕܝܢܪܐ ܕܬܘܢܣ + ܕܝܢܪ̈ܐ ܕܬܘܢܣ + + + ܠܝܛܪܐ ܕܬܘܪܟܝܐ + ܠܝܛܪܐ ܕܬܘܪܟܝܐ + ܠܝܛܪ̈ܐ ܕܬܘܪܟܝܐ + + + ܕܘܠܪ ܕܬܪܝܢܝܕܐܕ ܘܬܘܒܐܓܘ + ܕܘܠܪ ܕܬܪܝܢܝܕܐܕ ܘܬܘܒܐܓܘ + ܕܘܠܪ̈ܐ ܕܬܪܝܢܝܕܐܕ ܘܬܘܒܐܓܘ + + + ܕܘܠܪ ܕܐܘܚܕܢ̈ܐ ܡܚܘܝܕ̈ܐ + ܕܘܠܪ ܕܐܘܚܕܢ̈ܐ ܡܚܘܝܕ̈ܐ + ܕܘܠܪ̈ܐ ܕܐܘܚܕܢ̈ܐ ܡܚܘܝܕ̈ܐ + + + ܦܝܣܘ ܕܐܘܪܘܓܘܐܝ + ܦܝܣܘ ܕܐܘܪܘܓܘܐܝ + ܦܝ̈ܣܘܣ ܕܐܘܪܘܓܘܐܝ + + + ܕܘܢܓ ܕܒܝܬܢܐܡ + ܕܘܢܓ ܕܒܝܬܢܐܡ + ܕܘܢܓ̈ܐ ܕܒܝܬܢܐܡ + + + ܕܘܠܪ ܕܡܕܢܚ ܟܐܪܝܒܐ + ܕܘܠܪ ܕܡܕܢܚ ܟܐܪܝܒܐ + ܕܘܠܪ̈ܐ ܕܡܕܢܚ ܟܐܪܝܒܐ + + + ܦܠܘܪܝܢ ܕܩܘܒܐ + ܦܠܘܪܝܢ ܕܩܘܒܐ + ܦܠܘܪ̈ܝܢܐ ܕܩܘܒܐ + + + ܟܣܦܐ ܠܐ ܝܕܝܥܐ + (ܟܣܦܐ ܠܐ ܝܕܝܥܐ) + (ܟܣܦܐ ܠܐ ܝܕܝܥܐ) - ܝܠܐ ܝܠܗ ܥܬܝܕܐ - ܝܠ̈ܐ ܝܢܐ ܥܬܝܕ̈ܐ <RLM>{0} - ܫܩܘܠ ܦܬܠܐ ܕ{0} ܝܡܝܢܐ + ܚܕ ܝܘܡܐ + {0} ܝܘܡܢ̈ܐ + ܫܩܘܠ ܦܬܠܐ ܝܡܝܢܐ ܕ{0} @@ -3676,7 +4111,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ܚܕ ܡܠܘܐܐ {0} ܡܠܘܐ̈ܐ - + ܡܢܘ̈ܬܐ ܒܡܠܝܘܢ {0} ܡܢܬܐ ܒܡܠܝܘܢ {0} ܡܢܘ̈ܬܐ ܒܡܠܝܘܢ @@ -4292,7 +4727,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ܡܕܢܚܐ {0} ܓܪܒܝܐ {0} ܬܝܡܢܐ - {0} ܡܥܪܒ݂ܐ + {0} ܡܥܪܒܐ @@ -4491,7 +4926,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} °F - ܦܢܝܬܐ ܫܪܫܢܝܬܐ + ܦܢܝܬܐ + {0} ܏ܡܕܢ + {0} ܏ܓܪܒ + {0} ܏ܬܝܡ + {0} ܏ܡܥܪ @@ -4564,10 +5003,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ☉R - {0} ܡܕܢܚܐ - {0} ܓܪܒܝܐ - {0} ܬܝܡܢܐ - {0} ܡܥܪܒ݂ܐ + ܦܢܝܬܐ + {0} ܏ܡܕܢܚ + {0} ܏ܓܪܒܝ + {0} ܏ܬܝܡܢ + {0} ܏ܡܥܪܒ @@ -4607,10 +5047,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal} - {given-monogram-allCaps}.{given2-monogram-allCaps}.{surname-monogram-allCaps} + {given-monogram-allCaps}.{given2-monogram-allCaps}.{surname-monogram-allCaps}. - {given-informal-monogram-allCaps}.{surname-monogram-allCaps} + {given-informal-monogram-allCaps}.{surname-monogram-allCaps}. {title} {given} {given2-initial} {surname} @@ -4625,28 +5065,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-monogram-allCaps}.{surname-monogram-allCaps} + {given-monogram-allCaps}.{given2-monogram-allCaps}.{surname-monogram-allCaps}. - {title} {given-initial} {surname} + {title} {given-initial} {surname} {given-informal-initial}. {surname} - {title} {surname} + {title} {surname} {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-monogram-allCaps}.{surname-monogram-allCaps} + {given-monogram-allCaps}.{surname-monogram-allCaps}. {surname}، {given} {given2} @@ -4655,16 +5095,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {surname} {given-informal} - {title} {surname} + {title} {surname} {given-informal} - {surname-monogram-allCaps}.{given-monogram-allCaps}.{given2-monogram-allCaps} + {surname-monogram-allCaps}.{given-monogram-allCaps}.{given2-monogram-allCaps}. - {surname-monogram-allCaps}.{given-informal-monogram-allCaps} + {surname-monogram-allCaps}.{given-informal-monogram-allCaps}. {surname}، {given} {given2-initial} @@ -4679,10 +5119,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} {surname}، {given-initial} {given2-initial} @@ -4691,16 +5131,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic {surname} {given-initial} - {title} {surname} + {title} {surname} {given-informal} - {surname-monogram-allCaps} + {surname-monogram-allCaps} - {given-informal-monogram-allCaps} + {given-informal-monogram-allCaps} {surname-prefix} {surname-core}، {given} {given2} diff --git a/make/data/cldr/common/main/szl.xml b/make/data/cldr/common/main/szl.xml index 09b54dc4dae..1aee26a3e65 100644 --- a/make/data/cldr/common/main/szl.xml +++ b/make/data/cldr/common/main/szl.xml @@ -1831,9 +1831,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Biszkek - - Enderbury - Kōmory @@ -2195,9 +2192,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - zachodnioafrykański czas - zachodnioafrykański sztandardowy czas - zachodnioafrykański latowy czas + zachodnioafrykański czas @@ -2561,6 +2556,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gujana + + + Hawaje-Aleuty (sztandardowy czas) + + Hawaje-Aleuty @@ -2953,9 +2953,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ ¤ #,##0.00 + ¤ #,##0.00 @@ -3069,7 +3071,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimole na liter {0} milimola na liter - + czyńści na milijōn {0} czyńści na milijōn @@ -3681,7 +3683,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimole/liter {0} mmol/l - + czyńści/miliōn {0} cz/mln diff --git a/make/data/cldr/common/main/ta.xml b/make/data/cldr/common/main/ta.xml index 43a2779bebd..d03477a393b 100644 --- a/make/data/cldr/common/main/ta.xml +++ b/make/data/cldr/common/main/ta.xml @@ -242,7 +242,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ஐஸ்லேண்டிக் இத்தாலியன் இனுகிடூட் - ஜப்பானியம் + ஜாப்பனீஸ் லோஜ்பன் நகொம்பா மாசெம் @@ -289,6 +289,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ பாஃபியா கொலோக்னியன் குர்திஷ் + குர்திஷ் + குர்மாஞ்சி கும்யிக் குடேனை கொமி @@ -768,7 +770,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ லத்தீன் அமெரிக்கா அஷன்ஷியன் தீவு அன்டோரா - ஐக்கிய அரபு எமிரேட்ஸ் + ஐக்கிய அரபு அமீரகம் ஆஃப்கானிஸ்தான் ஆண்டிகுவா மற்றும் பார்புடா அங்கியுலா @@ -820,6 +822,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ சீனா கொலம்பியா கிலிப்பர்டன் தீவு + சார்க் கோஸ்டாரிகா கியூபா கேப் வெர்டே @@ -892,7 +895,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ஐஸ்லாந்து இத்தாலி ஜெர்சி - ஜமைகா + ஜமைக்கா ஜோர்டான் ஜப்பான் கென்யா @@ -926,7 +929,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மார்ஷல் தீவுகள் வடக்கு மாசிடோனியா மாலி - மியான்மார் (பர்மா) + மியான்மர் (பர்மா) மங்கோலியா மகாவ் எஸ்ஏஆர் சீனா மகாவ் @@ -1057,42 +1060,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நாள்காட்டி நாணய வடிவம் சின்னங்கள் வரிசைப்படுத்தலைப் புறக்கணி - நேர்மறையான உச்சரிப்பு வரிசைபடுத்துதல் - பெரெழுத்து/சிற்றெழுத்து வரிசைமுறை + தலைகீழ் உச்சரிப்பு வரிசைப்படுத்தல் + பேரெழுத்து/சிற்றெழுத்து வரிசைமுறை எழுத்து உணர்ந்து வரிசைபடுத்துதல் வரிசை முறை இயல்பாக்கப்பட்ட வரிசைபடுத்துதல் எண்முறை வரிசைபடுத்துதல் வரிசைப்படுத்தல் வலிமை நாணயம் + இமோஜி வெளிப்பாடு மணிநேர சுழற்சி (12, 24) வரி முறிப்பு ஸ்டைல் + வவ அளவீட்டு முறை எண்கள் + வமு நேர மண்டலம் மொழி மாறிலி தனிப்பட்ட பயன் புத்த நாள்காட்டி + பௌத்தம் சீன நாள்காட்டி + சீனம் காப்டிக் நாள்காட்டி + காப்டிக் டேங்கி நாள்காட்டி + டேங்கி எத்தியோப்பிய நாள்காட்டி + எத்தியோப்பிக் எத்தியோபிக் அமேதே ஆலெம் நாள்காட்டி + எத்தியோப்பிய அமீத்தி ஆலெம் கிரிகோரியன் நாள்காட்டி + கிரிகோரியன் ஹீப்ரு நாள்காட்டி - இந்திய தேச நாள்காட்டி + எபிரேயம் + இந்திய தேசிய நாள்காட்டி + இந்திய தேசியம் இஸ்லாமிய நாள்காட்டி + ஹிஜ்ரி இஸ்லாமிய சிவில் நாள்காட்டி + ஹிஜ்ரி(அட்டவணை, சிவில் இபோக்) இஸ்லாமிய வானியல் நாள்காட்டி + ஹிஜ்ரி(அட்டவணை, வானவியல் இபோக்) இஸ்லாமிய நாள்காட்டி (உம்-அல்-குரா) - ISO-8601 நாள்காட்டி + ஹிஜ்ரி (உம்முல் குறா) + கிரிகோரிய நாள்காட்டி ஜப்பானிய நாள்காட்டி + ஜப்பானியம் பாரசீக நாள்காட்டி + பாரசீகம் மின்கோ நாள்காட்டி + மின்குவோ கணக்கிடல் நாணய வடிவம் + கணக்கியல் நிலையான நாணய வடிவம் + வழக்கமானது சின்னங்களை வரிசைப்படுத்து சின்னங்களைப் புறக்கணித்து வரிசைப்படுத்து உச்சரிப்புகளை இயல்பாக வரிசைபடுத்து @@ -1102,18 +1126,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ முதலில் பேரெழுத்துகளை வரிசைப்படுத்து எழுத்து உணர்வின்றி வரிசைபடுத்து எழுத்து உணர்வில் வரிசைபடுத்து - பாரம்பரிய சீன வரிசை வடிவம் - Big5 முந்தைய வரிசை வடிவம், இணக்கத்தன்மைக்கு அகராதி வரிசை முறை இயல்புநிலை யுனிகோட் வரிசை முறை + இயல்புநிலை ஒருங்குறி ஐரோப்பிய வரிசைப்படுத்தல் விதிகள் - எளிமையாக்கப்பட்ட சீன வரிசை வடிவம் - GB2312 தொலைபேசி புத்தக வரிசை முறை ஒலியியல் வரிசைப்படுத்தல் முறை பின்யின் வரிசை முறை பொதுப்படையான தேடல் + தேடல் ஹங்குல் முதன்மை மெய்யெழுத்தின்படி தேடு நிலையான வரிசை முறை + வழக்கமானது ஸ்ட்ரோக் வரிசை முறை பாரம்பரிய வரிசை முறை ரேடியன் ஸ்ட்ரோக் வரிசை முறை @@ -1129,18 +1154,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ முழு அகலம் அரை அகலம் எண் + இயல்புநிலை + இமோஜி + வார்த்தை 12 மணிநேர முறைமை (0–11) + 12 (0–11) 12 மணிநேர முறைமை (1–12) + 12 (1–12) 24 மணிநேர முறைமை (0–23) + 24 (0–23) 24 மணிநேர முறைமை (1–24) + 24 (1–24) தளர்வான வரி முறிப்பு ஸ்டைல் + தளர்த்தியது சாதாரண வரி முறிப்பு ஸ்டைல் + இயல்பு கண்டிப்பான வரி முறிப்பு ஸ்டைல் + கடுமையானது + அனைத்தும் உடைத்தல் + அனைத்தும் தக்கவைத்தல் + இயல்பானது + வாக்கியங்களில் தக்கவைத்தல் யூஎஸ் பிஜிஎன் ஒலிபெயர்ப்பு யூஎன் ஜிஇஜிஎன் ஒலிபெயர்ப்பு மெட்ரிக் முறை + மெட்ரிக் இம்பீரியல் அளவீட்டு முறை + UK அமெரிக்க அளவீட்டு முறை + US அரபிய-இந்திய இலக்கங்கள் நீட்டிக்கப்பட்ட அரபிய-இந்திய இலக்கங்கள் ஆர்மேனியன் எண்கள் @@ -1152,8 +1194,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நிதி எண்கள் முழு-அகல இலக்கங்கள் ஜார்ஜியன் எண்கள் - கிரீக் எண்கள் - கிரீக் சிற்றெழுத்து எண்கள் + கிரேக்க எண்கள் + கிரேக்கச் சிற்றெழுத்து எண்கள் குஜராத்தி இலக்கங்கள் குர்முகி இலக்கங்கள் சீன பின்ன எண்கள் @@ -1174,7 +1216,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மீடீ மயக் இலக்கங்கள் மியான்மர் இலக்கங்கள் சொந்த இலக்கங்கள் - ஓல் சிக்கி இலக்கங்கள் + ஒல் சிக்கி இலக்கங்கள் ஒடியா இலக்கங்கள் ரோமன் எண்கள் ரோமன் சிற்றெழுத்து எண்கள் @@ -1185,6 +1227,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ திபெத்திய இலக்கங்கள் பாரம்பரிய எண்கள் வை இலக்கங்கள் + முடக்கம் + இயக்கம் மெட்ரிக் @@ -1202,13 +1246,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\u200C\u200D] [அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஞ ட ண த ந ப ம ய ர ல வ ழ ள ற ன] [\- ‑ , . % ‰ + 0௦ 1௧ 2௨ 3௩ 4௪ 5௫ 6௬ 7௭ 8௮ 9௯] + [{எண்கள்\-துணை}] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” ( ) \[ \] § @ * / \& # † ‡ ′ ″] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1639,20 +1681,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நான்காம் காலாண்டு - - - கா.1 - கா.2 - கா.3 - கா.4 - - - முதல் காலாண்டு - இரண்டாம் காலாண்டு - மூன்றாம் காலாண்டு - நான்காம் காலாண்டு - - @@ -1670,7 +1698,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நள். நண். - அதி. + காலை கா. மதி. பிற். @@ -1792,7 +1820,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d/M dd-MM, E dd-MM - d MMM d MMMM MMMM W -ஆம் வாரம் MMMM W -ஆம் வாரம் @@ -2092,17 +2119,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - காலா. + கா. இறுதி காலாண்டு இந்த காலாண்டு அடுத்த காலாண்டு - - {0} காலா. - {0} காலா. - - {0} காலா. முன் - {0} காலா. முன் + {0} கா. முன் + {0} கா. முன் @@ -2196,7 +2219,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நாள் - நேற்று முன் தினம் + நேற்று முன்தினம் நேற்று இன்று நாளை @@ -2448,13 +2471,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - முற்./பிற். + AM/PM - முற்பகல்/பிற்பகல் + AM/PM + + + AM/PM - மணி + மணிநேரம் இந்த ஒரு மணிநேரத்தில் {0} மணிநேரத்தில் @@ -2466,14 +2492,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - மணி. - - {0} மணி. - {0} மணி. - + ம. - {0} மணி. முன் - {0} மணி. முன் + {0} ம. முன் + {0} ம. முன் @@ -2533,14 +2555,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - விநா. - - {0} விநா. - {0} விநா. - + வி. - {0} விநா. முன் - {0} விநா. முன் + {0} வி. முன் + {0} வி. முன் @@ -2918,6 +2936,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ஈஸ்டர் + + கொயாய்கே + புன்டா அரீனாஸ் @@ -3183,9 +3204,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ஃப்னோம் பென் - எண்டர்பரி - - கேன்டன் @@ -3862,9 +3880,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - மேற்கு ஆப்பிரிக்க நேரம் - மேற்கு ஆப்பிரிக்க நிலையான நேரம் - மேற்கு ஆப்பிரிக்க கோடை நேரம் + மேற்கு ஆப்பிரிக்க நேரம் @@ -4247,6 +4263,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ கயானா நேரம் + + + ஹவாய்-அலேஷியன் நிலையான நேரம் + + ஹவாய்-அலேஷியன் நேரம் @@ -4673,7 +4694,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - தாய்பே நேரம் + தைவான் நேரம் தாய்பே நிலையான நேரம் தாய்பே பகலொளி நேரம் @@ -4700,6 +4721,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ சுக் நேரம் + + + துருக்கி நேரம் + துருக்கி தர நேரம் + துருக்கி கோடை நேரம் + + துர்க்மெனிஸ்தான் நேரம் @@ -4856,6 +4884,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + never + @@ -4867,6 +4898,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##,##0.00 + ¤ #,##,##0.00 #,##,##0.00 @@ -4877,34 +4909,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ¤ 0ஆ - ¤ 0ஆ - ¤ 00ஆ - ¤ 00ஆ - ¤ 000ஆ - ¤ 000ஆ - ¤ 0மி - ¤ 0மி - ¤ 00மி - ¤ 00மி - ¤ 000மி - ¤ 000மி - ¤ 0பி - ¤ 0பி + ¤0ஆ + ¤ 0ஆ + ¤0ஆ + ¤ 0ஆ + ¤00ஆ + ¤ 00ஆ + ¤00ஆ + ¤ 00ஆ + ¤000ஆ + ¤ 000ஆ + ¤000ஆ + ¤ 000ஆ + ¤0மி + ¤ 0மி + ¤0மி + ¤ 0மி + ¤00மி + ¤ 00மி + ¤00மி + ¤ 00மி + ¤000மி + ¤ 000மி + ¤000மி + ¤ 000மி + ¤0பி + ¤ 0பி ¤0பி - ¤ 0பி - ¤ 00பி - ¤ 00பி - ¤ 000பி - ¤ 000பி + ¤ 0பி + ¤00பி + ¤ 00பி + ¤00பி + ¤ 00பி + ¤000பி + ¤ 000பி ¤000பி - ¤ 000பி - ¤ 0டி - ¤ 0டி - ¤ 00டி - ¤ 00டி - ¤ 000டி - ¤ 000டி + ¤ 000பி + ¤0டி + ¤ 0டி + ¤0டி + ¤ 0டி + ¤00டி + ¤ 00டி + ¤00டி + ¤ 00டி + ¤000டி + ¤ 000டி + ¤000டி + ¤ 000டி @@ -4912,7 +4964,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - #,##,##0.00 + ¤ #,##0.00 + #,##0.00 @@ -5685,6 +5738,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ கிழக்கு கரீபியன் டாலர் கிழக்கு கரீபியன் டாலர்கள் + + கரீபியன் கில்டர் + கரீபியன் கில்டர் + கரீபியன் கில்டர் + மேற்கு ஆப்பிரிக்க CFA ஃப்ராங்க் மேற்கு ஆப்பிரிக்க CFA ஃப்ராங்க் @@ -5716,6 +5774,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ஸாம்பியன் குவாச்சா ஸாம்பியன் குவாச்சாக்கள் + + ஜிம்பாப்வே தங்கம் + ஜிம்பாப்வே தங்கம் + ஜிம்பாப்வே தங்கம் + {0}+ @@ -6016,7 +6079,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} உருப்படிகளை {0} உருப்படிகளுக்கு - + + பகுதிகள் + {0} பகுதி + {0} பகுதிகள் + + பகுதிகள்/மில்லியன் {0} பகுதி/மில்லியன் {0} பகுதி/மில்லியனில் @@ -6068,6 +6136,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} மோல்ஸை {0} மோல்ஸுக்கு + + குளுக்கோஸ் + {0} குளுக்கோஸ் + {0} குளுக்கோஸ் + லிட்டர்கள்/கிலோமீட்டர் {0} லிட்டர்/கிலோமீட்டர் @@ -6312,20 +6385,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} நாட்களுக்கு - மணிநேரங்கள் - {0} மணிநேரம் + மணிநேரம் + {0} ம. {0} மணிநேரத்தில் {0} மணிநேரத்தை {0} மணிநேரத்திற்கு - {0} மணிநேரங்கள் - {0} மணிநேரங்களில் - {0} மணிநேரங்களை - {0} மணிநேரங்களுக்கு + {0} ம. + {0} மணிநேரத்தில் + {0} மணிநேரத்தை + {0} மணிநேரத்திற்கு {0} / மணிநேரம் நிமிடங்கள் - {0} நிமிடம் + {0} நிமி. {0} நிமிடத்தில் {0} நிமிடத்தை {0} நிமிடத்திற்கு @@ -7012,6 +7085,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} மில்லிமீட்டர் பாதரசத்தை {0} மில்லிமீட்டர் பாதரசத்திற்கு + + பாதரசம் + {0} பாதரசம் + {0} பாதரசம் + பவுண்டுகள்/சதுர அங்குலம் {0} பவுண்டு/சதுர அங்குலம் @@ -7137,14 +7215,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ பியூஃபோர்ட் {0} - {0} டிகிரி + {0} டிகிரி வெப்பநிலை {0} டிகிரியில் {0} டிகிரியை {0} டிகிரிக்கு - {0} டிகிரீஸ் - {0} டிகிரீஸில் - {0} டிகிரீஸை - {0} டிகிரீஸுக்கு + {0} டிகிரி + {0} டிகிரியில் + {0} டிகிரியை + {0} டிகிரிக்கு டிகிரி செல்சியஸ் @@ -7332,6 +7410,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} மெட்ரிக் கோப்பைகளை {0} மெட்ரிக் கோப்பைகளுக்கு + + மெட்ரிக் திரவ அவுன்ஸ் + {0} மெட்ரிக் திரவ அவுன்ஸ் + {0} மெட்ரிக் திரவ அவுன்ஸ் + ஏக்கர் அடி {0} ஏக்கர் அடி @@ -7427,8 +7510,72 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} இம்பீரியல் குவார்ட் {0} இம்பீரியல் குவார்ட்ஸ் + + ஸ்டெரேடியன் + {0} ஸ்டெரேடியன் + {0} ஸ்டெரேடியன் + + + கட்டல்கள் + {0} கட்டல் + {0} கட்டல்கள் + + + கூலும் + {0} கூலும் + {0} கூலும் + + + ஃபாரட் + {0} ஃபாரட் + {0} ஃபாரட் + + + ஹென்றி + {0} ஹென்றி + {0} ஹென்றி + + + சீமென் + {0} சீமென் + {0} சீமென் + + + கலோரி [IT] + {0} கலோரி [IT] + {0} கலோரி-IT + + + பெக்கொரல் + {0} பெக்கொரல் + {0} பெக்கொரல் + + + சீவர்ட் + {0} சீவர்ட் + {0} சீவர்ட் + + + கிரே + {0} கிரே + {0} கிரே + + + கிலோகிராம் விசை + {0} கிலோகிராம் விசை + {0} கிலோகிராம் விசை + + + டெஸ்லா + {0} டெஸ்லா + {0} டெஸ்லா + + + வெபர் + வெபர் + {0} வெபர் + - ஒளிவேகம் {0} ஒளிவேகம் {0} ஒளிவேகத்தில் {0} ஒளிவேகத்தை @@ -7438,7 +7585,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ஒளிவேகத்தை {0} ஒளிவேகத்திற்கு - + பார்ட்ஸ்/பில்லியன் {0} பார்ட்ஸ்/பில்லியன் {0} பார்ட்ஸ்/பில்லியனில் @@ -7450,7 +7597,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} பார்ட்ஸ்/பில்லியனுக்கு - இரவுகள் {0} இரவு {0} இரவில் {0} இரவை @@ -7459,7 +7605,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} இரவுகளில் {0} இரவுகளை {0} இரவுகளுக்கு - {0}/இரவு கார்டினல் திசை @@ -7599,20 +7744,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ஆர்க்விநா. - கி.மீ.² - {0} கி.மீ.² - {0} கி.மீ.² - {0}/கி.மீ.² + {0} km² + {0} km² ஹெக்டேர் - {0} ஹெக். - {0} ஹெக். + {0} ha + {0} ha மீட்டர்கள்² - {0} மீ² - {0} மீ² + {0} m² + {0} m² {0}/மீ² @@ -7625,7 +7768,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ சதுர மைல்கள் {0} ச. மை. {0} ச. மை. - {0}/மை.² ஏக்கர் @@ -7673,7 +7815,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} உருப்படி {0} உருப்படி - + + பகுதி + {0} பகுதி + {0} பகுதி + + ப./மி. {0} ப./மி. {0} ப./மி. @@ -7692,6 +7839,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} மோல் {0} மோல் + + Glc + {0} Glc + {0} Glc + லி./கி.மீ. {0} லி./கி.மீ. @@ -7784,16 +7936,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/நா - மணிநேர. - {0} மணிநேரம் - {0} மணிநேரம் + மணிநேரம் + {0} ம. + {0} ம. {0} /ம.நே - நிமிட. - {0} நிமிடம் - {0} நிமிட - {0}/நிமிட + நிமி. + {0} நிமி. + {0} நிமி. + {0}/நிமி. விநாடிகள் @@ -7833,9 +7985,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} வோ. - கி.கலோ. - {0} கி.கலோ. - {0} கி.கலோ. + {0} kcal + {0} kcal கலோ. @@ -7848,19 +7999,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} கலோ. - கி.ஜூ. - {0} கி.ஜூ. - {0} கி.ஜூ. + கிலோஜூல் + {0} kJ + {0} kJ ஜூல் - {0} ஜூ. - {0} ஜூ. + {0} J + {0} J கி.வா-ம.நே. - {0} கி.வா.ம.நே. - {0} கி.வா.ம.நே. + {0} kWh + {0} kWh எலக்ட்ரான்வோல்ட் @@ -7882,8 +8033,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ நியூட்டன் - {0} நியூ - {0} நியூ + {0} N + {0} N கி.வா-ம.நே./100கி.மி. @@ -7891,24 +8042,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} கி.வா-ம.நே./100கி.மி. - ஜி.ஹெஸ். - {0} ஜி.ஹெஸ். - {0} ஜி.ஹெஸ். + {0} GHz + {0} GHz - மெ.ஹெஸ். - {0} மெ.ஹெஸ். - {0} மெ.ஹெஸ். + {0} MHz + {0} MHz - கி.ஹெஸ். - {0} கி.ஹெஸ். - {0} கி.ஹெஸ். + {0} kHz + {0} kHz - ஹெஸ். - {0} ஹெஸ். - {0} ஹெஸ். + {0} Hz + {0} Hz எம் @@ -7922,18 +8069,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மெகாபிக்சல்கள் - {0} எம்.பி - {0} எம்.பி + {0} MP + {0} MP - பிக். / செ.மீ - {0} பிக். / செ.மீ - {0} பிக். / செ.மீ + {0} ppcm + {0} ppcm - பிக். / அங். - {0} பிக். / அங். - {0} பிக். / அங். + {0} ppi + {0} ppi பு / செ.மீ @@ -7941,9 +8086,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} பு / செ.மீ - பு / அங். - {0} பு / அங். - {0} பு / அங். + dpi + {0} dpi + {0} dpi புள்ளி @@ -7979,9 +8124,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} மி.மீ. - μமீ. - {0} μமீ. - {0} μமீ. + {0} μm + {0} μm நா.மீ. @@ -7995,8 +8139,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மைல்கள் - {0} மை. - {0} மை. + {0} mi + {0} mi கெஜ. @@ -8011,14 +8155,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ அங்குலங்கள் - {0} அங். - {0} அங். {0}/அங். பு.நொ. - {0} பு.நொ. - {0} பு.நொ. + {0} pc + {0} pc ஒளி ஆண்டுகள் @@ -8026,9 +8168,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ஒ.ஆ. - வா.அ. - {0} வா.அ. - {0} வா.அ. + {0} au + {0} au பர் @@ -8041,9 +8182,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ஃபே. - க.மை. - {0} க.மை. - {0} க.மை. + {0} nmi + {0} nmi ஸ்.மை. @@ -8070,8 +8210,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ லூம. - {0} லூம. - {0} லூம. + {0} lm + {0} lm சூரிய ஒளிர்வுத்தன்மை @@ -8082,10 +8222,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ட. - கி.கி. - {0} கி.கி. - {0} கி.கி. - {0}/கி.கி. + {0} kg + {0} kg கிராம்கள் @@ -8094,14 +8232,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/கி. - மி.கி. - {0} மி.கி. - {0} மி.கி. + {0} mg + {0} mg - μகி - {0} μகி - {0} μகி + {0} μg + {0} μg டன் @@ -8115,14 +8251,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ பவு. - {0} பவு. + {0} lb {0} பவு. - {0}/பவு. அவு. - {0} அவு. - {0} அவு. + {0} oz + {0} oz {0}/அவு. @@ -8152,44 +8287,38 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} கிரைன் - கி.வாட். - {0} கி.வாட். - {0} கி.வாட். + {0} GW + {0} GW - மெ.வா. - {0} மெ.வா. - {0} மெ.வா. + {0} MW + {0} MW - கி.வா. - {0} கி.வா. - {0} கி.வா. + {0} kW + {0} kW வா. - {0} வா. - {0} வா. + {0} W + {0} W - மி.வா. - {0} மி.வா. - {0} மி.வா. + {0} mW + {0} mW - கு.தி. - {0} கு.தி. - {0} கு.தி. + {0} hp + {0} hp - பாத. மி.மீ. - {0} பாத. மி.மீ. - {0} பாத. மி.மீ. + mmHg + {0} mmHg + {0} mmHg - பாத. அங். - {0} பாத. அங். - {0} பாத. அங். + {0} inHg + {0} inHg பார் @@ -8198,28 +8327,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மி.பா. - {0} மி.பா. - {0} மி.பா. + {0} mbar + {0} mbar - பா. - {0} பா. - {0} பா. + {0} Pa + {0} Pa - ஹெ.பாஸ். - {0} ஹெ.பாஸ். - {0} ஹெ.பாஸ். + {0} hPa + {0} hPa - கிபா - {0} கிபா - {0} கிபா + {0} kPa + {0} kPa - மெபா - {0} மெபா - {0} மெபா + {0} MPa + {0} MPa கி.மீ./மணிநேரம் @@ -8242,24 +8367,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} நா. - பியூ. - பியூ. {0} - பியூ. {0} + B {0} + B {0} - டிகிரி செ. - {0}°செ. - {0}°செ. + {0}°C + {0}°C - டி. ஃபா. - {0}°ஃபா. - {0}°ஃபா. + {0}°F + {0}°F - கெல். - {0} கெல். - {0} கெல். + {0} K + {0} K ப.அடி @@ -8267,9 +8388,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ப.அடி - நியூ.மீ - {0} நியூ.மீ - {0} நியூ.மீ + {0} N⋅m + {0} N⋅m கிமீ³ @@ -8289,9 +8409,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/செ.மீ.³ - மை³ - {0} மை³ - {0} மை³ + {0} mi³ + {0} mi³ யா.³ @@ -8346,8 +8465,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ மெ.கோப்பை - {0} மெ.கோ. - {0} மெ.கோ. + {0} mc + {0} mc ஏக். அடி @@ -8446,15 +8565,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} குவாட். இம்பீ. {0} குவாட். இம்பீ. + + கட் + {0} kat + {0} kat + + + கலோரி-IT + {0} கலோரி [IT] + {0} கலோரி-IT + ஒளிவேகம் {0} ஒளிவேகம் {0} ஒளிவேகம் - + பார்ட்ஸ்/பில்லியன் {0} பார்ட்ஸ்/பில்லியன் - {0} பார்ட்ஸ்/பில்லியன் + {0} ppb இரவுகள் @@ -8500,29 +8629,43 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}″ - {0} ச.கிமீ. - {0} ச.கிமீ. + km² + {0} km² + {0} km² + {0}/km² + + + {0} ha + {0} ha - {0} ச.மீ. - {0} ச.மீ. + {0} m² + {0} m² {0}செ.மீ.² {0}செ.மீ.² + + mi² + {0} mi² + {0} mi² + {0}/mi² + யா² {0}யா² {0}யா² - ச.அ. + ft² + {0} ft² + {0} ft² அங்.² - {0}அங்.² - {0}அங்.² + {0} in² + {0} in² ட்யூனம் @@ -8546,7 +8689,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}உருப்படி {0}உருப்படி - + + பகுதி + {0} பகுதி + {0} பகுதி + + {0}ப./மி. {0}ப./மி. @@ -8563,6 +8711,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}மோல் {0}மோல் + + Glc + {0}லி./கி.மீ. {0}லி./கி.மீ. @@ -8668,7 +8819,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} நா - மணி + மணிநேரம் {0} ம.நே. {0} ம.நே. @@ -8701,7 +8852,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ஆம். - மி.ஆ. + mA {0}மி.ஆ. {0}மி.ஆ. @@ -8716,8 +8867,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}வோ. - {0}கி.கலோ. - {0}கி.கலோ. + kcal + {0} kcal + {0} kcal {0}கலோ. @@ -8728,16 +8880,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}கலோ. - {0}கி.ஜூ. - {0}கி.ஜூ. + kJ + {0} kJ + {0} kJ - {0}ஜூ. - {0}ஜூ. + {0} J + {0} J - {0}கி.வா.ம. - {0}கி.வா.ம. + kWh + {0} kWh + {0} kWh eV @@ -8758,9 +8912,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ப.வி - நியூ. - {0}நியூ. - {0}நியூ. + N + {0}N + {0}N கி.வா.ம./100கி.மி. @@ -8768,20 +8922,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}கி.வா.ம./100கி.மி. - {0}ஜி.ஹெ. - {0}ஜி.ஹெ. + GHz + {0} GHz + {0} GHz - {0}மெ.ஹெ. - {0}மெ.ஹெ. + MHz + {0} MHz + {0} MHz - {0}கி.ஹெ. - {0}கி.ஹெ. + kHz + {0} kHz + {0} kHz - {0}ஹெ. - {0}ஹெ. + Hz + {0} Hz + {0} Hz {0}எம் @@ -8792,25 +8950,28 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}பிக் - மெ.பிக். - {0}எம்.பி - {0}எம்.பி + MP + {0} MP + {0} MP - {0}பி/செ.மீ - {0}பி/செ.மீ + ppcm + {0} ppcm + {0} ppcm - {0}பி/அங். - {0}பி/அங். + ppi + {0} ppi + {0} ppi {0}பு/செ.மீ {0}பு/செ.மீ - {0}பு/அங். - {0}பு/அங். + dpi + {0} dpi + {0} dpi {0}புள்ளி @@ -8837,30 +8998,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}மி.மீ. - மை.மீ. - {0}μமீ. - {0}μமீ. + μm + {0} μm + {0} μm {0}நா.மீ. {0}நா.மீ. - மை. + mi + {0} mi + {0} mi அங். + {0}″ + {0}″ - {0}பு.நொ. - {0}பு.நொ. + {0} pc + {0} pc ஒ.ஆ. - {0}வா.அ. - {0}வா.அ. + au + {0} au + {0} au {0}பர் @@ -8871,8 +9037,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ஃபே. - {0}க.மை. - {0}க.மை. + nmi + {0} nmi + {0} nmi {0}அ.பு. @@ -8892,8 +9059,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ கே. - {0}லூம. - {0}லூம. + lm + {0} lm + {0} lm L☉ @@ -8905,24 +9073,36 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ட. + kg {0}கி.கி. {0}கி.கி. + {0}/kg கிராம் - {0}மி.கி. - {0}மி.கி. + mg + {0} mg + {0} mg - {0}μகி - {0}μகி + μg + {0} μg + {0} μg {0}டன் {0}டன் + + lb + {0}/lb + + + {0} oz + {0} oz + {0}அவு. டி. {0}அவு. டி. @@ -8951,49 +9131,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}கிரைன் - {0}கி.வாட். - {0}கி.வாட். + GW + {0} GW + {0} GW - {0}மெ.வா. - {0}மெ.வா. + MW + {0} MW + {0} MW + + + kW + {0} kW + {0} kW + + + {0} W + {0} W - {0}மி.வா. - {0}மி.வா. + mW + {0} mW + {0} mW - {0} கு.வே. - {0} கு.வே. + hp + {0} hp + {0} hp + + + mmHg + {0} mmHg + {0} mmHg பா. அங். - {0} பா.அங். - {0} பா.அங். + {0}″ Hg + {0}″ Hg {0}பார் {0}பார் + + {0} mb + {0} mb + {0}atm {0}atm - {0}பா. - {0}பா. + Pa + {0} Pa + {0} Pa - {0} ஹெ.பா. - {0} ஹெ.பா. + hPa + {0} hPa + {0} hPa - {0}கிபா - {0}கிபா + kPa + {0} kPa + {0} kPa - {0}மெபா - {0}மெபா + MPa + {0} MPa + {0} MPa கி.மீ./ம. @@ -9005,22 +9211,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}நா. - பியூ.{0} - பியூ.{0} + Bft + B {0} + B {0} - °செ + °C + {0}°C + {0}°C - °ஃபா + °F + {0}° + {0}° + + + K + {0} K + {0} K {0}ப.அடி {0}ப.அடி - {0}நியூ.மீ - {0}நியூ.மீ + N⋅m + {0}N⋅m + {0}N⋅m {0} க.கி.மீ. @@ -9035,8 +9252,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}செ.மீ.³ - {0} க.மை. - {0} க.மை. + mi³ + {0} mi³ + {0} mi³ {0}யா.³ @@ -9080,8 +9298,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}மெ.பி. - {0}மெ.கோ. - {0}மெ.கோ. + {0} mc + {0} mc {0}ஏக். அடி @@ -9163,21 +9381,24 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}கு. இம். {0}கு. இம். + + கட் + + + கலோரி-IT + - ஒளிவேகம் {0}ஒ.வே {0}ஒ.வே - + பா/பி {0} பா/பி {0} பா/பி - இரவுகள் {0} இ {0} இ - {0}/இரவு diff --git a/make/data/cldr/common/main/ta_MY.xml b/make/data/cldr/common/main/ta_MY.xml index f24cc219fb4..78b5b9c0c6c 100644 --- a/make/data/cldr/common/main/ta_MY.xml +++ b/make/data/cldr/common/main/ta_MY.xml @@ -49,6 +49,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/ta_SG.xml b/make/data/cldr/common/main/ta_SG.xml index 5e37f8039e7..e7d800f8602 100644 --- a/make/data/cldr/common/main/ta_SG.xml +++ b/make/data/cldr/common/main/ta_SG.xml @@ -49,6 +49,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ #,##0.00 + ¤ #,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/te.xml b/make/data/cldr/common/main/te.xml index cd6d965ae18..8c6003b89d8 100644 --- a/make/data/cldr/common/main/te.xml +++ b/make/data/cldr/common/main/te.xml @@ -53,7 +53,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ అజర్బైజాని అజెరి బాష్కిర్ - బాలుచి + బలూచి బాలినీస్ బసా బెలారుషియన్ @@ -168,7 +168,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ డారి ఫాంగ్ ఫాంటి - ఫ్యుల + ఫూలా ఫిన్నిష్ ఫిలిపినో ఫిజియన్ @@ -212,7 +212,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ హక్కా చైనీస్ హవాయియన్ దక్షిణ హైదా - హిబ్రూ + హీబ్రూ హిందీ హింగ్లీష్ హిలిగెనాన్ @@ -290,6 +290,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ బాఫియ కొలోనియన్ కుర్దిష్ + కర్డిష్ + కర్మాంజి కుమ్యిక్ కుటేనై కోమి @@ -425,7 +427,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ప్రష్యన్ ప్రాచీన ప్రోవెంసాల్ పాష్టో - పుష్టో పోర్చుగీస్ బ్రెజీలియన్ పోర్చుగీస్ యూరోపియన్ పోర్చుగీస్ @@ -770,7 +771,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఆండోరా యునైటెడ్ అరబ్ ఎమిరేట్స్ ఆఫ్ఘనిస్తాన్ - ఆంటిగ్వా మరియు బార్బుడా + ఆంటిగ్వా & బార్బుడా ఆంగ్విల్లా అల్బేనియా ఆర్మేనియా @@ -783,7 +784,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ అరుబా ఆలాండ్ దీవులు అజర్బైజాన్ - బోస్నియా మరియు హెర్జిగోవినా + బోస్నియా & హెర్జిగోవినా బార్బడోస్ బంగ్లాదేశ్ బెల్జియం @@ -820,6 +821,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ చైనా కొలంబియా క్లిప్పర్టన్ దీవి + సార్క్ కోస్టా రికా క్యూబా కేప్ వెర్డె @@ -854,7 +856,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఫ్రాన్స్‌ గేబన్ యునైటెడ్ కింగ్‌డమ్ - యు.కె. + UK గ్రెనడా జార్జియా ఫ్రెంచ్ గియానా @@ -872,7 +874,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ గ్వామ్ గినియా-బిస్సావ్ గయానా - హాంకాంగ్ ఎస్ఏఆర్ చైనా + హాంకాంగ్ SAR చైనా హాంకాంగ్ హెర్డ్ దీవి మరియు మెక్‌డొనాల్డ్ దీవులు హోండురాస్ @@ -899,7 +901,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ కంబోడియా కిరిబాటి కొమొరోస్ - సెయింట్ కిట్స్ మరియు నెవిస్ + సెయింట్ కిట్స్ & నెవిస్ ఉత్తర కొరియా దక్షిణ కొరియా కువైట్ @@ -927,7 +929,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మాలి మయన్మార్ మంగోలియా - మకావ్ ఎస్ఏఆర్ చైనా + మకావ్ SAR చైనా మకావ్ ఉత్తర మరియానా దీవులు మార్టినీక్ @@ -941,7 +943,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మలేషియా మొజాంబిక్ నమీబియా - క్రొత్త కాలెడోనియా + కొత్త కాలెడోనియా నైజర్ నార్ఫోక్ దీవి నైజీరియా @@ -999,7 +1001,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఈస్వాటిని స్వాజిల్యాండ్ ట్రిస్టన్ డ కన్హా - టర్క్స్ మరియు కైకోస్ దీవులు + టర్క్స్ & కైకోస్ దీవులు చాద్ ఫ్రెంచ్ దక్షిణ ప్రాంతాలు టోగో @@ -1018,7 +1020,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ టాంజానియా ఉక్రెయిన్ ఉగాండా - సంయుక్త రాజ్య అమెరికా బయట ఉన్న దీవులు + U.S. బయట ఉన్న దీవులు యునైటెడ్ నేషన్స్ యు.ఎన్ యునైటెడ్ స్టేట్స్ @@ -1071,35 +1073,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ సంఖ్యాత్మక క్రమబద్ధీకరణ క్రమబద్ధీకరణ సామర్థ్యం కరెన్సీ + ఎమోజీ ప్రెజెంటేషన్ గంటల పద్ధతి (12 వర్సెస్ 24) లైన్ బ్రేక్ శైలి + పదాల మధ్య లైన్ బ్రేక్స్ కొలమాన పద్ధతి సంఖ్యలు + సంక్షిప్తీకరణ తర్వాత వాక్య విరామం సమయ మండలి లొకేల్ రూపాంతరం ప్రైవేట్-ఉపయోగం బుద్ధుల క్యాలెండర్‌ + బుద్ధులు చైనీస్ క్యాలెండర్ + చైనీస్ కాప్టిక్ క్యాలెండర్ + కాప్టిక్ దాంగీ క్యాలెండర్ - ఎథియోపిక్ క్యాలెండర్ - ఎథోపిక్ అమేటే అలెమ్ క్యాలెండర్ + దాంగీ + ఇథియోపియన్ క్యాలెండర్ + ఇథియోపిక్ + ఇథియోపియన్ అమెటె ఆలెమ్ క్యాలెండర్ + ఇథియోపిక్ అమటే ఆలెమ్ గ్రేగోరియన్ క్యాలెండర్ + గ్రేగోరియన్ హీబ్రూ క్యాలెండర్ - భారతీయ జాతీయ క్యాలెండర్ + హీబ్రూ + భారతదేశ జాతీయ క్యాలెండర్ + భారతదేశ జాతీయం ఇస్లామిక్ క్యాలెండర్ + ఇస్లామిక్ ఇస్లామిక్-సివిల్ క్యాలెండర్ + ఇస్లామిక్ (సివిల్) ఇస్లామిక్ క్యాలెండర్ (సౌదీ అరేబియా) ఇస్లామిక్ క్యాలెండర్ - ఇస్లామిక్ క్యాలెండర్ (ఉమ్ అల్-ఖురా) + ఇస్లామిక్ క్యాలెండర్ (ఉమ్ అల్-ఖురా) + ఇస్లామిక్ (ఉమ్ అల్-ఖురా) ISO-8601 క్యాలెండర్ - జపానీయుల క్యాలెండర్ + జపనీస్ క్యాలెండర్ + జపనీస్ పర్షియన్ క్యాలెండర్ + పర్షియన్ మింగ్యూ క్యాలెండర్ + మీన్‌గ్వా అకౌంటింగ్ కరెన్సీ ఫార్మాట్ + అకౌంటింగ్ ప్రామాణిక కరెన్సీ ఫార్మాట్ + ప్రామాణికం చిహ్నాలను క్రమబద్ధీకరించు చిహ్నాలను విస్మరించడాన్ని క్రమబద్ధీకరించు ఉచ్ఛారణలను సాధారణంగా క్రమబద్ధీకరించు @@ -1109,18 +1131,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ముందు అప్పర్‌కేస్‌ని క్రమబద్ధీకరించు కేస్ ఇన్‌సెన్సిటివ్‌ను క్రమబద్ధీకరించు కేస్ సెన్సిటివ్‌ని క్రమబద్ధీకరించు - సాంప్రదాయ చైనీస్ క్రమబద్ధీకరణ క్రమం - Big5 మునుపటి క్రమబద్ధీకరణ క్రమం, అనుకూలం నిఘంటువు క్రమబద్ధీకరణ క్రమం డిఫాల్ట్ యూనీకోడ్ క్రమబద్ధీకరణ క్రమం + డిఫాల్ట్ యూనికోడ్ యురోపియన్ క్రమబద్ధీకరణ నిబంధనలు - సరళీకృత చైనీస్ క్రమబద్ధీకరణ క్రమం - GB2312 ఫోన్‌బుక్ క్రమబద్ధీకరణ క్రమం ధ్వని ఉచ్ఛారిత క్రమబద్ధీకరణ క్రమం పిన్‌యిన్ క్రమబద్ధీకరణ క్రమం సాధారణ-ప్రయోజన శోధన + శోధన హాంగుల్ ప్రారంభ హల్లు ద్వారా శోధించు ప్రామాణిక క్రమబద్ధీకరణ క్రమం + ప్రామాణికం స్ట్రోక్ క్రమబద్ధీకరణ క్రమం సాంప్రదాయ క్రమబద్ధీకరణ క్రమం రాడికల్-స్ట్రోక్ క్రమబద్ధీకరణ క్రమం @@ -1136,18 +1159,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ పూర్తి వెడల్పు సగం వెడల్పు సంఖ్య + డిఫాల్ట్ + ఎమోజీ + టెక్స్ట్ 12 గంటల పద్ధతి (0–11) + 12 (0–11) 12 గంటల పద్ధతి (1–12) + 12 (1–12) 24 గంటల పద్ధతి (0–23) + 24 (0–23) 24 గంటల పద్ధతి (1–24) + 24 (1–24) అపక్రమ లైన్ బ్రేక్ శైలి + అపక్రమం సాధారణ లైన్ బ్రేక్ శైలి + సాధారణం క్రమ లైన్ బ్రేక్ శైలి + క్రమం + మొత్తం విభజించండి + మొత్తం అలాగే ఉంచండి + సాధారణం + పదబంధాలలో అలాగే ఉంచండి US BGN ట్రాన్స్‌లిటరేషన్ UN GEGN ట్రాన్స్‌లిటరేషన్ మెట్రిక్ పద్ధతి + మెట్రిక్ ఇంపీరియల్ కొలమాన పద్ధతి + UK యు.ఎస్. కొలమాన పద్ధతి + US అరబిక్-ఇండిక్ అంకెలు పొడిగించబడిన అరబిక్-ఇండిక్ అంకెలు ఆర్మేనియన్ సంఖ్యలు @@ -1192,6 +1232,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ టిబిటన్ అంకెలు సాంప్రదాయ సంఖ్యలు వాయ్ అంకెలు + ఆఫ్ + ఆన్ దశాంశం @@ -1209,6 +1251,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\u200C\u200D ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯] [అ ఆ ఇ ఈ ఉ ఊ ఋ ౠ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల వ శ ష స హ ళ] [\- ‑ , . % ‰ + 0౦ 1౧ 2౨ 3౩ 4౪ 5౫ 6౬ 7౭ 8౮ 9౯] + [౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯] [\- ‑ , ; \: ! ? . '‘’ "“” ( ) \[ \] \{ \} \& #] [₹ {రూ} {రూ.} {Rp} {Rs}₨] @@ -1293,11 +1336,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1} {0}కి + {1} {0} + + {1} {0}కి + @@ -1313,10 +1362,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E B h B E h:mm B E h:mm:ss E d y G + G M/y + G d/M/y, E MMM y G d, MMM y G E, d, MMM y G @@ -1528,10 +1580,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ సాయంత్రం రాత్రి - - - సా - @@ -1605,6 +1653,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0}కి + + {1} {0}కి + @@ -1613,6 +1664,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0}కి + + {1} {0}కి + @@ -1625,6 +1679,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + E B h + G M/y + G d/M/y, E G MMM y G d, MMM y G, d MMM, y, E @@ -1969,7 +2026,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నెలలో వారం - దినం + రోజు మొన్న నిన్న ఈ రోజు @@ -1984,11 +2041,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} రోజుల క్రితం + + రోజు + రోజు - సంవత్సరంలో దినం + సంవత్సరంలో రోజు + + + సంవత్సరంలో రోజు + + + సంవత్సరంలో రోజు వారంలో రోజు @@ -2303,7 +2369,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} సమయం - {0} పగటి వెలుతురు సమయం + {0} పగటి కాంతి సమయం {0} ప్రామాణిక సమయం హోనోలులు @@ -2314,7 +2380,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - తెలియని నగరం + తెలియని లొకేషన్ అండోరా @@ -2443,10 +2509,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ బ్రిస్‌బెయిన్ - మకారీ + మకారీ దీవి - లార్డ్ హౌ + లార్డ్ హౌ దీవి అరుబా @@ -2632,7 +2698,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ సెయింట్ జాన్స్ - కోకోస్ + కోకోస్ దీవులు కిన్షాసా @@ -2658,6 +2724,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఈస్టర్ + + కొయాయ్కె + పుంటా అరీనస్ @@ -2689,7 +2758,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ కురాకవో - క్రిస్మస్ + క్రిస్మస్ దీవి నికోసియా @@ -2707,7 +2776,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ బెర్లిన్ - డిజ్బౌటి + జిబూటి కోపెన్హాగన్ @@ -2923,10 +2992,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నోమ్‌పెన్హ్ - ఎండర్బెరీ - - - కాంతోన్ + క్యాంటన్ దీవి కిరీటిమాటి @@ -3127,7 +3193,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నియామే - నోర్ఫోక్ + నార్ఫక్ దీవి లాగోస్ @@ -3151,7 +3217,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నియూ - చాథమ్ + చాథమ్ దీవులు ఆక్లాండ్ @@ -3436,7 +3502,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మిడ్వే - వేక్ + వేక్ దీవి అడాక్ @@ -3553,7 +3619,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఇఫేట్ - వాల్లిస్ + వాల్లిస్ & ఫ్యూటునా ఏపియా @@ -3602,9 +3668,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - పశ్చిమ ఆఫ్రికా సమయం - పశ్చిమ ఆఫ్రికా ప్రామాణిక సమయం - పశ్చిమ ఆఫ్రికా వేసవి సమయం + పశ్చిమ ఆఫ్రికా సమయం @@ -3665,9 +3729,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ఏపియా సమయం - ఏపియా ప్రామాణిక సమయం - ఏపియా పగటి సమయం + సమోవా సమయం + సమోవా ప్రామాణిక సమయం + సమోవా పగటి వెలుతురు సమయం @@ -3787,7 +3851,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - బ్రూనే దరుసలామ్ సమయం + బ్రూనై దారుసలామ్ సమయం @@ -3987,6 +4051,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ గయానా సమయం + + + హవాయ్-అల్యూషియన్ ప్రామాణిక సమయం + + హవాయ్-అల్యూషియన్ సమయం @@ -4129,7 +4198,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ లార్డ్ హోవ్ సమయం లార్డ్ హోవ్ ప్రామాణిక సమయం - లార్డ్ హోవ్ పగటి సమయం + లార్డ్ హోవ్ పగటి వెలుతురు సమయం @@ -4244,7 +4313,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నార్ఫోక్ దీవి సమయం నార్ఫోక్ దీవి ప్రామాణిక సమయం - నార్ఫోక్ దీవి పగటి సమయం + నార్ఫోక్ దీవి పగటి వెలుతురు సమయం @@ -4335,7 +4404,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ప్యోంగాంగ్ సమయం + ఉత్తర కొరియా సమయం @@ -4413,9 +4482,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - తైపీ సమయం - తైపీ ప్రామాణిక సమయం - తైపీ పగటి వెలుతురు సమయం + తైవాన్ సమయం + తైవాన్ ప్రామాణిక సమయం + తైవాన్ పగటి వెలుతురు సమయం @@ -4440,6 +4509,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ చక్ సమయం + + + టర్కీ సమయం + టర్కీ ప్రామాణిక సమయం + టర్కీ వేసవి సమయం + + తుర్క్‌మెనిస్తాన్ సమయం @@ -4602,12 +4678,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + never + ¤#,##,##0.00 - ¤ #,##,##0.00 - #,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4802,8 +4881,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ కెనడియన్ డాలర్‌లు - కొంగోలిస్ ఫ్రాంక్ - కొంగోలిస్ ఫ్రాంక్ + కాంగోలీస్ ఫ్రాంక్ + కాంగోలీస్ ఫ్రాంక్ కొంగోలిస్ ఫ్రాంక్‌లు @@ -4820,7 +4899,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ చైనీస్ యువాన్ (ఆఫ్‌షోర్) - చైనా దేశ యువాన్ + చైనీస్ యువాన్ + చైనీస్ యువాన్ + చైనీస్ యువాన్ కొలంబియన్ పెసో @@ -4888,9 +4969,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఇథియోపియన్ బర్‌లు - యురొ - యురొ - యురోలు + యూరో + యూరో + యూరోలు ఫీజియన్ డాలర్ @@ -4934,8 +5015,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ గ్యుటెమాలన్ క్వెట్‌జల్ - గ్యుటెమాలన్ క్వెట్‌జల్ - గ్యుటెమాలన్ క్వెట్‌జల్‌లు + గ్వాటెమాలన్ క్వెట్‌జల్ + గ్వాటెమాలన్ క్వెట్‌జల్‌లు గుయనియాస్ డాలర్ @@ -4948,9 +5029,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ హాంకాంగ్ డాలర్‌లు - హోండురన్ లెమిపిరా - హోండురన్ లెమిపిరా - హోండురన్ లెమిపిరాలు + హోండురన్ లెంపిరా + హోండురన్ లెంపిరా + హోండురన్ లెంపిరాలు క్రొయేషియన్ క్యూన @@ -5008,7 +5089,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ జోర్‌డానియన్ దీనార్‌లు - జపాను దేశ యెన్ + జపనీస్ యెన్ + జపనీస్ యెన్ + జపనీస్ యెన్ కెన్యాన్ షిల్లింగ్ @@ -5052,9 +5135,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఖజికిస్థాన్ టెంగేలు - లాటియన్ కిప్ - లాటియన్ కిప్ - లాటియన్ కిప్‌లు + లావోషన్ కిప్ + లావోషన్ కిప్ + లావోషన్ కిప్‌లు లెబనీస్ పౌండ్ @@ -5093,7 +5176,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మోరోకన్ దిర్హామ్ - మోరోకన్ దిర్హామ్ + మొరాకన్ దిర్హామ్ మోరోకన్ దిర్హామ్‌లు @@ -5183,11 +5266,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ నికరగ్యుయన్ కొర్‌డుబు - నికరగ్యుయన్ కొర్‌డుబు + నికరాగ్వన్ కోర్డబా నికరగ్యుయన్ కొర్‌డుబులు - నార్వేజీయన్ క్రోన్ + నార్వేజియన్ క్రోన్ నార్వేజీయన్ క్రోన్ నార్వేజీయన్ క్రోనర్ @@ -5218,6 +5301,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ పప్యూ న్యూ గ్యినియన్ కినా + ప్యాపువా న్యూ గినియన్ కినా + పప్యూ న్యూ గ్యినియన్ కినా ఫిలిప్పిన్ పెసో @@ -5241,12 +5326,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ పరగ్వాయన్ గ్వారనీలు - క్వాటరి రీయల్ - క్వాటరి రీయల్ - క్వాటరి రీయల్‌లు + ఖతారి రియాల్ + ఖతారి రియాల్ + ఖతారి రియాల్‌లు - రోమానియాన్ లెయు + రొమేనియన్ లెయు రోమానియాన్ లెయు రోమానియాన్ లీ @@ -5336,9 +5421,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రాలు - సిరీయన్ పౌండ్ - సిరీయన్ పౌండ్ - సిరీయన్ పౌండ్‌లు + సిరియన్ పౌండ్ + సిరియన్ పౌండ్ + సిరియన్ పౌండ్‌లు స్వాజి లిలాన్గేని @@ -5366,7 +5451,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ టోంగాన్ పాంʻగా - టర్కిస్ లీరా + టర్కిష్ లీరా + టర్కిష్ లీరా + టర్కిష్ లీరా ట్రినిడాడ్ మరియు టొబాగో డాలర్ @@ -5385,9 +5472,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ టాంజానియన్ షిల్లింగ్‌లు - ఉక్రయినియన్ హ్రివ్‌నియా - ఉక్రయినియన్ హ్రివ్‌నియా - ఉక్రయినియన్ హ్రివ్‌నియాలు + ఉక్రేనియన్ హ్రివ్నియా + ఉక్రేనియన్ హ్రివ్నియా + ఉక్రేనియన్ హ్రివ్నియాలు ఉగాండన్ షిల్లింగ్ @@ -5445,6 +5532,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ తూర్పు కరీబియన్ డాలర్ తూర్పు కరీబియన్ డాలర్‌లు + + కరీబియన్ గిల్‌డర్ + కరీబియన్ గిల్‌డర్ + కరీబియన్ గిల్‌డర్‌లు + పశ్చిమ ఆఫ్రికన్ సిఏఫ్ఏ ఫ్రాంక్ పశ్చిమ ఆఫ్రికన్ సిఏఫ్ఏ ఫ్రాంక్ @@ -5465,7 +5557,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ఎమునీ రీయల్ - ఎమునీ రీయల్ + యెమనీ రియాల్ ఎమునీ రీయల్‌లు @@ -5479,6 +5571,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ జాంబియన్ క్వాచా జాంబియన్ క్వాచాలు + + జింబాబ్వేయన్ గోల్డ్ + జింబాబ్వేయన్ గోల్డ్ + జింబాబ్వేయన్ గోల్డ్ + {0}+ @@ -5705,7 +5802,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ఐటమ్ {0} ఐటమ్‌లు - + + పార్ట్‌లు + {0} పార్ట్ + {0} పార్ట్‌లు + + {0} భాగం/మిలియన్ {0} భాగాలు/మిలియన్ @@ -5726,6 +5828,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} మోల్ {0} మోల్‌లు + + గ్లూకోజ్ + {0} గ్లూకోజ్ + {0} గ్లూకోజ్ + లీటర్లు/కిలోమీటరు {0} లీటరు/కిలోమీటరు @@ -6218,6 +6325,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} మిల్లీమీటర్ పాదరసం {0} మిల్లీమీటర్ల పాదరసం + + పాదరసం + {0} పాదరసం + {0} పాదరసం + చదరపు అంగుళానికి పౌండ్లు చదరపు అంగుళానికి {0} పౌండు @@ -6389,6 +6501,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} మెట్రిక్ కప్పు {0} మెట్రిక్ కప్పులు + + మెట్రిక్ ఫ్లూయిడ్ ఔన్స్‌లు + {0} మెట్రిక్ ఫ్లూయిడ్ ఔన్స్ + {0} మెట్రిక్ ఫ్లూయిడ్ ఔన్స్‌లు + ఎకరా-అడుగులు {0} ఎకరా-అడుగు @@ -6450,7 +6567,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} బారెల్‌లు - డెసర్ట్ స్పూన్ + డెజర్ట్ స్పూన్‌లు {0} డెసర్ట్ స్పూన్ {0} డెసర్ట్ స్పూన్ @@ -6460,29 +6577,86 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ఇంపీరియల్ డెసర్ట్ స్పూన్ - డ్రామ్ + డ్రామ్‌లు {0} డ్రామ్ - {0} డ్రామ్ + {0} డ్రామ్‌లు ఇంపీరియల్ చతుర్ధాంశం {0} ఇంపీరియల్ చతుర్ధాంశం {0} ఇంపీరియల్ చతుర్ధాంశం - - లైట్ - {0} లైట్ - {0} లైట్ + + స్టెరేడియన్‌లు + {0} స్టెరేడియన్ + {0} స్టెరేడియన్‌లు - + + క్యాటల్‌లు + {0} క్యాటల్ + {0} క్యాటల్‌లు + + + కూలంబ్స్ + {0} కూలంబ్ + {0} కూలంబ్స్ + + + ఫారెడ్స్ + {0} ఫారెడ్ + {0} ఫారెడ్స్ + + + హెన్రీస్ + {0} హెన్రీ + {0} హెన్రీస్ + + + సీమెన్స్ + {0} సీమెన్స్ + {0} సీమెన్స్ + + + క్యాలరీలు [IT] + {0} క్యాలరీ [IT] + {0} క్యాలరీలు [IT] + + + బెకారెల్స్ + {0} బెకారెల్ + {0} బెకారెల్‌లు + + + సీవర్ట్స్ + {0} సీవర్ట్ + {0} సీవర్ట్స్ + + + గ్రేస్ + {0} గ్రే + {0} గ్రేస్ + + + కిలోగ్రామ్‌లు-బలం + {0} కిలోగ్రామ్-బలం + {0} కిలోగ్రామ్‌లు-బలం + + + టెస్లాలు + {0} టెస్లా + {0} టెస్లాలు + + + వెబర్‌లు + {0} వెబర్ + {0} వెబర్‌లు + + ప్రతి బిలియన్‌కి భాగాలు ప్రతి బిలియన్‌కి {0} భాగం ప్రతి బిలియన్‌కి {0} భాగాలు - రాత్రి - {0} రాత్రి - {0} రాత్రులు ఒక రాత్రికి {0} @@ -6506,9 +6680,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మై.{0} - - నా.{0} - ఫె{0} @@ -6694,7 +6865,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ఐటమ్ {0} ఐటమ్ - + + పార్ట్ + {0} పార్ట్ + {0} పార్ట్ + + భాగాలు/మిలియన్ {0} భా./మి. {0} భా./మి. @@ -6711,6 +6887,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మోల్ + + Glc + {0} Glc + {0} Glc + లీటర్లు/కి.మీ {0} లీ./కి.మీ @@ -7207,6 +7388,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} మిమీ. పాద {0} మిమీ. పాద + + {0} Hg + {0} Hg + పౌ/చ.అం {0} పౌ/చ.అం @@ -7368,6 +7553,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}/మె.క. {0}/మె.క. + + {0} fl oz m. + {0} fl oz m. + ఎ.అ. {0} ఎ.అ. @@ -7460,12 +7649,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} చతు. ఇంపీరియల్ {0} చతు. ఇంపీరియల్ + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + లైట్ {0} లైట్ {0} లైట్ - + భాగాలు/బిలియన్ @@ -7496,7 +7738,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ మై{0} - నా{0} + n{0} పి{0} @@ -7596,6 +7838,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ఐటమ్ {0}ఐటమ్ + + పార్ట్ + {0} పార్ట్ + {0} పార్ట్ + % @@ -7606,6 +7853,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} మోల్ {0} మోల్ + + Glc + లీ/100కి.మీ. {0}లీ/100కి.మీ. @@ -7798,8 +8048,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}లీ - {0}గ్యా. ఇం. - {0}గ్యా. ఇం. + {0}gal-Im + {0}gal-Im {0}పావు వం. @@ -7825,16 +8075,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}చతు.ఇం. {0}చతు.ఇం. - - లైట్ - {0} లైట్ - {0} లైట్ + + cal-IT - రాత్రులు {0}రాత్రి {0}రాత్రులు - రాత్రికి {0} diff --git a/make/data/cldr/common/main/tg.xml b/make/data/cldr/common/main/tg.xml index 99d34be7f21..2538ce1db16 100644 --- a/make/data/cldr/common/main/tg.xml +++ b/make/data/cldr/common/main/tg.xml @@ -452,6 +452,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Хитой Колумбия Ҷазираи Клиппертон + Сарк Коста-Рика Куба Кабо-Верде @@ -674,10 +675,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic Тақвими грегорианӣ + Грегорианӣ Тақвими ҳиҷрӣ (ҷадвал, давраи шаҳрвандӣ) + Ҳиҷрӣ (ҷадвалӣ, давраи шаҳрвандӣ) Тақвими ҳиҷрӣ (ҷадвал, давраи ситорашиносӣ) + Ҳиҷрӣ (ҷадвал, давраи ситорашиносӣ) Тақвими ISO-8601 Тартиби мураттабсозии стандартӣ + Стандартӣ Рақамҳои ҳинду-арабӣ Рақамҳои ғарбӣ @@ -722,7 +727,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - dd/MM/yy GGGGG + d.MM.y G GGGGGyyMMdd @@ -735,6 +740,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'соати' {0} + + {1} 'соати' {0} + @@ -743,6 +751,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'соати' {0} + + {1} 'соати' {0} + @@ -751,6 +762,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -759,28 +773,32 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + E h:mm a E h:mm:ss a y G - M/d/y GGGGG + MM/y G + d.MM.y G + E, d.MM.y G MMM y G d MMM y G E, d MMM y G - h a h:mm a h:mm:ss a - dd-MM - E, dd-MM + MM/d + E, MM/d d MMM E, d MMM d MMMM y G y G MM-y GGGGG - d-MM-y GGGGG - E, d-MM-y GGGGG + d.MM.y G + E, d.MM.y G MMM y G d MMM y G E, d MMM y G @@ -789,7 +807,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic QQQQ y G - {0} – {1} h – h B @@ -805,21 +822,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic y – y G - M/y GGGGG – M/y GGGGG - M/y – M/y GGGGG - M/y – M/y GGGGG + MM/y G – MM/y G + MM/y – MM/y G + MM/y – MM/y G - M/d/y – M/d/y GGGGG - M/d/y GGGGG – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + d.MM.y – d.MM.y G + d.MM.y G – d.MM.y G + d.MM.y – d.MM.y G + d.MM.y – d.MM.y G - E, M/d/y – E, M/d/y GGGGG - E, M/d/y GGGGG – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG + E, d.MM.y – E, d.MM.y G + E, d.MM.y G – E, d.MM.y G + E, d.MM.y – E, d.MM.y G + E, d.MM.y – E, d.MM.y G MMM y G – MMM y G @@ -827,72 +844,73 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y – MMM y G - MMM d – d, y G - MMM d, y G – MMM d, y G - MMM d – MMM d, y G - MMM d, y – MMM d, y G + d – d MMM y G + d MMM y G – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, MMM d – E, MMM d, y G - E, MMM d, y G – E, MMM d, y G - E, MMM d – E, MMM d, y G - E, MMM d, y – E, MMM d, y G + E, d MMM – E, d MMM y G + E, d MMM y G – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G - M – M + MM – MM - M/d – M/d - M/d – M/d + d/MM – d/MM + d/MM – d/MM - E, M/d – E, M/d - E, M/d – E, M/d + E, d/MM – E, d/MM + E, d/MM – E, d/MM MMM – MMM - MMM d – d + MMM d – d + d MMM – d MMM - E, MMM d – E, MMM d - E, MMM d – E, MMM d + E, d MMM – E, d MMM + E, d MMM – E, d MMM - y – y G + y – y G - M/y – M/y GGGGG - M/y – M/y GGGGG + MM/y – MM/y G + MM/y – MM/y G - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG - M/d/y – M/d/y GGGGG + d.MM.y – d.MM.y G + d.MM.y – d.MM.y G + d.MM.y – d.MM.y G - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG - E, M/d/y – E, M/d/y GGGGG + E, d.MM.y – E, d.MM.y G + E, d.MM.y – E, d.MM.y G + E, d.MM.y – E, d.MM.y G - MMM – MMM y G - MMM y – MMM y G + MMM – MMM y G + MMM y – MMM y G - MMM d – d, y G - MMM d – MMM d, y G - MMM d, y – MMM d, y G + d – d MMM y G + d MMM – d MMM y G + d MMM y – d MMM y G - E, MMM d – E, MMM d, y G - E, MMM d – E, MMM d, y G - E, MMM d, y – E, MMM d, y G + E, d MMM – E, d MMM y G + E, d MMM – E, d MMM y G + E, d MMM y – E, d MMM y G - MMMM – MMMM'и' y G - MMMM'и' y – MMMM'и' y G + MMMM – MMMM y G + MMMM y – MMMM y G @@ -1088,6 +1106,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E h:mm a E h:mm:ss a y G + y-MM G + y-MM-dd G + y-MM-dd G, E MMM y G d MMM, y G E, d MMM, y G @@ -2131,6 +2152,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Истер + + Койҳайке + Пунта Аренас @@ -2395,7 +2419,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пномпен - + Кантон @@ -3065,9 +3089,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Вақти Африқои Ғарбӣ - Вақти стандартии Африқои Ғарбӣ - Вақти тобистонаи Африқои Ғарбӣ + Вақти Африқои Ғарбӣ @@ -3417,6 +3439,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Вақти Гайана + + + Вақти стандартии Ҳавайӣ-Алеутӣ + + Вақти Ҳавайӣ-Алеутӣ @@ -3956,23 +3983,36 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 + + + #,##0.00 ¤ + #,##0.00 ¤ - #,##0.00;(#,##0.00) + #,##0.00 ¤ + #,##0.00 - ¤0 ҳазор - ¤00 ҳазор - ¤000 ҳазор - ¤0 млн - ¤00 млн - ¤000 млн + 0 ҳзр'.' ¤ + 00 ҳзр'.' ¤ + 000 ҳзр'.' ¤ + 0 млн'.' ¤ + 00 млн'.' ¤ + 000 млн'.' ¤ 0 млрд'.' ¤ 00 млрд'.' ¤ 000 млрд'.' ¤ @@ -4593,6 +4633,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Доллари Кариби Шарқӣ доллари Кариби Шарқӣ + + гулдени Кариб + гулдени Кариб + Франки Африқои Ғарбӣ франки Африқои Ғарбӣ @@ -4617,6 +4661,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Квачаи Замбия квачаи Замбия + + тиллоии Зимбабве + тиллоии Зимбабве + ⩾{0} diff --git a/make/data/cldr/common/main/th.xml b/make/data/cldr/common/main/th.xml index ea1a00e3d0f..f5a89b75752 100644 --- a/make/data/cldr/common/main/th.xml +++ b/make/data/cldr/common/main/th.xml @@ -331,6 +331,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ บาเฟีย โคโลญ เคิร์ด + เคิร์ด + กุรมันชี คูมืยค์ คูเทไน โกมิ @@ -939,6 +941,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ จีน โคลอมเบีย เกาะคลิปเปอร์ตัน + ซาร์ก คอสตาริกา คิวบา เคปเวิร์ด @@ -1245,35 +1248,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ การจัดเรียงตัวเลข ความแม่นยำในการจัดเรียง สกุลเงิน + การแสดงอีโมจิ วงจรชั่วโมง (เทียบ 12 และ 24) รูปแบบการขึ้นบรรทัดใหม่ + การขึ้นบรรทัดใหม่ภายในคำ ระบบการวัด ตัวเลข + การตัดประโยคหลังจากคำย่อ เขตเวลา ตัวแปรภาษาถิ่น ใช้งานส่วนบุคคล ปฏิทินพุทธ + พุทธ ปฏิทินจีน + จีน ปฏิทินคอปติก + คอปติก ปฏิทินเกาหลี + เกาหลี ปฏิทินเอธิโอเปีย + เอธิโอเปีย ปฏิทินปีโลกเอธิโอเปีย + ปีโลกเอธิโอเปีย ปฏิทินเกรกอเรียน + เกรกอเรียน ปฏิทินฮิบรู + ฮิบรู ปฏิทินแห่งชาติอินเดีย ปฏิทินอิสลาม + อิสลาม ปฏิทินอิสลามซีวิล + อิสลามซีวิล ปฏิทินอิสลาม (ซาอุดีอาระเบีย แบบพระจันทร์เสี้ยว) ปฏิทินอิสลาม (แบบตาราง สมัยดาราศาสตร์) ปฏิทินอิสลาม (อุมม์อัลกุรา) + อิสลาม (อุมม์อัลกุรา) ปฏิทิน ISO-8601 ปฏิทินญี่ปุ่น + ญี่ปุ่น ปฏิทินเปอร์เชีย + เปอร์เชีย ปฏิทินไต้หวัน + ไต้หวัน รูปแบบสกุลเงินบัญชี + บัญชี รูปแบบสกุลเงินมาตรฐาน + มาตรฐาน จัดเรียงสัญลักษณ์ จัดเรียงสัญลักษณ์ที่ละไว้ จัดเรียงเสียงหนักเบาตามปกติ @@ -1283,22 +1305,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ จัดเรียงตัวพิมพ์ใหญ่ก่อน จัดเรียงตามความสำคัญของตัวพิมพ์ จัดเรียงความสำคัญของตัวพิมพ์ - ลำดับการจัดเรียงตามอักษรจีนดั้งเดิม ลำดับการจัดเรียงก่อนหน้านี้ ตามความเหมาะสม + ความเหมาะสม ลำดับการจัดเรียงตามพจนานุกรม + พจนานุกรม ลำดับการจัดเรียงตาม Unicode เริ่มต้น + Unicode เริ่มต้น กฎการเรียงลำดับตามแบบยุโรป - ลำดับการจัดเรียงตามอักษรจีนประยุกต์ ลำดับการจัดเรียงตามสมุดโทรศัพท์ + สมุดโทรศัพท์ ลำดับการจัดเรียงตามการออกเสียง + การออกเสียง ลำดับการจัดเรียงตามการถอดเสียงภาษาจีน + การถอดเสียงภาษาจีน การค้นหาทั่วไป + การค้นหา ค้นหาตามพยัญชนะขึ้นต้นที่เป็นฮันกึล ลำดับการจัดเรียงแบบมาตรฐาน + มาตรฐาน ลำดับการจัดเรียงตามการลากเส้น + การลากเส้น ลำดับการจัดเรียงตามแบบดั้งเดิม + ดั้งเดิม ลำดับการจัดเรียงตามจำนวนขีด + จำนวนขีด ลำดับการจัดเรียงตามการสะกดแบบจู้อิน + การสะกดแบบจู้อิน จัดเรียงโดยไม่ต้องทำให้เป็นแบบปกติ จัดเรียงยูนิโค้ดแบบที่เป็นปกติ จัดเรียงตัวเลขแยก @@ -1311,18 +1343,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ตัวเต็ม ตัวย่อ ตัวเลข + ค่าเริ่มต้น + อีโมจิ + ข้อความ ระบบ 12 ชั่วโมง (0–11) + 12 (0–11) ระบบ 12 ชั่วโมง (1–12) + 12 (1–12) ระบบ 24 ชั่วโมง (0–23) + 24 (0–23) ระบบ 24 ชั่วโมง (1–24) + 24 (1–24) รูปแบบที่ยืดหยุ่นของการขึ้นบรรทัดใหม่ + ยืดหยุ่น รูปแบบปกติของการขึ้นบรรทัดใหม่ + ปกติ รูปแบบที่เคร่งครัดของการขึ้นบรรทัดใหม่ + เคร่งครัด + ขึ้นบรรทัดใหม่ได้ในทุกคำ + ป้องกันการขึ้นบรรทัดใหม่ในทุกคำ + ขึ้นบรรทัดใหม่ปกติ + ไม่ขึ้นบรรทัดใหม่ในวลี ชื่อมาตรฐานอังกฤษ (BGN) ชื่อภูมิศาสตร์มาตรฐาน UN (UNGEGN) ระบบเมตริก + เมตริก ระบบการวัดอิมพีเรียล + อังกฤษ ระบบการวัดอเมริกัน + อเมริกัน ตัวเลขอารบิก-อินดิก ตัวเลขอารบิก-อินดิกแบบขยาย ตัวเลขอาร์เมเนีย @@ -1384,6 +1433,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ตัวเลขทิเบต ตัวเลขแบบดั้งเดิม ตัวเลขไว + ปิด + เปิด เมตริก @@ -1408,7 +1459,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [.․﹒.。︒。] - [££ ₤] [\-﹣-‑‒ −⁻₋ ➖] @@ -1457,7 +1507,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + M/G y d/M/GGGGG y + E ที่ d/M/G y E d MMMM EEEEที่ d MMMM M/y @@ -1768,6 +1820,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} เวลา {0} + + {1} เวลา {0} + @@ -1776,6 +1831,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} เวลา {0} + + {1} เวลา {0} + @@ -1789,7 +1847,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d + M/y G d/M/y GGGGG + E ที่ d/M/y G MMM G y d MMM G y E d MMM G y @@ -1979,6 +2039,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + อาทิตย์ + จันทร์ + อังคาร + พุธ + พฤหัส + ศุกร์ + เสาร์ + + อา. จ. อ. @@ -1998,6 +2067,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + อาทิตย์ + จันทร์ + อังคาร + พุธ + พฤหัส + ศุกร์ + เสาร์ + อา @@ -2007,6 +2085,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + อา. + จ. + อ. + พ. + พฤ. + ศ. + ส. + @@ -2151,6 +2238,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} เวลา {0} + + {1} เวลา {0} + @@ -2159,6 +2249,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} เวลา {0} + + {1} เวลา {0} + @@ -2174,6 +2267,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E d E HH:mm น. d/M/GGGGG y + E d/M/G y MMM G y d MMM G y E d MMM G y @@ -3438,6 +3532,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ อีสเตอร์ + + โกไยเก + ปุนตาอาเรนัส @@ -3703,9 +3800,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ พนมเปญ - เอนเดอร์เบอรี - - แคนทอน @@ -4382,9 +4476,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - เวลาแอฟริกาตะวันตก - เวลามาตรฐานแอฟริกาตะวันตก - เวลาฤดูร้อนแอฟริกาตะวันตก + เวลาแอฟริกาตะวันตก @@ -4772,6 +4864,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ เวลากายอานา + + + เวลามาตรฐานฮาวาย-อะลูเชียน + + เวลาฮาวาย-อะลูเชียน @@ -5222,6 +5319,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ เวลาชุก + + + เวลาตุรกี + เวลามาตรฐานตุรกี + เวลาฤดูร้อนตุรกี + + เวลาเติร์กเมนิสถาน @@ -5343,8 +5447,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -6202,6 +6304,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ดอลลาร์แคริบเบียนตะวันออก + + กิลเดอร์แคริบเบียน + กิลเดอร์แคริบเบียน + สิทธิถอนเงินพิเศษ @@ -6282,6 +6388,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ดอลลาร์ซิมบับเว + + ทองซิมบับเว + ทองซิมบับเว + ดอลลาร์ซิมบับเว (2009) @@ -6359,7 +6469,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ มิลลิโมลต่อลิตร {0} มิลลิโมลต่อลิตร - + + ส่วน + {0} ส่วน + + ส่วนต่อล้าน {0} ส่วนต่อล้าน @@ -6372,6 +6486,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} เปอร์มีเรียด + + กลูโคส + {0} กลูโคส + ลิตรต่อกิโลเมตร {0} ลิตรต่อกิโลเมตร @@ -6636,6 +6754,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ มิลลิเมตรปรอท {0} มิลลิเมตรปรอท + + ปรอท + {0} ปรอท + ปอนด์ต่อตารางนิ้ว {0} ปอนด์ต่อตารางนิ้ว @@ -6739,6 +6861,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ถ้วยเมตริก {0} ถ้วยเมตริก + + ฟลูอิดออนซ์เมตริก + {0} ฟลูอิดออนซ์เมตริก + {0} บุชเชล @@ -6778,19 +6904,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ควอร์ตอังกฤษ {0} ควอร์ตอังกฤษ - - แสง - {0} แสง + + สเตอเรเดียน + {0} สเตอเรเดียน - + + คาทัล + {0} คาทัล + + + คูลอมบ์ + {0} คูลอมบ์ + + + ฟารัด + {0} ฟารัด + + + เฮนรี + {0} เฮนรี + + + ซีเมนส์ + {0} ซีเมนส์ + + + แคลอรี [IT] + {0} แคลอรี [IT] + + + เบ็กเคอเรล + {0} เบ็กเคอเรล + + + ซีเวิร์ต + {0} ซีเวิร์ต + + + เกรย์ + {0} เกรย์ + + + กิโลกรัมแรง + {0} กิโลกรัมแรง + + + เทสลา + {0} เทสลา + + + เวเบอร์ + {0} เวเบอร์ + + ส่วนต่อพันล้าน {0} ส่วนต่อพันล้าน - - คืน - {0} คืน - {0}/คืน - สี่ทิศหลัก {0}ตะวันออก @@ -6983,7 +7152,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ รายการ {0} รายการ - + + ส่วน + {0} ส่วน + + ส่วน/ล้าน {0} สตล. @@ -7000,6 +7173,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ โมล {0} โมล + + กลูโคส + {0} กลูโคส + ลิตร/กม. {0} ล./กม. @@ -7334,6 +7511,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ มม. ปรอท {0} มม. ปรอท + + ปรอท + {0} ปรอท + ปอนด์/ตร.นิ้ว {0} ปอนด์/ตร.นิ้ว @@ -7443,6 +7624,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ถ. เมตริก {0} ถ. เมตริก + + {0} fl oz m. + เอเคอร์-ฟุต {0} เอเคอร์-ฟุต @@ -7510,11 +7694,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ หยิบมือ {0} หยิบมือ + + สเตอเรเดียน + {0} sr + + + คาทัล + {0} คาทัล + + + คูลอมบ์ + {0} C + + + ฟารัด + {0} ฟารัด + + + เฮนรี + {0} เฮนรี + + + ซีเมนส์ + {0} ซีเมนส์ + + + แคลอรี-IT + {0} แคลอรี-IT + + + เบ็กเคอเรล + {0} Bq + + + ซีเวิร์ต + {0} ซีเวิร์ต + + + เกรย์ + {0} เกรย์ + + + กิโลกรัมแรง + {0} กิโลกรัมแรง + + + เทสลา + {0} เทสลา + + + เวเบอร์ + {0} Wb + แสง {0} แสง - + ส่วน/พันล้าน {0} สตพล. @@ -7594,7 +7830,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}รายการ - + + ส่วน + {0} ส่วน + + สตล. {0}สตล. @@ -7607,6 +7847,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}โมล + + กลูโคส + {0} กลูโคส + ล./กม. {0}ล./กม. @@ -7936,6 +8180,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}มม. ปรอท + + ปรอท + {0} ปรอท + {0}psi @@ -8103,18 +8351,63 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}qt-Imp. + + สเตอเรเดียน + + + คาทัล + {0} คาทัล + + + คูลอมบ์ + + + ฟารัด + {0} ฟารัด + + + เฮนรี + {0} เฮนรี + + + ซีเมนส์ + {0} ซีเมนส์ + + + แคลอรี-IT + {0} แคลอรี-IT + + + เบ็กเคอเรล + + + ซีเวิร์ต + {0} ซีเวิร์ต + + + เกรย์ + {0} เกรย์ + + + กิโลกรัมแรง + {0} กิโลกรัมแรง + + + เทสลา + {0} เทสลา + + + เวเบอร์ + - แสง {0}แสง - + สตพล. {0}สตพล. - คืน {0}คืน - {0}/คืน ทิศ diff --git a/make/data/cldr/common/main/ti.xml b/make/data/cldr/common/main/ti.xml index 767bdcbe280..f34e86a651e 100644 --- a/make/data/cldr/common/main/ti.xml +++ b/make/data/cldr/common/main/ti.xml @@ -16,7 +16,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}፦ {1} - አፋር + ዓፋር ኣብካዝኛ ኣቸኒዝኛ ኣዳንግሜ @@ -39,7 +39,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ናጅዲ ዓረብኛ ኣሳሜዝኛ ኣሱ - ኣስቱርያን + ኣስቱርኛ ኣቲካመክ ኣቫርኛ ኣዋዲ @@ -66,14 +66,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ባምባራ በንጋሊ ቲበታንኛ + ባኽትያሪ ብረቶንኛ ቦዶ ቦዝንኛ ኣኮስ + ቡርያትኛ ቡጊንኛ ብሊን ካታላን - ካድዶ + ካዶ ካዩጋ ኣትሳም ቻክማ @@ -88,17 +90,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ቸሮኪ ሻያን ቺካሳው - ማእከላይ ኩርዲሽ - ኩርዲሽ፣ ማእከላይ - ኩርዲሽ፣ ሶራኒ + ኩርዲሽ ሶራኒ ቺልኮቲን ኮርስኛ + ቁብጥኛ ሚቺፍ ደቡባዊ ምብራቕ ክሪ - ክሪ ፕሌንስ + ክሪ ቆላታት ሰሜናዊ ምብራቕ ክሪ ሙስ ክሪ - ካሮሊና አልጎንጉያኛ + ኣልጎንክኛ ካሮሊና ቸክኛ ክሪ ረግረግ ቤተ-ክርስትያን ስላቭኛ @@ -109,6 +110,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ዳርግዋ ታይታ ጀርመን + ኦስትርያዊ ጀርመን + ስዊዘርላንዳዊ ላዕለዋይ ጀርመን ዶግሪብ ዛርማ ዶግሪ @@ -124,10 +127,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic ኤካጁክ ግሪኽኛ እንግሊዝኛ - እንግሊዝኛ (ሕ.መ.) + ኣውስትራልያዊ እንግሊዝኛ + ካናዳዊ እንግሊዝኛ + ብሪጣንያዊ እንግሊዝኛ + ኣመሪካዊ እንግሊዝኛ ኤስፐራንቶ ስጳንኛ + ላቲን ኣመሪካዊ ስጳንኛ ስጳንኛ (ኤውሮጳዊ) + ስጳንኛ ሜክሲኮ ኤስቶንኛ ባስክኛ ኤዎንዶ @@ -140,7 +148,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ፋሮእይና ፎን ፈረንሳይኛ - ካጁን ፈረንሳይ + ካናዳዊ ፈረንሳይኛ + ስዊዘርላንዳዊ ፈረንሳይኛ + ካጁን ፈረንሳይኛ ሰሜናዊ ፍሪስኛ ፍርዩልኛ ምዕራባዊ ፍሪስኛ @@ -204,6 +214,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ታያፕ ማኮንደ ክርዮል ኬፕ ቨርድኛ + ቄቅቺ ኬንያንግ ኮሮ ካይንጋንግ @@ -228,8 +239,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ካሽሚሪ ሻምባላ ባፍያ - ኮሎግኒያን + ኮልሽ ኩርዲሽ + ኩርዲሽ + ኰርማንጂ ኩሚይክ ኮሚ ኮርንኛ @@ -254,7 +267,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ሰሜናዊ ሉሪ ሳምያ ሊትዌንኛ - ላትጋላዊ + ላትጋልኛ ሉባ-ካታንጋ ሉባ-ሉልዋ ሉንዳ @@ -296,7 +309,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ኤርዝያ ማዛንደራኒ ናውርዋንኛ - ኒያፖሊታንኛ + ናፖሊታንኛ ናማ ኖርወያዊ ቦክማል ሰሜን ኤንደበለ @@ -337,12 +350,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ፓፕያመንቶ ፓላውኛ ፒጂን ናይጀርያ + ፓሊ ፒጂን ፖሊሽ + ፒድሞንትኛ ማሊሲት-ፓሳማኳዲ ፕሩስኛ ፓሽቶ ፖርቱጊዝኛ + ፖርቱጊዝኛ ብራዚል + ፖርቱጊዝኛ ፖርቱጋል ቀችዋ ኪቼ ራጃስታኒ @@ -375,11 +392,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ሰና ኮይራቦሮ ሰኒ ሳንጎ + ሳሞጂትኛ ሰርቦ-ክሮኤሽያኛ ታቸልሂት ሻን ሲንሃላ - ሲዳመኛ + ሲዳሞ ስሎቫክኛ ስሎቬንኛ ደቡባዊ ሉሹትሲድ @@ -392,7 +410,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ሶኒንከ ሶማሊ ኣልባንኛ - ሰርቢያኛ + ሰርብኛ ስራናን ቶንጎ ስዋዚ ሳሆ @@ -402,10 +420,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ሱኩማ ስዊድንኛ ስዋሂሊ - ስዋሂሊ (ኮንጎ) + ስዋሂሊ ኮንጎ ኮሞርኛ - ሶርያኛ - ሲሌሲያን + ሶርይኛ + ሲለዝኛ ታሚል ደቡባዊ ታትቾን ተሉጉ @@ -427,7 +445,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ቶክ ፒሲን ቱርክኛ ታሮኮ - ቶርዋሊኛ + ቶርዋሊ ሶንጋ ታታር ሰሜናዊ ታትቾን @@ -447,21 +465,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic ኡዝበክኛ ቫይ ቨንዳ - ቬንቲያንኛ + ቬነትኛ ቬትናምኛ ማክሁዋ ቮላፑክ ቩንጆ ዋሎን ዋልሰር - ዎላይታኛ + ወላይታ ዋራይ ዋርልፒሪ ዎሎፍ ቻይናዊ ዉ ካልምይክ ኮሳ - ካንጋሪኛ + ካንግሪ ሶጋ ያንግበን የምባ @@ -861,43 +879,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic ቅርጺ ባጤራ ስርዓት ምድላው ባጤራ + ኣቀራርባ ኢሞጂ ዑደት ሰዓት (12 ኣንጻር 24) ቅዲ ምብታኽ መስመር + መስመር ምብታኽ ኣብ ውሽጢ ቃላት ስርዓት መለክዒ ቁጽርታት + ምቁራጽ ሓረግ ድሕሪ ኣሕጽሮተ ቃል ናይ ቡድሃ ዓውደ ኣዋርሕ + ቡድሃ ናይ ቻይናዊ ዓውደ ኣዋርሕ + ቻይናዊ ናይ ቅብጣዊ ዓውደ ኣዋርሕ + ቅብጣዊ ናይ ዳንጊ ዓውደ ኣዋርሕ + ዳንጊ ናይ ግእዝ ዓውደ ኣዋርሕ + ግእዝ ግእዝ ኣመተ ኣለም ዓውደ ኣዋርሕ + ግእዝ ኣመተ ኣለም ጎርጎርዮሳዊ ዓውደ ኣዋርሕ + ጎርጎርዮሳዊ ናይ እብራይስጢ ዓውደ ኣዋርሕ + እብራይስጢ ናይ ሂጅሪ ዓውደ ኣዋርሕ + ሂጅሪ ናይ ሂጅሪ ዓውደ ኣዋርሕ (ሰንጠረዥ፣ ሲቪላዊ ዘመን) + ሂጅሪ ዓውደ ኣዋርሕ (ሰንጠረዥ፣ ሲቪላዊ ዘመን) ናይ ሂጅሪ ዓውደ ኣዋርሕ (ሰንጠረዥ፣ ስነ-ፍልጠታዊ ዘመን) + ሂጅሪ (ሰንጠረዥ፣ ስነ-ፍልጠታዊ ዘመን) ናይ ሂጅሪ ዓውደ ኣዋርሕ (ኡም ኣል-ቁራ) + ሂጅሪ (ኡም ኣል-ቁራ) ISO-8601 ዓውደ ኣዋርሕ ናይ ጃፓናዊ ዓውደ ኣዋርሕ + ጃፓናዊ ናይ ፋርስ ዓውደ ኣዋርሕ + ፋርስ ናይ ሪፓብሊክ ቻይና ዓውደ ኣዋርሕ + ሪፓብሊክ ቻይና ቅርጺ ባጤራ ሕሳብ + ሕሳብ መደበኛ ቅርጺ ባጤራ + መደበኛ ነባሪ ዩኒኮድ ስርዓት ምድላው + ነባሪ ዩኒኮድ ሓፈሻዊ-ዕላማ ምድላይ + ምድላይ መደበኛ ምድላው ስርዓት + መደበኛ + ነባሪ + ኢሞጂ + ጽሑፍ ስርዓት 12 ሰዓታት (0–11) + 12 (0–11) 12 (0–11) ስርዓት 12 ሰዓታት (1–12) + 12 (1–12) 12 (1–12) ናይ 24 ሰዓታት ስርዓት (0–23) + 24 (0–23) ናይ 24 ሰዓታት ስርዓት (1–24) + 24 (1–24) ልሕሉሕ መስመር ምብታኽ ቅዲ + ልሕሉሕ ንቡር ቅዲ ምብታኽ መስመር + ንቡር ቅዲ ስጡም መስመር ምብታኽ + ስጡም + ኩሉ ስበር + ኩሉ ሓልዎ + ንቡር + ብሓረጋት ምሓዝ ሜትሪክ ስርዓት + ሜትሪክ ስርዓተ መለክዒ ሃጸያዊ + ዓባይ ብሪጣንያ ስርዓት መለክዒ ኣሜሪካ + ኣሜሪካ ዓረብ-ህንዳዊ ኣሃዛት ዝተዘርግሐ ኣሃዛት ዓረብ-ህንዳዊ ኣርመንያዊ ቁጽርታት @@ -938,6 +996,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic ናይ ታይላንዳዊ ኣሃዛት ናይ ትቤቲ ኣሃዛት ቫይ ኣሃዛት + ጠፊኡ + በሪሑ ሜትሪክ @@ -954,6 +1014,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic [፟ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቋ ቌ ቍ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቛ ቜ ቝ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኋ ኌ ኍ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኳ ኴ ኵ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዃ ዄ ዅ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጓ ጔ ጕ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ] [᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሇ ⶀ ᎀ ᎁ ᎂ ᎃ ⶁ ⶂ ⶃ ⶄ ቇ ᎄ ᎅ ᎆ ᎇ ⶅ ⶆ ⶇ ኇ ⶈ ⶉ ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ⶎ ጏ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶔ ⶕ ⶖ ⶏ ⶐ ⶑ ᎈ ᎉ ᎊ ᎋ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፙ ፚ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ] [ሀ ለ ሐ መ ሠ ረ ሰ ሸ ቀ ቈ ቐ ቘ በ ቨ ተ ቸ ኀ ኈ ነ ኘ አ ከ ኰ ኸ ዀ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጐ ጠ ጨ ጰ ጸ ፀ ፈ ፐ] + [% ‰ + − 0 1 2 3 4 5 6 7 8 9] + [፣ ፤ ፦] + [\- ‐‑ ፣ ። /] « @@ -1065,6 +1128,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} ሰዓት {0} + + {1} ሰዓት {0} + @@ -1073,24 +1139,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} ሰዓት {0} + + {1} ሰዓት {0} + {1} {0} + + {1}፣ {0} + {1} {0} + + {1}፣ {0} + d E y G M/d/y GGGGG + G y-MM-dd፣ E MMM y G MMM d, y G E፣ d MMM y G + HHሰ v M/d E፣ d/M dd/MM @@ -1420,11 +1497,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + {1}፣ {0} + {1} {0} + + {1}፣ {0} + d E @@ -1434,6 +1517,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic E፣ HH:mm:ss y G M/d/y G + E፣ M/d/y G MMM y G MMM d, y G E፣ d MMM y G @@ -1587,6 +1671,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic d E M/d/y GGGGG + G y-MM-dd፣ E MMM d, y G M/d MMM d @@ -1819,8 +1904,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic ቅድሚ {0} ቀዳም + + ኤ.ኤም/ፒ.ኤም + - AM/PM + ኤ.ኤም/ፒ.ኤም + + + ኤ.ኤም/ፒ.ኤም ሰዓት @@ -2231,6 +2322,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ደሴት ፋሲካ + + ኮሃይክ + ፑንታ ኣረናስ @@ -2496,9 +2590,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ፕኖም ፐን - ኤንደርበሪ - - ካንቶን @@ -3175,9 +3266,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ግዜ ምዕራብ ኣፍሪቃ - ናይ መደበኛ ግዘ ምዕራብ ኣፍሪቃ - ግዜ ክረምቲ ምዕራብ ኣፍሪቃ + ግዜ ምዕራብ ኣፍሪቃ @@ -3527,6 +3616,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ግዜ ጉያና + + + ናይ መደበኛ ሃዋይ-ኣሌውቲያን ግዘ + + ናይ ሃዋይ-ኣሌውቲያን ግዘ @@ -4935,6 +5029,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ምብራቕ ካሪብያን ዶላር ምብራቕ ካሪብያን ዶላር + + ካሪብያን ጊልደር + ካሪብያን ጊልደር + ካሪብያን ጊልደር + ምዕራብ ኣፍሪቃ CFA ፍራንክ ምዕራብ ኣፍሪቃ ሲኤፍኤ ፍራንክ @@ -4965,6 +5064,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic ዛምብያዊ ኳቻ ዛምብያዊ ኳቻ + + ዚምባብወ ወርቂ + ዚምባብወ ወርቂ + ዚምባብወ ወርቂ + ⩾{0} @@ -5192,7 +5296,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ኣቕሓ {0} ኣቕሑ - + + ክፋል + {0} ክፋል + {0} ክፋል + + ክፍልታት ኣብ ሚልዮን {0} ክፍልታት ኣብ ሚልዮን {0} ክፍልታት ኣብ ሚልዮን @@ -5217,6 +5326,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ሞል {0} ሞል + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + ሊትሮ ኣብ ኪሎሜትር {0} ሊትሮ አብ ኪሎሜትር @@ -5301,7 +5415,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ዓሰርተታት ዓመታት - ዓመታት {0} ዓመት {0} ዓመታት {0}/ዓመታት @@ -5314,7 +5427,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ኣዋርሕ - {0}/ወርሒ + {0} ወርሒ {0}/ኣዋርሕ {0}/ወርሒ @@ -5702,6 +5815,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ሚሊሜተር ሜርኩሪ {0} ሚሊሜተር ሜርኩሪ + + ሜርኩሪ + {0} ሜርኩሪ + {0} ሜርኩሪ + ፓውንድ-ሓይሊ ኣብ ሓደ ካሬ ኢንች {0} ፓውንድ-ሓይሊ ኣብ ሓደ ካሬ ኢንች @@ -5870,6 +5988,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ሜትሪክ ፓይንት {0} ሜትሪክ ፓይንት + + ሜትሪክ ፈሳሲ ኦውንስ + {0} ሜትሪክ ፈሳሲ ኦውንስ + {0} ሜትሪክ ፈሳሲ ኦውንስ + acre-ጫማ {0} acre ጫማ @@ -5967,12 +6090,77 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ኢምፒ. ርብዒ ጋሎን {0} ኢምፒ. ርብዒ ጋሎን + + ስትራዲያን + {0} ስትራዲያን + {0} ስትራዲያን + + + ካታል + {0} ካታል + {0} ካታል + + + ኮለምብ + {0} ኮለምብ + {0} ኮለምብ + + + ፋራድ + {0} ፋራድ + {0} ፋራድ + + + ሄነሪ + {0} ሄነሪ + {0} ሄነሪ + + + ሲመን + {0} ሲመን + {0} ሲመን + + + ካሎሪ [IT] + {0} ካሎሪ [IT] + {0} ካሎሪ [IT] + + + ቤክዌርሌስ + {0} ቤክዌርሌስ + {0} ቤክዌርሌስ + + + ሴቨርትስ + {0} ሴቨርት + {0} ሴቨርትስ + + + ግሬይስ + {0} ግሬይ + {0} ግሬይስ + + + ኪሎግራም-ሓይሊ + {0} ኪሎግራም-ሓይሊ + {0} ኪሎግራም-ሓይሊ + + + ቴስላ + {0} ቴስላ + {0} ቴስላ + + + ዌበር + {0} ዌበር + {0} ዌበር + ብርሃን {0} ብርሃን {0} ብርሃን - + ክፍልታት ኣብ ሓደ ቢልዮን {0} ክፍልታት ኣብ ሓደ ቢልዮን {0} ክፍልታት ኣብ ሓደ ቢልዮን @@ -6190,7 +6378,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ኣቕሓ {0} ኣቕሑ - + + ክፋል + {0} ክፋል + {0} ክፋል + + ክፍልታት/ሚልዮን {0} ክፍልታት ኣብ ሚልዮን {0} ክፍልታት ኣብ ሚልዮን @@ -6209,6 +6402,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ሞል {0} ሞል + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + ሊትሮ/ኪሎሜትር {0} ሊትሮ/ኪሜ @@ -6667,6 +6865,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ሚሜ ሜርኩሪ {0} ሚሜ ሜርኩሪ + + ሜርኩሪ + {0} ሜርኩሪ + {0} ሜርኩሪ + + + ፒ.ኤስ.አይ + ኢንች ሜርኩሪ {0} ኢንች ሜርኩሪ @@ -6925,12 +7131,62 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ኢምፒ. ርብዒ ጋሎን {0} ኢምፒ. ርብዒ ጋሎን + + ስትራዲያን + {0} ስትራዲያን + {0} ስትራዲያን + + + ካታል + {0} ካታል + {0} ካታል + + + ኮለምብ + {0} ኮለምብ + {0} ኮለምብ + + + ፋራድ + {0} ፋራድ + {0} ፋራድ + + + ሄነሪ + {0} ሄነሪ + {0} ሄነሪ + + + ሲመን + {0} ሲመን + {0} ሲመን + + + ካል-IT + {0} ካል-IT + {0} ካል-IT + + + ኪሎግ-ሓ + {0} ኪሎግ-ሓ + {0} ኪሎግ-ሓ + + + ቴስላ + {0} ቴስላ + {0} ቴስላ + + + ዌበር + {0} ዌበር + {0} ዌበር + ብርሃን {0} ብርሃን {0} ብርሃን - + ክፍልታት/ሓደ ቢልዮን {0} ክፍልታት ኣብ ሓደ ቢልዮን {0} ክፍልታት ኣብ ሓደ ቢልዮን @@ -7144,7 +7400,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ኣቕሓ {0}ኣቕሑ - + + ክፋል + {0} ክፋል + {0} ክፋል + + ክፍልታት ኣብ ሚልዮን {0}ክፍልታት ኣብ ሚልዮን {0}ክፍልታት ኣብ ሚልዮን @@ -7154,6 +7415,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ሞል {0}ሞል + + ግሉኮስ + {0} ግሉኮስ + {0} ግሉኮስ + ሊትሮ/ኪሜ {0}ሊትሮ/ኪሜ @@ -7608,6 +7874,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ሚሜ ሜርኩሪ {0}ሚሜ ሜርኩሪ + + ሜርኩሪ + {0} ሜርኩሪ + {0} ሜርኩሪ + + + ፒ.ኤስ.አይ + ″ ሜርኩሪ {0}″ ሜርኩሪ @@ -7866,12 +8140,62 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ኢምፒ. ርብዒ ጋሎን {0}ኢምፒ. ርብዒ ጋሎን + + ስትራዲያን + {0} ስትራዲያን + {0} ስትራዲያን + + + ካታል + {0} ካታል + {0} ካታል + + + ኮለምብ + {0} ኮለምብ + {0} ኮለምብ + + + ፋራድ + {0} ፋራድ + {0} ፋራድ + + + ሄነሪ + {0} ሄነሪ + {0} ሄነሪ + + + ሲመን + {0} ሲመን + {0} ሲመን + + + ካል-IT + {0} ካል-IT + {0} ካል-IT + + + ኪሎግ-ሓ + {0} ኪሎግ-ሓ + {0} ኪሎግ-ሓ + + + ቴስላ + {0} ቴስላ + {0} ቴስላ + + + ዌበር + {0} ዌበር + {0} ዌበር + ብርሃን {0}ብርሃን {0}ብርሃን - + ክፍልታት ኣብ ሓደ ቢልዮን {0}ክፍልታት ኣብ ሓደ ቢልዮን {0}ክፍልታት ኣብ ሓደ ቢልዮን @@ -8183,13 +8507,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {surname-core}፣ {given} {given2} {surname-prefix} - {surname}, {given-informal} + {surname}፣ {given-informal} - {surname-core}, {given} {given2-initial} {surname-prefix} + {surname-core}፣ {given} {given2-initial} {surname-prefix} - {surname}, {given-informal} + {surname}፣ {given-informal} {surname-core}፣ {given} {given2} {surname-prefix} diff --git a/make/data/cldr/common/main/ti_ER.xml b/make/data/cldr/common/main/ti_ER.xml index c0fb0e068e6..eca0d671a6e 100644 --- a/make/data/cldr/common/main/ti_ER.xml +++ b/make/data/cldr/common/main/ti_ER.xml @@ -11,11 +11,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - ሰርብኛ - - [፟ ፡ ፣ ፤ ፥ ፦ ፧ ። ፠ ፨ ፩ ፪ ፫ ፬ ፭ ፮ ፯ ፰ ፱ ፲ ፳ ፴ ፵ ፶ ፷ ፸ ፹ ፺ ፻ ፼ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቋ ቌ ቍ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቛ ቜ ቝ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኋ ኌ ኍ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኳ ኴ ኵ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዃ ዄ ዅ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጓ ጔ ጕ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ] [᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሇ ⶀ ᎀ ᎁ ᎂ ᎃ ⶁ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ⶂ ⶃ ⶄ ቇ ᎄ ᎅ ᎆ ᎇ ⶅ ⶆ ⶇ ኇ ⶈ ⶉ ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ⶎ ጏ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶔ ⶕ ⶖ ⶏ ⶐ ⶑ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ᎈ ᎉ ᎊ ᎋ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፙ ፚ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ] diff --git a/make/data/cldr/common/main/tk.xml b/make/data/cldr/common/main/tk.xml index 79104bb6449..92694e0cebf 100644 --- a/make/data/cldr/common/main/tk.xml +++ b/make/data/cldr/common/main/tk.xml @@ -42,6 +42,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic azerbaýjan dili azeri dili başgyrt dili + buluç dili baliý dili basaa dili belarus dili @@ -152,6 +153,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic günorta haýda dili ýewreý dili hindi dili + hingliş hiligaýnon dili hmong dili horwat dili @@ -215,6 +217,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic bafia dili keln dili kürt dili + kürt dili + kurmanji dili kumyk dili komi dili korn dili @@ -322,8 +326,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic pijin dili polýak dili malisit-passamakwodi dili - prussiýa dili - peştun dili + prus dili + puştu dili portugal dili portugal dili (Ýewropa) keçua dili @@ -607,6 +611,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Hytaý Kolumbiýa Klipperton adasy + Sark Kosta-Rika Kuba Kabo-Werde @@ -839,43 +844,83 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pul birliginiň formaty Tertip rejesi Pul birligi + Emoji aňlatmasy Sagat aýlawy (12–24 sagat) Setirden setire geçiş stili + Sözleriň içinde setir bölünmeleri Ölçeg ulgamy Sanlar + Gysgaltmadan soň sözlemi bölmek Buddist senenamasy + Buddist Hytaý senenamasy + Hytaý Kopt senenamasy + Kopt Dangi senenamasy + Dangi Efiop senenamasy + Efiopiýa Efiopiýa Amete Alem senenamasy + Efiopiýa amete alem Grigorian senenamasy + Grigorian Ýewreý senenamasy + Ýewreý Hijri-kamary senenamasy + Hijri-kamary Hijri-kamary senenamasy (tablisaly, raýat eýýamy) + Hijri-kamary (tablisaly, raýat eýýamy) Hijri-kamary senenamasy (tablisaly, astronomik eýýam) + Hijri-kamary (tablisaly, astronomil eýýam) Hijri-kamary senenamasy (Umm al-Kura) + Hijri-kamary (Umm al-Kura) ISO-8601 senenamasy Ýapon senenamasy + Ýapon Pars senenamasy + Pars Minguo senenamasy + Minguo Pul birliginiň buhgalterçilik formaty + Buhgalterçilik Pul birliginiň standart formaty + Standart Deslapky Ýunikod tertip rejesi + Deslapky ýunikod Umumy maksatly gözleg + Gözleg Standart tertip rejesi + Standart + Deslapky + Emoji + Tekst 12 sagat ulgamy (0–11) + 12 (0–11) 12 sagat ulgamy (1–12) + 12 (1–12) 24 sagat ulgamy (0–23) + 24 (0–23) 24 sagat ulgamy (1–24) + 24 (1–24) Setirden setire geçişiň gowşak stili + Gowşak Setirden setire geçişiň adaty stili + Adaty Setirden setire geçişiň berk stili + Berk + Hemmesi geçsin + Hemmesi galsyn + Adaty + Sözlemler galsyn Metrik ulgam + Metrik Imperial ölçeg ulgamy + Iňlis ABŞ ölçeg ulgamy + ABŞ Arap-hindi sanlary Arap-hindi sanlarynyň giňeldilen görnüşi Ermeni sanlary @@ -916,6 +961,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Taý sanlary Tibet sanlary Waý sanlary + öçürilen + açyk Metrik @@ -938,13 +985,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic [c q v x] [A B Ç D E Ä F G H I J Ž K L M N Ň O Ö P R S Ş T U Ü W Y Ý Z] [  \- ‑ , % ‰ + 0 1 2 3 4 5 6 7 8 9] - [\- ‑ – — , ; \: ! ? . … "“” ( ) \[ \] \{ \} § @ * #] + [\- ‑ – — , ; \: ! ? . … ' "“” ( ) \[ \] \{ \} § @ * / {\&,} #] + [· / < = > ~ №] [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -990,6 +1035,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'sagat' {0} + + {1}, {0} + @@ -998,6 +1046,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'sagat' {0} + + {1}, {0} + @@ -1006,6 +1057,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -1014,14 +1068,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + + E, h B + E, h:mm B d E + E, h a E h:mm a E h:mm:ss a - h a + G M.y + G dd.MM.y E h:mm a h:mm:ss a + 'sagat' HH, v dd.MM dd.MM E d MMM @@ -1039,12 +1101,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMMM y - - h B – h B - - - h:mm B – h:mm B - h a – h a h–h a @@ -1407,18 +1463,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic + E, h B d E E h:mm a E h:mm:ss a - GGGGG dd.MM.y + G MM.y + G dd.MM.y + G dd.MM.y, E G MMM y G d MMM y G d MMM y, E - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v + 'sagat' HH v dd.MM dd.MM E d MMM @@ -1440,11 +1499,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic - h B – h B h – h B - h:mm B – h:mm B h:mm – h:mm B @@ -1481,10 +1538,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic G d MMM, E – d MMM, E y G d MMM y, E – d MMM y, E - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1495,10 +1548,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - MM – MM @@ -1612,7 +1661,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - d/M/y GGGGG + d.M.y GGGGG @@ -1620,7 +1669,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic d, E y G - d.M.y GGGGG + M.y G + d.M.y G + E, d.M.y G MMM y G d MMM, y G E, d MMM, y G @@ -2182,9 +2233,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Angilýa - - Tirana - Ýerewan @@ -2437,6 +2485,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pasha adasy + + Koýýaik + Punta-Arenas @@ -2646,7 +2697,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pnompen - Enderberi + Kanton adasy Komor adalary @@ -3107,6 +3158,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ýohannesburg + + + Akri wagty + Akri standart wagty + Akri tomusky wagty + + Owganystan wagty @@ -3129,9 +3187,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Günbatar Afrika wagty - Günbatar Afrika standart wagty - Günbatar Afrika tomusky wagty + Günbatar Afrika wagty @@ -3179,6 +3235,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Anadyr wagty + Anadyr tomusky wagty @@ -3486,6 +3543,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gaýana wagty + + + Gawaý-Aleut standart wagty + + Gawaý-Aleut wagty @@ -3568,6 +3630,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Petropavlowsk-Kamçatskiý wagty + Kamçatka tomusky wagty @@ -3835,6 +3898,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Samara wagty + Samara tomusky wagty @@ -4075,13 +4139,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 + + + #,##0.00 ¤ + #,##0.00 ¤ - #,##0.00;(#,##0.00) + #,##0.00 ¤ + #,##0.00 @@ -4891,6 +4968,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic gündogar karib dollary gündogar karib dollary + + karib guldeni + karib guldeni + karib guldeni + Kg. + KFA BCEAO franky @@ -4919,6 +5002,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic zambiýa kwaçasy zambiýa kwaçasy + + Zimbabwe altyny + Zimbabwe altyny + Zimbabwe altyny + {0} gün @@ -5120,7 +5208,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millimol/litr {0} millimol/litr - + + bölek + {0} bölek + {0} bölek + + {0} bölejik/million {0} bölejik/million @@ -5139,6 +5232,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic mollar + + gýukoza + {0} glýukoza + {0} glýukoza + litr/kilometr {0} litr/kilometr @@ -5395,7 +5493,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic santimetr başyna nokat santimetr başyna {0} nokat - santimetr başyna {0} nokat + {0} nokat santimetr başyna nokat dýuým başyna @@ -5627,6 +5725,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} millimetr simap sütüni {0} millimetr simap sütüni + + simap sütüni + {0} simap sütüni + {0} simap sütüni + funt/inedördül dýuým {0} funt/inedördül dýuým @@ -5800,6 +5903,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} metrik käse {0} metrik käse + + metrik suwuk unsiýa + {0} metrik suwuk unsiýa + {0} metrik suwuk unsiýa + akr-fut {0} akr-fut @@ -5880,21 +5988,70 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Imp. kwarta {0} Imp. kwarta - - ýagtylyk - {0} ýagtylyk - {0} ýagtylyk + + steradian + {0} steradian + {0} steradian - - bölejik/milliard - milliardda {0} bölejik - milliardda {0} bölejik + + katal + {0} katal + {0} katal - - gije - {0} gije - {0} gije - {0}/gije + + kulon + {0} kulon + {0} kulon + + + farad + {0} farad + {0} farad + + + genri + {0} genri + {0} genri + + + simens + {0} simens + {0} simens + + + kaloriýa [IT] + {0} kaloriýa [IT] + {0} kaloriýa [IT] + + + bekkerel + {0} bekkerel + {0} bekkerel + + + ziwert + {0} ziwert + {0} ziwert + + + greý + {0} greý + {0} greý + + + kilogram-güýç + {0} kilogram-güýç + {0} kilogram-güýç + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber esasy ugur @@ -5962,8 +6119,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic millimol/litr - - bölejik/million + + bölek + {0} bölek + {0} bölek + + + böl/mln. + {0} böl/mln. + {0} böl/mln. göterim @@ -5974,6 +6138,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic permiriad + + Glýuk + {0} Glýuk + {0} Glýuk + litr/km {0} l/km @@ -6334,6 +6503,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mmHg {0} mmHg + + simap sütüni + {0} simap süt. + {0} simap süt. + dý sim.süt. {0} dý sim.süt. @@ -6362,6 +6536,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} dü. {0} dü. + + Bft {0} + Bft {0} + sm³ {0} sm³ @@ -6411,6 +6589,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mkä {0} mkä + + suw uns m. + {0} suw uns m. + {0} suw uns m. + akr-ft {0} ak-ft @@ -6481,15 +6664,75 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kt Imp. {0} kt Imp. + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + Kl + {0} Kl + {0} Kl + + + {0} F + {0} F + + + Gn + {0} Gn + {0} Gn + + + Sm + {0} Sm + {0} Sm + + + kal-IT + {0} kal-IT + {0} kal-IT + + + Bk + {0} Bk + {0} Bk + + + Zw + {0} Zw + {0} Zw + + + Gr + {0} Gr + {0} Gr + + + kgg + {0} kgg + {0} kgg + + + {0} T + {0} T + + + {0} Wb + {0} Wb + ýagtylyk {0} ýagtylyk {0} ýagtylyk - - bölejik/milliard - {0} bölejik/milliard - {0} bölejik/milliard + + böl/mlrd. + {0} böl/mlrd + {0} böl/mlrd gije @@ -6519,9 +6762,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}″ {0}″ + + bölek + {0} bölek + {0} bölek + + + bmln + {0} bmln + {0} bmln + % + + Glýuk + {0} Glýuk + {0} Glýuk + {0}m/gUK {0}m/gUK @@ -6623,6 +6881,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mmHg {0}mmHg + + simap süt. + {0} sim. süt. + {0} sim. süt. + ″ Hg {0}″ Hg @@ -6636,10 +6899,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic m/s + + Bft {0} + Bft {0} + {0}l {0}l + + suw uns m. + {0} suw uns m. + {0} suw uns m. + {0}galIm {0}galIm @@ -6678,22 +6950,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} kt-Imp. {0} kt-Imp. - - ýagtylyk - {0} ýagtylyk - {0} ýagtylyk + + Kl + {0} Kl + {0} Kl - + + Gn + {0} Gn + {0} Gn + + + Sm + {0} Sm + {0} Sm + + + kal-IT + {0} kal-IT + {0} kal-IT + + + Bk + {0} Bk + {0} Bk + + + Zw + {0} Zw + {0} Zw + + + Gr + {0} Gr + {0} Gr + + + kgg + {0} kgg + {0} kgg + + bmlrd {0} bmlrd {0} bmlrd - - gije - {0} gije - {0} gije - {0}/gije - {0}gd {0}dg diff --git a/make/data/cldr/common/main/tn.xml b/make/data/cldr/common/main/tn.xml index e157138b2a5..7d8cbf92728 100644 --- a/make/data/cldr/common/main/tn.xml +++ b/make/data/cldr/common/main/tn.xml @@ -336,6 +336,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic monongwaga ngwaga o tlang + + kgwedi e fetileng + kgwedi eno + kgwedi e tlang + + + beke e fetileng + beke eno + beke e tlang + + + maabane + gompieno + kamoso + + + Tshipi e fetileng + Tshipi eno + Tshipi e tlang + @@ -347,7 +367,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + ' diff --git a/make/data/cldr/common/main/to.xml b/make/data/cldr/common/main/to.xml index e3010060c94..adea3915467 100644 --- a/make/data/cldr/common/main/to.xml +++ b/make/data/cldr/common/main/to.xml @@ -696,6 +696,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -842,6 +843,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -862,6 +864,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -872,6 +875,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic + @@ -1351,14 +1355,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic fakapēsia fakalepupelika siaina anga paʻanga-kalake + paʻanga-kalake anga paʻanga-sīpinga - siaina-nimalahi + sīpinga ki muʻa, hoa tikisinale ʻunikōti ngaahi ongo fakaʻeulope - siaina-fakafaingofua fika telefoni piniini fakafoʻou @@ -1370,15 +1374,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic tongi tefitoʻi sūini takai houa 0–11 + 12 (0–11) takai houa 1–12 + 12 (1–12) takai houa 0–23 + 24 (0–23) takai houa 1–24 + 24 (1–24) fesiʻilaine ngaloku + ngaloku fesiʻilaine faʻafai + faʻafai fesiʻilaine mafao + mafao founga fakamita + fakamita founga fakapilitānia + fakapilitānia founga fakaʻamelika + fakaʻamelika fika fakaʻahomi fika fakaʻalepea fika fakaʻalepea fakalahi @@ -1577,16 +1591,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - - Taʻu maletile - - - TMT - - - @@ -2719,11 +2723,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Taimi liliu {0} Taimi totonu - - HTT - HTT - HTL - Honolulu @@ -2797,9 +2796,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Loma - ʻEnitipulī - - Kanitoni @@ -2924,9 +2920,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - houa fakaʻafelika-hihifo - houa fakaʻafelika-hihifo taimi totonu - houa fakaʻafelika-hihifo taimi liliu + houa fakaʻafelika-hihifo @@ -3314,6 +3308,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic houa fakakuiana + + + houa fakahauaiʻi-aleuti taimi totonu + + houa fakahauaiʻi-aleuti @@ -4281,7 +4280,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic kongokonga kongokonga ʻe {0} - + + paati + paati ʻe {0} + + konga he miliona konga ʻe {0} he miliona @@ -4695,6 +4698,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimita meakuli milimita meakuli ʻe {0} + + meakuli + meakuli ʻe {0} + pāuni he ʻinisi sikuea pāuni he ʻinisi sikuea ʻe {0} @@ -4834,6 +4841,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ipu fakamita ipu fakamita ʻe {0} + + ʻaunisetafe fakamita + ʻaunisetafe fakamita ʻe {0} + ʻeka-fute ʻeka-fute ʻe {0} @@ -4860,10 +4871,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic painite painite ʻe {0} + + painite fakaʻemipaea + painite fakaʻemipaea ʻe {0} + ipu ipu ʻe {0} + + ipu fakaʻemipaea + ipu fakaʻemipaea ʻe {0} + ʻaunise tafe ʻaunise tafe ʻe {0} @@ -4900,11 +4919,59 @@ CLDR data files are interpreted according to the LDML specification (http://unic kuata fakaʻemipaea kuata fakaʻemipaea ʻe {0} + + lētiani sikuea + lētiani sikuea ʻe {0} + + + pekeleli + pekeleli ʻe {0} + + + sīveti + sīveti ʻe {0} + + + kelē + kelē ʻe {0} + + + kilokalami-mālohi + kilokalami-mālohi ʻe {0} + + + loti + loti ʻe {0} + + + sēini + sēini ʻe {0} + + + tesila + tesila ʻe {0} + + + Uepe + Uepe ʻe {0} + + + lanikine + lanikine ʻe {0} + + + fakahiliuike + fakahiliuike ʻe {0} + + + penisini-tatau + penisini-tatau ʻe {0} + vavemaama vavemaama ʻe {0} - + konga ʻi he piliona konga ʻe {0} ʻi he piliona @@ -5015,7 +5082,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kkonga kkonga ʻe {0} - + khm khm ʻe {0} @@ -5427,6 +5494,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic mm-Hg mm-Hg ʻe {0} + + Hg ʻe {0} + pā/in² pā/in² ʻe {0} @@ -5552,6 +5622,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic ipm ipm ʻe {0} + + ʻau-tf-m + ʻau-tf-m ʻe {0} + ʻe-ft ʻe-ft ʻe {0} @@ -5577,10 +5651,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic pt ʻe {0} + + pt-ʻem + pt-ʻem ʻe {0} + ip ip ʻe {0} + + ip-ʻem + ip-ʻem ʻre {0} + ʻau-tf ʻau-tf ʻe {0} @@ -5629,6 +5711,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic ku-ʻem ku-ʻem ʻe {0} + + lēt² + lēt² ʻe {0} + + + Pq + Pq ʻe {0} + + + Sv ʻe {0} + + + Ky + Ky ʻe {0} + + + kk-m + kk-m ʻe {0} + + + lt + lt ʻe {0} + + + sn + sn ʻe {0} + + + T ʻe {0} + + + Up + Up ʻe {0} + + + °L + °L ʻe {0} + + + fhu + fhu ʻe {0} + + + pe-t + pe-t ʻe {0} + vm vm ʻe {0} @@ -5715,7 +5843,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic kk kk ʻe {0} - + {0} khm @@ -6071,6 +6199,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} mm-Hg + + Hg ʻe {0} + {0} pā/in² @@ -6173,6 +6304,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ipm + + ʻau-tf-m + {0} ʻau-tf-m + {0} ʻe-ft @@ -6193,9 +6328,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} pt + + pt-ʻem + {0} pt-ʻem + {0} ip + + ip-ʻem + {0} ip-ʻem + {0} ʻau-tf @@ -6233,6 +6376,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} ku-ʻem + + lēt² + {0} lēt² + + + Pq + {0} Pq + + + {0} Sv + + + Ky + {0} Ky + + + kk-m + {0} kk-m + + + lt + {0} lt + + + sn + {0} sn + + + {0} T + + + Up + {0} Up + + + °L + {0} °L + + + fhu + {0} fhu + + + pe-t + {0} pe-t + vm {0} vm diff --git a/make/data/cldr/common/main/tok.xml b/make/data/cldr/common/main/tok.xml index 59db8671691..c1c54695adf 100644 --- a/make/data/cldr/common/main/tok.xml +++ b/make/data/cldr/common/main/tok.xml @@ -11,74 +11,160 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - {0} pi {1} - {0} pi {1} - - toki Alapi - toki Panla - toki Tosi + toki Apikan + toki Amali + toki Alapi + toki Panla + toki Posuna + toki Supo + toki Tosi + toki Elin toki Inli - toki Inli pi ma Kanata - toki Inli pi ma Piten - toki Inli pi ma Juke - toki Epanja - toki Epanja pi ma Amelika - toki Kanse - toki Kanse pi ma Kanata - toki Insi - toki Intonesija - toki Italija - toki Nijon - toki Anku - toki Netelan - toki Posuka - toki Potuke - toki Lusi - toki Tawi + toki Inli pi ma Oseja + toki Inli pi ma Kanata + toki Inli pi ma Juke + toki Epelanto + toki Epanjo + toki Epanjo pi ma Amelika + toki Epanjo pi ma Epanja + toki Epanjo pi ma Mesiko + toki Esuka + toki Pasi + toki Pasi pi ma Akan + toki Sumi + toki Takalo + toki Kanse + toki Kanse pi ma Kanata + toki Lise + toki Kusalasi + toki Iwi + toki Insi + toki Kowata + toki Maja + toki Intelinwa + toki Intonesija + toki Ito + toki Italija + toki Nijon + toki Losupan + toki Sowa + toki Kame + toki Anku + toki Kenuwe + toki Lasina + toki Ma + toki Majoli + toki Malasi + toki Melaju + toki mute + toki Mijama + toki Pan pi ma seli + toki Nosiki lipu + toki Netelan + toki Nosiki sin + toki Nosiki + toki Posuka + toki Potuke + toki Lusi + toki Somali + toki Sepi + toki Suwasi + toki Sensa + toki Suwawili + toki Suwawili pi ma Konko + toki Tami + toki Teluku + toki Tawi + toki Suwana toki pona - toki Tuki + toki Tuki + toki Sonka + toki Ukawina toki ante + toki Utu toki Opeki - toki Sonko + toki Wenta + toki Wije + toki Olapu + toki Kosa + toki Jolupa + toki Ju + toki Konton + toki Sonko + toki Sonko kulupu + toki Sonko pi linja lili + toki An pi linja lili + toki Sonko pi linja mute + toki An pi linja mute + toki Sulu + toki ala - - + + + + + + + + + + + + + + + + + + + + + + ma ale - ma Apika - ma Osijanija - ma Amelika - ma Asija - ma Elopa + ma Apika + ma Amelika lete + ma Amelika seli + ma Osejanija + ma Amelika insa + ma Amelika + ma Elopa seli + ma Asija + ma Elopa + ma Elopa pi kama suno + ma Elopa lete + ma Elopa pi pini suno ma Antola - ma Akanisan + ma Imala + ma Akan ma Sipe ma Aja ma Ankola - ma Antasika + ma Antasika ma Alensina - ma Esalasi - ma Oselija + ma Esalasi + ma Oseja ma Posan - ma Panla - ma Pesije + ma Panla + ma Pelije ma Pukinapaso toki Pokasi ma Palani ma Penen - ma Pasiju - ma Posuwana + ma Pasiju + ma Suwana ma Pelalusi + ma Kanata ma Konko pi ma tomo Kinsasa ma Santapiken ma Konko pi ma tomo Pasapi @@ -86,57 +172,58 @@ CLDR data files are interpreted according to the LDML specification (http://unic ma Kosiwa ma Sile ma Kamelun - ma Sonko + ma Sonko ma Kolonpija ma Kiposi ma Seki - ma Tosi + ma Tosi ma Sipusi ma Tansi ma Sasali - ma Ekato + ma Ekuwato ma Esi - ma Masu + ma Masi ma Eliteja - ma Epanja + ma Epanja ma Isijopija kulupu ma Elopa - ma Sumi + ma Sumi ma Pisi - ma Kanse + ma Kanse ma Kapon + ma Juke ma Katelo ma Kana ma Kanpija ma Kine ma Kinejekatolija - ma Elena + ma Elin ma Kinepisa - ma Onkon - ma Lowasi - ma Mosijo - ma Intonesija + ma Onkon + ma Kowata + ma Maja + ma Intonesija ma Alan - ma Isale - ma Palata - ma Ilakija - ma Ilan + ma Isale + ma Palata + ma Ilaki + ma Ilan ma Isilan - ma Italija + ma Italija ma Utun - ma Nijon - ma Kenja - ma Kanpusi + ma Nijon + ma Kenja + ma Kame ma Kilipasi ma Komo - ma Anku - ma Soson + ma Soson + ma Anku ma Kuwasi ma Lunpan ma Lisensan ma Lanka ma Lapewija - ma Lesoto + ma Sutu ma Lijatuwa ma Lusepu ma Lawi @@ -146,70 +233,119 @@ CLDR data files are interpreted according to the LDML specification (http://unic ma Malakasi ma Maketonija ma Mali - ma Mijama + ma Mijama ma Mulitanija ma Mowisi ma Malawi - ma Mesiko - ma Malasija + ma Mesiko + ma Malesija ma Mosanpi ma Namipija ma Nise - ma Naselija - ma Netelan - ma Nosiki - ma Nusilan + ma Nasilija + ma Netelan + ma Nosiki + ma Awatejalowa ma Uman - ma Pelu + ma Pelu ma Papuwanijukini - ma Pilipina - ma Pakisan - ma Posuka - ma Pilisin - ma Potuke + ma Pilipina + ma Pakitan + ma Posuka + ma Palasin + ma Potuke + ma Kita ma Lomani - ma Sopisi - ma Lusi + ma Sepi + ma Lusi ma Luwanta - ma Sawusi + ma Sajusi ma Sutan - ma Sensa - ma Sinkapo + ma Sensa + ma Sinkapo ma Lowensina ma Lowenki ma Sijelalijon ma Samalino ma Seneka - ma Somalija + ma Somali ma Sasutan - ma Sulija - ma Sawasi + ma Sawato + ma Suli + ma Suwasi ma Sate ma Toko - ma Tawi + ma Tawi ma Tunisi ma Tona - ma Tuki + ma Tuki ma Tuwalu - ma Tansanija - ma Ukawina + ma Tawan + ma Tansanija + ma Ukawina ma Ukanta kulupu pi ma ale - ma Mewika - ma Opekisan + ma Mewika + ma Opeki ma Wasikano ma Penesuwela - ma Wije + ma Wije ma Wanuwatu ma Samowa ma Jamanija - ma Setapika + ma Unsansi ma Sanpija ma Sinpapuwe + ma ante + + sitelen IPA + sitelen UPA + + + nasin tenpo + nasin mani + nasin nimi + mani + nasin nanpa pi suli ijo + sitelen nanpa + - sitelen nanpa Alapi + nasin tenpo Nijon + nasin Nijon + nasin nimi Juniko + nasin Juniko + nasin nimi Emosi + nasin nimi Pinin + nasin Pinin + nasin sitelen + nasin sitelen Emosi + nasin sitelen Emosi ala + nasin nanpa pi kulupu SI + nasin SI + nasin nanpa pi ma Juke + nasin Juke + nasin nanpa pi ma Mewika + nasin Mewika + nasin nanpa Alapi + sitelen nanpa Panla + sitelen nanpa Elin + sitelen nanpa Kusalasi + sitelen nanpa Sonko + sitelen nanpa Sonko pi linja lili + sitelen nanpa mani Sonko pi linja lili + sitelen nanpa Sonko pi linja mute + sitelen nanpa mani Sonko pi linja mute + sitelen nanpa Iwi + sitelen nanpa Sowa + sitelen nanpa Nijon + sitelen nanpa mani Nijon + sitelen nanpa Kanata sitelen nanpa Lasina + sitelen nanpa Mijama + sitelen nanpa Teluku + sitelen nanpa Tawi + sitelen nanpa Po nasin pi ma ale @@ -217,16 +353,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic nasin pi ma Mewika - toki li {0} - sitelen li {0} - ma li {0} + toki: {0} + sitelen: {0} + ma: {0} [a e i j k l m n o p s t u w] [b c d f g h q r v x y z] [A E I J K L M N O P S T U W] - [\- ‑ / # % + 0 1 2 3 5 6 7 8 9] + [\- ‑ / # % + 0 1 2 3 4 5 6 7 8 9] [\- ‑ , ; \: ! ? . '‘’ "“” ( ) \[ \] @ * / #] @@ -235,23 +371,32 @@ CLDR data files are interpreted according to the LDML specification (http://unic - mun #1 - mun #2 - mun #3 - mun #4 - mun #5 - mun #6 - mun #7 - mun #8 - mun #9 - mun #10 - mun #11 - mun #12 + tenpo mun #1 + tenpo mun #2 + tenpo mun #3 + tenpo mun #4 + tenpo mun #5 + tenpo mun #6 + tenpo mun #7 + tenpo mun #8 + tenpo mun #9 + tenpo mun #10 + tenpo mun #11 + tenpo mun #12 + + 7 + 1 + 2 + 3 + 4 + 5 + 6 + suno esun #7 suno esun #1 @@ -262,6 +407,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic suno esun #6 + + + 7 + 1 + 2 + 3 + 4 + 5 + 6 + + @@ -270,23 +426,228 @@ CLDR data files are interpreted according to the LDML specification (http://unic pi pini suno + + + open suno + pini suno + + + + + + 'sike' #y 'la' MMM 'la' 'suno' #d + + + + + 'tenpo' 'sike' #y 'la' 'tenpo' MMMM 'la' 'tenpo' 'suno' #d + + + + + 'sike' #y 'la' MMM 'la' 'suno' #d + + + + + y-MM-dd + + + + + + + zzzz 'la' HH:mm:ss + + + + + z 'la' HH:mm:ss + + + + + HH:mm:ss + + + + + HH:mm + + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + + + {1} {0} + + + 'tenpo' 'ilo' #h B + #d + 'tenpo' 'ilo' #h a #h:mm a #HH:mm #h:mm:ss a #HH:mm:ss #h:mm:ss a 'lon' v #HH:mm:ss 'lon' v + #h:mm a 'lon' v + MMMM 'la' 'sike' 'esun' #W + #y #y)#M)#d 'sike' #y ) #M ) #d + #y 'la' MMMM + #y 'la' QQQ + #y 'la' QQQQ + Y 'la' 'sike' 'esun' #w + + + tenpo + + + tenpo sike + tenpo sike pini + tenpo sike ni + tenpo sike wan + + tenpo sike kama {0} + + + tenpo sike pini {0} + + + + sike + + + sike + + + tenpo mun + tenpo mun pini + tenpo mun ni + tenpo mun kama + + tenpo mun kama {0} + + + tenpo mun pini {0} + + + + mun + + + mun + + + tenpo esun + tenpo esun pini + tenpo esun ni + tenpo esun kama + + tenpo esun kama {0} + + + tenpo esun pini {0} + + + + esun + + + esun + + + tenpo suno + tenpo suno pini + tenpo suno ni + tenpo suno kama + + tenpo suno kama {0} + + + tenpo suno pini {0} + + + + suno + + + suno + + + tenpo esun #7 pini + tenpo esun #7 ni + tenpo esun #7 kama + + + tenpo esun #1 pini + tenpo esun #1 ni + tenpo esun #1 kama + + + tenpo esun #2 pini + tenpo esun #2 ni + tenpo esun #2 kama + + + tenpo esun #3 pini + tenpo esun #3 ni + tenpo esun #3 kama + + + tenpo esun #4 pini + tenpo esun #4 ni + tenpo esun #4 kama + + + tenpo esun #5 pini + tenpo esun #5 ni + tenpo esun #5 kama + + + tenpo esun #6 pini + tenpo esun #6 ni + tenpo esun #6 kama + + + tenpo ilo + tenpo ilo ni + + tenpo ilo kama {0} + + + tenpo ilo pini {0} + + + + nasin tenpo + + - tenpo UTC{0} + tenpo GMT{0} tenpo UTC tenpo pi {0} tenpo seli suno pi {0} @@ -310,19 +671,91 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - - - %#,#0 - - - ¤#,#0.00 + ¤ #,#0.00 + #,#0.00 + + + ¤ #,#0.00 + #,#0.00 + + + mani Akan + + + mani Oseja + + + mani Panla + + + mani Intonesija + + + mani Palata + + + mani Ilan + + + mani Kame + + + mani Lanka + + + mani Mijama + + + mani Malesija + + + mani Awatejalowa + + + mani Pilipina + + + mani Pakitan + + + mani Sinkapo + + + mani Tawi + + + mani Wije + + + + tenpo suno {0} + + + + hh:mm + + + hh:mm:ss + + + mm:ss + + + + + lon:l:y + ala:a:n + + + + informal + diff --git a/make/data/cldr/common/main/tpi.xml b/make/data/cldr/common/main/tpi.xml index becca68770f..4916be29031 100644 --- a/make/data/cldr/common/main/tpi.xml +++ b/make/data/cldr/common/main/tpi.xml @@ -199,6 +199,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/tr.xml b/make/data/cldr/common/main/tr.xml index 21e58dc9a8b..5bed509b4fd 100644 --- a/make/data/cldr/common/main/tr.xml +++ b/make/data/cldr/common/main/tr.xml @@ -333,6 +333,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bafia Köln lehçesi Kürtçe + Kürtçe + Kurmanci Kumukça Kutenai dili Komi @@ -938,6 +940,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Çin Kolombiya Clipperton Adası + Sark Kosta Rika Küba Cabo Verde @@ -1215,35 +1218,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sayısal Sıralama Sıralama Gücü Para Birimi + Emoji Gösterimi Saat Sistemi (12 - 24) Satır Sonu Stili + Sözcükler İçindeki Satır Sonları Ölçü Sistemi Rakamlar + Kısaltmadan Sonra Cümle Sonu Saat Dilimi Yerel Varyant Özel Kullanım Budist Takvimi + Budist Çin Takvimi + Çin Kıpti Takvim + Kıpti Dangi Takvimi + Dangi Etiyopik Takvim + Etiyopik Etiyopik Amete Alem Takvimi + Etiyopik Amete Alem Miladi Takvim + Miladi İbrani Takvimi + İbrani Ulusal Hint Takvimi Hicri Takvim + Hicri Hicri Takvim (16 Temmuz 622) + Hicri (16 Temmuz 622) Hicri Takvim (Suudi) Hicri Takvim (15 Temmuz 622) + Hicri (15 Temmuz 622) Hicri Takvim (Ümmü-l Kurra Takvimi) + Hicri (Ümmü-l Kurra Takvimi) ISO-8601 Takvimi Japon Takvimi + Japon İran Takvimi + İran Çin Cumhuriyeti Takvimi + Çin Cumhuriyeti Muhasebe Para Biçimi + Muhasebe Standart Para Biçimi + Standart Sembolleri Sıralama Sembolleri Yoksayarak Sıralama Aksanları Normal Olarak Sıralama @@ -1253,23 +1276,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Önce Büyük Harfleri Sıralama Büyük/Küçük Harfe Duyarlı Olmadan Sıralama Büyük/Küçük Harfe Duyarla Sıralama - Geleneksel Çince Sıralama Düzeni - Big5 Önceki Sıralama Düzeni (uyumluluk için) + Uyumluluk Sözlük Sıralama Düzeni + Sözlük Saptanmış Unicode Sıralama Düzeni + Saptanmış Unicode Emoji Sıralama Düzeni Avrupa Sıralama Kuralları - Basitleştirilmiş Çince Sıralama Düzeni - GB2312 Telefon Defteri Sıralama Düzeni + Telefon Defteri Fonetik Sıralama Düzeni + Fonetik Pinyin Sıralama Düzeni + Pinyin Genel Amaçlı Arama + Arama Hangul İlk Sessiz Harfe Göre Arama Standart Sıralama Düzeni + Standart Vuruş Sıralama Düzeni + Vuruş Geleneksel Sıralama Düzeni + Geleneksel Radikal-Vuruş Sıralama Düzeni + Radikal-Vuruş Zhuyin Sıralama Düzeni + Zhuyin Normalleştirme Olmadan Sıralama Unicode Normalleştirilmiş Olarak Sıralama Rakamları Ayrı Sıralama @@ -1282,18 +1315,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tam Genişlik Yarım genişlik Rakam + Varsayılan + Emoji + Metin 12 Saat Sistemi (0–11) + 12 (0–11) 12 Saat Sistemi (1–12) + 12 (1–12) 24 Saat Sistemi (0–23) + 24 (0–23) 24 Saat Sistemi (1–24) + 24 (1–24) Serbest Satır Sonu Stili + Serbest Normal Satır Sonu Stili + Normal Katı Satır Sonu Stili + Katı + Tümünü kes + Tümünü koru + Normal + Sözcük öbeklerinde koru US BGN Transliterasyon UN GEGN Transliterasyon Metrik Sistem + Metrik İngiliz Ölçü Sistemi + İngiliz ABD Ölçü Sistemi + ABD Ahom Rakamları Hint-Arap Rakamları Genişletilmiş Hint-Arap Rakamları @@ -1371,6 +1421,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Geleneksel Rakamlar Vai Rakamları Warang Citi Rakamları + Kapalı + Açık Metrik @@ -1504,11 +1556,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E E a h:mm E a h:mm:ss + G M.y d/M/y GGGGG + G dd.MM.y E G MMM y G d MMM y G d MMM y E - h a h:mm a h:mm:ss a dd/MM @@ -1573,10 +1626,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ G d MMM E – d MMM E y G d MMM y E – d MMM y E - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1587,10 +1636,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - dd/MM – dd/MM dd/MM – dd/MM @@ -1877,7 +1922,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d E E a h:mm E a h:mm:ss - GGGGG dd.MM.y + MM/y G + G dd.MM.y + G dd.MM.y E G MMM y G d MMM y G d MMM y E @@ -1886,8 +1933,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ a h:mm:ss a h:mm:ss v a h:mm v + HH v d/M - d/MM E + d/M E d MMM d MMM E d MMMM @@ -1919,19 +1967,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ GGGGG MM.y – GGGGG MM.y GGGGG MM.y – MM.y - GGGGG MM.y – MM.y + G MM.y – MM.y - GGGGG dd.MM.y – dd.MM.y + G dd.MM.y – dd.MM.y GGGGG dd.MM.y – GGGGG dd.MM.y GGGGG dd.MM.y – dd.MM.y GGGGG dd.MM.y – dd.MM.y - GGGGG dd.MM.y E – dd.MM.y E + G dd.MM.y E – dd.MM.y E GGGGG dd.MM.y E – GGGGG dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E - GGGGG dd.MM.y E – dd.MM.y E + G dd.MM.y E – dd.MM.y E + G dd.MM.y E – dd.MM.y E G MMM y – G MMM y @@ -2085,6 +2133,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hicri + + + G M.y + G d/M/y + G d/M/y E + + @@ -2518,9 +2573,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Erivan - - Showa - Viyana @@ -2578,9 +2630,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Prag - - Büsingen - Cibuti @@ -2668,7 +2717,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bişkek - Enderbury + Canton Adası Komor @@ -2897,9 +2946,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Batı Afrika Saati - Batı Afrika Standart Saati - Batı Afrika Yaz Saati + Batı Afrika Saati @@ -3287,6 +3334,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Guyana Saati + + + Hawaii-Aleut Standart Saati + + Hawaii-Aleut Saati @@ -3737,6 +3789,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chuuk Saati + + + Türkiye Saati + Türkiye Standart Saati + Türkiye Yaz Saati + + + TSİ + + Türkmenistan Saati @@ -3899,41 +3961,64 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 + ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) - #,##0.00 ¤;(#,##0.00 ¤) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) - 0 B ¤ - 0 B ¤ - 00 B ¤ - 00 B ¤ - 000 B ¤ - 000 B ¤ - 0 Mn ¤ - 0 Mn ¤ - 00 Mn ¤ - 00 Mn ¤ - 000 Mn ¤ - 000 Mn ¤ - 0 Mr ¤ - 0 Mr ¤ - 00 Mr ¤ - 00 Mr ¤ - 000 Mr ¤ - 000 Mr ¤ - 0 Tn ¤ - 0 Tn ¤ - 00 Tn ¤ - 00 Tn ¤ - 000 Tn ¤ - 000 Tn ¤ + ¤0 B + ¤ 0 B + ¤0 B + ¤ 0 B + ¤00 B + ¤ 00 B + ¤00 B + ¤ 00 B + ¤000 B + ¤ 000 B + ¤000 B + ¤ 000 B + ¤0 Mn + ¤ 0 Mn + ¤0 Mn + ¤ 0 Mn + ¤00 Mn + ¤ 00 Mn + ¤00 Mn + ¤ 00 Mn + ¤000 Mn + ¤ 000 Mn + ¤000 Mn + ¤ 000 Mn + ¤0 Mr + ¤ 0 Mr + ¤0 Mr + ¤ 0 Mr + ¤00 Mr + ¤ 00 Mr + ¤00 Mr + ¤ 00 Mr + ¤000 Mr + ¤ 000 Mr + ¤000 Mr + ¤ 000 Mr + ¤0 Tn + ¤ 0 Tn + ¤0 Tn + ¤ 0 Tn + ¤00 Tn + ¤ 00 Tn + ¤00 Tn + ¤ 00 Tn + ¤000 Tn + ¤ 000 Tn + ¤000 Tn + ¤ 000 Tn @@ -4826,6 +4911,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Doğu Karayip doları + + Karayip guldeni + Karayip guldeni + Karayip guldeni + Özel Çekme Hakkı (SDR) @@ -4910,6 +5000,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zimbabve Doları + + Zimbabve altını + Zimbabve altını + Zimbabve altını + Zimbabve Doları (2009) @@ -5125,7 +5220,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimol/litre {0} milimol/litre - + parça/milyon {0} parça/milyon {0} parça/milyon @@ -5144,6 +5239,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ onbinde {0} onbinde {0} + + glikoz + {0} glikoz + {0} glikoz + litre/kilometre {0} litre/kilometre @@ -5574,6 +5674,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milimetre cıva {0} milimetre cıva + + cıva + {0} cıva + {0} cıva + libre/inç kare {0} libre/inç kare @@ -5744,6 +5849,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrik su bardağı {0} metrik su bardağı + + metrik sıvı ons + {0} buşel {0} buşel @@ -5802,22 +5910,67 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ İng. quart - - ışık - {0} ışık - {0} ışık + + steradyan + {0} steradyan + {0} steradyan - - parça/milyar + + katal + {0} katal + {0} katal + + + coulomb + + + farad + + + henry + + + siemens + + + kalori [IT] + {0} kalori [IT] + {0} kalori [IT] + + + bekerel + {0} bekerel + {0} bekerel + + + sievert + {0} sievert + {0} sievert + + + gray + {0} gray + {0} gray + + + kilogram-kuvvet + {0} kilogram-kuvvet + {0} kilogram-kuvvet + + + tesla + {0} tesla + {0} tesla + + + weber + {0} weber + {0} weber + + {0} parça/milyar {0} parça/milyar - - gece - {0} gece - {0} gece - {0}/gece - ana yön {0}Doğu @@ -5882,6 +6035,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} öğe {0} öğe + + parça/milyon + %{0} %{0} @@ -5895,6 +6051,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ‱{0} ‱{0} + + Glc + l/km {0} l/km @@ -6327,12 +6486,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} İng. quart {0} İng. quart + + cal-IT + ışık {0} ışık {0} ışık - + parça/milyar @@ -6364,6 +6526,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmol/L {0} mmol/L + + Glc + l/100km {0} l/100km @@ -6508,16 +6673,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} İng. qt. {0} İng. qt. - - ışık - {0} ışık - {0} ışık - - - gece - {0} gece - {0} gece - {0}/gece + + cal-IT diff --git a/make/data/cldr/common/main/trv.xml b/make/data/cldr/common/main/trv.xml index 655cbab6b0e..9f224542e48 100644 --- a/make/data/cldr/common/main/trv.xml +++ b/make/data/cldr/common/main/trv.xml @@ -105,7 +105,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd diff --git a/make/data/cldr/common/main/trw.xml b/make/data/cldr/common/main/trw.xml index f6c91fe2759..b1eefb14bf1 100644 --- a/make/data/cldr/common/main/trw.xml +++ b/make/data/cldr/common/main/trw.xml @@ -2370,9 +2370,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - مغربی افریقہ ٹائم - مغربی افریقہ سٹینڈرڈ ٹائم - مغربی افریقہ سمر ٹائم + مغربی افریقہ ٹائم @@ -2722,6 +2720,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic گیانا سی وَخ + + + ہوائی الیوٹیئن اسٹینڈرڈ ٹائم + + ہوائی الیوٹیئن ٹائم @@ -3850,7 +3853,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ملی مولس فی لیٹر {0} ملی مول فی لیٹر - + فی ملین حصے {0} فی ملین حصے @@ -4445,7 +4448,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ملی مول/لیٹر - + حصے/ملین diff --git a/make/data/cldr/common/main/tt.xml b/make/data/cldr/common/main/tt.xml index 51b999e428d..98976250131 100644 --- a/make/data/cldr/common/main/tt.xml +++ b/make/data/cldr/common/main/tt.xml @@ -13,20 +13,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic африкаанс + акан амхар - гарәп - Заманча стандарт гарәп + гарәпчә + заманча стандарт гарәпчә мапуче ассам + астурианча әзәрбайҗан + азәричә башкорт + бәлүҗчә бали белорус бемба болгар - бенгали + һарианви + бһоҗпури + ании + бенгалча тибет бретон + бодо босния каталан себуано @@ -35,13 +43,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic үзәк көрд корсика чех + сазлык кричәсе + чуашча уэльс дания алман югары алман (Швейцария) + догри түбән сорб мальдив дзонг-кха + әвәчә грек инглиз Британия инглизчәсе @@ -60,7 +72,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic филиппин фарер француз + көнбатыш фризчәсе ирланд + га шотланд гэль галисия гуарани @@ -77,14 +91,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic венгр әрмән гереро + интерлингуа ибибио индонезия + интерлингве игбо + сичуан йи исланд итальян инуктикут япон + җавача грузин + кабувердиану + каинганг казакъ кхмер каннада @@ -94,12 +114,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic курух кашмири көрд + көрдчә + курманҗи + куви кыргыз латин люксембург + лигурча + ломбардча лаос литва латыш + маитһили менде малагаси маори @@ -111,23 +137,32 @@ CLDR data files are interpreted according to the LDML specification (http://unic маратхи малай мальта + Берничә тел бирма + түбән алманча непали ниуэ голланд фламандча + нурвәҗчә нүнорск + нурвәҗчә + нко + төньяк сото ньянҗа окситан оромо ория пәнҗаби папьяменто + Нигерия пидҗине поляк + прусча пушту португал португал (Европа) кечуа киче + раҗастһани ретороман румын рус @@ -135,6 +170,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic санскрит саха сантали + сардинчә синдһи төньяк саам сингал @@ -147,14 +183,19 @@ CLDR data files are interpreted according to the LDML specification (http://unic сомали албан серб + көньяк сото + сундача швед + суаһили сүрия + силезиячә тамил телугу таҗик тай тигринья төрекмән + тсвана тонга төрек татар @@ -165,28 +206,87 @@ CLDR data files are interpreted according to the LDML specification (http://unic урду үзбәк венда + вәнәтчә вьетнам + махувача волоф + кхоса + кангричә идиш йоруба - кытай + ньеңату + кантунча + кытайча, кантунча + жуаңча + кытайча мандарин кытайчасы гадиләштерелгән кытай гадиләштерелгән мандарин кытайчасы традицион кытай традицион мандарин кытайчасы + зулуча + Лингвистик эчтәлек юк + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -273,6 +373,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Кытай Колумбия Клиппертон утравы + Сарк Коста-Рика Куба Кабо-Верде @@ -493,11 +594,125 @@ CLDR data files are interpreted according to the LDML specification (http://unic Зимбабве билгесез төбәк + + тәкъвим + валюта форматы + сортлау тәртибе + валюта + сәгать системасы (12 - 24) + юл ахыры стиле + үлчәү системасы + саннар + + буддист тәкъвиме + буддист + кытай тәкъвиме + кытай + кыйбти тәкъвим + кыйбти + данги тәкъвиме + данги + хәбәши тәкъвим + хәбәши + хәбәши амәте галәм тәкъвим + хәбәши амәте галәм григориан ел исәбе + милади + гыйбрани тәкъвиме + гыйбрани + һиҗри тәкъвим + һиҗри + һиҗри тәкъвим (15 йүл 622) + һиҗри (15.07.622) + һиҗри тәкъвим (Өммелкора) + һиҗри (Өммелкора) ISO-8601 календаре + япун тәкъвиме + япун + иран тәкъвиме + иран + Кытай җөмһүрияте тәкъвиме + мингуо + хисапчылык валюта форматы + хисапчылык + гадәти валюта форматы + гадәти + беренчел юникод сортлау тәртибе + беренчел юникод + гомуми максатлы эзләү + эзләү гадәти тәртипләү ысулы + гадәти + беренчел + эмоҗи + мәтен + 12 сәгать системасы (0–11) + 12 (0–11) + 12 сәгать системасы (1–12) + 12 (1–12) + 24 сәгать системасы (0–23) + 24 (0–23) + 24 сәгать системасы (1–24) + 24 (1–24) + ирекле юл ахыры стиле + ирекле + гадәти юл ахыры стиле + гадәти + кискен юл ахыры стиле + кискен + барын күчерү + барын калдыру + гадәти + гыйбарәләрдә калдыру + метрик система + метрик + инглиз үлчәү системасы + БП + БШ үлчәү системасы + БШ + һинд-гарәп рәкымнары + киңәйтелгән һинд-гарәп рәкымнары + әрмәни рәкымнары + кече хәреф әрмәни рәкымнары + бенгал рәкымнары + чакма рәкымнары + деванагари рәкымнары + хәбәши рәкымнар + тулы киңлектә рәкымнар + гөрҗи рәкымнары + юнан рәкымнары + кече хәреф юнан рәкымнары + гөҗәрат рәкымнары + гурмухи рәкымнары + кытай унарлы рәкымнары + гадиләштерелгән кытай рәкымнары + финанс гадиләштерелгән кытай рәкымнары + горфи кытай рәкымнары + финанс горфи кытай рәкымнары + гыйбрани рәкымнары + җава рәкымнары + япун рәкымнары + финанс япун рәкымнары + кмәр рәкымнары + каннада рәкымнары + лао рәкымнары көнбатыш цифрлары + малаялам рәкымнары + меетей майек рәкымнары + мьянмар рәкымнары + ол чики рәкымнары + одия рәкымнары + рум рәкымнары + кече хәреф рум рәкымнары + горфи тамил рәкымнары + тамил рәкымнары + телугу рәкымнары + тай рәкымнары + төбет рәкымнары + вай рәкымнары + сүн + каб метрик @@ -547,21 +762,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1} {0} + {1}, {0} + + {1} {0} + {1}, {0} + + {1} {0} + {1}, {0} + + {1} {0} + G y 'ел' @@ -832,6 +1059,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} 'сәгатьтә' + + {1} {0} + @@ -840,22 +1070,31 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} 'сәгатьтә' + + {1} {0} + {1}, {0} + + {1} {0} + {1}, {0} + + {1} {0} + E, HH:mm E, HH:mm:ss G y 'ел' - G y 'ел', MMM + MMM y G G y 'ел', d MMM G y 'ел', d MMM, E h a @@ -1645,6 +1884,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пасха утравы + + Куяйкә + Пунта-Аренас @@ -1909,7 +2151,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Пномпень - + Кантон @@ -2586,9 +2828,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Көнбатыш Африка вакыты - Көнбатыш Африка стандарт вакыты - Көнбатыш Африка җәйге вакыты + Көнбатыш Африка вакыты @@ -2945,6 +3185,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гайана вакыты + + + Гавай-Алеут стандарт вакыты + + Гавай-Алеут вакыты @@ -3509,22 +3754,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ - ¤0 мең - ¤00 мең - ¤000 мең - ¤0 млн - ¤00 млн - ¤000 млн - ¤0 млрд - ¤00 млрд - ¤000 млрд - ¤0 трлн - ¤00 трлн - ¤000 трлн + 0 мең ¤ + 00 мең ¤ + 000 мең ¤ + 0 млн ¤ + 00 млн ¤ + 000 млн ¤ + 0 млрд ¤ + 00 млрд ¤ + 000млрд ¤ + 0 трлн ¤ + 00 трлн ¤ + 000 трлн ¤ @@ -4137,6 +4386,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Көнчыгыш Кариб доллары Көнчыгыш Кариб долларлары + + кариб гульдены + кариб гульдены + Көнбатыш Африка КФА франкы Көнбатыш Африка КФА франклары @@ -4161,6 +4414,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Замбия квачасы Замбия квачалары + + Зимбабве алтыны + Зимбабве алтыны + {0}+ @@ -4176,6 +4433,272 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} һәр {1} + + квадрат километр + {0} квадрат километр + {0}/км² + + + гектар + {0} гектар + + + квадрат метр + {0} квадрат метр + {0}/квадрат метр + + + квадрат сантиметр + {0} квадрат сантиметр + {0}/квадрат сантиметр + + + квадрат миль + {0} квадрат миль + {0}/квадрат миль + + + акр + {0} акр + + + квадрат ярд + {0} квадрат ярд + + + квадрат фут + {0} квадрат фут + + + квадрат дюйм + {0} квадрат дюйм + {0}/квадрат дюйм + + + дунам + {0} дунам + + + гасыр + {0} гасыр + + + унъеллык + {0} унъеллык + + + ел + {0} ел + {0}/ел + + + чирек + {0} чирек + {0}/ч + + + ай + {0} ай + {0}/ай + + + атна + {0} атна + {0}/атна + + + көн + {0} көн + {0}/көн + + + сәгать + {0} сәгать + {0}/сәгать + + + минут + {0} минут + {0}/минут + + + секунд + {0} секунд + {0}/секунд + + + миллисекунд + {0} миллисекунд + + + микросекунд + {0} микросекунд + + + наносекунд + {0} наносекунд + + + типографик эм + {0} эм + + + пиксел + {0} пиксел + + + мегапиксел + {0} мегапиксел + + + пиксел/сантиметрә + {0} пиксел/сантиметрә + + + пиксел/дүйм + {0} пиксел/дүйм + + + Җир радиусы + {0} Җир радиусы + + + километр + {0} километр + {0}/километр + + + метр + {0} метр + {0}/метр + + + дециметр + {0} дециметр + + + сантиметр + {0} сантиметр + {0}/см + + + миллиметр + {0} миллиметр + + + микрометр + {0} микрометр + + + нанометр + {0} нанометр + + + пикометр + {0} пикометр + + + миль + {0} миль + + + ярд + {0} ярд + + + фут + {0} фут + {0}/фут + + + дюйм + {0} дюйм + {0}/дюйм + + + парсек + {0} парсек + + + яктылык елы + {0} яктылык елы + + + астрономик берәмлек + {0} астрономик берәмлек + + + диңгез миле + {0} диңгез миле + + + скандинав миле + {0} скандинав миле + + + пункт + {0} пкт + + + Кояш радиусы + {0} Кояш радиусы + + + кубик километр + {0} кубик километр + + + кубик метр + {0} кубик метр + {0}/кубик метр + + + кубик сантиметр + {0} кубик сантиметр + {0}/кубик сантиметр + + + мегалитр + {0} мегалитр + + + гектолитр + {0} гектолитр + + + литр + {0} литр + {0}/литр + + + децилитр + {0} децилитр + + + сантилитр + {0} сантилитр + + + миллилитр + {0} миллилитр + + + метрик пинт + {0} метрик пинт + + + метрик чынаяк + {0} метрик чынаяк + + + метрик сыек унция + {0} метрик сыек унция + + + төн + {0} төн + {0}/төн + кардиналь юнәлеш {0} көнчыгыш @@ -4185,6 +4708,267 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + км² + {0} км² + {0}/км² + + + гектар + {0} га + + + м² + {0} м² + {0}/м² + + + см² + {0} см² + {0}/см² + + + ми² + {0} ми² + {0}/ми² + + + акр + {0} акр + + + ярд² + {0} ярд² + + + фут² + {0} фут² + + + дюйм² + {0} дюйм² + {0}/дюйм² + + + дунам + {0} дунам + + + г + {0} г + + + унъеллык + {0} унъеллык + + + ел + {0} ел + {0}/е + + + чирек + {0} чир. + {0}/ч + + + ай + {0} ай + {0}/ай + + + атна + {0} ат. + {0}/ат. + + + көн + {0} көн + {0}/көн + + + сәгать + {0} сг + {0}/сг + + + минут + {0} мин + {0}/минут + + + секунд + {0} сек + {0}/ск + + + миллисекунд + {0} мск + + + μсек + {0} μск + + + наносек + {0} нск + + + эм + {0} эм + + + пиксел + {0} пкс + + + мегапиксел + {0} МП + + + пкс/см + {0} пкс/см + + + пкс/дүйм + {0} пкс/дүйм + + + км + {0} км + {0}/км + + + м + {0} м + {0}/м + + + дм + {0} дм + + + см + {0} см + {0}/см + + + мм + {0} мм + + + микрон + {0} мкм + + + нм + {0} нм + + + пм + {0} пм + + + миль + {0} ми + + + ярд + {0} ярд + + + фут + {0} фут + {0}/фут + + + дюйм + {0} дюйм + {0}/дюйм + + + парсек + {0} пк + + + яктылык елы + {0} якт. елы + + + а. б. + {0} а. б. + + + диң. ми + {0} д. ми + + + ск. ми + {0} ск. ми + + + пункт + {0} пкт + + + Кояш радиусы + + + км³ + {0} км³ + + + м³ + {0} м³ + {0}/м³ + + + см³ + {0} см³ + {0}/см³ + + + Мл + {0} Мл + + + гл + {0} гл + + + литр + {0} л + {0}/л + + + дл + {0} дл + + + сл + {0} сл + + + мл + {0} мл + + + мпт + {0} мпт + + + м. чын. + {0} м. чын. + + + м. сыек унц. + {0} м. сыек унц. + + + төн + {0} төн + {0}/төн + юнәлеш {0} көнчыгыш @@ -4193,6 +4977,266 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} көнбатыш + + + км² + {0} км² + {0}/км² + + + гектар + {0} га + + + м² + {0} м² + {0}/м² + + + см² + {0} см² + {0}/см² + + + ми² + {0} ми² + {0}/ми² + + + акр + {0} акр + + + ярд² + {0} ярд² + + + фут² + {0} фут² + + + дюйм² + {0} дюйм² + {0}/дюйм² + + + дунам + {0} дунам + + + г + {0}г + + + унъеллык + {0}унъеллык + + + ел + {0}е + {0}/е + + + чир. + {0}ч + {0}/ч + + + ай + {0}а + {0}/ай + + + атна + {0}ат. + {0}/ат. + + + көн + {0}к + {0}/к + + + сг + {0}с + {0}/сг + + + мин + {0}м + {0}/минут + + + сек + {0}ск + {0}/ск + + + мсек + {0} мск + + + μсек + {0}μск + + + нск + {0}нск + + + эм + {0}эм + + + пкс + {0}пкс + + + МП + {0}МП + + + пкс/см + {0}пкс/см + + + пкс/дүйм + {0}пкс/дүйм + + + км + {0}км + {0}/км + + + м + {0}м + {0}/м + + + дм + {0}дм + + + см + {0}см + {0}/см + + + мм + {0}мм + + + мкм + {0}мкм + + + нм + {0}нм + + + пм + {0}пм + + + ми + {0} ми + + + ярд + {0} ярд + + + фут + {0} фут + {0}/фут + + + дюйм + {0} дюйм + {0}/дюйм + + + парсек + {0} пк + + + якт. елы + {0} якт. елы + + + а. б. + {0} а.б. + + + д. ми + {0} д. ми + + + ск. ми + {0}ск. ми + + + пкт + {0}пкт + + + км³ + {0} км³ + + + м³ + {0} м³ + {0}/м³ + + + см³ + {0} см³ + {0}/см³ + + + Мл + {0} Мл + + + гл + {0} гл + + + литр + {0} л + {0}/л + + + дл + {0} дл + + + сл + {0} сл + + + мл + {0} мл + + + мпт + {0} мпт + + + м. чын. + {0} м. чын. + + + м. сыек унц. + {0} м. сыек унц. + + + төн + {0} төн + {0}/төн + + diff --git a/make/data/cldr/common/main/tyv.xml b/make/data/cldr/common/main/tyv.xml index 4457e457a04..86e5ca8a3fe 100644 --- a/make/data/cldr/common/main/tyv.xml +++ b/make/data/cldr/common/main/tyv.xml @@ -10,9 +10,717 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + Араб + Амгы стандарт араб + Бенгал + Немец + Немец (AT) + Немец (CH) + Англи + Англи (AU) + Англи (CA) + Англи (GB) + Англи (US) + Испан + Латин Америкада Испан + Европей Испан + Мексикан Испан + Француз + Француз (CA) + Француз (CH) + Хинди (латин) + Хинглиш + Индонези + Итали + Япон + Көрей + Нидерланд + Фламанд + Поляк + Португал + Бразилияда Португал + Европей Португал + Орус + Тай + Турк + Тыва + Кыдат + Кыдат Мандарин + Кыдат (бөдүүнчүткен) + Кыдат Мандарин (бөдүүнчүткен) + Кыдат (чаңчылчаан) + Кыдат Мандарин (чаңчылчаан) + + + + + + + + + + + + + + + + Бүгү Делегей + Африка + Соңгу Америка + Мурнуу Америка + Океания + Барыын Африка + Төп Америка + Чөөн Африка + Соңгу Африка + Төп Африка + Мурнуу Африка + Америкалар + Соңгу Америка кезээ + Карибтер + Чөөн Азия + Мурнуу Азия + Мурнуу-Чөөн Азия + Мурнуу Европа + Австралия + Меланезия + Микронезия + Полинезия + Азия + Төп Азия + Барыын Азия + Европа + Чөөн Европа + Соңгу Европа + Барыын Европа + Тропик Африка + Латин Америка + Антигуа & Барбуда + Ангилья + Ангола + Аргентина + Аруба + Барбадос + Буркина-Фасо + Бурунди + Бенин + Сен-Бартелеми + Бермуд Ортулуктар + Боливия + Кариб Нидерландтар + Бразилия + Багамнар + Буве Ортулуктар + Ботсвана + Белиз + Канада + Конго - Киншаса + Конго (ДРК) + Төп-Африкан Республика + Конго - Браззавиль + Республика Конго + Кот-д’Ивуар + Чили + Камерун + Колумбия + Коста-Рика + Куба + Кабо-Верде + Кюрасао + Джибути + Доминика + Доминикан Республика + Алжир + Сеута & Мелилья + Эквадор + Египет + Барыын Сахара + Эритрея + Эфиопия + Европа Эвилели + Еврозона + Фолкленд Ортулуктар + Фолкленд (Мальвин) Ортулуктар + Габон + Гренада + Француз Гвиана + Гана + Гренландия + Гамбия + Гвинея + Гваделупа + Экваторда Гвинея + Мурнуу Георгия & Мурнуу Сандвич Ортулуктар + Гватемала + Гвинея-Бисау + Гайана + Гондурас + Гаити + Канар Ортулуктар + Британ девискээр Инди океанда + Архипелаг Чагос + Ямайка + Кения + Коморлар + Сент-Китс & Невис + Кайман Ортулуктар + Сент-Люсия + Либерия + Лесото + Ливия + Морокко + Сен-Мартен + Мадагаскар + Мали + Мартиника + Мавритания + Монтсеррат + Маврикий + Малави + Мексика + Мозамбик + Намибия + Нигер + Нигерия + Никарагуа + Панама + Перу + Сен-Пьер & Микелон + Пуэрто-Рико + Парагвай + Дашкаар Океания + Реюньон + Россия Федерациязы + Руанда + Сейшелдер + Судан + Ыдыктыг Елена Ортулуктары + Сьерра-Леоне + Сенегал + Сомали + Суринам + Мурнуу Судан + Сан-Томе & Принсипи + Сальвадор + Синт-Мартен + Эсватини + Свазиленд + Түрктер & Кайкос + Чад + Француз Мурнуу девискээрлер + Того + Тунис + Тринидад & Тобаго + Танзания + Уганда + Каттышкан Нациялар + Каттышкан Штаттар + АКШ + Уругвай + Сент-Винсент & Гренадиннер + Венесуэла + Виргин Ортулуктар (Великобритания) + Виргин Ортулуктар (АКШ) + Псевдо-Акценттер + Псевдо-Bidi + Майотта + Мурнуу Африкан Республика + Замбия + Зимбабве + Билдинмес Регион + + + Григориан Календарь + Григориан + Календарь ISO-8601 + Стандарт сортал + Стандарт + араб чурагайлар + + + Метрик + Англи + Американ + + + Дыл: {0} + Бижимел: {0} + Регион: {0} + + [а б в г д её ж з и й к л м н ң о ө п р с т у ү ф х ц ч ш щ ъ ы ь э ю я] [А Б В Г Д ЕЁ Ж З И Й К Л М Н Ң О Ө П Р С Т У Ү Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я] + [. / A B C D E F I L M V X] [\- ‐‑ – — , ; \: ! ? . … '‘’ "“” « » ( ) \[ \] § @ * / \& # † ‡ ′ ″] + [– · + < = > ~ №] + [\- ‑ – . '’ ( )] + + « + » + + + + + + + + + + Янв. + Февр. + Мар. + Апр. + Май + Июн. + Июл. + Авг. + Сент. + Окт. + Нояб. + Дек. + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + Январь + Февраль + Март + Апрель + Май + Июнь + Июль + Август + Сентябрь + Октябрь + Ноябрь + Декабрь + + + + + Янв. + Февр. + Мар. + Апр. + Май + Июн. + Июл. + Авг. + Сент. + Окт. + Нояб. + Дек. + + + Я + Ф + М + А + М + И + И + А + С + О + Н + Д + + + Январь + Февраль + Март + Апрель + Май + Июнь + Июль + Август + Сентябрь + Октябрь + Ноябрь + Декабрь + + + + + + + УХ + ПН + ВТ + СР + ЧТ + ПТ + СБ + + + У + П + В + С + Ч + П + С + + + УХ + ПН + ВТ + СР + ЧТ + ПТ + СБ + + + Улуг-хүн + Понедельник + Вторник + Среда + Четверг + Пятница + Суббота + + + + + УХ + ПН + ВТ + СР + ЧТ + ПТ + СБ + + + У + П + В + С + Ч + П + С + + + УХ + ПН + ВТ + СР + ЧТ + ПТ + СБ + + + Улуг-хүн + Понедельник + Вторник + Среда + Четверг + Пятница + Суббота + + + + + + + 1ги кв. + 2ги кв. + 3кү кв. + 4кү кв. + + + 1ги квартал + 2ги квартал + 3кү квартал + 4кү квартал + + + + + 1ги кв. + 2ги кв. + 3кү кв. + 4кү кв. + + + 1ги квартал + 2ги квартал + 3кү квартал + 4кү квартал + + + + + + Христос бертинде + Бистиң Эрага чедир + Христос төрүмелинден + Бистиң эрада + + + БЭЧ + БЭ + + + + + + y'ч' MMMM d, EEEE + + + + + y'ч' MMMM d + + + + + y'ч' MMM d + + + + + y-MM-dd + + + + + + + HH:mm:ss zzzz + + + + + HH:mm:ss z + + + + + HH:mm:ss + + + + + HH:mm + + + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + + {1}, {0} + + + {1}, {0} + + + {1}, {0} + + + + E, h B + E, h:mm B + E, h:mm:ss B + E, h a + E, h:mm a + E, h:mm:ss a + HH'ш' + h a, v + HH'ш' v + MMMM, W 'чедилик' + y'ч' MMM + y'ч' MMM d + y'ч' MMM d, E + y'ч' MMMM + y'ч' QQQ + y'ч' QQQQ + Y'ч', w 'чедилик' + + + + G y'ч' – G y'ч' + G y–y'чч' + + + HH–HH'ш' + + + HH–HH'ш' v + + + y'ч' MMM–MMM + y'ч' MMM – y'ч' MMM + + + y'ч' MMM d–d + y'ч' MMM d – MMM d + y'ч' MMM d – y'ч' MMM d + + + y'ч' MMM d, E – MMM d, E + y'ч' MMM d, E – MMM d, E + y'ч' MMM d, E – y'ч' MMM d, E + + + y'ч' MMMM–MMMM + y'ч' MMMM – y'ч' MMMM + + + + + + + + эра + + + чыл + эрткен чыл + амгы чыл + келир чыл + + + ч. + + + ч. + + + квартал + + + кв. + + + кв. + + + ай + + + ай + + + ай + + + чедилик + + + чед. + + + чед. + + + хүн + + + х. + + + х. + + + чедилик хүнү + + + AM/PM + + + шак + + + ш. + + + ш. + + + минута + + + мин. + + + мин + + + секунда + + + сек. + + + с + + + шак куржаа + + + + {0}, чайгы үе + {0}, стандарт үе + + + Гринвичтиң ортаа үези + + + + + + +   + + diff --git a/make/data/cldr/common/main/tzm.xml b/make/data/cldr/common/main/tzm.xml index c0c00692564..cc039d9d407 100644 --- a/make/data/cldr/common/main/tzm.xml +++ b/make/data/cldr/common/main/tzm.xml @@ -541,6 +541,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/ug.xml b/make/data/cldr/common/main/ug.xml index 685a49e71cf..1311752b41c 100644 --- a/make/data/cldr/common/main/ug.xml +++ b/make/data/cldr/common/main/ug.xml @@ -1056,11 +1056,9 @@ Reviewed by Waris Abdukerim Janbaz of the Uyghur Computer Sci ياپونىيە يىلنامەسى پارىس يىلنامەسى مىنگو يىلنامەسى - مۇرەككەپ خەنچە تىزىش تەرتىپى - Big5 لۇغەت تىزىش تەرتىپى كۆڭۈلدىكى يۇنىكود تىزىش تەرتىپى ياۋروپا تەرتىپلەش قائىدىسى - ئاددىي خەنچە تىزىش تەرتىپى - GB2312 تېلېفون نومۇر تىزىش تەرتىپى پىنيىن تىزىش تەرتىپى ياخشىلانغان تەرتىپلەش تەرتىپى @@ -1968,9 +1966,7 @@ Reviewed by Waris Abdukerim Janbaz of the Uyghur Computer Sci - غەربىي ئافرىقا ۋاقتى - غەربىي ئافرىقا ئۆلچەملىك ۋاقتى - غەربىي ئافرىقا يازلىق ۋاقتى + غەربىي ئافرىقا ۋاقتى @@ -2346,6 +2342,11 @@ Reviewed by Waris Abdukerim Janbaz of the Uyghur Computer Sci گىۋىيانا ۋاقتى + + + ھاۋاي-ئالېيۇت ئۆلچەملىك ۋاقتى + + ھاۋاي-ئالېيۇت ۋاقتى diff --git a/make/data/cldr/common/main/uk.xml b/make/data/cldr/common/main/uk.xml index ed07b15f361..220d142488b 100644 --- a/make/data/cldr/common/main/uk.xml +++ b/make/data/cldr/common/main/uk.xml @@ -45,7 +45,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ надждійська арабська арабська, надждійська аравакська - асамська + ассамська асу американська мова рухів астурійська @@ -297,6 +297,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ бафіа кельнська курдська + курдська + курманджі кумицька кутенаї комі @@ -843,6 +845,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Китай Колумбія Острів Кліппертон + Сарк Коста-Рика Куба Кабо-Верде @@ -1120,35 +1123,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ цифрове сортування інтенсивність сортування валюта + емодзі формат часу (12 або 24 години) стиль розриву рядка + розриви рядків у словах система вимірювання цифри + розрив речення після скорочення часовий пояс варіант мовного коду особисте використання буддійський календар + буддійський китайський календар + китайський коптський календар + коптський корейський календар + корейський ефіопський календар + ефіопський ефіопський амете алем календар + ефіопський амете алем григоріанський календар + григоріанський єврейський календар + єврейський індійський світський календар календар Хіджра + Хіджра календар Хіджра, світський + Хіджра, світський ісламський календар Саудівської Аравії ісламський астрономічний календар календар Хіджра (Умм аль-Кура) + Хіджра (Умм аль-Кура) календар ISO-8601 японський календар + японський перський календар + перський календар Китайської Республіки + Китайської Республіки обліковий грошовий формат + обліковий стандартний грошовий формат + стандартний сортувати за символами сортувати, ігноруючи символи сортувати за діакритичними знаками уніфіковано @@ -1158,23 +1180,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ сортувати спершу за великими символами сортувати без урахування регістру сортувати з урахуванням регістру - китайський традиційний порядок сортування Big5 попередній порядок сортування, для сумісності + сумісність порядок сортування за словником + за словником типовий порядок сортування Юнікод + типовий Юнікод порядок сортування за емодзі європейські правила упорядкування - китайський спрощений порядок сортування - GB2312 порядок сортування за телефонним довідником + за телефонним довідником фонетичний порядок сортування + фонетичний порядок сортування піньїнь + піньїнь універсальний пошук + пошук пошук за початковою приголосною хангул стандартний порядок сортування + стандартний порядок сортування за рисками + за рисками традиційний порядок сортування + традиційний порядок сортування за ключами ієрогліфів + за ключами ієрогліфів порядок сортування чжуїнь + чжуїнь сортувати без уніфікації сортувати за Unicode уніфіковано сортувати цифри окремо @@ -1187,18 +1219,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ повна ширина половинна ширина цифри + типово + емодзі + текст 12-годинний формат (0–11) + 12 (0–11) 12-годинний формат (1–12) + 12 (1–12) 24-годинний формат (0–23) + 24 (0–23) 24-годинний формат (1–24) + 24 (1–24) неточний стиль розриву рядка + неточний звичайний стиль розриву рядка + звичайний точний стиль розриву рядка + точний + розривати всі + залишати всі + звичайний + залишати фразами транслітерація РГН США транслітерація ГЕГН ООН метрична система + метрична англійська система мір + англійська американська система мір + американська арабсько-індійські цифри арабсько-індійські розширені цифри вірменські цифри @@ -1243,6 +1292,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ тибетські цифри традиційні символи чисел цифри ваї + вимкнено + увімкнено Метрична @@ -1297,9 +1348,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1503,13 +1551,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM-y G dd-MM-y GGGGG + E, dd-MM-y, G LLL y 'р'. G d MMM y 'р'. G E, d MMM y 'р'. G - h a h:mm a h:mm:ss a + HH 'год' v dd.MM E, dd.MM d MMM @@ -1570,7 +1620,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a h:mm a – h:mm a @@ -1584,7 +1633,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v M–M @@ -1781,22 +1829,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ вечора ночі - - ночі - дня - ранку - дня - вечора - ночі - - - ночі - дня - ранку - дня - вечора - ночі - @@ -1878,6 +1910,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'о' {0} + + {1} 'о' {0} + @@ -1886,6 +1921,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} 'о' {0} + + {1} 'о' {0} + @@ -1902,15 +1940,18 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a y G + MM y G dd-MM-y GGGGG + dd-MM-y, E, G LLL y 'р'. G d MMM y 'р'. G E, d MMM y 'р'. G - h a + H h:mm a h:mm:ss a h:mm:ss a v h:mm a v + HH 'год' v LL dd.MM E, dd.MM @@ -1978,7 +2019,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a - h–h a + + + HH–HH 'год' h:mm a – h:mm a @@ -1992,7 +2035,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h a – h a v - h–h a v + + + HH–HH 'год' v M–M @@ -3547,6 +3592,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Острів Пасхи + + Кояїке + Пунта-Аренас @@ -3812,9 +3860,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Пномпень - Ендербері - - Кантон @@ -4491,9 +4536,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - за західноафриканським часом - за західноафриканським стандартним часом - за західноафриканським літнім часом + за західноафриканським часом @@ -4855,6 +4898,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ за часом у Ґаяні + + + за стандартним гавайсько-алеутським часом + + за гавайсько-алеутським часом @@ -5100,9 +5148,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - за часом на острові Норфолк - за стандартним часом на острові Норфолк - за літнім часом на острові Норфолк + за часом на острові Норфолк + за стандартним часом на острові Норфолк + за літнім часом на острові Норфолк @@ -5293,6 +5341,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ за часом на островах Чуук + + + за турецьким часом + за турецьким стандартним часом + за турецьким літнім часом + + за часом у Туркменістані @@ -5376,7 +5431,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - за стандартним часом на Юконі + за стандартним часом на Юконі @@ -5473,7 +5528,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ + + + #,##0.00 ¤ @@ -7005,6 +7063,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ східнокарибського долара XCD + + карибський гульден + карибський гульден + карибські гульдени + карибських гульденів + карибського гульдена + спеціальні права запозичення СПЗ @@ -7110,6 +7175,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ зімбабвійських доларів зімбабвійські долари + + зімбабвійський золотий + зімбабвійський золотий + зімбабвійські золоті + зімбабвійських золотих + зімбабвійського золотого + зімбабвійський долар (2009) зімбабвійський долар (2009) @@ -7822,35 +7894,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} елемента {0} елемента - + + частки + {0} частка + {0} частки + {0} часток + {0} частки + + feminine - {0} мільйонна доля - {0} мільйонну долю - {0} мільйонній долі - {0} мільйонної долі - {0} мільйонною долею - {0} мільйонній долі - {0} мільйонні долі - {0} мільйонні долі - {0} мільйонним долям - {0} мільйонних доль - {0} мільйонними долями - {0} мільйонних долях - {0} мільйонних доль - {0} мільйонних доль - {0} мільйонним долям - {0} мільйонних доль - {0} мільйонними долями - {0} мільйонних долях - {0} мільйонної долі - {0} мільйонної долі - {0} мільйонної долі - {0} мільйонної долі - {0} мільйонної долі - {0} мільйонної долі + мільйонні частки + {0} мільйонна частка + {0} мільйонну частку + {0} мільйонній частці + {0} мільйонної частки + {0} мільйонною часткою + {0} мільйонній частці + {0} мільйонні частки + {0} мільйонні частки + {0} мільйонним часткам + {0} мільйонних часток + {0} мільйонними частками + {0} мільйонних частках + {0} мільйонних часток + {0} мільйонних часток + {0} мільйонним часткам + {0} мільйонних часток + {0} мільйонними частками + {0} мільйонних частках + {0} мільйонної частки + {0} мільйонної частки + {0} мільйонної частки + {0} мільйонної частки + {0} мільйонної частки + {0} мільйонної частки masculine + відсотки {0} відсоток {0} відсоток {0} відсотку @@ -7878,6 +7959,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + проміле {0} проміле {0} проміле {0} проміле @@ -7959,6 +8041,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моля {0} моля + + одиниці глюкози + {0} одиниця глюкози + {0} одиниці глюкози + {0} одиниць глюкози + {0} одиниці глюкози + masculine літри на кілометр @@ -8511,6 +8600,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + дні {0} день {0} день {0} дню @@ -9936,6 +10026,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine + карати {0} карат {0} карат {0} карату @@ -10157,6 +10248,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} міліметра ртутного стовпа {0} міліметра ртутного стовпа + + ртутного стовпа + {0} ртутного стовпа + {0} ртутного стовпа + {0} ртутного стовпа + {0} ртутного стовпа + фунти на квадратний дюйм {0} фунт на квадратний дюйм @@ -10884,6 +10982,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метричної чашки {0} метричної чашки + + метричні рідинні унції + {0} метрична рідинна унція + {0} метричні рідинні унції + {0} метричних рідинних унцій + {0} метричної рідинної унції + {0} акр-фут {0} акр-фути @@ -10987,6 +11092,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мірних склянок {0} мірна склянка + + дрібки + {0} дрібка + {0} дрібки + {0} дрібок + {0} дрібки + англійські кварти {0} англійська кварта @@ -10994,33 +11106,131 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} англійських кварт {0} англійської кварти - + + стерадіани + {0} стерадіан + {0} стерадіани + {0} стерадіанів + {0} стерадіана + + + катали + {0} катал + {0} катали + {0} каталів + {0} катала + + + кулони + {0} кулон + {0} кулони + {0} кулонів + {0} кулона + + + фаради + {0} фарад + {0} фаради + {0} фарадів + {0} фарада + + + генрі + {0} генрі + {0} генрі + {0} генрі + {0} генрі + + + сіменси + {0} сіменс + {0} сіменси + {0} сіменсів + {0} сіменса + + + міжнародні калорії + {0} міжнародна калорія + {0} міжнародні калорії + {0} міжнародних калорій + {0} міжнародної калорії + + + бекерелі + {0} бекерель + {0} бекерелі + {0} бекерелів + {0} бекереля + + + зіверти + {0} зіверт + {0} зіверти + {0} зівертів + {0} зіверта + + + греї + {0} грей + {0} греї + {0} греїв + {0} грея + + + кілограм-сили + {0} кілограм-сила + {0} кілограм-сили + {0} кілограм-сил + {0} кілограм-сили + + + тесли + {0} тесла + {0} тесли + {0} тесл + {0} тесли + + + вебери + {0} вебер + {0} вебери + {0} веберів + {0} вебера + + + швидкості світла + {0} швидкість світла + {0} швидкості світла + {0} швидкостей світла + {0} швидкості світла + + feminine - частини на мільярд - {0} частина на мільярд - {0} частину на мільярд - {0} частині на мільярд - {0} частини на мільярд - {0} частиною на мільярд - {0} частині на мільярд - {0} частини на мільярд - {0} частини на мільярд - {0} частинам на мільярд - {0} частин на мільярд - {0} частинами на мільярд - {0} частинах на мільярд - {0} частин на мільярд - {0} частин на мільярд - {0} частинам на мільярд - {0} частин на мільярд - {0} частинами на мільярд - {0} частинах на мільярд - {0} частини на мільярд - {0} частини на мільярд - {0} частини на мільярд - {0} частини на мільярд - {0} частини на мільярд - {0} частини на мільярд + мільярдні частки + {0} мільярдна частка + {0} мільярдну частку + {0} мільярдній частці + {0} мільярдної частки + {0} мільярдною часткою + {0} мільярдній частці + {0} мільярдні частки + {0} мільярдні частки + {0} мільярдним часткам + {0} мільярдних часток + {0} мільярдними частками + {0} мільярдних частках + {0} мільярдних часток + {0} мільярдних часток + {0} мільярдним часткам + {0} мільярдних часток + {0} мільярдними частками + {0} мільярдних частках + {0} мільярдної частки + {0} мільярдної частки + {0} мільярдної частки + {0} мільярдної частки + {0} мільярдної частки + {0} мільярдної частки feminine @@ -11304,12 +11514,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ел. {0} ел. - - м. д. - {0} м. д. - {0} м. д. - {0} м. д. - {0} м. д. + + част. + {0} част. + {0} част. + {0} част. + {0} част. + + + ч/млн + {0} ч/млн + {0} ч/млн + {0} ч/млн + {0} ч/млн {0} % @@ -11336,6 +11553,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} моль {0} моль + + од. глюкози + {0} од. глюкози + {0} од. глюкози + {0} од. глюкози + {0} од. глюкози + літри/км {0} л/км @@ -12048,6 +12272,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} мм рт. ст. {0} мм рт. ст. + + рт. ст + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + {0} рт. ст. + фунт/дюйм² {0} фунт/дюйм² @@ -12287,6 +12518,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} метр. чашок {0} метр. чашки + + ун. рід. метр. + {0} ун. рід. метр. + {0} ун. рід. метр. + {0} ун. рід. метр. + {0} ун. рід. метр. + акр-фути {0} акр-фт @@ -12422,12 +12660,110 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} англ. кварт {0} англ. кварти - - частини/млрд - {0} част/млрд - {0} част/млрд - {0} част/млрд - {0} част/млрд + + ср + {0} ср + {0} ср + {0} ср + {0} ср + + + кат + {0} кат + {0} кат + {0} кат + {0} кат + + + Кл + {0} Кл + {0} Кл + {0} Кл + {0} Кл + + + Ф + {0} Ф + {0} Ф + {0} Ф + {0} Ф + + + Гн + {0} Гн + {0} Гн + {0} Гн + {0} Гн + + + См + {0} См + {0} См + {0} См + {0} См + + + калмн + {0} калмн + {0} калмн + {0} калмн + {0} калмн + + + Бк + {0} Бк + {0} Бк + {0} Бк + {0} Бк + + + Зв + {0} Зв + {0} Зв + {0} Зв + {0} Зв + + + Гр + {0} Гр + {0} Гр + {0} Гр + {0} Гр + + + кгс + {0} кгс + {0} кгс + {0} кгс + {0} кгс + + + Тл + {0} Тл + {0} Тл + {0} Тл + {0} Тл + + + Вб + {0} Вб + {0} Вб + {0} Вб + {0} Вб + + + шв. св. + {0} шв. св. + {0} шв. св. + {0} шв. св. + {0} шв. св. + + + ч/млрд + {0} ч/млрд + {0} ч/млрд + {0} ч/млрд + {0} ч/млрд нч. @@ -12582,21 +12918,37 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ел. {0}ел. - - м.д. - {0}м.д. - {0}м.д. - {0}м.д. - {0}м.д. + + ч. + {0}ч. + {0}ч. + {0}ч. + {0}ч. + + + ч/млн + {0}ч/млн + {0}ч/млн + {0}ч/млн + {0}ч/млн - % + {0}% + {0}% + {0}% + {0}% - + {0}‰ + {0}‰ + {0}‰ + {0}‰ - + {0}‱ + {0}‱ + {0}‱ + {0}‱ {0}моль @@ -12604,6 +12956,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}моль {0}моль + + од.гл. + {0}од.гл. + {0}од.гл. + {0}од.гл. + {0}од.гл. + л/км {0}л/км @@ -13289,6 +13648,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ммрс {0}ммрс + + рс + {0}рс + {0}рс + {0}рс + {0}рс + фнт/дюйм² {0}фнт/дюйм² @@ -13373,7 +13739,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}вуз. - Бофорт + бали {0} бал {0} бали {0} балів @@ -13503,6 +13869,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}м.чаш. {0}м.чаш. + + ун. рід. метр. + {0}ун.рід.м. + {0}ун.рід.м. + {0}ун.рід.м. + {0}ун.рід.м. + акр-фт {0}акр-фт @@ -13522,7 +13895,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}гал. {0}гал. {0}гал. - {0}/гал англ. гал. @@ -13623,7 +13995,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}мір. - дріб. {0}дріб. {0}дріб. {0}дріб. @@ -13636,12 +14007,110 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}англ.квар. {0}англ.квар. - + + ср + {0}ср + {0}ср + {0}ср + {0}ср + + + кат + {0}кат + {0}кат + {0}кат + {0}кат + + + Кл + {0}Кл + {0}Кл + {0}Кл + {0}Кл + + + Ф + {0}Ф + {0}Ф + {0}Ф + {0}Ф + + + Гн + {0}Гн + {0}Гн + {0}Гн + {0}Гн + + + См + {0}См + {0}См + {0}См + {0}См + + + калмн + {0}калмн + {0}калмн + {0}калмн + {0}калмн + + + Бк + {0}Бк + {0}Бк + {0}Бк + {0}Бк + + + Зв + {0}Зв + {0}Зв + {0}Зв + {0}Зв + + + Гр + {0}Гр + {0}Гр + {0}Гр + {0}Гр + + + кгс + {0}кгс + {0}кгс + {0}кгс + {0}кгс + + + Тл + {0}Тл + {0}Тл + {0}Тл + {0}Тл + + + Вб + {0}Вб + {0}Вб + {0}Вб + {0}Вб + + + шв.св. + {0}шв.св. + {0}шв.св. + {0}шв.св. + {0}шв.св. + + ч/млрд - {0} ч/млрд - {0} ч/млрд - {0} ч/млрд - {0} ч/млрд + {0}ч/млрд + {0}ч/млрд + {0}ч/млрд + {0}ч/млрд нч diff --git a/make/data/cldr/common/main/ur.xml b/make/data/cldr/common/main/ur.xml index b56793e017c..a018ec0621a 100644 --- a/make/data/cldr/common/main/ur.xml +++ b/make/data/cldr/common/main/ur.xml @@ -49,6 +49,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ازیری آزربائیجانی (عربی) باشکیر + بلوچی بالینیز باسا بیلاروسی @@ -235,7 +236,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ شامبالا بافيا کولوگنیائی - کردش + کردی + کردی + کرمانجی کومیک کومی کورنش @@ -284,7 +287,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ مکمیک منانگکباؤ مقدونیائی - مالایالم + ملیالم منگولین منی پوری انو ایمن @@ -636,6 +639,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ چین کولمبیا کلپرٹن آئلینڈ + سارک کوسٹا ریکا کیوبا کیپ ورڈی @@ -877,34 +881,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ عددی چھانٹی چھانٹی کی قوت کرنسی + ایموجی پریزینٹیشن گھنٹہ سائیکل (12 بنام 24) لائن بریک انداز + الفاظ کے اندر لائن بریکس پیمائش کا نظام اعداد + مخففات کے بعد سنٹینس بریک منطقۂ وقت مقام کا متغیرہ نجی-استعمال بودھ کلینڈر + بودھ چینی کیلنڈر + چینی کاپٹک کیلنڈر + قبطی ڈانگی کیلنڈر + ڈانگی ایتھوپیائی کیلنڈر + ایتھوپیائی ایتھوپک امیٹ الیم کیلنڈر + ایتھوپیائی امیٹ الیم گریگورین کیلنڈر + گریگورین عبرانی کیلنڈر - ہندوستانی قومی کیلنڈر - اسلامی کیلنڈر + عبرانی + بھارتی قومی کیلنڈر + بھارتی قومی + ہجری کیلنڈر + ہجری اسلامی شہری کیلنڈر (ٹیبیولر، مدنی دور) - اسلامی کیلنڈر (ٹیبولر، فلکیاتی دور) - اسلامی کیلنڈر (ام القراہ) + ہجری (شہری تقویم) + ہجری کیلنڈر (لوحی، ایسٹرونومیکل ایپوک) + ہجری (فلکیاتی تقویم) + ہجری کیلنڈر (ام القریٰ) + ہجری (ام القریٰ) ISO-8601 کیلنڈر جاپانی کیلنڈر + جاپانی فارسی کیلنڈر + فارسی منگوو کیلنڈر + مینگوو اکاؤنٹنگ کرنسی فارمیٹ + اکاؤنٹنگ اسٹینڈرڈ کرنسی فارمیٹ + اسٹینڈرڈ علامات کی چھٹائی کریں علامات کو نظرانداز کرکے چھٹائی کریں لہجوں کی چھٹائی معمول کے انداز میں کریں @@ -914,18 +939,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ پہلے بالائی حروف کی چھٹائی کریں حروف کی عدم حساسیت کی چھٹائی کریں حروف کے تئیں حساس کی چھٹائی کریں - روایتی چینی کی چھٹائی کی ترتیب - Big5 سابقہ چھٹائی کی ترتیب، مطابقت کیلئے لغت کی چھٹنی کی ترتیب ڈیفالٹ یونی کوڈ چھانٹی کی ترتیب + ڈیفالٹ یونی کوڈ یورپی ترتیبی قوانین - آسان چینی کی چھٹائی کی ترتیب - GB2312 فون بک کی چھٹنی کی ترتیب صوتی چھٹائی کی ترتیب پن ین کی چھٹنی کی ترتیب عمومی تلاش + تلاش Hangul Initial Consonant کے لحاظ سے تلاش کریں معیاری چھانٹی کی ترتیب + معیاری سٹروک کی چھٹنی کی ترتیب روایتی چھٹنی کی ترتیب اساسی-سٹروک کی چھٹنی کی ترتیب @@ -941,18 +967,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ پورا عرض نصف عرض عددی + ڈیفالٹ + ایموجی + متن 12 گھنٹے کا نظام (0–11) + 12 (0–11) 12 گھنٹے کا نظام (1–12) + 12 (1–12) 24 گھنٹے کا نظام (0–23) + 24 (0–23) 24 گھنٹے کا نظام (1–24) + 24 (1–24) ڈھیلا لائن بریک انداز + ڈھیلا عمومی لائن بریک انداز + عمومی سخت لائن بریک انداز + سخت + سبھی کو بریک کریں + سبھی کو رکھیں + عمومی + فقروں میں رکھیں US BGN ٹرانسلٹریشن UN GEGN ٹرانسلٹریشن میٹرک نظام + میٹرک پیمائش کا امپیریل نظام + UK پیمائش کا امریکی نظام + US عربی ہندی ہندسے توسیع شدہ عربی ہندی ہندسے آرمینیائی اعداد @@ -997,6 +1040,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ تبتی اعداد روایتی اعداد وائی ہندسے + آف + آن میٹرک @@ -1019,7 +1064,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [؀؁؂؃\u200C\u200D\u200E\u200F ً ٌ ٍ َ ُ ِ ّ ْ ٔ ٖ ٗ ٘ ٰ أ آ ں ؤ ۂ ۃ ئ ٻ ة ٺ ټ ٽ ه ي] [ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ھ ء ی ے] [\u200E \- ‑ , ٫ ٬ . % ‰ + 0۰ 1۱ 2۲ 3۳ 4۴ 5۵ 6۶ 7۷ 8۸ 9۹] + [0۰ 1۱ 2۲ 3۳ 4۴ 5۵ 6۶ 7۷ 8۸ 9۹] [، ؍ ٫ ٬ ؛ \: ؟ . ۔ ( ) \[ \]] + [\- ‑ – — ، ؛ \: ! ؟ … ۔ ‘’ “” ( ) \[ \] § @ * / \\ \& # † ‡ ′ ″] + [\- ‑ , . /] ؟ [\: ∶] @@ -1060,12 +1108,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - دور0 - دور1 - - @@ -1087,12 +1129,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - دور0 - دور1 - - @@ -1123,6 +1159,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1} {0} پر + @@ -1131,6 +1170,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} کو {0} + + {1} {0} پر + @@ -1139,6 +1181,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}، {0} + + {1}، {0} + @@ -1147,11 +1192,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}، {0} + + {1}، {0} + + h E B d E y G + M/y G d/M/y GGGGG + E, d/M/y G MMM y G d MMM، y G E، d MMM، y G @@ -1345,8 +1396,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ رات + نصف شب a p + صبح + دوپہر + سہ پہر + شام + رات آدھی رات @@ -1427,6 +1484,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} کو {0} + + {1} {0} پر + @@ -1435,6 +1495,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} کو {0} + + {1} کو {0} + @@ -1443,6 +1506,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}، {0} + + {1}، {0} + @@ -1451,11 +1517,16 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1}، {0} + + {1}، {0} + d E y G + M/y G d/M/y GGGGG + E، d/M/y G MMM y G d MMM، y G E، d MMM، y G @@ -1713,6 +1784,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ہجری + + + M/y G + E، d/M/y G + + @@ -2409,6 +2486,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ایسٹر + + کویائیکے + پنٹا اریناس @@ -2674,9 +2754,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ پنوم پن - اینڈربری - - کانٹن @@ -3346,9 +3423,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - مغربی افریقہ ٹائم - مغربی افریقہ سٹینڈرڈ ٹائم - مغربی افریقہ سمر ٹائم + مغربی افریقہ ٹائم @@ -3705,6 +3780,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ گیانا کا وقت + + + ہوائی الیوٹیئن اسٹینڈرڈ ٹائم + + ہوائی الیوٹیئن ٹائم @@ -4296,18 +4376,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - - ¤ #,##0.00 - - - ¤#,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4317,32 +4389,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - ¤ 0 ہزار - ¤ 0 ہزار - ¤ 00 ہزار - ¤ 00 ہزار - ¤ 0 لاکھ - ¤ 0 لاکھ - ¤ 00 لاکھ - ¤ 00 لاکھ - ¤ 0 کروڑ - ¤ 0 کروڑ - ¤ 00 کروڑ - ¤ 00 کروڑ - ¤ 0 ارب - ¤ 0 ارب - ¤ 00 ارب - ¤ 00 ارب - ¤ 0 کھرب - ¤ 0 کھرب - ¤0 ٹریلین - ¤ 0 ٹریلین - ¤0 ٹریلین - ¤ 0 ٹریلین - ¤ 00 ٹریلین - ¤ 00 ٹریلین - ¤ 000 ٹریلین - ¤ 000 ٹریلین + ¤0 ہزار + ¤ 0 ہزار + ¤0 ہزار + ¤ 0 ہزار + ¤00 ہزار + ¤ 00 ہزار + ¤00 ہزار + ¤ 00 ہزار + ¤0 لاکھ + ¤ 0 لاکھ + ¤0 لاکھ + ¤ 0 لاکھ + ¤00 لاکھ + ¤ 00 لاکھ + ¤00 لاکھ + ¤ 00 لاکھ + ¤0 کروڑ + ¤ 0 کروڑ + ¤0 کروڑ + ¤ 0 کروڑ + ¤00 کروڑ + ¤ 00 کروڑ + ¤00 کروڑ + ¤ 00 کروڑ + ¤0 ارب + ¤ 0 ارب + ¤0 ارب + ¤ 0 ارب + ¤00 ارب + ¤ 00 ارب + ¤00 ارب + ¤ 00 ارب + ¤0 کھرب + ¤ 0 کھرب + ¤0 کھرب + ¤ 0 کھرب + ¤00 کھرب + ¤ 00 کھرب + ¤00 کھرب + ¤ 00 کھرب + ¤00 ٹریلین + ¤ 00 ٹریلین + ¤00 ٹریلین + ¤ 00 ٹریلین + ¤000 ٹریلین + ¤ 000 ٹریلین + ¤000 ٹریلین + ¤ 000 ٹریلین @@ -4366,7 +4460,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ انگولا کا کوانزا - ارجنٹائن پیسہ + ارجنٹائن پیسو + ارجنٹائن پیسو + ارجنٹائن پیسو آسٹریلین ڈالر @@ -4438,7 +4534,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ سوئس فرانکس - چلّین پیسہ + چلین پیسو + چلین پیسو + چلین پیسو چینی یوآن (آف شور) @@ -4447,7 +4545,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ چینی یوآن - کولمبین پیسہ + کولمبین پیسو + کولمبین پیسو + کولمبین پیسو کوسٹا ریکا کا کولن @@ -4665,7 +4765,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ملاوی کواچا - میکسیکی پیسہ + میکسیکی پیسو + میکسیکی پیسو + میکسیکی پیسو ملیشیائی رنگِٹ @@ -4706,8 +4808,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ پاپوآ نیو گنی کا کینا - فلپائینی پیسہ - فلپائینی پیسہ + فلپائنی پیسو + فلپائنی پیسو فلپائنی پیسو PHP @@ -4865,6 +4967,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ مشرقی کریبیا کا ڈالر + + کیریبین گلڈر + کیریبین گلڈر + کیریبین گلڈرز + مغربی افریقی [CFA] فرانک @@ -4890,6 +4997,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ زامبیائی کواچا + + زمبابوے گولڈ + زمبابوے گولڈ + زمبابوے گولڈ + {0} گھنٹہ @@ -5110,8 +5222,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ masculine آئٹمز - - feminine + + پارٹس + {0} پارٹ + {0} پارٹس + + + masculine فی ملین حصے {0} فی ملین حصے {0} فی ملین حصے @@ -5137,6 +5254,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مول {0} مولز + + گلوکوز کے + {0} گلوکوز کے + {0} گلوکوز کے + masculine لیٹر فی کلومیٹر @@ -5645,6 +5767,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ملی میٹر مرکری {0} ملی میٹر مرکری + + مرکری کے + {0} مرکری کے + {0} مرکری کے + پاؤنڈز فی مربع انچ {0} پاؤنڈ فی مربع انچ @@ -5823,6 +5950,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} میٹرک کپ {0} میٹرک کپ + + میٹرک فلوئیڈ آؤنس + {0} میٹرک فلوئیڈ آؤنس + {0} میٹرک فلوئیڈ آؤنسز + {0} ایکڑ فٹ {0} ایکڑ فٹ @@ -5901,13 +6033,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} امپیریئل کوارٹ {0} امپیریئل کوارٹ + + سٹرڈئینز + {0} سٹرڈئین + {0} سٹرڈئینز + + + کاتلز + {0} کاتل + {0} کاتلز + + + کولمبز + {0} کولمب + {0} کولمبز + + + فیراڈ + {0} فیراڈ + {0} فیراڈ + + + ہینریز + {0} ہینری + {0} ہینریز + + + سیمنز + {0} سیمنز + {0} سیمنز + + + کیلوریز [IT] + {0} کیلوری [IT] + {0} کیلوریز [IT] + + + بیکوریل + {0} بیکوریل + {0} بیکوریلز + + + سیورٹس + {0} سیورٹ + {0} سیورٹس + + + گریز + {0} گرے + {0} گریز + + + کلوگرامز فورس + {0} کلوگرم فورس + {0} کلوگرامز فورس + + + ٹیسلاز + {0} ٹیسلا + {0} ٹیسلاز + + + ویبرز + {0} ویبر + {0} ویبرز + feminine - روشنی - {0} روشنی - {0} روشنی - + masculine اجزا فی بلین {0} جزو فی بلین @@ -5915,9 +6109,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ feminine - راتیں - {0} رات - {0} راتیں {0} فی رات @@ -6019,7 +6210,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} آئٹم {0} آئٹمز - + + پارٹ + {0} پارٹ + {0} پارٹ + + حصے/ملین @@ -6036,6 +6232,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} مول {0} مول + + Glc + {0} Glc + {0} Glc + لیٹر/100 کلو میٹر @@ -6308,6 +6509,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} واٹ {0} واٹ + + of Hg + {0} of Hg + {0} of Hg + بار {0} بار @@ -6368,6 +6574,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ سینٹی لیٹر + + {0} fl oz m. + {0} fl oz m. + ایکڑ فٹ @@ -6419,12 +6629,65 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} چٹکی {0} چٹکی + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + روشنی {0} روشنی {0} روشنی - + اجزا/بلین @@ -6493,7 +6756,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ دُنام - + + پارٹ + {0} پارٹ + {0} پارٹ + + ppm @@ -6505,6 +6773,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + Glc + {0} Glc + {0} Glc + {0}L/100km {0}L/100km @@ -6651,6 +6924,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hp {0}hp + + of Hg + {0} of Hg + {0} of Hg + ″ Hg {0} انچ مرکری @@ -6745,21 +7023,43 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}fl.dr. {0}fl.dr. - - روشنی - {0} روشنی - {0} روشنی + + {0} sr + {0} sr - + + {0} kat + {0} kat + + + cal-IT + {0} cal-IT + {0} cal-IT + + + {0} Sv + {0} Sv + + + {0} Gy + {0} Gy + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + {0}ppb {0}ppb - - راتیں - {0} رات - {0} راتیں - {0}/رات - diff --git a/make/data/cldr/common/main/ur_IN.xml b/make/data/cldr/common/main/ur_IN.xml index e5a965fba35..e9cb92998d3 100644 --- a/make/data/cldr/common/main/ur_IN.xml +++ b/make/data/cldr/common/main/ur_IN.xml @@ -481,8 +481,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤ #,##,##0.00 - #,##,##0.00 + #,##0.00 diff --git a/make/data/cldr/common/main/uz.xml b/make/data/cldr/common/main/uz.xml index af0dbd54840..99ca6fb6ee8 100644 --- a/make/data/cldr/common/main/uz.xml +++ b/make/data/cldr/common/main/uz.xml @@ -44,6 +44,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ozarbayjon ozar boshqird + baluj bali basa belarus @@ -230,6 +231,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ bafiya kyoln kurdcha + kurd + kurmanji qo‘miq komi korn @@ -467,7 +470,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tamazigxt xitoy xitoy, mandarin - zh_Hans xitoy (soddalashtirilgan mandarin) xitoy (an’anaviy) xitoy (an’anaviy mandarin) @@ -624,6 +626,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Xitoy Kolumbiya Klipperton oroli + Sark Kosta-Rika Kuba Kabo-Verde @@ -857,43 +860,83 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ valyuta formati saralash tartibi valyuta + emoji namoyishi soat tizimi (12 yoki 24) qatorni uzish uslubi + so‘z ko‘chirish uslubi o‘lchov tizimi raqamlar + qisqartirilgandan keyin gapning uzilishi buddizm taqvimi + buddist xitoy taqvimi + xitoy qibtiy taqvim + qibtiy dangi taqvimi + dangi habash taqvimi + habash Amete Alem habash taqvimi + Amete Alem habash grigorian taqvimi + grigorian yahudiy taqvimi + yahudiy hijriy taqvim + hijriy jadvalli hijriy taqvim + jadvalli hijriy jadvalli hijriy taqvim (astronomik davr) + jadvalli hijriy (atronomik davr) hijriy taqvim (Ummul Quro) + hijriy (Ummul Quro) ISO-8601 taqvimi yapon taqvimi + yapon fors taqvimi + fors mingo taqvimi + mingo moliyaviy valyuta formati + moliyaviy standart valyuta formati + standart standart Unicode saralash tartibi + standart Unicode qidiruv + qidiruv standart saralash tartibi + standart + birlamchi + emoji + matn 12 soatlik tizim (0–11) + 12 (0–11) 12 soatlik tizim (1–12) + 12 (1–12) 24 soatlik tizim (0–23) + 24 (0–23) 24 soatlik tizim (1–24) + 24 (1–24) qatorni yumshoq uzish + yumshoq qatorni odatiy uzish + odatiy qatorni qat’iy uzish + qatʼiy + hammasini koʻchirish + hammasini saqlash + oddiy uslub + iboralarda saqlash metrik tizim + metrik Britaniya o‘lchov tizimi + Birlashgan Qirollik AQSH o‘lchov tizimi + AQSH arab-hind raqamlari kengaytirilgan arab-hind raqamlari arman raqamlari @@ -934,6 +977,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ tay raqamlari tibet raqamlari vay raqamlari + oʻchiq + yoniq Metrik @@ -1049,9 +1094,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm–h:mm B h:mm – h:mm - - G y – G y - M/y (GGGGG) – M/y (GGGGG) M/y – M/y (GGGGG) @@ -1376,17 +1418,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h B h:mm B h:mm:ss + E, B h E, B h:mm E, B h:mm:ss + E, h a E, h:mm a E, HH:mm E, h:mm:ss a E, HH:mm:ss + MM-y G dd.MM.y GGGGG + E, dd-MM-y G MMM, G y d-MMM, G y E, d-MMM, G y - h a h:mm a h:mm:ss a h:mm:ss a (v) @@ -1423,9 +1468,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B h:mm – h:mm B h:mm – h:mm - - G y – G y - M/y (G) – M/y (G) M/y – M/y (G) @@ -1460,10 +1502,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d-MMM – E, d-MMM, G y E, d-MMM, y – E, d-MMM, y (G) - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1574,36 +1612,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zulhijja - - - Muh. - Saf. - Rab. avv. - Rab. son. - Jum. avv. - Jum. son. - Raj. - Sha. - Ram. - Shav. - Zulq. - Zulh. - - - Muharram - Safar - Rabiʼul avval - Rabiʼus soniy - Jumodul avval - Jumodus soniy - Rajab - Sha’bon - Ramazon - Shavvol - Zulqaʼda - Zulhijja - - @@ -1947,9 +1955,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Angilya - - Tirana - Rotera @@ -2392,9 +2397,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pnompen - - Enderberi oroli - Tarava @@ -2828,9 +2830,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Gʻarbiy Afrika vaqti - Gʻarbiy Afrika standart vaqti - Gʻarbiy Afrika yozgi vaqti + Gʻarbiy Afrika vaqti @@ -3180,6 +3180,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gayana vaqti + + + Gavayi-aleut standart vaqti + + Gavayi-aleut vaqti @@ -3753,13 +3758,22 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + ¤ #,##0.00;(¤ #,##0.00) + + + #,##0.00 ¤ + #,##0.00 ¤ ¤#,##0.00;(¤#,##0.00) + ¤ #,##0.00;(¤ #,##0.00) #,##0.00;(#,##0.00) @@ -4276,6 +4290,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sharqiy Karib dollari + + Karib guldeni + Karib guldeni + Karib guldeni + G‘arbiy Afrika CFA franki @@ -4296,6 +4315,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Zambiya kvachasi + + Zimbabve oltini + Zimbabve oltini + Zimbabve oltini + Bu jildda {0} ta fayl bor. Uni oʻchirib tashlaysizmi? @@ -4498,6 +4522,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ elementlar + + qism + {0} qismi + {0} qismi + + + {0} milliondan ulush + {0} milliondan ulush + {0} foiz {0} foiz @@ -4510,6 +4543,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} promiriada {0} promiriada + + glyukoza + {0} glyukoza + {0} glyukoza + litr/kilometr {0} litr/kilometr @@ -4872,6 +4910,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mm simob ustuni {0} mm simob ustuni + + simob + {0} simob + {0} simob + funt/duym kvadrat {0} funt/duym kvadrat @@ -5003,6 +5046,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} metrik piyola {0} metrik piyola + + metrik suyuqlik unsiyasi + {0} metrik suyuqlik unsiyasi + {0} metrik suyuqlik unsiyasi + gallon {0} gallon @@ -5019,29 +5067,85 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ingliz suyuq unsiyasi {0} ingliz suyuq unsiyasi - - imp. desert qoshiq - {0} imp. desert qoshiq - {0} imp. desert qoshiq - draxma {0} draxma {0} draxma - - imp.kvarta + + steradian + {0} steradian + {0} steradian - - qism/milliard - {0} ta qism/milliard - {0} ta qism/milliard + + katal + {0} katal + {0} katal - - kecha - {0} kecha - {0} kecha - {0}/kecha + + kulon + {0} kulon + {0} kulon + + + farad + {0} farad + {0} farad + + + genri + {0} genri + {0} genri + + + simens + {0} simens + {0} simens + + + kaloriya-IT + {0} kaloriya-IT + {0} kaloriya-IT + + + bekkerel + {0} bekkerel + {0} bekkerel + + + zivert + {0} zivert + {0} zivert + + + Grey + {0} grey + {0} grey + + + kilogramm-kuch + {0} kilogramm-kuch + {0} kilogramm-kuch + + + tesla + {0} tesla + {0} tesla + + + veber + {0} veber + {0} veber + + + yorug‘lik + {0} yorug‘lik tezligi + {0} yorug‘lik tezligi + + + milliarddan ulush + {0} milliarddan ulush + {0} milliarddan ulush {0} sharqiy uzunlik @@ -5138,7 +5242,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} element {0} ta element - + + qism + {0} qismi + {0} qismi + + milliondan ulush @@ -5150,6 +5259,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ promiriada + + Glk + {0} Glk + {0} Glk + litr/km @@ -5542,6 +5656,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mmHg {0} mmHg + + {0} Hg + {0} Hg + funt/dy.kv {0} funt/dy.kv @@ -5716,10 +5834,69 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} imp. kvarta {0} imp. kvarta - - qism/milliard - {0} ta qism/mlrd - {0} ta qism/mlrd + + {0} sr + {0} sr + + + {0} kat + {0} kat + + + {0} C + {0} C + + + {0} F + {0} F + + + {0} H + {0} H + + + {0} S + {0} S + + + kal-IT + {0} kal-IT + {0} kal-IT + + + {0} Bq + {0} Bq + + + {0} Sv + {0} Sv + + + Gr + {0} Gr + {0} Gr + + + {0} kgf + {0} kgf + + + {0} T + {0} T + + + {0} Wb + {0} Wb + + + yorug‘lik + {0} yorug‘lik + {0} yorug‘lik + + + milliarddan ulush + {0} ppb + {0} ppb kecha @@ -5760,7 +5937,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} ft² {0} ft² - + + qism + {0} qismi + {0} qismi + + ppm {0}ppm {0}ppm @@ -5768,6 +5950,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ % + + Glk + {0} Glk + {0} Glk + {0}L/100km {0}L/100km @@ -5815,6 +6002,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} o.k. {0} hp + + {0} Hg + {0} Hg + {0} mi/h {0} mi/h @@ -5831,22 +6022,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}L {0}L - - {0} imp. desert qoshiq - {0} imp. desert qoshiq + + kal-IT + {0} kal-IT + {0} kal-IT - - imp.kvarta + + Gr + {0} Gr + {0} Gr - - qism/milliard - {0} ta qism/mlrd - {0} ta qism/mlrd + + yorug‘lik + {0} yorug‘lik + {0} yorug‘lik + + + ppb + {0}ppb + {0}ppb - kecha - {0} kecha - {0} kecha {0}/nkecha diff --git a/make/data/cldr/common/main/uz_Arab.xml b/make/data/cldr/common/main/uz_Arab.xml index c69396e1118..739972de648 100644 --- a/make/data/cldr/common/main/uz_Arab.xml +++ b/make/data/cldr/common/main/uz_Arab.xml @@ -215,6 +215,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/uz_Cyrl.xml b/make/data/cldr/common/main/uz_Cyrl.xml index 6def99fbf5a..5e12f439c3b 100644 --- a/make/data/cldr/common/main/uz_Cyrl.xml +++ b/make/data/cldr/common/main/uz_Cyrl.xml @@ -1290,9 +1290,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ғарбий Африка вақти - Ғарбий Африка стандарт вақти - Ғарбий Африка ёзги вақти + Ғарбий Африка вақти @@ -1630,6 +1628,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Гайана вақти + + + Гавайи-алеут стандарт вақти + + Гавайи-алеут вақти @@ -2182,38 +2185,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + #,##0.00 ¤ + + + #,##0.00 ¤ + + + #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ - ¤ 0минг - ¤ 0минг - ¤ 00минг - ¤ 00минг - ¤ 000минг - ¤ 000минг - ¤ 0млн - ¤ 0млн - ¤ 00млн - ¤ 00млн - ¤ 000млн - ¤ 000млн - ¤ 0млрд - ¤ 0млрд - ¤ 00млрд - ¤ 00млрд - ¤ 000млрд - ¤ 000млрд - ¤ 0трлн - ¤ 0трлн - ¤ 00трлн - ¤ 00трлн - ¤ 000трлн - ¤ 000трлн + 0минг ¤ + 0минг ¤ + 00минг ¤ + 00минг ¤ + 000минг ¤ + 000минг ¤ + 0млн ¤ + 0млн ¤ + 00млн ¤ + 00млн ¤ + 000млн ¤ + 000млн ¤ + 0млрд ¤ + 0млрд ¤ + 00млрд ¤ + 00млрд ¤ + 000млрд ¤ + 000млрд ¤ + 0трлн ¤ + 0трлн ¤ + 00трлн ¤ + 00трлн ¤ + 000трлн ¤ + 000трлн ¤ {0} {1} diff --git a/make/data/cldr/common/main/vec.xml b/make/data/cldr/common/main/vec.xml index df905e32262..b73420ede1a 100644 --- a/make/data/cldr/common/main/vec.xml +++ b/make/data/cldr/common/main/vec.xml @@ -1028,6 +1028,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic lunaro etiòpego lunaro etiòpego (amete alem) lunaro gregorian + gregorian lunaro ebràego lunaro izlàmego lunaro izlàmego (tabular) @@ -1041,6 +1042,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic òrdane predefenìo Unicode reserca jenèrega òrdane standard + standard sistema a 12 ore (0–11) sistema a 12 ore (1–12) sistema a 24 ore (0–23) @@ -1141,6 +1143,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'le' {0} + + {1} 'a' 'le' {0} + @@ -1149,6 +1154,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'a' 'le' {0} + + {1} 'a' 'le' {0} + @@ -1163,10 +1171,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d y G + MM/y GGGGG dd/MM/y GGGGG + E dd/MM/y GGGGG MMM y G d MMM y G E d MMM y G + 'h'HH v dd/MM E dd/MM d MMM @@ -1502,7 +1513,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic E d y G + MM/y G dd/MM/y G + E dd/MM/y G MMM y G d MMM y G E d MMM y G @@ -1510,6 +1523,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH:mm:ss (v) h:mm a (v) HH:mm (v) + 'h'HH v dd/MM E dd/MM d MMM @@ -2301,6 +2315,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic UTC{0} UTC + UTC+? Ora {0} Ora d’istà {0} Ora normale {0} @@ -2584,7 +2599,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Pnom Pen - + Atolo Canton @@ -3008,9 +3023,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Ora de l’Àfrega osidentale - Ora normale de l’Àfrega osidentale - Ora d’istà de l’Àfrega osidentale + Ora de l’Àfrega osidentale @@ -3360,6 +3373,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ora de la Guyana + + + Ora normale de Hawai e Aleutine + + Ora de Hawai e Aleutine @@ -3927,34 +3945,38 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ 0 - 0 - 0 - 0 - 0 - 0 - 0 mln ¤ - 0 mln ¤ - 00 mln ¤ - 00 mln ¤ - 000 mln ¤ - 000 mln ¤ - 0 mld ¤ - 0 mld ¤ - 00 mld ¤ - 00 mld ¤ - 000 mld ¤ - 000 mld ¤ - 0 bln ¤ - 0 bln ¤ - 00 bln ¤ - 00 bln ¤ - 000 bln ¤ - 000 bln ¤ + 0 mila ¤ + 00 mila ¤ + 00 mila ¤ + 000 mila ¤ + 000 mila ¤ + 0 mln ¤ + 0 mln ¤ + 00 mln ¤ + 00 mln ¤ + 000 mln ¤ + 000 mln ¤ + 0 mld ¤ + 0 mld ¤ + 00 mld ¤ + 00 mld ¤ + 000 mld ¤ + 000 mld ¤ + 0 bln ¤ + 0 bln ¤ + 00 bln ¤ + 00 bln ¤ + 000 bln ¤ + 000 bln ¤ {0} ¤¤ @@ -4737,6 +4759,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic dòlari caraìbeghi XCD + + fiorin caraìbego + fiorin caraìbego + fiorini caraìbeghi + Cf + franco CFA de l’Àfrega osidentale franco CFA de l’Àfrega osidentale @@ -4769,6 +4797,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic kwacha zanbian kwacha zanbiani + + oro de Zimbabwe + oro de Zimbabwe + ori de Zimbabwe + {0}-{1} diff --git a/make/data/cldr/common/main/vi.xml b/make/data/cldr/common/main/vi.xml index 3f709432953..fa08b4ff0b5 100644 --- a/make/data/cldr/common/main/vi.xml +++ b/make/data/cldr/common/main/vi.xml @@ -57,7 +57,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tiếng Azerbaijan Tiếng Azeri Tiếng Bashkir - Tiếng Baluchi + Tiếng Baloch Tiếng Bali Tiếng Bavaria Tiếng Basaa @@ -312,6 +312,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tiếng Bafia Tiếng Cologne Tiếng Kurd + Tiếng Kurd + Tiếng Kurmanji Tiếng Kumyk Tiếng Kutenai Tiếng Komi @@ -412,7 +414,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tiếng Na Uy cổ Tiếng N’Ko Tiếng Ndebele Miền Nam - Tiếng Sotho Miền Bắc + Tiếng Bắc Sotho Tiếng Nuer Tiếng Navajo Tiếng Newari cổ @@ -515,7 +517,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Tiếng Serer Tiếng Swati Tiếng Saho - Tiếng Sotho Miền Nam + Tiếng Nam Sotho Tiếng Straits Salish Tiếng Sunda Tiếng Sukuma @@ -833,7 +835,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Argentina Samoa thuộc Mỹ Áo - Australia + Úc Aruba Quần đảo Åland Azerbaijan @@ -874,6 +876,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Trung Quốc Colombia Đảo Clipperton + Sark Costa Rica Cuba Cape Verde @@ -1166,35 +1169,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sắp xếp theo số Cường độ sắp xếp Tiền tệ + Trình bày emoji Chu kỳ giờ (12 với 24) Kiểu xuống dòng + Ngắt dòng trong từ Hệ thống đo lường Số + Ngắt câu sau khi viết tắt. Múi giờ Biến thể ngôn ngữ Sử dụng cá nhân Lịch Phật Giáo + Phật giáo Lịch Trung Quốc + Trung Quốc Lịch Copts + Copts Lịch Dangi + Dangi Lịch Ethiopia + Ethiopic Lịch Ethiopic Amete Alem + Ethiopic Amete Alem Lịch Gregory + Gregory Lịch Do Thái + Do Thái Lịch Quốc gia Ấn Độ Lịch Hồi Giáo + Hồi giáo Lịch Hồi Giáo (dạng bảng, kỷ nguyên dân sự) + Hồi giáo (dạng bảng, kỷ nguyên dân sự) Lịch Hồi Giáo - Ả Rập Xê-út Lịch Hồi Giáo - Thiên văn Lịch Hồi Giáo (Umm al-Qura) + Hồi giáo (Umm al-Qura) Lịch ISO-8601 Lịch Nhật Bản + Nhật Bản Lịch Ba Tư + Ba Tư Lịch Trung Hoa Dân Quốc + Trung Hoa Dân Quốc Định dạng tiền tệ kế toán + Kế toán Định dạng tiền tệ chuẩn + Chuẩn Sắp xếp biểu tượng Sắp xếp biểu tượng bỏ qua Sắp xếp dấu trọng âm bình thường @@ -1204,23 +1226,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Sắp xếp chữ hoa đầu tiên Sắp xếp không phân biệt chữ hoa/chữ thường Sắp xếp phân biệt chữ hoa/chữ thường - Thứ tự sắp xếp theo tiếng Trung phồn thể - Big5 Thứ tự sắp xếp trước đây, để tương thích + Khả năng tương thích Thứ tự sắp xếp theo từ điển + Từ điển Thứ tự sắp xếp unicode mặc định + Unicode mặc định Thứ tự sắp xếp biểu tượng Quy tắc sắp xếp Châu Âu - Thứ tự sắp xếp theo tiếng Trung giản thể - GB2312 Thứ tự sắp xếp theo danh bạ điện thoại + Danh bạ điện thoại Thứ tự sắp xếp theo ngữ âm + Ngữ âm Thứ tự sắp xếp theo bính âm + Bính âm Tìm kiếm mục đích chung + Tìm kiếm Tìm kiếm theo Phụ âm Đầu Hangul Thứ tự sắp xếp chuẩn + Chuẩn Thứ tự sắp xếp theo nét chữ + Nét chữ Thứ tự sắp xếp truyền thống + Truyền thống Trình tự sắp xếp theo bộ-nét + Bộ-nét Thứ tự sắp xếp theo chú âm phù hiệu + Chú âm phù hiệu Sắp xếp không theo chuẩn hóa Sắp xếp unicode được chuẩn hóa Sắp xếp từng chữ số @@ -1233,18 +1265,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Độ rộng tối đa Nửa độ rộng Số + Mặc định + Emoji + Văn bản Hệ thống 12 giờ (0–11) + 12 (0–11) Hệ thống 12 giờ (1–12) + 12 (1–12) Hệ thống 24 giờ (0–23) + 24 (0–23) Hệ thống 24 giờ (1–24) + 24 (1–24) Kiểu xuống dòng thoáng + Thoáng Kiểu xuống dòng thường + Bình thường Kiểu xuống dòng hẹp + Hẹp + Ngắt tất cả + Giữ tất cả + Bình thường + Giữ trong cụm từ Chuyển tự US BGN Chuyển tự UN GEGN Hệ mét + Mét Hệ đo lường Anh + Anh Hệ đo lường Mỹ + Mỹ Chữ số Ahom Chữ số Ả Rập - Ấn Độ Chữ số Ả Rập - Ấn Độ mở rộng @@ -1326,6 +1375,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Chữ số Vai Chữ số Wara Chữ số Wancho + Tắt + Bật Hệ mét @@ -1352,9 +1403,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] @@ -1597,6 +1645,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h 'giờ' B + h 'giờ' B E h:mm B E h:mm:ss B E E, 'ngày' d @@ -1706,69 +1755,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h B – h B h – h B - - h:mm B – h:mm B - - - h a – h a - h:mm a – h:mm a h:mm a – h:mm a v - - h a – h a v - h–h a v - - - MM-dd – MM-dd - MM-dd – MM-dd - - - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E - - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - - - y-MM – y-MM - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - - - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - U MMM – U MMM - - - U MMM d – MMM d - U MMM d – U MMM d - - - U MMM d, E – MMM d, E - U MMM d, E – MMM d, E - U MMM d, E – U MMM d, E - - - U MMMM – U MMMM - @@ -1828,6 +1822,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 'lúc' {0} {1} + + 'lúc' {0} {1} + @@ -1836,6 +1833,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 'lúc' {0} {1} + + 'lúc' {0} {1} + @@ -1849,22 +1849,26 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h 'giờ' B + h 'giờ' B E h:mm B E h:mm:ss B E E, 'ngày' d + h a E h:mm a E HH:mm E h:mm:ss a E HH:mm:ss E y G + M/y G d/M/y GGGGG + E d/M/y G MMM y G d MMM, y G E, d MMM, y G - h a HH 'giờ' h:mm a h:mm:ss a + h 'giờ' a v d/M E, d/M dd-MM @@ -1891,7 +1895,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h – h 'giờ' B - h:mm B – h:mm B h:mm – h:mm B h:mm – h:mm B @@ -2084,12 +2087,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ CN - Th 2 - Th 3 - Th 4 - Th 5 - Th 6 - Th 7 + Thứ 2 + Thứ 3 + Thứ 4 + Thứ 5 + Thứ 6 + Thứ 7 CN @@ -2253,6 +2256,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 'lúc' {0} {1} + + 'lúc' {0} {1} + @@ -2261,6 +2267,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 'lúc' {0} {1} + + 'lúc' {0} {1} + @@ -2274,25 +2283,29 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h 'giờ' B + h 'giờ' B E h:mm B E h:mm:ss B E E, 'ngày' d + h 'giờ' a E h:mm a E HH:mm E h:mm:ss a E HH:mm:ss E y G + M/y G d/M/y G + E, d/M/y G MMM y G d MMM, y G E, d MMM, y G - h a HH 'giờ' h:mm a H:mm h:mm:ss a h:mm:ss a v h:mm a v + h 'giờ' a v d/M E, d/M dd-MM @@ -2364,10 +2377,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E, d MMM – E, d MMM y G E, d MMM y – E, d MMM y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -2378,10 +2387,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - 'Tháng' M – M @@ -2818,11 +2823,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Giờ mùa hè {0} Giờ chuẩn {0} - - Giờ HST - HST - HDT - Honolulu @@ -2859,7 +2859,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Đảo Man - Enderbury + Đảo Canton Bình Nhưỡng @@ -2938,9 +2938,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Giờ Tây Phi - Giờ Chuẩn Tây Phi - Giờ Mùa Hè Tây Phi + Giờ Tây Phi @@ -3358,6 +3356,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Giờ Guyana + + + Giờ Chuẩn Hawaii-Aleut + + + HAST + + Giờ Hawaii-Aleut @@ -3813,6 +3819,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Giờ Chuuk + + + Giờ Thổ Nhĩ Kỳ + Giờ Chuẩn Thổ Nhĩ Kỳ + Giờ Mùa Hè Thổ Nhĩ Kỳ + + Giờ Turkmenistan @@ -3944,10 +3957,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ #,##0.00 ¤ - #,##0.00 + #,##0.00 ¤ - #,##0.00;(#,##0.00) + #,##0.00 ¤ + #,##0.00 @@ -4572,7 +4586,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Rupee Maldives (1947–1981) - Rupee Maldives (1947–1981) Rufiyaa Maldives @@ -4928,6 +4941,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Đô la Đông Caribê đô la Đông Caribê + + Guilder Caribe + Guilder Caribe + Quyền Rút vốn Đặc biệt @@ -5007,6 +5024,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Đồng Đô la Zimbabwe (1980–2008) + + Zimbabwean Gold + Zimbabwean Gold + Đồng Đô la Zimbabwe (2009) @@ -5186,9 +5207,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ carat {0} carat + + phần + {0} phần + + + phần triệu + {0} phần triệu + {0} phần vạn + + {0} glucose + lít/km {0} lít/km @@ -5487,6 +5519,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milimét thủy ngân {0} milimét thủy ngân + + thuỷ ngân + {0} thuỷ ngân + pound/inch vuông {0} pound/inch vuông @@ -5619,6 +5655,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ cup khối {0} cup khối + + ao-xơ chất lỏng hệ mét + {0} ao-xơ chất lỏng hệ mét + gallon {0} gallon @@ -5648,14 +5688,64 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ dram {0} dram - - phần tỷ - {0} phần tỷ + + steradian + {0} steradian - - đêm - {0} đêm - {0}/đêm + + katal + {0} katal + + + coulomb + {0} coulomb + + + fara + {0} fara + + + henry + {0} henry + + + siemen + {0} siemen + + + calo [IT] + {0} calo [IT] + + + becquerel + {0} becquerel + + + sievert + {0} sievert + + + gray + {0} gray + + + lực kilôgam + {0} lực kilôgam + + + tesla + {0} tesla + + + weber + {0} weber + + + ánh sáng + {0} ánh sáng + + + {0} phần tỷ phương trời @@ -5693,9 +5783,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mục {0} mục + + phần + {0} phần + + + phần triệu + {0} phần triệu + phần vạn + + Glc + {0} Glc + l/km {0} l/km @@ -5881,6 +5983,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ W + + of Hg + {0} of Hg + {0} mph @@ -5889,6 +5995,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} L {0}/L + + {0} fl oz m. + gal {0} gal @@ -5946,8 +6055,53 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ lít Anh {0} lít Anh - + + {0} sr + + + {0} kat + + + {0} C + + + {0} F + + + {0} H + + + {0} S + + + cal-IT + {0} cal-IT + + + {0} Bq + + + {0} Sv + + + {0} Gy + + + {0} kgf + + + {0} T + + + {0} Wb + + + ánh sáng + {0} ánh sáng + + phần tỷ + {0} phần tỷ đêm @@ -5969,9 +6123,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}ha + + phần + {0} phần + + + phần triệu + {0} phần triệu + + + Glc + {0} Glc + PB @@ -5979,9 +6145,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ B {0} B - - {0}miligiây - eV @@ -6046,6 +6209,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}hp + + of Hg + {0} of Hg + {0}" Hg @@ -6062,19 +6229,61 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}L {0}/l + + {0} fl oz m. + {0}/gal {0} fl ozIm - - {0}ppb + + {0} sr - - đêm - {0} đêm - {0}/đêm + + {0} kat + + + {0} C + + + {0} F + + + {0} H + + + {0} S + + + cal-IT + {0} cal-IT + + + {0} Bq + + + {0} Sv + + + {0} Gy + + + {0} kgf + + + {0} T + + + {0} Wb + + + ánh sáng + {0} ánh sáng + + + {0} phần tỷ @@ -6141,7 +6350,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mũi tên hướng xuống mũi tên lên xuống chữ viết Đông Á - biểu tượng + biểu tượng cảm xúc chữ viết Châu Âu nữ cờ diff --git a/make/data/cldr/common/main/vmw.xml b/make/data/cldr/common/main/vmw.xml index 0ee0670414f..f232efec747 100644 --- a/make/data/cldr/common/main/vmw.xml +++ b/make/data/cldr/common/main/vmw.xml @@ -80,7 +80,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic d MMM y - {0} ‘mpakha’ {1} + {0} mpakha {1} @@ -106,6 +106,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/vo.xml b/make/data/cldr/common/main/vo.xml index 94fd4835ca3..3a121014dc1 100644 --- a/make/data/cldr/common/main/vo.xml +++ b/make/data/cldr/common/main/vo.xml @@ -78,7 +78,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - GGGGG y-MM-dd + G y-MM-dd diff --git a/make/data/cldr/common/main/wae.xml b/make/data/cldr/common/main/wae.xml index ac04028d196..9009f112dbf 100644 --- a/make/data/cldr/common/main/wae.xml +++ b/make/data/cldr/common/main/wae.xml @@ -1354,7 +1354,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic , - + ' {0} {1} diff --git a/make/data/cldr/common/main/wal.xml b/make/data/cldr/common/main/wal.xml index 70297ce0897..9be1f34aa0e 100644 --- a/make/data/cldr/common/main/wal.xml +++ b/make/data/cldr/common/main/wal.xml @@ -340,7 +340,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ethi - + ' diff --git a/make/data/cldr/common/main/wo.xml b/make/data/cldr/common/main/wo.xml index 5b75bfa0907..ba992d3bdf3 100644 --- a/make/data/cldr/common/main/wo.xml +++ b/make/data/cldr/common/main/wo.xml @@ -15,7 +15,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Afrikaans Amharik Arabic - Araab Asame Aserbayjane Baskir @@ -277,6 +276,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Siin Kolombi Ile Clipperton + Guernsey Pound Kosta Rika Kuba Kabo Werde @@ -494,8 +494,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Arminaatu Gregoriyee + Gregorian ISO-8601 Calendar SSO (Toftalin wiñ gën a xam) + Njàng miir Siifari Tugal @@ -767,7 +769,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM, y G d MMM, y G E, d MMM, y G - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1238,9 +1239,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Waxtu sowwu Afrique - Waxtu buñ miin ci sowwu Afrique - Afrique du sowwu jant + Waxtu sowwu Afrique @@ -1590,6 +1589,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Waxtu Guyana + + + Waxtu buñ jagleel Hawaii-Aleutian + + Waxtu Hawaii-Aleutian @@ -2121,18 +2125,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - ¤0K - ¤00K - ¤000K - ¤0M - ¤00M - ¤000M - ¤0B - ¤00B - ¤000B - ¤0T - ¤00T - ¤000T + ¤ 0K + ¤ 00K + ¤ 000K + ¤ 0M + ¤ 00M + ¤ 000M + ¤ 0B + ¤ 00B + ¤ 000B + ¤ 0T + ¤ 00T + ¤ 000T @@ -2199,7 +2203,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Burundian Franc - Burundian francs Vote BMD @@ -2207,7 +2210,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Brunei Dollar - Brunei dollars Bolivian Boliviano @@ -2223,7 +2225,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bhutanese Ngultrum - Bhutanese ngultrums Botswanan Pula @@ -2235,7 +2236,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Belize Dollar - Belize dollars Vote CAD @@ -2268,7 +2268,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Costa Rican Colón - Costa Rican colóns Cuban Convertible Peso @@ -2309,7 +2308,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Eritrean Nakfa - Eritrean nakfas Ethiopian Birr @@ -2317,7 +2315,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Euro - euro Fijian Dollar @@ -2333,7 +2330,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Georgian Lari - Georgian laris Ghanaian Cedi @@ -2422,7 +2418,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kenyan Shilling - Kenyan shillings Kyrgystani Som @@ -2434,7 +2429,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Comorian Franc - Comorian francs North Korean Won @@ -2466,7 +2460,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Sri Lankan Rupee - Sri Lankan rupees Liberian Dollar @@ -2482,7 +2475,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Moroccan dirhams - Moroccan dirhams Moldovan Leu @@ -2515,15 +2507,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic Mauritian Rupee - Mauritian rupees Maldivian Rufiyaa - Maldivian rufiyaas Malawian Kwacha - Malawian kwachas Mexican Peso @@ -2556,7 +2545,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nepalese Rupee - Nepalese rupees New Zealand Dollar @@ -2580,11 +2568,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Philippine Peso - Philippine pesos Pakistani Rupee - Pakistani rupees Polish Zloty @@ -2637,7 +2623,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Singapore Dollar - Singapore dollars St. Helena Pound @@ -2677,7 +2662,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Thai Baht - Thai baht Tajikistani Somoni @@ -2697,7 +2681,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Turkish Lira - Turkish Lira Trinidad & Tobago Dollar @@ -2756,6 +2739,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic East Caribbean Dollar East Caribbean dollars + + Gildiye Karayib + Gildiye Karayib + Franc CFA bu Afrik Sowwu-jant Franc CFA yu Afrik Sowwu-jant @@ -2766,11 +2753,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Xaalis buñ Xamul - (xaalis buñ xamul) Yemeni Rial - Yemeni rials South African Rand @@ -2780,6 +2765,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Zambian Kwacha Zambian kwachas + + Zimbabwean ZiG + Zimbabwean ZiG + ⩾{0} diff --git a/make/data/cldr/common/main/xh.xml b/make/data/cldr/common/main/xh.xml index e4dec18f57d..3bd9a1e8b15 100644 --- a/make/data/cldr/common/main/xh.xml +++ b/make/data/cldr/common/main/xh.xml @@ -16,21 +16,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic IsiAmharic Isi-Arabhu Isi-Arabhu (Sale mihla) - isiAssamese - Isi-Azerbaijani - Isi-Belarusian - Isi-Bulgaria + IsiAssamese + Isi-Azerbaijani + Isi-Belarusian + Isi-Bulgaria IsiBangla - Breton - Isi-Bosnia - Isi-Calatan - Isi-Czech - Isi-Welsh - Isi-Danish + IsiBreton + Isi-Bosnia + Isi-Calatan + Isi-Czech + Isi-Welsh + Isi-Danish IsiJamani IsiJamani Sase-Austria IsiJamani Esiyi-High Swiss - Isi-Greek + Isi-Greek IsiNgesi IsiNgesi Sase-Australia IsiNgesi SaseKhanada @@ -38,99 +38,99 @@ CLDR data files are interpreted according to the LDML specification (http://unic IsiNgesi sase-UK Isingesi SaseMelika IsiNgesi Sase-US - Isi-Esperanto + Isi-Esperanto Isi-Spanish IsiSpanish SaseLatin America IsiSpanish SaseYurophu IsiSpanish SaseMexico - Isi-Estonian - Isi-Basque - Isi-Persia - Isi-Finnish - Isi-Taglog - Isi-Faroese + Isi-Estonian + Isi-Basque + Isi-Persia + Isi-Finnish + Isi-Taglog + Isi-Faroese IsiFrentshi IsiFrentshi SaseKhanada IsiFrentshi SaseSwitzerland - Isi-Frisian - Isi-Irish - Scots Gaelic - Isi-Galician + Isi-Frisian + Isi-Irish + Scots Gaelic + Isi-Galician Guarani - Isi-Gujarati - Isi-Hebrew + Isi-Gujarati + Isi-Hebrew IsiHindi IsiHindi (Latin) IsiHinglish - Isi-Croatia - Isi-Hungarian - isiArmenian - Interlingua + Isi-Croatia + Isi-Hungarian + IsiArmenia + Isi-Interlingua Isi-Indonesia - isiInterlingue - Isi-Icelandic + Isi-Interlingue + Isi-Icelandic IsiTaliyane IsiJapan - Isi-Javanese - Isi-Georgia - isiCambodia - Isi-Kannada + Isi-Javanese + Isi-Georgia + IsiCambodia + Isi-Kannada Isi-Korean - Kurdish - Kyrgyz + IsiKurdish + IsiKyrgz Isi-Latin Iilwimi - IsiLoathian - Isi-Lithuanian - Isi-Latvian - Isi-Macedonian - Isi-Malayalam - IsiMongolian - Isi-Marathi - Isi-Malay - Isi-Maltese - Isi-Nepali + IsiLoathian + Isi-Lithuanian + Isi-Latvian + Isi-Macedonian + Isi-Malayalam + IsiMongolian + Isi-Marathi + Isi-Malay + Isi-Maltese + Isi-Nepali IsiDatshi IsiFlemish - Isi-Norwegia (Nynorsk) - Isi-Norwegian - Iso-Occitan - Oriya - Isi-Punjabi + Isi-Norwegia (Nynorsk) + Isi-Norwegian + Iso-Occitan + Oriya + Isi-Punjabi Isi-Polish - Pashto + IsiPashto IsiPhuthukezi IsiPhuthukezi SaseBrazil IsiPhuthukezi SasePortugal - Isi-Romanian + Isi-Romanian Isi-Russian - iSanskrit - isiSindhi + IsiSanskrit + IsiSindhi Serbo-Croatian - Isi-Sinhalese - Isi-Slovak - Isi-Slovenian - IsiSomaliya + Isi-Sinhalese + Isi-Slovak + Isi-Slovenian + IsiSomaliya IsiAlbania - Isi-Serbia - Sesotho - Isi-Sudanese - Isi-Swedish - Isi-Swahili - Isi-Tamil - Isi-Telegu + Isi-Serbia + Sesotho + Isi-Sudanese + Isi-Swedish + Isi-Swahili + Isi-Tamil + Isi-Telegu Isi-Thai - Isi-Tigrinya - Turkmen + Isi-Tigrinya + IsiTurkmen Klingon Isi-Turkish Twi - Isi Uighur - Isi-Ukranian - Unknown language - Urdu - Isi-Uzbek - Isi-Vietnamese + Isi Uighur + Isi-Ukranian + Ulwimi olungaziwayo + IsiUrdu + Isi-Uzbek + Isi-Vietnamese IsiXhosa Yiddish IsiMandarin @@ -139,7 +139,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic IsiMandarin Esenziwe Lula IsiTshayina Esiqhelekileyo IsiMandarin Esiqhelekileyo - isiZulu + IsiZulu @@ -240,6 +240,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ETshayina EColombia EClipperton Island + ESark ECosta Rica ECuba ECape Verde @@ -466,9 +467,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ingingqi Engaziwayo - Ngokwekhalenda YeGregorian - Ikhalenda ye-ISO-8601 + Ngokwekhalenda KaGregorian + IGregorian + Ikhalenda kaGregorian Standard Sort Order + Eqhelekileyo Western Digits @@ -544,7 +547,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a M/d @@ -620,7 +622,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM d – d - MMM d – MMM d E, MMM d – E, MMM d @@ -681,6 +682,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nov Dis + + J + F + M + A + M + J + J + A + S + O + N + D + Janyuwari Februwari @@ -711,6 +726,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic Nov Dis + + J + F + M + A + M + J + J + A + S + O + N + D + Janyuwari Februwari @@ -740,7 +769,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic C - M + Mv Sb Tht Sin @@ -769,7 +798,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic C - M + Mv Sb St Sin @@ -796,7 +825,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic + Phambi KoKristu Phambi Kwexesha Eliqhelekileyo + Anno Domino Ixesha Eliqhelekileyo @@ -855,42 +886,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} {0} + + {1} 'ngo' {0} + {1} {0} - {1} 'kwi' {0} + {1} 'ngo' {0} + + + {1} 'ngo' {0} {1} {0} + + {1}, {0} + + + {1}, {0} + {1} {0} + + {1}, {0} + + + {1}, {0} + - d E E h:mm a E h:mm:ss a - y G - M/d/y G - MMM y G - MMM d, y G - E, MMM d, y G - h a h:mm a h:mm:ss a h:mm:ss a v h:mm a v - M/d - E, M/d - E, MMM d + 'iveki' W 'ka' MMMM + 'iveki' W 'ka' MMMM M/y M/d/y E, M/d/y @@ -900,53 +941,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMMM y QQQ y QQQQ y + 'iveki' w 'ka' Y + 'iveki' w 'ka' Y d – d - - y G – y G - y – y G - - - M/y G – M/y G - M/y – M/y G - M/y – M/y G - - - M/d/y – M/d/y G - M/d/y G – M/d/y G - M/d/y – M/d/y G - M/d/y – M/d/y G - - - E, M/d/y – E, M/d/y G - E, M/d/y G – E, M/d/y G - E, M/d/y – E, M/d/y G - E, M/d/y – E, M/d/y G - - - MMM y G – MMM y G - MMM – MMM y G - MMM y – MMM y G - - - MMM d – d, y G - MMM d, y G – MMM d, y G - MMM d – MMM d, y G - MMM d, y – MMM d, y G - - - E, MMM d – E, MMM d, y G - E, MMM d, y G – E, MMM d, y G - E, MMM d – E, MMM d, y G - E, MMM d, y – E, MMM d, y G - - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -955,9 +956,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm a – h:mm a v - - h–h a v - M – M @@ -974,7 +972,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic MMM d – d - MMM d – MMM d E, MMM d – E, MMM d @@ -1043,6 +1040,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic ikota + ikota edlulileyo + ikota esikuyo + ikota elandelayp kot. @@ -1097,11 +1097,117 @@ CLDR data files are interpreted according to the LDML specification (http://unic usuku lweveki + + kwiCawa edlulileyo + kule iCawa + kwiCawa ezayo + + + kwiCawa edlulileyo + kule iCawa + kwiCawa ezayo + + + kwiCawa edlulileyo + kule iCawa + kwiCawa ezayo + + + uMvulo odlulileyo + ngalo Mvulo + ngoMvulo ozayi + + + uMvulo odlulileyo + ngalo Mvulo + ngoMvulo ozayi + + + uMvulo odlulileyo + ngalo Mvulo + ngoMvulo ozayi + + + ngoLwesibini odlulileyo + ngalo uLwesibini + ngoLwesibini ozayo + + + ngoLwesibini odlulileyo + ngalo uLwesibini + ngoLwesibini ozayo + + + ngoLwesibini odlulileyo + ngalo uLwesibini + ngoLwesibini ozayo + + + ngoLwesithathu odlulileyo + ngalo Lwesithathu + ngoLwesithathu ozayo + + + ngoLwesithathu odlulileyo + ngalo Lwesithathu + ngoLwesithathu ozayo + + + ngoLwesithathu odlulileyo + ngalo Lwesithathu + lwest ozay + + + ngoLwesine odlulileyo + ngalo Lwesine + ngoLwesine ozayo + + + ngoLwesine odlulileyo + ngalo Lwesine + ngoLwesine ozayo + + + ngoLwesine odlulileyo + ngalo Lwesine + ngoLwesine ozayo + + + ngoLwesihlanu odlulileyo + ngalo Lwesihlanu + ngoLwesihlanu ozayo + + + ngoLwesihlanu odlulileyo + ngalo Lwesihlanu + ngoLwesihlanu ozayo + + + ngoLwesihlanu odlulileyo + ngalo Lwesihlanu + ngoLwesihlanu ozayo + + + ngoMgqibelo odlulileyo + ngalo Mgqibelo + ngoMgqibelo ozayo + + + ngoMgqibelo odlulileyo + ngalo Mgqibelo + ngoMgqibelo ozayo + + + ngoMgqibelo odlulileyo + ngalo Mgqibelo + ngoMgqibelo ozayo + Kusasa/Emva kwemini iyure + ngale yure yur. @@ -1111,6 +1217,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic umzuzu + ngalo mzuzu umz. @@ -1120,6 +1227,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic umzuzwana + ngoku zuzwa. @@ -1141,7 +1249,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Unknown City + Indawo Engaziwayo @@ -1153,6 +1261,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic Irish Standard Time + + ICanton Island + Kostanay @@ -1190,9 +1301,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - West Africa Time - West Africa Standard Time - West Africa Summer Time + West Africa Time @@ -1542,6 +1651,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Guyana Time + + + Hawaii-Aleutian Standard Time + + Hawaii-Aleutian Time @@ -2050,7 +2164,58 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 + + + + + ¤0K + ¤ 0K + ¤0K + ¤ 0K + ¤00K + ¤ 00K + ¤00K + ¤ 00K + ¤000K + ¤ 000K + ¤000K + ¤ 000K + ¤0M + ¤ 0M + ¤0M + ¤ 0M + ¤00M + ¤ 00M + ¤00M + ¤ 00M + ¤000M + ¤ 000M + ¤000M + ¤ 000M + ¤0G + ¤ 0G + ¤0G + ¤ 0G + ¤00G + ¤ 00G + ¤00G + ¤ 00G + ¤000G + ¤ 000G + ¤000G + ¤ 000G + ¤0T + ¤ 0T + ¤0T + ¤ 0T + ¤00T + ¤ 00T + ¤00T + ¤ 00T + ¤000T + ¤ 000T + ¤000T + ¤ 000T @@ -2818,6 +2983,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic East Caribbean dollar East Caribbean dollars + + ICaribbean guilder + ICaribbean guilder + ICaribbean guilder + ICg. + ICFA Franc yaseWest Africa ICFA franc yaseWest Africa @@ -2849,6 +3020,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic I-kwacha yaseZambia I-kwacha yaseZambia + + IZimbabwean Gold + IZimbabwean gold + IZimbabwean gold + IZWG + usuku {0} @@ -2858,6 +3035,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + square {0} + square {0} + + + cubic {0} + cubic {0} + cardinal direction {0} east @@ -2871,6 +3056,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + {0} Pa + {0}Pa + {0}S diff --git a/make/data/cldr/common/main/xnr.xml b/make/data/cldr/common/main/xnr.xml index 1bc080f23d7..486f0f029c6 100644 --- a/make/data/cldr/common/main/xnr.xml +++ b/make/data/cldr/common/main/xnr.xml @@ -893,9 +893,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic चीनी गणतंत्र पंचांग लेखांकन मुद्रा प्रारूप मानक मुद्रा प्रारूप - पारम्पारिक चीनी वर्गीकरण डिफ़ॉल्ट यूनिकोड सॉर्ट क्रम - सरलीकृत चीनी वर्गीकरण फोनबुक छंटाई क्रम पिनयीन वर्गीकरण सामान्य-उद्देश्य खोज @@ -906,7 +904,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 12 घंटेयां दी प्रणाली (1–12) 24 घंटेयां दी प्रणाली (0–23) 24 घंटेयां दी प्रणाली (1–24) - ढीली लैंण विच्छेद शैली< + ढीली लैंण विच्छेद शैली सामान्य लैंण विच्छेद शैली सख्त लैंण विच्छेद शैली मेट्रिक प्रणाली @@ -2156,7 +2154,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic कायरो - अल आइयून< + अल आइयून अस्मारा @@ -2344,7 +2342,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic नोम पेन्ह - + कैंटन @@ -3011,9 +3009,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - पश्चिम अफ़्रीका दा टैम - पश्चिम अफ़्रीका दा मानक टैम - पश्चिम अफ़्रीका दी तोंदिया दा टैम + पश्चिम अफ़्रीका दा टैम @@ -3363,6 +3359,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic गुयाना दा टैम + + + हवाई–आल्यूशन दा मानक टैम + + हवाई–आल्यूशन दा टैम @@ -3908,29 +3909,55 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + + + ¤ #,##,##0.00 + #,##,##0.00 + + + ¤ #,##,##0.00 + + + ¤#,##,##0.00 + ¤ #,##,##0.00 + #,##,##0.00 + ¤ #,##,##0.00 #,##,##0.00 - ¤0 हज़ार - ¤00 हज़ार + ¤0 हजार + ¤ 0 हजार + ¤00 हजार + ¤ 00 हजार ¤0 लख + ¤ 0 लख ¤00 लख + ¤ 00 लख ¤0 क॰ + ¤ 0 क॰ ¤00 क॰ + ¤ 00 क॰ ¤0 अ॰ + ¤ 0 अ॰ ¤00 अ॰ + ¤ 00 अ॰ ¤0 ख॰ + ¤ 0 ख॰ ¤00 ख॰ + ¤ 00 ख॰ ¤0 नील + ¤ 0 नील ¤00 नील + ¤ 00 नील diff --git a/make/data/cldr/common/main/xog.xml b/make/data/cldr/common/main/xog.xml index fc983490a00..9b83503d664 100644 --- a/make/data/cldr/common/main/xog.xml +++ b/make/data/cldr/common/main/xog.xml @@ -552,6 +552,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ + + + #,##0.00 ¤ diff --git a/make/data/cldr/common/main/yav.xml b/make/data/cldr/common/main/yav.xml index 88d7b957533..9246f963d23 100644 --- a/make/data/cldr/common/main/yav.xml +++ b/make/data/cldr/common/main/yav.xml @@ -558,9 +558,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic #,##0.00 ¤ + #,##0.00 ¤ #,##0.00 ¤;(#,##0.00 ¤) + #,##0.00 ¤;(#,##0.00 ¤) #,##0.00;(#,##0.00) diff --git a/make/data/cldr/common/main/yo.xml b/make/data/cldr/common/main/yo.xml index 056ec4d0f17..e160441da34 100644 --- a/make/data/cldr/common/main/yo.xml +++ b/make/data/cldr/common/main/yo.xml @@ -27,7 +27,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Èdè Obolo Èdè Angika Èdè Lárúbáwá - Èdè Lárúbáwá (Agbáyé) Èdè Mapushe Èdè Arapaho Èdè Arabiki ti Najidi @@ -41,6 +40,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Èdè Asabaijani Èdè Aseri Èdè Bashiri + Èdè Belúṣì Èdè Balini Èdè Basaa Èdè Belarusi @@ -221,6 +221,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Èdè Báfíà Èdè Colognian Kọdiṣì + Èdè Kọ́dìṣì + Èdè Kùmáǹjì Èdè Kumiki Èdè Komi Èdè Kọ́nììṣì @@ -611,7 +613,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àrin gùngun Áfíríkà Kóńgò – Brazaville Kóńgò (Olómìnira) - switiṣilandi + Súwísìlanìdì Kóútè forà Etíokun Kùúkù Ṣílè @@ -619,6 +621,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ṣáínà Kòlómíbìa Erékùsù Clipperston + Sáàkì Kuusita Ríkà Kúbà Etíokun Kápé féndè @@ -788,7 +791,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Siria looni Sani Marino Sẹnẹga - Somalia + Sòmálíà Surinami Gúúsù Sudan Sao tomi ati piriiṣipi @@ -852,42 +855,81 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ònà Ìgbekalẹ̀ owó Ètò Ẹlẹ́sẹẹsẹ Owó + Ìgbékalẹ̀ Ẹ̀mójì Òbíríkiti Wákàtí (12 vs 24) Àra Ìda Ìlà + Àwọn Ìdá Ìlà Láàárín Àwọn Ọ̀rọ̀ Èto Ìdiwọ̀n Àwọn nọ́ńbà + Ìdá Gbólóhùn Lẹ́yìn Ìgékúrú Kàlẹ́ńdà Buddhist + Ti Búdà Kàlẹ́ńdà ti Ṣáìnà + Ti Ṣáínà Èdè Kopti + Kọ́pítíìkì Kàlẹ́ńdà dangi + Dangi Kàlẹ́ńdà Ẹtíópíìkì + ti Etiópíà Èdè Kalenda Alem Amete tio Etiopia + Kàlẹ́ńdà Etiópíà Kàlẹ́ńdà Gregory + Ti Gregory Kàlẹ́ńdà Hébérù + Hébérù Kàlẹ́ńdà Lárúbáwá + Híjìrì Kàlẹ́ńdà ti Musulumi + Híjìrí (kàlẹ́ńdà oní-àtòkọ ti arà-ìlú) Kàlẹ́ńdà Musulumi + Híjìrí (Umm al-Qura) Kàlẹ́ńdà ISO-8601 Kàlẹ́ńdà ti Jàpánù + Ti Japan Kàlẹ́ńdà Pásíànù + Ti Páṣíà Kàlẹ́ńdà Minguo + Kàlẹ́ńdà Ṣáínà Ìgúnrégé Ìṣirò Owó Kọ́rẹ́ńsì + Ìṣirò owó Ònà ìgbekalẹ̀ owó tó jẹ́ àjùmọ̀lò + Àjùmọ̀lò Ètò Ẹlẹ́sẹẹsẹ Àkùàyàn Unicode + Unicode Àkùnyàn Ìṣàwárí Ète-Gbogbogbò + Ṣàwárí Ìlànà Onírúurú Ètò + Àjùmọ̀lò + Àkùnàyàn + Ẹ̀mójì + àtẹ̀jíṣẹ́ Èto Wákàtí 12 (0–11) + 12 (0–11) Èto Wákàtí 12 (1–12) + 12 (1–12) Èto Wákàtí 24 (0–23) + 24 (0–23) Èto Wákàtí 24 (1–24) + 24 (1–24) Àra Ìda Ìlà Títú + Tó dẹ̀ Àra Ìda Ìlà Déédéé + Déédéé Àra Ìda Ìlà Mímúná + Pàtó + Fọ́ gbogbo ẹ̀ + Pa gbogbo ẹ̀ mọ́ + Déédéé + Fi sílẹ̀ ní àpólà Èto Mẹ́tíríìkì + Mẹ́tíríìkì Èto Ìdiwọ̀n Ọba + UK Èto Ìdiwọ̀n US + US àwọn díjítì Làrubáwá-Índíà Àwọn Díjíìtì Lárúbáwá-Índíà fífẹ̀ Àwọn nọ́ńbà Àmẹ́níà @@ -928,6 +970,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àwọn díjíìtì Thai Àwọn díjíìtì Tibetán Àwọn díjíìtì Fai + Pípa + Títàn Mẹ́tíríìkì @@ -981,6 +1025,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ní' {0} + + {1} 'ní' {0} + @@ -989,6 +1036,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ní' {0} + + {1} 'ní' {0} + @@ -997,6 +1047,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -1005,6 +1058,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + d/M/y GGGGG @@ -1043,20 +1099,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Oṣù Ṣẹ́rẹ́ - Oṣù Èrèlè - Oṣù Ẹrẹ̀nà - Oṣù Ìgbé - Oṣù Ẹ̀bibi - Oṣù Òkúdu - Oṣù Agẹmọ - Oṣù Ògún - Oṣù Owewe - Oṣù Ọ̀wàrà - Oṣù Bélú - Oṣù Ọ̀pẹ̀ - S È @@ -1084,15 +1126,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ẹtì Àbámẹ́ta - - Àìkú - Ajé - Ìsẹ́gun - Ọjọ́rú - Ọjọ́bọ - Ẹtì - Àbámẹ́ta - Ọjọ́ Àìkú Ọjọ́ Ajé @@ -1104,15 +1137,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Àìkú - Ajé - Ìsẹ́gun - Ọjọ́rú - Ọjọ́bọ - Ẹtì - Àbámẹ́ta - À A @@ -1122,15 +1146,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic À - - Àìkú - Ajé - Ìsẹ́gun - Ọjọ́rú - Ọjọ́bọ - Ẹtì - Àbámẹ́ta - Àìkú Ajé @@ -1236,6 +1251,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ní' {0} + + {1} 'ní' {0} + @@ -1244,6 +1262,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1} 'ní' {0} + + {1} 'ní' {0} + @@ -1252,6 +1273,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + @@ -1260,13 +1284,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}, {0} + + {1}, {0} + E, d E h:mm a E h:mm:ss a + MM-y G d/M/y GGGGG - h a + E, d/M/y G h:mm a h:mm:ss a h:mm:ss a v @@ -1325,10 +1353,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic E, MMM d – E, MMM d, y G E, MMM d, y – E, MMM d, y G - - h a – h a - h–h a - h:mm a – h:mm a h:mm–h:mm a @@ -1339,46 +1363,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic h:mm–h:mm a v h:mm–h:mm a v - - h a – h a v - h–h a v - - - MM-dd – MM-dd - MM-dd – MM-dd - - - MM-dd, E – MM-dd, E - MM-dd, E – MM-dd, E - - - MMM d – MMM d - - - MMM d, E – MMM d, E - MMM d, E – MMM d, E - MM-y – MM-y - y-MM – y-MM - - - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd - y-MM-dd – y-MM-dd E, dd-MM-y – E dd-MM-y, E - y-MM-dd, E – y-MM-dd, E - y-MM-dd, E – y-MM-dd, E - - - y MMM – y MMM MMM d–d y MMM d – MMM d y - y MMM d – y MMM d MMM d, E – MMM d, E y @@ -1416,17 +1409,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ọdún tó kọjá Ọdún yìí Ọdún tó ńbọ̀ - - ní {0} Ọdún - - - Ọdún {0} sẹ́yìn - - - - - ní {0} Ọdún - Ọdún {0} sẹ́yìn @@ -1467,9 +1449,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ọjọ́ inú ọdún. - - Ọjọ́ inú ọdún. - Ọjọ́ tó wà láàárín ọ̀sẹ̀ @@ -1494,11 +1473,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ọjọ́ Ajé yìí next Monday - - ọjọ́ Ajé tó kọjá - ọjọ́ Ajé yìí - next Monday - Ìṣẹ́gun tókọ́já Ìṣẹ́gun èyí @@ -1554,17 +1528,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Ojọ́ tẹ́lẹ̀ - - O àná - O yì - O tóńbọ̀ - - ní {0} O - - - {0} W tẹ́lẹ̀ - - Ojọ́bọ̀ kẹyìn Ojọ́bọ̀ eyì @@ -1576,23 +1539,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic -{0} Àwọn Ojọ́bọ̀ - - Ojọ́ sẹ́yìn - Ojọ́ èyí - Ojọ́ tónbọ̀ - - + {0} Ojọ́ - - - {0} Ojọ́ èyìn - - + Ojọ́bọ̀ kẹyìn + Ojọ́bọ̀ eyì + Ojọ́bọ̀ tónbọ̀ - {0} Ojọ́ + +{0} Ojọ́bọ̀ - {0} Ojọ́ sẹ́yìn + -{0} Àwọn Ojọ́bọ̀ @@ -1607,22 +1562,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Etì àná - Etì yì - Et tónbọ̀ - - {0} Et - {0} Et sẹ́yìn - F tóko̩já - F èyí - F tómbò̩ + E̩tì tóko̩já + E̩tì èyí + E̩tì tómbò̩ - {0} F + {0} Àwo̩n Eti {0} F tẹ́lẹ̀ @@ -1639,26 +1588,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Abameta tokoja - - Aba tókojá - Aba èyí - Aba tónbọ̀ - - {0} Aba - - - {0} Aba. sẹ́yìn - - - Ab sẹ́yìn - Ab èyí - Ab tónbò + Abameta tóko̩já + Abameta eyi + Abameta tombo - {0} Ab + {0} Awon Abameta - {0} Ab ẹ̀yí + {0} Abameta tokoja @@ -1682,9 +1620,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Agbègbè - - Agbègbè - WAT{0} @@ -2044,9 +1979,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Àkókò Ìwọ̀-Oòrùn Afírikà - Àkókò Ìwọ̀-Oòrùn Àfẹnukò Afírikà - Àkókò Ìwọ̀-Oòrùn Ooru Afírikà + Àkókò Ìwọ̀-Oòrùn Afírikà @@ -2396,6 +2329,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àkókò Gúyànà + + + Àkókò Àfẹnukò Hawaii-Aleutian + + Àkókò Hawaii-Aleutian @@ -2922,7 +2860,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -2944,12 +2881,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤ 00M ¤000M ¤ 000M - ¤0B - ¤ 0B - ¤00B - ¤ 00B - ¤000B - ¤ 000B + ¤0G + ¤ 0G + ¤00G + ¤ 00G + ¤000G + ¤ 000G ¤0T ¤ 0T ¤00T @@ -3526,6 +3463,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dọ́là Ilà Oòrùn Karíbíà àwọn dọ́là Ilà Oòrùn Karíbíà + + Owó ìlú Kùrásọ̀ àti Saint Mátìnì + Owó ìlú Kùrásọ̀ àti Saint Mátìnì + Faransì ìwọ̀-oorùn Afíríkà àwọn faransì ìwọ̀-oorùn Afíríkà @@ -3553,6 +3494,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dọla ti Orílẹ́ède Siibabuwe + + Owó ìlú Sìnbábúwè + Owó ìlú Sìnbábúwè + Àwọn ọjọ́ {0} @@ -3663,19 +3608,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic kubiki {0} - - hekita - - - sare - àwọ́n ohun {0} àwon ohun + + ìpín + ìpín {0} + {0} ìdákan nínú ẹgbẹ̀rún + + nínú èròjà gúlúkóòsì + {0} nínú èròjà gúlúkóósì + maili ninu ami galọọnu kan @@ -3733,6 +3680,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ọ̀dún {0} ọ̀dún + {0} lọ́dún idamerin @@ -3760,9 +3708,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ìdinwọ̀n ayé {0} ìdinwọ̀n ayé - - mita - àwọn fọ́lọ́ọ̀ngì {0} àwọn fọ́lọ́ọ̀ngì @@ -3772,7 +3717,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} fátọ́ọ̀mù - kandẹ́là {0} kandẹ́là @@ -3791,13 +3735,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic milimita ti makuiri + + ti makuiri + {0} ti makuiri + Beaufort Beaufort {0} - - lita - búsẹ́ẹ̀li {0} búsẹ́ẹ̀li @@ -3816,18 +3761,52 @@ CLDR data files are interpreted according to the LDML specification (http://unic ìdásímérin {0} ìdásímérin - - ìmọ́lẹ̀ - {0} ìmọ́lẹ̀ + + steradians + {0} steradians - + + katals + {0} katals + + + coulombs + {0} coulombs + + + farads + + + henrys + + + siemens + + + kálórì [IT] + kálórì {0} [IT] + + + sieverts + + + grays + {0} grays + + + kilograms-force + {0} kilograms-force + + + teslas + + + webers + {0} webers + + ẹ̀yà nínú ìdá blíọ̀nù - - àwọn alẹ́ - àwọn alẹ́ {0} - {0}/alẹ́ - @@ -3864,13 +3843,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic ohun {0} ohun - + + ìpín + ìpín {0} + + ara/milíọ̀nù ìdákan nínú ẹgbẹ̀rún {0} pasenti + + Glc + Píbáìtì {0} Píbáìtì @@ -3990,6 +3976,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic gíréènì {0} gíréènì + + {0} ti Hg + lita @@ -4027,6 +4016,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic àmì ìdásímérin {0} àmì ìdásímérin + + cal-IT + ìmọ́lẹ̀ {0} ìmọ́lẹ̀ @@ -4063,7 +4055,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}km² - hekita {0}ha @@ -4073,7 +4064,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mi² - sare {0}ac @@ -4100,7 +4090,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}ohun - + + ìpín + ìpín {0} + + {0}ppm @@ -4109,6 +4103,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}mol + + Glc + {0}L/km @@ -4163,10 +4160,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic bit {0}bíìtì - - ọd - {0} ọd - {0} i @@ -4254,9 +4247,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic R⊕ {0}R⊕ - - mita - {0}fur @@ -4409,7 +4399,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}hL - lita {0}/L @@ -4452,7 +4441,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}pt - ife {0}c @@ -4493,14 +4481,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}àmì ìdásímérin + + cal-IT + - ìmọ́lẹ̀ {0}ìmọ́lẹ̀ - àwọn alẹ́ àwọn alẹ́{0} - {0}/alẹ́ @@ -4512,9 +4500,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}, tabi {1} {0} tàbí {1} - - {0}, {1} - {0} àti {1} diff --git a/make/data/cldr/common/main/yo_BJ.xml b/make/data/cldr/common/main/yo_BJ.xml index 0523124f50a..19168d7adba 100644 --- a/make/data/cldr/common/main/yo_BJ.xml +++ b/make/data/cldr/common/main/yo_BJ.xml @@ -14,6 +14,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Èdè Ágɛ̀ɛ̀mù + Èdè Belúshì Èdè Bɛ́nà Èdè Shɛ́rókiì Èdè Síláfííkì Ilé Ìjɔ́sìn @@ -47,6 +48,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kashímirì Sháńbálà Kɔdishì + Èdè Kɔ́dìshì Èdè Kɔ́nììshì Lùshɛ́mbɔ́ɔ̀gì Ɔlɔ́pɔ̀ èdè @@ -144,7 +146,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kàríbíánì ti Nɛ́dálándì Bɔ̀tìsúwánà Bèlísɛ̀ - switishilandi Shílè Sháínà Shɛ́ɛ́kì @@ -232,28 +233,48 @@ CLDR data files are interpreted according to the LDML specification (http://unic Kàlɛ́ńdà Ònà Ìgbekalɛ̀ owó Ètò Ɛlɛ́sɛɛsɛ + Ìgbékalɛ̀ Ɛ̀mójì + Àwɔn Ìdá Ìlà Láàárín Àwɔn Ɔ̀rɔ̀ Èto Ìdiwɔ̀n Àwɔn nɔ́ńbà + Ìdá Gbólóhùn Lɛ́yìn Ìgékúrú Kàlɛ́ńdà Buddhist Kàlɛ́ńdà ti Sháìnà + Ti Sháínà + Kɔ́pítíìkì Kàlɛ́ńdà dangi Kàlɛ́ńdà Ɛtíópíìkì + Kàlɛ́ńdà Etiópíà Kàlɛ́ńdà Gregory Kàlɛ́ńdà Hébérù Kàlɛ́ńdà Lárúbáwá Kàlɛ́ńdà ti Musulumi + Híjìrí (kàlɛ́ńdà oní-àtòkɔ ti arà-ìlú) Kàlɛ́ńdà Musulumi Kàlɛ́ńdà ISO-8601 Kàlɛ́ńdà ti Jàpánù Kàlɛ́ńdà Pásíànù + Ti Páshíà Kàlɛ́ńdà Minguo + Kàlɛ́ńdà Sháínà Ìgúnrégé Ìshirò Owó Kɔ́rɛ́ńsì + Ìshirò owó Ònà ìgbekalɛ̀ owó tó jɛ́ àjùmɔ̀lò + Àjùmɔ̀lò Ètò Ɛlɛ́sɛɛsɛ Àkùàyàn Unicode Ìshàwárí Ète-Gbogbogbò + Shàwárí + Àjùmɔ̀lò + Ɛ̀mójì + àtɛ̀jíshɛ́ + Tó dɛ̀ + Fɔ́ gbogbo ɛ̀ + Pa gbogbo ɛ̀ mɔ́ + Fi sílɛ̀ ní àpólà Èto Mɛ́tíríìkì + Mɛ́tíríìkì Èto Ìdiwɔ̀n Ɔba Èto Ìdiwɔ̀n US àwɔn díjítì Làrubáwá-Índíà @@ -328,20 +349,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Oshù Shɛ́rɛ́ - Oshù Èrèlè - Oshù Ɛrɛ̀nà - Oshù Ìgbé - Oshù Ɛ̀bibi - Oshù Òkúdu - Oshù Agɛmɔ - Oshù Ògún - Oshù Owewe - Oshù Ɔ̀wàrà - Oshù Bélú - Oshù Ɔ̀pɛ̀ - S È @@ -369,15 +376,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ɛtì Àbámɛ́ta - - Àìkú - Ajé - Ìsɛ́gun - Ɔjɔ́rú - Ɔjɔ́bɔ - Ɛtì - Àbámɛ́ta - Ɔjɔ́ Àìkú Ɔjɔ́ Ajé @@ -389,15 +387,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - Àìkú - Ajé - Ìsɛ́gun - Ɔjɔ́rú - Ɔjɔ́bɔ - Ɛtì - Àbámɛ́ta - À A @@ -407,15 +396,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ɛ À - - Àìkú - Ajé - Ìsɛ́gun - Ɔjɔ́rú - Ɔjɔ́bɔ - Ɛtì - Àbámɛ́ta - Àìkú Ajé @@ -475,17 +455,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ɔdún tó kɔjá Ɔdún yìí Ɔdún tó ńbɔ̀ - - ní {0} Ɔdún - - - Ɔdún {0} sɛ́yìn - - - - - ní {0} Ɔdún - Ɔdún {0} sɛ́yìn @@ -524,9 +493,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic Ɔjɔ́ inú ɔdún. - - Ɔjɔ́ inú ɔdún. - Ɔjɔ́ tó wà láàárín ɔ̀sɛ̀ @@ -551,11 +517,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ɔjɔ́ Ajé yìí next Monday - - ɔjɔ́ Ajé tó kɔjá - ɔjɔ́ Ajé yìí - next Monday - Ìshɛ́gun tókɔ́já Ìshɛ́gun èyí @@ -608,14 +569,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} Ojɔ́ tɛ́lɛ̀ - - O àná - O yì - O tóńbɔ̀ - - {0} W tɛ́lɛ̀ - - Ojɔ́bɔ̀ kɛyìn Ojɔ́bɔ̀ eyì @@ -627,29 +580,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic -{0} Àwɔn Ojɔ́bɔ̀ - - Ojɔ́ sɛ́yìn - Ojɔ́ èyí - Ojɔ́ tónbɔ̀ - - + {0} Ojɔ́ - - - {0} Ojɔ́ èyìn - - + Ojɔ́bɔ̀ kɛyìn + Ojɔ́bɔ̀ eyì + Ojɔ́bɔ̀ tónbɔ̀ - {0} Ojɔ́ + +{0} Ojɔ́bɔ̀ - {0} Ojɔ́ sɛ́yìn + -{0} Àwɔn Ojɔ́bɔ̀ - Etì àná - Etì yì - Et tónbɔ̀ {0} Et sɛ́yìn @@ -659,22 +601,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} F tɛ́lɛ̀ - - Aba tókojá - Aba èyí - Aba tónbɔ̀ - - {0} Aba. sɛ́yìn - - - - Ab sɛ́yìn - Ab èyí - Ab tónbò - - {0} Ab ɛ̀yí - - Àárɔ̀/ɔ̀sán @@ -771,9 +697,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Àkókò Ìwɔ̀-Oòrùn Afírikà - Àkókò Ìwɔ̀-Oòrùn Àfɛnukò Afírikà - Àkókò Ìwɔ̀-Oòrùn Ooru Afírikà + Àkókò Ìwɔ̀-Oòrùn Afírikà @@ -1027,6 +951,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic Àkókò Àfɛnukò Gulf + + + Àkókò Àfɛnukò Hawaii-Aleutian + + Àkókò Hawaii-Aleutian @@ -1814,6 +1743,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic Dɔ́là Ilà Oòrùn Karíbíà àwɔn dɔ́là Ilà Oòrùn Karíbíà + + Owó ìlú Kùrásɔ̀ àti Saint Mátìnì + Owó ìlú Kùrásɔ̀ àti Saint Mátìnì + Faransì ìwɔ̀-oorùn Afíríkà àwɔn faransì ìwɔ̀-oorùn Afíríkà @@ -1919,6 +1852,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic ɔ̀dún {0} ɔ̀dún + {0} lɔ́dún {0}/ɔsh @@ -1947,7 +1881,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} fátɔ́ɔ̀mù - kandɛ́là {0} kandɛ́là @@ -1971,21 +1904,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic shíbí oúnjɛ kékeré - - ìmɔ́lɛ̀ - {0} ìmɔ́lɛ̀ - - + ɛ̀yà nínú ìdá blíɔ̀nù - - àwɔn alɛ́ - àwɔn alɛ́ {0} - {0}/alɛ́ - - + ara/milíɔ̀nù @@ -2087,10 +2011,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - ɔd - {0} ɔd - ɔshɛ́ {0}/ɔ̀shɛ̀ @@ -2112,13 +2032,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}búsɛ́ɛ̀li - ìmɔ́lɛ̀ {0}ìmɔ́lɛ̀ - àwɔn alɛ́ àwɔn alɛ́{0} - {0}/alɛ́ diff --git a/make/data/cldr/common/main/yrl.xml b/make/data/cldr/common/main/yrl.xml index a82d832c7dc..e769a85c96c 100644 --- a/make/data/cldr/common/main/yrl.xml +++ b/make/data/cldr/common/main/yrl.xml @@ -1089,12 +1089,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Reyupurawaka turusuwa rupí Yupurawakasawa mirĩwa yuí turusúwa ãmurupí Yupurawakasawa mirĩwa yuí turusúwa amũrupisawa - Xinanhẽẽga rikusawarupí muakaresawa - Big5 Muakaresawa rinũdewa nũgarásawa Disiunariu muakaresawa Unicode muakaresawa retewa Tekô eurupawara muakarésawa supé - Xinanheẽga iwasuĩma muakarewa - GB2312 Terefuni sesewara muakaresawa Yupurawakasawa terefuniara mukaresawa Pin-yin mukaresawa @@ -2830,9 +2828,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Pinõ Pẽi - - Ẽdeburi - Kumure-ita @@ -3455,9 +3450,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Afirikia Usidẽtawara Hurariyu - Afirika Usidẽtawara Hurariyu Retewa - Afirika Usidẽtawara Kurasí Ara Hurariyu + Afirikia Usidẽtawara Hurariyu @@ -3850,6 +3843,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Giyana Hurariyu + + + Hawaí asuí Kapuã-ita Areuta-ita Hurariyu Retewa + + Hawaí asuí Kapuã-ita Areuta-ita Hurariyu @@ -6089,7 +6087,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} mirimol irerú-pukú rupi {0} mirimol-ita irerú-pukú rupi - + pisawera-ita miliãu rupi {0} pisawera miliãu rupi {0} pisawera-ita miliãu rupi @@ -6884,7 +6882,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mirimol/ritru {0} mmol/l - + pisawera miliãu rupi diff --git a/make/data/cldr/common/main/yrl_CO.xml b/make/data/cldr/common/main/yrl_CO.xml index a8607444c93..c120bce318e 100644 --- a/make/data/cldr/common/main/yrl_CO.xml +++ b/make/data/cldr/common/main/yrl_CO.xml @@ -59,8 +59,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kuatiasawasupí pañé-yara - Xinañẽẽga rikusawarupí muakaresawa - Big5 - Xinañeẽga iwasuĩma muakarewa - GB2312 Sikaisá purusawa pañérupí Reyupurawaka letera básika ñũtú @@ -239,7 +237,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milla kuadaradu-ita {0} milla kuadaradu rupi - + pisawera-ita millón rupi {0} pisawera millón rupi {0} pisawera-ita millón rupi @@ -284,7 +282,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milla-itá² - + pisawera millón rupi diff --git a/make/data/cldr/common/main/yrl_VE.xml b/make/data/cldr/common/main/yrl_VE.xml index d6663f73a9b..79276b33a6a 100644 --- a/make/data/cldr/common/main/yrl_VE.xml +++ b/make/data/cldr/common/main/yrl_VE.xml @@ -59,8 +59,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ kuatiasawasupí pañé-yara - Xinañẽẽga rikusawarupí muakaresawa - Big5 - Xinañeẽga iwasuĩma muakarewa - GB2312 Sikaisá purusawa pañérupí Reyupurawaka letera básika ñũtú @@ -239,7 +237,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} milla kuadaradu-ita {0} milla kuadaradu rupi - + pisawera-ita millón rupi {0} pisawera millón rupi {0} pisawera-ita millón rupi @@ -284,7 +282,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ milla-itá² - + pisawera millón rupi diff --git a/make/data/cldr/common/main/yue.xml b/make/data/cldr/common/main/yue.xml index 30024be998e..3615cb547d8 100644 --- a/make/data/cldr/common/main/yue.xml +++ b/make/data/cldr/common/main/yue.xml @@ -317,7 +317,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 尚巴拉文 巴菲亞文 科隆文 - 庫爾德文 + 庫德文 + 庫德文 + 北庫德文 庫密克文 庫特奈文 科米文 @@ -919,6 +921,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 中國 哥倫比亞 克里派頓島 + 薩克 哥斯大黎加 古巴 維德角 @@ -1215,35 +1218,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic 數字排序 排序強度 貨幣 + Emoji 顯示方式 時間週期(12 小時制與 24 小時制) 換行樣式 + 單字強制換行 度量單位系統 數字 + 縮寫後斷句 時區 區域變異 專用區 佛曆 + 佛曆 農曆 + 農曆 科普特曆 + 科普特曆 檀紀曆 - 衣索比亞曆 - 衣索比亞曆 (Amete Alem) + 檀紀曆 + 埃塞俄比亞曆 + 埃塞俄比亞曆 + 埃塞俄比亞阿美德阿萊姆曆 + 埃塞俄比亞阿美德阿萊姆 公曆 + 公曆 希伯來曆 + 希伯來曆 印度國曆 伊斯蘭曆 - 伊斯蘭民用曆 + 伊斯蘭曆 + 伊斯蘭民用曆 (表格式) + 伊斯蘭民用曆 (表格式) 伊斯蘭新月曆 伊斯蘭天文曆 伊斯蘭曆 (烏姆庫拉) - 國際標準 ISO 8601 + 伊斯蘭曆 (烏姆庫拉) + 公曆 (元年) 日本曆 + 日本曆 波斯曆 + 波斯曆 民國曆 + 民國曆 會計貨幣格式 + 會計 標準貨幣格式 + 標準 排序符號 略過符號排序 正常排序重音 @@ -1253,17 +1275,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic 優先排序大寫 不分大小寫排序 依大小寫排序 - 繁體中文排序 - Big5 字典排序 預設 Unicode 排序 + 預設 Unicode 歐洲排序規則 - 簡體中文排序 - GB2312 電話簿排序 發音排序 拼音排序 一般用途搜尋 + 搜尋 韓文子音排序 標準排序 + 標準 筆畫排序 傳統排序 部首筆畫排序 @@ -1280,18 +1303,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic 全形 半形 數值 + 預設 + Emoji + 文字 12 小時制 (0–11) + 12 (0–11) 12 小時制 (1–12) + 12 (1–12) 24 小時制 (0–23) + 24 (0–23) 24 小時制 (1–24) + 24 (1–24) 寬鬆換行樣式 + 寬鬆 一般換行樣式 + 一般 強制換行樣式 + 強制 + 任意換行 + 全部保留 + 一般 + 唔拆開詞組 美國地名委員會 聯合國地名專家組 公制 + 公制 英制度量單位系統 + 英制 美制度量單位系統 + 美制 阿拉伯-印度數字 阿拉伯-印度擴充數字 亞美尼亞數字 @@ -1353,6 +1393,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 西藏數字 傳統數字 瓦伊文數字 + + 公制 @@ -1964,6 +2006,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -1972,30 +2017,47 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + {1} {0} + + {1}{0} + Bh時 Bh:mm Bh:mm:ss d日 + EBh點 + EBh:mm + EBh:mm:ss d E - ah:mmE - ah:mm:ssE + Eah點 + Eah:mm + EHH:mm + Eah:mm:ss + EHH:mm:ss G y年 + G M/y + G d/M/y + G d/M/y (E) G y年M月 G y年M月d日 G y年M月d日 E - ah時 - H時 + ah點 + H點 ah:mm H:mm ah:mm:ss H:mm:ss + ah 點 (v) + HH點 (v) M月 M/d M/d(E) @@ -2220,8 +2282,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 午夜 - 上午 - 下午 + 上晝 + 下晝 清晨 朝早 中午 @@ -2229,6 +2291,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic 夜晚 凌晨 + + 上晝 + 下晝 + + + 上晝 + 下晝 + + + + + 上晝 + 下晝 + + + 上晝 + 下晝 + @@ -2299,6 +2379,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -2307,6 +2390,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -2315,34 +2401,47 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + {1} {0} + + {1}{0} + - Bh時 + Bh點 Bh:mm Bh:mm:ss d日 + EBh點 E Bh:mm E Bh:mm:ss d E + Eah 點 E ah:mm E ah:mm:ss Gy年 + GM/y + Gd/M/y + Gd/M/y (E) Gy年M月 Gy年M月d日 Gy年M月d日 E ah時 - H時 + H點 ah:mm ah:mm:ss ah:mm:ss [v] HH:mm:ss [v] ah:mm [v] HH:mm [v] + ah點 (v) + HH點 (v) M月 M/d M/d(E) @@ -3605,6 +3704,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 復活島 + + 科伊艾克 + 蓬塔阿雷納斯 @@ -3870,9 +3972,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 金邊 - 恩得伯理島 - - 坎頓 @@ -4549,9 +4648,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 西非時間 - 西非標準時間 - 西非夏令時間 + 西非時間 @@ -4939,6 +5036,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 蓋亞那時間 + + + 夏威夷-阿留申標準時間 + + 夏威夷-阿留申時間 @@ -5508,7 +5610,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5519,17 +5620,29 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤0千 + ¤ 0千 ¤0萬 + ¤ 0萬 ¤00萬 + ¤ 00萬 ¤000萬 + ¤ 000萬 ¤0000萬 + ¤ 0000萬 ¤0億 + ¤ 0億 ¤00億 + ¤ 00億 ¤000億 + ¤ 000億 ¤0000億 + ¤ 0000億 ¤0兆 + ¤ 0兆 ¤00兆 + ¤ 00兆 ¤000兆 + ¤ 000兆 {0} {1} @@ -6363,6 +6476,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 格瑞那達元 + + 加勒比盾 + 加勒比盾 + 特殊提款權 @@ -6443,6 +6560,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 辛巴威元 (1980–2008) + + 辛巴威金 + 辛巴威金 + 辛巴威元 (2009) @@ -6479,6 +6600,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每平方英吋 {0} + + 等份 + {0} 等份 + + + 葡萄糖 + {0} 葡萄糖 + {0} 個世紀 @@ -6557,6 +6686,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}格令 + + 水銀柱 + {0} 水銀柱 + 每平方吋 {0} 磅 @@ -6584,6 +6717,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每公升 {0} + + 公制液量安士 + {0} 公制液量安士 + 每加侖 {0} @@ -6593,19 +6730,62 @@ CLDR data files are interpreted according to the LDML specification (http://unic 英制甜品匙{0}匙 - - 光速 - {0} 光速 + + 球面度 + {0} 球面度 - + + 開特 + {0} 開特 + + + 庫侖 + {0} 庫侖 + + + 法拉 + {0} 法拉 + + + 亨利 + {0} 亨利 + + + 西門子 + {0} 西門子 + + + 國際蒸汽表卡路里 + {0} 國際蒸汽表卡路里 + + + 貝克勒爾 + {0} 貝克勒爾 + + + 希沃特 + {0} 希沃特 + + + 戈瑞 + {0} 戈瑞 + + + 公斤力 + {0} 公斤力 + + + 特斯拉 + {0} 特斯拉 + + + 韋伯 + {0} 韋伯 + + 十億分點濃度 {0} 十億分點濃度 - - - {0} 晚 - {0}/晚 - @@ -6801,7 +6981,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 項 - + + 等份 + {0} 等份 + + 百萬分率 {0} 百萬分率 @@ -6813,6 +6997,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 摩爾 {0} 摩爾 + + 葡萄糖 + {0} 葡萄糖 + 公升/公里 {0} 公升/公里 @@ -7194,6 +7382,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 毫米汞柱 {0} 毫米汞柱 + + {0} Hg + 磅力/平方英吋 每平方吋{0}磅 @@ -7327,6 +7518,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 公制量杯 {0} 公制杯 + + 公制液量安士 + {0} 公制液量安士 + 英畝英呎 {0} 英畝英呎 @@ -7405,11 +7600,63 @@ CLDR data files are interpreted according to the LDML specification (http://unic 英制夸脫 {0} 英制夸脫 + + 球面度 + {0} 球面度 + + + 開特 + {0} 開特 + + + + {0} 庫 + + + + {0} 法 + + + + {0} 亨 + + + 西 + {0} 西 + + + 國際蒸汽表卡 + {0} 國際蒸汽表卡 + + + 貝克 + {0} 貝克 + + + + {0} 希 + + + + {0} 戈 + + + 公斤力 + {0} 公斤力 + + + + {0} 特 + + + + {0} 韋 + 光速 {0} 光速 - + 濃度/十億 @@ -7426,6 +7673,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + 等份 + {0} 等份 + + + 葡萄糖 + {0} 葡萄糖 + B {0}B @@ -7462,6 +7717,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每安士 {0} + + {0} Hg + 每平方吋 {0} 磅 @@ -7477,17 +7735,70 @@ CLDR data files are interpreted according to the LDML specification (http://unic °C + + 公制液量安士 + {0} 公制液量安士 + + + 球面度 + {0} 球面度 + + + 開特 + {0} 開特 + + + + {0} 庫 + + + + {0} 法 + + + + {0} 亨 + + + 西 + {0} 西 + + + 卡路里-IT + {0} 卡路里-IT + + + 貝克 + {0} 貝克 + + + + {0} 希 + + + + {0} 戈 + + + 公斤力 + {0} 公斤力 + + + + {0} 特 + + + + {0} 韋 + - 光速 {0}光速 - + {0}ppb - {0}晚 - {0}/晚 diff --git a/make/data/cldr/common/main/yue_Hans.xml b/make/data/cldr/common/main/yue_Hans.xml index b7c29be1597..75da3270126 100644 --- a/make/data/cldr/common/main/yue_Hans.xml +++ b/make/data/cldr/common/main/yue_Hans.xml @@ -147,7 +147,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 达尔格瓦文 台塔文 德文 - 高地德文(瑞士) + 高地德文 (瑞士) 德拉瓦文 斯拉夫 多格里布文 @@ -210,7 +210,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 苏格兰盖尔文 吉兹文 吉尔伯特群岛文 - 加利西亚文 + 加里西亚文 吉拉基文 中古高地德文 瓜拉尼文 @@ -245,7 +245,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 海地文 匈牙利文 胡帕文 - 哈尔科梅勒姆文 + 哈尔魁梅林语 亚美尼亚文 赫雷罗文 国际文 @@ -261,7 +261,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 印古什文 伊多文 冰岛文 - 意大利文 + 义大利文 因纽特文 英格里亚文 日文 @@ -318,7 +318,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 尚巴拉文 巴菲亚文 科隆文 - 库尔德文 + 库德文 + 库德文 + 北库德文 库密克文 库特奈文 科米文 @@ -883,7 +885,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 澳洲 荷属阿鲁巴 奥兰群岛 - 亚塞拜然 + 阿塞拜疆 波斯尼亚同黑塞哥维那 巴贝多 孟加拉 @@ -917,9 +919,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 库克群岛 智利 喀麦隆 - 中华人民共和国 + 中国 哥伦比亚 克里派顿岛 + 萨克 哥斯大黎加 古巴 维德角 @@ -955,7 +958,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 加彭 英国 格瑞那达 - 乔治亚共和国 + 格鲁吉亚 法属圭亚那 根西岛 迦纳 @@ -971,7 +974,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 关岛 几内亚比索 盖亚那 - 中华人民共和国香港特别行政区 + 中国香港特别行政区 香港 赫德岛同麦克唐纳群岛 宏都拉斯 @@ -989,7 +992,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 伊拉克 伊朗 冰岛 - 义大利 + 意大利 泽西岛 牙买加 约旦 @@ -1005,7 +1008,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 科威特 开曼群岛 哈萨克 - 寮国 + 老挝 黎巴嫩 圣露西亚 列支敦斯登 @@ -1023,11 +1026,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 法属圣马丁 马达加斯加 马绍尔群岛 - 马其顿 + 北马其顿 马利 缅甸 蒙古 - 中华人民共和国澳门特别行政区 + 中国澳门特别行政区 澳门 北马里亚纳群岛 马丁尼克岛 @@ -1051,7 +1054,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 尼泊尔 诺鲁 纽埃岛 - 纽西兰 + 新西兰 阿曼王国 巴拿马 秘鲁 @@ -1075,7 +1078,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 塞尔维亚 俄罗斯 卢安达 - 沙乌地阿拉伯 + 沙特阿拉伯 索罗门群岛 塞席尔 苏丹 @@ -1133,7 +1136,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 伪口音 伪 Bidi 科索沃 - 叶门 + 也门 马约特 南非 尚比亚 @@ -1216,35 +1219,54 @@ CLDR data files are interpreted according to the LDML specification (http://unic 数字排序 排序强度 货币 + Emoji 显示方式 时间周期(12 小时制与 24 小时制) 换行样式 + 单字强制换行 度量单位系统 数字 + 缩写后断句 时区 区域变异 专用区 佛历 + 佛历 农历 + 农历 科普特历 + 科普特历 檀纪历 - 衣索比亚历 - 衣索比亚历 (Amete Alem) + 檀纪历 + 埃塞俄比亚历 + 埃塞俄比亚历 + 埃塞俄比亚阿美德阿莱姆历 + 埃塞俄比亚阿美德阿莱姆 公历 + 公历 希伯来历 + 希伯来历 印度国历 伊斯兰历 - 伊斯兰民用历 + 伊斯兰历 + 伊斯兰民用历 (表格式) + 伊斯兰民用历 (表格式) 伊斯兰新月历 伊斯兰天文历 - 乌姆库拉历 - 国际标准 ISO 8601 + 伊斯兰历 (乌姆库拉) + 伊斯兰历 (乌姆库拉) + 公历 (元年) 日本历 + 日本历 波斯历 + 波斯历 民国历 + 民国历 会计货币格式 + 会计 标准货币格式 + 标准 排序符号 略过符号排序 正常排序重音 @@ -1254,17 +1276,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic 优先排序大写 不分大小写排序 依大小写排序 - 繁体中文排序 - Big5 字典排序 预设 Unicode 排序 + 预设 Unicode 欧洲排序规则 - 简体中文排序 - GB2312 电话簿排序 发音排序 拼音排序 一般用途搜寻 + 搜寻 韩文子音排序 标准排序 + 标准 笔画排序 传统排序 部首笔画排序 @@ -1281,18 +1304,35 @@ CLDR data files are interpreted according to the LDML specification (http://unic 全形 半形 数值 + 预设 + Emoji + 文字 12 小时制 (0–11) + 12 (0–11) 12 小时制 (1–12) + 12 (1–12) 24 小时制 (0–23) + 24 (0–23) 24 小时制 (1–24) + 24 (1–24) 宽松换行样式 + 宽松 一般换行样式 + 一般 强制换行样式 + 强制 + 任意换行 + 全部保留 + 一般 + 唔拆开词组 美国地名委员会 联合国地名专家组 公制 + 公制 英制度量单位系统 + 英制 美制度量单位系统 + 美制 阿拉伯-印度数字 阿拉伯-印度扩充数字 亚美尼亚数字 @@ -1354,6 +1394,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 西藏数字 传统数字 瓦伊文数字 + + 公制 @@ -1372,11 +1414,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] [\- ‑ , . % ‰ + 0 1 2 3 4 5 6 7 8 9 〇 一 七 三 九 二 五 八 六 四] [﹉﹊﹋﹌ __﹍﹎﹏︳︴ \--﹣ ‐‑ – —︱ ― ,,﹐ 、﹑ ;;﹔ \::﹕ !!﹗ ??﹖ ..﹒ ‥︰ … 。 · '‘’ ""“”〝〞 ((﹙︵ ))﹚︶ \[[ \]] \{{﹛︷ \}}﹜︸ 〈︿ 〉﹀ 《︽ 》︾ 「﹁ 」﹂ 『﹃ 』﹄ 【︻ 】︼ 〔﹝︹ 〕﹞︺ 〖 〗 ‖ § @@﹫ **﹡ // \\\﹨ \&&﹠ ##﹟ %%﹪ ‰ ′ ″ ‵ 〃 ※] - {0}… - …{0} - {0}…{1} + + + + + + @@ -1389,43 +1434,41 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gy年M月d日EEEE - GyMMMEEEEd Gy年M月d日 - GyMMMd Gy年M月d日 - GyMMMd - Gy-M-d + Gy/M/d d日(E) + Gy年 Gy年M月 Gy年M月d日 Gy年M月d日E - M月 - M-d - M-dE - LLL - Gy-M - Gy-M-d - Gy-M-d(E) + M月d日E + Gy年 + Gy年 + Gy/M + Gy/M/d + Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日E + Gy年M月 Gy年QQQ Gy年QQQQ @@ -1620,14 +1663,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic - rU年MMMdEEEE - rMMMEEEEd + U (r) 年MMMdEEEE + UMMMEEEEd - rU年MMMd - rMMMd + U (r) 年MMMd + UMMMd @@ -1651,8 +1694,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic r年MMMd rU年MMMdE MMM - M-d - M-dE + M/d + M/dE MMMd日 MMMd日E MMMMd日 @@ -1674,13 +1717,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic rU年QQQQ - {0}–{1} + {0}至{1} d日至d日 - ah至ah时 - ah至h时 + ah时至ah时 + ah时至h时 ah:mm至ah:mm @@ -1688,28 +1731,31 @@ CLDR data files are interpreted according to the LDML specification (http://unic ah:mm至h:mm - vah:mm至ah:mm - vah:mm至h:mm - vah:mm至h:mm + ah:mm至ah:mm [v] + ah:mm至h:mm [v] + ah:mm至h:mm [v] - HH:mm至HH:mm v - HH:mm至HH:mm v + HH:mm–HH:mm [v] + HH:mm–HH:mm [v] - vah至ah时 - vah至h时 + ah时至ah时 [v] + ah时至h时 [v] + + + HH–HH [v] - L至L + MMM至MMM - M-d至M-d - M-d至M-d + M/d至M/d + M/d至M/d - M-dE至M-dE - M-dE至M-dE + M/dE至M/dE + M/dE至M/dE LLL至LLL @@ -1729,18 +1775,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic rU至rU - r-M至r-M - r-M至r-M + r/M至r/M + r/M至r/M - r-M-d至r-M-d - r-M-d至r-M-d - r-M-d至r-M-d + r/M/d至r/M/d + r/M/d至r/M/d + r/M/d至r/M/d - r-M-dE至r-M-dE - r-M-dE至r-M-dE - r-M-dE至r-M-dE + r/M/dE至r/M/dE + r/M/dE至r/M/dE + r/M/dE至r/M/dE rU年MMM至MMM @@ -1879,13 +1925,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic U年MMMd日EEEE - UMMMEEEEd U年MMMd日 - UMMMd @@ -1927,25 +1971,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Gy年MM月d日EEEE + G y年M月d日 EEEE GyMMMEEEEd - Gy年MM月d日 + G y年M月d日 GyMMMd - Gy年MM月d日 + G y年M月d日 GyMMMd - Gy/M/d + G y/M/d GyMd @@ -1953,7 +1997,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1}{0} @@ -1963,6 +2007,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -1971,48 +2018,67 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + {1} {0} + + {1}{0} + Bh时 Bh:mm Bh:mm:ss d日 - d日E - ah:mmE - ah:mm:ssE - Gy年 - Gy年MM月 - Gy年MM月d日 - Gy年MM月d日E - ah时 - H时 + EBh点 + EBh:mm + EBh:mm:ss + d E + Eah点 + Eah:mm + EHH:mm + Eah:mm:ss + EHH:mm:ss + G y年 + G M/y + G d/M/y + G d/M/y (E) + G y年M月 + G y年M月d日 + G y年M月d日 E + ah点 + H点 ah:mm + H:mm ah:mm:ss + H:mm:ss + ah 点 (v) + HH点 (v) + M月 M/d - M/dE - LL + M/d(E) M月d日 - M月d日E + M月d日 E M月d日 - Gy年 - Gy年 - Gy年M月 + G y年 + G y年 + G y/M G y/M/d - G y/M/dE - Gy年MM月 - Gy年MM月d日 - Gy年MM月d日E - Gy年M月 - Gy年第Q季度 - Gy年第Q季度 + G y/M/d(E) + G y年M月 + G y年M月d日 + G y年M月d日 E + G y年M月 + G y年QQQ + G y年QQQQ - {0} – {1} + {0}至{1} Bh时至Bh时 Bh至h时 @@ -2023,7 +2089,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bh:mm至h:mm - d至d日 + d日至d日 G y年至G y年 @@ -2073,31 +2139,34 @@ CLDR data files are interpreted according to the LDML specification (http://unic ah:mm至h:mm - vah:mm至ah:mm - vah:mm至h:mm - vah:mm至h:mm + ah:mm至ah:mm [v] + ah:mm至h:mm [v] + ah:mm至h:mm [v] - v HH:mm – HH:mm - v HH:mm – HH:mm + HH:mm–HH:mm [v] + HH:mm–HH:mm [v] - vah时至ah时 - vah时至h时 + ah时至ah时 [v] + ah时至h时 [v] + + + HH–HH [v] - M–M月 + M月至M月 - M/d – M/d - M/d – M/d + M/d至M/d + M/d至M/d - M/dE至M/dE - M/dE至M/dE + d/M (E) 至 d/M (E) + d/M (E) 至 d/M (E) - MMM – MMM + LLL至LLL M月d日至d日 @@ -2111,39 +2180,39 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLLL至LLLL - Gy–y年 + G y至y - Gy年M月至M月 - Gy年M月至y年M月 + G y/M至y/M + G y/M至y/M - Gy/M/d – y/M/d - Gy/M/d – y/M/d - Gy/M/d – y/M/d + G y/M/d至y/M/d + G y/M/d至y/M/d + G y/M/d至y/M/d - Gy/M/dE至y/M/dE - Gy/M/dE至y/M/dE - Gy/M/dE至y/M/dE + G y/M/dE至y/M/dE + G y/M/dE至y/M/dE + G y/M/dE至y/M/dE - Gy年M月至M月 - Gy年M月至y年M月 + G y年M月至M月 + G y年M月至y年M月 - Gy年M月d日至d日 - Gy年M月d日至M月d日 - Gy年M月d日至y年M月d日 + G y年M月d日至d日 + G y年M月d日至M月d日 + G y年M月d日至y年M月d日 - Gy年M月d日E至d日E - Gy年M月d日E至M月d日E - Gy年M月d日E至y年M月d日E + G y年M月d日E至d日E + G y年M月d日E至M月d日E + G y年M月d日E至y年M月d日E - Gy年M月至M月 - Gy年M月至y年M月 + G y年M月至M月 + G y年M月至y年M月 @@ -2151,7 +2220,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + 1月 2月 3月 @@ -2165,32 +2234,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic 11月 12月 - - 一月 - 二月 - 三月 - 四月 - 五月 - 六月 - 七月 - 八月 - 九月 - 十月 - 十一月 - 十二月 - - - 周日 - 周一 - 周二 - 周三 - 周四 - 周五 - 周六 + + + + + + + + 星期日 @@ -2228,8 +2283,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 午夜 - 上午 - 下午 + 上昼 + 下昼 清晨 朝早 中午 @@ -2237,6 +2292,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic 夜晚 凌晨 + + 上昼 + 下昼 + + + 上昼 + 下昼 + + + + + 上昼 + 下昼 + + + 上昼 + 下昼 + @@ -2250,7 +2323,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - y年M月d日EEEE + y年M月d日 EEEE yMMMEEEEd @@ -2276,22 +2349,26 @@ CLDR data files are interpreted according to the LDML specification (http://unic - zzzz HH:mm:ss + HH:mm:ss [zzzz] + HHmmssz - z HH:mm:ss + HH:mm:ss [z] + HHmmssz HH:mm:ss + HHmmss HH:mm + HHmm @@ -2303,6 +2380,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -2311,6 +2391,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + @@ -2319,62 +2402,70 @@ CLDR data files are interpreted according to the LDML specification (http://unic {1}{0} + + {1}{0} + {1} {0} + + {1}{0} + - Bh时 + Bh点 Bh:mm Bh:mm:ss d日 + EBh点 E Bh:mm E Bh:mm:ss - d日E - Eah:mm - EHH:mm - Eah:mm:ss - EHH:mm:ss + d E + Eah 点 + E ah:mm + E ah:mm:ss Gy年 + GM/y + Gd/M/y + Gd/M/y (E) Gy年M月 Gy年M月d日 - Gy年M月d日E + Gy年M月d日 E ah时 - H时 + H点 ah:mm ah:mm:ss - v ah:mm:ss - v HH:mm:ss - v ah:mm - v HH:mm + ah:mm:ss [v] + HH:mm:ss [v] + ah:mm [v] + HH:mm [v] + ah点 (v) + HH点 (v) M月 M/d - M/dE + M/d(E) MM/dd M月d日 - M月d日E + M月d日 E M月d日 M月第W个星期 y年 - y年M月 + y/M y/M/d - y/M/dE - y年M月 + y/M/d(E) + y/MM y年M月 y年M月d日 - y年M月d日E + y年M月d日 E y年M月 y年QQQ y年QQQQ Y年第w个星期 - - {1}{0} - - {0} – {1} + {0}至{1} Bh时至Bh时 Bh至h时 @@ -2385,7 +2476,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic Bh:mm至h:mm - d–d日 + d日至d日 Gy年至Gy年 @@ -2434,35 +2525,38 @@ CLDR data files are interpreted according to the LDML specification (http://unic ah:mm至h:mm ah:mm至h:mm + + HH:mm至HH:mm + - vah:mm至ah:mm - vah:mm至h:mm - vah:mm至h:mm + ah:mm至ah:mm [v] + ah:mm至h:mm [v] + ah:mm至h:mm [v] - v HH:mm–HH:mm - v HH:mm–HH:mm + HH:mm–HH:mm [v] + HH:mm–HH:mm [v] - vah时至ah时 - vah时至h时 + ah时至ah时 [v] + ah时至h时 [v] - v HH–HH + HH–HH [v] - M–M月 + M月至M月 - M/d – M/d - M/d – M/d + M/d至M/d + M/d至M/d - M/dE至M/dE - M/dE至M/dE + d/M (E) 至 d/M (E) + d/M (E) 至 d/M (E) - MMM – MMM + LLL至LLL M月d日至d日 @@ -2476,21 +2570,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic LLLL至LLLL - y–y年 + y至y - y年M月至M月 - y年M月至y年M月 + y/M至y/M + y/M至y/M - y/M/d – y/M/d - y/M/d – y/M/d - y/M/d – y/M/d + y/M/d至y/M/d + y/M/d至y/M/d + y/M/d至y/M/d - y/M/dE至y/M/dE - y/M/dE至y/M/dE - y/M/dE至y/M/dE + d/M/y (E) 至 d/M/y (E) + d/M/y (E) 至 d/M/y (E) + d/M/y (E) 至 d/M/y (E) y年M月至M月 @@ -2543,24 +2637,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gy年M月d日EEEE - GyMMMEEEEd Gy年M月d日 - GyMMMd Gy年M月d日 - GyMMMd - Gy-M-d + Gy/M/d @@ -2632,19 +2723,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gy年M月d日EEEE - GyMMMEEEEd Gy年M月d日 - GyMMMd Gy年M月d日 - GyMMMd @@ -2656,19 +2744,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic d日(E) + Gy年 Gy年M月 Gy年M月d日 Gy年M月d日E - M月 - M-d - M-dE - LLL + M月d日E + Gy年 + Gy年 Gy/M Gy/M/d Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日E + Gy年M月 Gy年QQQ Gy年QQQQ @@ -2920,25 +3009,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic Gy年M月d日EEEE - GyMMMEEEEd Gy年M月d日 - GyMMMd Gy年M月d日 - GyMMMd - Gyy-MM-dd - GyyMMdd + Gy/M/d @@ -2964,19 +3049,25 @@ CLDR data files are interpreted according to the LDML specification (http://unic + d日(E) + Gy年 Gy年M月 Gy年M月d日 Gy年M月d日E - M月 - M-d - M-dE - LLL - Gy-MM - Gy-MM-dd - Gy-M-d(E) + HH:mm + HH:mm:ss + MMM d + M月d日E + MMMM d + Gy年 + Gy年 + Gy/M + Gy/M/d + Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日E + Gy年M月 Gy年QQQ Gy年QQQQ @@ -3017,41 +3108,42 @@ CLDR data files are interpreted according to the LDML specification (http://unic - Gy年M月d日EEEE - GyMMMEEEEd + Gy年M月d日 EEEE Gy年M月d日 - GyMMMd Gy年M月d日 - GyMMMd - Gyy/M/d - GyyMd + Gy/M/d + d日(E) + Gy年 Gy年M月 Gy年M月d日 Gy年M月d日E - M月 - LLL + M月d日E + Gy年 + Gy年 + Gy/M Gy/M/d - Gy/M/dE + Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日E + Gy年M月 Gy年QQQ Gy年QQQQ @@ -3258,6 +3350,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}时间 + {0}夏令时间 + {0}标准时间 檀香山 @@ -3611,6 +3705,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 复活岛 + + 科伊艾克 + 蓬塔阿雷纳斯 @@ -3876,9 +3973,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 金边 - 恩得伯理岛 - - 坎顿 @@ -4555,9 +4649,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 西非时间 - 西非标准时间 - 西非夏令时间 + 西非时间 @@ -4945,6 +5037,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 盖亚那时间 + + + 夏威夷-阿留申标准时间 + + 夏威夷-阿留申时间 @@ -5486,8 +5583,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic hanidec - hans - hansfin + hant + hantfin 非数值 @@ -5495,7 +5592,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0 + 0千 0万 00万 000万 @@ -5514,7 +5611,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5524,18 +5620,30 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 0 + ¤0千 + ¤ 0千 ¤0万 + ¤ 0万 ¤00万 + ¤ 00万 ¤000万 + ¤ 000万 ¤0000万 + ¤ 0000万 ¤0亿 + ¤ 0亿 ¤00亿 + ¤ 00亿 ¤000亿 + ¤ 000亿 ¤0000亿 + ¤ 0000亿 ¤0兆 + ¤ 0兆 ¤00兆 + ¤ 00兆 ¤000兆 + ¤ 000兆 {0} {1} @@ -5743,7 +5851,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 人民币 - 哥伦比亚披索 @@ -5939,6 +6046,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 日圆 + ¥ 肯尼亚先令 @@ -6328,7 +6436,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 委内瑞拉玻利瓦 (1871–2008) - 委内瑞拉玻利瓦 (2008–2018) + 委内瑞拉玻利瓦 (VEF) 委内瑞拉玻利瓦 @@ -6369,6 +6477,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 格瑞那达元 + + 加勒比盾 + 加勒比盾 + 特殊提款权 @@ -6449,6 +6561,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 辛巴威元 (1980–2008) + + 辛巴威金 + 辛巴威金 + 辛巴威元 (2009) @@ -6470,10 +6586,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每 {1} {0} - - 每平方秒公尺 - 每平方秒 {0} 米 - 每平方公里 {0} @@ -6487,19 +6599,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每平方英里 {0} - 每平方吋 {0} + 每平方英寸 {0} - - 每公里公升 - 每公里 {0} 公升 + + 等份 + {0} 等份 - - 每 100 公里公升 - 每 100 公里 {0} 公升 - - - 每加仑英里 - 每加仑 {0} 英里 + + 葡萄糖 + {0} 葡萄糖 {0} 个世纪 @@ -6514,10 +6622,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每月 {0} - 每星期 {0} + 每周 {0} - 每日 {0} + 每天 {0} 每小时 {0} @@ -6531,25 +6639,24 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 伏特 - - 千卡路里 - {0} 千卡路里 - - - {0} 卡路里 - - - 卡路里 - {0} 千焦耳 - - {0} 焦耳 - 字体 em + + 每吋像素 + {0} 像素/吋 + + + 每厘米点数 + {0} 点/厘米 + + + 每吋点数 + {0} 点/吋 + 每公里 {0} @@ -6560,18 +6667,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每厘米 {0} - {0} 英尺 - 每呎 {0} + 每英呎 {0} - {0} 英寸 - 每吋 {0} - - - 天文单位 - - - 英寻 + 每英寸 {0} 每公斤 {0} @@ -6579,9 +6678,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每克 {0} - - 英石 - 每磅 {0} @@ -6591,53 +6687,28 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}格令 - - 百万瓦特 - {0} 百万瓦特 - - - 千瓦特 - {0} 千瓦特 - - - {0} 瓦特 - - - 毫瓦特 - {0} 毫瓦特 - - - 马力 - {0} 匹马力 + + 水银柱 + {0} 水银柱 - 每平方英寸磅力 每平方吋 {0} 磅 - 每小时公里 每小时 {0} 公里 - 每秒公尺 每秒 {0} 米 - 每小时英里 每小时 {0} 英里 - 摄氏度数 摄氏 {0} 度 - 华氏度数 华氏 {0} 度 - - 克耳文 - {0} 克耳文 - 每立方米 {0} @@ -6645,11 +6716,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每立方厘米 {0} - {0} 公升 每公升 {0} - - 蒲式耳 + + 公制液量安士 + {0} 公制液量安士 每加仑 {0} @@ -6660,19 +6731,62 @@ CLDR data files are interpreted according to the LDML specification (http://unic 英制甜品匙{0}匙 - - 光速 - {0} 光速 + + 球面度 + {0} 球面度 - + + 开特 + {0} 开特 + + + 库仑 + {0} 库仑 + + + 法拉 + {0} 法拉 + + + 亨利 + {0} 亨利 + + + 西门子 + {0} 西门子 + + + 国际蒸汽表卡路里 + {0} 国际蒸汽表卡路里 + + + 贝克勒尔 + {0} 贝克勒尔 + + + 希沃特 + {0} 希沃特 + + + 戈瑞 + {0} 戈瑞 + + + 公斤力 + {0} 公斤力 + + + 特斯拉 + {0} 特斯拉 + + + 韦伯 + {0} 韦伯 + + 十亿分点浓度 {0} 十亿分点浓度 - - - {0} 晚 - {0}/晚 - @@ -6784,11 +6898,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} G 力 - 公尺/平方秒 - 每平方秒{0}米 + 米/平方秒 + 每平方秒 {0} 米 - 圈数 + {0} 圈 @@ -6817,13 +6931,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 公顷 - 平方公尺 - {0} 平方公尺 + 平方米 + {0} 平方米 每平方米{0} - 平方公分 - {0} 平方公分 + 平方厘米 + {0} 平方厘米 每平方厘米{0} @@ -6840,13 +6954,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 平方码 - 平方英尺 - {0} 平方英尺 + 平方英呎 + {0} 平方英呎 平方英寸 {0} 平方英寸 - 每平方吋{0} + 每平方英寸{0} 德南 @@ -6868,7 +6982,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 项 - + + 等份 + {0} 等份 + + 百万分率 {0} 百万分率 @@ -6880,17 +6998,21 @@ CLDR data files are interpreted according to the LDML specification (http://unic 摩尔 {0} 摩尔 + + 葡萄糖 + {0} 葡萄糖 + 公升/公里 - 每公里{0}公升 + {0} 公升/公里 - 升/100 公里 - 每100公里 {0} 升 + 公升/100 公里 + {0} 公升/100 公里 英里/加仑 - 每加仑{0}英里 + {0} 英里/加仑 英里/英制加仑 @@ -6927,7 +7049,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 天 - 每日{0} + 每天{0} 小时 @@ -6978,7 +7100,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 卡路里 - {0} 卡 + {0} 卡路里 大卡 @@ -6990,7 +7112,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 焦耳 - {0} 焦 + {0} 焦耳 千瓦小时 @@ -7048,17 +7170,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每厘米像素 {0} 像素/厘米 - - 每吋像素 - {0} 像素/吋 - - 每厘米点数 - {0} 点/厘米 + dpcm + {0} dpcm - 每吋点数 - {0} 点/吋 + dpi + {0} dpi 圆点 @@ -7074,8 +7192,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每公里{0} - 公尺 - {0} 公尺 + + {0} 米 每米{0} @@ -7083,13 +7201,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 公寸 - 公分 - {0} 公分 + 厘米 + {0} 厘米 每厘米{0} - 公厘 - {0} 公厘 + 毫米 + {0} 毫米 微米 @@ -7112,14 +7230,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 码 - 英尺 - {0} 呎 - 每呎{0} + 英呎 + {0} 英呎 + 每英呎{0} 英寸 - {0} 吋 - 每吋{0} + {0} 英寸 + 每英寸{0} 秒差距 @@ -7130,6 +7248,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 光年 + 天文单位 {0} 天文单位 @@ -7137,6 +7256,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 化朗 + 英寻 {0} 英寻 @@ -7198,6 +7318,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 英吨 + 英石 {0} 英石 @@ -7206,13 +7327,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每磅{0} - 盎司 - {0} 盎司 + 安士 + {0} 安士 每安士{0} - 金衡盎司 - {0} 金衡盎司 + 金衡安士 + {0} 金衡安士 克拉 @@ -7239,20 +7360,20 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 吉瓦 - 百万瓦 - {0} 百万瓦 + 百万瓦特 + {0} 百万瓦特 - 千瓦 - {0} 千瓦 + 千瓦特 + {0} 千瓦特 瓦特 - {0} 瓦 + {0} 瓦特 - 毫瓦 - {0} 毫瓦 + 毫瓦特 + {0} 毫瓦特 @@ -7262,6 +7383,9 @@ CLDR data files are interpreted according to the LDML specification (http://unic 毫米汞柱 {0} 毫米汞柱 + + {0} Hg + 磅力/平方英寸 每平方吋{0}磅 @@ -7299,7 +7423,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每小时{0}公里 - 公尺/秒 + 米/秒 每秒{0}米 @@ -7320,6 +7444,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 华氏 + + 克耳文 + {0} 克耳文 + 尺磅 {0} 尺磅 @@ -7333,13 +7461,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 立方公里 - 立方公尺 - {0} 立方公尺 + 立方米 + {0} 立方米 每立方米{0} - 立方公分 - {0} 立方公分 + 立方厘米 + {0} 立方厘米 每立方厘米{0} @@ -7351,8 +7479,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 立方码 - 立方英尺 - {0} 立方英尺 + 立方英呎 + {0} 立方英呎 立方英寸 @@ -7368,8 +7496,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 公升 - {0} 升 - 每升{0} + {0} 公升 + 每公升{0} 公合 @@ -7391,11 +7519,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic 公制量杯 {0} 公制杯 + + 公制液量安士 + {0} 公制液量安士 + - 英亩英尺 - {0} 英亩英尺 + 英亩英呎 + {0} 英亩英呎 + 蒲式耳 {0} 蒲式耳 @@ -7468,11 +7601,63 @@ CLDR data files are interpreted according to the LDML specification (http://unic 英制夸脱 {0} 英制夸脱 + + 球面度 + {0} 球面度 + + + 开特 + {0} 开特 + + + + {0} 库 + + + + {0} 法 + + + + {0} 亨 + + + 西 + {0} 西 + + + 国际蒸汽表卡 + {0} 国际蒸汽表卡 + + + 贝克 + {0} 贝克 + + + + {0} 希 + + + + {0} 戈 + + + 公斤力 + {0} 公斤力 + + + + {0} 特 + + + + {0} 韦 + 光速 {0} 光速 - + 浓度/十亿 @@ -7489,15 +7674,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic - - {0}m/s² + + 等份 + {0} 等份 - - 升/100公里 + + 葡萄糖 + {0} 葡萄糖 B - {0}byte + {0}B MP @@ -7507,53 +7694,112 @@ CLDR data files are interpreted according to the LDML specification (http://unic ppcm {0}ppcm + + {0}ppi + + + {0}dpcm + + + {0}dpi + 每英寸 {0} - - 英寻 - 每公斤 {0} 每克 {0} - - 英石 - 每磅 {0} 每安士 {0} + + {0} Hg + - {0}psi + 每平方吋 {0} 磅 - {0}公里/小时 + 每小时 {0} 公里 - {0}m/s + 每秒 {0} 米 - {0}英里/小时 + 每小时 {0} 英里 °C + + 公制液量安士 + {0} 公制液量安士 + + + 球面度 + {0} 球面度 + + + 开特 + {0} 开特 + + + + {0} 库 + + + + {0} 法 + + + + {0} 亨 + + + 西 + {0} 西 + + + 卡路里-IT + {0} 卡路里-IT + + + 贝克 + {0} 贝克 + + + + {0} 希 + + + + {0} 戈 + + + 公斤力 + {0} 公斤力 + + + + {0} 特 + + + + {0} 韦 + - 光速 {0}光速 - + {0}ppb - {0}晚 - {0}/晚 @@ -7673,7 +7919,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 标记/标准符号 小写变体 表情符号 - 表情符号与人 + 表情符号同人 南亚字体 东南亚字体 空位 @@ -7682,7 +7928,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic 技术符号 声调符号 旅游 - 旅游和地点 + 旅游同地点 向上箭咀 变化型 元音字母 @@ -7760,27 +8006,64 @@ CLDR data files are interpreted according to the LDML specification (http://unic + · {0} + + {title} {given} {given2} {surname} {generation},{credentials} + + + {given-informal} + {surname}{title} {given-informal} + + {given2-monogram-allCaps}{surname-monogram-allCaps}{given-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given} {credentials},{generation} {given2-initial} + + + {given-informal} + {surname}{title} {given-informal} + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + + + {given-initial} {given2-initial} {surname} + + + {given-informal} + {surname}{title} {given-informal} + + {surname-monogram-allCaps} + + + {given-informal-monogram-allCaps} + - {surname} {given} {credentials} {given2} + {surname} {given} {title},{generation} {given2} {credentials} {surname} {given-informal} @@ -7792,10 +8075,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal} - {surname-monogram-allCaps}{given-monogram-allCaps} + {surname-monogram-allCaps}{given-informal-monogram-allCaps} - {surname} {given} {credentials} {given2-initial} + {surname} {given} {credentials},{generation} {given2-initial} {surname} {given-informal} @@ -7807,13 +8090,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal} - {surname-monogram} + {surname-monogram-allCaps} - {given-informal-monogram} + {given-informal-monogram-allCaps} - {surname} {given} {given2-initial} + {surname} {given},{given2-initial} {surname} {given} @@ -7831,34 +8114,31 @@ CLDR data files are interpreted according to the LDML specification (http://unic {given-informal-monogram-allCaps} - {surname} {given} {credentials} {given2} + {surname-core} {given} {given2} {surname} {given-informal} - - {surname} {given} {credentials} {given2-initial} - {surname} {given-informal} - {surname} {given} {given2-initial} + {surname-core} {given-initial} {given2-initial} {surname} {given-informal} - 大文 + 文杰 - 大文 - + 雅婷 + - 大文 + 家豪 明德 - + 先生 @@ -7884,9 +8164,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic - 先生 - 大文 - 小二 + 教授 + 怡君 + 小君 + 达印 + + + ∅∅∅ 博士 diff --git a/make/data/cldr/common/main/zh.xml b/make/data/cldr/common/main/zh.xml index 533073cf9f7..6ab65938589 100644 --- a/make/data/cldr/common/main/zh.xml +++ b/make/data/cldr/common/main/zh.xml @@ -305,13 +305,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 巴菲亚语 科隆语 库尔德语 + 库尔德语 + 北库尔德语 库梅克语 库特奈语 科米语 康沃尔语 夸夸瓦拉语 库维语 - 柯尔克孜语 + 吉尔吉斯语 拉丁语 拉迪诺语 朗吉语 @@ -907,6 +909,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 中国 哥伦比亚 克利珀顿岛 + 萨克岛 哥斯达黎加 古巴 佛得角 @@ -1255,35 +1258,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 数字排序 排序强度 货币 + 表情符号表示法 小时制(12或24) - 换行符样式 + 中文、日文及韩语换行规则 + 词内换行规则 度量衡制 数字 + 在缩写后断句 时区 语言区域别名 专用 佛历 + 佛历 农历 + 农历 科普特历 + 科普特历 檀纪历 + 檀纪历 埃塞俄比亚历 + 埃塞俄比亚历 埃塞俄比亚阿米特阿莱姆日历 + 埃塞俄比亚阿米特阿莱姆日历 公历 + 公历 希伯来历 + 希伯来历 印度国定历 伊斯兰历 + 伊斯兰历 表格式伊斯兰历(民用纪元) + 表格式伊斯兰历(民用纪元) 沙特阿拉伯伊斯兰历 表格式伊斯兰历(天文纪元) + 表格式伊斯兰历(天文纪元) 伊斯兰历(乌姆库拉) + 伊斯兰历(乌姆库拉) 国际标准历法 和历 + 和历 波斯历 + 波斯历 民国纪年 + 民国纪年 会计货币格式 + 会计 标准货币格式 + 标准 对符号进行排序 忽略符号进行排序 对重音进行正常排序 @@ -1293,23 +1316,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 先对大写字母进行排序 不区分大小写进行排序 区分大小写进行排序 - 繁体中文排序 - Big5 基于兼容性沿用既往排序 + 兼容性 字典排序 - 默认 Unicode 排序 + 字典 + 默认Unicode排序 + 默认Unicode 表情符号排序 欧洲排序规则 - 简体中文排序 - GB2312 电话簿排序 + 电话簿 语音排序 + 语音 拼音排序 + 拼音 常规搜索 - 按韩文字开首辅音来搜索 + 搜索 + 按谚文初声辅音搜索 标准排序 + 标准 笔画排序 + 笔画 传统排序 + 传统 部首笔画排序 + 部首笔画 注音排序 + 注音 非规范化排序 对 Unicode 进行规范化排序 对数字进行单独排序 @@ -1322,18 +1355,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 全角 半角 数字 + 默认 + 表情符号 + 文字 12小时制(0–11) + 12 (0–11) 12小时制(1–12) + 12 (1–12) 24小时制(0–23) + 24 (0–23) 24小时制(1–24) - 宽松换行符样式 - 正常换行符样式 - 严格换行符样式 + 24 (1–24) + 宽松换行样式 + 宽松 + 正常换行样式 + 正常 + 严格换行样式 + 严格 + 允许断词换行 + 不允许断词换行 + 正常 + 保留短语 美国地名委员会 (BGN) 联合国地名专家组 (UNGEGN) 公制 + 公制 英制 + 英制 美制 + 美制 阿霍姆数字 阿拉伯-印度数字 扩展阿拉伯-印度数字 @@ -1418,6 +1468,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 瓦伊文数字 瓦郎奇蒂数字 万秋数字 + 关闭 + 开启 公制 @@ -1434,8 +1486,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [一 丁 七 万 丈 三 上 下 丌 不 与 丑 专 且 世 丘 丙 业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸 丹 为 主 丽 举 乃 久 么 义 之 乌 乍 乎 乏 乐 乔 乖 乘 乙 九 也 习 乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 亥 亦 产 亨 享 京 亮 亲 人 亿 什 仁 仅 仇 今 介 仍 从 仔 他 付 仙 代 令 以 仪 们 仰 仲 件 价 任 份 仿 企 伊 伍 伏 伐 休 众 优 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位 低 住 佐 佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦 侧 侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 儿 允 元 兄 充 兆 先 光 克 免 兑 兔 党 入 全 八 公 六 兮 兰 共 关 兴 兵 其 具 典 兹 养 兼 兽 内 冈 册 再 冒 写 军 农 冠 冬 冰 冲 决 况 冷 准 凌 减 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列 刘 则 刚 创 初 判 利 别 到 制 刷 券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝 办 功 加 务 劣 动 助 努 劫 励 劲 劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹 区 医 十 千 升 午 半 华 协 卒 卓 单 卖 南 博 占 卡 卢 卫 卯 印 危 即 却 卷 厂 厄 厅 历 厉 压 厌 厍 厚 原 去 县 参 又 叉 及 友 双 反 发 叔 取 受 变 叙 口 古 句 另 只 叫 召 叭 可 台 史 右 叶 号 司 叹 吃 各 合 吉 吊 同 名 后 吐 向 吓 吗 君 吝 吟 否 吧 含 听 启 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咧 咨 咪 咬 咯 咱 哀 品 哇 哈 哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 圳 场 圾 址 均 坎 坐 坑 块 坚 坛 坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 壤 士 壬 壮 声 处 备 复 夏 夕 外 多 夜 够 夥 大 天 太 夫 央 失 头 夷 夸 夹 夺 奇 奈 奉 奋 奏 契 奔 奖 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 娱 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字 存 孙 孜 孝 孟 季 孤 学 孩 宁 它 宇 守 安 宋 完 宏 宗 官 宙 定 宛 宜 宝 实 审 客 宣 室 宪 害 宴 家 容 宽 宾 宿 寂 寄 寅 密 寇 富 寒 寝 寞 察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼 尽 尾 局 屁 层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 崴 川 州 巡 工 左 巧 巨 巫 差 己 已 巳 巴 巷 币 市 布 帅 师 希 帐 帕 帖 帝 带 席 帮 常 帽 幅 幕 干 平 年 并 幸 幻 幼 幽 广 庆 床 序 库 应 底 店 庙 庚 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 异 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 强 归 当 录 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志 忘 忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戊 戌 戏 成 我 戒 或 战 截 戴 户 房 所 扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫 扬 扭 扮 扯 批 找 承 技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 据 捷 授 掉 掌 排 探 接 控 推 掩 措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日 旦 旧 旨 早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾 替 最 月 有 朋 服 朗 望 朝 期 木 未 末 本 札 术 朱 朵 机 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 构 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样 核 根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠 次 欢 欣 欧 欲 欺 款 歉 歌 止 正 此 步 武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 气 氛 水 永 求 汇 汉 汗 汝 江 池 污 汤 汪 汶 汽 沃 沈 沉 沙 沟 没 沧 河 油 治 沿 泉 泊 法 泛 泡 波 泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浏 浑 浓 浙 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵 父 爷 爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 猪 献 猴 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珀 珊 珍 珠 班 球 理 琊 琪 琳 琴 琼 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田 由 甲 申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 癸 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 着 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 确 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祚 祝 神 祥 票 祯 祸 禁 禅 福 离 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 税 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞 竟 章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 筑 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粤 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 线 练 组 细 织 终 绍 经 结 绕 绘 给 络 绝 统 继 绩 绪 续 维 绵 综 绿 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 网 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聘 聚 聪 肉 肖 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胜 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 范 茨 茫 茶 草 荐 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训 议 讯 记 讲 讷 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝 贞 负 贡 财 责 贤 败 货 质 贩 贪 购 贯 贱 贴 贵 贸 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮 软 轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辰 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进 远 违 连 迟 迦 迪 迫 述 迷 追 退 送 适 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酉 酋 配 酒 酷 酸 醉 醒 采 释 里 重 野 量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铜 铢 铭 银 铺 链 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 闰 闲 间 闷 闹 闻 阁 阅 阐 阔 队 阮 防 阳 阴 阵 阶 阻 阿 陀 附 际 陆 陈 降 限 院 除 险 陪 陵 陶 陷 隆 随 隐 隔 障 难 雄 雅 集 雉 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项 顺 须 顽 顾 顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸡 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟] [丐 丛 丫 乒 乓 乞 乳 亢 亩 亭 仂 仆 仑 仓 仗 伞 伪 伶 伺 佃 佣 侄 侈 侍 侣 侥 侮 俏 俐 俘 俭 俯 俺 倔 倘 倡 债 偎 偿 傅 傈 傍 傣 僚 僳 僵 僻 兜 兢 冀 冉 冗 冤 冥 冯 冶 冻 净 凄 凉 凑 凛 凳 凶 凸 凹 凿 刁 刃 删 刨 刮 刹 剃 削 剔 剖 剥 剽 剿 劈 勃 勘 募 勺 匀 匕 匠 匣 匪 匮 匾 匿 卉 卑 卜 卞 卤 卦 卧 卵 卸 卿 厕 厘 厢 厦 厨 叁 叛 叠 叨 叩 叮 叼 叽 吁 吆 吏 吕 吞 吠 吨 吩 吭 吮 吱 吴 吼 呕 呛 呣 呻 咄 咋 咏 咐 咒 咕 咙 咳 咸 咽 哄 哆 哑 哗 哨 哮 哺 哼 唁 唆 唇 唠 唧 唾 啃 啄 啤 啮 啰 啸 啼 喉 喘 喧 喱 喳 嗅 嗓 嗜 嗡 嗦 嗽 嘀 嘘 嘟 嘱 嘲 嘶 嘹 噘 噜 噢 噩 噪 嚎 嚏 嚣 嚷 嚼 囊 囚 囤 囱 圃 坊 坏 坝 坟 坠 坯 坷 垄 垛 垢 垦 垫 垮 埂 埠 堤 堰 堵 塌 塘 墅 墓 墙 墟 墩 壳 壶 壹 夭 夯 奎 奠 奢 奸 妃 妄 妆 妒 妓 姚 姜 姥 姨 姻 娇 娥 娶 婉 婪 婴 婶 婿 媚 媳 嫂 嫉 孪 孵 孽 宅 宠 宦 宫 宰 宵 寓 寥 寺 尉 尧 尬 尴 尸 尿 屈 屉 届 屎 屑 屡 履 屯 屹 屿 岔 岖 岩 岭 峦 峨 峭 峻 崎 崔 崖 崛 崭 嵌 巅 巍 巢 巩 巽 巾 帆 帘 帚 帜 帧 帷 幌 幢 庄 庇 庐 庵 庶 廊 廓 弓 弛 弧 彗 彤 彪 徊 徘 徙 御 徽 忱 忿 怔 怜 怠 怯 恃 恍 恒 恕 恤 恬 恳 悍 悖 悦 悬 悯 悴 悼 惊 惋 惕 惟 惦 惩 惫 惭 惰 惶 愕 愣 愤 愿 慌 慨 慷 憋 憎 憔 憨 懈 懊 懦 戎 戚 戟 戳 扒 扔 扛 扰 扳 扶 扼 抒 抖 抚 抛 抠 抡 押 拂 拄 拇 拌 拎 拐 拓 拗 拙 拢 拣 拧 拭 拯 拱 拴 拽 挂 挎 挚 挟 挠 挣 挨 挫 挽 捂 捅 捆 捌 捍 捎 捏 捞 捣 捧 捶 捺 捻 掀 掂 掏 掐 掘 掠 掰 掷 掺 揉 揍 揣 揩 揪 揭 揽 搀 搁 搂 搅 搏 搓 搔 携 摇 摧 摹 撅 撇 撑 撕 撤 撩 撬 撮 撰 撵 撼 擂 擅 擒 攀 敛 敞 敷 斌 斑 斟 斤 斧 斩 旬 旱 旷 昔 昙 昧 昼 晌 晕 晦 晰 晾 暇 曙 曝 朔 朦 朴 朽 杆 杏 杖 杠 杭 枉 枕 枚 枣 枯 柄 柑 柒 柜 柠 柩 柱 柿 栅 栈 栓 栖 栗 株 栽 桂 桐 桔 桦 桨 桩 桶 梆 梗 梢 梧 梨 梭 梳 棍 棕 棘 棠 棱 棵 棺 椎 椒 椭 椿 楔 楠 楷 榄 榆 榈 榔 榕 榨 榴 槌 槐 槛 槟 槽 槿 樟 横 橄 橇 橘 橙 橡 橱 檐 檬 歇 歧 歹 歼 殃 殉 殖 殴 殷 殿 毁 毙 毡 毯 氓 氢 氧 氨 氮 氯 汁 汛 汞 汰 汹 沁 沐 沛 沥 沦 沪 沫 沮 沸 沼 沽 沾 泄 泌 泞 泪 泵 泻 泼 洁 洒 洼 浆 浇 浊 浣 浸 涂 涌 涎 涕 涝 涡 涣 涤 润 涧 涩 涮 淀 淆 淇 淌 淤 淫 淮 淳 淹 渊 渔 渗 渝 渠 渤 渲 渺 湃 湘 湿 溃 溅 溉 溢 溯 溶 溺 滇 滔 滕 滚 滞 滤 滩 漆 漓 漱 漾 潇 潭 澄 澈 澜 澡 濒 瀑 灶 灸 灼 灾 炊 炒 炕 炫 炬 炭 炼 炽 烁 烘 烙 烛 烟 烫 烹 焉 焊 焕 焙 焚 焰 煎 煤 煽 熄 熏 熔 熙 熬 燥 爹 犀 犁 犄 犬 犸 狈 狞 狡 狭 狰 狸 猎 猕 猖 猩 猫 猬 猾 猿 獭 獾 玖 玷 琅 琉 琐 琢 瑚 璧 瓢 瓣 瓤 瓮 瓷 甥 甩 甫 畏 畔 畜 畴 畸 疙 疚 疟 疤 疫 疮 疹 症 痊 痒 痘 痢 痪 痰 痹 瘟 瘤 瘦 瘩 瘪 瘫 瘸 瘾 癌 癣 皂 皓 皖 皱 皿 盆 盏 盐 盔 盗 盥 盯 盲 盹 眨 眩 眯 眶 眷 睁 睐 睦 睫 睬 睹 睿 瞄 瞅 瞌 瞎 瞒 瞩 瞪 瞬 瞭 瞳 瞻 矗 矢 矩 矫 矮 矾 矿 砌 砖 砚 砰 砸 砾 硅 硝 硫 碌 碑 碘 碱 碳 碾 磊 磕 磷 礁 祀 祈 祟 祠 祭 祷 禀 禄 禹 禽 禾 秃 秆 秉 秧 秸 秽 稚 稠 稻 稼 稽 穗 穴 窃 窄 窍 窑 窒 窖 窘 窜 窟 窥 窿 竖 竣 竭 竿 笆 笋 笙 笺 笼 筏 筐 筒 筛 筝 筷 箕 箩 箫 箸 篓 篡 篱 篷 簇 簧 簸 籽 粑 粘 粟 粥 粪 粮 粱 粽 糙 糠 糯 紊 絮 纠 纤 纫 纬 纱 纹 纺 绅 绊 绎 绑 绒 绚 绞 绢 绣 绰 绳 绷 绸 绽 缀 缄 缆 缉 缎 缔 缕 缚 缝 缤 缭 缰 罩 羔 羚 羡 羹 翩 翱 耕 耘 耙 耸 耻 耽 耿 聂 聆 聋 肃 肆 肇 肋 肌 肘 肛 肝 肠 肢 肪 肮 肴 肺 肾 肿 胀 胃 胚 胧 胰 胳 脂 脉 脊 脏 脐 脓 脖 脚 脯 脾 腋 腔 腕 腥 腮 腺 腻 膀 膊 膏 膛 膜 膝 膨 臀 臊 臼 舀 舅 舆 舔 舱 舵 舶 艇 艘 艮 艰 艳 芋 芙 芜 芥 芯 芹 芽 苇 苑 苔 苛 苜 苞 苟 苣 苹 茁 茄 茅 茉 茎 茧 茬 茵 茸 荆 荔 荡 荤 荧 荫 莓 莴 莹 莺 莽 菇 菊 菌 菠 菱 萌 萎 萝 董 葩 葫 葬 葱 葵 蒜 蒲 蒸 蓄 蓿 蔓 蔗 蔚 蔬 蔼 蔽 蕉 蕊 蕴 蕾 薇 薛 薯 藐 藕 藻 蘑 虏 虐 虚 蚀 蚂 蚊 蚌 蚓 蚕 蚝 蚣 蚤 蚪 蚯 蛀 蛆 蛎 蛐 蛛 蛤 蛰 蛾 蜀 蜈 蜒 蜓 蜕 蜗 蜘 蜡 蜥 蜴 蜻 蝇 蝉 蝌 蝎 蝗 蝙 蝠 蝴 螂 螃 螺 蟀 蟆 蟋 蟑 蠕 衅 衍 衔 衙 衫 衬 衰 衷 袁 袄 袍 袖 袜 袱 裙 裳 裸 裹 褂 褐 褒 褥 褪 襟 觅 触 誊 譬 讥 讳 讶 讹 讼 讽 诀 诈 诊 诡 诫 诬 诱 诲 诵 诽 谆 谍 谎 谐 谚 谣 谤 谦 谬 谭 谴 豁 豌 豚 豫 豹 豺 账 贫 贬 贮 贰 贷 贻 贿 赁 赂 赃 赎 赘 赡 赣 赦 赴 赶 趟 趴 趾 跆 跋 跛 跤 跨 跪 践 跷 跺 踊 踪 踱 蹂 蹄 蹈 蹋 蹦 蹬 蹭 蹲 躁 躏 躬 躯 躺 轧 轴 轿 辐 辖 辗 辙 辜 辟 辣 辫 辽 迂 迄 迢 迭 迹 逗 逞 逮 逾 遂 遏 遣 遥 邑 郁 郊 鄙 酌 酗 酝 酢 酣 酥 酪 酬 酱 酵 酿 醇 醋 醺 鉴 钉 钙 钝 钞 钠 钥 钧 钩 钮 钯 钳 钾 铂 铅 铐 铛 铝 铰 铲 铸 锄 锈 锌 锐 锑 锚 锣 锤 锥 锯 锰 锹 锻 镀 镐 镑 镖 镰 镶 闯 闸 闺 闽 阀 阎 阱 陋 陌 陕 陡 陨 隅 隋 隘 隙 隧 隶 雀 雁 雇 雌 雏 雕 雹 霄 霉 霎 霜 霞 霾 靡 靴 靶 鞍 鞠 鞭 韧 韭 韵 顷 颁 颂 颅 颈 颊 颓 颖 颜 颠 颤 飓 饥 饪 饲 饵 饶 饺 饿 馁 馅 馈 馋 馍 馏 馒 驮 驯 驰 驳 驴 驹 驼 骂 骄 骆 骇 骏 骡 骰 骷 骼 髅 髓 髦 鬈 鬓 魁 魄 魏 鱿 鲍 鲤 鲨 鲫 鲸 鳄 鳍 鳖 鳞 鸢 鸥 鸦 鸯 鸳 鸵 鸽 鹃 鹉 鹊 鹏 鹦 黏 黔 黛 黯 鼎 鼬 龇] [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] - [\- ‑ , . % ‰ + 0 1 2 3 4 5 6 7 8 9 〇 一 七 三 九 二 五 八 六 四] - [﹉﹊﹋﹌ __﹍﹎﹏︳︴ \--﹣ ‐‑ – —︱ ― ,,﹐ 、﹑ ;;﹔ \::﹕ !!﹗ ??﹖ ..﹒ ‥︰ … 。 · '‘’ ""“”〝〞 ((﹙︵ ))﹚︶ \[[ \]] \{{﹛︷ \}}﹜︸ 〈︿ 〉﹀ 《︽ 》︾ 「﹁ 」﹂ 『﹃ 』﹄ 【︻ 】︼ 〔﹝︹ 〕﹞︺ 〖 〗 ‖ § @@﹫ **﹡ // \\\﹨ \&&﹠ ##﹟ %%﹪ ‰ ′ ″ ‵ 〃 ※] + [\- ‑ , . % ‰ + 0 1 2 3 4 5 6 7 8 9 〇 一 七 三 九 二 五 八 六 十 四] + [伍 叁 壹 拾 捌 柒 玖 肆 贰 陆 零] + [\- ‑ – — ,, 、 ;; \:: !! ?? . … 。 · '‘’ "“” (( )) \[ \] \{ \} 《 》 「 」 【 】 @ * \\ \& # % ` \^ + < = > || ~~] + [﹉﹊﹋﹌ _﹍﹎﹏︳︴ -﹣ ‐ ― ﹐ ﹑ ﹔ ﹕ ﹗ ﹖ .﹒ ‥︰ ' "〝〞 ﹙︵ ﹚︶ [ ] {﹛︷ }﹜︸ 〈︿ 〉﹀ ︽ ︾ ﹁ ﹂ 『﹃ 』﹄ ︻ ︼ 〔﹝︹ 〕﹞︺ 〖 〗 ‖ § @﹫ *﹡ / \﹨ &﹠ #﹟ %﹪ ‰ ′ ″ ‵ 〃 ※] + [\- ‐‑ , . {/·}] {0}… …{0} {0}…{1} @@ -1443,9 +1498,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ [\: ∶] - - [££ ₤] - [\--﹣ ‑ ‒ −⁻₋ ➖] [,,﹐︐ ، ٫ 、﹑、︑] @@ -1777,6 +1829,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bh:mm Bh:mm:ss d日 + EBh时 EB h:mm EB h:mm:ss d日E @@ -1790,6 +1843,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ah时 ah:mm ah:mm:ss + vah时 + vH时 MMM M-d M-dE @@ -1958,7 +2013,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 科普特历前 科普特历 @@ -2006,16 +2060,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 埃塞俄比亚历前 - 埃塞俄比亚历 - - - 埃历前 - 埃历 - - @@ -2025,13 +2069,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - - 埃塞俄比亚阿米特阿莱姆历 - - - @@ -2085,13 +2122,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bh:mm Bh:mm:ss d日 - EB h:mm + EBh时 + EBh:mm EB h:mm:ss d日E + Eah时 Ea h:mm Ea h:mm:ss Gy年 + Gy/M Gy/M/d + Gy/M/d E Gy年M月d日EEEE Gy年M月 Gy年M月d日 @@ -2100,6 +2141,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H时 ah:mm ah:mm:ss + vah时 + vH时 M/d M/dE LL @@ -2438,14 +2481,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bh:mm Bh:mm:ss d日 + EBh时 EBh:mm EBh:mm:ss d日E + Eah时 Eah:mm EHH:mm Eah:mm:ss EHH:mm:ss Gy年 + Gy年M月 + Gy-MM-dd + Gy-MM-ddE Gy年M月 Gy年M月d日 Gy年M月d日E @@ -2453,10 +2501,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H时 ah:mm ah:mm:ss - v ah:mm:ss - v HH:mm:ss - v ah:mm + vah:mm:ss + vHH:mm:ss + vah:mm v HH:mm + vah时 + vH时 M月 M/d M/dE @@ -2585,8 +2635,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y–y年 - y年M月至M月 - y年M月至y年M月 + y/M – y/M + y/M – y/M y/M/d – y/M/d @@ -2596,25 +2646,25 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y/M/dE至y/M/dE y/M/dE至y/M/dE - y/M/dE至y/M/dE + y/M/dE – y/M/dE - y年M月至M月 - y年M月至y年M月 + y年MMM – MMM + y年MMM – y年MMM - y年M月d日至d日 - y年M月d日至M月d日 - y年M月d日至y年M月d日 + y年MMMd日 – d日 + y年MMMd日 – MMMd日 + y年MMMd日 – y年MMMd日 - y年M月d日E至d日E + y年MMMd日E – MMMd日E y年M月d日E至M月d日E y年M月d日E至y年M月d日E - y年M月至M月 - y年M月至y年M月 + y年M月 – M月 + y年M月 – y年M月 @@ -2818,6 +2868,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + Gy/M + Gy-MM-dd E M月 M-d M-dE @@ -2828,6 +2880,38 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + + + + + MMMd日 E – MMMd日 E + + + y-MM-dd E – y-MM-dd E + y-MM-dd E – y-MM-dd E + y-MM-dd E – y-MM-dd E + + + y年MMM–MMM + y年MMM – y年MMM + + + y年MMMd–d日 + y年MMMd日 – MMMd日 + y年MMMd日 – y年MMMd日 + + + y年MMMd日 E – MMMd日 E + y年MMMd日 E – MMMd日 E + y年MMMd日 E – y年MMMd日 E + + + y年MMM–MMM + y年MMMM – y年MMMM + + + + @@ -3345,6 +3429,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ + Gy年M月 + Gy-MM-dd E M月 LLL Gy/M/d @@ -3438,12 +3524,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 星期 - - 星期 - - - 星期 - 月中日 @@ -3586,7 +3666,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 未知城市 + 未知地点 安道尔 @@ -3715,7 +3795,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 布里斯班 - 麦格理 + 麦夸里岛 豪勋爵岛 @@ -3930,6 +4010,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 复活节岛 + + 科伊艾克 + 蓬塔阿雷纳斯 @@ -4195,9 +4278,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 金边 - 恩德伯里 - - 坎顿岛 @@ -4558,7 +4638,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 雅库茨克 - 符拉迪沃斯托克 + 海参崴 汉德加 @@ -4874,9 +4954,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 西部非洲时间 - 西部非洲标准时间 - 西部非洲夏令时间 + 西部非洲时间 @@ -5264,6 +5342,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 圭亚那时间 + + + 夏威夷-阿留申标准时间 + + 夏威夷-阿留申时间 @@ -5714,6 +5797,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 楚克时间 + + + 土耳其时间 + 土耳其标准时间 + 土耳其夏令时间 + + 土库曼斯坦时间 @@ -5896,8 +5986,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -5909,16 +5997,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 0 ¤0万 + ¤ 0万 ¤00万 + ¤ 00万 ¤000万 + ¤ 000万 ¤0000万 + ¤ 0000万 ¤0亿 + ¤ 0亿 ¤00亿 + ¤ 00亿 ¤000亿 + ¤ 000亿 ¤0000亿 + ¤ 0000亿 ¤0万亿 + ¤ 0万亿 ¤00万亿 + ¤ 00万亿 ¤000万亿 + ¤ 000万亿 {0}{1} @@ -6830,6 +6929,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 东加勒比元 + + 加勒比盾 + 加勒比盾 + 特别提款权 @@ -6910,6 +7013,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 津巴布韦元 (1980–2008) + + 津巴布韦金元 + 津巴布韦金元 + 津巴布韦元 (2009) @@ -7034,13 +7141,21 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 毫摩尔/升 每升{0}毫摩尔 - + + + {0}份 + + 百万分之{0} 摩尔 {0}摩尔 + + 葡萄糖 + {0}葡萄糖 + 升/公里 每公里{0}升 @@ -7276,6 +7391,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 毫米汞柱 {0}毫米汞柱 + + 汞柱 + {0}汞柱 + 磅/平方英寸 每平方英寸{0}磅 @@ -7352,6 +7471,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 牛顿米 {0}牛顿米 + + 公制液量盎司 + {0}公制液量盎司 + 英制甜点匙 {0}英制甜点匙 @@ -7364,19 +7487,62 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 英制夸脱 {0}英制夸脱 - - - {0}光 + + 球面度 + {0}球面度 - + + 开特 + {0}开特 + + + 库仑 + {0}库仑 + + + 法拉 + {0}法拉 + + + 亨利 + {0}亨利 + + + 西门子 + {0}西门子 + + + 国际蒸汽表卡路里 + {0}国际蒸汽表卡路里 + + + 贝克勒尔 + {0}贝克勒尔 + + + 西弗 + {0} 西弗 + + + 戈瑞 + {0}戈瑞 + + + 千克力 + {0}千克力 + + + 特斯拉 + {0}特斯拉 + + + 韦伯 + {0}韦伯 + + 十亿分比 十亿分之{0} - - - {0}晚 - {0}/晚 - 主方向 @@ -7454,9 +7620,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}项 - + + + {0}份 + + {0}ppm + + Glc + {0}Glc + B {0} B @@ -7709,6 +7883,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ mmHg {0} mmHg + + {0}Hg + {0}K @@ -7779,6 +7956,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 公制杯 {0}公制杯 + + 公制液量盎司 + {0}公制液量盎司 + 英亩英尺 {0}英亩英尺 @@ -7849,10 +8030,44 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}撮 + + {0}sr + + + {0}kat + + + 国际蒸汽表卡 + {0}国际蒸汽表卡 + + + 贝克 + {0}贝克 + + + 西弗 + {0}西弗 + + + 戈瑞 + {0}戈瑞 + + + {0}kgf + + + {0}T + + + {0}Wb + {0}光 + + {0}ppb + {0}晚 @@ -7928,9 +8143,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmol/L + + + {0}份 + {0}mol + + Glc + {0}Glc + {0}L/km @@ -8201,6 +8424,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mmHg + + {0}Hg + {0}psi @@ -8369,14 +8595,36 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 英制夸脱 {0}qt-Imp. - - - {0}光 + + {0}sr - - - {0}晚 - {0}/晚 + + {0}kat + + + cal-IT + {0}cal-IT + + + {0}Bq + + + {0}Sv + + + {0}Gy + + + {0}kgf + + + {0}T + + + {0}Wb + + + {0}ppb {0}E diff --git a/make/data/cldr/common/main/zh_Hans_MY.xml b/make/data/cldr/common/main/zh_Hans_MY.xml index 6a8050439d9..a47e65a3193 100644 --- a/make/data/cldr/common/main/zh_Hans_MY.xml +++ b/make/data/cldr/common/main/zh_Hans_MY.xml @@ -12,6 +12,18 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -946,6 +948,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 中國 哥倫比亞 克里派頓島 + 薩克島 哥斯大黎加 古巴 維德角 @@ -1260,35 +1263,55 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 數字排序 排序強度 貨幣 + 表情符號展示 時間週期(12 小時制與 24 小時制) 換行樣式 + 單字內的換行 度量單位系統 數字 + 縮寫後斷句 時區 區域變異 私人使用 佛曆 + 佛曆 農曆 + 農曆 科普特曆 + 科普特曆 檀紀曆 + 檀紀曆 衣索比亞曆 + 衣索比亞曆 衣索比亞曆 (Amete Alem) + 衣索比亞曆 (Amete Alem) 公曆 + 公曆 希伯來曆 + 希伯來曆 印度國曆 伊斯蘭曆 + 伊斯蘭曆 伊斯蘭民用曆 + 表格式伊斯蘭曆(民用紀元) 伊斯蘭新月曆 伊斯蘭天文曆 + 表格式伊斯蘭曆(天文紀元) 伊斯蘭曆(烏姆庫拉) + 伊斯蘭曆(烏姆庫拉) ISO 8601 國際曆法 - 日本曆 + 和曆 + 和曆 波斯曆 + 波斯曆 國曆 + 國曆 會計貨幣格式 + 會計 標準貨幣格式 + 標準 排序符號 略過符號排序 正常排序重音 @@ -1298,23 +1321,33 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 優先排序大寫 不分大小寫排序 依大小寫排序 - 繁體中文排序 - Big5 舊制排序 + 相容性 字典排序 + 字典 預設 Unicode 排序 + 預設 Unicode 表情符號 歐洲排序規則 - 簡體中文排序 - GB2312 電話簿排序 + 電話簿 發音排序 + 發音 拼音排序 + 拼音 一般用途搜尋 + 搜尋 依諺文聲母搜尋 標準排序 + 標準 筆畫排序 + 筆畫 傳統排序 + 傳統 部首筆畫排序 + 部首筆畫 注音排序 + 注音 非正規化排序 依正規化排序 Unicode 個別排序數字 @@ -1327,18 +1360,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 全形 半形 數字 + 預設 + 表情符號 + 文字 12 小時制 (0–11) + 12 (0–11) 12 小時制 (1–12) + 12 (1–12) 24 小時制 (0–23) + 24 (0–23) 24 小時制 (1–24) + 24 (1–24) 寬鬆換行樣式 + 寬鬆 一般換行樣式 + 一般 強制換行樣式 + 強制 + 任意字元強迫換行 + 保留完整單字換行 + 一般 + 維持詞組 美國地名委員會 聯合國地名專家組 - 公制 + 公制系統 + 公制 英制度量單位系統 + 英制 美制度量單位系統 + 美制 阿洪姆數字 阿拉伯-印度數字 阿拉伯-印度擴充數字 @@ -1418,6 +1468,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 傳統數字 瓦伊文數字 瓦蘭齊地數字 + 關閉 + 開啟 公制 @@ -1754,6 +1806,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bh:mm Bh:mm:ss d日 + EBh時 E Bh:mm E Bh:mm:ss d E @@ -1768,6 +1821,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH時 Bh:mm Bh:mm:ss + ah v MMM M/d M/dE @@ -2115,29 +2169,41 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {1} {0} + + {1}{0} + {1} {0} + + {1}{0} + {1} {0} + + {1}{0} + Bh時 Bh:mm Bh:mm:ss d日 + EB h E Bh:mm E Bh:mm:ss d E + E ah  E Bh:mm E Bh:mm:ss G y年 G y/M/d + G y-MM-dd E G y年M月 G y年M月d日 G y年M月d日 E @@ -2147,6 +2213,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ H:mm Bh:mm:ss H:mm:ss + ah v M月 M/d M/d(E) @@ -2406,22 +2473,43 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - {1} {0} + {1}{0} + + + {1}{0} + + + {1}{0} - {1} {0} + {1}{0} + + + {1}{0} + + + {1}{0} - {1} {0} + {1}{0} + + + {1}{0} + + + {1}{0} - {1} {0} + {1}{0} + + + {1}{0} @@ -2429,13 +2517,17 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Bh:mm Bh:mm:ss d日 - E Bh:mm - E Bh:mm:ss + EBh時 + EBh:mm + EBh:mm:ss d E - E Bh:mm - E Bh:mm:ss + Eah時 + EBh:mm + EBh:mm:ss Gy年 + Gy/M G y/M/d + Gy/M/d(E) Gy年M月 Gy年M月d日 Gy年M月d日 E @@ -2447,12 +2539,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm:ss [v] Bh:mm [v] HH:mm [v] + ah v M月 M/d M/d(E) MM/dd M月d日 - M月d日 E + M月d日E M月d日 MMMM的第W週 y年 @@ -2463,7 +2556,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ y/MM y年M月 y年M月d日 - y年M月d日 E + y年M月d日E y年M月 y年QQQ y年QQQQ @@ -2799,7 +2892,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ d日(E) Gy年 + Gy/M GGGGG y/M/d + Gy-MM-dd E Gy年M月 Gy年M月d日 Gy年M月d日E @@ -3437,7 +3532,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Gy年 + Gy年M月 Gy/M/d + Gy年M月d日(E) Gy年M月 Gy年M月d日 Gy年M月d日E @@ -3461,12 +3558,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 紀元 - - 紀元 - - - 紀元 - 去年 @@ -3522,9 +3613,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 月週次 - - 月週次 - 前天 @@ -3542,30 +3630,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 該年第幾天 - - 該年第幾天 - - - 該年第幾天 - 星期 - - 星期 - - - 星期 - 該月第幾週 - - 該月第幾週 - - - 該月第幾週 - 上週日 本週日 @@ -3643,15 +3713,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} 個週六前 - - 時段 - 時段 - - 時段 - 小時 這一小時 @@ -3665,9 +3729,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 分鐘 這一分鐘 @@ -3681,9 +3742,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - - - 現在 @@ -4054,6 +4112,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 復活島 + + 科伊艾克 + 蓬塔阿雷納斯 @@ -4319,9 +4380,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 金邊 - 恩得伯理島 - - 坎頓島 @@ -4998,9 +5056,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - 西非時間 - 西非標準時間 - 西非夏令時間 + 西非時間 @@ -5421,6 +5477,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 蓋亞那時間 + + + 夏威夷-阿留申標準時間 + + + HAST + + 夏威夷-阿留申時間 @@ -5876,6 +5940,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 楚克島時間 + + + 土耳其時間 + 土耳其標準時間 + 土耳其夏令時間 + + 土庫曼時間 @@ -6003,8 +6074,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 - #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -6016,16 +6085,27 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 0 ¤0萬 + ¤ 0萬 ¤00萬 + ¤ 00萬 ¤000萬 + ¤ 000萬 ¤0000萬 + ¤ 0000萬 ¤0億 + ¤ 0億 ¤00億 + ¤ 00億 ¤000億 + ¤ 000億 ¤0000億 + ¤ 0000億 ¤0兆 + ¤ 0兆 ¤00兆 + ¤ 00兆 ¤000兆 + ¤ 000兆 @@ -6294,7 +6374,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 埃及鎊 - 厄立特里亞納克法 + 厄利垂亞納可法 + 厄利垂亞納可法 西班牙比塞塔(會計單位) @@ -6515,7 +6596,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 摩爾多瓦券 - 摩杜雲列伊 + 摩爾多瓦列伊 + 摩爾多瓦列伊 馬達加斯加阿里亞里 @@ -6596,7 +6678,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 尼加拉瓜科多巴 - 尼加拉瓜金科多巴 + 尼加拉瓜科多巴 + 尼加拉瓜科多巴 荷蘭盾 @@ -6838,7 +6921,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 西薩摩亞塔拉 - 法郎 (CFA–BEAC) + 中非法郎 + 中非法郎 白銀 @@ -6861,6 +6945,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 格瑞那達元 + + 加勒比盾 + 加勒比盾 + 特殊提款權 @@ -6874,13 +6962,15 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 法國法郎 (UIC) - 法郎 (CFA–BCEAO) + 西非法郎 + 西非法郎 帕拉狄昂 - 法郎 (CFP) + 太平洋法郎 + 太平洋法郎 白金 @@ -6941,6 +7031,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 辛巴威元 (1980–2008) + + 辛巴威金 + 辛巴威金 + 辛巴威元 (2009) @@ -7022,6 +7116,14 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 每公升毫莫耳 每公升 {0} 毫莫耳 + + 比例 + {0} 比例 + + + 葡萄糖 + {0} 葡萄糖 + 每公里公升 每公里 {0} 公升 @@ -7118,10 +7220,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} 英寸 每英寸 {0} - - 斯堪地那維亞里 - {0} 斯堪地那維亞里 - 太陽半徑 {0} 太陽半徑 @@ -7161,6 +7259,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 馬力 {0} 匹馬力 + + 汞柱 + {0} 汞柱 + 每平方英寸磅力 每平方英寸 {0} 磅力 @@ -7203,21 +7305,75 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} 公升 每公升 {0} + + 公制液盎司 + {0}公制液盎司 + 每加侖 {0} 每英制加侖 {0} - + + 球面度 + {0} 球面度 + + + 開特 + {0} 開特 + + + 庫侖 + {0} 庫侖 + + + 法拉 + {0} 法拉 + + + 亨利 + {0} 亨利 + + + 西門子 + {0} 西門子 + + + 卡路里-IT + + + 貝克勒 + {0} 貝克勒 + + + 西弗 + {0} 西弗 + + + 戈雷 + {0} 戈雷 + + + 公斤力 + {0} 公斤力 + + + 特斯拉 + {0} 特斯拉 + + + 韋伯 + {0} 韋伯 + + + 光速 + {0} 倍光速 + + 十億分點濃度 {0} 十億分點濃度 - - - {0} 夜 - {0}/夜 - 基本方向 @@ -7384,7 +7540,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 個項目 {0} 個項目 - + + 比例 + {0}比例 + + 百萬分率 {0} 百萬分率 @@ -7398,6 +7558,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 莫耳 {0} 莫耳 + + 葡萄糖 + 公升/公里 {0} 升/公里 @@ -7595,8 +7758,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 英尺 - {0} 呎 - {0}/呎 + {0}英尺 + {0}/英尺 英寸 @@ -7645,7 +7808,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 流明 - {0} 流明 公噸 @@ -7872,6 +8034,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 公制量杯 {0} 公制杯 + + 公制液盎司 + {0}公制液盎司 + 英畝英尺 {0} 英畝英尺 @@ -7950,7 +8116,32 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ 英制夸脫 {0} 英制夸脫 - + + 開特 + + + 庫侖 + {0} 庫侖 + + + 法拉 + {0} 法拉 + + + 亨利 + {0} 亨利 + + + 西門子 + + + 卡路里-IT + + + 光速 + {0} 倍光速 + + 濃度/十億 @@ -8030,12 +8221,19 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}個項目 - + + 比例 + {0} 比例 + + {0}百萬分率 {0}莫耳 + + 葡萄糖 + {0}升/公里 @@ -8206,7 +8404,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}碼 - {0}呎 + {0}英尺 + {0}/英尺 {0}吋 @@ -8230,7 +8429,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}nmi - 斯堪地那維亞里 {0}smi @@ -8246,7 +8444,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}燭光 - {0}流明 + lm + {0}lm {0}L☉ @@ -8416,6 +8615,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}公制杯 + + 公制液盎司 + {0}公制液盎司 + {0}英畝英尺 @@ -8473,13 +8676,34 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}英制夸脫 - + + 開特 + + + 庫侖 + + + 法拉 + + + 亨利 + {0} 亨利 + + + 西門子 + + + 卡路里-IT + + + 光速 + {0}倍光速 + + {0}ppb - {0}夜 - {0}/夜 diff --git a/make/data/cldr/common/main/zh_Hant_HK.xml b/make/data/cldr/common/main/zh_Hant_HK.xml index 8d6ffd863bb..1a49e48c798 100644 --- a/make/data/cldr/common/main/zh_Hant_HK.xml +++ b/make/data/cldr/common/main/zh_Hant_HK.xml @@ -50,6 +50,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic 扎扎其文 坎納達文 克裡奧爾文 + 庫德文 + 北庫德文 老撾文 盧歐文 毛里裘斯克里奧爾文 @@ -203,10 +205,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic 埃塞俄比亞曆 + 埃塞俄比亞曆 埃塞俄比亞阿美德阿萊姆曆 - 繁體中文排序 (Big5) + 埃塞俄比亞阿美德阿萊姆曆 + 伊斯蘭曆(表格曆,民用紀元) + 伊斯蘭曆(表格式,天文紀元) 詞典排序 - 簡體中文排序 (GB2312) + 詞典 英制 美制 天城體數字 @@ -329,6 +334,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic HH ah:mm ah:mm:ss + ah時 v r(U)年MMMMd日 r(U)年MMMMd日 E @@ -399,12 +405,15 @@ CLDR data files are interpreted according to the LDML specification (http://unic + EB h時 d日E + E ah 時 E ah:mm Gy年 Gy年M月 Gy年M月d日 Gy年M月d日E + ah時 v d/M d/M(E) M月d日E @@ -566,22 +575,22 @@ CLDR data files are interpreted according to the LDML specification (http://unic - {1} {0} + {1}{0} - {1} {0} + {1}{0} - {1} {0} + {1}{0} - {1} {0} + {1}{0} @@ -593,16 +602,16 @@ CLDR data files are interpreted according to the LDML specification (http://unic ah:mm:ss ah:mm:ss [v] ah:mm [v] + vah時 + vH時 d/M d/M(E) dd/MM - M月d日E M月第W週 M/y d/M/y d/M/y(E) MM/y - y年M月d日E Y年第w週 @@ -748,6 +757,12 @@ CLDR data files are interpreted according to the LDML specification (http://unic 星期幾 + + 星期幾 + + + 星期幾 + 上星期日 本星期日 @@ -1096,9 +1111,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 比斯凱克 - - 恩德伯里島 - 科摩羅 @@ -1566,17 +1578,29 @@ CLDR data files are interpreted according to the LDML specification (http://unic ¤0K + ¤ 0K ¤00K + ¤ 00K ¤000K + ¤ 000K ¤0M + ¤ 0M ¤00M + ¤ 00M ¤000M + ¤ 000M ¤0B + ¤ 0B ¤00B + ¤ 00B ¤000B + ¤ 000B ¤0T + ¤ 0T ¤00T + ¤ 00T ¤000T + ¤ 000T @@ -1683,9 +1707,6 @@ CLDR data files are interpreted according to the LDML specification (http://unic 立陶宛里塔 - - 摩爾多瓦列伊 - 毛里塔尼亞烏吉亞 (1973–2017) @@ -1773,18 +1794,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic 瓦努阿圖瓦圖 - - 中非法郎 - 東加勒比元 多哥非洲共同體法郎 - 西非法郎 - - - 太平洋法郎 也門里雅 @@ -1792,6 +1806,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic 贊比亞克瓦查 + + 津布巴韋金 + 津布巴韋金 + @@ -1831,6 +1849,14 @@ CLDR data files are interpreted according to the LDML specification (http://unic 每公升毫摩爾 每公升 {0} 毫摩爾 + + 等份 + {0} 等份 + + + 百萬分比 + {0} 百萬分比 + 公升/公里 {0} 公升/公里 @@ -1988,9 +2014,33 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 每公升 + + 公制液安士 + {0} 公制液安士 + {0} 每加侖 + + 國際蒸汽表卡路里 + {0} 國際蒸汽表卡路里 + + + 貝克勒爾 + {0} 貝克勒爾 + + + 希沃特 + {0} 希沃特 + + + 戈瑞 + {0} 戈瑞 + + + 十億分比 + 十億分之{0} + 東經 {0} 北緯 {0} @@ -2090,6 +2140,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic 毫摩爾/公升 {0} 毫摩爾/公升 + + 等份 + {0}等份 + + + 百萬分比 + {0} 百萬分比 + + + {0}葡萄糖 + {0} 升每公里 @@ -2272,6 +2333,10 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 公制量杯 + + 公制液安士 + {0} 公制液安士 + 英畝呎 {0} 英畝呎 @@ -2290,6 +2355,44 @@ CLDR data files are interpreted according to the LDML specification (http://unic 英制液安士 {0} 英制液安士 + + 球面度 + {0}球面度 + + + {0}開特 + + + 國際蒸汽表卡 + {0} 國際蒸汽表卡 + + + 貝克 + {0} 貝克 + + + + {0} 希 + + + + {0} 戈 + + + 公斤力 + {0}公斤力 + + + 特斯拉 + {0}特斯拉 + + + 韋伯 + {0}韋伯 + + + 十億分比 + {0} 東 {0} 北 @@ -2310,9 +2413,17 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 個項目 - + + 等份 + {0}等份 + + + 百萬分比 {0} ppm + + {0}葡萄糖 + {0}L/100km @@ -2406,8 +2517,8 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0} 量杯 - - {0} 每加侖 + + 公制液穴士 {0}英液安士 @@ -2415,11 +2526,51 @@ CLDR data files are interpreted according to the LDML specification (http://unic {0}英制甜品匙 + + 球面度 + {0}球面度 + + + {0}開特 + + + {0} 庫侖 + + + {0} 法拉 + + + {0} 卡路里-IT + + + 貝克 + {0}貝克 + + + + {0}希 + + + + {0}戈 + + + 公斤力 + {0}公斤力 + + + 特斯拉 + {0}特斯拉 + + + 韋伯 + {0}韋伯 + {0}夜 - - 濃度/十億 + + ppb {0}E diff --git a/make/data/cldr/common/main/zu.xml b/make/data/cldr/common/main/zu.xml index bd893062aa9..c2469190306 100644 --- a/make/data/cldr/common/main/zu.xml +++ b/make/data/cldr/common/main/zu.xml @@ -45,6 +45,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ isi-Azerbaijani isi-Azeria isi-Bashkir + IsiBaluchi isi-Balinese isi-Basaa isi-Belarusian @@ -90,7 +91,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ isi-Carolina Algonquian i-Seselwa Creole French isi-Czech - Swampy Cree + isi-Swampy Cree isi-Church Slavic isi-Chuvash isi-Welsh @@ -233,11 +234,13 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ isi-Bafia isi-Colognian isi-Kurdish + isiKurdish + isiKurmanji isi-Kumyk isi-Komi isi-Cornish Kwakʼwala - Kuvi + isiKuvi isi-Kyrgyz isi-Latin isi-Ladino @@ -449,9 +452,9 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ isi-Uzbek isi-Vai isi-Venda - IsiVenetian + isiVenetian isi-Vietnamese - Makhuwa + isiMakhuwa isi-Volapük isiVunjo isi-Walloon @@ -689,7 +692,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-Eastern Europe i-Northern Europe i-Western Europe - Sub-Saharan Africa + i-Sub-Saharan Africa i-Latin America i-Ascension Island i-Andorra @@ -745,6 +748,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-China i-Colombia i-Clipperton Island + i-Sark i-Costa Rica i-Cuba i-Cape Verde @@ -960,8 +964,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-Vanuatu i-Wallis ne-Futuna i-Samoa - Pseudo-Accents - Pseudo-Bidi + i-Pseudo-Accents + i-Pseudo-Bidi i-Kosovo i-Yemen i-Mayotte @@ -1090,35 +1094,54 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Ukuhlelwa Ngezinombolo Amandla Okuhlelwa Imali + Emoji Presentation Umjikelezo wehora (12 vs 24 I-Line Break Style + Umugqa Uyanqamuka phakathi Kwamagama Isistimu yokulinganisa Izinombolo + Sentence Break After Abbr. Isikhathi Sendawo Okokwehlukanisa Kwasendaweni Yokusetshenziswa Ngasese ikhalenda lesi-Buddhist + Buddhist Ikhalenda lesi-Chinese + Chinese i-Coptic Calender + Coptic Ikhalenda lesi-Dangi + Dangi Ikhalenda lesi-Ethiopic + Ethiopic i-Ethiopic Amete Alem Calender + Ethiopic Amete Alem ikhalenda lesi-Gregorian + Gregorian Ikhalenda lesi-Hebrew + Hebrew i-Indian National Calender Ikhalenda lesi-Hijri + Hijri Ikhalenda lesiHijri (tabular, civil epoch) + Hijri (tabular, civil epoch) Ikhalenda yesi-Islamic (Saudi Arabia, sighting) Ikhalenda yesi-Islamic (tabular, astronomical epoch) Ikhalenda lesiHijri (Umm al-Qura)) + Hijri (Umm al-Qura) Ikhalenda le-ISO-8601 Ikhalenda lesi-Japanese + Japanese Ikhalenda lesi-Persian + Persian Ikhalenda lesi-Minguo + Minguo Ifomethi yemali ye-Accounting + Accounting Ifomethi yemali ejwayelekile + Standard Hlela Izimpawu Hlela Ukuziba Izimpawu Hlela Izindlela Zokuphimisela Ngokujwayelekile @@ -1128,19 +1151,20 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Hlela Izinhlamvu Ezinkulu Kuqala Hlela Okungancikile Ezinkinobhweni Hlela Okuncike Ekumeni Kwezinkinobho - Ukuhlunga kwe-Traditional Chinese - Big5 Ukuhlunga Kwangaphambilini, ngokusebenzisana Uhlelo Lokuhlunga Lesichazamazwi Ukuhlunga okuzenzakalelayo kwe-Unicode + Default Unicode Uhlelo Lokuhlunga le-Emoji Imithetho Yokuhlunga ye-European - Ukuhlunga kwe-Simplified Chinese - GB2312 Ukuhlunga kwebhuku lefoni Hlela Ngokwefonetiki Ukuhlunga nge-Pinyin Usesho olujwayelekile + Sesha Sesha nge-Hangul Ongwaqa Basekuqaleni I-oda yokuhlunga ejwayelekile + Standard Ukuhlunga kwe-Stroke Ukuhlunga ngokisiko Ukuhlunga kwe-Radical-Stroke @@ -1157,18 +1181,35 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-Fullwidth Ubude obuhhafu Okwezinombolo + Default + Emoji + Umbhalo isistimu yamahora angu-12 (0-11) + 12 (0–11) isistimu yamahora angu-12 (1-12) + 12 (1–12) isistimu yamahora angu-24 (0-23) + 24 (0–23) isistimu yamahora angu-24 (1-24) + 24 (1–24) i-Line Break Style exegayo + Khulula i-Line Break Style ekahle + Okujwayelekile i-Line Break Style enomthetho oqinile + Qinile + Phula konke + Gcina konke + Okujwayelekile + Gcina emishwaneni I-BGN I-UNGEGN isistimu ye-Metric + Metric isistimu yokulinganisa ebusayo + UK isistimu yokulinganisa yase-US + US Izinombolo ze-Ahom amadijithi esi-Arabic-Indic amadijithi esi-Arabic-Indic eluliwe @@ -1251,6 +1292,8 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Izinhlazu Zezinombolo ze-Vai Izinombolo ze-Warang Citi Izinombolo ze-Wancho + Cishiwe + Vuliwe i-Metric @@ -1347,7 +1390,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - GGGGG y-MM-dd + G y-MM-dd @@ -1380,7 +1423,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM y G MMM d, y G E, MMM d, y G - h a h:mm a h:mm:ss a M/d @@ -1441,7 +1483,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM d – d - MMM d – MMM d E, MMM d – E, MMM d @@ -1691,7 +1732,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ E h:mm a E h:mm:ss a M/d/y GGGGG - h a h:mm a h:mm:ss a h:mm:ss a v @@ -1706,7 +1746,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - h a – h a h – h a @@ -1731,7 +1770,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ HH:mm – HH:mm v - h a – h a v h – h a v @@ -1751,9 +1789,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ MMM – MMM - - MMM d – MMM d - E, MMM d – E, MMM d E, MMM d – E, MMM d @@ -2770,9 +2805,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-Phnom Penh - - i-Enderbury - i-Kiritimati @@ -3434,9 +3466,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ - Isikhathi saseNtshonalanga Afrika - Isikhathi esivamile saseNtshonalanga Afrika - Isikhathi sasehlobo saseNtshonalanga Afrika + Isikhathi saseNtshonalanga Afrika @@ -3793,6 +3823,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ Isikhathi sase-Guyana + + + Isikhathi sase-Hawaii-Aleutia esijwayelekile + + Isikhathi sase-Hawaii-Aleutia @@ -4352,7 +4387,6 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤#,##0.00 - ¤ #,##0.00 ¤#,##0.00;(¤#,##0.00) @@ -4376,10 +4410,12 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ¤ 000K ¤0M ¤ 0M - ¤ 0M + ¤0M + ¤ 0M ¤00M ¤ 00M - ¤ 00M + ¤00M + ¤ 00M ¤000M ¤ 000M ¤000M @@ -4917,6 +4953,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-East Caribbean Dollar + + Caribbean guilder + Caribbean guilder + Caribbean guilders + i-West African CFA Franc i-West African CFA Franc @@ -4941,6 +4982,11 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ i-Zambian Kwacha + + Zimbabwean Gold + Zimbabwean gold + Zimbabwean gold + {0}+ @@ -5056,7 +5102,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} i-karat {0} ama-karats - + ppm @@ -5212,7 +5258,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ karats - + izingxenye/izigidi @@ -5385,7 +5431,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0}mg/dL {0}mg/dL - + {0}item {0}ppm @@ -5470,7 +5516,7 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ {0} w - {0} + {0} usuku {0} suku diff --git a/make/data/cldr/common/properties/coverageLevels.txt b/make/data/cldr/common/properties/coverageLevels.txt index e8d75b8af16..a4997d08963 100644 --- a/make/data/cldr/common/properties/coverageLevels.txt +++ b/make/data/cldr/common/properties/coverageLevels.txt @@ -9,29 +9,31 @@ af ; modern ; Afrikaans -ak ; moderate ; Akan +ak ; modern ; Akan am ; modern ; Amharic ar ; modern ; Arabic as ; modern ; Assamese ast ; basic ; Asturian az ; modern ; Azerbaijani -bal_Latn ; moderate ; Baluchi (Latin) +ba ; modern ; Bashkir +bal_Latn ; basic ; Baluchi (Latin) be ; modern ; Belarusian bg ; modern ; Bulgarian bgc ; basic ; Haryanvi bho ; basic ; Bhojpuri -blo ; basic ; Anii +blo ; moderate ; Anii bn ; modern ; Bangla br ; moderate ; Breton brx ; basic ; Bodo bs ; modern ; Bosnian bs_Cyrl ; basic ; Bosnian (Cyrillic) +bua ; basic ; Buriat ca ; modern ; Catalan ceb ; moderate ; Cebuano chr ; modern ; Cherokee cs ; modern ; Czech csw ; basic ; Swampy Cree -cv ; basic ; Chuvash +cv ; modern ; Chuvash cy ; modern ; Welsh da ; modern ; Danish de ; modern ; German @@ -40,7 +42,7 @@ dsb ; modern ; Lower Sorbian ee ; basic ; Ewe el ; modern ; Greek en ; modern ; English -eo ; basic ; Esperanto +eo ; moderate ; Esperanto es ; modern ; Spanish et ; modern ; Estonian eu ; modern ; Basque @@ -77,6 +79,7 @@ ka ; modern ; Georgian kea ; basic ; Kabuverdianu kgp ; basic ; Kaingang kk ; modern ; Kazakh +kk_Arab ; modern ; Kazakh (Arabic) km ; modern ; Khmer kn ; modern ; Kannada ko ; modern ; Korean @@ -84,7 +87,7 @@ kok ; modern ; Konkani kok_Latn ; basic ; Konkani (Latin) ks ; basic ; Kashmiri ks_Deva ; basic ; Kashmiri (Devanagari) -ku ; moderate ; Kurdish +ku ; basic ; Kurdish kxv ; basic ; Kuvi kxv_Deva ; basic ; Kuvi (Devanagari) kxv_Orya ; basic ; Kuvi (Odia) @@ -119,11 +122,12 @@ or ; modern ; Odia pa ; modern ; Punjabi pcm ; modern ; Nigerian Pidgin pl ; modern ; Polish +pms ; basic ; Piedmontese ps ; modern ; Pashto pt ; modern ; Portuguese -qu ; moderate ; Quechua +qu ; modern ; Quechua raj ; basic ; Rajasthani -rm ; basic ; Romansh +rm ; modern ; Romansh ro ; modern ; Romanian ru ; modern ; Russian rw ; basic ; Kinyarwanda @@ -131,8 +135,10 @@ sa ; basic ; Sanskrit sah ; basic ; Yakut sat ; basic ; Santali sc ; moderate ; Sardinian +scn ; basic ; Sicilian sd ; modern ; Sindhi sd_Deva ; basic ; Sindhi (Devanagari) +shn ; modern ; Shan si ; modern ; Sinhala sk ; modern ; Slovak sl ; modern ; Slovenian @@ -156,6 +162,7 @@ tn ; basic ; Tswana to ; basic ; Tongan tr ; modern ; Turkish tt ; moderate ; Tatar +tyv ; basic ; Tuvinian ug ; basic ; Uyghur uk ; modern ; Ukrainian ur ; modern ; Urdu diff --git a/make/data/cldr/common/supplemental/attributeValueValidity.xml b/make/data/cldr/common/supplemental/attributeValueValidity.xml index 10f314f7fd3..33158da3595 100644 --- a/make/data/cldr/common/supplemental/attributeValueValidity.xml +++ b/make/data/cldr/common/supplemental/attributeValueValidity.xml @@ -65,7 +65,7 @@ aa ab agq ak an ann apc arn asa - ba bal bas bem bew bez bgn blt bm bo bss byn + ba bal bas bem bew bez bgn blt bm bo bqi bss byn bua cad cch ccp ce cgg cho cic ckb co cop cu dav dje dua dv dyo dz ebu ee ewo @@ -74,15 +74,15 @@ haw hnj ht ii io iu jbo jgo jmc - kaa kab kaj kam kcg kde ken khq ki kkj kl kln kpe ksb ksf ksh kw - la lag lg lkt lld ln lrc ltg lu luo luy - mas mdf mer mfe mhn mg mgh mgo mic moh mua mus myv mzn - naq nb nd nmg nnh nr nso nus nv ny nyn om - os osa - pap pis + kaa kab kaj kam kcg kde kek ken khq ki kkj kl kln kpe ksb ksf ksh kw + la lag lg lkt lld ln lrc ltg lu luo luy lzz + mas mdf mer mfe mhn mg mgh mgo mic moh mua mus mww myv mzn + nan naq nb nd nmg nnh nr nso nus nv ny nyn om + oka os osa + pap pi pis pms quc rhg rif rn rof rw rwk - saq sbp scn sdh se seh ses sg shi shn sid skr sma smj smn sms sn ss ssy st + saq sbp scn sdh se seh ses sg sgs shi shn sid skr sma smj smn sms sn ss ssy st suz teo tig tn tok tpi trv trw ts twq tyv tzm vai ve vo vun wa wae wal wbp @@ -146,7 +146,7 @@ Maldivian Mongolian Oriya Pashto Persian Pinyin Russian Serbian Simplified Syriac Tamil Telugu Thai ThaiLogical Turkmen Ukrainian Uzbek az ch cs cs_FONIPA dsb el es es_419 es_FONIPA it ja_Latn la lt nl pl pl_FONIPA ro ro_FONIPA ru sk sk_FONIPA tlh tr ug uz_Cyrl yo zh_Latn_PINYIN ASCII Accents Armenian Bengali Bopomofo CanadianAboriginal ConjoiningJamo Devanagari Ethiopic Gujarati Gurmukhi Halfwidth Hangul InterIndic Jamo Kannada - Katakana Latin Lower Malayalam NumericPinyin Oriya Publishing Spacedhan Tamil Telugu Thaana Thai ThaiLogical ThaiSemi Title Traditional Upper + Katakana Latin Lower Malayalam NumericPinyin Oriya Publishing Spacedhan Sunuwar Tamil Telugu Thaana Thai ThaiLogical ThaiSemi Title Traditional Upper XSampa am ch_FONIPA cs_FONIPA dsb_FONIPA es_419_FONIPA es_FONIPA ja ko la_FONIPA pl_FONIPA ro_FONIPA ru sk_FONIPA tlh_FONIPA uz_Latn yo_BJ zh $alt $integer @@ -193,7 +193,6 @@ [0-9]+ $_bcp47_keys $_script - $_region $localeOrDeprecated $_variant diff --git a/make/data/cldr/common/supplemental/coverageLevels.xml b/make/data/cldr/common/supplemental/coverageLevels.xml index 2db941b8529..58ce64dd3ba 100644 --- a/make/data/cldr/common/supplemental/coverageLevels.xml +++ b/make/data/cldr/common/supplemental/coverageLevels.xml @@ -8,6 +8,7 @@ For terms of use, see http://www.unicode.org/copyright.html @@ -54,9 +55,9 @@ For terms of use, see http://www.unicode.org/copyright.html - + - + @@ -68,9 +69,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - - + + @@ -81,7 +81,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -100,7 +100,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -108,7 +108,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -124,31 +124,33 @@ For terms of use, see http://www.unicode.org/copyright.html + - - + + - + - + + - + @@ -159,27 +161,24 @@ For terms of use, see http://www.unicode.org/copyright.html - + + - - - - - - - - + + + + @@ -230,38 +229,14 @@ For terms of use, see http://www.unicode.org/copyright.html - - - - - - - - - + + + + - - + + @@ -991,6 +1029,7 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni + @@ -1022,41 +1061,48 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni - + + + + + + + + + + + + + + + + + @@ -1084,78 +1130,142 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1163,18 +1273,33 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni + + + + + + + + + + + + + + + @@ -1187,12 +1312,22 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni + + + + + + + + + + @@ -1205,125 +1340,216 @@ modern //ldml/units/unitLength[@type="long"]/unit[@type="speed-light-speed"]/uni + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/make/data/cldr/common/supplemental/dayPeriods.xml b/make/data/cldr/common/supplemental/dayPeriods.xml index a19e6779d87..256230d80b5 100644 --- a/make/data/cldr/common/supplemental/dayPeriods.xml +++ b/make/data/cldr/common/supplemental/dayPeriods.xml @@ -13,13 +13,13 @@ - - - - - - - + + + + + + + @@ -52,13 +52,13 @@ - - - - - - - + + + + + + + @@ -68,29 +68,21 @@ - - - - - - - + + + + + + + - - - - - - - - - - - - - - - + + + + + + + @@ -122,14 +114,6 @@ - - - - - - - - @@ -146,13 +130,13 @@ - - - - - - - + + + + + + + @@ -162,14 +146,6 @@ - - - - - - - - @@ -187,29 +163,21 @@ - - - - - - - + + + + + + + - - - - - - - - - - - - - - - + + + + + + + @@ -220,23 +188,14 @@ - - - - - - - - - - - - - - - - - + + + + + + + + @@ -247,14 +206,6 @@ - - - - - - - - @@ -271,21 +222,6 @@ - - - - - - - - - - - - - - - @@ -294,13 +230,21 @@ - + + + + + + + + + @@ -351,14 +295,6 @@ - - - - - - - - @@ -366,7 +302,7 @@ - + @@ -378,12 +314,12 @@ - - - - - - + + + + + + @@ -396,13 +332,6 @@ - - - - - - - @@ -430,23 +359,14 @@ - - - - - - - - - - - - - - - - - + + + + + + + + @@ -536,22 +456,6 @@ - - - - - - - - - - - - - - - - @@ -578,30 +482,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -635,14 +515,6 @@ - - - - - - - - @@ -663,22 +535,6 @@ - - - - - - - - - - - - - - - - @@ -693,11 +549,11 @@ - - - - - + + + + + @@ -705,12 +561,6 @@ - - - - - - @@ -727,12 +577,12 @@ - - - - - - + + + + + + @@ -741,24 +591,17 @@ - - - - - - + + + + + - - - - - - - - - - - + + + + + @@ -786,12 +629,6 @@ - - - - - - @@ -804,29 +641,23 @@ - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - + + + + + @@ -835,19 +666,12 @@ - - - - - - - - - - - - - + + + + + + @@ -876,18 +700,6 @@ - - - - - - - - - - - - @@ -908,12 +720,6 @@ - - - - - - @@ -934,12 +740,6 @@ - - - - - - @@ -948,7 +748,7 @@ - + @@ -991,12 +791,6 @@ - - - - - - @@ -1006,21 +800,7 @@ - - - - - - - - - - - - - - - + @@ -1058,18 +838,6 @@ - - - - - - - - - - - - @@ -1148,18 +916,6 @@ - - - - - - - - - - - - @@ -1174,12 +930,6 @@ - - - - - - @@ -1188,12 +938,6 @@ - - - - - - @@ -1217,18 +961,6 @@ - - - - - - - - - - - - diff --git a/make/data/cldr/common/supplemental/languageGroup.xml b/make/data/cldr/common/supplemental/languageGroup.xml index d3d4a89e290..c6d165124a3 100644 --- a/make/data/cldr/common/supplemental/languageGroup.xml +++ b/make/data/cldr/common/supplemental/languageGroup.xml @@ -1,6 +1,6 @@ - + + + + + diff --git a/make/data/cldr/common/supplemental/likelySubtags.xml b/make/data/cldr/common/supplemental/likelySubtags.xml index 8b87d7e23d7..76e215255fd 100644 --- a/make/data/cldr/common/supplemental/likelySubtags.xml +++ b/make/data/cldr/common/supplemental/likelySubtags.xml @@ -16,15 +16,20 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + + + @@ -112,7 +117,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -123,9 +128,15 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + + + + @@ -142,6 +153,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -248,7 +260,9 @@ not be patched by hand, as any changes made in that fashion may be lost. + + @@ -305,10 +319,13 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + @@ -334,6 +351,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -350,6 +368,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -364,6 +383,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -375,14 +395,23 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + + + + + + + @@ -398,6 +427,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -418,6 +448,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -441,7 +472,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -450,6 +481,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -459,7 +491,10 @@ not be patched by hand, as any changes made in that fashion may be lost. - + + + + @@ -469,7 +504,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -484,6 +519,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -505,9 +541,11 @@ not be patched by hand, as any changes made in that fashion may be lost. + + @@ -574,7 +612,17 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + + + + + + + + @@ -585,10 +633,11 @@ not be patched by hand, as any changes made in that fashion may be lost. + + - @@ -597,6 +646,8 @@ not be patched by hand, as any changes made in that fashion may be lost. + + @@ -673,6 +724,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -685,10 +737,13 @@ not be patched by hand, as any changes made in that fashion may be lost. + + + - + @@ -720,7 +775,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -742,6 +797,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -751,7 +807,9 @@ not be patched by hand, as any changes made in that fashion may be lost. + + @@ -767,6 +825,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -802,6 +861,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -812,6 +872,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -848,7 +909,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -884,7 +944,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -1026,7 +1086,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -1080,6 +1140,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1101,7 +1162,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -1160,7 +1220,14 @@ not be patched by hand, as any changes made in that fashion may be lost. - + + + + + + + + @@ -1169,7 +1236,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -1178,6 +1245,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1192,7 +1260,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -1254,7 +1321,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -1282,6 +1348,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1299,6 +1366,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1312,6 +1380,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1376,7 +1445,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -1411,6 +1479,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1445,7 +1514,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -1635,6 +1703,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -1934,6 +2003,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -2095,7 +2165,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -2273,14 +2343,12 @@ not be patched by hand, as any changes made in that fashion may be lost. - - @@ -2296,15 +2364,11 @@ not be patched by hand, as any changes made in that fashion may be lost. - - - - @@ -2350,6 +2414,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -2412,7 +2477,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -2420,7 +2484,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -2567,7 +2631,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -2606,7 +2670,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -2635,7 +2698,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -3163,7 +3226,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3245,7 +3307,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -3323,6 +3385,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -3517,7 +3580,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3526,7 +3588,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3535,7 +3596,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3689,7 +3749,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -3730,7 +3790,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3779,7 +3838,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -3819,7 +3878,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -3918,7 +3976,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4030,7 +4087,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4127,6 +4183,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -4167,7 +4224,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4303,7 +4359,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4436,6 +4491,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -4471,7 +4527,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4565,7 +4620,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4692,7 +4746,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4711,7 +4764,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4726,7 +4778,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -4749,6 +4801,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -4770,7 +4823,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -4823,6 +4875,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -4851,7 +4904,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -5347,7 +5399,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -5363,7 +5414,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -5401,6 +5452,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -5576,6 +5628,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -5649,7 +5702,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -5669,7 +5721,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -5756,11 +5807,9 @@ not be patched by hand, as any changes made in that fashion may be lost. - - @@ -5861,13 +5910,11 @@ not be patched by hand, as any changes made in that fashion may be lost. - - @@ -6170,6 +6217,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -6288,7 +6336,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -6465,7 +6512,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -6738,7 +6785,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -6797,7 +6843,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + @@ -6823,7 +6869,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -6835,7 +6880,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -6935,7 +6979,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -7274,7 +7317,6 @@ not be patched by hand, as any changes made in that fashion may be lost. - @@ -7539,6 +7581,7 @@ not be patched by hand, as any changes made in that fashion may be lost. + @@ -7681,7 +7724,7 @@ not be patched by hand, as any changes made in that fashion may be lost. - + diff --git a/make/data/cldr/common/supplemental/metaZones.xml b/make/data/cldr/common/supplemental/metaZones.xml index 9a610defca1..710934fef81 100644 --- a/make/data/cldr/common/supplemental/metaZones.xml +++ b/make/data/cldr/common/supplemental/metaZones.xml @@ -146,8 +146,9 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + + @@ -187,7 +188,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -645,6 +646,9 @@ For terms of use, see http://www.unicode.org/copyright.html + + + @@ -779,7 +783,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -809,8 +813,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + @@ -825,8 +829,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + @@ -840,22 +844,21 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + - - - + + @@ -865,7 +868,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -894,6 +897,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -939,10 +943,9 @@ For terms of use, see http://www.unicode.org/copyright.html - @@ -982,7 +985,8 @@ For terms of use, see http://www.unicode.org/copyright.html - + + @@ -1030,7 +1034,9 @@ For terms of use, see http://www.unicode.org/copyright.html - + + + @@ -1049,17 +1055,18 @@ For terms of use, see http://www.unicode.org/copyright.html + - - + + - - + + @@ -1071,10 +1078,9 @@ For terms of use, see http://www.unicode.org/copyright.html - @@ -1100,8 +1106,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + @@ -1180,6 +1186,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -1206,15 +1213,15 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + - - + + @@ -1232,8 +1239,8 @@ For terms of use, see http://www.unicode.org/copyright.html - - + + @@ -1322,6 +1329,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -1348,6 +1356,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -1365,7 +1374,8 @@ For terms of use, see http://www.unicode.org/copyright.html - + + @@ -1454,8 +1464,7 @@ For terms of use, see http://www.unicode.org/copyright.html - - + @@ -1743,7 +1752,8 @@ For terms of use, see http://www.unicode.org/copyright.html - + + @@ -1926,6 +1936,7 @@ For terms of use, see http://www.unicode.org/copyright.html + diff --git a/make/data/cldr/common/supplemental/numberingSystems.xml b/make/data/cldr/common/supplemental/numberingSystems.xml index 13b3ad5b7eb..e0bdfe12b5c 100644 --- a/make/data/cldr/common/supplemental/numberingSystems.xml +++ b/make/data/cldr/common/supplemental/numberingSystems.xml @@ -101,6 +101,7 @@ For terms of use, see http://www.unicode.org/copyright.html + diff --git a/make/data/cldr/common/supplemental/ordinals.xml b/make/data/cldr/common/supplemental/ordinals.xml index a6636b8df25..c8ea54b9386 100644 --- a/make/data/cldr/common/supplemental/ordinals.xml +++ b/make/data/cldr/common/supplemental/ordinals.xml @@ -1,7 +1,7 @@ - + @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @@ -57,11 +57,11 @@ CLDR data files are interpreted according to the LDML specification (http://unic n % 10 = 6 or n % 10 = 9 or n % 10 = 0 and n != 0 @integer 6, 9, 10, 16, 19, 20, 26, 29, 30, 36, 39, 40, 100, 1000, 10000, 100000, 1000000, … @integer 0~5, 7, 8, 11~15, 17, 18, 21, 101, 1001, … - + n = 11,8,80,800 @integer 8, 11, 80, 800 @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, … - + n = 11,8,80..89,800..899 @integer 8, 11, 80~89, 800~803 @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, … @@ -101,7 +101,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic n % 10 = 3 and n % 100 != 13 @integer 3, 23, 33, 43, 53, 63, 73, 83, 103, 1003, … @integer 0, 4~18, 100, 1000, 10000, 100000, 1000000, … - + n = 1 @integer 1 n = 2,3 @integer 2, 3 n = 4 @integer 4 diff --git a/make/data/cldr/common/supplemental/plurals.xml b/make/data/cldr/common/supplemental/plurals.xml index 9b1100a2832..26cca25551f 100644 --- a/make/data/cldr/common/supplemental/plurals.xml +++ b/make/data/cldr/common/supplemental/plurals.xml @@ -1,7 +1,7 @@ - + i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04 @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … @@ -27,7 +27,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic i = 0,1 @integer 0, 1 @decimal 0.0~1.5 @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … - + i = 1 and v = 0 @integer 1 @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … @@ -76,12 +76,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic i = 0,1 and n != 0 @integer 1 @decimal 0.1~1.6 @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … - - n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000 - n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000 - @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … - - + n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000 n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000 @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … @@ -197,6 +192,13 @@ CLDR data files are interpreted according to the LDML specification (http://unic + + n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, … + n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000 + n != 2 and n % 10 = 2..9 and n % 100 != 11..19 @integer 3~9, 22~29, 32, 102, 1002, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 22.0, 102.0, 1002.0, … + f != 0 @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, … + @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, … + n % 10 = 1 and n % 100 != 11,71,91 @integer 1, 21, 31, 41, 51, 61, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 81.0, 101.0, 1001.0, … n % 10 = 2 and n % 100 != 12,72,92 @integer 2, 22, 32, 42, 52, 62, 82, 102, 1002, … @decimal 2.0, 22.0, 32.0, 42.0, 52.0, 62.0, 82.0, 102.0, 1002.0, … diff --git a/make/data/cldr/common/supplemental/rgScope.xml b/make/data/cldr/common/supplemental/rgScope.xml index d7731d7949e..06469310947 100644 --- a/make/data/cldr/common/supplemental/rgScope.xml +++ b/make/data/cldr/common/supplemental/rgScope.xml @@ -8,21 +8,21 @@ For terms of use, see http://www.unicode.org/copyright.html - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/make/data/cldr/common/supplemental/subdivisions.xml b/make/data/cldr/common/supplemental/subdivisions.xml index db8fbad9213..47b17e85213 100644 --- a/make/data/cldr/common/supplemental/subdivisions.xml +++ b/make/data/cldr/common/supplemental/subdivisions.xml @@ -1,7 +1,7 @@ @@ -1188,6 +1191,7 @@ The printed version of ISO-4217:2001 + @@ -1277,38 +1281,28 @@ XXX Code for transations where no currency is involved - - + - - - - - - - - - - + @@ -1316,91 +1310,64 @@ XXX Code for transations where no currency is involved - - - - + + - - - - - - - - - - - + + + - - + - + - - + - - + - - - - - + - - - - - - + - - - - - @@ -1408,42 +1375,35 @@ XXX Code for transations where no currency is involved - - - + - - - + - - + - + + - - + - - - + @@ -1451,19 +1411,15 @@ XXX Code for transations where no currency is involved - - - - + - - + @@ -1473,11 +1429,10 @@ XXX Code for transations where no currency is involved - - + @@ -1485,249 +1440,190 @@ XXX Code for transations where no currency is involved - - - - + - - - - - + - - - + + - + - - - - + - + - + - - + - - - - - + + + - - + - + - - - + - - - + - - - + - - + + - - + + - - - + + - - - - - - - - + - - - - - - + - - - + - - + + - - + - - - - + - - - - + + - - - - - - + + + + - - - - - + - + - - - + - - - - + + - - + - - + - - + - - + - - - + + - - + - @@ -1736,134 +1632,102 @@ XXX Code for transations where no currency is involved - - + + - - - - - - - - - + - - - - - + - - + - - + - - - - - - + - - - - + - - - - - + + - - + - - + - - - - + - - + - @@ -1871,518 +1735,399 @@ XXX Code for transations where no currency is involved - - - - - + - - - - + - - - - - - + - + - - - + - + - - - - + - - + + - - - - + - - + - + - - + - - - + + - + - - + - - - + + - - - + + - - + - - + + - - - - + + + - + - + - - - - + - - - - - + - - + - + - - + - - - - - - + - - - - + - - - - + + - - - - - + + - - - + + - - - + - - - - + + - + - - - - - + - - - - - + - - - + + - - + - - + - + - - - - + - - - - + - - + - - - + - - - + - - - + - - - + - - + - - + - - - - + + - - - - + + + - - - - + - - + + + - + - - - - - + + + + + - + - - + - - + - - - - - - - + + + - - + - - - - - + + - + - - - + - - + - - - - + + + - - - - - - + - + - - + - + - + - - + - - - - - - - + + - - - - + + - - - @@ -2390,29 +2135,21 @@ XXX Code for transations where no currency is involved - - - - - - - + + - - - @@ -2420,9 +2157,7 @@ XXX Code for transations where no currency is involved - - @@ -2432,36 +2167,34 @@ XXX Code for transations where no currency is involved - + - - + + - + - + - - - + + - - - + + @@ -2469,7 +2202,7 @@ XXX Code for transations where no currency is involved - + @@ -2517,8 +2250,10 @@ XXX Code for transations where no currency is involved - - + + + + @@ -2569,7 +2304,8 @@ XXX Code for transations where no currency is involved - + + @@ -2690,74 +2426,78 @@ XXX Code for transations where no currency is involved - - + + - - + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2784,7 +2524,7 @@ XXX Code for transations where no currency is involved - + @@ -2861,12 +2601,14 @@ XXX Code for transations where no currency is involved + + @@ -2970,8 +2712,11 @@ XXX Code for transations where no currency is involved + + + @@ -2998,6 +2743,7 @@ XXX Code for transations where no currency is involved + @@ -3080,6 +2826,7 @@ XXX Code for transations where no currency is involved + @@ -3110,6 +2857,7 @@ XXX Code for transations where no currency is involved + @@ -3122,7 +2870,7 @@ XXX Code for transations where no currency is involved - + @@ -3201,8 +2949,32 @@ XXX Code for transations where no currency is involved - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3228,7 +3000,8 @@ XXX Code for transations where no currency is involved - + + @@ -3392,6 +3165,7 @@ XXX Code for transations where no currency is involved + @@ -3399,7 +3173,8 @@ XXX Code for transations where no currency is involved - + + @@ -3410,8 +3185,7 @@ XXX Code for transations where no currency is involved - - + @@ -3421,6 +3195,8 @@ XXX Code for transations where no currency is involved + + @@ -3441,6 +3217,7 @@ XXX Code for transations where no currency is involved + @@ -3451,7 +3228,6 @@ XXX Code for transations where no currency is involved - @@ -3542,6 +3318,7 @@ XXX Code for transations where no currency is involved + @@ -3564,12 +3341,21 @@ XXX Code for transations where no currency is involved + - - - + + + + + + + + + + + @@ -3615,6 +3401,7 @@ XXX Code for transations where no currency is involved + @@ -3672,7 +3459,9 @@ XXX Code for transations where no currency is involved + + @@ -3686,7 +3475,7 @@ XXX Code for transations where no currency is involved - + @@ -3698,6 +3487,7 @@ XXX Code for transations where no currency is involved + @@ -3866,6 +3656,7 @@ XXX Code for transations where no currency is involved + @@ -4048,7 +3839,7 @@ XXX Code for transations where no currency is involved - + @@ -4063,6 +3854,7 @@ XXX Code for transations where no currency is involved + @@ -4172,7 +3964,7 @@ XXX Code for transations where no currency is involved - + @@ -4199,9 +3991,9 @@ XXX Code for transations where no currency is involved - - - + + + @@ -4255,8 +4047,10 @@ XXX Code for transations where no currency is involved + + @@ -4265,7 +4059,7 @@ XXX Code for transations where no currency is involved - + @@ -4277,7 +4071,7 @@ XXX Code for transations where no currency is involved - + @@ -4307,8 +4101,9 @@ XXX Code for transations where no currency is involved - + + @@ -4392,6 +4187,7 @@ XXX Code for transations where no currency is involved + @@ -4405,6 +4201,7 @@ XXX Code for transations where no currency is involved + @@ -4440,6 +4237,7 @@ XXX Code for transations where no currency is involved + @@ -4522,16 +4320,16 @@ XXX Code for transations where no currency is involved - - + + - + @@ -4764,101 +4562,106 @@ XXX Code for transations where no currency is involved - - + + + - - + + - + + - + + - + + - + + - + + - + - + - + - - + - + - + - - + + - + - + - - + + @@ -4915,7 +4718,7 @@ XXX Code for transations where no currency is involved FI FJ FO FR GB GE GF GP GR HR HU - IE IS IT + IE IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ MY @@ -4938,7 +4741,7 @@ XXX Code for transations where no currency is involved ET GT GU HK HN - ID IL IN + ID IL IN IS JM JP KE KH KR LA @@ -4993,7 +4796,7 @@ XXX Code for transations where no currency is involved + regions="AD AM AO AT AW BE BF BJ BL BR CG CI CV CW DE EE FR GA GF GN GP GW HR IL IT KZ MC MD MF MQ MZ NC NL PM PT RE RO SI SR ST TG TR WF YT ku_SY"/> @@ -5526,9 +5329,9 @@ XXX Code for transations where no currency is involved - + - + @@ -5571,7 +5374,7 @@ XXX Code for transations where no currency is involved 100k+ native, plus 1.5 mil 2nd lang speakers. For languages not customarily written, the writing population is artificially set to 5% in the absence of better information. For languages not customarily written, the writing population is artificially set to 5% in the absence of better information. English official; the figure is derived from literacy * lang pop - Canada 2021 Census language "Knowledge of Language"; official status from Wikipedia Languages_of_Canada + Regelmässig verwendete Sprachen - Percent of people that regularly use the language; literacy is mostly in standard German. For languages not customarily written, the writing population is artificially set to 5% in the absence of better information. [missing] Actually literacy in Nko writing unknown but historically they used the Latin script English official, the figure is derived from literacy * lang pop @@ -5593,6 +5396,7 @@ XXX Code for transations where no currency is involved [missing] German official 2020 Russian Census + 2022 Census Used CIA literacy figure times population, added 'Vlaams' population [missing] 70,000 in 1991, 100,000 who understand it, but do not speak it ; ethnic pop 530,000 in 2002 @@ -5624,7 +5428,7 @@ XXX Code for transations where no currency is involved The figure is from Wikipedia article on http://en.wikipedia.org/wiki/List_of_countries_by_English-speaking_population The figure is from Wikipedia article on English-speaking populations [missing] The figure is from Wikipedia article on English-speaking populations - Lang pop est, CIA factbook 15-20% country pop + Precise data not available -- listed with 2 speakers as a tie-breaker CIA Factbook [missing] CIA Factbook. See also http://www.jsmp.minihub.org/Reports/jsmpreports/Language%20Report/LanguageReport(english).pdf @@ -5635,6 +5439,7 @@ XXX Code for transations where no currency is involved English (official, primary language of commerce, administration, and higher education) Ethnologue lists 1 million 2nd lang users of English; no other good figures found. also: http://en.wikipedia.org/wiki/Bosnian_language + [missing] 2021 Census, counting people who are fluent in the language 5% writing pop estimated in absence of other data [missing] @@ -5674,17 +5479,20 @@ XXX Code for transations where no currency is involved Latin script official, used 98.8% of pop * 90% for the usage figure - five eastern provinces of the DRC are Swahili speaking. Nearly half the 66 million Congolese speak it. [missing] + 2022 Census number of people in Ethnic group [missing] [missing] - Most educated Kenyans are able to communicate fluently in Swahili, since it is a compulsory subject in school [missing] [missing] + 2019 Belarus Census English is the first language learned by half the children by the time they reach preschool age; using 92.6% of pop for the English figure Organisation internationale de la Francophonie Meta-study. Data from 2012 and 2016 Eurostat studies on first and second language usage across Europe - 90 percent of approximately 39 million Tanzanians speak Swahili - Baganda generally don't speak Swahili, but it is in common use among the 25 million people elsewhere in the country, and is currently being implemented in schools nationwide (use 75% of Cpop for this figure) [missing] [missing] + Salminen, T. (2007). Europe and North Asia. In Encyclopedia of the world’s endangered languages (pp. 211-280). Routledge. http://www.ofis-bzh.org/fr/langue_bretonne/chiffres_cles/index.php France blocks other languages in state schools; 1.4% attended Breton schools and 3% is estimated as family transmission rate 15.8% of population The 2008 estimate is ~2000 speakers due to revival efforts @@ -5708,13 +5516,16 @@ XXX Code for transations where no currency is involved Spoken by 70% of population, assumed to use Arabic script in Pakistan Reported to be (regional) official in Chuvashia, central Russia: taught at schools. However: http://cv.wikipedia.org/ Chuvash Wikipedia on-line. [missing] + 2022 Belize Census 'A lingua franca and a first language for 10% of the population but understood by 95%' http://en.wikipedia.org/wiki/Krio_language Dutch is spoken as a mother tongue by about 60% of the Surinamese, while most others speak it as a second or third language. main language of trade and comm. in Isan region, except ... media where it gives way to Thai; now largely an unwritten language. 10% writing pop estimated in absence of other data - primarily written using an Arabic-derived alphabet and https://islandstudies.com/files/2016/11/Guernsey-Herm-Sark.pdf - extrapolated GDP from per capita x population understood by 10 million, perhaps. Figure is questionable writing pop artificially set to 5% see also: http://en.wikipedia.org/wiki/Low_German (understood by 10 million people, and native to about 3 million people all around northern Germany) + 2018 Census, counting both maternal and secondary language usage See the 2006 language survey data for 2nd langs = Shimaore + 2018 Census, counting both maternal and secondary language usage. Co-official in Sacatepéquez Common lingua franca, widely used. High literacy. but subtracting 270,000 per https://en.wikipedia.org/wiki/Swiss_Italian [missing] @@ -5771,7 +5582,7 @@ XXX Code for transations where no currency is involved [missing] English official in education, 36.1% 2000 census no other info available for now - https://www.cia.gov/cia/publications/factbook/geos/gt.html Spanish official + [missing] language also called Kamta in India Modern use of Arabic (Jawi) seems to be minimal, but is co-official with ms; set to 5% for now. [missing] @@ -5796,6 +5607,7 @@ XXX Code for transations where no currency is involved population figure from CLDR-17483 ticket No Data Available at present. co-official in South Tyrol + 2018 Census, counting both maternal and secondary language usage. Co-official in Quiché and Totonicapán in Trieste and Gorizia [missing] Information on the Latin/Cyrillic script percentages for Montenegro not currently found. @@ -5814,7 +5626,7 @@ XXX Code for transations where no currency is involved http://en.wikipedia.org/wiki/Akademio_Internacia_de_la_Sciencoj_San_Marino - estimate 100% of the academy can use Esperanto; the language is used as 1st language of instruction; academy has 300 """"""""""""""""""""""""""""""""members"""""""""""""""""""""""""""""""". recognized in West Java Mainly unwritten - Vai script is the main script for this language. + 2018 Census, counting both maternal and secondary language usage. Co-official in Quiché Latin listed as being used (Scriptsource) but no pop figures available. 2011 Census -- the language is not distinguished in the 2021 census but no literacy data @@ -5832,7 +5644,7 @@ XXX Code for transations where no currency is involved No figures available for this language. Estimating at 5%. [missing] [missing] - [missing] + [missing] - near-zero Azeri population in last census http://en.wikipedia.org/wiki/Azerbaijanis_in_Armenia#Current_situation No figures available for breakdown of Latin vs. N'Ko for Bambara. The 2% figure is an estimate. pop 13k. Figure is questionable writing pop artificially set to 5% see also http://en.wikipedia.org/wiki/Upper_Sorbian @@ -5855,7 +5667,7 @@ XXX Code for transations where no currency is involved [missing] [missing] syr is a macrolang containing cld and aii) - [missing] + [missing] [missing] [missing] [missing] @@ -5872,7 +5684,9 @@ XXX Code for transations where no currency is involved [missing] [missing] Mainly in Guangdong Prov, ~70-80 million. Script unspecified so both listed + 2018 Census, counting both maternal and secondary language usage. Co-official in Chiquimula Analyzed from 2011 UK census and other sources + 2018 Census, counting both maternal and secondary language usage. Co-official in Suchitepéquez 2014 Maldives: 98% literacy in Divehi, 75% in English [missing] [missing] @@ -5887,7 +5701,7 @@ XXX Code for transations where no currency is involved Organisation internationale de la Francophonie Meta-study. Data from 1994 study Organisation internationale de la Francophonie Meta-study. Data from 2009 and 2012 studies Regelmässig verwendete Sprachen - Percent of people that regularly use the language - Regelmässig verwendete Sprachen - Percent of people that regularly use the language; literacy is mostly in standard German. For languages not customarily written, the writing population is artificially set to 5% in the absence of better information." + Latin alphabet usage for Kurdish also present but actual amount unknown Organisation internationale de la Francophonie Meta-study. Data from 2014 census Organisation internationale de la Francophonie Meta-study. Data from 2010 questionnaire Organisation internationale de la Francophonie Meta-study. Data from 2008 Census @@ -5912,5 +5726,23 @@ XXX Code for transations where no currency is involved Organisation internationale de la Francophonie Meta-study. Data from 2014 Organisation internationale de la Francophonie Meta-study. Data from 2010 census Organisation internationale de la Francophonie Meta-study. Data from 2007 Census + 1998 SIL study, cited in Ethnologue + from Instituto Cervantes 2021 + from 2013 Honduras census + Canada 2021 Census language 'Knowledge of Language'; official status from Wikipedia Languages_of_Canada + Regis, Riccardo. 'Su pianificazione, standardizzazione, polinomia: due esempi' Zeitschrift für romanische Philologie, vol. 128, no. 1, 2012, pp. 88-133. + Number & script usage hard to pin down because of many speakers in contested Nagorno Karabakh region. + Latin alphabet usage also present but exact breakdown unknown + Cyrillic usage for Kurdish may no longer be as dominant but it used to be + citation from 2016 + 2026 citation + Citation from 2016 + [missing] + [missing] + [missing] + [missing] + [missing] + [missing] + Leclerc (2014) diff --git a/make/data/cldr/common/supplemental/supplementalMetadata.xml b/make/data/cldr/common/supplemental/supplementalMetadata.xml index d8e5052adef..4f1f1804fdd 100644 --- a/make/data/cldr/common/supplemental/supplementalMetadata.xml +++ b/make/data/cldr/common/supplemental/supplementalMetadata.xml @@ -304,7 +304,6 @@ For terms of use, see http://www.unicode.org/copyright.html - @@ -552,6 +551,10 @@ For terms of use, see http://www.unicode.org/copyright.html + + + + @@ -1527,6 +1530,7 @@ For terms of use, see http://www.unicode.org/copyright.html + @@ -1880,8 +1884,8 @@ For terms of use, see http://www.unicode.org/copyright.html aa_ET ab_GE af_ZA agq_CM ak_GH am_ET an_ES ann_NG apc_SY ar_001 arn_CL as_IN asa_TZ ast_ES az_Arab_IR az_Cyrl_AZ az_Latn az_Latn_AZ ba_RU bal_Arab bal_Arab_PK bal_Latn_PK bas_CM be_BY bem_ZM bew_ID bez_TZ bg_BG - bgc_IN bgn_PK bho_IN blo_BJ blt_VN bm_ML bm_Nkoo_ML bn_BD bo_CN br_FR brx_IN - bs_Cyrl_BA bs_Latn bs_Latn_BA bss_CM byn_ER + bgc_IN bgn_PK bho_IN blo_BJ blt_VN bm_ML bm_Nkoo_ML bn_BD bo_CN bqi_IR br_FR brx_IN + bs_Cyrl_BA bs_Latn bs_Latn_BA bss_CM bua_RU byn_ER ca_ES cad_US cch_NG ccp_BD ce_RU ceb_PH cgg_UG cho_US chr_US cic_US ckb_IQ co_FR cop_EG cs_CZ csw_CA cu_RU cv_RU cy_GB da_DK dav_KE de_DE dje_NE doi_IN dsb_DE dua_CM dv_MV dyo_SN dz_BT @@ -1893,27 +1897,28 @@ For terms of use, see http://www.unicode.org/copyright.html hsb_DE ht_HT hu_HU hy_AM ia_001 id_ID ie_EE ife_TG ig_NG ii_CN io_001 is_IS it_IT iu_CA iu_Latn_CA ja_JP jbo_001 jgo_CM jmc_TZ jv_ID - ka_GE kaa_Cyrl kaa_Cyrl_UZ kaa_Latn_UZ kab_DZ kaj_NG kam_KE kcg_NG kde_TZ kea_CV ken_CM kgp_BR + ka_GE kaa_Cyrl kaa_Cyrl_UZ kaa_Latn_UZ kab_DZ kaj_NG kam_KE kcg_NG kde_TZ kea_CV kek_GT ken_CM kgp_BR khq_ML ki_KE kk_Arab_CN kk_Cyrl kk_Cyrl_KZ kkj_CM kl_GL kln_KE km_KH kn_IN ko_KR kok_Deva kok_Deva_IN kok_Latn_IN kpe_LR ks_Arab - ks_Arab_IN ks_Deva_IN ksb_TZ ksf_CM ksh_DE ku_TR kw_GB kxv_Deva_IN kxv_Latn + ks_Arab_IN ks_Deva_IN ksb_TZ ksf_CM ksh_DE ku_Arab_IQ ku_Latn ku_Latn_TR kw_GB kxv_Deva_IN kxv_Latn kxv_Latn_IN kxv_Orya_IN kxv_Telu_IN ky_KG la_VA lag_TZ lb_LU lg_UG lij_IT lkt_US lld_IT lmo_IT ln_CD lo_LA lrc_IR - lt_LT ltg_LV lu_CD luo_KE luy_KE lv_LV + lt_LT ltg_LV lu_CD luo_KE luy_KE lv_LV lzz_TR mai_IN mas_KE mdf_RU mer_KE mfe_MU mg_MG mgh_MZ mgo_CM mhn_IT mi_NZ mic_CA mk_MK ml_IN mn_MN mn_Mong_CN mni_Beng mni_Beng_IN mni_Mtei_IN moh_CA mr_IN ms_Arab_MY ms_MY - mt_MT mua_CM mus_US my_MM myv_RU mzn_IR + mt_MT mua_CM mus_US mww_Hmnp mww_Hmnp_US my_MM myv_RU mzn_IR naq_NA nb nb_NO nd_ZW nds_DE ne_NP nl_NL nmg_CM nn_NO nnh_CM nqo_GN nr_ZA nso_ZA nus_SS nv_US ny_MW nyn_UG - oc_FR om_ET or_IN os_GE osa_US - pa_Arab_PK pa_Guru pa_Guru_IN pap_CW pcm_NG pis_SB pl_PL prg_PL ps_AF pt_BR + oc_FR oka_CA om_ET or_IN os_GE osa_US + pa_Arab_PK pa_Guru pa_Guru_IN pap_CW pcm_NG pi_Latn pi_Latn_GB pis_SB pl_PL pms_IT prg_PL ps_AF pt_BR qu_PE quc_GT raj_IN rhg_Rohg rhg_Rohg_MM rif_MA rm_CH rn_BI ro_RO rof_TZ ru_RU rw_RW rwk_TZ sa_IN sah_RU saq_KE sat_Deva_IN sat_Olck sat_Olck_IN sbp_TZ sc_IT scn_IT - sd_Arab sd_Arab_PK sd_Deva_IN sdh_IR se_NO seh_MZ ses_ML sg_CF shi_Latn_MA + sd_Arab sd_Arab_PK sd_Deva_IN sdh_IR se_NO seh_MZ ses_ML sg_CF sgs_LT shi_Latn_MA shi_Tfng shi_Tfng_MA shn_MM si_LK sid_ET sk_SK skr_PK sl_SI sma_SE smj_SE smn_FI sms_FI sn_ZW so_SO sq_AL sr_Cyrl sr_Cyrl_RS sr_Latn_RS ss_ZA ssy_ER + suz_Deva suz_Sunu_NP suz_Deva_NP st_ZA su_Latn su_Latn_ID sv_SE sw_TZ syr_IQ szl_PL ta_IN te_IN teo_UG tg_TJ th_TH ti_ET tig_ER tk_TM tn_ZA to_TO tok_001 tpi_PG tr_TR trv_TW trw_PK ts_ZA tt_RU twq_NE tyv_RU tzm_MA diff --git a/make/data/cldr/common/supplemental/units.xml b/make/data/cldr/common/supplemental/units.xml index 747b5d79ee5..89b8524a69b 100644 --- a/make/data/cldr/common/supplemental/units.xml +++ b/make/data/cldr/common/supplemental/units.xml @@ -136,7 +136,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -181,10 +181,12 @@ For terms of use, see http://www.unicode.org/copyright.html + + @@ -215,7 +217,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + @@ -265,12 +267,11 @@ For terms of use, see http://www.unicode.org/copyright.html - - - - - - + + + + + @@ -621,15 +622,17 @@ For terms of use, see http://www.unicode.org/copyright.html - + + + + + - + diff --git a/make/data/cldr/common/supplemental/windowsZones.xml b/make/data/cldr/common/supplemental/windowsZones.xml index 7ec2ab619ad..26a62c3f064 100644 --- a/make/data/cldr/common/supplemental/windowsZones.xml +++ b/make/data/cldr/common/supplemental/windowsZones.xml @@ -235,7 +235,7 @@ For terms of use, see http://www.unicode.org/copyright.html - + diff --git a/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java b/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java index c4aaa28193a..a181625c293 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java @@ -541,9 +541,12 @@ class Bundle { pattern = (String) parentsMap.remove(key); } if (pattern != null) { + // escape reserved chars, excluding date/time patterns, eg, "{1} {0}" + String transPattern = key.endsWith("-dateTime") ? pattern : escapeReservedChars(pattern); + // Perform date-time format pattern conversion which is // applicable to both SimpleDateFormat and j.t.f.DateTimeFormatter. - String transPattern = translateDateFormatLetters(calendarType, key, pattern, this::convertDateTimePatternLetter); + transPattern = translateDateFormatLetters(calendarType, key, transPattern, this::convertDateTimePatternLetter); dateTimePatterns.add(i, transPattern); // Additionally, perform SDF specific date-time format pattern conversion sdfPatterns.add(i, translateDateFormatLetters(calendarType, key, transPattern, this::convertSDFLetter)); @@ -780,7 +783,7 @@ class Bundle { e -> calendarPrefix + e.getKey(), e -> translateDateFormatLetters(calendarType, e.getKey(), - (String)e.getValue(), + escapeReservedChars((String)e.getValue()), this::convertDateTimePatternLetter) )) ); @@ -844,4 +847,39 @@ class Bundle { )) ); } + + /** + * Escape reserved pattern characters or optional start/ends, + * '#', '{', '}', '[', and ']' in the pattern string. + * + * @param pattern original pattern string + * @return escaped pattern string + * @see DateTimeFormatterBuilder#appendPattern + */ + private static String escapeReservedChars(String pattern) { + StringBuilder out = new StringBuilder(); + boolean inQuote = false; + + for (int i = 0; i < pattern.length(); i++) { + char c = pattern.charAt(i); + if (c == '\'') { + if (i + 1 < pattern.length() && pattern.charAt(i + 1) == '\'') { + // single quote literal + out.append("''"); + i++; + } else { + inQuote = !inQuote; + out.append(c); + } + } else if (!inQuote && + (c == '#' || c == '{' || c == '}' || c == '[' || c == ']')) { + // escape the reserved char + out.append('\'').append(c).append('\''); + } else { + out.append(c); + } + } + + return out.toString(); + } } diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java b/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java index c6016c7cb8f..e2fdb103669 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -42,43 +42,53 @@ class CopyrightHeaders { " * Copyright (c) 2012, %d, Oracle and/or its affiliates. All rights reserved.\n" + " */\n"; - // Last updated: - 4/06/2022 + // Last updated: - 11/03/2025 private static final String UNICODE = - "/*\n" + - " * COPYRIGHT AND PERMISSION NOTICE\n" + - " *\n" + - " * Copyright (c) 1991-2022 Unicode, Inc. All rights reserved.\n" + - " * Distributed under the Terms of Use in https://www.unicode.org/copyright.html.\n" + - " *\n" + - " * Permission is hereby granted, free of charge, to any person obtaining\n" + - " * a copy of the Unicode data files and any associated documentation\n" + - " * (the \"Data Files\") or Unicode software and any associated documentation\n" + - " * (the \"Software\") to deal in the Data Files or Software\n" + - " * without restriction, including without limitation the rights to use,\n" + - " * copy, modify, merge, publish, distribute, and/or sell copies of\n" + - " * the Data Files or Software, and to permit persons to whom the Data Files\n" + - " * or Software are furnished to do so, provided that either\n" + - " * (a) this copyright and permission notice appear with all copies\n" + - " * of the Data Files or Software, or\n" + - " * (b) this copyright and permission notice appear in associated\n" + - " * Documentation.\n" + - " *\n" + - " * THE DATA FILES AND SOFTWARE ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n" + - " * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n" + - " * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n" + - " * NONINFRINGEMENT OF THIRD PARTY RIGHTS.\n" + - " * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS\n" + - " * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL\n" + - " * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,\n" + - " * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n" + - " * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n" + - " * PERFORMANCE OF THE DATA FILES OR SOFTWARE.\n" + - " *\n" + - " * Except as contained in this notice, the name of a copyright holder\n" + - " * shall not be used in advertising or otherwise to promote the sale,\n" + - " * use or other dealings in these Data Files or Software without prior\n" + - " * written authorization of the copyright holder.\n" + - " */\n"; + """ + /* + * UNICODE LICENSE V3 + * + * COPYRIGHT AND PERMISSION NOTICE + * + * Copyright © 1991-2025 Unicode, Inc. + * + * NOTICE TO USER: Carefully read the following legal agreement. BY + * DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + * SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + * TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + * DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of data files and any associated documentation (the "Data Files") or + * software and any associated documentation (the "Software") to deal in the + * Data Files or Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, and/or sell + * copies of the Data Files or Software, and to permit persons to whom the + * Data Files or Software are furnished to do so, provided that either (a) + * this copyright and permission notice appear with all copies of the Data + * Files or Software, or (b) this copyright and permission notice appear in + * associated Documentation. + * + * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + * BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + * FILES OR SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder shall + * not be used in advertising or otherwise to promote the sale, use or other + * dealings in these Data Files or Software without prior written + * authorization of the copyright holder. + * + * SPDX-License-Identifier: Unicode-3.0 + */ + """; private static String OPENJDK2012 = "/*\n" + diff --git a/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java b/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java index 98c0605f8b7..f41dbad6c6c 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/LDMLParseHandler.java @@ -123,12 +123,14 @@ class LDMLParseHandler extends AbstractLDMLHandler { case "type": // for LocaleNames/CalendarNames // copy string + // ignore scope="core" { String key = convertOldKeyName(attributes.getValue("key")); - if (key.length() == 2) { + String scope = attributes.getValue("scope"); + if (key.length() == 2 && scope == null) { pushStringEntry(qName, attributes, - CLDRConverter.LOCALE_TYPE_PREFIX + key + "." + - attributes.getValue("type")); + CLDRConverter.LOCALE_TYPE_PREFIX + key + "." + + attributes.getValue("type")); } else { pushIgnoredContainer(qName); } diff --git a/src/java.base/share/classes/java/util/Locale.java b/src/java.base/share/classes/java/util/Locale.java index 452b621ea05..97278cdbafa 100644 --- a/src/java.base/share/classes/java/util/Locale.java +++ b/src/java.base/share/classes/java/util/Locale.java @@ -2364,27 +2364,22 @@ public final class Locale implements Cloneable, Serializable { if (ret == null || ret.equals(type)) { // no localization for this type. try combining key/type separately - String displayType = type; - switch (key) { - case "cu": - displayType = lr.getCurrencyName(type.toLowerCase(Locale.ROOT)); - break; - case "rg": - if (type != null && - // UN M.49 code should not be allowed here - type.matches("^[a-zA-Z]{2}[zZ]{4}$")) { - displayType = lr.getLocaleName(type.substring(0, 2).toUpperCase(Locale.ROOT)); - } - break; - case "tz": - displayType = TimeZoneNameUtility.convertLDMLShortID(type) - .map(id -> TimeZoneNameUtility.retrieveGenericDisplayName(id, TimeZone.LONG, inLocale)) - .orElse(type); - break; - } ret = MessageFormat.format(lr.getLocaleName("ListKeyTypePattern"), getDisplayString(key, null, inLocale, DISPLAY_UEXT_KEY), - Optional.ofNullable(displayType).orElse(type)); + switch (key) { + case "cu" -> { + var cname = lr.getCurrencyName(type.toLowerCase(Locale.ROOT)); + yield cname != null ? cname : type; + } + case "rg" -> type != null && type.matches("^[a-zA-Z]{2}[zZ]{4}$") ? + // UN M.49 code should not be allowed here + lr.getLocaleName(type.substring(0, 2).toUpperCase(Locale.ROOT)) : + type; + case "tz" -> TimeZoneNameUtility.convertLDMLShortID(type) + .map(id -> TimeZoneNameUtility.retrieveGenericDisplayName(id, TimeZone.LONG, inLocale)) + .orElse(type); + default -> type; + }); } return ret; diff --git a/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java b/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java index cf629a7d57c..5e7b61e6c57 100644 --- a/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java +++ b/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java @@ -181,6 +181,8 @@ import java.util.Locale; * CLDR version * * + * JDK 26 + * CLDR 48 * JDK 25 * CLDR 47 * JDK 24 diff --git a/src/java.base/share/legal/cldr.md b/src/java.base/share/legal/cldr.md index f020d8f51ae..6e609f35302 100644 --- a/src/java.base/share/legal/cldr.md +++ b/src/java.base/share/legal/cldr.md @@ -1,4 +1,4 @@ -## Unicode Common Local Data Repository (CLDR) v47 +## Unicode Common Local Data Repository (CLDR) v48 ### CLDR License diff --git a/src/jdk.localedata/share/legal/cldr.md b/src/jdk.localedata/share/legal/cldr.md index f020d8f51ae..6e609f35302 100644 --- a/src/jdk.localedata/share/legal/cldr.md +++ b/src/jdk.localedata/share/legal/cldr.md @@ -1,4 +1,4 @@ -## Unicode Common Local Data Repository (CLDR) v47 +## Unicode Common Local Data Repository (CLDR) v48 ### CLDR License diff --git a/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java index b81226c00db..83687d39bed 100644 --- a/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java +++ b/test/jdk/java/text/Format/CompactNumberFormat/TestCompactNumber.java @@ -23,6 +23,7 @@ /* * @test * @bug 8177552 8217721 8222756 8295372 8306116 8319990 8338690 8363972 + * 8354548 * @summary Checks the functioning of compact number format * @modules jdk.localedata * @run junit/othervm TestCompactNumber @@ -116,26 +117,26 @@ public class TestCompactNumber { Object[][] compactFormatData() { return new Object[][]{ // compact number format instance, number to format, formatted output - {FORMAT_DZ_LONG, 1000.09, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" - + "\u0FB2\u0F42 \u0F21"}, - {FORMAT_DZ_LONG, -999.99, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" - + "\u0FB2\u0F42 \u0F21"}, - {FORMAT_DZ_LONG, -0.0, "-\u0F20"}, - {FORMAT_DZ_LONG, 3000L, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55" - + "\u0FB2\u0F42 \u0F23"}, - {FORMAT_DZ_LONG, new BigInteger("12345678901234567890"), "\u0F51" - + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" - + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + {FORMAT_DZ_LONG, 1000.09, "སྟོང་ཕ" + + "ྲག ༡"}, + {FORMAT_DZ_LONG, -999.99, "-སྟོང་ཕ" + + "ྲག ༡"}, + {FORMAT_DZ_LONG, -0.0, "-༠"}, + {FORMAT_DZ_LONG, 3000L, "སྟོང་ཕ" + + "ྲག ༣"}, + {FORMAT_DZ_LONG, new BigInteger("12345678901234567890"), "ད" + + "ུང་ཕྱུར་ས" + + "་ཡ་ ༡༢༣༤༥༧"}, // negative - {FORMAT_DZ_LONG, new BigInteger("-12345678901234567890"), "-\u0F51" - + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" - + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, - {FORMAT_DZ_LONG, new BigDecimal("12345678901234567890.89"), "\u0F51" - + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" - + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, - {FORMAT_DZ_LONG, new BigDecimal("-12345678901234567890.89"), "-\u0F51" - + "\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62\u0F0B\u0F66" - + "\u0F0B\u0F61\u0F0B \u0F21\u0F22\u0F23\u0F24\u0F25\u0F27"}, + {FORMAT_DZ_LONG, new BigInteger("-12345678901234567890"), "-ད" + + "ུང་ཕྱུར་ས" + + "་ཡ་ ༡༢༣༤༥༧"}, + {FORMAT_DZ_LONG, new BigDecimal("12345678901234567890.89"), "ད" + + "ུང་ཕྱུར་ས" + + "་ཡ་ ༡༢༣༤༥༧"}, + {FORMAT_DZ_LONG, new BigDecimal("-12345678901234567890.89"), "-ད" + + "ུང་ཕྱུར་ས" + + "་ཡ་ ༡༢༣༤༥༧"}, // Zeros {FORMAT_EN_US_SHORT, 0, "0"}, {FORMAT_EN_US_SHORT, 0.0, "0"}, @@ -236,88 +237,88 @@ public class TestCompactNumber { // Less than 1000 no suffix {FORMAT_HI_IN_LONG, -999, "-999"}, // Round the value with 0 fraction digits and format it - {FORMAT_HI_IN_LONG, -999.99, "-1 \u0939\u091C\u093C\u093E\u0930"}, + {FORMAT_HI_IN_LONG, -999.99, "-1 हज़ार"}, // 10 thousand - {FORMAT_HI_IN_LONG, 99000, "99 \u0939\u091C\u093C\u093E\u0930"}, + {FORMAT_HI_IN_LONG, 99000, "99 हज़ार"}, // Long path - {FORMAT_HI_IN_LONG, 330000, "3 \u0932\u093E\u0916"}, + {FORMAT_HI_IN_LONG, 330000, "3 लाख"}, // Double path - {FORMAT_HI_IN_LONG, 3000.90, "3 \u0939\u091C\u093C\u093E\u0930"}, + {FORMAT_HI_IN_LONG, 3000.90, "3 हज़ार"}, // BigInteger path {FORMAT_HI_IN_LONG, new BigInteger("12345678901234567890"), - "123456789 \u0916\u0930\u092C"}, + "123456789 खरब"}, // BigDecimal path {FORMAT_HI_IN_LONG, new BigDecimal("12345678901234567890.89"), - "123456789 \u0916\u0930\u092C"}, + "123456789 खरब"}, // 1000 does not have any suffix in "ja" locale {FORMAT_JA_JP_SHORT, -999.99, "-1,000"}, // 0-9999 does not have any suffix {FORMAT_JA_JP_SHORT, 9999, "9,999"}, - // 99000/10000 => 9.9\u4E07 rounded to 10\u4E07 - {FORMAT_JA_JP_SHORT, 99000, "10\u4E07"}, + // 99000/10000 => 9.9万 rounded to 10万 + {FORMAT_JA_JP_SHORT, 99000, "10万"}, // Negative - {FORMAT_JA_JP_SHORT, -99000, "-10\u4E07"}, + {FORMAT_JA_JP_SHORT, -99000, "-10万"}, // Long path - {FORMAT_JA_JP_SHORT, 330000, "33\u4E07"}, + {FORMAT_JA_JP_SHORT, 330000, "33万"}, // Double path {FORMAT_JA_JP_SHORT, 3000.90, "3,001"}, // BigInteger path {FORMAT_JA_JP_SHORT, new BigInteger("12345678901234567890"), - "1235\u4EAC"}, + "1235京"}, // BigDecimal path {FORMAT_JA_JP_SHORT, new BigDecimal("12345678901234567890.89"), - "1235\u4EAC"}, + "1235京"}, // less than 1000 no suffix {FORMAT_IT_SHORT, 499, "499"}, // Boundary number - {FORMAT_IT_SHORT, 1000, "1.000"}, + {FORMAT_IT_SHORT, 1000, "1K"}, // Long path - {FORMAT_IT_SHORT, 3000000L, "3\u00a0Mln"}, + {FORMAT_IT_SHORT, 3000000L, "3 Mln"}, // Double path - {FORMAT_IT_SHORT, 3000000.0, "3\u00a0Mln"}, + {FORMAT_IT_SHORT, 3000000.0, "3 Mln"}, // BigInteger path {FORMAT_IT_SHORT, new BigInteger("12345678901234567890"), - "12345679\u00a0Bln"}, + "12345679 Bln"}, // BigDecimal path {FORMAT_IT_SHORT, new BigDecimal("12345678901234567890.89"), - "12345679\u00a0Bln"}, + "12345679 Bln"}, {FORMAT_CA_LONG, 999, "999"}, {FORMAT_CA_LONG, 999.99, "1 miler"}, {FORMAT_CA_LONG, 99000, "99 milers"}, {FORMAT_CA_LONG, 330000, "330 milers"}, {FORMAT_CA_LONG, 3000.90, "3 milers"}, - {FORMAT_CA_LONG, 1000000, "1 mili\u00f3"}, + {FORMAT_CA_LONG, 1000000, "1 milió"}, {FORMAT_CA_LONG, new BigInteger("12345678901234567890"), "12345679 bilions"}, {FORMAT_CA_LONG, new BigDecimal("12345678901234567890.89"), "12345679 bilions"}, - {FORMAT_AS_LONG, 5000.0, "\u09eb \u09b9\u09be\u099c\u09be\u09f0"}, - {FORMAT_AS_LONG, 50000.0, "\u09eb\u09e6 \u09b9\u09be\u099c\u09be\u09f0"}, - {FORMAT_AS_LONG, 500000.0, "\u09eb \u09b2\u09be\u0996"}, - {FORMAT_AS_LONG, 5000000.0, "\u09eb \u09a8\u09bf\u09af\u09c1\u09a4"}, - {FORMAT_AS_LONG, 50000000.0, "\u09eb\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"}, - {FORMAT_AS_LONG, 500000000.0, "\u09eb\u09e6\u09e6 \u09a8\u09bf\u09af\u09c1\u09a4"}, - {FORMAT_AS_LONG, 5000000000.0, "\u09eb \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, - {FORMAT_AS_LONG, 50000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, - {FORMAT_AS_LONG, 500000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u0995\u09cb\u099f\u09bf"}, - {FORMAT_AS_LONG, 5000000000000.0, "\u09eb \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, - {FORMAT_AS_LONG, 50000000000000.0, "\u09eb\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, - {FORMAT_AS_LONG, 500000000000000.0, "\u09eb\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, - {FORMAT_AS_LONG, 5000000000000000.0, "\u09eb\u09e6\u09e6\u09e6 \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + {FORMAT_AS_LONG, 5000.0, "৫ হাজাৰ"}, + {FORMAT_AS_LONG, 50000.0, "৫০ হাজাৰ"}, + {FORMAT_AS_LONG, 500000.0, "৫ লাখ"}, + {FORMAT_AS_LONG, 5000000.0, "৫ নিযুত"}, + {FORMAT_AS_LONG, 50000000.0, "৫০ নিযুত"}, + {FORMAT_AS_LONG, 500000000.0, "৫০০ নিযুত"}, + {FORMAT_AS_LONG, 5000000000.0, "৫ শত কোটি"}, + {FORMAT_AS_LONG, 50000000000.0, "৫০ শত কোটি"}, + {FORMAT_AS_LONG, 500000000000.0, "৫০০ শত কোটি"}, + {FORMAT_AS_LONG, 5000000000000.0, "৫ শত পৰাৰ্দ্ধ"}, + {FORMAT_AS_LONG, 50000000000000.0, "৫০ শত পৰাৰ্দ্ধ"}, + {FORMAT_AS_LONG, 500000000000000.0, "৫০০ শত পৰাৰ্দ্ধ"}, + {FORMAT_AS_LONG, 5000000000000000.0, "৫০০০ শত পৰাৰ্দ্ধ"}, {FORMAT_AS_LONG, new BigInteger("12345678901234567890"), - "\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ef \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + "১২৩৪৫৬৭৯ শত পৰাৰ্দ্ধ"}, {FORMAT_AS_LONG, new BigDecimal("12345678901234567890123466767.89"), - "\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ee \u09b6\u09a4 \u09aa\u09f0\u09be\u09f0\u09cd\u09a6\u09cd\u09a7"}, + "১২৩৪৫৬৭৮৯০১২৩৪৫৬৮ শত পৰাৰ্দ্ধ"}, {FORMAT_BRX_SHORT, 999, "999"}, - {FORMAT_BRX_SHORT, 999.99, "1\u0915\u0947"}, - {FORMAT_BRX_SHORT, 99000, "99\u0915\u0947"}, - {FORMAT_BRX_SHORT, 330000, "330\u0915\u0947"}, - {FORMAT_BRX_SHORT, 3000.90, "3\u0915\u0947"}, - {FORMAT_BRX_SHORT, 1000000, "1\u090f\u092e"}, + {FORMAT_BRX_SHORT, 999.99, "1के"}, + {FORMAT_BRX_SHORT, 99000, "99के"}, + {FORMAT_BRX_SHORT, 330000, "330के"}, + {FORMAT_BRX_SHORT, 3000.90, "3के"}, + {FORMAT_BRX_SHORT, 1000000, "1एम"}, {FORMAT_BRX_SHORT, new BigInteger("12345678901234567890"), - "12345679\u0924\u093f"}, + "12345679ति"}, {FORMAT_BRX_SHORT, new BigDecimal("12345678901234567890.89"), - "12345679\u0924\u093f"}, + "12345679ति"}, // Less than 1000 no suffix {FORMAT_SW_LONG, 499, "499"}, // Boundary number @@ -340,24 +341,24 @@ public class TestCompactNumber { // No compact form {FORMAT_SE_SHORT, 999, "999"}, // Long - {FORMAT_SE_SHORT, 8000000L, "8\u00a0mn"}, + {FORMAT_SE_SHORT, 8000000L, "8 mn"}, // Double - {FORMAT_SE_SHORT, 8000.98, "8\u00a0dt"}, + {FORMAT_SE_SHORT, 8000.98, "8 dt"}, // Big integer - {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), "12345679\u00a0bn"}, + {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), "12345679 bn"}, // Big decimal - {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), "12345679\u00a0bn"}, + {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), "12345679 bn"}, // Negatives // No compact form - {FORMAT_SE_SHORT, -999, "\u2212999"}, + {FORMAT_SE_SHORT, -999, "−999"}, // Long - {FORMAT_SE_SHORT, -8000000L, "\u22128\u00a0mn"}, + {FORMAT_SE_SHORT, -8000000L, "−8 mn"}, // Double - {FORMAT_SE_SHORT, -8000.98, "\u22128\u00a0dt"}, + {FORMAT_SE_SHORT, -8000.98, "−8 dt"}, // BigInteger - {FORMAT_SE_SHORT, new BigInteger("-12345678901234567890"), "\u221212345679\u00a0bn"}, + {FORMAT_SE_SHORT, new BigInteger("-12345678901234567890"), "−12345679 bn"}, // BigDecimal - {FORMAT_SE_SHORT, new BigDecimal("-12345678901234567890.98"), "\u221212345679\u00a0bn"}, + {FORMAT_SE_SHORT, new BigDecimal("-12345678901234567890.98"), "−12345679 bn"}, // Plurals // DE: one:i = 1 and v = 0 @@ -368,17 +369,17 @@ public class TestCompactNumber { // few:v = 0 and i % 100 = 3..4 or v != 0 {FORMAT_SL_LONG, 1_000_000, "1 milijon"}, {FORMAT_SL_LONG, 2_000_000, "2 milijona"}, - {FORMAT_SL_LONG, 3_000_000, "3 milijone"}, + {FORMAT_SL_LONG, 3_000_000, "3 milijoni"}, {FORMAT_SL_LONG, 5_000_000, "5 milijonov"}, // Fractional plurals {FORMAT_ES_LONG_FD1, 1_234_500, "1,2 millones"}, {FORMAT_DE_LONG_FD2, 1_234_500, "1,23 Millionen"}, {FORMAT_IT_LONG_FD3, 1_234_500, "1,234 milioni"}, - {FORMAT_PT_LONG_FD4, 1_234_500, "1,2345 milh\u00f5es"}, + {FORMAT_PT_LONG_FD4, 1_234_500, "1,2345 milhões"}, // 8338690 - {FORMAT_PL_LONG, 5_000, "5 tysi\u0119cy"}, - {FORMAT_PL_LONG, 4_949, "5 tysi\u0119cy"}, + {FORMAT_PL_LONG, 5_000, "5 tysięcy"}, + {FORMAT_PL_LONG, 4_949, "5 tysięcy"}, {FORMAT_FR_LONG, 1_949, "2 mille"}, {FORMAT_IT_LONG, 1_949, "2 mila"}, }; @@ -387,16 +388,16 @@ public class TestCompactNumber { Object[][] compactParseData() { return new Object[][]{ // compact number format instance, string to parse, parsed number, return type - {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F21", 1000L, Long.class}, - {FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F23", -3000L, Long.class}, - {FORMAT_DZ_LONG, "\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" - + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" - + "\u0F22\u0F23\u0F24\u0F25\u0F27", 1.23457E19, Double.class}, - {FORMAT_DZ_LONG, "-\u0F51\u0F74\u0F44\u0F0B\u0F55\u0FB1\u0F74\u0F62" - + "\u0F0B\u0F66\u0F0B\u0F61\u0F0B \u0F21" - + "\u0F22\u0F23\u0F24\u0F25\u0F27", -1.23457E19, Double.class}, + {FORMAT_DZ_LONG, "སྟོང་ཕྲ" + + "ག ༡", 1000L, Long.class}, + {FORMAT_DZ_LONG, "-སྟོང་ཕྲ" + + "ག ༣", -3000L, Long.class}, + {FORMAT_DZ_LONG, "དུང་ཕྱུར" + + "་ས་ཡ་ ༡" + + "༢༣༤༥༧", 1.23457E19, Double.class}, + {FORMAT_DZ_LONG, "-དུང་ཕྱུར" + + "་ས་ཡ་ ༡" + + "༢༣༤༥༧", -1.23457E19, Double.class}, {FORMAT_EN_US_SHORT, "-0.0", -0.0, Double.class}, {FORMAT_EN_US_SHORT, "-0", -0.0, Double.class}, {FORMAT_EN_US_SHORT, "0", 0L, Long.class}, @@ -427,23 +428,23 @@ public class TestCompactNumber { {FORMAT_EN_LONG, "12345679 trillion", 1.2345679E19, Double.class}, {FORMAT_HI_IN_LONG, "999", 999L, Long.class}, {FORMAT_HI_IN_LONG, "-999", -999L, Long.class}, - {FORMAT_HI_IN_LONG, "1 \u0939\u091C\u093C\u093E\u0930", 1000L, Long.class}, - {FORMAT_HI_IN_LONG, "-1 \u0939\u091C\u093C\u093E\u0930", -1000L, Long.class}, - {FORMAT_HI_IN_LONG, "3 \u0939\u091C\u093C\u093E\u0930", 3000L, Long.class}, - {FORMAT_HI_IN_LONG, "12345679 \u0916\u0930\u092C", 1234567900000000000L, Long.class}, - {FORMAT_HI_IN_LONG, "-12345679 \u0916\u0930\u092C", -1234567900000000000L, Long.class}, + {FORMAT_HI_IN_LONG, "1 हज़ार", 1000L, Long.class}, + {FORMAT_HI_IN_LONG, "-1 हज़ार", -1000L, Long.class}, + {FORMAT_HI_IN_LONG, "3 हज़ार", 3000L, Long.class}, + {FORMAT_HI_IN_LONG, "12345679 खरब", 1234567900000000000L, Long.class}, + {FORMAT_HI_IN_LONG, "-12345679 खरब", -1234567900000000000L, Long.class}, {FORMAT_JA_JP_SHORT, "-99", -99L, Long.class}, - {FORMAT_JA_JP_SHORT, "1\u4E07", 10000L, Long.class}, - {FORMAT_JA_JP_SHORT, "30\u4E07", 300000L, Long.class}, - {FORMAT_JA_JP_SHORT, "-30\u4E07", -300000L, Long.class}, - {FORMAT_JA_JP_SHORT, "12345679\u5146", 1.2345679E19, Double.class}, - {FORMAT_JA_JP_SHORT, "-12345679\u5146", -1.2345679E19, Double.class}, + {FORMAT_JA_JP_SHORT, "1万", 10000L, Long.class}, + {FORMAT_JA_JP_SHORT, "30万", 300000L, Long.class}, + {FORMAT_JA_JP_SHORT, "-30万", -300000L, Long.class}, + {FORMAT_JA_JP_SHORT, "12345679兆", 1.2345679E19, Double.class}, + {FORMAT_JA_JP_SHORT, "-12345679兆", -1.2345679E19, Double.class}, {FORMAT_IT_SHORT, "-99", -99L, Long.class}, - {FORMAT_IT_SHORT, "1\u00a0Mln", 1000000L, Long.class}, - {FORMAT_IT_SHORT, "30\u00a0Mln", 30000000L, Long.class}, - {FORMAT_IT_SHORT, "-30\u00a0Mln", -30000000L, Long.class}, - {FORMAT_IT_SHORT, "12345679\u00a0Bln", 1.2345679E19, Double.class}, - {FORMAT_IT_SHORT, "-12345679\u00a0Bln", -1.2345679E19, Double.class}, + {FORMAT_IT_SHORT, "1 Mln", 1000000L, Long.class}, + {FORMAT_IT_SHORT, "30 Mln", 30000000L, Long.class}, + {FORMAT_IT_SHORT, "-30 Mln", -30000000L, Long.class}, + {FORMAT_IT_SHORT, "12345679 Bln", 1.2345679E19, Double.class}, + {FORMAT_IT_SHORT, "-12345679 Bln", -1.2345679E19, Double.class}, {FORMAT_SW_LONG, "-0.0", -0.0, Double.class}, {FORMAT_SW_LONG, "499", 499L, Long.class}, {FORMAT_SW_LONG, "elfu 1", 1000L, Long.class}, @@ -461,17 +462,17 @@ public class TestCompactNumber { {FORMAT_SW_LONG, "elfu 599.01", 599010L, Long.class}, {FORMAT_SW_LONG, "elfu -599.01", -599010L, Long.class}, {FORMAT_SE_SHORT, "999", 999L, Long.class}, - {FORMAT_SE_SHORT, "8\u00a0mn", 8000000L, Long.class}, - {FORMAT_SE_SHORT, "8\u00a0dt", 8000L, Long.class}, - {FORMAT_SE_SHORT, "12345679\u00a0bn", 1.2345679E19, Double.class}, - {FORMAT_SE_SHORT, "12345679,89\u00a0bn", 1.2345679890000001E19, Double.class}, + {FORMAT_SE_SHORT, "8 mn", 8000000L, Long.class}, + {FORMAT_SE_SHORT, "8 dt", 8000L, Long.class}, + {FORMAT_SE_SHORT, "12345679 bn", 1.2345679E19, Double.class}, + {FORMAT_SE_SHORT, "12345679,89 bn", 1.2345679890000001E19, Double.class}, {FORMAT_SE_SHORT, "\u2212999", -999L, Long.class}, {FORMAT_SE_SHORT, "\u22128\u00a0mn", -8000000L, Long.class}, // lenient parsing. Hyphen-minus should match the localized minus sign - {FORMAT_SE_SHORT, "-8\u00a0mn", -8000000L, Long.class}, - {FORMAT_SE_SHORT, "\u22128\u00a0dt", -8000L, Long.class}, - {FORMAT_SE_SHORT, "\u221212345679\u00a0bn", -1.2345679E19, Double.class}, - {FORMAT_SE_SHORT, "\u221212345679,89\u00a0bn", -1.2345679890000001E19, Double.class}, + {FORMAT_SE_SHORT, "−8 mn", -8000000L, Long.class}, + {FORMAT_SE_SHORT, "\u22128 dt", -8000L, Long.class}, + {FORMAT_SE_SHORT, "\u221212345679 bn", -1.2345679E19, Double.class}, + {FORMAT_SE_SHORT, "\u221212345679,89 bn", -1.2345679890000001E19, Double.class}, // Plurals // DE: one:i = 1 and v = 0 @@ -482,15 +483,15 @@ public class TestCompactNumber { // few:v = 0 and i % 100 = 3..4 or v != 0 {FORMAT_SL_LONG, "1 milijon", 1_000_000L, Long.class}, {FORMAT_SL_LONG, "2 milijona", 2_000_000L, Long.class}, - {FORMAT_SL_LONG, "3 milijone", 3_000_000L, Long.class}, + {FORMAT_SL_LONG, "3 milijoni", 3_000_000L, Long.class}, {FORMAT_SL_LONG, "5 milijonov", 5_000_000L, Long.class}, // Fractional plurals {FORMAT_ES_LONG_FD1, "1,2 millones", 1_200_000L, Long.class}, {FORMAT_DE_LONG_FD2, "1,23 Millionen", 1_230_000L, Long.class}, {FORMAT_IT_LONG_FD3, "1,234 milioni", 1_234_000L, Long.class}, - {FORMAT_PT_LONG_FD4, "1,2345 milh\u00f5es", 1_234_500L, Long.class}, + {FORMAT_PT_LONG_FD4, "1,2345 milhões", 1_234_500L, Long.class}, // 8338690 - {FORMAT_PL_LONG, "5 tysi\u0119cy", 5_000L, Long.class}, + {FORMAT_PL_LONG, "5 tysięcy", 5_000L, Long.class}, {FORMAT_FR_LONG, "2 mille", 2_000L, Long.class}, {FORMAT_IT_LONG, "2 mila", 2_000L, Long.class}, }; @@ -500,15 +501,15 @@ public class TestCompactNumber { return new Object[][]{ // compact number instance, string to parse, null (no o/p; must throw exception) // no number - {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42", null}, + {FORMAT_DZ_LONG, "སྟོང་ཕྲ" + + "ག", null}, // Invalid prefix - {FORMAT_DZ_LONG, "-\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F23", null}, + {FORMAT_DZ_LONG, "-སྟོང,་ཕྲ" + + "ག ༣", null}, // Invalid prefix for en_US {FORMAT_EN_US_SHORT, "K12,347", null}, // Invalid prefix for ja_JP - {FORMAT_JA_JP_SHORT, "\u4E071", null}, + {FORMAT_JA_JP_SHORT, "万1", null}, }; } @@ -516,8 +517,8 @@ public class TestCompactNumber { return new Object[][]{ // compact number instance, string to parse, parsed number // Prefix and suffix do not match - {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F21 KM", 1000L}, + {FORMAT_DZ_LONG, "སྟོང་ཕྲ" + + "ག ༡ KM", 1000L}, // Exponents are unparseable {FORMAT_EN_US_SHORT, "-1.05E4K", -1.05}, // Default instance does not allow grouping @@ -525,15 +526,15 @@ public class TestCompactNumber { // Take partial suffix "K" as 1000 for en_US_SHORT patterns {FORMAT_EN_US_SHORT, "12KM", 12000L}, // Invalid suffix - {FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L}, + {FORMAT_HI_IN_LONG, "-1  क.", -1L}, // invalid plurals {FORMAT_DE_LONG, "2 Million", 2L}, {FORMAT_SL_LONG, "2 milijon", 2L}, {FORMAT_SL_LONG, "2 milijone", 2L}, {FORMAT_SL_LONG, "2 milijonv", 2L}, + {FORMAT_SL_LONG, "5 milijona", 5L}, {FORMAT_SL_LONG, "3 milijon", 3L}, - {FORMAT_SL_LONG, "3 milijona", 3L}, {FORMAT_SL_LONG, "3 milijonv", 3L}, {FORMAT_SL_LONG, "5 milijon", 5L}, {FORMAT_SL_LONG, "5 milijona", 5L}, @@ -548,14 +549,14 @@ public class TestCompactNumber { Object[][] formatFieldPositionData() { return new Object[][]{ //compact number instance, number to format, field, start position, end position, formatted string - {FORMAT_DZ_LONG, -3500, NumberFormat.Field.SIGN, 0, 1, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, - {FORMAT_DZ_LONG, 3500, NumberFormat.Field.INTEGER, 9, 10, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, - {FORMAT_DZ_LONG, -3500, NumberFormat.Field.INTEGER, 10, 11, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, - {FORMAT_DZ_LONG, 999, NumberFormat.Field.INTEGER, 0, 3, "\u0F29\u0F29\u0F29"}, - {FORMAT_DZ_LONG, -999, NumberFormat.Field.INTEGER, 1, 4, "-\u0F29\u0F29\u0F29"}, - {FORMAT_DZ_LONG, 3500, NumberFormat.Field.PREFIX, 0, 9, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, - {FORMAT_DZ_LONG, -3500, NumberFormat.Field.PREFIX, 0, 10, "-\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2\u0F42 \u0F24"}, - {FORMAT_DZ_LONG, 999, NumberFormat.Field.PREFIX, 0, 0, "\u0F29\u0F29\u0F29"}, + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.SIGN, 0, 1, "-སྟོང་ཕྲག ༤"}, + {FORMAT_DZ_LONG, 3500, NumberFormat.Field.INTEGER, 9, 10, "སྟོང་ཕྲག ༤"}, + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.INTEGER, 10, 11, "-སྟོང་ཕྲག ༤"}, + {FORMAT_DZ_LONG, 999, NumberFormat.Field.INTEGER, 0, 3, "༩༩༩"}, + {FORMAT_DZ_LONG, -999, NumberFormat.Field.INTEGER, 1, 4, "-༩༩༩"}, + {FORMAT_DZ_LONG, 3500, NumberFormat.Field.PREFIX, 0, 9, "སྟོང་ཕྲག ༤"}, + {FORMAT_DZ_LONG, -3500, NumberFormat.Field.PREFIX, 0, 10, "-སྟོང་ཕྲག ༤"}, + {FORMAT_DZ_LONG, 999, NumberFormat.Field.PREFIX, 0, 0, "༩༩༩"}, {FORMAT_EN_US_SHORT, -3500, NumberFormat.Field.SIGN, 0, 1, "-4K"}, {FORMAT_EN_US_SHORT, 3500, NumberFormat.Field.INTEGER, 0, 1, "4K"}, {FORMAT_EN_US_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15B"}, @@ -566,49 +567,49 @@ public class TestCompactNumber { {FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, "15 billion"}, {FORMAT_EN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 10, "4 thousand"}, {FORMAT_EN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 10, "15 billion"}, - {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 3, "149\u5104"}, + {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.INTEGER, 0, 3, "149億"}, {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.INTEGER, 1, 6, "-1,000"}, - {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 3, 4, "149\u5104"}, + {FORMAT_JA_JP_SHORT, 14900000067L, NumberFormat.Field.SUFFIX, 3, 4, "149億"}, {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SUFFIX, 0, 0, "-1,000"}, {FORMAT_JA_JP_SHORT, -999.99, NumberFormat.Field.SIGN, 0, 1, "-1,000"}, {FORMAT_HI_IN_LONG, -14900000067L, NumberFormat.Field.SIGN, 0, 1, - "-15 \u0905\u0930\u092C"}, + "-15 अरब"}, {FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.INTEGER, 0, 1, - "4 \u0939\u091C\u093C\u093E\u0930"}, + "4 हज़ार"}, {FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.INTEGER, 0, 2, - "15 \u0905\u0930\u092C"}, + "15 अरब"}, {FORMAT_HI_IN_LONG, 3500, NumberFormat.Field.SUFFIX, 1, 7, - "4 \u0939\u091C\u093C\u093E\u0930"}, + "4 हज़ार"}, {FORMAT_HI_IN_LONG, 14900000067L, NumberFormat.Field.SUFFIX, 2, 6, - "15 \u0905\u0930\u092C"}, - {FORMAT_SE_SHORT, 8000000L, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0mn"}, - {FORMAT_SE_SHORT, 8000.98, NumberFormat.Field.SUFFIX, 1, 4, "8\u00a0dt"}, - {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"}, - {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), NumberFormat.Field.SUFFIX, 8, 11, "12345679\u00a0bn"}, - {FORMAT_SE_SHORT, -8000000L, NumberFormat.Field.INTEGER, 1, 2, "\u22128\u00a0mn"}, - {FORMAT_SE_SHORT, -8000.98, NumberFormat.Field.SIGN, 0, 1, "\u22128\u00a0dt"}, - {FORMAT_SE_SHORT, new BigDecimal("-48982865901234567890.98"), NumberFormat.Field.INTEGER, 1, 9, "\u221248982866\u00a0bn"},}; + "15 अरब"}, + {FORMAT_SE_SHORT, 8000000L, NumberFormat.Field.SUFFIX, 1, 4, "8 mn"}, + {FORMAT_SE_SHORT, 8000.98, NumberFormat.Field.SUFFIX, 1, 4, "8 dt"}, + {FORMAT_SE_SHORT, new BigInteger("12345678901234567890"), NumberFormat.Field.SUFFIX, 8, 11, "12345679 bn"}, + {FORMAT_SE_SHORT, new BigDecimal("12345678901234567890.98"), NumberFormat.Field.SUFFIX, 8, 11, "12345679 bn"}, + {FORMAT_SE_SHORT, -8000000L, NumberFormat.Field.INTEGER, 1, 2, "−8 mn"}, + {FORMAT_SE_SHORT, -8000.98, NumberFormat.Field.SIGN, 0, 1, "−8 dt"}, + {FORMAT_SE_SHORT, new BigDecimal("-48982865901234567890.98"), NumberFormat.Field.INTEGER, 1, 9, "−48982866 bn"},}; } Object[][] varParsePosition() { return new Object[][]{ // compact number instance, parse string, parsed number, // start position, end position, error index - {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F21 KM", 1000L, 0, 10, -1}, + {FORMAT_DZ_LONG, "སྟོང་ཕྲ" + + "ག ༡ KM", 1000L, 0, 10, -1}, // Invalid prefix returns null - {FORMAT_DZ_LONG, "Number is: -\u0F66\u0F9F\u0F7C\u0F44,\u0F0B\u0F55\u0FB2" - + "\u0F42 \u0F23", null, 11, 11, 11}, + {FORMAT_DZ_LONG, "Number is: -སྟོང,་ཕྲ" + + "ག ༣", null, 11, 11, 11}, // Returns null - {FORMAT_DZ_LONG, "\u0F66\u0F9F\u0F7C\u0F44\u0F0B\u0F55\u0FB2" - + "\u0F42", null, 0, 0, 0}, + {FORMAT_DZ_LONG, "སྟོང་ཕྲ" + + "ག", null, 0, 0, 0}, {FORMAT_EN_US_SHORT, "Exponent: -1.05E4K", -1.05, 10, 15, -1}, // Default instance does not allow grouping {FORMAT_EN_US_SHORT, "12,347", 12L, 0, 2, -1}, // Invalid suffix "KM" for en_US_SHORT patterns {FORMAT_EN_US_SHORT, "12KM", 12000L, 0, 3, -1}, // Invalid suffix - {FORMAT_HI_IN_LONG, "-1 \u00a0\u0915.", -1L, 0, 2, -1}, + {FORMAT_HI_IN_LONG, "-1  क.", -1L, 0, 2, -1}, {FORMAT_EN_LONG, "Number is: 12345679 trillion", 1.2345679E19, 11, 28, -1}, {FORMAT_EN_LONG, "Number is: -12345679 trillion", diff --git a/test/jdk/java/text/Format/NumberFormat/Bug8132125.java b/test/jdk/java/text/Format/NumberFormat/Bug8132125.java index 1f702a9ba24..00e4db74bad 100644 --- a/test/jdk/java/text/Format/NumberFormat/Bug8132125.java +++ b/test/jdk/java/text/Format/NumberFormat/Bug8132125.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8132125 8202537 + * @bug 8132125 8202537 8354548 * @summary Checks Swiss' number elements * @modules jdk.localedata * @run junit Bug8132125 @@ -44,8 +44,8 @@ public class Bug8132125 { Locale deCH = Locale.of("de", "CH"); NumberFormat nf = NumberFormat.getInstance(deCH); - // "\u002E" as decimal separator, "\u2019" as grouping separator - String expected = "54\u2019839\u2019483.142"; + // "\u002E" as decimal separator, "\u0027" as grouping separator + String expected = "54'839'483.142"; String actual = nf.format(54839483.1415); assertEquals(expected, actual, "incorrect number elements for de_CH"); } diff --git a/test/jdk/java/time/test/java/time/chrono/TestEraDisplayName.java b/test/jdk/java/time/test/java/time/chrono/TestEraDisplayName.java index 291eab833c4..4e20ceb5495 100644 --- a/test/jdk/java/time/test/java/time/chrono/TestEraDisplayName.java +++ b/test/jdk/java/time/test/java/time/chrono/TestEraDisplayName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ import static org.testng.Assert.assertFalse; * chrono implementation. * Note: The exact result may depend on locale data provider's implementation. * - * @bug 8171049 8224105 8240626 + * @bug 8171049 8224105 8240626 8354548 */ @Test public class TestEraDisplayName { @@ -132,7 +132,7 @@ public class TestEraDisplayName { { MinguoEra.ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b" }, // HijrahEra - { HijrahEra.AH, TextStyle.FULL, Locale.US, "AH" }, + { HijrahEra.AH, TextStyle.FULL, Locale.US, "Anno Hegirae" }, { HijrahEra.AH, TextStyle.FULL, EGYPT, "\u0647\u0640" }, { HijrahEra.AH, TextStyle.SHORT, Locale.US, "AH" }, { HijrahEra.AH, TextStyle.SHORT, EGYPT, "\u0647\u0640" }, diff --git a/test/jdk/java/time/test/java/time/format/Skeletons_en_US.properties b/test/jdk/java/time/test/java/time/format/Skeletons_en_US.properties index af3d46e308c..c274ffc0b32 100644 --- a/test/jdk/java/time/test/java/time/format/Skeletons_en_US.properties +++ b/test/jdk/java/time/test/java/time/format/Skeletons_en_US.properties @@ -1,3 +1,26 @@ +# +# Copyright (c) 2022, 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. +# +# 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. +# + H=15 h=3 PM j=3 PM @@ -38,8 +61,8 @@ yM=1/2022 yMEd=Wed, 1/26/2022 yMMM=Jan 2022 yMMMMEd=Wed, Jan 26, 2022 -GyM=Jan 2022 AD -GyMEd=Wed, Jan 26, 2022 AD +GyM=1/2022 AD +GyMEd=Wed, 1/26/2022 AD GyMMM=Jan 2022 AD GyMMMMEd=Wed, Jan 26, 2022 AD yQQQ=Q1 2022 diff --git a/test/jdk/java/time/test/java/time/format/Skeletons_ja.properties b/test/jdk/java/time/test/java/time/format/Skeletons_ja.properties index 1b8823d369e..98a2460d075 100644 --- a/test/jdk/java/time/test/java/time/format/Skeletons_ja.properties +++ b/test/jdk/java/time/test/java/time/format/Skeletons_ja.properties @@ -1,3 +1,26 @@ +# +# Copyright (c) 2022, 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. +# +# 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. +# + H=15時 h=午後3時 j=15時 @@ -32,8 +55,8 @@ yM=4/1 yMEd=4/1/26(水) yMMM=4年1月 yMMMMEd=4年1月26日(水) -GyM=令和4年1月 -GyMEd=令和4年1月26日(水) +GyM=令和4/1 +GyMEd=令和4/1/26(水) GyMMM=令和4年1月 GyMMMMEd=令和4年1月26日(水) diff --git a/test/jdk/java/time/test/java/time/format/TestLocalizedPattern.java b/test/jdk/java/time/test/java/time/format/TestLocalizedPattern.java index 4071d210191..aa8ff763aad 100644 --- a/test/jdk/java/time/test/java/time/format/TestLocalizedPattern.java +++ b/test/jdk/java/time/test/java/time/format/TestLocalizedPattern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ import org.testng.annotations.Test; /** * Test DateTimeFormatter.ofLocalizedPattern() related methods. - * @bug 8176706 8284840 + * @bug 8176706 8284840 8354548 */ @Test public class TestLocalizedPattern { diff --git a/test/jdk/java/time/test/java/time/format/TestUnicodeExtension.java b/test/jdk/java/time/test/java/time/format/TestUnicodeExtension.java index 550dc5b31c2..6b99fea5c7c 100644 --- a/test/jdk/java/time/test/java/time/format/TestUnicodeExtension.java +++ b/test/jdk/java/time/test/java/time/format/TestUnicodeExtension.java @@ -24,7 +24,7 @@ /* * @test * @bug 8176841 8202537 8244245 8265315 8284840 8296248 8306116 8333582 - * 8346948 + * 8346948 8354548 * @summary Tests java.time classes deals with Unicode extensions * correctly. * @modules jdk.localedata @@ -104,41 +104,41 @@ public class TestUnicodeExtension { // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, // Expected formatted string {Locale.JAPAN, null, null, ISO, null, - "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" + "2017年8月10日木曜日 15時15分00秒 " + + "米国太平洋夏時間" }, {Locale.JAPAN, JAPANESE, null, ISO, null, - "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" + "2017年8月10日木曜日 15時15分00秒 " + + "米国太平洋夏時間" }, {Locale.JAPAN, JAPANESE, ASIATOKYO, ISO, ASIATOKYO, - "2017\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 " + - "\u65e5\u672c\u6a19\u6e96\u6642" + "2017年8月11日金曜日 7時15分00秒 " + + "日本標準時" }, {JCAL, null, null, JAPANESE, null, - "Thursday, August 10, 29 Heisei, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 29 Heisei, 3:15:00 PM Pacific Daylight Time" }, {JCAL, HIJRAH, null, JAPANESE, null, - "Thursday, August 10, 29 Heisei, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 29 Heisei, 3:15:00 PM Pacific Daylight Time" }, {HCAL, JAPANESE, null, HIJRAH, null, - "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, Dhuʻl-Qiʻdah 18, 1438 AH, 3:15:00 PM Pacific Daylight Time" }, {JPTYO, null, null, ISO, ASIATOKYO, - "Friday, August 11, 2017, 7:15:00\u202fAM Japan Standard Time" + "Friday, August 11, 2017, 7:15:00 AM Japan Standard Time" }, {JPTYO, null, AMLA, ISO, ASIATOKYO, - "Friday, August 11, 2017, 7:15:00\u202fAM Japan Standard Time" + "Friday, August 11, 2017, 7:15:00 AM Japan Standard Time" }, // invalid tz {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, ISO, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, AMLA, ISO, AMLA, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {RG_GB, null, null, ISO, null, @@ -147,43 +147,43 @@ public class TestUnicodeExtension { // DecimalStyle {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, ISO, null, - "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57, \u0e53:\u0e51\u0e55:" + - "\u0e50\u0e50\u202fPM Pacific Daylight Time" + "Thursday, August ๑๐, ๒๐๑๗, ๓:๑๕:" + + "๐๐ PM Pacific Daylight Time" }, // DecimalStyle, "nu" vs "rg" {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, ISO, null, - "Thursday, August \u0e51\u0e50, \u0e52\u0e50\u0e51\u0e57, \u0e53:\u0e51\u0e55:" + - "\u0e50\u0e50\u202fPM Pacific Daylight Time" + "Thursday, August ๑๐, ๒๐๑๗, ๓:๑๕:" + + "๐๐ PM Pacific Daylight Time" }, // DecimalStyle, invalid {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, ISO, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, // DecimalStyle, locale default // Farsi uses Extended Arabic-Indic numbering system {Locale.forLanguageTag("fa"), null, null, ISO, null, - "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 \u06f1\u06f0 \u0627\u0648\u062a " + - "\u06f2\u06f0\u06f1\u06f7\u060c \u0633\u0627\u0639\u062a \u06f1\u06f5:\u06f1\u06f5:" + - "\u06f0\u06f0 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633\u062a\u0627\u0646\u06cc " + - "\u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" + "پنجشنبه ۱۰ اوت " + + "۲۰۱۷، ساعت ۱۵:۱۵:" + + "۰۰ (وقت تابستانی " + + "غرب امریکا)" }, // Farsi uses Extended Arabic-Indic numbering system // (should not be overridden with it, as "latn" is explicitly specified) {Locale.forLanguageTag("fa-u-nu-latn"), null, null, ISO, null, - "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + - "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + - "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" + "پنجشنبه 10 اوت 2017، " + + "ساعت 15:15:00 (وقت تابس" + + "تانی غرب امریکا)" }, // Dzongkha uses Tibetan numbering system {Locale.forLanguageTag("dz"), null, null, ISO, null, - "\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b, \u0f66\u0fa4\u0fb1" + - "\u0f72\u0f0b\u0f63\u0f7c\u0f0b\u0f22\u0f20\u0f21\u0f27 \u0f5f\u0fb3\u0f0b\u0f56" + - "\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54\u0f0b \u0f5a\u0f7a\u0f66\u0f0b\u0f21\u0f20 " + - "\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b \u0f23 \u0f66\u0f90\u0f62\u0f0b\u0f58" + - "\u0f0b \u0f21\u0f25:\u0f20\u0f20 \u0f55\u0fb1\u0f72\u0f0b\u0f46\u0f0b \u0f56\u0fb1" + - "\u0f44\u0f0b\u0f68\u0f0b\u0f58\u0f72\u0f0b\u0f62\u0f72\u0f0b\u0f40\u0f0b\u0f54\u0f7a" + - "\u0f0b\u0f66\u0f72\u0f0b\u0f55\u0f72\u0f42\u0f0b\u0f49\u0f72\u0f53\u0f0b\u0f66\u0fb2" + - "\u0f74\u0f44\u0f0b\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51" + "གཟའ་པ་སངས་, སྤྱ" + + "ི་ལོ་༢༠༡༧ ཟླ་བ" + + "རྒྱད་པ་ ཚེས་༡༠ " + + "ཆུ་ཚོད་ ༣ སྐར་མ" + + "་ ༡༥:༠༠ ཕྱི་ཆ་ བྱ" + + "ང་ཨ་མི་རི་ཀ་པེ" + + "་སི་ཕིག་ཉིན་སྲ" + + "ུང་ཆུ་ཚོད" }, }; } @@ -194,41 +194,41 @@ public class TestUnicodeExtension { // Locale, Chrono override, Zone override, Expected Chrono, Expected Zone, // Expected formatted string {Locale.JAPAN, null, null, null, null, - "2017\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" + "2017年8月10日木曜日 15時15分00秒 " + + "米国太平洋夏時間" }, {Locale.JAPAN, JAPANESE, null, JAPANESE, null, - "\u5e73\u621029\u5e748\u670810\u65e5\u6728\u66dc\u65e5 15\u664215\u520600\u79d2 " + - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593" + "平成29年8月10日木曜日 15時15分00秒 " + + "米国太平洋夏時間" }, {Locale.JAPAN, JAPANESE, ASIATOKYO, JAPANESE, ASIATOKYO, - "\u5e73\u621029\u5e748\u670811\u65e5\u91d1\u66dc\u65e5 7\u664215\u520600\u79d2 " + - "\u65e5\u672c\u6a19\u6e96\u6642" + "平成29年8月11日金曜日 7時15分00秒 " + + "日本標準時" }, {JCAL, null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {JCAL, HIJRAH, null, HIJRAH, null, - "Thursday, Dhu\u02bbl-Qi\u02bbdah 18, 1438 AH, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, Dhuʻl-Qiʻdah 18, 1438 AH, 3:15:00 PM Pacific Daylight Time" }, {HCAL, JAPANESE, null, JAPANESE, null, - "Thursday, August 10, 29 Heisei, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 29 Heisei, 3:15:00 PM Pacific Daylight Time" }, {JPTYO, null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {JPTYO, null, AMLA, null, AMLA, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, // invalid tz {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {Locale.forLanguageTag("en-US-u-tz-jpzzz"), null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, {RG_GB, null, null, null, null, @@ -237,42 +237,42 @@ public class TestUnicodeExtension { // DecimalStyle {Locale.forLanguageTag("en-US-u-nu-thai"), null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, // DecimalStyle, "nu" vs "rg" {Locale.forLanguageTag("en-US-u-nu-thai-rg-uszzzz"), null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, // DecimalStyle, invalid {Locale.forLanguageTag("en-US-u-nu-foo"), null, null, null, null, - "Thursday, August 10, 2017, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 2017, 3:15:00 PM Pacific Daylight Time" }, // DecimalStyle, locale default // Farsi uses Extended Arabic-Indic numbering system // (should not be overridden with it) {Locale.forLanguageTag("fa"), null, null, null, null, - "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + - "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + - "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" + "پنجشنبه 10 اوت 2017، " + + "ساعت 15:15:00 (وقت تابس" + + "تانی غرب امریکا)" }, // Farsi uses Extended Arabic-Indic numbering system // (should not be overridden with it) {Locale.forLanguageTag("fa-u-nu-latn"), null, null, null, null, - "\u067e\u0646\u062c\u0634\u0646\u0628\u0647 10 \u0627\u0648\u062a 2017\u060c " + - "\u0633\u0627\u0639\u062a 15:15:00 (\u0648\u0642\u062a \u062a\u0627\u0628\u0633" + - "\u062a\u0627\u0646\u06cc \u063a\u0631\u0628 \u0627\u0645\u0631\u06cc\u06a9\u0627)" + "پنجشنبه 10 اوت 2017، " + + "ساعت 15:15:00 (وقت تابس" + + "تانی غرب امریکا)" }, // Dzongkha uses Tibetan numbering system // (should not be overridden with it) {Locale.forLanguageTag("dz"), null, null, null, null, - "\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b, \u0f66\u0fa4\u0fb1" + - "\u0f72\u0f0b\u0f63\u0f7c\u0f0b2017 \u0f5f\u0fb3\u0f0b\u0f56\u0f62\u0f92\u0fb1" + - "\u0f51\u0f0b\u0f54\u0f0b \u0f5a\u0f7a\u0f66\u0f0b10 \u0f46\u0f74\u0f0b\u0f5a" + - "\u0f7c\u0f51\u0f0b 3 \u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b 15:00 \u0f55\u0fb1" + - "\u0f72\u0f0b\u0f46\u0f0b \u0f56\u0fb1\u0f44\u0f0b\u0f68\u0f0b\u0f58\u0f72\u0f0b" + - "\u0f62\u0f72\u0f0b\u0f40\u0f0b\u0f54\u0f7a\u0f0b\u0f66\u0f72\u0f0b\u0f55\u0f72" + - "\u0f42\u0f0b\u0f49\u0f72\u0f53\u0f0b\u0f66\u0fb2\u0f74\u0f44\u0f0b\u0f46\u0f74" + - "\u0f0b\u0f5a\u0f7c\u0f51" + "གཟའ་པ་སངས་, སྤྱ" + + "ི་ལོ་2017 ཟླ་བརྒྱ" + + "ད་པ་ ཚེས་10 ཆུ་ཚ" + + "ོད་ 3 སྐར་མ་ 15:00 ཕྱ" + + "ི་ཆ་ བྱང་ཨ་མི་" + + "རི་ཀ་པེ་སི་ཕི" + + "ག་ཉིན་སྲུང་ཆུ" + + "་ཚོད" }, }; } @@ -346,7 +346,7 @@ public class TestUnicodeExtension { Object[][] shortTZID() { return new Object[][] { // LDML's short ID, Expected Zone, - // Based on timezone.xml from CLDR v47 + // Based on timezone.xml from CLDR v48 {"adalv", "Europe/Andorra"}, {"aedxb", "Asia/Dubai"}, {"afkbl", "Asia/Kabul"}, @@ -356,7 +356,7 @@ public class TestUnicodeExtension { {"amevn", "Asia/Yerevan"}, {"ancur", "America/Curacao"}, {"aolad", "Africa/Luanda"}, - {"aqams", "Pacific/Auckland"}, + {"aqams", "Antarctica/McMurdo"}, {"aqcas", "Antarctica/Casey"}, {"aqdav", "Antarctica/Davis"}, {"aqddu", "Antarctica/DumontDUrville"}, @@ -821,10 +821,10 @@ public class TestUnicodeExtension { Object[][] getLocalizedDateTimePattern() { return new Object[][] { // Locale, Expected pattern, - {Locale.US, FormatStyle.FULL, "EEEE, MMMM d, y, h:mm:ss\u202fa zzzz"}, - {Locale.US, FormatStyle.LONG, "MMMM d, y, h:mm:ss\u202fa z"}, - {Locale.US, FormatStyle.MEDIUM, "MMM d, y, h:mm:ss\u202fa"}, - {Locale.US, FormatStyle.SHORT, "M/d/yy, h:mm\u202fa"}, + {Locale.US, FormatStyle.FULL, "EEEE, MMMM d, y, h:mm:ss a zzzz"}, + {Locale.US, FormatStyle.LONG, "MMMM d, y, h:mm:ss a z"}, + {Locale.US, FormatStyle.MEDIUM, "MMM d, y, h:mm:ss a"}, + {Locale.US, FormatStyle.SHORT, "M/d/yy, h:mm a"}, {RG_GB, FormatStyle.FULL, "EEEE, d MMMM y, HH:mm:ss zzzz"}, {RG_GB, FormatStyle.LONG, "d MMMM y, HH:mm:ss z"}, {RG_GB, FormatStyle.MEDIUM, "d MMM y, HH:mm:ss"}, diff --git a/test/jdk/java/util/Calendar/CalendarDataTest.java b/test/jdk/java/util/Calendar/CalendarDataTest.java index 2fa767b081a..8d3678bbba9 100644 --- a/test/jdk/java/util/Calendar/CalendarDataTest.java +++ b/test/jdk/java/util/Calendar/CalendarDataTest.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /** * @test * @bug 8190918 8202537 8221432 8231273 8265315 8284840 8333582 + * 8354548 * @summary Tests for region dependent calendar data, i.e., * firstDayOfWeek and minimalDaysInFirstWeek. * @modules jdk.localedata @@ -41,12 +42,12 @@ public class CalendarDataTest { // golden data from CLDR private static final List> FIRSTDAYDATA = List.of( List.of("1", "AG AS BD BR BS BT BW BZ CA CO DM DO ET GT " + - "GU HK HN ID IL IN JM JP KE KH KR LA MH MM MO MT MX MZ " + + "GU HK HN ID IL IN IS JM JP KE KH KR LA MH MM MO MT MX MZ " + "NI NP PA PE PH PK PR PT PY SA SG SV TH TT TW UM US VE " + "VI WS YE ZA ZW"), List.of("2", "001 AD AE AI AL AM AN AR AT AU AX AZ BA BE BG BM BN BY " + "CH CL CM CN CR CY CZ DE DK EC EE ES FI FJ FO FR GB GE GF GP " + - "GR HR HU IE IS IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ " + + "GR HR HU IE IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ " + "MY NL NO NZ PL RE RO RS RU SE SI SK SM TJ TM TR UA UY UZ " + "VA VN XK"), List.of("6", "MV"), diff --git a/test/jdk/java/util/Calendar/CldrFormatNamesTest.java b/test/jdk/java/util/Calendar/CldrFormatNamesTest.java index 36369bef8a7..52d64185269 100644 --- a/test/jdk/java/util/Calendar/CldrFormatNamesTest.java +++ b/test/jdk/java/util/Calendar/CldrFormatNamesTest.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8004489 8006509 8008577 8145136 8202537 8306116 + * @bug 8004489 8006509 8008577 8145136 8202537 8306116 8354548 * @summary Unit test for CLDR FormatData resources * @modules java.base/sun.util.locale.provider * jdk.localedata @@ -47,42 +47,42 @@ public class CldrFormatNamesTest { static final Object[][] CLDR_DATA = { { Locale.JAPAN, - "field.zone", "\u30bf\u30a4\u30e0\u30be\u30fc\u30f3", + "field.zone", "タイムゾーン", "java.time.japanese.DatePatterns", new String[] { - "Gy\u5e74M\u6708d\u65e5EEEE", - "Gy\u5e74M\u6708d\u65e5", - "Gy\u5e74M\u6708d\u65e5", + "Gy年M月d日EEEE", + "Gy年M月d日", + "Gy年M月d日", "GGGGGy/M/d", }, "java.time.roc.DatePatterns", new String[] { - "Gy\u5e74M\u6708d\u65e5EEEE", - "Gy\u5e74M\u6708d\u65e5", + "Gy年M月d日EEEE", + "Gy年M月d日", "Gy/MM/dd", "Gy/MM/dd", }, - "calendarname.buddhist", "\u4ecf\u66a6", + "calendarname.buddhist", "仏暦", }, { Locale.PRC, - "field.zone", "\u65f6\u533a", + "field.zone", "时区", "java.time.islamic.DatePatterns", new String[] { - "Gy\u5e74M\u6708d\u65e5EEEE", - "Gy\u5e74M\u6708d\u65e5", - "Gy\u5e74M\u6708d\u65e5", + "Gy年M月d日EEEE", + "Gy年M月d日", + "Gy年M月d日", "Gy/M/d", }, - "calendarname.islamic", "\u4f0a\u65af\u5170\u5386", + "calendarname.islamic", "伊斯兰历", }, { Locale.GERMANY, - "field.dayperiod", "Tagesh\u00e4lfte", + "field.dayperiod", "Tageshälfte", "java.time.islamic.DatePatterns", new String[] { "EEEE, d. MMMM y G", "d. MMMM y G", "dd.MM.y G", "dd.MM.yy GGGGG", }, - "calendarname.islamic", "Hidschri-Kalender", + "calendarname.islamic", "Hidschra-Kalender", }, { Locale.FRANCE, @@ -93,34 +93,34 @@ public class CldrFormatNamesTest { "d MMM y G", "dd/MM/y GGGGG", }, - "calendarname.islamic", "calendrier h\u00e9girien", + "calendarname.islamic", "calendrier hégirien", }, }; // Islamic calendar symbol names in ar private static final String[] ISLAMIC_MONTH_NAMES = { - "\u0645\u062d\u0631\u0645", - "\u0635\u0641\u0631", - "\u0631\u0628\u064a\u0639 \u0627\u0644\u0623\u0648\u0644", - "\u0631\u0628\u064a\u0639 \u0627\u0644\u0622\u062e\u0631", - "\u062c\u0645\u0627\u062f\u0649 \u0627\u0644\u0623\u0648\u0644\u0649", - "\u062c\u0645\u0627\u062f\u0649 \u0627\u0644\u0622\u062e\u0631\u0629", - "\u0631\u062c\u0628", - "\u0634\u0639\u0628\u0627\u0646", - "\u0631\u0645\u0636\u0627\u0646", - "\u0634\u0648\u0627\u0644", - "\u0630\u0648 \u0627\u0644\u0642\u0639\u062f\u0629", - "\u0630\u0648 \u0627\u0644\u062d\u062c\u0629", + "محرم", + "صفر", + "ربيع الأول", + "ربيع الآخر", + "جمادى الأولى", + "جمادى الآخرة", + "رجب", + "شعبان", + "رمضان", + "شوال", + "ذو القعدة", + "ذو الحجة", }; private static final String[] ISLAMIC_ERA_NAMES = { "", - "\u0647\u0640", + "هـ", }; // Minguo calendar symbol names in zh_Hant private static final String[] ROC_ERA_NAMES = { - "\u6c11\u570b\u524d", - "\u6c11\u570b", + "民國前", + "民國", }; private static int errors = 0; diff --git a/test/jdk/java/util/Locale/bcp47u/DisplayNameTests.java b/test/jdk/java/util/Locale/bcp47u/DisplayNameTests.java index 71606933bfb..7e40985e326 100644 --- a/test/jdk/java/util/Locale/bcp47u/DisplayNameTests.java +++ b/test/jdk/java/util/Locale/bcp47u/DisplayNameTests.java @@ -24,7 +24,7 @@ /* * * @test - * @bug 8176841 8202537 + * @bug 8176841 8202537 8354548 * @summary Tests the display names for BCP 47 U extensions * @modules jdk.localedata * @run junit DisplayNameTests @@ -78,11 +78,11 @@ public class DisplayNameTests { return new Object[][] { // Locale for display, Test Locale, Expected output, {Locale.US, loc1, - "English (Latin, United States, Japanese Calendar, Accounting Currency Format, Pinyin Sort Order, Currency: Japanese Yen, Prefer Emoji Presentation For Emoji Characters, First Day of Week Is Wednesday, 24 Hour System (0\u201323), Loose Line Break Style, Allow Line Breaks In All Words, Imperial Measurement System, Roman Numerals, Region For Supplemental Data: United Kingdom, Region Subdivision: gbsct, Suppress Sentence Breaks After Standard Abbreviations, Time Zone: Japan Time, POSIX Compliant Locale)"}, + "English (Latin, United States, Japanese Calendar, Accounting Currency Format, Pinyin Sort Order, Currency: Japanese Yen, Emoji Presentation For Emoji, First day of week: Wednesday, 24 Hour System (0–23), Loose Line Break Style, Allow Line Breaks In All Words, Imperial Measurement System, Roman Numerals, Region For Supplemental Data: United Kingdom, Region Subdivision: gbsct, Suppress Sentence Breaks After Standard Abbreviations, Time Zone: Japan Time, POSIX Compliant Locale)"}, {Locale.JAPAN, loc1, - "\u82f1\u8a9e (\u30e9\u30c6\u30f3\u6587\u5b57\u3001\u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd\u3001\u548c\u66a6\u3001\u4f1a\u8a08\u901a\u8ca8\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3001\u30d4\u30f3\u30a4\u30f3\u9806\u3001\u901a\u8ca8: \u65e5\u672c\u5186\u3001em: emoji\u3001fw: wed\u300124\u6642\u9593\u5236(0\u301c23)\u3001\u7981\u5247\u51e6\u7406(\u5f31)\u3001lw: breakall\u3001\u30e4\u30fc\u30c9\u30fb\u30dd\u30f3\u30c9\u6cd5\u3001\u30ed\u30fc\u30de\u6570\u5b57\u3001rg: \u30a4\u30ae\u30ea\u30b9\u3001sd: gbsct\u3001ss: standard\u3001\u30bf\u30a4\u30e0\u30be\u30fc\u30f3: \u65e5\u672c\u6642\u9593\u3001\u30ed\u30b1\u30fc\u30eb\u306e\u30d0\u30ea\u30a2\u30f3\u30c8: posix)"}, + "英語 (ラテン文字、アメリカ合衆国、和暦、会計通貨フォーマット、ピンイン順、通貨: 日本円、絵文字表示方法: emoji、fw: wed、24時間制(0〜23)、禁則処理(弱)、単語途中の改行: breakall、ヤード・ポンド法、ローマ数字、rg: イギリス、sd: gbsct、略語の後の文分割: standard、タイムゾーン: 日本時間、ロケールのバリアント: posix)"}, {Locale.forLanguageTag("hi-IN"), loc1, - "\u0905\u0902\u0917\u094d\u0930\u0947\u091c\u093c\u0940 (\u0932\u0948\u091f\u093f\u0928, \u0938\u0902\u092f\u0941\u0915\u094d\u0924 \u0930\u093e\u091c\u094d\u092f, \u091c\u093e\u092a\u093e\u0928\u0940 \u092a\u0902\u091a\u093e\u0902\u0917, \u0932\u0947\u0916\u093e\u0902\u0915\u0928 \u092e\u0941\u0926\u094d\u0930\u093e \u092a\u094d\u0930\u093e\u0930\u0942\u092a, \u092a\u093f\u0928\u092f\u093f\u0928 \u0935\u0930\u094d\u0917\u0940\u0915\u0930\u0923 \u0915\u094d\u0930\u092e, \u092e\u0941\u0926\u094d\u0930\u093e: \u091c\u093e\u092a\u093e\u0928\u0940 \u092f\u0947\u0928, em: emoji, fw: wed, 24 \u0918\u0902\u091f\u094b\u0902 \u0915\u0940 \u092a\u094d\u0930\u0923\u093e\u0932\u0940 (0\u201323), \u0922\u0940\u0932\u0940 \u092a\u0902\u0915\u094d\u0924\u093f \u0935\u093f\u091a\u094d\u091b\u0947\u0926 \u0936\u0948\u0932\u0940, lw: breakall, \u0907\u092e\u094d\u092a\u0940\u0930\u093f\u092f\u0932 \u092e\u093e\u092a\u0928 \u092a\u094d\u0930\u0923\u093e\u0932\u0940, \u0930\u094b\u092e\u0928 \u0938\u0902\u0916\u094d\u092f\u093e\u090f\u0901, rg: \u092f\u0942\u0928\u093e\u0907\u091f\u0947\u0921 \u0915\u093f\u0902\u0917\u0921\u092e, sd: gbsct, ss: standard, \u0938\u092e\u092f \u0915\u094d\u0937\u0947\u0924\u094d\u0930: \u091c\u093e\u092a\u093e\u0928 \u0938\u092e\u092f, \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u092a\u094d\u0930\u0915\u093e\u0930: posix)"}, + "अंग्रेज़ी (लैटिन, संयुक्त राज्य, जापानी पंचांग, लेखांकन मुद्रा प्रारूप, पिनयिन वर्गीकरण क्रम, मुद्रा: जापानी येन, इमोजी का प्रज़ेंटेशन: emoji, fw: wed, 24 घंटों की प्रणाली (0–23), ढीली पंक्ति विच्छेद शैली, शब्दों के बीच पंक्ति विच्छेद: breakall, इम्पीरियल मापन प्रणाली, रोमन संख्याएँ, rg: यूनाइटेड किंगडम, sd: gbsct, संक्षेपण के बाद वाक्य विच्छेद: standard, समय क्षेत्र: जापान समय, स्थानीय प्रकार: posix)"}, // cases where no localized types are available. fall back to "key: type" {Locale.US, Locale.forLanguageTag("en-u-ca-unknown"), "English (Calendar: unknown)"}, @@ -93,8 +93,8 @@ public class DisplayNameTests { {Locale.US, loc4, "United States (Japanese Calendar)"}, {Locale.US, loc5, ""}, - // invalid cases - {loc6, loc6, "\u4e2d\u6587 (\u4e2d\u56fd\uff0c\u65e5\u5386\uff1adddd\uff0c\u8d27\u5e01\uff1addd\uff0cfw\uff1amoq\uff0c\u6570\u5b57\uff1addd\uff0crg\uff1atwzz\uff0c\u65f6\u533a\uff1aunknown)"}, + // non localizable cases + {loc6, loc6, "中文 (中国,日历:dddd,货币:ddd,fw:moq,数字:ddd,rg:twzz,时区:unknown)"}, {Locale.US, loc6, "Chinese (China, Calendar: dddd, Currency: ddd, First day of week: moq, Numbers: ddd, Region For Supplemental Data: twzz, Time Zone: unknown)"}, }; } diff --git a/test/jdk/java/util/Locale/bcp47u/FormatTests.java b/test/jdk/java/util/Locale/bcp47u/FormatTests.java index 4ad676e56c5..952a8c47821 100644 --- a/test/jdk/java/util/Locale/bcp47u/FormatTests.java +++ b/test/jdk/java/util/Locale/bcp47u/FormatTests.java @@ -24,7 +24,7 @@ /* * * @test - * @bug 8176841 8194148 8284840 8306116 8333582 + * @bug 8176841 8194148 8284840 8306116 8333582 8354548 * @summary Tests *Format class deals with Unicode extensions * correctly. * @modules jdk.localedata @@ -96,7 +96,7 @@ public class FormatTests { // -ca {JCAL, "java.util.JapaneseImperialCalendar", null, - "Thursday, August 10, 29 Heisei, 3:15:00\u202fPM Pacific Daylight Time" + "Thursday, August 10, 29 Heisei at 3:15:00\u202fPM Pacific Daylight Time" }, // -tz diff --git a/test/jdk/java/util/Locale/bcp47u/spi/LocaleNameProviderTests.java b/test/jdk/java/util/Locale/bcp47u/spi/LocaleNameProviderTests.java index 2ff229fa1c9..f39ca802530 100644 --- a/test/jdk/java/util/Locale/bcp47u/spi/LocaleNameProviderTests.java +++ b/test/jdk/java/util/Locale/bcp47u/spi/LocaleNameProviderTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * * @test - * @bug 8176841 + * @bug 8176841 8354548 * @summary Tests LocaleNameProvider SPIs * @library provider * @build provider/module-info provider/foo.LocaleNameProviderImpl @@ -40,7 +40,7 @@ import java.util.Locale; * LocaleNameProvider works. */ public class LocaleNameProviderTests { - private static final String expected = "foo (foo_ca:foo_japanese)"; + private static final String expected = "foo (foo_ca=foo_japanese)"; public static void main(String... args) { String name = Locale.forLanguageTag("foo-u-ca-japanese").getDisplayName(Locale.of("foo")); diff --git a/test/jdk/java/util/Locale/bcp47u/spi/provider/foo/LocaleNameProviderImpl.java b/test/jdk/java/util/Locale/bcp47u/spi/provider/foo/LocaleNameProviderImpl.java index 8bf1a8e597d..6a9fa06557a 100644 --- a/test/jdk/java/util/Locale/bcp47u/spi/provider/foo/LocaleNameProviderImpl.java +++ b/test/jdk/java/util/Locale/bcp47u/spi/provider/foo/LocaleNameProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, 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. * * This code is free software; you can redistribute it and/or modify it @@ -60,6 +60,6 @@ public class LocaleNameProviderImpl extends LocaleNameProvider { @Override public String getDisplayUnicodeExtensionType(String extType, String key, Locale target) { - return "foo_" + key + ":foo_" + extType; + return "foo_" + key + "=foo_" + extType; } } diff --git a/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java b/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java index b6c80b6d7d0..0114c42375d 100644 --- a/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java +++ b/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java @@ -24,7 +24,7 @@ /* * @test * @bug 8005471 8008577 8129881 8130845 8136518 8181157 8210490 8220037 - * 8234347 8236548 8317979 + * 8234347 8236548 8317979 8354548 * @modules jdk.localedata * @run main CLDRDisplayNamesTest * @summary Make sure that localized time zone names of CLDR are used @@ -47,34 +47,28 @@ public class CLDRDisplayNamesTest { static final String[][] CLDR_DATA = { { "ja-JP", - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", + "米国太平洋標準時", "PST", - "\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u590f\u6642\u9593", + "米国太平洋夏時間", "PDT", - //"\u30a2\u30e1\u30ea\u30ab\u592a\u5e73\u6d0b\u6642\u9593", - //"PT" }, { "zh-CN", - "\u5317\u7f8e\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", + "北美太平洋标准时间", "PST", - "\u5317\u7f8e\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6\u95f4", + "北美太平洋夏令时间", "PDT", - //"\u5317\u7f8e\u592a\u5e73\u6d0b\u65f6\u95f4", - //"PT", }, { "de-DE", - "Nordamerikanische Westk\u00fcsten-Normalzeit", + "Nordamerikanische Westküsten-Normalzeit", "PST", - "Nordamerikanische Westk\u00fcsten-Sommerzeit", + "Nordamerikanische Westküsten-Sommerzeit", "PDT", - //"Nordamerikanische Westk\u00fcstenzeit", - //"PT", }, }; - private static final String NO_INHERITANCE_MARKER = "\u2205\u2205\u2205"; + private static final String NO_INHERITANCE_MARKER = "∅∅∅"; public static void main(String[] args) { // Make sure that localized time zone names of CLDR are used diff --git a/test/jdk/sun/text/resources/LocaleData.cldr b/test/jdk/sun/text/resources/LocaleData.cldr index c56ad663798..9d81c50ae1e 100644 --- a/test/jdk/sun/text/resources/LocaleData.cldr +++ b/test/jdk/sun/text/resources/LocaleData.cldr @@ -1,5 +1,26 @@ # +# Copyright (c) 2015, 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. +# +# 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. +# + # # List of locale data for locale-data test # @@ -2384,15 +2405,15 @@ FormatData/zh_HK/DayAbbreviations/1=週一 FormatData/zh_HK/DayAbbreviations/2=週二 FormatData/zh_HK/latn.NumberPatterns/1=¤#,##0.00 CurrencyNames/zh_HK/HKD=HK$ -FormatData/zh_HK/TimePatterns/0=ah:mm:ss [zzzz] -FormatData/zh_HK/TimePatterns/1=ah:mm:ss [z] +FormatData/zh_HK/TimePatterns/0=ah:mm:ss '['zzzz']' +FormatData/zh_HK/TimePatterns/1=ah:mm:ss '['z']' FormatData/zh_HK/TimePatterns/2=ah:mm:ss FormatData/zh_HK/TimePatterns/3=ah:mm FormatData/zh_HK/DatePatterns/0=y年M月d日EEEE FormatData/zh_HK/DatePatterns/1=y年M月d日 FormatData/zh_HK/DatePatterns/2=y年M月d日 FormatData/zh_HK/DatePatterns/3=d/M/y -FormatData/zh_HK/DateTimePatterns/0={1} {0} +FormatData/zh_HK/DateTimePatterns/0={1}{0} #bug #4149569 LocaleNames/tr/TR=Türkiye @@ -3216,8 +3237,8 @@ LocaleNames/es_US/kk=kazajo LocaleNames/es_US/km=jemer LocaleNames/es_US/kn=canarés LocaleNames/es_US/kr=kanuri -LocaleNames/es_US/ks=cachemiro -LocaleNames/es_US/ku=kurdo +LocaleNames/es_US/ks=cachemir +LocaleNames/es_US/ku=kurdo kurmanyi LocaleNames/es_US/kv=komi LocaleNames/es_US/kw=córnico LocaleNames/es_US/ky=kirguís @@ -3249,7 +3270,7 @@ LocaleNames/es_US/sn=shona LocaleNames/es_US/ss=siswati LocaleNames/es_US/st=sesotho del sur LocaleNames/es_US/su=sundanés -LocaleNames/es_US/sw=swahili +LocaleNames/es_US/sw=suajili LocaleNames/es_US/tg=tayiko LocaleNames/es_US/tn=setsuana LocaleNames/es_US/to=tongano @@ -3344,7 +3365,7 @@ LocaleNames/pt/gu=guzerate LocaleNames/pt/gv=manx LocaleNames/pt/ha=hauçá LocaleNames/pt/he=hebraico -LocaleNames/pt/hi=híndi +LocaleNames/pt/hi=hindi LocaleNames/pt/ho=hiri motu LocaleNames/pt/hr=croata LocaleNames/pt/ht=haitiano @@ -3372,7 +3393,7 @@ LocaleNames/pt/kn=canarim LocaleNames/pt/ko=coreano LocaleNames/pt/kr=canúri LocaleNames/pt/ks=caxemira -LocaleNames/pt/ku=curdo +LocaleNames/pt/ku=curmânji LocaleNames/pt/kv=komi LocaleNames/pt/kw=córnico LocaleNames/pt/ky=quirguiz @@ -3859,7 +3880,7 @@ LocaleNames/ga/CD=Poblacht Dhaonlathach an Chongó LocaleNames/ga/CF=Poblacht na hAfraice Láir LocaleNames/ga/CG=Congó-Brazzaville LocaleNames/ga/CH=an Eilvéis -LocaleNames/ga/CI=An Cósta Eabhair +LocaleNames/ga/CI=Côte d’Ivoire LocaleNames/ga/CK=Oileáin Cook LocaleNames/ga/CL=an tSile LocaleNames/ga/CM=Camarún @@ -3867,7 +3888,7 @@ LocaleNames/ga/CN=an tSín LocaleNames/ga/CO=an Cholóim LocaleNames/ga/CR=Cósta Ríce LocaleNames/ga/CU=Cúba -LocaleNames/ga/CV=Rinn Verde +LocaleNames/ga/CV=Poblacht Cabo Verde LocaleNames/ga/CX=Oileán na Nollag LocaleNames/ga/CY=an Chipir LocaleNames/ga/CZ=an tSeicia @@ -3875,11 +3896,11 @@ LocaleNames/ga/DE=an Ghearmáin LocaleNames/ga/DK=an Danmhairg LocaleNames/ga/DM=Doiminice LocaleNames/ga/DO=an Phoblacht Dhoiminiceach -LocaleNames/ga/DZ=An Ailgéir +LocaleNames/ga/DZ=an Ailgéir LocaleNames/ga/EC=Eacuadór LocaleNames/ga/EE=an Eastóin -LocaleNames/ga/EG=An Éigipt -LocaleNames/ga/EH=An Sahára Thiar +LocaleNames/ga/EG=an Éigipt +LocaleNames/ga/EH=an Sahára Thiar LocaleNames/ga/ES=an Spáinn LocaleNames/ga/ET=an Aetóip LocaleNames/ga/FI=an Fhionlainn @@ -3895,8 +3916,8 @@ LocaleNames/ga/GF=Guáin na Fraince LocaleNames/ga/GH=Gána LocaleNames/ga/GI=Giobráltar LocaleNames/ga/GL=an Ghraonlainn -LocaleNames/ga/GM=An Ghaimbia -LocaleNames/ga/GN=An Ghuine +LocaleNames/ga/GM=an Ghaimbia +LocaleNames/ga/GN=an Ghuine LocaleNames/ga/GP=Guadalúip LocaleNames/ga/GQ=an Ghuine Mheánchiorclach LocaleNames/ga/GR=an Ghréig @@ -3935,12 +3956,12 @@ LocaleNames/ga/KZ=an Chasacstáin LocaleNames/ga/LB=an Liobáin LocaleNames/ga/LI=Lichtinstéin LocaleNames/ga/LK=Srí Lanca -LocaleNames/ga/LR=An Libéir +LocaleNames/ga/LR=an Libéir LocaleNames/ga/LS=Leosóta LocaleNames/ga/LT=an Liotuáin LocaleNames/ga/LU=Lucsamburg LocaleNames/ga/LV=an Laitvia -LocaleNames/ga/LY=An Libia +LocaleNames/ga/LY=an Libia LocaleNames/ga/MA=Maracó LocaleNames/ga/MC=Monacó LocaleNames/ga/MD=an Mholdóiv @@ -3950,7 +3971,7 @@ LocaleNames/ga/ML=Mailí LocaleNames/ga/MM=Maenmar (Burma) LocaleNames/ga/MN=an Mhongóil LocaleNames/ga/MP=Na hOileáin Mháirianacha Thuaidh -LocaleNames/ga/MR=An Mháratái +LocaleNames/ga/MR=an Mháratáin LocaleNames/ga/MS=Montsarat LocaleNames/ga/MT=Málta LocaleNames/ga/MU=Oileán Mhuirís @@ -3961,9 +3982,9 @@ LocaleNames/ga/MY=an Mhalaeisia LocaleNames/ga/MZ=Mósaimbíc LocaleNames/ga/NA=an Namaib LocaleNames/ga/NC=an Nua-Chaladóin -LocaleNames/ga/NE=An Nígir +LocaleNames/ga/NE=an Nígir LocaleNames/ga/NF=Oileán Norfolk -LocaleNames/ga/NG=An Nigéir +LocaleNames/ga/NG=an Nigéir LocaleNames/ga/NI=Nicearagua LocaleNames/ga/NL=an Ísiltír LocaleNames/ga/NO=an Iorua @@ -3989,7 +4010,7 @@ LocaleNames/ga/RW=Ruanda LocaleNames/ga/SA=an Araib Shádach LocaleNames/ga/SB=Oileáin Sholaimh LocaleNames/ga/SC=na Séiséil -LocaleNames/ga/SD=An tSúdáin +LocaleNames/ga/SD=an tSúdáin LocaleNames/ga/SE=an tSualainn LocaleNames/ga/SG=Singeapór LocaleNames/ga/SH=San Héilin @@ -3998,13 +4019,13 @@ LocaleNames/ga/SJ=Svalbard agus Jan Mayen LocaleNames/ga/SK=an tSlóvaic LocaleNames/ga/SL=Siarra Leon LocaleNames/ga/SM=San Mairíne -LocaleNames/ga/SN=An tSeineagáil +LocaleNames/ga/SN=an tSeineagáil LocaleNames/ga/SO=an tSomáil LocaleNames/ga/SR=Suranam LocaleNames/ga/ST=São Tomé agus Príncipe LocaleNames/ga/SV=An tSalvadóir LocaleNames/ga/SY=an tSiria -LocaleNames/ga/SZ=eSuaitíní +LocaleNames/ga/SZ=Esuaitíní LocaleNames/ga/TC=Oileáin na dTurcach agus Caicos LocaleNames/ga/TD=Sead LocaleNames/ga/TF=Críocha Francacha Dheisceart an Domhain @@ -4014,7 +4035,7 @@ LocaleNames/ga/TJ=an Táidsíceastáin LocaleNames/ga/TK=Tócalá LocaleNames/ga/TL=Tíomór Thoir LocaleNames/ga/TM=an Tuircméanastáin -LocaleNames/ga/TN=An Tuinéis +LocaleNames/ga/TN=an Tuinéis LocaleNames/ga/TR=an Tuirc LocaleNames/ga/TT=Oileán na Tríonóide agus Tobága LocaleNames/ga/TV=Túvalú @@ -4133,7 +4154,7 @@ LocaleNames/sr/ja=јапански LocaleNames/sr/ka=грузијски LocaleNames/sr/km=кмерски LocaleNames/sr/ko=корејски -LocaleNames/sr/ku=курдски +LocaleNames/sr/ku=курманџи LocaleNames/sr/ky=киргиски LocaleNames/sr/la=латински LocaleNames/sr/lt=литвански @@ -5328,7 +5349,7 @@ LocaleNames/es/kk=kazajo LocaleNames/es/km=jemer LocaleNames/es/kn=canarés LocaleNames/es/ks=cachemir -LocaleNames/es/ku=kurdo +LocaleNames/es/ku=kurmanji LocaleNames/es/ky=kirguís LocaleNames/es/lu=luba-katanga LocaleNames/es/mr=maratí @@ -5447,7 +5468,7 @@ LocaleNames/nl/kn=Kannada LocaleNames/nl/ko=Koreaans LocaleNames/nl/kr=Kanuri LocaleNames/nl/ks=Kasjmiri -LocaleNames/nl/ku=Koerdisch +LocaleNames/nl/ku=Kurmanci LocaleNames/nl/kv=Komi LocaleNames/nl/kw=Cornish LocaleNames/nl/ky=Kirgizisch @@ -6504,7 +6525,7 @@ CurrencyNames/zh_TW/mxn=墨西哥披索 CurrencyNames/zh_TW/mxv=墨西哥轉換單位 (UDI) CurrencyNames/zh_TW/myr=馬來西亞令吉 CurrencyNames/zh_TW/mzn=莫三比克梅蒂卡爾 -CurrencyNames/zh_TW/nio=尼加拉瓜金科多巴 +CurrencyNames/zh_TW/nio=尼加拉瓜科多巴 CurrencyNames/zh_TW/rol=舊羅馬尼亞列伊 CurrencyNames/zh_TW/ron=羅馬尼亞列伊 CurrencyNames/zh_TW/rsd=塞爾維亞戴納 @@ -6521,9 +6542,9 @@ CurrencyNames/zh_TW/tzs=坦尚尼亞先令 CurrencyNames/zh_TW/uzs=烏茲別克索姆 CurrencyNames/zh_TW/veb=委內瑞拉玻利瓦 (1871–2008) CurrencyNames/zh_TW/vef=委內瑞拉玻利瓦 (2008–2018) -CurrencyNames/zh_TW/xaf=法郎 (CFA–BEAC) +CurrencyNames/zh_TW/xaf=中非法郎 CurrencyNames/zh_TW/xag=白銀 -CurrencyNames/zh_TW/xof=法郎 (CFA–BCEAO) +CurrencyNames/zh_TW/xof=西非法郎 CurrencyNames/zh_TW/xpd=帕拉狄昂 CurrencyNames/zh_TW/xpt=白金 CurrencyNames/zh_TW/xts=測試用貨幣代碼 @@ -7867,7 +7888,7 @@ FormatData/nn/latn.NumberElements/0=, FormatData/nn/latn.NumberElements/1=  # CalendarData consolidated to root -CalendarData//firstDayOfWeek=1: AG AS BD BR BS BT BW BZ CA CO DM DO ET GT GU HK HN ID IL IN JM JP KE KH KR LA MH MM MO MT MX MZ NI NP PA PE PH PK PR PT PY SA SG SV TH TT TW UM US VE VI WS YE ZA ZW;2: 001 AD AE AI AL AM AN AR AT AU AX AZ BA BE BG BM BN BY CH CL CM CN CR CY CZ DE DK EC EE ES FI FJ FO FR GB GE GF GP GR HR HU IE IS IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ MY NL NO NZ PL RE RO RS RU SE SI SK SM TJ TM TR UA UY UZ VA VN XK;6: MV;7: AF BH DJ DZ EG IQ IR JO KW LY OM QA SD SY +CalendarData//firstDayOfWeek=1: AG AS BD BR BS BT BW BZ CA CO DM DO ET GT GU HK HN ID IL IN IS JM JP KE KH KR LA MH MM MO MT MX MZ NI NP PA PE PH PK PR PT PY SA SG SV TH TT TW UM US VE VI WS YE ZA ZW;2: 001 AD AE AI AL AM AN AR AT AU AX AZ BA BE BG BM BN BY CH CL CM CN CR CY CZ DE DK EC EE ES FI FJ FO FR GB GE GF GP GR HR HU IE IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ MY NL NO NZ PL RE RO RS RU SE SI SK SM TJ TM TR UA UY UZ VA VN XK;6: MV;7: AF BH DJ DZ EG IQ IR JO KW LY OM QA SD SY CalendarData//minimalDaysInFirstWeek=1: 001 GU UM US VI;4: AD AN AT AX BE BG CH CZ DE DK EE ES FI FJ FO FR GB GF GG GI GP GR HU IE IM IS IT JE LI LT LU MC MQ NL NO PL PT RE RU SE SJ SK SM VA # tzdata2022f @@ -7876,3 +7897,9 @@ TimeZoneNames/en/America\/Chihuahua/1=Central Standard Time # bug 8303472 LocaleNames/en/TR=Türkiye + +# tok locale has '#' literals. Verify they are correctly escaped +FormatData/tok/DatePatterns/0='sike' '#'y 'la' MMM 'la' 'suno' '#'d +FormatData/tok/DatePatterns/1='tenpo' 'sike' '#'y 'la' 'tenpo' MMMM 'la' 'tenpo' 'suno' '#'d +FormatData/tok/DatePatterns/2='sike' '#'y 'la' MMM 'la' 'suno' '#'d +FormatData/tok/DatePatterns/3=y-MM-dd diff --git a/test/jdk/sun/text/resources/LocaleDataTest.java b/test/jdk/sun/text/resources/LocaleDataTest.java index 40182034854..472576f327c 100644 --- a/test/jdk/sun/text/resources/LocaleDataTest.java +++ b/test/jdk/sun/text/resources/LocaleDataTest.java @@ -42,6 +42,7 @@ * 8209775 8221432 8227127 8230284 8231273 8233579 8234288 8250665 8255086 * 8251317 8274658 8283277 8283805 8265315 8287868 8295564 8284840 8296715 * 8301206 8303472 8317979 8306116 8174269 8333582 8357075 8357882 8367021 + 8354548 * @summary Verify locale data * @modules java.base/sun.util.resources * @modules jdk.localedata diff --git a/test/jdk/sun/util/resources/TimeZone/Bug6317929.java b/test/jdk/sun/util/resources/TimeZone/Bug6317929.java index e952b3f1be3..8b0eba1760e 100644 --- a/test/jdk/sun/util/resources/TimeZone/Bug6317929.java +++ b/test/jdk/sun/util/resources/TimeZone/Bug6317929.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6317929 6409419 8008577 8174269 + * @bug 6317929 6409419 8008577 8174269 8354548 * @modules jdk.localedata * @summary Test case for tzdata2005m support for 9 locales * @run main Bug6317929 @@ -59,25 +59,25 @@ public class Bug6317929 { "\"Eastern Standard Time\""); tzLocale = locales2Test[1]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("Nordamerikanische Ostk\u00fcsten-Normalzeit")) + ("Nordamerikanische Ostküsten-Normalzeit")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"Nordamerikanische Ostk\u00fcsten-Normalzeit\""); + "\"Nordamerikanische Ostküsten-Normalzeit\""); tzLocale = locales2Test[2]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("hora est\u00e1ndar oriental")) + ("hora estándar oriental")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"hora est\u00e1ndar oriental\""); + "\"hora estándar oriental\""); tzLocale = locales2Test[3]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("heure normale de l\u2019Est nord-am\u00e9ricain")) + ("heure normale de l’Est nord-américain")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"heure normale de l\u2019Est nord-am\u00e9ricain\""); + "\"heure normale de l’Est nord-américain\""); tzLocale = locales2Test[4]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals ("Ora standard orientale USA")) @@ -86,40 +86,39 @@ public class Bug6317929 { "America/Coral_Harbour should be " + "\"Ora standard orientale USA\""); tzLocale = locales2Test[5]; - if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u30a2\u30e1\u30ea\u30ab\u6771\u90e8\u6a19\u6e96\u6642")) + if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals("米国東部標準時")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"\u30a2\u30e1\u30ea\u30ab\u6771\u90e8\u6a19\u6e96\u6642\""); + "\"米国東部標準時\""); tzLocale = locales2Test[6]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\ubbf8 \ub3d9\ubd80 \ud45c\uc900\uc2dc")) + ("미 동부 표준시")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"\ubbf8 \ub3d9\ubd80 \ud45c\uc900\uc2dc\""); + "\"미 동부 표준시\""); tzLocale = locales2Test[7]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u00f6stnordamerikansk normaltid")) + ("östnordamerikansk normaltid")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"\u00f6stnordamerikansk normaltid\""); + "\"östnordamerikansk normaltid\""); tzLocale = locales2Test[8]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u5317\u7f8e\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4")) + ("北美东部标准时间")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"\u5317\u7f8e\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4\""); + "\"北美东部标准时间\""); tzLocale = locales2Test[9]; if (!Coral_Harbour.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u6771\u90e8\u6a19\u6e96\u6642\u9593")) + ("東部標準時間")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "America/Coral_Harbour should be " + - "\"\u6771\u90e8\u6a19\u6e96\u6642\u9593\""); + "\"東部標準時間\""); TimeZone Currie = TimeZone.getTimeZone("Australia/Currie"); tzLocale = locales2Test[0]; @@ -138,59 +137,59 @@ public class Bug6317929 { "\"Ostaustralische Normalzeit\""); tzLocale = locales2Test[2]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("hora est\u00e1ndar de Australia oriental")) + ("hora estándar de Australia oriental")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"hora est\u00e1ndar de Australia oriental\""); + "\"hora estándar de Australia oriental\""); tzLocale = locales2Test[3]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("heure normale de l\u2019Est de l\u2019Australie")) + ("heure normale de l’Est de l’Australie")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"heure normale de l\u2019Est de l\u2019Australie\""); + "\"heure normale de l’Est de l’Australie\""); tzLocale = locales2Test[4]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("Ora standard dell\u2019Australia orientale")) + ("Ora standard dell’Australia orientale")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"Ora standard dell\u2019Australia orientale\""); + "\"Ora standard dell’Australia orientale\""); tzLocale = locales2Test[5]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u6771\u90e8\u6a19\u6e96\u6642")) + ("オーストラリア東部標準時")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u6771\u90e8\u6a19\u6e96\u6642\""); + "\"オーストラリア東部標準時\""); tzLocale = locales2Test[6]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544 \ub3d9\ubd80 \ud45c\uc900\uc2dc")) + ("호주 동부 표준시")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544 \ub3d9\ubd80 \ud45c\uc900\uc2dc\""); + "\"호주 동부 표준시\""); tzLocale = locales2Test[7]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u00f6staustralisk normaltid")) + ("östaustralisk normaltid")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"\u00f6staustralisk normaltid\""); + "\"östaustralisk normaltid\""); tzLocale = locales2Test[8]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4")) + ("澳大利亚东部标准时间")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"\u6fb3\u5927\u5229\u4e9a\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4\""); + "\"澳大利亚东部标准时间\""); tzLocale = locales2Test[9]; if (!Currie.getDisplayName(false, TimeZone.LONG, tzLocale).equals - ("\u6fb3\u6d32\u6771\u90e8\u6a19\u6e96\u6642\u9593")) + ("澳洲東部標準時間")) throw new RuntimeException("\n" + tzLocale + ": LONG, " + "non-daylight saving name for " + "Australia/Currie should be " + - "\"\u6fb3\u6d32\u6771\u90e8\u6a19\u6e96\u6642\u9593\""); + "\"澳洲東部標準時間\""); } } diff --git a/test/jdk/sun/util/resources/TimeZone/Bug6442006.java b/test/jdk/sun/util/resources/TimeZone/Bug6442006.java index 982347093be..074e2d8060f 100644 --- a/test/jdk/sun/util/resources/TimeZone/Bug6442006.java +++ b/test/jdk/sun/util/resources/TimeZone/Bug6442006.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 6442006 8008577 8174269 + * @bug 6442006 8008577 8174269 8354548 * @modules jdk.localedata * @summary Test case for verifying timezone display name for Asia/Taipei * @run main Bug6442006 @@ -38,8 +38,8 @@ public class Bug6442006 { TimeZone tz = TimeZone.getTimeZone("Asia/Taipei"); Locale tzLocale = Locale.JAPANESE; - String jaStdName = "\u53f0\u5317\u6a19\u6e96\u6642"; - String jaDstName = "\u53f0\u5317\u590f\u6642\u9593"; + String jaStdName = "台湾標準時"; + String jaDstName = "台湾夏時間"; if (!tz.getDisplayName(false, TimeZone.LONG, tzLocale).equals (jaStdName)) diff --git a/test/jdk/sun/util/resources/TimeZone/Bug8139107.java b/test/jdk/sun/util/resources/TimeZone/Bug8139107.java index 3a65569ad98..e00d4c88889 100644 --- a/test/jdk/sun/util/resources/TimeZone/Bug8139107.java +++ b/test/jdk/sun/util/resources/TimeZone/Bug8139107.java @@ -23,13 +23,14 @@ /* * @test - * @bug 8139107 8174269 + * @bug 8139107 8174269 8354548 * @summary Test that date parsing with DateTimeFormatter pattern * that contains timezone field doesn't trigger NPE. All supported * locales are tested. * @run testng/timeout=480 Bug8139107 */ import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Locale; import org.testng.annotations.Test; @@ -48,7 +49,16 @@ public class Bug8139107 { DateTimeFormatter inputDateTimeFormat = DateTimeFormatter .ofPattern(pattern) .withLocale(tl); - System.out.println("Parse result: " + inputDateTimeFormat.parse(inputDate)); + try { + System.out.println("Parse result: " + inputDateTimeFormat.parse(inputDate)); + } catch (DateTimeParseException dateTimeParseException) { + // Short tz name "MSK" no longer resides in the root locale since CLDR 48 + // as the zone "Europe/Kirov" became the link to "moscow" metazone. + // Prior to that, "Europe/Kirov" had no l10n, thus only the short + // names were retrieved from TZDB, and placed in the root (thus + // guaranteed to be parsed in any locale before). + System.out.println(dateTimeParseException.getMessage()); + } } // Input date time string with short time zone name diff --git a/test/jdk/sun/util/resources/cldr/DateTimeRoundTripTest.java b/test/jdk/sun/util/resources/cldr/DateTimeRoundTripTest.java new file mode 100644 index 00000000000..0c9879c8fd9 --- /dev/null +++ b/test/jdk/sun/util/resources/cldr/DateTimeRoundTripTest.java @@ -0,0 +1,62 @@ +/* + * 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. + * + * 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. + */ + +/* + * @test + * @bug 8354548 + * @modules jdk.localedata + * @summary Tests DateTimeFormatter format/parse round trips; some locale + * may contain reserved characters, eg '#', which should correctly + * be escaped + * @run junit DateTimeRoundTripTest + */ + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +public class DateTimeRoundTripTest { + private static Stream availableLocales() { + return Locale.availableLocales(); + } + + @ParameterizedTest + @MethodSource("availableLocales") + public void testDateTimeRoundTripTest(Locale locale) { + Arrays.stream(FormatStyle.values()).forEach(style -> { + assertDoesNotThrow(() -> + Instant.parse("2018-07-16T23:58:59.000000200Z") + .atZone(ZoneId.of("UTC")) + .format(DateTimeFormatter.ofLocalizedDate(style).withLocale(locale))); + }); + } +} diff --git a/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java b/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java index ed6fb2a58d8..05b0114f1b4 100644 --- a/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java +++ b/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java @@ -24,6 +24,7 @@ /* * @test * @bug 8181157 8202537 8234347 8236548 8261279 8322647 8174269 8346948 + * 8354548 * @modules jdk.localedata * @summary Checks CLDR time zone names are generated correctly at * either build or runtime @@ -51,21 +52,22 @@ public class TimeZoneNamesTest { return new Object[][] { // tzid, locale, style, expected - // This list is as of CLDR version 47, and should be examined + // This list is as of CLDR version 48, and should be examined // on the CLDR data upgrade. - // no "metazone" zones - {"Asia/Srednekolymsk", Locale.US, "Srednekolymsk Standard Time", + // no "metazone" zones (some of them were assigned metazones + // over time, thus they are not "generated" per se + {"Asia/Srednekolymsk", Locale.US, "Magadan Standard Time", "GMT+11:00", - "Srednekolymsk Daylight Time", + "Magadan Summer Time", "GMT+12:00", - "Srednekolymsk Time", + "Magadan Time", "GMT+11:00"}, - {"Asia/Srednekolymsk", Locale.FRANCE, "Srednekolymsk (heure standard)", + {"Asia/Srednekolymsk", Locale.FRANCE, "heure normale de Magadan", "UTC+11:00", - "Srednekolymsk (heure d\u2019\u00e9t\u00e9)", + "heure d’été de Magadan", "UTC+12:00", - "heure : Srednekolymsk", + "heure de Magadan", "UTC+11:00"}, {"America/Punta_Arenas", Locale.US, "Punta Arenas Standard Time", "GMT-03:00", @@ -74,58 +76,58 @@ public class TimeZoneNamesTest { "Punta Arenas Time", "GMT-03:00"}, {"America/Punta_Arenas", Locale.FRANCE, "Punta Arenas (heure standard)", - "UTC\u221203:00", - "Punta Arenas (heure d\u2019\u00e9t\u00e9)", - "UTC\u221202:00", + "UTC−03:00", + "Punta Arenas (heure d’été)", + "UTC−02:00", "heure : Punta Arenas", - "UTC\u221203:00"}, - {"Asia/Famagusta", Locale.US, "Famagusta Standard Time", + "UTC−03:00"}, + {"Asia/Famagusta", Locale.US, "Eastern European Standard Time", "EET", - "Famagusta Daylight Time", + "Eastern European Summer Time", "EEST", - "Famagusta Time", + "Eastern European Time", "EET"}, - {"Asia/Famagusta", Locale.FRANCE, "Famagouste (heure standard)", + {"Asia/Famagusta", Locale.FRANCE, "heure normale d’Europe de l’Est", "EET", - "Famagouste (heure d\u2019\u00e9t\u00e9)", + "heure d’été d’Europe de l’Est", "EEST", - "heure : Famagouste", + "heure d’Europe de l’Est", "EET"}, - {"Europe/Astrakhan", Locale.US, "Astrakhan Standard Time", + {"Europe/Astrakhan", Locale.US, "Samara Standard Time", "GMT+04:00", - "Astrakhan Daylight Time", + "Samara Summer Time", "GMT+05:00", - "Astrakhan Time", + "Samara Time", "GMT+04:00"}, - {"Europe/Astrakhan", Locale.FRANCE, "Astrakhan (heure standard)", + {"Europe/Astrakhan", Locale.FRANCE, "heure normale de Samara", "UTC+04:00", - "Astrakhan (heure d\u2019\u00e9t\u00e9)", + "heure d’été de Samara", "UTC+05:00", - "heure : Astrakhan", + "heure de Samara", "UTC+04:00"}, - {"Europe/Saratov", Locale.US, "Saratov Standard Time", + {"Europe/Saratov", Locale.US, "Samara Standard Time", "GMT+04:00", - "Saratov Daylight Time", + "Samara Summer Time", "GMT+05:00", - "Saratov Time", + "Samara Time", "GMT+04:00"}, - {"Europe/Saratov", Locale.FRANCE, "Saratov (heure standard)", + {"Europe/Saratov", Locale.FRANCE, "heure normale de Samara", "UTC+04:00", - "Saratov (heure d\u2019\u00e9t\u00e9)", + "heure d’été de Samara", "UTC+05:00", - "heure : Saratov", + "heure de Samara", "UTC+04:00"}, - {"Europe/Ulyanovsk", Locale.US, "Ulyanovsk Standard Time", + {"Europe/Ulyanovsk", Locale.US, "Samara Standard Time", "GMT+04:00", - "Ulyanovsk Daylight Time", + "Samara Summer Time", "GMT+05:00", - "Ulyanovsk Time", + "Samara Time", "GMT+04:00"}, - {"Europe/Ulyanovsk", Locale.FRANCE, "Oulianovsk (heure standard)", + {"Europe/Ulyanovsk", Locale.FRANCE, "heure normale de Samara", "UTC+04:00", - "Oulianovsk (heure d\u2019\u00e9t\u00e9)", + "heure d’été de Samara", "UTC+05:00", - "heure : Oulianovsk", + "heure de Samara", "UTC+04:00"}, {"Pacific/Bougainville", Locale.US, "Bougainville Standard Time", "GMT+11:00", @@ -135,45 +137,45 @@ public class TimeZoneNamesTest { "GMT+11:00"}, {"Pacific/Bougainville", Locale.FRANCE, "Bougainville (heure standard)", "UTC+11:00", - "Bougainville (heure d\u2019\u00e9t\u00e9)", + "Bougainville (heure d’été)", "UTC+11:00", "heure : Bougainville", "UTC+11:00"}, - {"Europe/Istanbul", Locale.US, "Istanbul Standard Time", + {"Europe/Istanbul", Locale.US, "Türkiye Standard Time", "GMT+03:00", - "Istanbul Daylight Time", + "Türkiye Summer Time", "GMT+04:00", - "Istanbul Time", + "Türkiye Time", "GMT+03:00"}, - {"Europe/Istanbul", Locale.FRANCE, "Istanbul (heure standard)", + {"Europe/Istanbul", Locale.FRANCE, "heure normale de Turquie", "UTC+03:00", - "Istanbul (heure d\u2019\u00e9t\u00e9)", + "heure avancée de Turquie", "UTC+04:00", - "heure : Istanbul", + "heure de Turquie", "UTC+03:00"}, - {"Asia/Istanbul", Locale.US, "Istanbul Standard Time", + {"Asia/Istanbul", Locale.US, "Türkiye Standard Time", "GMT+03:00", - "Istanbul Daylight Time", + "Türkiye Summer Time", "GMT+04:00", - "Istanbul Time", + "Türkiye Time", "GMT+03:00"}, - {"Asia/Istanbul", Locale.FRANCE, "Istanbul (heure standard)", + {"Asia/Istanbul", Locale.FRANCE, "heure normale de Turquie", "UTC+03:00", - "Istanbul (heure d\u2019\u00e9t\u00e9)", + "heure avancée de Turquie", "UTC+04:00", - "heure : Istanbul", + "heure de Turquie", "UTC+03:00"}, - {"Turkey", Locale.US, "Istanbul Standard Time", + {"Turkey", Locale.US, "Türkiye Standard Time", "GMT+03:00", - "Istanbul Daylight Time", + "Türkiye Summer Time", "GMT+04:00", - "Istanbul Time", + "Türkiye Time", "GMT+03:00"}, - {"Turkey", Locale.FRANCE, "Istanbul (heure standard)", + {"Turkey", Locale.FRANCE, "heure normale de Turquie", "UTC+03:00", - "Istanbul (heure d\u2019\u00e9t\u00e9)", + "heure avancée de Turquie", "UTC+04:00", - "heure : Istanbul", + "heure de Turquie", "UTC+03:00"}, // Short names derived from TZDB at build time diff --git a/test/jdk/tools/jlink/plugins/IncludeLocalesPluginTest.java b/test/jdk/tools/jlink/plugins/IncludeLocalesPluginTest.java index d2c3f2800a8..5551d54a1ea 100644 --- a/test/jdk/tools/jlink/plugins/IncludeLocalesPluginTest.java +++ b/test/jdk/tools/jlink/plugins/IncludeLocalesPluginTest.java @@ -53,7 +53,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * @test * @bug 8152143 8152704 8155649 8165804 8185841 8176841 8190918 * 8179071 8202537 8221432 8222098 8251317 8258794 8265315 - * 8296248 8306116 8174269 8347146 8346948 + * 8296248 8306116 8174269 8347146 8346948 8354548 * @summary IncludeLocalesPlugin tests * @author Naoto Sato * @requires (vm.compMode != "Xcomp" & os.maxMemory >= 2g) @@ -139,15 +139,15 @@ public class IncludeLocalesPluginTest { "(root)", "en", "en_001", "en_150", "en_AG", "en_AI", "en_AT", "en_AU", "en_BB", "en_BE", "en_BM", "en_BS", "en_BW", "en_BZ", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_CZ", "en_DE", - "en_DG", "en_DK", "en_DM", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", - "en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GY", "en_HK", "en_HU", "en_ID", + "en_DG", "en_DK", "en_DM", "en_EE", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", + "en_GB", "en_GD", "en_GE", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GY", "en_HK", "en_HU", "en_ID", "en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_IT", "en_JE", "en_JM", "en_KE", - "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG", "en_MO", + "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_LT", "en_LV", "en_MG", "en_MO", "en_MS", "en_MT", "en_MU", "en_MV", "en_MW", "en_MY", "en_NA", "en_NF", "en_NG", "en_NL", "en_NO", "en_NR", "en_NU", "en_NZ", "en_PG", "en_PK", "en_PL", "en_PN", "en_PT", "en_PW", "en_RO", "en_RW", "en_SB", "en_SC", "en_SD", "en_SE", "en_SG", "en_SH", "en_SI", "en_SK", "en_SL", "en_SS", "en_SX", "en_SZ", "en_TC", "en_TK", "en_TO", - "en_TT", "en_TV", "en_TZ", "en_UG", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VU", "en_WS", + "en_TT", "en_TV", "en_TZ", "en_UA", "en_UG", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VU", "en_WS", "en_ZA", "en_ZM", "en_ZW", "es", "es_419", "es_AR", "es_BO", "es_BR", "es_BZ", "es_CL", "es_CO", "es_CR", "es_CU", "es_DO", "es_EC", "es_GT", "es_HN", "es_MX", "es_NI", "es_PA", "es_PE", "es_PR", "es_PY", "es_SV", "es_US", @@ -176,15 +176,15 @@ public class IncludeLocalesPluginTest { "(root)", "en", "en_001", "en_150", "en_AE", "en_AG", "en_AI", "en_AS", "en_AT", "en_AU", "en_BB", "en_BE", "en_BI", "en_BM", "en_BS", "en_BW", "en_BZ", "en_CA", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_CZ", "en_DE", - "en_DG", "en_DK", "en_DM", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", - "en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GU", "en_GY", + "en_DG", "en_DK", "en_DM", "en_EE", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", + "en_GB", "en_GD", "en_GE", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GU", "en_GY", "en_HK", "en_HU", "en_ID", "en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_IT", "en_JE", "en_JM", - "en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG", + "en_JP", "en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_LT", "en_LV", "en_MG", "en_MH", "en_MO", "en_MP", "en_MS", "en_MT", "en_MU", "en_MV", "en_MW", "en_MY", "en_NA", "en_NF", "en_NG", "en_NL", "en_NO", "en_NR", "en_NU", "en_NZ", "en_PG", "en_PH", "en_PK", "en_PL", "en_PN", "en_PR", "en_PT", "en_PW", "en_RO", "en_RW", "en_SB", "en_SC", "en_SD", "en_SE", "en_SG", "en_SH", "en_SI", "en_SK", "en_SL", "en_SS", "en_SX", - "en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UG", + "en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UA","en_UG", "en_UM", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VI", "en_VU", "en_WS", "en_ZA", "en_ZM", "en_ZW", "ja", "ja_JP", "ja_JP_#Jpan", "ja_JP_JP_#u-ca-japanese"), @@ -356,15 +356,15 @@ public class IncludeLocalesPluginTest { "(root)", "en", "en_001", "en_150", "en_AE", "en_AG", "en_AI", "en_AS", "en_AT", "en_AU", "en_BB", "en_BE", "en_BI", "en_BM", "en_BS", "en_BW", "en_BZ", "en_CA", "en_CC", "en_CH", "en_CK", "en_CM", "en_CX", "en_CY", "en_CZ", "en_DE", - "en_DG", "en_DK", "en_DM", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", - "en_GB", "en_GD", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GU", "en_GY", + "en_DG", "en_DK", "en_DM", "en_EE", "en_ER", "en_ES", "en_FI", "en_FJ", "en_FK", "en_FM", "en_FR", + "en_GB", "en_GD", "en_GE", "en_GG", "en_GH", "en_GI", "en_GM", "en_GS", "en_GU", "en_GY", "en_HK", "en_HU", "en_ID", "en_IE", "en_IL", "en_IM", "en_IN", "en_IO", "en_IT", "en_JE", "en_JM", - "en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_MG", + "en_JP", "en_KE", "en_KI", "en_KN", "en_KY", "en_LC", "en_LR", "en_LS", "en_LT", "en_LV", "en_MG", "en_MH", "en_MO", "en_MP", "en_MS", "en_MT", "en_MU", "en_MV", "en_MW", "en_MY", "en_NA", "en_NF", "en_NG", "en_NL", "en_NO", "en_NR", "en_NU", "en_NZ", "en_PG", "en_PH", "en_PK", "en_PL", "en_PN", "en_PR", "en_PT", "en_PW", "en_RO", "en_RW", "en_SB", "en_SC", "en_SD", "en_SE", "en_SG", "en_SH", "en_SI", "en_SK", "en_SL", "en_SS", "en_SX", - "en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UG", + "en_SZ", "en_TC", "en_TK", "en_TO", "en_TT", "en_TV", "en_TZ", "en_UA","en_UG", "en_UM", "en_US", "en_US_#Latn", "en_US_POSIX", "en_VC", "en_VG", "en_VI", "en_VU", "en_WS", "en_ZA", "en_ZM", "en_ZW"), ""), From 066810c877b206a66cc87537487b17f0481646c3 Mon Sep 17 00:00:00 2001 From: Lawrence Andrews Date: Fri, 7 Nov 2025 20:36:13 +0000 Subject: [PATCH 515/561] 8371485: ProblemList awt/Mixing/AWT_Mixing/JTableInGlassPaneOverlapping.java for linux Reviewed-by: azvegint --- test/jdk/ProblemList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index f7b8939ac6a..5132d012d7f 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -179,7 +179,7 @@ java/awt/Mixing/AWT_Mixing/JSliderInGlassPaneOverlapping.java 8158801 windows-al java/awt/Mixing/AWT_Mixing/JSliderOverlapping.java 8158801 windows-all java/awt/Mixing/AWT_Mixing/JSpinnerInGlassPaneOverlapping.java 8158801 windows-all java/awt/Mixing/AWT_Mixing/JSpinnerOverlapping.java 8158801 windows-all -java/awt/Mixing/AWT_Mixing/JTableInGlassPaneOverlapping.java 8158801 windows-all +java/awt/Mixing/AWT_Mixing/JTableInGlassPaneOverlapping.java 8158801,8357360 windows-all,linux-all java/awt/Mixing/AWT_Mixing/JTableOverlapping.java 8158801 windows-all java/awt/Mixing/AWT_Mixing/JTextAreaInGlassPaneOverlapping.java 8158801 windows-all java/awt/Mixing/AWT_Mixing/JTextAreaOverlapping.java 8158801 windows-all From 88c4678eed818cbe9380f35352e90883fed27d33 Mon Sep 17 00:00:00 2001 From: Leonid Mesnik Date: Sat, 8 Nov 2025 21:30:58 +0000 Subject: [PATCH 516/561] 8371103: vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TestDescription.java failing Reviewed-by: amenkov, sspitsyn --- src/hotspot/share/prims/jvmtiEventController.cpp | 7 ++++--- test/hotspot/jtreg/ProblemList.txt | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hotspot/share/prims/jvmtiEventController.cpp b/src/hotspot/share/prims/jvmtiEventController.cpp index 2b44c069dc5..169ccbe035f 100644 --- a/src/hotspot/share/prims/jvmtiEventController.cpp +++ b/src/hotspot/share/prims/jvmtiEventController.cpp @@ -792,9 +792,6 @@ void JvmtiEventControllerPrivate::set_event_callbacks(JvmtiEnvBase *env, assert(Threads::number_of_threads() == 0 || JvmtiThreadState_lock->is_locked(), "sanity check"); EC_TRACE(("[*] # set event callbacks")); - // May be changing the event handler for ObjectFree. - flush_object_free_events(env); - env->set_event_callbacks(callbacks, size_of_callbacks); jlong enabled_bits = env->env_event_enable()->_event_callback_enabled.get_bits(); @@ -1107,6 +1104,8 @@ JvmtiEventController::set_event_callbacks(JvmtiEnvBase *env, // call the functionality without holding the JvmtiThreadState_lock. JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks); } else { + JvmtiEventControllerPrivate::flush_object_free_events(env); + MutexLocker mu(JvmtiThreadState_lock); JvmtiEventControllerPrivate::set_event_callbacks(env, callbacks, size_of_callbacks); } @@ -1194,6 +1193,8 @@ JvmtiEventController::env_dispose(JvmtiEnvBase *env) { // call the functionality without holding the JvmtiThreadState_lock. JvmtiEventControllerPrivate::env_dispose(env); } else { + JvmtiEventControllerPrivate::flush_object_free_events(env); + MutexLocker mu(JvmtiThreadState_lock); JvmtiEventControllerPrivate::env_dispose(env); } diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 1e4ac9e2848..bc163ae8197 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -171,7 +171,6 @@ vmTestbase/metaspace/gc/firstGC_default/TestDescription.java 8208250 generic-all vmTestbase/nsk/jvmti/scenarios/capability/CM03/cm03t001/TestDescription.java 8073470 linux-all vmTestbase/nsk/jvmti/InterruptThread/intrpthrd003/TestDescription.java 8288911 macosx-all -vmTestbase/nsk/jvmti/scenarios/events/EM02/em02t006/TestDescription.java 8371103 generic-all vmTestbase/jit/escape/LockCoarsening/LockCoarsening001.java 8148743 generic-all vmTestbase/jit/escape/LockCoarsening/LockCoarsening002.java 8208259 generic-all From ebd1c03829c354007a4ca9971be313d19eac2373 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Sun, 9 Nov 2025 07:22:45 +0000 Subject: [PATCH 517/561] 8371163: Make GlyphView/TestGlyphBGHeight.java headless 8371377: javax/swing/text/GlyphView/TestGlyphBGHeight.java fails in Ubuntu 24.04 X11 Reviewed-by: aivanov --- .../text/GlyphView/TestGlyphBGHeight.java | 87 ++++++++----------- 1 file changed, 34 insertions(+), 53 deletions(-) diff --git a/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java b/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java index 000ba16339e..b9062cef0c8 100644 --- a/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java +++ b/test/jdk/javax/swing/text/GlyphView/TestGlyphBGHeight.java @@ -24,85 +24,66 @@ /* * @test * @bug 8017266 - * @key headful * @summary Verifies if Background is painted taller than needed for styled text. * @run main TestGlyphBGHeight */ import java.io.File; -import java.awt.Graphics2D; +import java.awt.Graphics; import java.awt.BorderLayout; import java.awt.Color; import java.awt.image.BufferedImage; -import java.awt.Robot; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.text.Style; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; -import javax.swing.SwingUtilities; public class TestGlyphBGHeight { - static JFrame frame; + private static final int WIDTH = 100; + private static final int HEIGHT = 100; + private static final int FONTSIZE = 32; + private static final Color EMPTY_PIXEL = new Color(0xFFFFFFFF); + + static BufferedImage createImage() throws Exception { + final BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + Graphics g = img.getGraphics(); + g.setColor(EMPTY_PIXEL); + g.fillRect(0, 0, WIDTH, HEIGHT); + return img; + } public static void main(String[] args) throws Exception { - int width = 100; - int height = 100; + final BufferedImage img = createImage(); + final JTextPane textPane = new JTextPane(); + final StyledDocument doc = textPane.getStyledDocument(); + + Style style = textPane.addStyle("superscript", null); + StyleConstants.setSuperscript(style, true); + StyleConstants.setFontSize(style, FONTSIZE); + StyleConstants.setBackground(style, Color.YELLOW); try { - Robot robot = new Robot(); - SwingUtilities.invokeAndWait(() -> { - frame = new JFrame("TestGlyphBGHeight"); - frame.setSize(width, height); - frame.getContentPane().setLayout(new BorderLayout()); + doc.insertString(doc.getLength(), "hello", style); + } catch (Exception e) {} - final JTextPane comp = new JTextPane(); - final StyledDocument doc = comp.getStyledDocument(); + textPane.setSize(WIDTH, HEIGHT); + textPane.setBackground(Color.RED); - Style style = comp.addStyle("superscript", null); - StyleConstants.setSuperscript(style, true); - StyleConstants.setFontSize(style, 32); - StyleConstants.setBackground(style, Color.YELLOW); - try { - doc.insertString(doc.getLength(), "hello", style); - } catch (Exception e) {} + textPane.paint(img.getGraphics()); - comp.setDocument(doc); - comp.setBackground(Color.RED); + ImageIO.write(img, "png", new File("AppTest.png")); - frame.getContentPane().add(comp, BorderLayout.CENTER); - - frame.setLocationRelativeTo(null); - frame.setVisible(true); - }); - robot.waitForIdle(); - robot.delay(1000); - - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = (Graphics2D) img.getGraphics(); - frame.paint(g2d); - ImageIO.write(img, "png", new File("AppTest.png")); - g2d.dispose(); - - BufferedImage bimg = img.getSubimage(0, 80, width, 1); - ImageIO.write(bimg, "png", new File("AppTest1.png")); - robot.waitForIdle(); - robot.delay(1000); - for (int x = 10; x < width / 2; x++) { - Color col = new Color(bimg.getRGB(x, 0)); - System.out.println(Integer.toHexString(bimg.getRGB(x, 0))); - if (col.equals(Color.YELLOW)) { - throw new RuntimeException(" Background is painted taller than needed for styled text"); - } + BufferedImage bimg = img.getSubimage(0, FONTSIZE + 20, WIDTH, 1); + ImageIO.write(bimg, "png", new File("AppTest1.png")); + for (int x = 10; x < WIDTH / 2; x++) { + int col = bimg.getRGB(x, 0); + System.out.println(Integer.toHexString(col)); + if (col == Color.YELLOW.getRGB()) { + throw new RuntimeException(" Background is painted taller than needed for styled text"); } - } finally { - SwingUtilities.invokeAndWait(() -> { - if (frame != null) { - frame.dispose(); - } - }); } } } From 4a14c81a06ab2be1d56cd01288135fbd369eb9c7 Mon Sep 17 00:00:00 2001 From: Prasanta Sadhukhan Date: Sun, 9 Nov 2025 07:23:10 +0000 Subject: [PATCH 518/561] 8299304: Test "java/awt/print/PrinterJob/PageDialogTest.java" fails on macOS 13 x64 because the Page Dialog blocks the Toolkit Reviewed-by: tr --- .../jdk/java/awt/print/PrinterJob/PageDialogTest.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/jdk/java/awt/print/PrinterJob/PageDialogTest.java b/test/jdk/java/awt/print/PrinterJob/PageDialogTest.java index eea118733de..ed02c64b48e 100644 --- a/test/jdk/java/awt/print/PrinterJob/PageDialogTest.java +++ b/test/jdk/java/awt/print/PrinterJob/PageDialogTest.java @@ -22,11 +22,12 @@ */ /* - @test - @bug 6302514 - @key printer - @run main/manual PageDialogTest - @summary A toolkit modal dialog should not be blocked by Page/Print dialog. + * @test + * @bug 6302514 + * @key printer + * @requires (os.family != "mac") + * @run main/manual PageDialogTest + * @summary A toolkit modal dialog should not be blocked by Page/Print dialog. */ import java.awt.BorderLayout; From 66e5a68a33dcd6b23c73c892d51b3efed162b8f8 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas Date: Mon, 10 Nov 2025 05:53:36 +0000 Subject: [PATCH 519/561] 8371343: ZGC: Remove dependency on test execution order for gtests Reviewed-by: stefank, eosterlund --- src/hotspot/share/gc/z/zAddress.hpp | 2 -- test/hotspot/gtest/gc/z/test_zAddress.cpp | 9 ++++----- test/hotspot/gtest/gc/z/test_zLiveMap.cpp | 7 +++---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/hotspot/share/gc/z/zAddress.hpp b/src/hotspot/share/gc/z/zAddress.hpp index de97c17d089..ca904f69277 100644 --- a/src/hotspot/share/gc/z/zAddress.hpp +++ b/src/hotspot/share/gc/z/zAddress.hpp @@ -309,8 +309,6 @@ public: }; class ZGlobalsPointers : public AllStatic { - friend class ZAddressTest; - private: static void set_good_masks(); static void pd_set_good_masks(); diff --git a/test/hotspot/gtest/gc/z/test_zAddress.cpp b/test/hotspot/gtest/gc/z/test_zAddress.cpp index 9f5c8e1f0bc..0df77b01ad2 100644 --- a/test/hotspot/gtest/gc/z/test_zAddress.cpp +++ b/test/hotspot/gtest/gc/z/test_zAddress.cpp @@ -23,9 +23,9 @@ #include "gc/z/zAddress.inline.hpp" #include "gc/z/zGlobals.hpp" -#include "unittest.hpp" +#include "zunittest.hpp" -class ZAddressTest : public ::testing::Test { +class ZAddressTest : public ZTest { protected: static zpointer color(uintptr_t value, uintptr_t color) { return ZAddress::color(zaddress(value | ZAddressHeapBase), color); @@ -374,8 +374,7 @@ protected: static void is_checks() { int young_phase = 0; int old_phase = 0; - // Setup - ZGlobalsPointers::initialize(); + test_is_checks_on_all(); advance_and_test_old_phase(old_phase, 4); @@ -431,6 +430,6 @@ protected: } }; -TEST_F(ZAddressTest, is_checks) { +TEST_VM_F(ZAddressTest, is_checks) { is_checks(); } diff --git a/test/hotspot/gtest/gc/z/test_zLiveMap.cpp b/test/hotspot/gtest/gc/z/test_zLiveMap.cpp index 18b90f5f149..da956b70b2a 100644 --- a/test/hotspot/gtest/gc/z/test_zLiveMap.cpp +++ b/test/hotspot/gtest/gc/z/test_zLiveMap.cpp @@ -24,9 +24,9 @@ #include "gc/z/zGenerationId.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zLiveMap.inline.hpp" -#include "unittest.hpp" +#include "zunittest.hpp" -class ZLiveMapTest : public ::testing::Test { +class ZLiveMapTest : public ZTest { private: // Setup and tear down ZHeap* _old_heap; @@ -36,7 +36,6 @@ private: public: virtual void SetUp() { - ZGlobalsPointers::initialize(); _old_heap = ZHeap::_heap; ZHeap::_heap = (ZHeap*)os::malloc(sizeof(ZHeap), mtTest); @@ -84,6 +83,6 @@ protected: } }; -TEST_F(ZLiveMapTest, strongly_live_for_large_zpage) { +TEST_VM_F(ZLiveMapTest, strongly_live_for_large_zpage) { strongly_live_for_large_zpage(); } From a8b35bf5a60c26e8975a468d4ebe6aac557e4d85 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas Date: Mon, 10 Nov 2025 05:53:55 +0000 Subject: [PATCH 520/561] 8367317: ZGC: ZVirtualMemoryReserver::force_reserve_discontiguous arithmetic underflow Reviewed-by: jsikstro, eosterlund --- src/hotspot/share/gc/z/zVirtualMemoryManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/gc/z/zVirtualMemoryManager.cpp b/src/hotspot/share/gc/z/zVirtualMemoryManager.cpp index 2f81a5cfe09..aec54818a68 100644 --- a/src/hotspot/share/gc/z/zVirtualMemoryManager.cpp +++ b/src/hotspot/share/gc/z/zVirtualMemoryManager.cpp @@ -100,9 +100,10 @@ size_t ZVirtualMemoryReserver::force_reserve_discontiguous(size_t size) { if (reserve_contiguous(to_zoffset(reserve_start), reserve_size)) { reserved += reserve_size; + end -= reserve_size; } - end -= reserve_size * 2; + end -= MIN2(end, reserve_size); } // If (reserved < size) attempt to reserve the rest via normal divide and conquer From 4e4cced710a8e4cd5bb8f49b08798c87b21e8b78 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas Date: Mon, 10 Nov 2025 05:55:34 +0000 Subject: [PATCH 521/561] 8371341: ZGC: Improve gtest interoperability with instrumented builds (ASAN) Reviewed-by: stefank, eosterlund --- .../share/gc/z/zVirtualMemoryManager.hpp | 1 + test/hotspot/gtest/gc/z/test_zForwarding.cpp | 77 ++++++++----------- .../gtest/gc/z/test_zMapper_windows.cpp | 20 +++-- .../gtest/gc/z/test_zVirtualMemoryManager.cpp | 24 +++--- test/hotspot/gtest/gc/z/zunittest.hpp | 45 +++++++++++ 5 files changed, 101 insertions(+), 66 deletions(-) diff --git a/src/hotspot/share/gc/z/zVirtualMemoryManager.hpp b/src/hotspot/share/gc/z/zVirtualMemoryManager.hpp index a9ab86761ac..0fd6045d633 100644 --- a/src/hotspot/share/gc/z/zVirtualMemoryManager.hpp +++ b/src/hotspot/share/gc/z/zVirtualMemoryManager.hpp @@ -33,6 +33,7 @@ using ZVirtualMemoryRegistry = ZRangeRegistry; class ZVirtualMemoryReserver { + friend class ZTest; friend class ZMapperTest; friend class ZVirtualMemoryManagerTest; diff --git a/test/hotspot/gtest/gc/z/test_zForwarding.cpp b/test/hotspot/gtest/gc/z/test_zForwarding.cpp index f22eef50858..3a69ff3cbb7 100644 --- a/test/hotspot/gtest/gc/z/test_zForwarding.cpp +++ b/test/hotspot/gtest/gc/z/test_zForwarding.cpp @@ -28,9 +28,10 @@ #include "gc/z/zGlobals.hpp" #include "gc/z/zHeap.hpp" #include "gc/z/zPage.inline.hpp" +#include "gc/z/zRangeRegistry.inline.hpp" #include "gc/z/zVirtualMemory.inline.hpp" #include "runtime/os.hpp" -#include "unittest.hpp" +#include "zunittest.hpp" using namespace testing; @@ -40,35 +41,21 @@ using namespace testing; #define CAPTURE(expression) CAPTURE1(expression) -class ZForwardingTest : public Test { +class ZForwardingTest : public ZTest { public: // Setup and tear down ZHeap* _old_heap; ZGenerationOld* _old_old; ZGenerationYoung* _old_young; - char* _reserved; - static size_t _page_offset; - - char* reserve_page_memory() { - // Probe for a free 2MB region inside the usable address range. - // Inspired by ZVirtualMemoryManager::reserve_contiguous. - const size_t unused = ZAddressOffsetMax - ZGranuleSize; - const size_t increment = MAX2(align_up(unused / 100, ZGranuleSize), ZGranuleSize); - - for (uintptr_t start = 0; start + ZGranuleSize <= ZAddressOffsetMax; start += increment) { - char* const reserved = os::attempt_reserve_memory_at((char*)ZAddressHeapBase + start, ZGranuleSize, mtTest); - if (reserved != nullptr) { - // Success - return reserved; - } - } - - // Failed - return nullptr; - } + ZAddressReserver _zaddress_reserver; + zoffset _page_offset; virtual void SetUp() { - ZGlobalsPointers::initialize(); + // Only run test on supported Windows versions + if (!is_os_supported()) { + GTEST_SKIP() << "OS not supported"; + } + _old_heap = ZHeap::_heap; ZHeap::_heap = (ZHeap*)os::malloc(sizeof(ZHeap), mtTest); @@ -84,36 +71,34 @@ public: ZGeneration::_old->_seqnum = 1; ZGeneration::_young->_seqnum = 2; - // Preconditions for reserve_free_granule() - ASSERT_NE(ZAddressHeapBase, 0u); - ASSERT_NE(ZAddressOffsetMax, 0u); - ASSERT_NE(ZGranuleSize, 0u); + _zaddress_reserver.SetUp(ZGranuleSize); + _page_offset = _zaddress_reserver.registry()->peek_low_address(); - _reserved = nullptr; + if (_page_offset == zoffset::invalid) { + GTEST_SKIP() << "Unable to reserve memory"; + } - // Find a suitable address for the testing page - char* reserved = reserve_page_memory(); - - ASSERT_NE(reserved, nullptr) << "Failed to reserve the page granule. Test needs tweaking"; - ASSERT_GE(reserved, (char*)ZAddressHeapBase); - ASSERT_LT(reserved, (char*)ZAddressHeapBase + ZAddressOffsetMax); - - _reserved = reserved; - - os::commit_memory((char*)_reserved, ZGranuleSize, false /* executable */); - - _page_offset = uintptr_t(_reserved) - ZAddressHeapBase; + char* const addr = (char*)untype(ZOffset::address_unsafe(_page_offset)); + os::commit_memory(addr, ZGranuleSize, /* executable */ false); } virtual void TearDown() { + if (!is_os_supported()) { + // Test skipped, nothing to cleanup + return; + } + os::free(ZHeap::_heap); ZHeap::_heap = _old_heap; ZGeneration::_old = _old_old; ZGeneration::_young = _old_young; - if (_reserved != nullptr) { - os::uncommit_memory((char*)_reserved, ZGranuleSize, false /* executable */); - os::release_memory((char*)_reserved, ZGranuleSize); + + if (_page_offset != zoffset::invalid) { + char* const addr = (char*)untype(ZOffset::address_unsafe(_page_offset)); + os::uncommit_memory(addr, ZGranuleSize, false /* executable */); } + + _zaddress_reserver.TearDown(); } // Helper functions @@ -219,7 +204,7 @@ public: } } - static void test(void (*function)(ZForwarding*), uint32_t size) { + void test(void (*function)(ZForwarding*), uint32_t size) { // Create page const ZVirtualMemory vmem(zoffset(_page_offset), ZPageSizeSmall); ZPage page(ZPageType::small, ZPageAge::eden, vmem, 0u); @@ -257,7 +242,7 @@ public: } // Run the given function with a few different input values. - static void test(void (*function)(ZForwarding*)) { + void test(void (*function)(ZForwarding*)) { test(function, 1); test(function, 2); test(function, 3); @@ -285,5 +270,3 @@ TEST_VM_F(ZForwardingTest, find_full) { TEST_VM_F(ZForwardingTest, find_every_other) { test(&ZForwardingTest::find_every_other); } - -size_t ZForwardingTest::_page_offset; diff --git a/test/hotspot/gtest/gc/z/test_zMapper_windows.cpp b/test/hotspot/gtest/gc/z/test_zMapper_windows.cpp index ea43859b051..1789d2e3b43 100644 --- a/test/hotspot/gtest/gc/z/test_zMapper_windows.cpp +++ b/test/hotspot/gtest/gc/z/test_zMapper_windows.cpp @@ -34,8 +34,9 @@ using namespace testing; class ZMapperTest : public ZTest { private: - static constexpr size_t ReservationSize = 32 * M; + static constexpr size_t ReservationSize = 3 * ZGranuleSize; + ZAddressReserver _zaddress_reserver; ZVirtualMemoryReserver* _reserver; ZVirtualMemoryRegistry* _registry; @@ -46,9 +47,14 @@ public: GTEST_SKIP() << "OS not supported"; } - _reserver = (ZVirtualMemoryReserver*)os::malloc(sizeof(ZVirtualMemoryManager), mtTest); - _reserver = ::new (_reserver) ZVirtualMemoryReserver(ReservationSize); - _registry = &_reserver->_registry; + _zaddress_reserver.SetUp(ReservationSize); + _reserver = _zaddress_reserver.reserver(); + _registry = _zaddress_reserver.registry(); + + if (_reserver->reserved() < ReservationSize || !_registry->is_contiguous()) { + GTEST_SKIP() << "Fixture failed to reserve adequate memory, reserved " + << (_reserver->reserved() >> ZGranuleSizeShift) << " * ZGranuleSize"; + } } virtual void TearDown() { @@ -58,9 +64,9 @@ public: } // Best-effort cleanup - _reserver->unreserve_all(); - _reserver->~ZVirtualMemoryReserver(); - os::free(_reserver); + _registry = nullptr; + _reserver = nullptr; + _zaddress_reserver.TearDown(); } void test_unreserve() { diff --git a/test/hotspot/gtest/gc/z/test_zVirtualMemoryManager.cpp b/test/hotspot/gtest/gc/z/test_zVirtualMemoryManager.cpp index b6b827aa0b7..2b6fbc198ca 100644 --- a/test/hotspot/gtest/gc/z/test_zVirtualMemoryManager.cpp +++ b/test/hotspot/gtest/gc/z/test_zVirtualMemoryManager.cpp @@ -56,6 +56,7 @@ class ZVirtualMemoryManagerTest : public ZTest { private: static constexpr size_t ReservationSize = 32 * M; + ZAddressReserver _zaddress_reserver; ZVirtualMemoryReserver* _reserver; ZVirtualMemoryRegistry* _registry; @@ -66,9 +67,14 @@ public: GTEST_SKIP() << "OS not supported"; } - _reserver = (ZVirtualMemoryReserver*)os::malloc(sizeof(ZVirtualMemoryManager), mtTest); - _reserver = ::new (_reserver) ZVirtualMemoryReserver(ReservationSize); - _registry = &_reserver->_registry; + _zaddress_reserver.SetUp(ReservationSize); + _reserver = _zaddress_reserver.reserver(); + _registry = _zaddress_reserver.registry(); + + if (_reserver->reserved() < ReservationSize || !_registry->is_contiguous()) { + GTEST_SKIP() << "Fixture failed to reserve adequate memory, reserved " + << (_reserver->reserved() >> ZGranuleSizeShift) << " * ZGranuleSize"; + } } virtual void TearDown() { @@ -77,10 +83,9 @@ public: return; } - // Best-effort cleanup - _reserver->unreserve_all(); - _reserver->~ZVirtualMemoryReserver(); - os::free(_reserver); + _registry = nullptr; + _reserver = nullptr; + _zaddress_reserver.TearDown(); } void test_reserve_discontiguous_and_coalesce() { @@ -112,11 +117,6 @@ public: // to separate the fetched memory from the memory left in the manager. This // used to fail because the memory was already split into two placeholders. - if (_reserver->reserved() < 4 * ZGranuleSize || !_registry->is_contiguous()) { - GTEST_SKIP() << "Fixture failed to reserve adequate memory, reserved " - << (_reserver->reserved() >> ZGranuleSizeShift) << " * ZGranuleSize"; - } - // Start at the offset we reserved. const zoffset base_offset = _registry->peek_low_address(); diff --git a/test/hotspot/gtest/gc/z/zunittest.hpp b/test/hotspot/gtest/gc/z/zunittest.hpp index c732b7d4f7e..a4586d51a0e 100644 --- a/test/hotspot/gtest/gc/z/zunittest.hpp +++ b/test/hotspot/gtest/gc/z/zunittest.hpp @@ -30,6 +30,7 @@ #include "gc/z/zNUMA.hpp" #include "gc/z/zRangeRegistry.hpp" #include "gc/z/zVirtualMemory.inline.hpp" +#include "gc/z/zVirtualMemoryManager.hpp" #include "runtime/os.hpp" #include "unittest.hpp" @@ -60,6 +61,50 @@ public: }; class ZTest : public testing::Test { +public: + class ZAddressReserver { + ZVirtualMemoryReserver* _reserver; + bool _active; + + public: + ZAddressReserver() + : _reserver(nullptr), + _active(false) {} + + ~ZAddressReserver() { + GTEST_EXPECT_FALSE(_active) << "ZAddressReserver deconstructed without calling TearDown"; + } + + void SetUp(size_t reservation_size) { + GTEST_EXPECT_TRUE(ZArguments::is_os_supported()) << "Should not use SetUp on unsupported systems"; + GTEST_EXPECT_FALSE(_active) << "SetUp called twice without a TearDown"; + _active = true; + + _reserver = (ZVirtualMemoryReserver*)os::malloc(sizeof(ZVirtualMemoryManager), mtTest); + _reserver = ::new (_reserver) ZVirtualMemoryReserver(reservation_size); + } + + void TearDown() { + GTEST_EXPECT_TRUE(_active) << "TearDown called without a preceding SetUp"; + _active = false; + + // Best-effort cleanup + _reserver->unreserve_all(); + _reserver->~ZVirtualMemoryReserver(); + os::free(_reserver); + } + + ZVirtualMemoryReserver* reserver() { + GTEST_EXPECT_TRUE(_active) << "Should only use HeapReserver while active"; + return _reserver; + } + + ZVirtualMemoryRegistry* registry() { + GTEST_EXPECT_TRUE(_active) << "Should only use HeapReserver while active"; + return &_reserver->_registry; + } + }; + private: ZAddressOffsetMaxSetter _zaddress_offset_max_setter; unsigned int _rand_seed; From f77a5117db2d01a935762e948aef2d0ade3512a3 Mon Sep 17 00:00:00 2001 From: Jasmine Karthikeyan Date: Mon, 10 Nov 2025 06:16:02 +0000 Subject: [PATCH 522/561] 8350468: x86: Improve implementation of vectorized numberOfLeadingZeros for int and long Co-authored-by: Raffaello Giulietti Reviewed-by: sviswanathan, qamai, vlivanov --- src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp | 99 ++++++++----------- .../TestNumberOfContinuousZeros.java | 93 +++++++++++++++-- .../bench/vm/compiler/LeadingZeros.java | 81 +++++++++++++++ 3 files changed, 208 insertions(+), 65 deletions(-) create mode 100644 test/micro/org/openjdk/bench/vm/compiler/LeadingZeros.java diff --git a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp index 51b2eff2cfb..3de7f473fea 100644 --- a/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp @@ -6119,77 +6119,64 @@ void C2_MacroAssembler::vector_count_leading_zeros_short_avx(XMMRegister dst, XM void C2_MacroAssembler::vector_count_leading_zeros_int_avx(XMMRegister dst, XMMRegister src, XMMRegister xtmp1, XMMRegister xtmp2, XMMRegister xtmp3, int vec_enc) { - // Since IEEE 754 floating point format represents mantissa in 1.0 format - // hence biased exponent can be used to compute leading zero count as per - // following formula:- - // LZCNT = 31 - (biased_exp - 127) - // Special handling has been introduced for Zero, Max_Int and -ve source values. - - // Broadcast 0xFF - vpcmpeqd(xtmp1, xtmp1, xtmp1, vec_enc); - vpsrld(xtmp1, xtmp1, 24, vec_enc); + // By converting the integer to a float, we can obtain the number of leading zeros based on the exponent of the float. + // As the float exponent contains a bias of 127 for nonzero values, the bias must be removed before interpreting the + // exponent as the leading zero count. // Remove the bit to the right of the highest set bit ensuring that the conversion to float cannot round up to a higher // power of 2, which has a higher exponent than the input. This transformation is valid as only the highest set bit // contributes to the leading number of zeros. - vpsrld(xtmp2, src, 1, vec_enc); - vpandn(xtmp3, xtmp2, src, vec_enc); + vpsrld(dst, src, 1, vec_enc); + vpandn(dst, dst, src, vec_enc); - // Extract biased exponent. - vcvtdq2ps(dst, xtmp3, vec_enc); + vcvtdq2ps(dst, dst, vec_enc); + + // By comparing the register to itself, all the bits in the destination are set. + vpcmpeqd(xtmp1, xtmp1, xtmp1, vec_enc); + + // Move the biased exponent to the low end of the lane and mask with 0xFF to discard the sign bit. + vpsrld(xtmp2, xtmp1, 24, vec_enc); vpsrld(dst, dst, 23, vec_enc); - vpand(dst, dst, xtmp1, vec_enc); + vpand(dst, xtmp2, dst, vec_enc); - // Broadcast 127. - vpsrld(xtmp1, xtmp1, 1, vec_enc); - // Exponent = biased_exp - 127 - vpsubd(dst, dst, xtmp1, vec_enc); + // Subtract 127 from the exponent, which removes the bias from the exponent. + vpsrld(xtmp2, xtmp1, 25, vec_enc); + vpsubd(dst, dst, xtmp2, vec_enc); - // Exponent_plus_one = Exponent + 1 - vpsrld(xtmp3, xtmp1, 6, vec_enc); - vpaddd(dst, dst, xtmp3, vec_enc); + vpsrld(xtmp2, xtmp1, 27, vec_enc); - // Replace -ve exponent with zero, exponent is -ve when src - // lane contains a zero value. - vpxor(xtmp2, xtmp2, xtmp2, vec_enc); - vblendvps(dst, dst, xtmp2, dst, vec_enc); + // If the original value is 0 the exponent would not have bias, so the subtraction creates a negative number. If this + // is found in any of the lanes, replace the lane with -1 from xtmp1. + vblendvps(dst, dst, xtmp1, dst, vec_enc, true, xtmp3); - // Rematerialize broadcast 32. - vpslld(xtmp1, xtmp3, 5, vec_enc); - // Exponent is 32 if corresponding source lane contains max_int value. - vpcmpeqd(xtmp2, dst, xtmp1, vec_enc); - // LZCNT = 32 - exponent_plus_one - vpsubd(dst, xtmp1, dst, vec_enc); + // If the original value is negative, replace the lane with 31. + vblendvps(dst, dst, xtmp2, src, vec_enc, true, xtmp3); - // Replace LZCNT with a value 1 if corresponding source lane - // contains max_int value. - vpblendvb(dst, dst, xtmp3, xtmp2, vec_enc); - - // Replace biased_exp with 0 if source lane value is less than zero. - vpxor(xtmp2, xtmp2, xtmp2, vec_enc); - vblendvps(dst, dst, xtmp2, src, vec_enc); + // Subtract the exponent from 31, giving the final result. For 0, the result is 32 as the exponent was replaced with -1, + // and for negative numbers the result is 0 as the exponent was replaced with 31. + vpsubd(dst, xtmp2, dst, vec_enc); } void C2_MacroAssembler::vector_count_leading_zeros_long_avx(XMMRegister dst, XMMRegister src, XMMRegister xtmp1, XMMRegister xtmp2, XMMRegister xtmp3, Register rtmp, int vec_enc) { - vector_count_leading_zeros_short_avx(dst, src, xtmp1, xtmp2, xtmp3, rtmp, vec_enc); - // Add zero counts of lower word and upper word of a double word if - // upper word holds a zero value. - vpsrld(xtmp3, src, 16, vec_enc); - // xtmp1 is set to all zeros by vector_count_leading_zeros_byte_avx. - vpcmpeqd(xtmp3, xtmp1, xtmp3, vec_enc); - vpslld(xtmp2, dst, 16, vec_enc); - vpaddd(xtmp2, xtmp2, dst, vec_enc); - vpblendvb(dst, dst, xtmp2, xtmp3, vec_enc); - vpsrld(dst, dst, 16, vec_enc); - // Add zero counts of lower doubleword and upper doubleword of a - // quadword if upper doubleword holds a zero value. - vpsrlq(xtmp3, src, 32, vec_enc); - vpcmpeqq(xtmp3, xtmp1, xtmp3, vec_enc); - vpsllq(xtmp2, dst, 32, vec_enc); - vpaddq(xtmp2, xtmp2, dst, vec_enc); - vpblendvb(dst, dst, xtmp2, xtmp3, vec_enc); - vpsrlq(dst, dst, 32, vec_enc); + // Find the leading zeros of the top and bottom halves of the long individually. + vector_count_leading_zeros_int_avx(dst, src, xtmp1, xtmp2, xtmp3, vec_enc); + + // Move the top half result to the bottom half of xtmp1, setting the top half to 0. + vpsrlq(xtmp1, dst, 32, vec_enc); + // By moving the top half result to the right by 6 bits, if the top half was empty (i.e. 32 is returned) the result bit will + // be in the most significant position of the bottom half. + vpsrlq(xtmp2, dst, 6, vec_enc); + + // In the bottom half, add the top half and bottom half results. + vpaddq(dst, xtmp1, dst, vec_enc); + + // For the bottom half, choose between the values using the most significant bit of xtmp2. + // If the MSB is set, then bottom+top in dst is the resulting value. If the top half is less than 32 xtmp1 is chosen, + // which contains only the top half result. + // In the top half the MSB is always zero, so the value in xtmp1 is always chosen. This value is always 0, which clears + // the lane as required. + vblendvps(dst, xtmp1, dst, xtmp2, vec_enc, true, xtmp3); } void C2_MacroAssembler::vector_count_leading_zeros_avx(BasicType bt, XMMRegister dst, XMMRegister src, diff --git a/test/hotspot/jtreg/compiler/vectorization/TestNumberOfContinuousZeros.java b/test/hotspot/jtreg/compiler/vectorization/TestNumberOfContinuousZeros.java index 9eda6f85e3d..e9773e8ac07 100644 --- a/test/hotspot/jtreg/compiler/vectorization/TestNumberOfContinuousZeros.java +++ b/test/hotspot/jtreg/compiler/vectorization/TestNumberOfContinuousZeros.java @@ -46,7 +46,8 @@ import jdk.test.lib.Asserts; import jdk.test.lib.Utils; public class TestNumberOfContinuousZeros { - private static final int[] SPECIAL = { 0x01FFFFFF, 0x03FFFFFE, 0x07FFFFFC, 0x0FFFFFF8, 0x1FFFFFF0, 0x3FFFFFE0, 0xFFFFFFFF }; + private static final int[] SPECIAL_INT = { 0, 0x01FFFFFF, 0x03FFFFFE, 0x07FFFFFC, 0x0FFFFFF8, 0x1FFFFFF0, 0x3FFFFFE0, 0xFFFFFFFF }; + private static final long[] SPECIAL_LONG = { 0, 0xFF, 0xFFFF, 0x01FFFFFF, 0x03FFFFFE, 0x07FFFFFC, 0x0FFFFFF8, 0x1FFFFFF0, 0x3FFFFFE0, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFFL, 0x7FFFFFFFFFFFFFFFL }; private long[] inputLong; private int[] outputLong; private int[] inputInt; @@ -134,7 +135,18 @@ public class TestNumberOfContinuousZeros { int[] res = new int[LEN]; for (int i = 0; i < LEN; i++) { - res[i] = SPECIAL[i % SPECIAL.length]; + res[i] = SPECIAL_INT[i % SPECIAL_INT.length]; + } + + return new Object[] { res }; + } + + @Setup + static Object[] setupSpecialLongArray() { + long[] res = new long[LEN]; + + for (int i = 0; i < LEN; i++) { + res[i] = SPECIAL_LONG[i % SPECIAL_LONG.length]; } return new Object[] { res }; @@ -167,23 +179,51 @@ public class TestNumberOfContinuousZeros { } } - private static final VectorSpecies SPECIES = IntVector.SPECIES_PREFERRED; + @Test + @IR(counts = {IRNode.COUNT_LEADING_ZEROS_VL, "> 0"}) + @Arguments(setup = "setupSpecialLongArray") + public Object[] testSpecialLongLeadingZeros(long[] longs) { + int[] res = new int[LEN]; + + for (int i = 0; i < LEN; ++i) { + res[i] = Long.numberOfLeadingZeros(longs[i]); + } + + return new Object[] { longs, res }; + } + + @Check(test = "testSpecialLongLeadingZeros") + public void checkSpecialLongLeadingZeros(Object[] vals) { + long[] in = (long[]) vals[0]; + int[] out = (int[]) vals[1]; + + for (int i = 0; i < LEN; ++i) { + int value = Long.numberOfLeadingZeros(in[i]); + + if (out[i] != value) { + throw new IllegalStateException("Expected lzcnt(" + in[i] + ") to be " + value + " but got " + out[i]); + } + } + } + + private static final VectorSpecies SPECIES_INT = IntVector.SPECIES_PREFERRED; + private static final VectorSpecies SPECIES_LONG = LongVector.SPECIES_PREFERRED; @Test @IR(counts = {IRNode.COUNT_LEADING_ZEROS_VI, "> 0"}) @Arguments(setup = "setupSpecialIntArray") - public Object[] checkSpecialIntLeadingZerosVector(int[] ints) { + public Object[] testIntLeadingZerosVector(int[] ints) { int[] res = new int[LEN]; - for (int i = 0; i < ints.length; i += SPECIES.length()) { - IntVector av = IntVector.fromArray(SPECIES, ints, i); + for (int i = 0; i < ints.length; i += SPECIES_INT.length()) { + IntVector av = IntVector.fromArray(SPECIES_INT, ints, i); av.lanewise(VectorOperators.LEADING_ZEROS_COUNT).intoArray(res, i); } return new Object[] { ints, res }; } - @Check(test = "checkSpecialIntLeadingZerosVector") + @Check(test = "testIntLeadingZerosVector") public void checkSpecialIntLeadingZerosVector(Object[] vals) { int[] ints = (int[]) vals[0]; int[] res = (int[]) vals[1]; @@ -192,8 +232,43 @@ public class TestNumberOfContinuousZeros { int[] check = new int[LEN]; - for (int i = 0; i < ints.length; i += SPECIES.length()) { - IntVector av = IntVector.fromArray(SPECIES, ints, i); + for (int i = 0; i < ints.length; i += SPECIES_INT.length()) { + IntVector av = IntVector.fromArray(SPECIES_INT, ints, i); + av.lanewise(VectorOperators.LEADING_ZEROS_COUNT).intoArray(check, i); + } + + for (int i = 0; i < LEN; i++) { + if (res[i] != check[i]) { + throw new IllegalStateException("Expected " + check[i] + " but got " + res[i]); + } + } + } + + @Test + @IR(counts = {IRNode.COUNT_LEADING_ZEROS_VL, "> 0"}) + @Arguments(setup = "setupSpecialLongArray") + public Object[] testLongLeadingZerosVector(long[] longs) { + long[] res = new long[LEN]; + + for (int i = 0; i < longs.length; i += SPECIES_LONG.length()) { + LongVector av = LongVector.fromArray(SPECIES_LONG, longs, i); + av.lanewise(VectorOperators.LEADING_ZEROS_COUNT).intoArray(res, i); + } + + return new Object[] { longs, res }; + } + + @Check(test = "testLongLeadingZerosVector") + public void checkSpecialLongLeadingZerosVector(Object[] vals) { + long[] longs = (long[]) vals[0]; + long[] res = (long[]) vals[1]; + + // Verification + + long[] check = new long[LEN]; + + for (int i = 0; i < longs.length; i += SPECIES_LONG.length()) { + LongVector av = LongVector.fromArray(SPECIES_LONG, longs, i); av.lanewise(VectorOperators.LEADING_ZEROS_COUNT).intoArray(check, i); } diff --git a/test/micro/org/openjdk/bench/vm/compiler/LeadingZeros.java b/test/micro/org/openjdk/bench/vm/compiler/LeadingZeros.java new file mode 100644 index 00000000000..5ecdbcf28db --- /dev/null +++ b/test/micro/org/openjdk/bench/vm/compiler/LeadingZeros.java @@ -0,0 +1,81 @@ +/* + * 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. + * + * 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 org.openjdk.bench.vm.compiler; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Measurement(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS) +@Warmup(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS) +@Fork(3) +public class LeadingZeros { + private static final int SIZE = 512; + + @Benchmark + public void testInt(Blackhole blackhole, BenchState state) { + for (int i = 0; i < SIZE; i++) { + state.result[i] = Integer.numberOfLeadingZeros(state.ints[i]); + } + + blackhole.consume(state.result); + } + + @Benchmark + public void testLong(Blackhole blackhole, BenchState state) { + for (int i = 0; i < SIZE; i++) { + state.result[i] = Long.numberOfLeadingZeros(state.longs[i]); + } + + blackhole.consume(state.result); + } + + @State(Scope.Benchmark) + public static class BenchState { + private final int[] ints = new int[SIZE]; + private final long[] longs = new long[SIZE]; + + private final int[] result = new int[SIZE]; + + private Random random; + + public BenchState() { + } + + @Setup + public void setup() { + this.random = new Random(1000); + + for (int i = 0; i < SIZE; i++) { + ints[i] = this.random.nextInt(); + + longs[i] = this.random.nextLong(); + } + } + } +} From d570765e2720a11c88c806554df9b13587a041a2 Mon Sep 17 00:00:00 2001 From: Axel Boldt-Christmas Date: Mon, 10 Nov 2025 06:19:27 +0000 Subject: [PATCH 523/561] 8367149: Add convenient construction for creating ad-hoc VMErrorCallback Reviewed-by: ayang, stefank --- src/hotspot/share/utilities/vmError.hpp | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/hotspot/share/utilities/vmError.hpp b/src/hotspot/share/utilities/vmError.hpp index 5e5e074fb20..04cea6de47c 100644 --- a/src/hotspot/share/utilities/vmError.hpp +++ b/src/hotspot/share/utilities/vmError.hpp @@ -251,4 +251,52 @@ public: ~VMErrorCallbackMark(); }; +// Convenient construction for creating ad-hoc VMErrorCallback which automatically +// calls the provided invocable f if a VM crash occurs within its lifetime. +// Can be used to instrument a build for more detailed contextual information +// gathering. Especially useful when hunting down intermittent bugs, or issues +// only reproducible in environments where access to a debugger is not readily +// available. Example use: +/* + { + // Note the lambda is invoked after an error occurs within this thread, + // and during on_error's lifetime. If state prior to the crash is required, + // capture a copy of it first. + auto important_value = get_the_value(); + + OnVMError on_error([&](outputStream* st) { + // Dump the important bits. + st->print("Prior value: "); + important_value.print_on(st); + st->print("During crash: ") + get_the_value().print_on(st); + // Dump whole the whole state. + this->print_on(st); + }); + + // When VM crashes, the above lambda will be invoked and print relevant info. + might_cause_vm_crash(); + } +*/ +template +class OnVMError : public VMErrorCallback { + CallableType _callable; + VMErrorCallbackMark _mark; + + void call(outputStream* st) final { _callable(st); } + +public: + template + OnVMError(Callable&& callable) : VMErrorCallback(), _callable(static_cast(callable)), _mark(this) {} +}; + +// This deduction rule enables creating a type with out using auto, decltype +// and/or helping construction functions. It enables the generic template type +// to be deduced in the following code: +// OnVMError on_error([&](outputStream* st) { ... }) +// Rather than having to something along the lines of: +// auto f = [&](outputStream* st) { ... }; +// OnVMError on_error(f); +template OnVMError(CallableType) -> OnVMError; + #endif // SHARE_UTILITIES_VMERROR_HPP From 79fee607fd77320cd5deb8e424582e2f6c2b31a2 Mon Sep 17 00:00:00 2001 From: Matthias Baesken Date: Mon, 10 Nov 2025 07:58:13 +0000 Subject: [PATCH 524/561] 8371473: Problem list TestEmergencyDumpAtOOM.java on ppc64 platforms related to JDK-8371014 Reviewed-by: mdoerr, phubner --- test/jdk/ProblemList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 5132d012d7f..b01460c3816 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -748,6 +748,7 @@ jdk/incubator/vector/LoadJsvmlTest.java 8305390 windows- # jdk_jfr jdk/jfr/event/compiler/TestCodeSweeper.java 8338127 generic-all +jdk/jfr/event/oldobject/TestEmergencyDumpAtOOM.java 8371014 aix-ppc64,linux-ppc64le jdk/jfr/event/oldobject/TestShenandoah.java 8342951 generic-all jdk/jfr/event/runtime/TestResidentSetSizeEvent.java 8309846 aix-ppc64 jdk/jfr/jvm/TestWaste.java 8369949 generic-all From 5e8bf7a283f75464dbd906454c852e4d1db497dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Maillard?= Date: Mon, 10 Nov 2025 08:39:21 +0000 Subject: [PATCH 525/561] 8369646: Detection of redundant conversion patterns in add_users_of_use_to_worklist is too restrictive Reviewed-by: chagedorn, epeter --- src/hotspot/share/opto/phaseX.cpp | 13 ++++++++----- src/hotspot/share/opto/phaseX.hpp | 16 ++++++++++++++++ ...estEliminateRedundantConversionSequences.java | 11 +++++++++-- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/hotspot/share/opto/phaseX.cpp b/src/hotspot/share/opto/phaseX.cpp index b5b15275e21..5fcb2a62682 100644 --- a/src/hotspot/share/opto/phaseX.cpp +++ b/src/hotspot/share/opto/phaseX.cpp @@ -2566,13 +2566,16 @@ void PhaseIterGVN::add_users_of_use_to_worklist(Node* n, Node* use, Unique_Node_ // ConvI2F->ConvF2I->ConvI2F // Note: there may be other 3-nodes conversion chains that would require to be added here, but these // are the only ones that are known to trigger missed optimizations otherwise - if ((n->Opcode() == Op_ConvD2L && use_op == Op_ConvL2D) || - (n->Opcode() == Op_ConvF2I && use_op == Op_ConvI2F) || - (n->Opcode() == Op_ConvF2L && use_op == Op_ConvL2F) || - (n->Opcode() == Op_ConvI2F && use_op == Op_ConvF2I)) { + if (use_op == Op_ConvL2D || + use_op == Op_ConvI2F || + use_op == Op_ConvL2F || + use_op == Op_ConvF2I) { for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) { Node* u = use->fast_out(i2); - if (u->Opcode() == n->Opcode()) { + if ((use_op == Op_ConvL2D && u->Opcode() == Op_ConvD2L) || + (use_op == Op_ConvI2F && u->Opcode() == Op_ConvF2I) || + (use_op == Op_ConvL2F && u->Opcode() == Op_ConvF2L) || + (use_op == Op_ConvF2I && u->Opcode() == Op_ConvI2F)) { worklist.push(u); } } diff --git a/src/hotspot/share/opto/phaseX.hpp b/src/hotspot/share/opto/phaseX.hpp index 300c8fc2757..083e77bf6d9 100644 --- a/src/hotspot/share/opto/phaseX.hpp +++ b/src/hotspot/share/opto/phaseX.hpp @@ -528,7 +528,23 @@ public: // Add users of 'n' to worklist static void add_users_to_worklist0(Node* n, Unique_Node_List& worklist); + + // Add one or more users of 'use' to the worklist if it appears that a + // known optimization could be applied to those users. + // Node 'n' is a node that was modified or is about to get replaced, + // and 'use' is one use of 'n'. + // Certain optimizations have dependencies that extend beyond a node's + // direct inputs, so it is necessary to ensure the appropriate + // notifications are made here. static void add_users_of_use_to_worklist(Node* n, Node* use, Unique_Node_List& worklist); + + // Add users of 'n', and any other nodes that could be directly + // affected by changes to 'n', to the worklist. + // Node 'n' may be a node that is about to get replaced. In this + // case, 'n' should not be considered part of the new graph. + // Passing the old node (as 'n'), rather than the new node, + // prevents unnecessary notifications when the new node already + // has other users. void add_users_to_worklist(Node* n); // Replace old node with new one. diff --git a/test/hotspot/jtreg/compiler/c2/TestEliminateRedundantConversionSequences.java b/test/hotspot/jtreg/compiler/c2/TestEliminateRedundantConversionSequences.java index b452b8f67dd..f7bcaa94230 100644 --- a/test/hotspot/jtreg/compiler/c2/TestEliminateRedundantConversionSequences.java +++ b/test/hotspot/jtreg/compiler/c2/TestEliminateRedundantConversionSequences.java @@ -23,13 +23,20 @@ /* * @test - * @bug 8359603 + * @bug 8359603 8369646 * @summary Redundant ConvX2Y->ConvY2X->ConvX2Y sequences should be * simplified to a single ConvX2Y operation when applicable * VerifyIterativeGVN checks that this optimization was applied * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions * -XX:CompileCommand=compileonly,compiler.c2.TestEliminateRedundantConversionSequences::test* - * -XX:-TieredCompilation -Xbatch -XX:VerifyIterativeGVN=1110 compiler.c2.TestEliminateRedundantConversionSequences + * -XX:-TieredCompilation -Xbatch -XX:VerifyIterativeGVN=1110 + * -XX:+UnlockDiagnosticVMOptions -XX:+StressIGVN + * compiler.c2.TestEliminateRedundantConversionSequences + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions + * -XX:CompileCommand=compileonly,compiler.c2.TestEliminateRedundantConversionSequences::test* + * -XX:-TieredCompilation -Xbatch -XX:VerifyIterativeGVN=1110 + * -XX:+UnlockDiagnosticVMOptions -XX:+StressIGVN -XX:StressSeed=115074401 + * compiler.c2.TestEliminateRedundantConversionSequences * @run main compiler.c2.TestEliminateRedundantConversionSequences * */ From 0c1b7267e374192f30322a45a1a34f734565cc15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Maillard?= Date: Mon, 10 Nov 2025 08:41:13 +0000 Subject: [PATCH 526/561] 8366990: C2: Compilation hits the memory limit when verifying loop opts in Split-If code Reviewed-by: chagedorn, dfenacci --- src/hotspot/share/ci/ciInstanceKlass.cpp | 42 ++++++-- src/hotspot/share/ci/ciInstanceKlass.hpp | 3 + src/hotspot/share/opto/type.cpp | 12 +-- ...stVerifyLoopOptimizationsHitsMemLimit.java | 101 ++++++++++++++++++ 4 files changed, 144 insertions(+), 14 deletions(-) create mode 100644 test/hotspot/jtreg/compiler/loopopts/TestVerifyLoopOptimizationsHitsMemLimit.java diff --git a/src/hotspot/share/ci/ciInstanceKlass.cpp b/src/hotspot/share/ci/ciInstanceKlass.cpp index c367170f2c2..9bbf005356c 100644 --- a/src/hotspot/share/ci/ciInstanceKlass.cpp +++ b/src/hotspot/share/ci/ciInstanceKlass.cpp @@ -391,17 +391,21 @@ bool ciInstanceKlass::contains_field_offset(int offset) { return get_instanceKlass()->contains_field_offset(offset); } +ciField* ciInstanceKlass::get_non_static_field_by_offset(const int field_offset) { + for (int i = 0, len = nof_nonstatic_fields(); i < len; i++) { + ciField* field = _nonstatic_fields->at(i); + int field_off = field->offset_in_bytes(); + if (field_off == field_offset) + return field; + } + return nullptr; +} + // ------------------------------------------------------------------ // ciInstanceKlass::get_field_by_offset ciField* ciInstanceKlass::get_field_by_offset(int field_offset, bool is_static) { if (!is_static) { - for (int i = 0, len = nof_nonstatic_fields(); i < len; i++) { - ciField* field = _nonstatic_fields->at(i); - int field_off = field->offset_in_bytes(); - if (field_off == field_offset) - return field; - } - return nullptr; + return get_non_static_field_by_offset(field_offset); } VM_ENTRY_MARK; InstanceKlass* k = get_instanceKlass(); @@ -427,6 +431,30 @@ ciField* ciInstanceKlass::get_field_by_name(ciSymbol* name, ciSymbol* signature, return field; } +// This is essentially a shortcut for: +// get_field_by_offset(field_offset, is_static)->layout_type() +// except this does not require allocating memory for a new ciField +BasicType ciInstanceKlass::get_field_type_by_offset(const int field_offset, const bool is_static) { + if (!is_static) { + ciField* field = get_non_static_field_by_offset(field_offset); + return field != nullptr ? field->layout_type() : T_ILLEGAL; + } + + // Avoid allocating a new ciField by obtaining the field type directly + VM_ENTRY_MARK; + InstanceKlass* k = get_instanceKlass(); + fieldDescriptor fd; + if (!k->find_field_from_offset(field_offset, is_static, &fd)) { + return T_ILLEGAL; + } + + // Reproduce the behavior of ciField::layout_type + BasicType field_type = fd.field_type(); + if (is_reference_type(field_type)) { + return T_OBJECT; + } + return type2field[make(field_type)->basic_type()]; +} // ------------------------------------------------------------------ // ciInstanceKlass::compute_nonstatic_fields diff --git a/src/hotspot/share/ci/ciInstanceKlass.hpp b/src/hotspot/share/ci/ciInstanceKlass.hpp index d3d988e8735..ec8fc789c7d 100644 --- a/src/hotspot/share/ci/ciInstanceKlass.hpp +++ b/src/hotspot/share/ci/ciInstanceKlass.hpp @@ -82,6 +82,8 @@ private: bool compute_injected_fields_helper(); void compute_transitive_interfaces(); + ciField* get_non_static_field_by_offset(int field_offset); + protected: ciInstanceKlass(Klass* k); ciInstanceKlass(ciSymbol* name, jobject loader); @@ -204,6 +206,7 @@ public: ciInstanceKlass* get_canonical_holder(int offset); ciField* get_field_by_offset(int field_offset, bool is_static); ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static); + BasicType get_field_type_by_offset(int field_offset, bool is_static); // total number of nonstatic fields (including inherited): int nof_nonstatic_fields() { diff --git a/src/hotspot/share/opto/type.cpp b/src/hotspot/share/opto/type.cpp index f62eea893cd..96fee925e5d 100644 --- a/src/hotspot/share/opto/type.cpp +++ b/src/hotspot/share/opto/type.cpp @@ -3478,13 +3478,12 @@ TypeOopPtr::TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, const TypeInterfaces* inter } else if (klass() == ciEnv::current()->Class_klass() && _offset >= InstanceMirrorKlass::offset_of_static_fields()) { // Static fields - ciField* field = nullptr; + BasicType basic_elem_type = T_ILLEGAL; if (const_oop() != nullptr) { ciInstanceKlass* k = const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass(); - field = k->get_field_by_offset(_offset, true); + basic_elem_type = k->get_field_type_by_offset(_offset, true); } - if (field != nullptr) { - BasicType basic_elem_type = field->layout_type(); + if (basic_elem_type != T_ILLEGAL) { _is_ptr_to_narrowoop = UseCompressedOops && ::is_reference_type(basic_elem_type); } else { // unsafe access @@ -3492,9 +3491,8 @@ TypeOopPtr::TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, const TypeInterfaces* inter } } else { // Instance fields which contains a compressed oop references. - ciField* field = ik->get_field_by_offset(_offset, false); - if (field != nullptr) { - BasicType basic_elem_type = field->layout_type(); + BasicType basic_elem_type = ik->get_field_type_by_offset(_offset, false); + if (basic_elem_type != T_ILLEGAL) { _is_ptr_to_narrowoop = UseCompressedOops && ::is_reference_type(basic_elem_type); } else if (klass()->equals(ciEnv::current()->Object_klass())) { // Compile::find_alias_type() cast exactness on all types to verify diff --git a/test/hotspot/jtreg/compiler/loopopts/TestVerifyLoopOptimizationsHitsMemLimit.java b/test/hotspot/jtreg/compiler/loopopts/TestVerifyLoopOptimizationsHitsMemLimit.java new file mode 100644 index 00000000000..a2834c26dcc --- /dev/null +++ b/test/hotspot/jtreg/compiler/loopopts/TestVerifyLoopOptimizationsHitsMemLimit.java @@ -0,0 +1,101 @@ +/* + * 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. + * + * 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 compiler.loopopts; + +/** + * @test + * @bug 8366990 + * @summary Loop optimizations verification results in hitting the memory limit. + * This is caused by the high number of verification passes triggered + * in PhaseIdealLoop::split_if_with_blocks_post and repetitive memory + * allocations while building the ideal loop tree in preparation for + * the verification. + * + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:CompileCommand=compileonly,compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit::test + * -XX:CompileCommand=memlimit,compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit::test,100M~crash + * -XX:-TieredCompilation -Xcomp -XX:PerMethodTrapLimit=0 + * -XX:+StressLoopPeeling -XX:+VerifyLoopOptimizations + * -XX:StressSeed=1870557292 + * compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions + * -XX:CompileCommand=compileonly,compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit::test + * -XX:CompileCommand=memlimit,compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit::test,100M~crash + * -XX:-TieredCompilation -Xcomp -XX:PerMethodTrapLimit=0 + * -XX:+StressLoopPeeling -XX:+VerifyLoopOptimizations + * compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit + * @run main compiler.loopopts.TestVerifyLoopOptimizationsHitsMemLimit + */ + +public class TestVerifyLoopOptimizationsHitsMemLimit { + final int a = 400; + int b; + float c; + static double d; + static byte f; + long g[]; + volatile int h[]; + + void test() { + int j, k = 2, l, o[] = new int[a]; + short m = 10492; + for (j = 1;; ++j) { + l = 1; + do { + g[j] = l; + switch (j) { + case 45: + o[1] = b; + case 163: + case 62: + case 72: + case 319: + h[1] -= k; + case 109: + case 47: + case 91: + case 68: + case 162: + case 76: + case 60: + case 66: + case 83: + d = m; + case 2314: + f = (byte) c; + } + } while (++l < 4); + } + } + + public static void main(String[] args) { + try { + TestVerifyLoopOptimizationsHitsMemLimit test = new TestVerifyLoopOptimizationsHitsMemLimit(); + test.test(); + throw new RuntimeException("Expected a NPE for uninitialized array"); + } catch (NullPointerException e) { + // expected + } + } +} From 2c378e26d7319b6b0e273d2409dd3f591c5f5f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Mon, 10 Nov 2025 08:54:04 +0000 Subject: [PATCH 527/561] 8370813: Deprecate AggressiveHeap Reviewed-by: ayang, shade --- src/hotspot/share/gc/shared/gc_globals.hpp | 5 +++-- src/hotspot/share/runtime/arguments.cpp | 1 + src/java.base/share/man/java.md | 12 ++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 938544b9a2c..4fb72f4102a 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -270,11 +270,12 @@ \ product(uint64_t, MaxRAM, 0, \ "(Deprecated) Real memory size (in bytes) used to set maximum " \ - "heap size") \ + "heap size") \ range(0, 0XFFFFFFFFFFFFFFFF) \ \ product(bool, AggressiveHeap, false, \ - "Optimize heap options for long-running memory intensive apps") \ + "(Deprecated) Optimize heap options for long-running memory " \ + "intensive apps") \ \ product(size_t, ErgoHeapSizeLimit, 0, \ "Maximum ergonomically set heap size (in bytes); zero means use " \ diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 6ab2b7a887c..730bb7871e2 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -536,6 +536,7 @@ static SpecialFlag const special_jvm_flags[] = { { "ParallelRefProcBalancingEnabled", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "PSChunkLargeArrays", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "MaxRAM", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, + { "AggressiveHeap", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, diff --git a/src/java.base/share/man/java.md b/src/java.base/share/man/java.md index 1e9eaa67d6d..0f9d8e89bfc 100644 --- a/src/java.base/share/man/java.md +++ b/src/java.base/share/man/java.md @@ -2309,12 +2309,6 @@ perform extensive debugging. These `java` options control how garbage collection (GC) is performed by the Java HotSpot VM. -`-XX:+AggressiveHeap` -: Enables Java heap optimization. This sets various parameters to be - optimal for long-running jobs with intensive memory allocation, based on - the configuration of the computer (RAM and CPU). By default, the option - is disabled and the heap sizes are configured less aggressively. - `-XX:+AlwaysPreTouch` : Requests the VM to touch every page on the Java heap after requesting it from the operating system and before handing memory out to the application. @@ -2951,6 +2945,12 @@ they're used. > `-XX:MaxRAM=2G` +`-XX:+AggressiveHeap` +: Enables Java heap optimization. This sets various parameters to be + optimal for long-running jobs with intensive memory allocation, based on + the configuration of the computer (RAM and CPU). By default, the option + is disabled and the heap sizes are configured less aggressively. + ## Obsolete Java Options These `java` options are still accepted but ignored, and a warning is issued From f48ad21ecc288c280db3ffb2e098df12518e2a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20H=C3=BCbner?= Date: Mon, 10 Nov 2025 09:24:45 +0000 Subject: [PATCH 528/561] 8371216: oopDesc::print_value_on breaks if klass is garbage Reviewed-by: coleenp, mdoerr --- src/hotspot/share/oops/oop.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hotspot/share/oops/oop.cpp b/src/hotspot/share/oops/oop.cpp index f874a39bf31..5f453241c3d 100644 --- a/src/hotspot/share/oops/oop.cpp +++ b/src/hotspot/share/oops/oop.cpp @@ -83,7 +83,10 @@ char* oopDesc::print_value_string() { void oopDesc::print_value_on(outputStream* st) const { oop obj = const_cast(this); - if (java_lang_String::is_instance(obj)) { + // We can't use java_lang_String::is_instance since that has klass assertions enabled. + // If the klass is garbage we want to just fail the check and continue printing, as + // opposed to aborting the VM entirely. + if (obj != nullptr && obj->klass_without_asserts() == vmClasses::String_klass()) { java_lang_String::print(obj, st); print_address_on(st); } else { From c0b82ff2e5b696371de62e0f4fcbba61361fc6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Sikstr=C3=B6m?= Date: Mon, 10 Nov 2025 09:41:55 +0000 Subject: [PATCH 529/561] 8370843: Deprecate AlwaysActAsServerClassMachine and NeverActAsServerClassMachine Reviewed-by: ayang, kvn --- src/hotspot/share/gc/shared/gc_globals.hpp | 4 +-- src/hotspot/share/runtime/arguments.cpp | 2 ++ src/java.base/share/man/java.md | 40 +++++++++++----------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/hotspot/share/gc/shared/gc_globals.hpp b/src/hotspot/share/gc/shared/gc_globals.hpp index 4fb72f4102a..e86a8744847 100644 --- a/src/hotspot/share/gc/shared/gc_globals.hpp +++ b/src/hotspot/share/gc/shared/gc_globals.hpp @@ -263,10 +263,10 @@ "before pushing a continuation entry") \ \ product_pd(bool, NeverActAsServerClassMachine, \ - "Never act like a server-class machine") \ + "(Deprecated) Never act like a server-class machine") \ \ product(bool, AlwaysActAsServerClassMachine, false, \ - "Always act like a server-class machine") \ + "(Deprecated) Always act like a server-class machine") \ \ product(uint64_t, MaxRAM, 0, \ "(Deprecated) Real memory size (in bytes) used to set maximum " \ diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp index 730bb7871e2..79027cf113f 100644 --- a/src/hotspot/share/runtime/arguments.cpp +++ b/src/hotspot/share/runtime/arguments.cpp @@ -537,6 +537,8 @@ static SpecialFlag const special_jvm_flags[] = { { "PSChunkLargeArrays", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "MaxRAM", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, { "AggressiveHeap", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, + { "NeverActAsServerClassMachine", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, + { "AlwaysActAsServerClassMachine", JDK_Version::jdk(26), JDK_Version::jdk(27), JDK_Version::jdk(28) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, diff --git a/src/java.base/share/man/java.md b/src/java.base/share/man/java.md index 0f9d8e89bfc..43719ff619a 100644 --- a/src/java.base/share/man/java.md +++ b/src/java.base/share/man/java.md @@ -1235,26 +1235,6 @@ These `java` options control the runtime behavior of the Java HotSpot VM. This option is only supported on Linux with GNU C Library (glibc). -`-XX:+NeverActAsServerClassMachine` -: Enable the "Client VM emulation" mode which only uses the C1 JIT compiler, - a 32Mb CodeCache and the Serial GC. The maximum amount of memory that the - JVM may use (controlled by the `-XX:MaxRAM=n` flag) is set to 1GB by default. - The string "emulated-client" is added to the JVM version string. - - By default the flag is set to `true` only on Windows in 32-bit mode and - `false` in all other cases. - - The "Client VM emulation" mode will not be enabled if any of the following - flags are used on the command line: - - ``` - -XX:{+|-}TieredCompilation - -XX:CompilationMode=mode - -XX:TieredStopAtLevel=n - -XX:{+|-}EnableJVMCI - -XX:{+|-}UseJVMCICompiler - ``` - `-XX:ObjectAlignmentInBytes=`*alignment* : Sets the memory alignment of Java objects (in bytes). By default, the value is set to 8 bytes. The specified value should be a power of 2, and must be @@ -2951,6 +2931,26 @@ they're used. the configuration of the computer (RAM and CPU). By default, the option is disabled and the heap sizes are configured less aggressively. +`-XX:+NeverActAsServerClassMachine` +: Enable the "Client VM emulation" mode which only uses the C1 JIT compiler, + a 32Mb CodeCache and the Serial GC. The maximum amount of memory that the + JVM may use (controlled by the `-XX:MaxRAM=n` flag) is set to 1GB by default. + The string "emulated-client" is added to the JVM version string. + + By default the flag is set to `true` only on Windows in 32-bit mode and + `false` in all other cases. + + The "Client VM emulation" mode will not be enabled if any of the following + flags are used on the command line: + + ``` + -XX:{+|-}TieredCompilation + -XX:CompilationMode=mode + -XX:TieredStopAtLevel=n + -XX:{+|-}EnableJVMCI + -XX:{+|-}UseJVMCICompiler + ``` + ## Obsolete Java Options These `java` options are still accepted but ignored, and a warning is issued From 49f51f9450ac3b923f83ba7d9089e5560e25ec7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Mon, 10 Nov 2025 10:06:09 +0000 Subject: [PATCH 530/561] 8370612: Simplify implementation of dark theme 8371021: Tab order in theme picker is broken Reviewed-by: jlamperth, liach --- .../doclets/formats/html/Navigation.java | 39 ++- .../formats/html/resources/highlight.css | 126 +--------- .../formats/html/resources/script.js.template | 46 ++-- .../formats/html/resources/stylesheet.css | 226 +++--------------- .../CheckStylesheetClasses.java | 3 - .../testNavigation/TestModuleNavigation.java | 37 +-- .../doclet/testNavigation/TestNavigation.java | 46 +--- .../doclet/testSpecTag/TestSpecTag.java | 6 +- .../doclet/testStylesheet/TestStylesheet.java | 2 +- 9 files changed, 113 insertions(+), 418 deletions(-) diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java index 1938a4838f5..30318bbaeea 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/Navigation.java @@ -500,14 +500,28 @@ public class Navigation { private void addThemeSwitcher(Content target) { var selectTheme = contents.getContent("doclet.theme.select_theme"); target.add(HtmlTree.LI(HtmlTree.BUTTON(HtmlIds.THEME_BUTTON) - .add(HtmlTree.IMG(pathToRoot.resolve(DocPaths.RESOURCE_FILES).resolve(DocPaths.SUN_SVG), - selectTheme.toString()).addStyle(HtmlIds.THEME_LIGHT.name())) - .add(HtmlTree.IMG(pathToRoot.resolve(DocPaths.RESOURCE_FILES).resolve(DocPaths.MOON_SVG), - selectTheme.toString()).addStyle(HtmlIds.THEME_DARK.name())) .put(HtmlAttr.ARIA_LABEL, selectTheme.toString()) .put(HtmlAttr.TITLE, selectTheme.toString()))); } + private void addThemePanel(Content target) { + var selectTheme = contents.getContent("doclet.theme.select_theme"); + target.add(HtmlTree.DIV(HtmlIds.THEME_PANEL) + .add(HtmlTree.DIV(selectTheme)) + .add(HtmlTree.DIV(HtmlTree.LABEL(HtmlIds.THEME_LIGHT.name(), Text.EMPTY) + .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_LIGHT) + .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_LIGHT.name())) + .add(HtmlTree.SPAN(contents.getContent("doclet.theme.light")))) + .add(HtmlTree.LABEL(HtmlIds.THEME_DARK.name(), Text.EMPTY) + .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_DARK) + .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_DARK.name())) + .add(HtmlTree.SPAN(contents.getContent("doclet.theme.dark")))) + .add(HtmlTree.LABEL(HtmlIds.THEME_OS.name(), Text.EMPTY) + .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_OS) + .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_OS.name())) + .add(HtmlTree.SPAN(contents.getContent("doclet.theme.system")))))); + } + private void addSearch(Content target) { var resources = configuration.getDocResources(); var inputText = HtmlTree.INPUT(HtmlAttr.InputType.TEXT, HtmlIds.SEARCH_INPUT) @@ -557,6 +571,7 @@ public class Navigation { .put(HtmlAttr.TITLE, rowListTitle); addMainNavLinks(navList); navContent.add(navList); + addThemePanel(navContent); var aboutDiv = HtmlTree.DIV(HtmlStyles.aboutLanguage, aboutContent); navContent.add(aboutDiv); navigationBar.add(HtmlTree.DIV(HtmlStyles.topNav, navContent).setId(HtmlIds.NAVBAR_TOP)); @@ -574,22 +589,6 @@ public class Navigation { breadcrumbNav.addAll(subNavLinks, HtmlTree::LI); subNavContent.addUnchecked(breadcrumbNav); - var selectTheme = contents.getContent("doclet.theme.select_theme"); - subNavContent.add(HtmlTree.DIV(HtmlIds.THEME_PANEL) - .add(HtmlTree.DIV(selectTheme)) - .add(HtmlTree.DIV(HtmlTree.LABEL(HtmlIds.THEME_LIGHT.name(), Text.EMPTY) - .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_LIGHT) - .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_LIGHT.name())) - .add(HtmlTree.SPAN(contents.getContent("doclet.theme.light")))) - .add(HtmlTree.LABEL(HtmlIds.THEME_DARK.name(), Text.EMPTY) - .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_DARK) - .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_DARK.name())) - .add(HtmlTree.SPAN(contents.getContent("doclet.theme.dark")))) - .add(HtmlTree.LABEL(HtmlIds.THEME_OS.name(), Text.EMPTY) - .add(HtmlTree.INPUT(HtmlAttr.InputType.RADIO, HtmlIds.THEME_OS) - .put(HtmlAttr.NAME, "theme").put(HtmlAttr.VALUE, HtmlIds.THEME_OS.name())) - .add(HtmlTree.SPAN(contents.getContent("doclet.theme.system")))))); - if (options.createIndex() && documentedPage != PageMode.SEARCH) { addSearch(subNavContent); } diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/highlight.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/highlight.css index 77c32543049..54ee304478e 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/highlight.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/highlight.css @@ -65,7 +65,7 @@ /* ignored */ } -body.theme-dark { +:root[data-theme="theme-dark"] { .hljs-title.function_, .hljs-template-variable { color: #66bcce; @@ -126,127 +126,3 @@ body.theme-dark { /* ignored */ } } - -@media (prefers-color-scheme: dark) { - .hljs-title.function_, - .hljs-template-variable { - color: #66bcce; - } - .hljs-code, - .hljs-comment, - .hljs-quote { - color:#9d9d9d; - font-style: italic; - } - .hljs-meta { - color: #836F00; - } - .hljs-symbol, - .hljs-template-tag, - .hljs-keyword, - .hljs-literal, - .hljs-name, - .hljs-built_in, - .hljs-char.escape_ { - color: #88aece; - } - .hljs-variable, - .hljs-property, - .hljs-attr, - .hljs-section { - color: #c59bc1; - } - .hljs-attribute { - color: #c59bc1; - } - .hljs-regexp, - .hljs-number { - color: #cfe374; - } - .hljs-link { - color: #b5bd68; - } - .hljs-string { - color: #b5bd68; - } - .hljs-doctag { - text-decoration: underline; - } - .hljs-emphasis { - font-style: italic; - } - .hljs-strong { - font-weight: bold; - } - .hljs-subst, - .hljs-title, - .hljs-params, - .hljs-bullet, - .hljs-formula, - .hljs-tag, - .hljs-type { - /* ignored */ - } - - body.theme-light { - .hljs-title.function_, - .hljs-template-variable { - color: #00738F; - } - .hljs-code, - .hljs-comment, - .hljs-quote { - color: #6e6e71; - font-style: italic; - } - .hljs-meta { - color: #836F00; - } - .hljs-symbol, - .hljs-template-tag, - .hljs-keyword, - .hljs-literal, - .hljs-name, - .hljs-built_in, - .hljs-char.escape_ { - color: #0C40C2; - } - .hljs-variable, - .hljs-property, - .hljs-attr, - .hljs-section { - color: #841191; - } - .hljs-attribute { - color: #164ad9; - } - .hljs-regexp, - .hljs-number { - color: #104BEB; - } - .hljs-link { - color: #47688a; - } - .hljs-string { - color: #008313; - } - .hljs-doctag { - text-decoration: underline; - } - .hljs-emphasis { - font-style: italic; - } - .hljs-strong { - font-weight: bold; - } - .hljs-subst, - .hljs-title, - .hljs-params, - .hljs-bullet, - .hljs-formula, - .hljs-tag, - .hljs-type { - /* ignored */ - } - } -} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template index 235d0a87d24..f4c54714986 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/script.js.template @@ -17,7 +17,9 @@ const sortAsc = "sort-asc"; const sortDesc = "sort-desc"; const tableTab = "table-tab"; const activeTableTab = "active-table-tab"; -const THEMES = Object.freeze(["theme-light", "theme-dark", "theme-os"]); +const THEME_LIGHT = "theme-light"; +const THEME_DARK = "theme-dark"; +const THEME_OS = "theme-os"; const linkIcon = "##REPLACE:doclet.Link_icon##"; const linkToSection = "##REPLACE:doclet.Link_to_section##"; @@ -320,12 +322,21 @@ function makeFilterWidget(sidebar, updateToc) { return sidebar; } +const osDarkTheme = window.matchMedia("(prefers-color-scheme: dark)"); +osDarkTheme.addEventListener("change", e => { + if (getTheme() === THEME_OS) { + setTheme(THEME_OS); + } +}); function getTheme() { - return localStorage.getItem('theme') || THEMES[0]; + return localStorage.getItem("theme") || THEME_LIGHT; +} +function setTheme(theme) { + var value = theme !== THEME_OS ? theme : osDarkTheme.matches ? THEME_DARK : THEME_LIGHT; + document.documentElement.setAttribute("data-theme", value); } - function initTheme() { - document.body.classList.add(getTheme()); + setTheme(getTheme()); } function setTopMargin() { @@ -347,7 +358,6 @@ document.addEventListener("readystatechange", (e) => { document.addEventListener("DOMContentLoaded", function(e) { setTopMargin(); - const subnav = document.querySelector("ol.sub-nav-list"); const keymap = new Map(); const searchInput = document.getElementById("search-input") || document.getElementById("page-search-input"); @@ -360,10 +370,9 @@ document.addEventListener("DOMContentLoaded", function(e) { keymap.set(".", filterInput); } // Clone TOC sidebar to header for mobile navigation - const navbar = document.querySelector("div#navbar-top"); const sidebar = document.querySelector(".main-grid nav.toc"); const main = document.querySelector(".main-grid main"); - const mainnav = navbar.querySelector("ul.nav-list"); + const mainnav = document.querySelector("div#navbar-top ul.nav-list"); const toggleButton = document.querySelector("button#navbar-toggle-button"); const tocMenu = sidebar ? sidebar.cloneNode(true) : null; const themeButton = document.querySelector("button#theme-button"); @@ -401,19 +410,22 @@ document.addEventListener("DOMContentLoaded", function(e) { } input.addEventListener("change", e => { setTheme(e.target.value); + localStorage.setItem("theme", e.target.value); }) }); - function setTheme(theme) { - THEMES.forEach(t => { - if (t !== theme) document.body.classList.remove(t); - }); - document.body.classList.add(theme); - localStorage.setItem("theme", theme); - document.getElementById(theme).checked = true; - } + themePanel.addEventListener("focusout", e => { + if (e.relatedTarget && !themePanel.contains(e.relatedTarget) && !themeButton.contains(e.relatedTarget)) { + closeThemePanel(); + } + }); + themePanel.addEventListener("keydown", e => { + if (e.key === "Escape" || e.key === "Enter") { + closeThemePanel(); + } + }); makeFilterWidget(sidebar, updateToc); if (tocMenu) { - navbar.appendChild(tocMenu); + document.querySelector("div#navbar-top").appendChild(tocMenu); makeFilterWidget(tocMenu, updateToc); var menuInput = tocMenu.querySelector("input.filter-input"); } @@ -473,7 +485,7 @@ document.addEventListener("DOMContentLoaded", function(e) { expanded = true; mainnav.style.display = "block"; mainnav.style.removeProperty("height"); - var maxHeight = window.innerHeight - subnav.offsetTop + 4; + var maxHeight = window.innerHeight - document.querySelector("div.sub-nav").offsetTop; var expandedHeight = Math.min(maxHeight, mainnav.scrollHeight + 10); if (tocMenu) { tocMenu.style.display = "flex"; diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css index 8da885a12cc..53b9d8ca6b2 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/stylesheet.css @@ -34,22 +34,6 @@ --nav-height: calc(var(--top-nav-height) + var(--sub-nav-height)); --max-content-width: 1500px; --content-margin: 0 auto; - /* Inline SVG icons for dark theme */ - --right-svg-dark: url('data:image/svg+xml; utf8, \ - \ - \ - '); - --glass-svg-dark: url('data:image/svg+xml; utf8, \ - \ - \ - '); - --x-svg-dark: url('data:image/svg+xml; utf8, \ - \ - \ - '); -} -body { /* Text colors for body and block elements */ --body-text-color: #181818; --block-text-color: #181818; @@ -111,9 +95,14 @@ body { --invalid-tag-text-color: #000000; --icon-filter: none; --caption-link-color: var(--subnav-link-color); + /* SVG icons for light theme */ + --right-svg: url("right.svg"); + --glass-svg: url("glass.svg"); + --x-svg: url("x.svg"); + --current-theme-svg: url("sun.svg"); } - -body.theme-dark { +/* Dark theme variables */ +:root[data-theme="theme-dark"] { --body-text-color: #e8e8e8; --block-text-color: #e8e8e8; --body-background-color: #1f2124; @@ -159,107 +148,21 @@ body.theme-dark { --invalid-tag-text-color: #000000; --icon-filter: invert(100%) brightness(160%); --caption-link-color: var(--link-color); -} - -/* - * Dark theme - */ -@media (prefers-color-scheme: dark) { - body { - --body-text-color: #e8e8e8; - --block-text-color: #e8e8e8; - --body-background-color: #1f2124; - --section-background-color: var(--body-background-color); - --detail-background-color: var(--body-background-color); - --code-background-color: #303940; - --mark-background-color: #313131; - --detail-block-color: #31363c; - --navbar-background-color: #395A6F; - --navbar-text-color: #ffffff; - --subnav-background-color: #3d454d; - --subnav-link-color: #d8dcdf; - --member-heading-background-color: var(--subnav-background-color); - --selected-background-color: #f8981d; - --selected-text-color: #253441; - --selected-link-color: #4a698a; - --table-header-color: #38444d; - --even-row-color: #222528; - --odd-row-color: #2d3135; - --title-color: #fff; - --link-color: #94badb; - --link-color-active: #e8a351; - --toc-background-color: #2f3439; - --toc-highlight-color: var(--subnav-background-color); - --toc-hover-color: #3f4146; - --snippet-background-color: #2c353b; - --snippet-text-color: var(--block-text-color); - --snippet-highlight-color: #f7c590; - --pre-background-color: var(--snippet-background-color); - --pre-text-color: var(--snippet-text-color); - --border-color: #444444; - --table-border-color: #717171; - --tab-border-radius: 2px 2px 0 0; - --search-input-background-color: #303030; - --search-input-text-color: #d0d0d0; - --search-input-placeholder-color: #979797; - --search-tag-background-color: #c6c61e; - --search-tag-text-color: #282828; - --button-border-color: #909090; - --button-active-filter: brightness(96%); - --button-focus-filter: brightness(104%); - --invalid-tag-background-color: #ffe6e6; - --invalid-tag-text-color: #000000; - --icon-filter: invert(100%) brightness(160%); - --caption-link-color: var(--link-color); - } - - body.theme-light { - --body-text-color: #181818; - --block-text-color: #181818; - --body-background-color: #ffffff; - --section-background-color: var(--body-background-color); - --detail-background-color: var(--body-background-color); - --code-background-color: #f5f5f5; - --mark-background-color: #f7f7f7; - --detail-block-color: #f4f4f4; - --navbar-background-color: #4D7A97; - --navbar-text-color: #ffffff; - --subnav-background-color: #dee3e9; - --subnav-link-color: #47688a; - --member-heading-background-color: var(--subnav-background-color); - --selected-background-color: #f8981d; - --selected-text-color: #253441; - --selected-link-color: #4a698a; - --table-header-color: #ebeff4; - --even-row-color: #fdfdfe; - --odd-row-color: #f0f0f2; - --title-color: #2c4557; - --link-color: #437291; - --link-color-active: #bb7a2a; - --toc-background-color: #f8f8f8; - --toc-highlight-color: var(--subnav-background-color); - --toc-hover-color: #e9ecf0; - --snippet-background-color: #f2f2f4; - --snippet-text-color: var(--block-text-color); - --snippet-highlight-color: #f7c590; - --pre-background-color: var(--snippet-background-color); - --pre-text-color: var(--snippet-text-color); - --border-color: #e6e6e6; - --table-border-color: #000000; - --tab-border-radius: 2px 2px 0 0; - --search-input-background-color: #ffffff; - --search-input-text-color: #000000; - --search-input-placeholder-color: #757575; - --search-tag-background-color: #ffff66; - --search-tag-text-color: var(--block-text-color); - --button-border-color: #b0b8c8; - --button-active-filter: brightness(96%); - --button-focus-filter: brightness(104%); - --invalid-tag-background-color: #ffe6e6; - --invalid-tag-text-color: #000000; - --icon-filter: none; - --caption-link-color: var(--subnav-link-color); - } + /* Inline SVG icons for dark theme */ + --right-svg: url('data:image/svg+xml; utf8, \ + \ + \ + '); + --glass-svg: url('data:image/svg+xml; utf8, \ + \ + \ + '); + --x-svg: url('data:image/svg+xml; utf8, \ + \ + \ + '); + --current-theme-svg: url("moon.svg"); } /* * Styles for individual HTML elements. @@ -386,7 +289,6 @@ hr { height: 100%; max-width: var(--max-content-width); margin: var(--content-margin); - position: relative; } .top-nav { background-color:var(--navbar-background-color); @@ -415,6 +317,8 @@ button#theme-button { height: 32px; padding: 6px; margin-left: -6px; + background: var(--current-theme-svg) no-repeat 6px; + background-size: 18px 18px; background-color: transparent; border: 1px solid transparent; border-radius: 6px; @@ -424,26 +328,6 @@ button#theme-button:hover, button#theme-button:focus-visible { border: 1px solid var(--button-border-color); } -button#theme-button img { - display: none; - width: 18px; -} -body.theme-light button#theme-button img.theme-light { - display: inline; -} -body.theme-dark button#theme-button img.theme-dark { - display: inline; -} -@media (prefers-color-scheme: dark) { - body.theme-os button#theme-button img.theme-dark { - display: inline; - } -} -@media (prefers-color-scheme: light) { - body.theme-os button#theme-button img.theme-light { - display: inline; - } -} div#theme-panel { display: none; position: fixed; @@ -507,22 +391,11 @@ ol.sub-nav-list li { margin-right: -4px; } ol.sub-nav-list li:not(:first-child) { - background: url("right.svg") no-repeat 3px; + background: var(--right-svg) no-repeat 3px; background-size: 10px; padding-left: 17px; list-style: none; } -body.theme-dark ol.sub-nav-list li:not(:first-child) { - background-image: var(--right-svg-dark); -} -@media (prefers-color-scheme: dark) { - ol.sub-nav-list li:not(:first-child) { - background-image: var(--right-svg-dark); - } - body.theme-light ol.sub-nav-list li:not(:first-child) { - background-image: url("right.svg"); - } -} ol.sub-nav-list a { padding: 3px; } @@ -683,13 +556,10 @@ dl.name-value > dd { padding: 15px 20px; } .main-grid nav.toc > ol.toc-list { - max-height: calc(100vh - var(--nav-height) - 100px); + max-height: calc(100vh - var(--nav-height) - 110px); padding-left: 12px; } .main-grid nav.toc button { - position: absolute; - bottom: 16px; - z-index: 3; background-color: var(--toc-background-color); color: #666666; font-size: 0.76rem; @@ -697,12 +567,19 @@ dl.name-value > dd { padding: 6px 10px; white-space: nowrap; border: 1px solid transparent; + border-radius: 3px; } .main-grid nav.toc button > img { vertical-align: middle; width: 16px; height: 16px; } +.main-grid nav.toc button.hide-sidebar, +.main-grid nav.toc button.show-sidebar { + position: absolute; + bottom: 15px; + z-index: 3; +} .main-grid nav.toc button.hide-sidebar { right: 0; } @@ -716,7 +593,7 @@ dl.name-value > dd { .main-grid nav.toc button:hover, .main-grid nav.toc button:focus { color: var(--body-text-color); - border: 1px solid var(--subnav-background-color); + border: 1px solid var(--button-border-color); } .main-grid nav.toc button:active { background-color: var(--subnav-background-color); @@ -758,6 +635,7 @@ nav.toc div.toc-header { nav.toc > ol.toc-list { overflow: hidden auto; overscroll-behavior: contain; + height: inherit; } nav.toc ol.toc-list { list-style: none; @@ -1281,7 +1159,7 @@ li.ui-static-link a, li.ui-static-link a:visited { padding: 3px 4px; } input[type="text"] { - background-image:url('glass.svg'); + background-image:var(--glass-svg); background-size:13px; background-repeat:no-repeat; background-position:3px 4px; @@ -1294,17 +1172,6 @@ input[type="text"] { font-size: var(--nav-font-size); height: 19px; } -body.theme-dark input[type="text"] { - background-image: var(--glass-svg-dark); -} -@media (prefers-color-scheme: dark) { - input[type="text"] { - background-image: var(--glass-svg-dark); - } - body.theme-light input[type="text"] { - background-image: url('glass.svg'); - } -} input#page-search-input { width: calc(180px + 10vw); margin: 10px 0; @@ -1320,7 +1187,7 @@ input.filter-input { } input#reset-search, input.reset-filter, input#page-search-reset { background-color: transparent; - background-image:url('x.svg'); + background-image:var(--x-svg); background-repeat:no-repeat; background-size:contain; border:0; @@ -1332,21 +1199,6 @@ input#reset-search, input.reset-filter, input#page-search-reset { font-size:0; visibility:hidden; } -body.theme-dark input#reset-search, -body.theme-dark input.reset-filter, -body.theme-dark input#page-search-reset { - background-image: var(--x-svg-dark); -} -@media (prefers-color-scheme: dark) { - input#reset-search, input.reset-filter, input#page-search-reset { - background-image: var(--x-svg-dark); - } - body.theme-light input#reset-search, - body.theme-light input.reset-filter, - body.theme-light input#page-search-reset { - background-image: url('x.svg'); - } -} input#reset-search { position:absolute; right:5px; @@ -1801,7 +1653,7 @@ table.striped > tbody > tr > th { top: var(--top-nav-height); left: 40vw; width: 60vw; - z-index: 7; + z-index: 5; background-color: var(--toc-background-color); box-sizing: border-box; } @@ -1973,7 +1825,7 @@ nav.toc div.toc-header .toc-sort-toggle { position: static; display: inline-flex; align-items: center; - padding: .5em; + padding: 4px; cursor: pointer; } diff --git a/test/langtools/jdk/javadoc/doclet/checkStylesheetClasses/CheckStylesheetClasses.java b/test/langtools/jdk/javadoc/doclet/checkStylesheetClasses/CheckStylesheetClasses.java index ba846c293a2..ee1fa538a57 100644 --- a/test/langtools/jdk/javadoc/doclet/checkStylesheetClasses/CheckStylesheetClasses.java +++ b/test/langtools/jdk/javadoc/doclet/checkStylesheetClasses/CheckStylesheetClasses.java @@ -143,9 +143,6 @@ public class CheckStylesheetClasses { "search-result-desc", "search-result-label", "search-result-link", "selected", "sort-asc", "sort-desc", "two-column-search-results", "visible"); - // used for themes - removeAll(styleSheetNames, "theme-dark", "theme-light", "theme-os"); - // very JDK specific styleSheetNames.remove("module-graph"); styleSheetNames.remove("sealed-graph"); diff --git a/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java b/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java index b4f28b36f3f..4f13bfb6d3a 100644 --- a/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java +++ b/test/langtools/jdk/javadoc/doclet/testNavigation/TestModuleNavigation.java @@ -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. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8196027 8196202 8320458 8342705 + * @bug 8196027 8196202 8320458 8342705 8371021 * @summary test navigation links * @modules jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.main @@ -36,7 +36,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import javadoc.tester.JavadocTester; import toolbox.ModuleBuilder; @@ -87,9 +86,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("overview-tree.html", true, @@ -101,9 +98,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("deprecated-list.html", true, @@ -115,9 +110,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("index-all.html", true, @@ -129,9 +122,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Search
        • Help
        • -
        • +
        • """); checkOutput("search.html", true, @@ -143,9 +134,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Help
        • -
        • +
        • """); checkOutput("help-doc.html", true, @@ -157,9 +146,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • -
        • +
        • """); checkOutput("m/p1/package-summary.html", true, @@ -172,9 +159,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("m/p1/A.html", true, @@ -187,9 +172,7 @@ public class TestModuleNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); } diff --git a/test/langtools/jdk/javadoc/doclet/testNavigation/TestNavigation.java b/test/langtools/jdk/javadoc/doclet/testNavigation/TestNavigation.java index 5be754a3163..f0a045f1a51 100644 --- a/test/langtools/jdk/javadoc/doclet/testNavigation/TestNavigation.java +++ b/test/langtools/jdk/javadoc/doclet/testNavigation/TestNavigation.java @@ -25,7 +25,7 @@ * @test * @bug 7025314 8023700 7198273 8025633 8026567 8081854 8196027 8182765 * 8196200 8196202 8223378 8258659 8261976 8320458 8329537 8350638 - * 8342705 + * 8342705 8371021 * @summary Make sure the Next/Prev Class links iterate through all types. * Make sure the navagation is 2 columns, not 3. * @library /tools/lib ../../lib @@ -71,9 +71,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/package-summary.html", true, @@ -85,9 +83,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/A.html", true, @@ -99,9 +95,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/C.html", true, @@ -113,9 +107,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/E.html", true, @@ -127,9 +119,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/I.html", true, @@ -355,9 +345,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/A.html", true, @@ -369,9 +357,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/C.html", true, @@ -383,9 +369,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/E.html", true, @@ -397,9 +381,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """); checkOutput("pkg/I.html", true, @@ -439,9 +421,7 @@ public class TestNavigation extends JavadocTester {
        • Index
        • Search
        • Help
        • -
        • +
        • """, """